From e187878b7a70f133440f9e93acf4f64fb1283c9c Mon Sep 17 00:00:00 2001 From: Enoch Date: Mon, 2 Jan 2023 19:56:44 +0800 Subject: [PATCH] first --- .env.example | 23 + .gitignore | 1 + .history/.env_20230101172316 | 0 .history/.env_20230101172348 | 1 + .history/.env_20230101173049 | 1 + .history/.env_20230101181726 | 5 + .history/.env_20230101182453 | 5 + .history/.env_20230101182642 | 5 + .history/.env_20230101182748 | 5 + .history/.env_20230101191643 | 7 + .history/.env_20230101203601 | 8 + .history/.env_20230101205534 | 8 + .history/.env_20230101210425 | 8 + .history/.env_20230101220200 | 8 + .history/.env_20230101220201 | 8 + .history/.env_20230101231839.example | 0 .history/.env_20230101231841.example | 15 + .history/.env_20230101232035.example | 23 + .history/.gitignore_20230101172312 | 0 .history/.gitignore_20230101172323 | 1 + .../app/controller/File_20230102143247.php | 0 .../app/controller/File_20230102143249.php | 15 + .../app/controller/File_20230102143332.php | 17 + .../app/controller/File_20230102143346.php | 19 + .../app/controller/File_20230102152508.php | 36 + .../app/controller/File_20230102154544.php | 36 + .../app/controller/File_20230102165530.php | 56 + .../app/controller/File_20230102170445.php | 56 + .../app/controller/File_20230102171742.php | 64 + .../app/controller/File_20230102171809.php | 64 + .../app/controller/File_20230102171818.php | 65 + .../app/controller/File_20230102172707.php | 72 + .../app/controller/File_20230102172825.php | 74 + .../app/controller/File_20230102172833.php | 75 + .../app/controller/File_20230102173122.php | 79 + .../app/controller/File_20230102173124.php | 79 + .../app/controller/File_20230102173125.php | 79 + .../app/controller/File_20230102173220.php | 82 + .../app/controller/File_20230102173627.php | 97 + .../app/controller/File_20230102174259.php | 99 + .../app/controller/File_20230102174312.php | 99 + .../app/controller/File_20230102182057.php | 99 + .../app/controller/File_20230102183433.php | 99 + .../app/controller/File_20230102184127.php | 99 + .../app/controller/File_20230102184835.php | 100 + .../app/controller/File_20230102185014.php | 100 + .../app/controller/File_20230102185148.php | 101 + .../app/controller/File_20230102185322.php | 101 + .../app/controller/File_20230102185353.php | 101 + .../app/controller/File_20230102185511.php | 100 + .../app/controller/File_20230102185714.php | 100 + .../app/controller/File_20230102190051.php | 101 + .../IndexController_20221212162407.php | 24 + .../IndexController_20230101173342.php | 24 + .../IndexController_20230101182420.php | 28 + .../IndexController_20230101183521.php | 40 + .../IndexController_20230101183610.php | 41 + .../IndexController_20230101184256.php | 42 + .../IndexController_20230101190155.php | 73 + .../IndexController_20230101192447.php | 82 + .../IndexController_20230101192731.php | 82 + .../IndexController_20230101192934.php | 85 + .../IndexController_20230101193243.php | 85 + .../IndexController_20230101194651.php | 94 + .../IndexController_20230101194656.php | 92 + .../IndexController_20230101194904.php | 92 + .../IndexController_20230101202315.php | 96 + .../IndexController_20230101203357.php | 95 + .../IndexController_20230101205503.php | 96 + .../IndexController_20230101205507.php | 96 + .../IndexController_20230101205513.php | 93 + .../IndexController_20230101205522.php | 93 + .../IndexController_20230101205548.php | 93 + .../IndexController_20230101210439.php | 97 + .../IndexController_20230101210449.php | 97 + .../IndexController_20230101210659.php | 98 + .../IndexController_20230101215122.php | 107 + .../IndexController_20230101215326.php | 110 + .../IndexController_20230101215401.php | 110 + .../IndexController_20230101215431.php | 110 + .../IndexController_20230101215457.php | 106 + .../IndexController_20230101215743.php | 106 + .../IndexController_20230101220103.php | 109 + .../IndexController_20230101220342.php | 109 + .../IndexController_20230101220540.php | 109 + .../IndexController_20230101220542.php | 109 + .../IndexController_20230101221211.php | 110 + .../IndexController_20230101221246.php | 110 + .../IndexController_20230101221441.php | 109 + .../IndexController_20230101221736.php | 109 + .../IndexController_20230101222759.php | 112 + .../IndexController_20230101222959.php | 112 + .../IndexController_20230101223138.php | 113 + .../IndexController_20230101223213.php | 114 + .../IndexController_20230101223238.php | 114 + .../IndexController_20230101224226.php | 123 + .../IndexController_20230101224323.php | 123 + .../IndexController_20230101224742.php | 123 + .../IndexController_20230101224840.php | 123 + .../IndexController_20230101225029.php | 123 + .../IndexController_20230101230759.php | 127 + .../IndexController_20230101230912.php | 128 + .../IndexController_20230101231109.php | 128 + .../IndexController_20230101231128.php | 128 + .../IndexController_20230101231501.php | 128 + .../IndexController_20230101231532.php | 128 + .../IndexController_20230101231609.php | 128 + .../IndexController_20230101231611.php | 128 + .../IndexController_20230101231630.php | 128 + .../IndexController_20230101231812.php | 127 + .../IndexController_20230101232629.php | 132 + .../IndexController_20230101233633.php | 134 + .../IndexController_20230101233658.php | 136 + .../IndexController_20230102115404.php | 142 + .../IndexController_20230102115453.php | 142 + .../IndexController_20230102115631.php | 147 + .../IndexController_20230102124339.php | 153 + .../IndexController_20230102124904.php | 166 + .../IndexController_20230102142646.php | 173 + .../app/middleware/Login_20230101201400.php | 0 .../app/middleware/Login_20230101201403.php | 15 + .../app/middleware/Login_20230101201416.php | 21 + .../app/middleware/Login_20230101201845.php | 23 + .../app/middleware/Login_20230101202102.php | 24 + .../app/middleware/Login_20230101202206.php | 25 + .history/app/view/index_20230101202946.html | 0 .history/app/view/index_20230101202948.html | 17 + .history/app/view/index_20230101203012.html | 33 + .history/app/view/index_20230101203249.html | 79 + .history/app/view/index_20230101203257.html | 82 + .history/app/view/index_20230101203627.html | 82 + .history/app/view/index_20230101203642.html | 82 + .history/app/view/index_20230101203704.html | 82 + .history/app/view/index_20230101203816.html | 82 + .history/app/view/index_20230101203939.html | 82 + .history/app/view/index_20230101204053.html | 82 + .history/app/view/index_20230101204120.html | 82 + .history/app/view/index_20230101204208.html | 86 + .history/app/view/index_20230101204558.html | 96 + .history/app/view/index_20230101204608.html | 96 + .history/app/view/index_20230101204615.html | 96 + .history/app/view/index_20230101204631.html | 97 + .history/app/view/index_20230101204642.html | 98 + .history/app/view/index_20230101204645.html | 98 + .history/app/view/index_20230101204737.html | 98 + .history/app/view/index_20230101205022.html | 100 + .history/app/view/index_20230101205058.html | 100 + .history/app/view/index_20230101205143.html | 100 + .history/app/view/index_20230101223457.html | 91 + .history/app/view/index_20230101223530.html | 91 + .history/app/view/index_20230102124634.html | 92 + .history/app/view/index_20230102124718.html | 93 + .history/app/view/index_20230102124723.html | 93 + .history/app/view/index_20230102124919.html | 93 + .history/app/view/index_20230102125045.html | 77 + .history/app/view/index_20230102125053.html | 76 + .history/app/view/index_20230102125226.html | 76 + .history/app/view/index_20230102125230.html | 76 + .history/app/view/index_20230102143349.html | 102 + .history/app/view/index_20230102174618.html | 109 + .history/app/view/index_20230102175038.html | 110 + .history/app/view/index_20230102175043.html | 110 + .history/app/view/index_20230102175208.html | 113 + .history/app/view/index_20230102175306.html | 114 + .history/app/view/index_20230102175452.html | 114 + .history/app/view/index_20230102175543.html | 114 + .history/app/view/index_20230102175638.html | 114 + .history/app/view/index_20230102175659.html | 114 + .history/app/view/index_20230102181935.html | 114 + .history/app/view/index_20230102181951.html | 114 + .history/app/view/index_20230102182128.html | 114 + .history/app/view/index_20230102182216.html | 117 + .history/app/view/index_20230102182247.html | 117 + .history/app/view/index_20230102182334.html | 117 + .history/app/view/index_20230102182553.html | 117 + .history/app/view/index_20230102182723.html | 117 + .history/app/view/index_20230102182726.html | 117 + .history/app/view/index_20230102182911.html | 120 + .history/app/view/index_20230102183013.html | 122 + .history/app/view/index_20230102183031.html | 122 + .history/app/view/index_20230102183648.html | 157 + .history/app/view/index_20230102183911.html | 161 + .history/app/view/index_20230102183921.html | 161 + .history/app/view/index_20230102183951.html | 162 + .history/app/view/index_20230102184217.html | 162 + .history/app/view/index_20230102184245.html | 163 + .history/app/view/index_20230102184436.html | 164 + .history/app/view/index_20230102185838.html | 164 + .history/app/view/login_20230101173350.html | 0 .history/app/view/login_20230101173352.html | 17 + .history/app/view/login_20230101173411.html | 17 + .history/app/view/login_20230101174829.html | 89 + .history/app/view/login_20230101175120.html | 87 + .history/app/view/login_20230101175133.html | 87 + .history/app/view/login_20230101175218.html | 87 + .history/app/view/login_20230101175401.html | 87 + .history/app/view/login_20230101175437.html | 87 + .history/app/view/login_20230101180128.html | 79 + .history/app/view/login_20230101180149.html | 79 + .history/app/view/login_20230101180227.html | 79 + .history/app/view/login_20230101180234.html | 79 + .history/app/view/login_20230101180241.html | 79 + .history/app/view/login_20230101181129.html | 113 + .history/app/view/login_20230101181150.html | 113 + .history/app/view/login_20230101182821.html | 113 + .history/app/view/login_20230101183327.html | 114 + .history/app/view/login_20230101183446.html | 118 + .history/app/view/login_20230101183552.html | 118 + .history/app/view/login_20230101183630.html | 118 + .history/app/view/login_20230101183643.html | 118 + .history/app/view/login_20230101183645.html | 118 + .history/app/view/login_20230101183712.html | 118 + .history/app/view/login_20230101183839.html | 119 + .history/app/view/login_20230101183850.html | 119 + .history/app/view/login_20230101184026.html | 119 + .history/app/view/login_20230101185849.html | 119 + .history/app/view/login_20230101190053.html | 161 + .history/app/view/login_20230101190231.html | 162 + .history/app/view/login_20230101190302.html | 163 + .history/app/view/login_20230101190358.html | 163 + .history/app/view/login_20230101190412.html | 163 + .history/app/view/login_20230101190659.html | 163 + .history/app/view/login_20230101190738.html | 163 + .history/app/view/login_20230101190748.html | 163 + .history/app/view/login_20230101192531.html | 163 + .history/app/view/login_20230101192600.html | 163 + .history/app/view/login_20230101192622.html | 163 + .history/app/view/login_20230101192648.html | 163 + .history/app/view/login_20230101193338.html | 159 + .history/app/view/login_20230101195634.html | 159 + .history/app/view/login_20230101195725.html | 159 + .history/app/view/login_20230102190430.html | 161 + .history/app/view/login_20230102190457.html | 161 + .history/books/2023/01/test_20230102171837 | 0 .history/books/2023/01/test_20230102171838 | 15 + .history/config/middleware_20221212162407.php | 15 + .history/config/middleware_20230101201929.php | 20 + .history/config/middleware_20230101202230.php | 15 + .../webman-throttler/app_20230101182209.php | 16 + .../webman-throttler/app_20230101182301.php | 15 + .../yzh52521/throttle/app_20230101181847.php | 54 + .../yzh52521/throttle/app_20230101181956.php | 54 + .../yzh52521/throttle/app_20230102144623.php | 54 + .history/config/redis_20221212162407.php | 22 + .history/config/redis_20230101181759.php | 22 + .history/config/redis_20230101182542.php | 22 + .history/config/redis_20230101182638.php | 22 + .history/config/redis_20230101182737.php | 22 + .history/config/route_20221212162407.php | 21 + .history/config/route_20230101173323.php | 22 + .history/config/route_20230101182341.php | 25 + .history/config/route_20230101183538.php | 28 + .history/config/route_20230101195822.php | 29 + .history/config/route_20230101195833.php | 29 + .history/config/route_20230101195850.php | 30 + .history/config/route_20230101200029.php | 31 + .history/config/route_20230101200302.php | 30 + .history/config/route_20230101200324.php | 30 + .history/config/route_20230101200915.php | 31 + .history/config/route_20230101201228.php | 31 + .history/config/route_20230101201254.php | 31 + .history/config/route_20230101202902.php | 38 + .history/config/route_20230101202939.php | 39 + .history/config/route_20230101203425.php | 40 + .history/config/route_20230101203452.php | 40 + .history/config/route_20230101203513.php | 40 + .history/config/route_20230101203529.php | 40 + .history/config/route_20230101203550.php | 39 + .history/config/route_20230101203806.php | 39 + .history/config/route_20230101205925.php | 32 + .history/config/route_20230101223459.php | 35 + .history/config/route_20230101230445.php | 37 + .history/config/route_20230102124532.php | 38 + .history/config/route_20230102131622.php | 40 + .history/config/route_20230102142547.php | 40 + .history/config/route_20230102142552.php | 40 + .history/config/route_20230102142817.php | 40 + .history/config/route_20230102143348.php | 40 + .history/config/route_20230102174342.php | 48 + .history/config/server_20221212162407.php | 31 + .history/config/server_20230101175147.php | 31 + .../jquery-3.6.3.min_20230101180946.js | 0 .../jquery-3.6.3.min_20230101180949.js | 15 + .../jquery-3.6.3.min_20230101180952.js | 2 + .../zlibproxy/normalize_20230101173113.css | 0 .../zlibproxy/normalize_20230101173115.css | 17 + .../zlibproxy/normalize_20230101173118.css | 349 ++ .../zlibproxy/sakura-dark_20230101175310.css | 0 .../zlibproxy/sakura-dark_20230101175312.css | 17 + .../zlibproxy/sakura-dark_20230101175315.css | 223 + .../zlibproxy/sakura_20230101173132.css | 0 .../zlibproxy/sakura_20230101173134.css | 17 + .../zlibproxy/sakura_20230101173137.css | 222 + .history/public/zlibproxy_20230101172406 | 0 .history/public/zlibproxy_20230101172408 | 15 + .history/support/helpers_20230101172004.php | 525 ++ .history/support/helpers_20230102152429.php | 543 ++ .history/test_20230101184303.php | 0 .history/test_20230101184304.php | 15 + .history/test_20230101184538.php | 25 + .history/test_20230101184553.php | 25 + .history/test_20230101184603.php | 25 + .history/test_20230101184620.php | 25 + .history/test_20230101184658.php | 25 + .history/test_20230101184836.php | 25 + .history/test_20230101184907.php | 25 + .history/test_20230101185011.php | 25 + .history/test_20230101193653.php | 25 + .history/test_20230101194107.php | 31 + .history/test_20230101194121.php | 31 + .history/test_20230101194141.php | 31 + .history/test_20230101194201.php | 31 + .history/test_20230101214411.php | 24 + .history/test_20230101214457.php | 24 + .history/test_20230101214514.php | 24 + .history/test_20230101214950.php | 24 + .history/test_20230101215608.php | 24 + .history/test_20230101222541.php | 24 + .history/test_20230101222547.php | 24 + .history/test_20230101222559.php | 24 + .history/test_20230101222611.php | 10 + .history/test_20230101222616.php | 10 + .history/test_20230101232715.php | 13 + .history/test_20230101232744.php | 17 + .history/test_20230101232746.php | 17 + .history/test_20230101232911.php | 17 + .history/test_20230101232916.php | 17 + .history/test_20230101233452.php | 15 + .history/test_20230101233521.php | 16 + .history/test_20230102113630.php | 23 + .history/test_20230102113637.php | 22 + .history/test_20230102114305.php | 21 + .history/test_20230102125853.php | 26 + .history/test_20230102125938.php | 27 + .history/test_20230102164516.php | 27 + .history/test_20230102164746.php | 27 + .history/test_20230102165125.php | 35 + .history/test_20230102165145.php | 35 + .history/test_20230102170441.php | 35 + .history/test_20230102171751.php | 38 + .history/test_20230102172135.php | 41 + .history/test_20230102172331.php | 44 + .history/test_20230102172344.php | 44 + .history/test_20230102173936.php | 40 + .history/test_20230102174024.php | 43 + .history/test_20230102174028.php | 43 + .history/test_20230102174058.php | 44 + .history/test_20230102174104.php | 44 + .history/test_20230102174106.php | 44 + .history/test_20230102174118.php | 44 + .history/test_20230102174142.php | 44 + .history/test_20230102174144.php | 44 + .history/test_20230102174148.php | 44 + .history/test_20230102174158.php | 44 + LICENSE | 21 + README.md | 20 + app/controller/File.php | 101 + app/controller/IndexController.php | 173 + app/functions.php | 4 + app/middleware/StaticFile.php | 42 + app/middleware/Throttle.php | 26 + app/model/Test.php | 29 + app/view/index.html | 164 + app/view/login.html | 161 + .../2023/01/L2RsLzE2ODg1OTY1L2FkNmE0Ng==.bin | Bin 0 -> 3538695 bytes composer.json | 66 + composer.lock | 3453 +++++++++++ config/app.php | 26 + config/autoload.php | 21 + config/bootstrap.php | 18 + config/container.php | 15 + config/database.php | 15 + config/dependence.php | 15 + config/exception.php | 17 + config/log.php | 32 + config/middleware.php | 15 + .../plugin/nsp-team/webman-throttler/app.php | 15 + .../nsp-team/webman-throttler/middleware.php | 19 + config/plugin/yzh52521/throttle/app.php | 54 + config/process.php | 42 + config/redis.php | 22 + config/route.php | 48 + config/server.php | 31 + config/session.php | 65 + config/static.php | 23 + config/translation.php | 25 + config/view.php | 22 + process/Monitor.php | 240 + public/404.html | 12 + public/favicon.ico | Bin 0 -> 4286 bytes public/zlibproxy/jquery-3.6.3.min.js | 2 + public/zlibproxy/jquery.pjax.js | 903 +++ public/zlibproxy/normalize.css | 349 ++ public/zlibproxy/sakura-dark.css | 223 + public/zlibproxy/sakura.css | 222 + runtime/.gitignore | 4 + runtime/logs/.gitignore | 2 + runtime/views/.gitignore | 2 + start.php | 4 + support/Request.php | 24 + support/Response.php | 24 + support/bootstrap.php | 132 + support/helpers.php | 543 ++ test.php | 44 + vendor/autoload.php | 25 + vendor/bin/carbon | 120 + vendor/bin/carbon.bat | 5 + vendor/composer/ClassLoader.php | 572 ++ vendor/composer/InstalledVersions.php | 352 ++ vendor/composer/LICENSE | 21 + vendor/composer/autoload_classmap.php | 15 + vendor/composer/autoload_files.php | 23 + vendor/composer/autoload_namespaces.php | 9 + vendor/composer/autoload_psr4.php | 59 + vendor/composer/autoload_real.php | 57 + vendor/composer/autoload_static.php | 352 ++ vendor/composer/installed.json | 3579 ++++++++++++ vendor/composer/installed.php | 500 ++ vendor/composer/platform_check.php | 26 + vendor/doctrine/inflector/LICENSE | 19 + vendor/doctrine/inflector/README.md | 7 + vendor/doctrine/inflector/composer.json | 36 + vendor/doctrine/inflector/docs/en/index.rst | 226 + .../Inflector/CachedWordInflector.php | 24 + .../GenericLanguageInflectorFactory.php | 66 + .../lib/Doctrine/Inflector/Inflector.php | 507 ++ .../Doctrine/Inflector/InflectorFactory.php | 52 + .../lib/Doctrine/Inflector/Language.php | 19 + .../Inflector/LanguageInflectorFactory.php | 33 + .../Doctrine/Inflector/NoopWordInflector.php | 13 + .../Inflector/Rules/English/Inflectible.php | 182 + .../Rules/English/InflectorFactory.php | 21 + .../Inflector/Rules/English/Rules.php | 31 + .../Inflector/Rules/English/Uninflected.php | 193 + .../Inflector/Rules/French/Inflectible.php | 50 + .../Rules/French/InflectorFactory.php | 21 + .../Doctrine/Inflector/Rules/French/Rules.php | 31 + .../Inflector/Rules/French/Uninflected.php | 34 + .../Rules/NorwegianBokmal/Inflectible.php | 40 + .../NorwegianBokmal/InflectorFactory.php | 21 + .../Inflector/Rules/NorwegianBokmal/Rules.php | 31 + .../Rules/NorwegianBokmal/Uninflected.php | 36 + .../lib/Doctrine/Inflector/Rules/Pattern.php | 42 + .../lib/Doctrine/Inflector/Rules/Patterns.php | 34 + .../Rules/Portuguese/Inflectible.php | 104 + .../Rules/Portuguese/InflectorFactory.php | 21 + .../Inflector/Rules/Portuguese/Rules.php | 31 + .../Rules/Portuguese/Uninflected.php | 38 + .../lib/Doctrine/Inflector/Rules/Ruleset.php | 39 + .../Inflector/Rules/Spanish/Inflectible.php | 53 + .../Rules/Spanish/InflectorFactory.php | 21 + .../Inflector/Rules/Spanish/Rules.php | 31 + .../Inflector/Rules/Spanish/Uninflected.php | 36 + .../Doctrine/Inflector/Rules/Substitution.php | 30 + .../Inflector/Rules/Substitutions.php | 57 + .../Inflector/Rules/Transformation.php | 39 + .../Inflector/Rules/Transformations.php | 29 + .../Inflector/Rules/Turkish/Inflectible.php | 40 + .../Rules/Turkish/InflectorFactory.php | 21 + .../Inflector/Rules/Turkish/Rules.php | 31 + .../Inflector/Rules/Turkish/Uninflected.php | 36 + .../lib/Doctrine/Inflector/Rules/Word.php | 21 + .../Doctrine/Inflector/RulesetInflector.php | 56 + .../lib/Doctrine/Inflector/WordInflector.php | 10 + vendor/doctrine/inflector/phpstan.neon.dist | 13 + vendor/doctrine/inflector/psalm.xml | 15 + vendor/graham-campbell/result-type/LICENSE | 21 + .../graham-campbell/result-type/composer.json | 33 + .../graham-campbell/result-type/src/Error.php | 120 + .../result-type/src/Result.php | 69 + .../result-type/src/Success.php | 119 + vendor/guzzlehttp/guzzle/CHANGELOG.md | 1519 +++++ vendor/guzzlehttp/guzzle/LICENSE | 27 + vendor/guzzlehttp/guzzle/README.md | 94 + vendor/guzzlehttp/guzzle/UPGRADING.md | 1253 ++++ vendor/guzzlehttp/guzzle/composer.json | 105 + .../guzzlehttp/guzzle/src/BodySummarizer.php | 28 + .../guzzle/src/BodySummarizerInterface.php | 13 + vendor/guzzlehttp/guzzle/src/Client.php | 477 ++ .../guzzlehttp/guzzle/src/ClientInterface.php | 84 + vendor/guzzlehttp/guzzle/src/ClientTrait.php | 241 + .../guzzle/src/Cookie/CookieJar.php | 317 + .../guzzle/src/Cookie/CookieJarInterface.php | 79 + .../guzzle/src/Cookie/FileCookieJar.php | 101 + .../guzzle/src/Cookie/SessionCookieJar.php | 77 + .../guzzle/src/Cookie/SetCookie.php | 446 ++ .../src/Exception/BadResponseException.php | 39 + .../guzzle/src/Exception/ClientException.php | 10 + .../guzzle/src/Exception/ConnectException.php | 56 + .../guzzle/src/Exception/GuzzleException.php | 9 + .../Exception/InvalidArgumentException.php | 7 + .../guzzle/src/Exception/RequestException.php | 166 + .../guzzle/src/Exception/ServerException.php | 10 + .../Exception/TooManyRedirectsException.php | 7 + .../src/Exception/TransferException.php | 7 + .../guzzle/src/Handler/CurlFactory.php | 595 ++ .../src/Handler/CurlFactoryInterface.php | 25 + .../guzzle/src/Handler/CurlHandler.php | 49 + .../guzzle/src/Handler/CurlMultiHandler.php | 262 + .../guzzle/src/Handler/EasyHandle.php | 112 + .../guzzle/src/Handler/HeaderProcessor.php | 42 + .../guzzle/src/Handler/MockHandler.php | 211 + .../guzzlehttp/guzzle/src/Handler/Proxy.php | 51 + .../guzzle/src/Handler/StreamHandler.php | 593 ++ vendor/guzzlehttp/guzzle/src/HandlerStack.php | 275 + .../guzzle/src/MessageFormatter.php | 198 + .../guzzle/src/MessageFormatterInterface.php | 18 + vendor/guzzlehttp/guzzle/src/Middleware.php | 260 + vendor/guzzlehttp/guzzle/src/Pool.php | 125 + .../guzzle/src/PrepareBodyMiddleware.php | 104 + .../guzzle/src/RedirectMiddleware.php | 228 + .../guzzlehttp/guzzle/src/RequestOptions.php | 264 + .../guzzlehttp/guzzle/src/RetryMiddleware.php | 116 + .../guzzlehttp/guzzle/src/TransferStats.php | 133 + vendor/guzzlehttp/guzzle/src/Utils.php | 385 ++ vendor/guzzlehttp/guzzle/src/functions.php | 167 + .../guzzle/src/functions_include.php | 6 + vendor/guzzlehttp/promises/CHANGELOG.md | 110 + vendor/guzzlehttp/promises/LICENSE | 24 + vendor/guzzlehttp/promises/README.md | 546 ++ vendor/guzzlehttp/promises/composer.json | 58 + .../promises/src/AggregateException.php | 17 + .../promises/src/CancellationException.php | 10 + vendor/guzzlehttp/promises/src/Coroutine.php | 169 + vendor/guzzlehttp/promises/src/Create.php | 84 + vendor/guzzlehttp/promises/src/Each.php | 90 + .../guzzlehttp/promises/src/EachPromise.php | 247 + .../promises/src/FulfilledPromise.php | 84 + vendor/guzzlehttp/promises/src/Is.php | 46 + vendor/guzzlehttp/promises/src/Promise.php | 278 + .../promises/src/PromiseInterface.php | 97 + .../promises/src/PromisorInterface.php | 16 + .../promises/src/RejectedPromise.php | 91 + .../promises/src/RejectionException.php | 48 + vendor/guzzlehttp/promises/src/TaskQueue.php | 67 + .../promises/src/TaskQueueInterface.php | 24 + vendor/guzzlehttp/promises/src/Utils.php | 276 + vendor/guzzlehttp/promises/src/functions.php | 363 ++ .../promises/src/functions_include.php | 6 + vendor/guzzlehttp/psr7/CHANGELOG.md | 396 ++ vendor/guzzlehttp/psr7/LICENSE | 26 + vendor/guzzlehttp/psr7/README.md | 872 +++ vendor/guzzlehttp/psr7/composer.json | 96 + vendor/guzzlehttp/psr7/src/AppendStream.php | 248 + vendor/guzzlehttp/psr7/src/BufferStream.php | 149 + vendor/guzzlehttp/psr7/src/CachingStream.php | 153 + vendor/guzzlehttp/psr7/src/DroppingStream.php | 49 + .../src/Exception/MalformedUriException.php | 14 + vendor/guzzlehttp/psr7/src/FnStream.php | 180 + vendor/guzzlehttp/psr7/src/Header.php | 134 + vendor/guzzlehttp/psr7/src/HttpFactory.php | 100 + vendor/guzzlehttp/psr7/src/InflateStream.php | 37 + vendor/guzzlehttp/psr7/src/LazyOpenStream.php | 41 + vendor/guzzlehttp/psr7/src/LimitStream.php | 157 + vendor/guzzlehttp/psr7/src/Message.php | 246 + vendor/guzzlehttp/psr7/src/MessageTrait.php | 264 + vendor/guzzlehttp/psr7/src/MimeType.php | 1237 ++++ .../guzzlehttp/psr7/src/MultipartStream.php | 159 + vendor/guzzlehttp/psr7/src/NoSeekStream.php | 28 + vendor/guzzlehttp/psr7/src/PumpStream.php | 179 + vendor/guzzlehttp/psr7/src/Query.php | 113 + vendor/guzzlehttp/psr7/src/Request.php | 157 + vendor/guzzlehttp/psr7/src/Response.php | 160 + vendor/guzzlehttp/psr7/src/Rfc7230.php | 23 + vendor/guzzlehttp/psr7/src/ServerRequest.php | 344 ++ vendor/guzzlehttp/psr7/src/Stream.php | 282 + .../psr7/src/StreamDecoratorTrait.php | 155 + vendor/guzzlehttp/psr7/src/StreamWrapper.php | 175 + vendor/guzzlehttp/psr7/src/UploadedFile.php | 211 + vendor/guzzlehttp/psr7/src/Uri.php | 740 +++ vendor/guzzlehttp/psr7/src/UriComparator.php | 52 + vendor/guzzlehttp/psr7/src/UriNormalizer.php | 220 + vendor/guzzlehttp/psr7/src/UriResolver.php | 211 + vendor/guzzlehttp/psr7/src/Utils.php | 459 ++ vendor/illuminate/bus/Batch.php | 480 ++ vendor/illuminate/bus/BatchFactory.php | 58 + vendor/illuminate/bus/BatchRepository.php | 92 + vendor/illuminate/bus/Batchable.php | 108 + vendor/illuminate/bus/BusServiceProvider.php | 70 + .../bus/DatabaseBatchRepository.php | 388 ++ vendor/illuminate/bus/Dispatcher.php | 295 + .../illuminate/bus/Events/BatchDispatched.php | 26 + vendor/illuminate/bus/LICENSE.md | 21 + vendor/illuminate/bus/PendingBatch.php | 319 ++ .../bus/PrunableBatchRepository.php | 16 + vendor/illuminate/bus/Queueable.php | 276 + vendor/illuminate/bus/UniqueLock.php | 75 + .../illuminate/bus/UpdatedBatchJobCounts.php | 43 + vendor/illuminate/bus/composer.json | 40 + vendor/illuminate/collections/Arr.php | 825 +++ vendor/illuminate/collections/Collection.php | 1728 ++++++ vendor/illuminate/collections/Enumerable.php | 1258 ++++ .../HigherOrderCollectionProxy.php | 63 + .../collections/ItemNotFoundException.php | 9 + vendor/illuminate/collections/LICENSE.md | 21 + .../illuminate/collections/LazyCollection.php | 1681 ++++++ .../MultipleItemsFoundException.php | 40 + .../collections/Traits/EnumeratesValues.php | 1084 ++++ vendor/illuminate/collections/composer.json | 42 + vendor/illuminate/collections/helpers.php | 190 + .../conditionable/HigherOrderWhenProxy.php | 109 + vendor/illuminate/conditionable/LICENSE.md | 21 + .../conditionable/Traits/Conditionable.php | 73 + vendor/illuminate/conditionable/composer.json | 33 + vendor/illuminate/container/BoundMethod.php | 202 + vendor/illuminate/container/Container.php | 1469 +++++ .../container/ContextualBindingBuilder.php | 96 + .../container/EntryNotFoundException.php | 11 + vendor/illuminate/container/LICENSE.md | 21 + .../container/RewindableGenerator.php | 61 + vendor/illuminate/container/Util.php | 74 + vendor/illuminate/container/composer.json | 38 + .../contracts/Auth/Access/Authorizable.php | 15 + .../illuminate/contracts/Auth/Access/Gate.php | 150 + .../contracts/Auth/Authenticatable.php | 49 + .../contracts/Auth/CanResetPassword.php | 21 + vendor/illuminate/contracts/Auth/Factory.php | 22 + vendor/illuminate/contracts/Auth/Guard.php | 57 + .../Auth/Middleware/AuthenticatesRequests.php | 8 + .../contracts/Auth/MustVerifyEmail.php | 34 + .../contracts/Auth/PasswordBroker.php | 61 + .../contracts/Auth/PasswordBrokerFactory.php | 14 + .../contracts/Auth/StatefulGuard.php | 63 + .../contracts/Auth/SupportsBasicAuth.php | 24 + .../contracts/Auth/UserProvider.php | 49 + .../contracts/Broadcasting/Broadcaster.php | 35 + .../contracts/Broadcasting/Factory.php | 14 + .../Broadcasting/HasBroadcastChannel.php | 20 + .../contracts/Broadcasting/ShouldBeUnique.php | 8 + .../Broadcasting/ShouldBroadcast.php | 13 + .../Broadcasting/ShouldBroadcastNow.php | 8 + .../illuminate/contracts/Bus/Dispatcher.php | 66 + .../contracts/Bus/QueueingDispatcher.php | 30 + vendor/illuminate/contracts/Cache/Factory.php | 14 + vendor/illuminate/contracts/Cache/Lock.php | 44 + .../contracts/Cache/LockProvider.php | 25 + .../contracts/Cache/LockTimeoutException.php | 10 + .../illuminate/contracts/Cache/Repository.php | 108 + vendor/illuminate/contracts/Cache/Store.php | 92 + .../contracts/Config/Repository.php | 57 + .../contracts/Console/Application.php | 23 + .../contracts/Console/Isolatable.php | 8 + .../illuminate/contracts/Console/Kernel.php | 64 + .../Container/BindingResolutionException.php | 11 + .../Container/CircularDependencyException.php | 11 + .../contracts/Container/Container.php | 210 + .../Container/ContextualBindingBuilder.php | 39 + .../illuminate/contracts/Cookie/Factory.php | 47 + .../contracts/Cookie/QueueingFactory.php | 30 + .../contracts/Database/Eloquent/Builder.php | 14 + .../contracts/Database/Eloquent/Castable.php | 15 + .../Database/Eloquent/CastsAttributes.php | 28 + .../Eloquent/CastsInboundAttributes.php | 17 + .../Eloquent/DeviatesCastableAttributes.php | 28 + .../Eloquent/SerializesCastableAttributes.php | 17 + .../Eloquent/SupportsPartialRelations.php | 30 + .../Database/Events/MigrationEvent.php | 8 + .../contracts/Database/ModelIdentifier.php | 73 + .../contracts/Database/Query/Builder.php | 12 + .../contracts/Debug/ExceptionHandler.php | 48 + .../contracts/Encryption/DecryptException.php | 10 + .../contracts/Encryption/EncryptException.php | 10 + .../contracts/Encryption/Encrypter.php | 35 + .../contracts/Encryption/StringEncrypter.php | 26 + .../contracts/Events/Dispatcher.php | 82 + .../illuminate/contracts/Filesystem/Cloud.php | 14 + .../contracts/Filesystem/Factory.php | 14 + .../Filesystem/FileNotFoundException.php | 10 + .../contracts/Filesystem/Filesystem.php | 191 + .../Filesystem/LockTimeoutException.php | 10 + .../contracts/Foundation/Application.php | 231 + .../Foundation/CachesConfiguration.php | 27 + .../contracts/Foundation/CachesRoutes.php | 20 + .../Foundation/ExceptionRenderer.php | 14 + .../contracts/Foundation/MaintenanceMode.php | 35 + .../illuminate/contracts/Hashing/Hasher.php | 42 + vendor/illuminate/contracts/Http/Kernel.php | 37 + vendor/illuminate/contracts/LICENSE.md | 21 + .../illuminate/contracts/Mail/Attachable.php | 13 + vendor/illuminate/contracts/Mail/Factory.php | 14 + .../illuminate/contracts/Mail/MailQueue.php | 25 + vendor/illuminate/contracts/Mail/Mailable.php | 76 + vendor/illuminate/contracts/Mail/Mailer.php | 41 + .../contracts/Notifications/Dispatcher.php | 24 + .../contracts/Notifications/Factory.php | 32 + .../contracts/Pagination/CursorPaginator.php | 117 + .../Pagination/LengthAwarePaginator.php | 29 + .../contracts/Pagination/Paginator.php | 124 + vendor/illuminate/contracts/Pipeline/Hub.php | 15 + .../contracts/Pipeline/Pipeline.php | 40 + .../contracts/Queue/ClearableQueue.php | 14 + .../Queue/EntityNotFoundException.php | 22 + .../contracts/Queue/EntityResolver.php | 15 + vendor/illuminate/contracts/Queue/Factory.php | 14 + vendor/illuminate/contracts/Queue/Job.php | 164 + vendor/illuminate/contracts/Queue/Monitor.php | 30 + vendor/illuminate/contracts/Queue/Queue.php | 99 + .../contracts/Queue/QueueableCollection.php | 34 + .../contracts/Queue/QueueableEntity.php | 27 + .../contracts/Queue/ShouldBeEncrypted.php | 8 + .../contracts/Queue/ShouldBeUnique.php | 8 + .../Queue/ShouldBeUniqueUntilProcessing.php | 8 + .../contracts/Queue/ShouldQueue.php | 8 + .../illuminate/contracts/Redis/Connection.php | 35 + .../illuminate/contracts/Redis/Connector.php | 25 + vendor/illuminate/contracts/Redis/Factory.php | 14 + .../Redis/LimiterTimeoutException.php | 10 + .../contracts/Routing/BindingRegistrar.php | 23 + .../contracts/Routing/Registrar.php | 105 + .../contracts/Routing/ResponseFactory.php | 155 + .../contracts/Routing/UrlGenerator.php | 86 + .../contracts/Routing/UrlRoutable.php | 39 + .../Middleware/AuthenticatesSessions.php | 8 + .../illuminate/contracts/Session/Session.php | 204 + .../contracts/Support/Arrayable.php | 17 + .../Support/CanBeEscapedWhenCastToString.php | 14 + .../contracts/Support/DeferrableProvider.php | 13 + .../Support/DeferringDisplayableValue.php | 13 + .../illuminate/contracts/Support/Htmlable.php | 13 + .../illuminate/contracts/Support/Jsonable.php | 14 + .../contracts/Support/MessageBag.php | 102 + .../contracts/Support/MessageProvider.php | 13 + .../contracts/Support/Renderable.php | 13 + .../contracts/Support/Responsable.php | 14 + .../contracts/Support/ValidatedData.php | 11 + .../Translation/HasLocalePreference.php | 13 + .../contracts/Translation/Loader.php | 40 + .../contracts/Translation/Translator.php | 42 + .../contracts/Validation/DataAwareRule.php | 14 + .../contracts/Validation/Factory.php | 46 + .../contracts/Validation/ImplicitRule.php | 8 + .../contracts/Validation/InvokableRule.php | 16 + .../illuminate/contracts/Validation/Rule.php | 22 + .../Validation/UncompromisedVerifier.php | 14 + .../Validation/ValidatesWhenResolved.php | 13 + .../contracts/Validation/Validator.php | 65 + .../Validation/ValidatorAwareRule.php | 14 + vendor/illuminate/contracts/View/Engine.php | 15 + vendor/illuminate/contracts/View/Factory.php | 79 + vendor/illuminate/contracts/View/View.php | 31 + .../View/ViewCompilationException.php | 10 + vendor/illuminate/contracts/composer.json | 35 + .../illuminate/events/CallQueuedListener.php | 180 + vendor/illuminate/events/Dispatcher.php | 705 +++ .../events/EventServiceProvider.php | 23 + .../illuminate/events/InvokeQueuedClosure.php | 34 + vendor/illuminate/events/LICENSE.md | 21 + vendor/illuminate/events/NullDispatcher.php | 144 + vendor/illuminate/events/QueuedClosure.php | 125 + vendor/illuminate/events/composer.json | 42 + vendor/illuminate/events/functions.php | 18 + vendor/illuminate/macroable/LICENSE.md | 21 + .../illuminate/macroable/Traits/Macroable.php | 126 + vendor/illuminate/macroable/composer.json | 33 + vendor/illuminate/pipeline/Hub.php | 97 + vendor/illuminate/pipeline/LICENSE.md | 21 + vendor/illuminate/pipeline/Pipeline.php | 271 + .../pipeline/PipelineServiceProvider.php | 34 + vendor/illuminate/pipeline/composer.json | 35 + .../redis/Connections/Connection.php | 218 + .../redis/Connections/PacksPhpRedisValues.php | 183 + .../Connections/PhpRedisClusterConnection.php | 24 + .../redis/Connections/PhpRedisConnection.php | 567 ++ .../Connections/PredisClusterConnection.php | 20 + .../redis/Connections/PredisConnection.php | 53 + .../redis/Connectors/PhpRedisConnector.php | 234 + .../redis/Connectors/PredisConnector.php | 53 + .../redis/Events/CommandExecuted.php | 59 + vendor/illuminate/redis/LICENSE.md | 21 + .../redis/Limiters/ConcurrencyLimiter.php | 167 + .../Limiters/ConcurrencyLimiterBuilder.php | 142 + .../redis/Limiters/DurationLimiter.php | 203 + .../redis/Limiters/DurationLimiterBuilder.php | 142 + vendor/illuminate/redis/RedisManager.php | 278 + .../illuminate/redis/RedisServiceProvider.php | 38 + vendor/illuminate/redis/composer.json | 41 + .../support/AggregateServiceProvider.php | 52 + vendor/illuminate/support/Benchmark.php | 50 + vendor/illuminate/support/Carbon.php | 21 + vendor/illuminate/support/Composer.php | 132 + .../support/ConfigurationUrlParser.php | 191 + vendor/illuminate/support/DateFactory.php | 231 + vendor/illuminate/support/Env.php | 101 + vendor/illuminate/support/Facades/App.php | 141 + vendor/illuminate/support/Facades/Artisan.php | 35 + vendor/illuminate/support/Facades/Auth.php | 98 + vendor/illuminate/support/Facades/Blade.php | 60 + .../illuminate/support/Facades/Broadcast.php | 46 + vendor/illuminate/support/Facades/Bus.php | 91 + vendor/illuminate/support/Facades/Cache.php | 66 + vendor/illuminate/support/Facades/Config.php | 31 + vendor/illuminate/support/Facades/Cookie.php | 58 + vendor/illuminate/support/Facades/Crypt.php | 27 + vendor/illuminate/support/Facades/DB.php | 119 + vendor/illuminate/support/Facades/Date.php | 122 + vendor/illuminate/support/Facades/Event.php | 124 + vendor/illuminate/support/Facades/Facade.php | 340 ++ vendor/illuminate/support/Facades/File.php | 71 + vendor/illuminate/support/Facades/Gate.php | 47 + vendor/illuminate/support/Facades/Hash.php | 35 + vendor/illuminate/support/Facades/Http.php | 149 + vendor/illuminate/support/Facades/Lang.php | 45 + vendor/illuminate/support/Facades/Log.php | 48 + vendor/illuminate/support/Facades/Mail.php | 83 + .../support/Facades/Notification.php | 78 + .../support/Facades/ParallelTesting.php | 34 + .../illuminate/support/Facades/Password.php | 68 + vendor/illuminate/support/Facades/Queue.php | 91 + .../support/Facades/RateLimiter.php | 32 + .../illuminate/support/Facades/Redirect.php | 39 + vendor/illuminate/support/Facades/Redis.php | 46 + vendor/illuminate/support/Facades/Request.php | 195 + .../illuminate/support/Facades/Response.php | 40 + vendor/illuminate/support/Facades/Route.php | 114 + vendor/illuminate/support/Facades/Schema.php | 67 + vendor/illuminate/support/Facades/Session.php | 80 + vendor/illuminate/support/Facades/Storage.php | 104 + vendor/illuminate/support/Facades/URL.php | 62 + .../illuminate/support/Facades/Validator.php | 34 + vendor/illuminate/support/Facades/View.php | 97 + vendor/illuminate/support/Facades/Vite.php | 41 + vendor/illuminate/support/Fluent.php | 201 + .../support/HigherOrderTapProxy.php | 38 + vendor/illuminate/support/HtmlString.php | 66 + .../illuminate/support/InteractsWithTime.php | 64 + vendor/illuminate/support/Js.php | 145 + vendor/illuminate/support/LICENSE.md | 21 + vendor/illuminate/support/Lottery.php | 270 + vendor/illuminate/support/Manager.php | 193 + vendor/illuminate/support/MessageBag.php | 420 ++ .../support/MultipleInstanceManager.php | 191 + .../support/NamespacedItemResolver.php | 112 + vendor/illuminate/support/Optional.php | 131 + vendor/illuminate/support/Pluralizer.php | 129 + vendor/illuminate/support/ProcessUtils.php | 69 + vendor/illuminate/support/Reflector.php | 162 + vendor/illuminate/support/ServiceProvider.php | 437 ++ vendor/illuminate/support/Str.php | 1365 +++++ vendor/illuminate/support/Stringable.php | 1228 ++++ .../support/Testing/Fakes/BatchFake.php | 161 + .../Testing/Fakes/BatchRepositoryFake.php | 153 + .../support/Testing/Fakes/BusFake.php | 791 +++ .../support/Testing/Fakes/EventFake.php | 380 ++ .../support/Testing/Fakes/MailFake.php | 444 ++ .../Testing/Fakes/NotificationFake.php | 375 ++ .../Testing/Fakes/PendingBatchFake.php | 49 + .../Testing/Fakes/PendingChainFake.php | 56 + .../support/Testing/Fakes/PendingMailFake.php | 42 + .../support/Testing/Fakes/QueueFake.php | 503 ++ vendor/illuminate/support/Timebox.php | 70 + .../support/Traits/CapsuleManagerTrait.php | 69 + .../support/Traits/ForwardsCalls.php | 75 + .../illuminate/support/Traits/Localizable.php | 34 + .../support/Traits/ReflectsClosures.php | 88 + vendor/illuminate/support/Traits/Tappable.php | 17 + vendor/illuminate/support/ValidatedInput.php | 245 + vendor/illuminate/support/ViewErrorBag.php | 130 + vendor/illuminate/support/composer.json | 57 + vendor/illuminate/support/helpers.php | 424 ++ vendor/monolog/monolog/CHANGELOG.md | 608 ++ vendor/monolog/monolog/LICENSE | 19 + vendor/monolog/monolog/README.md | 112 + vendor/monolog/monolog/UPGRADE.md | 72 + vendor/monolog/monolog/composer.json | 81 + .../Monolog/Attribute/AsMonologProcessor.php | 46 + .../monolog/src/Monolog/DateTimeImmutable.php | 49 + .../monolog/src/Monolog/ErrorHandler.php | 307 + .../Monolog/Formatter/ChromePHPFormatter.php | 83 + .../Monolog/Formatter/ElasticaFormatter.php | 89 + .../Formatter/ElasticsearchFormatter.php | 89 + .../Monolog/Formatter/FlowdockFormatter.php | 111 + .../Monolog/Formatter/FluentdFormatter.php | 88 + .../Monolog/Formatter/FormatterInterface.php | 42 + .../Formatter/GelfMessageFormatter.php | 160 + .../Formatter/GoogleCloudLoggingFormatter.php | 39 + .../src/Monolog/Formatter/HtmlFormatter.php | 142 + .../src/Monolog/Formatter/JsonFormatter.php | 224 + .../src/Monolog/Formatter/LineFormatter.php | 246 + .../src/Monolog/Formatter/LogglyFormatter.php | 45 + .../Monolog/Formatter/LogmaticFormatter.php | 66 + .../Monolog/Formatter/LogstashFormatter.php | 101 + .../Monolog/Formatter/MongoDBFormatter.php | 162 + .../Monolog/Formatter/NormalizerFormatter.php | 287 + .../src/Monolog/Formatter/ScalarFormatter.php | 51 + .../Monolog/Formatter/WildfireFormatter.php | 139 + .../src/Monolog/Handler/AbstractHandler.php | 112 + .../Handler/AbstractProcessingHandler.php | 69 + .../Monolog/Handler/AbstractSyslogHandler.php | 106 + .../src/Monolog/Handler/AmqpHandler.php | 170 + .../Monolog/Handler/BrowserConsoleHandler.php | 293 + .../src/Monolog/Handler/BufferHandler.php | 167 + .../src/Monolog/Handler/ChromePHPHandler.php | 196 + .../src/Monolog/Handler/CouchDBHandler.php | 77 + .../src/Monolog/Handler/CubeHandler.php | 167 + .../monolog/src/Monolog/Handler/Curl/Util.php | 71 + .../Monolog/Handler/DeduplicationHandler.php | 186 + .../Handler/DoctrineCouchDBHandler.php | 47 + .../src/Monolog/Handler/DynamoDbHandler.php | 104 + .../src/Monolog/Handler/ElasticaHandler.php | 129 + .../Monolog/Handler/ElasticsearchHandler.php | 218 + .../src/Monolog/Handler/ErrorLogHandler.php | 91 + .../Monolog/Handler/FallbackGroupHandler.php | 71 + .../src/Monolog/Handler/FilterHandler.php | 212 + .../ActivationStrategyInterface.php | 29 + .../ChannelLevelActivationStrategy.php | 77 + .../ErrorLevelActivationStrategy.php | 46 + .../Monolog/Handler/FingersCrossedHandler.php | 252 + .../src/Monolog/Handler/FirePHPHandler.php | 180 + .../src/Monolog/Handler/FleepHookHandler.php | 135 + .../src/Monolog/Handler/FlowdockHandler.php | 132 + .../Handler/FormattableHandlerInterface.php | 37 + .../Handler/FormattableHandlerTrait.php | 60 + .../src/Monolog/Handler/GelfHandler.php | 57 + .../src/Monolog/Handler/GroupHandler.php | 132 + .../monolog/src/Monolog/Handler/Handler.php | 62 + .../src/Monolog/Handler/HandlerInterface.php | 85 + .../src/Monolog/Handler/HandlerWrapper.php | 136 + .../src/Monolog/Handler/IFTTTHandler.php | 74 + .../src/Monolog/Handler/InsightOpsHandler.php | 76 + .../src/Monolog/Handler/LogEntriesHandler.php | 70 + .../src/Monolog/Handler/LogglyHandler.php | 160 + .../src/Monolog/Handler/LogmaticHandler.php | 106 + .../src/Monolog/Handler/MailHandler.php | 95 + .../src/Monolog/Handler/MandrillHandler.php | 83 + .../Handler/MissingExtensionException.php | 21 + .../src/Monolog/Handler/MongoDBHandler.php | 86 + .../Monolog/Handler/NativeMailerHandler.php | 174 + .../src/Monolog/Handler/NewRelicHandler.php | 199 + .../src/Monolog/Handler/NoopHandler.php | 40 + .../src/Monolog/Handler/NullHandler.php | 60 + .../src/Monolog/Handler/OverflowHandler.php | 149 + .../src/Monolog/Handler/PHPConsoleHandler.php | 263 + .../src/Monolog/Handler/ProcessHandler.php | 191 + .../Handler/ProcessableHandlerInterface.php | 44 + .../Handler/ProcessableHandlerTrait.php | 77 + .../src/Monolog/Handler/PsrHandler.php | 95 + .../src/Monolog/Handler/PushoverHandler.php | 246 + .../src/Monolog/Handler/RedisHandler.php | 101 + .../Monolog/Handler/RedisPubSubHandler.php | 67 + .../src/Monolog/Handler/RollbarHandler.php | 131 + .../Monolog/Handler/RotatingFileHandler.php | 207 + .../src/Monolog/Handler/SamplingHandler.php | 132 + .../src/Monolog/Handler/SendGridHandler.php | 102 + .../src/Monolog/Handler/Slack/SlackRecord.php | 387 ++ .../src/Monolog/Handler/SlackHandler.php | 256 + .../Monolog/Handler/SlackWebhookHandler.php | 130 + .../src/Monolog/Handler/SocketHandler.php | 448 ++ .../src/Monolog/Handler/SqsHandler.php | 62 + .../src/Monolog/Handler/StreamHandler.php | 221 + .../Monolog/Handler/SwiftMailerHandler.php | 115 + .../Monolog/Handler/SymfonyMailerHandler.php | 111 + .../src/Monolog/Handler/SyslogHandler.php | 68 + .../Monolog/Handler/SyslogUdp/UdpSocket.php | 88 + .../src/Monolog/Handler/SyslogUdpHandler.php | 150 + .../Monolog/Handler/TelegramBotHandler.php | 274 + .../src/Monolog/Handler/TestHandler.php | 231 + .../Handler/WebRequestRecognizerTrait.php | 24 + .../Handler/WhatFailureGroupHandler.php | 67 + .../Monolog/Handler/ZendMonitorHandler.php | 101 + .../monolog/monolog/src/Monolog/LogRecord.php | 34 + vendor/monolog/monolog/src/Monolog/Logger.php | 701 +++ .../src/Monolog/Processor/GitProcessor.php | 77 + .../Monolog/Processor/HostnameProcessor.php | 36 + .../Processor/IntrospectionProcessor.php | 123 + .../Processor/MemoryPeakUsageProcessor.php | 37 + .../src/Monolog/Processor/MemoryProcessor.php | 61 + .../Processor/MemoryUsageProcessor.php | 37 + .../Monolog/Processor/MercurialProcessor.php | 77 + .../Monolog/Processor/ProcessIdProcessor.php | 30 + .../Monolog/Processor/ProcessorInterface.php | 30 + .../Processor/PsrLogMessageProcessor.php | 86 + .../src/Monolog/Processor/TagProcessor.php | 61 + .../src/Monolog/Processor/UidProcessor.php | 59 + .../src/Monolog/Processor/WebProcessor.php | 111 + .../monolog/monolog/src/Monolog/Registry.php | 134 + .../src/Monolog/ResettableInterface.php | 34 + .../monolog/src/Monolog/SignalHandler.php | 120 + .../monolog/src/Monolog/Test/TestCase.php | 85 + vendor/monolog/monolog/src/Monolog/Utils.php | 284 + vendor/nesbot/carbon/LICENSE | 19 + vendor/nesbot/carbon/bin/carbon | 23 + vendor/nesbot/carbon/bin/carbon.bat | 4 + vendor/nesbot/carbon/composer.json | 120 + vendor/nesbot/carbon/extension.neon | 5 + .../Carbon/PHPStan/AbstractMacroBuiltin.php | 36 + .../Carbon/PHPStan/AbstractMacroStatic.php | 45 + .../lazy/Carbon/PHPStan/MacroStrongType.php | 45 + .../lazy/Carbon/PHPStan/MacroWeakType.php | 51 + .../lazy/Carbon/TranslatorStrongType.php | 52 + .../carbon/lazy/Carbon/TranslatorWeakType.php | 32 + vendor/nesbot/carbon/readme.md | 153 + .../carbon/src/Carbon/AbstractTranslator.php | 397 ++ vendor/nesbot/carbon/src/Carbon/Carbon.php | 523 ++ .../src/Carbon/CarbonConverterInterface.php | 19 + .../carbon/src/Carbon/CarbonImmutable.php | 582 ++ .../carbon/src/Carbon/CarbonInterface.php | 5078 +++++++++++++++++ .../carbon/src/Carbon/CarbonInterval.php | 2823 +++++++++ .../nesbot/carbon/src/Carbon/CarbonPeriod.php | 2686 +++++++++ .../carbon/src/Carbon/CarbonTimeZone.php | 320 ++ .../nesbot/carbon/src/Carbon/Cli/Invoker.php | 38 + .../Carbon/Doctrine/CarbonDoctrineType.php | 23 + .../Carbon/Doctrine/CarbonImmutableType.php | 37 + .../carbon/src/Carbon/Doctrine/CarbonType.php | 37 + .../Carbon/Doctrine/CarbonTypeConverter.php | 123 + .../Doctrine/DateTimeDefaultPrecision.php | 37 + .../Carbon/Doctrine/DateTimeImmutableType.php | 24 + .../src/Carbon/Doctrine/DateTimeType.php | 16 + .../Exceptions/BadComparisonUnitException.php | 48 + .../BadFluentConstructorException.php | 49 + .../Exceptions/BadFluentSetterException.php | 49 + .../Exceptions/BadMethodCallException.php | 17 + .../Exceptions/EndLessPeriodException.php | 19 + .../src/Carbon/Exceptions/Exception.php | 17 + .../Carbon/Exceptions/ImmutableException.php | 48 + .../Exceptions/InvalidArgumentException.php | 17 + .../Exceptions/InvalidCastException.php | 19 + .../Exceptions/InvalidDateException.php | 67 + .../Exceptions/InvalidFormatException.php | 19 + .../Exceptions/InvalidIntervalException.php | 19 + .../Exceptions/InvalidPeriodDateException.php | 19 + .../InvalidPeriodParameterException.php | 19 + .../Exceptions/InvalidTimeZoneException.php | 19 + .../Exceptions/InvalidTypeException.php | 19 + .../Exceptions/NotACarbonClassException.php | 50 + .../Carbon/Exceptions/NotAPeriodException.php | 19 + .../Exceptions/NotLocaleAwareException.php | 32 + .../Carbon/Exceptions/OutOfRangeException.php | 101 + .../Carbon/Exceptions/ParseErrorException.php | 88 + .../Carbon/Exceptions/RuntimeException.php | 17 + .../src/Carbon/Exceptions/UnitException.php | 19 + .../Exceptions/UnitNotConfiguredException.php | 48 + .../Exceptions/UnknownGetterException.php | 49 + .../Exceptions/UnknownMethodException.php | 49 + .../Exceptions/UnknownSetterException.php | 49 + .../Exceptions/UnknownUnitException.php | 48 + .../Exceptions/UnreachableException.php | 19 + vendor/nesbot/carbon/src/Carbon/Factory.php | 326 ++ .../carbon/src/Carbon/FactoryImmutable.php | 243 + vendor/nesbot/carbon/src/Carbon/Lang/aa.php | 15 + .../nesbot/carbon/src/Carbon/Lang/aa_DJ.php | 44 + .../nesbot/carbon/src/Carbon/Lang/aa_ER.php | 28 + .../carbon/src/Carbon/Lang/aa_ER@saaho.php | 28 + .../nesbot/carbon/src/Carbon/Lang/aa_ET.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/af.php | 79 + .../nesbot/carbon/src/Carbon/Lang/af_NA.php | 28 + .../nesbot/carbon/src/Carbon/Lang/af_ZA.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/agq.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/agr.php | 15 + .../nesbot/carbon/src/Carbon/Lang/agr_PE.php | 44 + vendor/nesbot/carbon/src/Carbon/Lang/ak.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ak_GH.php | 40 + vendor/nesbot/carbon/src/Carbon/Lang/am.php | 15 + .../nesbot/carbon/src/Carbon/Lang/am_ET.php | 58 + vendor/nesbot/carbon/src/Carbon/Lang/an.php | 15 + .../nesbot/carbon/src/Carbon/Lang/an_ES.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/anp.php | 15 + .../nesbot/carbon/src/Carbon/Lang/anp_IN.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ar.php | 93 + .../nesbot/carbon/src/Carbon/Lang/ar_AE.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_BH.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_DJ.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ar_DZ.php | 92 + .../nesbot/carbon/src/Carbon/Lang/ar_EG.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_EH.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ar_ER.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ar_IL.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ar_IN.php | 26 + .../nesbot/carbon/src/Carbon/Lang/ar_IQ.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_JO.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_KM.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ar_KW.php | 93 + .../nesbot/carbon/src/Carbon/Lang/ar_LB.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_LY.php | 92 + .../nesbot/carbon/src/Carbon/Lang/ar_MA.php | 92 + .../nesbot/carbon/src/Carbon/Lang/ar_MR.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ar_OM.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_PS.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ar_QA.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_SA.php | 92 + .../nesbot/carbon/src/Carbon/Lang/ar_SD.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_SO.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ar_SS.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ar_SY.php | 27 + .../carbon/src/Carbon/Lang/ar_Shakl.php | 95 + .../nesbot/carbon/src/Carbon/Lang/ar_TD.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ar_TN.php | 91 + .../nesbot/carbon/src/Carbon/Lang/ar_YE.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/as.php | 15 + .../nesbot/carbon/src/Carbon/Lang/as_IN.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/asa.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/ast.php | 59 + .../nesbot/carbon/src/Carbon/Lang/ast_ES.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ayc.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ayc_PE.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/az.php | 128 + .../nesbot/carbon/src/Carbon/Lang/az_AZ.php | 21 + .../nesbot/carbon/src/Carbon/Lang/az_Cyrl.php | 20 + .../nesbot/carbon/src/Carbon/Lang/az_IR.php | 27 + .../nesbot/carbon/src/Carbon/Lang/az_Latn.php | 29 + vendor/nesbot/carbon/src/Carbon/Lang/bas.php | 32 + vendor/nesbot/carbon/src/Carbon/Lang/be.php | 173 + .../nesbot/carbon/src/Carbon/Lang/be_BY.php | 22 + .../carbon/src/Carbon/Lang/be_BY@latin.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/bem.php | 15 + .../nesbot/carbon/src/Carbon/Lang/bem_ZM.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/ber.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ber_DZ.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ber_MA.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/bez.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/bg.php | 114 + .../nesbot/carbon/src/Carbon/Lang/bg_BG.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/bhb.php | 15 + .../nesbot/carbon/src/Carbon/Lang/bhb_IN.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/bho.php | 15 + .../nesbot/carbon/src/Carbon/Lang/bho_IN.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/bi.php | 15 + .../nesbot/carbon/src/Carbon/Lang/bi_VU.php | 53 + vendor/nesbot/carbon/src/Carbon/Lang/bm.php | 70 + vendor/nesbot/carbon/src/Carbon/Lang/bn.php | 100 + .../nesbot/carbon/src/Carbon/Lang/bn_BD.php | 27 + .../nesbot/carbon/src/Carbon/Lang/bn_IN.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/bo.php | 71 + .../nesbot/carbon/src/Carbon/Lang/bo_CN.php | 12 + .../nesbot/carbon/src/Carbon/Lang/bo_IN.php | 29 + vendor/nesbot/carbon/src/Carbon/Lang/br.php | 76 + .../nesbot/carbon/src/Carbon/Lang/br_FR.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/brx.php | 15 + .../nesbot/carbon/src/Carbon/Lang/brx_IN.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/bs.php | 97 + .../nesbot/carbon/src/Carbon/Lang/bs_BA.php | 12 + .../nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php | 28 + .../nesbot/carbon/src/Carbon/Lang/bs_Latn.php | 13 + vendor/nesbot/carbon/src/Carbon/Lang/byn.php | 15 + .../nesbot/carbon/src/Carbon/Lang/byn_ER.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/ca.php | 117 + .../nesbot/carbon/src/Carbon/Lang/ca_AD.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ca_ES.php | 12 + .../carbon/src/Carbon/Lang/ca_ES_Valencia.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ca_FR.php | 13 + .../nesbot/carbon/src/Carbon/Lang/ca_IT.php | 13 + vendor/nesbot/carbon/src/Carbon/Lang/ccp.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ccp_IN.php | 14 + vendor/nesbot/carbon/src/Carbon/Lang/ce.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ce_RU.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/cgg.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/chr.php | 15 + .../nesbot/carbon/src/Carbon/Lang/chr_US.php | 58 + vendor/nesbot/carbon/src/Carbon/Lang/ckb.php | 89 + vendor/nesbot/carbon/src/Carbon/Lang/cmn.php | 15 + .../nesbot/carbon/src/Carbon/Lang/cmn_TW.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/crh.php | 15 + .../nesbot/carbon/src/Carbon/Lang/crh_UA.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/cs.php | 123 + .../nesbot/carbon/src/Carbon/Lang/cs_CZ.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/csb.php | 15 + .../nesbot/carbon/src/Carbon/Lang/csb_PL.php | 41 + vendor/nesbot/carbon/src/Carbon/Lang/cu.php | 52 + vendor/nesbot/carbon/src/Carbon/Lang/cv.php | 65 + .../nesbot/carbon/src/Carbon/Lang/cv_RU.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/cy.php | 79 + .../nesbot/carbon/src/Carbon/Lang/cy_GB.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/da.php | 81 + .../nesbot/carbon/src/Carbon/Lang/da_DK.php | 12 + .../nesbot/carbon/src/Carbon/Lang/da_GL.php | 19 + vendor/nesbot/carbon/src/Carbon/Lang/dav.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/de.php | 117 + .../nesbot/carbon/src/Carbon/Lang/de_AT.php | 27 + .../nesbot/carbon/src/Carbon/Lang/de_BE.php | 20 + .../nesbot/carbon/src/Carbon/Lang/de_CH.php | 20 + .../nesbot/carbon/src/Carbon/Lang/de_DE.php | 16 + .../nesbot/carbon/src/Carbon/Lang/de_IT.php | 16 + .../nesbot/carbon/src/Carbon/Lang/de_LI.php | 12 + .../nesbot/carbon/src/Carbon/Lang/de_LU.php | 20 + vendor/nesbot/carbon/src/Carbon/Lang/dje.php | 40 + vendor/nesbot/carbon/src/Carbon/Lang/doi.php | 15 + .../nesbot/carbon/src/Carbon/Lang/doi_IN.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/dsb.php | 15 + .../nesbot/carbon/src/Carbon/Lang/dsb_DE.php | 60 + vendor/nesbot/carbon/src/Carbon/Lang/dua.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/dv.php | 89 + .../nesbot/carbon/src/Carbon/Lang/dv_MV.php | 87 + vendor/nesbot/carbon/src/Carbon/Lang/dyo.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/dz.php | 15 + .../nesbot/carbon/src/Carbon/Lang/dz_BT.php | 43 + vendor/nesbot/carbon/src/Carbon/Lang/ebu.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ee.php | 56 + .../nesbot/carbon/src/Carbon/Lang/ee_TG.php | 19 + vendor/nesbot/carbon/src/Carbon/Lang/el.php | 93 + .../nesbot/carbon/src/Carbon/Lang/el_CY.php | 19 + .../nesbot/carbon/src/Carbon/Lang/el_GR.php | 19 + vendor/nesbot/carbon/src/Carbon/Lang/en.php | 87 + .../nesbot/carbon/src/Carbon/Lang/en_001.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_150.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_AG.php | 21 + .../nesbot/carbon/src/Carbon/Lang/en_AI.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_AS.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_AT.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_AU.php | 31 + .../nesbot/carbon/src/Carbon/Lang/en_BB.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_BE.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_BI.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_BM.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_BS.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_BW.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_BZ.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_CA.php | 29 + .../nesbot/carbon/src/Carbon/Lang/en_CC.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_CH.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_CK.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_CM.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_CX.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_CY.php | 28 + .../nesbot/carbon/src/Carbon/Lang/en_DE.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_DG.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_DK.php | 22 + .../nesbot/carbon/src/Carbon/Lang/en_DM.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_ER.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_FI.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_FJ.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_FK.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_FM.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_GB.php | 30 + .../nesbot/carbon/src/Carbon/Lang/en_GD.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_GG.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_GH.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_GI.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_GM.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_GU.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_GY.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_HK.php | 18 + .../nesbot/carbon/src/Carbon/Lang/en_IE.php | 31 + .../nesbot/carbon/src/Carbon/Lang/en_IL.php | 29 + .../nesbot/carbon/src/Carbon/Lang/en_IM.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_IN.php | 26 + .../nesbot/carbon/src/Carbon/Lang/en_IO.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_ISO.php | 21 + .../nesbot/carbon/src/Carbon/Lang/en_JE.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_JM.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_KE.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_KI.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_KN.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_KY.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_LC.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_LR.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_LS.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_MG.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_MH.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_MO.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_MP.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_MS.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_MT.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_MU.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_MW.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_MY.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_NA.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_NF.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_NG.php | 18 + .../nesbot/carbon/src/Carbon/Lang/en_NL.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_NR.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_NU.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_NZ.php | 31 + .../nesbot/carbon/src/Carbon/Lang/en_PG.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_PH.php | 18 + .../nesbot/carbon/src/Carbon/Lang/en_PK.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_PN.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_PR.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_PW.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_RW.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_SB.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_SC.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_SD.php | 15 + .../nesbot/carbon/src/Carbon/Lang/en_SE.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_SG.php | 24 + .../nesbot/carbon/src/Carbon/Lang/en_SH.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_SI.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_SL.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_SS.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_SX.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_SZ.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_TC.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_TK.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_TO.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_TT.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_TV.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_TZ.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_UG.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_UM.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_US.php | 12 + .../carbon/src/Carbon/Lang/en_US_Posix.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_VC.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_VG.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_VI.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_VU.php | 14 + .../nesbot/carbon/src/Carbon/Lang/en_WS.php | 12 + .../nesbot/carbon/src/Carbon/Lang/en_ZA.php | 26 + .../nesbot/carbon/src/Carbon/Lang/en_ZM.php | 22 + .../nesbot/carbon/src/Carbon/Lang/en_ZW.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/eo.php | 77 + vendor/nesbot/carbon/src/Carbon/Lang/es.php | 121 + .../nesbot/carbon/src/Carbon/Lang/es_419.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_AR.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_BO.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_BR.php | 14 + .../nesbot/carbon/src/Carbon/Lang/es_BZ.php | 14 + .../nesbot/carbon/src/Carbon/Lang/es_CL.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_CO.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_CR.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_CU.php | 14 + .../nesbot/carbon/src/Carbon/Lang/es_DO.php | 31 + .../nesbot/carbon/src/Carbon/Lang/es_EA.php | 14 + .../nesbot/carbon/src/Carbon/Lang/es_EC.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_ES.php | 16 + .../nesbot/carbon/src/Carbon/Lang/es_GQ.php | 14 + .../nesbot/carbon/src/Carbon/Lang/es_GT.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_HN.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_IC.php | 14 + .../nesbot/carbon/src/Carbon/Lang/es_MX.php | 20 + .../nesbot/carbon/src/Carbon/Lang/es_NI.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_PA.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_PE.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_PH.php | 22 + .../nesbot/carbon/src/Carbon/Lang/es_PR.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_PY.php | 19 + .../nesbot/carbon/src/Carbon/Lang/es_SV.php | 20 + .../nesbot/carbon/src/Carbon/Lang/es_US.php | 38 + .../nesbot/carbon/src/Carbon/Lang/es_UY.php | 21 + .../nesbot/carbon/src/Carbon/Lang/es_VE.php | 19 + vendor/nesbot/carbon/src/Carbon/Lang/et.php | 93 + .../nesbot/carbon/src/Carbon/Lang/et_EE.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/eu.php | 67 + .../nesbot/carbon/src/Carbon/Lang/eu_ES.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ewo.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/fa.php | 84 + .../nesbot/carbon/src/Carbon/Lang/fa_AF.php | 21 + .../nesbot/carbon/src/Carbon/Lang/fa_IR.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ff.php | 60 + .../nesbot/carbon/src/Carbon/Lang/ff_CM.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ff_GN.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ff_MR.php | 21 + .../nesbot/carbon/src/Carbon/Lang/ff_SN.php | 16 + vendor/nesbot/carbon/src/Carbon/Lang/fi.php | 88 + .../nesbot/carbon/src/Carbon/Lang/fi_FI.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/fil.php | 15 + .../nesbot/carbon/src/Carbon/Lang/fil_PH.php | 62 + vendor/nesbot/carbon/src/Carbon/Lang/fo.php | 69 + .../nesbot/carbon/src/Carbon/Lang/fo_DK.php | 19 + .../nesbot/carbon/src/Carbon/Lang/fo_FO.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/fr.php | 123 + .../nesbot/carbon/src/Carbon/Lang/fr_BE.php | 18 + .../nesbot/carbon/src/Carbon/Lang/fr_BF.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_BI.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_BJ.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_BL.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_CA.php | 25 + .../nesbot/carbon/src/Carbon/Lang/fr_CD.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_CF.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_CG.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_CH.php | 24 + .../nesbot/carbon/src/Carbon/Lang/fr_CI.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_CM.php | 14 + .../nesbot/carbon/src/Carbon/Lang/fr_DJ.php | 22 + .../nesbot/carbon/src/Carbon/Lang/fr_DZ.php | 23 + .../nesbot/carbon/src/Carbon/Lang/fr_FR.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_GA.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_GF.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_GN.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_GP.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_GQ.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_HT.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_KM.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_LU.php | 21 + .../nesbot/carbon/src/Carbon/Lang/fr_MA.php | 15 + .../nesbot/carbon/src/Carbon/Lang/fr_MC.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_MF.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_MG.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_ML.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_MQ.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_MR.php | 21 + .../nesbot/carbon/src/Carbon/Lang/fr_MU.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_NC.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_NE.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_PF.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_PM.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_RE.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_RW.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_SC.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_SN.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_SY.php | 23 + .../nesbot/carbon/src/Carbon/Lang/fr_TD.php | 21 + .../nesbot/carbon/src/Carbon/Lang/fr_TG.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_TN.php | 22 + .../nesbot/carbon/src/Carbon/Lang/fr_VU.php | 21 + .../nesbot/carbon/src/Carbon/Lang/fr_WF.php | 12 + .../nesbot/carbon/src/Carbon/Lang/fr_YT.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/fur.php | 15 + .../nesbot/carbon/src/Carbon/Lang/fur_IT.php | 39 + vendor/nesbot/carbon/src/Carbon/Lang/fy.php | 76 + .../nesbot/carbon/src/Carbon/Lang/fy_DE.php | 27 + .../nesbot/carbon/src/Carbon/Lang/fy_NL.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ga.php | 77 + .../nesbot/carbon/src/Carbon/Lang/ga_IE.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/gd.php | 75 + .../nesbot/carbon/src/Carbon/Lang/gd_GB.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/gez.php | 15 + .../nesbot/carbon/src/Carbon/Lang/gez_ER.php | 56 + .../nesbot/carbon/src/Carbon/Lang/gez_ET.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/gl.php | 98 + .../nesbot/carbon/src/Carbon/Lang/gl_ES.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/gom.php | 15 + .../carbon/src/Carbon/Lang/gom_Latn.php | 79 + vendor/nesbot/carbon/src/Carbon/Lang/gsw.php | 49 + .../nesbot/carbon/src/Carbon/Lang/gsw_CH.php | 12 + .../nesbot/carbon/src/Carbon/Lang/gsw_FR.php | 20 + .../nesbot/carbon/src/Carbon/Lang/gsw_LI.php | 20 + vendor/nesbot/carbon/src/Carbon/Lang/gu.php | 82 + .../nesbot/carbon/src/Carbon/Lang/gu_IN.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/guz.php | 47 + vendor/nesbot/carbon/src/Carbon/Lang/gv.php | 15 + .../nesbot/carbon/src/Carbon/Lang/gv_GB.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/ha.php | 60 + .../nesbot/carbon/src/Carbon/Lang/ha_GH.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ha_NE.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ha_NG.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/hak.php | 15 + .../nesbot/carbon/src/Carbon/Lang/hak_TW.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/haw.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/he.php | 86 + .../nesbot/carbon/src/Carbon/Lang/he_IL.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/hi.php | 82 + .../nesbot/carbon/src/Carbon/Lang/hi_IN.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/hif.php | 15 + .../nesbot/carbon/src/Carbon/Lang/hif_FJ.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/hne.php | 15 + .../nesbot/carbon/src/Carbon/Lang/hne_IN.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/hr.php | 111 + .../nesbot/carbon/src/Carbon/Lang/hr_BA.php | 32 + .../nesbot/carbon/src/Carbon/Lang/hr_HR.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/hsb.php | 15 + .../nesbot/carbon/src/Carbon/Lang/hsb_DE.php | 60 + vendor/nesbot/carbon/src/Carbon/Lang/ht.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ht_HT.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/hu.php | 118 + .../nesbot/carbon/src/Carbon/Lang/hu_HU.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/hy.php | 95 + .../nesbot/carbon/src/Carbon/Lang/hy_AM.php | 24 + vendor/nesbot/carbon/src/Carbon/Lang/i18n.php | 23 + vendor/nesbot/carbon/src/Carbon/Lang/ia.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ia_FR.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/id.php | 92 + .../nesbot/carbon/src/Carbon/Lang/id_ID.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ig.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ig_NG.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/ii.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/ik.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ik_CA.php | 50 + vendor/nesbot/carbon/src/Carbon/Lang/in.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/is.php | 55 + .../nesbot/carbon/src/Carbon/Lang/is_IS.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/it.php | 115 + .../nesbot/carbon/src/Carbon/Lang/it_CH.php | 20 + .../nesbot/carbon/src/Carbon/Lang/it_IT.php | 16 + .../nesbot/carbon/src/Carbon/Lang/it_SM.php | 12 + .../nesbot/carbon/src/Carbon/Lang/it_VA.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/iu.php | 15 + .../nesbot/carbon/src/Carbon/Lang/iu_CA.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/iw.php | 58 + vendor/nesbot/carbon/src/Carbon/Lang/ja.php | 102 + .../nesbot/carbon/src/Carbon/Lang/ja_JP.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/jgo.php | 13 + vendor/nesbot/carbon/src/Carbon/Lang/jmc.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/jv.php | 71 + vendor/nesbot/carbon/src/Carbon/Lang/ka.php | 204 + .../nesbot/carbon/src/Carbon/Lang/ka_GE.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/kab.php | 15 + .../nesbot/carbon/src/Carbon/Lang/kab_DZ.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/kam.php | 50 + vendor/nesbot/carbon/src/Carbon/Lang/kde.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/kea.php | 49 + vendor/nesbot/carbon/src/Carbon/Lang/khq.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/ki.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/kk.php | 103 + .../nesbot/carbon/src/Carbon/Lang/kk_KZ.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/kkj.php | 13 + vendor/nesbot/carbon/src/Carbon/Lang/kl.php | 15 + .../nesbot/carbon/src/Carbon/Lang/kl_GL.php | 64 + vendor/nesbot/carbon/src/Carbon/Lang/kln.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/km.php | 71 + .../nesbot/carbon/src/Carbon/Lang/km_KH.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/kn.php | 75 + .../nesbot/carbon/src/Carbon/Lang/kn_IN.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ko.php | 91 + .../nesbot/carbon/src/Carbon/Lang/ko_KP.php | 14 + .../nesbot/carbon/src/Carbon/Lang/ko_KR.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/kok.php | 15 + .../nesbot/carbon/src/Carbon/Lang/kok_IN.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/ks.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ks_IN.php | 51 + .../src/Carbon/Lang/ks_IN@devanagari.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ksb.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/ksf.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/ksh.php | 57 + vendor/nesbot/carbon/src/Carbon/Lang/ku.php | 40 + .../nesbot/carbon/src/Carbon/Lang/ku_TR.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/kw.php | 15 + .../nesbot/carbon/src/Carbon/Lang/kw_GB.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/ky.php | 106 + .../nesbot/carbon/src/Carbon/Lang/ky_KG.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/lag.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/lb.php | 88 + .../nesbot/carbon/src/Carbon/Lang/lb_LU.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/lg.php | 15 + .../nesbot/carbon/src/Carbon/Lang/lg_UG.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/li.php | 15 + .../nesbot/carbon/src/Carbon/Lang/li_NL.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/lij.php | 15 + .../nesbot/carbon/src/Carbon/Lang/lij_IT.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/lkt.php | 41 + vendor/nesbot/carbon/src/Carbon/Lang/ln.php | 60 + .../nesbot/carbon/src/Carbon/Lang/ln_AO.php | 17 + .../nesbot/carbon/src/Carbon/Lang/ln_CD.php | 16 + .../nesbot/carbon/src/Carbon/Lang/ln_CF.php | 17 + .../nesbot/carbon/src/Carbon/Lang/ln_CG.php | 17 + vendor/nesbot/carbon/src/Carbon/Lang/lo.php | 62 + .../nesbot/carbon/src/Carbon/Lang/lo_LA.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/lrc.php | 17 + .../nesbot/carbon/src/Carbon/Lang/lrc_IQ.php | 13 + vendor/nesbot/carbon/src/Carbon/Lang/lt.php | 135 + .../nesbot/carbon/src/Carbon/Lang/lt_LT.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/lu.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/luo.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/luy.php | 57 + vendor/nesbot/carbon/src/Carbon/Lang/lv.php | 183 + .../nesbot/carbon/src/Carbon/Lang/lv_LV.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/lzh.php | 15 + .../nesbot/carbon/src/Carbon/Lang/lzh_TW.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/mag.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mag_IN.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/mai.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mai_IN.php | 51 + vendor/nesbot/carbon/src/Carbon/Lang/mas.php | 51 + .../nesbot/carbon/src/Carbon/Lang/mas_TZ.php | 14 + vendor/nesbot/carbon/src/Carbon/Lang/mer.php | 43 + vendor/nesbot/carbon/src/Carbon/Lang/mfe.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mfe_MU.php | 53 + vendor/nesbot/carbon/src/Carbon/Lang/mg.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mg_MG.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/mgh.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/mgo.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/mhr.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mhr_RU.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/mi.php | 66 + .../nesbot/carbon/src/Carbon/Lang/mi_NZ.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/miq.php | 15 + .../nesbot/carbon/src/Carbon/Lang/miq_NI.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/mjw.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mjw_IN.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/mk.php | 116 + .../nesbot/carbon/src/Carbon/Lang/mk_MK.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ml.php | 76 + .../nesbot/carbon/src/Carbon/Lang/ml_IN.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/mn.php | 116 + .../nesbot/carbon/src/Carbon/Lang/mn_MN.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/mni.php | 15 + .../nesbot/carbon/src/Carbon/Lang/mni_IN.php | 35 + vendor/nesbot/carbon/src/Carbon/Lang/mo.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/mr.php | 86 + .../nesbot/carbon/src/Carbon/Lang/mr_IN.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ms.php | 104 + .../nesbot/carbon/src/Carbon/Lang/ms_BN.php | 22 + .../nesbot/carbon/src/Carbon/Lang/ms_MY.php | 18 + .../nesbot/carbon/src/Carbon/Lang/ms_SG.php | 22 + vendor/nesbot/carbon/src/Carbon/Lang/mt.php | 65 + .../nesbot/carbon/src/Carbon/Lang/mt_MT.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/mua.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/my.php | 70 + .../nesbot/carbon/src/Carbon/Lang/my_MM.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/mzn.php | 25 + vendor/nesbot/carbon/src/Carbon/Lang/nan.php | 15 + .../nesbot/carbon/src/Carbon/Lang/nan_TW.php | 55 + .../carbon/src/Carbon/Lang/nan_TW@latin.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/naq.php | 52 + vendor/nesbot/carbon/src/Carbon/Lang/nb.php | 84 + .../nesbot/carbon/src/Carbon/Lang/nb_NO.php | 12 + .../nesbot/carbon/src/Carbon/Lang/nb_SJ.php | 18 + vendor/nesbot/carbon/src/Carbon/Lang/nd.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/nds.php | 15 + .../nesbot/carbon/src/Carbon/Lang/nds_DE.php | 60 + .../nesbot/carbon/src/Carbon/Lang/nds_NL.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ne.php | 82 + .../nesbot/carbon/src/Carbon/Lang/ne_IN.php | 25 + .../nesbot/carbon/src/Carbon/Lang/ne_NP.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/nhn.php | 15 + .../nesbot/carbon/src/Carbon/Lang/nhn_MX.php | 50 + vendor/nesbot/carbon/src/Carbon/Lang/niu.php | 15 + .../nesbot/carbon/src/Carbon/Lang/niu_NU.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/nl.php | 113 + .../nesbot/carbon/src/Carbon/Lang/nl_AW.php | 27 + .../nesbot/carbon/src/Carbon/Lang/nl_BE.php | 27 + .../nesbot/carbon/src/Carbon/Lang/nl_BQ.php | 12 + .../nesbot/carbon/src/Carbon/Lang/nl_CW.php | 12 + .../nesbot/carbon/src/Carbon/Lang/nl_NL.php | 24 + .../nesbot/carbon/src/Carbon/Lang/nl_SR.php | 12 + .../nesbot/carbon/src/Carbon/Lang/nl_SX.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/nmg.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/nn.php | 78 + .../nesbot/carbon/src/Carbon/Lang/nn_NO.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/nnh.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/no.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/nr.php | 15 + .../nesbot/carbon/src/Carbon/Lang/nr_ZA.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/nso.php | 15 + .../nesbot/carbon/src/Carbon/Lang/nso_ZA.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/nus.php | 36 + vendor/nesbot/carbon/src/Carbon/Lang/nyn.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/oc.php | 100 + .../nesbot/carbon/src/Carbon/Lang/oc_FR.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/om.php | 60 + .../nesbot/carbon/src/Carbon/Lang/om_ET.php | 12 + .../nesbot/carbon/src/Carbon/Lang/om_KE.php | 14 + vendor/nesbot/carbon/src/Carbon/Lang/or.php | 15 + .../nesbot/carbon/src/Carbon/Lang/or_IN.php | 51 + vendor/nesbot/carbon/src/Carbon/Lang/os.php | 15 + .../nesbot/carbon/src/Carbon/Lang/os_RU.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/pa.php | 76 + .../nesbot/carbon/src/Carbon/Lang/pa_Arab.php | 26 + .../nesbot/carbon/src/Carbon/Lang/pa_Guru.php | 27 + .../nesbot/carbon/src/Carbon/Lang/pa_IN.php | 19 + .../nesbot/carbon/src/Carbon/Lang/pa_PK.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/pap.php | 39 + .../nesbot/carbon/src/Carbon/Lang/pap_AW.php | 16 + .../nesbot/carbon/src/Carbon/Lang/pap_CW.php | 16 + vendor/nesbot/carbon/src/Carbon/Lang/pl.php | 126 + .../nesbot/carbon/src/Carbon/Lang/pl_PL.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/prg.php | 52 + vendor/nesbot/carbon/src/Carbon/Lang/ps.php | 55 + .../nesbot/carbon/src/Carbon/Lang/ps_AF.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/pt.php | 116 + .../nesbot/carbon/src/Carbon/Lang/pt_AO.php | 12 + .../nesbot/carbon/src/Carbon/Lang/pt_BR.php | 39 + .../nesbot/carbon/src/Carbon/Lang/pt_CH.php | 12 + .../nesbot/carbon/src/Carbon/Lang/pt_CV.php | 12 + .../nesbot/carbon/src/Carbon/Lang/pt_GQ.php | 12 + .../nesbot/carbon/src/Carbon/Lang/pt_GW.php | 12 + .../nesbot/carbon/src/Carbon/Lang/pt_LU.php | 12 + .../nesbot/carbon/src/Carbon/Lang/pt_MO.php | 20 + .../nesbot/carbon/src/Carbon/Lang/pt_MZ.php | 14 + .../nesbot/carbon/src/Carbon/Lang/pt_PT.php | 27 + .../nesbot/carbon/src/Carbon/Lang/pt_ST.php | 12 + .../nesbot/carbon/src/Carbon/Lang/pt_TL.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/qu.php | 22 + .../nesbot/carbon/src/Carbon/Lang/qu_BO.php | 14 + .../nesbot/carbon/src/Carbon/Lang/qu_EC.php | 14 + vendor/nesbot/carbon/src/Carbon/Lang/quz.php | 15 + .../nesbot/carbon/src/Carbon/Lang/quz_PE.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/raj.php | 15 + .../nesbot/carbon/src/Carbon/Lang/raj_IN.php | 47 + vendor/nesbot/carbon/src/Carbon/Lang/rm.php | 51 + vendor/nesbot/carbon/src/Carbon/Lang/rn.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/ro.php | 77 + .../nesbot/carbon/src/Carbon/Lang/ro_MD.php | 21 + .../nesbot/carbon/src/Carbon/Lang/ro_RO.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/rof.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/ru.php | 191 + .../nesbot/carbon/src/Carbon/Lang/ru_BY.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ru_KG.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ru_KZ.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ru_MD.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ru_RU.php | 12 + .../nesbot/carbon/src/Carbon/Lang/ru_UA.php | 20 + vendor/nesbot/carbon/src/Carbon/Lang/rw.php | 15 + .../nesbot/carbon/src/Carbon/Lang/rw_RW.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/rwk.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/sa.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sa_IN.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/sah.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sah_RU.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/saq.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/sat.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sat_IN.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/sbp.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/sc.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sc_IT.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/sd.php | 81 + .../nesbot/carbon/src/Carbon/Lang/sd_IN.php | 26 + .../src/Carbon/Lang/sd_IN@devanagari.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/se.php | 73 + .../nesbot/carbon/src/Carbon/Lang/se_FI.php | 27 + .../nesbot/carbon/src/Carbon/Lang/se_NO.php | 12 + .../nesbot/carbon/src/Carbon/Lang/se_SE.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/seh.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/ses.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/sg.php | 52 + vendor/nesbot/carbon/src/Carbon/Lang/sgs.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sgs_LT.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/sh.php | 68 + vendor/nesbot/carbon/src/Carbon/Lang/shi.php | 57 + .../carbon/src/Carbon/Lang/shi_Latn.php | 33 + .../carbon/src/Carbon/Lang/shi_Tfng.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/shn.php | 15 + .../nesbot/carbon/src/Carbon/Lang/shn_MM.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/shs.php | 15 + .../nesbot/carbon/src/Carbon/Lang/shs_CA.php | 38 + vendor/nesbot/carbon/src/Carbon/Lang/si.php | 78 + .../nesbot/carbon/src/Carbon/Lang/si_LK.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/sid.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sid_ET.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/sk.php | 83 + .../nesbot/carbon/src/Carbon/Lang/sk_SK.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/sl.php | 129 + .../nesbot/carbon/src/Carbon/Lang/sl_SI.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/sm.php | 15 + .../nesbot/carbon/src/Carbon/Lang/sm_WS.php | 53 + vendor/nesbot/carbon/src/Carbon/Lang/smn.php | 57 + vendor/nesbot/carbon/src/Carbon/Lang/sn.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/so.php | 74 + .../nesbot/carbon/src/Carbon/Lang/so_DJ.php | 20 + .../nesbot/carbon/src/Carbon/Lang/so_ET.php | 16 + .../nesbot/carbon/src/Carbon/Lang/so_KE.php | 16 + .../nesbot/carbon/src/Carbon/Lang/so_SO.php | 16 + vendor/nesbot/carbon/src/Carbon/Lang/sq.php | 79 + .../nesbot/carbon/src/Carbon/Lang/sq_AL.php | 12 + .../nesbot/carbon/src/Carbon/Lang/sq_MK.php | 19 + .../nesbot/carbon/src/Carbon/Lang/sq_XK.php | 19 + vendor/nesbot/carbon/src/Carbon/Lang/sr.php | 112 + .../nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php | 112 + .../carbon/src/Carbon/Lang/sr_Cyrl_BA.php | 23 + .../carbon/src/Carbon/Lang/sr_Cyrl_ME.php | 109 + .../carbon/src/Carbon/Lang/sr_Cyrl_XK.php | 14 + .../nesbot/carbon/src/Carbon/Lang/sr_Latn.php | 12 + .../carbon/src/Carbon/Lang/sr_Latn_BA.php | 23 + .../carbon/src/Carbon/Lang/sr_Latn_ME.php | 66 + .../carbon/src/Carbon/Lang/sr_Latn_XK.php | 14 + .../nesbot/carbon/src/Carbon/Lang/sr_ME.php | 12 + .../nesbot/carbon/src/Carbon/Lang/sr_RS.php | 16 + .../carbon/src/Carbon/Lang/sr_RS@latin.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ss.php | 78 + .../nesbot/carbon/src/Carbon/Lang/ss_ZA.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/st.php | 15 + .../nesbot/carbon/src/Carbon/Lang/st_ZA.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/sv.php | 87 + .../nesbot/carbon/src/Carbon/Lang/sv_AX.php | 19 + .../nesbot/carbon/src/Carbon/Lang/sv_FI.php | 12 + .../nesbot/carbon/src/Carbon/Lang/sv_SE.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/sw.php | 74 + .../nesbot/carbon/src/Carbon/Lang/sw_CD.php | 17 + .../nesbot/carbon/src/Carbon/Lang/sw_KE.php | 27 + .../nesbot/carbon/src/Carbon/Lang/sw_TZ.php | 28 + .../nesbot/carbon/src/Carbon/Lang/sw_UG.php | 17 + vendor/nesbot/carbon/src/Carbon/Lang/szl.php | 15 + .../nesbot/carbon/src/Carbon/Lang/szl_PL.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/ta.php | 97 + .../nesbot/carbon/src/Carbon/Lang/ta_IN.php | 27 + .../nesbot/carbon/src/Carbon/Lang/ta_LK.php | 28 + .../nesbot/carbon/src/Carbon/Lang/ta_MY.php | 28 + .../nesbot/carbon/src/Carbon/Lang/ta_SG.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/tcy.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tcy_IN.php | 39 + vendor/nesbot/carbon/src/Carbon/Lang/te.php | 89 + .../nesbot/carbon/src/Carbon/Lang/te_IN.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/teo.php | 28 + .../nesbot/carbon/src/Carbon/Lang/teo_KE.php | 14 + vendor/nesbot/carbon/src/Carbon/Lang/tet.php | 64 + vendor/nesbot/carbon/src/Carbon/Lang/tg.php | 104 + .../nesbot/carbon/src/Carbon/Lang/tg_TJ.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/th.php | 73 + .../nesbot/carbon/src/Carbon/Lang/th_TH.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/the.php | 15 + .../nesbot/carbon/src/Carbon/Lang/the_NP.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/ti.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ti_ER.php | 56 + .../nesbot/carbon/src/Carbon/Lang/ti_ET.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/tig.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tig_ER.php | 56 + vendor/nesbot/carbon/src/Carbon/Lang/tk.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tk_TM.php | 77 + vendor/nesbot/carbon/src/Carbon/Lang/tl.php | 61 + .../nesbot/carbon/src/Carbon/Lang/tl_PH.php | 18 + vendor/nesbot/carbon/src/Carbon/Lang/tlh.php | 72 + vendor/nesbot/carbon/src/Carbon/Lang/tn.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tn_ZA.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/to.php | 15 + .../nesbot/carbon/src/Carbon/Lang/to_TO.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/tpi.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tpi_PG.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/tr.php | 121 + .../nesbot/carbon/src/Carbon/Lang/tr_CY.php | 23 + .../nesbot/carbon/src/Carbon/Lang/tr_TR.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ts.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ts_ZA.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/tt.php | 15 + .../nesbot/carbon/src/Carbon/Lang/tt_RU.php | 39 + .../carbon/src/Carbon/Lang/tt_RU@iqtelif.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/twq.php | 14 + vendor/nesbot/carbon/src/Carbon/Lang/tzl.php | 65 + vendor/nesbot/carbon/src/Carbon/Lang/tzm.php | 57 + .../carbon/src/Carbon/Lang/tzm_Latn.php | 64 + vendor/nesbot/carbon/src/Carbon/Lang/ug.php | 90 + .../nesbot/carbon/src/Carbon/Lang/ug_CN.php | 17 + vendor/nesbot/carbon/src/Carbon/Lang/uk.php | 212 + .../nesbot/carbon/src/Carbon/Lang/uk_UA.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/unm.php | 15 + .../nesbot/carbon/src/Carbon/Lang/unm_US.php | 57 + vendor/nesbot/carbon/src/Carbon/Lang/ur.php | 94 + .../nesbot/carbon/src/Carbon/Lang/ur_IN.php | 26 + .../nesbot/carbon/src/Carbon/Lang/ur_PK.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/uz.php | 85 + .../nesbot/carbon/src/Carbon/Lang/uz_Arab.php | 28 + .../nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php | 20 + .../nesbot/carbon/src/Carbon/Lang/uz_Latn.php | 74 + .../nesbot/carbon/src/Carbon/Lang/uz_UZ.php | 27 + .../carbon/src/Carbon/Lang/uz_UZ@cyrillic.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/vai.php | 35 + .../carbon/src/Carbon/Lang/vai_Latn.php | 27 + .../carbon/src/Carbon/Lang/vai_Vaii.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/ve.php | 15 + .../nesbot/carbon/src/Carbon/Lang/ve_ZA.php | 49 + vendor/nesbot/carbon/src/Carbon/Lang/vi.php | 76 + .../nesbot/carbon/src/Carbon/Lang/vi_VN.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/vo.php | 52 + vendor/nesbot/carbon/src/Carbon/Lang/vun.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/wa.php | 15 + .../nesbot/carbon/src/Carbon/Lang/wa_BE.php | 55 + vendor/nesbot/carbon/src/Carbon/Lang/wae.php | 15 + .../nesbot/carbon/src/Carbon/Lang/wae_CH.php | 31 + vendor/nesbot/carbon/src/Carbon/Lang/wal.php | 15 + .../nesbot/carbon/src/Carbon/Lang/wal_ET.php | 27 + vendor/nesbot/carbon/src/Carbon/Lang/wo.php | 15 + .../nesbot/carbon/src/Carbon/Lang/wo_SN.php | 39 + vendor/nesbot/carbon/src/Carbon/Lang/xh.php | 15 + .../nesbot/carbon/src/Carbon/Lang/xh_ZA.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/xog.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/yav.php | 28 + vendor/nesbot/carbon/src/Carbon/Lang/yi.php | 15 + .../nesbot/carbon/src/Carbon/Lang/yi_US.php | 54 + vendor/nesbot/carbon/src/Carbon/Lang/yo.php | 65 + .../nesbot/carbon/src/Carbon/Lang/yo_BJ.php | 28 + .../nesbot/carbon/src/Carbon/Lang/yo_NG.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/yue.php | 15 + .../nesbot/carbon/src/Carbon/Lang/yue_HK.php | 28 + .../carbon/src/Carbon/Lang/yue_Hans.php | 12 + .../carbon/src/Carbon/Lang/yue_Hant.php | 12 + vendor/nesbot/carbon/src/Carbon/Lang/yuw.php | 15 + .../nesbot/carbon/src/Carbon/Lang/yuw_PG.php | 26 + vendor/nesbot/carbon/src/Carbon/Lang/zgh.php | 80 + vendor/nesbot/carbon/src/Carbon/Lang/zh.php | 29 + .../nesbot/carbon/src/Carbon/Lang/zh_CN.php | 33 + .../nesbot/carbon/src/Carbon/Lang/zh_HK.php | 12 + .../nesbot/carbon/src/Carbon/Lang/zh_Hans.php | 109 + .../carbon/src/Carbon/Lang/zh_Hans_HK.php | 12 + .../carbon/src/Carbon/Lang/zh_Hans_MO.php | 12 + .../carbon/src/Carbon/Lang/zh_Hans_SG.php | 12 + .../nesbot/carbon/src/Carbon/Lang/zh_Hant.php | 111 + .../carbon/src/Carbon/Lang/zh_Hant_HK.php | 12 + .../carbon/src/Carbon/Lang/zh_Hant_MO.php | 12 + .../carbon/src/Carbon/Lang/zh_Hant_TW.php | 12 + .../nesbot/carbon/src/Carbon/Lang/zh_MO.php | 21 + .../nesbot/carbon/src/Carbon/Lang/zh_SG.php | 26 + .../nesbot/carbon/src/Carbon/Lang/zh_TW.php | 12 + .../nesbot/carbon/src/Carbon/Lang/zh_YUE.php | 20 + vendor/nesbot/carbon/src/Carbon/Lang/zu.php | 15 + .../nesbot/carbon/src/Carbon/Lang/zu_ZA.php | 54 + vendor/nesbot/carbon/src/Carbon/Language.php | 342 ++ .../src/Carbon/Laravel/ServiceProvider.php | 127 + .../carbon/src/Carbon/List/languages.php | 1239 ++++ .../nesbot/carbon/src/Carbon/List/regions.php | 265 + .../src/Carbon/PHPStan/AbstractMacro.php | 288 + .../carbon/src/Carbon/PHPStan/Macro.php | 34 + .../src/Carbon/PHPStan/MacroExtension.php | 88 + .../src/Carbon/PHPStan/MacroScanner.php | 87 + .../carbon/src/Carbon/Traits/Boundaries.php | 443 ++ .../nesbot/carbon/src/Carbon/Traits/Cast.php | 43 + .../carbon/src/Carbon/Traits/Comparison.php | 1099 ++++ .../carbon/src/Carbon/Traits/Converter.php | 636 +++ .../carbon/src/Carbon/Traits/Creator.php | 950 +++ .../nesbot/carbon/src/Carbon/Traits/Date.php | 2746 +++++++++ .../Carbon/Traits/DeprecatedProperties.php | 61 + .../carbon/src/Carbon/Traits/Difference.php | 1182 ++++ .../src/Carbon/Traits/IntervalRounding.php | 57 + .../carbon/src/Carbon/Traits/IntervalStep.php | 93 + .../carbon/src/Carbon/Traits/Localization.php | 838 +++ .../nesbot/carbon/src/Carbon/Traits/Macro.php | 136 + .../src/Carbon/Traits/MagicParameter.php | 33 + .../nesbot/carbon/src/Carbon/Traits/Mixin.php | 191 + .../carbon/src/Carbon/Traits/Modifiers.php | 472 ++ .../carbon/src/Carbon/Traits/Mutability.php | 71 + .../Carbon/Traits/ObjectInitialisation.php | 22 + .../carbon/src/Carbon/Traits/Options.php | 471 ++ .../carbon/src/Carbon/Traits/Rounding.php | 258 + .../src/Carbon/Traits/Serialization.php | 304 + .../nesbot/carbon/src/Carbon/Traits/Test.php | 226 + .../carbon/src/Carbon/Traits/Timestamp.php | 198 + .../src/Carbon/Traits/ToStringFormat.php | 56 + .../nesbot/carbon/src/Carbon/Traits/Units.php | 406 ++ .../nesbot/carbon/src/Carbon/Traits/Week.php | 219 + .../nesbot/carbon/src/Carbon/Translator.php | 32 + .../carbon/src/Carbon/TranslatorImmutable.php | 99 + .../Carbon/TranslatorStrongTypeInterface.php | 22 + vendor/nikic/fast-route/.gitignore | 5 + vendor/nikic/fast-route/.hhconfig | 1 + vendor/nikic/fast-route/.travis.yml | 20 + vendor/nikic/fast-route/FastRoute.hhi | 126 + vendor/nikic/fast-route/LICENSE | 31 + vendor/nikic/fast-route/README.md | 313 + vendor/nikic/fast-route/composer.json | 24 + vendor/nikic/fast-route/phpunit.xml | 24 + vendor/nikic/fast-route/psalm.xml | 28 + .../fast-route/src/BadRouteException.php | 7 + vendor/nikic/fast-route/src/DataGenerator.php | 26 + .../src/DataGenerator/CharCountBased.php | 31 + .../src/DataGenerator/GroupCountBased.php | 30 + .../src/DataGenerator/GroupPosBased.php | 27 + .../src/DataGenerator/MarkBased.php | 27 + .../src/DataGenerator/RegexBasedAbstract.php | 186 + vendor/nikic/fast-route/src/Dispatcher.php | 26 + .../src/Dispatcher/CharCountBased.php | 31 + .../src/Dispatcher/GroupCountBased.php | 31 + .../src/Dispatcher/GroupPosBased.php | 33 + .../fast-route/src/Dispatcher/MarkBased.php | 31 + .../src/Dispatcher/RegexBasedAbstract.php | 88 + vendor/nikic/fast-route/src/Route.php | 47 + .../nikic/fast-route/src/RouteCollector.php | 152 + vendor/nikic/fast-route/src/RouteParser.php | 37 + .../nikic/fast-route/src/RouteParser/Std.php | 87 + vendor/nikic/fast-route/src/bootstrap.php | 12 + vendor/nikic/fast-route/src/functions.php | 74 + .../test/Dispatcher/CharCountBasedTest.php | 16 + .../test/Dispatcher/DispatcherTest.php | 581 ++ .../test/Dispatcher/GroupCountBasedTest.php | 16 + .../test/Dispatcher/GroupPosBasedTest.php | 16 + .../test/Dispatcher/MarkBasedTest.php | 24 + .../HackTypechecker/HackTypecheckerTest.php | 44 + .../HackTypechecker/fixtures/all_options.php | 29 + .../fixtures/empty_options.php | 11 + .../HackTypechecker/fixtures/no_options.php | 11 + .../fast-route/test/RouteCollectorTest.php | 108 + .../fast-route/test/RouteParser/StdTest.php | 154 + vendor/nikic/fast-route/test/bootstrap.php | 11 + vendor/nsp-team/webman-throttler/.gitignore | 22 + vendor/nsp-team/webman-throttler/LICENSE | 21 + vendor/nsp-team/webman-throttler/README.md | 38 + .../nsp-team/webman-throttler/composer.json | 20 + .../nsp-team/webman-throttler/src/Install.php | 69 + .../src/Middleware/ThrottlerMiddleware.php | 47 + .../src/Throttle/Throttler.php | 168 + .../src/Throttle/ThrottlerInterface.php | 37 + .../plugin/nsp-team/webman-throttler/app.php | 16 + .../nsp-team/webman-throttler/middleware.php | 19 + vendor/phpoption/phpoption/LICENSE | 201 + vendor/phpoption/phpoption/Makefile | 26 + vendor/phpoption/phpoption/composer.json | 45 + .../phpoption/src/PhpOption/LazyOption.php | 175 + .../phpoption/src/PhpOption/None.php | 136 + .../phpoption/src/PhpOption/Option.php | 434 ++ .../phpoption/src/PhpOption/Some.php | 169 + vendor/psr/cache/CHANGELOG.md | 16 + vendor/psr/cache/LICENSE.txt | 19 + vendor/psr/cache/README.md | 12 + vendor/psr/cache/composer.json | 25 + vendor/psr/cache/src/CacheException.php | 10 + vendor/psr/cache/src/CacheItemInterface.php | 105 + .../psr/cache/src/CacheItemPoolInterface.php | 138 + .../cache/src/InvalidArgumentException.php | 13 + vendor/psr/container/.gitignore | 3 + vendor/psr/container/LICENSE | 21 + vendor/psr/container/README.md | 13 + vendor/psr/container/composer.json | 22 + .../src/ContainerExceptionInterface.php | 12 + .../psr/container/src/ContainerInterface.php | 36 + .../src/NotFoundExceptionInterface.php | 10 + vendor/psr/http-client/CHANGELOG.md | 23 + vendor/psr/http-client/LICENSE | 19 + vendor/psr/http-client/README.md | 12 + vendor/psr/http-client/composer.json | 27 + .../src/ClientExceptionInterface.php | 10 + .../psr/http-client/src/ClientInterface.php | 20 + .../src/NetworkExceptionInterface.php | 24 + .../src/RequestExceptionInterface.php | 24 + vendor/psr/http-factory/.gitignore | 2 + vendor/psr/http-factory/.pullapprove.yml | 7 + vendor/psr/http-factory/LICENSE | 21 + vendor/psr/http-factory/README.md | 10 + vendor/psr/http-factory/composer.json | 35 + .../src/RequestFactoryInterface.php | 18 + .../src/ResponseFactoryInterface.php | 18 + .../src/ServerRequestFactoryInterface.php | 24 + .../src/StreamFactoryInterface.php | 45 + .../src/UploadedFileFactoryInterface.php | 34 + .../http-factory/src/UriFactoryInterface.php | 17 + vendor/psr/http-message/CHANGELOG.md | 36 + vendor/psr/http-message/LICENSE | 19 + vendor/psr/http-message/README.md | 13 + vendor/psr/http-message/composer.json | 26 + .../psr/http-message/src/MessageInterface.php | 187 + .../psr/http-message/src/RequestInterface.php | 129 + .../http-message/src/ResponseInterface.php | 68 + .../src/ServerRequestInterface.php | 261 + .../psr/http-message/src/StreamInterface.php | 158 + .../src/UploadedFileInterface.php | 123 + vendor/psr/http-message/src/UriInterface.php | 323 ++ vendor/psr/log/LICENSE | 19 + vendor/psr/log/README.md | 58 + vendor/psr/log/composer.json | 26 + vendor/psr/log/src/AbstractLogger.php | 15 + .../psr/log/src/InvalidArgumentException.php | 7 + vendor/psr/log/src/LogLevel.php | 18 + vendor/psr/log/src/LoggerAwareInterface.php | 18 + vendor/psr/log/src/LoggerAwareTrait.php | 26 + vendor/psr/log/src/LoggerInterface.php | 125 + vendor/psr/log/src/LoggerTrait.php | 142 + vendor/psr/log/src/NullLogger.php | 30 + vendor/psr/simple-cache/.editorconfig | 12 + vendor/psr/simple-cache/LICENSE.md | 21 + vendor/psr/simple-cache/README.md | 8 + vendor/psr/simple-cache/composer.json | 25 + .../psr/simple-cache/src/CacheException.php | 10 + .../psr/simple-cache/src/CacheInterface.php | 114 + .../src/InvalidArgumentException.php | 13 + vendor/ralouphie/getallheaders/LICENSE | 21 + vendor/ralouphie/getallheaders/README.md | 27 + vendor/ralouphie/getallheaders/composer.json | 26 + .../getallheaders/src/getallheaders.php | 46 + vendor/respect/stringifier/LICENSE.md | 21 + vendor/respect/stringifier/README.md | 46 + vendor/respect/stringifier/composer.json | 36 + vendor/respect/stringifier/src/Quoter.php | 27 + .../stringifier/src/Quoters/CodeQuoter.php | 36 + .../respect/stringifier/src/Stringifier.php | 27 + .../src/Stringifiers/ArrayStringifier.php | 114 + .../src/Stringifiers/BoolStringifier.php | 53 + .../src/Stringifiers/ClusterStringifier.php | 117 + .../src/Stringifiers/DateTimeStringifier.php | 76 + .../src/Stringifiers/InfiniteStringifier.php | 58 + .../Stringifiers/JsonParsableStringifier.php | 40 + .../JsonSerializableStringifier.php | 67 + .../src/Stringifiers/NanStringifier.php | 58 + .../src/Stringifiers/NullStringifier.php | 52 + .../src/Stringifiers/ObjectStringifier.php | 70 + .../src/Stringifiers/ResourceStringifier.php | 61 + .../StringableObjectStringifier.php | 57 + .../src/Stringifiers/ThrowableStringifier.php | 84 + .../Stringifiers/TraversableStringifier.php | 69 + vendor/respect/stringifier/src/stringify.php | 27 + vendor/symfony/cache-contracts/.gitignore | 3 + vendor/symfony/cache-contracts/CHANGELOG.md | 5 + .../cache-contracts/CacheInterface.php | 55 + vendor/symfony/cache-contracts/CacheTrait.php | 78 + .../cache-contracts/CallbackInterface.php | 30 + .../symfony/cache-contracts/ItemInterface.php | 65 + vendor/symfony/cache-contracts/LICENSE | 19 + vendor/symfony/cache-contracts/README.md | 9 + .../TagAwareCacheInterface.php | 38 + vendor/symfony/cache-contracts/composer.json | 38 + .../symfony/cache/Adapter/AbstractAdapter.php | 204 + .../cache/Adapter/AbstractTagAwareAdapter.php | 328 ++ .../cache/Adapter/AdapterInterface.php | 43 + vendor/symfony/cache/Adapter/ApcuAdapter.php | 131 + vendor/symfony/cache/Adapter/ArrayAdapter.php | 391 ++ vendor/symfony/cache/Adapter/ChainAdapter.php | 328 ++ .../cache/Adapter/CouchbaseBucketAdapter.php | 247 + .../Adapter/CouchbaseCollectionAdapter.php | 214 + .../cache/Adapter/DoctrineDbalAdapter.php | 393 ++ .../cache/Adapter/FilesystemAdapter.php | 29 + .../Adapter/FilesystemTagAwareAdapter.php | 235 + .../cache/Adapter/MemcachedAdapter.php | 349 ++ vendor/symfony/cache/Adapter/NullAdapter.php | 138 + .../cache/Adapter/ParameterNormalizer.php | 35 + vendor/symfony/cache/Adapter/PdoAdapter.php | 383 ++ .../symfony/cache/Adapter/PhpArrayAdapter.php | 419 ++ .../symfony/cache/Adapter/PhpFilesAdapter.php | 327 ++ vendor/symfony/cache/Adapter/ProxyAdapter.php | 254 + vendor/symfony/cache/Adapter/Psr16Adapter.php | 86 + vendor/symfony/cache/Adapter/RedisAdapter.php | 27 + .../cache/Adapter/RedisTagAwareAdapter.php | 320 ++ .../symfony/cache/Adapter/TagAwareAdapter.php | 409 ++ .../Adapter/TagAwareAdapterInterface.php | 31 + .../cache/Adapter/TraceableAdapter.php | 284 + .../Adapter/TraceableTagAwareAdapter.php | 38 + vendor/symfony/cache/CHANGELOG.md | 114 + vendor/symfony/cache/CacheItem.php | 184 + .../DataCollector/CacheDataCollector.php | 183 + .../CacheCollectorPass.php | 79 + .../CachePoolClearerPass.php | 41 + .../DependencyInjection/CachePoolPass.php | 247 + .../CachePoolPrunerPass.php | 51 + .../cache/Exception/CacheException.php | 25 + .../Exception/InvalidArgumentException.php | 25 + .../cache/Exception/LogicException.php | 25 + vendor/symfony/cache/LICENSE | 19 + vendor/symfony/cache/LockRegistry.php | 164 + .../cache/Marshaller/DefaultMarshaller.php | 104 + .../cache/Marshaller/DeflateMarshaller.php | 53 + .../cache/Marshaller/MarshallerInterface.php | 38 + .../cache/Marshaller/SodiumMarshaller.php | 80 + .../cache/Marshaller/TagAwareMarshaller.php | 89 + .../Messenger/EarlyExpirationDispatcher.php | 61 + .../Messenger/EarlyExpirationHandler.php | 80 + .../Messenger/EarlyExpirationMessage.php | 100 + vendor/symfony/cache/PruneableInterface.php | 20 + vendor/symfony/cache/Psr16Cache.php | 269 + vendor/symfony/cache/README.md | 19 + vendor/symfony/cache/ResettableInterface.php | 21 + .../cache/Traits/AbstractAdapterTrait.php | 403 ++ .../symfony/cache/Traits/ContractsTrait.php | 118 + .../cache/Traits/FilesystemCommonTrait.php | 193 + .../symfony/cache/Traits/FilesystemTrait.php | 121 + vendor/symfony/cache/Traits/ProxyTrait.php | 43 + .../cache/Traits/RedisClusterNodeProxy.php | 50 + .../cache/Traits/RedisClusterProxy.php | 63 + vendor/symfony/cache/Traits/RedisProxy.php | 65 + vendor/symfony/cache/Traits/RedisTrait.php | 607 ++ vendor/symfony/cache/composer.json | 56 + .../symfony/deprecation-contracts/.gitignore | 3 + .../deprecation-contracts/CHANGELOG.md | 5 + vendor/symfony/deprecation-contracts/LICENSE | 19 + .../symfony/deprecation-contracts/README.md | 26 + .../deprecation-contracts/composer.json | 35 + .../deprecation-contracts/function.php | 27 + vendor/symfony/polyfill-ctype/Ctype.php | 232 + vendor/symfony/polyfill-ctype/LICENSE | 19 + vendor/symfony/polyfill-ctype/README.md | 12 + vendor/symfony/polyfill-ctype/bootstrap.php | 50 + vendor/symfony/polyfill-ctype/bootstrap80.php | 46 + vendor/symfony/polyfill-ctype/composer.json | 41 + vendor/symfony/polyfill-mbstring/LICENSE | 19 + vendor/symfony/polyfill-mbstring/Mbstring.php | 874 +++ vendor/symfony/polyfill-mbstring/README.md | 13 + .../Resources/unidata/lowerCase.php | 1397 +++++ .../Resources/unidata/titleCaseRegexp.php | 5 + .../Resources/unidata/upperCase.php | 1489 +++++ .../symfony/polyfill-mbstring/bootstrap.php | 147 + .../symfony/polyfill-mbstring/bootstrap80.php | 143 + .../symfony/polyfill-mbstring/composer.json | 41 + vendor/symfony/polyfill-php80/LICENSE | 19 + vendor/symfony/polyfill-php80/Php80.php | 115 + vendor/symfony/polyfill-php80/PhpToken.php | 103 + vendor/symfony/polyfill-php80/README.md | 25 + .../Resources/stubs/Attribute.php | 31 + .../Resources/stubs/PhpToken.php | 16 + .../Resources/stubs/Stringable.php | 20 + .../Resources/stubs/UnhandledMatchError.php | 16 + .../Resources/stubs/ValueError.php | 16 + vendor/symfony/polyfill-php80/bootstrap.php | 42 + vendor/symfony/polyfill-php80/composer.json | 40 + vendor/symfony/service-contracts/.gitignore | 3 + .../service-contracts/Attribute/Required.php | 25 + .../Attribute/SubscribedService.php | 33 + vendor/symfony/service-contracts/CHANGELOG.md | 5 + vendor/symfony/service-contracts/LICENSE | 19 + vendor/symfony/service-contracts/README.md | 9 + .../service-contracts/ResetInterface.php | 30 + .../service-contracts/ServiceLocatorTrait.php | 128 + .../ServiceProviderInterface.php | 36 + .../ServiceSubscriberInterface.php | 53 + .../ServiceSubscriberTrait.php | 109 + .../Test/ServiceLocatorTest.php | 95 + .../symfony/service-contracts/composer.json | 42 + .../symfony/translation-contracts/.gitignore | 3 + .../translation-contracts/CHANGELOG.md | 5 + vendor/symfony/translation-contracts/LICENSE | 19 + .../LocaleAwareInterface.php | 27 + .../symfony/translation-contracts/README.md | 9 + .../Test/TranslatorTest.php | 384 ++ .../TranslatableInterface.php | 20 + .../TranslatorInterface.php | 68 + .../translation-contracts/TranslatorTrait.php | 260 + .../translation-contracts/composer.json | 37 + vendor/symfony/translation/CHANGELOG.md | 176 + .../Catalogue/AbstractOperation.php | 203 + .../translation/Catalogue/MergeOperation.php | 60 + .../Catalogue/OperationInterface.php | 61 + .../translation/Catalogue/TargetOperation.php | 74 + .../Command/TranslationPullCommand.php | 187 + .../Command/TranslationPushCommand.php | 188 + .../translation/Command/TranslationTrait.php | 77 + .../translation/Command/XliffLintCommand.php | 284 + .../TranslationDataCollector.php | 160 + .../translation/DataCollectorTranslator.php | 162 + .../TranslationDumperPass.php | 35 + .../TranslationExtractorPass.php | 40 + .../DependencyInjection/TranslatorPass.php | 74 + .../TranslatorPathsPass.php | 147 + .../translation/Dumper/CsvFileDumper.php | 60 + .../translation/Dumper/DumperInterface.php | 30 + .../symfony/translation/Dumper/FileDumper.php | 108 + .../translation/Dumper/IcuResFileDumper.php | 104 + .../translation/Dumper/IniFileDumper.php | 45 + .../translation/Dumper/JsonFileDumper.php | 40 + .../translation/Dumper/MoFileDumper.php | 82 + .../translation/Dumper/PhpFileDumper.php | 38 + .../translation/Dumper/PoFileDumper.php | 137 + .../translation/Dumper/QtFileDumper.php | 61 + .../translation/Dumper/XliffFileDumper.php | 203 + .../translation/Dumper/YamlFileDumper.php | 62 + .../Exception/ExceptionInterface.php | 21 + .../Exception/IncompleteDsnException.php | 24 + .../Exception/InvalidArgumentException.php | 21 + .../Exception/InvalidResourceException.php | 21 + .../translation/Exception/LogicException.php | 21 + .../MissingRequiredOptionException.php | 25 + .../Exception/NotFoundResourceException.php | 21 + .../Exception/ProviderException.php | 41 + .../Exception/ProviderExceptionInterface.php | 23 + .../Exception/RuntimeException.php | 21 + .../Exception/UnsupportedSchemeException.php | 54 + .../Extractor/AbstractFileExtractor.php | 67 + .../translation/Extractor/ChainExtractor.php | 57 + .../Extractor/ExtractorInterface.php | 35 + .../translation/Extractor/PhpExtractor.php | 330 ++ .../Extractor/PhpStringTokenParser.php | 136 + .../translation/Formatter/IntlFormatter.php | 60 + .../Formatter/IntlFormatterInterface.php | 27 + .../Formatter/MessageFormatter.php | 56 + .../Formatter/MessageFormatterInterface.php | 28 + .../translation/IdentityTranslator.php | 26 + vendor/symfony/translation/LICENSE | 19 + .../translation/Loader/ArrayLoader.php | 58 + .../translation/Loader/CsvFileLoader.php | 65 + .../symfony/translation/Loader/FileLoader.php | 62 + .../translation/Loader/IcuDatFileLoader.php | 61 + .../translation/Loader/IcuResFileLoader.php | 89 + .../translation/Loader/IniFileLoader.php | 28 + .../translation/Loader/JsonFileLoader.php | 60 + .../translation/Loader/LoaderInterface.php | 32 + .../translation/Loader/MoFileLoader.php | 140 + .../translation/Loader/PhpFileLoader.php | 42 + .../translation/Loader/PoFileLoader.php | 149 + .../translation/Loader/QtFileLoader.php | 82 + .../translation/Loader/XliffFileLoader.php | 232 + .../translation/Loader/YamlFileLoader.php | 54 + .../symfony/translation/LoggingTranslator.php | 129 + .../symfony/translation/MessageCatalogue.php | 309 + .../translation/MessageCatalogueInterface.php | 124 + .../translation/MetadataAwareInterface.php | 44 + .../Provider/AbstractProviderFactory.php | 45 + vendor/symfony/translation/Provider/Dsn.php | 110 + .../Provider/FilteringProvider.php | 65 + .../translation/Provider/NullProvider.php | 39 + .../Provider/NullProviderFactory.php | 34 + .../Provider/ProviderFactoryInterface.php | 26 + .../Provider/ProviderInterface.php | 32 + .../TranslationProviderCollection.php | 57 + .../TranslationProviderCollectionFactory.php | 57 + .../PseudoLocalizationTranslator.php | 368 ++ vendor/symfony/translation/README.md | 48 + .../translation/Reader/TranslationReader.php | 62 + .../Reader/TranslationReaderInterface.php | 27 + .../Resources/bin/translation-status.php | 278 + .../translation/Resources/data/parents.json | 141 + .../translation/Resources/functions.php | 22 + .../schemas/xliff-core-1.2-strict.xsd | 2223 ++++++++ .../Resources/schemas/xliff-core-2.0.xsd | 411 ++ .../translation/Resources/schemas/xml.xsd | 309 + .../Test/ProviderFactoryTestCase.php | 147 + .../translation/Test/ProviderTestCase.php | 76 + .../translation/TranslatableMessage.php | 62 + vendor/symfony/translation/Translator.php | 469 ++ vendor/symfony/translation/TranslatorBag.php | 108 + .../translation/TranslatorBagInterface.php | 36 + .../translation/Util/ArrayConverter.php | 97 + .../symfony/translation/Util/XliffUtils.php | 191 + .../translation/Writer/TranslationWriter.php | 71 + .../Writer/TranslationWriterInterface.php | 33 + vendor/symfony/translation/composer.json | 60 + vendor/symfony/var-exporter/CHANGELOG.md | 12 + .../Exception/ClassNotFoundException.php | 20 + .../Exception/ExceptionInterface.php | 16 + .../NotInstantiableTypeException.php | 20 + vendor/symfony/var-exporter/Instantiator.php | 92 + .../var-exporter/Internal/Exporter.php | 410 ++ .../var-exporter/Internal/Hydrator.php | 152 + .../var-exporter/Internal/Reference.php | 30 + .../var-exporter/Internal/Registry.php | 146 + .../symfony/var-exporter/Internal/Values.php | 27 + vendor/symfony/var-exporter/LICENSE | 19 + vendor/symfony/var-exporter/README.md | 38 + vendor/symfony/var-exporter/VarExporter.php | 114 + vendor/symfony/var-exporter/composer.json | 31 + vendor/vlucas/phpdotenv/LICENSE | 30 + vendor/vlucas/phpdotenv/composer.json | 53 + vendor/vlucas/phpdotenv/src/Dotenv.php | 267 + .../src/Exception/ExceptionInterface.php | 12 + .../Exception/InvalidEncodingException.php | 12 + .../src/Exception/InvalidFileException.php | 12 + .../src/Exception/InvalidPathException.php | 12 + .../src/Exception/ValidationException.php | 12 + vendor/vlucas/phpdotenv/src/Loader/Loader.php | 47 + .../phpdotenv/src/Loader/LoaderInterface.php | 20 + .../vlucas/phpdotenv/src/Loader/Resolver.php | 65 + vendor/vlucas/phpdotenv/src/Parser/Entry.php | 59 + .../phpdotenv/src/Parser/EntryParser.php | 293 + vendor/vlucas/phpdotenv/src/Parser/Lexer.php | 58 + vendor/vlucas/phpdotenv/src/Parser/Lines.php | 125 + vendor/vlucas/phpdotenv/src/Parser/Parser.php | 52 + .../phpdotenv/src/Parser/ParserInterface.php | 19 + vendor/vlucas/phpdotenv/src/Parser/Value.php | 88 + .../Repository/Adapter/AdapterInterface.php | 15 + .../src/Repository/Adapter/ApacheAdapter.php | 89 + .../src/Repository/Adapter/ArrayAdapter.php | 80 + .../Repository/Adapter/EnvConstAdapter.php | 87 + .../src/Repository/Adapter/GuardedWriter.php | 85 + .../Repository/Adapter/ImmutableWriter.php | 110 + .../src/Repository/Adapter/MultiReader.php | 48 + .../src/Repository/Adapter/MultiWriter.php | 64 + .../src/Repository/Adapter/PutenvAdapter.php | 91 + .../Repository/Adapter/ReaderInterface.php | 17 + .../Repository/Adapter/ReplacingWriter.php | 104 + .../Repository/Adapter/ServerConstAdapter.php | 87 + .../Repository/Adapter/WriterInterface.php | 27 + .../src/Repository/AdapterRepository.php | 88 + .../src/Repository/RepositoryBuilder.php | 272 + .../src/Repository/RepositoryInterface.php | 45 + .../vlucas/phpdotenv/src/Store/File/Paths.php | 44 + .../phpdotenv/src/Store/File/Reader.php | 81 + .../vlucas/phpdotenv/src/Store/FileStore.php | 72 + .../phpdotenv/src/Store/StoreBuilder.php | 141 + .../phpdotenv/src/Store/StoreInterface.php | 17 + .../phpdotenv/src/Store/StringStore.php | 37 + vendor/vlucas/phpdotenv/src/Util/Regex.php | 110 + vendor/vlucas/phpdotenv/src/Util/Str.php | 98 + vendor/vlucas/phpdotenv/src/Validator.php | 209 + vendor/voku/portable-ascii/CHANGELOG.md | 202 + vendor/voku/portable-ascii/LICENSE.txt | 19 + vendor/voku/portable-ascii/README.md | 451 ++ vendor/voku/portable-ascii/composer.json | 37 + .../portable-ascii/src/voku/helper/ASCII.php | 1501 +++++ .../voku/helper/data/ascii_by_languages.php | 2950 ++++++++++ .../helper/data/ascii_extras_by_languages.php | 759 +++ .../helper/data/ascii_language_max_key.php | 65 + .../src/voku/helper/data/ascii_ord.php | 1 + .../src/voku/helper/data/x000.php | 16 + .../src/voku/helper/data/x001.php | 1 + .../src/voku/helper/data/x002.php | 1 + .../src/voku/helper/data/x003.php | 1 + .../src/voku/helper/data/x004.php | 1 + .../src/voku/helper/data/x005.php | 1 + .../src/voku/helper/data/x006.php | 1 + .../src/voku/helper/data/x007.php | 1 + .../src/voku/helper/data/x009.php | 1 + .../src/voku/helper/data/x00a.php | 1 + .../src/voku/helper/data/x00b.php | 1 + .../src/voku/helper/data/x00c.php | 1 + .../src/voku/helper/data/x00d.php | 1 + .../src/voku/helper/data/x00e.php | 1 + .../src/voku/helper/data/x00f.php | 1 + .../src/voku/helper/data/x010.php | 1 + .../src/voku/helper/data/x011.php | 1 + .../src/voku/helper/data/x012.php | 1 + .../src/voku/helper/data/x013.php | 1 + .../src/voku/helper/data/x014.php | 1 + .../src/voku/helper/data/x015.php | 1 + .../src/voku/helper/data/x016.php | 1 + .../src/voku/helper/data/x017.php | 1 + .../src/voku/helper/data/x018.php | 1 + .../src/voku/helper/data/x01d.php | 1 + .../src/voku/helper/data/x01e.php | 1 + .../src/voku/helper/data/x01f.php | 1 + .../src/voku/helper/data/x020.php | 4 + .../src/voku/helper/data/x021.php | 1 + .../src/voku/helper/data/x022.php | 1 + .../src/voku/helper/data/x023.php | 1 + .../src/voku/helper/data/x024.php | 1 + .../src/voku/helper/data/x025.php | 1 + .../src/voku/helper/data/x026.php | 1 + .../src/voku/helper/data/x027.php | 1 + .../src/voku/helper/data/x028.php | 1 + .../src/voku/helper/data/x029.php | 1 + .../src/voku/helper/data/x02a.php | 1 + .../src/voku/helper/data/x02c.php | 1 + .../src/voku/helper/data/x02e.php | 1 + .../src/voku/helper/data/x02f.php | 1 + .../src/voku/helper/data/x030.php | 9 + .../src/voku/helper/data/x031.php | 1 + .../src/voku/helper/data/x032.php | 1 + .../src/voku/helper/data/x033.php | 1 + .../src/voku/helper/data/x04d.php | 1 + .../src/voku/helper/data/x04e.php | 1 + .../src/voku/helper/data/x04f.php | 1 + .../src/voku/helper/data/x050.php | 1 + .../src/voku/helper/data/x051.php | 1 + .../src/voku/helper/data/x052.php | 1 + .../src/voku/helper/data/x053.php | 1 + .../src/voku/helper/data/x054.php | 1 + .../src/voku/helper/data/x055.php | 1 + .../src/voku/helper/data/x056.php | 1 + .../src/voku/helper/data/x057.php | 1 + .../src/voku/helper/data/x058.php | 1 + .../src/voku/helper/data/x059.php | 1 + .../src/voku/helper/data/x05a.php | 1 + .../src/voku/helper/data/x05b.php | 1 + .../src/voku/helper/data/x05c.php | 1 + .../src/voku/helper/data/x05d.php | 1 + .../src/voku/helper/data/x05e.php | 1 + .../src/voku/helper/data/x05f.php | 1 + .../src/voku/helper/data/x060.php | 1 + .../src/voku/helper/data/x061.php | 1 + .../src/voku/helper/data/x062.php | 1 + .../src/voku/helper/data/x063.php | 1 + .../src/voku/helper/data/x064.php | 1 + .../src/voku/helper/data/x065.php | 1 + .../src/voku/helper/data/x066.php | 1 + .../src/voku/helper/data/x067.php | 1 + .../src/voku/helper/data/x068.php | 1 + .../src/voku/helper/data/x069.php | 1 + .../src/voku/helper/data/x06a.php | 1 + .../src/voku/helper/data/x06b.php | 1 + .../src/voku/helper/data/x06c.php | 1 + .../src/voku/helper/data/x06d.php | 1 + .../src/voku/helper/data/x06e.php | 1 + .../src/voku/helper/data/x06f.php | 1 + .../src/voku/helper/data/x070.php | 1 + .../src/voku/helper/data/x071.php | 1 + .../src/voku/helper/data/x072.php | 1 + .../src/voku/helper/data/x073.php | 1 + .../src/voku/helper/data/x074.php | 1 + .../src/voku/helper/data/x075.php | 1 + .../src/voku/helper/data/x076.php | 1 + .../src/voku/helper/data/x077.php | 1 + .../src/voku/helper/data/x078.php | 1 + .../src/voku/helper/data/x079.php | 1 + .../src/voku/helper/data/x07a.php | 1 + .../src/voku/helper/data/x07b.php | 1 + .../src/voku/helper/data/x07c.php | 1 + .../src/voku/helper/data/x07d.php | 1 + .../src/voku/helper/data/x07e.php | 1 + .../src/voku/helper/data/x07f.php | 1 + .../src/voku/helper/data/x080.php | 1 + .../src/voku/helper/data/x081.php | 1 + .../src/voku/helper/data/x082.php | 1 + .../src/voku/helper/data/x083.php | 1 + .../src/voku/helper/data/x084.php | 1 + .../src/voku/helper/data/x085.php | 1 + .../src/voku/helper/data/x086.php | 1 + .../src/voku/helper/data/x087.php | 1 + .../src/voku/helper/data/x088.php | 1 + .../src/voku/helper/data/x089.php | 1 + .../src/voku/helper/data/x08a.php | 1 + .../src/voku/helper/data/x08b.php | 1 + .../src/voku/helper/data/x08c.php | 1 + .../src/voku/helper/data/x08d.php | 1 + .../src/voku/helper/data/x08e.php | 1 + .../src/voku/helper/data/x08f.php | 1 + .../src/voku/helper/data/x090.php | 1 + .../src/voku/helper/data/x091.php | 1 + .../src/voku/helper/data/x092.php | 1 + .../src/voku/helper/data/x093.php | 1 + .../src/voku/helper/data/x094.php | 1 + .../src/voku/helper/data/x095.php | 1 + .../src/voku/helper/data/x096.php | 1 + .../src/voku/helper/data/x097.php | 1 + .../src/voku/helper/data/x098.php | 1 + .../src/voku/helper/data/x099.php | 1 + .../src/voku/helper/data/x09a.php | 1 + .../src/voku/helper/data/x09b.php | 1 + .../src/voku/helper/data/x09c.php | 1 + .../src/voku/helper/data/x09d.php | 1 + .../src/voku/helper/data/x09e.php | 1 + .../src/voku/helper/data/x09f.php | 1 + .../src/voku/helper/data/x0a0.php | 1 + .../src/voku/helper/data/x0a1.php | 1 + .../src/voku/helper/data/x0a2.php | 1 + .../src/voku/helper/data/x0a3.php | 1 + .../src/voku/helper/data/x0a4.php | 1 + .../src/voku/helper/data/x0ac.php | 1 + .../src/voku/helper/data/x0ad.php | 1 + .../src/voku/helper/data/x0ae.php | 1 + .../src/voku/helper/data/x0af.php | 1 + .../src/voku/helper/data/x0b0.php | 1 + .../src/voku/helper/data/x0b1.php | 1 + .../src/voku/helper/data/x0b2.php | 1 + .../src/voku/helper/data/x0b3.php | 1 + .../src/voku/helper/data/x0b4.php | 1 + .../src/voku/helper/data/x0b5.php | 1 + .../src/voku/helper/data/x0b6.php | 1 + .../src/voku/helper/data/x0b7.php | 1 + .../src/voku/helper/data/x0b8.php | 1 + .../src/voku/helper/data/x0b9.php | 1 + .../src/voku/helper/data/x0ba.php | 1 + .../src/voku/helper/data/x0bb.php | 1 + .../src/voku/helper/data/x0bc.php | 1 + .../src/voku/helper/data/x0bd.php | 1 + .../src/voku/helper/data/x0be.php | 1 + .../src/voku/helper/data/x0bf.php | 1 + .../src/voku/helper/data/x0c0.php | 1 + .../src/voku/helper/data/x0c1.php | 1 + .../src/voku/helper/data/x0c2.php | 1 + .../src/voku/helper/data/x0c3.php | 1 + .../src/voku/helper/data/x0c4.php | 1 + .../src/voku/helper/data/x0c5.php | 1 + .../src/voku/helper/data/x0c6.php | 1 + .../src/voku/helper/data/x0c7.php | 1 + .../src/voku/helper/data/x0c8.php | 1 + .../src/voku/helper/data/x0c9.php | 1 + .../src/voku/helper/data/x0ca.php | 1 + .../src/voku/helper/data/x0cb.php | 1 + .../src/voku/helper/data/x0cc.php | 1 + .../src/voku/helper/data/x0cd.php | 1 + .../src/voku/helper/data/x0ce.php | 1 + .../src/voku/helper/data/x0cf.php | 1 + .../src/voku/helper/data/x0d0.php | 1 + .../src/voku/helper/data/x0d1.php | 1 + .../src/voku/helper/data/x0d2.php | 1 + .../src/voku/helper/data/x0d3.php | 1 + .../src/voku/helper/data/x0d4.php | 1 + .../src/voku/helper/data/x0d5.php | 1 + .../src/voku/helper/data/x0d6.php | 1 + .../src/voku/helper/data/x0d7.php | 1 + .../src/voku/helper/data/x0f9.php | 1 + .../src/voku/helper/data/x0fa.php | 1 + .../src/voku/helper/data/x0fb.php | 1 + .../src/voku/helper/data/x0fc.php | 1 + .../src/voku/helper/data/x0fd.php | 1 + .../src/voku/helper/data/x0fe.php | 1 + .../src/voku/helper/data/x0ff.php | 1 + .../src/voku/helper/data/x1d4.php | 1 + .../src/voku/helper/data/x1d5.php | 4 + .../src/voku/helper/data/x1d6.php | 1 + .../src/voku/helper/data/x1d7.php | 1 + .../src/voku/helper/data/x1f1.php | 2 + vendor/webman/captcha/.gitignore | 5 + vendor/webman/captcha/.travis.yml | 16 + vendor/webman/captcha/LICENSE | 19 + vendor/webman/captcha/README.md | 142 + vendor/webman/captcha/composer.json | 35 + vendor/webman/captcha/demo/demo.php | 11 + vendor/webman/captcha/demo/fingerprint.php | 12 + vendor/webman/captcha/demo/form.php | 32 + vendor/webman/captcha/demo/index.php | 15 + vendor/webman/captcha/demo/inline.php | 22 + vendor/webman/captcha/demo/ocr.php | 39 + vendor/webman/captcha/demo/output.php | 12 + vendor/webman/captcha/demo/session.php | 22 + vendor/webman/captcha/phpunit.xml.dist | 15 + vendor/webman/captcha/src/CaptchaBuilder.php | 760 +++ .../captcha/src/CaptchaBuilderInterface.php | 29 + vendor/webman/captcha/src/Font/captcha0.ttf | Bin 0 -> 49224 bytes vendor/webman/captcha/src/Font/captcha1.ttf | Bin 0 -> 76232 bytes vendor/webman/captcha/src/Font/captcha2.ttf | Bin 0 -> 24108 bytes vendor/webman/captcha/src/Font/captcha3.ttf | Bin 0 -> 15976 bytes vendor/webman/captcha/src/Font/captcha4.ttf | Bin 0 -> 906980 bytes vendor/webman/captcha/src/Font/captcha5.ttf | Bin 0 -> 49724 bytes .../webman/captcha/src/ImageFileHandler.php | 78 + vendor/webman/captcha/src/PhraseBuilder.php | 75 + .../captcha/src/PhraseBuilderInterface.php | 21 + .../captcha/tests/CaptchaBuilderTest.php | 30 + vendor/workerman/validation/CHANGELOG.md | 99 + vendor/workerman/validation/CONTRIBUTING.md | 256 + vendor/workerman/validation/LICENSE | 21 + vendor/workerman/validation/README.md | 14 + vendor/workerman/validation/composer.json | 68 + .../validation/data/iso_3166-2/AD.json | 13 + .../validation/data/iso_3166-2/AE.json | 13 + .../validation/data/iso_3166-2/AF.json | 40 + .../validation/data/iso_3166-2/AG.json | 14 + .../validation/data/iso_3166-2/AI.json | 5 + .../validation/data/iso_3166-2/AL.json | 54 + .../validation/data/iso_3166-2/AM.json | 17 + .../validation/data/iso_3166-2/AN.json | 5 + .../validation/data/iso_3166-2/AO.json | 24 + .../validation/data/iso_3166-2/AQ.json | 5 + .../validation/data/iso_3166-2/AR.json | 30 + .../validation/data/iso_3166-2/AS.json | 11 + .../validation/data/iso_3166-2/AT.json | 15 + .../validation/data/iso_3166-2/AU.json | 14 + .../validation/data/iso_3166-2/AW.json | 5 + .../validation/data/iso_3166-2/AX.json | 5 + .../validation/data/iso_3166-2/AZ.json | 84 + .../validation/data/iso_3166-2/BA.json | 19 + .../validation/data/iso_3166-2/BB.json | 17 + .../validation/data/iso_3166-2/BD.json | 78 + .../validation/data/iso_3166-2/BE.json | 19 + .../validation/data/iso_3166-2/BF.json | 64 + .../validation/data/iso_3166-2/BG.json | 34 + .../validation/data/iso_3166-2/BH.json | 10 + .../validation/data/iso_3166-2/BI.json | 24 + .../validation/data/iso_3166-2/BJ.json | 18 + .../validation/data/iso_3166-2/BL.json | 5 + .../validation/data/iso_3166-2/BM.json | 17 + .../validation/data/iso_3166-2/BN.json | 10 + .../validation/data/iso_3166-2/BO.json | 15 + .../validation/data/iso_3166-2/BQ.json | 9 + .../validation/data/iso_3166-2/BR.json | 33 + .../validation/data/iso_3166-2/BS.json | 38 + .../validation/data/iso_3166-2/BT.json | 26 + .../validation/data/iso_3166-2/BV.json | 5 + .../validation/data/iso_3166-2/BW.json | 22 + .../validation/data/iso_3166-2/BY.json | 13 + .../validation/data/iso_3166-2/BZ.json | 12 + .../validation/data/iso_3166-2/CA.json | 19 + .../validation/data/iso_3166-2/CC.json | 11 + .../validation/data/iso_3166-2/CD.json | 32 + .../validation/data/iso_3166-2/CF.json | 23 + .../validation/data/iso_3166-2/CG.json | 18 + .../validation/data/iso_3166-2/CH.json | 32 + .../validation/data/iso_3166-2/CI.json | 20 + .../validation/data/iso_3166-2/CK.json | 21 + .../validation/data/iso_3166-2/CL.json | 22 + .../validation/data/iso_3166-2/CM.json | 16 + .../validation/data/iso_3166-2/CN.json | 40 + .../validation/data/iso_3166-2/CO.json | 39 + .../validation/data/iso_3166-2/CR.json | 13 + .../validation/data/iso_3166-2/CS.json | 10 + .../validation/data/iso_3166-2/CU.json | 22 + .../validation/data/iso_3166-2/CV.json | 30 + .../validation/data/iso_3166-2/CW.json | 5 + .../validation/data/iso_3166-2/CX.json | 5 + .../validation/data/iso_3166-2/CY.json | 12 + .../validation/data/iso_3166-2/CZ.json | 118 + .../validation/data/iso_3166-2/DE.json | 22 + .../validation/data/iso_3166-2/DJ.json | 12 + .../validation/data/iso_3166-2/DK.json | 11 + .../validation/data/iso_3166-2/DM.json | 16 + .../validation/data/iso_3166-2/DO.json | 38 + .../validation/data/iso_3166-2/DZ.json | 54 + .../validation/data/iso_3166-2/EC.json | 30 + .../validation/data/iso_3166-2/EE.json | 21 + .../validation/data/iso_3166-2/EG.json | 33 + .../validation/data/iso_3166-2/EH.json | 5 + .../validation/data/iso_3166-2/ER.json | 12 + .../validation/data/iso_3166-2/ES.json | 75 + .../validation/data/iso_3166-2/ET.json | 17 + .../validation/data/iso_3166-2/FI.json | 25 + .../validation/data/iso_3166-2/FJ.json | 25 + .../validation/data/iso_3166-2/FK.json | 5 + .../validation/data/iso_3166-2/FM.json | 10 + .../validation/data/iso_3166-2/FO.json | 5 + .../validation/data/iso_3166-2/FR.json | 124 + .../validation/data/iso_3166-2/GA.json | 15 + .../validation/data/iso_3166-2/GB.json | 227 + .../validation/data/iso_3166-2/GD.json | 13 + .../validation/data/iso_3166-2/GE.json | 18 + .../validation/data/iso_3166-2/GF.json | 5 + .../validation/data/iso_3166-2/GG.json | 5 + .../validation/data/iso_3166-2/GH.json | 16 + .../validation/data/iso_3166-2/GI.json | 5 + .../validation/data/iso_3166-2/GL.json | 11 + .../validation/data/iso_3166-2/GM.json | 12 + .../validation/data/iso_3166-2/GN.json | 47 + .../validation/data/iso_3166-2/GP.json | 5 + .../validation/data/iso_3166-2/GQ.json | 15 + .../validation/data/iso_3166-2/GR.json | 71 + .../validation/data/iso_3166-2/GS.json | 5 + .../validation/data/iso_3166-2/GT.json | 28 + .../validation/data/iso_3166-2/GU.json | 5 + .../validation/data/iso_3166-2/GW.json | 18 + .../validation/data/iso_3166-2/GY.json | 16 + .../validation/data/iso_3166-2/HK.json | 24 + .../validation/data/iso_3166-2/HM.json | 10 + .../validation/data/iso_3166-2/HN.json | 24 + .../validation/data/iso_3166-2/HR.json | 27 + .../validation/data/iso_3166-2/HT.json | 16 + .../validation/data/iso_3166-2/HU.json | 49 + .../validation/data/iso_3166-2/ID.json | 47 + .../validation/data/iso_3166-2/IE.json | 35 + .../validation/data/iso_3166-2/IL.json | 12 + .../validation/data/iso_3166-2/IM.json | 5 + .../validation/data/iso_3166-2/IN.json | 42 + .../validation/data/iso_3166-2/IO.json | 14 + .../validation/data/iso_3166-2/IQ.json | 24 + .../validation/data/iso_3166-2/IR.json | 37 + .../validation/data/iso_3166-2/IS.json | 14 + .../validation/data/iso_3166-2/IT.json | 132 + .../validation/data/iso_3166-2/JE.json | 5 + .../validation/data/iso_3166-2/JM.json | 20 + .../validation/data/iso_3166-2/JO.json | 18 + .../validation/data/iso_3166-2/JP.json | 53 + .../validation/data/iso_3166-2/KE.json | 53 + .../validation/data/iso_3166-2/KG.json | 15 + .../validation/data/iso_3166-2/KH.json | 31 + .../validation/data/iso_3166-2/KI.json | 9 + .../validation/data/iso_3166-2/KM.json | 9 + .../validation/data/iso_3166-2/KN.json | 22 + .../validation/data/iso_3166-2/KP.json | 17 + .../validation/data/iso_3166-2/KR.json | 23 + .../validation/data/iso_3166-2/KW.json | 12 + .../validation/data/iso_3166-2/KY.json | 5 + .../validation/data/iso_3166-2/KZ.json | 24 + .../validation/data/iso_3166-2/LA.json | 24 + .../validation/data/iso_3166-2/LB.json | 14 + .../validation/data/iso_3166-2/LC.json | 16 + .../validation/data/iso_3166-2/LI.json | 17 + .../validation/data/iso_3166-2/LK.json | 40 + .../validation/data/iso_3166-2/LR.json | 21 + .../validation/data/iso_3166-2/LS.json | 16 + .../validation/data/iso_3166-2/LT.json | 76 + .../validation/data/iso_3166-2/LU.json | 18 + .../validation/data/iso_3166-2/LV.json | 125 + .../validation/data/iso_3166-2/LY.json | 28 + .../validation/data/iso_3166-2/MA.json | 93 + .../validation/data/iso_3166-2/MC.json | 23 + .../validation/data/iso_3166-2/MD.json | 43 + .../validation/data/iso_3166-2/ME.json | 29 + .../validation/data/iso_3166-2/MF.json | 5 + .../validation/data/iso_3166-2/MG.json | 5 + .../validation/data/iso_3166-2/MH.json | 32 + .../validation/data/iso_3166-2/MK.json | 91 + .../validation/data/iso_3166-2/ML.json | 15 + .../validation/data/iso_3166-2/MM.json | 21 + .../validation/data/iso_3166-2/MN.json | 28 + .../validation/data/iso_3166-2/MO.json | 5 + .../validation/data/iso_3166-2/MP.json | 10 + .../validation/data/iso_3166-2/MQ.json | 5 + .../validation/data/iso_3166-2/MR.json | 21 + .../validation/data/iso_3166-2/MS.json | 5 + .../validation/data/iso_3166-2/MT.json | 74 + .../validation/data/iso_3166-2/MU.json | 23 + .../validation/data/iso_3166-2/MV.json | 26 + .../validation/data/iso_3166-2/MW.json | 37 + .../validation/data/iso_3166-2/MX.json | 38 + .../validation/data/iso_3166-2/MY.json | 22 + .../validation/data/iso_3166-2/MZ.json | 17 + .../validation/data/iso_3166-2/NA.json | 20 + .../validation/data/iso_3166-2/NC.json | 9 + .../validation/data/iso_3166-2/NE.json | 14 + .../validation/data/iso_3166-2/NF.json | 5 + .../validation/data/iso_3166-2/NG.json | 43 + .../validation/data/iso_3166-2/NI.json | 23 + .../validation/data/iso_3166-2/NL.json | 18 + .../validation/data/iso_3166-2/NO.json | 26 + .../validation/data/iso_3166-2/NP.json | 25 + .../validation/data/iso_3166-2/NR.json | 20 + .../validation/data/iso_3166-2/NU.json | 5 + .../validation/data/iso_3166-2/NZ.json | 23 + .../validation/data/iso_3166-2/OM.json | 17 + .../validation/data/iso_3166-2/PA.json | 19 + .../validation/data/iso_3166-2/PE.json | 32 + .../validation/data/iso_3166-2/PF.json | 11 + .../validation/data/iso_3166-2/PG.json | 28 + .../validation/data/iso_3166-2/PH.json | 104 + .../validation/data/iso_3166-2/PK.json | 14 + .../validation/data/iso_3166-2/PL.json | 22 + .../validation/data/iso_3166-2/PM.json | 8 + .../validation/data/iso_3166-2/PN.json | 5 + .../validation/data/iso_3166-2/PR.json | 5 + .../validation/data/iso_3166-2/PS.json | 22 + .../validation/data/iso_3166-2/PT.json | 26 + .../validation/data/iso_3166-2/PW.json | 22 + .../validation/data/iso_3166-2/PY.json | 24 + .../validation/data/iso_3166-2/QA.json | 14 + .../validation/data/iso_3166-2/RE.json | 5 + .../validation/data/iso_3166-2/RO.json | 48 + .../validation/data/iso_3166-2/RS.json | 38 + .../validation/data/iso_3166-2/RU.json | 89 + .../validation/data/iso_3166-2/RW.json | 11 + .../validation/data/iso_3166-2/SA.json | 19 + .../validation/data/iso_3166-2/SB.json | 16 + .../validation/data/iso_3166-2/SC.json | 31 + .../validation/data/iso_3166-2/SD.json | 24 + .../validation/data/iso_3166-2/SE.json | 27 + .../validation/data/iso_3166-2/SG.json | 11 + .../validation/data/iso_3166-2/SH.json | 9 + .../validation/data/iso_3166-2/SI.json | 218 + .../validation/data/iso_3166-2/SJ.json | 8 + .../validation/data/iso_3166-2/SK.json | 14 + .../validation/data/iso_3166-2/SL.json | 11 + .../validation/data/iso_3166-2/SM.json | 15 + .../validation/data/iso_3166-2/SN.json | 20 + .../validation/data/iso_3166-2/SO.json | 24 + .../validation/data/iso_3166-2/SR.json | 16 + .../validation/data/iso_3166-2/SS.json | 5 + .../validation/data/iso_3166-2/ST.json | 8 + .../validation/data/iso_3166-2/SV.json | 20 + .../validation/data/iso_3166-2/SX.json | 5 + .../validation/data/iso_3166-2/SY.json | 20 + .../validation/data/iso_3166-2/SZ.json | 10 + .../validation/data/iso_3166-2/TC.json | 20 + .../validation/data/iso_3166-2/TD.json | 29 + .../validation/data/iso_3166-2/TF.json | 5 + .../validation/data/iso_3166-2/TG.json | 11 + .../validation/data/iso_3166-2/TH.json | 84 + .../validation/data/iso_3166-2/TJ.json | 11 + .../validation/data/iso_3166-2/TK.json | 9 + .../validation/data/iso_3166-2/TL.json | 19 + .../validation/data/iso_3166-2/TM.json | 12 + .../validation/data/iso_3166-2/TN.json | 30 + .../validation/data/iso_3166-2/TO.json | 11 + .../validation/data/iso_3166-2/TR.json | 87 + .../validation/data/iso_3166-2/TT.json | 21 + .../validation/data/iso_3166-2/TV.json | 14 + .../validation/data/iso_3166-2/TW.json | 28 + .../validation/data/iso_3166-2/TZ.json | 36 + .../validation/data/iso_3166-2/UA.json | 33 + .../validation/data/iso_3166-2/UG.json | 132 + .../validation/data/iso_3166-2/UM.json | 15 + .../validation/data/iso_3166-2/US.json | 63 + .../validation/data/iso_3166-2/UY.json | 25 + .../validation/data/iso_3166-2/UZ.json | 20 + .../validation/data/iso_3166-2/VA.json | 5 + .../validation/data/iso_3166-2/VC.json | 12 + .../validation/data/iso_3166-2/VE.json | 31 + .../validation/data/iso_3166-2/VG.json | 5 + .../validation/data/iso_3166-2/VI.json | 9 + .../validation/data/iso_3166-2/VN.json | 69 + .../validation/data/iso_3166-2/VU.json | 12 + .../validation/data/iso_3166-2/WF.json | 9 + .../validation/data/iso_3166-2/WS.json | 17 + .../validation/data/iso_3166-2/XK.json | 5 + .../validation/data/iso_3166-2/YE.json | 28 + .../validation/data/iso_3166-2/YT.json | 5 + .../validation/data/iso_3166-2/ZA.json | 15 + .../validation/data/iso_3166-2/ZM.json | 16 + .../validation/data/iso_3166-2/ZW.json | 16 + .../library/Exceptions/AllOfException.php | 35 + .../library/Exceptions/AlnumException.php | 35 + .../library/Exceptions/AlphaException.php | 35 + .../Exceptions/AlwaysInvalidException.php | 38 + .../Exceptions/AlwaysValidException.php | 34 + .../library/Exceptions/AnyOfException.php | 33 + .../library/Exceptions/ArrayTypeException.php | 35 + .../library/Exceptions/ArrayValException.php | 34 + .../library/Exceptions/AttributeException.php | 49 + .../library/Exceptions/Base64Exception.php | 34 + .../library/Exceptions/BaseException.php | 34 + .../library/Exceptions/BetweenException.php | 33 + .../library/Exceptions/BoolTypeException.php | 35 + .../library/Exceptions/BoolValException.php | 34 + .../library/Exceptions/BsnException.php | 34 + .../library/Exceptions/CallException.php | 33 + .../Exceptions/CallableTypeException.php | 34 + .../library/Exceptions/CallbackException.php | 23 + .../library/Exceptions/CharsetException.php | 34 + .../library/Exceptions/CnhException.php | 34 + .../library/Exceptions/CnpjException.php | 34 + .../library/Exceptions/ComponentException.php | 25 + .../library/Exceptions/ConsonantException.php | 36 + .../Exceptions/ContainsAnyException.php | 32 + .../library/Exceptions/ContainsException.php | 34 + .../library/Exceptions/ControlException.php | 36 + .../library/Exceptions/CountableException.php | 34 + .../Exceptions/CountryCodeException.php | 34 + .../library/Exceptions/CpfException.php | 34 + .../Exceptions/CreditCardException.php | 52 + .../Exceptions/CurrencyCodeException.php | 34 + .../library/Exceptions/DateException.php | 33 + .../library/Exceptions/DateTimeException.php | 45 + .../library/Exceptions/DigitException.php | 35 + .../library/Exceptions/DirectoryException.php | 33 + .../library/Exceptions/DomainException.php | 33 + .../library/Exceptions/EachException.php | 34 + .../library/Exceptions/EmailException.php | 38 + .../library/Exceptions/EndsWithException.php | 34 + .../library/Exceptions/EqualsException.php | 34 + .../Exceptions/EquivalentException.php | 32 + .../library/Exceptions/EvenException.php | 36 + .../library/Exceptions/Exception.php | 24 + .../Exceptions/ExecutableException.php | 33 + .../library/Exceptions/ExistsException.php | 33 + .../library/Exceptions/ExtensionException.php | 35 + .../library/Exceptions/FactorException.php | 34 + .../library/Exceptions/FalseValException.php | 33 + .../library/Exceptions/FibonacciException.php | 34 + .../library/Exceptions/FileException.php | 33 + .../library/Exceptions/FilterVarException.php | 21 + .../FilteredValidationException.php | 30 + .../library/Exceptions/FiniteException.php | 33 + .../library/Exceptions/FloatTypeException.php | 35 + .../library/Exceptions/FloatValException.php | 34 + .../library/Exceptions/GraphException.php | 36 + .../Exceptions/GreaterThanException.php | 32 + .../Exceptions/GroupedValidationException.php | 51 + .../Exceptions/HexRgbColorException.php | 33 + .../library/Exceptions/IbanException.php | 32 + .../library/Exceptions/IdenticalException.php | 32 + .../library/Exceptions/ImageException.php | 34 + .../library/Exceptions/ImeiException.php | 34 + .../library/Exceptions/InException.php | 34 + .../library/Exceptions/InfiniteException.php | 33 + .../library/Exceptions/InstanceException.php | 34 + .../library/Exceptions/IntTypeException.php | 34 + .../library/Exceptions/IntValException.php | 34 + .../Exceptions/InvalidClassException.php | 25 + .../library/Exceptions/IpException.php | 51 + .../library/Exceptions/IsbnException.php | 33 + .../Exceptions/IterableTypeException.php | 32 + .../library/Exceptions/JsonException.php | 34 + .../library/Exceptions/KeyException.php | 49 + .../library/Exceptions/KeyNestedException.php | 49 + .../library/Exceptions/KeySetException.php | 52 + .../library/Exceptions/KeyValueException.php | 41 + .../Exceptions/LanguageCodeException.php | 34 + .../library/Exceptions/LeapDateException.php | 33 + .../library/Exceptions/LeapYearException.php | 33 + .../library/Exceptions/LengthException.php | 74 + .../library/Exceptions/LessThanException.php | 32 + .../library/Exceptions/LowercaseException.php | 34 + .../library/Exceptions/LuhnException.php | 34 + .../Exceptions/MacAddressException.php | 34 + .../library/Exceptions/MaxAgeException.php | 33 + .../library/Exceptions/MaxException.php | 34 + .../library/Exceptions/MimetypeException.php | 35 + .../library/Exceptions/MinAgeException.php | 34 + .../library/Exceptions/MinException.php | 35 + .../library/Exceptions/MultipleException.php | 34 + .../library/Exceptions/NegativeException.php | 34 + .../Exceptions/NestedValidationException.php | 252 + .../Exceptions/NfeAccessKeyException.php | 34 + .../library/Exceptions/NifException.php | 33 + .../library/Exceptions/NipException.php | 33 + .../library/Exceptions/NoException.php | 32 + .../Exceptions/NoWhitespaceException.php | 34 + .../Exceptions/NonOmissibleException.php | 22 + .../library/Exceptions/NoneOfException.php | 33 + .../library/Exceptions/NotBlankException.php | 49 + .../library/Exceptions/NotEmojiException.php | 32 + .../library/Exceptions/NotEmptyException.php | 50 + .../library/Exceptions/NotException.php | 22 + .../Exceptions/NotOptionalException.php | 49 + .../library/Exceptions/NullTypeException.php | 35 + .../library/Exceptions/NullableException.php | 49 + .../library/Exceptions/NumberException.php | 34 + .../Exceptions/NumericValException.php | 34 + .../Exceptions/ObjectTypeException.php | 35 + .../library/Exceptions/OddException.php | 34 + .../library/Exceptions/OneOfException.php | 33 + .../library/Exceptions/OptionalException.php | 41 + .../Exceptions/PerfectSquareException.php | 34 + .../library/Exceptions/PeselException.php | 34 + .../library/Exceptions/PhoneException.php | 34 + .../library/Exceptions/PhpLabelException.php | 34 + .../library/Exceptions/PisException.php | 34 + .../Exceptions/PolishIdCardException.php | 32 + .../library/Exceptions/PositiveException.php | 34 + .../Exceptions/PostalCodeException.php | 32 + .../Exceptions/PrimeNumberException.php | 34 + .../library/Exceptions/PrintableException.php | 39 + .../library/Exceptions/PunctException.php | 36 + .../library/Exceptions/ReadableException.php | 33 + .../Exceptions/RecursiveExceptionIterator.php | 87 + .../library/Exceptions/RegexException.php | 34 + .../Exceptions/ResourceTypeException.php | 34 + .../library/Exceptions/RomanException.php | 33 + .../library/Exceptions/ScalarValException.php | 32 + .../library/Exceptions/SfException.php | 33 + .../library/Exceptions/SizeException.php | 58 + .../library/Exceptions/SlugException.php | 34 + .../library/Exceptions/SortedException.php | 48 + .../library/Exceptions/SpaceException.php | 35 + .../Exceptions/StartsWithException.php | 33 + .../Exceptions/StringTypeException.php | 33 + .../library/Exceptions/StringValException.php | 33 + .../Exceptions/SubdivisionCodeException.php | 32 + .../library/Exceptions/SubsetException.php | 33 + .../Exceptions/SymbolicLinkException.php | 33 + .../library/Exceptions/TimeException.php | 32 + .../library/Exceptions/TldException.php | 37 + .../library/Exceptions/TrueValException.php | 35 + .../library/Exceptions/TypeException.php | 35 + .../library/Exceptions/UniqueException.php | 36 + .../library/Exceptions/UploadedException.php | 36 + .../library/Exceptions/UppercaseException.php | 34 + .../library/Exceptions/UrlException.php | 32 + .../library/Exceptions/UuidException.php | 50 + .../Exceptions/ValidationException.php | 157 + .../library/Exceptions/ValidatorException.php | 21 + .../library/Exceptions/VersionException.php | 33 + .../library/Exceptions/VideoUrlException.php | 50 + .../library/Exceptions/VowelException.php | 35 + .../library/Exceptions/WhenException.php | 23 + .../library/Exceptions/WritableException.php | 33 + .../library/Exceptions/XdigitException.php | 35 + .../library/Exceptions/YesException.php | 33 + .../library/Exceptions/ZendException.php | 23 + .../workerman/validation/library/Factory.php | 264 + .../library/Helpers/CanCompareValues.php | 72 + .../library/Helpers/CanValidateDateTime.php | 74 + .../library/Helpers/CanValidateIterable.php | 37 + .../library/Helpers/CanValidateUndefined.php | 34 + .../library/Helpers/Subdivisions.php | 52 + .../validation/library/Message/Formatter.php | 58 + .../library/Message/ParameterStringifier.php | 22 + .../Stringifier/KeepOriginalStringName.php | 34 + .../validation/library/Rules/AbstractAge.php | 102 + .../library/Rules/AbstractComparison.php | 64 + .../library/Rules/AbstractComposite.php | 142 + .../library/Rules/AbstractEnvelope.php | 65 + .../library/Rules/AbstractFilterRule.php | 65 + .../library/Rules/AbstractRelated.php | 158 + .../validation/library/Rules/AbstractRule.php | 101 + .../library/Rules/AbstractSearcher.php | 46 + .../library/Rules/AbstractWrapper.php | 72 + .../validation/library/Rules/AllOf.php | 71 + .../validation/library/Rules/Alnum.php | 37 + .../validation/library/Rules/Alpha.php | 34 + .../library/Rules/AlwaysInvalid.php | 32 + .../validation/library/Rules/AlwaysValid.php | 32 + .../validation/library/Rules/AnyOf.php | 82 + .../validation/library/Rules/ArrayType.php | 35 + .../validation/library/Rules/ArrayVal.php | 39 + .../validation/library/Rules/Attribute.php | 57 + .../validation/library/Rules/Base.php | 68 + .../validation/library/Rules/Base64.php | 44 + .../validation/library/Rules/Between.php | 54 + .../validation/library/Rules/BoolType.php | 33 + .../validation/library/Rules/BoolVal.php | 38 + .../validation/library/Rules/Bsn.php | 50 + .../validation/library/Rules/Call.php | 111 + .../validation/library/Rules/CallableType.php | 32 + .../validation/library/Rules/Callback.php | 71 + .../validation/library/Rules/Charset.php | 61 + .../validation/library/Rules/Cnh.php | 63 + .../validation/library/Rules/Cnpj.php | 87 + .../validation/library/Rules/Consonant.php | 34 + .../validation/library/Rules/Contains.php | 84 + .../validation/library/Rules/ContainsAny.php | 54 + .../validation/library/Rules/Control.php | 35 + .../validation/library/Rules/Countable.php | 36 + .../validation/library/Rules/CountryCode.php | 377 ++ .../validation/library/Rules/Cpf.php | 62 + .../validation/library/Rules/CreditCard.php | 102 + .../validation/library/Rules/CurrencyCode.php | 215 + .../validation/library/Rules/Date.php | 71 + .../validation/library/Rules/DateTime.php | 70 + .../validation/library/Rules/Digit.php | 34 + .../validation/library/Rules/Directory.php | 49 + .../validation/library/Rules/Domain.php | 184 + .../validation/library/Rules/Each.php | 100 + .../validation/library/Rules/Email.php | 74 + .../validation/library/Rules/EndsWith.php | 93 + .../validation/library/Rules/Equals.php | 47 + .../validation/library/Rules/Equivalent.php | 61 + .../validation/library/Rules/Even.php | 40 + .../validation/library/Rules/Executable.php | 44 + .../validation/library/Rules/Exists.php | 38 + .../validation/library/Rules/Extension.php | 59 + .../validation/library/Rules/Factor.php | 65 + .../validation/library/Rules/FalseVal.php | 36 + .../validation/library/Rules/Fibonacci.php | 45 + .../validation/library/Rules/File.php | 40 + .../validation/library/Rules/FilterVar.php | 62 + .../validation/library/Rules/Finite.php | 34 + .../validation/library/Rules/FloatType.php | 33 + .../validation/library/Rules/FloatVal.php | 38 + .../validation/library/Rules/Graph.php | 35 + .../validation/library/Rules/GreaterThan.php | 30 + .../validation/library/Rules/HexRgbColor.php | 28 + .../validation/library/Rules/Iban.php | 152 + .../validation/library/Rules/Identical.php | 45 + .../validation/library/Rules/Image.php | 66 + .../validation/library/Rules/Imei.php | 50 + .../workerman/validation/library/Rules/In.php | 99 + .../validation/library/Rules/Infinite.php | 34 + .../validation/library/Rules/Instance.php | 45 + .../validation/library/Rules/IntType.php | 32 + .../validation/library/Rules/IntVal.php | 41 + .../workerman/validation/library/Rules/Ip.php | 213 + .../validation/library/Rules/Isbn.php | 49 + .../validation/library/Rules/IterableType.php | 34 + .../validation/library/Rules/Json.php | 43 + .../validation/library/Rules/Key.php | 57 + .../validation/library/Rules/KeyNested.php | 150 + .../validation/library/Rules/KeySet.php | 135 + .../validation/library/Rules/KeyValue.php | 148 + .../validation/library/Rules/LanguageCode.php | 553 ++ .../validation/library/Rules/LeapDate.php | 58 + .../validation/library/Rules/LeapYear.php | 54 + .../validation/library/Rules/Length.php | 135 + .../validation/library/Rules/LessThan.php | 30 + .../validation/library/Rules/Lowercase.php | 41 + .../validation/library/Rules/Luhn.php | 62 + .../validation/library/Rules/MacAddress.php | 40 + .../validation/library/Rules/Max.php | 31 + .../validation/library/Rules/MaxAge.php | 31 + .../validation/library/Rules/Mimetype.php | 70 + .../validation/library/Rules/Min.php | 31 + .../validation/library/Rules/MinAge.php | 33 + .../validation/library/Rules/Multiple.php | 44 + .../validation/library/Rules/Negative.php | 38 + .../validation/library/Rules/NfeAccessKey.php | 60 + .../validation/library/Rules/Nif.php | 103 + .../validation/library/Rules/Nip.php | 58 + .../workerman/validation/library/Rules/No.php | 36 + .../validation/library/Rules/NoWhitespace.php | 45 + .../validation/library/Rules/NoneOf.php | 56 + .../validation/library/Rules/Not.php | 119 + .../validation/library/Rules/NotBlank.php | 55 + .../validation/library/Rules/NotEmoji.php | 210 + .../validation/library/Rules/NotEmpty.php | 39 + .../validation/library/Rules/NotOptional.php | 37 + .../validation/library/Rules/NullType.php | 33 + .../validation/library/Rules/Nullable.php | 58 + .../validation/library/Rules/Number.php | 39 + .../validation/library/Rules/NumericVal.php | 34 + .../validation/library/Rules/ObjectType.php | 33 + .../validation/library/Rules/Odd.php | 45 + .../validation/library/Rules/OneOf.php | 86 + .../validation/library/Rules/Optional.php | 60 + .../library/Rules/PerfectSquare.php | 37 + .../validation/library/Rules/Pesel.php | 55 + .../validation/library/Rules/Phone.php | 54 + .../validation/library/Rules/PhpLabel.php | 35 + .../validation/library/Rules/Pis.php | 57 + .../validation/library/Rules/PolishIdCard.php | 60 + .../validation/library/Rules/Positive.php | 38 + .../validation/library/Rules/PostalCode.php | 209 + .../validation/library/Rules/PrimeNumber.php | 52 + .../validation/library/Rules/Printable.php | 36 + .../validation/library/Rules/Punct.php | 35 + .../validation/library/Rules/Readable.php | 40 + .../validation/library/Rules/Regex.php | 52 + .../validation/library/Rules/ResourceType.php | 32 + .../validation/library/Rules/Roman.php | 29 + .../validation/library/Rules/ScalarVal.php | 32 + .../workerman/validation/library/Rules/Sf.php | 100 + .../validation/library/Rules/Size.php | 117 + .../validation/library/Rules/Slug.php | 45 + .../validation/library/Rules/Sorted.php | 98 + .../validation/library/Rules/Space.php | 35 + .../validation/library/Rules/StartsWith.php | 85 + .../validation/library/Rules/StringType.php | 33 + .../validation/library/Rules/StringVal.php | 35 + .../library/Rules/SubdivisionCode.php | 56 + .../validation/library/Rules/Subset.php | 53 + .../validation/library/Rules/SymbolicLink.php | 40 + .../validation/library/Rules/Time.php | 70 + .../validation/library/Rules/Tld.php | 267 + .../validation/library/Rules/TrueVal.php | 36 + .../validation/library/Rules/Type.php | 90 + .../validation/library/Rules/Unique.php | 41 + .../validation/library/Rules/Uploaded.php | 44 + .../validation/library/Rules/Uppercase.php | 41 + .../validation/library/Rules/Url.php | 36 + .../validation/library/Rules/Uuid.php | 84 + .../validation/library/Rules/Version.php | 40 + .../validation/library/Rules/VideoUrl.php | 94 + .../validation/library/Rules/Vowel.php | 33 + .../validation/library/Rules/When.php | 95 + .../validation/library/Rules/Writable.php | 40 + .../validation/library/Rules/Xdigit.php | 31 + .../validation/library/Rules/Yes.php | 63 + .../validation/library/Rules/Zend.php | 143 + .../validation/library/Validatable.php | 51 + .../validation/library/Validator.php | 251 + vendor/workerman/webman-framework/.gitignore | 5 + vendor/workerman/webman-framework/README.md | 5 + .../workerman/webman-framework/composer.json | 46 + vendor/workerman/webman-framework/src/App.php | 863 +++ .../webman-framework/src/Bootstrap.php | 28 + .../workerman/webman-framework/src/Config.php | 276 + .../webman-framework/src/Container.php | 78 + .../src/Exception/ExceptionHandler.php | 101 + .../Exception/ExceptionHandlerInterface.php | 35 + .../src/Exception/FileException.php | 25 + .../src/Exception/NotFoundException.php | 25 + .../workerman/webman-framework/src/File.php | 45 + .../src/FileSessionHandler.php | 25 + .../webman-framework/src/Http/Request.php | 291 + .../webman-framework/src/Http/Response.php | 81 + .../webman-framework/src/Http/UploadFile.php | 104 + .../webman-framework/src/Install.php | 59 + .../webman-framework/src/Middleware.php | 74 + .../src/MiddlewareInterface.php | 30 + .../workerman/webman-framework/src/Route.php | 419 ++ .../webman-framework/src/Route/Route.php | 188 + .../src/Session/FileSessionHandler.php | 28 + .../Session/RedisClusterSessionHandler.php | 22 + .../src/Session/RedisSessionHandler.php | 28 + .../workerman/webman-framework/src/Util.php | 38 + .../workerman/webman-framework/src/View.php | 26 + .../webman-framework/src/support/App.php | 143 + .../webman-framework/src/support/Cache.php | 50 + .../src/support/Container.php | 47 + .../webman-framework/src/support/Db.php | 35 + .../webman-framework/src/support/Log.php | 132 + .../webman-framework/src/support/Model.php | 252 + .../webman-framework/src/support/Plugin.php | 72 + .../webman-framework/src/support/Redis.php | 279 + .../webman-framework/src/support/Request.php | 24 + .../webman-framework/src/support/Response.php | 24 + .../src/support/Translation.php | 89 + .../webman-framework/src/support/View.php | 31 + .../src/support/bootstrap/LaravelDb.php | 113 + .../src/support/bootstrap/Session.php | 59 + .../support/exception/BusinessException.php | 37 + .../src/support/exception/Handler.php | 47 + .../src/support/view/Blade.php | 69 + .../webman-framework/src/support/view/Raw.php | 71 + .../src/support/view/ThinkPHP.php | 69 + .../src/support/view/Twig.php | 70 + .../workerman/workerman/.github/FUNDING.yml | 4 + vendor/workerman/workerman/.gitignore | 6 + vendor/workerman/workerman/Autoloader.php | 69 + .../Connection/AsyncTcpConnection.php | 376 ++ .../Connection/AsyncUdpConnection.php | 203 + .../Connection/ConnectionInterface.php | 126 + .../workerman/Connection/TcpConnection.php | 982 ++++ .../workerman/Connection/UdpConnection.php | 208 + vendor/workerman/workerman/Events/Ev.php | 191 + vendor/workerman/workerman/Events/Event.php | 215 + .../workerman/Events/EventInterface.php | 107 + .../workerman/workerman/Events/Libevent.php | 225 + .../workerman/workerman/Events/React/Base.php | 264 + .../workerman/Events/React/ExtEventLoop.php | 27 + .../Events/React/ExtLibEventLoop.php | 27 + .../Events/React/StreamSelectLoop.php | 26 + vendor/workerman/workerman/Events/Select.php | 357 ++ vendor/workerman/workerman/Events/Swoole.php | 230 + vendor/workerman/workerman/Events/Uv.php | 260 + vendor/workerman/workerman/Lib/Constants.php | 44 + vendor/workerman/workerman/Lib/Timer.php | 22 + vendor/workerman/workerman/MIT-LICENSE.txt | 21 + .../workerman/workerman/Protocols/Frame.php | 61 + vendor/workerman/workerman/Protocols/Http.php | 323 ++ .../workerman/Protocols/Http/Chunk.php | 48 + .../workerman/Protocols/Http/Request.php | 676 +++ .../workerman/Protocols/Http/Response.php | 458 ++ .../Protocols/Http/ServerSentEvents.php | 64 + .../workerman/Protocols/Http/Session.php | 441 ++ .../Http/Session/FileSessionHandler.php | 183 + .../Session/RedisClusterSessionHandler.php | 46 + .../Http/Session/RedisSessionHandler.php | 154 + .../Http/Session/SessionHandlerInterface.php | 114 + .../workerman/Protocols/Http/mime.types | 90 + .../workerman/Protocols/ProtocolInterface.php | 52 + vendor/workerman/workerman/Protocols/Text.php | 70 + .../workerman/Protocols/Websocket.php | 564 ++ vendor/workerman/workerman/Protocols/Ws.php | 460 ++ vendor/workerman/workerman/README.md | 342 ++ vendor/workerman/workerman/Timer.php | 220 + vendor/workerman/workerman/Worker.php | 2625 +++++++++ vendor/workerman/workerman/composer.json | 38 + vendor/yzh52521/easyhttp/LICENSE | 22 + vendor/yzh52521/easyhttp/README.md | 341 ++ vendor/yzh52521/easyhttp/composer.json | 33 + .../easyhttp/src/ConnectionException.php | 10 + vendor/yzh52521/easyhttp/src/Facade.php | 21 + vendor/yzh52521/easyhttp/src/Http.php | 56 + vendor/yzh52521/easyhttp/src/Logger.php | 273 + vendor/yzh52521/easyhttp/src/Request.php | 615 ++ .../easyhttp/src/RequestException.php | 43 + vendor/yzh52521/easyhttp/src/Response.php | 212 + vendor/yzh52521/easyhttp/src/Retry.php | 46 + vendor/yzh52521/webman-throttle/.gitignore | 6 + vendor/yzh52521/webman-throttle/README.md | 158 + vendor/yzh52521/webman-throttle/composer.json | 23 + .../yzh52521/webman-throttle/src/Install.php | 74 + .../yzh52521/webman-throttle/src/Throttle.php | 267 + .../config/plugin/yzh52521/throttle/app.php | 54 + .../webman-throttle/src/middleware.tpl | 26 + .../src/throttle/CounterFixed.php | 28 + .../src/throttle/CounterSlider.php | 38 + .../src/throttle/LeakyBucket.php | 29 + .../src/throttle/ThrottleAbstract.php | 43 + .../src/throttle/TokenBucket.php | 42 + windows.bat | 3 + windows.php | 116 + 3244 files changed, 260239 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 .history/.env_20230101172316 create mode 100644 .history/.env_20230101172348 create mode 100644 .history/.env_20230101173049 create mode 100644 .history/.env_20230101181726 create mode 100644 .history/.env_20230101182453 create mode 100644 .history/.env_20230101182642 create mode 100644 .history/.env_20230101182748 create mode 100644 .history/.env_20230101191643 create mode 100644 .history/.env_20230101203601 create mode 100644 .history/.env_20230101205534 create mode 100644 .history/.env_20230101210425 create mode 100644 .history/.env_20230101220200 create mode 100644 .history/.env_20230101220201 create mode 100644 .history/.env_20230101231839.example create mode 100644 .history/.env_20230101231841.example create mode 100644 .history/.env_20230101232035.example create mode 100644 .history/.gitignore_20230101172312 create mode 100644 .history/.gitignore_20230101172323 create mode 100644 .history/app/controller/File_20230102143247.php create mode 100644 .history/app/controller/File_20230102143249.php create mode 100644 .history/app/controller/File_20230102143332.php create mode 100644 .history/app/controller/File_20230102143346.php create mode 100644 .history/app/controller/File_20230102152508.php create mode 100644 .history/app/controller/File_20230102154544.php create mode 100644 .history/app/controller/File_20230102165530.php create mode 100644 .history/app/controller/File_20230102170445.php create mode 100644 .history/app/controller/File_20230102171742.php create mode 100644 .history/app/controller/File_20230102171809.php create mode 100644 .history/app/controller/File_20230102171818.php create mode 100644 .history/app/controller/File_20230102172707.php create mode 100644 .history/app/controller/File_20230102172825.php create mode 100644 .history/app/controller/File_20230102172833.php create mode 100644 .history/app/controller/File_20230102173122.php create mode 100644 .history/app/controller/File_20230102173124.php create mode 100644 .history/app/controller/File_20230102173125.php create mode 100644 .history/app/controller/File_20230102173220.php create mode 100644 .history/app/controller/File_20230102173627.php create mode 100644 .history/app/controller/File_20230102174259.php create mode 100644 .history/app/controller/File_20230102174312.php create mode 100644 .history/app/controller/File_20230102182057.php create mode 100644 .history/app/controller/File_20230102183433.php create mode 100644 .history/app/controller/File_20230102184127.php create mode 100644 .history/app/controller/File_20230102184835.php create mode 100644 .history/app/controller/File_20230102185014.php create mode 100644 .history/app/controller/File_20230102185148.php create mode 100644 .history/app/controller/File_20230102185322.php create mode 100644 .history/app/controller/File_20230102185353.php create mode 100644 .history/app/controller/File_20230102185511.php create mode 100644 .history/app/controller/File_20230102185714.php create mode 100644 .history/app/controller/File_20230102190051.php create mode 100644 .history/app/controller/IndexController_20221212162407.php create mode 100644 .history/app/controller/IndexController_20230101173342.php create mode 100644 .history/app/controller/IndexController_20230101182420.php create mode 100644 .history/app/controller/IndexController_20230101183521.php create mode 100644 .history/app/controller/IndexController_20230101183610.php create mode 100644 .history/app/controller/IndexController_20230101184256.php create mode 100644 .history/app/controller/IndexController_20230101190155.php create mode 100644 .history/app/controller/IndexController_20230101192447.php create mode 100644 .history/app/controller/IndexController_20230101192731.php create mode 100644 .history/app/controller/IndexController_20230101192934.php create mode 100644 .history/app/controller/IndexController_20230101193243.php create mode 100644 .history/app/controller/IndexController_20230101194651.php create mode 100644 .history/app/controller/IndexController_20230101194656.php create mode 100644 .history/app/controller/IndexController_20230101194904.php create mode 100644 .history/app/controller/IndexController_20230101202315.php create mode 100644 .history/app/controller/IndexController_20230101203357.php create mode 100644 .history/app/controller/IndexController_20230101205503.php create mode 100644 .history/app/controller/IndexController_20230101205507.php create mode 100644 .history/app/controller/IndexController_20230101205513.php create mode 100644 .history/app/controller/IndexController_20230101205522.php create mode 100644 .history/app/controller/IndexController_20230101205548.php create mode 100644 .history/app/controller/IndexController_20230101210439.php create mode 100644 .history/app/controller/IndexController_20230101210449.php create mode 100644 .history/app/controller/IndexController_20230101210659.php create mode 100644 .history/app/controller/IndexController_20230101215122.php create mode 100644 .history/app/controller/IndexController_20230101215326.php create mode 100644 .history/app/controller/IndexController_20230101215401.php create mode 100644 .history/app/controller/IndexController_20230101215431.php create mode 100644 .history/app/controller/IndexController_20230101215457.php create mode 100644 .history/app/controller/IndexController_20230101215743.php create mode 100644 .history/app/controller/IndexController_20230101220103.php create mode 100644 .history/app/controller/IndexController_20230101220342.php create mode 100644 .history/app/controller/IndexController_20230101220540.php create mode 100644 .history/app/controller/IndexController_20230101220542.php create mode 100644 .history/app/controller/IndexController_20230101221211.php create mode 100644 .history/app/controller/IndexController_20230101221246.php create mode 100644 .history/app/controller/IndexController_20230101221441.php create mode 100644 .history/app/controller/IndexController_20230101221736.php create mode 100644 .history/app/controller/IndexController_20230101222759.php create mode 100644 .history/app/controller/IndexController_20230101222959.php create mode 100644 .history/app/controller/IndexController_20230101223138.php create mode 100644 .history/app/controller/IndexController_20230101223213.php create mode 100644 .history/app/controller/IndexController_20230101223238.php create mode 100644 .history/app/controller/IndexController_20230101224226.php create mode 100644 .history/app/controller/IndexController_20230101224323.php create mode 100644 .history/app/controller/IndexController_20230101224742.php create mode 100644 .history/app/controller/IndexController_20230101224840.php create mode 100644 .history/app/controller/IndexController_20230101225029.php create mode 100644 .history/app/controller/IndexController_20230101230759.php create mode 100644 .history/app/controller/IndexController_20230101230912.php create mode 100644 .history/app/controller/IndexController_20230101231109.php create mode 100644 .history/app/controller/IndexController_20230101231128.php create mode 100644 .history/app/controller/IndexController_20230101231501.php create mode 100644 .history/app/controller/IndexController_20230101231532.php create mode 100644 .history/app/controller/IndexController_20230101231609.php create mode 100644 .history/app/controller/IndexController_20230101231611.php create mode 100644 .history/app/controller/IndexController_20230101231630.php create mode 100644 .history/app/controller/IndexController_20230101231812.php create mode 100644 .history/app/controller/IndexController_20230101232629.php create mode 100644 .history/app/controller/IndexController_20230101233633.php create mode 100644 .history/app/controller/IndexController_20230101233658.php create mode 100644 .history/app/controller/IndexController_20230102115404.php create mode 100644 .history/app/controller/IndexController_20230102115453.php create mode 100644 .history/app/controller/IndexController_20230102115631.php create mode 100644 .history/app/controller/IndexController_20230102124339.php create mode 100644 .history/app/controller/IndexController_20230102124904.php create mode 100644 .history/app/controller/IndexController_20230102142646.php create mode 100644 .history/app/middleware/Login_20230101201400.php create mode 100644 .history/app/middleware/Login_20230101201403.php create mode 100644 .history/app/middleware/Login_20230101201416.php create mode 100644 .history/app/middleware/Login_20230101201845.php create mode 100644 .history/app/middleware/Login_20230101202102.php create mode 100644 .history/app/middleware/Login_20230101202206.php create mode 100644 .history/app/view/index_20230101202946.html create mode 100644 .history/app/view/index_20230101202948.html create mode 100644 .history/app/view/index_20230101203012.html create mode 100644 .history/app/view/index_20230101203249.html create mode 100644 .history/app/view/index_20230101203257.html create mode 100644 .history/app/view/index_20230101203627.html create mode 100644 .history/app/view/index_20230101203642.html create mode 100644 .history/app/view/index_20230101203704.html create mode 100644 .history/app/view/index_20230101203816.html create mode 100644 .history/app/view/index_20230101203939.html create mode 100644 .history/app/view/index_20230101204053.html create mode 100644 .history/app/view/index_20230101204120.html create mode 100644 .history/app/view/index_20230101204208.html create mode 100644 .history/app/view/index_20230101204558.html create mode 100644 .history/app/view/index_20230101204608.html create mode 100644 .history/app/view/index_20230101204615.html create mode 100644 .history/app/view/index_20230101204631.html create mode 100644 .history/app/view/index_20230101204642.html create mode 100644 .history/app/view/index_20230101204645.html create mode 100644 .history/app/view/index_20230101204737.html create mode 100644 .history/app/view/index_20230101205022.html create mode 100644 .history/app/view/index_20230101205058.html create mode 100644 .history/app/view/index_20230101205143.html create mode 100644 .history/app/view/index_20230101223457.html create mode 100644 .history/app/view/index_20230101223530.html create mode 100644 .history/app/view/index_20230102124634.html create mode 100644 .history/app/view/index_20230102124718.html create mode 100644 .history/app/view/index_20230102124723.html create mode 100644 .history/app/view/index_20230102124919.html create mode 100644 .history/app/view/index_20230102125045.html create mode 100644 .history/app/view/index_20230102125053.html create mode 100644 .history/app/view/index_20230102125226.html create mode 100644 .history/app/view/index_20230102125230.html create mode 100644 .history/app/view/index_20230102143349.html create mode 100644 .history/app/view/index_20230102174618.html create mode 100644 .history/app/view/index_20230102175038.html create mode 100644 .history/app/view/index_20230102175043.html create mode 100644 .history/app/view/index_20230102175208.html create mode 100644 .history/app/view/index_20230102175306.html create mode 100644 .history/app/view/index_20230102175452.html create mode 100644 .history/app/view/index_20230102175543.html create mode 100644 .history/app/view/index_20230102175638.html create mode 100644 .history/app/view/index_20230102175659.html create mode 100644 .history/app/view/index_20230102181935.html create mode 100644 .history/app/view/index_20230102181951.html create mode 100644 .history/app/view/index_20230102182128.html create mode 100644 .history/app/view/index_20230102182216.html create mode 100644 .history/app/view/index_20230102182247.html create mode 100644 .history/app/view/index_20230102182334.html create mode 100644 .history/app/view/index_20230102182553.html create mode 100644 .history/app/view/index_20230102182723.html create mode 100644 .history/app/view/index_20230102182726.html create mode 100644 .history/app/view/index_20230102182911.html create mode 100644 .history/app/view/index_20230102183013.html create mode 100644 .history/app/view/index_20230102183031.html create mode 100644 .history/app/view/index_20230102183648.html create mode 100644 .history/app/view/index_20230102183911.html create mode 100644 .history/app/view/index_20230102183921.html create mode 100644 .history/app/view/index_20230102183951.html create mode 100644 .history/app/view/index_20230102184217.html create mode 100644 .history/app/view/index_20230102184245.html create mode 100644 .history/app/view/index_20230102184436.html create mode 100644 .history/app/view/index_20230102185838.html create mode 100644 .history/app/view/login_20230101173350.html create mode 100644 .history/app/view/login_20230101173352.html create mode 100644 .history/app/view/login_20230101173411.html create mode 100644 .history/app/view/login_20230101174829.html create mode 100644 .history/app/view/login_20230101175120.html create mode 100644 .history/app/view/login_20230101175133.html create mode 100644 .history/app/view/login_20230101175218.html create mode 100644 .history/app/view/login_20230101175401.html create mode 100644 .history/app/view/login_20230101175437.html create mode 100644 .history/app/view/login_20230101180128.html create mode 100644 .history/app/view/login_20230101180149.html create mode 100644 .history/app/view/login_20230101180227.html create mode 100644 .history/app/view/login_20230101180234.html create mode 100644 .history/app/view/login_20230101180241.html create mode 100644 .history/app/view/login_20230101181129.html create mode 100644 .history/app/view/login_20230101181150.html create mode 100644 .history/app/view/login_20230101182821.html create mode 100644 .history/app/view/login_20230101183327.html create mode 100644 .history/app/view/login_20230101183446.html create mode 100644 .history/app/view/login_20230101183552.html create mode 100644 .history/app/view/login_20230101183630.html create mode 100644 .history/app/view/login_20230101183643.html create mode 100644 .history/app/view/login_20230101183645.html create mode 100644 .history/app/view/login_20230101183712.html create mode 100644 .history/app/view/login_20230101183839.html create mode 100644 .history/app/view/login_20230101183850.html create mode 100644 .history/app/view/login_20230101184026.html create mode 100644 .history/app/view/login_20230101185849.html create mode 100644 .history/app/view/login_20230101190053.html create mode 100644 .history/app/view/login_20230101190231.html create mode 100644 .history/app/view/login_20230101190302.html create mode 100644 .history/app/view/login_20230101190358.html create mode 100644 .history/app/view/login_20230101190412.html create mode 100644 .history/app/view/login_20230101190659.html create mode 100644 .history/app/view/login_20230101190738.html create mode 100644 .history/app/view/login_20230101190748.html create mode 100644 .history/app/view/login_20230101192531.html create mode 100644 .history/app/view/login_20230101192600.html create mode 100644 .history/app/view/login_20230101192622.html create mode 100644 .history/app/view/login_20230101192648.html create mode 100644 .history/app/view/login_20230101193338.html create mode 100644 .history/app/view/login_20230101195634.html create mode 100644 .history/app/view/login_20230101195725.html create mode 100644 .history/app/view/login_20230102190430.html create mode 100644 .history/app/view/login_20230102190457.html create mode 100644 .history/books/2023/01/test_20230102171837 create mode 100644 .history/books/2023/01/test_20230102171838 create mode 100644 .history/config/middleware_20221212162407.php create mode 100644 .history/config/middleware_20230101201929.php create mode 100644 .history/config/middleware_20230101202230.php create mode 100644 .history/config/plugin/nsp-team/webman-throttler/app_20230101182209.php create mode 100644 .history/config/plugin/nsp-team/webman-throttler/app_20230101182301.php create mode 100644 .history/config/plugin/yzh52521/throttle/app_20230101181847.php create mode 100644 .history/config/plugin/yzh52521/throttle/app_20230101181956.php create mode 100644 .history/config/plugin/yzh52521/throttle/app_20230102144623.php create mode 100644 .history/config/redis_20221212162407.php create mode 100644 .history/config/redis_20230101181759.php create mode 100644 .history/config/redis_20230101182542.php create mode 100644 .history/config/redis_20230101182638.php create mode 100644 .history/config/redis_20230101182737.php create mode 100644 .history/config/route_20221212162407.php create mode 100644 .history/config/route_20230101173323.php create mode 100644 .history/config/route_20230101182341.php create mode 100644 .history/config/route_20230101183538.php create mode 100644 .history/config/route_20230101195822.php create mode 100644 .history/config/route_20230101195833.php create mode 100644 .history/config/route_20230101195850.php create mode 100644 .history/config/route_20230101200029.php create mode 100644 .history/config/route_20230101200302.php create mode 100644 .history/config/route_20230101200324.php create mode 100644 .history/config/route_20230101200915.php create mode 100644 .history/config/route_20230101201228.php create mode 100644 .history/config/route_20230101201254.php create mode 100644 .history/config/route_20230101202902.php create mode 100644 .history/config/route_20230101202939.php create mode 100644 .history/config/route_20230101203425.php create mode 100644 .history/config/route_20230101203452.php create mode 100644 .history/config/route_20230101203513.php create mode 100644 .history/config/route_20230101203529.php create mode 100644 .history/config/route_20230101203550.php create mode 100644 .history/config/route_20230101203806.php create mode 100644 .history/config/route_20230101205925.php create mode 100644 .history/config/route_20230101223459.php create mode 100644 .history/config/route_20230101230445.php create mode 100644 .history/config/route_20230102124532.php create mode 100644 .history/config/route_20230102131622.php create mode 100644 .history/config/route_20230102142547.php create mode 100644 .history/config/route_20230102142552.php create mode 100644 .history/config/route_20230102142817.php create mode 100644 .history/config/route_20230102143348.php create mode 100644 .history/config/route_20230102174342.php create mode 100644 .history/config/server_20221212162407.php create mode 100644 .history/config/server_20230101175147.php create mode 100644 .history/public/zlibproxy/jquery-3.6.3.min_20230101180946.js create mode 100644 .history/public/zlibproxy/jquery-3.6.3.min_20230101180949.js create mode 100644 .history/public/zlibproxy/jquery-3.6.3.min_20230101180952.js create mode 100644 .history/public/zlibproxy/normalize_20230101173113.css create mode 100644 .history/public/zlibproxy/normalize_20230101173115.css create mode 100644 .history/public/zlibproxy/normalize_20230101173118.css create mode 100644 .history/public/zlibproxy/sakura-dark_20230101175310.css create mode 100644 .history/public/zlibproxy/sakura-dark_20230101175312.css create mode 100644 .history/public/zlibproxy/sakura-dark_20230101175315.css create mode 100644 .history/public/zlibproxy/sakura_20230101173132.css create mode 100644 .history/public/zlibproxy/sakura_20230101173134.css create mode 100644 .history/public/zlibproxy/sakura_20230101173137.css create mode 100644 .history/public/zlibproxy_20230101172406 create mode 100644 .history/public/zlibproxy_20230101172408 create mode 100644 .history/support/helpers_20230101172004.php create mode 100644 .history/support/helpers_20230102152429.php create mode 100644 .history/test_20230101184303.php create mode 100644 .history/test_20230101184304.php create mode 100644 .history/test_20230101184538.php create mode 100644 .history/test_20230101184553.php create mode 100644 .history/test_20230101184603.php create mode 100644 .history/test_20230101184620.php create mode 100644 .history/test_20230101184658.php create mode 100644 .history/test_20230101184836.php create mode 100644 .history/test_20230101184907.php create mode 100644 .history/test_20230101185011.php create mode 100644 .history/test_20230101193653.php create mode 100644 .history/test_20230101194107.php create mode 100644 .history/test_20230101194121.php create mode 100644 .history/test_20230101194141.php create mode 100644 .history/test_20230101194201.php create mode 100644 .history/test_20230101214411.php create mode 100644 .history/test_20230101214457.php create mode 100644 .history/test_20230101214514.php create mode 100644 .history/test_20230101214950.php create mode 100644 .history/test_20230101215608.php create mode 100644 .history/test_20230101222541.php create mode 100644 .history/test_20230101222547.php create mode 100644 .history/test_20230101222559.php create mode 100644 .history/test_20230101222611.php create mode 100644 .history/test_20230101222616.php create mode 100644 .history/test_20230101232715.php create mode 100644 .history/test_20230101232744.php create mode 100644 .history/test_20230101232746.php create mode 100644 .history/test_20230101232911.php create mode 100644 .history/test_20230101232916.php create mode 100644 .history/test_20230101233452.php create mode 100644 .history/test_20230101233521.php create mode 100644 .history/test_20230102113630.php create mode 100644 .history/test_20230102113637.php create mode 100644 .history/test_20230102114305.php create mode 100644 .history/test_20230102125853.php create mode 100644 .history/test_20230102125938.php create mode 100644 .history/test_20230102164516.php create mode 100644 .history/test_20230102164746.php create mode 100644 .history/test_20230102165125.php create mode 100644 .history/test_20230102165145.php create mode 100644 .history/test_20230102170441.php create mode 100644 .history/test_20230102171751.php create mode 100644 .history/test_20230102172135.php create mode 100644 .history/test_20230102172331.php create mode 100644 .history/test_20230102172344.php create mode 100644 .history/test_20230102173936.php create mode 100644 .history/test_20230102174024.php create mode 100644 .history/test_20230102174028.php create mode 100644 .history/test_20230102174058.php create mode 100644 .history/test_20230102174104.php create mode 100644 .history/test_20230102174106.php create mode 100644 .history/test_20230102174118.php create mode 100644 .history/test_20230102174142.php create mode 100644 .history/test_20230102174144.php create mode 100644 .history/test_20230102174148.php create mode 100644 .history/test_20230102174158.php create mode 100644 LICENSE create mode 100644 README.md create mode 100644 app/controller/File.php create mode 100644 app/controller/IndexController.php create mode 100644 app/functions.php create mode 100644 app/middleware/StaticFile.php create mode 100644 app/middleware/Throttle.php create mode 100644 app/model/Test.php create mode 100644 app/view/index.html create mode 100644 app/view/login.html create mode 100644 books/2023/01/L2RsLzE2ODg1OTY1L2FkNmE0Ng==.bin create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/app.php create mode 100644 config/autoload.php create mode 100644 config/bootstrap.php create mode 100644 config/container.php create mode 100644 config/database.php create mode 100644 config/dependence.php create mode 100644 config/exception.php create mode 100644 config/log.php create mode 100644 config/middleware.php create mode 100644 config/plugin/nsp-team/webman-throttler/app.php create mode 100644 config/plugin/nsp-team/webman-throttler/middleware.php create mode 100644 config/plugin/yzh52521/throttle/app.php create mode 100644 config/process.php create mode 100644 config/redis.php create mode 100644 config/route.php create mode 100644 config/server.php create mode 100644 config/session.php create mode 100644 config/static.php create mode 100644 config/translation.php create mode 100644 config/view.php create mode 100644 process/Monitor.php create mode 100644 public/404.html create mode 100644 public/favicon.ico create mode 100644 public/zlibproxy/jquery-3.6.3.min.js create mode 100644 public/zlibproxy/jquery.pjax.js create mode 100644 public/zlibproxy/normalize.css create mode 100644 public/zlibproxy/sakura-dark.css create mode 100644 public/zlibproxy/sakura.css create mode 100644 runtime/.gitignore create mode 100644 runtime/logs/.gitignore create mode 100644 runtime/views/.gitignore create mode 100755 start.php create mode 100644 support/Request.php create mode 100644 support/Response.php create mode 100644 support/bootstrap.php create mode 100644 support/helpers.php create mode 100644 test.php create mode 100644 vendor/autoload.php create mode 100755 vendor/bin/carbon create mode 100755 vendor/bin/carbon.bat create mode 100644 vendor/composer/ClassLoader.php create mode 100644 vendor/composer/InstalledVersions.php create mode 100644 vendor/composer/LICENSE create mode 100644 vendor/composer/autoload_classmap.php create mode 100644 vendor/composer/autoload_files.php create mode 100644 vendor/composer/autoload_namespaces.php create mode 100644 vendor/composer/autoload_psr4.php create mode 100644 vendor/composer/autoload_real.php create mode 100644 vendor/composer/autoload_static.php create mode 100644 vendor/composer/installed.json create mode 100644 vendor/composer/installed.php create mode 100644 vendor/composer/platform_check.php create mode 100644 vendor/doctrine/inflector/LICENSE create mode 100644 vendor/doctrine/inflector/README.md create mode 100644 vendor/doctrine/inflector/composer.json create mode 100644 vendor/doctrine/inflector/docs/en/index.rst create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Language.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php create mode 100644 vendor/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php create mode 100644 vendor/doctrine/inflector/phpstan.neon.dist create mode 100644 vendor/doctrine/inflector/psalm.xml create mode 100644 vendor/graham-campbell/result-type/LICENSE create mode 100644 vendor/graham-campbell/result-type/composer.json create mode 100644 vendor/graham-campbell/result-type/src/Error.php create mode 100644 vendor/graham-campbell/result-type/src/Result.php create mode 100644 vendor/graham-campbell/result-type/src/Success.php create mode 100644 vendor/guzzlehttp/guzzle/CHANGELOG.md create mode 100644 vendor/guzzlehttp/guzzle/LICENSE create mode 100644 vendor/guzzlehttp/guzzle/README.md create mode 100644 vendor/guzzlehttp/guzzle/UPGRADING.md create mode 100644 vendor/guzzlehttp/guzzle/composer.json create mode 100644 vendor/guzzlehttp/guzzle/src/BodySummarizer.php create mode 100644 vendor/guzzlehttp/guzzle/src/BodySummarizerInterface.php create mode 100644 vendor/guzzlehttp/guzzle/src/Client.php create mode 100644 vendor/guzzlehttp/guzzle/src/ClientInterface.php create mode 100644 vendor/guzzlehttp/guzzle/src/ClientTrait.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/ClientException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/RequestException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/ServerException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/TransferException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/Proxy.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php create mode 100644 vendor/guzzlehttp/guzzle/src/HandlerStack.php create mode 100644 vendor/guzzlehttp/guzzle/src/MessageFormatter.php create mode 100644 vendor/guzzlehttp/guzzle/src/MessageFormatterInterface.php create mode 100644 vendor/guzzlehttp/guzzle/src/Middleware.php create mode 100644 vendor/guzzlehttp/guzzle/src/Pool.php create mode 100644 vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php create mode 100644 vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php create mode 100644 vendor/guzzlehttp/guzzle/src/RequestOptions.php create mode 100644 vendor/guzzlehttp/guzzle/src/RetryMiddleware.php create mode 100644 vendor/guzzlehttp/guzzle/src/TransferStats.php create mode 100644 vendor/guzzlehttp/guzzle/src/Utils.php create mode 100644 vendor/guzzlehttp/guzzle/src/functions.php create mode 100644 vendor/guzzlehttp/guzzle/src/functions_include.php create mode 100644 vendor/guzzlehttp/promises/CHANGELOG.md create mode 100644 vendor/guzzlehttp/promises/LICENSE create mode 100644 vendor/guzzlehttp/promises/README.md create mode 100644 vendor/guzzlehttp/promises/composer.json create mode 100644 vendor/guzzlehttp/promises/src/AggregateException.php create mode 100644 vendor/guzzlehttp/promises/src/CancellationException.php create mode 100644 vendor/guzzlehttp/promises/src/Coroutine.php create mode 100644 vendor/guzzlehttp/promises/src/Create.php create mode 100644 vendor/guzzlehttp/promises/src/Each.php create mode 100644 vendor/guzzlehttp/promises/src/EachPromise.php create mode 100644 vendor/guzzlehttp/promises/src/FulfilledPromise.php create mode 100644 vendor/guzzlehttp/promises/src/Is.php create mode 100644 vendor/guzzlehttp/promises/src/Promise.php create mode 100644 vendor/guzzlehttp/promises/src/PromiseInterface.php create mode 100644 vendor/guzzlehttp/promises/src/PromisorInterface.php create mode 100644 vendor/guzzlehttp/promises/src/RejectedPromise.php create mode 100644 vendor/guzzlehttp/promises/src/RejectionException.php create mode 100644 vendor/guzzlehttp/promises/src/TaskQueue.php create mode 100644 vendor/guzzlehttp/promises/src/TaskQueueInterface.php create mode 100644 vendor/guzzlehttp/promises/src/Utils.php create mode 100644 vendor/guzzlehttp/promises/src/functions.php create mode 100644 vendor/guzzlehttp/promises/src/functions_include.php create mode 100644 vendor/guzzlehttp/psr7/CHANGELOG.md create mode 100644 vendor/guzzlehttp/psr7/LICENSE create mode 100644 vendor/guzzlehttp/psr7/README.md create mode 100644 vendor/guzzlehttp/psr7/composer.json create mode 100644 vendor/guzzlehttp/psr7/src/AppendStream.php create mode 100644 vendor/guzzlehttp/psr7/src/BufferStream.php create mode 100644 vendor/guzzlehttp/psr7/src/CachingStream.php create mode 100644 vendor/guzzlehttp/psr7/src/DroppingStream.php create mode 100644 vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.php create mode 100644 vendor/guzzlehttp/psr7/src/FnStream.php create mode 100644 vendor/guzzlehttp/psr7/src/Header.php create mode 100644 vendor/guzzlehttp/psr7/src/HttpFactory.php create mode 100644 vendor/guzzlehttp/psr7/src/InflateStream.php create mode 100644 vendor/guzzlehttp/psr7/src/LazyOpenStream.php create mode 100644 vendor/guzzlehttp/psr7/src/LimitStream.php create mode 100644 vendor/guzzlehttp/psr7/src/Message.php create mode 100644 vendor/guzzlehttp/psr7/src/MessageTrait.php create mode 100644 vendor/guzzlehttp/psr7/src/MimeType.php create mode 100644 vendor/guzzlehttp/psr7/src/MultipartStream.php create mode 100644 vendor/guzzlehttp/psr7/src/NoSeekStream.php create mode 100644 vendor/guzzlehttp/psr7/src/PumpStream.php create mode 100644 vendor/guzzlehttp/psr7/src/Query.php create mode 100644 vendor/guzzlehttp/psr7/src/Request.php create mode 100644 vendor/guzzlehttp/psr7/src/Response.php create mode 100644 vendor/guzzlehttp/psr7/src/Rfc7230.php create mode 100644 vendor/guzzlehttp/psr7/src/ServerRequest.php create mode 100644 vendor/guzzlehttp/psr7/src/Stream.php create mode 100644 vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php create mode 100644 vendor/guzzlehttp/psr7/src/StreamWrapper.php create mode 100644 vendor/guzzlehttp/psr7/src/UploadedFile.php create mode 100644 vendor/guzzlehttp/psr7/src/Uri.php create mode 100644 vendor/guzzlehttp/psr7/src/UriComparator.php create mode 100644 vendor/guzzlehttp/psr7/src/UriNormalizer.php create mode 100644 vendor/guzzlehttp/psr7/src/UriResolver.php create mode 100644 vendor/guzzlehttp/psr7/src/Utils.php create mode 100644 vendor/illuminate/bus/Batch.php create mode 100644 vendor/illuminate/bus/BatchFactory.php create mode 100644 vendor/illuminate/bus/BatchRepository.php create mode 100644 vendor/illuminate/bus/Batchable.php create mode 100644 vendor/illuminate/bus/BusServiceProvider.php create mode 100644 vendor/illuminate/bus/DatabaseBatchRepository.php create mode 100644 vendor/illuminate/bus/Dispatcher.php create mode 100644 vendor/illuminate/bus/Events/BatchDispatched.php create mode 100644 vendor/illuminate/bus/LICENSE.md create mode 100644 vendor/illuminate/bus/PendingBatch.php create mode 100644 vendor/illuminate/bus/PrunableBatchRepository.php create mode 100644 vendor/illuminate/bus/Queueable.php create mode 100644 vendor/illuminate/bus/UniqueLock.php create mode 100644 vendor/illuminate/bus/UpdatedBatchJobCounts.php create mode 100644 vendor/illuminate/bus/composer.json create mode 100644 vendor/illuminate/collections/Arr.php create mode 100644 vendor/illuminate/collections/Collection.php create mode 100644 vendor/illuminate/collections/Enumerable.php create mode 100644 vendor/illuminate/collections/HigherOrderCollectionProxy.php create mode 100644 vendor/illuminate/collections/ItemNotFoundException.php create mode 100644 vendor/illuminate/collections/LICENSE.md create mode 100644 vendor/illuminate/collections/LazyCollection.php create mode 100644 vendor/illuminate/collections/MultipleItemsFoundException.php create mode 100644 vendor/illuminate/collections/Traits/EnumeratesValues.php create mode 100644 vendor/illuminate/collections/composer.json create mode 100644 vendor/illuminate/collections/helpers.php create mode 100644 vendor/illuminate/conditionable/HigherOrderWhenProxy.php create mode 100644 vendor/illuminate/conditionable/LICENSE.md create mode 100644 vendor/illuminate/conditionable/Traits/Conditionable.php create mode 100644 vendor/illuminate/conditionable/composer.json create mode 100644 vendor/illuminate/container/BoundMethod.php create mode 100755 vendor/illuminate/container/Container.php create mode 100644 vendor/illuminate/container/ContextualBindingBuilder.php create mode 100644 vendor/illuminate/container/EntryNotFoundException.php create mode 100644 vendor/illuminate/container/LICENSE.md create mode 100644 vendor/illuminate/container/RewindableGenerator.php create mode 100644 vendor/illuminate/container/Util.php create mode 100755 vendor/illuminate/container/composer.json create mode 100644 vendor/illuminate/contracts/Auth/Access/Authorizable.php create mode 100644 vendor/illuminate/contracts/Auth/Access/Gate.php create mode 100644 vendor/illuminate/contracts/Auth/Authenticatable.php create mode 100644 vendor/illuminate/contracts/Auth/CanResetPassword.php create mode 100644 vendor/illuminate/contracts/Auth/Factory.php create mode 100644 vendor/illuminate/contracts/Auth/Guard.php create mode 100644 vendor/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php create mode 100644 vendor/illuminate/contracts/Auth/MustVerifyEmail.php create mode 100644 vendor/illuminate/contracts/Auth/PasswordBroker.php create mode 100644 vendor/illuminate/contracts/Auth/PasswordBrokerFactory.php create mode 100644 vendor/illuminate/contracts/Auth/StatefulGuard.php create mode 100644 vendor/illuminate/contracts/Auth/SupportsBasicAuth.php create mode 100644 vendor/illuminate/contracts/Auth/UserProvider.php create mode 100644 vendor/illuminate/contracts/Broadcasting/Broadcaster.php create mode 100644 vendor/illuminate/contracts/Broadcasting/Factory.php create mode 100644 vendor/illuminate/contracts/Broadcasting/HasBroadcastChannel.php create mode 100644 vendor/illuminate/contracts/Broadcasting/ShouldBeUnique.php create mode 100644 vendor/illuminate/contracts/Broadcasting/ShouldBroadcast.php create mode 100644 vendor/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php create mode 100644 vendor/illuminate/contracts/Bus/Dispatcher.php create mode 100644 vendor/illuminate/contracts/Bus/QueueingDispatcher.php create mode 100644 vendor/illuminate/contracts/Cache/Factory.php create mode 100644 vendor/illuminate/contracts/Cache/Lock.php create mode 100644 vendor/illuminate/contracts/Cache/LockProvider.php create mode 100644 vendor/illuminate/contracts/Cache/LockTimeoutException.php create mode 100644 vendor/illuminate/contracts/Cache/Repository.php create mode 100644 vendor/illuminate/contracts/Cache/Store.php create mode 100644 vendor/illuminate/contracts/Config/Repository.php create mode 100644 vendor/illuminate/contracts/Console/Application.php create mode 100644 vendor/illuminate/contracts/Console/Isolatable.php create mode 100644 vendor/illuminate/contracts/Console/Kernel.php create mode 100644 vendor/illuminate/contracts/Container/BindingResolutionException.php create mode 100644 vendor/illuminate/contracts/Container/CircularDependencyException.php create mode 100644 vendor/illuminate/contracts/Container/Container.php create mode 100644 vendor/illuminate/contracts/Container/ContextualBindingBuilder.php create mode 100644 vendor/illuminate/contracts/Cookie/Factory.php create mode 100644 vendor/illuminate/contracts/Cookie/QueueingFactory.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/Builder.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/Castable.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php create mode 100644 vendor/illuminate/contracts/Database/Events/MigrationEvent.php create mode 100644 vendor/illuminate/contracts/Database/ModelIdentifier.php create mode 100644 vendor/illuminate/contracts/Database/Query/Builder.php create mode 100644 vendor/illuminate/contracts/Debug/ExceptionHandler.php create mode 100644 vendor/illuminate/contracts/Encryption/DecryptException.php create mode 100644 vendor/illuminate/contracts/Encryption/EncryptException.php create mode 100644 vendor/illuminate/contracts/Encryption/Encrypter.php create mode 100644 vendor/illuminate/contracts/Encryption/StringEncrypter.php create mode 100644 vendor/illuminate/contracts/Events/Dispatcher.php create mode 100644 vendor/illuminate/contracts/Filesystem/Cloud.php create mode 100644 vendor/illuminate/contracts/Filesystem/Factory.php create mode 100644 vendor/illuminate/contracts/Filesystem/FileNotFoundException.php create mode 100644 vendor/illuminate/contracts/Filesystem/Filesystem.php create mode 100644 vendor/illuminate/contracts/Filesystem/LockTimeoutException.php create mode 100644 vendor/illuminate/contracts/Foundation/Application.php create mode 100644 vendor/illuminate/contracts/Foundation/CachesConfiguration.php create mode 100644 vendor/illuminate/contracts/Foundation/CachesRoutes.php create mode 100644 vendor/illuminate/contracts/Foundation/ExceptionRenderer.php create mode 100644 vendor/illuminate/contracts/Foundation/MaintenanceMode.php create mode 100644 vendor/illuminate/contracts/Hashing/Hasher.php create mode 100644 vendor/illuminate/contracts/Http/Kernel.php create mode 100644 vendor/illuminate/contracts/LICENSE.md create mode 100644 vendor/illuminate/contracts/Mail/Attachable.php create mode 100644 vendor/illuminate/contracts/Mail/Factory.php create mode 100644 vendor/illuminate/contracts/Mail/MailQueue.php create mode 100644 vendor/illuminate/contracts/Mail/Mailable.php create mode 100644 vendor/illuminate/contracts/Mail/Mailer.php create mode 100644 vendor/illuminate/contracts/Notifications/Dispatcher.php create mode 100644 vendor/illuminate/contracts/Notifications/Factory.php create mode 100644 vendor/illuminate/contracts/Pagination/CursorPaginator.php create mode 100644 vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php create mode 100644 vendor/illuminate/contracts/Pagination/Paginator.php create mode 100644 vendor/illuminate/contracts/Pipeline/Hub.php create mode 100644 vendor/illuminate/contracts/Pipeline/Pipeline.php create mode 100644 vendor/illuminate/contracts/Queue/ClearableQueue.php create mode 100644 vendor/illuminate/contracts/Queue/EntityNotFoundException.php create mode 100644 vendor/illuminate/contracts/Queue/EntityResolver.php create mode 100644 vendor/illuminate/contracts/Queue/Factory.php create mode 100644 vendor/illuminate/contracts/Queue/Job.php create mode 100644 vendor/illuminate/contracts/Queue/Monitor.php create mode 100644 vendor/illuminate/contracts/Queue/Queue.php create mode 100644 vendor/illuminate/contracts/Queue/QueueableCollection.php create mode 100644 vendor/illuminate/contracts/Queue/QueueableEntity.php create mode 100644 vendor/illuminate/contracts/Queue/ShouldBeEncrypted.php create mode 100644 vendor/illuminate/contracts/Queue/ShouldBeUnique.php create mode 100644 vendor/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php create mode 100644 vendor/illuminate/contracts/Queue/ShouldQueue.php create mode 100644 vendor/illuminate/contracts/Redis/Connection.php create mode 100644 vendor/illuminate/contracts/Redis/Connector.php create mode 100644 vendor/illuminate/contracts/Redis/Factory.php create mode 100644 vendor/illuminate/contracts/Redis/LimiterTimeoutException.php create mode 100644 vendor/illuminate/contracts/Routing/BindingRegistrar.php create mode 100644 vendor/illuminate/contracts/Routing/Registrar.php create mode 100644 vendor/illuminate/contracts/Routing/ResponseFactory.php create mode 100644 vendor/illuminate/contracts/Routing/UrlGenerator.php create mode 100644 vendor/illuminate/contracts/Routing/UrlRoutable.php create mode 100644 vendor/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php create mode 100644 vendor/illuminate/contracts/Session/Session.php create mode 100755 vendor/illuminate/contracts/Support/Arrayable.php create mode 100644 vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php create mode 100644 vendor/illuminate/contracts/Support/DeferrableProvider.php create mode 100644 vendor/illuminate/contracts/Support/DeferringDisplayableValue.php create mode 100644 vendor/illuminate/contracts/Support/Htmlable.php create mode 100755 vendor/illuminate/contracts/Support/Jsonable.php create mode 100644 vendor/illuminate/contracts/Support/MessageBag.php create mode 100755 vendor/illuminate/contracts/Support/MessageProvider.php create mode 100755 vendor/illuminate/contracts/Support/Renderable.php create mode 100644 vendor/illuminate/contracts/Support/Responsable.php create mode 100644 vendor/illuminate/contracts/Support/ValidatedData.php create mode 100644 vendor/illuminate/contracts/Translation/HasLocalePreference.php create mode 100755 vendor/illuminate/contracts/Translation/Loader.php create mode 100644 vendor/illuminate/contracts/Translation/Translator.php create mode 100644 vendor/illuminate/contracts/Validation/DataAwareRule.php create mode 100644 vendor/illuminate/contracts/Validation/Factory.php create mode 100644 vendor/illuminate/contracts/Validation/ImplicitRule.php create mode 100644 vendor/illuminate/contracts/Validation/InvokableRule.php create mode 100644 vendor/illuminate/contracts/Validation/Rule.php create mode 100644 vendor/illuminate/contracts/Validation/UncompromisedVerifier.php create mode 100644 vendor/illuminate/contracts/Validation/ValidatesWhenResolved.php create mode 100644 vendor/illuminate/contracts/Validation/Validator.php create mode 100644 vendor/illuminate/contracts/Validation/ValidatorAwareRule.php create mode 100755 vendor/illuminate/contracts/View/Engine.php create mode 100644 vendor/illuminate/contracts/View/Factory.php create mode 100644 vendor/illuminate/contracts/View/View.php create mode 100644 vendor/illuminate/contracts/View/ViewCompilationException.php create mode 100644 vendor/illuminate/contracts/composer.json create mode 100644 vendor/illuminate/events/CallQueuedListener.php create mode 100755 vendor/illuminate/events/Dispatcher.php create mode 100755 vendor/illuminate/events/EventServiceProvider.php create mode 100644 vendor/illuminate/events/InvokeQueuedClosure.php create mode 100644 vendor/illuminate/events/LICENSE.md create mode 100644 vendor/illuminate/events/NullDispatcher.php create mode 100644 vendor/illuminate/events/QueuedClosure.php create mode 100755 vendor/illuminate/events/composer.json create mode 100644 vendor/illuminate/events/functions.php create mode 100644 vendor/illuminate/macroable/LICENSE.md create mode 100644 vendor/illuminate/macroable/Traits/Macroable.php create mode 100644 vendor/illuminate/macroable/composer.json create mode 100644 vendor/illuminate/pipeline/Hub.php create mode 100644 vendor/illuminate/pipeline/LICENSE.md create mode 100644 vendor/illuminate/pipeline/Pipeline.php create mode 100644 vendor/illuminate/pipeline/PipelineServiceProvider.php create mode 100644 vendor/illuminate/pipeline/composer.json create mode 100644 vendor/illuminate/redis/Connections/Connection.php create mode 100644 vendor/illuminate/redis/Connections/PacksPhpRedisValues.php create mode 100644 vendor/illuminate/redis/Connections/PhpRedisClusterConnection.php create mode 100644 vendor/illuminate/redis/Connections/PhpRedisConnection.php create mode 100644 vendor/illuminate/redis/Connections/PredisClusterConnection.php create mode 100644 vendor/illuminate/redis/Connections/PredisConnection.php create mode 100644 vendor/illuminate/redis/Connectors/PhpRedisConnector.php create mode 100644 vendor/illuminate/redis/Connectors/PredisConnector.php create mode 100644 vendor/illuminate/redis/Events/CommandExecuted.php create mode 100644 vendor/illuminate/redis/LICENSE.md create mode 100644 vendor/illuminate/redis/Limiters/ConcurrencyLimiter.php create mode 100644 vendor/illuminate/redis/Limiters/ConcurrencyLimiterBuilder.php create mode 100644 vendor/illuminate/redis/Limiters/DurationLimiter.php create mode 100644 vendor/illuminate/redis/Limiters/DurationLimiterBuilder.php create mode 100644 vendor/illuminate/redis/RedisManager.php create mode 100755 vendor/illuminate/redis/RedisServiceProvider.php create mode 100755 vendor/illuminate/redis/composer.json create mode 100644 vendor/illuminate/support/AggregateServiceProvider.php create mode 100644 vendor/illuminate/support/Benchmark.php create mode 100644 vendor/illuminate/support/Carbon.php create mode 100644 vendor/illuminate/support/Composer.php create mode 100644 vendor/illuminate/support/ConfigurationUrlParser.php create mode 100644 vendor/illuminate/support/DateFactory.php create mode 100644 vendor/illuminate/support/Env.php create mode 100755 vendor/illuminate/support/Facades/App.php create mode 100755 vendor/illuminate/support/Facades/Artisan.php create mode 100755 vendor/illuminate/support/Facades/Auth.php create mode 100755 vendor/illuminate/support/Facades/Blade.php create mode 100644 vendor/illuminate/support/Facades/Broadcast.php create mode 100644 vendor/illuminate/support/Facades/Bus.php create mode 100755 vendor/illuminate/support/Facades/Cache.php create mode 100755 vendor/illuminate/support/Facades/Config.php create mode 100755 vendor/illuminate/support/Facades/Cookie.php create mode 100755 vendor/illuminate/support/Facades/Crypt.php create mode 100755 vendor/illuminate/support/Facades/DB.php create mode 100644 vendor/illuminate/support/Facades/Date.php create mode 100755 vendor/illuminate/support/Facades/Event.php create mode 100755 vendor/illuminate/support/Facades/Facade.php create mode 100755 vendor/illuminate/support/Facades/File.php create mode 100644 vendor/illuminate/support/Facades/Gate.php create mode 100755 vendor/illuminate/support/Facades/Hash.php create mode 100644 vendor/illuminate/support/Facades/Http.php create mode 100755 vendor/illuminate/support/Facades/Lang.php create mode 100755 vendor/illuminate/support/Facades/Log.php create mode 100755 vendor/illuminate/support/Facades/Mail.php create mode 100644 vendor/illuminate/support/Facades/Notification.php create mode 100644 vendor/illuminate/support/Facades/ParallelTesting.php create mode 100755 vendor/illuminate/support/Facades/Password.php create mode 100755 vendor/illuminate/support/Facades/Queue.php create mode 100644 vendor/illuminate/support/Facades/RateLimiter.php create mode 100755 vendor/illuminate/support/Facades/Redirect.php create mode 100755 vendor/illuminate/support/Facades/Redis.php create mode 100755 vendor/illuminate/support/Facades/Request.php create mode 100755 vendor/illuminate/support/Facades/Response.php create mode 100755 vendor/illuminate/support/Facades/Route.php create mode 100755 vendor/illuminate/support/Facades/Schema.php create mode 100755 vendor/illuminate/support/Facades/Session.php create mode 100644 vendor/illuminate/support/Facades/Storage.php create mode 100755 vendor/illuminate/support/Facades/URL.php create mode 100755 vendor/illuminate/support/Facades/Validator.php create mode 100755 vendor/illuminate/support/Facades/View.php create mode 100644 vendor/illuminate/support/Facades/Vite.php create mode 100755 vendor/illuminate/support/Fluent.php create mode 100644 vendor/illuminate/support/HigherOrderTapProxy.php create mode 100644 vendor/illuminate/support/HtmlString.php create mode 100644 vendor/illuminate/support/InteractsWithTime.php create mode 100644 vendor/illuminate/support/Js.php create mode 100644 vendor/illuminate/support/LICENSE.md create mode 100644 vendor/illuminate/support/Lottery.php create mode 100755 vendor/illuminate/support/Manager.php create mode 100755 vendor/illuminate/support/MessageBag.php create mode 100644 vendor/illuminate/support/MultipleInstanceManager.php create mode 100755 vendor/illuminate/support/NamespacedItemResolver.php create mode 100644 vendor/illuminate/support/Optional.php create mode 100755 vendor/illuminate/support/Pluralizer.php create mode 100644 vendor/illuminate/support/ProcessUtils.php create mode 100644 vendor/illuminate/support/Reflector.php create mode 100755 vendor/illuminate/support/ServiceProvider.php create mode 100644 vendor/illuminate/support/Str.php create mode 100644 vendor/illuminate/support/Stringable.php create mode 100644 vendor/illuminate/support/Testing/Fakes/BatchFake.php create mode 100644 vendor/illuminate/support/Testing/Fakes/BatchRepositoryFake.php create mode 100644 vendor/illuminate/support/Testing/Fakes/BusFake.php create mode 100644 vendor/illuminate/support/Testing/Fakes/EventFake.php create mode 100644 vendor/illuminate/support/Testing/Fakes/MailFake.php create mode 100644 vendor/illuminate/support/Testing/Fakes/NotificationFake.php create mode 100644 vendor/illuminate/support/Testing/Fakes/PendingBatchFake.php create mode 100644 vendor/illuminate/support/Testing/Fakes/PendingChainFake.php create mode 100644 vendor/illuminate/support/Testing/Fakes/PendingMailFake.php create mode 100644 vendor/illuminate/support/Testing/Fakes/QueueFake.php create mode 100644 vendor/illuminate/support/Timebox.php create mode 100644 vendor/illuminate/support/Traits/CapsuleManagerTrait.php create mode 100644 vendor/illuminate/support/Traits/ForwardsCalls.php create mode 100644 vendor/illuminate/support/Traits/Localizable.php create mode 100644 vendor/illuminate/support/Traits/ReflectsClosures.php create mode 100644 vendor/illuminate/support/Traits/Tappable.php create mode 100644 vendor/illuminate/support/ValidatedInput.php create mode 100644 vendor/illuminate/support/ViewErrorBag.php create mode 100644 vendor/illuminate/support/composer.json create mode 100755 vendor/illuminate/support/helpers.php create mode 100644 vendor/monolog/monolog/CHANGELOG.md create mode 100644 vendor/monolog/monolog/LICENSE create mode 100644 vendor/monolog/monolog/README.md create mode 100644 vendor/monolog/monolog/UPGRADE.md create mode 100644 vendor/monolog/monolog/composer.json create mode 100644 vendor/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/DateTimeImmutable.php create mode 100644 vendor/monolog/monolog/src/Monolog/ErrorHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/GoogleCloudLoggingFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/Handler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/NoopHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/OverflowHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ProcessHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SendGridHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/LogRecord.php create mode 100644 vendor/monolog/monolog/src/Monolog/Logger.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php create mode 100644 vendor/monolog/monolog/src/Monolog/Registry.php create mode 100644 vendor/monolog/monolog/src/Monolog/ResettableInterface.php create mode 100644 vendor/monolog/monolog/src/Monolog/SignalHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/Test/TestCase.php create mode 100644 vendor/monolog/monolog/src/Monolog/Utils.php create mode 100644 vendor/nesbot/carbon/LICENSE create mode 100755 vendor/nesbot/carbon/bin/carbon create mode 100644 vendor/nesbot/carbon/bin/carbon.bat create mode 100644 vendor/nesbot/carbon/composer.json create mode 100644 vendor/nesbot/carbon/extension.neon create mode 100644 vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroBuiltin.php create mode 100644 vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroStatic.php create mode 100644 vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroStrongType.php create mode 100644 vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroWeakType.php create mode 100644 vendor/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php create mode 100644 vendor/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php create mode 100644 vendor/nesbot/carbon/readme.md create mode 100644 vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Carbon.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonConverterInterface.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonInterface.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonInterval.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php create mode 100644 vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Cli/Invoker.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonDoctrineType.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonImmutableType.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonType.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonTypeConverter.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeDefaultPrecision.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeImmutableType.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeType.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Factory.php create mode 100644 vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa_DJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/aa_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/af.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/af_NA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/af_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/agq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/agr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/agr_PE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ak.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ak_GH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/am.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/am_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/an.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/an_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/anp.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/anp_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_AE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_BH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_DJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_DZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_EG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_EH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_IL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_IQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_JO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_KM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_KW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_LB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_LY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_MA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_MR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_OM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_PS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_QA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_SY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_TD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_TN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ar_YE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/as.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/as_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/asa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ast.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ast_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ayc.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ayc_PE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az_AZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az_IR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/az_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bas.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/be.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/be_BY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bem.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bem_ZM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ber.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ber_DZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ber_MA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bez.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bg_BG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bhb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bhb_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bho.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bho_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bi_VU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bm.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bn_BD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bn_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bo_CN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bo_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/br.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/br_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/brx.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/brx_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bs.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/bs_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/byn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/byn_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_AD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ca_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ccp.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ccp_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ce.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ce_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cgg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/chr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/chr_US.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ckb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cmn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cmn_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/crh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/crh_UA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cs.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cs_CZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/csb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/csb_PL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cv_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cy.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/cy_GB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/da.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/da_DK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/da_GL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dav.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_AT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_BE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_LI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/de_LU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dje.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/doi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/doi_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dsb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dsb_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dua.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dyo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dz.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/dz_BT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ebu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ee.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ee_TG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/el.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/el_CY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/el_GR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_001.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_150.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_AU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_BZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_CY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_DG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_DK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_DM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_FI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_FJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_FK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_FM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_GY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_HK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_IO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ISO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_JE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_JM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_KE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_KI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_KN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_KY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_LC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_LR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_LS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_MY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_NZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_PW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_RW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_SZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TV.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_TZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_UG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_UM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_US.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_VC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_VG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_VI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_VU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_WS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ZM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/en_ZW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/eo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_419.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_AR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_BO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_BR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_BZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_CL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_CO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_CR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_CU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_DO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_EA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_EC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_GQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_GT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_HN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_IC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_MX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_NI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_PY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_SV.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_US.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_UY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/es_VE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/et.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/et_EE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/eu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/eu_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ewo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fa_AF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fa_IR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff_CM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff_GN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff_MR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ff_SN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fi_FI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fil.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fil_PH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fo_DK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fo_FO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_BL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_CM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_DJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_DZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_GQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_HT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_KM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_LU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_ML.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_MU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_NC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_NE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_PF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_PM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_RE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_RW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_SC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_SN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_SY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_TD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_TG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_TN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_VU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_WF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fr_YT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fur.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fur_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fy.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fy_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/fy_NL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ga.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ga_IE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gd.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gd_GB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gez.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gez_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gez_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gl_ES.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gom.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gom_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gsw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gsw_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gsw_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gsw_LI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gu_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/guz.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/gv_GB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ha.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ha_GH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ha_NE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ha_NG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hak.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hak_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/haw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/he.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/he_IL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hi_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hif.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hif_FJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hne.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hne_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hr_BA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hr_HR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hsb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hsb_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ht.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ht_HT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hu_HU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hy.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/hy_AM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/i18n.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ia.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ia_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/id.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/id_ID.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ig.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ig_NG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ii.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ik.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ik_CA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/in.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/is.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/is_IS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it_SM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/it_VA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/iu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/iu_CA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/iw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ja.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ja_JP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/jgo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/jmc.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/jv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ka.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ka_GE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kab.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kab_DZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kam.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kde.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kea.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/khq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ki.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kk_KZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kkj.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kl_GL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kln.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/km.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/km_KH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kn_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ko.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ko_KP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ko_KR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kok.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kok_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ks.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ks_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ksb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ksf.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ksh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ku.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ku_TR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/kw_GB.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ky.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ky_KG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lag.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lb_LU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lg_UG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/li.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/li_NL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lij.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lij_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lkt.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln_AO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln_CD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln_CF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ln_CG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lo_LA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lrc.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lt.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lt_LT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/luo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/luy.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lv_LV.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lzh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/lzh_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mag.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mag_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mai.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mai_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mas.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mas_TZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mer.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mfe.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mfe_MU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mg_MG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mgh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mgo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mhr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mhr_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mi_NZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/miq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/miq_NI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mjw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mjw_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mk_MK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ml.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ml_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mn_MN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mni.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mni_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mr_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ms.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ms_BN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ms_MY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ms_SG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mt.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mt_MT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mua.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/my.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/my_MM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/mzn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nan.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nan_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/naq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nb.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nb_NO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nb_SJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nd.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nds.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nds_DE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nds_NL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ne.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ne_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ne_NP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nhn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nhn_MX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/niu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/niu_NU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_AW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_BE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_BQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_CW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_NL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_SR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nl_SX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nmg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nn_NO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nnh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/no.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nr_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nso.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nso_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nus.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/nyn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/oc.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/oc_FR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/om.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/om_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/om_KE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/or.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/or_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/os.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/os_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa_Arab.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa_Guru.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pa_PK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pap.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pap_AW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pap_CW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pl_PL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/prg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ps.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ps_AF.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_AO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_CV.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_GQ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_GW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_LU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_MO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_MZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_PT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_ST.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/pt_TL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/qu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/qu_BO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/qu_EC.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/quz.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/quz_PE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/raj.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/raj_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rm.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ro.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ro_MD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ro_RO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rof.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_BY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_KG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_KZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_MD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ru_UA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rw_RW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/rwk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sa_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sah.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sah_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/saq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sat.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sat_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sbp.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sc.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sc_IT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sd.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sd_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/se.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/se_FI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/se_NO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/se_SE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/seh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ses.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sgs.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sgs_LT.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shi_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shn_MM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shs.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/shs_CA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/si.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/si_LK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sid.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sid_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sk_SK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sl_SI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sm.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sm_WS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/smn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so_DJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so_KE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/so_SO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sq_AL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sq_MK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sq_XK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_RS.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ss.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ss_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/st.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/st_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sv.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sv_AX.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sv_FI.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sv_SE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw_CD.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw_KE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw_TZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/sw_UG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/szl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/szl_PL.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta_LK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta_MY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ta_SG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tcy.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tcy_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/te.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/te_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/teo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/teo_KE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tet.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tg.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tg_TJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/th.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/th_TH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/the.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/the_NP.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ti.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ti_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ti_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tig.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tig_ER.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tk_TM.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tl_PH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tlh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tn_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/to.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/to_TO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tpi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tpi_PG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tr.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tr_CY.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tr_TR.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ts.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ts_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tt.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tt_RU.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/twq.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tzl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tzm.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ug.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ug_CN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uk.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uk_UA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/unm.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/unm_US.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ur.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ur_IN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ur_PK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_Arab.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vai.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vai_Latn.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ve.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ve_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vi_VN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/vun.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wa.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wa_BE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wae.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wae_CH.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wal.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wal_ET.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/wo_SN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/xh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/xh_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/xog.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yav.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yi.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yi_US.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yo.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yo_BJ.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yo_NG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yue.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yue_HK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yue_Hans.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yue_Hant.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yuw.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/yuw_PG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zgh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_CN.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_HK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_MO.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_SG.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zh_YUE.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zu.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/zu_ZA.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Language.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php create mode 100644 vendor/nesbot/carbon/src/Carbon/List/languages.php create mode 100644 vendor/nesbot/carbon/src/Carbon/List/regions.php create mode 100644 vendor/nesbot/carbon/src/Carbon/PHPStan/AbstractMacro.php create mode 100644 vendor/nesbot/carbon/src/Carbon/PHPStan/Macro.php create mode 100644 vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php create mode 100644 vendor/nesbot/carbon/src/Carbon/PHPStan/MacroScanner.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Boundaries.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Cast.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Converter.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Creator.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Date.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/DeprecatedProperties.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Difference.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Localization.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Macro.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/MagicParameter.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Mixin.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Modifiers.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Mutability.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Options.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Test.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Units.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Traits/Week.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Translator.php create mode 100644 vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php create mode 100644 vendor/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php create mode 100644 vendor/nikic/fast-route/.gitignore create mode 100644 vendor/nikic/fast-route/.hhconfig create mode 100644 vendor/nikic/fast-route/.travis.yml create mode 100644 vendor/nikic/fast-route/FastRoute.hhi create mode 100644 vendor/nikic/fast-route/LICENSE create mode 100644 vendor/nikic/fast-route/README.md create mode 100644 vendor/nikic/fast-route/composer.json create mode 100644 vendor/nikic/fast-route/phpunit.xml create mode 100644 vendor/nikic/fast-route/psalm.xml create mode 100644 vendor/nikic/fast-route/src/BadRouteException.php create mode 100644 vendor/nikic/fast-route/src/DataGenerator.php create mode 100644 vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php create mode 100644 vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php create mode 100644 vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php create mode 100644 vendor/nikic/fast-route/src/DataGenerator/MarkBased.php create mode 100644 vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php create mode 100644 vendor/nikic/fast-route/src/Dispatcher.php create mode 100644 vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php create mode 100644 vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php create mode 100644 vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php create mode 100644 vendor/nikic/fast-route/src/Dispatcher/MarkBased.php create mode 100644 vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php create mode 100644 vendor/nikic/fast-route/src/Route.php create mode 100644 vendor/nikic/fast-route/src/RouteCollector.php create mode 100644 vendor/nikic/fast-route/src/RouteParser.php create mode 100644 vendor/nikic/fast-route/src/RouteParser/Std.php create mode 100644 vendor/nikic/fast-route/src/bootstrap.php create mode 100644 vendor/nikic/fast-route/src/functions.php create mode 100644 vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php create mode 100644 vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php create mode 100644 vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php create mode 100644 vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php create mode 100644 vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php create mode 100644 vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php create mode 100644 vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php create mode 100644 vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php create mode 100644 vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php create mode 100644 vendor/nikic/fast-route/test/RouteCollectorTest.php create mode 100644 vendor/nikic/fast-route/test/RouteParser/StdTest.php create mode 100644 vendor/nikic/fast-route/test/bootstrap.php create mode 100644 vendor/nsp-team/webman-throttler/.gitignore create mode 100644 vendor/nsp-team/webman-throttler/LICENSE create mode 100644 vendor/nsp-team/webman-throttler/README.md create mode 100644 vendor/nsp-team/webman-throttler/composer.json create mode 100644 vendor/nsp-team/webman-throttler/src/Install.php create mode 100644 vendor/nsp-team/webman-throttler/src/Middleware/ThrottlerMiddleware.php create mode 100644 vendor/nsp-team/webman-throttler/src/Throttle/Throttler.php create mode 100644 vendor/nsp-team/webman-throttler/src/Throttle/ThrottlerInterface.php create mode 100644 vendor/nsp-team/webman-throttler/src/config/plugin/nsp-team/webman-throttler/app.php create mode 100644 vendor/nsp-team/webman-throttler/src/config/plugin/nsp-team/webman-throttler/middleware.php create mode 100644 vendor/phpoption/phpoption/LICENSE create mode 100644 vendor/phpoption/phpoption/Makefile create mode 100644 vendor/phpoption/phpoption/composer.json create mode 100644 vendor/phpoption/phpoption/src/PhpOption/LazyOption.php create mode 100644 vendor/phpoption/phpoption/src/PhpOption/None.php create mode 100644 vendor/phpoption/phpoption/src/PhpOption/Option.php create mode 100644 vendor/phpoption/phpoption/src/PhpOption/Some.php create mode 100644 vendor/psr/cache/CHANGELOG.md create mode 100644 vendor/psr/cache/LICENSE.txt create mode 100644 vendor/psr/cache/README.md create mode 100644 vendor/psr/cache/composer.json create mode 100644 vendor/psr/cache/src/CacheException.php create mode 100644 vendor/psr/cache/src/CacheItemInterface.php create mode 100644 vendor/psr/cache/src/CacheItemPoolInterface.php create mode 100644 vendor/psr/cache/src/InvalidArgumentException.php create mode 100644 vendor/psr/container/.gitignore create mode 100644 vendor/psr/container/LICENSE create mode 100644 vendor/psr/container/README.md create mode 100644 vendor/psr/container/composer.json create mode 100644 vendor/psr/container/src/ContainerExceptionInterface.php create mode 100644 vendor/psr/container/src/ContainerInterface.php create mode 100644 vendor/psr/container/src/NotFoundExceptionInterface.php create mode 100644 vendor/psr/http-client/CHANGELOG.md create mode 100644 vendor/psr/http-client/LICENSE create mode 100644 vendor/psr/http-client/README.md create mode 100644 vendor/psr/http-client/composer.json create mode 100644 vendor/psr/http-client/src/ClientExceptionInterface.php create mode 100644 vendor/psr/http-client/src/ClientInterface.php create mode 100644 vendor/psr/http-client/src/NetworkExceptionInterface.php create mode 100644 vendor/psr/http-client/src/RequestExceptionInterface.php create mode 100644 vendor/psr/http-factory/.gitignore create mode 100644 vendor/psr/http-factory/.pullapprove.yml create mode 100644 vendor/psr/http-factory/LICENSE create mode 100644 vendor/psr/http-factory/README.md create mode 100644 vendor/psr/http-factory/composer.json create mode 100644 vendor/psr/http-factory/src/RequestFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/ResponseFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/ServerRequestFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/StreamFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/UploadedFileFactoryInterface.php create mode 100644 vendor/psr/http-factory/src/UriFactoryInterface.php create mode 100644 vendor/psr/http-message/CHANGELOG.md create mode 100644 vendor/psr/http-message/LICENSE create mode 100644 vendor/psr/http-message/README.md create mode 100644 vendor/psr/http-message/composer.json create mode 100644 vendor/psr/http-message/src/MessageInterface.php create mode 100644 vendor/psr/http-message/src/RequestInterface.php create mode 100644 vendor/psr/http-message/src/ResponseInterface.php create mode 100644 vendor/psr/http-message/src/ServerRequestInterface.php create mode 100644 vendor/psr/http-message/src/StreamInterface.php create mode 100644 vendor/psr/http-message/src/UploadedFileInterface.php create mode 100644 vendor/psr/http-message/src/UriInterface.php create mode 100644 vendor/psr/log/LICENSE create mode 100644 vendor/psr/log/README.md create mode 100644 vendor/psr/log/composer.json create mode 100644 vendor/psr/log/src/AbstractLogger.php create mode 100644 vendor/psr/log/src/InvalidArgumentException.php create mode 100644 vendor/psr/log/src/LogLevel.php create mode 100644 vendor/psr/log/src/LoggerAwareInterface.php create mode 100644 vendor/psr/log/src/LoggerAwareTrait.php create mode 100644 vendor/psr/log/src/LoggerInterface.php create mode 100644 vendor/psr/log/src/LoggerTrait.php create mode 100644 vendor/psr/log/src/NullLogger.php create mode 100644 vendor/psr/simple-cache/.editorconfig create mode 100644 vendor/psr/simple-cache/LICENSE.md create mode 100644 vendor/psr/simple-cache/README.md create mode 100644 vendor/psr/simple-cache/composer.json create mode 100644 vendor/psr/simple-cache/src/CacheException.php create mode 100644 vendor/psr/simple-cache/src/CacheInterface.php create mode 100644 vendor/psr/simple-cache/src/InvalidArgumentException.php create mode 100644 vendor/ralouphie/getallheaders/LICENSE create mode 100644 vendor/ralouphie/getallheaders/README.md create mode 100644 vendor/ralouphie/getallheaders/composer.json create mode 100644 vendor/ralouphie/getallheaders/src/getallheaders.php create mode 100644 vendor/respect/stringifier/LICENSE.md create mode 100644 vendor/respect/stringifier/README.md create mode 100644 vendor/respect/stringifier/composer.json create mode 100644 vendor/respect/stringifier/src/Quoter.php create mode 100644 vendor/respect/stringifier/src/Quoters/CodeQuoter.php create mode 100644 vendor/respect/stringifier/src/Stringifier.php create mode 100644 vendor/respect/stringifier/src/Stringifiers/ArrayStringifier.php create mode 100644 vendor/respect/stringifier/src/Stringifiers/BoolStringifier.php create mode 100644 vendor/respect/stringifier/src/Stringifiers/ClusterStringifier.php create mode 100644 vendor/respect/stringifier/src/Stringifiers/DateTimeStringifier.php create mode 100644 vendor/respect/stringifier/src/Stringifiers/InfiniteStringifier.php create mode 100644 vendor/respect/stringifier/src/Stringifiers/JsonParsableStringifier.php create mode 100644 vendor/respect/stringifier/src/Stringifiers/JsonSerializableStringifier.php create mode 100644 vendor/respect/stringifier/src/Stringifiers/NanStringifier.php create mode 100644 vendor/respect/stringifier/src/Stringifiers/NullStringifier.php create mode 100644 vendor/respect/stringifier/src/Stringifiers/ObjectStringifier.php create mode 100644 vendor/respect/stringifier/src/Stringifiers/ResourceStringifier.php create mode 100644 vendor/respect/stringifier/src/Stringifiers/StringableObjectStringifier.php create mode 100644 vendor/respect/stringifier/src/Stringifiers/ThrowableStringifier.php create mode 100644 vendor/respect/stringifier/src/Stringifiers/TraversableStringifier.php create mode 100644 vendor/respect/stringifier/src/stringify.php create mode 100644 vendor/symfony/cache-contracts/.gitignore create mode 100644 vendor/symfony/cache-contracts/CHANGELOG.md create mode 100644 vendor/symfony/cache-contracts/CacheInterface.php create mode 100644 vendor/symfony/cache-contracts/CacheTrait.php create mode 100644 vendor/symfony/cache-contracts/CallbackInterface.php create mode 100644 vendor/symfony/cache-contracts/ItemInterface.php create mode 100644 vendor/symfony/cache-contracts/LICENSE create mode 100644 vendor/symfony/cache-contracts/README.md create mode 100644 vendor/symfony/cache-contracts/TagAwareCacheInterface.php create mode 100644 vendor/symfony/cache-contracts/composer.json create mode 100644 vendor/symfony/cache/Adapter/AbstractAdapter.php create mode 100644 vendor/symfony/cache/Adapter/AbstractTagAwareAdapter.php create mode 100644 vendor/symfony/cache/Adapter/AdapterInterface.php create mode 100644 vendor/symfony/cache/Adapter/ApcuAdapter.php create mode 100644 vendor/symfony/cache/Adapter/ArrayAdapter.php create mode 100644 vendor/symfony/cache/Adapter/ChainAdapter.php create mode 100644 vendor/symfony/cache/Adapter/CouchbaseBucketAdapter.php create mode 100644 vendor/symfony/cache/Adapter/CouchbaseCollectionAdapter.php create mode 100644 vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php create mode 100644 vendor/symfony/cache/Adapter/FilesystemAdapter.php create mode 100644 vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php create mode 100644 vendor/symfony/cache/Adapter/MemcachedAdapter.php create mode 100644 vendor/symfony/cache/Adapter/NullAdapter.php create mode 100644 vendor/symfony/cache/Adapter/ParameterNormalizer.php create mode 100644 vendor/symfony/cache/Adapter/PdoAdapter.php create mode 100644 vendor/symfony/cache/Adapter/PhpArrayAdapter.php create mode 100644 vendor/symfony/cache/Adapter/PhpFilesAdapter.php create mode 100644 vendor/symfony/cache/Adapter/ProxyAdapter.php create mode 100644 vendor/symfony/cache/Adapter/Psr16Adapter.php create mode 100644 vendor/symfony/cache/Adapter/RedisAdapter.php create mode 100644 vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php create mode 100644 vendor/symfony/cache/Adapter/TagAwareAdapter.php create mode 100644 vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php create mode 100644 vendor/symfony/cache/Adapter/TraceableAdapter.php create mode 100644 vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php create mode 100644 vendor/symfony/cache/CHANGELOG.md create mode 100644 vendor/symfony/cache/CacheItem.php create mode 100644 vendor/symfony/cache/DataCollector/CacheDataCollector.php create mode 100644 vendor/symfony/cache/DependencyInjection/CacheCollectorPass.php create mode 100644 vendor/symfony/cache/DependencyInjection/CachePoolClearerPass.php create mode 100644 vendor/symfony/cache/DependencyInjection/CachePoolPass.php create mode 100644 vendor/symfony/cache/DependencyInjection/CachePoolPrunerPass.php create mode 100644 vendor/symfony/cache/Exception/CacheException.php create mode 100644 vendor/symfony/cache/Exception/InvalidArgumentException.php create mode 100644 vendor/symfony/cache/Exception/LogicException.php create mode 100644 vendor/symfony/cache/LICENSE create mode 100644 vendor/symfony/cache/LockRegistry.php create mode 100644 vendor/symfony/cache/Marshaller/DefaultMarshaller.php create mode 100644 vendor/symfony/cache/Marshaller/DeflateMarshaller.php create mode 100644 vendor/symfony/cache/Marshaller/MarshallerInterface.php create mode 100644 vendor/symfony/cache/Marshaller/SodiumMarshaller.php create mode 100644 vendor/symfony/cache/Marshaller/TagAwareMarshaller.php create mode 100644 vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php create mode 100644 vendor/symfony/cache/Messenger/EarlyExpirationHandler.php create mode 100644 vendor/symfony/cache/Messenger/EarlyExpirationMessage.php create mode 100644 vendor/symfony/cache/PruneableInterface.php create mode 100644 vendor/symfony/cache/Psr16Cache.php create mode 100644 vendor/symfony/cache/README.md create mode 100644 vendor/symfony/cache/ResettableInterface.php create mode 100644 vendor/symfony/cache/Traits/AbstractAdapterTrait.php create mode 100644 vendor/symfony/cache/Traits/ContractsTrait.php create mode 100644 vendor/symfony/cache/Traits/FilesystemCommonTrait.php create mode 100644 vendor/symfony/cache/Traits/FilesystemTrait.php create mode 100644 vendor/symfony/cache/Traits/ProxyTrait.php create mode 100644 vendor/symfony/cache/Traits/RedisClusterNodeProxy.php create mode 100644 vendor/symfony/cache/Traits/RedisClusterProxy.php create mode 100644 vendor/symfony/cache/Traits/RedisProxy.php create mode 100644 vendor/symfony/cache/Traits/RedisTrait.php create mode 100644 vendor/symfony/cache/composer.json create mode 100644 vendor/symfony/deprecation-contracts/.gitignore create mode 100644 vendor/symfony/deprecation-contracts/CHANGELOG.md create mode 100644 vendor/symfony/deprecation-contracts/LICENSE create mode 100644 vendor/symfony/deprecation-contracts/README.md create mode 100644 vendor/symfony/deprecation-contracts/composer.json create mode 100644 vendor/symfony/deprecation-contracts/function.php create mode 100644 vendor/symfony/polyfill-ctype/Ctype.php create mode 100644 vendor/symfony/polyfill-ctype/LICENSE create mode 100644 vendor/symfony/polyfill-ctype/README.md create mode 100644 vendor/symfony/polyfill-ctype/bootstrap.php create mode 100644 vendor/symfony/polyfill-ctype/bootstrap80.php create mode 100644 vendor/symfony/polyfill-ctype/composer.json create mode 100644 vendor/symfony/polyfill-mbstring/LICENSE create mode 100644 vendor/symfony/polyfill-mbstring/Mbstring.php create mode 100644 vendor/symfony/polyfill-mbstring/README.md create mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php create mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php create mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php create mode 100644 vendor/symfony/polyfill-mbstring/bootstrap.php create mode 100644 vendor/symfony/polyfill-mbstring/bootstrap80.php create mode 100644 vendor/symfony/polyfill-mbstring/composer.json create mode 100644 vendor/symfony/polyfill-php80/LICENSE create mode 100644 vendor/symfony/polyfill-php80/Php80.php create mode 100644 vendor/symfony/polyfill-php80/PhpToken.php create mode 100644 vendor/symfony/polyfill-php80/README.md create mode 100644 vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php create mode 100644 vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php create mode 100644 vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php create mode 100644 vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php create mode 100644 vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php create mode 100644 vendor/symfony/polyfill-php80/bootstrap.php create mode 100644 vendor/symfony/polyfill-php80/composer.json create mode 100644 vendor/symfony/service-contracts/.gitignore create mode 100644 vendor/symfony/service-contracts/Attribute/Required.php create mode 100644 vendor/symfony/service-contracts/Attribute/SubscribedService.php create mode 100644 vendor/symfony/service-contracts/CHANGELOG.md create mode 100644 vendor/symfony/service-contracts/LICENSE create mode 100644 vendor/symfony/service-contracts/README.md create mode 100644 vendor/symfony/service-contracts/ResetInterface.php create mode 100644 vendor/symfony/service-contracts/ServiceLocatorTrait.php create mode 100644 vendor/symfony/service-contracts/ServiceProviderInterface.php create mode 100644 vendor/symfony/service-contracts/ServiceSubscriberInterface.php create mode 100644 vendor/symfony/service-contracts/ServiceSubscriberTrait.php create mode 100644 vendor/symfony/service-contracts/Test/ServiceLocatorTest.php create mode 100644 vendor/symfony/service-contracts/composer.json create mode 100644 vendor/symfony/translation-contracts/.gitignore create mode 100644 vendor/symfony/translation-contracts/CHANGELOG.md create mode 100644 vendor/symfony/translation-contracts/LICENSE create mode 100644 vendor/symfony/translation-contracts/LocaleAwareInterface.php create mode 100644 vendor/symfony/translation-contracts/README.md create mode 100644 vendor/symfony/translation-contracts/Test/TranslatorTest.php create mode 100644 vendor/symfony/translation-contracts/TranslatableInterface.php create mode 100644 vendor/symfony/translation-contracts/TranslatorInterface.php create mode 100644 vendor/symfony/translation-contracts/TranslatorTrait.php create mode 100644 vendor/symfony/translation-contracts/composer.json create mode 100644 vendor/symfony/translation/CHANGELOG.md create mode 100644 vendor/symfony/translation/Catalogue/AbstractOperation.php create mode 100644 vendor/symfony/translation/Catalogue/MergeOperation.php create mode 100644 vendor/symfony/translation/Catalogue/OperationInterface.php create mode 100644 vendor/symfony/translation/Catalogue/TargetOperation.php create mode 100644 vendor/symfony/translation/Command/TranslationPullCommand.php create mode 100644 vendor/symfony/translation/Command/TranslationPushCommand.php create mode 100644 vendor/symfony/translation/Command/TranslationTrait.php create mode 100644 vendor/symfony/translation/Command/XliffLintCommand.php create mode 100644 vendor/symfony/translation/DataCollector/TranslationDataCollector.php create mode 100644 vendor/symfony/translation/DataCollectorTranslator.php create mode 100644 vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php create mode 100644 vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php create mode 100644 vendor/symfony/translation/DependencyInjection/TranslatorPass.php create mode 100644 vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php create mode 100644 vendor/symfony/translation/Dumper/CsvFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/DumperInterface.php create mode 100644 vendor/symfony/translation/Dumper/FileDumper.php create mode 100644 vendor/symfony/translation/Dumper/IcuResFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/IniFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/JsonFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/MoFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/PhpFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/PoFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/QtFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/XliffFileDumper.php create mode 100644 vendor/symfony/translation/Dumper/YamlFileDumper.php create mode 100644 vendor/symfony/translation/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/translation/Exception/IncompleteDsnException.php create mode 100644 vendor/symfony/translation/Exception/InvalidArgumentException.php create mode 100644 vendor/symfony/translation/Exception/InvalidResourceException.php create mode 100644 vendor/symfony/translation/Exception/LogicException.php create mode 100644 vendor/symfony/translation/Exception/MissingRequiredOptionException.php create mode 100644 vendor/symfony/translation/Exception/NotFoundResourceException.php create mode 100644 vendor/symfony/translation/Exception/ProviderException.php create mode 100644 vendor/symfony/translation/Exception/ProviderExceptionInterface.php create mode 100644 vendor/symfony/translation/Exception/RuntimeException.php create mode 100644 vendor/symfony/translation/Exception/UnsupportedSchemeException.php create mode 100644 vendor/symfony/translation/Extractor/AbstractFileExtractor.php create mode 100644 vendor/symfony/translation/Extractor/ChainExtractor.php create mode 100644 vendor/symfony/translation/Extractor/ExtractorInterface.php create mode 100644 vendor/symfony/translation/Extractor/PhpExtractor.php create mode 100644 vendor/symfony/translation/Extractor/PhpStringTokenParser.php create mode 100644 vendor/symfony/translation/Formatter/IntlFormatter.php create mode 100644 vendor/symfony/translation/Formatter/IntlFormatterInterface.php create mode 100644 vendor/symfony/translation/Formatter/MessageFormatter.php create mode 100644 vendor/symfony/translation/Formatter/MessageFormatterInterface.php create mode 100644 vendor/symfony/translation/IdentityTranslator.php create mode 100644 vendor/symfony/translation/LICENSE create mode 100644 vendor/symfony/translation/Loader/ArrayLoader.php create mode 100644 vendor/symfony/translation/Loader/CsvFileLoader.php create mode 100644 vendor/symfony/translation/Loader/FileLoader.php create mode 100644 vendor/symfony/translation/Loader/IcuDatFileLoader.php create mode 100644 vendor/symfony/translation/Loader/IcuResFileLoader.php create mode 100644 vendor/symfony/translation/Loader/IniFileLoader.php create mode 100644 vendor/symfony/translation/Loader/JsonFileLoader.php create mode 100644 vendor/symfony/translation/Loader/LoaderInterface.php create mode 100644 vendor/symfony/translation/Loader/MoFileLoader.php create mode 100644 vendor/symfony/translation/Loader/PhpFileLoader.php create mode 100644 vendor/symfony/translation/Loader/PoFileLoader.php create mode 100644 vendor/symfony/translation/Loader/QtFileLoader.php create mode 100644 vendor/symfony/translation/Loader/XliffFileLoader.php create mode 100644 vendor/symfony/translation/Loader/YamlFileLoader.php create mode 100644 vendor/symfony/translation/LoggingTranslator.php create mode 100644 vendor/symfony/translation/MessageCatalogue.php create mode 100644 vendor/symfony/translation/MessageCatalogueInterface.php create mode 100644 vendor/symfony/translation/MetadataAwareInterface.php create mode 100644 vendor/symfony/translation/Provider/AbstractProviderFactory.php create mode 100644 vendor/symfony/translation/Provider/Dsn.php create mode 100644 vendor/symfony/translation/Provider/FilteringProvider.php create mode 100644 vendor/symfony/translation/Provider/NullProvider.php create mode 100644 vendor/symfony/translation/Provider/NullProviderFactory.php create mode 100644 vendor/symfony/translation/Provider/ProviderFactoryInterface.php create mode 100644 vendor/symfony/translation/Provider/ProviderInterface.php create mode 100644 vendor/symfony/translation/Provider/TranslationProviderCollection.php create mode 100644 vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php create mode 100644 vendor/symfony/translation/PseudoLocalizationTranslator.php create mode 100644 vendor/symfony/translation/README.md create mode 100644 vendor/symfony/translation/Reader/TranslationReader.php create mode 100644 vendor/symfony/translation/Reader/TranslationReaderInterface.php create mode 100644 vendor/symfony/translation/Resources/bin/translation-status.php create mode 100644 vendor/symfony/translation/Resources/data/parents.json create mode 100644 vendor/symfony/translation/Resources/functions.php create mode 100644 vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd create mode 100644 vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd create mode 100644 vendor/symfony/translation/Resources/schemas/xml.xsd create mode 100644 vendor/symfony/translation/Test/ProviderFactoryTestCase.php create mode 100644 vendor/symfony/translation/Test/ProviderTestCase.php create mode 100644 vendor/symfony/translation/TranslatableMessage.php create mode 100644 vendor/symfony/translation/Translator.php create mode 100644 vendor/symfony/translation/TranslatorBag.php create mode 100644 vendor/symfony/translation/TranslatorBagInterface.php create mode 100644 vendor/symfony/translation/Util/ArrayConverter.php create mode 100644 vendor/symfony/translation/Util/XliffUtils.php create mode 100644 vendor/symfony/translation/Writer/TranslationWriter.php create mode 100644 vendor/symfony/translation/Writer/TranslationWriterInterface.php create mode 100644 vendor/symfony/translation/composer.json create mode 100644 vendor/symfony/var-exporter/CHANGELOG.md create mode 100644 vendor/symfony/var-exporter/Exception/ClassNotFoundException.php create mode 100644 vendor/symfony/var-exporter/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/var-exporter/Exception/NotInstantiableTypeException.php create mode 100644 vendor/symfony/var-exporter/Instantiator.php create mode 100644 vendor/symfony/var-exporter/Internal/Exporter.php create mode 100644 vendor/symfony/var-exporter/Internal/Hydrator.php create mode 100644 vendor/symfony/var-exporter/Internal/Reference.php create mode 100644 vendor/symfony/var-exporter/Internal/Registry.php create mode 100644 vendor/symfony/var-exporter/Internal/Values.php create mode 100644 vendor/symfony/var-exporter/LICENSE create mode 100644 vendor/symfony/var-exporter/README.md create mode 100644 vendor/symfony/var-exporter/VarExporter.php create mode 100644 vendor/symfony/var-exporter/composer.json create mode 100644 vendor/vlucas/phpdotenv/LICENSE create mode 100644 vendor/vlucas/phpdotenv/composer.json create mode 100644 vendor/vlucas/phpdotenv/src/Dotenv.php create mode 100644 vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php create mode 100644 vendor/vlucas/phpdotenv/src/Exception/InvalidEncodingException.php create mode 100644 vendor/vlucas/phpdotenv/src/Exception/InvalidFileException.php create mode 100644 vendor/vlucas/phpdotenv/src/Exception/InvalidPathException.php create mode 100644 vendor/vlucas/phpdotenv/src/Exception/ValidationException.php create mode 100644 vendor/vlucas/phpdotenv/src/Loader/Loader.php create mode 100644 vendor/vlucas/phpdotenv/src/Loader/LoaderInterface.php create mode 100644 vendor/vlucas/phpdotenv/src/Loader/Resolver.php create mode 100644 vendor/vlucas/phpdotenv/src/Parser/Entry.php create mode 100644 vendor/vlucas/phpdotenv/src/Parser/EntryParser.php create mode 100644 vendor/vlucas/phpdotenv/src/Parser/Lexer.php create mode 100644 vendor/vlucas/phpdotenv/src/Parser/Lines.php create mode 100644 vendor/vlucas/phpdotenv/src/Parser/Parser.php create mode 100644 vendor/vlucas/phpdotenv/src/Parser/ParserInterface.php create mode 100644 vendor/vlucas/phpdotenv/src/Parser/Value.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/AdapterRepository.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php create mode 100644 vendor/vlucas/phpdotenv/src/Repository/RepositoryInterface.php create mode 100644 vendor/vlucas/phpdotenv/src/Store/File/Paths.php create mode 100644 vendor/vlucas/phpdotenv/src/Store/File/Reader.php create mode 100644 vendor/vlucas/phpdotenv/src/Store/FileStore.php create mode 100644 vendor/vlucas/phpdotenv/src/Store/StoreBuilder.php create mode 100644 vendor/vlucas/phpdotenv/src/Store/StoreInterface.php create mode 100644 vendor/vlucas/phpdotenv/src/Store/StringStore.php create mode 100644 vendor/vlucas/phpdotenv/src/Util/Regex.php create mode 100644 vendor/vlucas/phpdotenv/src/Util/Str.php create mode 100644 vendor/vlucas/phpdotenv/src/Validator.php create mode 100644 vendor/voku/portable-ascii/CHANGELOG.md create mode 100644 vendor/voku/portable-ascii/LICENSE.txt create mode 100644 vendor/voku/portable-ascii/README.md create mode 100644 vendor/voku/portable-ascii/composer.json create mode 100644 vendor/voku/portable-ascii/src/voku/helper/ASCII.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x000.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x001.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x002.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x003.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x004.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x005.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x006.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x007.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x009.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00a.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00b.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00c.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00d.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x00f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x010.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x011.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x012.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x013.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x014.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x015.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x016.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x017.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x018.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x01d.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x01e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x01f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x020.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x021.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x022.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x023.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x024.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x025.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x026.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x027.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x028.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x029.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x02a.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x02c.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x02e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x02f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x030.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x031.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x032.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x033.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x04d.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x04e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x04f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x050.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x051.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x052.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x053.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x054.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x055.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x056.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x057.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x058.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x059.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05a.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05b.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05c.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05d.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x05f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x060.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x061.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x062.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x063.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x064.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x065.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x066.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x067.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x068.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x069.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06a.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06b.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06c.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06d.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x06f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x070.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x071.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x072.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x073.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x074.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x075.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x076.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x077.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x078.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x079.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07a.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07b.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07c.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07d.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x07f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x080.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x081.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x082.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x083.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x084.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x085.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x086.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x087.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x088.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x089.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08a.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08b.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08c.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08d.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x08f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x090.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x091.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x092.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x093.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x094.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x095.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x096.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x097.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x098.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x099.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09a.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09b.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09c.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09d.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09e.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x09f.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0a0.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0a1.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0a2.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0a3.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0a4.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ac.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ad.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ae.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0af.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b0.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b1.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b2.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b3.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b4.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b5.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b6.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b7.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b8.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0b9.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ba.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0bb.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0bc.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0bd.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0be.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0bf.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c0.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c1.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c2.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c3.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c4.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c5.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c6.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c7.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c8.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0c9.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ca.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0cb.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0cc.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0cd.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ce.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0cf.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d0.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d1.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d2.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d3.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d4.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d5.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d6.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0d7.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0f9.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0fa.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0fb.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0fc.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0fd.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0fe.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x1d7.php create mode 100644 vendor/voku/portable-ascii/src/voku/helper/data/x1f1.php create mode 100644 vendor/webman/captcha/.gitignore create mode 100644 vendor/webman/captcha/.travis.yml create mode 100644 vendor/webman/captcha/LICENSE create mode 100644 vendor/webman/captcha/README.md create mode 100644 vendor/webman/captcha/composer.json create mode 100644 vendor/webman/captcha/demo/demo.php create mode 100644 vendor/webman/captcha/demo/fingerprint.php create mode 100644 vendor/webman/captcha/demo/form.php create mode 100644 vendor/webman/captcha/demo/index.php create mode 100644 vendor/webman/captcha/demo/inline.php create mode 100644 vendor/webman/captcha/demo/ocr.php create mode 100644 vendor/webman/captcha/demo/output.php create mode 100644 vendor/webman/captcha/demo/session.php create mode 100644 vendor/webman/captcha/phpunit.xml.dist create mode 100644 vendor/webman/captcha/src/CaptchaBuilder.php create mode 100644 vendor/webman/captcha/src/CaptchaBuilderInterface.php create mode 100644 vendor/webman/captcha/src/Font/captcha0.ttf create mode 100644 vendor/webman/captcha/src/Font/captcha1.ttf create mode 100644 vendor/webman/captcha/src/Font/captcha2.ttf create mode 100644 vendor/webman/captcha/src/Font/captcha3.ttf create mode 100644 vendor/webman/captcha/src/Font/captcha4.ttf create mode 100644 vendor/webman/captcha/src/Font/captcha5.ttf create mode 100644 vendor/webman/captcha/src/ImageFileHandler.php create mode 100644 vendor/webman/captcha/src/PhraseBuilder.php create mode 100644 vendor/webman/captcha/src/PhraseBuilderInterface.php create mode 100644 vendor/webman/captcha/tests/CaptchaBuilderTest.php create mode 100644 vendor/workerman/validation/CHANGELOG.md create mode 100644 vendor/workerman/validation/CONTRIBUTING.md create mode 100644 vendor/workerman/validation/LICENSE create mode 100644 vendor/workerman/validation/README.md create mode 100644 vendor/workerman/validation/composer.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/AD.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/AE.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/AF.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/AG.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/AI.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/AL.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/AM.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/AN.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/AO.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/AQ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/AR.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/AS.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/AT.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/AU.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/AW.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/AX.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/AZ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BA.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BB.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BD.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BE.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BF.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BG.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BH.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BI.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BJ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BL.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BM.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BN.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BO.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BQ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BR.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BS.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BT.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BV.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BW.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BY.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/BZ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CA.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CC.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CD.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CF.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CG.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CH.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CI.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CK.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CL.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CM.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CN.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CO.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CR.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CS.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CU.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CV.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CW.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CX.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CY.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/CZ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/DE.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/DJ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/DK.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/DM.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/DO.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/DZ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/EC.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/EE.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/EG.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/EH.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/ER.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/ES.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/ET.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/FI.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/FJ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/FK.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/FM.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/FO.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/FR.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GA.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GB.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GD.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GE.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GF.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GG.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GH.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GI.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GL.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GM.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GN.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GP.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GQ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GR.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GS.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GT.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GU.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GW.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/GY.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/HK.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/HM.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/HN.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/HR.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/HT.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/HU.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/ID.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/IE.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/IL.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/IM.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/IN.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/IO.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/IQ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/IR.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/IS.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/IT.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/JE.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/JM.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/JO.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/JP.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/KE.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/KG.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/KH.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/KI.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/KM.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/KN.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/KP.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/KR.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/KW.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/KY.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/KZ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/LA.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/LB.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/LC.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/LI.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/LK.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/LR.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/LS.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/LT.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/LU.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/LV.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/LY.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MA.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MC.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MD.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/ME.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MF.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MG.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MH.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MK.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/ML.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MM.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MN.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MO.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MP.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MQ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MR.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MS.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MT.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MU.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MV.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MW.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MX.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MY.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/MZ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/NA.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/NC.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/NE.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/NF.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/NG.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/NI.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/NL.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/NO.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/NP.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/NR.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/NU.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/NZ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/OM.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/PA.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/PE.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/PF.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/PG.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/PH.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/PK.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/PL.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/PM.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/PN.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/PR.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/PS.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/PT.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/PW.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/PY.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/QA.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/RE.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/RO.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/RS.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/RU.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/RW.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SA.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SB.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SC.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SD.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SE.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SG.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SH.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SI.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SJ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SK.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SL.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SM.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SN.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SO.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SR.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SS.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/ST.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SV.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SX.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SY.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/SZ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/TC.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/TD.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/TF.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/TG.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/TH.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/TJ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/TK.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/TL.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/TM.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/TN.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/TO.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/TR.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/TT.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/TV.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/TW.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/TZ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/UA.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/UG.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/UM.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/US.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/UY.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/UZ.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/VA.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/VC.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/VE.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/VG.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/VI.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/VN.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/VU.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/WF.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/WS.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/XK.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/YE.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/YT.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/ZA.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/ZM.json create mode 100644 vendor/workerman/validation/data/iso_3166-2/ZW.json create mode 100644 vendor/workerman/validation/library/Exceptions/AllOfException.php create mode 100644 vendor/workerman/validation/library/Exceptions/AlnumException.php create mode 100644 vendor/workerman/validation/library/Exceptions/AlphaException.php create mode 100644 vendor/workerman/validation/library/Exceptions/AlwaysInvalidException.php create mode 100644 vendor/workerman/validation/library/Exceptions/AlwaysValidException.php create mode 100644 vendor/workerman/validation/library/Exceptions/AnyOfException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ArrayTypeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ArrayValException.php create mode 100644 vendor/workerman/validation/library/Exceptions/AttributeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/Base64Exception.php create mode 100644 vendor/workerman/validation/library/Exceptions/BaseException.php create mode 100644 vendor/workerman/validation/library/Exceptions/BetweenException.php create mode 100644 vendor/workerman/validation/library/Exceptions/BoolTypeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/BoolValException.php create mode 100644 vendor/workerman/validation/library/Exceptions/BsnException.php create mode 100644 vendor/workerman/validation/library/Exceptions/CallException.php create mode 100644 vendor/workerman/validation/library/Exceptions/CallableTypeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/CallbackException.php create mode 100644 vendor/workerman/validation/library/Exceptions/CharsetException.php create mode 100644 vendor/workerman/validation/library/Exceptions/CnhException.php create mode 100644 vendor/workerman/validation/library/Exceptions/CnpjException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ComponentException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ConsonantException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ContainsAnyException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ContainsException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ControlException.php create mode 100644 vendor/workerman/validation/library/Exceptions/CountableException.php create mode 100644 vendor/workerman/validation/library/Exceptions/CountryCodeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/CpfException.php create mode 100644 vendor/workerman/validation/library/Exceptions/CreditCardException.php create mode 100644 vendor/workerman/validation/library/Exceptions/CurrencyCodeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/DateException.php create mode 100644 vendor/workerman/validation/library/Exceptions/DateTimeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/DigitException.php create mode 100644 vendor/workerman/validation/library/Exceptions/DirectoryException.php create mode 100644 vendor/workerman/validation/library/Exceptions/DomainException.php create mode 100644 vendor/workerman/validation/library/Exceptions/EachException.php create mode 100644 vendor/workerman/validation/library/Exceptions/EmailException.php create mode 100644 vendor/workerman/validation/library/Exceptions/EndsWithException.php create mode 100644 vendor/workerman/validation/library/Exceptions/EqualsException.php create mode 100644 vendor/workerman/validation/library/Exceptions/EquivalentException.php create mode 100644 vendor/workerman/validation/library/Exceptions/EvenException.php create mode 100644 vendor/workerman/validation/library/Exceptions/Exception.php create mode 100644 vendor/workerman/validation/library/Exceptions/ExecutableException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ExistsException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ExtensionException.php create mode 100644 vendor/workerman/validation/library/Exceptions/FactorException.php create mode 100644 vendor/workerman/validation/library/Exceptions/FalseValException.php create mode 100644 vendor/workerman/validation/library/Exceptions/FibonacciException.php create mode 100644 vendor/workerman/validation/library/Exceptions/FileException.php create mode 100644 vendor/workerman/validation/library/Exceptions/FilterVarException.php create mode 100644 vendor/workerman/validation/library/Exceptions/FilteredValidationException.php create mode 100644 vendor/workerman/validation/library/Exceptions/FiniteException.php create mode 100644 vendor/workerman/validation/library/Exceptions/FloatTypeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/FloatValException.php create mode 100644 vendor/workerman/validation/library/Exceptions/GraphException.php create mode 100644 vendor/workerman/validation/library/Exceptions/GreaterThanException.php create mode 100644 vendor/workerman/validation/library/Exceptions/GroupedValidationException.php create mode 100644 vendor/workerman/validation/library/Exceptions/HexRgbColorException.php create mode 100644 vendor/workerman/validation/library/Exceptions/IbanException.php create mode 100644 vendor/workerman/validation/library/Exceptions/IdenticalException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ImageException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ImeiException.php create mode 100644 vendor/workerman/validation/library/Exceptions/InException.php create mode 100644 vendor/workerman/validation/library/Exceptions/InfiniteException.php create mode 100644 vendor/workerman/validation/library/Exceptions/InstanceException.php create mode 100644 vendor/workerman/validation/library/Exceptions/IntTypeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/IntValException.php create mode 100644 vendor/workerman/validation/library/Exceptions/InvalidClassException.php create mode 100644 vendor/workerman/validation/library/Exceptions/IpException.php create mode 100644 vendor/workerman/validation/library/Exceptions/IsbnException.php create mode 100644 vendor/workerman/validation/library/Exceptions/IterableTypeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/JsonException.php create mode 100644 vendor/workerman/validation/library/Exceptions/KeyException.php create mode 100644 vendor/workerman/validation/library/Exceptions/KeyNestedException.php create mode 100644 vendor/workerman/validation/library/Exceptions/KeySetException.php create mode 100644 vendor/workerman/validation/library/Exceptions/KeyValueException.php create mode 100644 vendor/workerman/validation/library/Exceptions/LanguageCodeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/LeapDateException.php create mode 100644 vendor/workerman/validation/library/Exceptions/LeapYearException.php create mode 100644 vendor/workerman/validation/library/Exceptions/LengthException.php create mode 100644 vendor/workerman/validation/library/Exceptions/LessThanException.php create mode 100644 vendor/workerman/validation/library/Exceptions/LowercaseException.php create mode 100644 vendor/workerman/validation/library/Exceptions/LuhnException.php create mode 100644 vendor/workerman/validation/library/Exceptions/MacAddressException.php create mode 100644 vendor/workerman/validation/library/Exceptions/MaxAgeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/MaxException.php create mode 100644 vendor/workerman/validation/library/Exceptions/MimetypeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/MinAgeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/MinException.php create mode 100644 vendor/workerman/validation/library/Exceptions/MultipleException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NegativeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NestedValidationException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NfeAccessKeyException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NifException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NipException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NoException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NoWhitespaceException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NonOmissibleException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NoneOfException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NotBlankException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NotEmojiException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NotEmptyException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NotException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NotOptionalException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NullTypeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NullableException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NumberException.php create mode 100644 vendor/workerman/validation/library/Exceptions/NumericValException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ObjectTypeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/OddException.php create mode 100644 vendor/workerman/validation/library/Exceptions/OneOfException.php create mode 100644 vendor/workerman/validation/library/Exceptions/OptionalException.php create mode 100644 vendor/workerman/validation/library/Exceptions/PerfectSquareException.php create mode 100644 vendor/workerman/validation/library/Exceptions/PeselException.php create mode 100644 vendor/workerman/validation/library/Exceptions/PhoneException.php create mode 100644 vendor/workerman/validation/library/Exceptions/PhpLabelException.php create mode 100644 vendor/workerman/validation/library/Exceptions/PisException.php create mode 100644 vendor/workerman/validation/library/Exceptions/PolishIdCardException.php create mode 100644 vendor/workerman/validation/library/Exceptions/PositiveException.php create mode 100644 vendor/workerman/validation/library/Exceptions/PostalCodeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/PrimeNumberException.php create mode 100644 vendor/workerman/validation/library/Exceptions/PrintableException.php create mode 100644 vendor/workerman/validation/library/Exceptions/PunctException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ReadableException.php create mode 100644 vendor/workerman/validation/library/Exceptions/RecursiveExceptionIterator.php create mode 100644 vendor/workerman/validation/library/Exceptions/RegexException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ResourceTypeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/RomanException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ScalarValException.php create mode 100644 vendor/workerman/validation/library/Exceptions/SfException.php create mode 100644 vendor/workerman/validation/library/Exceptions/SizeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/SlugException.php create mode 100644 vendor/workerman/validation/library/Exceptions/SortedException.php create mode 100644 vendor/workerman/validation/library/Exceptions/SpaceException.php create mode 100644 vendor/workerman/validation/library/Exceptions/StartsWithException.php create mode 100644 vendor/workerman/validation/library/Exceptions/StringTypeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/StringValException.php create mode 100644 vendor/workerman/validation/library/Exceptions/SubdivisionCodeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/SubsetException.php create mode 100644 vendor/workerman/validation/library/Exceptions/SymbolicLinkException.php create mode 100644 vendor/workerman/validation/library/Exceptions/TimeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/TldException.php create mode 100644 vendor/workerman/validation/library/Exceptions/TrueValException.php create mode 100644 vendor/workerman/validation/library/Exceptions/TypeException.php create mode 100644 vendor/workerman/validation/library/Exceptions/UniqueException.php create mode 100644 vendor/workerman/validation/library/Exceptions/UploadedException.php create mode 100644 vendor/workerman/validation/library/Exceptions/UppercaseException.php create mode 100644 vendor/workerman/validation/library/Exceptions/UrlException.php create mode 100644 vendor/workerman/validation/library/Exceptions/UuidException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ValidationException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ValidatorException.php create mode 100644 vendor/workerman/validation/library/Exceptions/VersionException.php create mode 100644 vendor/workerman/validation/library/Exceptions/VideoUrlException.php create mode 100644 vendor/workerman/validation/library/Exceptions/VowelException.php create mode 100644 vendor/workerman/validation/library/Exceptions/WhenException.php create mode 100644 vendor/workerman/validation/library/Exceptions/WritableException.php create mode 100644 vendor/workerman/validation/library/Exceptions/XdigitException.php create mode 100644 vendor/workerman/validation/library/Exceptions/YesException.php create mode 100644 vendor/workerman/validation/library/Exceptions/ZendException.php create mode 100644 vendor/workerman/validation/library/Factory.php create mode 100644 vendor/workerman/validation/library/Helpers/CanCompareValues.php create mode 100644 vendor/workerman/validation/library/Helpers/CanValidateDateTime.php create mode 100644 vendor/workerman/validation/library/Helpers/CanValidateIterable.php create mode 100644 vendor/workerman/validation/library/Helpers/CanValidateUndefined.php create mode 100644 vendor/workerman/validation/library/Helpers/Subdivisions.php create mode 100644 vendor/workerman/validation/library/Message/Formatter.php create mode 100644 vendor/workerman/validation/library/Message/ParameterStringifier.php create mode 100644 vendor/workerman/validation/library/Message/Stringifier/KeepOriginalStringName.php create mode 100644 vendor/workerman/validation/library/Rules/AbstractAge.php create mode 100644 vendor/workerman/validation/library/Rules/AbstractComparison.php create mode 100644 vendor/workerman/validation/library/Rules/AbstractComposite.php create mode 100644 vendor/workerman/validation/library/Rules/AbstractEnvelope.php create mode 100644 vendor/workerman/validation/library/Rules/AbstractFilterRule.php create mode 100644 vendor/workerman/validation/library/Rules/AbstractRelated.php create mode 100644 vendor/workerman/validation/library/Rules/AbstractRule.php create mode 100644 vendor/workerman/validation/library/Rules/AbstractSearcher.php create mode 100644 vendor/workerman/validation/library/Rules/AbstractWrapper.php create mode 100644 vendor/workerman/validation/library/Rules/AllOf.php create mode 100644 vendor/workerman/validation/library/Rules/Alnum.php create mode 100644 vendor/workerman/validation/library/Rules/Alpha.php create mode 100644 vendor/workerman/validation/library/Rules/AlwaysInvalid.php create mode 100644 vendor/workerman/validation/library/Rules/AlwaysValid.php create mode 100644 vendor/workerman/validation/library/Rules/AnyOf.php create mode 100644 vendor/workerman/validation/library/Rules/ArrayType.php create mode 100644 vendor/workerman/validation/library/Rules/ArrayVal.php create mode 100644 vendor/workerman/validation/library/Rules/Attribute.php create mode 100644 vendor/workerman/validation/library/Rules/Base.php create mode 100644 vendor/workerman/validation/library/Rules/Base64.php create mode 100644 vendor/workerman/validation/library/Rules/Between.php create mode 100644 vendor/workerman/validation/library/Rules/BoolType.php create mode 100644 vendor/workerman/validation/library/Rules/BoolVal.php create mode 100644 vendor/workerman/validation/library/Rules/Bsn.php create mode 100644 vendor/workerman/validation/library/Rules/Call.php create mode 100644 vendor/workerman/validation/library/Rules/CallableType.php create mode 100644 vendor/workerman/validation/library/Rules/Callback.php create mode 100644 vendor/workerman/validation/library/Rules/Charset.php create mode 100644 vendor/workerman/validation/library/Rules/Cnh.php create mode 100644 vendor/workerman/validation/library/Rules/Cnpj.php create mode 100644 vendor/workerman/validation/library/Rules/Consonant.php create mode 100644 vendor/workerman/validation/library/Rules/Contains.php create mode 100644 vendor/workerman/validation/library/Rules/ContainsAny.php create mode 100644 vendor/workerman/validation/library/Rules/Control.php create mode 100644 vendor/workerman/validation/library/Rules/Countable.php create mode 100644 vendor/workerman/validation/library/Rules/CountryCode.php create mode 100644 vendor/workerman/validation/library/Rules/Cpf.php create mode 100644 vendor/workerman/validation/library/Rules/CreditCard.php create mode 100644 vendor/workerman/validation/library/Rules/CurrencyCode.php create mode 100644 vendor/workerman/validation/library/Rules/Date.php create mode 100644 vendor/workerman/validation/library/Rules/DateTime.php create mode 100644 vendor/workerman/validation/library/Rules/Digit.php create mode 100644 vendor/workerman/validation/library/Rules/Directory.php create mode 100644 vendor/workerman/validation/library/Rules/Domain.php create mode 100644 vendor/workerman/validation/library/Rules/Each.php create mode 100644 vendor/workerman/validation/library/Rules/Email.php create mode 100644 vendor/workerman/validation/library/Rules/EndsWith.php create mode 100644 vendor/workerman/validation/library/Rules/Equals.php create mode 100644 vendor/workerman/validation/library/Rules/Equivalent.php create mode 100644 vendor/workerman/validation/library/Rules/Even.php create mode 100644 vendor/workerman/validation/library/Rules/Executable.php create mode 100644 vendor/workerman/validation/library/Rules/Exists.php create mode 100644 vendor/workerman/validation/library/Rules/Extension.php create mode 100644 vendor/workerman/validation/library/Rules/Factor.php create mode 100644 vendor/workerman/validation/library/Rules/FalseVal.php create mode 100644 vendor/workerman/validation/library/Rules/Fibonacci.php create mode 100644 vendor/workerman/validation/library/Rules/File.php create mode 100644 vendor/workerman/validation/library/Rules/FilterVar.php create mode 100644 vendor/workerman/validation/library/Rules/Finite.php create mode 100644 vendor/workerman/validation/library/Rules/FloatType.php create mode 100644 vendor/workerman/validation/library/Rules/FloatVal.php create mode 100644 vendor/workerman/validation/library/Rules/Graph.php create mode 100644 vendor/workerman/validation/library/Rules/GreaterThan.php create mode 100644 vendor/workerman/validation/library/Rules/HexRgbColor.php create mode 100644 vendor/workerman/validation/library/Rules/Iban.php create mode 100644 vendor/workerman/validation/library/Rules/Identical.php create mode 100644 vendor/workerman/validation/library/Rules/Image.php create mode 100644 vendor/workerman/validation/library/Rules/Imei.php create mode 100644 vendor/workerman/validation/library/Rules/In.php create mode 100644 vendor/workerman/validation/library/Rules/Infinite.php create mode 100644 vendor/workerman/validation/library/Rules/Instance.php create mode 100644 vendor/workerman/validation/library/Rules/IntType.php create mode 100644 vendor/workerman/validation/library/Rules/IntVal.php create mode 100644 vendor/workerman/validation/library/Rules/Ip.php create mode 100644 vendor/workerman/validation/library/Rules/Isbn.php create mode 100644 vendor/workerman/validation/library/Rules/IterableType.php create mode 100644 vendor/workerman/validation/library/Rules/Json.php create mode 100644 vendor/workerman/validation/library/Rules/Key.php create mode 100644 vendor/workerman/validation/library/Rules/KeyNested.php create mode 100644 vendor/workerman/validation/library/Rules/KeySet.php create mode 100644 vendor/workerman/validation/library/Rules/KeyValue.php create mode 100644 vendor/workerman/validation/library/Rules/LanguageCode.php create mode 100644 vendor/workerman/validation/library/Rules/LeapDate.php create mode 100644 vendor/workerman/validation/library/Rules/LeapYear.php create mode 100644 vendor/workerman/validation/library/Rules/Length.php create mode 100644 vendor/workerman/validation/library/Rules/LessThan.php create mode 100644 vendor/workerman/validation/library/Rules/Lowercase.php create mode 100644 vendor/workerman/validation/library/Rules/Luhn.php create mode 100644 vendor/workerman/validation/library/Rules/MacAddress.php create mode 100644 vendor/workerman/validation/library/Rules/Max.php create mode 100644 vendor/workerman/validation/library/Rules/MaxAge.php create mode 100644 vendor/workerman/validation/library/Rules/Mimetype.php create mode 100644 vendor/workerman/validation/library/Rules/Min.php create mode 100644 vendor/workerman/validation/library/Rules/MinAge.php create mode 100644 vendor/workerman/validation/library/Rules/Multiple.php create mode 100644 vendor/workerman/validation/library/Rules/Negative.php create mode 100644 vendor/workerman/validation/library/Rules/NfeAccessKey.php create mode 100644 vendor/workerman/validation/library/Rules/Nif.php create mode 100644 vendor/workerman/validation/library/Rules/Nip.php create mode 100644 vendor/workerman/validation/library/Rules/No.php create mode 100644 vendor/workerman/validation/library/Rules/NoWhitespace.php create mode 100644 vendor/workerman/validation/library/Rules/NoneOf.php create mode 100644 vendor/workerman/validation/library/Rules/Not.php create mode 100644 vendor/workerman/validation/library/Rules/NotBlank.php create mode 100644 vendor/workerman/validation/library/Rules/NotEmoji.php create mode 100644 vendor/workerman/validation/library/Rules/NotEmpty.php create mode 100644 vendor/workerman/validation/library/Rules/NotOptional.php create mode 100644 vendor/workerman/validation/library/Rules/NullType.php create mode 100644 vendor/workerman/validation/library/Rules/Nullable.php create mode 100644 vendor/workerman/validation/library/Rules/Number.php create mode 100644 vendor/workerman/validation/library/Rules/NumericVal.php create mode 100644 vendor/workerman/validation/library/Rules/ObjectType.php create mode 100644 vendor/workerman/validation/library/Rules/Odd.php create mode 100644 vendor/workerman/validation/library/Rules/OneOf.php create mode 100644 vendor/workerman/validation/library/Rules/Optional.php create mode 100644 vendor/workerman/validation/library/Rules/PerfectSquare.php create mode 100644 vendor/workerman/validation/library/Rules/Pesel.php create mode 100644 vendor/workerman/validation/library/Rules/Phone.php create mode 100644 vendor/workerman/validation/library/Rules/PhpLabel.php create mode 100644 vendor/workerman/validation/library/Rules/Pis.php create mode 100644 vendor/workerman/validation/library/Rules/PolishIdCard.php create mode 100644 vendor/workerman/validation/library/Rules/Positive.php create mode 100644 vendor/workerman/validation/library/Rules/PostalCode.php create mode 100644 vendor/workerman/validation/library/Rules/PrimeNumber.php create mode 100644 vendor/workerman/validation/library/Rules/Printable.php create mode 100644 vendor/workerman/validation/library/Rules/Punct.php create mode 100644 vendor/workerman/validation/library/Rules/Readable.php create mode 100644 vendor/workerman/validation/library/Rules/Regex.php create mode 100644 vendor/workerman/validation/library/Rules/ResourceType.php create mode 100644 vendor/workerman/validation/library/Rules/Roman.php create mode 100644 vendor/workerman/validation/library/Rules/ScalarVal.php create mode 100644 vendor/workerman/validation/library/Rules/Sf.php create mode 100644 vendor/workerman/validation/library/Rules/Size.php create mode 100644 vendor/workerman/validation/library/Rules/Slug.php create mode 100644 vendor/workerman/validation/library/Rules/Sorted.php create mode 100644 vendor/workerman/validation/library/Rules/Space.php create mode 100644 vendor/workerman/validation/library/Rules/StartsWith.php create mode 100644 vendor/workerman/validation/library/Rules/StringType.php create mode 100644 vendor/workerman/validation/library/Rules/StringVal.php create mode 100644 vendor/workerman/validation/library/Rules/SubdivisionCode.php create mode 100644 vendor/workerman/validation/library/Rules/Subset.php create mode 100644 vendor/workerman/validation/library/Rules/SymbolicLink.php create mode 100644 vendor/workerman/validation/library/Rules/Time.php create mode 100644 vendor/workerman/validation/library/Rules/Tld.php create mode 100644 vendor/workerman/validation/library/Rules/TrueVal.php create mode 100644 vendor/workerman/validation/library/Rules/Type.php create mode 100644 vendor/workerman/validation/library/Rules/Unique.php create mode 100644 vendor/workerman/validation/library/Rules/Uploaded.php create mode 100644 vendor/workerman/validation/library/Rules/Uppercase.php create mode 100644 vendor/workerman/validation/library/Rules/Url.php create mode 100644 vendor/workerman/validation/library/Rules/Uuid.php create mode 100644 vendor/workerman/validation/library/Rules/Version.php create mode 100644 vendor/workerman/validation/library/Rules/VideoUrl.php create mode 100644 vendor/workerman/validation/library/Rules/Vowel.php create mode 100644 vendor/workerman/validation/library/Rules/When.php create mode 100644 vendor/workerman/validation/library/Rules/Writable.php create mode 100644 vendor/workerman/validation/library/Rules/Xdigit.php create mode 100644 vendor/workerman/validation/library/Rules/Yes.php create mode 100644 vendor/workerman/validation/library/Rules/Zend.php create mode 100644 vendor/workerman/validation/library/Validatable.php create mode 100644 vendor/workerman/validation/library/Validator.php create mode 100644 vendor/workerman/webman-framework/.gitignore create mode 100644 vendor/workerman/webman-framework/README.md create mode 100644 vendor/workerman/webman-framework/composer.json create mode 100644 vendor/workerman/webman-framework/src/App.php create mode 100644 vendor/workerman/webman-framework/src/Bootstrap.php create mode 100644 vendor/workerman/webman-framework/src/Config.php create mode 100644 vendor/workerman/webman-framework/src/Container.php create mode 100644 vendor/workerman/webman-framework/src/Exception/ExceptionHandler.php create mode 100644 vendor/workerman/webman-framework/src/Exception/ExceptionHandlerInterface.php create mode 100644 vendor/workerman/webman-framework/src/Exception/FileException.php create mode 100644 vendor/workerman/webman-framework/src/Exception/NotFoundException.php create mode 100644 vendor/workerman/webman-framework/src/File.php create mode 100644 vendor/workerman/webman-framework/src/FileSessionHandler.php create mode 100644 vendor/workerman/webman-framework/src/Http/Request.php create mode 100644 vendor/workerman/webman-framework/src/Http/Response.php create mode 100644 vendor/workerman/webman-framework/src/Http/UploadFile.php create mode 100644 vendor/workerman/webman-framework/src/Install.php create mode 100644 vendor/workerman/webman-framework/src/Middleware.php create mode 100644 vendor/workerman/webman-framework/src/MiddlewareInterface.php create mode 100644 vendor/workerman/webman-framework/src/Route.php create mode 100644 vendor/workerman/webman-framework/src/Route/Route.php create mode 100644 vendor/workerman/webman-framework/src/Session/FileSessionHandler.php create mode 100644 vendor/workerman/webman-framework/src/Session/RedisClusterSessionHandler.php create mode 100644 vendor/workerman/webman-framework/src/Session/RedisSessionHandler.php create mode 100644 vendor/workerman/webman-framework/src/Util.php create mode 100644 vendor/workerman/webman-framework/src/View.php create mode 100644 vendor/workerman/webman-framework/src/support/App.php create mode 100644 vendor/workerman/webman-framework/src/support/Cache.php create mode 100644 vendor/workerman/webman-framework/src/support/Container.php create mode 100644 vendor/workerman/webman-framework/src/support/Db.php create mode 100644 vendor/workerman/webman-framework/src/support/Log.php create mode 100644 vendor/workerman/webman-framework/src/support/Model.php create mode 100644 vendor/workerman/webman-framework/src/support/Plugin.php create mode 100644 vendor/workerman/webman-framework/src/support/Redis.php create mode 100644 vendor/workerman/webman-framework/src/support/Request.php create mode 100644 vendor/workerman/webman-framework/src/support/Response.php create mode 100644 vendor/workerman/webman-framework/src/support/Translation.php create mode 100644 vendor/workerman/webman-framework/src/support/View.php create mode 100644 vendor/workerman/webman-framework/src/support/bootstrap/LaravelDb.php create mode 100644 vendor/workerman/webman-framework/src/support/bootstrap/Session.php create mode 100644 vendor/workerman/webman-framework/src/support/exception/BusinessException.php create mode 100644 vendor/workerman/webman-framework/src/support/exception/Handler.php create mode 100644 vendor/workerman/webman-framework/src/support/view/Blade.php create mode 100644 vendor/workerman/webman-framework/src/support/view/Raw.php create mode 100644 vendor/workerman/webman-framework/src/support/view/ThinkPHP.php create mode 100644 vendor/workerman/webman-framework/src/support/view/Twig.php create mode 100644 vendor/workerman/workerman/.github/FUNDING.yml create mode 100644 vendor/workerman/workerman/.gitignore create mode 100644 vendor/workerman/workerman/Autoloader.php create mode 100644 vendor/workerman/workerman/Connection/AsyncTcpConnection.php create mode 100644 vendor/workerman/workerman/Connection/AsyncUdpConnection.php create mode 100644 vendor/workerman/workerman/Connection/ConnectionInterface.php create mode 100644 vendor/workerman/workerman/Connection/TcpConnection.php create mode 100644 vendor/workerman/workerman/Connection/UdpConnection.php create mode 100644 vendor/workerman/workerman/Events/Ev.php create mode 100644 vendor/workerman/workerman/Events/Event.php create mode 100644 vendor/workerman/workerman/Events/EventInterface.php create mode 100644 vendor/workerman/workerman/Events/Libevent.php create mode 100644 vendor/workerman/workerman/Events/React/Base.php create mode 100644 vendor/workerman/workerman/Events/React/ExtEventLoop.php create mode 100644 vendor/workerman/workerman/Events/React/ExtLibEventLoop.php create mode 100644 vendor/workerman/workerman/Events/React/StreamSelectLoop.php create mode 100644 vendor/workerman/workerman/Events/Select.php create mode 100644 vendor/workerman/workerman/Events/Swoole.php create mode 100644 vendor/workerman/workerman/Events/Uv.php create mode 100644 vendor/workerman/workerman/Lib/Constants.php create mode 100644 vendor/workerman/workerman/Lib/Timer.php create mode 100644 vendor/workerman/workerman/MIT-LICENSE.txt create mode 100644 vendor/workerman/workerman/Protocols/Frame.php create mode 100644 vendor/workerman/workerman/Protocols/Http.php create mode 100644 vendor/workerman/workerman/Protocols/Http/Chunk.php create mode 100644 vendor/workerman/workerman/Protocols/Http/Request.php create mode 100644 vendor/workerman/workerman/Protocols/Http/Response.php create mode 100644 vendor/workerman/workerman/Protocols/Http/ServerSentEvents.php create mode 100644 vendor/workerman/workerman/Protocols/Http/Session.php create mode 100644 vendor/workerman/workerman/Protocols/Http/Session/FileSessionHandler.php create mode 100644 vendor/workerman/workerman/Protocols/Http/Session/RedisClusterSessionHandler.php create mode 100644 vendor/workerman/workerman/Protocols/Http/Session/RedisSessionHandler.php create mode 100644 vendor/workerman/workerman/Protocols/Http/Session/SessionHandlerInterface.php create mode 100644 vendor/workerman/workerman/Protocols/Http/mime.types create mode 100644 vendor/workerman/workerman/Protocols/ProtocolInterface.php create mode 100644 vendor/workerman/workerman/Protocols/Text.php create mode 100644 vendor/workerman/workerman/Protocols/Websocket.php create mode 100644 vendor/workerman/workerman/Protocols/Ws.php create mode 100644 vendor/workerman/workerman/README.md create mode 100644 vendor/workerman/workerman/Timer.php create mode 100644 vendor/workerman/workerman/Worker.php create mode 100644 vendor/workerman/workerman/composer.json create mode 100644 vendor/yzh52521/easyhttp/LICENSE create mode 100644 vendor/yzh52521/easyhttp/README.md create mode 100644 vendor/yzh52521/easyhttp/composer.json create mode 100644 vendor/yzh52521/easyhttp/src/ConnectionException.php create mode 100755 vendor/yzh52521/easyhttp/src/Facade.php create mode 100644 vendor/yzh52521/easyhttp/src/Http.php create mode 100644 vendor/yzh52521/easyhttp/src/Logger.php create mode 100644 vendor/yzh52521/easyhttp/src/Request.php create mode 100644 vendor/yzh52521/easyhttp/src/RequestException.php create mode 100644 vendor/yzh52521/easyhttp/src/Response.php create mode 100644 vendor/yzh52521/easyhttp/src/Retry.php create mode 100644 vendor/yzh52521/webman-throttle/.gitignore create mode 100644 vendor/yzh52521/webman-throttle/README.md create mode 100644 vendor/yzh52521/webman-throttle/composer.json create mode 100644 vendor/yzh52521/webman-throttle/src/Install.php create mode 100644 vendor/yzh52521/webman-throttle/src/Throttle.php create mode 100644 vendor/yzh52521/webman-throttle/src/config/plugin/yzh52521/throttle/app.php create mode 100644 vendor/yzh52521/webman-throttle/src/middleware.tpl create mode 100644 vendor/yzh52521/webman-throttle/src/throttle/CounterFixed.php create mode 100644 vendor/yzh52521/webman-throttle/src/throttle/CounterSlider.php create mode 100644 vendor/yzh52521/webman-throttle/src/throttle/LeakyBucket.php create mode 100644 vendor/yzh52521/webman-throttle/src/throttle/ThrottleAbstract.php create mode 100644 vendor/yzh52521/webman-throttle/src/throttle/TokenBucket.php create mode 100644 windows.bat create mode 100644 windows.php diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..63cf76e --- /dev/null +++ b/.env.example @@ -0,0 +1,23 @@ +proxy= +#Tor的Socks5代理 + +RedisHost= +#Redis主机名 + +RedisPassword= +#Redis密码 + +RedisPort=6379 +#Redis端口 + +RedisDatabase=1 +#Redis数据库号 + +ZlibraryLogin=loginzlib2vrak5zzpcocc3ouizykn6k5qecgj2tzlnab5wcbqhembyd.onion +#除非Zlib的洋葱域名改变否则无需更改 + +Zlibrary=bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion +#除非Zlib的洋葱域名改变否则无需更改 + +version=1.0.1 +#无需更改 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2eea525 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/.history/.env_20230101172316 b/.history/.env_20230101172316 new file mode 100644 index 0000000..e69de29 diff --git a/.history/.env_20230101172348 b/.history/.env_20230101172348 new file mode 100644 index 0000000..9d49f06 --- /dev/null +++ b/.history/.env_20230101172348 @@ -0,0 +1 @@ +proxy = 45.150.224.46:19100 \ No newline at end of file diff --git a/.history/.env_20230101173049 b/.history/.env_20230101173049 new file mode 100644 index 0000000..95b8119 --- /dev/null +++ b/.history/.env_20230101173049 @@ -0,0 +1 @@ +proxy = 10.1.5.2:19100 \ No newline at end of file diff --git a/.history/.env_20230101181726 b/.history/.env_20230101181726 new file mode 100644 index 0000000..4d71776 --- /dev/null +++ b/.history/.env_20230101181726 @@ -0,0 +1,5 @@ +proxy = 10.1.5.2:19100 +redis.host = 121.228.166.201 +redis.password = qi2005112 +redis.port = 16379 +redis.database = 17 \ No newline at end of file diff --git a/.history/.env_20230101182453 b/.history/.env_20230101182453 new file mode 100644 index 0000000..6bb6837 --- /dev/null +++ b/.history/.env_20230101182453 @@ -0,0 +1,5 @@ +proxy = 10.1.5.2:19100 +redis.host = 121.228.166.201 +redis.password = Qi2005112! +redis.port = 16379 +redis.database = 17 \ No newline at end of file diff --git a/.history/.env_20230101182642 b/.history/.env_20230101182642 new file mode 100644 index 0000000..4e27d42 --- /dev/null +++ b/.history/.env_20230101182642 @@ -0,0 +1,5 @@ +proxy = 10.1.5.2:19100 +redis.host = 121.228.166.201 +redispassword = Qi2005112! +redis.port = 16379 +redis.database = 17 \ No newline at end of file diff --git a/.history/.env_20230101182748 b/.history/.env_20230101182748 new file mode 100644 index 0000000..f417c89 --- /dev/null +++ b/.history/.env_20230101182748 @@ -0,0 +1,5 @@ +proxy=10.1.5.2:19100 +RedisHost=121.228.166.201 +RedisPassword=Qi2005112! +RedisPort=16379 +RedisDatabase=17 \ No newline at end of file diff --git a/.history/.env_20230101191643 b/.history/.env_20230101191643 new file mode 100644 index 0000000..6eee5bd --- /dev/null +++ b/.history/.env_20230101191643 @@ -0,0 +1,7 @@ +proxy=10.1.5.2:19100 +RedisHost=121.228.166.201 +RedisPassword=Qi2005112! +RedisPort=16379 +RedisDatabase=17 +ZlibraryLogin=http://loginzlib2vrak5zzpcocc3ouizykn6k5qecgj2tzlnab5wcbqhembyd.onion/ +Zlibrary=http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/ \ No newline at end of file diff --git a/.history/.env_20230101203601 b/.history/.env_20230101203601 new file mode 100644 index 0000000..d8ca361 --- /dev/null +++ b/.history/.env_20230101203601 @@ -0,0 +1,8 @@ +proxy=10.1.5.2:19100 +RedisHost=121.228.166.201 +RedisPassword=Qi2005112! +RedisPort=16379 +RedisDatabase=17 +ZlibraryLogin=http://loginzlib2vrak5zzpcocc3ouizykn6k5qecgj2tzlnab5wcbqhembyd.onion/ +Zlibrary=http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/ +version=1.0.1 \ No newline at end of file diff --git a/.history/.env_20230101205534 b/.history/.env_20230101205534 new file mode 100644 index 0000000..a430489 --- /dev/null +++ b/.history/.env_20230101205534 @@ -0,0 +1,8 @@ +proxy=10.1.5.2:19100 +RedisHost=121.228.166.201 +RedisPassword=Qi2005112! +RedisPort=16379 +RedisDatabase=17 +ZlibraryLogin=http://loginzlib2vrak5zzpcocc3ouizykn6k5qecgj2tzlnab5wcbqhembyd.onion +Zlibrary=http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion +version=1.0.1 \ No newline at end of file diff --git a/.history/.env_20230101210425 b/.history/.env_20230101210425 new file mode 100644 index 0000000..0294260 --- /dev/null +++ b/.history/.env_20230101210425 @@ -0,0 +1,8 @@ +proxy=10.1.5.2:19100 +RedisHost=121.228.166.201 +RedisPassword=Qi2005112! +RedisPort=16379 +RedisDatabase=17 +ZlibraryLogin=loginzlib2vrak5zzpcocc3ouizykn6k5qecgj2tzlnab5wcbqhembyd.onion +Zlibrary=bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion +version=1.0.1 \ No newline at end of file diff --git a/.history/.env_20230101220200 b/.history/.env_20230101220200 new file mode 100644 index 0000000..59bd9cd --- /dev/null +++ b/.history/.env_20230101220200 @@ -0,0 +1,8 @@ +proxy=10.1.5.2:19100 +RedisHost=121.228.166.201 +RedisPassword=Qi2005112! +RedisPort=16379 +RedisDatabase=17 +ZlibraryLogin=loginzlib2vrak5zzpcocc3ouizykn6k5qecgj2tzlnab5wcbqhembyd.onion +Zlibrary=bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/ +version=1.0.1 \ No newline at end of file diff --git a/.history/.env_20230101220201 b/.history/.env_20230101220201 new file mode 100644 index 0000000..0294260 --- /dev/null +++ b/.history/.env_20230101220201 @@ -0,0 +1,8 @@ +proxy=10.1.5.2:19100 +RedisHost=121.228.166.201 +RedisPassword=Qi2005112! +RedisPort=16379 +RedisDatabase=17 +ZlibraryLogin=loginzlib2vrak5zzpcocc3ouizykn6k5qecgj2tzlnab5wcbqhembyd.onion +Zlibrary=bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion +version=1.0.1 \ No newline at end of file diff --git a/.history/.env_20230101231839.example b/.history/.env_20230101231839.example new file mode 100644 index 0000000..e69de29 diff --git a/.history/.env_20230101231841.example b/.history/.env_20230101231841.example new file mode 100644 index 0000000..593161e --- /dev/null +++ b/.history/.env_20230101231841.example @@ -0,0 +1,15 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + diff --git a/.history/.env_20230101232035.example b/.history/.env_20230101232035.example new file mode 100644 index 0000000..63cf76e --- /dev/null +++ b/.history/.env_20230101232035.example @@ -0,0 +1,23 @@ +proxy= +#Tor的Socks5代理 + +RedisHost= +#Redis主机名 + +RedisPassword= +#Redis密码 + +RedisPort=6379 +#Redis端口 + +RedisDatabase=1 +#Redis数据库号 + +ZlibraryLogin=loginzlib2vrak5zzpcocc3ouizykn6k5qecgj2tzlnab5wcbqhembyd.onion +#除非Zlib的洋葱域名改变否则无需更改 + +Zlibrary=bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion +#除非Zlib的洋葱域名改变否则无需更改 + +version=1.0.1 +#无需更改 \ No newline at end of file diff --git a/.history/.gitignore_20230101172312 b/.history/.gitignore_20230101172312 new file mode 100644 index 0000000..e69de29 diff --git a/.history/.gitignore_20230101172323 b/.history/.gitignore_20230101172323 new file mode 100644 index 0000000..2eea525 --- /dev/null +++ b/.history/.gitignore_20230101172323 @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/.history/app/controller/File_20230102143247.php b/.history/app/controller/File_20230102143247.php new file mode 100644 index 0000000..e69de29 diff --git a/.history/app/controller/File_20230102143249.php b/.history/app/controller/File_20230102143249.php new file mode 100644 index 0000000..593161e --- /dev/null +++ b/.history/app/controller/File_20230102143249.php @@ -0,0 +1,15 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + diff --git a/.history/app/controller/File_20230102143332.php b/.history/app/controller/File_20230102143332.php new file mode 100644 index 0000000..b1aa211 --- /dev/null +++ b/.history/app/controller/File_20230102143332.php @@ -0,0 +1,17 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + if($path=='blank'){ + return json(['code'=>500,'msg'=>'缺少参数']); + } + $name=base64_encode($path); + + $file=base_path().'/books/'.$name.'bin' + if(file_exists($file)){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>trans_byte(filesize($file))]); + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102154544.php b/.history/app/controller/File_20230102154544.php new file mode 100644 index 0000000..ff74311 --- /dev/null +++ b/.history/app/controller/File_20230102154544.php @@ -0,0 +1,36 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + if($path=='blank'){ + return json(['code'=>500,'msg'=>'缺少参数']); + } + $name=base64_encode($path); + + $file=base_path().'/books/'.$name.'bin'; + if(file_exists($file)){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>trans_byte(filesize($file))]); + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102165530.php b/.history/app/controller/File_20230102165530.php new file mode 100644 index 0000000..795aa82 --- /dev/null +++ b/.history/app/controller/File_20230102165530.php @@ -0,0 +1,56 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + if($path=='blank'){ + return json(['code'=>500,'msg'=>'缺少参数']); + } + $name=base64_encode($path); + + $file=base_path().'/books/'.$name.'bin'; + if(file_exists($file)){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>trans_byte(filesize($file))]); + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $head=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=40){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102170445.php b/.history/app/controller/File_20230102170445.php new file mode 100644 index 0000000..6819b74 --- /dev/null +++ b/.history/app/controller/File_20230102170445.php @@ -0,0 +1,56 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + if($path=='blank'){ + return json(['code'=>500,'msg'=>'缺少参数']); + } + $name=base64_encode($path); + + $file=base_path().'/books/'.$name.'bin'; + if(file_exists($file)){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>trans_byte(filesize($file))]); + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $head=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102171742.php b/.history/app/controller/File_20230102171742.php new file mode 100644 index 0000000..63c00ea --- /dev/null +++ b/.history/app/controller/File_20230102171742.php @@ -0,0 +1,64 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + if($path=='blank'){ + return json(['code'=>500,'msg'=>'缺少参数']); + } + $name=base64_encode($path); + + $file=base_path().'/books/'.$name.'bin'; + if(file_exists($file)){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>trans_byte(filesize($file))]); + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')) + $head=$get->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $redis->hset('BookCache_'.base64_encode($path),'Time',time()); + $redis->hset('BookCache_'.base64_encode($path),'Date',date("Y/m/d H:i:s")); + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + $filepath=base_path().'/books/'.date("Y/m/").$name.'bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102171809.php b/.history/app/controller/File_20230102171809.php new file mode 100644 index 0000000..ec3874e --- /dev/null +++ b/.history/app/controller/File_20230102171809.php @@ -0,0 +1,64 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + if($path=='blank'){ + return json(['code'=>500,'msg'=>'缺少参数']); + } + $name=base64_encode($path); + + $file=base_path().'/books/'.$name.'bin'; + if(file_exists($file)){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>trans_byte(filesize($file))]); + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $redis->hset('BookCache_'.base64_encode($path),'Time',time()); + $redis->hset('BookCache_'.base64_encode($path),'Date',date("Y/m/d H:i:s")); + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + $filepath=base_path().'/books/'.date("Y/m/").$name.'bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102171818.php b/.history/app/controller/File_20230102171818.php new file mode 100644 index 0000000..a2e608f --- /dev/null +++ b/.history/app/controller/File_20230102171818.php @@ -0,0 +1,65 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + if($path=='blank'){ + return json(['code'=>500,'msg'=>'缺少参数']); + } + $name=base64_encode($path); + + $file=base_path().'/books/'.$name.'bin'; + if(file_exists($file)){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>trans_byte(filesize($file))]); + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $redis->hset('BookCache_'.base64_encode($path),'Time',time()); + $redis->hset('BookCache_'.base64_encode($path),'Date',date("Y/m/d H:i:s")); + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + $filepath=base_path().'/books/'.date("Y/m/").$name.'bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102172707.php b/.history/app/controller/File_20230102172707.php new file mode 100644 index 0000000..032cb04 --- /dev/null +++ b/.history/app/controller/File_20230102172707.php @@ -0,0 +1,72 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + if($path=='blank'){ + return json(['code'=>500,'msg'=>'缺少参数']); + } + $name=base64_encode($path); + + $file=base_path().'/books/'.$name.'bin'; + if(file_exists($file)){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>trans_byte(filesize($file))]); + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + $name=base64_encode($path); + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $redis->hset('BookCache_'.$name,'Path',$filepath); + return json(['code'=>200]); + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102172825.php b/.history/app/controller/File_20230102172825.php new file mode 100644 index 0000000..176c691 --- /dev/null +++ b/.history/app/controller/File_20230102172825.php @@ -0,0 +1,74 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + if($path=='blank'){ + return json(['code'=>500,'msg'=>'缺少参数']); + } + $name=base64_encode($path); + + $file=base_path().'/books/'.$name.'bin'; + if(file_exists($file)){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>trans_byte(filesize($file))]); + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + $name=base64_encode($path); + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200]); + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102172833.php b/.history/app/controller/File_20230102172833.php new file mode 100644 index 0000000..04238bb --- /dev/null +++ b/.history/app/controller/File_20230102172833.php @@ -0,0 +1,75 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + if($path=='blank'){ + return json(['code'=>500,'msg'=>'缺少参数']); + } + $name=base64_encode($path); + + $file=base_path().'/books/'.$name.'bin'; + if(file_exists($file)){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>trans_byte(filesize($file))]); + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + $name=base64_encode($path); + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200]); + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102173122.php b/.history/app/controller/File_20230102173122.php new file mode 100644 index 0000000..e180cb2 --- /dev/null +++ b/.history/app/controller/File_20230102173122.php @@ -0,0 +1,79 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + if($path=='blank'){ + return json(['code'=>500,'msg'=>'缺少参数']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + $file=base_path().'/books/'.$name.'bin'; + if($redis->exist('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']) + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + $name=base64_encode($path); + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200]); + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102173124.php b/.history/app/controller/File_20230102173124.php new file mode 100644 index 0000000..3fd3a7d --- /dev/null +++ b/.history/app/controller/File_20230102173124.php @@ -0,0 +1,79 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + if($path=='blank'){ + return json(['code'=>500,'msg'=>'缺少参数']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + $file=base_path().'/books/'.$name.'bin'; + if($redis->exist('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + $name=base64_encode($path); + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200]); + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102173125.php b/.history/app/controller/File_20230102173125.php new file mode 100644 index 0000000..be1fc42 --- /dev/null +++ b/.history/app/controller/File_20230102173125.php @@ -0,0 +1,79 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + if($path=='blank'){ + return json(['code'=>500,'msg'=>'缺少参数']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + $file=base_path().'/books/'.$name.'bin'; + if($redis->exist('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录']); + } + $path=$request->input('path','blank'); + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + $name=base64_encode($path); + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200]); + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102173220.php b/.history/app/controller/File_20230102173220.php new file mode 100644 index 0000000..f09898c --- /dev/null +++ b/.history/app/controller/File_20230102173220.php @@ -0,0 +1,82 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + $file=base_path().'/books/'.$name.'bin'; + if($redis->exist('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + $name=base64_encode($path); + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200]); + } + public function download(Request $request) + { + + + + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102173627.php b/.history/app/controller/File_20230102173627.php new file mode 100644 index 0000000..42a2301 --- /dev/null +++ b/.history/app/controller/File_20230102173627.php @@ -0,0 +1,97 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + if($redis->exist('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200]); + } + public function get(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + if($redis->exist('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return response()->download($redis->hget('BookCache_'.$name,'Path')); + }else{ + return json(['code'=>202,'msg'=>'文件仍在下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102174259.php b/.history/app/controller/File_20230102174259.php new file mode 100644 index 0000000..5ae6157 --- /dev/null +++ b/.history/app/controller/File_20230102174259.php @@ -0,0 +1,99 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + if($redis->exist('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $filerealname=explode('"',explode(";",$head->header('Content-Disposition'))[1])[1]; + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Name',$filerealname); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200]); + } + public function get(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + if($redis->exist('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return response()->download($redis->hget('BookCache_'.$name,'Path'),); + }else{ + return json(['code'=>202,'msg'=>'文件仍在下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102174312.php b/.history/app/controller/File_20230102174312.php new file mode 100644 index 0000000..218c033 --- /dev/null +++ b/.history/app/controller/File_20230102174312.php @@ -0,0 +1,99 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + if($redis->exist('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $filerealname=explode('"',explode(";",$head->header('Content-Disposition'))[1])[1]; + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Name',$filerealname); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200]); + } + public function get(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + if($redis->exist('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return response()->download($redis->hget('BookCache_'.$name,'Path'),$redis->hget('BookCache_'.$name,'Name')); + }else{ + return json(['code'=>202,'msg'=>'文件仍在下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102182057.php b/.history/app/controller/File_20230102182057.php new file mode 100644 index 0000000..acca18c --- /dev/null +++ b/.history/app/controller/File_20230102182057.php @@ -0,0 +1,99 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + if($redis->exist('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size'),'name'=>$redis->hget('BookCache_'.$name,'Name')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $filerealname=explode('"',explode(";",$head->header('Content-Disposition'))[1])[1]; + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Name',$filerealname); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200]); + } + public function get(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + if($redis->exist('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return response()->download($redis->hget('BookCache_'.$name,'Path'),$redis->hget('BookCache_'.$name,'Name')); + }else{ + return json(['code'=>202,'msg'=>'文件仍在下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102183433.php b/.history/app/controller/File_20230102183433.php new file mode 100644 index 0000000..a939255 --- /dev/null +++ b/.history/app/controller/File_20230102183433.php @@ -0,0 +1,99 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + if($redis->exist('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size'),'name'=>$redis->hget('BookCache_'.$name,'Name')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $filerealname=explode('"',explode(";",$head->header('Content-Disposition'))[1])[1]; + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Name',$filerealname); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200,'name'=>"$filerealname",'size'=>"$size"]); + } + public function get(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + if($redis->exist('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return response()->download($redis->hget('BookCache_'.$name,'Path'),$redis->hget('BookCache_'.$name,'Name')); + }else{ + return json(['code'=>202,'msg'=>'文件仍在下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102184127.php b/.history/app/controller/File_20230102184127.php new file mode 100644 index 0000000..70017c1 --- /dev/null +++ b/.history/app/controller/File_20230102184127.php @@ -0,0 +1,99 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size'),'name'=>$redis->hget('BookCache_'.$name,'Name')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $filerealname=explode('"',explode(";",$head->header('Content-Disposition'))[1])[1]; + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Name',$filerealname); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200,'name'=>"$filerealname",'size'=>"$size"]); + } + public function get(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return response()->download($redis->hget('BookCache_'.$name,'Path'),$redis->hget('BookCache_'.$name,'Name')); + }else{ + return json(['code'=>202,'msg'=>'文件仍在下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102184835.php b/.history/app/controller/File_20230102184835.php new file mode 100644 index 0000000..e23761b --- /dev/null +++ b/.history/app/controller/File_20230102184835.php @@ -0,0 +1,100 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size'),'name'=>$redis->hget('BookCache_'.$name,'Name')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $size=round(($head->header('Content-Length')/1048576),2); + echo($size); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $filerealname=explode('"',explode(";",$head->header('Content-Disposition'))[1])[1]; + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Name',$filerealname); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200,'name'=>"$filerealname",'size'=>"$size"]); + } + public function get(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return response()->download($redis->hget('BookCache_'.$name,'Path'),$redis->hget('BookCache_'.$name,'Name')); + }else{ + return json(['code'=>202,'msg'=>'文件仍在下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102185014.php b/.history/app/controller/File_20230102185014.php new file mode 100644 index 0000000..fb69aca --- /dev/null +++ b/.history/app/controller/File_20230102185014.php @@ -0,0 +1,100 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size'),'name'=>$redis->hget('BookCache_'.$name,'Name')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $size=round((number_format($head->header('Content-Length'))/1048576),2); + echo($size); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $filerealname=explode('"',explode(";",$head->header('Content-Disposition'))[1])[1]; + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Name',$filerealname); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200,'name'=>"$filerealname",'size'=>"$size"]); + } + public function get(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return response()->download($redis->hget('BookCache_'.$name,'Path'),$redis->hget('BookCache_'.$name,'Name')); + }else{ + return json(['code'=>202,'msg'=>'文件仍在下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102185148.php b/.history/app/controller/File_20230102185148.php new file mode 100644 index 0000000..29f58df --- /dev/null +++ b/.history/app/controller/File_20230102185148.php @@ -0,0 +1,101 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size'),'name'=>$redis->hget('BookCache_'.$name,'Name')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $ContentLength=(int)$head->header('Content-Length'); + $size=round(($ContentLength/1048576),2); + echo($size); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $filerealname=explode('"',explode(";",$head->header('Content-Disposition'))[1])[1]; + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Name',$filerealname); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200,'name'=>"$filerealname",'size'=>"$size"]); + } + public function get(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return response()->download($redis->hget('BookCache_'.$name,'Path'),$redis->hget('BookCache_'.$name,'Name')); + }else{ + return json(['code'=>202,'msg'=>'文件仍在下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102185322.php b/.history/app/controller/File_20230102185322.php new file mode 100644 index 0000000..4beb65a --- /dev/null +++ b/.history/app/controller/File_20230102185322.php @@ -0,0 +1,101 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size'),'name'=>$redis->hget('BookCache_'.$name,'Name')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url=getenv('Zlibrary')."$path"; + echo($url); + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $ContentLength=(int)$head->header('Content-Length'); + $size=round(($ContentLength/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $filerealname=explode('"',explode(";",$head->header('Content-Disposition'))[1])[1]; + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Name',$filerealname); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200,'name'=>"$filerealname",'size'=>"$size"]); + } + public function get(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return response()->download($redis->hget('BookCache_'.$name,'Path'),$redis->hget('BookCache_'.$name,'Name')); + }else{ + return json(['code'=>202,'msg'=>'文件仍在下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102185353.php b/.history/app/controller/File_20230102185353.php new file mode 100644 index 0000000..3b651b4 --- /dev/null +++ b/.history/app/controller/File_20230102185353.php @@ -0,0 +1,101 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size'),'name'=>$redis->hget('BookCache_'.$name,'Name')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url='http://'.getenv('Zlibrary')."$path"; + echo($url); + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $ContentLength=(int)$head->header('Content-Length'); + $size=round(($ContentLength/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $filerealname=explode('"',explode(";",$head->header('Content-Disposition'))[1])[1]; + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Name',$filerealname); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200,'name'=>"$filerealname",'size'=>"$size"]); + } + public function get(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return response()->download($redis->hget('BookCache_'.$name,'Path'),$redis->hget('BookCache_'.$name,'Name')); + }else{ + return json(['code'=>202,'msg'=>'文件仍在下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102185511.php b/.history/app/controller/File_20230102185511.php new file mode 100644 index 0000000..b80049f --- /dev/null +++ b/.history/app/controller/File_20230102185511.php @@ -0,0 +1,100 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size'),'name'=>$redis->hget('BookCache_'.$name,'Name')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url='http://'.getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $ContentLength=(int)$head->header('Content-Length'); + $size=round(($ContentLength/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $filerealname=explode('"',explode(";",$head->header('Content-Disposition'))[1])[1]; + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Name',$filerealname); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200,'name'=>"$filerealname",'size'=>"$size"]); + } + public function get(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return response()->download($redis->hget('BookCache_'.$name,'Path'),$redis->hget('BookCache_'.$name,'Name')); + }else{ + return json(['code'=>202,'msg'=>'文件仍在下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102185714.php b/.history/app/controller/File_20230102185714.php new file mode 100644 index 0000000..a716058 --- /dev/null +++ b/.history/app/controller/File_20230102185714.php @@ -0,0 +1,100 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size'),'name'=>$redis->hget('BookCache_'.$name,'Name')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url='http://'.getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $ContentLength=(int)$head->header('Content-Length'); + $size=round(($ContentLength/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url)->body(); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $filerealname=explode('"',explode(";",$head->header('Content-Disposition'))[1])[1]; + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Name',$filerealname); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200,'name'=>"$filerealname",'size'=>"$size"]); + } + public function get(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return response()->download($redis->hget('BookCache_'.$name,'Path'),$redis->hget('BookCache_'.$name,'Name')); + }else{ + return json(['code'=>202,'msg'=>'文件仍在下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + + } + + +} \ No newline at end of file diff --git a/.history/app/controller/File_20230102190051.php b/.history/app/controller/File_20230102190051.php new file mode 100644 index 0000000..2f4777d --- /dev/null +++ b/.history/app/controller/File_20230102190051.php @@ -0,0 +1,101 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size'),'name'=>$redis->hget('BookCache_'.$name,'Name')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url='http://'.getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $ContentLength=(int)$head->header('Content-Length'); + $size=round(($ContentLength/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url)->body(); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $filerealname=explode('"',explode(";",$head->header('Content-Disposition'))[1])[1]; + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Name',$filerealname); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200,'name'=>"$filerealname",'size'=>"$size"]); + } + public function get(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + $redis->hset('BookCache_'.$name,'LastDown',time()); + return response()->download($redis->hget('BookCache_'.$name,'Path'),$redis->hget('BookCache_'.$name,'Name')); + }else{ + return json(['code'=>202,'msg'=>'文件仍在下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + + } + + +} \ No newline at end of file diff --git a/.history/app/controller/IndexController_20221212162407.php b/.history/app/controller/IndexController_20221212162407.php new file mode 100644 index 0000000..31e1c43 --- /dev/null +++ b/.history/app/controller/IndexController_20221212162407.php @@ -0,0 +1,24 @@ + 'webman']); + } + + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101173342.php b/.history/app/controller/IndexController_20230101173342.php new file mode 100644 index 0000000..24c3cb6 --- /dev/null +++ b/.history/app/controller/IndexController_20230101173342.php @@ -0,0 +1,24 @@ + 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101182420.php b/.history/app/controller/IndexController_20230101182420.php new file mode 100644 index 0000000..e29adc8 --- /dev/null +++ b/.history/app/controller/IndexController_20230101182420.php @@ -0,0 +1,28 @@ + 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101183521.php b/.history/app/controller/IndexController_20230101183521.php new file mode 100644 index 0000000..9fdbe0b --- /dev/null +++ b/.history/app/controller/IndexController_20230101183521.php @@ -0,0 +1,40 @@ +build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101183610.php b/.history/app/controller/IndexController_20230101183610.php new file mode 100644 index 0000000..4053b29 --- /dev/null +++ b/.history/app/controller/IndexController_20230101183610.php @@ -0,0 +1,41 @@ +build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101184256.php b/.history/app/controller/IndexController_20230101184256.php new file mode 100644 index 0000000..da161cd --- /dev/null +++ b/.history/app/controller/IndexController_20230101184256.php @@ -0,0 +1,42 @@ +build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101190155.php b/.history/app/controller/IndexController_20230101190155.php new file mode 100644 index 0000000..a1249be --- /dev/null +++ b/.history/app/controller/IndexController_20230101190155.php @@ -0,0 +1,73 @@ +post('username','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + return view('login'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101192447.php b/.history/app/controller/IndexController_20230101192447.php new file mode 100644 index 0000000..264683e --- /dev/null +++ b/.history/app/controller/IndexController_20230101192447.php @@ -0,0 +1,82 @@ +post('username','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url=getenv('ZlibraryLogin').'rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + print_r($return); + + return view('login'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101192731.php b/.history/app/controller/IndexController_20230101192731.php new file mode 100644 index 0000000..ac15164 --- /dev/null +++ b/.history/app/controller/IndexController_20230101192731.php @@ -0,0 +1,82 @@ +post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url=getenv('ZlibraryLogin').'rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + print_r($return); + + return view('login'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101192934.php b/.history/app/controller/IndexController_20230101192934.php new file mode 100644 index 0000000..b76a1ee --- /dev/null +++ b/.history/app/controller/IndexController_20230101192934.php @@ -0,0 +1,85 @@ +post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url=getenv('ZlibraryLogin').'rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + print_r($return); + if(!empty($return->errors)){ + return json(['code' => 502, 'msg' => '登陆失败:']); + } + + return view('login'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101193243.php b/.history/app/controller/IndexController_20230101193243.php new file mode 100644 index 0000000..791f593 --- /dev/null +++ b/.history/app/controller/IndexController_20230101193243.php @@ -0,0 +1,85 @@ +post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url=getenv('ZlibraryLogin').'rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + print_r($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + + return view('login'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101194651.php b/.history/app/controller/IndexController_20230101194651.php new file mode 100644 index 0000000..1dfc16c --- /dev/null +++ b/.history/app/controller/IndexController_20230101194651.php @@ -0,0 +1,94 @@ +post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url=getenv('ZlibraryLogin').'rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + print_r($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],7200,'/')->cookie('key', $params['remix_userkey'],7200,'/'); + + return view('login'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101194656.php b/.history/app/controller/IndexController_20230101194656.php new file mode 100644 index 0000000..83842fb --- /dev/null +++ b/.history/app/controller/IndexController_20230101194656.php @@ -0,0 +1,92 @@ +post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url=getenv('ZlibraryLogin').'rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + print_r($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],7200,'/')->cookie('key', $params['remix_userkey'],7200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101194904.php b/.history/app/controller/IndexController_20230101194904.php new file mode 100644 index 0000000..d8febbf --- /dev/null +++ b/.history/app/controller/IndexController_20230101194904.php @@ -0,0 +1,92 @@ +post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url=getenv('ZlibraryLogin').'rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + print_r($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101202315.php b/.history/app/controller/IndexController_20230101202315.php new file mode 100644 index 0000000..75c4d6c --- /dev/null +++ b/.history/app/controller/IndexController_20230101202315.php @@ -0,0 +1,96 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($id=='blank' || $key='blank'){ + return redirect('/login'); + } + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url=getenv('ZlibraryLogin').'rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + print_r($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101203357.php b/.history/app/controller/IndexController_20230101203357.php new file mode 100644 index 0000000..3b18c1b --- /dev/null +++ b/.history/app/controller/IndexController_20230101203357.php @@ -0,0 +1,95 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($id=='blank' || $key='blank'){ + return redirect('/login'); + } + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url=getenv('ZlibraryLogin').'rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101205503.php b/.history/app/controller/IndexController_20230101205503.php new file mode 100644 index 0000000..8c225b3 --- /dev/null +++ b/.history/app/controller/IndexController_20230101205503.php @@ -0,0 +1,96 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $route=$request->get('route','/') + if($id=='blank' || $key='blank'){ + return redirect('/login'); + } + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url=getenv('ZlibraryLogin').'rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101205507.php b/.history/app/controller/IndexController_20230101205507.php new file mode 100644 index 0000000..958c68a --- /dev/null +++ b/.history/app/controller/IndexController_20230101205507.php @@ -0,0 +1,96 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $route=$request->get('route','') + if($id=='blank' || $key='blank'){ + return redirect('/login'); + } + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url=getenv('ZlibraryLogin').'rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101205513.php b/.history/app/controller/IndexController_20230101205513.php new file mode 100644 index 0000000..3562201 --- /dev/null +++ b/.history/app/controller/IndexController_20230101205513.php @@ -0,0 +1,93 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $route=$request->get('route',''); + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url=getenv('ZlibraryLogin').'rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101205522.php b/.history/app/controller/IndexController_20230101205522.php new file mode 100644 index 0000000..454ab0f --- /dev/null +++ b/.history/app/controller/IndexController_20230101205522.php @@ -0,0 +1,93 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $route=$request->get('route','/'); + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url=getenv('ZlibraryLogin').'rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101205548.php b/.history/app/controller/IndexController_20230101205548.php new file mode 100644 index 0000000..94b53ff --- /dev/null +++ b/.history/app/controller/IndexController_20230101205548.php @@ -0,0 +1,93 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $route=$request->get('route','/'); + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url=getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101210439.php b/.history/app/controller/IndexController_20230101210439.php new file mode 100644 index 0000000..2835907 --- /dev/null +++ b/.history/app/controller/IndexController_20230101210439.php @@ -0,0 +1,97 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $route=$request->route; + $path=$route->getPath(); + $url='http://'.getenv('ZlibraryLogin').$path; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->get($url) + + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url=getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101210449.php b/.history/app/controller/IndexController_20230101210449.php new file mode 100644 index 0000000..2d6a0d0 --- /dev/null +++ b/.history/app/controller/IndexController_20230101210449.php @@ -0,0 +1,97 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $route=$request->route; + $path=$route->getPath(); + $url='http://'.getenv('ZlibraryLogin').$path; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->get($url) + + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101210659.php b/.history/app/controller/IndexController_20230101210659.php new file mode 100644 index 0000000..49218ca --- /dev/null +++ b/.history/app/controller/IndexController_20230101210659.php @@ -0,0 +1,98 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $route=$request->route; + $path=$route->getPath(); + $url='http://'.getenv('ZlibraryLogin').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh'); + $response = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,'.'.getenv('ZlibraryLogin'))->get($url); + + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101215122.php b/.history/app/controller/IndexController_20230101215122.php new file mode 100644 index 0000000..30091cc --- /dev/null +++ b/.history/app/controller/IndexController_20230101215122.php @@ -0,0 +1,107 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $route=$request->route; + $path=$route->getPath(); + $url='http://'.getenv('ZlibraryLogin').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,'.'.getenv('ZlibraryLogin'))->get($url); + $response->withHeaders($return->headers()); + + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($return->body()); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101215326.php b/.history/app/controller/IndexController_20230101215326.php new file mode 100644 index 0000000..65a31ed --- /dev/null +++ b/.history/app/controller/IndexController_20230101215326.php @@ -0,0 +1,110 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $route=$request->route; + print_r($route); + return response('123'); + + $path=$route->getPath(); + $url='http://'.getenv('ZlibraryLogin').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,'.'.getenv('ZlibraryLogin'))->get($url); + $response->withHeaders($return->headers()); + + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($return->body()); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101215401.php b/.history/app/controller/IndexController_20230101215401.php new file mode 100644 index 0000000..bfea132 --- /dev/null +++ b/.history/app/controller/IndexController_20230101215401.php @@ -0,0 +1,110 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $route=$request->path(); + print_r($route); + return response('123'); + + $path=$route->getPath(); + $url='http://'.getenv('ZlibraryLogin').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,'.'.getenv('ZlibraryLogin'))->get($url); + $response->withHeaders($return->headers()); + + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($return->body()); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101215431.php b/.history/app/controller/IndexController_20230101215431.php new file mode 100644 index 0000000..96203aa --- /dev/null +++ b/.history/app/controller/IndexController_20230101215431.php @@ -0,0 +1,110 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $route=$request->uri(); + print_r($route); + return response('123'); + + $path=$route->getPath(); + $url='http://'.getenv('ZlibraryLogin').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,'.'.getenv('ZlibraryLogin'))->get($url); + $response->withHeaders($return->headers()); + + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($return->body()); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101215457.php b/.history/app/controller/IndexController_20230101215457.php new file mode 100644 index 0000000..1386c93 --- /dev/null +++ b/.history/app/controller/IndexController_20230101215457.php @@ -0,0 +1,106 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + $url='http://'.getenv('ZlibraryLogin').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,'.'.getenv('ZlibraryLogin'))->get($url); + $response->withHeaders($return->headers()); + + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($return->body()); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101215743.php b/.history/app/controller/IndexController_20230101215743.php new file mode 100644 index 0000000..562a297 --- /dev/null +++ b/.history/app/controller/IndexController_20230101215743.php @@ -0,0 +1,106 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,'.'.getenv('ZlibraryLogin'))->get($url); + $response->withHeaders($return->headers()); + + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($return->body()); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101220103.php b/.history/app/controller/IndexController_20230101220103.php new file mode 100644 index 0000000..22de6d3 --- /dev/null +++ b/.history/app/controller/IndexController_20230101220103.php @@ -0,0 +1,109 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,'.'.getenv('ZlibraryLogin'))->get($url); + $response->withHeaders($return->headers()); + + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($return->body()); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101220342.php b/.history/app/controller/IndexController_20230101220342.php new file mode 100644 index 0000000..193cb6e --- /dev/null +++ b/.history/app/controller/IndexController_20230101220342.php @@ -0,0 +1,109 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,'.'.getenv('ZlibraryLogin'))->get($url); + $response->withHeaders($return->headers()); + + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($return->body()); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101220540.php b/.history/app/controller/IndexController_20230101220540.php new file mode 100644 index 0000000..32e94ca --- /dev/null +++ b/.history/app/controller/IndexController_20230101220540.php @@ -0,0 +1,109 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,'.'.$request->host();)->get($url); + $response->withHeaders($return->headers()); + + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($return->body()); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101220542.php b/.history/app/controller/IndexController_20230101220542.php new file mode 100644 index 0000000..6cf499a --- /dev/null +++ b/.history/app/controller/IndexController_20230101220542.php @@ -0,0 +1,109 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,'.'.$request->host())->get($url); + $response->withHeaders($return->headers()); + + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($return->body()); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101221211.php b/.history/app/controller/IndexController_20230101221211.php new file mode 100644 index 0000000..8aa5ad5 --- /dev/null +++ b/.history/app/controller/IndexController_20230101221211.php @@ -0,0 +1,110 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + echo($url); + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,'.'.$request->host())->get($url); + $response->withHeaders($return->headers()); + + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($return->body()); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101221246.php b/.history/app/controller/IndexController_20230101221246.php new file mode 100644 index 0000000..648c1d2 --- /dev/null +++ b/.history/app/controller/IndexController_20230101221246.php @@ -0,0 +1,110 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + echo($url); + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,'.'.getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($return->body()); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101221441.php b/.history/app/controller/IndexController_20230101221441.php new file mode 100644 index 0000000..3c3d7cf --- /dev/null +++ b/.history/app/controller/IndexController_20230101221441.php @@ -0,0 +1,109 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->withCookies($auth,getenv('ZlibraryLogin'))->get($url); + $response->withHeaders($return->headers()); + + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($return->body()); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101221736.php b/.history/app/controller/IndexController_20230101221736.php new file mode 100644 index 0000000..c65e103 --- /dev/null +++ b/.history/app/controller/IndexController_20230101221736.php @@ -0,0 +1,109 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($return->body()); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101222759.php b/.history/app/controller/IndexController_20230101222759.php new file mode 100644 index 0000000..8f515e5 --- /dev/null +++ b/.history/app/controller/IndexController_20230101222759.php @@ -0,0 +1,112 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + if($return->header('Content-Type')=='text/html; charset=utf-8'){ + $back='
退出
'.$back; + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101222959.php b/.history/app/controller/IndexController_20230101222959.php new file mode 100644 index 0000000..03c180d --- /dev/null +++ b/.history/app/controller/IndexController_20230101222959.php @@ -0,0 +1,112 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + if($return->header('Content-Type')=='text/html; charset=utf-8'){ + $back='
退出
'.$back; + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101223138.php b/.history/app/controller/IndexController_20230101223138.php new file mode 100644 index 0000000..c7c860c --- /dev/null +++ b/.history/app/controller/IndexController_20230101223138.php @@ -0,0 +1,113 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + if($return->header('Content-Type')=='text/html; charset=utf-8'){ + $back='
退出
'.$back; + echo($back); + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101223213.php b/.history/app/controller/IndexController_20230101223213.php new file mode 100644 index 0000000..85486fa --- /dev/null +++ b/.history/app/controller/IndexController_20230101223213.php @@ -0,0 +1,114 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=utf-8'){ + $back='
退出
'.$back; + echo($back); + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101223238.php b/.history/app/controller/IndexController_20230101223238.php new file mode 100644 index 0000000..8f47a22 --- /dev/null +++ b/.history/app/controller/IndexController_20230101223238.php @@ -0,0 +1,114 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $back='
退出
'.$back; + echo($back); + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101224226.php b/.history/app/controller/IndexController_20230101224226.php new file mode 100644 index 0000000..99d11a9 --- /dev/null +++ b/.history/app/controller/IndexController_20230101224226.php @@ -0,0 +1,123 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] +
+
+EOF; + $back=$front.$back; + echo($back); + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101224323.php b/.history/app/controller/IndexController_20230101224323.php new file mode 100644 index 0000000..925a515 --- /dev/null +++ b/.history/app/controller/IndexController_20230101224323.php @@ -0,0 +1,123 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] +
+
+EOF; + $back=$front.$back; + echo($back); + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101224742.php b/.history/app/controller/IndexController_20230101224742.php new file mode 100644 index 0000000..7a77c82 --- /dev/null +++ b/.history/app/controller/IndexController_20230101224742.php @@ -0,0 +1,123 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] +
+
+EOF; + $back=$front.$back; + echo($back); + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101224840.php b/.history/app/controller/IndexController_20230101224840.php new file mode 100644 index 0000000..fbd7936 --- /dev/null +++ b/.history/app/controller/IndexController_20230101224840.php @@ -0,0 +1,123 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] +
+
+EOF; + $back=$front.$back; + echo($back); + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101225029.php b/.history/app/controller/IndexController_20230101225029.php new file mode 100644 index 0000000..c7d74ef --- /dev/null +++ b/.history/app/controller/IndexController_20230101225029.php @@ -0,0 +1,123 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + echo($back); + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function json(Request $request) + { + return json(['code' => 0, 'msg' => 'ok']); + } + +} diff --git a/.history/app/controller/IndexController_20230101230759.php b/.history/app/controller/IndexController_20230101230759.php new file mode 100644 index 0000000..da26684 --- /dev/null +++ b/.history/app/controller/IndexController_20230101230759.php @@ -0,0 +1,127 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + echo($back); + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id', -1); + $response->cookie('key', -1); + $response->header('Location', '/login'); + return $response; + } + +} diff --git a/.history/app/controller/IndexController_20230101230912.php b/.history/app/controller/IndexController_20230101230912.php new file mode 100644 index 0000000..835cf33 --- /dev/null +++ b/.history/app/controller/IndexController_20230101230912.php @@ -0,0 +1,128 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + echo($back); + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id', -1); + $response->cookie('key', -1); + $response->header('Location', '/login'); + $response->withBody('302'); + return $response; + } + +} diff --git a/.history/app/controller/IndexController_20230101231109.php b/.history/app/controller/IndexController_20230101231109.php new file mode 100644 index 0000000..dca8e15 --- /dev/null +++ b/.history/app/controller/IndexController_20230101231109.php @@ -0,0 +1,128 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + echo($back); + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id', -1); + $response->cookie('key', -1); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + +} diff --git a/.history/app/controller/IndexController_20230101231128.php b/.history/app/controller/IndexController_20230101231128.php new file mode 100644 index 0000000..42d7bbe --- /dev/null +++ b/.history/app/controller/IndexController_20230101231128.php @@ -0,0 +1,128 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + echo($back); + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id','', -1); + $response->cookie('key','', -1); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + +} diff --git a/.history/app/controller/IndexController_20230101231501.php b/.history/app/controller/IndexController_20230101231501.php new file mode 100644 index 0000000..65edd91 --- /dev/null +++ b/.history/app/controller/IndexController_20230101231501.php @@ -0,0 +1,128 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + echo($back); + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id','0', -999); + $response->cookie('key','0', -999); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + +} diff --git a/.history/app/controller/IndexController_20230101231532.php b/.history/app/controller/IndexController_20230101231532.php new file mode 100644 index 0000000..a8ea6c1 --- /dev/null +++ b/.history/app/controller/IndexController_20230101231532.php @@ -0,0 +1,128 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + echo($back); + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id','blank', 1); + $response->cookie('key','blank', 1); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + +} diff --git a/.history/app/controller/IndexController_20230101231609.php b/.history/app/controller/IndexController_20230101231609.php new file mode 100644 index 0000000..7c3e2fb --- /dev/null +++ b/.history/app/controller/IndexController_20230101231609.php @@ -0,0 +1,128 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + echo($back); + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id','blank', -1.'/'); + $response->cookie('key','blank', -1,'/'); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + +} diff --git a/.history/app/controller/IndexController_20230101231611.php b/.history/app/controller/IndexController_20230101231611.php new file mode 100644 index 0000000..7618d18 --- /dev/null +++ b/.history/app/controller/IndexController_20230101231611.php @@ -0,0 +1,128 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + echo($back); + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id','blank', -1,'/'); + $response->cookie('key','blank', -1,'/'); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + +} diff --git a/.history/app/controller/IndexController_20230101231630.php b/.history/app/controller/IndexController_20230101231630.php new file mode 100644 index 0000000..a89621b --- /dev/null +++ b/.history/app/controller/IndexController_20230101231630.php @@ -0,0 +1,128 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + echo($back); + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id','', -1,'/'); + $response->cookie('key','', -1,'/'); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + +} diff --git a/.history/app/controller/IndexController_20230101231812.php b/.history/app/controller/IndexController_20230101231812.php new file mode 100644 index 0000000..fb0488f --- /dev/null +++ b/.history/app/controller/IndexController_20230101231812.php @@ -0,0 +1,127 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id','', -1,'/'); + $response->cookie('key','', -1,'/'); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + +} diff --git a/.history/app/controller/IndexController_20230101232629.php b/.history/app/controller/IndexController_20230101232629.php new file mode 100644 index 0000000..9a80b07 --- /dev/null +++ b/.history/app/controller/IndexController_20230101232629.php @@ -0,0 +1,132 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + + + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id','', -1,'/'); + $response->cookie('key','', -1,'/'); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + +} diff --git a/.history/app/controller/IndexController_20230101233633.php b/.history/app/controller/IndexController_20230101233633.php new file mode 100644 index 0000000..808921d --- /dev/null +++ b/.history/app/controller/IndexController_20230101233633.php @@ -0,0 +1,134 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + if($redis->get($kf.$path)){ + $response->withHeaders(json_decode($redis->hget($rpath,'CT'))); + } + + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id','', -1,'/'); + $response->cookie('key','', -1,'/'); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + +} diff --git a/.history/app/controller/IndexController_20230101233658.php b/.history/app/controller/IndexController_20230101233658.php new file mode 100644 index 0000000..2aae8db --- /dev/null +++ b/.history/app/controller/IndexController_20230101233658.php @@ -0,0 +1,136 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + if($redis->get($kf.$path)){ + $response->withHeaders(json_decode($redis->hget($rpath,'CT'))); + $response->withBody($redis->hget($rpath,'body')); + return $response; + } + + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + $back=$return->body(); + echo($return->header('Content-Type')); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + } + /** + * if($return->header('Content-Type')[0]=='image/svg+xml'){ + + *} + */ + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id','', -1,'/'); + $response->cookie('key','', -1,'/'); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + +} diff --git a/.history/app/controller/IndexController_20230102115404.php b/.history/app/controller/IndexController_20230102115404.php new file mode 100644 index 0000000..2a73524 --- /dev/null +++ b/.history/app/controller/IndexController_20230102115404.php @@ -0,0 +1,142 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $rpath=$kf.url_encode("$path"); + if($redis->get($rpath)){ + $response->withHeaders(json_decode($redis->hget($rpath,'CT'))); + $response->withBody($redis->hget($rpath,'body')); + return $response; + } + + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + + $back=$return->body(); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + } + + /**Make Cache */ + if($path=='/resources/build/global.js?0.495' || $path=='/resources/build/global.css?0.495' || $path=='/resources/ext/freewall.js' || preg_match("/^image*/",$return->header('Content-Type')) ){ + $redis->hset($rpath,'CT',json_encode($return->headers())); + $redis->hset($rpath,'body',$back); + $redis->expire($rpath,43200); + } + + + + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id','', -1,'/'); + $response->cookie('key','', -1,'/'); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + +} diff --git a/.history/app/controller/IndexController_20230102115453.php b/.history/app/controller/IndexController_20230102115453.php new file mode 100644 index 0000000..a2be17b --- /dev/null +++ b/.history/app/controller/IndexController_20230102115453.php @@ -0,0 +1,142 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $rpath=$kf.urlencode("$path"); + if($redis->get($rpath)){ + $response->withHeaders(json_decode($redis->hget($rpath,'CT'))); + $response->withBody($redis->hget($rpath,'body')); + return $response; + } + + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + + $back=$return->body(); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + } + + /**Make Cache */ + if($path=='/resources/build/global.js?0.495' || $path=='/resources/build/global.css?0.495' || $path=='/resources/ext/freewall.js' || preg_match("/^image*/",$return->header('Content-Type')) ){ + $redis->hset($rpath,'CT',json_encode($return->headers())); + $redis->hset($rpath,'body',$back); + $redis->expire($rpath,43200); + } + + + + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id','', -1,'/'); + $response->cookie('key','', -1,'/'); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + +} diff --git a/.history/app/controller/IndexController_20230102115631.php b/.history/app/controller/IndexController_20230102115631.php new file mode 100644 index 0000000..3caef53 --- /dev/null +++ b/.history/app/controller/IndexController_20230102115631.php @@ -0,0 +1,147 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return redirect('/login'); + } + + + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $rpath=$kf.urlencode("$path"); + if($redis->get($rpath)){ + $response->withHeaders(json_decode($redis->hget($rpath,'CT'))); + $response->withBody($redis->hget($rpath,'body')); + return $response; + } + + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + + $back=$return->body(); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + } + + /**Make Cache */ + if($path=='/resources/build/global.js?0.495' || $path=='/resources/build/global.css?0.495' || $path=='/resources/ext/freewall.js' || preg_match("/^image*/",$return->header('Content-Type')) ){ + $redis->hset($rpath,'CT',json_encode($return->headers())); + $redis->hset($rpath,'body',$back); + $redis->expire($rpath,43200); + } + + + + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id','', -1,'/'); + $response->cookie('key','', -1,'/'); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + +} diff --git a/.history/app/controller/IndexController_20230102124339.php b/.history/app/controller/IndexController_20230102124339.php new file mode 100644 index 0000000..c658bb8 --- /dev/null +++ b/.history/app/controller/IndexController_20230102124339.php @@ -0,0 +1,153 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return redirect('/login'); + } + + + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $rpath=$kf.urlencode("$path"); + if($redis->get($rpath)){ + $response->withHeaders(json_decode($redis->hget($rpath,'CT'))); + $response->withBody($redis->hget($rpath,'body')); + return $response; + } + + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + + $back=$return->body(); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + } + + /**Make Cache */ + if($path=='/resources/build/global.js?0.495' || $path=='/resources/build/global.css?0.495' || $path=='/resources/ext/freewall.js' || preg_match("/^image*/",$return->header('Content-Type')) ){ + $redis->hset($rpath,'CT',json_encode($return->headers())); + $redis->hset($rpath,'body',$back); + $redis->expire($rpath,43200); + } + + + + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id','', -1,'/'); + $response->cookie('key','', -1,'/'); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + + public function download(Request $request) + { + + return view('index'); + } + +} diff --git a/.history/app/controller/IndexController_20230102124904.php b/.history/app/controller/IndexController_20230102124904.php new file mode 100644 index 0000000..1f1a437 --- /dev/null +++ b/.history/app/controller/IndexController_20230102124904.php @@ -0,0 +1,166 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return redirect('/login'); + } + + + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $rpath=$kf.urlencode("$path"); + if($redis->get($rpath)){ + $response->withHeaders(json_decode($redis->hget($rpath,'CT'))); + $response->withBody($redis->hget($rpath,'body')); + return $response; + } + + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + + $back=$return->body(); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + } + + /**Make Cache */ + if($path=='/resources/build/global.js?0.495' || $path=='/resources/build/global.css?0.495' || $path=='/resources/ext/freewall.js' || preg_match("/^image*/",$return->header('Content-Type')) ){ + $redis->hset($rpath,'CT',json_encode($return->headers())); + $redis->hset($rpath,'body',$back); + $redis->expire($rpath,43200); + } + + + + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id','', -1,'/'); + $response->cookie('key','', -1,'/'); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + + public function download(Request $request) + { + + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return redirect('/login'); + } + $path=$request->uri(); + View::assign([ + 'id' => $id, + 'key'=> $key, + 'path'=> $path, + ]); + return view('index'); + + } + +} diff --git a/.history/app/controller/IndexController_20230102142646.php b/.history/app/controller/IndexController_20230102142646.php new file mode 100644 index 0000000..d54f0ed --- /dev/null +++ b/.history/app/controller/IndexController_20230102142646.php @@ -0,0 +1,173 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return redirect('/login'); + } + + + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $rpath=$kf.urlencode("$path"); + if($redis->get($rpath)){ + $response->withHeaders(json_decode($redis->hget($rpath,'CT'))); + $response->withBody($redis->hget($rpath,'body')); + return $response; + } + + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + + $back=$return->body(); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + } + + /**Make Cache */ + if($path=='/resources/build/global.js?0.495' || $path=='/resources/build/global.css?0.495' || $path=='/resources/ext/freewall.js' || preg_match("/^image*/",$return->header('Content-Type')) ){ + $redis->hset($rpath,'CT',json_encode($return->headers())); + $redis->hset($rpath,'body',$back); + $redis->expire($rpath,43200); + } + + + + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id','', -1,'/'); + $response->cookie('key','', -1,'/'); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + + public function download(Request $request) + { + + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return redirect('/login'); + } + $path=$request->uri(); + View::assign([ + 'id' => $id, + 'key'=> $key, + 'path'=> $path, + ]); + return view('index'); + + } + + public function file(Request $request) + { + + return response()->file(base_path() . '/app/controller/IndexController.php'); + + } + +} diff --git a/.history/app/middleware/Login_20230101201400.php b/.history/app/middleware/Login_20230101201400.php new file mode 100644 index 0000000..e69de29 diff --git a/.history/app/middleware/Login_20230101201403.php b/.history/app/middleware/Login_20230101201403.php new file mode 100644 index 0000000..593161e --- /dev/null +++ b/.history/app/middleware/Login_20230101201403.php @@ -0,0 +1,15 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + diff --git a/.history/app/middleware/Login_20230101201416.php b/.history/app/middleware/Login_20230101201416.php new file mode 100644 index 0000000..2480bc4 --- /dev/null +++ b/.history/app/middleware/Login_20230101201416.php @@ -0,0 +1,21 @@ +session(); + // 用户未登录 + if (!$session->get('userinfo')) { + // 拦截请求,返回一个重定向响应,请求停止向洋葱芯穿越 + return redirect('/user/login'); + } + // 请求继续向洋葱芯穿越 + return $handler($request); + } +} \ No newline at end of file diff --git a/.history/app/middleware/Login_20230101201845.php b/.history/app/middleware/Login_20230101201845.php new file mode 100644 index 0000000..a720abb --- /dev/null +++ b/.history/app/middleware/Login_20230101201845.php @@ -0,0 +1,23 @@ +route->getPath(); + if(substr($route, 0, 6) != "/login"){ + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($id=='blank' || $key='blank'){ + return redirect('/login'); + } + } + // 请求继续向洋葱芯穿越 + return $handler($request); + } +} \ No newline at end of file diff --git a/.history/app/middleware/Login_20230101202102.php b/.history/app/middleware/Login_20230101202102.php new file mode 100644 index 0000000..52370cf --- /dev/null +++ b/.history/app/middleware/Login_20230101202102.php @@ -0,0 +1,24 @@ +route->getPath(); + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if(substr($route, 0, 6) != "/login"){ + if($id=='blank' || $key='blank'){ + return redirect('/login'); + } + } + $request->id=$id; + $request->key=$key; + return $handler($request); + } +} \ No newline at end of file diff --git a/.history/app/middleware/Login_20230101202206.php b/.history/app/middleware/Login_20230101202206.php new file mode 100644 index 0000000..7101c6d --- /dev/null +++ b/.history/app/middleware/Login_20230101202206.php @@ -0,0 +1,25 @@ +route->getPath(); + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + echo('open'); + if(substr($route, 0, 6) != "/login"){ + if($id=='blank' || $key='blank'){ + return redirect('/login'); + } + } + $request->id=$id; + $request->key=$key; + return $handler($request); + } +} \ No newline at end of file diff --git a/.history/app/view/index_20230101202946.html b/.history/app/view/index_20230101202946.html new file mode 100644 index 0000000..e69de29 diff --git a/.history/app/view/index_20230101202948.html b/.history/app/view/index_20230101202948.html new file mode 100644 index 0000000..a6fc30d --- /dev/null +++ b/.history/app/view/index_20230101202948.html @@ -0,0 +1,17 @@ + + diff --git a/.history/app/view/index_20230101203012.html b/.history/app/view/index_20230101203012.html new file mode 100644 index 0000000..38bf716 --- /dev/null +++ b/.history/app/view/index_20230101203012.html @@ -0,0 +1,33 @@ + + + diff --git a/.history/app/view/index_20230101203249.html b/.history/app/view/index_20230101203249.html new file mode 100644 index 0000000..2a7edb8 --- /dev/null +++ b/.history/app/view/index_20230101203249.html @@ -0,0 +1,79 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v1.0.0) +
+ + +
\ No newline at end of file diff --git a/.history/app/view/index_20230101203257.html b/.history/app/view/index_20230101203257.html new file mode 100644 index 0000000..04c51a3 --- /dev/null +++ b/.history/app/view/index_20230101203257.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v1.0.0) +
+ + +
+
+ + \ No newline at end of file diff --git a/.history/app/view/index_20230101203627.html b/.history/app/view/index_20230101203627.html new file mode 100644 index 0000000..a59fd30 --- /dev/null +++ b/.history/app/view/index_20230101203627.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) +
+ + +
+
+ + \ No newline at end of file diff --git a/.history/app/view/index_20230101203642.html b/.history/app/view/index_20230101203642.html new file mode 100644 index 0000000..a59fd30 --- /dev/null +++ b/.history/app/view/index_20230101203642.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) +
+ + +
+
+ + \ No newline at end of file diff --git a/.history/app/view/index_20230101203704.html b/.history/app/view/index_20230101203704.html new file mode 100644 index 0000000..202d471 --- /dev/null +++ b/.history/app/view/index_20230101203704.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) +
+ + +
+
+ + \ No newline at end of file diff --git a/.history/app/view/index_20230101203816.html b/.history/app/view/index_20230101203816.html new file mode 100644 index 0000000..74365ec --- /dev/null +++ b/.history/app/view/index_20230101203816.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: +
+ + +
+
+ + \ No newline at end of file diff --git a/.history/app/view/index_20230101203939.html b/.history/app/view/index_20230101203939.html new file mode 100644 index 0000000..f152406 --- /dev/null +++ b/.history/app/view/index_20230101203939.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: +
+ + +
+
+ + \ No newline at end of file diff --git a/.history/app/view/index_20230101204053.html b/.history/app/view/index_20230101204053.html new file mode 100644 index 0000000..4955657 --- /dev/null +++ b/.history/app/view/index_20230101204053.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+ + +
+
+ + \ No newline at end of file diff --git a/.history/app/view/index_20230101204120.html b/.history/app/view/index_20230101204120.html new file mode 100644 index 0000000..7cfcba1 --- /dev/null +++ b/.history/app/view/index_20230101204120.html @@ -0,0 +1,82 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+ + +
+
+ + \ No newline at end of file diff --git a/.history/app/view/index_20230101204208.html b/.history/app/view/index_20230101204208.html new file mode 100644 index 0000000..2842b51 --- /dev/null +++ b/.history/app/view/index_20230101204208.html @@ -0,0 +1,86 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+ + +
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/index_20230101204558.html b/.history/app/view/index_20230101204558.html new file mode 100644 index 0000000..5fb9e09 --- /dev/null +++ b/.history/app/view/index_20230101204558.html @@ -0,0 +1,96 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/index_20230101204608.html b/.history/app/view/index_20230101204608.html new file mode 100644 index 0000000..5fb9e09 --- /dev/null +++ b/.history/app/view/index_20230101204608.html @@ -0,0 +1,96 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/index_20230101204615.html b/.history/app/view/index_20230101204615.html new file mode 100644 index 0000000..436b4c0 --- /dev/null +++ b/.history/app/view/index_20230101204615.html @@ -0,0 +1,96 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+
+
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/index_20230101204631.html b/.history/app/view/index_20230101204631.html new file mode 100644 index 0000000..192ecb0 --- /dev/null +++ b/.history/app/view/index_20230101204631.html @@ -0,0 +1,97 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+
+
+
+
+
+
+ 加载中,请耐心等待 +
+
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/index_20230101204642.html b/.history/app/view/index_20230101204642.html new file mode 100644 index 0000000..69d8d84 --- /dev/null +++ b/.history/app/view/index_20230101204642.html @@ -0,0 +1,98 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+
+
+
+
+
+
+
+ 加载中,请耐心等待 +
+
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/index_20230101204645.html b/.history/app/view/index_20230101204645.html new file mode 100644 index 0000000..7ee711b --- /dev/null +++ b/.history/app/view/index_20230101204645.html @@ -0,0 +1,98 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+
+
+
+
+
+
+
+ 加载中,请耐心等待 +
+
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/index_20230101204737.html b/.history/app/view/index_20230101204737.html new file mode 100644 index 0000000..08f715c --- /dev/null +++ b/.history/app/view/index_20230101204737.html @@ -0,0 +1,98 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+
+
+
+
+
+
+
+ 加载中,请耐心等待 +
+
+
+ + + + diff --git a/.history/app/view/index_20230101205022.html b/.history/app/view/index_20230101205022.html new file mode 100644 index 0000000..55d9625 --- /dev/null +++ b/.history/app/view/index_20230101205022.html @@ -0,0 +1,100 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+
+
+
+
+
+
+
+ 加载中,请耐心等待 +
+
+
+ + + + + + diff --git a/.history/app/view/index_20230101205058.html b/.history/app/view/index_20230101205058.html new file mode 100644 index 0000000..93d8b73 --- /dev/null +++ b/.history/app/view/index_20230101205058.html @@ -0,0 +1,100 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+
+
+
+
+
+
+
+ 加载中,请耐心等待 +
+
+
+ + + + + + diff --git a/.history/app/view/index_20230101205143.html b/.history/app/view/index_20230101205143.html new file mode 100644 index 0000000..d5b8244 --- /dev/null +++ b/.history/app/view/index_20230101205143.html @@ -0,0 +1,100 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+
+
+
+
+
+
+
+ 加载中,请耐心等待 +
+
+
+ + + + + + diff --git a/.history/app/view/index_20230101223457.html b/.history/app/view/index_20230101223457.html new file mode 100644 index 0000000..b94ff46 --- /dev/null +++ b/.history/app/view/index_20230101223457.html @@ -0,0 +1,91 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+
+
+
+
+
+
+
+ 加载中,请耐心等待 +
+
+
+ + diff --git a/.history/app/view/index_20230101223530.html b/.history/app/view/index_20230101223530.html new file mode 100644 index 0000000..58825ce --- /dev/null +++ b/.history/app/view/index_20230101223530.html @@ -0,0 +1,91 @@ + + + + + + + + + + + + + (Proxy)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+
+
+
+
+
+
+
+ 加载中,请耐心等待 +
+
+
+ + diff --git a/.history/app/view/index_20230102124634.html b/.history/app/view/index_20230102124634.html new file mode 100644 index 0000000..42629eb --- /dev/null +++ b/.history/app/view/index_20230102124634.html @@ -0,0 +1,92 @@ + + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+
+
+
+
+
+
+ 加载中,请耐心等待 +
+
+
+ + diff --git a/.history/app/view/index_20230102124718.html b/.history/app/view/index_20230102124718.html new file mode 100644 index 0000000..0cbf4b6 --- /dev/null +++ b/.history/app/view/index_20230102124718.html @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+
+
+
+
+
+
+ 加载中,请耐心等待 +
+
+
+ + diff --git a/.history/app/view/index_20230102124723.html b/.history/app/view/index_20230102124723.html new file mode 100644 index 0000000..e0d75e7 --- /dev/null +++ b/.history/app/view/index_20230102124723.html @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+
+
+
+
+
+
+ 加载中,请耐心等待 +
+
+
+ + diff --git a/.history/app/view/index_20230102124919.html b/.history/app/view/index_20230102124919.html new file mode 100644 index 0000000..1665f22 --- /dev/null +++ b/.history/app/view/index_20230102124919.html @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+
+
+
+
+
+
+ 加载中,请耐心等待 +
+
+
+ + diff --git a/.history/app/view/index_20230102125045.html b/.history/app/view/index_20230102125045.html new file mode 100644 index 0000000..f9430b1 --- /dev/null +++ b/.history/app/view/index_20230102125045.html @@ -0,0 +1,77 @@ + + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+
+
+
+
+
+
+ 加载中,请耐心等待 +
+
+
+ + diff --git a/.history/app/view/index_20230102125053.html b/.history/app/view/index_20230102125053.html new file mode 100644 index 0000000..a0f1d9a --- /dev/null +++ b/.history/app/view/index_20230102125053.html @@ -0,0 +1,76 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+
+
+
+
+
+
+ 加载中,请耐心等待 +
+
+
+ + diff --git a/.history/app/view/index_20230102125226.html b/.history/app/view/index_20230102125226.html new file mode 100644 index 0000000..91065ee --- /dev/null +++ b/.history/app/view/index_20230102125226.html @@ -0,0 +1,76 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+
+
+
+
+
+
+ 加载中,请耐心等待 +
+
+
+ + diff --git a/.history/app/view/index_20230102125230.html b/.history/app/view/index_20230102125230.html new file mode 100644 index 0000000..73ad0b1 --- /dev/null +++ b/.history/app/view/index_20230102125230.html @@ -0,0 +1,76 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+
+
+
+
+
+
+ 加载中,请耐心等待 +
+
+
+ + diff --git a/.history/app/view/index_20230102143349.html b/.history/app/view/index_20230102143349.html new file mode 100644 index 0000000..82eb68d --- /dev/null +++ b/.history/app/view/index_20230102143349.html @@ -0,0 +1,102 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+ +
+
+ + + + diff --git a/.history/app/view/index_20230102174618.html b/.history/app/view/index_20230102174618.html new file mode 100644 index 0000000..2098877 --- /dev/null +++ b/.history/app/view/index_20230102174618.html @@ -0,0 +1,109 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+ +
+
+ + + + diff --git a/.history/app/view/index_20230102175038.html b/.history/app/view/index_20230102175038.html new file mode 100644 index 0000000..cde4ba5 --- /dev/null +++ b/.history/app/view/index_20230102175038.html @@ -0,0 +1,110 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+ +
+
+ + + + diff --git a/.history/app/view/index_20230102175043.html b/.history/app/view/index_20230102175043.html new file mode 100644 index 0000000..2236439 --- /dev/null +++ b/.history/app/view/index_20230102175043.html @@ -0,0 +1,110 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+ +
+
+ + + + diff --git a/.history/app/view/index_20230102175208.html b/.history/app/view/index_20230102175208.html new file mode 100644 index 0000000..4bb5b7a --- /dev/null +++ b/.history/app/view/index_20230102175208.html @@ -0,0 +1,113 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+ + +
+ (重新生成将消耗Zlib每日次数) +
+
+ + + + diff --git a/.history/app/view/index_20230102175306.html b/.history/app/view/index_20230102175306.html new file mode 100644 index 0000000..3002991 --- /dev/null +++ b/.history/app/view/index_20230102175306.html @@ -0,0 +1,114 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+ +
+ 点此下载图书 +
+ (重新生成将消耗Zlib每日次数) +
+
+ + + + diff --git a/.history/app/view/index_20230102175452.html b/.history/app/view/index_20230102175452.html new file mode 100644 index 0000000..58be36c --- /dev/null +++ b/.history/app/view/index_20230102175452.html @@ -0,0 +1,114 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+ +
+

点此下载图书

+
+ (重新生成将消耗Zlib每日次数) +
+
+ + + + diff --git a/.history/app/view/index_20230102175543.html b/.history/app/view/index_20230102175543.html new file mode 100644 index 0000000..2bb798c --- /dev/null +++ b/.history/app/view/index_20230102175543.html @@ -0,0 +1,114 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+ +
+

📥点此下载图书

+
+ (重新生成将消耗Zlib每日次数) +
+
+ + + + diff --git a/.history/app/view/index_20230102175638.html b/.history/app/view/index_20230102175638.html new file mode 100644 index 0000000..7451dbc --- /dev/null +++ b/.history/app/view/index_20230102175638.html @@ -0,0 +1,114 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+ +
+

📥点此下载图书

+
+ (重新生成将消耗Zlib每日次数) +
+
+ + + + diff --git a/.history/app/view/index_20230102175659.html b/.history/app/view/index_20230102175659.html new file mode 100644 index 0000000..0bec239 --- /dev/null +++ b/.history/app/view/index_20230102175659.html @@ -0,0 +1,114 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+ +
+

📥点此下载图书

+
+ (重新生成将消耗Zlib每日次数) +
+
+ + + + diff --git a/.history/app/view/index_20230102181935.html b/.history/app/view/index_20230102181935.html new file mode 100644 index 0000000..7c5edae --- /dev/null +++ b/.history/app/view/index_20230102181935.html @@ -0,0 +1,114 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+ +
+

📥点此下载图书

+
+ (重新生成将消耗Zlib每日次数) +
+
+ + + + diff --git a/.history/app/view/index_20230102181951.html b/.history/app/view/index_20230102181951.html new file mode 100644 index 0000000..86193b9 --- /dev/null +++ b/.history/app/view/index_20230102181951.html @@ -0,0 +1,114 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+ +
+

📥点此下载图书

+
+ (重新生成将消耗Zlib每日次数) +
+
+ + + + diff --git a/.history/app/view/index_20230102182128.html b/.history/app/view/index_20230102182128.html new file mode 100644 index 0000000..79e3a46 --- /dev/null +++ b/.history/app/view/index_20230102182128.html @@ -0,0 +1,114 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+ +
+

📥点此下载图书

+
+ (重新生成将消耗Zlib每日次数) +
+
+ + + + diff --git a/.history/app/view/index_20230102182216.html b/.history/app/view/index_20230102182216.html new file mode 100644 index 0000000..a9b33da --- /dev/null +++ b/.history/app/view/index_20230102182216.html @@ -0,0 +1,117 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+
+ +

📥点此下载图书

+
+
+ (重新生成将消耗Zlib每日次数) +
+
+
+ + + + diff --git a/.history/app/view/index_20230102182247.html b/.history/app/view/index_20230102182247.html new file mode 100644 index 0000000..16bc556 --- /dev/null +++ b/.history/app/view/index_20230102182247.html @@ -0,0 +1,117 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+
+ +

📥点此下载图书

+
+
+ (重新生成将消耗Zlib每日次数) +
+
+
+ + + + diff --git a/.history/app/view/index_20230102182334.html b/.history/app/view/index_20230102182334.html new file mode 100644 index 0000000..19ad940 --- /dev/null +++ b/.history/app/view/index_20230102182334.html @@ -0,0 +1,117 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+
+ +

📥点此下载图书

+
+
+ (重新生成将消耗Zlib每日次数) +
+
+
+ + + + diff --git a/.history/app/view/index_20230102182553.html b/.history/app/view/index_20230102182553.html new file mode 100644 index 0000000..a6c4744 --- /dev/null +++ b/.history/app/view/index_20230102182553.html @@ -0,0 +1,117 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+ +
+
+ + + + diff --git a/.history/app/view/index_20230102182723.html b/.history/app/view/index_20230102182723.html new file mode 100644 index 0000000..fc29824 --- /dev/null +++ b/.history/app/view/index_20230102182723.html @@ -0,0 +1,117 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+ +
+
+ + + + diff --git a/.history/app/view/index_20230102182726.html b/.history/app/view/index_20230102182726.html new file mode 100644 index 0000000..eb45648 --- /dev/null +++ b/.history/app/view/index_20230102182726.html @@ -0,0 +1,117 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+ +
+
+ + + + diff --git a/.history/app/view/index_20230102182911.html b/.history/app/view/index_20230102182911.html new file mode 100644 index 0000000..f1b30c7 --- /dev/null +++ b/.history/app/view/index_20230102182911.html @@ -0,0 +1,120 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+ + +
+
+ + + + diff --git a/.history/app/view/index_20230102183013.html b/.history/app/view/index_20230102183013.html new file mode 100644 index 0000000..ce84e4c --- /dev/null +++ b/.history/app/view/index_20230102183013.html @@ -0,0 +1,122 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+ + +
+
+ + + + diff --git a/.history/app/view/index_20230102183031.html b/.history/app/view/index_20230102183031.html new file mode 100644 index 0000000..78f14b3 --- /dev/null +++ b/.history/app/view/index_20230102183031.html @@ -0,0 +1,122 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+ + +
+
+ + + + diff --git a/.history/app/view/index_20230102183648.html b/.history/app/view/index_20230102183648.html new file mode 100644 index 0000000..6b5a07d --- /dev/null +++ b/.history/app/view/index_20230102183648.html @@ -0,0 +1,157 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+ + +
+
+ + + + diff --git a/.history/app/view/index_20230102183911.html b/.history/app/view/index_20230102183911.html new file mode 100644 index 0000000..cb3653e --- /dev/null +++ b/.history/app/view/index_20230102183911.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+ + +
+
+ + + + diff --git a/.history/app/view/index_20230102183921.html b/.history/app/view/index_20230102183921.html new file mode 100644 index 0000000..713d52e --- /dev/null +++ b/.history/app/view/index_20230102183921.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+

下载图书

+
+ + +
+
+ + + + diff --git a/.history/app/view/index_20230102183951.html b/.history/app/view/index_20230102183951.html new file mode 100644 index 0000000..09bea01 --- /dev/null +++ b/.history/app/view/index_20230102183951.html @@ -0,0 +1,162 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+ [返回ZlibraryProxy] +

下载图书

+
+ + +
+
+ + + + diff --git a/.history/app/view/index_20230102184217.html b/.history/app/view/index_20230102184217.html new file mode 100644 index 0000000..1429e10 --- /dev/null +++ b/.history/app/view/index_20230102184217.html @@ -0,0 +1,162 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+ [返回ZlibraryProxy] +

下载图书

+
+ + +
+
+ + + + diff --git a/.history/app/view/index_20230102184245.html b/.history/app/view/index_20230102184245.html new file mode 100644 index 0000000..2b7b305 --- /dev/null +++ b/.history/app/view/index_20230102184245.html @@ -0,0 +1,163 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+ [返回ZlibraryProxy] +

下载图书

+ +

+
+ + +
+
+ + + + diff --git a/.history/app/view/index_20230102184436.html b/.history/app/view/index_20230102184436.html new file mode 100644 index 0000000..0f30be0 --- /dev/null +++ b/.history/app/view/index_20230102184436.html @@ -0,0 +1,164 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+ [返回ZlibraryProxy] +

下载图书

+ +

+
+ + +
+
+ + + + diff --git a/.history/app/view/index_20230102185838.html b/.history/app/view/index_20230102185838.html new file mode 100644 index 0000000..80684a0 --- /dev/null +++ b/.history/app/view/index_20230102185838.html @@ -0,0 +1,164 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+ [返回ZlibraryProxy] +

下载图书

+ +

+
+ + +
+
+ + + + diff --git a/.history/app/view/login_20230101173350.html b/.history/app/view/login_20230101173350.html new file mode 100644 index 0000000..e69de29 diff --git a/.history/app/view/login_20230101173352.html b/.history/app/view/login_20230101173352.html new file mode 100644 index 0000000..a6fc30d --- /dev/null +++ b/.history/app/view/login_20230101173352.html @@ -0,0 +1,17 @@ + + diff --git a/.history/app/view/login_20230101173411.html b/.history/app/view/login_20230101173411.html new file mode 100644 index 0000000..db31cb7 --- /dev/null +++ b/.history/app/view/login_20230101173411.html @@ -0,0 +1,17 @@ + + diff --git a/.history/app/view/login_20230101174829.html b/.history/app/view/login_20230101174829.html new file mode 100644 index 0000000..4655581 --- /dev/null +++ b/.history/app/view/login_20230101174829.html @@ -0,0 +1,89 @@ + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

登录Z-library


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 您的请求成功发送后,我们将于48小时内通过邮件回复您 +
+ 由于我们承诺不更改源站,部分站点无法制作镜像,请谅解 +
+ 我们有权拒绝一切无意义的垃圾站点的镜像申请 +
+ 我们仅接受境内难以访问的 公益、公共 类型站点 +
+ 拒绝一切商业、内部站点 +
+ +
+

请填写以下表单以完成镜像添加申请。

+
+
+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ +

+
+ +
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101175120.html b/.history/app/view/login_20230101175120.html new file mode 100644 index 0000000..b84d68d --- /dev/null +++ b/.history/app/view/login_20230101175120.html @@ -0,0 +1,87 @@ + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

登录Z-library


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ +

+
+ +
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101175133.html b/.history/app/view/login_20230101175133.html new file mode 100644 index 0000000..aa2fecc --- /dev/null +++ b/.history/app/view/login_20230101175133.html @@ -0,0 +1,87 @@ + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

登录Z-library


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ +

+
+ +
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101175218.html b/.history/app/view/login_20230101175218.html new file mode 100644 index 0000000..c6a17eb --- /dev/null +++ b/.history/app/view/login_20230101175218.html @@ -0,0 +1,87 @@ + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

登录Z-library


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ +

+
+ +
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101175401.html b/.history/app/view/login_20230101175401.html new file mode 100644 index 0000000..abbc70e --- /dev/null +++ b/.history/app/view/login_20230101175401.html @@ -0,0 +1,87 @@ + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ +

+
+ +
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101175437.html b/.history/app/view/login_20230101175437.html new file mode 100644 index 0000000..b48c0ef --- /dev/null +++ b/.history/app/view/login_20230101175437.html @@ -0,0 +1,87 @@ + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ +

+
+ +
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101180128.html b/.history/app/view/login_20230101180128.html new file mode 100644 index 0000000..83a1d62 --- /dev/null +++ b/.history/app/view/login_20230101180128.html @@ -0,0 +1,79 @@ + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ +

+
+ +
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101180149.html b/.history/app/view/login_20230101180149.html new file mode 100644 index 0000000..d40bea9 --- /dev/null +++ b/.history/app/view/login_20230101180149.html @@ -0,0 +1,79 @@ + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+ +
+

+ +

+
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101180227.html b/.history/app/view/login_20230101180227.html new file mode 100644 index 0000000..a44eddd --- /dev/null +++ b/.history/app/view/login_20230101180227.html @@ -0,0 +1,79 @@ + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+ +
+

+ +

+
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101180234.html b/.history/app/view/login_20230101180234.html new file mode 100644 index 0000000..85dee42 --- /dev/null +++ b/.history/app/view/login_20230101180234.html @@ -0,0 +1,79 @@ + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+ +
+

+ +

+
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101180241.html b/.history/app/view/login_20230101180241.html new file mode 100644 index 0000000..70cffb6 --- /dev/null +++ b/.history/app/view/login_20230101180241.html @@ -0,0 +1,79 @@ + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+ +
+

+ +

+
+
+ + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101181129.html b/.history/app/view/login_20230101181129.html new file mode 100644 index 0000000..a46a0b4 --- /dev/null +++ b/.history/app/view/login_20230101181129.html @@ -0,0 +1,113 @@ + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101181150.html b/.history/app/view/login_20230101181150.html new file mode 100644 index 0000000..55eddab --- /dev/null +++ b/.history/app/view/login_20230101181150.html @@ -0,0 +1,113 @@ + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101182821.html b/.history/app/view/login_20230101182821.html new file mode 100644 index 0000000..2cd9fa7 --- /dev/null +++ b/.history/app/view/login_20230101182821.html @@ -0,0 +1,113 @@ + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101183327.html b/.history/app/view/login_20230101183327.html new file mode 100644 index 0000000..4d9a2cf --- /dev/null +++ b/.history/app/view/login_20230101183327.html @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101183446.html b/.history/app/view/login_20230101183446.html new file mode 100644 index 0000000..c055cff --- /dev/null +++ b/.history/app/view/login_20230101183446.html @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101183552.html b/.history/app/view/login_20230101183552.html new file mode 100644 index 0000000..f2c24ae --- /dev/null +++ b/.history/app/view/login_20230101183552.html @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101183630.html b/.history/app/view/login_20230101183630.html new file mode 100644 index 0000000..62fab70 --- /dev/null +++ b/.history/app/view/login_20230101183630.html @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101183643.html b/.history/app/view/login_20230101183643.html new file mode 100644 index 0000000..cb29ed6 --- /dev/null +++ b/.history/app/view/login_20230101183643.html @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101183645.html b/.history/app/view/login_20230101183645.html new file mode 100644 index 0000000..cedef46 --- /dev/null +++ b/.history/app/view/login_20230101183645.html @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101183712.html b/.history/app/view/login_20230101183712.html new file mode 100644 index 0000000..fb2131d --- /dev/null +++ b/.history/app/view/login_20230101183712.html @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101183839.html b/.history/app/view/login_20230101183839.html new file mode 100644 index 0000000..707a677 --- /dev/null +++ b/.history/app/view/login_20230101183839.html @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101183850.html b/.history/app/view/login_20230101183850.html new file mode 100644 index 0000000..b1bf4db --- /dev/null +++ b/.history/app/view/login_20230101183850.html @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101184026.html b/.history/app/view/login_20230101184026.html new file mode 100644 index 0000000..eff0797 --- /dev/null +++ b/.history/app/view/login_20230101184026.html @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101185849.html b/.history/app/view/login_20230101185849.html new file mode 100644 index 0000000..c180ed0 --- /dev/null +++ b/.history/app/view/login_20230101185849.html @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101190053.html b/.history/app/view/login_20230101190053.html new file mode 100644 index 0000000..d82d9c9 --- /dev/null +++ b/.history/app/view/login_20230101190053.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101190231.html b/.history/app/view/login_20230101190231.html new file mode 100644 index 0000000..0542a18 --- /dev/null +++ b/.history/app/view/login_20230101190231.html @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+ +

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101190302.html b/.history/app/view/login_20230101190302.html new file mode 100644 index 0000000..a5149f9 --- /dev/null +++ b/.history/app/view/login_20230101190302.html @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+ +

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101190358.html b/.history/app/view/login_20230101190358.html new file mode 100644 index 0000000..5b49ae0 --- /dev/null +++ b/.history/app/view/login_20230101190358.html @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+ +

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101190412.html b/.history/app/view/login_20230101190412.html new file mode 100644 index 0000000..74ab390 --- /dev/null +++ b/.history/app/view/login_20230101190412.html @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+ +

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101190659.html b/.history/app/view/login_20230101190659.html new file mode 100644 index 0000000..736c7b2 --- /dev/null +++ b/.history/app/view/login_20230101190659.html @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+ +

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101190738.html b/.history/app/view/login_20230101190738.html new file mode 100644 index 0000000..5a40bce --- /dev/null +++ b/.history/app/view/login_20230101190738.html @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+ +

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101190748.html b/.history/app/view/login_20230101190748.html new file mode 100644 index 0000000..02ee967 --- /dev/null +++ b/.history/app/view/login_20230101190748.html @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+ +

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101192531.html b/.history/app/view/login_20230101192531.html new file mode 100644 index 0000000..8a1e47f --- /dev/null +++ b/.history/app/view/login_20230101192531.html @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+ +

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101192600.html b/.history/app/view/login_20230101192600.html new file mode 100644 index 0000000..a90ef73 --- /dev/null +++ b/.history/app/view/login_20230101192600.html @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+ +

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101192622.html b/.history/app/view/login_20230101192622.html new file mode 100644 index 0000000..013478b --- /dev/null +++ b/.history/app/view/login_20230101192622.html @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+ +

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101192648.html b/.history/app/view/login_20230101192648.html new file mode 100644 index 0000000..9c64b40 --- /dev/null +++ b/.history/app/view/login_20230101192648.html @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+ +

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101193338.html b/.history/app/view/login_20230101193338.html new file mode 100644 index 0000000..bd6f29a --- /dev/null +++ b/.history/app/view/login_20230101193338.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+ +

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101195634.html b/.history/app/view/login_20230101195634.html new file mode 100644 index 0000000..c208a91 --- /dev/null +++ b/.history/app/view/login_20230101195634.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+ +

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230101195725.html b/.history/app/view/login_20230101195725.html new file mode 100644 index 0000000..52e5927 --- /dev/null +++ b/.history/app/view/login_20230101195725.html @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+ +

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230102190430.html b/.history/app/view/login_20230102190430.html new file mode 100644 index 0000000..031dd15 --- /dev/null +++ b/.history/app/view/login_20230102190430.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 由于Zlibrary的邮件服务器已经宕机,任何新注册和更改密码请求均无效,均无法使用,如果您的账号还未通过邮箱激活将无法使用本服务 +
+ 本代理不会保存您的密码(仅保存到您本地的cookies) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+ +

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/app/view/login_20230102190457.html b/.history/app/view/login_20230102190457.html new file mode 100644 index 0000000..8adda7e --- /dev/null +++ b/.history/app/view/login_20230102190457.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 由于Zlibrary的邮件服务器已经宕机,任何新注册和更改密码请求均无效,均无法使用,如果您的账号还未通过邮箱激活将无法使用本服务 +
+ 本代理不会保存您的密码(仅在浏览器cookies保存您的ID) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+ +

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/.history/books/2023/01/test_20230102171837 b/.history/books/2023/01/test_20230102171837 new file mode 100644 index 0000000..e69de29 diff --git a/.history/books/2023/01/test_20230102171838 b/.history/books/2023/01/test_20230102171838 new file mode 100644 index 0000000..593161e --- /dev/null +++ b/.history/books/2023/01/test_20230102171838 @@ -0,0 +1,15 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + diff --git a/.history/config/middleware_20221212162407.php b/.history/config/middleware_20221212162407.php new file mode 100644 index 0000000..8e964ed --- /dev/null +++ b/.history/config/middleware_20221212162407.php @@ -0,0 +1,15 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return []; \ No newline at end of file diff --git a/.history/config/middleware_20230101201929.php b/.history/config/middleware_20230101201929.php new file mode 100644 index 0000000..c6c2cde --- /dev/null +++ b/.history/config/middleware_20230101201929.php @@ -0,0 +1,20 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + '' => [ + app\middleware\Login::class, + ] + +]; \ No newline at end of file diff --git a/.history/config/middleware_20230101202230.php b/.history/config/middleware_20230101202230.php new file mode 100644 index 0000000..8e964ed --- /dev/null +++ b/.history/config/middleware_20230101202230.php @@ -0,0 +1,15 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return []; \ No newline at end of file diff --git a/.history/config/plugin/nsp-team/webman-throttler/app_20230101182209.php b/.history/config/plugin/nsp-team/webman-throttler/app_20230101182209.php new file mode 100644 index 0000000..ca25a15 --- /dev/null +++ b/.history/config/plugin/nsp-team/webman-throttler/app_20230101182209.php @@ -0,0 +1,16 @@ + true, + + 'capacity' => 60, // The number of requests the "bucket" can hold + 'seconds' => 60, // The time it takes the "bucket" to completely refill + 'cost' => 1, // The number of tokens this action uses. + 'customer_handle' => [ + 'class' => \support\Response::class, + 'constructor' => [ + 429, + array(), + json_encode(['success' => false, 'msg' => '请求次数太频繁'], 256), + ], + ], +]; \ No newline at end of file diff --git a/.history/config/plugin/nsp-team/webman-throttler/app_20230101182301.php b/.history/config/plugin/nsp-team/webman-throttler/app_20230101182301.php new file mode 100644 index 0000000..6542291 --- /dev/null +++ b/.history/config/plugin/nsp-team/webman-throttler/app_20230101182301.php @@ -0,0 +1,15 @@ + true, + 'capacity' => 60, // The number of requests the "bucket" can hold + 'seconds' => 60, // The time it takes the "bucket" to completely refill + 'cost' => 1, // The number of tokens this action uses. + 'customer_handle' => [ + 'class' => \support\Response::class, + 'constructor' => [ + 429, + array(), + json_encode(['success' => false, 'msg' => '请求次数太频繁'], 256), + ], + ], +]; \ No newline at end of file diff --git a/.history/config/plugin/yzh52521/throttle/app_20230101181847.php b/.history/config/plugin/yzh52521/throttle/app_20230101181847.php new file mode 100644 index 0000000..4c6b8a6 --- /dev/null +++ b/.history/config/plugin/yzh52521/throttle/app_20230101181847.php @@ -0,0 +1,54 @@ + true, + // 缓存键前缀,防止键值与其他应用冲突 + 'prefix' => 'throttle_', + + // 缓存的键,true 表示使用来源ip (request->getRealIp(true)) + 'key' => true, + + // 要被限制的请求类型, eg: GET POST PUT DELETE HEAD + 'visit_method' => ['GET'], + + // 设置访问频率,例如 '10/m' 指的是允许每分钟请求10次。值 null 表示不限制, + // eg: null 10/m 20/h 300/d 200/300 + 'visit_rate' => '100/m', + + // 响应体中设置速率限制的头部信息,含义见:https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting + 'visit_enable_show_rate_limit' => true, + + // 访问受限时返回的响应( type: null|callable ) + 'visit_fail_response' => function (Throttle $throttle, Request $request, int $wait_seconds): Response { + return response('Too many requests, try again after ' . $wait_seconds . ' seconds.'); + }, + + /* + * 设置节流算法,组件提供了四种算法: + * - CounterFixed :计数固定窗口 + * - CounterSlider: 滑动窗口 + * - TokenBucket : 令牌桶算法 + * - LeakyBucket : 漏桶限流算法 + */ + 'driver_name' => CounterFixed::class, + + // Psr-16通用缓存库规范: https://blog.csdn.net/maquealone/article/details/79651111 + // Cache驱动必须符合PSR-16缓存库规范,最低实现get/set俩个方法 (且需静态化实现) + // static get(string $key, mixed $default=null) + // static set(string $key, mixed $value, int $ttl=0); + + //webman默认使用 symfony/cache作为cache组件(https://www.workerman.net/doc/webman/db/cache.html) + 'cache_drive' => support\Cache::class, + + //使用ThinkCache + //'cache_drive' => think\facade\Cache::class, +]; \ No newline at end of file diff --git a/.history/config/plugin/yzh52521/throttle/app_20230101181956.php b/.history/config/plugin/yzh52521/throttle/app_20230101181956.php new file mode 100644 index 0000000..ab4b6a8 --- /dev/null +++ b/.history/config/plugin/yzh52521/throttle/app_20230101181956.php @@ -0,0 +1,54 @@ + true, + // 缓存键前缀,防止键值与其他应用冲突 + 'prefix' => 'throttle_', + + // 缓存的键,true 表示使用来源ip (request->getRealIp(true)) + 'key' => true, + + // 要被限制的请求类型, eg: GET POST PUT DELETE HEAD + 'visit_method' => ['GET'], + + // 设置访问频率,例如 '10/m' 指的是允许每分钟请求10次。值 null 表示不限制, + // eg: null 10/m 20/h 300/d 200/300 + 'visit_rate' => '10/m', + + // 响应体中设置速率限制的头部信息,含义见:https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting + 'visit_enable_show_rate_limit' => true, + + // 访问受限时返回的响应( type: null|callable ) + 'visit_fail_response' => function (Throttle $throttle, Request $request, int $wait_seconds): Response { + return response('Too many requests, try again after ' . $wait_seconds . ' seconds.'); + }, + + /* + * 设置节流算法,组件提供了四种算法: + * - CounterFixed :计数固定窗口 + * - CounterSlider: 滑动窗口 + * - TokenBucket : 令牌桶算法 + * - LeakyBucket : 漏桶限流算法 + */ + 'driver_name' => TokenBucket::class, + + // Psr-16通用缓存库规范: https://blog.csdn.net/maquealone/article/details/79651111 + // Cache驱动必须符合PSR-16缓存库规范,最低实现get/set俩个方法 (且需静态化实现) + // static get(string $key, mixed $default=null) + // static set(string $key, mixed $value, int $ttl=0); + + //webman默认使用 symfony/cache作为cache组件(https://www.workerman.net/doc/webman/db/cache.html) + 'cache_drive' => support\Cache::class, + + //使用ThinkCache + //'cache_drive' => think\facade\Cache::class, +]; \ No newline at end of file diff --git a/.history/config/plugin/yzh52521/throttle/app_20230102144623.php b/.history/config/plugin/yzh52521/throttle/app_20230102144623.php new file mode 100644 index 0000000..4456325 --- /dev/null +++ b/.history/config/plugin/yzh52521/throttle/app_20230102144623.php @@ -0,0 +1,54 @@ + true, + // 缓存键前缀,防止键值与其他应用冲突 + 'prefix' => 'throttle_', + + // 缓存的键,true 表示使用来源ip (request->getRealIp(true)) + 'key' => true, + + // 要被限制的请求类型, eg: GET POST PUT DELETE HEAD + 'visit_method' => ['GET'], + + // 设置访问频率,例如 '10/m' 指的是允许每分钟请求10次。值 null 表示不限制, + // eg: null 10/m 20/h 300/d 200/300 + 'visit_rate' => '10/m', + + // 响应体中设置速率限制的头部信息,含义见:https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting + 'visit_enable_show_rate_limit' => true, + + // 访问受限时返回的响应( type: null|callable ) + 'visit_fail_response' => function (Throttle $throttle, Request $request, int $wait_seconds): Response { + return json(['code'=>999,'msg'=>'请求频率过快,请稍后重试']); + }, + + /* + * 设置节流算法,组件提供了四种算法: + * - CounterFixed :计数固定窗口 + * - CounterSlider: 滑动窗口 + * - TokenBucket : 令牌桶算法 + * - LeakyBucket : 漏桶限流算法 + */ + 'driver_name' => TokenBucket::class, + + // Psr-16通用缓存库规范: https://blog.csdn.net/maquealone/article/details/79651111 + // Cache驱动必须符合PSR-16缓存库规范,最低实现get/set俩个方法 (且需静态化实现) + // static get(string $key, mixed $default=null) + // static set(string $key, mixed $value, int $ttl=0); + + //webman默认使用 symfony/cache作为cache组件(https://www.workerman.net/doc/webman/db/cache.html) + 'cache_drive' => support\Cache::class, + + //使用ThinkCache + //'cache_drive' => think\facade\Cache::class, +]; \ No newline at end of file diff --git a/.history/config/redis_20221212162407.php b/.history/config/redis_20221212162407.php new file mode 100644 index 0000000..2f9757a --- /dev/null +++ b/.history/config/redis_20221212162407.php @@ -0,0 +1,22 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + 'default' => [ + 'host' => '127.0.0.1', + 'password' => null, + 'port' => 6379, + 'database' => 0, + ], +]; diff --git a/.history/config/redis_20230101181759.php b/.history/config/redis_20230101181759.php new file mode 100644 index 0000000..ae75ae1 --- /dev/null +++ b/.history/config/redis_20230101181759.php @@ -0,0 +1,22 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + 'default' => [ + 'host' => getenv('redis.host'), + 'password' => getenv('redis.password'), + 'port' => getenv('redis.port'), + 'database' => getenv('redis.database'), + ], +]; diff --git a/.history/config/redis_20230101182542.php b/.history/config/redis_20230101182542.php new file mode 100644 index 0000000..ae75ae1 --- /dev/null +++ b/.history/config/redis_20230101182542.php @@ -0,0 +1,22 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + 'default' => [ + 'host' => getenv('redis.host'), + 'password' => getenv('redis.password'), + 'port' => getenv('redis.port'), + 'database' => getenv('redis.database'), + ], +]; diff --git a/.history/config/redis_20230101182638.php b/.history/config/redis_20230101182638.php new file mode 100644 index 0000000..98f0fd9 --- /dev/null +++ b/.history/config/redis_20230101182638.php @@ -0,0 +1,22 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + 'default' => [ + 'host' => getenv('redis.host'), + 'password' => getenv('redispassword'), + 'port' => getenv('redis.port'), + 'database' => getenv('redis.database'), + ], +]; diff --git a/.history/config/redis_20230101182737.php b/.history/config/redis_20230101182737.php new file mode 100644 index 0000000..95ec184 --- /dev/null +++ b/.history/config/redis_20230101182737.php @@ -0,0 +1,22 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + 'default' => [ + 'host' => getenv('RedisHost'), + 'password' => getenv('RedisPassword'), + 'port' => getenv('RedisPort'), + 'database' => getenv('RedisDatabase'), + ], +]; diff --git a/.history/config/route_20221212162407.php b/.history/config/route_20221212162407.php new file mode 100644 index 0000000..a5064fc --- /dev/null +++ b/.history/config/route_20221212162407.php @@ -0,0 +1,21 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + + + + + + diff --git a/.history/config/route_20230101173323.php b/.history/config/route_20230101173323.php new file mode 100644 index 0000000..188ec76 --- /dev/null +++ b/.history/config/route_20230101173323.php @@ -0,0 +1,22 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::any('/login', [app\controller\IndexController::class, 'login']); + + + + + diff --git a/.history/config/route_20230101182341.php b/.history/config/route_20230101182341.php new file mode 100644 index 0000000..56270e8 --- /dev/null +++ b/.history/config/route_20230101182341.php @@ -0,0 +1,25 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); + + + + + diff --git a/.history/config/route_20230101183538.php b/.history/config/route_20230101183538.php new file mode 100644 index 0000000..ba66e13 --- /dev/null +++ b/.history/config/route_20230101183538.php @@ -0,0 +1,28 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); + + + + + diff --git a/.history/config/route_20230101195822.php b/.history/config/route_20230101195822.php new file mode 100644 index 0000000..e87b5f3 --- /dev/null +++ b/.history/config/route_20230101195822.php @@ -0,0 +1,29 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/', [app\controller\IndexController::class, 'Index']); + + + + + diff --git a/.history/config/route_20230101195833.php b/.history/config/route_20230101195833.php new file mode 100644 index 0000000..3120ef5 --- /dev/null +++ b/.history/config/route_20230101195833.php @@ -0,0 +1,29 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/', [app\controller\IndexController::class, 'index']); + + + + + diff --git a/.history/config/route_20230101195850.php b/.history/config/route_20230101195850.php new file mode 100644 index 0000000..2df0e13 --- /dev/null +++ b/.history/config/route_20230101195850.php @@ -0,0 +1,30 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/', [app\controller\IndexController::class, 'index']); +Route::any('*', [app\controller\IndexController::class, 'index']); + + + + + diff --git a/.history/config/route_20230101200029.php b/.history/config/route_20230101200029.php new file mode 100644 index 0000000..52fbac6 --- /dev/null +++ b/.history/config/route_20230101200029.php @@ -0,0 +1,31 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::group('/', function () { + Route::any('', [app\controller\IndexController::class, 'index']); + Route::any('*', [app\controller\IndexController::class, 'index']); + }); + + + + diff --git a/.history/config/route_20230101200302.php b/.history/config/route_20230101200302.php new file mode 100644 index 0000000..9a284f2 --- /dev/null +++ b/.history/config/route_20230101200302.php @@ -0,0 +1,30 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::fallback(function(){ + Route::any('', [app\controller\IndexController::class, 'index']); +}); + + + + diff --git a/.history/config/route_20230101200324.php b/.history/config/route_20230101200324.php new file mode 100644 index 0000000..3508391 --- /dev/null +++ b/.history/config/route_20230101200324.php @@ -0,0 +1,30 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::fallback(function(){ + Route::any('*', [app\controller\IndexController::class, 'index']); +}); + + + + diff --git a/.history/config/route_20230101200915.php b/.history/config/route_20230101200915.php new file mode 100644 index 0000000..8edd427 --- /dev/null +++ b/.history/config/route_20230101200915.php @@ -0,0 +1,31 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::group('/', function () { + Route::any('', [app\controller\IndexController::class, 'index']); + }); + + + + diff --git a/.history/config/route_20230101201228.php b/.history/config/route_20230101201228.php new file mode 100644 index 0000000..65c9dcc --- /dev/null +++ b/.history/config/route_20230101201228.php @@ -0,0 +1,31 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::fallback(function(){ + return (new app\controller\IndexController)->index($request); +}); + + + + diff --git a/.history/config/route_20230101201254.php b/.history/config/route_20230101201254.php new file mode 100644 index 0000000..30f4754 --- /dev/null +++ b/.history/config/route_20230101201254.php @@ -0,0 +1,31 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::fallback(function($request){ + return (new app\controller\IndexController)->index($request); +}); + + + + diff --git a/.history/config/route_20230101202902.php b/.history/config/route_20230101202902.php new file mode 100644 index 0000000..6b1a0ee --- /dev/null +++ b/.history/config/route_20230101202902.php @@ -0,0 +1,38 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::fallback(function($request){ + #return (new app\controller\IndexController)->index($request); + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($id=='blank' || $key='blank'){ + return redirect('/login'); + } + $route = $request->route; + return view('index',['route'=>$route]); +}); + + + + diff --git a/.history/config/route_20230101202939.php b/.history/config/route_20230101202939.php new file mode 100644 index 0000000..e934a37 --- /dev/null +++ b/.history/config/route_20230101202939.php @@ -0,0 +1,39 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/zlibproxy', [app\controller\IndexController::class, 'index']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::fallback(function($request){ + #return (new app\controller\IndexController)->index($request); + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($id=='blank' || $key='blank'){ + return redirect('/login'); + } + $route = $request->route; + return view('index',['route'=>$route]); +}); + + + + diff --git a/.history/config/route_20230101203425.php b/.history/config/route_20230101203425.php new file mode 100644 index 0000000..9b3c2e9 --- /dev/null +++ b/.history/config/route_20230101203425.php @@ -0,0 +1,40 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/zlibproxy', [app\controller\IndexController::class, 'index']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::fallback(function($request){ + #return (new app\controller\IndexController)->index($request); + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + echo($key); + if($id=='blank' || $key='blank'){ + return redirect('/login'); + } + $route = $request->route; + return view('index',['route'=>$route]); +}); + + + + diff --git a/.history/config/route_20230101203452.php b/.history/config/route_20230101203452.php new file mode 100644 index 0000000..88617d5 --- /dev/null +++ b/.history/config/route_20230101203452.php @@ -0,0 +1,40 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/zlibproxy', [app\controller\IndexController::class, 'index']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::fallback(function($request){ + #return (new app\controller\IndexController)->index($request); + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + echo($id); + if( $id=='blank' || $key='blank'){ + return redirect('/login'); + } + $route = $request->route; + return view('index',['route'=>$route]); +}); + + + + diff --git a/.history/config/route_20230101203513.php b/.history/config/route_20230101203513.php new file mode 100644 index 0000000..6bfde67 --- /dev/null +++ b/.history/config/route_20230101203513.php @@ -0,0 +1,40 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/zlibproxy', [app\controller\IndexController::class, 'index']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::fallback(function($request){ + #return (new app\controller\IndexController)->index($request); + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if( $id=='blank' || $key='blank'){ + echo('why?'); + return redirect('/login'); + } + $route = $request->route; + return view('index',['route'=>$route]); +}); + + + + diff --git a/.history/config/route_20230101203529.php b/.history/config/route_20230101203529.php new file mode 100644 index 0000000..19f434c --- /dev/null +++ b/.history/config/route_20230101203529.php @@ -0,0 +1,40 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/zlibproxy', [app\controller\IndexController::class, 'index']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::fallback(function($request){ + #return (new app\controller\IndexController)->index($request); + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if( $id=='blank' || $key=='blank'){ + echo('why?'); + return redirect('/login'); + } + $route = $request->route; + return view('index',['route'=>$route]); +}); + + + + diff --git a/.history/config/route_20230101203550.php b/.history/config/route_20230101203550.php new file mode 100644 index 0000000..5273101 --- /dev/null +++ b/.history/config/route_20230101203550.php @@ -0,0 +1,39 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/zlibproxy', [app\controller\IndexController::class, 'index']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::fallback(function($request){ + #return (new app\controller\IndexController)->index($request); + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if( $id=='blank' || $key=='blank'){ + return redirect('/login'); + } + $route = $request->route; + return view('index',['route'=>$route]); +}); + + + + diff --git a/.history/config/route_20230101203806.php b/.history/config/route_20230101203806.php new file mode 100644 index 0000000..56a15b4 --- /dev/null +++ b/.history/config/route_20230101203806.php @@ -0,0 +1,39 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/zlibproxy', [app\controller\IndexController::class, 'index']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::fallback(function($request){ + #return (new app\controller\IndexController)->index($request); + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if( $id=='blank' || $key=='blank'){ + return redirect('/login'); + } + $route = $request->route; + return view('index',['route'=>$route,'id'=>$id]); +}); + + + + diff --git a/.history/config/route_20230101205925.php b/.history/config/route_20230101205925.php new file mode 100644 index 0000000..9a650c4 --- /dev/null +++ b/.history/config/route_20230101205925.php @@ -0,0 +1,32 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/zlibproxy', [app\controller\IndexController::class, 'index']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::fallback(function($request){ + return (new app\controller\IndexController)->index($request); +}); + + + + diff --git a/.history/config/route_20230101223459.php b/.history/config/route_20230101223459.php new file mode 100644 index 0000000..5a238c6 --- /dev/null +++ b/.history/config/route_20230101223459.php @@ -0,0 +1,35 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/zlibproxy', [app\controller\IndexController::class, 'index']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/test', function ($request) { + return view('index'); +}); +Route::fallback(function($request){ + return (new app\controller\IndexController)->index($request); +}); + + + + diff --git a/.history/config/route_20230101230445.php b/.history/config/route_20230101230445.php new file mode 100644 index 0000000..c62052c --- /dev/null +++ b/.history/config/route_20230101230445.php @@ -0,0 +1,37 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/zlibproxy', [app\controller\IndexController::class, 'index']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/test', function ($request) { + return view('index'); +}); +Route::any('/login/logout', [app\controller\IndexController::class, 'logout']); + +Route::fallback(function($request){ + return (new app\controller\IndexController)->index($request); +}); + + + + diff --git a/.history/config/route_20230102124532.php b/.history/config/route_20230102124532.php new file mode 100644 index 0000000..7079e09 --- /dev/null +++ b/.history/config/route_20230102124532.php @@ -0,0 +1,38 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/zlibproxy', [app\controller\IndexController::class, 'index']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/test', function ($request) { + return view('index'); +}); +Route::any('/login/logout', [app\controller\IndexController::class, 'logout']); +Route::any('/dl/{id}/{way}', [app\controller\IndexController::class, 'download']); + +Route::fallback(function($request){ + return (new app\controller\IndexController)->index($request); +}); + + + + diff --git a/.history/config/route_20230102131622.php b/.history/config/route_20230102131622.php new file mode 100644 index 0000000..506dce4 --- /dev/null +++ b/.history/config/route_20230102131622.php @@ -0,0 +1,40 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/zlibproxy', [app\controller\IndexController::class, 'index']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/test', function ($request) { + return view('index'); +}); +Route::any('/login/logout', [app\controller\IndexController::class, 'logout']); +Route::any('/logout.php', [app\controller\IndexController::class, 'logout']); + +Route::any('/dl/{id}/{way}', [app\controller\IndexController::class, 'download']); + +Route::fallback(function($request){ + return (new app\controller\IndexController)->index($request); +}); + + + + diff --git a/.history/config/route_20230102142547.php b/.history/config/route_20230102142547.php new file mode 100644 index 0000000..506dce4 --- /dev/null +++ b/.history/config/route_20230102142547.php @@ -0,0 +1,40 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/zlibproxy', [app\controller\IndexController::class, 'index']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/test', function ($request) { + return view('index'); +}); +Route::any('/login/logout', [app\controller\IndexController::class, 'logout']); +Route::any('/logout.php', [app\controller\IndexController::class, 'logout']); + +Route::any('/dl/{id}/{way}', [app\controller\IndexController::class, 'download']); + +Route::fallback(function($request){ + return (new app\controller\IndexController)->index($request); +}); + + + + diff --git a/.history/config/route_20230102142552.php b/.history/config/route_20230102142552.php new file mode 100644 index 0000000..5302443 --- /dev/null +++ b/.history/config/route_20230102142552.php @@ -0,0 +1,40 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/zlibproxy', [app\controller\IndexController::class, 'file']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/test', function ($request) { + return view('index'); +}); +Route::any('/login/logout', [app\controller\IndexController::class, 'logout']); +Route::any('/logout.php', [app\controller\IndexController::class, 'logout']); + +Route::any('/dl/{id}/{way}', [app\controller\IndexController::class, 'download']); + +Route::fallback(function($request){ + return (new app\controller\IndexController)->index($request); +}); + + + + diff --git a/.history/config/route_20230102142817.php b/.history/config/route_20230102142817.php new file mode 100644 index 0000000..5302443 --- /dev/null +++ b/.history/config/route_20230102142817.php @@ -0,0 +1,40 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/zlibproxy', [app\controller\IndexController::class, 'file']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/test', function ($request) { + return view('index'); +}); +Route::any('/login/logout', [app\controller\IndexController::class, 'logout']); +Route::any('/logout.php', [app\controller\IndexController::class, 'logout']); + +Route::any('/dl/{id}/{way}', [app\controller\IndexController::class, 'download']); + +Route::fallback(function($request){ + return (new app\controller\IndexController)->index($request); +}); + + + + diff --git a/.history/config/route_20230102143348.php b/.history/config/route_20230102143348.php new file mode 100644 index 0000000..d70051c --- /dev/null +++ b/.history/config/route_20230102143348.php @@ -0,0 +1,40 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/zlibproxy/check', [app\controller\File::class, 'check']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/test', function ($request) { + return view('index'); +}); +Route::any('/login/logout', [app\controller\IndexController::class, 'logout']); +Route::any('/logout.php', [app\controller\IndexController::class, 'logout']); + +Route::any('/dl/{id}/{way}', [app\controller\IndexController::class, 'download']); + +Route::fallback(function($request){ + return (new app\controller\IndexController)->index($request); +}); + + + + diff --git a/.history/config/route_20230102174342.php b/.history/config/route_20230102174342.php new file mode 100644 index 0000000..af29ba2 --- /dev/null +++ b/.history/config/route_20230102174342.php @@ -0,0 +1,48 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/test', function ($request) { + return view('index'); +}); +Route::any('/login/logout', [app\controller\IndexController::class, 'logout']); +Route::any('/logout.php', [app\controller\IndexController::class, 'logout']); +Route::any('/dl/{id}/{way}', [app\controller\IndexController::class, 'download']); + +Route::any('/zlibproxy/check', [app\controller\File::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/zlibproxy/download', [app\controller\File::class, 'download'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/zlibproxy/get', [app\controller\File::class, 'get'])->middleware([ + app\middleware\Throttle::class +]); + +Route::fallback(function($request){ + return (new app\controller\IndexController)->index($request); +}); + + + + diff --git a/.history/config/server_20221212162407.php b/.history/config/server_20221212162407.php new file mode 100644 index 0000000..f55ce3c --- /dev/null +++ b/.history/config/server_20221212162407.php @@ -0,0 +1,31 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + 'listen' => 'http://0.0.0.0:8787', + 'transport' => 'tcp', + 'context' => [], + 'name' => 'webman', + 'count' => cpu_count() * 4, + 'user' => '', + 'group' => '', + 'reusePort' => false, + 'event_loop' => '', + 'stop_timeout' => 2, + 'pid_file' => runtime_path() . '/webman.pid', + 'status_file' => runtime_path() . '/webman.status', + 'stdout_file' => runtime_path() . '/logs/stdout.log', + 'log_file' => runtime_path() . '/logs/workerman.log', + 'max_package_size' => 10 * 1024 * 1024 +]; diff --git a/.history/config/server_20230101175147.php b/.history/config/server_20230101175147.php new file mode 100644 index 0000000..6e44a8a --- /dev/null +++ b/.history/config/server_20230101175147.php @@ -0,0 +1,31 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + 'listen' => 'http://0.0.0.0:19500', + 'transport' => 'tcp', + 'context' => [], + 'name' => 'webman', + 'count' => cpu_count() * 4, + 'user' => '', + 'group' => '', + 'reusePort' => false, + 'event_loop' => '', + 'stop_timeout' => 2, + 'pid_file' => runtime_path() . '/webman.pid', + 'status_file' => runtime_path() . '/webman.status', + 'stdout_file' => runtime_path() . '/logs/stdout.log', + 'log_file' => runtime_path() . '/logs/workerman.log', + 'max_package_size' => 10 * 1024 * 1024 +]; diff --git a/.history/public/zlibproxy/jquery-3.6.3.min_20230101180946.js b/.history/public/zlibproxy/jquery-3.6.3.min_20230101180946.js new file mode 100644 index 0000000..e69de29 diff --git a/.history/public/zlibproxy/jquery-3.6.3.min_20230101180949.js b/.history/public/zlibproxy/jquery-3.6.3.min_20230101180949.js new file mode 100644 index 0000000..593161e --- /dev/null +++ b/.history/public/zlibproxy/jquery-3.6.3.min_20230101180949.js @@ -0,0 +1,15 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + diff --git a/.history/public/zlibproxy/jquery-3.6.3.min_20230101180952.js b/.history/public/zlibproxy/jquery-3.6.3.min_20230101180952.js new file mode 100644 index 0000000..b04d0fc --- /dev/null +++ b/.history/public/zlibproxy/jquery-3.6.3.min_20230101180952.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.3 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,y=n.hasOwnProperty,a=y.toString,l=a.call(Object),v={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},S=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||S).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.3",E=function(e,t){return new E.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,S)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&v(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!y||!y.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ve(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=E)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{if(d.cssSupportsSelector&&!CSS.supports("selector(:is("+c+"))"))throw new Error;return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===E&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[E]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ye(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ve(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,S=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.cssSupportsSelector=ce(function(){return CSS.supports("selector(*)")&&C.querySelectorAll(":is(:jqfake)")&&!CSS.supports("selector(:is(*,:jqfake))")}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=E,!C.getElementsByName||!C.getElementsByName(E).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&S){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&S){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&S)return t.getElementsByClassName(e)},s=[],y=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+E+"-]").length||y.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||y.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+E+"+*").length||y.push(".#.+[+~]"),e.querySelectorAll("\\\f"),y.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),d.cssSupportsSelector||y.push(":has"),y=y.length&&new RegExp(y.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),v=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType&&e.documentElement||e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&v(p,e)?-1:t==C||t.ownerDocument==p&&v(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&S&&!N[t+" "]&&(!s||!s.test(t))&&(!y||!y.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?E.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?E.grep(e,function(e){return e===n!==r}):"string"!=typeof n?E.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(E.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof E?t[0]:t,E.merge(this,E.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:S,!0)),N.test(r[1])&&E.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=S.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(E):E.makeArray(e,this)}).prototype=E.fn,D=E(S);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}E.fn.extend({has:function(e){var t=E(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=S.createDocumentFragment().appendChild(S.createElement("div")),(fe=S.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),v.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",v.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",v.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?E.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&E(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),S.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;E.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||E.expando+"_"+Ct.guid++;return this[e]=!0,e}}),E.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||E.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?E(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),v.createHTMLDocument=((Ut=S.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),E.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(v.createHTMLDocument?((r=(t=S.implementation.createHTMLDocument("")).createElement("base")).href=S.location.href,t.head.appendChild(r)):t=S),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&E(o).remove(),E.merge([],i.childNodes)));var r,i,o},E.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(E.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},E.expr.pseudos.animated=function(t){return E.grep(E.timers,function(e){return t===e.elem}).length},E.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=E.css(e,"position"),c=E(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=E.css(e,"top"),u=E.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,E.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},E.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){E.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===E.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===E.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=E(e).offset()).top+=E.css(e,"borderTopWidth",!0),i.left+=E.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-E.css(r,"marginTop",!0),left:t.left-i.left-E.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===E.css(e,"position"))e=e.offsetParent;return e||re})}}),E.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;E.fn[t]=function(e){return B(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),E.each(["top","left"],function(e,n){E.cssHooks[n]=_e(v.pixelPosition,function(e,t){if(t)return t=Be(e,n),Pe.test(t)?E(e).position()[n]+"px":t})}),E.each({Height:"height",Width:"width"},function(a,s){E.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){E.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?E.css(e,t,i):E.style(e,t,n,i)},s,n?e:void 0,n)}})}),E.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){E.fn[t]=function(e){return this.on(t,e)}}),E.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),E.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){E.fn[n]=function(e,t){return 0. + */ + diff --git a/.history/public/zlibproxy/normalize_20230101173118.css b/.history/public/zlibproxy/normalize_20230101173118.css new file mode 100644 index 0000000..c45a85f --- /dev/null +++ b/.history/public/zlibproxy/normalize_20230101173118.css @@ -0,0 +1,349 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + + html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + } + + /* Sections + ========================================================================== */ + + /** + * Remove the margin in all browsers. + */ + + body { + margin: 0; + } + + /** + * Render the `main` element consistently in IE. + */ + + main { + display: block; + } + + /** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + + h1 { + font-size: 2em; + margin: 0.67em 0; + } + + /* Grouping content + ========================================================================== */ + + /** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + + hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /* Text-level semantics + ========================================================================== */ + + /** + * Remove the gray background on active links in IE 10. + */ + + a { + background-color: transparent; + } + + /** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + + abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ + } + + /** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + + b, + strong { + font-weight: bolder; + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + code, + kbd, + samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /** + * Add the correct font size in all browsers. + */ + + small { + font-size: 80%; + } + + /** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + + sub, + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + + sub { + bottom: -0.25em; + } + + sup { + top: -0.5em; + } + + /* Embedded content + ========================================================================== */ + + /** + * Remove the border on images inside links in IE 10. + */ + + img { + border-style: none; + } + + /* Forms + ========================================================================== */ + + /** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + + button, + input, + optgroup, + select, + textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ + } + + /** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + + button, + input { /* 1 */ + overflow: visible; + } + + /** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + + button, + select { /* 1 */ + text-transform: none; + } + + /** + * Correct the inability to style clickable types in iOS and Safari. + */ + + button, + [type="button"], + [type="reset"], + [type="submit"] { + -webkit-appearance: button; + } + + /** + * Remove the inner border and padding in Firefox. + */ + + button::-moz-focus-inner, + [type="button"]::-moz-focus-inner, + [type="reset"]::-moz-focus-inner, + [type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; + } + + /** + * Restore the focus styles unset by the previous rule. + */ + + button:-moz-focusring, + [type="button"]:-moz-focusring, + [type="reset"]:-moz-focusring, + [type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; + } + + /** + * Correct the padding in Firefox. + */ + + fieldset { + padding: 0.35em 0.75em 0.625em; + } + + /** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + + legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ + } + + /** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + + progress { + vertical-align: baseline; + } + + /** + * Remove the default vertical scrollbar in IE 10+. + */ + + textarea { + overflow: auto; + } + + /** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + + [type="checkbox"], + [type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + } + + /** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + + [type="number"]::-webkit-inner-spin-button, + [type="number"]::-webkit-outer-spin-button { + height: auto; + } + + /** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + + [type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ + } + + /** + * Remove the inner padding in Chrome and Safari on macOS. + */ + + [type="search"]::-webkit-search-decoration { + -webkit-appearance: none; + } + + /** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + + ::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ + } + + /* Interactive + ========================================================================== */ + + /* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + + details { + display: block; + } + + /* + * Add the correct display in all browsers. + */ + + summary { + display: list-item; + } + + /* Misc + ========================================================================== */ + + /** + * Add the correct display in IE 10+. + */ + + template { + display: none; + } + + /** + * Add the correct display in IE 10. + */ + + [hidden] { + display: none; + } \ No newline at end of file diff --git a/.history/public/zlibproxy/sakura-dark_20230101175310.css b/.history/public/zlibproxy/sakura-dark_20230101175310.css new file mode 100644 index 0000000..e69de29 diff --git a/.history/public/zlibproxy/sakura-dark_20230101175312.css b/.history/public/zlibproxy/sakura-dark_20230101175312.css new file mode 100644 index 0000000..072d5c1 --- /dev/null +++ b/.history/public/zlibproxy/sakura-dark_20230101175312.css @@ -0,0 +1,17 @@ +/** + * Copyright (C) 2023 enoch@Laysense.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + diff --git a/.history/public/zlibproxy/sakura-dark_20230101175315.css b/.history/public/zlibproxy/sakura-dark_20230101175315.css new file mode 100644 index 0000000..1686bfc --- /dev/null +++ b/.history/public/zlibproxy/sakura-dark_20230101175315.css @@ -0,0 +1,223 @@ +/* $color-text: #dedce5; */ +/* Sakura.css v1.4.1 + * ================ + * Minimal css theme. + * Project: https://github.com/oxalorg/sakura/ + */ +/* Body */ +html { + font-size: 62.5%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif; + } + + body { + font-size: 1.8rem; + line-height: 1.618; + max-width: 38em; + margin: auto; + color: #c9c9c9; + background-color: #222222; + padding: 13px; + } + + @media (max-width: 684px) { + body { + font-size: 1.53rem; + } + } + @media (max-width: 382px) { + body { + font-size: 1.35rem; + } + } + h1, h2, h3, h4, h5, h6 { + line-height: 1.1; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif; + font-weight: 700; + margin-top: 3rem; + margin-bottom: 1.5rem; + overflow-wrap: break-word; + word-wrap: break-word; + -ms-word-break: break-all; + word-break: break-word; + } + + h1 { + font-size: 2.35em; + } + + h2 { + font-size: 2em; + } + + h3 { + font-size: 1.75em; + } + + h4 { + font-size: 1.5em; + } + + h5 { + font-size: 1.25em; + } + + h6 { + font-size: 1em; + } + + p { + margin-top: 0px; + margin-bottom: 2.5rem; + } + + small, sub, sup { + font-size: 75%; + } + + hr { + border-color: #ffffff; + } + + a { + text-decoration: none; + color: #ffffff; + } + a:visited { + color: #e6e6e6; + } + a:hover { + color: #c9c9c9; + border-bottom: 2px solid #c9c9c9; + } + + ul { + padding-left: 1.4em; + margin-top: 0px; + margin-bottom: 2.5rem; + } + + li { + margin-bottom: 0.4em; + } + + blockquote { + margin-left: 0px; + margin-right: 0px; + padding-left: 1em; + padding-top: 0.8em; + padding-bottom: 0.8em; + padding-right: 0.8em; + border-left: 5px solid #ffffff; + margin-bottom: 2.5rem; + background-color: #4a4a4a; + } + + blockquote p { + margin-bottom: 0; + } + + img, video { + height: auto; + max-width: 100%; + margin-top: 0px; + margin-bottom: 2.5rem; + } + + /* Pre and Code */ + pre { + background-color: #4a4a4a; + display: block; + padding: 1em; + overflow-x: auto; + margin-top: 0px; + margin-bottom: 2.5rem; + font-size: 0.9em; + } + + code, kbd, samp { + font-size: 0.9em; + padding: 0 0.5em; + background-color: #4a4a4a; + white-space: pre-wrap; + } + + pre > code { + padding: 0; + background-color: transparent; + white-space: pre; + font-size: 1em; + } + + /* Tables */ + table { + text-align: justify; + width: 100%; + border-collapse: collapse; + } + + td, th { + padding: 0.5em; + border-bottom: 1px solid #4a4a4a; + } + + /* Buttons, forms and input */ + input, textarea { + border: 1px solid #c9c9c9; + } + input:focus, textarea:focus { + border: 1px solid #ffffff; + } + + textarea { + width: 100%; + } + + .button, button, input[type=submit], input[type=reset], input[type=button] { + display: inline-block; + padding: 5px 10px; + text-align: center; + text-decoration: none; + white-space: nowrap; + background-color: #ffffff; + color: #222222; + border-radius: 1px; + border: 1px solid #ffffff; + cursor: pointer; + box-sizing: border-box; + } + .button[disabled], button[disabled], input[type=submit][disabled], input[type=reset][disabled], input[type=button][disabled] { + cursor: default; + opacity: 0.5; + } + .button:focus:enabled, .button:hover:enabled, button:focus:enabled, button:hover:enabled, input[type=submit]:focus:enabled, input[type=submit]:hover:enabled, input[type=reset]:focus:enabled, input[type=reset]:hover:enabled, input[type=button]:focus:enabled, input[type=button]:hover:enabled { + background-color: #c9c9c9; + border-color: #c9c9c9; + color: #222222; + outline: 0; + } + + textarea, select, input { + color: #c9c9c9; + padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */ + margin-bottom: 10px; + background-color: #4a4a4a; + border: 1px solid #4a4a4a; + border-radius: 4px; + box-shadow: none; + box-sizing: border-box; + } + textarea:focus, select:focus, input:focus { + border: 1px solid #ffffff; + outline: 0; + } + + input[type=checkbox]:focus { + outline: 1px dotted #ffffff; + } + + label, legend, fieldset { + display: block; + margin-bottom: 0.5rem; + font-weight: 600; + } \ No newline at end of file diff --git a/.history/public/zlibproxy/sakura_20230101173132.css b/.history/public/zlibproxy/sakura_20230101173132.css new file mode 100644 index 0000000..e69de29 diff --git a/.history/public/zlibproxy/sakura_20230101173134.css b/.history/public/zlibproxy/sakura_20230101173134.css new file mode 100644 index 0000000..072d5c1 --- /dev/null +++ b/.history/public/zlibproxy/sakura_20230101173134.css @@ -0,0 +1,17 @@ +/** + * Copyright (C) 2023 enoch@Laysense.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + diff --git a/.history/public/zlibproxy/sakura_20230101173137.css b/.history/public/zlibproxy/sakura_20230101173137.css new file mode 100644 index 0000000..6b9c6bf --- /dev/null +++ b/.history/public/zlibproxy/sakura_20230101173137.css @@ -0,0 +1,222 @@ +/* Sakura.css v1.4.1 + * ================ + * Minimal css theme. + * Project: https://github.com/oxalorg/sakura/ + */ +/* Body */ +html { + font-size: 62.5%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif; + } + + body { + font-size: 1.8rem; + line-height: 1.618; + max-width: 38em; + margin: auto; + color: #4a4a4a; + background-color: #f9f9f9; + padding: 13px; + } + + @media (max-width: 684px) { + body { + font-size: 1.53rem; + } + } + @media (max-width: 382px) { + body { + font-size: 1.35rem; + } + } + h1, h2, h3, h4, h5, h6 { + line-height: 1.1; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif; + font-weight: 700; + margin-top: 3rem; + margin-bottom: 1.5rem; + overflow-wrap: break-word; + word-wrap: break-word; + -ms-word-break: break-all; + word-break: break-word; + } + + h1 { + font-size: 2.35em; + } + + h2 { + font-size: 2em; + } + + h3 { + font-size: 1.75em; + } + + h4 { + font-size: 1.5em; + } + + h5 { + font-size: 1.25em; + } + + h6 { + font-size: 1em; + } + + p { + margin-top: 0px; + margin-bottom: 2.5rem; + } + + small, sub, sup { + font-size: 75%; + } + + hr { + border-color: #1d7484; + } + + a { + text-decoration: none; + color: #1d7484; + } + a:visited { + color: #144f5a; + } + a:hover { + color: #982c61; + border-bottom: 2px solid #4a4a4a; + } + + ul { + padding-left: 1.4em; + margin-top: 0px; + margin-bottom: 2.5rem; + } + + li { + margin-bottom: 0.4em; + } + + blockquote { + margin-left: 0px; + margin-right: 0px; + padding-left: 1em; + padding-top: 0.8em; + padding-bottom: 0.8em; + padding-right: 0.8em; + border-left: 5px solid #1d7484; + margin-bottom: 2.5rem; + background-color: #f1f1f1; + } + + blockquote p { + margin-bottom: 0; + } + + img, video { + height: auto; + max-width: 100%; + margin-top: 0px; + margin-bottom: 2.5rem; + } + + /* Pre and Code */ + pre { + background-color: #f1f1f1; + display: block; + padding: 1em; + overflow-x: auto; + margin-top: 0px; + margin-bottom: 2.5rem; + font-size: 0.9em; + } + + code, kbd, samp { + font-size: 0.9em; + padding: 0 0.5em; + background-color: #f1f1f1; + white-space: pre-wrap; + } + + pre > code { + padding: 0; + background-color: transparent; + white-space: pre; + font-size: 1em; + } + + /* Tables */ + table { + text-align: justify; + width: 100%; + border-collapse: collapse; + } + + td, th { + padding: 0.5em; + border-bottom: 1px solid #f1f1f1; + } + + /* Buttons, forms and input */ + input, textarea { + border: 1px solid #4a4a4a; + } + input:focus, textarea:focus { + border: 1px solid #1d7484; + } + + textarea { + width: 100%; + } + + .button, button, input[type=submit], input[type=reset], input[type=button] { + display: inline-block; + padding: 5px 10px; + text-align: center; + text-decoration: none; + white-space: nowrap; + background-color: #1d7484; + color: #f9f9f9; + border-radius: 1px; + border: 1px solid #1d7484; + cursor: pointer; + box-sizing: border-box; + } + .button[disabled], button[disabled], input[type=submit][disabled], input[type=reset][disabled], input[type=button][disabled] { + cursor: default; + opacity: 0.5; + } + .button:focus:enabled, .button:hover:enabled, button:focus:enabled, button:hover:enabled, input[type=submit]:focus:enabled, input[type=submit]:hover:enabled, input[type=reset]:focus:enabled, input[type=reset]:hover:enabled, input[type=button]:focus:enabled, input[type=button]:hover:enabled { + background-color: #982c61; + border-color: #982c61; + color: #f9f9f9; + outline: 0; + } + + textarea, select, input { + color: #4a4a4a; + padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */ + margin-bottom: 10px; + background-color: #f1f1f1; + border: 1px solid #f1f1f1; + border-radius: 4px; + box-shadow: none; + box-sizing: border-box; + } + textarea:focus, select:focus, input:focus { + border: 1px solid #1d7484; + outline: 0; + } + + input[type=checkbox]:focus { + outline: 1px dotted #1d7484; + } + + label, legend, fieldset { + display: block; + margin-bottom: 0.5rem; + font-weight: 600; + } \ No newline at end of file diff --git a/.history/public/zlibproxy_20230101172406 b/.history/public/zlibproxy_20230101172406 new file mode 100644 index 0000000..e69de29 diff --git a/.history/public/zlibproxy_20230101172408 b/.history/public/zlibproxy_20230101172408 new file mode 100644 index 0000000..593161e --- /dev/null +++ b/.history/public/zlibproxy_20230101172408 @@ -0,0 +1,15 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + diff --git a/.history/support/helpers_20230101172004.php b/.history/support/helpers_20230101172004.php new file mode 100644 index 0000000..6302810 --- /dev/null +++ b/.history/support/helpers_20230101172004.php @@ -0,0 +1,525 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use support\Container; +use support\Request; +use support\Response; +use support\Translation; +use support\view\Raw; +use support\view\Blade; +use support\view\ThinkPHP; +use support\view\Twig; +use Workerman\Worker; +use Webman\App; +use Webman\Config; +use Webman\Route; + +// Webman version +const WEBMAN_VERSION = '1.4'; + +// Project base path +define('BASE_PATH', dirname(__DIR__)); + +/** + * return the program execute directory + * @param string $path + * @return string + */ +function run_path(string $path = ''): string +{ + static $run_path = ''; + if (!$run_path) { + $run_path = \is_phar() ? \dirname(\Phar::running(false)) : BASE_PATH; + } + return \path_combine($run_path, $path); +} + +/** + * if the param $path equal false,will return this program current execute directory + * @param string|false $path + * @return string + */ +function base_path($path = ''): string +{ + if (false === $path) { + return \run_path(); + } + return \path_combine(BASE_PATH, $path); +} + +/** + * App path + * @param string $path + * @return string + */ +function app_path(string $path = ''): string +{ + return \path_combine(BASE_PATH . DIRECTORY_SEPARATOR . 'app', $path); +} + +/** + * Public path + * @param string $path + * @return string + */ +function public_path(string $path = ''): string +{ + static $public_path = ''; + if (!$public_path) { + $public_path = \config('app.public_path') ? : \run_path('public'); + } + return \path_combine($public_path, $path); +} + +/** + * Config path + * @param string $path + * @return string + */ +function config_path(string $path = ''): string +{ + return \path_combine(BASE_PATH . DIRECTORY_SEPARATOR . 'config', $path); +} + +/** + * Runtime path + * @param string $path + * @return string + */ +function runtime_path(string $path = ''): string +{ + static $runtime_path = ''; + if (!$runtime_path) { + $runtime_path = \config('app.runtime_path') ? : \run_path('runtime'); + } + return \path_combine($runtime_path, $path); +} + +/** + * Generate paths based on given information + * @param string $front + * @param string $back + * @return string + */ +function path_combine(string $front, string $back): string +{ + return $front . ($back ? (DIRECTORY_SEPARATOR . ltrim($back, DIRECTORY_SEPARATOR)) : $back); +} + +/** + * Response + * @param int $status + * @param array $headers + * @param string $body + * @return Response + */ +function response(string $body = '', int $status = 200, array $headers = []): Response +{ + return new Response($status, $headers, $body); +} + +/** + * Json response + * @param $data + * @param int $options + * @return Response + */ +function json($data, int $options = JSON_UNESCAPED_UNICODE): Response +{ + return new Response(200, ['Content-Type' => 'application/json'], \json_encode($data, $options)); +} + +/** + * Xml response + * @param $xml + * @return Response + */ +function xml($xml): Response +{ + if ($xml instanceof SimpleXMLElement) { + $xml = $xml->asXML(); + } + return new Response(200, ['Content-Type' => 'text/xml'], $xml); +} + +/** + * Jsonp response + * @param $data + * @param string $callback_name + * @return Response + */ +function jsonp($data, string $callback_name = 'callback'): Response +{ + if (!\is_scalar($data) && null !== $data) { + $data = \json_encode($data); + } + return new Response(200, [], "$callback_name($data)"); +} + +/** + * Redirect response + * @param string $location + * @param int $status + * @param array $headers + * @return Response + */ +function redirect(string $location, int $status = 302, array $headers = []): Response +{ + $response = new Response($status, ['Location' => $location]); + if (!empty($headers)) { + $response->withHeaders($headers); + } + return $response; +} + +/** + * View response + * @param string $template + * @param array $vars + * @param string|null $app + * @return Response + */ +function view(string $template, array $vars = [], string $app = null): Response +{ + $request = \request(); + $plugin = $request->plugin ?? ''; + $handler = \config($plugin ? "plugin.$plugin.view.handler" : 'view.handler'); + return new Response(200, [], $handler::render($template, $vars, $app)); +} + +/** + * Raw view response + * @param string $template + * @param array $vars + * @param string|null $app + * @return Response + * @throws Throwable + */ +function raw_view(string $template, array $vars = [], string $app = null): Response +{ + return new Response(200, [], Raw::render($template, $vars, $app)); +} + +/** + * Blade view response + * @param string $template + * @param array $vars + * @param string|null $app + * @return Response + */ +function blade_view(string $template, array $vars = [], string $app = null): Response +{ + return new Response(200, [], Blade::render($template, $vars, $app)); +} + +/** + * Think view response + * @param string $template + * @param array $vars + * @param string|null $app + * @return Response + */ +function think_view(string $template, array $vars = [], string $app = null): Response +{ + return new Response(200, [], ThinkPHP::render($template, $vars, $app)); +} + +/** + * Twig view response + * @param string $template + * @param array $vars + * @param string|null $app + * @return Response + */ +function twig_view(string $template, array $vars = [], string $app = null): Response +{ + return new Response(200, [], Twig::render($template, $vars, $app)); +} + +/** + * Get request + * @return \Webman\Http\Request|Request|null + */ +function request() +{ + return App::request(); +} + +/** + * Get config + * @param string|null $key + * @param $default + * @return array|mixed|null + */ +function config(string $key = null, $default = null) +{ + return Config::get($key, $default); +} + +/** + * Create url + * @param string $name + * @param ...$parameters + * @return string + */ +function route(string $name, ...$parameters): string +{ + $route = Route::getByName($name); + if (!$route) { + return ''; + } + + if (!$parameters) { + return $route->url(); + } + + if (\is_array(\current($parameters))) { + $parameters = \current($parameters); + } + + return $route->url($parameters); +} + +/** + * Session + * @param mixed $key + * @param mixed $default + * @return mixed + */ +function session($key = null, $default = null) +{ + $session = \request()->session(); + if (null === $key) { + return $session; + } + if (\is_array($key)) { + $session->put($key); + return null; + } + if (\strpos($key, '.')) { + $key_array = \explode('.', $key); + $value = $session->all(); + foreach ($key_array as $index) { + if (!isset($value[$index])) { + return $default; + } + $value = $value[$index]; + } + return $value; + } + return $session->get($key, $default); +} + +/** + * Translation + * @param string $id + * @param array $parameters + * @param string|null $domain + * @param string|null $locale + * @return string + */ +function trans(string $id, array $parameters = [], string $domain = null, string $locale = null): string +{ + $res = Translation::trans($id, $parameters, $domain, $locale); + return $res === '' ? $id : $res; +} + +/** + * Locale + * @param string|null $locale + * @return void + */ +function locale(string $locale = null): string +{ + if (!$locale) { + return Translation::getLocale(); + } + Translation::setLocale($locale); +} + +/** + * 404 not found + * @return Response + */ +function not_found(): Response +{ + return new Response(404, [], \file_get_contents(public_path() . '/404.html')); +} + +/** + * Copy dir + * @param string $source + * @param string $dest + * @param bool $overwrite + * @return void + */ +function copy_dir(string $source, string $dest, bool $overwrite = false) +{ + if (\is_dir($source)) { + if (!is_dir($dest)) { + \mkdir($dest); + } + $files = \scandir($source); + foreach ($files as $file) { + if ($file !== "." && $file !== "..") { + \copy_dir("$source/$file", "$dest/$file"); + } + } + } else if (\file_exists($source) && ($overwrite || !\file_exists($dest))) { + \copy($source, $dest); + } +} + +/** + * Remove dir + * @param string $dir + * @return bool + */ +function remove_dir(string $dir): bool +{ + if (\is_link($dir) || \is_file($dir)) { + return \unlink($dir); + } + $files = \array_diff(\scandir($dir), array('.', '..')); + foreach ($files as $file) { + (\is_dir("$dir/$file") && !\is_link($dir)) ? \remove_dir("$dir/$file") : \unlink("$dir/$file"); + } + return \rmdir($dir); +} + +/** + * Bind worker + * @param $worker + * @param $class + */ +function worker_bind($worker, $class) +{ + $callback_map = [ + 'onConnect', + 'onMessage', + 'onClose', + 'onError', + 'onBufferFull', + 'onBufferDrain', + 'onWorkerStop', + 'onWebSocketConnect' + ]; + foreach ($callback_map as $name) { + if (\method_exists($class, $name)) { + $worker->$name = [$class, $name]; + } + } + if (\method_exists($class, 'onWorkerStart')) { + \call_user_func([$class, 'onWorkerStart'], $worker); + } +} + +/** + * Start worker + * @param $process_name + * @param $config + * @return void + */ +function worker_start($process_name, $config) +{ + $worker = new Worker($config['listen'] ?? null, $config['context'] ?? []); + $property_map = [ + 'count', + 'user', + 'group', + 'reloadable', + 'reusePort', + 'transport', + 'protocol', + ]; + $worker->name = $process_name; + foreach ($property_map as $property) { + if (isset($config[$property])) { + $worker->$property = $config[$property]; + } + } + + $worker->onWorkerStart = function ($worker) use ($config) { + require_once \base_path() . '/support/bootstrap.php'; + + foreach ($config['services'] ?? [] as $server) { + if (!\class_exists($server['handler'])) { + echo "process error: class {$server['handler']} not exists\r\n"; + continue; + } + $listen = new Worker($server['listen'] ?? null, $server['context'] ?? []); + if (isset($server['listen'])) { + echo "listen: {$server['listen']}\n"; + } + $instance = Container::make($server['handler'], $server['constructor'] ?? []); + \worker_bind($listen, $instance); + $listen->listen(); + } + + if (isset($config['handler'])) { + if (!\class_exists($config['handler'])) { + echo "process error: class {$config['handler']} not exists\r\n"; + return; + } + + $instance = Container::make($config['handler'], $config['constructor'] ?? []); + \worker_bind($worker, $instance); + } + }; +} + +/** + * Get realpath + * @param string $file_path + * @return string + */ +function get_realpath(string $file_path): string +{ + if (\strpos($file_path, 'phar://') === 0) { + return $file_path; + } else { + return \realpath($file_path); + } +} + +/** + * Is phar + * @return bool + */ +function is_phar(): bool +{ + return \class_exists(\Phar::class, false) && Phar::running(); +} + +/** + * Get cpu count + * @return int + */ +function cpu_count(): int +{ + // Windows does not support the number of processes setting. + if (\DIRECTORY_SEPARATOR === '\\') { + return 1; + } + $count = 4; + if (\is_callable('shell_exec')) { + if (\strtolower(PHP_OS) === 'darwin') { + $count = (int)\shell_exec('sysctl -n machdep.cpu.core_count'); + } else { + $count = (int)\shell_exec('nproc'); + } + } + return $count > 0 ? $count : 4; +} diff --git a/.history/support/helpers_20230102152429.php b/.history/support/helpers_20230102152429.php new file mode 100644 index 0000000..68f88e1 --- /dev/null +++ b/.history/support/helpers_20230102152429.php @@ -0,0 +1,543 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use support\Container; +use support\Request; +use support\Response; +use support\Translation; +use support\view\Raw; +use support\view\Blade; +use support\view\ThinkPHP; +use support\view\Twig; +use Workerman\Worker; +use Webman\App; +use Webman\Config; +use Webman\Route; + +// Webman version +const WEBMAN_VERSION = '1.4'; + +// Project base path +define('BASE_PATH', dirname(__DIR__)); + +/** + * return the program execute directory + * @param string $path + * @return string + */ +function run_path(string $path = ''): string +{ + static $run_path = ''; + if (!$run_path) { + $run_path = \is_phar() ? \dirname(\Phar::running(false)) : BASE_PATH; + } + return \path_combine($run_path, $path); +} + +/** + * if the param $path equal false,will return this program current execute directory + * @param string|false $path + * @return string + */ +function base_path($path = ''): string +{ + if (false === $path) { + return \run_path(); + } + return \path_combine(BASE_PATH, $path); +} + +/** + * App path + * @param string $path + * @return string + */ +function app_path(string $path = ''): string +{ + return \path_combine(BASE_PATH . DIRECTORY_SEPARATOR . 'app', $path); +} + +/** + * Public path + * @param string $path + * @return string + */ +function public_path(string $path = ''): string +{ + static $public_path = ''; + if (!$public_path) { + $public_path = \config('app.public_path') ? : \run_path('public'); + } + return \path_combine($public_path, $path); +} + +/** + * Config path + * @param string $path + * @return string + */ +function config_path(string $path = ''): string +{ + return \path_combine(BASE_PATH . DIRECTORY_SEPARATOR . 'config', $path); +} + +/** + * Runtime path + * @param string $path + * @return string + */ +function runtime_path(string $path = ''): string +{ + static $runtime_path = ''; + if (!$runtime_path) { + $runtime_path = \config('app.runtime_path') ? : \run_path('runtime'); + } + return \path_combine($runtime_path, $path); +} + +/** + * Generate paths based on given information + * @param string $front + * @param string $back + * @return string + */ +function path_combine(string $front, string $back): string +{ + return $front . ($back ? (DIRECTORY_SEPARATOR . ltrim($back, DIRECTORY_SEPARATOR)) : $back); +} + +/** + * Response + * @param int $status + * @param array $headers + * @param string $body + * @return Response + */ +function response(string $body = '', int $status = 200, array $headers = []): Response +{ + return new Response($status, $headers, $body); +} + +/** + * Json response + * @param $data + * @param int $options + * @return Response + */ +function json($data, int $options = JSON_UNESCAPED_UNICODE): Response +{ + return new Response(200, ['Content-Type' => 'application/json'], \json_encode($data, $options)); +} + +/** + * Xml response + * @param $xml + * @return Response + */ +function xml($xml): Response +{ + if ($xml instanceof SimpleXMLElement) { + $xml = $xml->asXML(); + } + return new Response(200, ['Content-Type' => 'text/xml'], $xml); +} + +/** + * Jsonp response + * @param $data + * @param string $callback_name + * @return Response + */ +function jsonp($data, string $callback_name = 'callback'): Response +{ + if (!\is_scalar($data) && null !== $data) { + $data = \json_encode($data); + } + return new Response(200, [], "$callback_name($data)"); +} + +/** + * Redirect response + * @param string $location + * @param int $status + * @param array $headers + * @return Response + */ +function redirect(string $location, int $status = 302, array $headers = []): Response +{ + $response = new Response($status, ['Location' => $location]); + if (!empty($headers)) { + $response->withHeaders($headers); + } + return $response; +} + +/** + * View response + * @param string $template + * @param array $vars + * @param string|null $app + * @return Response + */ +function view(string $template, array $vars = [], string $app = null): Response +{ + $request = \request(); + $plugin = $request->plugin ?? ''; + $handler = \config($plugin ? "plugin.$plugin.view.handler" : 'view.handler'); + return new Response(200, [], $handler::render($template, $vars, $app)); +} + +/** + * Raw view response + * @param string $template + * @param array $vars + * @param string|null $app + * @return Response + * @throws Throwable + */ +function raw_view(string $template, array $vars = [], string $app = null): Response +{ + return new Response(200, [], Raw::render($template, $vars, $app)); +} + +/** + * Blade view response + * @param string $template + * @param array $vars + * @param string|null $app + * @return Response + */ +function blade_view(string $template, array $vars = [], string $app = null): Response +{ + return new Response(200, [], Blade::render($template, $vars, $app)); +} + +/** + * Think view response + * @param string $template + * @param array $vars + * @param string|null $app + * @return Response + */ +function think_view(string $template, array $vars = [], string $app = null): Response +{ + return new Response(200, [], ThinkPHP::render($template, $vars, $app)); +} + +/** + * Twig view response + * @param string $template + * @param array $vars + * @param string|null $app + * @return Response + */ +function twig_view(string $template, array $vars = [], string $app = null): Response +{ + return new Response(200, [], Twig::render($template, $vars, $app)); +} + +/** + * Get request + * @return \Webman\Http\Request|Request|null + */ +function request() +{ + return App::request(); +} + +/** + * Get config + * @param string|null $key + * @param $default + * @return array|mixed|null + */ +function config(string $key = null, $default = null) +{ + return Config::get($key, $default); +} + +/** + * Create url + * @param string $name + * @param ...$parameters + * @return string + */ +function route(string $name, ...$parameters): string +{ + $route = Route::getByName($name); + if (!$route) { + return ''; + } + + if (!$parameters) { + return $route->url(); + } + + if (\is_array(\current($parameters))) { + $parameters = \current($parameters); + } + + return $route->url($parameters); +} + +/** + * Session + * @param mixed $key + * @param mixed $default + * @return mixed + */ +function session($key = null, $default = null) +{ + $session = \request()->session(); + if (null === $key) { + return $session; + } + if (\is_array($key)) { + $session->put($key); + return null; + } + if (\strpos($key, '.')) { + $key_array = \explode('.', $key); + $value = $session->all(); + foreach ($key_array as $index) { + if (!isset($value[$index])) { + return $default; + } + $value = $value[$index]; + } + return $value; + } + return $session->get($key, $default); +} + +/** + * Translation + * @param string $id + * @param array $parameters + * @param string|null $domain + * @param string|null $locale + * @return string + */ +function trans(string $id, array $parameters = [], string $domain = null, string $locale = null): string +{ + $res = Translation::trans($id, $parameters, $domain, $locale); + return $res === '' ? $id : $res; +} + +/** + * Locale + * @param string|null $locale + * @return void + */ +function locale(string $locale = null): string +{ + if (!$locale) { + return Translation::getLocale(); + } + Translation::setLocale($locale); +} + +/** + * 404 not found + * @return Response + */ +function not_found(): Response +{ + return new Response(404, [], \file_get_contents(public_path() . '/404.html')); +} + +/** + * Copy dir + * @param string $source + * @param string $dest + * @param bool $overwrite + * @return void + */ +function copy_dir(string $source, string $dest, bool $overwrite = false) +{ + if (\is_dir($source)) { + if (!is_dir($dest)) { + \mkdir($dest); + } + $files = \scandir($source); + foreach ($files as $file) { + if ($file !== "." && $file !== "..") { + \copy_dir("$source/$file", "$dest/$file"); + } + } + } else if (\file_exists($source) && ($overwrite || !\file_exists($dest))) { + \copy($source, $dest); + } +} + +/** + * Remove dir + * @param string $dir + * @return bool + */ +function remove_dir(string $dir): bool +{ + if (\is_link($dir) || \is_file($dir)) { + return \unlink($dir); + } + $files = \array_diff(\scandir($dir), array('.', '..')); + foreach ($files as $file) { + (\is_dir("$dir/$file") && !\is_link($dir)) ? \remove_dir("$dir/$file") : \unlink("$dir/$file"); + } + return \rmdir($dir); +} + +/** + * Bind worker + * @param $worker + * @param $class + */ +function worker_bind($worker, $class) +{ + $callback_map = [ + 'onConnect', + 'onMessage', + 'onClose', + 'onError', + 'onBufferFull', + 'onBufferDrain', + 'onWorkerStop', + 'onWebSocketConnect' + ]; + foreach ($callback_map as $name) { + if (\method_exists($class, $name)) { + $worker->$name = [$class, $name]; + } + } + if (\method_exists($class, 'onWorkerStart')) { + \call_user_func([$class, 'onWorkerStart'], $worker); + } +} + +/** + * Start worker + * @param $process_name + * @param $config + * @return void + */ +function worker_start($process_name, $config) +{ + $worker = new Worker($config['listen'] ?? null, $config['context'] ?? []); + $property_map = [ + 'count', + 'user', + 'group', + 'reloadable', + 'reusePort', + 'transport', + 'protocol', + ]; + $worker->name = $process_name; + foreach ($property_map as $property) { + if (isset($config[$property])) { + $worker->$property = $config[$property]; + } + } + + $worker->onWorkerStart = function ($worker) use ($config) { + require_once \base_path() . '/support/bootstrap.php'; + + foreach ($config['services'] ?? [] as $server) { + if (!\class_exists($server['handler'])) { + echo "process error: class {$server['handler']} not exists\r\n"; + continue; + } + $listen = new Worker($server['listen'] ?? null, $server['context'] ?? []); + if (isset($server['listen'])) { + echo "listen: {$server['listen']}\n"; + } + $instance = Container::make($server['handler'], $server['constructor'] ?? []); + \worker_bind($listen, $instance); + $listen->listen(); + } + + if (isset($config['handler'])) { + if (!\class_exists($config['handler'])) { + echo "process error: class {$config['handler']} not exists\r\n"; + return; + } + + $instance = Container::make($config['handler'], $config['constructor'] ?? []); + \worker_bind($worker, $instance); + } + }; +} + +/** + * Get realpath + * @param string $file_path + * @return string + */ +function get_realpath(string $file_path): string +{ + if (\strpos($file_path, 'phar://') === 0) { + return $file_path; + } else { + return \realpath($file_path); + } +} + +/** + * Is phar + * @return bool + */ +function is_phar(): bool +{ + return \class_exists(\Phar::class, false) && Phar::running(); +} + +/** + * Get cpu count + * @return int + */ +function cpu_count(): int +{ + // Windows does not support the number of processes setting. + if (\DIRECTORY_SEPARATOR === '\\') { + return 1; + } + $count = 4; + if (\is_callable('shell_exec')) { + if (\strtolower(PHP_OS) === 'darwin') { + $count = (int)\shell_exec('sysctl -n machdep.cpu.core_count'); + } else { + $count = (int)\shell_exec('nproc'); + } + } + return $count > 0 ? $count : 4; +} + +function trans_byte($byte){ + $KB = 1024; + $MB = 1024 * $KB; + $GB = 1024 * $MB; + $TB = 1024 * $GB; + if ($byte < $KB) { + return $byte . "B"; + } elseif ($byte < $MB) { + return round($byte / $KB, 2) . "KB"; + } elseif ($byte < $GB) { + return round($byte / $MB, 2) . "MB"; + } elseif ($byte < $TB) { + return round($byte / $GB, 2) . "GB"; + } else { + return round($byte / $TB, 2) . "TB"; + } +} diff --git a/.history/test_20230101184303.php b/.history/test_20230101184303.php new file mode 100644 index 0000000..e69de29 diff --git a/.history/test_20230101184304.php b/.history/test_20230101184304.php new file mode 100644 index 0000000..593161e --- /dev/null +++ b/.history/test_20230101184304.php @@ -0,0 +1,15 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + diff --git a/.history/test_20230101184538.php b/.history/test_20230101184538.php new file mode 100644 index 0000000..9ba8459 --- /dev/null +++ b/.history/test_20230101184538.php @@ -0,0 +1,25 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +get('https://google.com/'); +print_r($response); + diff --git a/.history/test_20230101184553.php b/.history/test_20230101184553.php new file mode 100644 index 0000000..3b70fd9 --- /dev/null +++ b/.history/test_20230101184553.php @@ -0,0 +1,25 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +get('https://google.com/'); +print_r($response); + diff --git a/.history/test_20230101184603.php b/.history/test_20230101184603.php new file mode 100644 index 0000000..ae0536d --- /dev/null +++ b/.history/test_20230101184603.php @@ -0,0 +1,25 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +get('https://google.com/'); +print_r($response); + diff --git a/.history/test_20230101184620.php b/.history/test_20230101184620.php new file mode 100644 index 0000000..f7bcaf7 --- /dev/null +++ b/.history/test_20230101184620.php @@ -0,0 +1,25 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +get('https://google.com/'); +print_r($response); + diff --git a/.history/test_20230101184658.php b/.history/test_20230101184658.php new file mode 100644 index 0000000..55f6b98 --- /dev/null +++ b/.history/test_20230101184658.php @@ -0,0 +1,25 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +get('https://google.com/'); +print_r($response); + diff --git a/.history/test_20230101184836.php b/.history/test_20230101184836.php new file mode 100644 index 0000000..9e8985f --- /dev/null +++ b/.history/test_20230101184836.php @@ -0,0 +1,25 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +get('https://google.com/')->body(); +print_r($response); + diff --git a/.history/test_20230101184907.php b/.history/test_20230101184907.php new file mode 100644 index 0000000..e6f82ad --- /dev/null +++ b/.history/test_20230101184907.php @@ -0,0 +1,25 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +get('https://www.workerman.net/plugin/94')->body(); +print_r($response); + diff --git a/.history/test_20230101185011.php b/.history/test_20230101185011.php new file mode 100644 index 0000000..0f500ba --- /dev/null +++ b/.history/test_20230101185011.php @@ -0,0 +1,25 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +get('https://www.bing.com/?mkt=zh-CN')->body(); +print_r($response); + diff --git a/.history/test_20230101193653.php b/.history/test_20230101193653.php new file mode 100644 index 0000000..8164f93 --- /dev/null +++ b/.history/test_20230101193653.php @@ -0,0 +1,25 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +get('https://www.bing.com/?mkt=zh-CN')->body(); +print_r(parse_url('/?remix_userkey=1e8f326d20604ada541b4f3a67d19946&remix_userid=22770140')); + diff --git a/.history/test_20230101194107.php b/.history/test_20230101194107.php new file mode 100644 index 0000000..e310985 --- /dev/null +++ b/.history/test_20230101194107.php @@ -0,0 +1,31 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +get('https://www.bing.com/?mkt=zh-CN')->body(); +$url=parse_url('/?remix_userkey=1e8f326d20604ada541b4f3a67d19946&remix_userid=22770140'); +$queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } +print_r($params); diff --git a/.history/test_20230101194121.php b/.history/test_20230101194121.php new file mode 100644 index 0000000..d6d5b42 --- /dev/null +++ b/.history/test_20230101194121.php @@ -0,0 +1,31 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +get('https://www.bing.com/?mkt=zh-CN')->body(); +$url=parse_url('remix_userkey=1e8f326d20604ada541b4f3a67d19946&remix_userid=22770140'); +$queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } +print_r($params); diff --git a/.history/test_20230101194141.php b/.history/test_20230101194141.php new file mode 100644 index 0000000..74b7871 --- /dev/null +++ b/.history/test_20230101194141.php @@ -0,0 +1,31 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +get('https://www.bing.com/?mkt=zh-CN')->body(); +$url='/?remix_userkey=1e8f326d20604ada541b4f3a67d19946&remix_userid=22770140'; +$queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } +print_r($params); diff --git a/.history/test_20230101194201.php b/.history/test_20230101194201.php new file mode 100644 index 0000000..eac1b69 --- /dev/null +++ b/.history/test_20230101194201.php @@ -0,0 +1,31 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +get('https://www.bing.com/?mkt=zh-CN')->body(); +$url=parse_url('/?remix_userkey=1e8f326d20604ada541b4f3a67d19946&remix_userid=22770140')['query']; +$queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } +print_r($params); diff --git a/.history/test_20230101214411.php b/.history/test_20230101214411.php new file mode 100644 index 0000000..81452bd --- /dev/null +++ b/.history/test_20230101214411.php @@ -0,0 +1,24 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +. + +head()); diff --git a/.history/test_20230101214514.php b/.history/test_20230101214514.php new file mode 100644 index 0000000..411b286 --- /dev/null +++ b/.history/test_20230101214514.php @@ -0,0 +1,24 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +headers()); diff --git a/.history/test_20230101214950.php b/.history/test_20230101214950.php new file mode 100644 index 0000000..c0b58ac --- /dev/null +++ b/.history/test_20230101214950.php @@ -0,0 +1,24 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +body()); diff --git a/.history/test_20230101215608.php b/.history/test_20230101215608.php new file mode 100644 index 0000000..c0b58ac --- /dev/null +++ b/.history/test_20230101215608.php @@ -0,0 +1,24 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +body()); diff --git a/.history/test_20230101222541.php b/.history/test_20230101222541.php new file mode 100644 index 0000000..fc510a8 --- /dev/null +++ b/.history/test_20230101222541.php @@ -0,0 +1,24 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +headers()); diff --git a/.history/test_20230101222547.php b/.history/test_20230101222547.php new file mode 100644 index 0000000..6bf48b8 --- /dev/null +++ b/.history/test_20230101222547.php @@ -0,0 +1,24 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +headers()); diff --git a/.history/test_20230101222559.php b/.history/test_20230101222559.php new file mode 100644 index 0000000..61b6e8a --- /dev/null +++ b/.history/test_20230101222559.php @@ -0,0 +1,24 @@ +// Copyright (C) 2023 enoch@Laysense.com +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +header('Content-Type')[0]); diff --git a/.history/test_20230101222611.php b/.history/test_20230101222611.php new file mode 100644 index 0000000..bbceb46 --- /dev/null +++ b/.history/test_20230101222611.php @@ -0,0 +1,10 @@ + +header('Content-Type')[0]); diff --git a/.history/test_20230101222616.php b/.history/test_20230101222616.php new file mode 100644 index 0000000..bf87196 --- /dev/null +++ b/.history/test_20230101222616.php @@ -0,0 +1,10 @@ + +header('Content-Type')); diff --git a/.history/test_20230101232715.php b/.history/test_20230101232715.php new file mode 100644 index 0000000..7635a0c --- /dev/null +++ b/.history/test_20230101232715.php @@ -0,0 +1,13 @@ + +get($kf.$path)); \ No newline at end of file diff --git a/.history/test_20230101232744.php b/.history/test_20230101232744.php new file mode 100644 index 0000000..946b98a --- /dev/null +++ b/.history/test_20230101232744.php @@ -0,0 +1,17 @@ + +get($kf.$path)); +$re=$redis->get($kf.$path) +if(!$re){ + echo(233); +} \ No newline at end of file diff --git a/.history/test_20230101232746.php b/.history/test_20230101232746.php new file mode 100644 index 0000000..6db8f9d --- /dev/null +++ b/.history/test_20230101232746.php @@ -0,0 +1,17 @@ + +get($kf.$path)); +$re=$redis->get($kf.$path); +if(!$re){ + echo(233); +} \ No newline at end of file diff --git a/.history/test_20230101232911.php b/.history/test_20230101232911.php new file mode 100644 index 0000000..1ecf74b --- /dev/null +++ b/.history/test_20230101232911.php @@ -0,0 +1,17 @@ + +get($kf.$path)); +$re=$redis->get($kf.$path); +if($re){ + echo(233); +} \ No newline at end of file diff --git a/.history/test_20230101232916.php b/.history/test_20230101232916.php new file mode 100644 index 0000000..3533500 --- /dev/null +++ b/.history/test_20230101232916.php @@ -0,0 +1,17 @@ + +get($kf.$path)); +$re=$redis->get($kf.$path); +if($re){ + echo(233); +} \ No newline at end of file diff --git a/.history/test_20230101233452.php b/.history/test_20230101233452.php new file mode 100644 index 0000000..d62f2c4 --- /dev/null +++ b/.history/test_20230101233452.php @@ -0,0 +1,15 @@ + +'2','3'=>'4'); +$redis->hset($rpath,'CT',$ct); \ No newline at end of file diff --git a/.history/test_20230101233521.php b/.history/test_20230101233521.php new file mode 100644 index 0000000..77c2fa9 --- /dev/null +++ b/.history/test_20230101233521.php @@ -0,0 +1,16 @@ + +'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); \ No newline at end of file diff --git a/.history/test_20230102113630.php b/.history/test_20230102113630.php new file mode 100644 index 0000000..ea5c447 --- /dev/null +++ b/.history/test_20230102113630.php @@ -0,0 +1,23 @@ + +'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +$key = 'test_key'; + Cache::set($key, rand()); + return response(Cache::get($key)); \ No newline at end of file diff --git a/.history/test_20230102113637.php b/.history/test_20230102113637.php new file mode 100644 index 0000000..8270e20 --- /dev/null +++ b/.history/test_20230102113637.php @@ -0,0 +1,22 @@ + +'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +$key = 'test_key'; + Cache::set($key, rand()); diff --git a/.history/test_20230102114305.php b/.history/test_20230102114305.php new file mode 100644 index 0000000..eb6e19b --- /dev/null +++ b/.history/test_20230102114305.php @@ -0,0 +1,21 @@ + +'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +print_r(parse_url('http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/resources/build/global.css?0.495')); \ No newline at end of file diff --git a/.history/test_20230102125853.php b/.history/test_20230102125853.php new file mode 100644 index 0000000..7eb6ae7 --- /dev/null +++ b/.history/test_20230102125853.php @@ -0,0 +1,26 @@ + +'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); +echo("\n"); +print_r($return->body()); +echo("\n"); +print_r($return->headers()); \ No newline at end of file diff --git a/.history/test_20230102125938.php b/.history/test_20230102125938.php new file mode 100644 index 0000000..d6819a2 --- /dev/null +++ b/.history/test_20230102125938.php @@ -0,0 +1,27 @@ + +'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/11773748/f72be8'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); +echo("\n"); +print_r($return->body()); +echo("\n"); +print_r($return->headers()); \ No newline at end of file diff --git a/.history/test_20230102164516.php b/.history/test_20230102164516.php new file mode 100644 index 0000000..12813a8 --- /dev/null +++ b/.history/test_20230102164516.php @@ -0,0 +1,27 @@ + +'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/11773748/f72be8ujiahuiohwuou'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); +echo("\n"); +print_r($return->body()); +echo("\n"); +print_r($return->headers()); \ No newline at end of file diff --git a/.history/test_20230102164746.php b/.history/test_20230102164746.php new file mode 100644 index 0000000..fd0afe1 --- /dev/null +++ b/.history/test_20230102164746.php @@ -0,0 +1,27 @@ + +'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); +echo("\n"); +print_r($return->body()); +echo("\n"); +print_r($return->headers()); \ No newline at end of file diff --git a/.history/test_20230102165125.php b/.history/test_20230102165125.php new file mode 100644 index 0000000..02db952 --- /dev/null +++ b/.history/test_20230102165125.php @@ -0,0 +1,35 @@ + +'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=20){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); \ No newline at end of file diff --git a/.history/test_20230102165145.php b/.history/test_20230102165145.php new file mode 100644 index 0000000..f88e9c4 --- /dev/null +++ b/.history/test_20230102165145.php @@ -0,0 +1,35 @@ + +'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=40){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); \ No newline at end of file diff --git a/.history/test_20230102170441.php b/.history/test_20230102170441.php new file mode 100644 index 0000000..bc1e2c1 --- /dev/null +++ b/.history/test_20230102170441.php @@ -0,0 +1,35 @@ + +'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=30){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); \ No newline at end of file diff --git a/.history/test_20230102171751.php b/.history/test_20230102171751.php new file mode 100644 index 0000000..69ff94d --- /dev/null +++ b/.history/test_20230102171751.php @@ -0,0 +1,38 @@ + +'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +/** +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=30){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); +**/ +mkdir(base_path().'/books/'.date("Y/m/"),0777,true); \ No newline at end of file diff --git a/.history/test_20230102172135.php b/.history/test_20230102172135.php new file mode 100644 index 0000000..aa10de9 --- /dev/null +++ b/.history/test_20230102172135.php @@ -0,0 +1,41 @@ + +'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +/** +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=30){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); +**/ +$name=base64_encode('/asss/sssc'); +$filepath=base_path().'/books/'.date("Y/m/").$name.'bin'; +$file = fopen("$filepath","w"); +fclose($file); diff --git a/.history/test_20230102172331.php b/.history/test_20230102172331.php new file mode 100644 index 0000000..4e53a44 --- /dev/null +++ b/.history/test_20230102172331.php @@ -0,0 +1,44 @@ + +'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +/** +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=30){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); +**/ +$name=base64_encode('/asss/sssc'); +if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); +} +$filepath=base_path().'/books/'.date("Y/m/").$name.'bin'; +$file = fopen("$filepath","w"); +fclose($file); diff --git a/.history/test_20230102172344.php b/.history/test_20230102172344.php new file mode 100644 index 0000000..f3ae08e --- /dev/null +++ b/.history/test_20230102172344.php @@ -0,0 +1,44 @@ + +'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +/** +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=30){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); +**/ +$name=base64_encode('/asss/sssc'); +if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); +} +$filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; +$file = fopen("$filepath","w"); +fclose($file); diff --git a/.history/test_20230102173936.php b/.history/test_20230102173936.php new file mode 100644 index 0000000..e2a12ce --- /dev/null +++ b/.history/test_20230102173936.php @@ -0,0 +1,40 @@ + +'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +/** +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=30){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); +**/ +$af='attachment; filename="How to:如何不切实际地解决实际问题(What if作者新作!比尔·盖茨推荐他每一本书!百万级畅销书作者、全球科普网红兰道尔·门罗超大脑洞来袭!)... (z-lib.org).epub";filename*=utf-8''How%20to%EF%BC%9A%E5%A6%82%E4%BD%95%E4%B8%8D%E5%88%87%E5%AE%9E%E9%99%85%E5%9C%B0%E8%A7%A3%E5%86%B3%E5%AE%9E%E9%99%85%E9%97%AE%E9%A2%98%EF%BC%88What%20if%E4%BD%9C%E8%80%85%E6%96%B0%E4%BD%9C%EF%BC%81%E6%AF%94%E5%B0%94%C2%B7%E7%9B%96%E8%8C%A8%E6%8E%A8%E8%8D%90%E4%BB%96%E6%AF%8F%E4%B8%80%E6%9C%AC%E4%B9%A6%EF%BC%81%E7%99%BE%E4%B8%87%E7%BA%A7%E7%95%85%E9%94%80%E4%B9%A6%E4%BD%9C%E8%80%85%E3%80%81%E5%85%A8%E7%90%83%E7%A7%91%E6%99%AE%E7%BD%91%E7%BA%A2%E5%85%B0%E9%81%93%E5%B0%94%C2%B7%E9%97%A8%E7%BD%97%E8%B6%85%E5%A4%A7%E8%84%91%E6%B4%9E%E6%9D%A5%E8%A2%AD%EF%BC%81%EF%BC%89...%20%28z-lib.org%29.epub'; +$filerealname=explode(";",$af); +print_r($filerealname) \ No newline at end of file diff --git a/.history/test_20230102174024.php b/.history/test_20230102174024.php new file mode 100644 index 0000000..17c84c4 --- /dev/null +++ b/.history/test_20230102174024.php @@ -0,0 +1,43 @@ + +'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +/** +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=30){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); +**/ +$af=<<'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +/** +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=30){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); +**/ +$af=<<'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +/** +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=30){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); +**/ + +$af= <<'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +/** +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=30){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); +**/ + +$af= <<'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +/** +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=30){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); +**/ + +$af= <<'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +/** +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=30){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); +**/ + +$af= <<'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +/** +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=30){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); +**/ + +$af= <<'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +/** +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=30){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); +**/ + +$af= <<'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +/** +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=30){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); +**/ + +$af= <<'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +/** +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=30){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); +**/ + +$af= << and contributors (see https://github.com/walkor/webman/contributors) + +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/README.md b/README.md new file mode 100644 index 0000000..34c8bd4 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# webman + +High performance HTTP Service Framework for PHP based on [Workerman](https://github.com/walkor/workerman). + +# Manual (文档) + +https://www.workerman.net/doc/webman + +# Home page (主页) +https://www.workerman.net/webman + + +# Benchmarks (压测) + +https://www.techempower.com/benchmarks/#section=test&runid=9716e3cd-9e53-433c-b6c5-d2c48c9593c1&hw=ph&test=db&l=zg24n3-1r&a=2 +![image](https://user-images.githubusercontent.com/6073368/96447814-120fc980-1245-11eb-938d-6ea408716c72.png) + +## LICENSE + +MIT diff --git a/app/controller/File.php b/app/controller/File.php new file mode 100644 index 0000000..2f4777d --- /dev/null +++ b/app/controller/File.php @@ -0,0 +1,101 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $name=base64_encode($path); + $redis = Redis::connection('default'); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + return json(['code'=>200, 'msg'=>'找到文件', 'size'=>$redis->hget('BookCache_'.$name,'Size'),'name'=>$redis->hget('BookCache_'.$name,'Name')]); + }else{ + return json(['code'=>202,'msg'=>'文件下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + } + public function download(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $url='http://'.getenv('Zlibrary')."$path"; + $get=Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary')); + $head=$get->head($url); + $ContentLength=(int)$head->header('Content-Length'); + $size=round(($ContentLength/1048576),2); + if($size>=30){ + return json(['code'=>500,'msg'=>'文件太大了!']); + } + if($head->header('Content-Type')=='text/html; charset=UTF-8'){ + return json(['code'=>404,'msg'=>'链接错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + $redis->hset('BookCache_'.$name,'Time',time()); + $redis->hset('BookCache_'.$name,'Date',date("Y/m/d H:i:s")); + $redis->hset('BookCache_'.$name,'Status','Downloading'); + if(!is_dir(base_path().'/books/'.date("Y/m/"))){ + mkdir(base_path().'/books/'.date("Y/m/"),0777,true); + } + + $filepath=base_path().'/books/'.date("Y/m/").$name.'.bin'; + $return=$get->get($url)->body(); + $file = fopen("$filepath","w"); + fwrite($file,$return); + fclose($file); + $filerealname=explode('"',explode(";",$head->header('Content-Disposition'))[1])[1]; + $redis->hset('BookCache_'.$name,'Path',$filepath); + $redis->hset('BookCache_'.$name,'Size',$size); + $redis->hset('BookCache_'.$name,'Name',$filerealname); + $redis->hset('BookCache_'.$name,'Status','OK'); + return json(['code'=>200,'name'=>"$filerealname",'size'=>"$size"]); + } + public function get(Request $request) + { + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + $path=$request->input('path','blank'); + if($key=='blank' || $id=='blank'){ + return json(['code'=>509,'msg'=>'未登录或参数错误']); + } + $redis = Redis::connection('default'); + $name=base64_encode($path); + if($redis->exists('BookCache_'.$name)){ + if($redis->hget('BookCache_'.$name,'Status')=='OK'){ + $redis->hset('BookCache_'.$name,'LastDown',time()); + return response()->download($redis->hget('BookCache_'.$name,'Path'),$redis->hget('BookCache_'.$name,'Name')); + }else{ + return json(['code'=>202,'msg'=>'文件仍在下载中']); + } + }else { + return json(['code'=>201, 'msg'=>'未找到文件']); + } + + } + + +} \ No newline at end of file diff --git a/app/controller/IndexController.php b/app/controller/IndexController.php new file mode 100644 index 0000000..d54f0ed --- /dev/null +++ b/app/controller/IndexController.php @@ -0,0 +1,173 @@ +cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return redirect('/login'); + } + + + $path=$request->uri(); + if($path==''||$path=='/'){ + $path='/?signAll=1&ts=1657'; + } + $rpath=$kf.urlencode("$path"); + if($redis->get($rpath)){ + $response->withHeaders(json_decode($redis->hget($rpath,'CT'))); + $response->withBody($redis->hget($rpath,'body')); + return $response; + } + + $url='http://'.getenv('Zlibrary').$path; + $auth=array('remix_userid'=>"$id",'remix_userkey'=>"$key",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); + $return = Http::withProxy('socks5h://'.getenv('proxy'))->withCookies($auth,getenv('Zlibrary'))->get($url); + $response->withHeaders($return->headers()); + + $back=$return->body(); + if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + $ver=getenv('version'); + $front= << +
+
+ Zlibrary Proxy(v$ver) UserID:$id [退出账号] [PublicMirrorsNetwork] +
+
+EOF; + $back=$front.$back; + } + + /**Make Cache */ + if($path=='/resources/build/global.js?0.495' || $path=='/resources/build/global.css?0.495' || $path=='/resources/ext/freewall.js' || preg_match("/^image*/",$return->header('Content-Type')) ){ + $redis->hset($rpath,'CT',json_encode($return->headers())); + $redis->hset($rpath,'body',$back); + $redis->expire($rpath,43200); + } + + + + $response->withBody($back); + return $response; + } + + public function login(Request $request) + { + return view('login'); + } + public function check(Request $request) + { + $username=$request->post('name','blank'); + $password=$request->post('password','blank'); + $code=$request->post('code','blank'); + if($username=='blank' || $password=='blank' || $code=='blank'){ + return json(['code'=>500, 'msg'=>'缺少参数']); + } + + try { + $V=v::Email()->setName('用户名')->check($username); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->setName('密码')->noWhitespace()->check($password); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + try { + $V=v::stringType()->length(5, 5)->setName('验证码')->noWhitespace()->check($code); + } catch (ValidationException $exception) { + return json(['code'=>500, 'msg'=>$exception->getMessage()]); + } + + if (strtolower($code) !== $request->session()->get('captcha')) { + return json(['code' => 400, 'msg' => '输入的验证码不正确']); + } + + $url='http://'.getenv('ZlibraryLogin').'/rpc.php'; + $response = Http::withProxy('socks5h://'.getenv('proxy'))->post("$url", ['isModal' => true,'email'=>"$username",'password'=>"$password",'site_mode'=>'books','action'=>'login','redirectUrl'=>'','isSinglelogin'=>'1','isTorVersion'=>'1','gg_json_mode'=>'1']); + if(!$response->successful()){ + return json(['code' => 501, 'msg' => '登陆失败,服务端错误']); + } + $return=$response->body(); + $return=json_decode($return); + if(isset($return->response->validationError)){ + return json(['code' => 502, 'msg' => 'Zlib登陆失败:'.$return->response->message]); + } + $url=parse_url($return->response->params)['query']; + $queryParts = explode('&', $url); + $params = array(); + foreach ($queryParts as $param) { + $item = explode('=', $param); + $params[$item[0]] = $item[1]; + } + + return json(['code'=>200,'msg'=>'登陆成功','userid'=>$params['remix_userid']])->cookie('id', $params['remix_userid'],43200,'/')->cookie('key', $params['remix_userkey'],43200,'/'); + } + public function code(Request $request) + { + // 初始化验证码类 + $builder = new CaptchaBuilder; + // 生成验证码 + $builder->build(); + // 将验证码的值存储到session中 + $request->session()->set('captcha', strtolower($builder->getPhrase())); + // 获得验证码图片二进制数据 + $img_content = $builder->get(); + // 输出验证码二进制数据 + return response($img_content, 200, ['Content-Type' => 'image/jpeg']); + } + public function logout(Request $request) + { + $response = response(); + $response->cookie('id','', -1,'/'); + $response->cookie('key','', -1,'/'); + $response->header('Location', '/login'); + $response->withStatus(302); + return $response; + } + + public function download(Request $request) + { + + $id=$request->cookie('id', 'blank'); + $key=$request->cookie('key', 'blank'); + if($key=='blank' || $id=='blank'){ + return redirect('/login'); + } + $path=$request->uri(); + View::assign([ + 'id' => $id, + 'key'=> $key, + 'path'=> $path, + ]); + return view('index'); + + } + + public function file(Request $request) + { + + return response()->file(base_path() . '/app/controller/IndexController.php'); + + } + +} diff --git a/app/functions.php b/app/functions.php new file mode 100644 index 0000000..5c9c58d --- /dev/null +++ b/app/functions.php @@ -0,0 +1,4 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace app\middleware; + +use Webman\MiddlewareInterface; +use Webman\Http\Response; +use Webman\Http\Request; + +/** + * Class StaticFile + * @package app\middleware + */ +class StaticFile implements MiddlewareInterface +{ + public function process(Request $request, callable $next): Response + { + // Access to files beginning with. Is prohibited + if (strpos($request->path(), '/.') !== false) { + return response('

403 forbidden

', 403); + } + /** @var Response $response */ + $response = $next($request); + // Add cross domain HTTP header + /*$response->withHeaders([ + 'Access-Control-Allow-Origin' => '*', + 'Access-Control-Allow-Credentials' => 'true', + ]);*/ + return $response; + } +} diff --git a/app/middleware/Throttle.php b/app/middleware/Throttle.php new file mode 100644 index 0000000..1a67b15 --- /dev/null +++ b/app/middleware/Throttle.php @@ -0,0 +1,26 @@ +route ) { + $params = $route->param(); + } + return (new \yzh52521\middleware\Throttle())->handle($request, $next, $params??[]); + } +} \ No newline at end of file diff --git a/app/model/Test.php b/app/model/Test.php new file mode 100644 index 0000000..92d70e3 --- /dev/null +++ b/app/model/Test.php @@ -0,0 +1,29 @@ + + + + + + + + + + + + (ProxyDownload)Z-Library + + + +
+
+
+ Zlibrary Proxy(v) UserID: [退出账号] +
+
+
+ [返回ZlibraryProxy] +

下载图书

+ +

+
+ + +
+
+ + + + diff --git a/app/view/login.html b/app/view/login.html new file mode 100644 index 0000000..8adda7e --- /dev/null +++ b/app/view/login.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + 镜像站增加申请-Mirrors.pw + + + + +
+

Z-library Proxy


+

这是一个Zlibrary的代理镜像

+ 由[PublicMirrorsNetwork]维护 + +
+ 本代理利用广大的Tor代理和中继节点,基于TOR技术提供服务 +
+ 本代理使用Laysense提供的强大内部SD-WAN技术 +
+ 使用前请确保您的行为符合当地法律 +
+ 由于Zlibrary的邮件服务器已经宕机,任何新注册和更改密码请求均无效,均无法使用,如果您的账号还未通过邮箱激活将无法使用本服务 +
+ 本代理不会保存您的密码(仅在浏览器cookies保存您的ID) +
+ +
+ +

登录到Z-Library

+
+
+

+ + +

+

+ + +

+

+ + +

+ +

+
+

+ +

+
+
+ + + + + + + + \ No newline at end of file diff --git a/books/2023/01/L2RsLzE2ODg1OTY1L2FkNmE0Ng==.bin b/books/2023/01/L2RsLzE2ODg1OTY1L2FkNmE0Ng==.bin new file mode 100644 index 0000000000000000000000000000000000000000..eb543bcbdb98bf3944effe74e39d436af9255606 GIT binary patch literal 3538695 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

!2PTf&-{; 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%0A39MdZrlj=aT=r9<=lqs7@A(`Um9^7BrIEee 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

  • }0t9+gIzgbYFbe{M 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�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 z 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 uYa+x$; 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%0DioR8n9?0Z> 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

    jNDrP^$|C6O>B+|q5~@39l?oKqn%L}V$}uQlI3 z@~9XZC`C9Vd7Jh_+EENDg|L5U=wD)ziX*c&C5BYu0k?WYzL$(1RlRopMV{)s-c>7c7A{*=;W1jpw(Y4%DBHXeo zNSO#AwcdzaiYl6Ek%_xqh?x>&wR|uTJEXvi?0cSBGZQA%ehZGeUg3W-<>>W2d@0CU zQUpEx=vh517K8TF|70qTN$y{N$0YZ!j!Euc(@b(d)}LLV;Hm2vyNP?}@cQJ~%@!=p z!hE%6R6O}G_4tBn9o082%IHbaBjVRF{boI6ot~;z=aa95)Ekv2O{qYJHy^x>@N!R; zdQ?b}2s*IrXf{>D#-9{Mkt}6CJLG2v&tgY2<2-al%lGtejr);w`t7Fp55A@u zDhHA_+*h^Ix*g{he`r|XbEce0%-U@s%vjY1MXNP|0B2QTOh(|P1G;R8d2vOVN8p8I z70J|}9gBW-qnq}Y!Sd^)sIE=V4__phWu}*8MOsQIQ)uRU^r{U7^*@}K zU@9(IB{-M``!g%qEH;r4s8xe@HQK$7Ztkrfm-b6@1FMtz8G-_~Q zv@Og*q|kn{%w)-y&w3wx{?;wSE)4bQnVo=&*Tv4&V*(C&O77DeK(@)Or%D!A7WOKq z6x+6lw$jXP!r_PUdAVML=GwPd_11P$PoZq|la5P<3{?SD)E%^#iARK2#R(SP8n)I! ze7V2y)HgY$OC4Krt&?RY5UM(Qg8!&k*gv@+-hhT1-EewnR`FDZ`ixm4Om}CWiPk@| z2C2cP!6XME85#YKKtq;n?S=8Yc#E-|oW#9}ukEsD9aeV}csbwFh0Lv!d%%Xu9DdJg z9wCtMVmf{!NtU z61Ou?b>_!ynYpyGIQu(Xq6XPfa7jAkgUg&7L9BW#iZB6og?dzEbXrkNJNx?A zkK<1B)nrh1d3rpJYe*L55EtOm3&qcuDbu7kSj4^DxzbPp&-qzG(^=C>fwH5SdLp}? zzl}fY5z}4Iy};%gt<--o^=c*f-;6dh$snUurw)Uxs4yEhq$RDlmCbG}QUtp_pbcHC zs|38V-XI{}YspAP^PR{y9P>87T7eEwLmcVhl5U>%6|rzH?`p3I`&|CJXNb&s)7u}%f(sslY?(}JIQI!7P`E5t(fSZ+O#`UtY8+Tdj>>x71CF>e4u9PVDaXy_~RJ= z9*+U_>`fK&0hc&l%w Hot5By8hF!lDY4JF40QU!e&uy$!7@B1XPlP8zDtX^RSI z$(Oq@(~;|ZJ5DJLG&IXpe@GXwaMt%RD=_};58GI3rvptMIfN2o4z`x z`GiyUoLVb~k+Z4;PZG5DBas6?3ReI1n%=`)Np3VtVY8(Vcx$~dty{`xSZ2F_7gW`h zX@Bt#+k|zLFo|MF#p5kM&`R*UHZ?}lIDOs9M)*+{0qw`JbIP~EBg^Vq=a+}#(V6BW zTs!o_T!y_vEB>}|I6_rqypuH9Yf9ff)>?$8iuEd7evfvn;3X5$M045lXdye%4*KS^ zHMnVwH6)7_mF(7vI7*PlWy2+rlq{66`e4bz*Jxu47t44~+BI z6+7|aW)GEbU|SV?$3xpw;$62gX|fPvR?`NV@s9p)2BJ$HMXV|Kgjru(>a$7s(KVi9 z6@y5BjCRjR(}#DksB2@JLfX&`_CO0|v{KN~UQ)#I$$YJ^X<)Ux9gNEw$ajd7f!S%* zgKjIjc&B;sr3W2zc%DWgC8p_@!YHh9W5|k9q+mHNPRshb3pxl^QWO6jx3ukOUB+Te zV5>)#>juI{45^;-E`)ERT~3T)bpWCOHPN`gu;Q+7h2<|Mdd|=N=L_sQ3N4WrRpWXTAt`}U$Mi;`gi_nwP?QOA>BrS&E=>w5Nff`xYk>tjhqZ>d~meX z${_tcw6nDz;!TOWU#b6#qeKGyNGCw3le4W3J=J^`|E%3&&Gg z_J3TPwmg)nM-9+3&T2Jcy4)uyR5RM9G^#jCp1-<(-DQ6{DO};EoRAwB*|6S~k*bPk zve5&p8L=_iw$DCj8Xr7zdPisByhYj{ZLOCkwuK1V(#Yj|lr_2E3A$5YcHB3WOzR+6 z6oNJcal+TavXS?4U_QWfhy|=zO6SlWH5j~Bb66lqe+w(05-6>b^q#YloCh zQ+chU3g(nTqLeQXccM8aQ_hd0kxNL4)`W(4Cg8tWqf8+orQ&ks1Ht%CZk5UHQ2Axo zM5PVNPJIIxo$;*UuP1Mk)M^(%LCcdnQ4tytAI=+tP5pX>+gq=htXThk>axBhM~pGk zGAiYxI70;}`upeC&975EHQzasZpckgkwklr59N8Wk)0wQlAnZwYBB4dOf+_=3W=(p z4CF)j3t6=vSpHC0*wC63)6P$tr&8ohdi{9*+V^{GaEetCK)d-)btK-ufnmze%cqls zn;Fy-Ux^VG$FecUeKxC9I!64pmbV{S*uHGs$5%J9l?<0YyaTU}DrQCrI^EG37N1Z@ z=sp-nO7}hHexy6C#Ba;fM}=Ojt@EPc6I3VzW@PPtWR`Q!Y>M=&0HT+fIv zx}aODPIc)o22)noFXM^J{(?2K+jiMqvi^IzO2$Ftl{AM|)vv;4k)ptC#>bDU#2M?icv*fCGW?I1Fvs(yGye0nt2g`rt!E57))1 z3`xW!yHy+s<>@zKur=Csmx+}XYtpear)o$|733F`tWW94O|qg9IR+0`?{n9bHLSaj zIX&y+@K?~fPq_Jv(WWhB#!vZb&~nbK?5@&2s1zfGKE$4jCHE@?mGMkT&Z&4!v{9bd z<)eard0D8gK=-$5GW$Q;1f9^|@~53JPUM>AU;~Fkapr9~xjZd1%q)_^;a9zB1nikC z_4TYVP1kDDlPG~n;SvIE2@%tFkdoH%Tq4ooS5nKS{kgS1HB8NBje=2j3Q(4(m|&t{ zncwPK4C>%{u@Rmu)^i;n@!W{tqQ;5GkHK_1k>&6Ojv1NiV9W{rFQ2n99HR=6;*nx^ zv7VK;Ve`lFN&CApL^`5ob$W~J2Wh0!(SATyzX*9p7Rz{r^moJTd-%Fx%^l#ia1^tS z?$@h<<8ibk!I7jSPEw>$dXS*-f{AcU)!exlN#HHDQ=o-m#2tE#>=dsp+&mc*RUW4* zLb`fF1p{BqU7pRU=EMvViS$f0&t+-W)OD=WN}Y-%T)G|k`}D4b|7$v39PG;8zxZ3s z%$ippxxVIKU1FpiCgbR-;wfKn40RrYaSdQ{SGtn(D_sh~amGBD5~N^wU#`EW?L@zo zsQ~5UvX0`*b$>PtuYtthKa zH%i6u<56wuv@m^&Y1Wi5_)I@3)`F{2TKMsv3{5sDukBGg2h{+`BEtU+cHC!Qj6U_P#v~4k>2>r zJOfvwg&v~;h-2$=7^x(ktI?2Mp31yGY%620P5vvKUcwfAz2R01?}^&gUjP+QQ>=`<8!pFdW#TJ;B1CDj4l?N}jdvrMZW?tGnl$U*w# zsA@$snpXcNBctWxUU2ioP9G#BduQANghs^uqP7cRLs|AXGf~N%H=ZQJp;ie5k2 zCaH`TnagdL>Gm|S>_I2oMq5xY+zbbepg#@I>p|ls8GlLzilf_Y(#WHmkBLE-qvmwW zu)}m5^_89iReSlE@3sG%ZWOkn|I_J^$Rc!&W_Ggc5;A|Xa}f4xg!)qo3`e%(Ax^^v zr+q;)<;5O%C}CjbE8T4Ezr;xUP^TF<{js4BLkF2C>5Ww_ZR z{>qRQ#2XABJ> zG}o=}S&b4*3e zVUmiD%8E>%zNxu%6=h}WPs1qhdoyUl6zo0|ng8P&uav5yL6?I+#GDlXC*@CiaWE-7 z<@HS-vMSwvZ?(`%1irle{32`4q^;TY2OnWpx$ApSW*~GzT$E#~Z(#BZ1?L3Z#+LLNW*EFS8cQ9@;oj;EUBRqw+oFG4Wm4TkK>eAp>Bq{{u<|SRwG(CvfL-x9| zfPU+!sANZ|l|b&7oxi&;aTgX3s(`(L&ocQK^S?7EAVK0d=#yfI9FK$vjDRCc4%1U# zgZ%{GKK^oagP&RLEe3(dzG-%3YX@KV(l?X^{hu6 zRg|H{XxDR=0rSePY`u}a%yM=?83txM!JIV3J>D~0>R2tZ)N7>ys8Z`Z?sjR2SnjcU zgonJ+ZYxwCsGCZOSYm#X!{`@Mc%BV%pTT(et;&aFth_Cn$RF*L>;Z1I2FF`$xc17w7#z`{ZQyTQ`NGtGLx&V|Fu>^2Xw1pVWYa) zo{9t+Bqf3iHcS?tO9-4}JKJ)wF0Vd)vw(LY(x@JobXl{|nSBIoqt{3u@w`xQa zl)RpSn$;^8nW%*tHwi^Oj9ERF&G7VWdHbSyD)@U6!m!fB#u*cq88_0ExU?f-qJP~t z?XXtXm)?jYEZY`Qa>S#t9pAd}L?SfHfoe?o zvX`9QmNq0$g{;!SwGJKhhkp$GP(eG!#xo?d)L#voA08d;cXAxPAQ|RH#v^xZ55p95>JR!^X)lc8@W&R+>sH{<>aB2 z#LnG-n{4iDmD^5lE+Y44{qehZbT61(JD0G7=H`KErC zqG9W(;!G;|y7FhHcNV|Mg|Sp}q;!=$>E4wa?t#>#@8O zbmtNaM~w?~V98U6W8Y9#VDn>GQ-0~_%^{{9#m7T`zX2cmgFDA^AP0VYcX6r zbXOqoLJ~8j@#hp9f1NC_2Q<1Gy~b}iKxE?nBmhU|q;x<9Je7b(+)aZc&m}kTCvJ?@ zXf$Fqd!<|3<;S)Y9vH1&`3!BarmNglqADI_+M1EnxEXg)x7J_)aAK)sg_ZW1LrO|% z{5?~2bYBU^Ny^K)A}UX`a%es=EnuQ8D8V125GiqY2~{L>3`#0h;G|8l*m6Z<9X#)# zCO$d-le3A&ALXRpz~Nmn5ec8n?uYp8oQS{oA>D^9mx9I|?x9$=>VFgap9K}7^3v=~{o2n;r4JkrbdieWAs14}| zkur~A240_rw4fUP{}@jtAxRNCC{uB&SN+H6XdHvFuJe#YZSH`>W8UF3|HB`pYh>c0 zDJqO~NUJ#Zp)bGw(PeLE!ET3!_t(qfnsV0czjD9ORW_Cz060rbk%2Euoi14wK7ruj z$39qh5F26c6&Ubv(*Z-AQJ+WqZan0OwuPhND41U zrbuBDV7Uk9jM#ZOdUE$<8ua8vE36mns-yh4aw4(m3`(r9I(cND zkL?`zl%szW_drJrY00d=Nt2{;AEVJT0<__fS{RN?#|T3(EIZp_?aJqbeU1BD#RB-S z{@0n(@kpxlU4bD)8PyD{qxly5iPM9W;^n!erOC7AomLYd7c4r3i+B!4~9xj&6HK8)%T7UJL#iD z4=FoyR~%Q3M*S&3*B$Ay=d0z$#xj#jXTr^8Qc&^VmpM>=vOXgNDUB{zXfUEY=S2DU zjlfDqo>4P%P|BmS?wIK^z=G7jT5_hB4T?j=n`6`ku)lsuDp)PQH9yD+0Y+%Z|n~=zs53s%? z@z=ORz-@4`W1OoO;GF|cyToO`xj3C(;QgTCTo%`z0)zgq(PKROlLurhYa7^!NMv0aTwlJ`eD-`Pm}0-oD$hYqL8q5f zpV9TmAG0*ilph9kM|UW*#45CrO!{Al6FCaIq!9di zj#EbY8>8ZvyyB0oWdW?e%f?o)bLQ!klpC76z7p z((F^*>nX>@cJw5{={x(8qwyuxlnnprYI#2i-hk{$5CRL@1tYoo*!69IgiFO&=mXO0 zWTW$EFL@^GHmO8#mbJ38lIGpJS2`?Ugsgn5-CpVH0Q^j=<2692Hvs00QRoy=!mRThbMp+G-3l}IW6UvB~sCB#INUVZ#e;m{b zC7$v*(0Zc-73S4GCS_A+?Sr&MNd;uFM-pH)dcc-2hXYIUJKFYQvci2$+$@ZvSPz>m zvCNjCQXVRHf1B*WDg@EKwfk%!s9ciS^MRZ8EoKxir?AF+Rh^s?=>EEI)(5dmwaq5* zisC}ck8Y3S#TPrHv0*i@Wtmkb|F@r@^gHT{v*&kEaD7S)-g5r}%?|Q(6Y*&eSy#2s zREt3yKg1m&CS5L--h-f(KD~$LEmT`y@jBU&moCC8FU1rtZl;juER*s#tmopZZM)~A zGBfi)-Nn{;{@_s-HqgujNn_sZrkR%cK93TOg1_Rc8#c+pXBgh0Oz<&WW@;olSf}SrN!;RhH7n>1BeSo; zqO(Txs}BO#E{Pi24^(tV+?}gZJ4|DNQm{7*x7f3$izYJR?bO>G`ajwO zs7VGztD@%8?91j=-~Lu!lP3*7{5tWLa#=f!n_55s*7fI7{(GBgc0D;u+s?UU-8asaNmTHx!k~4 z*ax@DLSy@g@PNAsp-^6r;Cr-_$a@(c9?>*!j369!iJO|n-_+q%7>RNhYa9OipU?|f z0bO>kK35W9>D?yXE33@>KWSPUG{_9nrwscXS*K98Oypq0&Te?QCo9L+um>QGj)S*h zJa-|jcHGM_iZ3b$G-h_EqMV8~gvrBlcytrK-1@bLGjY`h%2BK1TwcRC8GpqpeJfKI z{D8qWTs@9bN(32VNtEvqy((6Uyuop`Bxe(}Xr1eYVIeO4v#pkk5l;fHD#zg+}3d-zjd;_DNAXBxiGJk3!k z+p2qww4PcjJvC;m#>z!x!z!1>9{;g?-&(#-L29ws0)fwQFUTFjC#=+?d^yMn(y6M`O|K3nL+zMjKlS&o#}TQ(V=$EZf?s^ctGi|s55i?81c0w z>W5I;vXPG_2M`Nj=u~(FcxiUPgsKh#wrTvOZYy(5}Bc5 zgbrmfs6o&GS&3+($0pIv2=lMD@k85rd0FO-Sw2=M#3dU)g%^kM4B*)KMh=dy7s>q| zw&53Pg*0ub)9$whiSOp)DS;}6UDif=->HlKKbdlHu^E2mmM05v*o`0mCsVQh>*6b9 z7tFD75iV=`bZ^w!QveRP)TvsZ0tVSN>YA$5RlHY+__7i^kQ0NOmy;OG)hnaI7Z|p) zfE6)ve0xC8m;6?W3d{$ab{v0vMU^f?q;JhpARGDhE{Ag1A0+xj8if9M`UthseoWXu zg})AS5)=fDMmPqEw0uCu&`7H^d&%3=MkLj6aZp3}z&p3%{3|;5QgOm}qyj)iayrIA zRx8TP22+Kjx2rHCa@@=)w5QBba{bRT1pDN_3sub~r~NoD_bEdW&n8i$7~B`+I(l$_ zeh<|}nVu{gIXLrg?ho79B7?)-$&1HUI$*~=dV&eiuqp}CFAXmH6T&HJ>%YgJB) z!yq?`i{}aL3_Ak4eMVTU49W-MQITpsKTZS(jcmp9U?+#DZRZwpczY-4M!7*;gTq&5 zaJun5?%Eda!jlg=2UJ@3r=dHZ@^pT<+TlTQTA2YZ9fYN>{30W9!eCql@R@aC!-#TP zJyElG)K6JIO04(cp=!H9@l*l)>SxOT%5u#BlIp<^JfN-rLX(g_%WX`~`gy?Z^fvHx z+sE>BPFm>M8b+$uJ{M#O0Ud-NYx=nGRWnGjOT>M)8*DGgtwcp~d?j1pSFDS+Uqs4O ze}x2YFv6O)!WnvK{y&)UfYLz`nF$k^5n?jY7pY=xI!722H(4mrUZ0Rj7zY8s1C}}W zjyg)!Ma>Z%_QbunpW{>aMoQH1Aj1oH>lzp#=4#kq&s+geC2~$FEdwET9@g%{cBN3h z$%QS5l}LOfmc%=pX&q$9eC+m!14M;ANptBYo#ZJhYB~Sj*7vvwnwO$hnif~$^!n5^ zX@S);JV)oxLG^u^X;FbC>P+ChbkCBa()&Gv8g{y6Kb9{WmY-)APwm($4wKKgG!C1+ zuqE3{dq2C|s_liOR=TEu6qf4nt_aOI93w2iONpozDwZ0Elw^ro+0oK~YaAmvYPx&f z^KcSda-z&3zk~*1uj)@g%BdJA6r8#RZ!6M)q_u2&*%$qyr}7Rxqa)!N+NXfXee1#} zJdN!f@>MH*j5_8e^j}OK(Sw}Qg7H1|6q7Pd0mqR7QVx=Aq-j`GX$UCU>B;w`!f@Lt zA9ZWvAF6$cn0k~WHh{M1$Mb6~o^)&-MV?mrES9H&{PQ)s|B5Etlr9?nIHD(@*jsk5<{E~ptqO)aNMlkj}G9a-bvFy}KB4AR4G zaRb^Ost0E;)txFPF6w5&<{&(rW0jK5>#_jmhy88Vr=a*SQQ^zGWATcU5XNOn$q~oD zs-tM^e7rJ`>2PNs8grz4f5DMt?Ygsr^%N`P>p_o<4Y5i&BTsdb3HFcJ)9RUfN!$D5 zl$xDZ#T0{9IYvCPbp{RVe06#Hhz}_4<=d%%SzN4I^LPYVX7dbCrZ2m}-R81>Z!x|` zvRtAo`E!*Ebh29|*FJJ0BX$CI&zGk;t<)UA zyr>CEVzk3oL^0bVaXy2aZglY!WN+zY#)B&ap>TLc|Mx3+&3#YHj!FC9e#fN!Z;na( z-_lIl(X+&B70YO0Sf0a5$)F4KD@3N_PFlnnYfR&>;NUjim4mN>-m%<=zXGE$TuPk4 zb_e;)wq~a(Ztj7*5_o>Sg-5xddKR5d;+}+%hwd5v{ddps@9r7?edQTs1m{)e_w6xS z`@v`+Z+gBn$^j;;rw2}UwC>AfUv*`>;(OYk^NRK{hEUJ|G64)+DNu-wcn=quv)S6}H&y4gqfu z@pW8$j_#{6!VI6mPzoTQrnz1pwGjLwCyN})aD8iS33(zi6t%8+DWtzbNs#Hmj1 znw#MoE(WY{X~yy-iQ)@;%Zcli)1-7X8AsVZO))Gv?SJbksz_*$K9p#>6AZ~tInYP0 zQ3hqz=HoM1Z|56WmPZTdZeTvIqw%XchpK;FI8ts%9UG{_TD++VUcao{JdQHzxmks)$mNQ0CDbT^6!$N1R+tN_u_^`{AG>uk;ir z5`kW>{ov8-9awHk<($&*Tkp9e+@{DKJ<|B&JgAM_^NviiTq|X`|JtKXoEx8HE9s>| z6&_vYh8Xj4^LwcBnw1h>)3LmeS3IiWHGPm5{+j>NS6^P-U$ApqHE`-`XKQNkwfA;* zX=|xf3%1Sv8E8u3ZE+C}n^=;tw;wkOn9$xnzewTlxbOn87@dn{{RKYotfqnpJw=n= z+F=KAv7HpGSK=x0rTfl||Htpl_k$Kx>Ea#i@LQHsyz(D|FY79f&1)Sh?{qFE6Utaie935{%%%7~c4`Mx+zx>YJk%8wmf>{j){ zExk)!wGd&M4 z9PPqak0Z>dCQY8gGHOYzBGc^!2HG9KWC82%(ka(kyVkQ+B!mC`afEfWAO zd-+5OUz)07)sQ3Vp0#s4QFHqDXcEetcnQW-JDlx7mBjE&UV)QnwSZpREQGCs6)Cn0*X1MtZXS}2uG58?hbGw`iv4`fCL z9<-@R0TsB7I~#I80R*dFSl0}9wu75Kq(IB}Nvf2NB1wf3C59@o%a#t%a$_`pU)I0; z$>AWgYC3h+_$$b})w^6~OqO9YmLDaSU_#cC9nGpi`e66>2w6t@DRbtnrD2+fkJLO? zCnGt$eQ5!^SWOV4HO+kt{#2uA@ zG#bG7ql}dE!K}GP&YbZb?m=Rx!DBo>kF)w)?FV-t{^S4r?nIQo*pc{;|Fd=`;%-`3 zai%#2_!-_E?O2ZpFn4vzYk5z=pFvEE>uM>=6jO227aFYw z~6exSk@=3wz32Q&+zCuog#>o zW!1c?UmCoVd_4ivA*2%F5#M_e*CDV0*ZWB5sBG)5fvqqC- z={aMiS*cNZ<*=<+c#n?p^Lsi3^SjJ!UR5DSIb^h({pITnzN9Ms-SadBLZZ18YkW|CTik#{y zajFk835-w+UJ1HI;6jQc6_?9~qhkVUm$Jr~XZp2tn z`B7r!zl8XBFeS?p1{(8~UD6R&AH$nO{emmeFI}^pM!?R_X zlYI;5yaHvt3qYV%z7A2 zo9hAs@AEwGf5Z&~G1{E5-ve|d-EAHQ`d{^1>pf217> ztRq%N2=OZRAy|g??K2>Gly!}eHt^hPUYf89Sq0XLTg_^Zc`+!q{Ei9h58>(kPpV-M zTc^xQk{vun`$AE{Y?HHO|%DAg>2Xo z%hI;5z50-j{)ilUamUt?ETV61;&#Fc&xmE^ErVlcp7htyx+&?#0D0ehKlPo0af%fJ_6z-v=uk zJ5hkBa}r=T@7UPNXH<_Eq5S*SviZi~m^X<$aPFPs4?)u53GDHF#2kZV(!5Hzc4Q=# zSrk=O#^w1&=E7(v&wDZy1OgfNplk${(50L%q90XDi41&|Cr=tByn~kqai1~Hgzi^1 z;7Z8*H`!>T1jxd}Vk)luEAqxvZ<4neOW~#30Ux)eUY{NF`}BBd}M*J;?YsWl{Bmo`R!h z4@|tnjq*Z)V$NS~h@()`SOwXvBYS~y=x#z3pqLLzZ;Y^mol?+!k5WKctD@?+Xi~I~ z=FUKI$0Jlg^a_@(A)T^kib%nsS&Rrqi{*)yQ63Dy985Fv4h6E>9qxF1iT?PYx!t zDT|ZuMJqZ2`Z{RWjQICb9I;Q!K%kfH)O@baCf12ICX3SwnNCJOmwVB?P5%YHv%5V- z0=LDV4IfU4nbZ&0iTX44Ee@InD}gv=#WOICi&fm6MbG*~hZ95K98S=>a>xV&N>Ab2 z$mYlk$K*c0XQ%w%WlEeA%RP1!dY?UL8`*x?x`L2|cox&4Y`3)7v{yX& zo~!dBhpH3fwocWon7c#zQ_y@ly#M=?Rsx;5P7UGl&5|dY_DL^ApPr~}Sso3BViqO~ z&XF%aL3mffI33&QqKks*8;GQ^0Ioj6^OpE=Vet{WtR;gC^jGj&)MdOQdpX=IgpGF+ z6xtWtI)X1Lqf-dug2dE0wA5hm2 zLs8rhUXQ}ezC=RY{=ZlW6cDj!)t&bO?iRpR>Os?h%I3f1o(+whQouBzrs~uLI~QnC z^j(3fWZ}u3NG(ev>{n@6LEAXKtNo*Rm& z;O8wFOo{m8-g&zEW6BF$@NCWF#@`sp#g}KWOVM!+$us`w%t!Nz}%HV0Vj5)NDlMwv8rRDlVpj+?EF{YN>Q8 z{{T!*zNO~Z%7qFA_rPrDiNR2tGou5zV&%BfJVwRkQ6ocA{2RTC~Pwg-p=&0EZb%Xs2*<$=@fNamYdira3CvQL( zf7GZ&*`C6cVZGr1TuN}z2+KzvNrHU2ieQGrhwzN-msPofmb4bwl3zK$%k=iNGfvKE z{S0rOxK>zuZo0!BQA{)lQND~m-FAv`L61smfCN@VYdy+i+ zj_M!jodmBN(WNpZd|fPWQU8e#S^&m3=HZoA#@?^PV|8y1zT}hXrcqhO$j7K0Quw(M zmNn|tGf0ulWjHy%+=CghUG3hIE670rH$(SM^$T^$Gqm*DiB_tF+lA!Ls{h_~Aqr>^BLf$tRe|?WOmv{G(>!=0I zruNnPtb^?0d0^`1hTM}2Q(c<#Qle){C@;u`IO3d9)^bO@YXy2AaSbAg1P>~6m zr|%uc^G&)m>1i@?w3Isp0M+gu&rN@0iimQfAs^(3KkSqK(&%$nZ7uRrZrTy!sZZ)f&^Weo11xgot}nH>P{ zw>(({oxJ#~0LIV`>-zv;fRVM1-XH9stVI05{7d{>Bz`nw9W+rxPj^d+?@f3utQPy! zIIzl+il?58qnAB~=`K~H7C4KFAI{mqd2poImF-8YSlZQ`DyVAX{PzM?zT~`;L zIc4%8FO>Bs3-Q_Hr3uS-)~@+QV->i$4_amUA>eyoN-XFhkYRx1nId?^Xg-p155|G% zT7=+)s{q+jt}s3X6`0qYquRj`<-C+%9^~~v*9Dk zWf^c@$KN4xGIH5-=%nM5$WvwHEcnsR5yU(4Xr%{A4-g{756DwQlS2B@%oLoPJBOx> zvpR1hym+<5JaU#J7I65OzkV@jTrZ!e%a;w}ocS5^NhCHA|D^a7mR?{9uiILew%!B- zEovEmdGr~4Y!fJj3rh4ld!>#K8(aA6AZE1aI3tUM!-8p5&q3~os6Ql>2pn)SB@7ni zGxig&8_W8myx?f%G=du~%$+WdqsxJIJv{p57k&)Gw-P2U2N?)_cv_MdZ06!p%qBez z9O!)s>J^fg%P0zZ2;L9p=U}PR(6Q0J@ZuLIn$Y)Vin(Zj%83A1^4`x5>_OyKCB~oE zeenvp1?MoQJ>K-y7z5I!Bt$T1j}7#ZE5-8!(7SRv+>Gd3+TP&?fvc|%JK0~JpQxcI zCriR53M5DbnT%Mc);*iuE&y1|5hs+zMDwUc)ra3&Vk7p1_)+i~}6zT_AFMfBp9p}m`>32Eo z&+FflQ?{1z^ZYQy&pZwrsWEvv@q|9_ENM7Ij}}q;zFU=0oD@LIwTsg~p4_Gv0rC_s z$6-ZARi9#Y$+^_7@#Z=o9o;I`FJi)o?O15MX{EV-p0#HB<5hm;j6@TZ zT6s;{25;F=H=Aj+AX|MK6brDzGDljL1-vTL;p5{5w6!TP?bzhZgOfKqP!7=TxL-lZ z!}*#F448oMVY9KZI9eq(JYdjP!)$ye{}r}MSiySip(?GT1au?Y-S4u0QRHY=d@@cI z6SK>^Qxk37e?YLLK9C8?SRdCD&sVY-Q*4<2(DD>fv8h+8+ktPb{YfFA!A?G?y%|*& zYCY${B5#{q!M^Me^Qy`G)7quT2@+i9!^62oN@kRO?lN+1$w=6ZPk9~l57;6*IwnAo z)`Ts-9=>RwR3hC-yVT@i#m`Hx1g{mr<~=+4=J_=sdm6$Xu_a)9$A|J?R4%8>VB0X$ zjC&W=dWytw*&*H>>KjesIv9F*b1)iNgoDk&ha?jC^8uw$34TRC#JUY2^r4AQ{Y4O_QLa7S5EU0uSTcl(cC~cpNFn6?-x8p?UCD=YYNwd)t{ui9bqW35>iC>Q0G+vWL62|K0= z%*&wSk^%sr{`-;*uRD7DTi=C^F!Q97ae$3&kC8zqBcOJJvZ5TGkdU0jldYz%L%Tm+RDQmlEhp2;q1}B9qt-Foo zK{mL;FX9xeIk<}sU|7MCX>~6xt0b|v*y^F8Xm;;NHwOFe9 zlwYHrp6@py)`Fu4)+fdO`HQ0#tk6?_OqGd0;mt^-(K}>@8m(vxWAp>AQ!TQhH#NraJeL`d_Z5;_X5aL>=#7~Sl@^Y&UMwRDNrC;GwH{O-zGN*nRG~b zIEMTCz_f|?Ko00Z2asdOv*7jV<&zls@q2hV6~BCW`uVLL{>Xlwy~b@TsDRLoO|7L) zc(@4ix#daL+r#jA&ci+Y$OYpgtGUZiPoP4916QW?y&PPhM&qFk{xpMlOrnM6hbdFa zrgO?|a*(Yxa{mccin?yfup?$)I~$Xwq9r=d38-9(gI_TW;<1rV2sSXiLM*d$%(igZ z1&ZC$3XLLru?(*2SUjxbN@#l8Lt&Vvcy^7RH;J@q?ZqhVJRqVbK+Ey?8!digCb+9QBEYUXu#~nBk)<;eyvqk=;RU3A(>X9rCC>>_vAIaqFXN z^tz-A%oK9NMaJN&3$mZGAQ`kH`J&D3n5_GZKW7OE_KVYSQ;N=1b(vd~qBSRFhJ9xe z?py=hKG|Zr+#2}+{o0@#W*E8AJ6^+~ys)Pv%vP`>9>GC$h!Fd6gz4dV7DXTx7>H8M z?O2vqH)PIAh%D1kAEY3whPQN;dw-DQ4CL+^V7#0J z%r$8B)JrraCq?Tv+<6e!(UDJelJH5io2jTPY{ ze-8w%_eNp8!>?lY|9gY zyO5r$yEwyyq;kWrsQdudq>_oNAk!z;k}oyUIWa1tX3GXU~?6 zym{uzff89=6Hd4oTT5z;$BCMn+~nqktk3W9o)|{lgG#5UKJ;09Dc?QDdEs(EaGAz; zOkL5x3cfmQf%{R~L_>0FV8UP2Sg+`J4HT3|;vrnDPk}A~xgSNHRo8Z_Hy~{D1VVUn z8)jN?sQBy(Buk23Y7^pYS((Tl!(5*$#C16uz!jNdko@+UXK|Q19`t3Hde?X+r*QN< zRV-gpBE<==5enePmRTlGYmtJf9$d9@JhcZ&7yW6Mz4r#`cYQQac5i?3l)=wwHWqLJ zVBY#+ZJ&iPG0Sml5Vt;AFlN_1DMDZ#UrKaTxIS56HUNafa>4eh_{z#1vO(!;n+%44 zZ9Oc){vfK#!*){=5!?UdS>izpZ4?UjgCB@{Zp#fz^t~MIg}ug)=W3}QQOuZR0i=dW zGX*4Y9|>=@Kg)Ei#d>Qw5Ix%`iJlgkv&yfi&{MMgr45Oc(mVehU3cPxma9yk@?_UU z35r;VK?;o^uT(6(eOZ2ZN7F_YziT>)7K~X)CX1~r`Q?zj7-puJMpq#~hVbzBiYM7h$3|mHt?gMHx2?UfaD6c5*0l z5_$zW)hBjtgZ^yT5>G6AJ4Loj;+odAxo3?$J=LJq;NvedH3UZv=|xh-W$RR4wwoI2 zLXW@X74Obyd~k)WMUeYaUw3Sm;K7E&0A=Re;$@@y#Ije zj_TU}q{wuZz|tcQinX(hKg#|%0{|VUDh_3dx>jn7K0%BP)hmQYIkMYF&p0w1?%@EN8X>?Ha)4=AyW=0no!t7O zqh@BVPhp)-E~8ur_waDadyqxTM7bm)9AU{=hFq7bye{1|NleI3`7 zfqmyG+JhZHHy=})DY0#%$tFCGcuiSpgmBAHvy7y4Gd_1@{c)<1Y5%JrYU+fg-7s{( z(FGz``0fri9Xr((8%HC_lZz<`OW^ALu!Kf>Un8(kYECOR%9x)wf2Ij@N0QaS>QX#} z%pG~e98;241@MtI(<6M+wHr_~hz>^%3m(BzUgidq%zY&-K-Wl<1E6|2IRMvT?uD^o zq;$_n7&2&WG-N>N-h)VbnjtnKn%qRYn=*IHLWyQdCQepMT3^=ER_fic>V}r3Q|%d> z?0^kfRc&Ay6wqui1*iTVCEUC?xc)YA%cF#SA822nU%+Pqg zuUYq5_`2b?)gzapIj*Vlr|dHMBxulGO4fvV6w(iX!syBXm&K>xIw!*=W1@pFppKyC z8&O?gJCA&THEddP?l0pAD^%kCwdvz3d)JR6dPbb6Jqu~Poj2Fsqcdm)%2zP#%(>af zs~SX0=7=mM-OAAO37G5iY98<){0AM`D%H#8`o>Tu~gshh-0s1xgxQc z(c~iB+e*4QDB!J7B$amCRi5No3onnuthTv2 z00Eg{QDykbvFgNktP+ve49{i_pRZms%LlN|TlRYjRC;)H8r{AGwW0Zb`Ac(gYehwb zw=J*OJ_BNM{O&&tW~KYA&k`uI^9B;Ci&J-e+(Bq(a!h1K30@0r%mEi zPC@JrxWEJ1nMvrDkX#e4u``in9G2!jGpyyCxwz#%p2A#TG@^!5h3@XK$i?Fl*)~F9 z^!URE+&gp?Sm=bY>T2Cx{!y!2A!ap(wY!>>fxy-$Vo=Nkkrr4VQN~&!udJqJTHvVY zp-lf1ymf?GD?nN6$_g_&8icJY88<}qvcR$jrjUog99a&JY4#djtc>_uW&O^zQa=Xm zEhc-OX?umD9|nH{pO zH%a-0i;Lj30>p-4eWB3|HBt6um0xi*Z=C* z|LIr1{U3k-w+r8{)8&8vU;gdi{rg`ny!v8s@xOU~wYd1}-~M{xzyG`6{)fL?aDC}o zT>RVr`08K&i-m<(->$F!@NX6ufBf;sFMsrW`R@HcF8=mEFa8lvaJg{L(}DZB+c6oUwz_M*Xru3yaAW4z4_*AyyNxyckAD;ef@e-{wu!v{=2vTd*R#nYya@o zt1rJ?{LT8GzF+&W_yPYcEiHMz{QZXyuNK~~egD-f@!f}S*VfiwEv*0PhqbR>t*`xY zeGwNd(xYB4ir2jU-Mer8B%l1PYvK3bzxhD&{r=lGKdi64|Ki=-wO3#B$4fn$pvzr! znYi$W$#sAH?#;X3(f_^rn)R{^tR82hwi=54)YdXL>ad{n4wPZ}_2LgNZhZT0eeGB8 z-mb5`U8nKBS@`Z7`p)&r7}pPP-mlYO{9lR*`PXk;ufG1DuK)FV@y*xPcc{H<`uK4W zbFKJS{~XA>R(-CIgZRfmO4};1T$(krTBF74&-4u|U-HLYRvPlXD7&k&?1R!tu=EKp z$MtAhs|H!QsSMM932c0}v~D|T-6XABN~_g^QcCq;^Dlt}y+nPe|0R%g@*a=fdpz_W zk9?2Pxl=lO^eSa=LSv=@tD!r!_o((;O81yu-0=Md>x6hRu5VP;c$bB5)z}jW#VU_% zb4=Ik!yG>uXf!W_hVfIi&+c+0sr-gTdu$Y>E0tkH>7>=;ioAfeA9x_Z?sn-)9_Xv} zQyz=)R*4OEwZ{Ft80Bjo%i(pw4Xts@wi2w;RXQ1^*HddjJ#b*YPU$3-{sn7B=mK`J z$?y7jbw5H^D*apja7ru3<2CIx#kPiYCH>0tBk{BVKRi|Q$6C8VPh+_ZKdjKJNm{kk zp#{O@l#l5%yQrzfq0LfEHCw&CrDy7)ORaTEbEucvpSyH_m{;g!W9fdhD72b?V#9lV zxBPK%ppG)6qAa_`_cNroYV2McU(-<7HVu6bYm&I)@uZsEWZ|S9NGQFGYh~5Nx-EGR zT|uI%wKPoy-#?+}s_`g&sntj9B8q`0o>_H+AD1ziqY_9iw7sH64jFTdTA3%8jG<(L64?L zi!mYf8`f`2y|Ze)`L0jgGSTa~pIGiz8J}v+b9y5zM&yDY#aWmptWO#$R77nxF4lNw3AE}w99?h_E2m-V#EZl~s4rgM63CQ>;JFk|2ykB z?<~yKv^WcG=THls(wvdS;ms|*(E8+x(LniOfZnh4A}oAI-cimpmIWp;WPU@=6|>Sj zAoEUkn=BNIr^zDGB+;kuh zH`(BrWfL?>+S4k!RLuhL0L;@H-$g{0|^QG!;Q5zTOb$HZKl9YpuaG8@)`s_yOqfz?gDE0j@DJtJ< z@JE{H1J+4t;e=W_(i(?W6`=*A{m6HV3QdFX$}HU1${Tb6U99wrPUQ02$>k@x{Ko8$ zw|O>4a{U#dp4#-ilb0{sy?mKozHGSZev9SeteGdgN$81%L!{KpOXPY5@}z$S^gJMl zrF4Q?gRpN8X0J>p=g~T&P|j>t8$*W)jgWbet{t}w%K(XyveHY^pU!aNA6D!}u|lI* zF-AdV@iIu@f#1hjEdm7|RQYaItBhH?pobC?K`5PTWte64FiZ8Yu>^9~o@kD1`u?-p ztC7vp53gv4(Ut|2=n&Z6;!iZ1Q?l$*vFR=~lVtS^t@XqUS!Hy|?!#m%^o?_x3@0O7 zwHw(gjcnCWj?*J7QFDNJ!0+~BRs5@dV^PEa2Iq}6^z3j>1k%(XT;VzoTGqLuCFrLdEcxRz`Y;SwO>lHqIb zE(r6o%rVKLbb4eWw5O7miIZ!QCISYe9M>8Rn2TOsUPBHBE;bpL*YMr2($6S^pxzCu z@fcJrd9O9Lc=?v+yDx8XG!A=YE1>NpSSz2CX6c1Xu_((vEXuOaXI&I?MPx`KVEmXr z^m(h#5|_qe#RFszu{BCZY#d=jiZzmCdkEq4{T-GLvQmjWGu;ReQa)Dt6*!BnP5OpZ zkh}(cN#mE19&B+YLJ=VCKCKaSG;CYo>jLt18PJz?c4@D(^rdh;j()dwG#aSU#TDDRmfMP59FQ$QBr|IBjZ5+mo@yKH>8XXVJtQtSiFWM?j32ZL#3M(z{imRblJLa7ks$OaN=ZxS*1de zF0BsDFFOut+eK)QL>Y(Jai0W46fy$5O5-1%KwiRap_(!}w?3AaMg$4e;FEs0!P0wb zzevDDzsu{l11w}Nqm74rBd=v{NKa)ntX5+DeuFj)Z=?yxP@o5>(2tQWYmEZ}nq-Ht zA;blk>HQHspCw0nJ^<8{-ov{pTL^j6q#SWmJl^TB+_CgXEVoN8fF>AVS_nyq0tR1< zR~_sTdJ&Fj2bq)nJ*4f9X+mJzC5)CB?L4UF`!sv}sjioH)w?(?I4?KY@QgqX#rk?Q zs^%|^hj;q=***lDooXyQ*(maL*oYm7-Afr_OOGRh1nks?*!{_Et{^Go{EFrVUe^e2Y0|3o+P*q+w9rw=j_MXnvVsC>zCcs};{MU8b1X;bsqJ}nMr zG#TZzX9pXs(=oQtVNSo^LI$hdA_pU^2u(~tYlm1m#F{-vyTTUoxq$gx2IxboZqT5) zQHQ&ju=2Uu&(0#N6i?SlEkr7bJWzvBDSiUn+hgGvLWWKPgQNY^i)ew6evJtL&Z!0g za#D2`?a{_(?RyyE%`s4Nzrwe-)yf@VHaTIKs?97t0q|*in?yp?DAOO4Q1A0cZwoA4 zK$b28T4FSfp4vM5sZEg@{Y&})%k6b9!E$?7mkrCknZ*LeuAu!e)fh5`HrOpOKsy3A zjNEO$uRit>K*a;J)M5@(a$C}`q&U1#Q+rjZ{X(1WB=DkNMTV`6%#PQ;B3{1Y73eZW zc9-4l^G06FT|)VKZT?6C!z9G_=_zDt*~x|xp7m1v_7t0GH$@UlW#bLNO%{Gqqg_Xn zXbX^CK*%lwB4dlDoAh$zXfMmaRNZ5&T{lk-oo4oQOL}q<{2@2%NC;be>jJ=atxWVd z1M}9*|I}881^S3(T=obDyt1@nb-(~c#xe%^L)To=&lkxSn7V*WT?RDO16cxYLJkRm zR*XFLfq|99i-k=m(9qQGPkC#EISR-0t9vaFCT~c(;V7+Ri!5iaY}C zV{H0KT;rxYkW{3&zH`TKYh>2RF_^Id2}xgSjXP3uY<~)X3t5>lAZrKDez>jgkdi+W zTG5``Vqa&-Txh8${_sdXk1V&kRiw`}G`-NmV9QMkHdtau) ziZ)P>l$DKwyzB@=x$X05BAqtLrb!3aB4-d}>0MHv2W)xK>{7HN|&ZpO?27CwY2+;!j#G**6Hkq zOc7yTLfhnF)u%eVbPgz34^Ws?Vf7n&CT!TK!0Nye>P-@JO#xyKgJYGB7CmP>FNIR;V^mPwng1;pl-K;y0y`WJgc6)o^cdLqL}dg02FmtMHCY-A0TP8kw~n>3H6P%Exw zT;ui7HNd}J&{5UwKSNWEV=`#&1a(LJ(*LH$`QHTgj(Cu4{pg&_r6HX$lM35jcdib0xjzIg|6Nc z!qqk&2nOi8V@ERDI%N->vd3`B0IKnQNayy81fs`dkNbt%P@t^V8Wfr%4|CNcC_|rR z`iV8VgoM=1XI^X|y+a!>m?ifi@ckIEK`e*B+I(_<9}mxN5%iJt1d1h4c;0{Jb=2d5 zrA{vmm__@lvkMfpQ#JP9QGqbGOb@U|&kQ_dq%OS(f(p-)hu{+ZXMfc7Heen zV3cNx+%v3H`cZpo$%_#|-fy53(A;$-tbMIa6w5rO!DW>S8?~j)^|@TIxxSf5LJCVU z8MzEVn$i$SF4N9tW5^7gHKg`S#OX*HA>mR6Rn z0f&@~g$ES#0w+<#Mk*M-btIFmll8#KdJHE^_)tIF)Gh;{Gl*iBT5sXc;V#l9B58w- z(5;HdbSAZi#8?U0UZoe2`6q#hMIu0I$Lz!9XGepu^|>DST+gKNB+`{IU!#(lsH8nd zm`2OQ9b!O_tzYxNuX!eZEmKlDLqvqfJ@xP$o3cTG^#Pl;k)^%6!pkw2k9;z0fv9-` zP>rAH8%N^U`Xmp0l4oTauXI9&?Ou`j>{ZuHCZF#|wBn6vy9q)N0?`_MGJcaBc1hYW z*p?1~goM0Bt2dp_p{RA%gouHIE_BV!t(j3*kudkSe4-}1qhO%#t)Cx!GXv%_DHvp(JIx& z>@?_lo&@)Ze37FGvh}=PcwXd6S3>G-#|Uq~`LSRB#qgT+t5NPsFU+{CdeF z5#Pd+6$Ddb>7#z33VA^NZB}w~IV%pV{;^K~MdNy?H!j*(rnq_%k|?!;h=O%Z?LOTR zXy8qoMyyLuB9aQ5JZSmoBs`MLsf};1StWY zz(g%VC&hv+s#lK<7S_p`Pd0>mDAgQKy^?a0XkVl#T*qk@jWW)ng~E=I*w-emn-BM- z6qQf>TU7CppNCY06u{mGB}Hwzt#?a2GZ8X;SjX>gf3;2>RC|zPZvlijw-%PyIr0xpcAxUKShGjGUa?kNXli5` zSuc>gk|3r%OO%qB8dgYwy;?vmWRHgGsOLs-L*+nx(A#v6)@MmTT<-W}6ZR%8qhs-U z%i1XHBnzB@QlCF~9*iOPHM)97cu z%>N=Vxyw7TR1*0Q6@IDr&ckTo)HQzuWMXm##q{_w7M>-|)8zg+EC>7794f0XNM5&F z4Su68MR$3Z3>-@Sz&@wrUim=r;^d4Jq*kR5xs1vhq(@Fo|r+CdDTZ6o`TFBvmM2LmJ9QKdpe2z#LQ3!#%c z!HQYTbF;g>ti6!%5sw3wW45kVqXg+^nJ!IVwwk7`>71$E5lp zplX(sRiu8Y|e-!N@onG>E~! z4fF73EDa=nH6me{^WlnxjY0=T`lwpd_a~Pasm1Av8ydp5^ep#UjX3dM{%sljjb(pCSWvWbH+*ph?t*@D|YqDk4 zinKGeCu(Vp+;~4L$+BvA0|yqth=Yw%h#^ePiC`n#$~M+I%^jP-&y}_x^C_@bCQ6AO zZLLMxk{u%f;pT0;ZQ-URN=V5}UTaL$W@7O3C}zl!{0!RQ`o*MfO;I(PDv#}0tNdCa zSE`H+lPTyof$O+76pYG?aG-3Jo@3ATfX`r=rIKlGnKjC%Efw{$oO@%ce_d(XE$g!j zds?s~fPw*Vs5q&$0@Sl~fVLy{aa~9Prq{=6ZK5JDQnx6a8*I)TE zm^P2VC1G$w*1@xvVy8niXR-?a zmcOlQOB$t`;!NTk^Fg>`4q7s$1}-8&|FsH@=yL_0YRAnai|$YkURn zWJ6t$+7{|w$hc}eT9CK#K`XnLrW+@UE90D&AcE{yT=*>W!bf1}Z3aUHf11*+)S6X| zH*YL~!u{Et@OM!tpvEP0-^FSZP?5o(TH|&!4V6%z6GeMH)&dtiU?z26f7AGsVth6$cQFJHq&P4P8^NBXRiwQFXU;B6V|`HU=D#q9+n9FeaN`w7>RNf}Mm0cy<=5 zgrw}nTGJQV+{srfxQhMdSOevK{xqG>ueHa#0Xo2Oq>k*QZd7uV9?)p{6jA>`l7$8b zA&I9{Qmm0oa-quz1H;YNm?)^6%I}}@RFIt-PPPxbfQ43p_$120fEFqW8iH{IAAmBc zAQ|I9s+nJx2$snkfU%qy(V}k~mQc*U+^k-^XAvPbegjX{PbxGkVzm!LDTzdu#ie@(VLV|eC7U@08{VT04$tif@?2sbx z)8E|s&pQMU?W&kmR|^9VPkyq5P#Wd<=Hq95u}yLYW#tJ#`w9;~kSoesA=OVMX~ArK zbRKX0Z4LV_g}Jw(MVqLFUv>1V9`M=FFBJF zfD%n73Cub{A-T0-`=^S9UT6jY(KS9*1bpsce+q95Y`~r`yH2T}qi;q+J1jH01v;2X zA#6I}x5yG_s1~)ef^tt1xWB3>Zo^MDHKnZ?rqb?;DoTu`z}GEt6JMlJx|*fv>$QAg zkf$b?v8FrUP$at;M25A4{u(~@3nag3y!Zbj!syIpXzrfP3xCT}0(pHb< z3rY)}NMn;OIVo;Xqv^aO2B~Hfr?=D2(g>En$ozhW#aLFwf{nHoviW88eO^>Jr0UL=jL`2&3boz{@c9;fbF5ik(Ej@o0EkKQ z5}W)key)4bQyVZ+_Xqn`5_z6`O5EkfDzB5kJb3gry)m%q?tr=CI5y4Wb-gigy|PnF zSKaIXJnOKsI~{^`dexr1E7nLgQNEM_}HvW@vr zQ-P)ahM^$lPd|cDmxH+AD>WW=(9jJVx^w@Iz>mn~~%ZBW5hG9_mk9CCM*A4_x0h|sueV6*T>9fYP3R-oH8 zsb~UY793PROmo(9JfT@uf*WFt;V+36MoH%`A53jJ74IW;&zsESmbIPI+bJd7(Avoc zRagexYcOO(lqlITrA(JCFgs!`FZza@%?%S27T&- zNMK|s+-3!D5pGWQK(ORCjl|P7=NWGMvd)6Ml&t+wq9i++2fV54t28SzJ0jc_b%*!& z60;NY1xx`A@*oL87v=YY;|KV+EjJ9!cTAx%TYQmV@g{TDd>0D)+mJfQCaJrWv7gWi0D!eud_DZtK{&5y3WnTpS1g+jp$F^%{e>pOI;L&M7r;m(Z zFy!(53)%Ck((?35-7MpFf&$t~EMeSG7TtJd%&ve1$8U;FeZ}!olqtpW1S+5^bkaY} zT!cy<;^>NNTHh0QGO*;GkI*z(Rv>PeeOBm&WI=t+oMQ*#D8}aU_-&JkuL;CIJU~R} z5!hbg8V~%Y)#=Klqd19FlR(=aQY895rxzAVjb`6PoP9IA1wjW~p2DF;;|;$SSZEp3 zHrZYx#1mcDo8QJmv&J(=fMK+bL-3#RPJURh2TF~#xQrTPX<qb@FJTrS*y<+t66Cqj=k!lNH%Nj zJuk8-1}Qhd-%i;iVh8|s#Ed@;e{HJSY)bC2B#urmzle-*7?}XMe`RbO#b*N5V=2^- z&#x-@s%nkF0-5$0Kaa2v*OoyD;BH3=firOA#zcJVr&J~FGal)P?mYxK@FwT*Ik{h& z%N#SI%@1wG&A+jbycs2I#t|n4-)a(Fcwd7`SK(X{iUK23TCi1RZF|Z=!wvKqJ+Km@E%5KQY!=?Nz{`wR;KPW_N5LlU!v(b+V?hZs zVc$seM9@k|oK4rZ^ZAEQ5>L+0nNkIj9WYcOVs{g9GiH<5dEUv3KOw$T5OEKDYw=wg>K;eD7_{ zq|G^hawOJ7@+|>065%P^a>XhkPEF*@qiK}*Tij3S#8dM0i7)yQpYXKdr14iKf1B)X z$ct*va(or76CF@`OfXz+AzUcjtC^sw9Mwl*Wz*~m$Ln6UkNsj|_SeXR$cHJAB57px zWYSm%t!_tgyMGT-OYRt?!cn$q4-456E||ZSFaa1!>OXT7`2D3`qrhc=z`i6zE?zQ~ zvKM00Z9SQpkJ8x$J^BxMV18ib1neDjAkc%Tf;3~E0EQ07Q84bE+}4~H7PLt)8121L7_vRm5RUQ+w$d`&|n3#JP~itkf3rBHO%O`&!;tuF)&GG#2!k(p*w*-G52*cvB| zBgX-f)r+lfEMm_H$M{*4IADEcoSN=)Ps`hyX1h)51XwOue-LN>?}e=g?p8= zq80Fl;kcm+Jj-QM__YIlqjD(CTSJ5je^dM>E|?1&-Qz2)Gf&sCIxoA{0Yj)8>VR@6 z^-bB8%2`4~Gt2$Lg-NqS*@L+gUZx0vbQM@g! zft>{#djQ%9FTC~y00Ake>Jwv(1P+$Si1JWh$SGxZE*U#_e3pf1Z^|XtgEK0iheuQz zr#$xOHhK-gPlxa#JpNH(VBv=BEXmgU-81e|;*cn#;ss)OyVy>)JS}O*!TIv%cygIMND4)y7iUjIv0SF(=ay zV={FaZdV&W9gXYos^@I7OBuXi9Cv4ki>%!ht@r)v&*Uygmw-a7tBvk3$=UI!a;ZlB zM@_4h8BnHPJ|iv0w9itkm)&xNcZS~-SO$lsV5*X9>dy~zH-|^RVWZkU=sAQ}8*%3_ z73h%wc4bXY=xIM>X5jaG=Odt7^92b%A0E99KYUhr<6& zOHUL1Xo*`z9KFa>6=&fnE;N2*bO!F?zpil!KPdY66M$xlAm@J27G$Hoxj%jRH|oQD z$D9zayD> zp!02lr02=4lq(R8wba>Vd;I&$7RD?MFgXdF&}j{v9BrLM6C)BW28kcEYAaudp=2{{ z7Bj=@Tn8{TE5hoY87KN{_nS*nCLGcVx6AZ3Nf;}Smk{yq`EZM(1hT316H>7dm*;iY zC(Eu4A0AIf$zQ2QYSu*hJa4I<4bBVA1VTwAE0OW0AC2ET0w=?36rtw5Lf~R@dBsEG zAE~E_c$cQ|roBLbSDojbW;d?YBTKVuHNeIL5o_a=`qTF&cH%F22f8`EG~v;BQj!3D z+>B%aU^}`|I^`O@>7~e#KOM>UJ-1i`5?i>N6{72zw^}31RyE&XxiO19s%k&wvXLE3 zven}?>u8^ef`XwZv-RM_bf!6HOW>}voU=}$3?I-?C zUre%7rx6BKPyp&=fNqk&$t-+7KO^^}8C2k+z^udXVK|4A*j_Fe84gGp!t!B$d8J`4 zQa+)M>3ff`1Rf;U128hdrmPXOH{k;(rxC(ROosTdciXcQP#hI*85PJCzTc#CL@I9( zX1G?4U?9vv^>{Hqs@%N#Wdc;y;=b;hNUESw&*@TQkR)z*;6M^0KX$g6iYjZp3`W1+3HkSSb#sfkr;G8R{h9(f)Ww4^- z4j%D6Bh68g?`N1XKNbdw;(*1-nciTr$5`iBGTKvFh;2X_8jxb`rMqB;9SS@B6q zhj|rV8BRD`*JAJ-q?g^UQ;AIZh-N}F>rD+k0xQF1Yk%vV$@IH9pc)L(RW*vx4K_ML zEMF`A$HnT;{HMmk)enfh;!R^rI?txdzp!?&*ycDY9#?^E>`ta2Gv?>zpG@my zY#9f~R1%Mmg)i}T-TFhH2Hyt%jlpE5Dyp#q1_ELN`Ck}JrvG3teG_Hmj~J1{o+Y>X zRlGYrV}m7rSf~j(=W&|Dz7HaImge7Dl2XJ{M|h5oU>StLk8a12c&s_ zb}e3y!K1}uJiNd=d18bPw+^tJnzbXBb1ge@?s0X!!#SU(p0!kKgH$0d_+#tG1?D_h zao~YG=IiNw`c}g%G;&J{rF~VnC^Q)3UA+91Cc%D$=9%OEW`hIMgzJFBtsr!7E2y)J zS&WknHgUdKn&oOra06ekXW5Dz1+?#&PNuDZ*l=f&5rOSMAVb)pi9rsex2nr?$(@b9 z=gsyypoDM!iyK1H=5JaypHs6Qm)2YJ`=T(Tmg{2ON^dRjWY`O}haXk~%T2V_|0Yzr zFDwP-KJQ&|GmG&4mq!<7jTZleID8mnZ5aAb<30!X-H+HZf^x8Bf#JVx)RVqa>-b|I zGqC?q z%EVZ3ULdC!p~^}edo-ERRC6k!Yd-1D_SOq(hyb#VfM0AlgSFUkBV-&U8Pe1Y0oD7j zj7OfVG7VJKB-?r*fr0{ri@%^)r^a$v^hPoS1skXlM1sQjTix6v z%S}l66-FC#b7%uJsVf_KMi#8qWynnn#ZfaZDD#)7F)kG*SB`UY>X_>tLDd~9IMdI_ z1CoBZy->7HLFh5)9XrpMCF}Rp%P#U)EH-k}b$|PARH}Meo;BIk&gYPL8P5f0Ethlt z6}YVFics}upT?gZ8Lwf^uG;F*+iaV_ehNRlF!1zl+@Q{Fo*sxv(_b3@r0TK5_$2a_q7!=F$R4*I{`l;uBeT9YJavm}T$dL6WD^xON+wA`U88Es2X zv3%2*oqW-^UCoOU4IEaxpDq^-qr06eJsMf>6{(vFgC0MhnXG1me5xGcQ>V!sN3!dQe35BeHO<0B+47 z@-@jj7O#hP_9pE<9l+m=s(*3ax{Vn0n>>VUxJidF!f=YjsM_bSpVwSbjIb^{_H~3E&_c%NsoPI6F?r6ODe*+>VGH+>`(&xOH)UQ$*Z{yTsJR_xB$H7L+jsA&%=(|AK(@o>LVcQLI**9PfQZgXcI&>+vUk4@ul;XdJM%ss?q_?xK6k$l>-^u}zaOG! zzh5`~UmAPAK6XFvs=m)1zRP-FJHHPFzTRj3?rU_v2)|dqp9DUh{qNWR`acb0esAV| zPh%Q<{44=nS$x0yKf8Yq`oCOmEA05*4)=Z&3VbtsN6+%Ve{k&jy@!9FL^FIH8+;v8 zeBb>QcpdeBQ!x10{{9&5JwUkL+2@(>^}oAt@c(>e=v~m6wD$X+X5hbDb{F`5oqYw@ zeS56)`;_55ta9*wzq;=EI@U0_`F@+f_WL>d-^QQ2rPc47=vn`}WQMPFhwm$Q1ONMB zj+b2p|F^}w&!g+!*OU9%ud|EY&jXjw%j{jB&&Sq0|EH_o&;1JnpRcRc@3$+=wmsPP zWetN)t-Nr@glaoIj9UA@8mk^&gX5zAYztPQA`t8S}FBhc|g1qO5vXm@+|f7q^}( zBll<-Res&HW+~1SXZ`uGV_%9Q(~1 zk5;H!ALR{PZ}0cc+_?$(@P+!_y`0s%kv0p81t^>)2jSFVSw8JCf=!W5;#n_W*kfXY1PN~`S zq>&hcB0Gjc-KcDP`Oye0bDPNie3SNm@ri{v(TV*!Ne|87$F8B(x@S+Gf^tA+l1A~*Jp2EE1{&^)x zUoCYy1ksVd=chH&^scd-nJ3uX3gsu9xA#8MVrE!P>7Gy$5Gjp#em4*;4CBiFX$@!5 zZ~2XOL?{g8R`*ASi%Uyo?cT*bf6Y_2{fgXjv?!gLHXJp%J4vDIE6h=CPOd{`@9qf4 zK}J+~{NYG}gascKTjKiHXk#*83fXv3{l?SKR(iMW)D`+m8$FR-VZS0ACZe+{~8N6NV2;lEZ7dM!PRoo!GgHC0ZMcr95A$Cu&7&R_1HDfqE%MR zSYYHb0q@(!mcZ|^#co}_8DqVQyY23`SShp@{hgIuUT_C(p5b|kDUbnqK6(l*<>mzJ zVjFYQ+Jk=a)r%i`wc9EK-=|H3?}PiF9MEde`_97TY)SO7ukrnG^%FP$SqLai9`v3V zeD9YT8~fbP`oA21zb<}XR59Gd*Y&(CGju=n_;bRlY_=KvRo@}niio5}!d4Ft$U>*=3dJZ___!Qnbx_qB5#2QE zwZPX(LT9XCI)*3Epo89rj5hHHl!}a_CBN{#Uk)Fx)qt^{$6zh3FZBt!S zUZ_Um!scf64=eiJY(tJ|yw)1vX1F5$uJ$m-L>(15LRrU#0rJ;Ji$(Zk>|raiV6M;5{o&zr7cT2ssB#?) zVLq19auaFOCGCD*Le?s$P)5{--O@TzceP+xxnU;^J-dy2L&MT})5wj(j`k#V+i|+N z8-h(K3@NiQZrz^=mRXd0Yc8L>Yz6FkJ}k>I?=(>@l2;hq2ELN;WR4h&R}N5L%&0Onf>z4AfALD}4zQ{X#7bLM4jL*s7w~pl> zgWaK9FlYn)jk-kE1ZeY*=D*TKtEF!vV zS87}u7?`2gHb_je?khX<;2G&(P^kTLwFaSAB6YsKcr!t)aP@oD=c_LLW?OLgn&0_C zpvk4&Tr#I=v&;;LNMZQvdCciiE@$|W6EHIl#C{j;jOuq5e^r<6{xvXK%6N7_Wrnk4 z?C`AZcrP4x$)MN||Ak)m%Ib5&)| zlydlCY(j=SqhWH0O^K|jFRQRzO!^1!$FfCNn~w+hW?5U)Deo-Sc2amMK2$Rs%F;?x zW3p_+=IS4jD|&Ws?{OiwyfNlSb?5tsrN%^iFtG8pc`U?qHfD@81n%rN($0Ebf63|U zr)f+~e_AaPR)uqQVgyFQBMaoaMlZ%wVKxnq_mzSNvp8`KZcJKJ6jV}^|LVX)U(NBf z$BzX|mKS5!hM+)UVjEgAA0W*W<%GJ(R1O3{Asleey5)Xqk2+}Pv3VfNDHZY2pjoP= zQX-(lFoXPK--JJ`F;pruvLO(?F1sBn^T4u+D2Rou(1LI5c0}F^_&Qq)6hfH=;GF_! zo#ISh^r^8vD_(#P%u4$XqvNDxt1ZOs&;{;V;(``kE-knSb9uAQ#0A6EdYla&!$cVL z3fo~y)Kf(m)~=(*)Bwn4q&WUun>zkcb3nrpRM3fiv#5c4zZ!&<`cbFuk9otBQ6h8r zZ=R9b0#B4#c8@5aE(HDejl1&4W}WpPcpk)jrSA=o`=f)|kms`m1B#q*cU4)V?2L;^{wKh1v zUpkCC;qBs6#NGVW7R3~B*wcfXEu@F|(KM6oU-LYxGeXVm}nUASn z=O|Oh^{zogV*lbMGN1K#$U*a z#-5;u_M*h_CETQ$Xs(|0Oy}I%sMP7Bp5L9rvtem>VIAm!rCSbmy$D|2+~5g#!~Uh6 zYboG3+13O55v8-LCtGQa6A~%+D44BLM#3EEY4p+f9U_75Qh-w7Vjl&K-0pX)eF=0`MaT2;|_-5&*pHBoWfp8S<;u5gc-OnLVxlLIf-ReI^-5= z{bUT=A2r`z_aQ~H^LV1Tim<#!?fT@*j7#=z>sz+q9r8FeI*~0!IWq8)S`ZnLx(Qp|A$7J{zJ;Y8chbGKO9 ze4`a5xK>C(_O^quvw2YH2^&hVy#_}4nUfYJs&3B=@n&}_l)nmzeP*?S()JQ+v4XZE zUo_OEp7Zv(^;WsY1bHccUrc%jmYRnN9wp%(YE!lJ;Ft3IAQbilNafo2hhKutqFkR4 zgMOFC%$t+Lu(!t=>$GpRL`>Q?ZdXk5J*T&_#UfQiNL>V9v z|6rR=H@qgm#gIga6`5;H=8rcO0|Ell)-hjJ8)KNMt;#kL;Xl<5Pg_55rTv7=ByG(I{#d6SxZ zP@WfheZueiwgH)d^*f=aHvMzyGAYf^eS~N2?9yPM@Q$NHe^#k&8nMe!qQrei>p^e=AogRy}S=5jq#*hF(Sso?KSe*0#aI&u-H}caHSw$pSF7Ps0`` zcMhk@%9(CMB-OyCyQmRv189jQBOZx)%};<4wyhD9wbgTA#B`zLjmVya36Uk;{j&}b zTyRG_g9;ajgy}@f9maR&`7;u3lD#m`DFHgy-+*mnn#QoBDyS>eHj&{_BHP(1EVGLYT51 zl;7Q${K%0gaJgO9=C0hX%kSC9aY8nJiOX5xGWB(vsWm;=YJa(J(b?`Q2KKKi6!`=)zsrDJTcdsXm%! z4ynC(Xvg5YbcMH^p)i#|7mEz%q1f*mjCKZxXyt?dB{t44e+K;7mno-L!W3rDURV(; zUEnFrgh3<->f-(=0RbylP8i|%dnbB+sMaC0oFvuvnA&Yo+SlG`bd1#D;$$hpVk|Oe zhoqz1vy*p&cO>|+iBW^66@T`K{psT(U71uszT9Vg;K0?zDmQc)(ot|y21(xOkyBc; zPA$L0i!Y`A>+tch-%!}Mb?kPbAtk2_;ROG|!$8!8N#PtGRsUkFw4_ZVi=*BXkMl@x z`4qZQ3uT$?&Sv-u7qgHes2@uIRM@t^9;r^IUWfo%jBqOWs`93{+|-mzdUHToGZ#Xx zOB#-N=^eJZQ5QAs7sVu7_9eXQAA6`A3q@|0vL^4s>X#0Rx)8L%Bz8ild|~ut>}oJy zD$kC}qu+`MQ(HqhbBIlb;?>JM)zilVH^Z1Tl*7lUjYQkts8ZLDW)`B^1H21GqC_WV z#tmi0^+E^Hbn-!3V&n0&WV3JPtw6!JU!J((V^DRP-yGN;B!jAqf_)lp-ow`C=X)iE zDsxRkaA%To_<)5P{UK-96NTzu$9&skOs|M8m4T9A!KwRMGcaA6jhkhqF0_A32KX=^ z8dyJx!#Wp<*!Fs?Hdsed}!R;W#>OKUtZ zTWQ<|tFJ33tVJKDR>|U=W(2!pMBTJgZv`>N2wJQ6049FMv2x3CPOqj|`!Rhn$PPRL zA^Z~#Ir!QhY_~s*($C-x2>wya$R*tPA5<%UDm3{Jg4hI6l+Xxl)c=Gv8hpybxdOr- zDO-Es!V1%(r&F88x0rzcd=YnL*%K6q$L3^CLKh%AvOOZ_v5xVRyNi7gRccuvnG??R zoUjp1Op4S2hEj_+kNIHZN3LY@3^L`l)sc1WZ=6h+zv2nHci5LUj_EdGE$5O*%@2?6wkgAi?i{#wZlh`p>!)dRsUHDHh5SJyi`2Wd z{>z%WQ+Whk>*v!+<5wBVDyAdei7=czn4FxiRZ?(fvl`GhLDsn!JjrAIrQNb$x5G9| za?G)gd!8V9k&her{kw8UM>$_FC@Zz140}C)q11brmcBp2;U5L!;T{DHSe6FQYBfla z3RT!f+{<3b%;!d_L;^ZwKQ)qfdXH{U-G;X1HxX6kq=^ckNRGoj#eN zY#4U@o~Mhx?!pNl)8~u6oVU@j#g)P|ArR;9;}l{3q+41Nr*Tw9K%xJ1-XRsdCH>i> z-ia06CeL*29h&6(kOqP%EiVW{&3jaN#&Zn3|o zGEuexsI)82(!aw<$5}L+hN}E>R;ud@YK`j#hj^Xhjyn%d3b z=dX5!i(GRNH{F=Ce4U4L9M%<1zf?U=|IwF;6{j+N6mAliZUadWJY6aD{o16^S)|zj zn#M&BKA^jgFfM=`?&*#AMjnGH9%ifAyH3wg&wsbtj|76u$uQEV^`4*7?>5Q`HLTVB zP@?&e4GAAB&i7V82DC7f3C(rhp@@B-Cn6iu7)zAxm}?Bb0)s-|{d%P@Y&@WOq)^nr z87@l?1ZvdQU}Yj^Hi~}|tv{RJh2iM}uiLUpF$~lI{&FbQN>3$K!PNsF+5tI9x7~sg zq}&K)f9I|N%YkeQ&xt!5%i5fxUc1}{n3?l@X-1gBCDzq5@v6S6y0YKsizd2?1K_Y$ z;Rx;yaJi9)Nu7@R0+xnBHvJxOnH(I51lToLwlEVF(t$Es-cnzt85IpDb_bEPqDLa- zX!-GT-|JP9>f}xOzSQ#MieweVQvA_rT#x#YFwR*0`W32>;YKigDh-SCUjXd6dh(@x zFW@3O!g&Z4(zdk9snSh5<||Fg7iDO+(|ps@87FccAwHm>i9_@NG8KhrFH}?;^z`3l z1+VAWSWj6Rn*AlLZQ~Sg7Wiu6g=jU1r#`omyCgG`uAwU0823tNI;swLN^$rM=&Sj~ zVf7zdIsVx?D&B0xzu8hRnA=J-o;i#>SWM3ba?Y>yfm;a;_GKwXvK%kOEpfWW;=yFmDxk3nszx^uqDbWw4 zFJosKrE^(9wJw@~q*~mVg24|I#-x!ylnh3VD2%X6hrhTG**o@RV@U^X z`egYceCsl+iq|5kiup^+I=E?pZS}Jk!OBMJGX{orhg>=B2eUlxeQ4htFUjbM&9j89 zR`vC6tBgmWF;`904~2YAkQZX^1eBPlWWF&9ndo z%yA&G*E6VQqjn;xLn8f7zm30&=0Qd>G+#}*ez7x{ciP$3n$rqdMqsbq!dO952y~M4 zq>T{WQO`udih2LM;cZ6nX$_J{)-?nNf4XsEFGQjvNBS=0LUI5(3w{dgeeY@@e!K{H zRuwA(M9`%%B7UOQ#$Qr0K`6vPC5e*= zJ~R-M3k+%&;^zYxSUmw_W->j*-bD@OgMgGrV{Pg>0H8bhQSBOUAobz3>o8ys5e%M# z6;`@j?yAK&-Y`8yA^HA0iR+&81~Tuo-Q~ zi_>Hc>Zq}@ol}?%q(3H;i-lVDp+B)(U~lqHgqWUzUCVvDUTG<`nwwbnmLwz~_D8j# z2&lS(pXSA1qx-lVTV>4E_MZ~d_x;jT0B+CBX7?3C5$aMMJ_;2`Z;1;$XTuj zoEBC2HRd<8*5(FQb28<32B3gAph&sXhYsnMmR<4270$QEy(lFdS6BrKA5ZNVGRe9s zM9wa@8U>por~EY+AEc|kvqZFt6O$>S%)6AQB*2IIJ?ADXU&7gBL zT;zr2U_o(;o|70}_B%$_*x00D7#bKk#c@hB0J2lUIqA+I7V+tFMg9rBCenk@AX&?4 zC$OBm{Nc0a(TB&{!G3r^##>EP`s0Lk%)YGy&HS)?E3gfYeg9(#R==YuF9FO-pVlSRb!rl2da^_y{3Li>J#kZPS|7KTy*6P0}xz7vK&bZblrB;$_Vk`(-KE3^^0AkNyGvPrHTuSEYDIyZ=2k#F!S_M<)uT*#dQ zAXq&DbmA^bS`oD_?%{{D4c`nl&}wuE){I15q>H0?wBYR2LJgnXdSN{SzT%?$1xBUl z8Ma)dF(6wMD^iU|9|1~x@8p%f4Ugdn6LA$lqDCD70=kz^`Qa&RkQgug`{J0n8gIf6 zl^ly;T8u9o7k@E6(HlEgq{pzycmzOa(X#t}!l<^S3%&_8p zS()<}+)#uB^(tg^$YpGXk~6$*#J-}BJBzkxN3WnHq;bn3q;ps^IR~NLlCN%Xu^JEd zNd%14JoR1HAMa&hvzz$?MWrYAB3@q^uu8Ls=1st#YD$r4Zj@Uheq*>qN3Oq)wf%D& zvbr|01ehV`-8@KX)*}59oq=ryn6Z&1d1ljeKR4U@5!H5R{>JupVF~#xAp%zUb$=qbd?kNy6-2yi2ei!YT@_i3AQnKY~&gpNJYKwuuNJT{; zQ+zX1A^iS)JCOAOz@q(@kWsr4s1VmgPU3!a;>n*6+Qvz(=7uX$A0@Uhr$N*ZgD5Y8 zofWUT!8}urT*#``1`H~%wC;ij-mv~?ImcoVMpZ_7V-{bSac1oUR@&$TbgXEtWU zo&fEF;F6=5a)Ozc?SL}+bXW!Q&bt?IidtLQC0Xqxq);k;eOplRYrkCRMA*st2;-O? z7=WIr{q_NC)bBzt2G365)7e7`$*~6Yzn&XW5H)o7GEZ#!2MoM>hcaz*njnmWL&bi} zqqaAE!Nrgc{M4=KjY|G;L5P6*^$YFig@brAa;?qU#=JWn0VJ?}%DsLo8~3NsbojVG z9T7078wK(FBYD}!eL8r6_(lWg8^R$Mn$Tj&SvY5`UATn8VuAnsJ&LJw1?c#p-fmWv zz0h>lvK?@p8j>x+CU>_rc4XI?^XmS|_+?Cz?|k`g zhg2TY0B$dsLq!ez!Q9ZLgDvEupHsmp7q=}iHVWut8!&3ZIqpc*1F;s>{ zeX?c_5wXr-7Xxn%jv#QKx=OC4-x#xpxyt3WDio_^QnE=OFFd)1hzaooism&PQiwxb zuMdtwLvs9B8Vem--^alO*}2zYkkL4wv9iyk`^`obD@G4xS~)Ws$bHhqUpcSZY=ps4 zL=-j3*<0u=H4pneGn@ll${7`-BXT$PL+0zx@?iTmeb;Bsbz`K^Epn<&(QOD|g!hG27;rfGNU4DgYT!yyc} zBl~SMRWr+B6=O-YoVw0+H|FmfV=;BdN%w-h{{u=uwZBm|kaor6!cvMFyweklQ!ECB z9aAauD>lU|GE06gdO#@%JL>hc;bEUCN{fd2rz2?JlZc>zNQ{bkA79Mw;ESDSxjvYWyuAzWz6IA&q*7-N5luja;y=-9f~;t(a@wG~PL&0f zZ#F8DaoV0C$BVIGhN3!~!iwCG<*XPC`oQuuj|j$bIZ+rgmp!B=!0qTKK zWn~C*EjV*Pix)L$_38Iys{GrNx6GhWMv){PG*)msy(-%(DS9xfsWrWTY^;x4zyzyeb{!rPy;4xmx1kHSAldPLSWZo3wW_R}M;d#hM@ja@eQan;!drBp!qpGR8c2k9W>}=v|39f zi2NiE6%7d)O%R@thK0cI2#aKyy=4M4=!%^^24+>eKOk?rNC5;X-hMY}@p;0UBH(7H z!J;N+gZt2QGG1|qR!jsSx`E+#fbJ*E8^BJ`)I{{Hsnf`$Tv@}bEsQ{o+Mi-={rQCW zvk|@z1R*YW%nLH z|ECu@a4W(XMWO4iC{w79@z6u>i2R$sY82R2_XUe%8rHT|$oHhIwN}?Fm6vlhPDQaZrMDG_y(rQl6BE)A zuCN=qUuUSm9UlJp-#AeaU zHeKOmI`rv4qfNn9`rqqB5rQc#Gi`TCZg{LN7f7G^|mzeHnKvH06_^`-FRTo`SCILkkXZ8QDyjc*+Mt)i%Yss8e`pCVfmn z^R~X_6J1u`xi%~B*88mZ_Zj)2A3;M#4kt`z6#n!AC_}GrYr(}Vx{90L6y!EK5Z@XfunAM!rn+m} zHATIVoI4U8h>@IuW2VhX)M-F+2!ghA4AhZ0UD}flw0hnaa&?Y8BiuMJn-sfFjtQMHusiOQWtY6)HA*3na)L>+QV%3eb(m1q;P6Zk}L!vrW^npRxV4vRv7Pp;O2oMKgM**N;)DL$|3H^*y9-bX4s zl=L8Mz8gGe@pXBY&~v1@U>Dd2p(`Xj3sn#>g~b!tjYoET!DdwzROfnei9sA>HxP?? znTVBXwidYm4q67iuJt*i1!f;4-nlpf+0*xy^yz3}Y{CS;C7x)ncw4K@#Vrz&*zdVG zn;bXYQbe*^=!GH|d)XM+N2$VwPSQqyeAqQ>5H(1p{tCsDlfJZ zZ0Zg?#jRDHxdcu|H3~#T1Snz6yJ@Cu+q2OE4%qdW9=E-lLQ>cd3PBFtgcVb_HTSI9 z7Um~Vl3xMXLJSfw-;#Gn3|^%N_FQ9_gp$xG21jhxZF2_kyJfG`s)T{uyhM|wQco9C zc9>30#8u^`OpR1s5L=63FIk4RFwA-VDv;{g6O(;hrQws7z%003WuvtxheOyTi%EEp zz&>nesU{#{(i%jMO$Y|UPxU#xZPN{24tK-q6%#!EMn`mw`u?CUE#X_a;S^=Ca!*Tu z;c4R8BsRTj+onObwdI}${b@>t=UZHf%b##PuJM;C=7QNk_=^CKmE9|5d3}tgmGU^X z_ffu0Y;I?hn}(htiaPWT+ul)?Vh6$`pD^WHnzi9!eiiUbr`Q;T9Btt!juO}}BC-HK zR8>e&kM@|%0QqS{1KAn&Rlq+qfr73+h}+uIQ29C)$EQq3YZ&mo#BzCW4g7q)QIE!R zr>F_DoA4YIM?#HZW&pkrML+KNiA#kBrX95&cpDkAB!LKF^~T?f`;8a{rn*oa z{|=@1yo^pP?(lZIT#Havxvh>*j2SuT4#0p>w?Z5->A`iTQYc+otQwYi0l)Q}_Tq}? z7K8S^XDNynaUAgi*`lhvjq2)Y)iT8#?K{Yu8i0WR0`XD@l*-jbQNB^LI3I`9MYwr* zs13o=4b(x)QBEs_%ZR?lvto}*t1;mbYHBWqS3+(G*B22*7Us3l;-0p=h&(br)aG^z zM}FoyY-_VVp^)8pR4TEJwu_SzEo1(P!cYU77eM>gZ*Yya0CE?g=bK(&x2V4-8q?j} z>M8m4tg`}W2{G5Qe$?%OxnUH!Hd=BV{>7DP*1bc;dM7e|)B%s2f?s*2WL|mMGw}gx z8YzE6z_!|2$(UShTXu9SfImbW9qwt8V00pH$9^NO1PS!7&6iN?;IbM5@vGDF)E0k8p01zMSK*bx!U%lL^~9?`l?!!2j0 zkZg*Hh6Un+gW4TsIm!7GB#=yJExyPJ7q<@g`ongCKRIOj z#;e22-Pmxwhjj9p(});5PZBc8s=9%AMLV z`Gk*K#W~gOM*2xqx;B{u2ShfDO)aYJ#$roY2cvTEe6jA-T1!wkOyR|ltPYK!7k_9~ zg=h2NaGM>c^$s=gSz+Max17jv&xP^z0<402G)wI5*(%7B=B??L5zA*#`DMVUnz;LD zC4H8M5M8;h_=M6of-!C@M8&=fFddQ7Q?X;}N0J)A7~P|Iy_3X@&0aYADDGKd9; zpz`()smxg!&gH>DM5`xsC$+K2_#>!7S!SJCK8)@#n<ovC_R&Caq&rS4=(JO7_6J@Hz_uhoXOjS;C`o zP(^IR3}4Ksg1<(ZpV=EmFWhl+Pi&m5!!%S+oWI~9zaA!DkAXYrwYUf<^-1R0${C9v zG`w`0?IE>yBXSU{)&r9pc{|Yg$=GjPn7Lv@>H~iOxo(mf@1nz+-Q}=l9>EcED^w0X z&R};8CyJ=d1;u`lJ>(~E<4T{X5Pj!LMBlB~h^p92hm|u%k!a<=z40e%K;O9{(070F z_QqaX#av0_y0XRd_YaS%&o9CQ=h~HSsQazrg>wXHgUE@Keo_i z#}!er($Crenys_hM%k-j`+LBKAHm2W(`D;R-XMx985i+)=mMl6) z5iwAl5aOqqm`htH20@PeG^`;}q@qt2c`}jM8bphjlJ%l?qeKP3n%b(x&yIq==4mzU3ANA_Vw}KT)B=9~%0CGKvOdv4)@*iH>l3v> zZHC4INVNm-E0koV4>+{8b9s#_@}jOa;y$5J%IoC9#ES)Wb%d7lmMHYy@t{N;=T#U` znKM8WRgT6LBl#e%@|&RsXgvnGOB0M21NN%HXoX*>?(Ow$QBL$HHmd z)fTXZNTP+)DE2CHH4*GUtS7Q`Xh3-<6}i>=9nh9qxS@f#3>#wd4ush9psfs8+{#zn zaoAtQkn9}U%0!|~g&}BZDu{)bMGAxzf)4*|Rc5PmeWGqcOsCQLbrq1rrgcJ{&+E3JX~G~`S}@9Z!1mwj}07HP-Bed8*aD`f)p`QI|hM$0IzkCP;EdDV@-BLYlOy{0|%Sa;&4t6 znH`opYiX6g*a9A>>7oxEgnC_Mgi?9cL`W>t`V}<5SiYO1J`p+*gA`hBSe75{ycGF}Dk^y^QWSj% zdnmTe-^y3uA(AAlHKBK)XfoMH(X?S~2(`SO47U2~*MKi50{*4FPC^mdTk)soK046)zk zpS1oBpIZWB8=ClwcOLf&=iW&_O2eF^E{^R!OKDgu+QDC=v8Rx|g!~>9weRq7IWDo) zHRrZ4Hj1uw+Ebg|f$c7F(>};UPzll}!|4;Jy^yo$)9naSk4iQz;IL(*65@j7Q1x{$ z>L#&nbbw~GsW)dvfk)W+eY3<03VITdpO9lPh5?nxwg5Fc=_3FNU7WUGkx!ZfvE9tY zEuFmO^cLOKBfy-Kw1{V=MIERaK&poGO-{);AB8XI;@2$v3I=F>j?H0WOu^9JtmBOq z{3PhMVP1Uzsi$ws^~2<39i=LIrm`3mV@A_85oB~nySqNp7+|K8eZwKarl-881tZFS ziY2yYkXSQJ0g<+www#&<8{}6eFP-O&%9F*m#&D-Px+QP>nBQNhLPsAe+OXE5V{n-Z z7-oa=%)6U26QIJpU;z-ine^(MO}NtRE}r=IPwsBv&WXPKQqBc8SQaTI%q zNP>1Fs_|YPKLi@#jr3U8pXDZP5Jcjh=rqNu(*4J8O2eQ@&#IBzaTir-n*z#t`6XKZzmz~>NPqI zBDa~QB5ka@yg0ZbS`M-uHk`nrof9N%qFSY7;EMz^WH#@=cxoMWks-YRh2CeCp| zmg{V6>ownQI2;!h^?XNUs;XDo<#~T)$T=YN<|DGC(=Dxtl0)hFHN|@!9)-=axE`u3 zPFZN-=DuNz#1whoLsEdFbyjSF2J2lpX+poP$VGs7Nt;5vIQD7Pt5^NOIoj6_8?dz> zGTze=FU^$4<~^!fBHt3m;5=>lKv;Qm6!bPD97Wb)D7nqduruO=)WC5Zi*YUSH^762Sea^m&lex?>|WL8l6<1M612=Uh} z20Ud^pMH~^uz%Ua8b=pxDtci(XG3`H$ zo`palB^GEzEJ~?Y!b%c47)UFnMS=MJN0Bbr>hg_0t0E~p!rP&1{X}-Jk0}7-JR-B` zHuhxBceVfjm39cZ@#<+?ts#_HI0MM3_G0>dlOKEeZS=%iTNtv{Vs)NqhWEYmmCZ~( z;HR#03Q}XpT@5QRCGAhT{ut47+a4KcMn!HYQBm+Pz<~sM>k&2H;#CZ~=D1_uS6+5r z6wPK@DZU8qR@;M%JWRih3w@#!*gMw>?A>}VFm4{68QTF39(53}%VoT?ZF5$U_x4W~ zqLNqGD2^5UkoJW%gpJGBW~ZzZC$uBrLq;|r$UL}RbWMM8&HyvU(3W;qR|%EyQK175 z*^l4y%!3PbP{sb`6Q(bR6NhV|zk2BfwEJe$211?sFQZ)thwz{kj^-ccGF{x=B;(t*YK(ZO>)ru5MS?3+)>HmEM zWCX?qh>}wn9jafv%q}n#nVia!D|2baq%W~S8&iWxNQ8dsO29t!#O1hvZP1|!#m z{E`K8&=-;uIsT{EK}14_?#fS>tT3RU1!cCPZnk)j(Z%)(Z`2$SA6Rr7yOd}-kiRh# zp^iFZ9RcK$VivYmvLOH@!o+?mp36OLWjN75ivqGUa-XesaJc~3$Gga70F}^jU-wR{ z-l@8Ulcaa7N1w>}mm2)nKS6(&wxOg`+opfKYV4iJ*tK26{MMCdeRdzV{ghSQ!aFLJ zO(6xDussVFWqSK!%7~h>gGEI~a=2{-D0^jzJ}Q((UNP^L&a{i#4LY_TYbT1%8OpaB zn>13x$$|X92dhrtAxeV2g&6V2C1&&jxXNM zYKn`lZYzuQDsl$ zhW3bchpKry@wr&CYTX4RO*()8Y46X}!ioFg7%4>v5Lz zNsC?OOrlSW9*My!bjAcnQ~&D7MF7RcV&7t|0xh$UZXL7^We6l`WCSnOyX1Zs3FN2eUIo7|5k<3)pTe*j2^f z$s<4^N`czFqvExuuMXX#SQNCR*TNL%aziP%W;jiCm|V{kSq7`*Y#%>Zif+-18SOFrVRmj!Z)}4LI1_L}hT9(}WHpqEJ0TT!EydqTaUwg@gJdqPKODFZ|qGZPBkQpfQScIFv+$pF&3VWFcy zQ0T}E!YXiw`k43!Mya%In40>?OzO5Y5&Sknd&}UVkJ% z+H&X;bX$HhM=zBBP=9R0DZF3UL=#CBJ5V%H^go*Mfc{GxGDxRp*4$z%%&SpZH_x6x|`S89Pjv&f;=mpZ8^6ePzbo9pS=_Jy(B~V(7bK2yHkF%Ue{f0ugqxSoX9? za6(10JW2Az3NtW`fSt zJJSi1S)SlM0lz@tiaghb1qf61j!^Q_(~iCB!*Wy&S~QJvm_OXy*CQAMw>GbHpokgY z2lHz$+gzP*Y+@C?t_O!w>3Z?9>z`%Eh&55e!6qpDmE$7#tDWQ_UUpHV?TI^12V!DF zt9qM&sq`u#2QAL-G<1M&Uy37+1@qB&9~;(UL&<8-uo(`pnzf+_$ye7jd2~WBDPO_a z>N?_LWXEjo9h$_%nGMYJ2-(Ytpk9iO=28fQAi zp(LJJCxI5K+MW($GZX{sJ;k|BR?L`!7+?=}XV_9PYC~;>>f}tjd~I_afg&ES%x;XR zOKK|^tBsgVKnj6v>7J*G93HcB=(d_(YzLd51uLLu(Tv>*Z$+jEwvuMr*Q9<_SIP=h zv24YNddT?a#qZW86TO$7!S$koQ>T`v6n4u(I_C}(2mKufDvt9|Ov-DP0;9W8Bd}!N zwq2I()o`;j;TTqe|Dp<7_!NEtCnd&r{qZ@BtI3Z1)y9G}*=!q<9f%Ck#!0S-Dtl_C zV{5pIAs2O|aY~b(f^%|V#)!W&-lGy!{WuC9s4=19!^8^^0Aw6nKV3q7-df$B6#}C) zyDO|h3I+7Db2Z1zshh>la?!EXf$fR8FTag4exl+3JJ<35-Ot{u!+eg{Xqyvihfs%A@Uq#}=UO1NdPTK>G#j<$B7D}a zq$?w*R2yJeMQgNDAZkJQ5p2`jJTdJ<`ERhXZ}(DEf%tR4NW{2*INS4M6kLsy4!y`i ztW}IqRPheNr3$Z`Q62>67~n1L)T=9Z1l7#p4Mz>3-b@P`JyXNzWM$mnm2CMsV#`Nn zN1rI4zg)7UkT1eo5g6=ZO=~Jb6Vv!L=*&!d90iu5``6}B^=dJ(t`#_h`VD$HifmhK zs#gIpEY9@y1i*H&W%4QZB4H09XQgWH53o}Z!y4Zp=^`r>1}%5Rv(fmFts)Ee>fTwB zsa|JA+U}ICM@}$XDQbEZokuUW_ZrQm10F^{v9n9Nm9>bP#)%gPydZ)c;NQ0A{50m@ zR9OkX>h+8=7{HKGLcMmeSKjqX8J5tP!XCdxfROdGf5uPp0?Qx=MWbvh<8m*`TG5$RT$1xr--u#fTb>6zR~|(7w&V z#i^G-Gs>0t2YW$j<5ETa+ouq(txZa_i=xUZ@%uT|)yD0FRaqVk^@Y(+>&WPp6N5fD zHrwuc)YDporn=3+@luM#@uiQ@%7FzrV)`kXPSsBHtvo3z%4^rZ$^o1p{*%uA^|gt) zqb}RUBGJdWM3`&JsC7#po^HCPeGu-w`|}lOv_AD47zxZsKekIDIyQ7yLl;53wL@-1 zL!f94dDD`1J<*1D%KjL*#;m3GO7$ba;cL_r7oJ=u78GA1HI61eU|5EHBHsww-f1N5 z>99_IEZFAcDSY@=hOnxZ;>%nvME+RDk=;`qE*)ssS|B_~i0JqbmCy2N%jwad=;m7V zY3G3w9=pBX!Xtw~rUejcLu@ethXf6~Clj7U!C^F+(lHF3I#-CkD)uXT^UVvxBuJ3Bmn z1e1_mxpinX1*Q!Gsf@L;hp3nqhbX#f4|M~iH>)pLIgg3#g{U|8lYLY1w$u9xc*C!@ zPFTmA(&n|z|Fxl=jx*P1y|fgmn|0WX<-CEx>XfdDE5HT@U3t2{Hd6)rkg(!Td&TBB zH;}OL*QoAG0T?YHBAnAB=B+H1d5I|NXqk@7>+Ydt6ftS)Nxx3xRw?LF692QDo)Xh7 z+y_RRFDNT8>XWU5$lg#kM#i{bnIMVr@}SD4z{I2F z8XeU@NCu0~820dniB-N=Xr^8Z7Io3oVQh!S_`3P5t-Mar@MUp^CcoO7inUW-?2`7l zPPju-!jA^00g`>WVY(--1d**|U4;$uFTPpcdzauLl%e| zA(r2?w1}<6u*KlnwBSQcMC9Dty+-9PPOwwb!ew!u&G~Kc(vY?J(`x`1q8oB_gbiSb z=2h_0n(L|Y66ZlOO0j!mhkz-*nmH)+%GPsXa~YHZpf}Lga-0TOw|VK>658R6Z>74* z6Lby=V_D?nwcQ(DCzHasdfBVm94p+vk30#~60PL_6#hNnhzf?l1^b7PSL@v(v;hH| z?6Y{z8IV*2Y!krVcCL8Bwk@a)R%02o|HX=mZ&)JZZ9HH@qR>&)bPruQSv(qQU-?yo z`O6HM0^ik{7#5(jcw)JyjXE>uFCTXDbfaA_&Gk5?RX1Y)xOqt$ez5L!WUSgUK~86P zRsnacd++rsKcX}ijZ3J}Y%CRg4Q!NWT!WG2dEnCChZ)H zdJN6vMrw*^3y-MdXv&M-_|dp-`POMXP-SgAX2$_h2n z9YYgTgsDJXVwJ(Gn&*U=)mGo8HxZ@^oc6Sws5h6ag$HQv8O%rKd=nlzvr>gVlGv)$ zXybX~&0x@SCZE~P(!8N|V`c`gsci+AqH$V=)*bqKXe(dqIJ8 z`fA`K?G4R-v|&BP{zvO~X&8#)03Maz-)(fBngfTW9q{oAveAEEZdm^9hA_r#MZluTbdaK z-7R+tObf3_OXOaCtYyA7;A-|8=-Q?dh8Mqy?J1p*F;R?A)45ljCWPTUhM%20vR;RC zRQ>1-1O62qA}1-@iq=Pt>aZx#_;o}u^jkj5&8d{dZjpD)6vXc0#d>gK@4N@@UK?}7 zK7$AfiLC1l{KX_l=olrf`9}HRMUjK8k#QB@N3)l>_~{0SGa}ymBky?y-}5_X0MKrq zQ_2O;SwAUayL_B7iJwh;41Xy1iPA7Du?uEjWwzD2Ts3 zCoKO)(|c@DGP8?f%^nnO!A`Xko*yWdq>fpr0Bw!ji=Yvhnn{2Fv}U#oEEN5re^v|Hd{Bt(9)?W7}%#z6fZc~ITVWp^+ClVY7NjLpxV(#Ljyr zyv?|4m(W!f$7b>SG&#Kw`Zd^w0$QnS=Rm1_w0<)DVpxv>R5W?kPOmy=KB}4XqW%K5 z5hy_qjIODy;wQd>w@fj)YFo7CM?zG{samf=9TsjN}t171Ao#{_=TS-W**|bAWI+Tly&;hIrv0 zYi;1$nSzi9-!rN26P?Tsk1+B>0c;kdpG6c;_z>-3Mr{%Cs>Vn)=#}z4ooTHLrlAju z8|9qP+e4Oh;FD=rsE6~E-ka}a5em~GfG5Pe?>4Nbtge=9oS4&02&0ZeeN1-lXA!X* z5sXclTp-P*LnSd6UgH}p9Yn$2Q*&+(pe~AeYcu_;eMR>FV5cfbiBXC3zd5N58Ma=< zUu)7#yPfz%%w(+ewG5<2ya0ofYRqK3dP6P1mUWG}Bq3JqZwsi@3?V*qdWLd|rx%Jl zcoWfFQD>K$<}irGAXqd??qm_M{ikp1CpSNRL!5DSFS;jQQftuDEZ{Ocx%?S1iR zu;=}RzjwGg8o5>V9PxR~oosXVrw%mQTK|^TTV1SrW0%sauhj3b&VB+j)FFCKmy0TG z6$aATqKG54v4EoZ6c69&Xd3O>5*KAEU$HZ|Y}c5FXRcTHH;_quaZ%KdBPz8>$zqT3Y{+U;`J%wzR zLgcBIn9`tt?6_~siN10q0t*p!Jgh3}0f6qH8)R$Pnb;YidN-Y%qXl)WWI=&3SyTb` z=yu6rvuV^qQTds2n%$W=8UQ>able%cR5vHBuh$N&Plw_B9aGGq_G|6tSW?s)mY=u@ z64XOzJf-6cO>N*$_S|1BP?@MgF>UrBnzrvg|litHg=np)H)cQU-j-DSVqb$22~ZBW2CY+jHz9)?FA@rztSY> zfp=PUxm2cHnI&XQ264Rl3Fe&&ZR##6dUx*T)M`V?BzrnjE6Jm68!%N*e$-Ld@@^O1 z+R$fNvDHdMADMBWp0`a1r~={q=E&xH`zO^=%pAhW9u8d_ZEt!C&eWk+2n`avu98BW zFAtRiMVhhXRaVGQzv;p;2#~cgsF#~eXy2KBY>B~YfTgmdCJ<4Y$dWDh_Ij@o3KrpW zz<-Ou*^3>Oy0&r<*-aeZZ4QtY%ZyOI6%DUo2@s`^MYK~N4)Z}GYo;ZP_CD4!RqcNS zL*r@JbRpxy^K5u#tN)o?B1MD;d9DrZc+?~ti+V(|?{--^KOv}k* zSlbH^(~!&UBHy1bErF;hu^o8?@HT3-83q}&zJE}s#06LuGy78#Tv9aeRd|m3_hKp zSnC2dH`$dRv~hf4gLFtq+vP%J^ki2w#Bw^-jL>TGJ1Z8nvJ15_D{LkP1 z>f7Ib^BMmC`(OX|n>Xggm!BA)@TD7{@a0e6Ym~N=*9KQMat5MR`KZ&86kB|$=qih{**)QRN?%uzh}*K9 zLums_TGZzTM^bKRfd#k4%|uq>uFYDjgY zr1+Mq>9Xh@E>^9M)nPTO>tqNj?xxHr;a?T}lY3eh{#_-kBa~wO zw?zYqD88BIRBT_w#WC!?;~R%KgqtyHv$vORRX)}}Xgd9pUa>V!6kd*U09`8Z1f8eg zg%kY>YG~cd;fss1KEfWp<+Ke&f4MDG$)W%kH__a%5LyNUR>g=_S+dH#X+AX=+yy;! z5YzG5w)YwEaG8QOW?!RSjq95cG5$0%b#_01FuC6Y6B~A0yK%n*p$+m?T1$Eg{kdeaK0R0+U}Te^(Kf) zt4#|VB635;hqH%IG@zWg8t(w^M$kbG&e(Ds2(TS}{Yu{|lF5ZwV-RMw0UOqVkVgYY zXweWq#4bKYV(>G?TASf5p=F*_?tF|EC*z>g2?qDeQO}u*7V>rVXxdt*HY@tYRM3?V zF!m#W@b zz)Pl**Jr2pRq>SmHLO3t(B`NL?IggYvLB5Fz)5SY)^9a}!T9^O*$r`jLhhJTyP2`I z*7@KZO)TUU6?#fv);T_}5$+VJ;pYtcCh3@V?3U7`Gsh!bacjLJybHdquM`6Y*s5k; z<>(Qj_1OOAHL9a^VK-Sbo;6GbgYGIq4mnoGQ`#zk4=OHVFJ20g%kd+i0=jt@ibPMg zy9+VqV2VWrH(jmWU{# zVihwbI*P4HQ46QZ1hOSbfJ_B%QG-MZ=6zY`D7VvgN=swI==hI7&aD5i~mJj zL079dGPJM(zO^f_b{x!@&4_6sUx|%K`8w*KHo}96w{b=B7dd75^{qvmNMFH}hbZ#5 znBN!gbP8+;|CGL77djRqguZu?#Efi**PP_qTioHZkkeA zZ73#@_p+Apm@in-~b_Pij!p-7m2XdMxoyrF;iw%yno$Mb72!LY*brE$8E68>q_f&! z?2INL@REws^6Do})M>3x8q74+`hy5X?p4p(cy;|NLAUDN=MnbONns9yU`kbOz)>WW z2COWq;c-|1lpkyAn(G9@-t4HHrjn|nYLN-uMueJeDL z(CUH6vweSz*o%-KqJC>6#C(pe4po{*%F%@m8ymsk(u}L#b>F{1m9LlIU>`f#OpMFX zq$TJ0iP6b1I=~Xh(PM&!az5Hr2;0AxZus&OPM2g;;J6dp?;JTqe-XNAvo^H`&B1u;6B<8nQF(5laC+y z(IlfVl@iMLYY(=Aa%W@~1%~Xb>54Q_%8ND7CPuW4_8vyRm`3aUFz(t&Xbg+hM}+Nt ze7>I&pHoPVt~v}I_68Cq7K;IUxS8Nr-mE`@Jp{ctYkh?tfHs{T0oOt6_~qdZ4&-Bk zTw6N8vpc`#_pA;cH^qsgtxp_(a1~P|>-MKDX6=rq8S8B~7@FA)lRfjgdtUq=|K-r< zdz2NUtBiWPK>QODs!b#i_N#Vm!yIPKr!h`0hONvp8!f%Jo^pL`r+AGk;$|?*%b=-i z@?h7aF_Jx z4X6=kA9!dq^spsNWwGn>QAr_CD*W7mhFAEPCgP3^ZQ?jI;DABz_;=e*VFW9z}6)C@s4TSu&M>ztOjCZx$b~X zJ1rq7ws}2n9wA8WmrB}z%?_6a!_V%_wCjltdAYMbpM+15 zM~jv7T{M5)!W-B?aPZ_+OQszWDhf@)wWd<(LBq$F z!pHKJAC(x;)`oT-9u#EB`c{fZB+ZA-GJ3$EcU0dr$`+lj%mv|{-X_fxZUmNLwVh7( zz`N|-ICs_M+f6Hn;CSIk%OXB1A+S|jCp5gFzV$6XIx(DPFoy>QH(^X#x8HR)$ zSK$QCI`d8OmKiGsS%>{`c!-;Dhs03lnB=KAsg#+@ecH@x5I#z5qD^oRhQm^RO()|K zQ7&W^UH>N3iz9z= zi60H=vLH2hdPa&HUIz8C^I_o6tlkRRWu3T74kK!y~a6bOPN5>yEUtOHq}C(}*lP5g+jm{m^Oh z?Qe5!D}#FX1_A4XuDgFGQ>H&%qDGR)#aK8bQVO4(^5Ix?3D zk+)~%YiU*RRB}m22!+L_)`wcdfaNU|a~z)?u1#F%e`=eYixLuA)E}NuM00ss?8k00<7BD)CIKmp? z5ZB|>u`U?hYNI}RZ~Bn`NNvS5wgp7Trylwu!#8t1>Yd!Nj^*BsJWdr*L0d)?XfdLP zhUO+ds(=)hgl}*xa&(Fm)LaPb2Jow}zwJDs9rTE+S6W$B=yo2!&f4YuoDP%);LJXjWuE`-VywK0tF|k?!gX+sI-=c58uh zwH~@JdOIjUqI1fsFwNDXBogH=2PjoS1&%gbcH>oT1E_JuB9)ud;2}@C8 z93u6os+)Z-P#7?)uS0BKBYY!g2s>eFXS%gUWFYTkSK-}5V9Jp!tXQhgr~Igsp+9c> zi=Ll}3Q+4ea=5ndSwi%`jsj+Th_?ucRiIIqYKL;Y{i1u8rndX$5?~@zs_R)>~QP`XO7(PK-JfUPTzgnqz7ioz)n~B2nFMFVT7X_~muw&IzQve1WSoY@&HVjmX z+F%)ZH0h$pLQv}oDSDZE#iw}tGt=K&&upLsX?zYc6I-EM@CqI5^GjbSlfowog=vkw zkcv)v50e?M07pQ$zn{@b1QQgTX#NLkd+qDM@q;f=&E_SpoPV&c#B3qrViO^7olK)c zQ&9J^!WBmyWi7w#XN5fHiu?+MP;P=$Z;C_-s{%7cHl$67DW6_Lv@$ycX>{wSMlLmj)~l^Ler%gF2Y-ZHrJ z{i@X}wyygpFh5?2 zhlJ{$?MFwj{~u>xx|CSfZTmzw;-1Q?)4UysAdP@MD%gv?fQm}byWDa&{PGp<9COUI z_QuTm%=1MU6ujscJ7H-s38s{{M1zAO)^lXU_e`g~UMb1axb6_!#1K40kJ zl#q3RIC+#kB-4=%%4u+EkHAAdyI+fx+grT)Z-;b!V{;gK5n{bkdBPDB5!-W9ee#lj-Z(TLY_}0zx7Ov4fgQIR2@gq*)VN=76cCh~(OrX($nZ7zE#}vMDthBxuy7GVeG;WGb77ZDF z<9Z|(7Qe0Mwc@Z?lDaY!>58|}Xax{k;bgBB6*2nf5ymY1q>+a>%i4+-d{3as)HycJ zR8M}jw({wQ(qTNc0tAdj#uN!Nqxj z3ScL|GM?;X0J(he>2wba4yp^oy$A?LAX8MB7K_wYf9mcm4mZMsE7s@aVo=X3_O$k` z^kQBjL#caK@Blvf=yFVkKv4<+|^&`syuH zE_cLrstQmOm!7U^0m?T&3fHq~yApKH!hFrm8Lb=F$kElJ^~`sOSIsLwI+X9i-O0KJ z<3TRrto=3GSnRlA>2+cXX%rJuE%W)wC%I#>Zd6`TzjYVc*I;v+4hXpc z7-3ipsp>huTfw4CrfiIr8zg|0Rp56o4>2szoJO^Z7!hE*#H{yv8q z9n;0pF!`Y!R+#==*)Wuy9$;u?yltwk!nb)4I0;!)HWEPI+7?h(gbFBvIbEhC#lXj8 z!v+mH_rdrb=?q&~*I8v6-NXFs+Nr5TD@KXq)|ld^xcH!@u;YqK(iHJvjfiU9Oz>!j zlk-@flS9qd-ZAlaFb+;e4BB;o1~5cJheNox_%Y0*|F*GCjCwL3#?rl>k$wV?B7cLk zXn<%G;(%h+Nv{T-p``d_xADGMLgoGM3?#W+11lgAKX(u`0)1St14s zhH7}U!jJ-tRD%jdmxE?6I5)8vn00d3!*Rkl&}TEGHq4-|qR=TZQ((?oEsTvC`S`lz z3-^HNh|8R}@bi|(q8b@zBI(#*El!7$fQLu9;3mtiSLDdQEM95dh@UnI?T*Usto2#0 zmN#Nd-%4f*47#JY<8R;ybwZ2ElW5FVOO`5X)(J1QdW{kUslhf@{WbW8FdmLJdQj55 z-y_vB_qjbLo-83 zFFxH68y~FyJrhN4>bQLpW-{ViI805SgIk+4a1EJRklAw91AU|5svQjW2otAkk~a%; z*R9GU(#G;3qLxcE_OTPi%;p~ml);UIP|PS_4cW|*wdNF+kgatLV>G9f-}X;F889We zBqR~{0RxiI#JJZ{qvmoo)FH1{5m^9Yb*tgi8sa={#zttfWcl_vrw^6@{Zp9j1&V-2 zV0wIQL);9f{c&f(%u z`+fEuy?L=G>FUE^sUEkZ7M1=235xd($KASr=ea-3p#gO!#}V@1DO=#iiU6=rm>-No)OthDXET!R~=L z62w%Od+CBRT$nBl5RUK8iM9IVOy6h(P_raa8mW=-5EJZTOJ@}xM+`NBvGfs$`Wqn^ z5+_b4g)^$5fTj;d!)=eC9WPIyu}w8VGG$X?Eut`xX>}>|vDqg^H122z!6u#$F_j4r z={ZrRM9~pB_el;-2~Kw2pzWgMGWw_wurMAkQMNnluok25rDhA8Icjqd44>0|ML1UK zud8>6M)<)XQfK7%QB*lwj88G(@vzCU0E?#U#q`uN%+c;S^d;vb^eVkz8TW zE@6*r3wqix_$#9EZMDlFUbI3Q8}9Q zN=V$rytvIqVI)Q=fHhEIy}-9is8A_6wkaNR)L<~cs#f|Z3p^w;ght7Q9L+E6xR)h) zAAirDty%ARF3P@wFKJdpfH&IZ%`z%*Ai_qtz83ej%CG|fL^K&$rb50HmjF4%ZyH8v6S318H*HYBjOg$si9_2*hLzSGwQd~Mv@vsM#pt@!;gLY}5TDzND+=+MS z%c@B8z(le&21pH1P1dF5U%e^HsV`Wp)d+?%QW{kPb#uO^4Dsm*ZTS1JvL*i};a^<2 zBH^D+*mMQ}!whv4roAS{KPj&~?!=XP(Ax>lz7#0Gk)Hm;OHcoimYzmSSJ{p zUfBfL_&oTBr$~gl+P5pRPw7%qt5vyU5Q`Q zt!eXVExJFoJasz{CPUV6A1~8`TN0PaCqLa#sEr8flSW+ufa4Bk9F!7Vy#3E8Jtv3bIlytQ zurGqvMSMF9t_xq8@&5RR8Sf9zjQ2;H883K$23oNC6t=WAUwzRz;U<}Wl&uGuQFzu~ zI@^zLh;n{-qMRRTq8!<%q_}788{&!@u2R1YGj;WK*v?udY$<|Z?M~tvRZurw2?nZP zt})&^2wyO25tjDB-rN3qvH#~AvKRe?zu^CqCVat6r6khj_Lp-4I8w_~^M3hk-<>Nt z(|;_-H`rx!Nlv>g7s%?z7?eEx7ZAQ<@p1kVD{{}x_>PrYMCUZL*t^t!a4eiA(l%|8 z1(GvdK5%7Q!KmPa< zSh8&=*}OK0C5b_KPivOe&XeCuSgpU0`{(i}`ajTU(7tN@o4hqj{@+3@NFC`$8#6)9 zW-F2YCHV6x-Ew)zUWiVCs%C*C5V;n@kiAX5_RmSl8wkZfp2j=Zt=3-^d@7qWd9t3=W|5F+SzviZO;`V{zES zn5AP}<`-e{klA9|B56FNw8mN3l^{%cE6~#SQxd8@f1#(Vk&+|M?nF%mt8qxuD+S%3 zAOI*FXv^U+jlw1DUWLrt@oO_W&5G4oUQFM>D1LYt#g8vA3IzL(#M$8eg#$bT4Pu!n zpm^S$snd9bO0t{wh|W3)%Ce1cQa4zD9)Z-I9NP@LyR!QLS5nwLcH+f7SQw^NYj&;` z*pVeb_Y>0dD-w{%Do5ORgz5px(eGW*1a53H_mud^_i?Qj#EI?N7&L{uSA;C00W@Fp z#M8f9D06&G{}jlMucPs!pWpSRktC+()R4~nCx~FKGqw(7osmcqY#SgN@}(Li;^*Sl z4=fpz70_MtEJs8*MC~KVYvb85b~JE{o2=e(k9>?ajlEs6^Y>>8l6vruy5~~5C&~5~ z8r%|0HT$xiani>j(HbVns}@6LE=N}1aurtGn!BFJY4-$$7p3Wj1_#xVV7PKqHu0@% z!A$ZLh)W^_(n+zkVjx#EM(H=(TAUeG0b7tM7;H(Q?{vOLYBYW3RbTt(usc~*5ttCx;2*mi5e)M+FwwdmG8VJ4x={NX z9!1{E`dV09_oeHkq~VBRNh~LZB`j-)yme!|H#ZP4_X6O4o)j!}8&+s!eNkm|aeOm4 zKFiP^ra|jEeY`BM1e97=@oNvZ=yIrG!w3o-x`vm_x-}r~*-!TA{fbk@jFB!2$qm1RX|7qh0SBI}&-;Rj1|0&%;vnO{yajo;b&n ze8wcKL4b9Tl1A~_1NQAFpiuc0= zUYTaO9v_?RaYi;nr)P+G%+$&(Jk0%i5+9NXaAPy5S6TW+Gdq2Dt~VeA zAK_-J*^l87M&z~4FDdTg;Fd}J?@y)u?U|%?RyR6a3kFA$pU9@v)%dE=A03niFLu$u zL-mVb^Tl`aejn@e>+;kC>};#z)T|M&$K|K+NGa8vbZ#Q2v|9!oSt6Cr+s8zLy6oa= zPY#u=GRac1w{idEV_0G#$nO#gP$l8KJcDvKn%;5KcyGG6TVp@Y2ro|0)vsqIuP``} z2Al>clur`JS$qp0&p%UOLF~xaH=`b%&%(X#Vsyn|XgL`F22K3Kqltekp^0Zj6Y?Hx z;HTUK(QWEH=UvJh86 zcI`J2PyVGKDj<{i);cMkO}wTy#*}eyM;r2$-|eXD)=7U+r}U=DOsOYQRWeMx2&Ho1 z9JC2i=lj8U#IiL8G}rW17Vm@e{HL2`#S@d|wATtB&W+yFn31hmk7|P~3AbkSP#ZbQVSmijP|5vHpU@$ogK_*0M%JJv)pO?9GimM_(^AK#aN*n9kHH85jC=s) zu~v!TTBN5fI6o3J#GRQqId5!yI~SKUY9jN}5aIV%g|7KVSjNL=@W!`em_bE4;3D%c zOj5i6#c!SBr^n7#HWN$>P|RqYaKa31kP4-g&=hlrAQWPDQ#D;zr{ zfgiA|L;Wf$8sue>cimFVhR+9BV7(o`bXoPncek@p;2Ku=Zx?px(sf{dPeK=6PQpry z%lqGZL5$MGeITk=D!^#k2%8fK68s)7h6nb3Dnp&O~zoh5a z5k{p=pfZWv-F6!fM=n66e_*fNZvY#Fh`c3Mcv&YeDz`ATcX5=Fm?EC3mHXArvNWZ! zT21v*oeaqI)agl>_hf67Hp&(=F;>b7i>!YD`a;GC!S)@X%7efV?n`u)+1{199*-wWfVrhf4F;qMLR8}c0Wk2G*CsD;3UHO8>Any9nTqP105n~WQZFZ$$6w9Of6uR-N0O#R*2L_7qzu4`XP;O|X-Rm?=b z2+WuqUx!{kQzTi0cj8qa)lGX?Kkr9FKOM3QxOD!qkT=cUlXiHp{dY>22d8j^7XA?h zS8EVIo8_V5=XBaWoz4z;iY4{=Ren&~R#6sI%(?p(*);&=Mg@sre`~c7bA5SBY7BYv zJ|_8?Og@G+;6tyn+JwOeqMdhe#*ZJC>Y4A)!R?{^$*y{8ylOb|)mWkqG`FYQuy{(J zWN4|{*x(IrK*dH7ck}2-U*1M7qp1d!nX>(HbsNUB)&()v`&CeX`E<01;mM8?p<@;W zhD+yLcq2&U3eVyD8E49p)^NRQGT)9f4Hb%sHXihozPJCqr(kQrsw9e#(Bd}f_-v=< zA3#>&b}FB?f)h)C{^^GE4%A)>Xc!*oX!skWeF10F)P#ZtAPdKD^kZCElpTO1TyX<+ zp}lUfcBaLCQhLnL#A_8POhFQCe+10&NqFC%pm`77pME>um19tga^;Xo)^q4{8nvshElW#S;d0DKn zqErN)2s}Gjha@wED2K!b-GOn0=`bLHf$a1n0Bh#uU0bKh>)m=CaE0nqVca2dz%`as z`3Q~d)}hV{nW~bwBDrM;Yc&ZOjZ2MDBcY{M5l;XB`>+17d^o{G+3XI7rO6H&1WG;T zWOZDV55L5U)hv%S9i&36SmmJd4Bl7>i7Kv;k3xRWsffZ>xPSfWV4lX@?~71+SO%^{ z)S0@EjuTPs$yni-$Yaj&+Cnn@t}ODj0u%8yln1f+5NWTX^!6Ts6jP`p)>6uGL25|V zq_|a=$iS?lR7GiQG_u~o0OG0=qC~mJXtoSB{P7Lc@P~&Q{zyX&VJ{ysBns$oZ~yNU z(Jrsl%vEEfBKLj{+2CZ*2gMndM6H7oES8aLt< zfzsBk?2|KATu26GWkv_KK;xDnm-fvTTThk{DCGdy2xLp;?^*otja8OXQBl{GpbTVs zI*HO&OL9_tm>2K%5bA@YYlOwwjV>fJ#C3-}R>aFkWF1iy;w}4gACi#@ss% zc+qlm(OeB`hd$OJKQjKU8;kKxdT)784wwySiMCxyPJY`SrQ{LtHE%d1UTfGf~;OUEqZln#KUd z3BBu{f(CGpAHySp^KgTg*U@?>?7RmRCHGdpinKCw=g^8U`JNp2(~WELp+)^u|JYO}| zP;8tH1Hiv}f0Hpf)AG)R>yx31n`T5{ZVN*NvCMVrF|kb~k1F3|JX}Yw5ms*yRT*IAFmWpZ|xh0mSzBaOhKWv64t3H6jlE}WHj=ukFWFhk1&M^o1U?SLpR@TAA;ReXXoam_W zRzexRK#Sx=Qf$a4uH6F;xt)m|$#mSUE;+_Ozrk_->2aKYE(;!(QrZ2rJV`D4qa%UVN(KByY5fkSQKKKMjHB(A{VA&$vJeq09#Q` zuyAlI$^7pWjx3FDw-@84@tDg2*Z2II`E}(a^JNh+lG9upE|BEs)Eu%nn>v~|SYLmW zff7=`_mbOU+F|;{q~21|>GtC2+>+B=UeZrVB~VhhJ^XZnNA|`jDp+_A3O)R&5^7om z!-}O6{WSYw@eT)>Zd0&AJ@jFkkd|4SBV*BmuxutYs?{2{OXB{Cp<WC_%H8fFLuc zx|h@fQ2u~VGWMx57ebBRjtZWa{U9=Fc?_$s9bT(M`eGqokWP-ea^|ABD+}K-t>bE0 zwqoLsjXr$FV$_*q?-&r@=kma<4omKWZMk7GNk^s0r~)Uk@*H2UCxDKbkfDo*(!XRA{`nqpisF5k*>#82vZ&S&;GQ>k#8!DoM|$@srEAR-SncLz zqdWYhtymr8f&zm3qEGxI9j=v+fjLz*T8*+ooE7VqkGEDao5Hk92y1Qnn>XxDU4ce4 zFGfzbYF*)ry|UGdhHtWFSe{~4{ws+^(GZnJ_UW#QoRkXflZUg5RQi(@;T7`>Bad=GKob`M~%;ya&_ zJw=T*l4C&yc5;ZxVYE87KL#^c$MaQSSG7L|p;65FZ&J{~fT-0Mt2Yy!W#BPIM@lGu zJzn}vuOOa@c@||9gSnXJh9MTabx44^<5Lixpk0U-_HQWD5EPyv>!Gu<;^7cm>V(E( zCxZ}bea;zLRv(drw2hY6mlcz^gfsahZgO=7OJQ>5*kOKst40G30Mj8;mCHM>9B_%7 zQv9eJJ#+Vr#U987Tk}>^KONa>E;6T|2~<|AkJ_J9w20OMo2QZ?E)G^vL6_yP=_(Le zTAJn5+$XhY#2V=VO?PFW@M_t1I^W=@?kOI}l$nvA#nnb~4xBGRmtr$`7OSVaQ9UCe z)AFh;jQH(E)`@LIFBd3>-7@|Z0IRRFG^n-+H`cv4Ogj3(`o{!|ZGq2;=^wKRfYOw5 zKyv^aHA~|TD1F)1(en&ITD7}mP%;i3yDu{{%EF4J|v>k(|6cW;fmFUPx`Qry%dCq=qQwYD)C! z7-R50HHyNYt~Y|Kp}kmHp{1%V;noR@MhN3&U9ju#sS-JRIx9x?YM5&!Kt;Per@OtL z4=WG07Q`}%QQR3C#@c<-Yoj6kVlPz#DWkj?I;G0N04qpmA%o5os%{bn?_sbyENv4L z@A%S+40Qai;?aOhO&#sik^JE07vI8e_2aVu~5L~x8keOVJvLbjk55JkdaKGRJG}KqkfeTM5Y-4NU zMplN(_p6{(dMw~|&M6t|*A+$i(06fCvgx zRv>mPKZTha%QrdNL4i=v6dqdsD~BCkN%V$(Qm+_nY><}G6X0W%;_{HUmh?7?O*A;g zG3pNXL#ONlB56_zdW!(c8gn=Mpq^fDr=OK=x?zQR7P-jSUQ$4@1;IQot*^#v7x8Od zb3n|M@%GJN6rb#A_^)$rRy%?$2O8f94ALEKp_x;rI-rqZD*R9TOf;P&Jo zM9-5TQt{pXTflB|sND(Ki@~w@DL2Kqn%o+SVLjd>p&{}7PV5-Q735Ccm;{JZMm46T z^#31&L%c-oN`BkfWouR^Ta0K9{!n9txVjbWY>@2LyIgQzkM4nGX(64H2c>#08c8!6 zlZ<}L$PTv-pup8?VECn17uyD%6ipKK?@@CPcU9iPVkKpzTsOtCaxWJBDJwH(HO3eI zuW(OJq9QGFPA+w2iZ&qP-Z^?JI@S{uwxV(urBqF) zu&U-wg!Z$JM9aRK^XY)pI8^oA;lB;|$sh{*a08VcMSNi6QDTf6HI1}3u8P);GS`xp z)iiTxk+p+up%EQGP&C>gjR19uLD^7MO>R9L^yQ9l<;!m$4SzT9Y4ORy`Dc03<_MOR}*ZPYm3po^z2sX59XooDguHWlZN=DnRgSWIdh zf&j}7m0)0DWVI0)?mk!m%<*h3x1n&wf(Lqb+eUQAv_h<~rm*gdMR>U0w*RD0&BFDy z#oFd#>&b2KL-0%udmxq92mszfp4f&ei~^J~<|4#A%lUn}$p!OWYeyqhN+|Amu0ygS ze)**s#*dk@m07(i13CeT+s9d(q;<~Bza73BYO{N@g9RXNMq+QxhOBVxgfy&JqEg^W zoynoMnzef*k<>A3D&)qGA22d zUHWJRjFc|6wDqnIBpM&s=#LvWbyHj#PM_|^8&hRX&|mt-fhzuRpe~r-GwAYdE7K<1 zTK}@o623UrkWuNqvp~^_cbYQM&%W~^D!!&0&)l&{@GzrQL)JPPV6e0alaZ=V`_f7k z-He|O%vUVSN&E|d*yT?L^78;hRo2O?r1*TXzY|xg(d`fu6_=}#Y1QYB_Ht5hPX=jjE5aEYqGu*uN4>?hYz#G*)U1s9a}&W$WK8S z85CY1T}E{;_g(r$X7Cb5$ctC_&yXL+2g)~L%jTxjPCc0?qeFEWjP_RC3MR)V2_W18 z{6LQCsZn6C=+YQ@B?CKI-ukNZOZ*gBehSJqdxP<^Rju zgSX}g{%YK2M6~&W2vkblO_7^;xyNmSZKwjI&dYu}NkWyC`h?Ydy_zQ*Z7BA4zEw4X<9f*07E zp?xPqHTu8IRFJJ7sZC$~Dsro_3?jHubX^1o>(VvkiN6 zom_PP2<|V+NK3}17&MZNFTiO9!z8cTQBo<7j5}2DxUU!=RCx^~T|VV`?XI~hS)-G+ z$z7tPZY&5Sg*E*p9?0Xqp;1`7n>BD!ecDNg4K&s>O3UN=;%*(a5qeR@`6v8i93XbH z7c4!cn-b~jxGzfhfR4AkIA4X(q5hSA3~xWxE3hZYSpe~z{LF9=UDcD!xUwRt9xD3k z80;(Fm@3{!dl#rKFSZPjAQs3&R2li`^?!|akRPa=LgIB?J;&t3< z1t}k%^gm`7fHiSme0*eUUiPUzRos^%^1msDKwWnOm2ZOPCS(v;Cj!g(KR2#CAR%&) zJs*Y}K3FWJvS}cZC0N2LR9&$ve^YHcJtE~>eZNxgazfgkL?zxnlAp+_T;e#yY3sVXLRM)%#$WrePd6A}J`mtwaOVg5}JW=r+m_93dd*Blr zTV>jcu%NfI4|ss9w&**lah-yGN(%~(URMP(B?7@{OVd}8lpXUie7GhLx;0+)*+$v> zczPAxA6UOfuT!!eU|W=^Ou^?%V9kWkntPPsPC0(#R5MS7_W`|E(Qt1_9b5)EpAMUC zaK=kud=Q4pF~^B0INhg-$g;VSeM4Wwi=z%6!Ja6qTTCD~pGHBlLfP{J^s0M;T1Mkk zadMexZ&S?-h|k&bv76P4jGSJt8>PW?YoSoJ^Z>Qe7U^GgWmmRHoiPlNUv$di8WUHw|> zOl(RuT+h-FfDJp7RaXn4DHG&T9HO`eG|p_?=ohAuEk^=%_nF^%y)lB$_Wn~whYN0nU#L$fvaa!jEh*Y`aMXCibV^mC0pyfkuW>} zz`q=H&Pn?7WrjS?6~auHFfz@orl3Zeno|a?@pzYe<+sKNorCrlgCrJ2uK(I_7zvUR zHV4xO`9UN1a)L5<>&W|SsiLQ~}>O2HL<@7IEaVSh1ORis(bv)U^U&WOW?>CeDPL2i;DAHxX2S=WIH##UF} zFyfk0@Os14F-eCKMRUfkgXb#oD;hwP#yMeTs{2|aIkFKht8kZG{QqL=(?~Ox;r`PC z*W+UA>SKCKK)JVNzd6Gk?3SsZ`mfYhi)8SkqF~aG*XFKqD~}4=mu=I`(ch-yNUc#K zchc9mhwxDhL4S=iEQ-t_4FDSIQN4;PYc&^SGg1nF(iq{&spfD0^v3H9VThPjK9kA6UJ~ z=wn!CF+VZ^Dpg74?{j%^Sf7p_3e_6@ja^bF6I2m-Y43K-iVE&pl?K?eNM^0s29`ko zbQqkB^fi^_EQ^D8fBazh9IqAt?c~|@lYcwOVWZ6xO8})Y)$`OWF45RlAuErN;7(ad>ZA55?bv#LMj&+TB zOw;4I*$EqU)VpRnNP4-4fgK5Q3VDE$^soBFRM$~I#?q6|;aObz7`=vrn#rFyfVST| zV0d#422}3#A5cblybAk}C@?^Y2Fr2^5LcmiVSi;u^`90J7KvDi+D*9oOsWjkPihz_ zp?@9E?->rm8aQ6~^k&z$jIR*yiI7rzkuI+?;J&|-Fr&;_+HsR)h5K5c-kt2Jc#nG3 zciadVxPLSlFWRPJDpTi;yQ{M0{SbxNJs)G^Ayafjd^w2;fvAPXRalu5;0#_3H*h3@ zW85{)dMkC!^AZjsAL`^7_t53SgQ>YjoZ&(=!-MzgbbWE|EGQhL%xn>drKXp1MwqKn zt#rzbcouY4mo4w?4i(fQnc~w@heD-djH=5071|P=sWHW7GQoZ`J!%K=*>%-_n8jXV zZd^K>2|KSSa)VOqQA^YsQ_9V%DtwwQO&&rzvqWQE38eiajk;^RccZHWVj7M;{rV&w zBr%d<2AjUK@zBpJF?QW!Dd`C z8Y??EE9R$dxxRM7*Q7s(#^s<$J3zodIvUb&6qm2z-FoH5iApnq{#6Bbs&|ux{xt1KzE`&P9X}FURrbMf~D68BL)UoS5 zSwk%+!PEpx`l!bMAlOE|)s3wj^7n=Xf=+vCfyo&GQhZDc{Nnky9%QSM(NE4IS1Y+N zqb5=;1Ba(Z>E|zsCpC!j&J0wL!>jQ2N%e3|%{FRwQf7o-G3@-`DuSa!Bo9Uf*WCeR z#p08;izr5mOj(jE+^kY?8G5}`g)wZ-*r8I6s5k07$Qzf`C5?3hDof|4!SJDSQ!KFZ zTv+@V9M7T(mA{v;Pz;f4OyZgW`W(wz%3}L(PRU0L^a$eTtis@JBt zjRCsl!ENHn|Ip(fK2e-m6-SDk$^$`^GIiPelIK~fGTq^nu@y?emXUWY>^zf#_i~7Y^CVTU39Sb zg-O721ouKEc|nYQ)V6MB;Q&S^Cu_JIo^38}AIOpLccv25%koRsFM^)f!=C)oh)JGj z=rB8zNae-vXYhWN;Zt8pBMzWMw1Y<92sg_h3t-olhM(-~U8;m1)?oPD`50W&^}({L zU@;*N+%A%=U~EOvv&Y88P#;+BGz&GenU=X3vrf729KO+niCvDDD4Rei%xnS0z@{R<&+MYX+ zKtS!>3=$smwWUDv1TZ=;JZ~K0DWooAbJt|ngg}eStYtF)!$Vd)NK}4fVUVix+Eu)e zdy%*%tt!EfX`C(w32}|FlglI8mmK0Gx`q;Bm>gkD4K;!pg|^kU`~DQ9~#Uv@&t_4o9HwdgqO(Ph>5M#|%2>z)5I)%}_KU30N!Z z%4~uhTz?r~1A`QAOvR0S42tIcoO(S9s*_3hnx+0M3R2VU=(>x!fWixr)gLMg_%Txg z>CSMmR##iQgSnzkZZX-8a~T6bsA2~;(N335DNGg|+yrO$u$tpD`EhTm%&*J#i6*z= z@DabP9BhDC5@L0aXz1V_!nYBg|C=QyfZ|h2TRd*uE%??L z9L)3~xa|Mj8sqdfZdXkRu39;f$c)6O#qXq?-dT`8Xz6^_PwrY`3ML@QhQc8vPE1gtE_Fb7K&R&=0zl<2IS9|!qT0-g8; zYdwr5(n86{iff*W3>$aZR{3vvMolM~t4Ixu+-6w6!}VNeS(Gu*+xX0bvwZ_RsytxR zxW{XQ3lbJ6#{t~`Fk$YBIH5f0domX~KeWNKYmCo6e;)YI>0|i6t8t)Ncj#ovP1RFp z`Q%+_VfF?n7La{i6LOMpJ;=9o#*e(`u5fc2XT}6Cm@`J?y_?Ry3^c{L2h3D?< zyOAa&;Omw^U)e@**Jm@ymvF#Fo`yeM*$K16?klCLc90i?GfD8`trmgEvV#y8PIgiK zK>*i~?9>Vwy9YG4o_+#WN0Nj!cuu7;D*2R>+moUu(z;s9OIh;Rid|Z1 zo#Vwp9_3WL+&mW&PU`4I@EM0W3o;US{BE0bi35#nY^!s&bd;p2k@S(?vXN}GNoLW0 z49}E&yK^4Y@{t3*g)PNW{sVz!JrPdvO%g0*5ZnU#iCC8aP%*%I21D4&g(Q8%QZ$+) zyr^#gCLsCa46Wy|cDrcz%o8h+^xtc?l2uCy)#AB?5CzvF{Jx#)Y1XY_Cuw4{`7zoF zo;BRM-VAQ`Ng14AUBD8A1c-MmUW%0}rR^DhaV^dlj??dnb*WE|S+|~vJi*a8|9trH0&i5^vGwub1$T8e$~)Xdnur6{#TsoD90*KI+3TI%;(c+R;Py+o5tBP_Mx9qLRi z2~i2~B)^^;UnrXDxP(jqpkPBVGW3j~bX3-x<#Wu z#d>sjMhu?={da*%D>p7m;k9V5i|+8~64xM(TgQrQjuU$wJx+e+?_W!!T4%QS1RFtu zc}0QXdm9CG%gJ`+@oq%HlG0ToO0g;Ve$Ynio^x$v*0C`e;igLN;b)w1Xa!N-n3SwRgaJMk2e0Q>(~AbMDNAXJF59?SJS zC{x)73z=|3)V0QWHir!>$?#Oke>wL=IV|gdrN9*NO-5N`08K!$zh=N=YiWGx5pn1Z z10DrU1urpnaMr;j-##W~6WWB%OPJXOv&(hCw;6$I&8|WIi2QcxIXNABmxx?~CANU< z>`ptIODH_fT1OoM#67?HTo{eZcDJB&v=3);gGTaexO&4!+MKAO!f2k zJ=l4|sZ)ZkHZ-i0C@2#4vhjSMkux2+AAe`s89m5~D#>-~(!I2bt`oBbKy|Z>aA+`~ z({-3^MV9MmFQ!YbNTgaZKk7aSnXSSBa*mhX7&t9}3-Bn28_VCIVJLCCh8-W{vh`0+ z+L5CR@+VRmj6*yzSIdpNs(Ir8!M;z&{+dwSg=P}{?MRzX_@(2 zn4?r?!3Z9>^R`%9Cl^joJOqoUFM)~G>gas%FT6evBgqQs3_X-o@i2bvS^P`+GB3lVa~>RhVDV7fX^=4u59E3D8CaM~Uvma#ImNn% zs`}&|2%P}MovoyBg`syeV=^!CtHMNn6;0_<)9%Qdu8BuwhHH}mg{IcG)e={_x@$0L zHV+0i7GT_m+5^S(D41rmbV2|*H=cDg<;V`=C5+1PkJ4(gb-6}Q3nfaWRdueT54=@EKO8_RLg zHwrL+dIgw2zbL?fyk+pH!?o0-9qSmJjy@{6GC>VGkqnD<%%mx$N(1lDT~aFs1CMU)Ak961{_#>t98v(}#FA z{D^_8yJVtk`7Q;T?g?p{Ysi**RpgbCSC8yDSMRL!eIdc-B7r;54 zK!cA7X*_Q&vTEw(AfvevG05$|+<^TVi_oE0bvE7?LKz{lQH;i&_`|7s8$?M*X^?@j zQgIZ32tOeG6Z%%e8)*)!g+go=>t%q!VO2>0@$l`J;-?&=O5_wkgW8FI`@{zMxjm;t zQPXAtRM^6&VfeNl&T8Q>XGI;^0=m(tZYFs^FagX$e4ibJ&6Lu%>JIHwW?~dp$m{BvP!It%U*$*`NS0`1p>MM7HnL9V>6e zkcm^3xd*KLmZ`wO7#wslt300nLtNk|ZaCQeMPPxP_Z%8Eux+6l9&{ENgisjv=?rzr zRGFbDJrX5$)c98WvR9!+e810BE8NjGbp8!~bDl>G=LRFupSZzVUmR{MO$T$b)z{Rt zDdMYjSh-I6#Sr~xH?n-Nv7gt`H+PjO&NYjTw!V={?}mqsxKYQ9C5wI9>?AcR(+z;K z>s?qtB_rT3@zm8!L@D$rn~}QA%YZkefp3UY=IG*#;o*F%#$4c9-wGqTKwu-36@m&F zR8FNe@vswyRJh=!8GUsy+7CgszudHnhcWGDlq3oN#iCOoXzayw^+WvPb(WDopaptZ zvohOvlEO32F=MB(EK4HEgrsBya#)uU=sK;Dt`*WgsyD`Oc@?vWlb_=^BOosATRVUH zAikW(Pmgz6osUgBC1cPoMvVn$$>VqyJ~2}fnH-v8no20ZT>XQgbo{{no6DkpcQs>?S_3Gu1^2?Ks)uhT0X~SPwdRU@?`oo9h=f-fIPS z=H(GReWnSvJVm{vp3YiW9avWopG-m+g07;<(YB9+_8P~iQ9NgG=-3O4TtnrF0fCYH zTSX^P`zc^9_+P$Byq2|7)vky2CeRl=6?%-Yv=h&p>26bW*I*qwbP^kyJE(J>oGvn3 zh6H(TEY@nDj#2@Y!ED#<)faZrthlE0N1U`yMlBpnF_94?HT$m`n>ESI8jQAs>m6(g z_fV9v)6rNv3zJYos2m;Zu8wa^t1fz7^t5&rx+uLdNsmdUTirorEd=8DO>#t6X2kU{ zp2Ou6>y^L3W6sNF95F^%{<_j-Dg702HUMdkP`$8f)OBM%rACo>?uK!m5Rx)}TGn@N+t;g3zmaifwPC1Tbhy3-?gafV zXDfnUT|VYZcmSrpcjUI@%Ky$FLk=f9h{2joF_Y2l$RJue?*l%@x;SP@0#@bUTvceG zfI}n$#{HHStla^%(9)3uO2(k&qI}#xkt4@p|(-E>cUMcp9w-6d3_NYQ^2FXk2iQVx5Ug zP`_KWGV;(!91URkQ7*V4RT21h(T3M3*PFPdYmhzc?%md%+Gcb1^2=E>de{M@Q7eNf zCpnj6dgmv#0-mu+5G@=jPAB0evc?SJxr+~qISdD$E*pm(b%V7G;g#VLCO&ZSoZFJ@ zaAH~ns4@J;hvk!g56NXfad!Sn#UJZhr9hVKsd8u-hNg5Kv_=LwO>4n+*2CSt-@)Q? z!-^3YMmJUY3C?tPG8K9_jV1|Q9Hxh|hrvcs@=;Sz)cDe96}64TmSvP0FV&c`ufYZ8 zIFkBxd+2eiACnWt(4IukkIz~)icJniPSiDXcmk{KuIZRkA+NQ#71u!#?|p-4IA>~& zzRC}%LE-fi8KNdi5@i$*@za5JQj|=@R4LBsb12Ujwe|#u3%N`unJSj7&@_p&Z-f4kjP2wVS z!s7IudK3l^JnMjv+ErZHMX)VAIYbZdCWHTWy_9H+^J1hY3HF;@cpkZl8&O_*UnsCr zFnRCL^irB!t)FqVM2`HOiU20#sT!2Ydi!aqfSvy8K-QA16C6Qn+AawJ_nMJkcgdGs z`|@B>Uy+n%_~z$Wp=5{2VqQar5GGp;Jk6I{&C-vn5%tIvTWrVGkCH#|2Uh8`yCE~$9?1BqQl>~53@Jq zZ;G546*mqfmzDh18c4jV;uB~o9Oa|mYkm{icY6v$R+I7}$%o2V#MKM&jE*|(>!spd zYwsn@!;r=YhjQ_jSh}hR7d+=Qk||3PUK7W!-%4I6yqxT8pN4NsXvb{rSCw zjeIz;IU~Q2mGGEQ~OYqSH2W*?ajb(`1+lrk(aCMl+SQ>9etKqP`!d(aop)q^e) zyZGRqK^KUKR>tvs(|p;+IuAvT9W!yIj13Nhf3dk(tFsUKuj6J$ab{cU8+5F2Qbz2u z&wd&`GW!V$r_trzl7O?R0S=7_GusFYv&iwF!VhXL!6SdVi4J51nNnD}WnVT)f05&6 zg8U07H=}_WOwYseQrWqsO_+k(*!Mp%7!J~rG9VhG z^YHCTesH4I!Q!0iFxnQ#?1s6aJ>mJiRtBqDrLvZkrEU(z=4WiZaWJxe=OZ`}WqVl} znOHlaFThv0o>K%GW<4Y>Efs^^0+nUFC_=cdD;C5cWiSKCyBH0E$*GT)t>eA6CMy;n zo4!CUMP7l}-fAx>zPsSI8sw`ca*z`f4VpAFM<^2*IXM<~qhouVNp%6t%dCoWvOXcf zywY~MPU*U>4PmJ8^$rC7K$K%}m|`TJJP~C$9$DA9RVZ|QS}n(~H_2io7IMqX^k;Sa z7E6c_A1z_9PG)qrZvG%zZ&6mj7s*%vTRH_{L)!8p0T0%IntBWa5g^5vt0E%!CwD6^pR2mw#zB9RfH4 zNym!!cAHuwessyro0mQv7&lZINJKJ9P-A#*u%hjGD+-sPW8Id} z5%~w&fj9pZ>@~HSzKwzkJB_WsU#0R4jyBShjWDDqFX8b~cyTChZn2+_yJH^)qqRGH z@y%ou&`qRiO%Vdu;VMV4YY2D%nkl>Sl+@Hns~2tLaMI}m(Rhfs6m7$jA!AW(&;c9g zzaGE#;`c7%mQ^T}MG9_1*}-X}8@7)}IJ$xn=#<#L;Ud9nN*P=Ccuy?lQQQolt)}7H zI0akQ7`cq$2=Ntcf!FLp9VNE*4D&4-;h`+2$G2Pg^6v!5gceryL%?RdBqzaMfmBgo5LWC^7TMvw9jXh4e-nN=+A z+Qqm0lKXV5wI73P2^4{VRM5z$lL?kZ5*0V$3}=Qg4$3 zIv>L`xjXF?7GVvv^AvOr(SFxIF|^>b`nJ-_>YuNw5-VZ*3!+NrED)jmvc4AgFRVUO zK1XCLAGj*Y&u@|vsy$Jj8CU%D4-?Vg^wa_s+LKmEY-v1SiSrxA`QVlf&YPl(J*6gEwG2+uYaZUk-|waiz`4xpZV6 zmLJeSZETBMw=d3$Y^nYd2&EJ|e9TcAg3kJ-K9&+;lO;iRY5;NYL> z4e}}!34{ewe+%oYCSBKm_?Xt*pNt%i5JoS=q`B0U{_Ot~#j5+j!EcWL$QeH!J3E77 zA2WKLGOjy5vv9Y**wK=JGN*o|sIW=0EuZ-q^n&jC?~eI6+94cY!E&ae|TS;+`B}^1i-3DVzRW+5l;%1__s!u%BbX z4M{rM%O!mpa4(~_Vk8r1o2cx}?-sLzWhmr-eglR4PY;Fs&lD6A5tr5H%b2ezY%LCM zwNGAIKKy@ubNK)AhySlMPfBqQt)7F9+$3J#NzSkGL>f ztUS8Em!vwEAv0L`H*vSBu;hmCUdR?V?qF514JM7S)rk7%^2LwAk+NbOF2SX#SHnJ8 zeFK9s+DeVCdkR|^0RybTJ)|H2-oFV@!t28mkOIFgj%pv9X^bg}=u$lZW~SwDd4od7>kw&^&%tT zyOL+2pM(d}7WY{-mJ7+K^}HAlb*J_f8GHcDCGX+WiW1T*3;OUy!kVaZYO*}bk4_mu zdO?1N19w1tbZ#*retE~7kWSa13p_Ec3az8Dam*U*Gvmp8Ik;new=sybQBc$g(cyEj zmcgh{|J>`6Ln_!oMrna0WisL$)hn?GYyd@GEwMc!`+77Nj+<33r(k?ylZhize?$j>asn~BMYn|!r&i1WUnwBq&xQ1T> z(PR-__t1=HSlB)el{+hbxEJjISGbj(C!C@ljR4&`df{G9F2qdVKrzlQtu|2Yq6t1cuZyr!E4OCbLNBW>!hclGy5&PT0 zE85P+{Touw0{S2x;I72~Wvs>KuaXS_oy3FtJ0<0OvMz`P?jj+j*F?){BS%;!)=1Wb zX;5t_yho*Gyi!8&)~p2Ww?)4F%l97)uF!YuUBw57$`aN<0S%0=*AeyVWy_x3Kv6^P z*YyqUVu(Ju?8j$2>?oOvr!1(>sf2%Fu1v_6DNOtd@4&_7YQUNlD$Bc0%=)`e6PwAV z_31*IX4US`gF2hDwBe?iwz{kqIAOeIU0V+F;c*@QIQuS}$9G5hS1V>{iUXn{C1YbQ zi}vsAj{S6b&P@sR|aynYZXhMMvd! z%0oymXgs#q@5jAL`UqY{fPE&d@o_l5 z75B2(#@R!qBOH;PQ)_%(*#TM<9*0jPQiS3-KCsf|R(I>y>L3hq*lYlDsd<_fEs(_6 zO;5C3CAyj>?M;I5`abu^FYN`HzKP;w`X`Q3A`Kk&sI6EKl_pX8LPK5XNJMOba-Fuo2rBY%d0*z zsO6I|HC0-&f^YU7oxcns6O01)3UR%KQtu=a<n(fHN4UvtW2MGYNA zo0(Sp)1^GybfJMTZN5i^2kr&CXThi;=aRFqy2{!Fhv{_srfY4(UPJXh9sHZ$H5^$&MJwGP^}6a8>X$9;U5y)Fx<}1JLnI z`Os2|ElHZLEFE#Ty*Mlc!+Fp$9wCfl>XEg6SI3|#w1?JXrQD%sh_i?C)~wB`WG8$e z#>4-Mjk!+YcjlXmlNXPs58t0cF3z3J_`2W=RV-$(YRT(SRD0^iwf6}oS&3S9uly5+ zOJQ%@-32=qEPKd%m-va-Ns$$HKo=)h9~1wT6aIDi)-O zY`!F*aU0WGB$GjaDN*&L!NReIz=#3F zFv9jK^Ee+{qG2E#zf#9ys9b)`AAip1^|6Z= z-j|R4zl_EboipsIt*5wu9vS6T70GqK4ZAHXpPzs4hWp#;uh^PlP^J?BU(6j681YB4 zQ{KDG#}-GYLH&hod!jb+n~j>Qp&qGoY+G)F;oYnS5|_j9XhrNBICuh{55C`mdB4P5|x$2;?Wt=;Cus1&*#F%6}Vks{8Doacl>#y=*^yk(w_T+9 z?59+}3DrMZKhZfD|k_uv01@P8Hz}raF+Eaw$dz(%IdPjbA7f*wF z1<{u$D%i*cgSvCepKW`@GvI! zX*2=0v%?hh$`}Gg-%%BOCYM3yCAoM%`NS|_?G8qg)J5YOkm$4bxb_s>w9uP5T`?H| zodyaot5NBe)Lh1T50U1!@>q0(qbs^LLNEbNnzw>kHdr5%-$MTS?Gm*c9B)f3>MESY z;Bqf&@5xJ%&r zZb96!R&L+LID=8+Xs(mvnV<(opLqI!0nu(f+?Nypj2BQwmZke}hGXs>#I2URcMzei zBk*3Lrqiq%08OMnOR}^kM@0Rj!x?8H$@8Gx&j!Q+D}ibpYv&tVo5SWnPO~hKQ#J#e|jzkon;#A+px;=cyw1>+sKZP09Q@MP?{M!37cBsVpBT~-PaQ0SF zG4XAGdG-p%Bg|+MP11i1_j>*U7zF`;tk}n>bRIO7L&N5Kfm}~?9X7ASZZ`P}p**vi z_R92WD5@a+7%9RfW=dX!e2aZ_jDGh9@n(U72kErihMYKjtJgpU9p-~U^=WZ%>oXBc zC{&`+vvc^g3(rlty_U%5yu7uxQMe4eH~AWSaC9jZH0o;Kh_AQMr_72$tN2*Ui_c@4 z{t^_+;ijt?u0vuDHOI+mFj@=CmmkBUj{y`2!b%C-_Prlx-j@3w|MN}X<9~eL7jU}w!hhPH!MnDp=|8VxaWQhMNJM^OK1emde?KSit+ zh!dbtN<%TFz9Ua?TPs-n6qUmJv>uo*&<3LH#!%sb$W2n%fs32@w>zf_)p3jM}bP; zdr&>Yu!&?R`li56QQZqBtI&>7t>SQSE6HNingsb0Hs3DT_JO-@X;p020Zanqz7N69 zC5L|f>f$9KUe+NLpA&=`t*FbMZr%KHb_wTI5?4$uNkB1ciVM|71EhT9-sL&C=a1%( z#c`xqRy9A1vd@ph_pvuT##N`*XmPX^?rV8>e-^*qv+8a|soa#GOj9cW#5F#P-(L9S zk!z0SyYPUb%OCB0t#9s&{T2 za6jFV!Sx&0{vp_y=35c77_){_m4MqL28|MO1qMxSF846;mO3)?W&D*?wqc5JDH%e= zme1LD(M`<-o8rp)P*od`>^kM9nllr6=SYq&RJ~4IFufL2nFQ-Q&)Ia31NtUyUce2O z2XyB)x@^314!iD`8C;KxapXbq-(QxKIcjxMuwe4BVc+;S$g`%^d{S_bd?Q`LB;XlJ zm^Ax4-9^5dcmchn;5jQ>NwW>KfAGZgHzwxcnAbQ2XPVLyo>b52%-K}8`^rH9kkJ!^ zwP?MAaPQ0NRpucahw-4iO~gTEQc+;2w%YU2qThF(S)Vv|gjb!0g#UQ0^;6*Uo6k|R zM1~s<3@mJOwHc@;W3Zm~92+7d+MDl82G|@i8M$VsVS4jo12ny(;gK6>gXL z7@mf?ZsfTTWIL##13Xd#Rd1A_K6#WuwQ{peTW4jA&ZUjAa>kmMG0Ui|#T!_=S>)g} z4Tg&cVRlQ*e%!y|#efn?O&R_wrmv^10R4Tq_8P9Ous5!D5=^RL=KA|YM=nNUKs=B) z+tI30gP+kAWshTp+ZnXT9!}H$62VVOevXqkpAIw*+&FAV%@4=1<@$@L%%l%%jtvHI zR!)}j!wP{~`W7xVvxNkD=Z&M65~x_TphZWRg7F&zHu^6N4mb)D9>nebd!8ckV>URIXD zVsODH6QA|s44D>3*0`v5!qsi`!;Sl*wF5hO*v^*c)? z#_M*RIFg=%fw9aKmU7W}v+qyArHUApSKvVRu7kr1i|EMjnQuo&XNf(LuP7-s_Pazr z59i=A96WOQIpffZyyVt0IYH#`+w2!HJ&k6UkYlT!rHA7z?rPmIoIpZfePMjUxB>yT zLy2=ZC~`CSlCQH2fC^A)mZnCqiEOoOmN5f}UX5C(+N*4lJd}*OzJx=}e3(5CE~|^( zwZ+kaub?NDRPjnaXrurueUm-`@sD!jJ~md!Pt~)mCG%oOX$5E}!(+0l_x*`%_cmXFZaiNQKW>45?Jqsr^O5Q#P z`FDI#_VSIGsV406D$oP84BGSDkyBfgR)*19E-I`>Srl~R)>)L(#6kR{m>t4}bSE+~A;kea7l2wO zLxt34=bgJ!(Yc3yu|eW%R3wp1nlp%@h)&?1!RXzbMK5KIB_s{pNJe{fr!4lzA>d#R zt3S9S@k~0RGps;&M>0*kFD^ERiuXLu_OZ+na|Gr)LH%7Kd{1Q;RaSKOVbS{RkGq(^ z)azGDU!^@#L&PJLz%3v~KvP;QjAyy#CjV-!b#^R!bvBniot7BHw;Wv*?!CK%mc>d{ zb|0(V;pt|0+)%6Hal=PTb%MYC@4v1S$lt9_@Ynxc(yPOx;^4b6SV*9)FPSF!i$n1I zv7wW*W*3Leew0Z1Wm&3`0}^wH!P>)2(KJ~57;S-Sbod;W5|U?a4qdhU8EMn{-i`Ap6UdTVYd(Kbk>l(Mh6m+f#TVmUj@UlTXwa?dAVw$5z7+MFuF#< zp1&untbZHn#X-Cm`)1US@$Awj{Mx!$+={Qy0$3*DaqB{!bkLi~|7xXKC!SV1@oL?! z7G=wf)r0kPU*5K)-k+Y#b)xSRxWSCU^Oo0Ta*+BRZz_B^v#4P02z>FSuDlLApu7dK zw8LG(B7DunDkSn=T19zH$jFr306oQ2v;&#+jG!^(x%!hJyjd{VGpi;pTsRBmeoAm;e0h$C9vuc18!e@Sy82!2sXX zlq9%(R{P#+rJE3pE?aj@Q+_sCzNTx|m~b`ac%ajIwq}rO;{qi6iW-hz#a5h zFPE$OJEg&^lm<`6Ga-wov(I}W0zPs?@lgA7%(-!QH)zflnM33a*9BY;+UnXw*Z;-y zxl~~}ZR+64`(wsOFmK(VT~&XKQkl&$lW8^Qr;ssxwh2W*c6Fa-xO z(j013QxsOfX9E+GYHrXc0L7(Z0qD>yhdtaZFjrc-Lp-~&2_IeDLJaV*xj1jJZb1S> z9PRjF(dehyP_*E2XEI*QZnZ$}dF6mQ*VrF>WO9mryxysAu!Q7{KGt->6X8q?$U?NV zW64u?5@xor$W>MqGsKfqCb%#Wxw64=y&x26fu3hz36fm=SS3!1V-D`8pXBG{5MX?z zUDp5)Q9rg%b#EbgYIz#Hm_TFPw~+~!?Y-sZO&MSF{1~S=2i-buL0^-92&s; zT3fyXOSSiiyF0&<4|~CL0;(4eK=z8ykFQGz`LdIwcsa;RN{1N&wT+HI=*is9;SBqt zGsM&l%^>TnWU0Z3Rx_;EqwzkcQ>xP1idckbc1Qt$z$lpaJMS`-V4D za4eNZ8$aR)_j*KM8F_QPXgycun`OBdkEL5j(k6jJwMfp1#nwssm}CIOy#V5=XaJiS z-6Z8R9&+J;Le5T+`uyyq@y*2AmU#E~975$WPQ2Y8D_e`dhMX&TRKZhHCwwk20T9XF;|MFVQDJW8PESrBt2lAq4&P5_$ zjU2?pVRuyP9H*3XElysv-j-oio0J>D@C8P)GDEV4lG2s60`!_$A&bv$f~S>aE|u#C z5rqz@(t0Sx=kij)-ZcDi?KaL-&64x6=x%aNfFbiJYd^|1;Ud>Er_r%$%j<8aH>BWo z;Q#P;^c0ATX5i@dU?V65&)$uRx~DY;C5*SisxEbSE0BSqz5)_Bo$B^?njA_K1^B+F zaZo!HS4crzwOv~YDFw&Djj!?1cPa6d3N?_#d#Wngo7swGY3&!?tq|2ixt+`ks&9wa zz1|_L1V_uQW7$;u)VH9e3ih960r0-Cr{vUN-PWHnwJJkim)y1W`xX*Enzzkp#MS?7z@11nvpSh#J-uvL-3*rWNe zl9fwx@!V3S^`T_u`g`NVqNqUR)FBNx=oL7eRIryq<;TpNs_*!89BgJ%d0 z!nJa^vcoA#N`Q$6kGtJe-_-)t@a%T6a}b^tDew6IDSNZs#=T?zw%4~aK|EfGC1el}yjFuA$^wg%bFFk^TjmAig+ZYqwtXQ(Ku*oKmoLe3JMu$g z%OmE#0&mLbfFf2`E-=jg5Ig$w(RCb5ySd}}w5m&`Y-1(nKJ2Ab*}y{T?B%_kcxuF+ zKiKv^L*3iGjir&|4J07q#80YO1_gx}LVd{CX$HoJ6mqz3CBr!tDkyB-M(y)pCf#3& z^!Xt~c@C ze96yFfmY#m!Jitd`Sn*@#kRmz(1mfe#{&ka9J$-j5fH9%N89|n(E+J^CSJVecG8VQOF&)lIVGq# zWn%>K4M0H=S*p!ZG*~WT5lq)lXcClcRsmIByk<>xJC3co{U!if(HrTNkv#g6A6^3f zVy9DgCs}TI_mG`4Y?&D^EF>*PE%OyLg*nGo&`B!*bfYD67Lf40*vj95HZfF~@bwn3O4RpuE5P+f$LWRRV0j_{njP2m6G_cxR8#qAv?lQ*$n6TXOui4rS z_QL&85&YEi-!GUq7aLoI+fZw+F9}Kr7GWRgk>`?g-OliiYD42GfhI5c#kvxXfA_Pk z7QF1)D&%)bfi8x4-Z$fJMHB+$A{gN&!$VZ8lC-Q6%~ zoA=OJ>D02pD6id)7vQjDuPa&qhAxI#wkywk3`wuq-?NSRMomahbeWwYLr^j-vn%Z+ zd78=2q2iT%I@iZ>ohZ(@Wf9G19$VAWNT4omg^omT#}5bpW68xfMBQC^9O^9DJZ4PT-u1 zFyZE>o;70r(d9qS@09ZgB94gwr^g4Q<11uASC_^Y!|?@mOyfO?*6<`<`^io)54w=( zp*qXxApf@Ep%?Mg#gAi+u$qjIJYCp%ivw+`V)2_ecX0pms^nwkh3HcG`1~HaN)Vp7Obw?6$_a zy9Zlx|1dpTH){cf*Vc+Yn4B&|S`qkSaznpspj3x9ioE@+yzMIT-qIb=2$K-&vdj|s z{Kr-*JDq}&Ag|Ms`lXT=?+z!0R}-~0QSKjKBuB?6PZ!X1N#`g(8QISDLR{r*R<+Qp zi5o5mO1)^YtD4lmzt039A9Q+L{5p&w?A-IM96B6UGJZq_BrC5-3Lo#}RYxLy94MZC z8ZK<2A-LC~LX|>FJpcXkxc!KxmhMBk*>ar8YomC*Y`;CQR-hRfY3PMejR8RI6UgrD zjcN-RkVtYqg9VIYzz9M>?=O4o+q);a>6S_aGkz2dw#TbC-psoO4tU1V5XS3G} zn=*vHcE~f`lk9Gyqots)fw*Y4qaHGasd#+?zr8`+)AU=&dQeO+X>8>68<{C6@7hth zcCJ1uEqkAo*H7WLICJbH$!;6IIXQ1FShe3ME9B~_6n1};^dBE@j11Ibdgn@A_WStc z7@yC(S@SYmxwiXYph^Qo`!rDzlx_hs5JZYdHb(r)9s)Tv3d1X1@A>;bB z8HDwCQs^>N4w&NrqrmgB#V&9sH(uR+YY&lut)EPt6agFIk!nb%$|cXw%J9cU4)Qb@ z9}Kw+zQi^Z;PhyL(e>EALTJ^k{?zrB&ow0jy!x>%#*-||D?gZ;mAY(^x26&8>7LyO z_l;Px;_2^R2a~X{4`$8CI;(&cjm1wc`G#YK!KhFmAuAyTOAz(Dv0Yw*ToCjAla0ov zz^r+ZHY_N4%r^s9`L}DFU;IYw^uEQZW$hiRGu(Rz%4;uqdQBH=h*O8vx7TLOn2*cd zw^tUKIxpF7J0?xMx8lo5el{P)eq(KTidHw2ZzpM1A+)vp2q$pAV(}nb8uHKthmz+Y zNYsIHm-2)4&yb)F@=GyBR~`*qN!L|p$dEy{MYz1;T#Kz`CtYB6(t{x}kx-}2=|C1o zww2zcM{9Rzo*)er*(?`FHmc&}R31crx=%f4$6MTjh#7aW>qW}7|0$=Qqa!{5m{`P0 zu6N*IERK+}!2?tkzvjK2w0x(hnxqG2Un%|Ckn@Q(+(q?Wp;B7f&AVMkLaNLxAC<{& zRiNKrVrBgao%AG<^(>h5S)QMyK5fZN5Hnw=$#yvaH zCze0z2qp^_uC1u{pGKrNS2E~K(YFncE?Is`Ue=ws$CZA6fp!%vGE1O}s$ObErS(Hi zz2JiRbvbF)lJ4CvO&LkF;3sdku>P6DjfJ1IwwN|c0s|+X#cX_>&s?zhv62sAUfy1w z^mgMzd!wfJN!Kp{KL0%P@nXS8>4xE;w~LpnZX(E}`r#U<3!A-51`p%)QLF&jabwqW zV**X>nQNl{1d5(ite0Eq#-?f#xc=o+oKUwm=GNBhcxH4tE%;^XeyV><>waphB<%eB zb~@MFY;&WMVc^L}$>jVdJ(vv?-&ONt!NSrJP2F?$bwxAfP#K;kxj8>GhpG`O34tr` z&+G>+(His0NWB>T$}cYf`mU9-?E$|FZFK4WinGO-&)@0m#V2|enox^SH@2K@f_TV$ zW+|Vk2|$2a#gn-!E#*jJwiI(=zK2C657oT1iNo}M6%pmlX4cv-lHu$3s@oM0P`QGr zYhnx6)2juGL?#E^r?Q>Y4l5iiT5#%?IYg#NWY!N6!E=Is51O4Hv#s|0_JS4)g)re) zHq=yA>~&u}9O4;@`B#OL0KsTf?O1==v8DJcTg=xpj)T*D_6&t{b>*n?q_QiAos}fk zy>4b;2G2|AIil2a7RVdmY1plJtiY@>?H;dDDcvG>HkWZZNiJK55x{aPGgOP-1qlN> zY8imLGN|RH0n$RuuqX4YS-t0x_1Z)Ba)Fg!v8f?Ho<*Rql1S`{9}&Oo-ci;R++oln zU7mLW|KUg_gluq@4X$wXb3E~J5rKtbTS{JivTczSH;e$BG-S08(RE!vRB`A%AT!`} znXTxW^#gLneiRqmru%sT{<|*ZG*FRioUx2`#86Dfv-M1F{V=EH6pstFtojN+Vf_R& zeY1Pn%#E$^7>_$f4$z8~$rKbsv&TEjp#KTrBn?7j>hn~+G|a0Tz!(jY{fZp{`V?R* zTRjVo$WU?#f`rP~4>|(=I%Y{kEJ{U8Pag%Ab!3^YfkGFJE0v%Thw%^fW<>98Z!q?+0=p)Yg#Q-nuP9jrfMoDRC2VoJ&gF2ask zo>%AtvQg<8bGc=btLnNy+1u-j{W#sbt-cPVY$CpkTsCIQ+qU#P8PH#fH;j225PDt_ z5IQO`QA;X%3SLRXQDPl3Fr9|D&bM#bkbejCZiJxGdbCo)j2=POJ+_+8y zPd3Nzag4rds15oaxj%@j2_T1t>U!820m%^0H0gfGe?+J!A+;a{BN{cVh^2v=M7@mz ziNIlUykl;-ph0=Bm-p(El9C{N^JpXj838MjD7y6Sr(S^p7U}`!CS3BgAt{V(XL@z$ zo<5}slFd)pqZ>phE%e9zK}I5R?}yekIN{HT{6*x=4ZW|}8f}ye5oFBVyZ;W&p3bfi zt8f(K9@Wr2G9bbPL(~IO$VocwEnZ5hY0B|;CcbbnQ0~nIKSpL3)7j3?qsf!cI2r8x zTyHV(^{ffNX4fl}MjxV`f?9rIrwe zGBc{%+0+0vp}Lx@Dxs-vQlcAv$(lW+KkdN|O6kLG_)W-RpDhB+HZ=|`v%Q*IafyP; zqeV#V@yV44h6LdNI*UR7_;@)zut>D*RQVyU0&;^j??4K`eF{3`~t zQ^E@#If>N-EFle_)mLyst69HwgertRRjr*iSDiHcsWjgDmX;sjg{@j(cad&~u0C>| z$jCbiOKq~$nZbl^RSk{j!eVOs!*fCR*$=|Cr2QgM$gw0{igb`px{{5obs9 z0yPTrqnj2+?Afi7iep@}jUoQCaX&tIP1=3R=2+~zYwxHo*kW%b65Fenj3M~50Ub#v9*ZGck97Ux;CwTE;e2nVG=vBSgd764M)6!IpBmld8Z?9OQ>MjTQsbk6vKVxCsK`UxRcP6b^}EWw9uH?@!$r^?$#A$Nqys?mfS~Y=VJ?XiVh4)k$fauDY6b z8crI_vIcwZH>onz0gJZ9=$jR1@PB?_Urrt6FXC+Fir`QDN76mY&aRa< z#?Ivm%w2(B2ZzpQtPuX&shjP)(%x!Xa`s`ZC3mO`J|vcCy`G&9@S8r`X3jtj}z;vh_-`@{%m$SaD8Rv#4x# zz~+*C!p1I?<<^hw0Z{Cl5$#MUv_}C-!A0Cz{W^Jfrq34$rgdRNo%8Yu_6=AGaWGF54ki2<&Fd*;RI35cwkK^ z5~2dimUldMsJ8(pV$OyT7I;UZO`?Ce7<#EEJV{t8;sOge6?ZKNsDcF(|5uoZ_kxbM zuCa~dlzFW!@;SMzs5uh$C*l`MN_)q_|LA!NJuWad6VD2Zc{na)^@kWi`lEjLNXhbP zQr#}j1+Y`pfmG{!>;*)ou)L5TRo;R;TC7=p`1soZXs~2=$E+)sN`GCxnL12S^nk|0 z7ZEj1@>?wFqZ>tt<$xye0^01WGBFYEMq#?Cz7^+FBad5ZduNuU2nXj_ljd3k`Nwpr zoxQ+aR8ZqExS|k9AmCGB|JYK!+EP=09l&os1$%ZNEK$ZoA=5(vtVF(6lMXx7$3=@ zYf~Y$Sizgp-7_@LWceK@Cz@x{F?4kzU*`x*dv<0*Fc!)TTow6_z%*2=Vm*SP; zT!vrAu6NRpuwtV!ow`?i8StnY&%WZ-Xuw4r>F!EV_ap366*FnTAB2!go{{{s?={mjIn?Dd}mve%ev68r=^p((X3CdBGcm=;7|bjyJV7hConsQWasgP7i7?c zzL~v#NmfeE?tSv?&c-)3wJr3CaaaO#?&i6i{Nz(3P$K}rhBae5i`6`M_58@&GZsMc ze6--g^E_?Hr=WXSOf!{L$Hfe*Qs~9qXqnM~yNfexatO{n;njxStPezhn4RCKvI~3C z!Bb`JE_;8kpr6V7PquOU_S{mgeM~$2D^h{#)`681NU?i?Tst30|0{WR2X`oZqdc6a zV8dKT57}Y3QZQCapycF2wGExkPZf1k1L<&Bmk6QQ+VBj`%kl2#*vTS6!t7#{Kj5$% z4^}|;a?yvcUMpqm+mbL9;}Lp==s5sn$zJdeC~)-)lePZ>w*mu7BQnlo*@U1&SuEH_ zn_sX`1;>NIju)xUYRZmdC2JQe4xN8Y9}nV~6wdD`f@ zhud}%l`!G(!M6;`6BEe_^-}2w^X`n`Y^T*KsuMP(>)UCQMQ^5%QB)7SU&Piu#w6i{ z=v>aT#TQqnVE%EX0zQc3P z7dopk?tW4Cu39iCG3B{gckq-PJ2;1OO6U!=`z!KQHB!^Kau)kyc$|5$OAq7fKzMje*0sxAYqC^AS3-=%C7aDXXJn~7qSjrQ2q`ezn4q2v zU6UQ9^5E2M*3A7N`e`baVKEn2&Gw)0C;Iky@)u;e^O+&!J!Z)lUm;v*W}j42tJ(d& z-E-PeFQ=75IF=UMUaw`{gKS1&FC5xz4P@~sG(BB`cgN<@Ub(%G`|v2_P}|+A_B!w0 zsI~Rs;aLg;%7Y1+OO%xDl(dt*{aJ^RVgdVLd@1uV<$q#!1{PvBb)^9DDD?GD$0uDR zST;88&cRil{2mE94hvMxZU!9oJ22(gQ+c`uJ{v(Cq&NHXLj-sCb2+>0$-VdQ`t#Rg zx*05B$%TiBug2_6-}L}m5RJ$e?vs^QZPh3N7_EW1G+F&Qzq$0XzzJk5e23b}gM)JpH{bm-gvVu>>C$!cvy4RjWACMTeF$xh2T2{`Q^iZLhZ zuN$-W<9=G{#6pa8u$Uj5xG%@DDz>&QX(iI{&z*kEnLhapt4kURc>7A$eeR~sn%+9T zY{UwQ%wfXCC5#fow7k~?e5rhyzXn%X#a`5*HWcpwWTZ1o=xj=2c>BMqNVY4VF2)Ca z*&mz1_o(tpl(8*NMEbmmKCX`Dv}G@a<-DbZ!5uO8x{WN{Aw| zG3JUd*nl^*1~8iuz_`}SzOE62?DL-0+CKGHHC6Hf=tq0T{M6zn0RyOZ}QS|cKLb7HybU@pS)gDvI4u$xEnzxM#S5|I(; zAX-;hZ5t*%bQ+kqnKy6HWEcK1-CFQBKWQ!ao7h_LH-**$HTPp_T%98CHLQx&(Gdw7 z3(3`{GKlZ74~5uSC|GF`Ee#~9oowACtIIaM`CQAlzFF3pUH#ieQS(5tfPw7~Pkz|) zB-U0XWSi>W5x~`yYK=26E-j}|%c7_QWbo-JYQsljL=TDP8wzui)w^U93YgJJ!QH?Q z-yjC1G%hzl{CYRY8$BEj_nT(wn2SA2`gL{-_`+c+X@e>A$7J~{Dks7uF+~wGWOk$r z+W4XPgC%o=459>~*w01v8MpED5op~Jv#!+h;b$BaO}w4EPR!U%T}ejE^mf4S3f(}P zu>}dK<^1{+LKbL|cn=yFGnxNZR*cZ(3xYnYVahY5l$HTY&F+fYT(xki=ifI}RRSqX< z118l#u>Y|5_H<$9Guv9d|(S*P~)S(g5;i^1f!4NX# zQ;C*wEG@hd?T0x{j(x;uwP&~+_N5GNkbd6iW!p+82fI6eYb!hyB9Nsv?u1Juse zfZy8`*C9?tZa}>?HV7HGu*GhN?xlYB?(RI!46;w12mx?p@VAMB?}aI{U%)r)*L^T4 z-dLnz{c|;T$N_{Veg_3eCYsS3K6~=&fmGN{%D7B+0ZGKXftw8jc)Ze{SS+1W(!Tn| zK6~kKL($$;2lyF%gFF9$mpNc4V0kD|Ymv>H9k8W}j$etyGdxoA>;xz%afe=jR zT7K~?sX7q)^S`3({jsTr`JVjSbv{~A+9n?F+2=F+iF%GUYow4Xr!(hfbF#{r91SYC zfi8mLzphO-A!Xy7s`7&%b$;~+rKD$gXXy%)F+?>bpGs+|lNA^?-KQJTc%oq)r9weJ zmBPdWQvxvT*Axwu?5dLpR*{5ucGM4Yph5FBow>Cr3UM>DjLMpbG2Dw4ghqKo z5lEsDrMdW*dFZV=q}rc$eu;CrfD0JUbjPLDWMzvI?h6GqZF}7I=kFwScZp>c1(?Gw!gAAj*{`0 z73$AJuR=XSDCSp}lg@nd$~KAp7mJnu>VN;2KmOJK^N)Y{uYdI~fBc6(+5bxy?c2)c zZQ+IHT1n#$j>**#$mTZp)31=kfh|OvI}sRHn~1B;OFlm1{IrN60Qs6kBF3|?)OMYx zW8F_$k8uWU+5QRp#r(QnLroOv`4_S$)BUfm5^a2?`n+Qz{FikR6xgz7W7xTP3?Ou9 z?r?w2pG?hB)l~r*?aq@Cj>8)Oi}?1dqYo55aej;5UF_@kWzXd&uI)^es83f@i|XX# zI>BlTq)i@vsVxMD=@$o5eLYGxP&OQQngY|k2cUs&J@+xgk5yz$Uq`XX$dlR2y` zq}#I*<{s-Xc7j8rZ5Aql`QuW){2IX{s+-{nOS4LaiW^A~WYyfv&Gy1IpU@fL0{Ocx z$VVsQLtx&k>`-s=#R?#%^dXEDl>w*pUV%oObrLBux}nh8yq-Wj2M1_`V{Rb6*SJmY zenNGBFV)k|CE9Dd2TAq#_Y&~#&KfHy;_*eYKZEvZO7Ysk0dsxah`f5SGtia?D6%43 zQYfRPwp?3__Dew0diNGe0ISGT1~^wb-pW1uiMe}HG(;0lN7bEzFlgMCQM5={IR#CT zH$zB6aezoy3p2jDj$A+UnmdGabF9~Z*} z=8pDxloT9a_9MH>JSD~x%}YH3E9M&>0eu`dCXeSv>OS(I26and0}+?ms{Za3^6T?_ z;T{=|()Ne`oL_2dv1i_@JHXe~CY@V2Tff2J0 z3P3@Mc8gYkPBq)Q(UIDhQdyx;Hk*~d#f!z-;T3Xu`{Z-C560g|?T2)mrZPZjL>@WS zkWc2ec!5*?2H`do8;2!jb|Id4`>eFLFhnYwE4k};9(;BiZ(G#8K}Z-Zp(?C`6Jf-~J`|l!d2c>O@z^>@cR&P^4Z_}5V7y7HvR19ZD0T@85UsEdnFjVfZ26@^dHkEVRa12Zls z$=v{sqPTzfOP4&DP;v3hEPn$?H?X5p{>Eh#5V!t3_o>Mo#uA!3MdEV1q|oQ>h20SskLpiH%S64Myv)YjbT-%( zv;26QFSYTS+^mlmR_q%&3w_o%7 zXH@l+42vD*q52pP!#EMJ+-v9K(jXs#$j>u*;vKV3oi0qWdW6Q}HJ5@CX@5;lD_#xa z##iaxIfxg4asaTyv#qsH$pT%i>1!C~HgT|Ql4fqU;>mXb-&sAfp%yYD_EIT%0HPJO zD=L&kyW$pP5eQhcjgy?Po=qZVAjy_G>9=| zF6X5v8mPV(X)xifS&-1JybEG(C*MDezYO`j67w{$u32R8vQ@`+2&^AlA@zNpu9$uB zP3!k_UW`m}CQN;o!e~^BwJQtNtRlUPqks4t0(6+$=D`l#TK*?3$)W8Le4{wGh&lGE zPhe5-&uXmt*wG>k)7TQKHR*rE_Q{8Q-rk-3}JY8u>{(t5Wjga zDf#O5_{*m7f@ne~Z*{T&%9^}4_cnO+kR?2cdKHkYni*wVB;aP2PWd^P41K7MOC|T~ zg#^+Yv9b$C1}R2-JhlY*&Dj{BqPWEzw%+_Ej0`j>ZdXI_r=Am3=7e{dZb(p|27X4q z?|6L_QDV+o%fyTmsc-H(IT<^$-izcCW_EP_Ld#xl;%kH*hta;iaR;9<(`46^#KU3& z02hSAtKLYZ7IyFc61HxY;(*_}aZ_ZMd-jm_z4U?kRNAX(^O{{ zZT%*DDMh5Lcnxvz^`4cpfz>@Y7ta{79f3VeK|lC&H##vhYM~@dlcWw*d*+F(<2ak9 zi*ejDeP#!fu^$qv?tGCMm%1Iz$?IxT-xHIcIjgX8h~}#?Z^3E`PLc_*{@Ba8E>F)cQr<6Xj;@Mz*W7rx)8rY~Lb2`2;JB`?UW1n-dX~vhv-p{1HFP@ ziYmq7y-vmhuU z0aorj;r4QpzFfj0pS+}pu33)-Sii&d;3}GMtb8nRgpfnr3RzI41=n=w#t_LPec63y zvh6GaGmaKXw8f;AYC40=2-?K$*}k47hv&)l3*@>tdef=9zx_$-?r&r2?r*14cgnz- zQNrwjp%&*R-gp|nlYTuy{@$FiX32h%r&p~PVU)%A5i+mUlw|!__{SUcM-T#JUu+T{ z#cbogx*3Ij7hVA&&M*z%y6HEL1R?1-`&_fwC(R=9EI{kP;m!sm%EBrHV2WvBJ~_r^ zb{?6ZmbDs5cXzzAmb`c|5X!lbKR!{8D7iW^S7%aeEX<^|#w2dx%!i6$t0Qv)U1&SB z_n=B&TLdSby=mjneuPa>7t^=|{vRc~aEGStEnr*Xo^#~+8}$J)Bc!bO9*^; zfB7g+D59tA@H%1;#EcZ}ge#$gR(>8cxOpf6WphsQhl>6U2$&qg9;+fXi@1Bp%C~Q` z{z%^<&Rh40I$qHdOBl`Akb33&W>-8ZzUGA>*7;ZSMh#7Fg!ZD<fkAqKNQ>)`oq$4f zP6?vWAQS3gO4B>+w5333dVuHr)=s*Y`PnjV+kVZOi}pdAwD*7k7BRD{d7|_SzuT$s zOD9Ryg{~$Kv-%lD^ho(*(N^au8?;pC&t}_6>w4Ob|J_gQ_}@i4{&!P?cuv~kax_n~ z__pdi=sv+1b$rw=nIAuO*17Rd9gd*dXG{mblPl$Ec+ z?7cq9naO$^ASs+L+^6ebC!r}ya+n+hNFc4Ni`X9&uKg*e%V#wFP#G7@1cv_e>e=>8Dm+fAt3CJtvCfbkXRV7^AwA(%<=@c7*FTvVj16|$; zA@2ql*LXMPFlOJL5l~KT9N{u&&b^s^dD9-35A9#-8L8$)Y_R%EL=XFu@-sa7p)~LE zr3ds}YoD@wB8#4g7I*@g1a2fN?$#T#Iz=eL>Zc^wb71fhN>>CJejx-(Q;lhy5RG2FKXNTym4F=npe8HcK1N;0b8# zr;Tm|I|cWpKAt`2@w`1o!eCb`8XvFtbs(8-L!;QT+NeMRto8)W0kLT-p3Y}DUZ-@yLh5IYxG<$=~Ef!!*e+~-tm0* z2z_kG3tz*ZaOGhpG1C-VmY{eJ_`1JuXkSZ~>`443y-Wc22;c?AgewS|7Wep_GUZQpC>j`k78>BLJ&&p1T;HfK;5|aNLdc0fkz~uA9p(hzUiQ%h0sFd~k(fl1 zYt%<~!F8ET>?YwToCIRVt7!c>)RjAZd0PU*OTisybQNTd`BMw8BQ2qu8G9s8ZkpS$ z)W({x-J1D#1;173wWnKaULfZ-#DkUBvOD6;l~J`=UP;5Ji*#orhEjR&Bwg7;pk>?q z5zTyvg;)2ondi6+)Gy^{X=sK+u5E;pCot+2q=GbbDj^dye=ZhFSv)Oo*si|){^G5_ zgwpa+Gu?lQbw>%01FrG(B)k*ygWp|`lrEOBCo6PRs{c}gvEJ>?kyrg2c5->%W@Pf5 zt)sYqv)U5y&vv}Pt06wkwkJdJ40Ynex96>F?VEkdyQn=hdWlkReoqlE67rXhS z2ccE>9u>Z6Jx1z7cFY>&qh&7wwT`ozt5E8mU8VOtc}ur4Du&HfwVS4o>2Vzyh-fS z8NUp&8S*0oXW&d!MNG1{&yo*X5j#@SJaioGS-Zedf;^s$&kHDXSVCho_9aq5uzGh$ zOlGrKqCldz;(#8R<)k;TWgP2gZehe^7NE8O_z9!Hal^J{K>jv(L~OjeG%lam+TeC0 zxvdTerO|B>232}_TOw!DFa0PacEmwT;rE(uCqS=#Lhm*E1@wfTNNlZS{liEU6x#$f z4zi!h?1e%O^s&{Vr#_>I<3ZEv=ehBOHVotGP^7Sm>@dp6WT_Tm89nW+F&`dqqUuGm zH~S%I`#1mYXJMON5d*h>^Y03wTh^9%jd!7$kES98tjp|Oc19@ZiMyBpajgx_kT~&& zNVdDfynDbt`7dZ-CT}3Xu+577#-g#`BWZu==!)5l_sAMeO0|i^9C=Bi6qphUN?0nc ziexl`z#&|(^)ovV0@dl%a_a@bI`xxPDtYNnw2!)AT>ge^A&Dt*&z0A=0bvQ(^S&^9 z<*a;#1d-pr3IOKxy!m8?{v>3YE7gdXvuo_w@yj0W81^ja{DBwwddMNIy*<~MQzAW< zt#o@|J9$POE&o{4$+y>{;$SjdO;=WJQj*2hq_O#NY5et1m&RWgmd0NfmIkWp^HP4BV$iNE zxl-gTs$VBd4q^tcBfU?XpKJhmQ0ZB}M@k39eY*#5g9o%zUe7Tx0SbapGh}D9y0EFt zfW-Z|MU*^>9?w90QE%t%#Z1*swqd~6X}6OV z*%t$At?Hf*(#A8&R3H*y6B6MIXBW(nr^(_hAQfwJ3U|`` z+oZppbS+x1q}`FWjFMCDL4z|oUg^0l%TY4uXICrm0C-f;GdPRu4PV67C?zpl;iBQv zjQi?Up{x90gHM&S7IHqF>%8;?p8Jp$^t1eGD#-&#-2pkPU%S{x@`fdG7Z(4xT}$>E zBrML4w~ukR!CZd4jKyr`dHW!_vlyV9h~rLxFZ<>0fdDMo>~S_zgOx2Hg(qSB@mcz< zY+>QF0sH%(n6JN&#_R73rYq@Qa@2|6TI;2IHy^?%Z*Z2XW;jbkzbf=5gN&NsjV zDP1|UlfW|rw!^MpSPtt>J@Rk=_J97!_IH2e-~R27a;TFjN5HxT8X7yHPT)_CNpSo| zStT4;yN!g&GA$jlQ9v{*`L<-Hb9~!@#@XkNT4AstHoqXJ5(0FTKiJ#%_5{B>Mj`Cj zJ4^PzC5PKld_>tXrSkPi#J9tD)*eIFyR?lCQEtx3)QXsiRVv`32 zUw$25Vcn+{i-vC^|GZC2AP&X`;8$cpY8o#>3i2!v!Y8kTq`z)UA7BZ7MRw88w<)p9 zg8`82t;@^?gsd+4EaaBm#Js#@0UrqOf*zUY-}w<|QY#<{@fH06LOtZLXX6aY6O@jF z#R0a0gpI@(Ep2!UvU55>Z5>R4n-{+qIc*DTHqM1Rp-hshJycbpq}-uW?yeL-oQfJu z^gX*04`7Z*q{jzNbqU2Xo>=&HTR)_zh>0R^&9pEyHqmzWKw>_7svSP5+w-u;XosUq z;2--^L7wDcPI6j-RB>|D#eOU`c5_qWT{Qmo{K`9rn6J?L?%`clIYVT&QIO%YZ|`pE zi<0WI)CbgMj!@p*Lgj~SB!{3$f(sh7a?rP@E1&#gw97OZu~BOPDTm&36m*52>RCDV zR7K3QV`8b75#t!`g+Sblh!cMe%?loP65W^W9@v`aDGnxLtXsClX9beVzo-Tlv+WAP zaH1d237;nXDuLEe4@9b9yDux4u@3@p?)pP&2M;x0l+<>%`kRWk=+WB)lSuJ<*F5u~ z;;b2Z&+;R0wA&y&IUY^cV|HwEM1v5i$Ri!2jL9DAN_UF;Iqy}woB2$g%>O^dUq5zcXcLsn9um z9?ylWr;vfr_fyR7zwMeY39I6k> zMpEZ4PLAO=QU_c!OvMMNSoqC&=9J)r05L4;6-BDo!Zk4TR9b?3>E4x{g*;hD<{7*P z!3`0uX#^aZaq_B)w`Rc)Eil++4tDzw2 zxKE^&95cpdQY{8S_ENU^=}+nIY*M|*&Kn?$qOOma*WU}&T-sC200Uz3)?b6w3(r8k zB1*elk~_t(LGO^jWBK)A_PUvz%}@J^KS|vD7SlGrO(kuB@EXVjsg{oMZdHq-R4Otj zpTMlAv6)(fZl$RgV)mfCgNp+kPk+L1%r;td_jp3-n&atb|4C-yx0qM>t(a9%URwvd zgqqckE9)-b)+uT9Z}NE}Bw1_&10~LIj=M~W;@K(knzG-t*$Md4e`S<()tM^B?~8PXLt99wS}6R8cuPS-C^1)@J?FiG`<_ z^}BT#ObXUciqaCt)i=zXBelNUinBq2w=@wg6qc0$i z4F*K=$&vv{&KHu+wdmLj3jj5B^?&JMcsb%>uTJW}cyV+v^uq ztDrYGn&m24NK0RIK*{+e_wG}2Laa5ji~scB{^ei)h@)t^ERj#wXg&s0J>n!`ByOw3lM;JrXDfSs)Pew zP{T157bP=h|kBl(rA?pieF9IW`T&@KjnZV5kQ}}lxj~zh# z9w4^PTvM!5c5elK)oHE5fDSE=bQZhC3)o7~YSDzr_eI@gZjY-mG$%6xRBakp+71}) zBXv<4+0VOkD(~PsNyo%3NS5@=MHIqFKANuChTD=)|2;{Lbcf(~>780UG&ROEyGvye`uc&j;8C|$rG3<$Ge{yW&@nU7l(skOKb{&ed>Z3dAFN) z`zp{UtrLK^7i-1S*{OUFx{U7n#8J=XwO*VwcLH}$>_m1lkoA_j6C*x3E+{shd9~E0 zD7zatnfIw5k z+yyaFhXy}$wgYH23%KrxzQyqzK!~WzlR*V=h229z4ujNB)1hbqjV6!`j-789C}yv} ze0a8Ekw$jN**v6rJ8CDDlcaN$c1MzI@^pq;^=!FLXWPX10gzOo=8HC3E&ju6WEpu) z5s7F1B(!F2IW5&}2FIVs#y~)V8>it2Jl{eC_8ysRg37x&T}Y^1SCvCaJ3$H6j5mpp z?W?h*`EL*K1`p_s=kN7z1Y+RRby+YEPuK~pHek;;GaZnBdlWtaH4{6WB^b<&Bm9gf zaaA0zoZI&zZ{`070Y3X8#$D%3>F> z>7WBIHsUPsH@m!81B$t%d;0YDgv!>0BsJ=sNG{rJ`;WF*pbWj%epHnsybf?U@yO8B z#1bG+6KDjzy=hLP>OEu5NRH4b`P~ftr2n&clPGe+I9iS;?3Q0wxs+Q)fV7N3_hXX_3<7*RKc>C_dW1OsfR;B z{Dil)@n9?db^P)PyNNQD;yOAzmnK=UP$nJ09*kDVqWB!ryq-Zk@ zja;#*5*_AYUx~)MxtXLdTUAJF#TpH?{x}YY$Ml{!|8`!|f2NYaVh={3*z7u|b-6D%^I`zp7E4ze8(fX^?df1YC8VrE9dZ zAzCNraZk6Zv1SfEQ!5X|oWhM0YTB+v}i(e6@uE7+CQ# zTZEG6Oj@^jZ!^LnJnbWI^tA&9%d<~{bP~(dOmAnEvY3uS|NT#*(0?DJ(0~6Sf?l3C zKP$G%q1Hv0ibDDu81bt4+QGZQ(bL3~j!(bF>%;6} zF`fY`^kRf&=*}qbtfuYTv`##OIk*F8zcQOym1FHZSVSBmk#TsJ-fxoN2Mq<|qb;YD zP!E*%XRdi-r8$_;_{JvUptSP#RKr`4|B2i@UWE`Lhod9x&csy%W=cI5|A&2ch#quc zd_sE(fkMyrgvsf=L?J))_$1|y8BG-lI3r)u*(>mYo{>VDNkPJt_tNqOK-j~__dq-Y z_!_mOLGU943ktvUV#3AI^64R|K04Ngg#SUaZ&8V3nQ}iziHo%W0~b84gJby|2qe@FtkCu6prm3ZL&}_mgrbjVb1+H3 zu-n5S&?nF4D%-S-kD5}J_9`Rug|RzZ^*nV?#5o5JY_=u!n70?W1eEw*dV9GyL$BaE zZ7t&{-~42ejyMnB1F^H(#gvU5x6NlhG-Ja8gf~*!P4J&D>+tRQS)_(HA9QE3$g$Oo z8Qv)n`**}5QE(5YapRiwZB0pm`S@Hp<%*a!bgC2wR<;(AAXORFCoYz6x)4=d769;X zgT>57*v2-nFWDfB+u+1WjxKp{U6HhAA{|Ry>a}2@h3?57A!G$=|-y_8X;r-;%07aChBk$hkBXUTA<6Q}X>O?aNJ&2t+?|^Aq zJW?5WXQ?NxYg0je0je6QC_I4TS12rYNzBL|Rb#wNS3UiXv24Ji&AN3%07XxsXr{dd^bc!W6KbK{;GKiR9Om{*Myz zo<%H#ma20(y?JOC!m5jw74N>MfwGs1h#WX9q3)AapX?`&XJk14aG7#hZ%?zrsj;3_ zMzTFLaZ1@w>k8%edvJ^=je2@TnFd{12HCKddll6fE!4r3L~TTHQFl~ zvH#6n&hh#PggT|EWGl3R%p0|3w0C8HmCF|kN(h`@nZWw4rX*b7yZ0rcH{Fb#Ud+Qb zs*(v?0U$tqKfAfZxcAsY)i!5l%?Bd3OR=>uf4Bo7lPYJ0>Y7I1{kQN}C5goN0r1%A zjQ)!Izc%8hK72%Rjyg^wZLX~$mAc(!Ep5kAu~>a^$nKV6HajZjxC~89xfZ(WZ3P5I zAIuHyEP5MV#f(@36>A-gL&phMvdS27L+=Drk3Y?VbWo(vFlXr9< zp~UdAjw-_4dDiaAB>wv1k=jRbG`vJltBb&SpdU-doc(fRy^P1^;#7z|MQ= zq9XQ0K;5$SgA9PgeyDeX#XPK{cx{f<^R1iKg?@H3NEg@g<=Gh5q~FS9w`n*(7CIOf z^2SmArIsu%!mzj70RJy8vNd!j-Wd=L@&W66$^L&HZ}oGuwpc1@ZQiIbExw?eyz+#xF;dqlmu0~Icks;-TaK5_+Eepp%$k(^ycTxU^* zO~WyP=;Hbi*l3hZ}5E(Q6 zHX?? zeqrM2MCjrI7^4I8R(%hNHUc=G<)Bt9@I&VP`rfhM}HY|MmlaWesAQIW#cSe!j{US63 zOZoA}rY!G0p=z#9__HkyRNPMaOb`88!~flM6i;oM5rEt#K5goho_1NWW4>fJ&XdhPLTFrQ&*vA||A6!XB! zCZLy!nKC4qzm+8fK9)FEpKjL7;S!z+=B>YV0}P0wWhJGpSDn zK1)7b1Yq6<2_3lmWDU&4db|OW-G&Qjl6kvw(hMPJ?`c^RYRm6!M1)nSf(wtY7Hj`~ z16-SAIG#&}AfZT`=in?Dju7V_?`b3aVjcuE@D|~Rq5zh`uxjU8Of(4blSwf0=}CS# z(gy^#%F3yHo;lY*KjMT40xsn}Qg_m0)S8LXPg=cx&M3poaFe z*^Y{=y=>I#x25hY0m~ z*+Ez2MDVO1g*KgrgQ93ms+{TZlo&cC zyzZp?dAwaAVUum8S^w&A&F`fD2gu$w4q{$Pg}K6O)paGwdh^34A^s05VO+bV!vD|E=#XQ9NP*%R&)<9S9ab`-W6)REFAE}ya9UhehAcQ zbwl4ZK6%Kiw2Jm%m1}rDSErC$-abr@F5e5<1z54RkSO~Q-%Dv3sID)cnl+n1m(21k zL)L&~$Wt>A8%$W$oYa7xc%a=3lzz9T!|7o|csh?e9W03foTibWH8};U6Fo0N713s< zx8{cP1ztnam`$YCS}Wz(pNba?L;bTcRd|6Zi<(rjynZ97{0C+EeEh^Fn}7T`34J$YyJo_;uTfE9BjB5X(P8)7$r6U=Y+ zd>K=y7O`dB1ME*q68K@sewX53qZ4DV2=?0VUXek<#Q)P!N$m(-avk>GlM+VEH2M8E zdo3qa=bE;IN;U$eB$&t(!STFXs8v;wB>qXcP8IlFAj3So&k*G)TAbg-8OCD(WuoTC zRyn|(z8guv58L;XrZG_Ct_$U#?6#sIKoZ{~FZC_56bPgm%RNcio3HlmQP~aeJgIJi0+$`cSUJzA^#AAo6n1zu+Loe8pla}x72N=rlFHl93 z_CL~YppaP@!VhK35T36IxhMb(4MbICU8Xs{y6O}ca)cL1q{tJV*MzP%2WWN~p1VsB zRE&Tiq)<=PsDsyCDgg?=G3UZZ<(9I7o^vKpK3!T#YLrT~l~{fNulL{!zJ*aq441H< zn6hx>vD)+ar4uv$Vj4tyzLX%t{{@M1m=dJ4YxF#Z!;PDxx*6a7YQhR@avEOnSQ)<^8%EPFD3bq z@s%<4HBvDioFgP$=!fcnB;cx^hhelxq-h!LITqg5_X(20;f^VLyj7No;O`rc+ymS$ zI4bCfKwn$q5VQ?JJS4)Vkx5X$nD~B|tK-rPgF6>bjXf1Olg=7CJHtd1W2Tn+DdhL_ z+cV;5Q6kC{lXn3cRi<<8gRbCIoruCYc58H?F9njg-zP7^XC6L)y~$vBKNJtb2?8c4 z*QwqC(`6n}2VpWD)HxE-kj9as*FH)wJL9c~I1 zoL+z-JEqobX?a&Y%9{KNnGS_8A%?n2Ye0jVLHlV4rUt_gc{$fDjudS3(1Z}GDV|QM z3DSS__A2zy7ejzZ+#R-gy4cCPqX1h#q`yeVrFz`NGAPKhk-R$5|ANOU2p*^{P9MRY zua05r1M1onN5pJNX9Ae9IZ6(TZGtJF4^7KikRghK?muswCbWf2%01TCIH%QRcZ=vZ zjSuHx_n2-HwZpF*!U9OVhpulAXRbe}dW_hbbu4(08eOw4IIoe#rT5w@sJ85?#y(h9zc@xp2rtolY`HB z?z5Lq(1sZ&gxi4)9b5tpDw;63oEKs zaYtaGX3bu5I4cTr!12X6(4QC2tPBgG z@KgC$rpeK1c6jYABU-b#WLUO4;Q3$fAtX$>gI~;Y`*bsR$3{^Y3Mut|0HP?ifJ?r% z6N7Zb^-nXlWn^}!=BnnXbrNAsu{TaUcWGX!p__-=B>Z#eXG3|9soq<$hf)34@h3Dd zar~3UJqn2Yh?Z+)Qb0LX4K|XjR5Q<0Q%r$bRBfq#iDKtO&oX5px6L-JQtop#vdp_v zq*xmIM_oJg&y+CqiV|CoX<@)sPNFUJ$HqpWm`o@NQ7UUhY(Oio-J-sET840ktBFF_ z4Fwlw)sV(yK+e`}Y=rUZ0Az>5rh1A&))3aScPpvty?KD2)}?k3GXF0#P(B=y*=1`! z-@eqX^7_r&6MQ*g9KC?c?}Fn*@*$mB3jS~euR~`FNJNbG$SA)LSgoh}3x zK&?1Pld_7f%sl)+ROrr;JUqLm|I;VH*Lr$_@2fR`(0xF`-DCV{DFp_Jvn zdnW-H$aiAp$~kqVvb0Ay|MEQHEhq8gQ|5;_+lb&JDjW3>C)#B@p4Mr0erFz{ui5KU z(TYVPZeMN`SN67hu7#x422*EsBfI=;2O18>+TsV7Dw+y?DLTq`OKK_yK4KBvJE(ov z?0Si9_0rGOe1AO2J2OnIm7-!0s!X%5zAc{m>H4*h=eVBs68t>NFCX1HR<|6_Xfee4 zQDntZ;5#X8;cVXkQmKiuL*6~ex|_cCEwZoI)7F96hN%)t*B3ZZ5>Ga#>U)6f4b{*= zjQn^%wm6Kso8$FS(%n)M<277~O9INn6#+^XMMikS^cj?EQr@{xt@dK# zhyJn%sikM)S#(==>9?{QLGW4MC(kZf1}Purf>VMOLSeBQ&dN9v z4h=Aw^zMaFC)%cyj!H<{@JlhgLA%mDhj{bS8MyvuTj}j{R_>`b2T{$7uleh#GD7w| zAhNgZeYI6gl)LvERN83E7NFsA1+FoyJ<^b&vs4Yq7IsM$+56;69A0O{wNcIP_w&)` zY;fhwiyQQHo2yAxA|g$kG(_3yPax^t?oDR4x{K}KIZ}QD`5YZEq-BpTXjXp)q(SS- zqMpZFxZjnNkm^D9M&E@B@b-0Eo12V){M&Qt≤n=i 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%0Aeo)C4;b0>6 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

    <31YNvw+Kq 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

    7RVBgWljq1`Ux;ok` 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

    )NOl57} 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∓_iM)JR|c7J($oO4 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 z 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�Pe5#ZJOsp> z$IO%X<5<2=iz_Hb6Bs&})N^FtkYJE$w|GbqgGfU3ERw2WeLHUb@Q>ziN!Gx4K?OZi z`%&-OGXS7>x4rP5P}TH*vK-vYUHBs%KK7Wq#4zi0P!cXH7ZBGGEbqq`OUOCqL7w$( zrNV$Us3w1Nq<9}7?NZVP)J>ZQI&%T}U;+v37R?2SfowwZ_M82)T7XmV;~D4VC@n4p z{d<3(b?2o&ZP{G)i?6Z2zx4 zxec6u*tD#NzBqicBc9zFlTtYH{3^KKvmLLikldZ}Teq2=`*__R!6k0iCMzim^pC7bKZ zd6a?PWK_UOl5}?O4o3;e&*}}3CeQccci}usS#lPW;z*lzfPDV6yT-lpsIe6f_1H7< z9MYc7cIx2fQ@CAWY6_2@TM9R@XK?|bMF=Xd_`0T%5ptrwSvVrL3@6lI$IIoo*0f)h ztS($xjgPa~(iPA{5hmD$*Q0QuW&Mf{_eU9MJm{LzaVohFb67l^=6vu)%vAL}_!V1h z-7@bDzt%cYc^P7ERglQB4KD8du*Y;KL8msGL#jqYIMFJWPhK)1_>dohtwrD5%6bUZ zniIr|sswg6l-)DhTwz8lDpP0WbMy(Imey5|(Q3YiJL^&ACQhZ;N5gZ!JHkW=-{0Jc zrxIi@gF=n=6LsdDVNz@;EH!;+8}33`r&tZZNRVw%r{m8VVgSuA`D7bDKUdyKPsPJ{ zU3S}*e3ZS2e=K^GBAZVo9%9uLGG~O#aNBkK6hXcPYB>ksm`VmP!*`Q5$?j^2NeQbpB=O*Y5l1fCts7T0dCnQef5| z`Lj{7)u^ok2ylCiu&@dqjkT4idn9xAoyy_O1rsSe+>k%{bR63lbUaODQ=A<%_#Q1o z5bvfK^fNZWm(RjhZQMN+t4l90&Y3D4={_wVc|z@|v!HSc4H~5v3$icq%0eRjkZ7k? z@(y_M`W`hmpb}fHmH2dX@~iR);pMvHO$A*KphZ(dsdbf3Ex1@BOxgv<)-@Q`hEUTk z9BPO>f~;P916_&Qc`}oB{0EFaZGi!lR!1x8U**7Jb#qvmtZ3$ zvfKTQU{y@jGj#5kvNI#`9T@4i2^i_OBp6AiJI;4mS4wuIMm}kG{QW!l#_tpO#_!Yc zjhx@en2+;qQtT}E#b4GeV6`=>g4_xwegy;{$?@STpB^P9h?5ejGB;uC^RHn_`9w77 zPiXb*y7bj&wR3XA3|hkawai5JY01qnDpuWYYebTh1ISN-Gm5sAuf~lw>!bgHgbp*f zOjT=84^Eo;q5O$7Ta<=Heq+?e#vwoK_EbzCNEo^s!C*~hnF@1>4S?6*2UZNyxnACev;$yfZ)B}XrAvKz5>t7$k=VO?~21-QX=4rUK z9A`JQzj#xk3r4SS9#n-F6+g{g01#Fv@OZZUOSl3iyIR?*`h`OBD?BDVx{@EUhT`rg zn+c{#R(FEC?QrW*f}e3#RhUn+a!bl~tQz8H7nI0_boKo*)5YUdJ}e@8j4pYSIm)=v z@$kK654D-~@E!2z_X+Um_ayKLgMGdmUL49^6FHt@&Lp4kQg+0V<4m}dJ2ga$Z1+$# zFC?jxp;K`FimJ@YGeTmkY+66`6zwQX7T z)1Y*cJXNroBR+v=n6s{j47};#tc+88$}$cc=>2C~JYOmfzV)(ZP-Q+Vp}EpH*$Xp| zUQLcmiEPlIdJP8_*EMAY!P!8zsOefY_A2G?zy>Cf;c^eFrk(s$oh`I_+ z&%m0JyMaOKUKlxo!V1to)VrR-br(ne5$thZ@-vS^@~p`d>A^Fy)HD&ww)1%bSEozz zbM`(Nuij!MZY?p(%@WnSXSRLr#Hpw8aCc_E_zqI~`vg+@`)||x1q2y;4`SifOUJ8K zOm!=09*5bo<=X3ce^cDU?e*|@eG`};(?T3%p0;}@(RMpG`;ro59@^4uhjGr~PpCI; zu=s{IN`kTJ!zL8$`O<_s*hQ}dD`B=dGGVVkFmp3eLWf`u?`pOQ`05x znr!b&NGXQ-Wi_n@k8}GJmGD;t_9k5`UbqM;_O9~WX!HEuP<`UhD5L)yK_Z;x4n|pC z*Ke+f(T zw3lqBj9Hi z6zVtQ$W)K4WZo`$nzI=iI+?u;`+(bcKPcMP`TW<$Y@AHiA-T*R!z+}70Or8}@6$XTnYk`%@ z!D}XkX?DW_jDZdR`E5}73(bHK{e&dR_+*FOOMe15OA@lvx9Gx>N$4g{k^DQp?I-*5 zxKfm7Cl`-0ake_Sf|`OU3XUXCI=!}yOPOOvN|@RwIW+$SM@K)I*h4XygLQcy$O6M& z6@jbKd`#rHqUNB`#!XtI?}x5O>ygJis{qCVFiD#TcB9G?qx9oC95i)NH08&3%K9=D zwrs}B%Os!07k&LcxHCq;tvmE^D7_zt9r2FSFAA0(B+PhMr8%6ra}o59WZ1{43b#8N zSfo(7LMq!{iHID=NE0cmG3@8oLr~C^m^kBAqbJm7yhTV~Z-X~P{Q6OLeB6VS1AY)=WO!V2T>@m>X&~(n}tH! z@(SR@+2TyoV(4Tufs*?Wf4RxT?U;Ts_co`^)zH)dx;_xTwt8XSW~7pQ6cyoDcsE4O z7D+p-TFag(g()EXnFNv6L*fw+#E>yW;$Nvy5u6=@3tzjC)ufnO2z5npW3T79t0h7? z+brf7*|@t6e{zB(pqF}qD1k*<&Emg)H25V%en>bxUmCe+^+g<$pirB0L46!+hp$8& z@q8|UD^ny8&cGl7!0aVpW|rVQN`^eA-f0P0K!UL9mmg8E^o5hmM=$$f>&7!55hkln zQc1pz676{<+-f18U+;p3^$2AGsD;-Y97rDPeih59erX!9(8vr#8{OA3v_IW z;)X`YD9q-dp>ct8V50QBo`y^Xff6M-G|F-)bm&c#kn z&WrHn3bS3_SS@R#q33z)zhDH4j}i{ekKs=42cRw>A~AOrH1qN%RXVnqXQ=|SjOy(_ zp5>jXo3x}01|m2K3jzA$`t~?;KEr9Q-3(K6O&_)soG+VK=iq>0tAw-GU`!>bVhQYe=~>BcYlqV~K1$hFgw3RX+&} z+i|mLRi|Dqx_V;40(AXPx$*89Tg8agOpcAtz==Rm2%S(A@jS6lnaZh?re7+*MQodgcp6Ritr!}AqNe2CLHIks;AO` zT{FbJu9%MqqHJPZkE8rDxK14|#OhCKxMbkQdleO5JPJ44zLAA@VmNvwAw;fi8h>Fo zDeuYgA!8p(HLL+q{V6uaC1uq#wi^NXsN23=UE+awcm)y)eatEPMrNR=B$DII7J5XE z`hd^6c!{1O(6KPQ}HFTu3H9br;z&>Tf?zrKwto zA9)DIdgLc^Fi7{B!Tbo~9a;VEoV;xhh_?GL)WmtS==Jl*1)@ZPc&DPrC*x&(<`*!T z>VY3bVkZfikeEmzd|=S<-!-iZqOMyN`8pj7QmDaPTFli0_(}2dVda>SNw|H2Cy*N; zT2g$ytdc6!bLeDF^=u;TH@m@=2AP9@u! z8n-~EN^V*AqXx#>1=j9OU;Cz3eF0@w09eB?cT%aDLdRl{Ap*eFI+B_MJe_;yDfnrMDGW|*u z;}y1vGvGo%8hrJUMP|*SWFhD+-t*dom{&fZIyX~EPAo-*MU)wzUw-fB-55T3JO0)i zy$xyrTJ84Or4r{3f=ZhiEs4BPhaBpX$Tu-o)fHbmvvz=m^Dx~H_cEx5^!K8LL)p^b zx~t*lsU-l!ZPY;v?lZ`+$a}dmkq!_Z(8K;>Lza0YJD=Z9OtV7CWlQ zf~UK;l&n5jRLqPU&G!VGpR(N+ql;CsAv0y0?|3?XpYU}2p5*Cpl>eZ%MT8-ak1Dge zHijpnnLqPQjXid2pF~(;yTcW3Pe|~^6b5+Fo3M_6#0h6t)Mw^ms`LhA%s(DJIb zrz~hby6@eMWSCsn!}MG#@!ou`%a9&oiotBxxn*2gBEOaU*&Kw?l8nCpTdA$s98! zCBa-YGV%mSqC7u(fD(@1x|5%%haWaOBY15CXd+J|E;0}}wsU?{_EM5?%%o4J%eUV} zbG#zOKDPRVy<wGDSKpLsNx7MTX`v9Ts)MI=vCMq|A<|DdrRF*-4yK|q75DoesPB73J!Q~#3l4++vnW2o*p3qtPGy07~X9o zkbOPJ|GU<3A1tA6GGqC^;}80M!XNZ|l0WEsjvJ;zXX=KU@QSt`!i5`xi{3qieYAj1 z{lJzKwXs1$c&GOsSXf#aK0=4KzMo05-ay8 ztMIE`u$t8pa=mdzt~Ct$3s_Z8*PSUCq{H+TH9BSn^*jEF z-zWSNzbE-8f?*cZk+n1(KSMdnJ*M};G)SrOkV%qhJ`C;^Mpbcpex8K zBCnCMGtno*p6MuosH|&^&_Eo(LcxA*W&X4d0)+3&Rd~1&xptSx^V@3wrbS9gbr=>O z729t^+XQ|G`JukiR*;7O-D!I$jkT6#`kTr)0VHQq;U(JWp{%5|l^WlqU@i!hSM??O7ixV<25eR!`=S2&Mur=Eh7&eEcd0kDy=_~Jp==fuV;pSxJR|7CEO}NGRnyla7STJ{ayoYMU$BiJHwJ!KdW2U5l zabqt(eZCJjDd&H85N2OD4;qt9kZ;3}ino+_d+V;S5dtJd{qwN35jkopnJQn@bECtC z=WoX@-9JJ{ix|L-o;K@uqO*SRGSGZ9>%TWvW7Uk7x!TP$G#Y8;5UGRhbUb|J*@9B} zO}~zD1r)Jhv7)p3!5H$aPf18_vqS9%yV zw|yp!B}{sO#?7(SLW)#D7^wC+yaF>&c$Pk3A78oruWf5L+UWV|WPGb<*V<3pF~DkS zGc2w}J*BfJHM{ zef5thUran%`exH!}{QghV)KV-Q z;%RbKdAskf;}}oi42i}$O&qhjB<@F0YX>LrXBA>m1~zAuG9%>WcMLLiLs}g}Rh zEBSHi2=}0QBQZSTW`}2x{lvH#N)<8WI2&<53^{EEF9erL9G0MEayh##63cn(WM-!> z3ns^4(px9qD)yP0Lh~+GgUcOw_gU0AC&F&+d$Kdb{^UAf;L>y?%)eZ^+=H4KQS>j@ z+B2RHa!aJXS1%h)WGEkGZ{t>)D4j`VMP~8yAzcG8^B%-)aEZ(%^W%QI;F8kh>J=Z* za=;f%<)h1PXork9m?BI8h6+H^>YPw&lIfTMuiqzqU%&s$ zhbv*W51(bIrDKphYeW>G--ZTaH?2pICUsKj^9g| zA%%}72JB%d@s#X9WLKu$56XMG1YV-OrqSm(^C@Em$3ZNK`c@nwvNrM)<hxE(w%? z_!2kg>`IXhJyi%Suyx5hXeORxm@AW`*3vu3fnd9oJ|?IhP*a*;oRH5}REk-55+3u3 z2WK~|LJgSY`Dhm^xZ{Pgxy?jvVlL_A840|Tg}M`(;S4OsFmqO8tBr`nANnSs6xM*E0+oJ$Y6f5RN-8hQ>6n7R!%K0 zW-p`K4wVaVQKo;;ATF-=meN3bfu2btxX+__(sKKvqbI@RzbdJ*^X}pGD|Tka%l4u! ze_2AeerfjPzBfKCJIC8<$LM4sGR^~!+8y*M%f!3igfHz_Y;EK2fvPy}?9Uj~@7hOy zpR|wuo@^iWdX|pjCSy*0yMnjT+-A#~?aa`FbG$7QSuqNg&5*4F&z-Pr4Ha_ay90qT z&Y)ccnS@4PASG6E%HX*nv+2EGW8o~?IUiqN22Z=eV-Zt6(~K7@zF+N4VwcU`;8ZD@ zZg#yc1SFW`wV$VDfOW3*aF}Y$+W+gaqi#FN>Pl3!?qFKDsJF<(9DBi#Ng6_#2&@YY zrN%nE^X!9jrb>LddS;rxe}H$-R6XG440Cbw(sz^23zFv-U9-Nw%A}q$SSP6yY^vfE zt@Nd7P(mKXIUa96TX;_cFP0w7nQ9N*$r&o(RhByNSntk2N7|iB6pwg*)=3g4#6|=N z-(X!{A{(GS+8Z3%I0#c|cC>hEq+kgpJ-pm?`P05kusIWGsOXb>L=o^hS5uh(=nYhS z>eOof52D+Uv)brc1V=axHx{`{H zy26ZIa_371MGOO&Akq+JnZqCUGjCmhshJ)4=`^K5aDGwZRh%#kuA+HUgbi{zOmju* zc}Y%dG0^mcr&0xqV&jrX3x7`Ee#+DG>!ifx*X_Hq$1gludm;Bu#S+gR<}cA*kxO9v z$(MLJX3yZejP&4Y*|?%)O*nROlpPy~b7f~`PH9kV$rNO+sxH__!?#n>YMfjTcvtQo z{b|MRa(tNzc50?wq8uLv1}Nz!aJ%81QF=)4{fRIOQWSDIZH_ShMu!*UzJ&pCEL4aO zbqhDF&TG~yg?xhCZl0lgMXOhHu4XI+g`7YOnHGXQwx*nwvgnJ1AX*#;Ui$3Mlh>wZ zsLeOnliKG&NvYglB=p$vscP>IO_F)KFHV9!4QZ{YwYKsxAtobjs5U?wt!tDsah?I- z1oTrtckUFFp5%%Oqb(e1p}0Qj&r0ksezTZs!uj4F_5MJ1-rK>O_HtXF8A%VI|Efwb z%tZ$mOm6ueNDo%C9A5%2$gd#E+Sq+3h+BQfq~aG|o>t|=&&C9xtF7h5xvK2L?WASp zZb<=PD}70vv-1$$B4{`CiPbV6j;*_3u@a{Ce>FUs#z&lqWTwZt^~FGWekm)1G40y@ z@f~-^9~175Ka$)Xeshd=4rO}&`4mrdNjT;La4b;2I_woCJbs^{r11^dZ1ixg&%W1m zoPp~M_H3o;R_p-EM`VQb&?f*c6}8}@?%o6;xVqcH0dkc}JqX>>dQ%jEbC?^EO5YM8os_ZT*b=exxyf5ijB-7e;s zEVIoD(xwvdD@lU(PaKG^XP5qx+k%hFR*+=X4o|85*Vr>P%J%p23(L8h_;+xX`mIc` zU*8GatQ4Y+dxWIZ-vd{{Xg}KAWv1I#efYAGhdA7b2d%ilY&7-1 zV&mVwVxa~(;MeRYPDAqR`4l^&tOz16?8h@}O40C4=E`^|k=iOa)F1=Ui)y*>t|6Yk zHR(92fjGT^vmvR8N)avVpT1+SzKUGWRZEH8(%}5t=&L7YWN}Q*YwMnI&;{+nc)7%o z9u>F!6Od;5eY(5kNdd>Zi}7fc%oMT&SkYtWr++47q6^>}ZOV` zJt)aV%5ym4CeJ6OVa&u@3DBKVnG(S&k}?1}v*pLHiDmFTmS~0D9l#SKL6=s#*?q-4 zSMsG8enHD($*B!YM)K=!*Wl%*UaMj?$hHKIf2D^Do5i<*F~A!@Utz_#RYmhFprD1s znVMoGRdr1yeK<|et!k+k>ZRf4t!(CI?%d!^=y^Lo0IekDOG;Dx%9Vs!ugwz{s!E`| ze5@BrQ_m9a@$+L?@9^29MC(3%$DlAmCw+g9v!1uj-9aN4{0jS{x**8CsxAoblcrCe z(JN>!JOh3tA`f<6vobB}!9UVOQb$Uyf+u<{j<-A9h^HDh2w3fH`TiIgH1Hsk zT$z0J`ZzR(zHVW8k?M+K2G`%ZXQ=(iid$Pz2fm^;ZUpqO3h5%ebmzKrC=~i($|b&R ztm?O0r1k-bj>A&TBF@gMl`a`)wfG^lp%QLfj_{{H7r*ef)C#D^Y`Svk4%gNi|qQZ`2#P zM77cAj+e`1p0PBGxMJE@7`bK%>)SiN6>rcsu4wR}bc@~p;lE>`kS)s29sGR%HeURgn7Ui$nJG9@J(z{dQ-Jqr@hu4wBKt^Pm71s;i$hdYbw~4X1`w^hq zQn$y!qxhT&$NA%3hqWR3w%=aPbOAwX3{sf;nP9X{yM>phi4Bif30JSi+n2~o4%a+f z#Y)M&vZ8^&kCWU$h@Cf=xpFNIgq+7pIVU%$SJGnXW`#G?w;I8epQTIIk;iY5WK5gr zUV?Hjsa#CqDRbuuO+xq9o>^->2977Q>kqP98`?2AZG)7OfN?fbsb7y%<(81l7lS&* zl6@;aP~1ur5fG0C<5ZQTelvy^h<=HnALJ>p(`!9+>OA7ayp4{Hr=zYsbFGRtm#fIz z5V`E2FM)h%(mg9)`3#h?`4m(#pbV?kwEw>YE3$2B5&(8+h9huVJVE7lTvMEs`#Q(X zbQ(?$!slL4oHTQLNf5%?qCpe;TemEMv8E`%5&Dze!g{c;7-ICe^AF3|EnS})8&txl zoLEF~tM@K|1y*a#dzPh$pyUG?5^U#T6(#1QKKb9UC91e%AWnB7gVlRl2D_xbZmwZ4 zET=Z&=VJK8{t2MHql;D4_frc&3&V~v=ax8nhW$=VgUE^R!S_{0Uf1etZ8n&DxqUgg z@4`!vReW53h$|?9jSTjPG`^|=h&@Ja{hr}Kn^!DPIsR-%8lt%&xA>OB^yQ~_?Mah8 z9f?W(eK^>sHPL@`b4R9LQ&>N{V&|4Mym|WD<`vbj_$M$}Xls|fz}73z|CSI)_oG8+7z5s1)Z?fH*s#()4?V(n{e+3N3gBB z1>iB&)Y>o(w!@u6aX$P3+`@gl;0VfaTIHee6yq6smZlG+oajIwlS+>v$x{YU7fleT zmva)VWTX6Y_%H%0xjl3r5=<};N+|)8XqX| zvnyBx+3l(e;qKnJp%M{H~b#Z$Dp6cyKy`Y3MgK|Dm6A>!h_ zyf*gUM3+USQmny(-yFuH0~NDf5-&l^C3Ce@D9>d(t_}?6pDp@oEtPEFlN^$nOPCY! zO6v$ke=!*trP#rR2P4Bb_8OpK&utsgf@5iySq5Uog)AVs%J%YwN@;7r6MDmu%xbvKcW7=vLw%#Aab{>h^MXbJ^gL?V?AZ0?a9HdJ9|=^U5E zWQ$K`qPFldPEwn6_$QoX(3UKrf~zzaz6wL2zd`?tBQxt;?YMByFq@-D#W=FgPmvZ6 z<@$r5Um^eTTy>P4k<}L!-soNandgJpQ}+gpvCpfV`KS$GuZKSiX~5Na;Sh-B=xjK~ z1@R($$%O`V%6j_t&M%us$Z!xj{=MnOF>O*o;;3!TOYaGdV6OFClMe-OsFhA9C@8Kr zO%KNDJ?y#FRo7#mGr|j{@79o@z+UL2=ZKuMDz+ub4Jd8wJ1j}$B^FHHKMS>($87yp zBPJ6>0@TPguY(W4%{Bv!_P4|OHpEib&t+^bR^J9!GYkDYhSWbM45@$oHVvRgMQ!0R z7-g-LuAZ>fS9G!Zj*F=gm$4wRJjo#HhiIZ59*5aY>zUUy7PEe6w5{j8fEF_dldo&4 zH#+M}aQW^!TWD0RW8`5tPVIS~US`cq{)GLoEKaD{8xB}5#TU-EoQZec%(wLDpZS$q z&e&6QeSu+;h3+itNyG@fu`WqmFr(CS`>MY;>DDi;AzDmODgdfLt_13kbF8uP?Q}^*}OJ zZ)xCs=MEhiSE+FI;H?&Zc5m<_ucLS`)*R!W=)CP=H;Xjq!h;c88qw06Kc$Akk^pH;b_w~hAKj64#E z^A4#;7+JO<;o-)|DH#MrQP*eSNO@XeCj}XPb@i-s=Rs*b1LJpc+*e*njSLuxBAl_@T-ySBXb7TqIII-e zo+D+Jm9H~fWkrUaLs=w^=7Q8-9Nd-VUG;hYS)Ct=!st8(AnKM_9 zg3bitl>o;uds(} zl9<+>=1++!laLrT5WJ~a@|3A|E&>L?6JjI}(Ei4_`M~BL(@odj6!=l*$YH=3L|7f+ z&mP4K8N>fJk)h4QkD9GqOr z5Byh89{1y!R9n+%uR$H3n4oL}l}+U$M7sLM_=mS9^G#@e4+F8YJ`&*4Vsk ziJg_Y0X9rxH>hsn-7?rA!|S=qR#&!=H+CdL_jPlF{-g7k5=&w6s9AUoDFwveFdt(t`*N} zoEP7s6(xjfy;~NlI+|^IwV}$}F8eNj-^)Cy+E-e%`23S*=Q>GnN6=pkmyJf5@OULwJeRRrdeEAEloTvE$v*M4fU*8>~Hh6uA7ncAsl_x&CA?t>Prsy%qTG6U8Pz?79 zyAjb*DC=F0Kkr%aaP$lhR^LqW6WKw+)SCaq=lL`d_)NwTz8pY#h$+y-FGLU^M4N(~ zcx%ssPqh-`y&LP2FK2SFx-NgU zqLgmmI6#ZG6voA-x_T?|ynj~N9<8>h97VRj^!E&3ljdqof0a~>ipS&L5w>Whkx)DH zX*u$}Z%#Tk$^Is6PjNJh8GRj$dpolCLhHS6Q{>l)3nX63{&`eZQCruiHYc~c2jwq3 zLM4)GOz8(rMox}*^O7#2CUT9(K%0`yJj_TM&DB5RxOSC78Id17nDLHmKY8;hS&C2e zfpB}EYf7wyClmCFls?HkZCHMK?f0|mp!y0*llx4x^}}BZ-*dYUpBp=%&KRxSZ%4I4 zuyP&#FisCmcp>I`4-wz-2il@AU(u(>M_&LILq z;_M2eAxr3FT^^Zh2F?i?8RF{?;B)7dcY#J+IvhG*dXEi?V%DMB|&GQo8uphNm1o|q*-052=- zr77#>Kh_UwRqK1WKzsMWWm>{qwQ#aUbPV@JnI@T%y}yb9Nc# z@%Dpxpbla+VNIFl_MX{_iSCoG(6}kJUCL>lpU8@!BEN z%Ot;YL^@jtsz{Kh1rfX*Hn!@Y&>@&ms^_Z0ax_Nal2809W>PkiQ@aiQggRper=x~M ztrH*F93)e6QoPrL7(*>XsC=h{lbcr9lzFNhHyj+TdUe5}uKhYt{oTGaVyxw3t4S^^ zu!^*an$Iwg?>-BHXhohO=3Tu)!g*bj;o>CfMdwc&x&nDVZl4%Kh02uKq|$jVbCS)q z0ML2^)>?_y&sEy9#RiM{#rtfsJwGV1>%P@5#n9@m@);6YHoqhZ-S<{WUV==(Rm!lP zAxWv-Bdka=;RoYV+Kjt5vM;_3Dzfz>Yp$k88!wHE%!ERwF}$97+wkYr9{^+@XqL(~ zUVb`ANoH6zUI<%=%3}7)?yUz59N4z55VwUt((z>~uI~YR#LSw@lUvT1A+G8Xz&X>C z05F$$u_mZNg$m#a*Telo`mafjU9>tl9`kvI+A50fLQc2gfjMAOwCPTh^OhZ1u7!%F zKeR9pG2rt%*&*Vb=Gu?9&DLw0mfUKVB~7-Y40>+^B@}hdBnF2$Eknk#@knN@zo&NM zm8ZCHFQ5E9wJWh6LzF0gWfde1msQsAQHwJFQLa%F1fE11wya+le+^0Pz(A1R&)SilCV2O>}BMer`=9D4pywjBw#HM)RJM zA6%w_#&S?OgMgQOt9m!imfjuy4qTq2W41{}-4~K;BbRozXhGWv_;9$VK(NmcX?hif z(JG0;y4Xof^!j0ZzvLYs4p?-dm;rZ8*ytlMv62nSe}Pv8`yD#x)8uAP?AI@tG1(`X zJ%5F$z{Tk9oZbhRpHD=cN&rCO>wH+uiv9I+msaiDZqDX}$>`63Q}6sQRM0dH$!Nwq zm=29_=;5d=0i(URy`fQ@ZA*zK1)9(zr;9Xwo#r z|Nejd+kgFs|LuSOKmW_W{pWx9KmPB3|6l%X26yxw#s41@ivK@;pJtMy@{bt3B*i4S zNSGQDBbpxGyd~|n`dQ; z(|!ebBkWSVsG+;;<@LPD1PA~7vvG;NYzj`F+jt`i)HL;ZyGW)|4D z_LYiK3;m1t;w)SJSVfir-Q3Fr={mJ0G-fJMi<+kj)>Nz^vnLZ{-u(V|{)}Bc$)Me? zFhDhSOx7wg6Y>S)KLh#F9-=qaR2r{lXq|(h$}6vtESc&-yjzx=$0V#SutR`<_1ERh zN8%&@Fn*{hnkylqFd0woq6yPRaFY+t z*GMDIz)O48&C0@IPPn-9IO>>$>Zr4Z?c2_SHfVV*3jm5;4P1B|Cw7ri(U|cQHY@)cAn+euI3|=V>GSFHL zx7n4rcZphD@`yoF~YectyVa#dsGU31nwU)+Faq zmS~dRPGZZYsgM%rf-S>JGb@P4*RSB<5~vZdaFvljKGE^s;)lUY2CY4#g?SWRCq)pY z$Bq}afc|+c|4gN2d5K>yKbT_5+yzX_-G=A4S3rxV!4Iy1j_&jwL7-#Vfc)vB1m`v# zQis_0w6Tm*TA14V4am2WqW>x{`>i9RcDuLZnebX(Ty0cYW7^`ae~BrbG4v`m&_Z@e1Gq)m>1$`&6{E-p?zhV>uB$-O)9jm3Fli3bQA zg6;M3wpj6;L6TCNT(Swf;~Trh)1%y$@x7gcSsy8*(JE&FZv2Dh74U&om4bI6&YbIB zzVdP7PZmN96{iXbzN0eCJji&@ZM-I5WCtF1S@u{$VO|?kXOg>LH5jnG|bc02uABJFV>B=yJUjTWMYYFq`20T7k zf(>woA~6ILUS!e?Dgz7h z?5UK*Wc;O_Ko&M|9&WS#xSWzcCv}*<#Lg$gXK;s#b$xruTmMF4rLhScMFj#xoKk`H z6o^GTsI#yE{;Ac2Ap1fqK<0u-p<^IWS5C{hUL1K?rnMyvgQB^4BV~(Qj${ zWxK-v!!vAG+zHh_UR3b|DuOMy;qA_fY7BF})WmuCF&o0n6}EPTj3HR#?(1+O)>ffQ zNnDPx>|x45`Sx-)KG}{crKob`yJUlx709cqwLqkE=a>?#hMneZPe?dbI2EQ&jQhF* z4J#!~gY_JK&Mv5Yi+j`J85yIzwhp5|zBu*#8|uC9B?97^82CG}r#~iQPk$uEp7iw; zgHizzx^_v?*m_?hNtG10&*NPSUBb;QO68Sngdd<*F0eRl;!tt`+Yst)>%5Ygq{na#FVElg%~H0qv=vdnXCxM~JXzQ*IYs3#!aleICo z_N}>q&D}iUq)lAT$4A3cHwIu--anzQthPusT?l;BXIF&cE&Evs3`Z&Tiy_w{sEtt7 zb*HdKrTqYGL)<0#v0n@zs^j6AXk;kGAdS z*TbzlkK>}W);!=S6`x0knAJqx0`UW;P|Qz??>@_{8l_;He1b}B1c$ViZ<>o z-qgSTB`7j+Am07NuAand>1}&C4Z{oRgHJalPbNY_f8jr-%n3R=#q7t;?ws%+COR!? ztH$8nArr=_yiyX}`ON`Xx#eEmY4|6=yPciLuVN=u4-;#8uJ~?(hblpwz$z)|)leqy z1-UdyJ7yS-ai6s#qwImg>Wu`UOqhlnqiB;f4LQ1cM#sXHntZymdwHTccT`mH^FvK+ z0Nd}41Rz)E#th)`uLzSVWHWa~#yxv_8ks+3vK^jGEJAR%skbmGG(l{&a^uxx=M8xs z+wxbjo_T1~GbPwSs+?)?ar#b6d>Bi(xT$=w(w*m_(Y1be<`R#}N`G?0rX~6mhHKnt_1zuS7cfHeLgSP-!BS4!Y+ik23`KsAIbwkgMI; z@4z{?%{>X<&E}%qQ=BsrPnpbCeBoc6f=c8Xx8miFY=opV;(dm#iafF`VralC!`ZuX z#CTjL_;9kQrUoTNo>$L<+%9(`!=H1iudU2%t4b?;Ytx4Os$2W$Hkf8}2JrWKOXA9S zTLa#qGHzWgjkDHigfD8CAFkw?e;j8^;nr)k@Jh;w_2x7|x0@Fj$ML zM7#1KwwjYAytw-5+hAS8N4Q*{#y*aCW#XTt(l)1FUXXRrY&;^id11pQ7g}#aB`YW#vBy>} z$3{InOlSXF|0wDyU(tfZ57_sKJyN=<({Q_igmJAeb{sQRi4(!F7I^HFoQJX z{#8=X)&>C*!y*|}se0x|@7-7zb`WHX<=p_KF6aKY?0YbY(+To2bLA*Gc+Emm|Iexq3Lzp4h+PC594PZ}}HTUbEKGjPWio*O2 zbw(|ptcPi_e$VnCXNMSrE#u8e;?a>|10-FgRu1Y6DaR-EIR5~M{0cNYX=yz|J+ZlH zD4T7PD~Dfycho=Q6yV8*Nb09#Icf$NJes%%y-6op)Bq18&rs9!;A#%x$8tC7+(g|I zxfxdJ;#3yL%Xg1fO&CNeIq}!+BRlLR8!YGF9Vj2KvDe|h$Ud$1gX#;nn5oZ~_eoGQ z=^y>_<@ik|IKPZeN+>}$?&FJ`RRf0Qa2Gb-Gu2qDwoJaqEg3CYIm~nW&Bt4l*r*UI0|05;1ap&`!N1{?qL_GpZIYmNAy@Wf72QcuPiV0YtK;R>_&^NWB{DSU zSHbn3kH~NX?EwJ|LE)Ollfj0$@@zO2TiqB%l{?^RY6Hco41>afx`th?44rYcb23Er zK1@UZ4qSe+R~E0Lm9k0!Tz-5bzP_zSFa-k6VFLsP)g}5n?9u)zvrKU;d31$M5Nwlt z+hPo<#^lLV4NIoY%>E@?Y23*xh+;)!KB;(q1bY2lpFFejcogs_fA8^jCp_URfwF(OOpjv$!Y=Q&p6+M7hhpxSvC!EA^OrV}- z<8)Ew5EYP6y=4$N-tNtyGHhuv+3|WLF4y}skucsgIDqe>-U7^K2c)^yo-r(gJ(i%t z=lkfe!Oy9N6L&6Us{}9HEBJA^aiP?y-5Rs1P%Zh`cKJ<&^IIyOde2VA6g&gfD5(dh;2zZo|yH0Y&6wd6{ z=*%PRXpSPsvZf3kIRfPEel+4VZ>efG0LR5esDvN{Ilu`q2WIm3N=ou+8YPkJQgixw z#Y0KZ@qO8fnr70dis74bjCD{g5T>jqUKC$)tI;kVz;*^#6$$Hbjm8H?s1tW@lku|L z4#flH22m%y*a%j4NX&*(jY@ozb7hizr*TLCXeLxz+D;ahFXK`bMVl`N0wXM|V6cuV zfLJ#rX|nt_TChw4!!B4|vD)bdbR1*~=^2zT))>5G0Tw4gg*x}XFBUBz3t4N>QmhNY zL-MG+6zr8G&NJCZ<@RP0j;<)h;wlg?=2upfV7+ZA?z6?r=X2umly za|2T7OlD|a1n>v1?nF+IrRT7Jq!4*zI}G!qyHwonAmvV|uTJTYSfDYNxom1vwume{l-#ftc}xn-l-V{lEHSkF$%hMYjaSP1a8lLPG>@y{d+7T zpt6%6;?=8}Me<{J5O-eDGp06VzQ&OXv4N6l|64&%pj$u`jvU1Q4YPH;4&jH*9)3h zBb&}~s-sY6;Vbg8c}j3(CSd!3_(dPP9cOr1EGy0>=;*n8GyrBoC-`Yi*qR5l#J-kI zWPR{K4EW-j!Pt|ACCe12Ti-BUi%*eb#2_1~1^X6<1{#f=3JpwM z{WR*HN2`Zm_)*bRUnHch$J6N?XX69aR8X0eXj&fDQDPz*+_-;op5vF+DirTGd;baz7kIT>Ur==%1eZ2pU=)WgswIw4?4R9$UWCX)jY-))1|ByWlvB>T2YYf8d5?zLpY9dPYm={2FV(1OIbOYj7(prjDI(P&KtBNuumO`!4uZ?+ z%Cu@CzH4RLykupMah3jAUKnM;dYRYB?9 zF)0&%hVj$S+5I6qs3nLFE^u$XCH$z$SJb(Q%dheSKDbsbUU`upJow_4b&K#3)a5hG zMpZATG6wua;tKB}#l`!#QGrNn$X*_wA~fvpjB8m-=E-c*w+BVW>aF)DC%zF=C#u}- zpDX#WhLGk1j+Cp+0i1w{BX`5zkVJ-a_WST`*sW_zZl10fc0rc7IId0x@&C`B^Olf< z<%K?OuIL0I7_UC@OF%mHDbs+X9p%lBYqqg)28L%Pw#v%qD*u4pDLlG1@J9pr#z~`4 zHcx^Sth`n!Do!+-FkR~@wP#%;3Mt&f%Q0a#a1yB3=qgi+Z1kWOr5`H4^-kxv8Enn8 z0Mm)?pWG;m%ULdt=Ct^j>hiW+WHXg{{^I?hdZ@f{PwEI##c= zfS-?3*>J5HRCDf}*EsU*2FXGG|GY=T2IHi*O_upove}W$gHGytf)|+r;#aSNwW`6c zdP^|p?SaJ76P6Yk{0&HZMc3O5r>(eLU6r*q-aRqsY~n*!VAP=ph(KP-`1C*-&M+W| zr?{GQOt`*KXv@Y`Pv)jE7^7vER@o7zpQ{V-n7kMU`eQp69=Td(AJ)O2DmwZ$2Y z%K5MZA>JU>N26Ie_twot<(p^~$^yaCk>UZMf63E&KB6GKjIFP^AY-l!n@IS%I1|uW zRd+&^06llnNbR^_5CK9V{4Q3AK$}FMfer`_jufEMa?< zTOStq(JDNH?Jbvdn0$6P)a_yAaOQ*|psHy!#FqGW3i3t@lZ9 z_D90GB*fm7$>dJUmqBVRSUv(@O?fA}f3)?di;~+EQ!5rZYKRJ_HoZrNj-S)wYIKi` zyw!uLt15*cZ~l2Xe1<}_=7@6Rb5&zR`FfWea`H*^FjP<7WbUyYRc_>SrAN~|wc1he z^jE4;rl0I~O&VHSS(?~)t7btmZM?Uk`b4SVJ`)|^hWjIWEpIRNxS>{@K6g16Jt!45 z9l-<_rQMS9g(IK4w-{~i2JL=$e;qv30x=$lk)X1OC+dL@jXD4Xn2@Q9&Z~i;D>q4P zQ{9eUWa5Oq)#!2%B^q=5MJ(hofOKX4UeL^ddK`wFe5wHyF{xh1L^+tBP@ z2F)E()DxG<`A_i41O(Yzm*<~%LOKO8&V#54U<^cr4bwCwDE1MCsz9UHd3zq!4Tn2K z_uvDqspW2rv8L!jBR(im^3ZwR68Mu6c(F530~GETNINR5f@lL!=4pd~FM!0ZWdJlY zIyHTYnfF^&3A`}dUuUWOt*QQCC0gMK5 z?mSo?lMn+gy(x6u!+uD5V|n?PGcn3hdI$nzWz&X3lFEn0E4(AwCsNsDW&(?vQ*@LC z{_#hf8d5Tm4EUfSn@6&ka+Zv3HjhT0l`UB>D$-oEv%zrdyBn;toD7d$?H+EXwGo`v z42>;2sL>_b*v}?#j(5lP952*;H`$*vMflk8t@jjF zO2K;C5W4=Rz?_rpHYKhfb`xR>ExVZy-tIz6LQ&)6@D%FM5?F6c_IwXN^rSfZKu zB9rWO^JSx{n@JEIBNwG&zeCug2hLH`K)=7;Cvu)Ot4^3rB-nE&)04)dQTILv>V zrtb-Utc)A&@#d5KM@K6UNa30C|0hg<;rb*V<49{5%*iTu_i@?7he#{=OKQ)jhgfjs zwkO|`tAMmxs{_9L`0g~MA-E^A#HND~QZ2xo{|$H7@wc6a}-aS7H?fS7pozxqm+mM3na^*VCa z!y&X7^l?5#OVe0rJO9*E5>7KJsjF5|r8!-|ijW8kn`od~%!e7}*&8;=uOHQ#rX^$W zDC^lZk+%;V!B{{N?ul7BS`N3`(M{37s>ER^l8Xo_w(#>pRtQ3RJf{I*j_e*h8-{SJ zjv&8YBiMEZ4U>%fl%^>qmkx5Zaq5V&T9~J;wBtmE+l+brlorbci7GMWo`AM$*=#$x z#fb%(!ZH+KB&nPRt4lNY;G4~+TmspDH7HO;WV8T-uttp>|S!E46^ zY!qIi;GruSF}$_*hHq7nU#%K4e0D4crC_k8LNAc>VpY>LW~dUT--TJK4KaX@io@90 zmB%?)+NAjW(E$QO)1nUU-Mr?D3AqGL1+7r${!T zwF}hsS2t+`CR;cwvHmgjb|*7UIa9zLQB$9p>{5(O7b}4{`OUULkucvL!%G8e{chvGBf274EXP`hj5Z!o&@%~-Z{ z6e1Nrw@|e$rGxAZOIUmqVzhKexgDP@p)H}c65cJ(?6Cj*-46TDlO6V-6FaQT0I?uZ z<5J>$WKOl}3SR(CK(fChyO_8mBTOQ{4sI%6dh0FgMDK}7=N-YyWM%uyj~6b-o1?Ey zoHb!qa;So4_s7{0NMHNcw2m0+wUv)e{b9Kw>q3)4$3bpQt0cEGuvyGTZ|r9x7kQ4{ zQqb-M?ORK~tgXZ)dAWc=D$g<4?fCT2RdR8S%ndLJY&UQlwDb~V7W3oGxonFY zf$jKGzM}Rt=Yc1loe&fW$@cj2q1=p>tywrsgcA(CtW)Rnhd>Z5H~T71LG7(8-e*~2 zY9M%I22rPqDk0i%$K`L~%xBDC5`F3pt=`EKJXrN?HSdx)v*hwRUS7p_c2m}cQ4ze8 z^)$T`G$y;s1Ay+X#+&r**qiZboW~AAg1p1$`ykh|vMTlBowv+M$2Nj!(1iZ9Sm@VY zxGTeV_tVimn#8bcGQg#Ys&Ub0uzF(I4tET)bi*`uq)LGx6<6_aoeGsR`$UgXcL0d$g;H(oK z*1^iy-w7HU@$>5ZRpVg4s!6%2Wy82ig|1PggCa?8Ev%P5&p62h+E2lYm(YDqJesD1 zc+Rg9J`*IG297>o1Xn~iY-QKXnL91xprYVOb}{TA`YpqQ@<~^+XbU}j49`0ddVG_$(?2~)u0!-LeW zZN5S80LP<)q?r!$Phq~OJp+f~#t@Bz?s(532v|byh8dh_QyJq|RcML`K1X86?vwco zZOK6(wT~x%BWBaqjwc?P7D3^9`J*u&*dwjpNR-Cg?^Nm z8c_%&>pN-yYVSr7|H^c=cSZb)oMarPb)0CDbpaJ+jbim^1$Dx8si@Pp!TP%cY@3}+ z=n#=n9mS1p@n?+T;p`S@Nn1>3{mxubZH%lM!>UK=?D!4+LwcVT`9TT|)TaF$CY zZ51oXb+KE@W1emXm8Wq75yp6V71qlw!5M2bhw`7XwADJ%H3D+iv}B~u~cT%8Wk6Y(w{DZ~ z^qw#&7Ai9X;2Dh+%KReRp|zzwWh@JEpNZ?oI)jR);%W`>EhJ1e;*5(j_L?3q z-2_?9e)A-%OBrrog}awliQjK9;}Pc9<+NTo6^(-`cF2vCwD{wb9psEO%#~#w4|-mm zRJI!3A_~k3Fh@a_J)4`((tlxgXfM2(K(0Yw8pfENVB#=T7s3UV*mPNo37clE17%p) z?^P@5K~DP;pKHpO7TSx5tD%J`X?!f+W;PjUXj7{ya)?27SDY+~A#N4hbH5j5$~LD? zoA9w0WOO@GzBaG(R%)`1HXc2P>7wxPr9fMr z&TYe{IDI#HN+$HhCU66#Z|zfAoGVELqBE}7ar#=RY!cmj-pz0h1LkYJ=u!rgdqdh( zzplIlohW@nu^1TvH%@hymnEWzpHAOBaKY6a@wOEmIiYDrS7j~fjru(2INy=&3z;^# z?(qsYOd$K4sw=DXHN;~QV#PD#krfyX9JXsCnUq`HrsrkDFl#;(>9pEWiT0Xc{JuLA z&yhK6+->R+LKN%pK>5fM2o%Kiie9}DP4QoSO1(`dp7lw z?}+^Ls;Ec;c;)2K=(>3|TikqHB9xwOy=OI2?3R@f2d zl+4W%Rc>^+tggx~i20?65VJuTW44_z9HqIh7hC`3YLtRN!IpXf#b-H!p)BL zzJW#H3Xbl}3Ldj#A_JreR@vAB3J;kL*%D+IlX&I-8{3wyv8gCD0>vlYs(Kxb zLlaO#oxl5sdH_i{k|00}k^sGT0O$!H@rLqU9D^37pj^3f?{k1EUh*k|apM*V9J5XC zG%MGd_EAz|#5nmlmLH`#+4G3-sW#{{ZX<^wsGr5HYqZ0iPFT%O9ah2X7!Y1#pKNXM zpKK#XgIK@IYP%*QfD24rUxVB7GB$O88EtV-+30R%+@0gW`s=^Ga$Ei@aa;Z?<+k`V zzrPR9bN>E6NCWD(e%HU6X`G*Z16UU(zO_l`o9j27d?0qw@NBt0!W219Ix90(3q4v? z>FLGi1U%wbWyjDf@wcNiwL(HF;{;C1ol5X<8NTNH&IT~3umHj|N>=)!hR4}6>mr7K zSPQF%3BAJHnsxbl82g7a{~PC{8}K`w9k8^%b}ssFCBM|zMh}7W=s4?%T)BAXrr`VY z>zZz|>3q&NQ?(XRYs(v&gSs{dNybbo5W#grd=EW;Z}PGW!r~4rk_s}xC6T>TEXv<; zxF`&Yhh{3-;5wHY5G@64-_dT$5{=^~-e9hsSdlC>`1s5<2ba4D9k%4e+4cJkqyR0OS zM@xPU{jCHEW*7;Ych5$JKtzg)46ttyZ9F6nr zf@Cj{bL9F&derqcp zE&|XZ3qcI<^R`myh$p&2I5e7Pig_^$@;?TF)=-v}Mf#~YoHa*6RQcad_8Y$+6{r{_ z%MEQaax%E>{M~e=`}&MHT6NQyK;E@UT}fQO*<0b6fPc?LQsXg6M~Y=Ab;72SomSQ{ z`C60p#2GjV3&-MNagBsd+T44T>IeYaPq)Zat19a;(_!05vs~flZ5V+KR~CbIZi2^~&o%`GklLn~PZQT2qFc=%iVp2Bi_@=0YvC!P(Eu*+xq*#+u?Z=CatyeFzp>58XULoyJCFj4e3MI%j|(zmNnxn zkoHQZuK=?&x!aYv@o(iVLt_!YH7G}erqW>GWK6IF}r&S^<8(7lRj(VYfzF*@G+hvbBBfZ`w~p+N|0r=brPC5U;4rG>Vd=J2~#A zsRAWJvCLw;x1La2``|!>8(_Q^pXn%uzez)a&#!stI(=}wW0ac3$zCzOvOqi--pX&n z+ST8)dS)cFG8;R%lsRHXlE0C)VPRPdf{gyD0JBtN6s{oukCbi(m3sA7EC^dxj=1G( zRmoA~zXEFAxbg(l)9dBj;rx}-%wLJp%wK7x8S%*!aSOr&`cHEg{)&(HuY`~HuQVTT zx`s*<>?2J-83>v>C$dDs?X&RV!ckFcXV*fHDt1WGY+Z*d)$l+g(|jY8Q@nX24~s$B z1$f`l@IW33(X^&j*-14v1=Brz#`T$-Gag--564;-N7EBP?Qxz)4rS2L^K-)Ff*jBKnqb%Qp(^!P<1A99CuaJ)bqry0cZ z3rVozMQA|>BN*$cqxed?V@Iz%a&V{+FiHmd?LEe%YG)tDA3ISO+y|4rb3{9xmESkB z1{JA}O|b$BCuNrAySCN&*tjy=-8WKQa}JT&djXd2U1v`sgPoSgWqR_SgzSloTFj#i z@;s+?zJOv!QKMEV#RV@b(m zj9%3y?J9Be#khY7QNpc}YzB!qDJA*!omGcz?$w#3Lra`SEO0gl$HoM?UqA%5{$1s4 zrj3K^Y|ty&cZWr$2>lo*@WELI7oK(L5Sa~ISb3TbL;g;I02IFa2em)tR#^q}8!@cv zax$hj@cZ1Y+3BmaG3;SU>P=dkF@_zAVbeEJKrxEor~@2neXT~M2`dBGX>uB0?r{c5 z)*G(pgR4=ntcp2W?oWDfUCXb0Mpl`!!QP^;3$6jaV*P(wLuWt*Ium`1In(-8i_Kq2 zi_Kp@eyfWHt36pwk?J&u>r1l4#1S+IBx$l-OGr}R>n050FeAz;==}f~&%!fYt{O_> zV%F5zYJmP;VHxu?Ip~G!1(0s^)}!GdY}LaOmP0(ahstP5@fUH+U5julk0gW1x&t!~ z=wy3sR7%bhg)raz;DraUzFuCblB*0IXbqL{ABN>D$3MZJcp1ud?3{Lue`suzAV<@l zXkECxlgion&HMnir@)_G*R(|e zRL@>vQpS3+R|WD`%QNO%sdD?&vDc6a+w*_nn)IoUs(x6}xqDQF1$f-H;6q~+SE4FX zX3yvxToMWeFU62J>S;wRtFKBj6;|7mT87C02$8`(s>-As&^%@u4f_ADiS{bXG6#aOJQj#bt*hs$49y|A z_;WAJQ}|s%Y#RAQ%~dHJLV{Tei}SFiv5 z?w1P_NBGj+u8Ik-hWj=A$m$&J*lxM#OfvhZ%#`=Vt;T2eHlyv_*ol&dlo%M4eFB&* zY%KJ7qCO8~wIFVwY&E48yB~DNUiq944+MiL!QWq2&Mu?}nX(q6Yaj)89)bs1ZDwk> zyAILnYI-)(^fAHv6B7~f(qnYlQyM)V$Klv9U--BqURTnC=xKzN+TO?-M+E}i03jC7 zMxviqPXY+tB&_KhzBIvG^6@m{){iLyMS?p0Cn%vofJ`!-b8C1ZkwRx_WZ#>tAuN>y@B;$%d7wYtQ*zB!q-8Y|u=aZrBukA%@w*sO$zJ2HNs%V<^{7Q?fyiJ(Fzjb@YK6b3%-7gda3MexbJHcc*+*H@`%fB;5;R#cw>c);^~Lv zh>StVp(yO$MO=7E?mqkBAonOci85uf1>s15n;0Y<441~8QsjtvWE)NH`)C=wI1JvK zaq%9-b#WX1VTieH5lpr#j8VuYFC&%akMILzOeW&5{PRWQOqFWE90`DYh%UQ0gun2y z6K$_XS3Mj9x(G2jx(>N2V0K$ZEAG>mSasHZoT$%RHNqIsmF3fU4W|3!sMOdzivIVj zT{ONr7I1D2OV+2Y0{c^C*K9q;C+~QdrK7lg>RW|vB|6D-#A0HO4=$tb^IRD4RpZoO zN#oRCzvj@9TYA`u5m_ySYpb^OQ)({w%+Uo1+$*wM){uV|4?-I$Wh&+#zmjID zztYW8bd1obTd7K1Pdx}rs~4W(bhP)w#;pWtu|$2dk6_<*kBKj?jN}7hqZYlKMw^#t z0MhE2$8;v!K?^3xri0Mv3cwVNNXLUU>nthWv+^UJkhP>k}Pqt!Co`@ z8h4P-??jhbu0&ukig`+7d3$W|UkzGFx1bFM4?w<%H?mrT@Vb5`E^kZN~Xm!nxDG;XZ^%?!j#~k>7@LsGSSUX-& zlIib~o=eWrNqw6g3o?eX;ou}|Qx&Ym(W5C_Wot5vbZG4s;)ROOvzv=sy>Y*SNqKHF z*p{;nZHRkKiLvF$fr;N8NkAyi9{?t%fRMyaXs^9XIe#YUf(~4Xl*?073+&1{idR>< z2yx2biq<~>irFayt2?G?E(cH|YouK&`g^U2;$v!FS3T(2f1U9IU2IaUMas9rzhZJ; z<)pZp?7l%U52OlVgF3+srfa?Tx;`9*Ikc2$a42Mw;8ni!BLktMKyTk z!m7a^2u)}NczuTUNF9q?B#hDo>+$ZE`+{uuZn;ueo~*B zA$icrd9EC*E?ScAGej#jJJazXOh{^bGw*AWs7u6}Vsj(oZ{_nM7VA55P^|djdr%)J zP~gcp)wSgwF|^}{q7gv_SN1KvufnQvHy_mgJF_dH}oMbXgl%BB3k zBsCO9dyw%LCwA2LriaS*tK1*CKW56Ov+U$kPkiJ#c2lDANG-EV~KkG|yPs^t`P)C)xNRuIEmOzMQe+|xG;-z)R^q6J& z3S%wC*|lJO6|eqTW>wxbx(& zsaiqUu*uAlfx_{afrWCtNr0ND{o)@e`H0{%PhUd{$a~tLUZp? z@sUZ@sdiAM6Rfa#>>*gL&!DqD3L4yIBp6Z)U{sATe$_)27udIE3k^iAc;&H~x^y9% z)P97mg|d_aHn7XKfHW&V%ie(>n7f$VUPBYuwQg9Cm%FC*UlzJSr7Yt%b>(-QW?R>g z1l(CCBva;*pe8#5JGt;cV*YP2JX2!_eb5~v!u<|QGiTO{l&Wl$mQDJPb&?!yCK}b3 zDss%43EFV6&{0L4XWAd}-eWmDGmB^=d$mOUV5=YgAqD@8BJ*@6*jtLTGmU=JQ5uEt~j`D{HE89 z9@eAMO+Z_@QqpezKZ%)d}VF~}CgYsAMkR^!(LqoHw4c=+OLHhe}t*%ts1gA9%( z&^M?&Gb4Ht_B+KdSCo=UE;u+QZ9WP!y}h}|mK`Ch$nLxO;OG?eEA>%Q<3I?Uy~`DnarL z28L(bjLqa_O}Qxltcs7#@Ff`mr{%Yk>eoaq5Z!#kLn^?zXg8yIIz%{(F5-9et3zA! z+q?=MIO3^pJv1d=c?9+MH6{0sKKJRrxkpj$l6O)xh*wkw^5%TWE-&_VUi&bkbtx7pxb$jVVx43}`?#mA?UOvST+_y!9vtf_kE z7bMTXY1|u_3ZXt{8V~Cru1c>EG}_L(C3m{j>>YoY zR^nik!c}9b@ax8zi#(N3ycAoyhKc|VTc#M~B~~wm?REP~OM~-X4X4TCz^jvmC5WEI z)dBK6VnW-B7E#2bOs8yQLwEOTM4*J*t40}@dj%s|YfE7)SLi?~XM>E@+QbPV@uusz zDie?tE^klv%8ARwH(lOjSBG9?F{qZuquqF~!d5UymaA@2@!NH}!6~4}?pW6H_aX&Mgm@aNYaA_=G!Jo) z41}{UIDKB5LFL+ksFWdb8*Lqqh;9yRXK=5g1d30d0@~L{rVe`V+FeYYDLlOdMO&ph z9@fb!J2^Xwp0sz3I0OntiGlBL1MGn?3u-(muU|>Qz`0(-$A-nAuZymTCdM$MD{-e| zkYq-%d1%owLu-1wS7mmDB5_#kh1t{KysUcCb)TANhpGWOmCxQBb5ztJASRKG7-4Or zy^l}M(m{r$KRVA~Ky=inc!f@t9lVqi)pdG+x|c));^0>lm{)B72XG}_>BQ;LyL7D~ z|B#Hb6s^xBDCY@NJ@KG7DQFW`r98QLo)M7KZ-L)>_^zbqvYvM4jOSNvT}g1{NcYq^^14fm#hBvM z(DEUjUHfiSH3y;s>aD2o@{(@>w_`iomt)&=CSt!^l~ISYXzaKWat3Rw+A{FO@iwPO z!Z(S*&+d#WQ?UVdcJ4I++i-pA3Q=11DxKy*vA?`gWUF-4eU=B9x+ZCFaL|520nEw? z8#-(lmBc3=y<0W-0}ghuvlN$FW~G-TZc^6SqYDBn;ftzqGs@@Ic60|$bLL?gj-__; zz9Vc^F|Wdz7;3Q#K~8%xn>W!iw47w>O>n;XCdPT(+fDi_6{8ZrfCxe#si9;M=VAHO zMU-~91nsPudc7vI3KFD%UzhCBOj3^yfDA6m)9!Q3zu&WI#@u0;#7ua=_-80vw)G>` zuENaUTz-~(b;fAsF27|5=iN9m1Zo_l`SJ4%t}eenyGm?`D>gH}WveZHHA zQ(`tGE&gx^b9+D0c_P0FGXly94rIDl_e>*o2_8mv?+-TtA%yZAX};NTbwSk_h&h0Y zq*PH+*{7eJ4NjKTOYlw|eAV|O0`Sr7qMv`TO~yp1Iq|4HsHEE&eX7-WbkJeI9)&u& zX->MFfeKm@1+v_UAMeOVfFoGq^?prhPAzl8fk1sNr5 zbyl@)|I@FttS0YES{F6jpUgN@;bf4&24nuteMt>*T{{MhaYA>XtpvEyo=9CB=)uUq z`)+jMed+*5-B$2;7%pFk{}P|9a>(Juz6|5V6Lf)g9;t4S7TW`G%BOJ?UF*4*@I40d zDSkG5f0Xx_WNTr5=qoKUg`ARq;B#@<;3UOJsxn?)m2}l#Rvo7`kQuNEJn_@%P|0E5 zuPGT}-v}nLq8@|hX>d`Cd@C&*$SW4vCq_aEHRfbz*uH5iN0SiAFf3MBWW-zQYT-ZU z8gCd3O+8bIIICJKRNl}XNJ=kWn0;MQ)3e+P`8)?N%dv<8?FGT9KIBS^FmyB{yQPznYSj{Hh#4D zXmCUEIb1ugkq`CO5>^eC{56H(3mDXjVK;%b4E!mOkontv3i^%VACH zO#dTkrvH&{rf2;@79p;E)}9?QuCQcLtT~MkTI`g99 zcInk3$EIo7GRE|JM|MKvM9tdAXfiC~bcSO*93?f^U5j+%#Z|du&|f4fjCRDq6MhT( zFfn59>Ad=D|Lv4nv3M`9qti0UFVpXecT!S+9MV^9)il}>8^Bgin|}8J&8n{Y%=!2ItGQdO$y@>{0_5!>wLW=;0X1wIQdX z-HaN?x7dyt?l+YaLz{exb#;>SzDqr5SAPF4nd0#k_b{@0DY9i|2#BT^g~$|9thrl( zPv)=LtjY2~IGMZhXE3e+3&94(U82GipIi>Ec7sPa+;KZ=`P%i<-=nASsT5`ov^Sob)GhK}zpg*KBKxg6!Dl#Fc1r3cVMN^7!Kl8)V^W+&?Ee*4O5~ znT{dL*FQJWR(8?YIFXVsFAX6W?fP>Z^k(K?j-e240HEa>m# zWa^N1=iGF1%~C4@B4?Ue1;+NgA1^Q1eEr7Nz?p&KlLK1f4sc2C`8O_rhi zd_1V2%L@!MdB}*7JgN=TN1i|AUhv*Pk;#Cv@#Ww$L1y+OhvmC8vyVSD+1vF0>&89yHi87JAA z=z6ItFsqmc>!WjA(KD&ka{qLJ(tj)OlL=N8_kVxUDAgKB0^KwtA7I-@&oTg}Ypa7w zmAr3aqGll67lkl$YdjrV+Mjdn=~WrnsIO`#+U~-}E1xT+ARTZsg_m@AZWug_89b&W z^>&zz?pi!n0XdXard%^9rMI(kwRmeizRGiBc#k$|O2|EGrJ*O@7S&!o$GT^*1pZM; zaQusCQWvlX3@1W^aq8UibI@ zgwVC<^sGd2zjh+MPS_gikJzjDY z0Lxu6yUxg29&z$<65X$dYb79swKZ2mMWh8-IY}$IOpysIsuHrrE$lS($yz*p(IDbs zWrI-yKcf!B1ND>B9D<(X&HGJ0aGUH`fL2_DP%zdXcJ!hjWx1@fnh%-PCwhA7un7iJ z-?~xlCW)!;d=6E6kp^jICIFg-+Q+JaGXV3K=oLiD*>!+HVqWVMmVp*Sp$xxibdR5A zJ>Q;!$3s+;B+OIgF141q;7oBhx_r?%_yT1!phZ4*!Ub7^-_41!#N^{~jB4!^X?U3| zl0dj6l`dPz(;}@j%Go&N-z7Q(iDz?=FjxLlK^}Ztj{Mm#G`@{5_TwnhHzQ^RqrR~U z{cqO-$GRO9<9cWQTmJ32LBtSET}RRHXXkvclde9j?yD?XoT{tVLL{y>Eu4TD*ca zz+ya;gAu;4cn{4*TC?vs5SD~B7$Q?I673AJ&^|81?Oa06@n=WH0~!)7Jnh}J<{ppP zs1JkdH>5gOO3|P;?qwvdj;_|dfFSy8+Lhp{`rVAWKCFp=qke5IqL>_+_PM+0Oj5KL z#p354Eka1nh6?~+@vQ?f>igye@;qU=-+jemC{5=3s@lKb!(vf>up{(JdH~=z%J^l% zfT&rC#oz0OxvKp$??KDDK?EvIo)g4yKp?kkZ$!)o#riz zvs=MckE~{NRXOo~{D>^0Q2Dpag~l8(-K*U+r-z;HDHuA!(ERHh{ml1r1h0&AKZi2Y zWF`ROa?^T`k1nROux2^$;5R*G(H(hd(KR<+(L1j{%-T)W;A3mD4KSZY! z8_gqYK7Z(ePMQ+*r5(fG$j&cyb#K%|^)*}##KF0)|` zQwtq7J^C;pbOOTZXTc^B>-*gMX4Ma7_2q;F?o&rX8y=jbuNj{p!ey?&f0%B!qSKQd zWwo6qQf2Zj%V)q6uK}!7tbtI!-N&EmACm=zsaG!f8FXq_*C!uGydB>$emNw8>$tx+ z?!Tm;iU5C_%9%}|W)p7RrCz_)7pK@i_PF1I={wD%Ff-T)au+k-)m5lz`k5gOA1;GE zRN=k!xqJX4v-XGxV|!1IJ~p5PgPW+g8?E)Cjm7A;CQ*V$og?L#n7@&~a`1i`ROA@! zN;Ira#X#utr_@Y2fyk_$~ zSUC^YuX$^B+Nx%PLY8EvlhO@^1H*5$bfQ82x)U(>7RoYdOpS|R#R4@l)3a5fv<3^wR_#*RwU?vZJlVfEc$}Y1j=|P5da(%4;e!LYa zVQh`!?(6d1V0Fiz!I*_+I~WYAw|`s@4%EFWwjcU^*7MuMqE7}Jy;QAuA7 z{DVu@CKJCswB-+eaUnvx$985PFvSeT^w88O86rEcYcc?6V;W&XTrlJ?@xG&$oT4PQds6f z3W|kvj5qbnI5LTzntHJLiQfP?GqOX-$*^&bcmO|;liQlYNwks0GibAwj(D6wL)MXo zTE;M{$DK#x{`^c>9S`XBVmvv+H~SV$Gq3q%9?JRcxC3tDzg35rfuk*# zrj~D%dD8L+`pLxYCagq9T>>;zEM(`LT!;Y$?eEFRbwI6z_b0w903Tb=169_3{9_Ns zc(8_zJxi6AY@6M+Xm4PW4V$-KO~9dkOF{J`=x-BIn0#w%h{rg5V~Q-=+Et5_0YUav zE9{++*)lvYN2ME0rWK%5T}MV6TX$G99OeBfYij=~Q;~r@oH&w`=cXI&s|n;QvaxZ5 zN^?{PD#DEdFKfjJYAYJ9Xg6V66rOBfpd-)=;xi@dz%qwk4?a&CoW9ZDsz0Y59f*{f z^fB|2`WRCK{vmOTz5Ss1LP^k|IRt0XU}U%RhoiF7&^}0@62BjapGNuz4ZuM804Mu( z#h-xUc9S?@tV&IQc)p*2%>JSP#_UneraFU0^0@RAs16poHkym%g~2#%to{Z>gyE8_ z1>KJ%WmtdVZ*Zw@D>ws{g;?YGRB1bu(#OEtAGeg00rlW!F}TW$b0yRLcVZK zuWfnL@keLUMfQiSl(JyOa}Ph}*bjev#eVoBVL$wlW(#=E#X_&46c#NbFae}L3aJH>Lr2^ z(~(tV8B#!i7MEWDoRlj(TzZh&7j?qjEvTl;d~%5Nu_w3Zq&@hIk#J+x`*3VUfJKEj z@Icfvs(`JU90>4TUS1JLYR4u6)A(v37`>8&hmdOfj8?JGtk143w8|8{8#+y6_0%6i zOG>L8cB}lnd|3QK`JvuL< zN=q06ld*LN5i+G-z#}Qm7K0q?MD@z@X@)1|z(eC1VH$3^$?wOb1Dw*;ysR~K$S^ze zes;IcnIez8o~Kt5r$HSN`(IA-b?8y5Sz-Ov_gSR}oG`caS4azPyT_VnN-7|qs>sTA z$*qXRiI?|S@Pj{hae<`>0yty5VL2Hu^?a&Hi<19SI-yFR2tE$$#Cq##0usDO4?~JH z)ht8_RdaKN#7_M7kQzmt1~Ta;z_(_pRQA99>GM7&F`t|9xl#u4QZpnB(D!^MxtF<* zjwLlZyjKC(=LxdSbq)6PManO-N!>GljdH<3n5N>8wby-MZZx>;$PW;%S5^55YZ6Fr z1~>c6N+56&hetaq_yN4#T`9QSApV1!novhc-q`3-2Al+DR*fn)?ItZe%aHsm?6qg_Zp?(fEL%N*Fr<&KPx4R7aC^HUE-b^_rQ zyP&Ch>%BZ0PN$$~VPqn^wnw5`|FXfBHiXNBKIGI@L;oatw^laf?dA@}uUJ`sB&@7I z(yXko&f+7F^1)ymcK2mPe&EWfykAh+i$}-|I13K;w0w@{d+rIoB82*p5JLS(6GB-n zh4lq?>WF7s%?CRNgdf2YvX^^Q_hY4GwXoqS#S3tzYTxNUJhVp_4{G7=!sK>cY|7k= zd_^erBO#Rf@vj+#UC~U<#$KXLd6mUo;ZZAoO`8twy?Q&8mQl7;)Me=B`zhA$izhxQ z7vb!a{`{&9@n_P8_;aQWk#gtV6($WP`$KIsE)$xFd;YeESRVQ3v;4Q330_$9TV@D6 z`@Dj;>1C7b)DxT%U(eKt1_4T~;UpI@*=Nn*_{8``ltjiHh}Udw zy~$A5ipKq6X{gm=aof97$7d~%Etj2fLEJ$Vx6c4m2I3J_cG<%T_uuZ&dyJmB0nZ>2 zzoJFrt<9kK#()|Y*53V`Kqnj+VBYCct9;x)4v%C8mKjpupBoRnyW09yBYPa}hVQ-b zP#Zxin#S8cQ&3x5hZ>)^KFHBwGFEz$v6w>!SSt;B#R9QJQeF}^FO!;}>wr1Au{lVwK6`Z=bV1jV|^C*lH=+o1Ql0Y%LEI(7%rtI2> zGUiR`tsO2kwM;D=VPt;o%A~g*T)a#&R(=_)iaCE7Y(Aj8^S&+y*`?PMMx$#zENyzM zyIH=2N?g}yOFuB}8>N)jjb+=r7kHvOfS~f_D1JGkBVa|36b+6q`FL#CcZy`DOysk~ z9v8Nu|F5MdU$KL`ovNIfn{&PoTX=th0nyV{>&z9e^97zh2P{t9pHE6q|E-H3Q2)(TLsJa)vl>YdAG z!C}yR0IaJB`Vh#jpLao(w<3PV3whCzP%NLIl=k?{e@2xIU>-+{#N|Y*Ye91tmC%P; zc=#3`U`6n<9NYfekup?vC1b99^^<2|sc6Wj=Q9*lt_S!>yu z^&&pBgl!EKw@cj-p1Nv%K(n({PDsQqI+OYmXgXK$gBA4gf*g$a<&;_7#&!|w4akKy z6v7go--z=XXKyE`ny4)APinoO-;JAX4oKWIl`8!w$f3iHbC6zCp5~6^uUhnfCN26u z(=GalsuUzQ`8a~)Smr9oY@mI`{T`3`a7m7NHC&rGyCm*gTcz27jAA1LICY^Ll~ARR z*K6ZJ!={vaF-mb4^(x`39I8)tq{z}9oFey7dXgVZogy^k977VPv=Y7pbTjTR2WMFb zp*|tW5o|um^YFp&JX+b}miC1%%H{#YI zp5%J)o!H7C9bP8$qGO!bg)S03jH>eYV_Pg%e$T)X zYZ4ylLUMfQ<_=^Sv%mPOslTl}+8Y+BjX!quNgQ@Sb}-A3=Z{dw$dyn@bq|cx@h~$N zwW$)q8-VOG+SOI(t#-v)M7;x(<|L&8UIz(wyV{cR>uTyIrNyjw2|(MVFESk2($W*f z_;{W7=YwmTdcC{RfuyX+m@1j~r}1cQra~rxvyA^{dE9L}f8h7?39qRBh;Mqa(n#}7 zj9Q2;7flY!V>T6fqFHg@>|nLU{E=bZM~mv?Rwt*&@?$6aa5UMkpgCu6NpoPU7FzAU zJI$*`u=UPt&3Dei(CLPx$$KpU1H{%fV)0ftKB@7S3CW(pcEP*7(@LYCK#a+JQ~ET~ z5?sP^=uL*Y^!UKzA!%R7gEI121Mt!X%hyrq=5N!Cc>u|WbGs5Qmp@O2{|KqVX=7nA z(E3|QcnezxrqQ@k4f?Hcxf5Uc{(0+@NxJ3qk+IX;SvqZwirQLMm^h*}@Co2Kmn%uf z`5uhaIN{LFh`*@&eIy~*BU1Utub#fd?9V4f!CA`q6gF$$w+v92#MsIH^kzwIDt$KB zjuAEWE-2%ablbX8zRH{5T2He4Ke_u{#lhsS_5I+exgnuQD07e&o_Qxz_MC2L8(ob6 z6bo4}BuRhYz`mcv8x`dtSgwo7vsQqwHpG8x!Pb=0Qb`=*b#ZX6NVu1U9AZn`LM4FR z0trTVRK@#^nv)AzI%P(b1kK9Wo3Ts&+U3`cwkY?2#=Qsh5i#tt_Y*5$x(}Dv@pIgV zV2%7!epD6s%NC!c=B)XMsqcsQhe1#e4RZoM+v`7IOjBS7o=He{FTF($T?jwpq^bGY znapN9T4#%BdQGuw+;{z^Z(&%-g{5>s)a!@fzQ?D3rgyp8%uVfd|KS4b38#3@X4*C;+rD|`h5)2p9087ZzTac0JNKz zNv=1A)b)@vU)Jz9Bym1;vg!kqCQ+eb36`S0-lTRNt~BE2h`f=Q>GWE^YR`{7v+^1U zi*un7T0O|WD|_0i3>$wFuC52At*I9}a`c<=Vk0h}aZo{Z{0ZGN)Fn>=dKS}n0pBqg zHc5HRZf;XGxM~OM{WRwDA2NSTdhCbKgP>oFGjB});e8#q6*De+)@6KY$nXf1TYtGy z3s@(B%CWB?{l^FLoiXz%MX?~QUii3Re68BX%(5ZgO;ulgnaC8&ebcQDvR8(scqY4> zFhB1^Py7Ag+oQzG3dkNUso|bS}l()m1m% z9LSF~c>qWMpr3R#maw%FG_&bHA)niO^VgJDlbGXgr*Y$n9RIk0wEkepK3z$~p~}hA zJ4-w?^(KR>&A7OM9+CAUY7BT>yZkArZX@reRl*q@lOi3Nq0t=1wVbYi-d2vI<+rFS z=1VEn4zr{#Qcn!LS-`{WH9_=`0$kf`@|e=SM^=v($Zdso1_kfw&3z8I?F{W11Ua_xKC&vYu!~)3x$W9~z!j13qI`n3+lzG>pt(W$iqGO_ z!e{X_&1V5idzynF=V5K`l3z9Q|4bVBf2JGxsg)2k&OmTl-*A}FH9OLe09rt$zxymp z`Sv|}*YJMb2V_5|chB!b$w7?P>f%(hE)(61DBUL83+rh4F{q<(PGxKSRc7mKPu-oO zvGAN+N9UR#gS2zbQ?mHP8Kg|*K&X#26(X+09-xr2iAenRxDec669X}m$vL+oA0iQb z!1QcTSwM|RzRmzE1(-0CCs#P{!)!IK(*u%zeUqlr?3L_dEW!Q)PMC8jZ6j(_aVy-e zxQ~`y9^%0>J>_V+B5P6j zaBAC$pfdfs*6bXtL2H-(A=Ul>AYkmx%&^S%G{L^3f!VA z@%?4ouafr8laq4A$!M7YW>1WnJY5@LJ9u39y=eetH*{|9k;p*CQ@4COILHtjntl|& zr;yEJODrqS%CKTd7J8tv3;J6~m~LLeP;@0oUkyr5k*id;uU~!4$@w!ua{l}= zXZw#@XwW&DheUjZgZY`@V1E9brAH!pE|}hGS8luSvvk7Kp1pl^AZ-G5nIsa1Y}@dv zZ5pD`0I-Y0T2l&Tq+-ngIKNq95Ax=8w&Jr~xYY?u8bw$fm=7Or!}=3?f%jxPsOSYd zRWhY;!4_Fvxw_NUn^c zTn`Z!CmwIhRXw0hqgjzb4*pwG`#9ylNzbsk`VK5xXS2me6EN zvB*rdD^Y(ZT-&hRmHs|{TV}Hgp9B&9+p_O{$CW!PBt;9#$0nrw@jy7O`kp!KK61mT zVpCg4exKh=Iys~OvzruZH(aYGBeW}_plQ&OhsA<9^m2jDa`;r5)U;LD%Zxd#0!+be zEiArkeOQ$%bET*|0=v_`lHEM?#0v(C&6B}FgVVj>EE}xt8{Ms#vE21!@!AAaOQ&e# z5%by3PPVdGClZ=&o%$5IA&$uzw3UT!vwY>gZ(xWI<)2*2MiQ~FT*gbtTm+AqF*|~q zrLRk4fVvock2%G9Foqvh`3cHxgJyfU04bbTOJe4NZbjxaC~6O6{UaXcfaxt((^Cu_ zhD@}p9LPZ=909NBX^iw^fy6+|$Hegyh4N*jr>Vc9F=-H2VR*R|Y{(+- zWbpn}`yY42HRuv^=Ucn!DNvNz(qhg6!AGde!&c(z1>(1-5=`2`DFlf&ft3UDumUDc zw0FIng8pV96Sv-#rqkph@c;EgaD1uHYA10=6*@*IvKY}}m*1oOM|5@_94x~V#ruUv zRcO2G%Q1AajG zbu6F;WK^*(6p}9nlf7Hg`=o0&hE8c$;_N=vNPJb0Kr;VMnrGHPduaq3<_$cLQNg7X z`-H=3p_+}4*kH%EpmWVU`}-yptkf&e-{?L^FQ-;I%A(T@;F>lbjXV!H<7CCkBAlIX zx?12G*My=xY2-l^gus@D1R{X^TGl*s;*w3ZD~I~KBZo{e=UEz zbZRr)8fpv#;*;R~c9P$S>J0A7Ou#XRBJK{8VhEwIusT6&leoO_xG*{0O{YkC_o#OS zl*K`2PSaYATaN9H@Q}eKGU8Xzv(UIl$hBsD;3z(z8@bD43k{GYIoDCewA2rSLJx~H z+XfUwwq-GIoFU{Qw-bLWcu@HF%?P<6r?Es8F=`hn!m$T4-UOU*>R@3^f_o%D60Dq8 z;C9O18`LayP`vRvItd)Y0dbkq4K{Xy?UTu6-l$BK9E=%WWf^jkMY6`b%h3U3x>)n$ z1$n9>QtW5c)3{|dR(_+DkL^F1FR+Gul64$x!q1f}y7ekX2!Ui*DYH^}daSL|CZI}8 zo%k~FaxHE)y{%9pYKNzj^HqHNdsDF>u_Av%Wo>QYZA*afw`%zQXxwTlQ1gi`9`}!_ z6&GGE5WX0<*JL&N3JcFB#3JjvXliI>N#hO&#?6br8(mX74hmfi!0;$;pLuGg1fut8 zF@@j2gE)>mcHT`rwn)KY*wAf&5)F%_>_}6ku#(>+kzukO`jzT>n0=)7+ZWMN`>)<#Z+z0ExOiVpX)I|qp+W{n& z5~k%=g^(gu{>A``--_a;Dk!0*CVO2~`TjezhcKOB3NT3)eKcdPhfd1WbMFUU2cVebVlRGQr$6EG6||1=>D^qtJW)bXFEVB=epJZyN0&EuXbADweX|`h! zr~XM(mK<~Cb9TkGwYjO$w+ofzA6ypM0?PzYQ8FIdEcUW$G4TJzKa8>(Hy>O^YlTE| zf?@&kVdqL4%Zx500`8R1JPWQqMK62oI2MdVOM}e>C-f=t7WRr(ZiDlE2;8*>ar^vF z2A0-Z^gXrl}+CRU3zmfh?xt;@CsST#>OLI~ORr z1ER$FZc5s#Q8^!p-NIPGTGR~4z2evbl+^t+xY@@5I1r2mrv{PsSO)Y+E7F=Wmf;Ti zR;@dlR>?61vzq4F;C%N341H$}?fW~LRO@_1mlfL^qdhcREmqR+V%wgy_Xkz@OOS3E z=nK~4K~qB4cyKwndBX;FGexsv@iHIGQ32(1;fWX-iJ`aH6R-6W{1d5jB>+pP>;23t zR9d18YrBMnQKAHNb8n;f=%D(?=hB8{mrrnV4A)-Dch@JKlgY({%I$Nhpnh^;kg*Zn@}JYHolA&&NT7Inh4i%c{!PT zS5fbQ)SrJ&u_{X%DLG6(+MWrQuMa)98k1>`psIXgg20-;{`Wh_D@u`Z!3o!|sKvOA z*Y40BKg!w_!k0QlGU+e)*ub05Ie=DN%!wyrh$ebitfk7?OD>G(9*7e@mQxw*mU#+{ zUXWb-6Ue{(!j?t(Q#>@lRf2tFJiAy?*SGc==&(?Zuk4;UmSmxf7K6=Oc3O}N6h(nS zgF`)a@J|o0^oJJpDGU(Go*m#lQC;Q7Kw_!%R6M36Et&veYMhw%$q6&crMzwk1+uS%?X`OQ}rkLc)=t+_0Z9SesZGg2AFsA$mEo;H40*G)U^pJ~o4SHO`FV zTHKM^6;W!whd0Q5#H)*3C*xjjF8g7&yL}zz*22}StZ>7nZ>**`v^jS-Xf(OXN}Qz& zxa{Kr?v6hX%>0)k;Nl^I`4V>~Rg@A6KXt6c)La;XAjk9^FPn+S%|%_hOk+N6fE zyZ-A78#GEU|L$qOo^*^KL z@)QiVllpel%STmg%V=pE%83P~y*bQmvu`qV#tx`^ zcG6o%^ObyS z`Z_%Lk(DXF;)FnZJJ=$km#d(aN4aREDX#Y;&GX_Bs`D zPTXRBk+|q=N(HZ?(D%>lagx_nn2==#f}X12_l(m|L@ntx5^ie*@YJ1v_@(+~7md6^H>UTS$D;!%H|9)GlzvE_5Vc3; z^w|$8^>OEM4m9!=b;-|!y5wh?x&;16eMn70ZCc!y$VEa4gJkOX7!uGu?+lBp5>@$5 zhh(Tze4~hosEh$kiUN@mSR}a>0L^VP!@%vn-U?k`T zUtCs}+h%ll3j+4_yf*`s3c&%Qi5+l>Zm(+0uTFmD-0pk2hhDjpEj8pSTC(;Iyb(^G zqhMXpi+(gr@5pW)qnWf2Ex*xuv>KCgm?~#0QWAt2_{3M}_{jN7BmERd)iJb1N6$Em z^cna7H1-H6dTYMNbL!y9j4b|4n_t`k3A;EN_4i3{SFDpRaMN=DVFg8Ks%7z5E%%yg zBXx^s7{5JJ;8=^24XVbPP~*oid^lwlL0h}Z;v5cx8K1Q~y}9Hiiy5?=?Eh4^a0QLef6rIg04G2yP92P-9<>gZrx3s&>Nh@xneEj5}@IIWEp zUQKt|W^|h5_w6$&a(YxgW`_>r&`YE|jQ`4ET9ZC#((t6-NDm8;BZj~#YRQ;HoJvF% zsxAyuVD3x4h8cA)F><8E8QmErCMqcx@oU>dC}iPGPKMtIOM~|&IMkPyO^QYn7XChn zl}EcKoTNofqxVU56!9G-AlE7!GJ$_PMcb*$CaTl8{}~%Mj_?MwXW)Wp<_PMXEdA}B zGr@>Y5^1bZLZiR1=3XE=jAJ;(+72XKwn2nyn$*vV1d6u^4k~E2@9%lNlDVVpD>AE} z37OT;f6Z~$E8{teMvnA6P@>^DQ$@o|7Iplv_yRu>9cx>&cmDMiIn}R(oa)#AHhX6e z_keb9pYng;=bP;2;#MzBXBeq`aFAb3r^?LIsEA5pB*e4Sv@enu`K2hU)z#|#97{Rt z{YVx*Rm0a8V0MuKLfnWo(YhnwB>O;+4LPcYJJ22mQ=QAe5lQS|Vqn4p;m9kVR=Lf} zY%WuOWuS$>eaAknZaPvV%Saa$x@_tpDA&=C+9{0_!&+PhAOP>S!mf6)c@{bc#~pVT z(aOm%Ug^G3VgtwQy1@zzub~o#w3L6?yW+zBu_*?fp(ESLL3t?o7TnslyOs?r;KUcD>dgP=Q}-dm?Z)bYngCD)Ebg_DUVGNGN_X zPr3okrnr3KRgkspiMYbY<~o6dZ$ZchPfLWQEAmCP91?C1mvVl{#o4lC09M#NtQTJl z``*04M9XE9t@dmF~gfhS5_` z5h@1E$1u*_;j4zGUr9sLum64S4(fD#jo);A>6R>a3x(tDDO8aVez*)@H-okP&wIi( zTMI&C==naa(!!CY1$Wr%2FrD80UWFmZGrc9Y|!3o_Z;hqn=%_H&h$h7`B|_vKW-o! zSGx|@avbn*^Kx>y5**GnbuzU~L|hVs$O~WYC2pz)Bgk4g4MXI{#7vXj{k6?+Sry5B zIA{+HSLXfae~fU8a-U%uVUWaFig;l;BF!Al`Zr2i~7+KgfS>U{j{pZuVPS5I<(yv=}x2CfJW={ z1|*03#=#O@Kf|Gui>%7sFVSf5a_xJ(5HD=35>;k-ZZYu1SAwWGxE5f_-QB?0!Q9&n zszse4rT1pwP=C>;bjNiJ7e`iUaXe6VEMUS@ly(jyl_U=R38uXLNwlTyi9VJ`yXD5} zoM%ciPG*}a0r27!y9(fZUbcK3mQkKg=iLD@mXX1`h{v!SInb;hsNWOqIQn)_&PH9@ z{StxO^J!SiT1TBYupFq3RmYKqPCjIp3#zi!$czWi;dT+{xqPN9F7Pf`AXaxsUXNka zYIaZ`dfLm+oOJcL-TbOAX!}|R&0v%DAz+@enZ=A`RcY|N92FK}m$P^AN)7W^Q_z+A zbAFKh@Dk-s3xg|HimVA3+)a5pgIq4`op^?V=%guY+X4;^dyT=}bD%b^QEgm!^6v}H z_zo0npcbo@3XrlaKgQb%2b7s*`J(YUd1}Ovc{YwGxGM6=m-BFU%{9{%kss(@<3v;M z5Ddu(vD?Zm=Gyu$7bg38bhf2LurP0uv&yj$mAb)snjmHt4rM9CL8b*&S& z_{Gy0)yN``Z;>xub0*{xS3Jr_(4^5QBS*Lm;zOS%mn9LN6fv{4+h{Rs0i61P;qzeX zIze!8J1m^KqAsnVx)k&mG`ms}-xGh8P*+1%a~LnPaLRsHesU88KXK_Xt`2-&!s2lN zuF6sVC|oGf7ELl0aIC5cLN&aaGYTZ-M+9bj^bnCzrn@yc1ql#o`hxN@zssrjB^Uk^ zv8)De`Y`9?;T06YRZfw_w{hkzx(3#Zz4-Y2Ru9q9;scnvj@Rcb{a4+3zmjgfUq9wT z$;vsi6mu~pu-^JmzEtqF9J$sHWHSM#C}wY6#vo%5EY@}84HRx*e6iVmpWMQ4?oZfL z!Co}Ooi@7Q1*q)8n@|Uc`9--baUa+~+oP~?x!&zLoeUv;2G88& zI-=XtRJGn;Qy0E%LEnyo7T&Afpp{o$TlPQz24cTd<$;7jCA&YV=h@)pK(k%%Myanb zq}XrrClaLeYtV3Cy_Wc7vq=4Bi|m_X0lRF>(fGSUSX}xV$kwI!P@Qe?h*p#b z03{i?l4PHrI#vpmb1CpE_IXut!47mBFkU5w%$Pww7wzoZ*&x1evFBHPJUpDH1slGQ z*Z_3cg{?SERA(hBbtADPPLGwed61}=yRD+vd}{2cK*Q5#z_Xyxa6YC!I)Hr#GJ$#~ zw$k;z=w^iMQ0_t=9R7eDdEGm3o=9xbJdhdogN^sjWHiBXr`KE#hB?&BaxX}F7Yfm$ zf=ZO_AW*hf@)P*(CNeqveeqIi7TE^v2gy?1_k zu~p7xiS^L0)M(2Zw0!~)itc>19WwcG;l-QTKa^}t0}qX{R(@x4`@<4UJQLlKqzyqj z;ij@a1R4#&Ug3o_w-~GP;v`!Z?@0cOXInZ#LHIL?r5oZ-WECV7c`{=TK_t#{xVLYU zxmaPD+;=0HujHtn6V5W`H@m>Mi`D(onA>5cOCUUb4leUJ{j}+sZGB7w0sNc0um^5u zC$)$4)*^R3Oc}Sg_+q@Qn5pwBDC?03cLpl`d#`YkGPA~nufR$Npgc0>1LQ&yB0+7C zb1)iNygR4T!hAU?)v*J!Bdmsb|&W}j1$y4T=c?lyi zOfj(fy$(!YvjfOZtK;Jv1K(+m7at&{E9!O02gH6*2nZ{U!i8W(S|{raS0gH8Rl`&f z_pe~AlGj$!%0ZTi0YhM1lF^COm>IjvD>wpdJ(s;;X#%`mAAKAE7av>b-YnNh~$CGD9XD1_U-Dwuer>*Vr2YR^1ol7(F z&M<-Ns$XH>rO~Yx9TB4Pz0SQU{{)M@^ugpZ?AQJRJY#xo{ROakt3^vY(^H3wPp<5n zmcY8vHAb!6GfrFA{A9Q56=m;IrUh^JcmW8&pcfttHD;`7#IhW26N|hWET8Z+u}|_S z?3Cp97^Tfytl!Q{EaSObiL*CTr-cCjacda#zgEr+RScCUj%Bm1vcFg0Age70ZlxHH zworR>^PV))s`PE}afy|XGOtu8@z+7lxiBka?D0ewh2U}zhg#u;u$t(u1Kcx>fj$5n ze>q8eEgq)ud1Y`Ost`I+%GxlKY8M~_Dp!816N|s6@NvKDKuI##q$&#%y0TD@Ppy2Z zeGDcCtTk#|{JvpEpC`I&At4X!TwzS%$JTpA>PFK8t2+kUmm*#BoC@!45Z%DRL=UQJs$-SaUsRA5h2)3=+Rsayf_-S!+fr&LCD|S(7Vo^O9jo*4ZsAa6@kt}eTa}~;T>d2$3asNCS ztKJ)Otolg>upw!e&c$)B@~5Q9LqyfO#Gy7g=>n1_{B0x#5Xo?^gt*s%RrkB=*xu@j2)*sMG%b@Fg73CS?qBYj>!`>srk*|it zZ#`Umlu=^TjM0MVpNNW#7LUY!jJxaM_L;Q-mdfE?S0AR!{TQt_P(d3Uvo9_s{j?db zuFLP`#mxY>5~zTjufS|6{e-GXY(j}+pq)ea>*3K7#|kawVpy{K_~nkKAGNjHCp#!~ zk15cXh2M|F^PO3k!z{Y~+-ihSgKm5dJ_&OS&{6%G3JkSHjgBUTRZD#AEYrJ^M`fBc zyg7*%-zN3j$-xUK_|&<#oOEUzvSamI3jjVYDI%`H!>WAVganll#yYp(pC)G-DHV<- zHk9wOKq&_Ts)Up>VTI%QB78oi4`=6FzozKox3HoRR?k}xDvGj4y82tQ2~>{0_-cW6 z24{;8D)xuiELbyjkJa})LbDNk(B2Olw@eCHX18$-B$o1`XkdlgQV3vXz(@e92_>Ft zD5^KwIHj5$ADzM7)g%s_s{^tEnK}>FAQEw6O0OBqkWYeYKAu$qny7~>!TBw~BwN?& zPi7@@1QE9JaxC~`&>+%sg0(KjowhdKtQymZTv;24eFR}#3NEtuiijw&H7{fa;=#ST z?g)Z3wWx~r@`1$%JLy+0taV&g@vx)mfoAB`i6tfinRasQ+a_wtGYI_;rU(lcS^J-OK1|CCJ~~fVg0U zKKyrBK!QDqbh0zT(Z*DR=mt@q5)FY!n<2@{Nwhk|Kvg#A&#^0pCXmnneKH4-)~ULQ zM}KR=iBk{GJ94vN1I?ux+B>k{ko^U~Rr?YZnygu(^m<^}<@1R&qFPi1qs4cI$oHgS z*)zE|I*40Yf41|*ji1Na4`$q$;&iLx>jCj}?R@=jeBN%6eg@dBLIM5}Bq4H0)UVyj zxdiO)#seX+~5#csbGZU1z{ir(lgC>F;akgg&VZsrPa;KX1E*bS$78NdP0&`<9 zfZ0?tiR4%khZb!qvH?6_2A@WA-y)sYCY1*q1;t7UnnEijU_Xwu(?O1;Jo5Xf6=F}O zsf0@w<@z>RUA}Bnw#o#FRkc20WlAxo#SSibxqxIu=UJW`?eN1ruturS;*;xmIP?i9U)aK#ub)Z(@^{g^gc54dh})Mzd7Vp_C#tm& zi9_Am`c^?lTwQT~*}>E5$AuSh*ya38R$z0H5ec=OW?E-?qV~kqTI0DnGZ$S|YdEOF z0m*0vW3Bfm>@u?gWZYqc@YK<~`T84ubiDV{k?bBFAx$HFT36v$eaI$X@>xIZCE$=59mtfg=7Q=SQSi8ti~fl0V(={vm<2c~%5+O&v3>rDlot0159myEsvAGI_$jVR9ItlMj z)e(7@A8q@p>hmL)6P%+mBKM8ES)YW6mfu1kAs_sH<{^QZJ;%E%p5qq`N)XksZ3PM~f;amH+BBmnK+nYNLF^qC)X zpaZal5kMu^w0-6C1YG7$$2UcSuJJU*30x`J+*;kj@yh|)!dhE6A6x|_+HXd!ciB?n z(Zz!%H}KT;hN6@E!;t#EgKe^L6kha^W)PR-e0#F{tY5J{?DS)#Q5ESY;fDW&9VT)N zUh$v@c}!MxD;@tt zdsSQ^6?uxXuak!b)6--&1>b+_T9xEJz={(x z3avgs6p07ae1e%CDF58s*`%iDR^IpyG|jv3A5V$QZ0RcCtxHv4r8j!SV%P)pCW*j} zAJEu}m0{s2O7uTh;?`c=t|nY`%1#qr-;$`2ji&xv)}fkOu~ABx*?$;^k!PnsxK)q3Stp=U*00@tw+}b68vJHj&h74g7&&uUv?%q z9t?2HQ>uJP{l5KQiFzr?SH3QBaoh@#s+Z{lI2I%W1iw58l3Bv1Pj@=`&E zJ(4d*cY7LZywVKe8l|$wml|xsAu4S0%2_OK2bjURtwt@qk?2$-IjviQu}q@Nu6~f1 zq+rlvfG^@uoVax$Dcx;W4bZQio^+deEi)>Wd3=kY4O>DGAZ`46IYV z_QZA0qg;u4NO_Wj*Hid8VC$omxycEvW)Uk%m5O9<1nbX6c9XHXvoe69agCq%I}P6z zpFzjUN4rb_!y)yeoerJjkpOAD4#T*#KNv5xB#J~(cyJNE4Aq5LR)N^==M89SMb!D_ zsgsYgYHDpFjmy=iFFj4E?xN{-YtQO|s^#dNW{NAIcc`lUl63TYCYbrzNf_bo9mCqWST+_S(i6XI<1iA;OilKeSf~&s-=MrBmgbkVgH-BZa zURc9x?M7}2wP8Ta)XSZJA$tVZ@vrO@T8~<+;Iz;fkhRaLS2*dN#BXYv``gNii0>k@ zmydZFO65O*FW*o&{n~|(#uyGG?#>*D5jVKopLjTYSAX0p%N$EgpaCH)7z*E=HSf)S z29*}Sf6l*Bn8WyE7%U$~^}1rVUJP*Ta-8@IDZ<(#tj~ubdd-il-HSB!HSM4jITTSmWv0n0uE8HRQC0O6KO zb&}s8v#_hBBWWQ|rRXll>hha71uQ5Yb&tbLI?g1X`SZpNvu#KZsF~yXm|H>-^>MrP zx%tC>rEWGd1ORk=Z5Mn*H(hz3i37nT>YHcUgrR%o{ND6S-k`FbYwTtV4_(LztQ=A z(MeOBgYZd7_aO>8O#HCHsjO$Bm1G~u1A?7)xgK;c{Q=60AkSZaVcrJh9FLvwZ8aRO zg`Gt)WXRrZw{^RV{}hid*vFyzNDJw2VKjg$X|uTsPt|ydUXHbjejE1hKwi};xy59fq%53rWW0g4 z{uFTrau;;gF`w*((w2CC=!9Dx^p((T7XC2ko7c--2TVflPl$n{u$u}i{}n%NT6UP7_3 zqB8EXRTnx@Kf@F|L$frS1y;NV6R469a=LoxxRY7CjZ0-ZO8iaannkh1#Bj-vxR=Yv ze>=5-e~`y^(PU6mx;U*$gX2NsGxtxf12UA#ZH+0R`W#hZ@uPYZi(~sOcwJSU27HoV ziCP6E1#(^EXW0o4IG@aWzlQgndVB_CR*NjHK!>He4#lpI2Bn~YuwB8po~;`gdmwhCLIM2S%DKTxn=7!WGF`dr#A3|(;rdB}Efb04(?g(6 z6aqk_#2^hHQ1=e5vVx+5<^lO+;@2hC?U@Bc=%Ec#Ug^%dMfEolGXq}HxMlD>?(a%a z7w#0IyJJ1?FU(g^@fN$C2CJH_tWY^M>1uVdl=jJza(%kGH*Ts|Hl(7HhW9w(B#@y& zQDs)tUUhZo=1U3jeROd+zrP?;=fvn_AtTo-PtvUboKoD8R}1SydY~rhv$XLW57Do$ zbQymox{SYm&Nh!?AF48r_HliPb+C!`kFRY^T$MPnH5INfn)e{n=SZ;c%K#SIEJF7% zINu4kz(!}+S4b>V>hYi#?<_HO7P%h1F9QTmQAeH@YNwk4pxN0&Wsa{fInASb<{Y(P3#e+OeIy{rH^TP1L7^4e;CB*tvvW}E z9;(T+57M)GAbMg|bUw4^?Q$X9&iQ?yWP--%2ZG#@aVEM@AVbLTWb+N(5el$mdnT;f z(S_Bi7-Mo_e7uB>di;K5RJ1*fAsU(R13i0@6JkV|(kt>~=;Cs0uJCA-S%C6%%o3Zx z%iTrLNdW9r;uJp|5n5$SwPN0I#9pljSJ%OfdH9MVQZd)6%dIKhCwDwk3x2_qgTMn* zwI5bVq}b?2V!j7cy!q@T5O*s38XPa+&E(pRKA!@1tftaL-Fci|G`Qj0g-17J76+MeSD{BAi{VQhp)P6t$SbU8==kG` z&upevA2`YQ=wHL-i(q}3ii23Q{q69qD;~m}1^kL+^jAVM`s>#${R-CfCqZlZg-nhV zH8KdDd3SSUxrv~oYImpW9^p=VvbY8U>FZr_Dlq$s+4&g zBEEE_2NGBj^^75Hf20VHuZSH*)aw|##~(_7Ai?PU77e`kJlHp7s9pz0i*p0`6_wqu zgv##M9F-kzzOjn;>w_;3Ns-#0efZg~X=IRiR92GWWwi1z*;g8r6qPhp&R}^|4HVS1 z46zq;vK%Kjk78u-hDua{lU6AsXW#H&Us2}$E1}H$SDG>}D8AXL?Cy_|mu)4hQQc|p zOKX}6;3}ZdDywuvWjM4~)E4d(NH=JVhN*UAz}J-hZ_aX?&!H9zn^#ees7gQ7 zg4_pe$S^nU7bh2^@UaA7ULzyMlK&(*4|C1dU|hS1>dWz|I*!?zoXmfKM<5k&7IiP9 z^`l^AMO+^=6!qTlKily3P*rVygi9kp^fnKObH-b1Dt2!8zak&|S3*AauNm^O?aSz) zBtLY$V^u&i_CKfa9c}GmJlN1)(_b4mrV0c^L$sn_&;?m$-WM6-UhRV<;Th1jnyX{KL%0NIHeT4tjPqh2wKsr zbi;%qcLMbld>$M9AZ;y}FJA-926Dx^Psz+AwE0WQkZB;OC)1U2H}e_fG+?b^Z8gYT zy1VSa&U?+Yr>!O;uJ}Mf4SfZ(`LmWwDm)c zFA+w_WSzc(NAIboCip-c34pGeg`l~Y{tccP8TG2TOzGbfp&pbs#i`@(tzuBT!%06{ zjL))j`^`+|EXm58vYd6ax})8mSt8ZuFg)(h?YFPE`2Lk}@%<~!#YdABbZc^6pwcjF z)p_N%@Zn65Pk7K+I54fKO`)WKmYQQH0UIHgk3qRXev9t^$Jv`D zHL`8nf?c^yxck1F$87f`JMcc<&-+cwKM5hB0u_`3Bx+HEB#Ho3n`Ki@;Dx^E!kc4` zxt6;W#0gHCVcT|q%jLd`xn?ou7`>0lmX)-e-gvxHLeGlEKU5~y9fzjKH2sD~1+tqu z5cARqA&D+vo%qWVa-ItA@{n+tJ_l$(#>F9Mk|L-Kjs*Mf>v6uEu8z&m(4Iu$NIZXQ zEWSA1)}>bVFeRnTOw#|I5Rv}2^+(R7^n4L??|ZA@C%OVQzaoCi$xnFy6!(;IZQ7Ne z`B?|XZSN)6)?%e%K1e@`Q&H}Dm`SS6%vH(>CLa09DO)$hy$bhtK&IYS0y7!CSq{jO zN{Q{93X#na6sFqE z<(=VKPEJ=6HQ_-P2Wh@m1;yJT)-SSwPEBs{S$I6q!!dQ$(Jn8yereYsf~R0KoO{Nx zz&up$*&c9~Loc8oWlc#V&D}P}_3-%`ISG9yyu?N!?oREqodY1<)n)o}yg_wasfqMZ8!BsRhFA> zYFt0h9H1#p=13PKVQ|P&4~I-q%h$1og0mUj?R%05q$(<7v{#ECc! z3{<;UD9YkUZtr+Dp(?!nCiAt_e6%n-z>8LybB?@LZ=nhSlb*Q6JKuSX&?^bFrmC7c zq!caO)~{6sxQISU*UwWO*cOOp2D1}5w3(Uw;GEYQg7wF%C&iB->VMc4r<%@$XN0sK z3#fvljeefHp6|?@L$vLG?;k+DErcoTEJxV}DM8OzP+?$fNa*ZM&^-wnH^F9u@}p=d z@!VRj*NUurCg|&$sNfM?j<7XWD9QF?m?Ji?5PG5e#;t z#&5TMw$%<_l^vvg8s%C}m=nxQ8a3Po`3k|m@#(#GNMsp1Sae_-2L zn^EL-hOjqc5_VC=0u~gyl^E?$*E!B*3*&S#Mr=)JSo7vH1-ViiDc-_6XnHbPP@W7b z(W4?EGsnttgOBr#&_SZ(X2F5Hn)O24)`T&ZYi#J&{r}tblPa&b%k)+_;EGC)~ z@b0rCyFxh_1%kIOK#5@QefEw^(Cam;~{K#5}hi*!k&|NKA)O)6{nJ$)z~a z;mSF}@xrDaq*)%$#86>P`u-U4Ti+*uxfPK{nFyiSKc|6*;=tAp7x)uJJKebj49rbsh^P$I=vR+o}Jp)^l424;VX`WOi z=0~vkCiN-!GT>Tr92@KemXlLF3unKnfJto?HX(hoHD_8xBYHXU5eb_3(#}1hbuj3S z!|^r|DnVO(sXBcW2^!<`e4O7#dZi2#ZSkhU)5=L_Ie^+h3)FMzcUpfC<}zKUls zIe{4O5NJivx0kl$)b|=KjPf}W(alVoQyu`S9ji~NYkb~DP!zB3vKKgJ8=K7G_ym>L zr+xHpck)~;vUuUGDr<>3C5;^Pr`r8AA2L5KpOSlG|7}m%7c)Oa+EY1J?ohC7LQs)C z(J0oB)}qc>mZx_Dh|rG?x=Fj2av0g%t_{%~T|8h6h87P!{Ak1cnQirgFQyBX6Xz7g zvzj;(43jBisao+0iP4N1zP#{;AAMKGB(@xXBw8LpV*^0HX4m@o^{{bzO?u+jPs38> zGfm8>Ds0RNQ1j-~6|apgN8@X;I2=(4{p9_$&BT#Irf3ft#j8%Il13_!2^}1HwTasO z;X#17OwT8K5^bDhx!f{u;?v%t&R}m!)f{=d!7BpH?5o5>pW_r6{};m?7BE^gp%Q0@ znN5k0nbNRMa`6`TYT@3LbC$*)>UZvWjySV>DvSB4bu2da1;;hyXfQQO`hz;tzQyd*Yr8}rPj@t8L@Oo3FMYDWn&P6p_`U#CaB#)f=aNX(d6 zNY7Waiw=wV-VB^-^-iD-spx<_Yy=ys;o|UwJkipd(=R1#Ld}tDU2-=#JOF>v;u}eb zD=)RM+?prz!y{y@LBz0O48%&-_36RLyhC2@_U;dEv)jqHx9x$8DDKPSrFCPG+jORc zn~d=U(n}lS*L4(Db{;fFekZA0h(bJ2=Q4NoJ9Z#3w?PRG`_p(B&+u2qXA0ys3dbaC zpA{<92bYRlQ2w*6T$WcGF#fRLC{wJJY_kWE<3S2b_hRUg05>tBV}Cu{>}hWAh5)+Uex!yilpk|PGb z%``theny&2&v!cZUTK~u4OQ8~)md1+lfx{y+JfS9MiVrOzlB5lSPc4Q7~qv_(;c%| zQ<;UeJO*6+$yzXL(zL_9R0O@&g*ts{m)Gd=Vh!iU?i^%VE29|O%yX*CmxpT2gbvF+Zq zWmrnvvngl~fkz=RBSP#A3tT^)DuAyk{WG%{)DFaG{4<074#+mT1hj)h%xt!gG?F;0 zMO|+S;?`OXy4x_zG6Fk*q=AO5>>%|jx<#OiZ^5(m<^eWZ&Pbxt))5LTD*8wqmO;7{ z=bmmcT*xTO0k~0)dnItfxjDjDh=r;5AL=M z^G?3b16E8`OC8D;oJiYPv;bl(WpvsGb zy_P?KqRI-km5laonY)H7(=$DAl<0LtN{-Jp;}5m}&~*I`uUI91q)HRPV^+Ld zIx$ElAD)NXvtZcfvtnd(9r5<88R@v|gDR#dt(R@(+PdBpsqv?FX%Gra#5mcS-`t0% zugs4!eBs+U2z427!NC*XF^wj{HM1i$h!=}c33A&CbJ5R2I8ir|!G_XY`4kK(LXsrx zRX`gk1Lo#equ;ggEbFT*6o_J+Mjm&@c(MR+I%o(0@p{)<#8E9KL=E@255c7w0I|3e=(O z#o!6`0O*80pGA{qx@kZqBzF-$_0Vt}?7c9}!>DL}fZb!9w!2U$4sTY&%T*i;o9pw@ zYP9=KiJ9>AiR}|CdxiVMFn{%#u#4jG(Wa%WIPcuHTVAKC9pxl3l zN9;Io{RbCbM+@|HR9U9Soy(6X7{6Vi`KfjTOALxi&5DiIm4w>D~;- zSr64+vq0+dXv=`6B*z_U4EYPhXF=n2=aF%#0-#G_=9*uJe~O>7-;fY6EH((s<8hoh)`8IXr39xQD`L_;4(3jOEULtf*lW4-E||#RKLaRq^=eKzu5OhbtDT$ z$*6@NGoPxm>+1*RP+V<;Ye=@wI1}UtOK6cl=_>x6=qmo5)>Rbqgw~Lw+xhKAkpF>J z4DkjA`DhzlrSe}arCd8G-k3g4V?!I7GC_3%Ts`W^A(dPkxqOdtjuAV7hIVJ7i7l4j zn}4ZMjXy^T7)l37B!)1wh8!?u25gG5P$}k5*DVS+z10o!kI~`4j?8+G-y2Q3nzuvS zqX+qGP~C(LEg#0cJL~_|m4Xb6(j&7!8m#6Ht7hV#@^vnb^6SW=3;MVc7{lq;mzuTZ z2duv<*Isg0b06*wY#ipIfO5<2$7oL4<)$uoht)c=Hj%HBd@lSj^UQc7G;wgFbCsVjew}qScjB4!cr0<-D zwU$bAps&nil+FzBCh>MIa43E)AGo5-njga`L{mok8 z$GdnqYaVT3dE&2767>yn+ZfV%#Ta8&8||{?0XsmE6tJ5#mxpzh8xScp+R@7yqPdv{ zr)1h2pn+HAA>O#G#7FWKOSy@0_6&Q`(*R$+b^9OiV&%TAigI>5Adl(oMq}g4bh2Z} z3%%~6CVh>o1gqY@%ZSPh&GLl;kn);@O818OOHmSpUZqSXDKo-55%D6i{)!RO1&u48 zI!eM01xO{kx(vmK`SEj5U1M$r>|^rJW8J9ZtuTK^szFtI%mjTo6bfiROJ#B7`siLZ z$-$o^A#i18m$F30mFm9BryJ$AaX%Mk&w>tM8Ejnt^x_n*llik!< z_@DG#|4#H=|4!?n*&& z$)J>BgJDO#T5JrtYa*fmX0Z1ZcQuD4E>#(A%hBC2vB%=B#?wJGnkZ4{n=v;zwpR|h z{~`?e_&_)9F1#eoFn$#(--Ww&^MAMxp~v}$5Jk?WS1^hzAc2gF7bZbv2)*;z|| zGk&Q_jOt$$>ZFM2AKg^Qm~ zfvTDv$}wu5o68vDfHRYz%U=6#>3BrDQ$#AYlEKLosjF#jjpVo;lnot@!7uV9R7FOl zy=BZ{n6my6D4RBGwKyhXRUPsfnt|LW>xtHBrrYLM6VYs`2g zj-GR$p}qo$D9RI`4r^vROxC6f&NIhO()M7MN4l?HbnwhuQ#$qPM*T-}W@EWGvUC)k<T+6 z2cJ%T@`nyGN6%;NRDc}{gozujK0Cv;1!jiJR2bnZBiK@zk>cDnR4P!D{>n<+l=$<- z9U@`$eLr1Qg#?rq?x-l=r)NFYi_>i*>5YrTrq-H&y@O*hc==~$Z|SrDWGOtQk;;t{ zG*)4l_2WcS1_KDzxunTP;;gs>CwRM15{w?DVBkw>Lcwx9gl%dOYGEXc3x-@z8_dX; z%ji8U#L*i7pk?0u2LZvKecviX?qlcBhr%Po6DVcpZ7>L!<-_nmkXK zb7qFw`gvVW8yPVzYnscW()G40U40XVurUdrZ}nSB#6gEncgyCneV9(5;A!`#hMcYU z7#pc4QUe%8LDRedAQjidfNI^O%i@T?Qj?Okk5M_{9-yx@+@wn-&Wm5DmJ!v(pU?+Q zG?-(Z#qA6B00VySSksJt;xbG16xott4(^*-p`mJZmU<+E0m5F*d~$)S3Ag0rpx>eB< ze>$oOO{H!enxJ%c#7Y(JK5lK_s_)!MqV{Q#Q3ppa2?;0ypa_R>=blMM>yvX*e4(QP z@ftSFDTk{iC`WlS^$wTHc8BX4H1(&=b@xx%<3&JKT}M&U64x{I?zakCDR4BXAa1wP z+sdLKb~0&3)e<}!Q-A0Fh^F6;ZFun&P2NYx|JWb_j3ie(65#7{9S3zlU!wIEOvk9U zgf>If#cLwAfFJN1hX9zU+f=?HR$43Ybbw%MS)!mTvGgMyx?p>XVr8op4i!4P`aaKH z$1CgcN@=04s_A>>7eTobA^u0BIKpehvady5-8A21)1uns}X~wXwaDN9sBMvWU)8TqQ(oD>@MoW zEhEb;|F2wK_^cYw`Ti+9Xn7K4E=u2=332v*A$Kqy%Jq)SYdPhEU4^wkb87`;7dpZV z>>S&wbd?{ZGN}aY>v-zh$ui_$z29uaM-_RBN>phYo7!+&o>XfMn{p-c&SLV1ch+>* zuLsvT`9WKx)@6c*`RieCGknbAk;bd>DvH=XqZ+Rs#II9K$hT`#=qds@{pL#~X%Z$U zTlCYRbArY_N;)YH+;k%B)4>k8huM+?LGRt3cZt2H&0;n~IqzYpHq`C>b~RXe@_9v4 zG@8#e*~FE@8n4mx*|L5dReeAKbqIPNuSSPd#@G6<78GD1lBXD)TtojsI#|>YWRgFc z+!7m?&VnY3;x`X~n=r}WIx;e!-;>N~3lZ~Wl!{{(0pZ2qkq=0EJFjm`Pm&HTUo@yy z!jl1@{`%~}Gy@y1&&A#|bE4W78>zJfBrKVMjGa@OBZmoPAdV}u?eO6&*enEFs6ozi z8)%x7SgLOh(ywbYeR{Hd6>ee_!S1m~7L*G);D~i`e7`@!_nNITExgD+F=pE%WXglu zdYFCXX{!N3Rfc(lk;Vz(19{Oyp zrKN3cD(?e7T{#FgCh_}C{9d<#(rW-lfb`UMe7@o$-5$_x?-SFDlFJGwL18D{+|dkH zC#aTxV~0ORsY-jN6Q>_YQy5pNL|(nL1zu{NmqgMD0ICB zCmx)4&HKwg(T>$LRB^gZ#9XIb8NIA2NaIhHmjbRQX=yVUX?&hXUO*h-+K9b7@mtR* z!`Cz=;lw_*nsT8L@IJfO_=G%-*#ryZsUsBjaAT|0dFR^L(C%=q_Q%1oM(|D=Ooy%> zp5=qeCXX|`k&0!CQvl?EFQccNXcVH>Hp7>S{NR}%E>L_TC)1?OqlX#_EK?|X75-@g z*RRhm7GHPvx0GCyZG@Q}DATzs)hScW0G#&P%vQTdFwsh{W__&h-JpyC0V{|MPQ7S_ z@|1wRyd%#N`-lwV{%Smv17^xGQF76XaA!kiT=_*?-~v^CT_q-NBCmI`hCX0rVS%TA zcoAgZOjFOT97YTlqNxIfBX@6+s{ivhB_*cdu&y`et+#o*Kqn9V?EOlV;_erZ$9gr$ z{_CVY{o`2rKt@h&x4i-R>v9kC=D@E7UO?NSM#mT}l)k8jCJYksX-e~3eKO^1SVI#M zn%TU)7HJ=`$|@`I*)CDML1q(CE_3y>T-0pA6IC05-|T9Ou9L6T*VHyGf~4K=Spl@{ z-!5X;cs9WW^4QvQifh(SO`#5bR#i3*Fg=T*$X}y@O=DDRe_~e>#jG86AL;1skVgyJ zLiM=vXBE3ceB5Xh$DaPIa}{nBP(->o3fkwyXnah6L}k^_y3UH*&3c=c5&yCm6$c5~ zzx&&kSk~rNbSOK#JM2*L5qW;qKS0X&rsYUfX3lx9J8-Q31)1f4NY|#Pjg%b3?-2kGD5C2$siAl?_vM(`6O_-&ibTtcg3yh+-NW0JxYzVT!N#OjSS` zfcb5c?-%!L)c*XYj9cPqy4ZtZ2_kxznc?KH^O(Vj^&_c$pJxsb7?v++!3pa@vY)7X z4b?wphe5X(UF`+Ef{%Za_(0ovP0U;sNxutr^*I3*A=I3kg2vp0@IE|*aF(YK0YUlJ z{H~PVip`;lT3dPj>uz9+Pq_G8w}G`2D?IQ!>U5S?cbQ$5%Q0-NnY=;Z_zN+3ZrFS; z#YalXSNzr}cbODHQ&nU5<2uP7qr7a- z%6vPI7AY~5!yRJtBz$59-Kgfbr_9KTXZ^{hHu)*uP@F71(m3+;AYo%Am?M-6pKI!y zQfo{785pSPfG!a3JRPJV$yy@s##7Yu%$);C6NX~Rn?^%YM%lW=2_*^}f?QQg1<^tg zDEOXkDIr4EE{9YWQ zZ6?dbMflEAcL`BcyTwp_lfS?>e8YlkzYcoYwQ>mv$J?W#ouJq?&t(m>)z6tHoU2>z zXV?M%i)z=ZD}(fp#r8EjJh*u!5SSk*<*sYo`52GI*-~AI{`_5gsqv8t8)c|{h@kfE z8PwzuM5@QKN044pM{ZHokKAFjE?iFRFqWec5CJ8LF=s`lpm@!JDb{kvd~3?99bQH?)gThfS8UBQC+gUb)N7%Fv(b#P zbcT2ry%&ZIi^%Cr;xTQS5yy1C_cY&BMPsFgRrQpD*cL7W06uD0%6ixerkkvm_?ByR z)J<(e>^h8OR$+GaD$2kpML$U_7#C6DQAL)0E8r;K3IliJB~h@e_SI@Lss@8;AILjE zUgE=l)>lgsU#D^+KRDp!QytAW=)Sg0i9-R>CGz+sI2MOz1}xD3_Z@q_pD*0dyKSt^ zw-&-NdN!V^#DG_o8Q8ma)vaVH+F2fwr^vI3HI65j-Wy|9TWO?TnDG^7l%APF8MK_D zdYVL;xX&7^E1cBJ6?U!wTRAMq1@p~EI^XjD@`V4wH-)+DqdWqLb&|ik;iJmO%{WNR zsJ{C@Gnev{xLFm@(~yybf8s;>_}ybhAyDdiym+O5eRDmP6Bl~{_q=lThc;yu=-qyQ z?fJqi)}EFej}0s>5{o41-YgaCphgF({vPzBn7+t!pjQSMhZ8Mr>3rce zi{ce*DrDg*>{|aTO1o2SnEP!MnLKG1hcwzH&=u4~(LoIy63^x(C7qm?C{r zi58=oWBaYXM5p&~UdW^G+}6ZqRAyYTSTgDwLb}{t!&Lyl5*$if1@!Z+%ewn4=M}#f zH3p?1v0pxPqRPG6MOD+-xd83L>?+>Zm*q7QLN-hgj*UGm$oU`+SKh5yqGd!`hkL+F zPF8}eMsWE%m}9s;k$2S;$*bkIwF{DmH%~qw9M}@&6bKZ@{i+xVgEx>-L=IHaBO%47 zxAhU{x8f2x)N}1*6V{7qU(lS?_C5GvBzTf_)63$3*FFavKjX~TYnlPvQ7^Xh$;6XE zYqsrMN&$N?Wf^u0Xp$KPnqM@2An&0%74JD&oxj0e{=fh0fB!%K^MA9bW)HKjeyR$=@tr)>yU@qSOS>$E z#8kLjW&{zoYl#^uoC&3)E6SdQM_lhNGFu)AviZ;3y*mPF@XhI>=i zf6~A=GGocDAfANeN=BYA{XwNW0*{-lCW+ZY$14zQ-STyy2I>8rqbq>e=_55?g2#&N zaaLO9`$c298J9oaCvgqEj6CI*=I~E6>3=6Q>3^qb(lttG!uP>;hAR5PjsNRE|G-X; z3+%@7ziGVr<~o*QqqcOvKhSOC0)M|W-F8?sQPv=TjheA$4-Lm>(EWuuG6#=6FqHXK z0KZvU)IJKb4A35CNH9JdT1Rg$K;xdFXdH$%&cMvp+ekXyLjLj3{6BR(s-{Bf+{ zjXpyY&w;Ig!aXC?u_}zgcEt(zb4`=XEU=|N)n#OsHYj%F__lyX5q>DjZIt8bQIZf^ zO#dvth%yS*j^lowA+M>${K6U|fd(ExNoeu#L>{vYUjRc2-_iQlw2eu<-UB6lHS*Xc zI0u`UrWGaP@+UUuA`>xtoTPAcVIny<=Pgrhc6eq@)PGy zU1{3Xta01g$kS*e$GoG8C2J=jA?~&0#~+XBwa2{3$M_v+RIR8(+NJXnbOs66#(PD) zVXfKepA_o`9=*mpVo9~Qp9)`#AMZS<&M#UhVv2!!FM8^*@M%Wtq{x!@`B|Ay0s!~M zJC=9mIc)!sC$|Ee;;N}R%{_t;LR@woF;E*^t;o2^_WWmN4_XjxaMy_-02=gRvIslS zv<`O4|KXFgrlCfmBV?I< zI0s`#IJrl&A<|XA6jsNy&a^^^Sgly9GtX z{R7gHBNLk_WvXYOEn8+x_1I%ah*?r^nw2nB4ORg+1n<|gPl+Sv*+Z-o?xfBtJsSO< z$3YGglL=c-L3dq@qxTZb1b>w}GvTR>*ngta3_op}+80{v!l?mb%fmBoBNdWJV1BDXH;>z zU90sfU@IM4exKP%&x31{c_-CG+F~c{W8i}B84d>BzL!TKZwcE&by9b{RSfncM3(5;J*VHl9&z9JOz=fuW z&B}KYeacN^-PiM-wfW(`u?KtlyY1_w&sACVNRsCAnd$&)Ye`UrsF;r=yc8!+{{H*N zKxz7(O7qd4Wt25mFgV@g5o)gbS>MwR-Z?EcaNol{4_KgL^;aoWcISCp2t!~)J{0}SzhCInGGfuClOoP^C~Ys&pxmZPQL}a5*wu6x06ZTTkNT$ zD^*xy;a^*5=j5DvOld!Vj z0yy{(inP!=$s#T7(`ocjq9q2uMGsvzJo#7#Ht0Q@$eaML7)DYmEKcP&7!Y>KX$Az1 z_B01kH^MMSGgQ+`+a23~gMmt$keQ}fh#p6B1Q9VFoNgoSDj%oCaH?OtI5|aK^DCE! z7;2{8kTZ7*^618v*jh%c*f7CfwkdlVB`_HR0-I20D+*71e4rn;s;s&(9jZ#gno852 zP1}HE;FP_rOm}d_w%W{3gWgly4}Eu=fm~(HKdz+JQAsxKPu*Yd074g;AQnf*I~0R7 zLt!jF*TMMMA46gDMpZTNz24!|MZOdCw;}qZnKm51t23sti1|-9Tl+T>XFV()*iCwM zP=MugVe=B%W_cF^2$XY03l?>H4KgEmBP9|2bWQoczS@Tqq9qZ%|1Przz|&c#A(=AO z=}bSoWlL4k#yWykq#azf%;f4Ut51m+=Rig4ZR0$@7}&YvIFmrQ+MOXKs=F^dy&(5; zbn_ss9Gm{2M>n*c>%P$vf~=kQvzFd?A4>eHo!R5y;sR!&xI5oG zn{Q>ICFb-Xemcz=43ujDXUfOU6m68BZ>ofWj?br~EC;adQPxaR9mz7^*W`LMw+~*8 zwNqa(F>uC@qoA&R@Y;{enoaz2g%)#(we+Y$yr=339!d^jMc0=hr_WEv;Ks>?)$MP6 zxkr2!&6c$4oZ!k)UA#q8xG)jhA3^=iY_gcp@}s;pCD{y>MaYy^D-5*Zu0iH$aTxs) zMe^)mEqFg<9hUAk9T;^R`uJ&{gonAHvl>mhzM5mtBSs90g}1e0F6NIJo|8Esvno8~yDe&Z|5Z}~*ll1w^( zqo+m{L>-zp0SIZej?TA~(zy7I>UlnZTWQkd`jG*##Wuwx0xFb+<%uP9@7xAAg`bN| zAsigk8d5L-7QcM6Rd5acj^ymiKietBCUhqnpZ5wnxo}S9Y_@D!^{}DDy@P? z%FM_7X!s)=b*3=Oaw44HG4q9kwOz9A`;`Ip*-h`1I@9Z=D1Vjo@LWu^LoHDnG#sj8 zWU#+VXF+R7imQ+D9+fxo))L4JiedE%X+doe;&0-2RcTp0Aon|>t>26r-D9lktA4N{ z=a{0-ttz-%Yk^dZt!dV-P1Sz^^c)zVGnw_gPIZZxOgculM z32${+BFEQ>uikVw7hmXdKsG_hqb*Lyzgqk%Lr+3)65F7orPGb;ZHW$owq8@+#XrRX z=ncZNJPgZgK7F61lG`8XBXNN*xuxkNvC-Wt^10Hs`O9x60AEvH1N72tU4|#)X!tBA zb6C1ZoA{5nbaF>7qlcIR0e=k&b6L0)?BaioKy};mT zMwqc1r;^A#RU6j_b+4p=rJ-LHbbd(nK(%S6|1^u;gtxOZL-*aZhQ+Dgj`|6C#oHXl zm2G`6$P&Rx>l|Y}v@6a)WxvH0;8gEW>!`0tJox<_j(m!{4=&tF2CQABs?kL2+9omt zSwQ_OcE^4P5*6B(G(SB1j&1Z4q3tg%K#6*f^NSzg=s2h&C(wTct9k1v2^nPDmMW0* z&HhHIAhHrv6bv|;{ z?Fg2cLSpCK=Ppp@)vyBVN2Ojq#wQj&I2kf#%CRakldzFhiFKozF?=({OGkCDXG_&u z{7D00|FUxD-^j~aN4Um4I6vQWimNLG1#J*eF;^QK%BE@*7>!SGZc|t`cd6vI+B$gH zi0+WCGo9Ibk9!VvsI$A@!;e|-LIp+!O9JVR>R4zS)4aVF=HRcempA_Lif?Y71d~Vf z^u6Ey(fXL!hC&2C9f=aVt~C-n5{D){Rd0->i2W=nu{1T`1gz!dOb#9hdAXbjl(^rz zAlOp5qXgL3t^{@Kz11F7ZI-Ld2!yxlKf&fo?$1;sRU+ttX?aDpqqM3yKb;1%b-!*R zM~sZsKYl=YBTaC?l(-@2FX6ZML1A%AXdhwfvtx7CKtrkBM>&OOOjKan)At zmVzN=rB8yq8&O_>@|XRU5wuU2p{%>JkM79fWwde39jAe|oGc1F9lTriOkq1Fcji9M z&)RAd7XtCPZ2ubme{zBdI%Y~w5HI0yRJtLZ8bCMMe$e0hbYc)6?^6h}lv4fq z?Q` zyM#^%+uowM;h3*RtRgZJ*F&%wKG;?^)*yL)d2$(ZR7o;SrTRO-jQ5)A=~Y1-P^$Px zg`IybM(5Wa(JWV2uB3C>yCI^SKVYMjlvENN6b$ zS5xbvx=1R<)Tea{+}Q~dXolY+6!V8`GQ7LCWhL-YjZxNh85}`s{Pf!X+BuG1dP{yk z4)oa(ifA}ua2!)W4=ZhL7f zoCMc<;R8&XEf2OHtCz@JF=Sf}J(N*)?py4~y&mdETDc3h9>VAI1Uaq_()@MsoZH45RrQI>#f*EA`{WymUA3YtvVq3I^$bDWVpLF&y*HMEBCBC z6vuds{K$?AeV1^f5U)OltFltAl6Sb+yx2IQv^UpF2t24@%(4@uPE@)mZ29SX)6Cus4Ga#u7Mnjac_M*}uqeL+OzH8@*X@RKT8Y~z0Lw8yzg=f7mT#PNh&gViU_6X+Mg5BRV7y~g1$#Bl zyhK^gE_(klQtKcAPyS+lcqBhRe?wR2z-^J&&KXuDP}S4t3J3ix6Vx}@fr1s2N=vd} z2mFBm8nRgAtOOnj zZ>%&lNjmU%$tUvTc@N7U*C?BR#U`b%O7=in{CIO;)ggAJw?y7=}GP2 z!tT6auc%&(#&+6g+&oh&wa?=u+E&JLBN#tIbTGK2oMH6T437?#bV$A19||qJT8Yb# zG#*+Z-cG+h&AgZyIHt<1@R?%C_Jge_L(R^I&2{eq%j|{YZ6pOApHRf2q@`H+uFfrK z@av9ssro|ZJ!R{-57$;aTOb=Rl>zC3)MiPjFq)99@{{a9;)}53ReZQ3P$U{D*Zx6} z)dt*$ysZ15PGyUieT?$*17FkKoP-t@(}|~^`cf0%B&Fs}Z$6lzfK+@`P2Zt-43>{J z%K8KA|4?eSpnNSMge3_0);qblx*4pMf~TA4_}SH##{94>iq~{vs+( z$(0z!^J96EKblG)XB~fr(cPb31o=FxBM?jeYMaW~q}Cv8N?nfCJ+WudQt^{v zP|3+p;?p`SOEoXdO#3+Q9VEHFx3}T>zF#V$SIlu$Oq@A0?*WG*i?F3}q^%ZoQSS&>66xPA6zK#h1B znC6Qk@hjunUHC(j;*<=lUBolh_THOm=`|a4?>?QxtI@K_W+Po2Nl0pd1pn3)_uhi{ zT|-vq%HiscmC!X`i`A*Ds>F*eohIxqU=NSA3bczv9UCol`g*XgwNM#x)KP3HF@8VF zAa{0=09NYCaK9@*;55n{FyIT&pJV42e1l`n0#^Il(E8gdNAULYF>VA!+1>{-7Y6M) zZXl@AWDr()_5maeohykR&^Pt2Ip&8Z8WkOU`d2PNpCMvClH3ShVkm4Jp{zY=2c;`Z z{gM;S)!U8tgOvw*yu&s-6OlRYp7C&E+;8&q9TgXnZDA5NHEgwEM-BtomV~>?^}ibp ze%Hr)4T(Y3&}P_|o>LUxT+@imDWs2E?{d0eBpWsPrv$sf@KQ6Q2%RZ($i!_l97J~~ z61U0v7ZWCjSupMTQSt=d#-pnW)hU7~>t3}$U!RJo7E3~Vws;xj9P`SFvBAuq!x5A~ zD%dFi9e%gx?Wwhj_vV z*E~~?uL|K#5wS5lwq&Sg6Es1VZlLWVi%!nI_B~SeGsOcDV6Or|LFZUD#Qf&LPBFbE zU0k&1WEkoQ<#_GG0J}=-847;X49}Wv-J2lM0Xmp0)26R;BY-e8@ z97C0vuGG4X$r*aMfcW7q-02e)#H6nHOQ8O*@5ynA;{8rvmNW1T_m}b*3K-o*US{!^ zS}uMJwj6H|p)<0yz(lX8KE0twl`VMaoaJ9$-w;kb+?TnTWi`V)wU8I)H2o_Y1o#!2c$ZPG>5Go2?H5nRpwsD`#$izIwz386dGLzB#1o!fN_@&?z-B3+px(L&F@XG7 z003EQz9Q*m&EP(6At5f1NCe^411*(TTemNIf05YHumVOqm{c0x+G5L!8BPf*i z59S>eOO`aVo68Ks;X71{xefdGYW}s2VD#`*D6tHkSCYp&WjV0@wS} z)BS-k1Q+jSBR!pQYLf{affET}Ud2&)MlDSph6Tb@q+H{vq-z+WAVO6P%__V6T1u{m#zIfZiUfS-G%8G0s|034G2Z1L^X-iI z)g-P&NqD^Ciw5R`=n~r8NAT2c0<>!W@40WO!;nxs$#H#IT3xeZ+G&s|toYFTb8J#K zMo=v`Dc>+R6|b#GkO!R%T@c8#%7ZKXG-wU>5MfrpiX#4tY$j&HjQ#^w#(USI zff149Zc@!2Zw8CEGH=CeZnOL@a}8atbe@sgB}iDYo67tt3O;FNK^5cq+oqq(NR81 zx1HJi6`ozA<`9Aaug`o`&J8FDN>$WLt7Q{YqVRP4+Oh)2wczBGH5ugdjka#a{_c2M z2p=cbV>_7z+nptXV=AqA$Pb?Rutye#d44mgcFLJ;gpf`6K%-lge-mVYimZP6Tlx9m64vp`f_ZFp#bv4Z!*S{ zN<4dKd`?(1yKCa~M?34@5Bs!Mk5tlG)3s@~KC_&NKvf*?`Apt8u06756P_u}(X@u= zfpBS#A~NyzhD2yTQ?hT~2#38o4^T>yyLOff@DigkxD{UCVsk-0yo8p)-UHMq>t#Y% zJ|usBas^*k`Z(Te^wcl`N-49Wgv>q4<#2!bSgmAna zjcRb+wG#lnj;^!UH{!E0Mx2bNCGZ($c@-FgRG0j3whJnD+Bg79x0X2U;m%Po&V&-% zu`fwa%5e1{J~?yQpIwuS*ROJfR$qU~fKt+0Mm~hG!g6&FXY{igHlwA$r5=>D+4T?A zd%Re_3VZvo&Oage^vNis)N7#P9PWVa;>QsXg1RXf#zYRIoj$Z6s{uaD-`1Ap^}PB7 zbEfJT27^~15eKiqVS|;Q1swm&y>ew`(Cs5DT}v(LH#Q$I1ya{=%qS~<0_4a4uTU7o z_nxW3gR6;PW{W%xfAa=OxQPloK!65kQ+NiHQRyf<$B%gCNC}G(_iMKif~0zt+EM98 zj%ROSw!(B94=q0*CPe7>o|Vwx^!#a)M59BDl%oLPM@=QNeH^^ppyx(g`tT*KINH15TRCt9wq9soEYqi8 zS2h%|?fs9T^S{V&girhP>AvRyLZpULMk)^0Q~?zvSd!B5LW&OmBM0_qH_Tjdfti4n zuktN^7xI|RIwf=MeAM!Uzy8gs^Eg3 ztufnyg{>bC3U9&QlY}{OcVdj#DcFY*wJ`UJ;?kiCeOk^mot|dRC2Eg>J)?S5cLpjT z_f+X9RL2S^GK!_dt5fq7J%w%idfsVxfFwHRCPvO+QXao1x2P&Oyd(IEAF)c1?EP9H zsDrLWPPkZ3o`*|Q>(WGXh*E(P4w64zRsZA^zzL_BB>1dlQ|HfPm`R&;FNWnXagRqZVoL}DcNtOfOmi}d#k;Q$A#~I3v(TaFiQDh|(04 zF4g`Ec$0;F$}DMXe+qUlVJx z`y*~l7|^4q=3iDlWiE{QSyOqYnAv(4&%xL^NKic34xdKoxdSJ+tv4KYMN16I@`h?K z@!h05&;u(xd6$I^)h^AC24y*bFU8tUgMrWNlwmg z=1z7Nvop&h2JT;n`5KM}#>~dd1zu~ECv{nRb_=Uqy8JPqo~}I^B@TZ|*7xICA3-J2 zG)0$!U(5@AhM>DnOxhc%M@|3 z`2FPWk$yb~dgz$O{RG~xxY#~+|Nrf*e7sL3TnqOPxDV4(awtI`UwrKiygflyP?baE z`gpdD{i7X~_F1K3)|xr!1j!%a`8#}RLqC2+G7FZS6I8JSVcQ-CTC>Q&5e!QGdhl35 zM0ug_|QURzHf}Uj?)PYYl9?ndO$SbdQ;^hU%%H~NpL&sz` z-#;@_#EB`5ii0da$Ty2uq(Th_k9Jq$wBTvPvNm~Sx38%M&NN4OumX34xe}H2K+0Hw z@_4FT-O4n2*rRFx=mGDdP;6jgiZdA{W|gAt5l-J9S?D6p_GHQ;GSsfn1G|NPaGf>s zZP%{P#Dn$9vcBElkTqc}sEMQMAv9b5lXKb9|x%uvftzPWLEx9JC&R zP{_`r+={|jo+T~`UstsHsj_a5dN!1vBL|)Z<>sb>#O`i1aaf9mXDY_rvQCe+_4&;d zqL@0i;&Rcaw$fzm~pxJfLx7G6hK9A{;tVox(G}0)h4J9+AU)S6FW4V zX)gX`zBf{N#(pq*1vM<%ZQ5cKZLdRe$*h{3KNw`^p#_;~xZ5WGCQ;+@q#KMNwhbqz zSU^4kTGOXwTs8k+?T5cDnnbow<&cK$DGh*oOP!Xm4f|a*Dl{aRs(eg)Y4`~_|9zg} z%j^+FvI$yNi4o^j)zY#6yn$x`;y<-^_lowQ_Z*P-4Jakh@$sMv1+6a6D#ZkX;gx?t z$J~AEfdwCvT6B!OP%s)s4;xmCZXeRu#v*NKy+c#MpAG|xVUr=3llWBCl1F(X0$D%( znAAC|y5y_KOpad3-$u)U^MEY`^$rJ8XY4W)bnuCy+2-fpH>O*GA z(WHB$&$cD+1qA~n^7+&Nl97s)-6GWuI0lc8JcO{H&ud~<(g{Va;p0VcD{%{V2RJ0! z*F3nv&!uN2Oj2nLf}Z`CaQ`(t*&tY*2Yt{PMy;;p>Km&#;xE7vEw>7bZ*ZlyU&G3j zDpFXLO7>4=sAWuCe;4-f^R-Nxv92gf2ag221(_==ReV-vvez?D!1a9ET=;6e#D2{; zC1XD2sHQOvI9@r7tN<{>{7p6Xtva^>ll|#stzPWnb|U4;c};f6=Qz2W*{+9ke06CnEZuR%!!V{i7dE=kOkgu; z8XxCpzwVcK8ih&D-Sq2FYD8bEfEZFUVUR~Tyg+<~B+3QhRzagCBk6{#U<>`1rK}RG z2p+frf^j`cVOSNf`^=h{* z$V8%yON{YiF(tTE9?eQS?#@h#g{7{PyYH|TI2Y>YG`r!cGpCBV%smhO@k9FlaGxGhQ)D!D7&%et7WOZb8 z(w%ZC(xZtX7v_p{O64q0h?NmFpk)HWTKS$wI8pj_@u}x$61rH$-sg0|12i6f4CJJ!i^O6epl9;6#8l;5x+LQrZW!$L%G@P=Rl*czt_q#9^w z7Sgj-_XP$A4!)x|=0D->ob983{q1pnbP^Bm{Z_RclG|J^S5qa^p6-Y~)jUbXpJsvt zc4+$tnwqpvGtQQ^LF?68JL?;&3j;C;2LBk_X*asx@ZcJX3ZaCjFr-k`34`XA@p>v@ zx6wf6>cLKd@FO%r_Ak+HAcs>M?6dMxjI`v{G!A%CDvtx)fm{!%sW;=j;~*$WE#(-I zQ~Nkx)!=Er80WQ8`+g%Y=uD7y7Kj;<M!tih8|A^Zh(x zlf9n5xjD+R>@%n85GpIw$IU5JnQpyNKt^*0)noJN3<@j2lgQ(fLI+9cv2_Z z(akFshC3EXB!IqYldrl>Q|+dw9_8Q7^^m&Xh6UZS#srljKeHY>c?enlZ^UnisP)8311VT1sevcb=1kbwG zWl=#%Dm{iUXp2Q`-p8t-`auvM77yadJ!&%YB3j`WM-=?lnLHPXUjV5mS)6o7>khUj z@i29W_$jp^Sg1dp^r)uaI@a`3zY7{W*w_7WxVMx^{OeCrX@4bBX@C8-7!{z`|HmZ? z=i-O9CeQ+O&07o9Fhi*S-~q+_k3m-eH}majY4u@sV7=&5^KJ+{#InMWe~ivOKk{d) zYMxB2t0u@t(x{%LQDm2dDFM)8rN)L&qHeE(Qxxa=O)@fi8JK^P?>Fq^iTg!sIqA-b zl}o#;*j~oM22yN^X&e%BojKwE?`s9jdKp{;4Mmi>CVlOgE`L)#yCgz!3SuU5b*YiL{ zEB?s|tp(`t`C1l*K6A;u;p45SnGbjRVUvAMC|*;ZC(OQTub6EGdrmDM!Nj{~GX%)s zT^w2bvaxPF5A}1jT-H@}-l+kZ%!}MG)281eKcKx;xvInwblaD^0b!&pRmc<#>3hLR zbvjJxC&9Zooiy0`mn*;gy>q72lm)mcY$1YT&O&v>*RUv>*TauSEve#P4Lsat2C-T5uV8O4yPWEm1Orf#eK+@(rbS>@i=;WmqA&VnV=f6aY1`yCZ!{G%ZeUSJ6P#;X=QPu8$83pCcl1v#PV zt?1rFsun#dWr;meX^JX0(R$6&edL1J*p_9Z0iZO;M8w7)^Gi>il&0F`cn(1S|3DC-O>%3#0|y zJQ-!nRGpOI{SrrC={6{4P{Y`L3(jAErN+>&y81JB4w<<4Sxr4-sZF*Zb<}?(@X82I z*`%P2kqT#RB1kGmncn!sTphRf{&29#EaBFI&LJAj+V9*`QVgS7dxhiricIATF!zV{M7mC!Hb@LUk;s>3?`y3b9yNju9TQxrlE zkV~m7Cj^Z)ykAVSF9P5u`?>jwY2T;0)cQd>w0S!9uk-1;FfABCYddTfwuG|YaK}P_ zN}PYxgV&g`{Ztke8%&Ovm{C7;s*>i(t6g*KZqi1p8db=kF}<#pMrOF6XIr~~*pMDt zik{s>FlE(<)R|q~VF?k3-{491p3_`Y%LNj6omNMTLcXi?0>Jxrc9BwdNk&>aBbV}` zW{q6XT}Q}?2>!@`!AadtN7zF7s`tQ`dn@*NJ}F8|BNUPuGlgwbUMc*bhb77)42t_M zcYn{c5eLu^b_#Bn@AapM1(KyLlu|T_ukIZ-2%}>gOgjI%0i6t{(cRm(s6(kqqO#TD z(+jD21NUojM#9Q5Mc;oe>G#PnIw6e2`$0O@6u*793nZ?T3c`bysRX=C3Zjf9rgq@NW1G|hJH5LQZ4ynFe^MI}YHNZ7lpeCG#sm-V}RjS8g#84a<4 zx&l#zn4PkOkT#@t==s!tb`4%H*n@0aSqHvKi+_4{A8rKQBk66052o(SZI!T?Kd$%( zCYdQ5&3Z%i@{F-7;lhPRI_A#bJlUk$?2XEn%b0(rkP$GIX;tmvrS>u)q0ER|?t?>K z&6*d;wG;#-67tqT2`u%kEN}2>Gyh`NVy&e_M+77glw%5#UeVLg==3Zh@*JPzR_>!$5wurQ^7a(!U z^f}M2IjjbfvZHfE$Y63l;8ou#@A;|u^rD~Yv|v3SUsyU~sgkEFDpHDlPx9nT@|e~c z(ido;8@$X*FDm6=C=H6|vS;MODRkH?ia(Z$w7m!y)_MDy6-{zV8$%rQ5Nq<{;qDq5 zq4l31gF5(7)Ue@ z5_=5f)RS3itV+BsH<8OeT|*gIso!(q2?9QW}>`Q%))Tc&6$BFYwf}aFoy+5$O5?fx()GuHwkV$UKTkl0CKDcY7 za_(Ui>N%z4ypQfI1)$%nhkK6UcU*r$s{F^L%b4{K#6byP^Gn&hKgmk{mB>o{^*@&I zS~4KjT`%Zk$`WeIY)pFF{%gT2?nssmGNO$F@?XE^eYGTX=&-fWaPJzUED{kOPrZ2?9ojU&DxsF!LzR}l>F8QPz`Dz5KrQh(B5IxJ7QYZj8; zPL|FrEAz(cHGNBqs(X{ZIp2t8Gl8lMk)o$efN=p{j>76$e0nbXD{?|JW;E7LWD8g_ zd^!snH^F8@K9aPj@!VLu^{p!DXJ)1&8eYOlb26RSw)LL*4`8*x1G9q|#^J}?Qclx5 zA;H#h`dyZ7K0OM3BLrVhry!ctGdeNa65(sBc5k0CjIOevAAQ(Q zx^uK8JaGn`*q_nl@L+a*yWA#3NMN{hVJ&Ti3{?44Q}iK)WHddZG-)2 zG9PLDF>IL35^DqYml@Y+%WXcL!3ce%!_GGHE{BpQaZOqkJ1 z+F-(m0ZysdkM8e3hU>=SJI%A=goc~4IJH~h;juAYYTDy>17#hVvh6rQoi;YN>Zl|m zBZtyeMU0<}ISt!VpW&wmj5*mlS+F4AY##$sdq4ghXJHstXSTYsN}{ja15rU;8;wxa zrH3_5A8Ru8bRQ&iPEVo&(y&xW?#VX-5oD=~B)I~akP+NR;fbNJ^=Io#eWWxA5!I#U z&TM&I6DKNU1*K~RqjkMN%}k>alnQ0%oHCZf?O0K48& zQ<@=oQWJP3^#MQg0z`GVB@XTICpAB8j?y?OZ>>0u(J?B?G0j;N5+b@FaCT$A+I|KN2hX3;jwq8@*CsO)>0iTiNne= z5d0Wa>2LZbc>m0p8uzpchhKO?)O2WuSCoTGdz#e-t48{Y$)N)Q-n4AF8jXGaCg_+u zgHvl`!puBOpM(fvE-)9z%Gp4yqlQNk15H<#2FK9g+2+Ui#PQLu`;HFY+*3i4Cmc@; z=9VTfV-MTPWNM8ipcIoq)+RYD-AOyTIQE4+ti#6<3OeuazIy;POi0+w>@7g?S2NIo z#9qS(|4aT85C&~Pq~@n@rYBU7*jFMfV4{`GiiaLD{u~Vjp`dA~l@BLt;mf99Bnp-9 zemVp%wwO9T{!awueo~WS4`nX}3?c64fy{qKFIS++YWInk^Qmk6>Bf*OazsbxArID;b}AkSSGkY z1y0T?^_D=r7Fn<<5bsfpH1RfnqF(sKYk2Y%~F#_4G{wlxQY9YYY9@x-T?A zGDOwAP~>@mhTAU)t`Ys#?%>%EpINQNg>p@QTf5>DITFVxY;ll;TX0|GQ>@0927$uN zt&u|07xCJQoYiK|6)KKqxZ)b&(maCT{c8<2te;W|%$iP}P7{JA>`gGcZq*M`iWM2?@9RbsLj`tL$QJXdzle2;4RRuMlEap^P5 z5ftrQpe(d90LS5KCvqgZ%ptN)fSAAhq)B{iM7$k?u~NlvKJO@d3Xf>LZ7!);0%x3L zX~e54Ta>*B^4FH*R@G9NDA~d52fm2qvEdk*)LVa&-9}c8iyRDatr0%y=NAwGrKA|Z z_63Tfg-S4{8Iyudfx9yLg;(tN?UagaxPTfED_jcaH7a!19pOt$?o@EU=^e(s2lzc4 zKT~X~=y<^T5ciK)ht~-An1@ID!o?-gxaGf8zHWwnlt!ku=tJvns|lF-JsYa z{pF{VvjiG32sq*I?8J6;*ia{W3(Yg4OHEU zhBDPqvn3hg$NT7Gpt^D#x}9~>(Xe|VD7=Mlr-(0PicisuVKnwjGUDeoP{EF2%`I@- zT>mZ4qZks2yWO*4i1g!WT38??m3)s$P2`067LyaFnWJ7Kf}mzlFI%P087Jh`=0gTBOUSTvgH;nbZU-cVVX z){aN`hf@*Lz7)HL&%nii$EbE`6aj;#il1H?XBshw%P{W652txewz5D-$Z}&c>vpj2hXD3x1`~N4JER34acnHq~9ei z)}h=y5WL2>=xVf_tr+KvT^O7O!&;m1pek<8Mckc$m3ZeK{b>pvvyL({t^&7I^%7WC z3r^kBA}b|Xj+|zQQbY8_vPG^9gUMJOpuo{d8SGzj8)vl^ib)%z14y zy1!SE`Zsk9`fSl(D)BQRsa={i23kwiVY@)7)qEua2VA!pHm{tA3;sRoKY$oSbqAMf z0{{J|n!tZ2HG%(LK=@{naqN#jh6hWx{F8veUx|RhUugk@Pu~FaOUB>1d|8?^84)oh z)>+Sq0qONc@Qj9InW3;ajU0>cJTpd5wk}`Y@H;_k8onF_y<>~dwDw@Ge)APjwfeIi zevY*h3qnC^pRSG=W=7Fyi?puh^Y`jNJ2?R*yF;S~1;lqqQOQzvm4jVlRa4J4a;&%B zvk{loGBM)=!T^n9in>*G6<;erugQOwegLfo^W$L!Av<6S@JC;`fYNshm2zHuV~D!z zW2lQ+g4#vrDtIsYQVMg;-?2XO)&I;~%8%Ti|C2r~zO(V7Zqo-!bfKbKq&>txFjs7l zhs#)#lXBlmQ)@#AO7ycIgNg+&G6KB|IV2ca1l@y$-6b1|EJdoXXW3KN<%ZZnPZVCs z^@d;ev#el!XDBQUqcuD;i~8hvS~>X!H{un2DpM0m^u|?GF=Pp3xHL8O;2Og0d$U}7 zuxp1IF3yCylu79Rw#t0HL}D(FZpC7fwgSs(@H{`M-ReCC;*Jy1g=ugE{VH2$xBTX41r$_>R)_#cnqJZ)2Ch>%D|G_t# zqzkE(MrO20p1144Mv5-lI zMLSuo?@&)ZoR_lJ@_K2{Ho$b0jH&IG_2)n-4d>u5$j=2h*Kp- z#AC=`$Ts9PzKt$&WWHdb0us6Sp|qF^j;{J9A4?GGvjv$k4*1$x+y$c4vxZsbRg;K7 zQZ{ekZctYzl|gC(InGJ^;}u(DNfLRj7UV5QXoNbmi5wXQ%`Vg^$B0a- z9247v`O0lD*_3~NI#41-LI`jnawl-zqOuwSA!>uOUTfa z>7aeF>i+ECY+2=jgb;Ygdc$b5RW$0S*D9@7<>tyoG$hM&c$9U_KicjtLXCLr&*}Et^O+Ng91myFT z5w$A`T@NzHfObFs@Q*}Ip=i=n!aX?LNPJSfRX_60sUbL=uz;X`;VfhsSa1d>wGr{t z-#?ex#KYr*wutE!{E3;DRDv;j>Dla)d8M##+=l%u&X-!{V|+qDAtNX&G9bV{B(RT5 z)L?&vwJGQmj&Da5XH00?G|y$HSDsuNut*(swl%O-~S>O3es z6MOyLP2pkdUuOlsw79`W=HCkF2&bf(|8fT}jyS_GAq8YWL`AluAa8B*NX(Yt-k z-^aZwdPAKshSinSn=wk9&Lfy!y;H~+Wg?-JiTlXv`e0-!^iLx@G+~Xe_GAeE)|#L> z1}C)k)`g`Wkl@%b%YFuv!AoEt%XuiZIV{5WSB=Xe5D^^D-e~2M6LE?MBRq}LUWh|p zTESIeQ9d=1j|zL+MswbJ@i&D1a^g=o=}BPR0-!WJe~hm-eY#g$#;)B=<+ZpeN7sc` z*jqmJXe~mF)b&1z47R4=(?oWzGgGn5$P~UQ22=HcE)1va|4P|pe}T3p+iz@+MGs#*kd&jzpll9D|;YMWnHWidrjK>h{|DCwkU4Jsxf0u>qL8KxO3h=%1>Fh+_3u(~%eyZu~L-}MkaRu*`3;s&g3RUWB3 z469uRM)Sh|>FmpP8(Fezf2IGxKBr#|1OAl0_DcgsH_-NdCq)euB@UuSYNDi)L=7d9 zl2|1UA_?42aWMxz@fYr1d+mr!QdOr|284q;5}6qp8L?vzYp+#BU}P+Bi;4qQQ=|4J zA#gnVQYyZ9oMH!uM5%3}rV1(x_TM#IxGoDxQ%5h+Ni)o7Ce8B!&08p}y6Wv@cpq60 zg;K()_LU`96?DgGCvJ&;@iem;ZlQ?4PCC-MhFdpb;o4tk;oP6D+-eIR*$LJEO?|*e zJTx~HUWzZSye5-lC|7y)ZeR9}8A|F5e{VJNB;W$R9^%dwD75+DThGDC5RlY%(f6{Z{W`a6@_x<4ZL!*Y>v7F&2hC4WL)+gP zTM}Q|45#j^r$|0nhZfp`fAuqw&)*V}&)?D_p9vtuO?FT@F~dM|+THAAUY!~dLa(lA zQ1Hbesh=wZ?XtXTdTa9gnWqIlyJ0J_QN6oUGI9+}GRI`A|K^xE=mPn7WkqHlXMM}A zre4|#<8byqdrL_XI{#Ozd{VH8`gHhAFL*C&3I-C?>cd`0V5|_M5_Se;oX`=nFxfxT z8vQNN8vQM;HEJ?b%9e+&tzsz|+W6cCet0i#G;^Uc&6qr87^fa7R+~n+CiR5k+<*u~ zHg@~0Y;Y^nye~g9*To0<5O^P367_J0q}P@T+uR4AuF*A|f5h<&DeWD4(=xm9o#P56 zL5UiLaK9Fw)KNI&V?PW&fz={>~577|<_cg&{0NRB;z2ACk? z@6lY*XXFU26ge`L@I@SpKUwZx*MoWiMN6)AMl26v?#^=IW-o57S|X-c4faqRmWLGE z`OQ&Li9MKZ6b$w1Fkq;(%;y3i^9r0za;kesr}-w_?v*=WChIxydysGv=hc_s29>3_ zq1=hr_i`N+nnqPUmghX0w3IODg8J(e*oepC8@CfCZ`~~PuKm7_wpOB?(qfD=;26xW z8%786ZW+E#tR8)%^gIbKOb^>O;|92V{HCJ-AQIx|*;%S_7OC^Iad3CUT?xFOQX+&; zjcH~tX}?of4z;6=zBoQ{v&m2&L=zjbb`Myx`|gt_gj3}f&s!}9oMLaRwd0#HlJ6%& zz}QaehEP?mHt#kE`C9rdr)QXma%LyJySGf_O~PIS$UFEvV>-0Ay7~~D&}}tk@YLXC zFV|-VnlO)3ooMTT7d~0Yq(~fLsgql%eaN4p`*l#7RJYTr9;)-xu^PMY#xCqfH+K|F z#8ap&PyFQsDG%3|#yd(hq}Z0-Nq2;t8VrZ3BDjzFX(Fq^ZtMzlfGruA+~~`|X8@&Y&p~wi@~VqX%Zfqup7L-r-G74( zlW}vpKUU4S9XCDlM%-u=;Pz^1?75eMw5~|SC`_S3kz>r}^gPjR zWf`OOFJ}HzFd8Na3~!g;FpiT^-gD&hV1m=>v@|)(@$$O0_=Z_kIQ^3yz#KPWi1#AM{ z>+r{xq4SZoHu3qqn{7F*^O!er{lH5x`GqIAIhQ3fJ?czz**O%10yEJG+dZRupD;}W z8~chL44EVa(xly1yh&a4RBG~_*9^+y<{c>4jC3Zul##kV_6r9}56!a(3MtEdckd0L z9fC~TWxq%PNoen2HA(c*T8}%8nZqBFkQA_x=gqiUgEHFtVVqIvfX6y%6HMesM>5w5 z?vcpzuYlY`CfecTn8?Yl^(9>Ao0svph60Br_%c}@GYQI7F8=6rHTG|UQ4>A9N@lIQ z@IlN*^1r&4(TYP{e*Y@oxr{5T)3qvI*;xw)&zB1I;D@=J zF*I7dAETc)^$2EQekeO@8BQexHh)H@!8gb#TsJJ;MPnF$-y;*bUa_B_uC=m4S)kIx;%- zu?>UFSOBNZ3Lw=+)15&81xHuTi^G`V5QnGJL$oWltnflF(F=74 z!G-avA2i8!765SRGPzzP{g#dGw*$6Ai`&}evwdxOPonmLlX0ysPA>*yCNRtkeQU29(6PPYbZ|sM9G{Gi z#n8)c&TgRX)k_V`C-jxA?1A0It`SPPt4I*0?iP-&{8y_qRJO5uMsF&&sU7J|6sgi5 zg<5g1i~YDVj7sRt*OX=61Z6F+TEd*rDpYH6zAD%B-vVK7;UaF_BGsEK$Qw7dV)EE= zU~+U>im(rL869V^RShr1YdM^Bdzh{kHbk@w5^=PPkS(bC89A-vclN4GGn<;6(^p@+ z4Zq$`k4NFgO5{lAu!>Oi1{U8Vf2P%EkZoyKnSu#FPu>qH2q)i#kS&h_xsj@FV*$&Q zqK)~G7e`Y>vnMMp5nGkB=ww8`Fk>oluSVfLP`X_TAnWjui%2lq6-PxB>}1U9e?QDx z9D(vPLahCuD$G|E3u>#uSq8AOYeg~Ts7(}`S~kAzkR z26AkOzukodf}%C80aD91NV~`;el3JwS1dPlb|Y^LB7>irP-gq;+rkpC@c*#4lMvl(mFBFj{Hhx&v@ zym505N;9;RD}^H=&+15mxW0Lvs#NIgmRn@i;_kxSJNTV~?Mi5oLH-Jij!HJOA;Y7O z9Q5g=Zv~HVip>Y8HK&>5Byzj1`&;Nz&eF`0dBPBHCta$45H%Am?Y(Qfh${>n1To;s{q7Hb3IIgTn@5)E*4VZdOwI@iReDJ&IP}yZi>t zdA~r|x#=)r-M;py0y1SEIPDXU%SIN@SmvXgg}@%?2P(`Do=Mn;`uuY>Ea@3gH6v)`yr7jIL$|u zoHd<`X;HV)e3FYRI*-Pt^r3kc;n#fMRJvw4OL0@C2btid9cYEwDwO#fpFB>7`184$ zA(euQ=XolGnX|YF<3WOCgHV{B?j2ZfDO5Gw#bMonfK{-!IWze27X11YS{_Ii`6c>H ziV0hpX7>Y$e%Qn94<0JqJG<-ISeUd%{cQw|J9g=OO9?}J!3$p@{84U7nJoBP*jtGl!5z};^ax-HSfn!=`DP|^eh9u zOBiuA2@VXWVP~;IeK&&qT;Gjtqw$fsHrfvhtD|+zu(|<6hXMffug>Jrlc^023(3+> zqa9~8*`*u8mqYX*gy0$LBIt138De1lr@2Cis-WvBg@#RJ3b~GoS(jUTp-B5ukW!iC zx!~WJWA#ij>S}5z^F>TaSl2#|t1EE8n~!O=C$+D200uxfvX}53>2s;qRR7VV8OPUV zhD##y0t#+2{RE=>;iTh3I8-|w(OJ-YMT4wfxxsLGBQCp#|6 zRS&sM>rr9dDjh2iX_Me`%|HuA)X+_i0SPA$O(tFStuaXgm!jlyxG@rinGJIW>|-W= zE*WcNM-PBWRPvgN(vV2IotRU#;)=G;Tj5Qc0X^f~f|^uta+Pi=g|D-tIqaQ{>27Y> ze8f@9_u_videA$reoY;ajo_McvL>K4A?tP9coD?h%^Z(0R0?DMB8xjody~Mi8m1z)^MAyz(ohx73{1L4<^&q-=`QK$;+O!6?6F)9> zu)!G(d9U>X8RzrO?2W{_;hp%_=jl@IJH47^ah=LEG^Z{8o(joCr@M&Hynb{-j3eKFdyojt!vRNIJ zlC6A*PPyAG(i5)Zi0Ae5<`RzEbf}u`)nzVwH;9R&!VlT&Q)60R?=(#fA_oz_7M>g+9e;K?rnE>)u z1m)XPS=H-&BC$!6VabX@slqodGAu$rH?_+^ga8Re1H^fkhq_PU$;gv-o3SiEqV9i$ zOny)h*ST*u(skkp6}HW~>qawmhV-H;Z%3zHRId?%Y>HLE2gLCmm8{@))Cu-B!Y^4Y zp6*(BdWheDmeZr{PpA1i%8oliOpUa_cSiU>nObl(=29^tuX4-BisUb}Zu<{~yC0iC zD5JiNw5n_3C)_9sG+M^~z}p60jf;b)7hx()T|{5Yt5k#`s= zn`%59gr^U|JqVXI4ibmHJQ-xeHSKguuM2rV*)B@-KXWJ^*!ask5Fg2uR<|WST1KfD zufWv~NybJN4D99w(H_Ut<4%Kwt$sPoj$IkA$vVZ3vZM>Q(%(F9y9&Hqu%68= zf;70obG+BZwiO8TY8pZQWQ{K>_5t!2Ro6)lG2pW=lz?z#hq~h_4$9~PHj?qvJ588f zAX6a|qE%38a`4}C6 zj1z?srXKm{tB&i9XY%_9_TcbhT0>$~MkpKIwV35Wjvl;IMzvm`r| z53ChI68ZU(_@iL`C3?t$4%2lSveK)(t10-hdlq9yRVg9=us+P^8UqLJ-gCIunywk= zspTRLF93Gyb)(zz;^VY>$nXJo2B|->Dy-dEPEIXYbY7+AVvrU0^lj3AM3;h2K0O*F zQY3zpse9ZEZq=5ni3K_A(HD}rs4Y5)SFWO?T69>Q9*=@?F^wrs)Xc#Bp&Mbp=9h{E z)wv=6#OYnuWnajHsS-P3p^U72?K*y|BR{5?FMTuvk;x%X+D^Er%}a{p;Y8YdLuN^r z=wwt3GBsruUSzv8EUSAKfK?S@#uF8Ogq~4JrU+^213l#X6u(8{TnjgH_^S(S&`6?F zlOscUdB8tf-chaqiTzHO^o!G46iIlmivd79>_!xCm?{n)GUZiU0*oQ0I=C0_$J#*M~SxcTF(!;KGjWxv^wa&{% zRg9rxAI`uBXC6x#1&Vyzn1hzUoPThWu84V zbFY%nfaWkL9s5)yq3Q9sKCPblgOy9pzS}>Aa0^2BuIW@!p1+BecQ1UuJXr>xAzj@&q4mf`=dq4TQ9Kk9TNb<7j{urrD{Y)CTjRN7? zbNHoXtjYQTk61@q~4%gVv9F#U?@Ww{BS~cWcJDV_T|Dp4yH%c(KztFXq zKmHNX^5nf8H!st-n;yf3AWdx2Y~EcuU8o}SbpAE1eB^nueefNgseGkMVq!=Kg(R}z z>)@!6*TX-|j0`VWSH|M3R-yB$Gr+QH`bO0H3c7Nlouu!}JV&^?Y3|<~uM6)^{CI(Z zmv&Jq*h4d$Ofh4L*1_`c0Up@AOwBvOYzQ+d@()|7Gl+Y)liqXu_PTsGGdDO197rA_ z*P$UzJKmA+DP@M2pO>i+SBg~J;+2tfPtRQO(0p7TQNa8f@OcCDj@RJCvgVvx5)@rz zGjw_?%(YvS_~il{`K}(X?u0MBD7zi6Xrs{JtL$`7mb`RMs7xyzUtAGLn!Lg6W3XNY z|57)vGXyh(?#;+P?94Fr#fJ;BMTx^H~-J6lg(K4?76FIWb$rt!uAg zCKFt5$ORc}dP4+n>RrRwwO5HUh#u9>szOl2g14PMMCmpt-37V}aL#rwr%^Zz617!H&n3-cl%^nXe z@fvj;J)^(oHNknBQcUMO$kU-cgkZ4ITA0#=OB3@ON#7<6m#Gbqa@jHBd*=-(ufYL- zZ|xtH|Qyap3ql!n2H6zh8(u zfF;Q;7NXGqw5}MC48pypyv?OYv}a2$#XJKP1}PFq6vk@>a>uYB?>Ak&rqYOi7A!Wje5|o?iA|=+4>(TGWdL(kaNg6{*;M<%M z5=FLHgZjKP=e2rPo2^Zwd%(+rwn-vj3GQ-FY-2@GwqIG-(0WY{qo53zgKgZw&4z@8 z>AqX$QgA5W9|w&Acvj@NkuX6*_5M0RJHA&ygLGwvbx&a~sAe#NyRVKo@d3$0bcNod zvq;O2@nt4@KT^J&oivWf(%mdkwl0J60oHa`_Nf@>TN$mf+B9}~ezEs7ft57C;0JjY zZN8rLwq_1{gM^PFGOg%)x`~SNNtY-Gj%ViEb4}x|g=kUJ1%x-7K&e-FRUoWK7fzHE zJ`E~N_P(B;s3>F0AEwJk6Q>V~L6!y!fYF)9)RqPSVO*ZeRL_G)fB)y7fJfy64m|q% zKhJ|lIVID~ra0Zxjg9FF!3oNEf7&J&ecbBGUoju8GWapXZE5X?*(dyWUu$xek{l-R zww`X7`ACDXIE4V{KGotcZ5n2Aqn6!6DI~Db^td_ZVhK-1{$j*7N*0uGBlKHx<`m_=945>@d_1!8t&j+aW^#f5%p0USpmab%! z9)pMI@QK3LtDs(5c-6oC>{b7kyz1Z5B7qI<`8;iN+pv}}>77Njk?QhUy4*K}nXdik zM%Z~__jFLa2#d|>?SV}BvafEQf-K#-t`&|(e0d1teo$bYF*?V&n4S`=FseKzMI$+w z_-zMi^kNxkj@}psE2Vs%fIicAoWIKtV6MEO?|}wz%~LEX$Lz9?{@#yU#o)RhRo0j6 zZ}fy=R@2E1<-258G0!1o1}!F)@IGH1uibbvi)z1m+8*J=xKA8Ny7x;~h&1YX z!tp2Z;0JetWo_b`*_VNcUO$X9?{F7=LOiwA$B2}~7|5-DH!Ys6dZ;%>NcM6WbZ_}B zhzBS;-i(mA@~8M}3#tARinc&FX`3C}c6{SL+~)D6+yZ`}9GCj7nbHW$09-($zahx6 z`GWj+9}29YKttwDr#oJ)6VPz z6a}l|@FFaK4a=+PwqZ=KiXYqYs&ruZW$FcCw#9F`*nlMM<5uv#@+~Fc!UMqY8se@y zi2~neJ9EtkXtHk0GjQKc8C6j)kP%`V2xR-F7&*^z|JI38Aq_mqf6J zt|fcXPy{j0*88Yw7ncNKm_wPjd9H}*=|-3&ulLKs=7ztGjEmDBmSBhOw#w9{zel5$U}#pv6%WcUU>ZOazl zgfh};T???NnEj}+5B>V;0%LJ)AH-X?=qr{pT`bD}XR1#44hN>v9g_e1>)-zU zzyJP^KmEr){_^jC|Jz^x>remrm;e69U+|lM``iEhKY#tN1?T4XpE)ymjz{weSa^RM~i; z>?qY|N+YsdLs+5(qI>@{ArMZZeS2De6|+3)Ni10b##0YRS#Ye^fAdNwZme_ zVfx}VlDe5~ze9eZ>^^_8Sf=G^GalY9Bzx!5UjuEG(&Mlu5dHC4Y% zZ5|$Q9vZGXE1T1^8gmzl&pzh{=2P=!(~OHLj>nH$&MpL_wIsAG=g~L1S`Ir~^0Pqj zk>K)Qbkh#YEaF=`o%e{>i=NQT?7tinj&R$;-e1Wv>K+&cW#|)<_h^>FIs5?#eqnlN zzLAQjKfP|>{Jg4xcPk;Ke+n4E6bvA7+ULKnnTo`Ao9rO`z>;dBE{RirHD#mj zgWBsiLjG`oD%(>!$&j?Ly}cNXpBU~B=K*F(+nJdGK#ECMQIw)$@#|CfT^^4tmn|Y= zgKgqS8jQ$F+%ruR#hpt~f}On4@kV7zuk7VW^biGtNV#z|JC{D*^eLDHN+@G0+mL8E zKa^w1XAl%pW%zNKOr{KY?m|0PIV-t$jE?%GgO2t5hF``=w#-kR;rkim468v8uKxFj z=i>;kyd{x#ukKRrZ6+IS8Jvv7=u037QnZW9g)`{SKRbi|oSZ>_PUljd&sCB;3lLLg zO@c^uY>vW%Lns`T-z*LwnAFl{i;e^l(hFb2V>#k{+Z=LcrM`>LKivkkyRdl0nV9pM z++Sx71I^2#Mw*qN^J+32%LR4vtoaPt6>Z(}X&g3C;1%uF;+7F!NBu9*U^?AIxBZq9 z?6_BlF1L}(y}36OaSUg`P$kYg^DVT^sT*qMw#v!&faLuB%vjts^++6r#b zi3|Wr`6=40*-W;dfrf0fzq@{Y6%(N99atsbQHK>F8?tyoYJ>E5XJnj}rPOk9-E9`V zHOf$Fr9t`ALIznrb9hfk0g9=9R9m@tvk4V1H>64T6e6`ZE84r)j30H={@D^4OR1owu~msB3OU5^cNlZ?&3VNOG(~H z{+^BVXueRgTa!#YYQ>qa)0b>mt%_UbABt)Nm_yA$z&|Z*hvm!khnLI#97K1p5MJ<* zOwyXD`lQISOCxVqB6ISsgqeL4G)vviq##&3Y>TV;*^iS_5Lhq@I0#1QtVfSD=JV%q zjNevws(dM!P-?A6=Bue~|MG!QUh%w+8>PY=Jk7C+YNN4vM+ zsI0C8^&HVNpgAhPC9CUupW)b$Y}T{O`KcJ2Pm>cA=x2r;m9lz4$9nRnTr&lE*WU26 zhLFwynSP1#!l3xwEh*4;Gu+QdiIyOwHQ`saI=&l^A0`@1KAbj6bcg{@8E>dS_RT`w zMG*t#pm9ebZ_wz-KN@ZDtRIc#yaKCI^WIDQ__L9Qkt9fe@R-4+y!v*yd6f215+tRJ zSt&rGgBFVk)6;W_^%q=?pNaeZo{0PXJ}>T<*ec{&FFKRKj=E<`=2|FNrt8yVu=XWb z-_}fKe__bp=;9yxNsHRpfc@QOe{h$4NxxgUyH{=03G;*5#9;K+vfe3eC~F_x;MH1O zdJInwVUL+TIq8aN$1pbGImKV)2k5f!EH|xHzyhR6R37Zp6D;&JWC5Bp@%;i*I|;ipVkzkx23ONeS-YePTzj>8z{we~o3=@J3PTqeBDwyNBT2XP&Uz{nbys;yW|(*E(5( z9HjL-NnsPLkr~wp2P_*uNZWWSB^)ccS5KclWAjX}!vmV*XRnTuN;KrCMIY47Sbk7B zd;tSNcytq7!_6>gvRsPIFqTTtHW-aU;eY1V#EDj{5>p$hHf)eJr6H5k$|VaBv@2m9 z4lGBl!sHCTND=qc^BS{mFOLSpRzEy>R}yor!Ki;5lwXvi_*$3S%g3vcWtC%2BjmzE z(@6$+MaL73O5zX#-J*07a5h{A1&BHPt7l=!3Aor_(`W$kKp-V`7?Fm^rB2vCLmT7? zIO4{N3_i{%&ySKC@rA;h;`y$`WZ}U^yxEt7Pi8Faj3C+A{7RWg%k{R);n_~mU$w4u zR|NEviQ5f#5sEiHkpDDg#zJI;nsTaZrVc&4Ml0JIom=gShx&qbRp|J zOL|U<9FpoGqqR)j)FkP~0qkbP+2Fn47E+*C2ajDNUV3HMNZk+bk?BxkB~&E9=rFK%NvSf}020-eMvxHXGN*zBQY(%!Z?o)8x3(r=_eW_CSL3-Og)s;LfIY?8f=)d2DPb9B-=>G!KF_~ac8JlOykDU2czBAs zd8UkxdzL(PSyEkfxmHi>!JBk<(NMuI4z(dhdqwgL47k3KMfEh?n7}75tbJ-+WKR~samMPuCyswU( z@obo3Od|!^tErgXrJ{TNmK{>XhC~O!jwP5NDdXB0NN5R0!sb#Hcc=2SjVmzGIa1&( zZ%1!JZ^zC(?6ORilNOz3VP@U!e61$^Mo{Hl)qL6Osw@dg24Vf{YYNt0qgMd^2`r8p zM?q`3-3pv;gD+9cmtXuizGXwHn8+V+WLtyVx|I&Wep&JbEeu3Cj+m_02v6-_F&C7Z z2q=%9lVqmGyEv$e_28^bgSs>-{@n1Z4qVEM%mHZ2+cAngBh*!|@1uK7t+#r}z7hwU zc@0m$usnff;#3Pv7kJPBENvcPt1gCfwpFi0YaB*{NEQ$?e#3h?#TrUV(z-3 ziB@}9a=7?K%}++l$s)4>#CG0EH^_gDHuFLM(3l1&{h@rf#N{Tu4)V^o#y~jS48wdm zje0d;)+p~-Ba;G(sWEg5FkR&b$}a$+^I?(vkD5}efUegxd7D^$`Rnp&xu8^!+iM)v z#|lOGj>-#g`{P_1uu9lg^pKT^i6?vlZj>`bZBlS>O0Ld0r~Ra?xVCh@GSeaJuLDIaUahX!#2=*M4+(Ec$?Hl;X`wQmTTL@-I*lt3S_asClm_Ve ziUTBTQ}>-74m6qZAph{)d^1m5cGQa2B_7&L{|UE{>+66Qz8($Mn@C+FJ&?) zNsI;Iu0a`ProP-OD+e{a`1M!I!aJTA>s0cWm62aI!FuAduzWS1_K2{qbPE8QwVl6% z)ukqA=7=`Etxi_&iE<7Xj_B`DveI~z6ay0!3p|#A-jES~fM${OV|jGSf&jx(q!Uig z5M?#jR{4i)O(`>fn(&F0E6Q|}HF9&u@ogJdTN{6MQzopS^Duv`edBWn4Luxs&&|o! z83#B1mLh4zw@90&3)b8hl{#nEhd$yjX`p@=%!TW3^y$8Y;N5!R#cg;RpX2ac?SlJ3 zZ%uNjnQP#lIZz}5(OVk7OhQXoDd8EFT9Ub_nFq$W`KK4lFg|IPb$_MHGCk}7M<#FZ zWq>{{*Ms%b8GvbY!rDoM#x5eI60zpy;VmaTxZYr+D%}KtqSb#|jL^CThfv6V^sO0d zg_#>oyY%DLV+Sr8Dtq^V2gmuIPR+6Qd0B%@ZujK0S!QQ=ibA}sW+o`^D;0rLz$S-L zsgAQV05`P=j}bC%G4YPm%yeIKnWyz>t&&DM(Um}U&uLWnbr|ivO;i;J zJtB&*z)(wrsG3uvBjmp4a2d*Dx+Hig&RwSI!@rZNIDSib&9bMc=&T;IH6Sc}#@SAs ziweQO+Z{KixvV-AS;`gToXKRO1NEtQ&&bqErwM+dT$BEkS9}_gU}i@av#f1ws3jf; zCmuw@Uy(;+tEj9ru>+t)>JWt#<{#kkIWkQ0Ps|jC&N?n!JiV!>bx9Lb&6MoKf7s&l z?gQY%?R8y#mjvk;cuEG4TeGPHNb+3{XE~ySd<|ga%@G|FgnXkD$l#426^ebAug%gj za;+Pn*L2CDDg#MVl{!-{Hgj93l}U)ir#0nNFB-^K%fQq~#AxlQUAGpvzz}nyramZf z_R=3qfCMVnfFOMSGt<+I3=bnOJOqUk(44f(#B-WEruj-r#7Fg$=wxI76ESXu^YC?F zC-YVgyM;l1b1F-wzw-`WCCv&o%>K}G{1vPqptURx@ltKmAPKG?kX2kQhZ5e+(~Sm4 zFTwk2dT;uGZvmQw^N2`MAcJrhci5R^oyQG%gELow(ar#{o;o@?!WxVxrgY4P^0jnJoljS1&4 zkP19Q)_blJnLc{tSln1irxqX_dR&S6w z4Jx3$yQDX~|M@au$DTI}@$fzuf+=QiQxdKwc@=S2fY2=>9Fv7GS7%2!`|lcLqRPW*xHj_b2(XzA0^Gsj2_12@MlmqNhW{b!o>94rcZ~yBJ)qgMYO1p7g^i%Y}kQ`nxJ0 zq|1&LO75Zt2zNZY(bi^ASIGtoih12*d2YoYObK_8mnfWOj#2Myz4;5+X@WRq)2D#L z!y7~p)ot_tQE`tFyXE;@Ul$b@r-Pm8 zISM(L>B~>32r5Mu6f9LC!fV&cg6IT zALmLh@QymL!^+$yv&1WFhy50ru6_yf=Uw;38jpsnW{_pVt4@nl4Dxk@{w*wF4kYAe zAmmTw9WHQ^RQVJUYOy@BmA}|qOW)<3NE3MI(r6sk_h2L}U!StZf-N{DnR#sx_nmC;SJHhmm zxV!Q@pgvTl9C9ns(sP=$>95!^uNg{jbonQaM{aFCbvdt;mo_Tj<%aGznXwxx;f^TR^+oa&^HY#l>>~qInv?C{yzXH@Tew^NneTv9> zHS@=4W6nO>39p`o>&(kBsTtRX#Ki+ev-1j;r82Z%i~W{f=vFG-y9E=nM06K?m7B_EU}0%1^MUb(_P$q(qHz{eM(4sP;V5p zJBM*D7Z!%m)0Ryj)e1F99FG&Na4J{C&zHpFBI_{N4Vve_V0|6FB^+1zzLakJB`wY* zTiE9{{VPi2Yly}KTt;4hU9H|5`?aKhCbn8ycmlfjz&uvQHn39Xn@ zCSvBqAQx~WcE{!wh@Zr9cUoC2bwFLY{K>KS-GrS7iX;bzyVLqBt|0D)@&@9NXT!g2 zSovb@%9AdcBV){TOSFNi))*YR-3L2*#+OWXD$*$v+yM3H)$QpM$>tRgl;^zH2%ys) zUtCS^J9JL{tYUIx%o^{&iSQu*c6O?{PpAw*Nj+IA|ME{5=fD2TKLO+Tum2xVO9KQH z000080L5BKP^)Dcq8EPv0H}=t02u%P08d3iP*X2dWq5QiaA9(EFfcMRE_i5kZEVE7 z+io*imL_&@!0(Vw-}GE`rGk=pFsf?+_Y7bIV|!q?VH<`os=KnL3T|ihbY;7{??_1$ zPa>%^C6N+!qR!$$;xF+e5~z8TF7Aln)&B}!-&zryK}t!Eq8l*qR~AJEgM07Td#!Js zzV-8e{SW`oUw`xee*d?>|LyO7__J?~pDld*&G$e2)$e}w+aLbJpMCpxKmPhp!{7ev zU;O;P`Zxd6pZ~@G@$dibH^2FjF8}xc>wo+2{`)`w=G#C0?z{hO@z1~e?%({yzxn2W z|L^|dfB1Lb7(X+<`|jWVkKg{6|HU`oeEXXpfBc*O=DY9y{_p?(XMex=v)}#gfB5b% z{^#%h0e3JAe8+wLvtRxAt8ahtbG|i==7-<^*#}=WB9VxE0hfON%U}Hhzwz@QfBWNK zfB%c0e<%OXZ~gUefB3(@`OV*c|LZ^d_Gdr)?tl65AOHIM-+%Xe{NKXDLgZ(E_50s{ z`_12e|JQ%^Ex-5s-+cf5kKcat<3Ik*_kZ^7kKg~pkKf^f@90)P|Bip==YRRTU;U%p z`8UQd%;%d?B26C|^cKJQH{bl#U;py=H0FQ!?Js}#m-N4He_=g53|rCB>dnu;`~6r&Lg2Q}-YKDs(ouT53&srIwVm1!Ji zsi0abs?ivoy;w(Us&rx2vg-2M+&fgKE9OB>Ze?#3)MgeJ>{P5&TlMmC!LXg7WyK7; z9r|6BjSV{+cH)^{sA6&0+P6A)pP%jG%-Jr|Y!_v=s&u1DWjp$;;xEHii5~Ch{(vSn zY^7;TGoC*aX0K7nfq-!SyuIiik0xAyk7JxpP$>(%(*Sm+?Hf+vhcL6RJ={kP_4&l8noEM z)}6`?R2hRCtz3)}8)hkm$sASbfvftietMrD-15x9Ez{tZo!$Q2H8&E@Hp^eqAh5?; zQF(23uGD6dHh_vh(4RC8TFcS#xn0{b_Y<_^#Y*kL|+A$4CUEYljp6Sog!N7bzx84eBdxOSmr#h;F z_pRQYxnHAkTd^;yRR8=yLo){&qJf6~a|Wu%p&IewTi(}D!ZU{wrlEwLp|m!zpZc$M z^O(fiQe>H=+VXPP5o)i^Q8$M@n#+8C5RsXKh|nM+?jTmp#{{HmXo00_D6}90a8Af> zS467WEUJ8s{*5kj5XCqxUHd9F>|WSsH*~?UTd~&5R(BPT@nM&~j+=a`s%(zlu~ScW zeHGjItz@OH%}3geFLwxLWO=) z&e!Gs!%oNCTDR945JmYk?p$fAw>C?Mv}zrztv7w8s@AQ3+I(5D&!VI}Mui)*a)G71 zydAy`RHADhN98`aZQ;efj$!rBqBHcwP(fh3U4X>b9*#fB_I*)3jcD|iDM-UxVqkJQ~i^CxF(Sp#a;SoHoRJ?nqY z@6FbH22`K1&W7DOVGr8XIAX~JONt%3vyXL~t&|OD zWy4X+>N2m=cfbtW8~Qb2KrCi*T_x{nGJo}(U;gmB-~RADUE;p{{qMi00glSgq@ba! zQ&~G2H`nrVjO=Q4*vY7TYqXQ2!-NC6nZpGKHMtVsJ!oQu-p&ab3i1L<;!knz(-4f# zHJdrB7sXG~a+%3ZT+P2U98^iw`dFXY5WoNiFdPs-vmr=gCBLZ4dlDZs8yY5UCcE}X zx|K%#tH1lJ-(YMIBfAayi*}!UgEk&bgA|E%*>Pu*wQG!t^^{be6h+0y9A={f1Mt9b z@PV00kxEpXdv^52JswNTd^{pS@9`i#=4|?%_-Jn+#{heJt3YCu5HQVw^dxUep!i`M z$G|*lj!IAVYt1~^5fo37*DL{2tHz3T*&p_fu$$lR%-9RA&*#a6UX-VYzexIzW$%?e*D|-zxn0g{lhoTPki&M@4xwv zKRAaWUjwk%T(_?;XdBc0%W>a->34159;FzjbACS&`Y74G{&`TvX#v)LmdZ)A`G=9RyW~m0X%P*YO=yeF_ zSe=1+d^T+52vn)JTbz;Y4ZFVS!|)^w}7TQ6>P`tZMBoc5hf$;>Co(*iZx_)2WIoh z$7tp_2G}z&fg7N{H?ux|X*OJ7t30qcHep=cCK?pGpD^5Gmt-Xg5IU7&$yz0nJXrv{ ztroqoj-z;d2d8%9%%X=#I;7qjzU_<-*X#l5<09Q;*nP0NhpM_d>=#ufWmO*4P7Eio z+cY;~D*i&kM?D_+nBi=I!nS$90VtzlT*X`J2IoMmwXuap6FBUc@oO<09c}0ubYKp2h0y!nNf7ry6Vbfr19Bj zaO+r|bMwn93%xBXSC>yAED3S7uJE)6Z+7brG9mHI;sThT!F-1#gSDE3m*yg;l2x)e z=vHREiMu5_bT`@&Bs9!IV-(w&9$vixd^I@K7toyv?Ze#q@(P))w;K&0@l0=u@RpxY zn{?#P@nDk&t&HG;EoR1{&(}h?d&yZdo^PWK`1yJ_b1(7qHJF5S|co?l|jSLy?8;r&w1F(r@VZIcaiH7>uXYHd|5 zKvTx@kiYp&7%rW4Ii?s`?wY`h59jS{jlBqsz36D{(ZPUD28kWo=QM3XCG@!9a@xl6 zH=oZ5=9;MkdLLfGgBm?ayI<6+hV^=_s{SjzPwR!n;B8 z<5iU|!hCL=03q!iT1N?(&-^E?;;>hs>&0%-5pI49J=v4*h|L>mPFFrA`#P*$C5wg9svd})Icc9*ew;Q(9=TW=CSVZ-vqOdi0e zoGSu{%SW+$x*I-CHt6q>O=_s)!pOT%0J8#~oV&9D2%BQMSrcZrLem3A)1mIb8 z0MGkbnWdzLH&*7>+QHuEvSLL&?v9F4h?G*pu66KH<4pB^D2K(_NMI32U@`cUt2hZ2KOD3Mn?43NTe~kp zyDz%h{qaIwtw@yAyg3_o2cnhukU=#7sc*gw2L)9r;LYBVO5Ow64OZ=o7!0b-6DXQa z5u1_?Fsr*`o|II!Y1U!@Yo(~2xU<&SEyu5igEKrd*KwqJ1Q`le^W56G8WM7BmkIZ& zN?Y`xS{q2jOGV2J4A(`kk*QB76NsbMG?R2xYEX8CCT#>-GLppfkLCiO)w2)VdT}=T zSOof5bkWB~!U#o{RlCWdib#ZBjS6tFJ3h;jWX>`3kJXf2 zYeAU;`44C)?1eb9VqX~ER#b0Kq^@;4;MnzseGwV7p-CYi_cXv4$k=;9dE2?-MsCU06jyVPuWt@3- z!(tD27^S45$T?wO9zi$9k#~6{u}WNgyd|z$xcS(%OUC)omr$6k1(%=&mt1?ea4kV3 zaYTuiY}ieY16vyiY&o8jY;4#{O{J8W57%b%i8P4HZ`u7m9%rp+bvlUT4^|~91xnuY z6+)42pzd^ZzK&0G>ni^Q7e%5&CX!uk(b71HF7C3@r{;bF#!<39^=MSRf#D(Xt#n@;G`$RVEuL2t*C5)Oii6{0n2E=&cR&A?L+vK z$J!BZs9igOpN!K7=wf|yC$5^mu>a)qE@#Ik-J`0)dN~8BOF;G3^I1m ztQQf@d)rYBvhE(#7Cd4AaoK(PbaX(cs-tS_aIv!PhEddA>x&;IhN+5@Cy^)F%LwX$ZHKdSZYM3ZC} z0u1TmD3OQi_RbUbCz-!FXp!`dN)PBVTtk1pzpR}R%%$r4quou>^5%YF*hxuz$4;&z z%A3ou6`GM{ipVl~ZwH~lfK62|XnJPh)Oz!g&$c`pyDS5{EW3V%@+$o>ov+csfN%^% z%tq2m9n$f%8d;4a_4Acz75>bx*!2v_&0)7|$2R1niM2UPLM76aHWFs;8b-7{cHR+i z45cg1V_z>ylvm}GbiH!{{YvK%3(;Ejy%4j((K5i%a=^{)yHMG4)qaspV!u2?>J1Lz zCa&$;{Z-EB*;nzVs$|R)m>1C0(G7F;*{&FyN^4ggd0* zEixaT)ZhzElHdVdi47BP(mqtttU5oD`@2?YG{x&BXhS6A@1JI9vr|G%lU!W z*V`-XVkF&rN&_IhPya=(BrWFV_19jRe=$cQ4NE#WRQY>r502^K+o9+TGqppLr3XRs zkA4Cp9~_#euQUt#uIs06sLC6zfw!ask0X*#cg<7|-ZLJXxpKos_=BU^OVMGkEGe7f z*LGaVJboOER+|*Q9=skTscsq}nVvF2yi+|H9U}Vx_b;4|4ma8UKe75bJ#n?U!Li`7 zevMQG==|{y(Wi(S(@vwqP-{BD34T}@Wb)G7eRHD{Shw{xx(^w+81Uc~Q4JEpiPK>_2XWBuSvPQ{ z*|qagp=uSYDxO02!j~BKc4u9_%lo0E_R?Q_F?tH@yxT&!?d?=%D&wbj=wQp)!NG14 zwnRuy?U&4l^T~C<9n7^d8x#AgpETEw?9+1r5Qx3rJ`4v{TA$J3Ipc;bM%zz1o&%En zn+4fg?*||^r;BA1IuDod9S`Ft?*GU@Bsy#->9%%_wAG3AxJ&nuvw*W7<>RpRHtb%~ z`|xMb1LDgVUH0XXjgGfT_H#a28)*;gPo!dS#5h4ho*>^ot(-O$_RT zMF-2JJ9->Q6(kE{rL8u1+*4VybN6uNrBAVqMPU=1BD}R3BVCIU6Jo z2r<5WZ5Oj)xq@7#%OkNQ&8IUQVv>=`22@6GjqGEZt|N8$^s9V@tS(HEFXpqm;fR6F z2m3lk#+ltbw)-S33AMM)OqRqji5A(OxcS2te)P49DXtC7bq)>>5+=zE-qF~1m)Gi| zuJ+S>5Fy)W%h1iS%`flN)gkZY7{q6(thXM$L*tzC1btR{&9;G;VFNEaHn7!2mOUq} zMnW7W3od%YWOl8Z{jlmInpI z*GS6l)=0<^6p~*VohKms-x_MiN8EpTw)MRX>wDR;zF|m^Hq5S$iZ6I^S#r|rYfW=6 zP8h-oXLWp}!7b0pP3PovH{xB}9p?^)mnFf)Sel4a*4G8)5b%Sy4q=yWS3nSf*U{bp zM)g^hMD_%RV&H?1?jIRDA{|BmuK9RL2+POBW?Rn7u$-5JUU!-*=TvKj$G(8E8w+MB zDWO3~j^wRO4gsWi2Keytauj zE&DFTS#39JgHF-fuzzh0de~Z}n)%qXXb0|X(8Z8c8>_>X1%;( z_fH*_8M|yaShHihG(aEYnr+_&Vc!Lfk9S#UIpmD%usV8*!Pk+?*zp}ivsRN%1lTiD z$4TbrFa&2?UqM)3!N6FA5 zo2aTDu@}v`uU$P;$!*eS2zRovXFi<4XrWDgd5yX9k07$USCNaM?aCeNEUFVH@gV7f z&Oi>wsJM>hiGP9pFd!3RgN_af6AU?BG#e|UXqm33|El%paW?wn1sRjpT?}i_Ae&59 zd$ok4_Ppm~nP+SGAT)e%T$E<7)XXop=0%lPdP$V)VsK)mUFGV{0HSHa(r91#7~yQ) zAB64?y1KuSBIIRecD?Bsfu)c{fDE@HQ;R{XTc%wxDJsJ#ipeEt(DtCD`Z2Az#3cjKVN%CA48uJFwErE+>`T7PsdD2oHwPjR!X^Q25ANjg zMC9=-eE4`obR!|T+Hw8e*rw)lkq)>WeKw0dfuNE*C)4C0>n5*5l#E)!;dEQNMy1bu zOl>xP2m(I@9sDpQ6&YO{0gkhV-OP7ai0ZO5IDy`>B*>5-n!Z%)B~&COU-*ojs$R#{ zUk7USXxQ4JkMOUePeMvxhcPr8goFS>LJQM~*9By-2Qgl+ z=H#K#5|a%7=b_!uY#b5-4hb0=D>|7bv_DyQtNargj6i+G))0y59XtDqAUQ`7MTgl} zF_k~G2X&;p$?o9&FQ$YpClqVX#{_00ln@X~$n_7?X{oOvkrwOe8g--dbtu`xD!t=K z<<_HQv*thBfOPYr!V4JCrCvtg4J&&S7Zw~Inkw$<3xHIUb4XLS_y z5z!6JR@EV>>X56dc?4XG;&K>}EZ#_%g=+wB3G8sFhx8AC;@gh-SRow68+d>ibUw|p z;)uQog;vC=C5*GcpteF_200>Amy*^lHn~F2`Bfa)>OK+&d=<9Osch%c_R#xhhMHtj z$!A;Y^i1@NnSUf3de~X#XPKsMk<<_5@)r$YGV;MaZ&QVZn24M>iZhfKX$vpfcNJbI=z@#aHpV z58u`$4(GrHQWPwi5O5(Z!h*_)pUR4Gf`dGDd-KNJulbnsY#kkfjt;qAhgZT=s2$;C z6=Q*uRl*aJOdE%z!xwAkRlQc=N_o7JoE#}8q32E?jS_gq*7bp^t@~g$n5~<`(9K~t zihh|jn_a1oH%n!+a7q^6SGO#X9>yYxl0bkyrLDMx*UR);Ld!lzHd{4^p_;>n#%NmB z4_lL}qsfDvyFEI0-g$Q{NrSk?ILqm{#V&zKF5FTn@N5 zL~=-r%lEn+>z+fs@j9x3L}U_z@{?N;o~_Np(B|R5gj*zkX_KI)4RAzKFz@3hXRF^Z z)NgpAs9n;H?0#FFuLA7s*9cfzd%JAB=SF+Tv3GP!#Bo!KV~>3@aw;9@NoO;)Bj+qcwkC3@u+_EwaACsM}y2DW2VMlcj2Ypmgz^p;(&a#y5gr}?~ zg3d?+x!NZP$QK3!av|(TL@WBQfV6{xYzYuJI2VQ%ycezvyIr{pDKh*(?uNGBXeS2G z;_kqD+?QhyE2`C|QMp!B3?i)J7*()OJhC6EjEh;2#9BIb6hgPmDaY%2Xg=0)HtGli zb%fmt`!4c#RqSJ1Og?)Wq50Guwvcm!G_&S8tpJ#cIK%+IQ?;tLIF*A| zG<~K&5?kEr=FKlTWKHijuwo4#9-i=QP!a|x2|J(!8=<@^yJSg7tR?~{I%QT8eP~81 z-=dGkGulJd8tiNm@$jiMh8){$HWY(jX%GhZK*nvFZcz#ZX`c8aKS$C+1X zSqj&Te&G!tH^ki?J!?vC9^3+1Fh?$pbYc^ow#Nqi>N<-O=lGCm0pBcgd6l~i}BE9W|~BeULu(-y>V zb<(OBUq33TS%7$*Jy<*Srg;s&zWIDZuYIi6Y-AGwvWWyfTrCOIOYqHn+%QwfK2-Z_ zs@Jye_pMEgMrxSMhilc(SeZ2y&&UiVOTr$!5h5KOpss|SxD}balMb-iR2Oxm>71_oJCueD(-jntohfj%9b^_@h|?!Fq_qspLE zM|?EGL%IkcU1Ur=V8{DpZ_%ldjCf-) zvWP&>(!zpN;$ZOEZG5s640GhoL(nKzbQQcbAgoD{x;;U5{9^&KV5c>Tp3-BRct4d? z*}6)y{+JR zvv$8oMuHvNAe7)^`DTN}2tZ>bTgP+cMf zB%iDGxQdm`$8%wLQa6oZdlQ=??PtKV!At~TCgK(Xw0F(a0rWy3$a-OM(M1Rv4+wMN zWflpYu5#2x4Wr_oN;>2&F!&y~R4XZ=tq<=Y1VB2&)y$ovKyMdfn%4|r4Up#TcD=u% zl0}s2cGjh^Ld9Q^yC!US^<6W@DuOG}=_@`~Y&NWl09Hl9V@GSBO9UDxs`Nd)++RUAH$!+f5-%gk?AOc8;f^J zW@zIPTxm2k-6_dGk|@Jo+Df$v$df5gbJcDpM6RVi3QsMeHulM&Fgu&R+N%;6gylPa_mr zbaJZTLk)5HM@U#4&Fmh5Ce2OhIOjarcXW)JazDeI!zQ@Ebbt~{6Cg7 z6x0n$qeZxnD$@N#5iomY>@E{lqb6EBkm}YOm)v26wtZ6D#9#!{t{oHYAw{k8K zOxmF(z1~tc2OmBR1!0GgTWnQUa_kpmj@SQkm;jQTCY9DOd zn^_c7baO&Qgd(PXTT<)wkU&BljnSP+U!m4M|LSLf=1}-8Fo)lQqr*SWAWCIjmY4yE zBnWaIpQ~sOF4%00eJnY)Nl9P(ASy5x=CJE6FumSFSSRy3C4})C&f4LJQ_9%aF^5o% zp^;`guz#S-9JV~YhojsB~hYp9zNS5e{ueCxQZ&Uff^S=~bzCod}?AAf4= zfPhec!5|^M&^)nj8N18#uXW8-e-zynHV*nZ8kLMkGAra)@X_ueb0u|fri!Fld@bA@ za=is+*IRJa^~3eB8)II^pb!@8>?k+7@2xx6`IEAjnbQy{H+D3R{7mK-M%I1h&6oSh zm`5Qj9KxDJ_)|3YF-c8#xB*ct#py$QxXJ7UE1P5Yc7#J2Po(@zKpEeC+^}m|kOU@A z>~_+6OsPS9bVmE32f{9xODVFFIGvzLJAv2dQtf2v>#7I+CH_z@jRId5N^o*@O?`|n zrZQ&ri=RcC$Nwt?z%KXymntX+a%lJ1jFol3r$AuHO(X8b#t#S^dDwEPn%Fm?X`4Cd z%e_Omxi7CriM-W3r7!xK(HtNlyu`-hw4$M%)OiBq|1F`(EmEb!UQH9dI)dY06qwE9 zGZsQ)m(iG%4apuMU_OcrQSlP-Z4)NhK?4a+AphDc+Jh~a9DL&FJ^&ju)n3g>FL$}V{Y-2Q zFh}J!KS(^bY91=AJL%Jx65=Bd(^zr3bo6awY*p zn?7Jpi#z*zTh$vw5vWMF2+2PSz(#gG_$-Ig7byq8SaFnkF+3T4hyWo zG_Z!t18Z*|qM)r*fPAgK&`#G?@@6TjYoP!WSgOf2ejWS997b3}y2J#=!F?mR6n65@ zgUgHJmULTbWF-X^`&)WDtm?u{pgE+$V?fsDuErf zU(zLZv?-7Sx)Yru3Y4S|=8-zI>zitDFSvHtUH2z6<}k?`OeJf$T(ThZc`J+xH^NpF z2_fblS#&frVJMI&Cku$pUtX&$xG>b(!1cFZo2dbPGg9(h?#gCDf&aFggu=6>60)xn-a^SBNQO1E3br-wR6T`(o9;c~LV z;`)M=2ML%VUO<*kD!aT4@6VE(Pfq%gY-j8;i97mic4Ew7Sv8nu)d-ARz&O9k#=qFV z<6b|LL&v_T@}}sJLFMZq&rvc=uWGpbs&tCTm}8_HHU#N@;3?B5ivWQ@e!q0mROA*@ zE5w}0Ek|)3hWTz6`4Lw!JLaPikTHj()nJxZ!=-7RSD@>yztzRMW0qb1YG_i`o0t$(Nb(Wq zKSY+CvuI};UZ!NRP9PF5kL>E3N_OZ;Fp&hFnQl}tY;Bpb7qScOhL7?TV-8=c!Gx)X z%a}?70v**`L8jn{6oW;I&T?=)duDnYZGm`miQq;fh0UbeZH&%WU>*CUbT;O&ni`AJ z+r?F*_XorF>adq)!;rc1U>|Wm~qt!8N=@s?Af&IUO1VHDMM#^+v{qc)k4)Xw>+4gd}W{acZjWbP<0P@vcck{Y+twzGN;_ z!zDAFN)0e`8&>rUlC#kzF#_nf4PrO+uER!7AspgztUAPF!s|?5=_bJEwe?0Y*6K)R z*_9JPS$|g5Bk!j$>)+}VC@;+uo4}J?tbTH%h*2TLs+Id0E zvQs&VN@Soq&f6wMvfvO7)GBfp%#~&KA6}WfM*leCLC8;@KPL0{E zj?Gm+4cF$dmKsc3YPh_m;4#cKNXkugn+m_5*LxBq2nM%(hh$)Lz9T4}gi~PHJFu>! ze!GeobErrS<{~v*GE#FNTO6+N)1K5k@Q#WEC+4D`j&xm9gH=xdTQ^VqV3axZqz3bo z8ZJR8YQA~}B&IpkN76PivM^bn>Bj87dV9f%)!xo<-&4*>e7)lr1E$D zoQOFrrv}rU8ZOT%K|*_bMG8$9BqwL_!==`hhju;b(+%^e1z58ZKF< zfKY|lB2WK3jcxJ+hDIodN1R=}^*D~yU#Z?_x}X%+d2*@S{J;;E@1 z4`sJ&uk5SUJYM+qtIgpbGnjzPa2d$p*SNe#Duwo#xnu>*xbA$41L=enGLrR*%(cf2 zUtJoFIaFi@bCDUraWGQT9xaAJOft?p+^vC1pS^p!9fn!X1C4Q+qc|_5Gb6ly=@ZGj zgX^2%K58&HCAoS*64iS*4I@wjapI#PgfWN6%wQ%nLsOZ#vO)(fO^$GW?V%v14R66+&nE{WclcBY^%n@*)oy@3KAGNLy((Dd@H zBt+(7a$9RJ=#AJrLTyvNW^TNhds}{{F-Ju*378RFdOr=c;a$r+%h|dF3ofD1?3tBW z6J830t~~E}b6Yj5KUjZrWoZh5r6Iw(-{o?Fx+;=FyT*Cw<;~Y;v(%K_Bg@mm6@}Qf zW7TS*>L%ty1Gp~iQeCdW)N$9EJJ<3cX|3aH_%9Ri`dP9$I+|I@440M+;I#5=K3=i+ zmi-Juug}Z~I;HNX)9)|~$*U_C(V(gLgj?2oWRHychvsP;#X`B7&Y=~6xgrTS==JbcT_524DOH@$ak(6^HV7{v;9yiI6me3?s;OkamdS>fDM5YBVUsqPM^ ztlXqQWU?VqzPn6%jWd|6mEdX(t_+xxzNvO=U^M=FEd;MGXgeHL5|5Kh}Q6iKby7Yj-Z@;N+6xtb;@YqDd8vL&@hr1Ej=LTzWBs)nGi?p{lljNCJE=mw?h#h zw7!PmDzZ{hN{xiy~fzz0`2vCm&!A)tkXwZ-yp&d%cndrAAny z6;m!DY04+hZ|tO)>K)R3L010BtZyZi0g23Dx z<|}hm34e-8UaJ1KO8S8a~%E8AV5dj-RxIIW%(y^UN8V zXwKzB$H_Q8GB;u$CPC9A8D(5p#c{(zSrk7*oC7JDS)<~XRi(!DpCo2%LORXhnpbQ36FBGZuOoD!fb!RQ?rAwO}M zh-Os$lQ`DNmY&Oiw*7EX8FPr^3}%iqTY0K(p(U44{Q#B<#2;)|W4eR@uol%KiI z!8ObnXSkGc_JAzzroFx5go43v!MVrd`1v6?ip^+Ox3!W8^bF}N2`t0@m0cxBSCMFu zRXa0x+n|r>?UU?=M6Sg?l-)iiJ%?`2V7@s+6V7GN?DPY>O$5v>JJA`}(OvADnYd&@ z%Jem-k^tFJZ%1vmnZWW*(=w0F-c+$OLrk(xx#Q&v>XpE}<3g)DX4i9CM%WGd53K2y?p680^V|dpJrQB0;`M?@sG#h>F6VJ@8{o z%^|Tfn8nU;Y3#7@ooD@kC4n(u{8WA{tki1VVL@avtzoaA`M}KG+6-0gXD)M41JmOf zEu}3RY!uv?kik*V%L&ROPh!@6&5M8hOn44*Ve&ge zv)@%JAQes3Ty_|kq)voka+BxIM~AmgT&&nviBn84S?8LIBcxKdN~7ZwxlAWi|4VN5 zInakW?~Jgn2EZef`g_+79NS8UV{MCIp))bL3fQa37k|Zjb4ctAX0bC|8as5&%Qfuu zHfc^4Gm^>b3G)C5pq*{!-kW6)OKi8MhdoZ}5`-_5>6{1qwU@Q?PXJqAt~7<0pLxxJ zKFoS>bqn4MdPFc(;`yo(?x_`lG3PD`DtnA>Gsim>+O%a11@~FeE#CM$X54q4B|m zy2eBD9!H6s8my`e{&B$#^G$lL$Ho|}+JmCxancL((Fbw3F^5LaU>-fgCDMC8HL_x+ z*3rix=CITmOjBpLJau*zr-6YSe`U|j^GA-BhxiGGmW=o55ED5Ym)DZ?t{qa+ zq>--F??^tpIH&0SQIXpfa_ay48goC>o&#){{?2gu@9g?HOa2QwPTW)=FFV$e7L)U3 z^{$1#m#;d9ea>L|Im6|jGxy)X?^=8{pPu2+mNqp{&*m3D5O59~o56H! zM&#po7wTbkqX5$0Bs)`nl3eF-ni))LX1J_o&?oeiswr>6i<`sYb#l;C8fR~j(qce1 zLI1P9Em{qoGD`)595J(62j)uL6e}6-K=;4 z?yz09U(0A(8QmV0QX;Pa6Rax&JW<_?Sv{ zCRb9I`zrs6Le*%@KFs-ZI?N%4Gng69aH-*>09KL@$UHZeBAmUrtf?K|k)%xpAg1^{ zv@0HYLbZgL>)hNFP4e7FR#LrimZDTr1X5!pY{N4SJLpUf*Fir!Nq)SURz0^XaS8 z(gfGQ7lh8{1(jqK5@nVsKW@9g97??aQ|bj4COQ*17#m%Z?(wYC4<^~_a9C#T?L$Go z%sZPMJ?4?RcG{Mmt*_L3L;ge%xs?MmmS@|T$$@HQygTR9bDNFN0?fk~aC!KU;z2S~ zvgJf~lYr&5mw2Y?c69d#$rOtO(KTY+2!O4n(HaS&zSN^5mq}PAcN@&Ant-9QzBleM zkt|yGnfE^p8GaHIwgPK^U6spdB$|2fF#E@(t0!J)PRxx0nhO$iYdylDD9rMiRXbHB z9Rd29dJm5wM9 zK&A)7p%A%}#xwQ&!%J>gT)7oDSR0q8J{}^&rg}~zgmOzD>S!HyNxBk%ataHQ>rxE~ z!@HHj(@Xm3^%9svt{7l)#egPPq@5Nev4PC05T}@rc?)DFJWp>4^VAHH9`%Uy5pyGD z#jih{9w0|*V4pu?+tasbiSw_HRdBwJ)II`pxrV**g{`rS*=k|OX1VQJHxH7=&a)V2 zs+{9gm1n)xWrs_a9H0W95kCtz8w3ZK%Q4_`Il7LaWOxDSHym=bHZo}5O5SbzRT>8K zDq|gcW%@UJy`1gPFN_xjY<(r23W#56m8N#6pE=J4n*pY047l`+<5D(lxHC_i6O8jP zw}J4i!I`f(o_EfhoLc{t`&+|ylM~CiY<(4fbgqLwPT0or@#KA&Ht*(f)_1d)M-aVtsbLNL19;?9fbqw^S)GF1Pq zy>o1*p4d7ea~Y!{BSv3|(0q{d%OzCL_|%XDXabu z4tMa-Iyt*qg==P;O}F|MU`C>2rIHZ0rId<4%Ol|@!A}L9D1gL9h3e@1K$w*Ynv08y zY$;^1a)vjuJ9lraLlQAnGUm+WJ}r^F_A%Qztd0R@bqu(yjxOIWl8a$L)VaM;eaqbQ zk;4|4Lyj0=a>Rg3jz}jPsF1X9ye;+8lT|cM=O;JC9FzywTe{{F{nk^((b<3`D9eJ5 z>Q}An8cB^Qwh5#uR4?rsn%RO`==j`8K=&rH@7AQ-?YNZfU!b)|U=9mofLRy=E(;?8 z9uWCFtqKt%7mbCc*k?Qik$$s30&|!Y1I(ltaG4Y(ug}Rm4vN_tTAc9rj1pV+N!I6J z=D;InOANSdiQqdWBPkC;NA$TQL|We(6`DGsPZAETTRNk=IE%4+$iPyWFdjtCQ{RgD zp#2QY;Zh7Rmtw%>QlxzfH#`T9bk5<_K(R?14KsSjq8TafLf`S}k`y6 zd+v#m(&F&a@)QxXv-V6@W;Xj?mFQcW&0&rVFmq%epxYa*O10_uAiLd9KmEgV6c)2T z23+<>mD#4>CfF=gbkfl;Q2w~#tQ_a94>|vwxHS4kiUw5%dMzM6+WAO-@3ROKr z9P)a_&s^r{JEnjPxD=4wrWLVU5sxyLWdNl2krrv7@~LQ6@<#z(P!S45)DATz=d z-9A*pPwXL%B12t_3>Hv+W;#b_GDT#-rHC|-OK$Ck(>yUWnTek2n5CN63rx5UR<+vz zOW-&hru-aLv8b}Iqz;CIGY4~n>;F;ZYlsY&GE6DCuiJ^3d->7srn3R$@H9_Ut&EDJ zewDdNR`91UkTZvZGQbp+fxwvX1C<>cZ6qBu8Xr(!agi3%=-%?)a<@+pYmT;N^2vZp zK1ryHHX`U>nZwR0)ntYgiE-(Q(WNCJwhK%V+iC72trjqi)x5mViCj!9PAZ)ZV_i(D zviGWtP7Rpt>y5g+7QP$j)0+|~l6FdTE8H37fj0yMt<<6Vf~H)Yurgj#`L3!S3b&Gc z3-Pf|(cun!eL{DE#{(LGpJknc7nn9P;L>JV4-bH`r){B~6l%aFcBw47v=-yS$n=9+ z+eR5}v#%{9_8)*b3{CVp>r%5ZDn(J+$He(&_so8I9(UG5u3UHcwl{2*xI6QP_){Hf zL_Y5hJd1^{BE*Cq|dwq}y^^^1KzR>D^$TaTP2nw#SO(N8;;f zT35wj+E2r7bl6TxnJjWcYfXvWn8_`)j7W(?+9Ce_r|9vgAMhO1#EhZ=%_!P%ejKZ!UL4KcHAb&pl2EZv;hKieF>4df=$iro!bvDzt|aw(@2)lQ_}iI?4B zZr+7<(v$S_Z0EpBrdbVWn$>b=__isyDKvkdPLX8&(P^xjo8Xgz81K*{PYMr#JwbHh)FGh*9yUka|R5;A=>fPzi3E+qnNYD;)@;;49pA7H&bTXWl ztt{dFtmGW@%Y?51m+)1pQFIVTtH#LUGIt1b%Sk+!k#S^Spdb)+46jXLU{uFfD$9W^ zH@Gtu&;gHZI4JRZU9W1z9(|RM1?CXM2ACi=usCkA0e^RWSJem;4}{$TRiBzVwOAZC zUMThu3SBRWb3q)vK}oX|f?>OPK4bzihkc){&Ff9gATj2SI6YIOZK~j!kidaDJCVqT z9uULfl-(~PW2n^uO9FpgIKoisnrzVO+L>Lx*x5GBNJii4`(j)Q%%Q0bFima1rK$BU z61&!h#9dj;&Oq#xhK9Aex66XOP4VqEVKe`=XT zZ%)k(0=RQ;9&dtI11+RC0Hl)5(e}Aj+?7uWy^*A}cAo@~o5=%SDbl=K+^u9oax@@r z_(@0~WxQ0>y2`O$K-iv_)C%8WpYf5vv$WKbO2=Bb->z?HF_A}NwsF0b711>Z1|1UY>be)qUj-E*XeV3|p zHPwmN&(!B&I%Yx+xJ<}|zOBxc7{=jo;nf(;aaF)n5R0s5&YXkQ8eSCZfW)`cOjzcE zhM?W9xA@o3T;{+xCP@ysB*_H4Q5T)M6|yX5CCH49&%ujUYqFzs$86n_9S>}otx25R zYIO19ZO6~}=71okMGk0M>QHg0FxXCT#{p}+a!C!OVKlV4Acf3>^l13v_#)PT9I|SYuyUd z+og(wk7(GtRJHB#`?a=QDcv9tm*S5!#8>^KZfYh!0Xnd3)jo>?Fm2xB)B3<_o?5wt zT}zw$kM>I6TFF^%_jc$JPUn(&nDsn{ojmljZgZdjb1Da1PG#i3v`QcMA1EdyLsR!J z795W!-P%Lx)yjp{aL)si*(&m6m+Dt~e z^j2~^Z<78ENKcu_WX)COc}z9LC9C2Ozy-OAJ=pRpWmUabT^M!JSP86E?JKM5aNrA= z6>C_o?}}#* zc}ib`%C)Y zx4+PAm!EnNi@%;er~&U|kltj@Bj}u{a@*S=1zW0|(+=7Y4o284C80}6i)Qlb26<_u zoYej+`wF6FyJ|jt+P+@=_4Ll493}62XO!HTW!OF7p6ckzi+EWgVK*PaHnJ15+^&|x z?gL}Hi&5g!#A}Pcp5DEa1H#^QckVm2KDx+B2AmESBFghrBylaLQeusqZ2LGSX`&q{ ze=;KhZ#Ha_F-g-!PJ);AMO?=qtyGZ?Ea5-SH zBQiZSwzSbVP#lXwK;FKjJ_mX{y4Z;>7EkT# zD=S^oxf0^_1*FU$fGwuBEr=Sn-4myTlAtCniT+C*va83C=t1`^WmKgNw|l9_W(oME zmG62|eMNK3(Qe=$R6*-{duK?S*x~iTy zncvaA+JvN=(c0d8z1OYn;jY;2>K4JOg$73EQ_3XZJ-8mN#?UHdjiJ7PPg1&kA1568 z)Ca#ZXR=tg9sBUp+~TC0rg8U_a$+hD7j>6zbOkDVQPKoiMh`u%zj#JTmZ$BU+DuuM zijUqNG^RNUlQpJJVnlCd;dL9mZ3^-CSba)kX4=%ZgHdFi*=({~PW;3QVzgQ2m?dz@me@2aO; zwRs{S#p`;8W92#n6q7r^R%ibOG7iL_8z>C7i{}EDHhW?M{Zdk80I@iTzre<3jF$U0+~MS z$N-i4ejB?hk5Vs5y+9k@{ZAW3v_!M9g&~CLUMk-|ydpCM9K%TK4o|QtO4!Zp?UK&M z7OnN@H4r8otzB~i1$XA&70L<+t8`RHhv%$TDrTxmSCalkkhr#s+4DhmiaBeGm8?qR}aiO!fL2;34e>i6DY29E*lWowlq>nx`8 zEwgcn2EHy|Efe50(cN`W9mRI|AZA?hUKp^Xw0sP4j?pYd3~q_yJ+@E!RAQ^B+B~Su z8kP&fy>r8SuD8@x5?vfwlOSk_K6IZR`fR-~We|?uhrpttxAsv|icasG8$eICbEWx@ zB|+YiZhWzm4*!-V`(fBZfYV8_p$XhDi`9J$E(F5X&+xEwZ`LD{eWRoN=qbi2BLmIE zJc_Q`YYmWHaT_kW3`t<@&K@0cP_O+WT|DsS>57W4nWcMd$X(JM`|wTkSERw0+{DMK z%|;JWaN(i{_viJJO+8pWHz%G_?3?K$74O3A$nRRo7fp_+*VM_EiN@iTcNb35oV;r{ zZt%hRrnD}&=Ra@ev$2H~U@W_eb3Bx($?HcA+lNzM(M^qcmJqijOuMzNs!i2;G&4o% z!J?808Z?5miHl(u)fY^Xk^^OI^~B6?4qI7!rDlI=(ibJ~!QrB!Id{tF0OMZCxaJD1 z?RrOZdaP!PA=stzNi$93>Fei*YKL6}Oqns?C<_?IA5e)bZytf@yZM;e?cY zxXzI7fdt_k?NH9C){2;1qRXU65h<5UQ~}>ydtjemV$)ny&67{N^J#puVS&_6xE>MO zBbjaSuaTKDH72|N>6#e&`Pu4SGW&H-&x!r^03Q%bP3t;qy;U)S(z<#(AKO0badi=M zO#a=j7^oyB(MzOsqZ%2Zq*s?tmC>+QKpO0BS#8~@Vv`*&W%w&P8H9LgGqk(*^`{g4 z7k~XO&wt803vA$K`Qy<`1zm74An~S!kNhn$UDE?3sT*CA39`K*{yI6-^rp~1Sht-K znNa=Y=>F5qBWMb<@dZ2P7srV}02GZoJDK%%)*6+chwaV(yq;R@jxLFRTy^qh@yWbe zF*6Sc!p3i$b~g0v2CI@@2PTEpxcLCW4eKg~7j7k!l_C|w>`CR0g#dh7>JM;}Zjw(A z7{o|V;2I`Awa;z{4?$Yq%_I{LQsSC>?{e0mkHwsgggAcS=Ch*+QYu)S z7AezZvS=yVwYCZKyo{o!YU30u&|No?%kIN0ewT-S+hsqO|3@XJbEC5J89iwZr#Gezf%!O z3<%#MMY-}v-J;1@FiS~;jQ6ixBP_u@)V$C$TdCU2U}vVmFptN%UIc4#yrS>xaA~pp z2RrvZn%I)13D4JhT$0LEegmbdT=0SpDkr6}!CAVYTcNGeModa+?XwM)zR{I9PW6st z@pLZDEK_u()98A5QWCH#bWj9~2!F~!_VIjYt9A}kxJlM@776teP8UO3qN~Bl95!iS zpK9Bve|V9EX-5?*~M}zcuqFAkfzY<*!5NMsK}k6 z723~)%;1*U-jG`Wf@?D4vn8bh-|(>3(IQFlfdJzXEobOTP-iib zh4}JRvW~<-_F)J&DORnSFf*S{-=OKuh9(@VaZ{PC;=UbyCh6dvp>vEHakIX~Lw_WU zhrCl>3x;`5GM`~Lr|)15x^`^~%&kn;!_}*w9{Oxp!;u!9s@wuw7t+xBuj7JLj=C%b zmZzNBUQeUwGuQR^Bzqp1&|&7tfDPa6k7uT$v^l*FMwEbXvIX54CP(sM*h%RGb&g9R zg#@aXf13HQ&RO`xRC!h9)5BIy9KULF&7o{_ZXR>kuNagJ2Zdq#)Li{^D(vE~-(^Kl z1%3gc+?;4Kwn-VP&K0^?u)HuroFzjRlT*sZWdWYz{7>g2(uigwBF>Fo8uN6b9-$?4 zOG3613VqNs*&A}D)e^c3O?}~Gkh75n=Q`_D=jJiu!!=HJ3K^229bTLm}cv4&T3xL z?MCWQ4}v}4$8BNf!3@$)GbX>xn3;jvOmTd^K6Ww+{q|h}9**9ws-T~mH%x&{kn9mn zm8>{Ec(QRr5r{3J0MV>1*kqDrn%Tx(N#N(V*zJ;$@V7YC*baZyE@Xgdx;|IL7qdBW z^-3pLuH1Fz>SRyS7OypsZRvg;9Uof9%t7(#HJ=SAI3wCkh#r+%h~v`2Hj9oE`lqMr z^;kL;_pKdLM$C_UWS^dcSF(G_9Mff$LjyllAze15WeR*$oqJ>udkS&&JaKdBkSb;O zY<;4^cCQ0{M^@?f;ph&X^6=2BU)0SDr;T)^U-HC6*dq#3xBHa3+D3L^vVm0g{VlxC zoY}P`$rZbKr*7}Ozl%Kf_{XLi$~&xS&r*X^ctqlF24hK~!{H63rrMQwx(VRNb5hh%3$+KuR`OV`GDMijple z!5rYWa~F~(nZEdY?LKhJqkG0o_kw(d_cFHcJ*MP0bBa+V|V9oU$i1-e2PzQVG z5M%V;7As=b$UfF5uB+lXCx_h##jf{Ta*f^J0k;d^;p=37 zZB%QXlQSkW4`P0dY{2SJ7Hw`_QQd ze}4JUx+|U52#lyw$9Jc-#a{$ zi#Zz_wJZ)3w^KM9bKKufO>j);(&ba6YsGvN1O#WJh9FQw(9l>3Ir$e=al-`1NlD`; zPFSH8*9ps`;}exQvzXTr% z2*n@NwdwolGXoZ1*a_Ya#(|{|BH@*1Nj>|@9X}*f8x6RxvsR-^ke(Id7Le@QxewL} z8vJbK9fa}@x{XdqZC^TjX-Ud6COtaUGZdz5Hg!dUKz{Gw^);xS*vSste)j)t1sa3` z4Y~@nQjrvD;kb~h)5v7Gc@YdLXz@f=l27;_oUQ1BP;|j%%?&BNK^?I=>}{eI(hf(E z1JWIB(cR)`Na|=Iw3Rbvc z#m(|yZaV3+!ef(^(#7!PnRVA$4^^#aK|;`S_-M%Pq0!>{-4|6n;ani+i>mbLejPN0 z*{U)KRTWMa^6Y3x@AU7Ccklm@(2Y1Rn^nxo)2IZoUKHIP@+M% ze?)aahMQ9$x{;W@#Ox`Ksr;*B{Rs^qF9O0sp6?DjPnfWzhUvpoZ#V_|+=5SjT6*p| zYJsaCQ5`3lWp3jw((%LAo1M#nu8{V@yUn4q*nE^)&DP{0X!4NjHP}9sCfPD)4CUQ! zko0l&=p%7FG+QZ$pp-+dDercMl3(@ITML8qPwhm47S?XXskL&GBd4$7=0{V%06|e{ zkK(Uze^t&^mRpA0G(>%9`%&MD#1AZ(TGmHHXz?@Wzf8e(Iu2CHy(?61*|XU|Os2Q+s?7LkwH&DQuKX#9{{5R-bcYaKiNpktfM zK|JB5&@|buxAn+WMTL}1Nus0VWq}@-nOMT``Jk=<&h#fy)|Hqu50%>_?i zeav(N6Mi94L7Lr7HQ;4;F z@FddkXXAb>f4ac-GWrI8RdVv%R5j$Z9(Uo3Ppzk1v|RY%~%A8VR}GJ1+CE zXj^SPgK_+X`;IZVbI0p4(AoXA)$@_g7@7?%LI4(_aq|uH5IMEN6CPwQyD^qovJ=J~ zhP!F?cp!WzLV=GHOaeRm%HlRf@Ok)lXw?!vN|tA<_%Kv_*j4eBfz^1Xld4^#!n`I$ zypzV3CNY`fiV-ynB_nENAJ*vEbIrim3Z9Q{<$cMcco(&VifC=Go0}l9$($7-v zX@rAfH7-S_8gPi22xr4a!rZ9%a^8ezEA23pb~vDoLNdW6H9lm3R(oNnz3{R}YxMYGiYFy(OnOq>^f+%i zp^kV+BxH2^>2@?U$l0nb4AmA6j-A`dTl-5Ijc98dz61rf!Zl*4s7vEUKbpc`;v8;*>j(zaW3IKTx?YVGbW_J%`?c`7OeF ztwCtiev*Zztw9^)$6x-(zx(YEK(F9d&Z{0W8#u&=Ed5dW*{=EEsR_?kykRKbaAdp% zj_cqSrU&jB-}L)+=Oa$vA9w5KR^7*(68`b^e=;U=XKJtIg~-3sG@lbK4_q$r(ebHW z&!Fq|(=$rW4!aOs+%doh1;=b<9)U8CxD})6Q#_SsajeP10cjKvS)S755a_!NCr&#_ z^hA>qUohl8OD($COlAD?Aw*^?@CX!m#8u!m)X=+Jz}1v$ts;FxwE42Mpj@8Ji8RUT ztD}Z(bQc4UcIwSs$vWvk>!cV8Qri91?FXSUeUxdD;NoUm>I(GEqu8T)R8ZAV_wJ_Y z&4vLHz<|iOhorr|BEc--Z1c3~7}sp*R#8mm1zFW!6L2+b<#eL>n6-fnljDl&M^$Z| zEM6Z|m<<&ofC>>ep6)i}(0Q{?0&y!n<`pg-BUmGiML5acmnMkJ1_=>>gvglN70H8+ zS{Cngcwu2Gd2k{?aDGF2ZnSa%8d4?*K{Z{oKRQg>*K2=tx@A-*GyI$gnsE4e^NEJN zG#r1|4}ira|0@+F-SuAq>q|FM)P&7V`ndIIZ*tKE>Ds3lx+Aklq5~&)lcpv5Y%GoQ!|^cq5~M%!B@=U$2i!^{ z1#WVVQbX-yYIAtCm{`jtsc0VK5YTb)q+mH|-<&le`uh{vS%@8+qLq-J(2=n)kKIb> zt=uAu)-CL_ouqWzm0GRImXA(Oh|U?4ejTm`6vvvXp27{ky&+leW9F}ib9>-JQW^_$ z_^=k35Np9xs=B>x*K@4JKH6CK2gCO2uz#$L4hMg5u`~0SA|c&g-7pV*l(iTOb4afi znDuHQFt(T14@GXet;o({ndH`({U#$+K(prH9*0j4bPn~^0&`z2jJ*zOeOp~NMh_DL z$jMdbVR`L2f6bvVtT_x-3rtb9u%xBF)g|*a`ktK%-mXU1ihUV9BBM=hAQRhp)}EvY z>2!k4y}bdcR5_uwM?y6n!eZ;sbJdQ`DUn+J67vK-)6%G*7wg@bekS!glR9zU#_CaD~V6X=QVMA#He)-UOL#mwRNg7kNdb^q$%+PgHpDN|xIHefmlp5{v!@GOAQ~j?9Q^L*zomTpLDC;EcP_$7TFHE7 znBMVe-@Cd_x4-nl(DMNX0h@TzixgbLMT)V9EWiC6Jl6es0@{vBIZ#h2W<8}wX#yu>NS6F15f*9G-Q9O7VY^umh9}94X{Ti;kqJpwN)dY$0QiB#RSE9Iz$Rq~7C_B{EKZY!8Q>lRc|lu$U@zX={`fZ1*ga5qdg&h&2K|$uQj4cu z!$yv_k72jOEtlLi%nfJ5gAF`X3l%hA=V=dA09}cPVe{1^)D`DY!=oy28`URHKEq=q zylH4_*0d5pH z?&r5qS!XcBNl3<9q-^h#W>XTa)X;v%N9m?M&Iep3Zn=bqRVisPq5 zNFMC>qT*?^(tI&|znbW7bwmzAl~kk10Ub`29SU?`->Qgjs@-6z!sDF=MqkEnJJ2Pb z&~Y5EXuxPZeD$jj!}2$=^c?Qz2G6H3_}M**9-FjcLvha${dYEEgJA=|j`#4+5T*aK za=iL4cds2QD{k(BOoH5)a)Bp>JZaFA;nuF-&(aq0gCTBy{P+rV9=D2pVfw`W;o9y= z+@Gw)6J2;{0vaPfD9PzS*iz2<*>aHnjQuEmRi1Zv#iC!lfkIRmW&Ei`$^qqqR0^e1 zjr{B4NSJ_E`|sT{%@RKCI`@yo=ag1>Kac$RaQ-wnZVuD6@c9}k;+tLCQ)9~NZsQ}S zrmq_g;Q|LYjzPb!2^rWy72wb`cOem6k|T5kIRdm)mJNYyIdqEsYuYNqc0xAW6O&^& zc~kw?NGSMAu07C;QoWD*IaH*I>ENJ>_MDO~N8{oqrHMMgmx{@k%AhZ?`qZ{)SLkP< z$<+BjX{IxyvBxuPd=zPFnuEDC7YBe}om4hFj!6uTm!YBt#Q!!3c zc`ANP;g@|qt(tB^dpSU}TwI|YdOUkJHqx0{m2jjkXtq$Zz1X(AVzFGW&+>~?EJ+W0 zRcOJ+l6-daQxmKYTBhGR=aUJK#1X}GeN%L%LDOxLiJgfjw)MugH8Cf)HL>kvV%xTp zH@0otHvX*jopbS>b^eRz=2?ByYgctub#?8{Xr$!Eq|w(Gugf7ufD(0EcCPE>-S_gv zk!Uv`E#Oa-JnDFcx9JM0{p23E!vzLKu0$PB1b>SZP;4BzO-T|ogk<4vAm(sT>lWf4 zUht7M3hJdS&gYD24e?)@UhQGrch=h)w%K)2tM*SSeAq)Rxj+yx3un zXG8$69Pk4-k&Hv9Cxq?1(vz`Mk-*dtQt;6!%rVBtr35s*fidydqAN;L<1VGM%kI;x zy+s%?|H)ift4$%ld3EyA^qX;~qU}NR z()~?JzfcOS)_~U%thW;QCnkZXMbGz#9we?M?+>bulza~a+r1(~*eCxt z`m|_f)^NcacNZGUafKXIud!2YPh0Vn9A z385F6_v-C=Af9Gj4B?CQ1QIjEO259v=6L?TEYZMCSYrr&(VL(fuL5(I12P^u30|T; zSFp>|G>K!I8)4@^|ErY}`EV}o~e!u|;6*V~(b$}vTVgQSmr>`^-k{h)N76t*;W9$v_>s4^L5@K+k zL1-QTO?1S?Qu1*~vJ!Z!lVxf|Zcu*@cdFyBzy%!?juK=6AV1D`+pmyeM)ah1#6NFYO281? zj^7MZbK0A-l{cIoQxyZ)k1vTG#8EezcQ%^?V;T%m4E%HIpnC=#eve6p{IIm)kG753 z9ZYc|&7#xYHf=sr=#*RX{an;4?sZo0jKoKp(UN3RtR&F_Dx_Or^t3pa8V_koa>jg< zn%nxqYWM`x)(^;}zvk%&cYHZ?}Pr zP*ZYD({dVlf0})rcdE_BG!yrZJ6(GTM>ufHx$h1VK*x7(rsymWUJBIPWG6e6vnYaQ zsG-_rnL1=O+}9MNs}v*k{uT4GKnce0MI);=#K1LuhLPWkp#3`7t}Lapmte_sG{saX z3QYAa{tM6WpwK)z*&%7^_T-9d$!xfouu~BRP+67MTi_t$t~xQVyg|-O+ekVtUQ%q1 z|MPoDY8;-`n9$W5?i(sEC$ zvt=sU@Noi@#s}+PhdUyUl5PYR#OS~kL!1i`8XB3ZRREr#IQF=)V!rvoiRu&PZI1#v z-updVov-EV15S==7LCMYR#E)L9IhVQfDxPVw3WI|8~1LbzR{#2XsSwmHMejr%poc$ zT&TNNvH{r-LlNDEQn037Pf(wqK^%xC=>}%$fO$4xVwgMcN$TUE7~)u5fbf?y(Z9t% zoYR)!E0z|k#9GW|o5@Kkp93k`r)1!XVQ~zI%4r6wX@DA*l5r1Ny&^5_zDoe#Ua4yf zU!Ei{ugDbM`k2E9DUH`6PQ#RuF52uyt12$%Ja$Nv!ff*g`aO6HawF6Sd`4i><@8Xq zV$>^48b#udnxd4NB6tIYA~9#cqsZRjM8CS;yD;sgJXHQktDOvvm35Ra-srzrDr+QC zM13`GOsGaBJc1@ofAAPsC&Wf9S`IJxDmnkX2SH2o>6c%bMJJj{4XOLxc+zBss|g1U zjexj?BsolXmek(gdgME$M!`hw2lyR3Zedh3LHds@JbH`Yf`ZmLPmT&8YD59;WKT3v zcM6xUqI(@?F%4fX@HQeS*7Ig(pF@KfisG}xEcmy)jyyAn&v3=7KWMg#J;rf@&J-Pnd363Xoj^GU9ax996hUuk9h4<~$#Fgn zJm6k=HIQcu%Lw$>8UECXxOIP$w4?nRPf&uShT7P_e7|}I?DY1Px}0`mQuFH zy*C`Hx`&liaN34XWFwxQS4o9KX8Xo=E)r7&+f^?#>k$*e?kGWLmpr6DOx3(y5Lr-G z|EzBkp)8farh27NJ&#G&jUq0l87!v(8XE0_YzmLE(;Tu9G<${9R20YACyvBYpb)gr zd>>V&3;2CiX&T?z(v;%>l_1{qohcw?UD9$8+fWdH z(8ru63fVNI@6&;5%WV6EXMSJu!>5o zsx*cq8C?K@?eJr4G}IhGH`;(bl|#FS8t=VCBS$4}%OKItMmFKt7Z1%kqtu`YH?_)O zR&|>IA}sq4GT=yEr3D%NFg^on2rw4NZj53J9TcQbb?T2LKc#frF!kA0+xFw8DCMRI zeqWXYjJ!#V$iV_$rzpazwlgCzB+oN}w+aENP*i0#sM3bKf{y&M>o4*S8p%$Ae(#Jb zG}A=6*`hA*+(5yNnX0tR)sA8rIqx{WVCmu2aKcJr_6%t5Q4kIR^4)cWB;r7A5wnb( z7p|c4jL=#a0bZ1B@@Fq78FswkcdH}=aNWYFbSIA}SY1UcC?=<6oTNBp%Jt|`d9oH% zlw)`q>I0bpHbU5xj#%wtrqj!5(@3aTMmx$5HN?1Bc$AE|;LXhP+#H)?a80*`6XfIqI96n3_Mavv}QOJ^?_ z>xF#YlH2bQ*5Tg>MQIzVny=nX6C1EKL-7^h5GXd{htG5zYfu!k;3jOzIZ8uZrgcmL`wfPm<{VNDP zl5x|0eo0E>NlNvlt|mGXP<0LRk;YkK!yIjt9?74#wQ|J6P40%+K1)+(Qu#NI3DHoS zQ*2P3AICey8n~wdV^k(%R6mjpE97aO=Z6-(?g+U!3+cE9720QSL~nF9f1o;g-w%1W zt@^UG4`KKo7NeCTX2lzw;4O0utaBK5+k1BorTy#pz9E&Bje>LN64WM2B(+np-P1(1 zx@k*ClcFfk<+!#Bf3X_{*?o_oqZ_-JG-n%3NWqquPyZ#=NTB%K)WS}!*_1e^F}oYr-K_SwIj`FahhbS)-- z+4Z}0lBa7Iq*)XPMhn@A!QbaWhLYLg4}UFaH5b!TjY#ZiTO&o4f+HXU?xtpO5@suB zO}K2VYTNeHIaFUB{!pnJ;{BXgDrR<s8-nkhY&~XH!AuPzejbU0sraQjI_; zFhvUUXI?H{;pZA=8b+rA2bp45B_ed;+t6s2(y^jMvxH zjYfwe82NC0&*APNo1>Z563*$ai#D@L*Nf^5lv1q*)4r6$oF-=lNF6dIjx#F*UJ~P0 zK7mLqBQ@S$g|{huhuE*nb~Y;I0wyL#KAeTS_1kbG{O=rD)kca)U3_G1sJu|l&308WE{i?S0I6?)cFz^ksg^_m#w$)j zBYfduo*zU%eikkll%7pQ_icNl{Mw3kPVYW#Uxc1oWzqgHaW8;dVtF|s=EeF$hm}*@ z8dmL&q^(dS14@Pl+br#LWA-g&lY!_ML^||%R-QA21z=zW+$7Kh?lT3|rn~u=_W{+f zksKDgRZcl!f_HPg-DEy)X&)l;dMBt^AY5ENPfIW1wfRMM?i?Y@Av7aXKvhJ(C^iR0 z^DqgFXay09>swGgTeo?3R_v-|T;zzGDW^bT@37Dgv45uko1(mRK@^XSt2s|$qP{}s zO!J6h_t9s6#~itm9xq4!!a(XHW`|S7z!rA>czx4otT96ivwi2NPQc=$Mznm!_=EYF z9t!^cF*UOno&q0@uxAN2ns-E)?k2-_H!s14@Hzcq>IhQX&odTe>N=T{krFO$1VD12 zOUXP_jUy`Kg$f!sgiST2G-B|g`B(#hL)Ibu;<>{ACZ91LPBtafwY5bh_sRapp{g$C>;}0KgzzQG zM2Y4<`gd6)>eq>0^4`(A#_uvBxM>R{cPK#=mckuviqlF<+|fmyd5PGhJKS#C7(b0H zP?MR3JgQjwbP-Xdz0bxq}d$Mlz0!6O{g4t4cqUFmt(LrzyU z{JScizV_av1p5Sgl`B_0Q^7KWb}NrIT3XN=jk5_6;5`-bm132BaX6#!30)6#Z%wE8*d z4-6Y&DEaG~RVYzmCre^7bL06Aqy-Ft1080>Hl@Dz?i-GPR{x;nt_P?LxedBFGV z8O`+>S^OE#Y+%J)Xh`oteVppw=3%I_%k1W9^&X^As*s3zz*&fGnxGZ3-9~7NlNVv& zm&%2^>%97Vrhq)|W}F9#aNJNJ#S}z8KvnKg-~(6HCTNd2gI`oVPyojkSs)BAvysGo zqmF#jzo`c8{4p;?yhQe7urxQAV#^BYJjUla8TfGk{JJ0F*NgOd)%`8~0~`$m1Oysn zKvVKJxbhm387K${6Bq~x_V-_TQK8>T49do?P7HSX4o-}W02X>zGbd{+uYbI9{fx*# z9;BCgMK0thXzknJVYELb-oNSJ0HneO*Id$8k0H?k({^C=qCIpqnT5hmO-Ej~n~?*b z4rR+3?j+oqLO%z(CDi`V{f+O9@Y*I>p6XxR=V7>{N7S(Vp6Gtv-sdpwMzL*j?3ZNH zZx$aofsxJwzqy8IW5)_uTwS5xHK+~6SW{SHSJ&R1+-uBmzN>``Gc zwizoMVs3w}pvYgFr3^b*g_fE$3|2pBG@&{OV(H;7K@@&X9m;67w>+^wW=TU+nRkA6 zck%WiyluC(j*KM~@m8gS(55-5Q7E-{=o8nb+D|j#<%XBW4a%TWOciE$9T_`!=p!OG z77S^&-?ezJ66$fDjSy^+5$Pf}vlsbGuh60VWg@Cd7y1`*cunOw)PKV>9iS2u@eNHR z`2PkE>wnRW5gP~lJJC@dg=#X&Y?sI<)4l9&7CnnUv4ZaRb8coq1m8{^r;k4 z3uhzeO3^dyE`sIKgi)U(zQ~VUmX!a1<%r_w$xSm_NqXP|9@UuT$^W!G;i|0>?fmIg``Bv25o?!N&?va2vKzE*F3!1So!kT15 zl2iD0!$C*M_DmvzVLh9uO-qgJ&M3{{p8r*?oODMmXF;nJD^r{#-P1~HfK4lhl7yEuu6 z(iqvl6lOPC9}j^X4#Da?^jk=>bSAWdrU&{^6P9u%m1RS#sS4?M78@1LMeiUh+%eS# zj8a2Q{43I!ZP?^-kTK)zSF29FOnegcewk1m!KcphfC0mZ4$A~W`)w31#_-LrmDQXR zmWeOY!Wd%3RmZXmce&`=(F~hNSQT)w`XuT7pEhy1dp(!-<1oS z_Qxxc27_Bj(%7oQCV~3GuZ;;7XSNZGfBW>H5pqE9$MEw$_jc7i=02tI-le6f2m2Tg zk2j7TNf)FeOYT#P)FgQ`E?bodXZ@ggdC8_}7C60Q{vR7qb=AYZrIePaq62A*^kG%| z8GB@LV{Fm0@Qg+ak0UX^s1Alj3vbr$8Hp`eA>WQGstdLL+k!=CpU2?7EtnqSf3sk= z|5$Kmf~@7d0Pf(G|CT=PRQ!mON?TgN_NBj2JDs%%FC9~=O|V=%EAvLOmf*CiyTa)J z1PV%py2x|@^8$ef8wia@MC$%^!h^BTJX-+FgHsAnSWJEB3WqF7|Y4U5)|>A$wY80x=mt zK!mBdmzXXe+{LO5`XzDN&swTs0?p*zY{3D((TTYWEdOeb)Fm4=ClEBHI=g4E7ugc= zr!7PXE^Dd~J~-l7;v^8c(EN8tg5w^^7B6wUkIDR{xUYg8BaPyeOy3V=UmuNMFYRC7 z^%|Pl-5>croXmFK4U6_@SHbj!*saa5T!j%i(AAG4%;Um$;6Me1S`q49hzpd3a>S{~ zr@`>dcPjiJ2oWJUIZ3;ZvVLzgtE1V4zeA5Ki)(N=4fe&H#9)q!C3trEO=4M;%QnwA zu@}*So+V`&=z}Yc&HQ5#1UGS{OjJWVcMW5i2olX#f4I51sjhCPh>4~>KVUY5cxQ0_ zoAz;`*GoUIG`=Fb(;&^MNm=Uyp^H&5;VP}6No%GuinxbVJ%(6MH_3M=wQ_;WT#do| zG{tnMnUsnc;>bLuSFJqmP#wufkjdlb?vDCd9=n@GoQAr4l^t?&yOZi8 z(pcvca`*q7fzabEeWu?b>hb&g|A#2{{}ZBOC#3oWkbSTGuWIOBWysALnyeIS=qQ!x zeksJTuCVp6z>HX=VaA3NLPHF|`m6VA^$6u+Kx7XT-0#z*5Zo8&I49|M*?LQq&autF z{N?RyBBi|r6Ps7Go~Y6M$!8*K1CeZ0r@TT<1NA^XtD&v4^{28j8RZb<@z&TkTv71N za#Rct@;fz{n}0mz-oP`KA4BA`9tQcht(*w>)&paTnV$Jsf!@;ZbLDP6 zxLwg(^`?&i*pRtM(%34LD>U8TpJ4y(-+Mm3Mq&XVAj2r2{|h=C|3N3A)6&*a!-4*h zSKw2)_-k=1bQG^96`dvyO%1RpU~b%7gNPQls~+?bprM=K6=zfq~T|X?n z%iX`ld>*a=Uv5qL|7jVr0ADZUfk)-KUn|)ksos9c-gkGv7wqhtc-ybbHC^w!`fSg_ zujCl-7Z>0wudk^^pUJv|UZ}PzR!)D!&q_4M|7~tm~!N-HG&)Wee@Z~U> z|3i`Q?Si4}<#3Gw`23jd{W0;q`Z3+-{gFoJ8r|k0zIvaD|AqhSd$W>P?-A9&=QG{U z_hzgu-LKsv;OArd*89xX*J(O~&mljrHF+(geTc1R6wSe^u6Xk8S;ti}Kl3*U*g%IT z&2hEt?Z{L|+GBpJ>|62M&SsSPmJcn!`)(P&T<~&wN{+qW6qqu^n!aMitO210rL*T$ z&#}?U7qQhTGFza-j{&7qWB@3}&$|6QpOQ{Dwq%yJK6LZZ>DCSCF{-D1#>`~&?vFTo zD*B6AfzyHnX#(WKeL>31NrzoD$J;ScoCi%gY)x&vx7RWBJ!6mecUfn=aRDYio!S;D z-$V%W+5cRV!GFID!!CGUADrD9(j{;$UwHd^vsooms&X6p0pw&F!Q3=YT^+yeus@?p z;SDxDD)Q6|CR2(#8s`>tkDS>V^maTyh>?|x^efo^x2{R3gbC2 zUiOSSIF_vQII-i$FOhB@XY1Qza`bU=SE@%6LnyBMix0?TD7Pj`YhZ45)zw!p)qo%CV{$B4g)#8@S zPyM@%gnE;f?s}PQVSuTcI>tKZu}R0PF;?}SJM*udyX^XTOc%;V z_HxjmlCME1+3Jsnb#DAyn~~ycHe+gR;PbIsu;62=VY_5-CXwkwS@;%{M12`lHCer! zt4FhUJ%jYGyFnUTpwa4|_*Nv_@J%vP5V)O8cqeMMcx_kbN@5K7!B{jJ?x0$=KdGW% zN`W_e;pgD?%L#Uz1?)95`DABzx$U{}$9B?b01pSkc0Z1t1G zV-c!d3=QCvh667EPlBz(SEB0y0yb zMm@T2HJL9rRI~1`OW{j8Qg7qkt~^#ck}rbeX>6zO!%;Vz{$dVFZAvm#@LQR9>8$7m zQ>ctSR_r3w6zlfBE(3Lig|EX#EN!oT@)xn*moWjEkZ{zHNnxkjf(R&LsYjlf%DaFq zPXObN=qH|sa>q>Ga}RzG`I&)ru_=G>*Lq8I>d+DwyrDCX1wp%qePj6==UD7HKGodb z`!cZYeFl>hrbue6t<+7r{Y7i+cuP&D0FVM*J8T!Hy!}QvEMJ{SCfDSv9gQFSuXHO) zWEKBVkwU>QPuNw9?hpBg$)&P)yguqv;(0p~LZ#-`3v2OQy>Kn|5vhgnZ?=w z$D()?0LtBW6vt!?$*2#vBLDi@SgK^Jaf?dfR5S#$n9doSwo!?8`p`@k)|E`tPdL;k zJ6-Wz;B>a$?UxEn^*^G);1L`(k!F!}&c`cah$vze9q&OZPcjSq2T7`q*217iq*cZ} zFfG=&&r*!oIy42pCAnFyK-|uZJ_7h24Y96njQ9SYBT_dU3jQ8b82g)46kkLtKl;qX zu577I*x^7N#9o(f?0GTJmM)n!7Xc+`W6JtIiS1G1k?Nv7s9UE|0$1%^_0>O~E<|7P z#P~z|V_CW;%{{(giF07q79+U@9sdaU*eSShU%!l3l(|^CO^b&vBX{WOjeCwD^ELk~ zNm3BXyiuex@a1TaoT5#*bkNa78~TNd76M9}e%D@yFD$w6@V);t#b~fv=lN(O2S?3v zn}CILPz6&9!2m+5Al~n9H|y4ub%$GQ!LME<2CEn*?ct~`bqD0ALYF#UPge>Wi#1Q8 z&;i*uG}~UNN1GZo*_RCdN+R}au1ewoE%c*X0Utg{V#X`Ob@Jni7bDi;4|e*(_h>(x zByp3(T@f$PYQd8gZPFaK_k1l@TiOT;<`a(E~Op3 zVRWAcgk){ox(>F2j^6!Ij$sS<>mQ^$n6GlB(&M$S<1Fk*99JHhe; z!r*mDr;~);Hy5a;WDILR&i>bys4ErE?lRZ!g-x`2nW>z#D0{8`&Ol1NleXEpK}sk4 zdak-lSgK=ry?RrBE{I}8k8w-J_Tyj9*f}ge2%Rf4Uf5{*H~~8qzPQGA#Xe`2$y_wW z3W*--2Z$hqGe$ffD#uI!6%rD|xtFRXwDk3Azg5cO_!zE|Gd<0w8=k}df=!2xcw%K4 z;xSnV=3fQ2O5f=OfX*4b6iMU&+Q|+Lte|Y2K;KbA5@lhGDC$%YW7uOcI{hi2#R2r(W;2C{tu4C_#)&Ef$Cw084|ToEhrwgzE9kalNKo`%@nIAZlL z5M6ep>YQY|#v6kMgG5O8wQ(?~vPTnu+@6xRnCnq1pKTv5_ob+x^GhA)^w;WFLImvm z3R(2m*RJ+6&*w~1bN-d$@An|psV9G(rmW9w4pDDUJ{SEsI*NFi*)%r zaUiXr)xRAQ@k#zLx23n?J)`OU%>OUIfVCUmw{07bxRUaQRH8w~5i6^zW(-uRZ?N+j z1>~-N!U3;8E^zAxvFgYXG%&iD1w2o}>_Dsfp1g*u6zr2G7>5mWuk>w7!;;34WFs0a z<%lX} zjAId$+72$wI(MUL##})$&N#~jz|IEbAq}OT4Ul}mY!rGJ&q$j%n-)wyO$L4}QQpe) z+j)m$cgFZL`TTl%9m*buzivvQikBMA%XquPe*jtkctNQlh9ZYEg@kkMnif6We%3Xx z|Mk>)G%RzoaIfL&;*N3cIR^DhY;qpN4KnI#>*6c`L4HjA%Pk- zgH(jF2O0NiIbyD7KwZJC<1Xm|q0UH=<8ZJ{tyqSN*z(iN_XgSleadi~qN#5*+z+q! zB+jOga~sKFYNF5fv$stzRv zYWu=Jy9T9Rrmyo++dsii`P+Yw3HWV`$RgGZO{b+@?@cu3N|8}UzxmeV3So6%@JD~E ztSo9QLQiyj{UNqw%G0x#Kd#>a~Se#Jqeb*wvqb8Gx)x$ z1SpxQ1l(Jw2Z)N|W?#G(N{|}fQrMp@Ad*uPpB8WbCPf4MHznSSwOYn1K z=NcUuF33wNaF12TAO_V3S=bRATG)CpOw+I+69$8nvJEQwc!cE^nXMpis2tlOKE}g# zOAN)wDRZM}XlQ2%*BTM64-|+7-pPP~DS>db36=W=Q_$;fgup~L~-}jGn-#512@5gjMKAOLa6#}1+LWJ|r*CXJ|;}HL6 zJi(U)aqm~*=YuWq^Sj!5x$t>?nEHIG{))-=9MJW?U6}GAcWr|8=p`zb(PNLSwt_cN zzqLScY(3&X#BPaun%?nftW{cI!|442`^a3570ZvwW`vY=w#ZL`l?G0YCAfuDTnqiW zO1xayrZb;a>-jVzsoQliOyL`?;fOSmXzop4_rO$%pwq-uMz}LHvtS@I@qPvSmxL5n z<_CoNu#J1>av`#Nbll+n)^MF<`2l@7fDbO#aKiO?C3DlAc9+R*)(~W%98B&jJPw^E z*%>n8a*j*`>Pt?O$Hm}W0*ff2&@gr5Vtagm-x@JHkTZgX5eo`A!tO-?%3z?RKLx%3 zk>5Y`Cg`l^r2u0#r}yQ{P;oj^$}v+SdT#K1p*_ZV=-LZC^>=KoeP9#i=?F#mkpaI` z5hDxYp5jownG>xgXta{MgDilv@W;7(#By!R;S z@J>L^@oxG`YZd>44;pPqZodhI!==P~PPU#ah~pz)onyrp8cNOTTatucJ*|1oFes-x zv4hq#mA3lL=erv$zs@5xb!Y&AQ>gHMmXl-%vFb<0xNyj@vxYALRMbvXo%WI70s}hM z%RExZLQQkErL@_roafo+{>G&}=2&ynAQ~cG5lV6+7Bq@H;~eXOp@X6I{7RFPtixjZ(C2D8wGTq#tlH+y3J`~5U1NMle!T*i*X z3>QoA&^YSZ2jJd6H8_y7k)sicw%Ac||K#m&bo>O>6V{ofbxU4fzyf^hXAGy#CY({X zha$EH$_A9{BS)M;c7r2N3eeh^)3DeL7bc2`G9FWBEs~Bt1rMD*#bSiJ{FTyW)w0{2 zur(@Tse8D&w4Aex2s*HI;qrb8l%JgB5lFb~(vVcw3(NEn9F^l5&x# zK;)UKT>3K>yjtIr(GLfSdarg})3NKdjNSIXOfrB@=P&nrn`zV1WIHFo+bsJc4Mu z=we35+#qyRDIvYgiItwEJ@!a4ee@kVdSQ9&u~Sq<5vIHL4~J|Sa{zdfx0Pl+;mqpz zk({RgW$w1$cr?5Ze*CB0rKXE@!9mD@f7O%x{?(dWVR=?^!rRU zLT|lr2+H^dmP5a}j^2u)fdD=S?{BgTuaX$ME7f^TlvsX=jJw=g%Lo@e(D^{AlCZ2} zu2M0ONn#2IZv!rLLD<~`TKa&6@Rvs~l+=*E37+Z`um$kR>|mnabfN1TjKiiMF^dL| z<`=s9%+0wFAK`WT{jj96z&5A7|$lWgw&gBtWbrsuP8bC6J9HLv_n%PXa>E~MHiomK^!-RDcnI{Eus zuH5XmH;uBgJ62Obfaf!keDY zpeh@&IkJRFyps@=qH5?c8dImDT2aoG6A4HP;$PS1m;%&G%HR>y)?K8&oDm;k%K-*~ zB4iFsxRRsU*ch;(``YUd>-e|mCDa05l#LUl7p7O(MLa%$pkzkp!NN75@5VllUQ&|f zL~hy$s1j!cRWKS$%Gz6v+c7%EbWzT%p^m&R^+dM;kL|{!XrldT+&%8iVEw2?iNZas?)|IZJM>Cp;XjJ@lG#jGE#*pLDBdeimXcCQBH zs9r=>TCGAkQ!NEQg9-h0NXwjd(@jzz z{X3GDNj= zG5-xGy%MXOH(vfMx=L^hq)(mvibB0-X-@(%XPQTAMluyj>|6?3K)K6+&d$PUyZ6ml zY2_bv{gE_!I}u<_e32+RYc%hbzE1*p;h3|Lo(yL=cQoXe25|87xMn0cW&A|4l6jPD zF0wvqA#9O#!OwtuqpqcXDV#|k*1im8sDks5|E|1-La!ZNNow3V0Jhksp6?EEcXRir zd~uSWfj=o6nap`|mF*1h)OJw~zPx%@r<{;8lS^69|6{7IhaVRqqgz)~((fp+z>x!qr6THBp+hq3SSr#ZbaZ)W^)xK2ac zU{ytqEuNN$t2;ySfe-|W>Qh35tfkCyS@r?LjpyQ@N#DZ)xHc|0>Yzxce&Y6SWABDj z0^mW5m|?fY|3^T(&OSX>zqfuyO&gnd-SLzffiLv?~4)2&vwWoDU}Wi9Epm zKMlvGn5kn9Ob30bJ{tC)liRuhiN6_w$(TolU4BV`?bB_sl#_aWD+v}PPg~2gwJ3Z4 zl!_+|FHck~hQ42oRPqQ35p;<1I~h-rTk!AckC+`_UzP0L52ktcDzV^M@+4o(E`_vz zphSG2d7Jyyi&7w(WQ-=+x^T7tVTVXO7imdfB-ScHhdr2kKxeb4=X9pRJ2^po$&Ps{ zAEszTtjudTml|B#a*({i1dm7dm%(ho$mW<>G*w6YYG7<16WXOO+qCBV^JDy;dB>Wh zV#=z^n8Mz)lqH^I5PsIs#5IRj%Pn1$V4SnpSlTf-4a52Lu3i=fDTOFx9fqvdt!f@= z6mNU&4Z<%MnwH;lEOouGQ5{8T%A*yPO>yo8aw{T>l(ty&A%6QGxFTz4e)nc|H1r8` z97BjuSVi=YuUHewsdWHBs4j?MlbvfIEY zQNx|JHpNgIwq4JmTF+VppM)+{jaKP%!@*m;9Z-Mu>X!pNf!@1ZD9E9j-B3rdrRzwb zVxOX`h^{}ZGT7OER@iXLK3u+s6m5ZYcRxNFDEoAO71|t5q$1yOQ-nb@SV_2}H2sXv zBdUn(ftGRH$t2uj%=Pg7g|o}1Dt9>m8Tw}y0P&cfq(-G{K*mb{Zvh*tCwXxocg$m? zaxURrzuD!x#2?MZxzi-qS~L5t?9L~Y3N+il70k>ASle&DxV#CGE=j-3fLk%CLI~-E z>SX;nr09A-o8zA3o+WLpIs0O_-|8RsZZba6A7<*rLbT|&)j{xy!vS090)H3hk7>5l zdHYpW^&Yym@D%Y9kgoAh=QT@h<&N8AwpethI;f{5PNzxZy_@q~f)|-55)0LuMs(>1gPP{hJ&oSYC3^1^+i{c4nliFG5gXqh96dT<|@L{g%I zZpV#)$QP#6;G{K3O=fZ$3-I{|M97?f=;Pa)7qiN!i;;GFF$SYCUpUVPLRi?vM+qH; zA9VHtxgjLc|F=Mo1BZo3Wuon4^oqCB-jlGJ)0n1HP4ThnJ6pgoQThk8$0m=$snVLvtoSA z6$|15^GR|BHcm(OyF4VQ+=pOPP#xf2$;nw4$YZPdL(zZ|GGyNE!tJ6FwYFr;+k_`l z%is2SC(j{5l+jG8IV;Ya2K`+3N!i$TCE(9E8dG!JApAArGW??1BvY5~;>f>ZJC=78r6=*QA!hw+43z)1#o$$t!-MMr8XFPNp%eL31 zgOs!#i@o%?EduuZSu=^;G#e63>9r=d)-D9L_m!(`>7U=P6UL+ERT33`eIYR8jS~pS z^X`~5$ZB9pvJ9biZx0tP9u&{?T?bc8jF7e}^(^o5a!^Z)se9 zQp8O&grcmhW{ors)Vtzo`S9{%f`83vP0PYN=7ktL?&3sQ zN)kToJ&b^D6^X9 zUsOLUg7y^#mmwj2Nl_Wt(x8hix?kCJf%tp(*f0tqJGO0`BhlZ*(pP*OsVafGQ+=IiG@Pd6(l5`_i$uWPI` zBsx3mX`=TZv0x_@2uuGh#-v>aZ*FH$Yz?1aimTFdWAg81Dvb9*o*m7qX^#8p>V>jJ z;NoT4q&DJd*r!EM4LLC@-Eb_yMC-3y_vZ)-y{}ZFfw7go8jQyj;o4@7Dq{PDf8Ks||bRX#!e~vbJBd)wIQFS?oo+06DzNw$M z6WhiHr5EK0kYvPENc{8cSMW#ciueWz8<sn=H^^so#RtU zeFY>whC$MNG*@AvOD1{Yki&kr#N$APGXq zaBv|ZQlsL<(6_B^Vx6qgV(pTXilOtfW00+^OQ ztDwEZa~Qtx=7IuKFL~MgE;|N`MFG34D6h}EZK;(}W{|l)*W|g$r7vaa&58Uh0d_Q3w~_Nj-R#45c65Y#l6B*3J$VM4!F@?=6nhUF>@Po|#3DodvQ z`I#&?%T2^?9x|?T{@|V0&0-ohwe%21Vdh`-@!^N&{G&8BnXxtq8NWC&$dYzf=CV~%!b+jb1DE|{Xq<7cKlR77_@5PE*Hl&GqFE;SfTu>>D z0Fs;uK9_nUVe&*U)j||=BK)7#d)R#UZ%ZsFo8>oiR&$0YudddRflru;(jEgHsTc3K zuAXxgZ#lzTQ}ITVxvl@kcdH~FYLTDlnRmb6Q*7qK@ZsK^rNB|9L}uv~8_;s8N;Dr# zBG2;H$2m=FeJ6`Mrz045b>06kR@W$&dg!`xsW**DCgUzVv$~XVt<{unFbojkG!q{5{AUNM>Qzx}5%1ym z^N<9C(D}3oBEx@9C*r8Z|M1(ZSb4Q;Qmz(L@q6+#U!NA}@jdRJ=v+?WPR;4qwU03q ze2?Y|4g?2&{su%$T4DJKlWJ*pvu8%dM80-0xIgZC2L!e--Ehtnuqy)9n?xeUHUSJn zEn?WsS{|(Kl!jERBC`DB)IK>p{~5vnZu$6 z`CBc#Q4$j0;^YnYgw=%tFvmImxAbUpPC%n%aS!lCvz7qkuuZ5NeL^;hFtjX@OG`E7 z6B}%bmsOKt{6KtOj83HK-ABHu4XOQ0EJpyfI@~NS|0O0KHe=Xng|U`#Etqt(%G>QA z?zI>JTe+uUZ$NL%qy=Rnb!OcS8j>oj4lo{-VQ+NhcbD9@v)iEfXbL$3&tZuenRYt^ zu~8->waye%n#X^G{Zl{lw7cVMWj@`S2iaNn#oHmTTa*V^n(GSN{N*Q$sci-&e`?Kttn_`Ma03=Q1o-k(L$7&W$ zHo>}Xv5d^i&03x`N%>e@Fre(B?eh*WD*R;;*&9=yhxNV-?=x&&la$V4&o+1%mV(5U zbvEG=u8O7tgus*$(?^vFdBN>dFaAc=bM&BpvN01bvs5CKI{$i(mL>5DBbUMD(oL|w zzz;8Y6|&JT(E`f}MKelz!-_eWIiT*Q2v`V+D7dPd_Sl9a3di1MU5SL6i4T=#GD`*B z8%&pK5c7Vk$u4F8>P};{WYJK1I8cp^aZ>@kY%hkro0d)G6+c3Fs{n@KLkSCo%Idla1$8l*(A# zUBgXtOhunkmyJ^zEBgsW#SdDbAgMGPB-|~&^dma_hqiu^PAAl8^Q#~^^Hk1J4`-y3{qPCcb*Z|fSqWx__ACH&HaLPg0nAmH3&2c|F#MpxDtEsGe} zW_s?8_I6YFYKiz)ak*$@Uuw9OBs-3G0*9&H*x@z~Au!(>yA&yW4qLG%9MDA?ZD>4_ zBcJAp{l!z)0xDw3dJ`al3E)IBjPLo03%nisq||P9*H-Bi{^KAR+`6k>#CVeT9NBrHR+llCZoy z@$7pi660;oylhvhsF}`mX+J(BiksQ|QmnYG*d9y?kEBn4>J7hor)*UX71Do{7#I0C zqYNZqvmOBdQ(S~|C!D7T=5Atfb$cnn$#L+;%)9327*)>LY=zmE3Z&tPzTW$VR257$ zH50s7KBC?><|xBWQmTAXnfJ$kxH9jLqsqKL-l@#<-rqGRr~DyTOGoWeO9kV5^>=A( zFBjykT@?9R?fqc+f-sS&tn0)xD}6n{OGMX(WdA)xz&%?5$Oxs_EORMWu!a#j0niLQ&bX*6u=0 z24l&$NJ>4tA8jNo=dRZ^fv5#(*{aYCCu8>_yqh#K3+`gU>iqYxl{b^3)m4I?#G-4C zrx%b3QKV8N*DJ?_Rx4vIvE-;A+xQlQk|HJFA`rg2a&_n$nIgP}_D{?$-4ENdIaV}E z+K*Izxk4w)ELPzr)Ab2B%{z~id?$S#Ov<|JE})?OOgmR)N0z0)x?t~@ul zWq)>|RXW(Qu6wP`q{PrcieWFaHf1d&gEo)`-6@@X-Lc%w+MQ@Tb)r6_itT1LygV0WF z?e?(bbVBe>Zh=l}uuAP}K~+Z#xK;0d7dydFe-~@8_@g^Cm4&ky0^cQE9Dg#u1hR}D5gV(}APkqg_0hFwOcUf~+!QAMEC z5JshnCCz%U(z^5rb%Q}deGuSvFkopK5qogmb_6@EIDw`2k0=j1Q1ymAlo6(nuFs!EmSDG3sy z+lp}H)K>{|d#?PGwzYU2>HZED2J;YfSz!$QO*J`W6$cBfI`pb%U{)Wkc7E;GF z7)#&*It|8TS%Jm?@L`eWeCGEmS|aD24VlTnDki&rHcc^-=ZbB!ghqBzxSy#XqUJ^Y z2UAR$(z7YGbwkpMM=vFv(4?MRMo1Of7+`GHsL$+Q3Bh4QnsCkWluFpJJ$!J1x;M5J zp61f9MnXg(H)2)S=!-udY^y6Bome9%iy6KsV$jAl3ZQXimrPS-*=J-iX$v8_nT|?u$((Ef$d7~ZfT?c zUV^+(LJGKZ^k*`f1O?K^hm?WYqraG`4D))((s6^)tj7ykjtA+OL}m*GvNU8bomfM% zDRGr~u1+s2#oDBj2(z~W4ND1sABXdzl`ajfsRtzl0$p)wLGwU|?XCp_OT7+E;vd}- z2VW#eFa;K47oo#2ej}tK?s$gL+WX99?GW@hO6aiuBcPu~=q=x*b8Px`x4^VR$1U=^ z7}Y!x&kU|AgS&y06p~rFDk@KeAu{!zdTl@dq?=q3q6p=IiQRhhys5lcd0k}~@tq$@ zLQfQbp$j)h1)Z7?W;l0cDkm_m5gld=Z9ic?GVD>{7Ah5hBGn36j?5<wx+75{KAn z{Rdzh3`q+zIB8MS3Qi_Avj8paHelhWU=(&dTWs4Vn&cCf4Il$(<|9hrb8l!pQQ=Y= zoJr;fGr5CH&b{7Qmv5x6A33ENx|vvxH?fY4}>4ncd5FZ>Ssr{xx^!{_5(F zRD0SUCo*hlL&yFX3g=~+=9~4^XLNI0=73jNUzv4M6{`@7j=8trpS3uTDLA=_AAb#d zdzd|aaXTRbjHuJ0tX(>b!Rq)&R4}J_L<6?AZCNS9xPmZqS#Mot;|Ly1)|CjQ}@QlXOGB^%q+EYSEgLU$48`t&~W=%7hu$xlUh3fP5m6bI|9W}pJ()w*C zK+>0@d@nTa}5j8WL;flpaw!p9T&`q&g|(EIF4 zP;0rk2C*`jFvUh2Wj;wFj`9`-Im65=&zPa{`|xi z>((BAU$il*6eRT-j_0hhiyd9@tafRz9MW!F`x3b7GgZH0ZkT6f9$KbBLm=UGi}cdO zGUyMLaixaIAI*dDD>1{MYFUe-nXU75M*b6~;WIL{2JdzgR2mCoZB=`J*O8)h-_*3) z&uYHJ3nOADgD_pu&-FnfGFmP-37&-?(=HKJ=MVj5-8ONR-C)XdQ_ffhu0|n%Acq+% zbkjHP`00x`tgs(!_lVT}+2bb?Cy@cC$-WDzcbRIs(U~qy-q97$M7^%DX<`o=ThJyI zA5mK{D!=#xBxSRB+b97Mmub#;ig}j&(kiLpE5E%6W2Nxw&DI7gpMR&_lXNxVJ#ByN z^p!a(sEKfWdbL-Ebk!SZUtg}*+Y8=^t1xKlI2{#FH;slKARek7q?&2W81&_Jct5ta z_9-UcY@(5+M!C(TBfEJHNE1l2zVKAKNoQm5^+--SFPhVL{J5>77n@qn2CQ8`nJpF` zZP@x|_{j`J6%D%KzCUNldKV2oNwi6_dXfoq&!p2df#DRV4Nt42loCeSdB1>3#x)<7 zr63gtr=`tm9oETwfOnvpPCYMkoZwGuh}p6cZ|Fy17)m)~mJ(5ea!mjJun@LQn9glo zHwQOo*TL0|4q3z{u8xStp{#pwmS8U(Tq%?8h*#`Uo=HNusmFHi^Rd%VQe6{(5I^&# z?ct;&t8A+1S+p`uIKwyC4_=lqPA_wvN;JT)old>ey5F90&p#BTE7z$8livY2kVYGdLRqAgj3kmErc(p;q$fWJden+Fu(; z0~P|N8jQR|#WkC@;orhoGt1U#6Rl)p4U(Ia`Nxtz5q_*&z=1YeQM)FLxf!w;Df{G1 zyq_6G4X~b6C$d4q&ZCtyr$r~;$X;oZ?_AuIRq!g#rPxREI+vd&l=b3xnk}AE@7`j| z*VCSQ+K^EzM>n%BW00aQwVYHamKpE7Do3NXkv%l`H6%n zDefJy*Ua8suu5Q-w*4<8;3B2m4=x>PH%C7i?oG&DUH8>}jp6~MMeO$GCY5-W4R4C3 zoCs4&$LMf>ca}ln#!M$#^~>>G-9h%q8IT6Gnr*aCWSsC5gb8QNt0%+T6r3@3iPaRK zP_)#k=C185Fn%qpQpX0b=1MBq+DZLY?F!ewr|2$^{DUIvv_-k|DG{i)Uf=j47~kj) zC7G^%r_BLW{I;-gJ`4JN^`c2LB$>M4ms6kRuYm)|02)@wPta+NYC_Lyr-2TI9m~&(3|oyYxdHm zLSUSc?a+k1;OG#nFvm|Xs}p4kIh|n&%ubw^qt%37^diETlP14FC$B^DqY0i#k&g29 z1s?Dq^#L?d!;<&@9yHars%(3Oe46gJ{ROqlaO=UVzNsnYx7Lzl0_4W-m^WB@7eDec z58CgLh(rsYhjB7|)q#4S-sq)7I-aLXgFg$3$U?RU=o{Jwg& z%4f78q#+%6zRuZI(9M2Mk(Omr*OIAbVNA18V6V+gOuA%gYZ_Efl)UT-!-q$2e)9yP z6{d^y`^2+@E3QdbH$rVv??PotblFI?1dl){-kF6sdYa;f;|2g)E<32N-DHA+U1%3R zef zQ^F=ylEUptfrwP{?06;0!ebdN?PgT{Fl6xGbnHL1O!p&VCFz9gc>ZC(^`g4;;6IJ#AefrfPybK6+kCpg9STU)KkNV+<(#A+bo2$YTQ`n%AYOh8O8 z{N?qBqhDvz+MHe+%)9J^b;M$GE!>7xS6Vq#h`8P7jKZznX;ImxKV}&;QON;(Wh&Gr zAmIf2epj5K4_N(z|BCp#2IdS{Hz%9fAqk-OV*jP3FkzImaNyfXi${nLTMJ!E%jnzh zO-WI?>~u`mFR>UpR+8cGZ|34E{h`imyE%>BDthPTYF@{GY-n(kD!NxQx00eRNIY80 zWIJr2=0DwqX=%0K4t7``F(SF@i>DN`y@*l;(%7QjC}i9WqVr=!QMe;y{PDo{!j?Wi zwu|E14IxVAj*VC9ee9NP{#$4X?0e4es5`3RLcEihSJxs2Yn|~3%rBqbnc7BBy_$QR zo>n0zE6J!j(;%55O?&S&qL8(v(wf^G`y`707QE_ew>$zE!)weeLCZBJ+Pfez{QBJF zF4>(yT1Ec=`BS+q67OP{rd;lO)0A3Jw>%>2uz!wCBz?9CTP%%6Y9~LG`wQ?w{6&C? zb>@e)HJjv%afsi8^7?6AM_L?ng|%8r~*NwSz7PO)KTM}o=u$HJb>BNjBtNw>#oJ= zR)y+qD|beKhIUi8hDEdlH|J|RxS8OGbYvYE9xc5%J|y*N3JJflVpAyT)hd%2Gue(; z%-T=`rgWcv6`lIzTmdFNF~|FIYy=wyN|{7eb4F41k$AdN{b-j7P*hTM_J9lQbtyR6 zcFa{xC;E?_UR>(`b68YlNrIA@L^AO z*iuIoH2dD&L!@08qllapSmTKwb#V0RaUN>3vspRYhc(k^ed5L1&zH){W7YDkMICT5 z-X*TVy9%+&J*HZyrKN-VN5r>agZFE8;bfmf>9X@5e*UX}rhxy|FaG)dufO>ve*5At zfARC*{PW#!KcQs&$seX<{7FQ~_>&zMskiU&2WMZW z{*z-r1iV2JkXe4C{Iq`6iWc@9d}Sf8|1vij7Mrse z2$#+Gqkd?tjiY&yv=a&b(43hv@Ta4N*i+(gx6-lqmeDPzpU_#5P`o-XO0U9B(=1>x zOu(Pj0PpW%WhjW!G*Q^tm(0|yRZ2>27S_RMC)L<9q%3ce%7m_obVPy4R@J0x%`!gA zfce@nKIROgCnvJ)re)PoQ1`pqiQH0SyxPLSB;T1_KRDj1CNWB|;?CAHD5iZxCtYnw z&ic%moZpeNl^)*>&{fhh6EQh5=RlPocia9bNEE%ob@*_nwmf(~kona~=ed7cIb}7( zfX5540o;MGeJ@^2fBNBSsbsM+D-utAqcc#4n%Calgk2vJ<=5~HZAGuWMWFSmL!dSj zo3R}YNcZiPIVwO);2FumeqLL#n}CH8yE+i+j~pqKXC9K9YEbaMW06wIuo!p%;MnYu0oj1_rNuqVnXhq{ugQrFhqJ2^7z z69~c&+wUkO=TMG6&xk7GoLE;%nsNW0ld%5(_vn^N`A4N9sul&p-lf*Yk^}&xQ$6Js9>5kWS)-vAw~8HlTKGtNCtvt`rus z#W__1hugObg3v?i1= zrqr%kKAN6}&6>rt*d)MxONxs>KcjIJze9bN@TkXrN*u8CR+Q$R_CURU+VmURm(l;U z?;2$*>K&q0wK|iZU8XnpqxNhYw%3tWh~4XWG->ItL<`~bHh(i|SDo({$r66LbNR3+ju1)qNKo@V&rcMlJOghXf-iOrNuGsXgY+ul01GaFo< zsG`*^w;rQF)>*5mVKWv(!~~^K*;AK$iFxQH>IN`mL2QAu3AM%aw&&&$sl5uOBgNT@-bwXlvvqa)&D86Y@{4R2kYKyOrB@GQ67a zc68^P!hcI&YHxOX?9N~r3>o-Q7GJQs7vjEsL5^9-YEW}L$c8wgtr=at+wM-;@-7F{ zZPRA?BAZhUr8-nNhkA-1qo?v$S~|>_wBi^30uw)?tmnHU(E|#&S*B7&9JOWB(yOh6 z^pd0_3MWu)J1MB~f|p&xcjon)=hp@^I{99o_e0Dd@kV9EB-Hq9Znm_Z(*K5tj z@7{+7L+<06KiY#oVizWNk4XsbV%m8m$X}TGo7c~qV<{j>z5wr#V8=PkNjGe17cYr- zl@?2qEFWl*A$CykN|-@cWguDi)Uz!+S0tqoKDez?V4x`reGmuMX!Gn#=q_O3>!J4H z7X%`kH2I_fT1yjEBV9h=kaj$ER-p^5)tmE+5gU`?RXGHY*Oyc5p_%M>y>1w*y4%u- zCZDv5NMk|lvbb!qMj|tE%Mo>;xL^$gaAQcWz`QQ>^(^HjG?H>5B(0QV`Im>+|;xmq>&9&hr}0U zPHc%-bb2$7QCKs|tKnznj=FnFi_$ZkKWmf|InKPscG4N9Y$?FHuSs4-NZLbL3eIPm zB@1FpzW8)*aYMRi^ZrCRNrgeWf?CqAeU>>Dk$L^(=~9@@`Z-lB`GoC0BgcbS@(7%` zLVx#Lcorv9Du}fCsO=`8c7#W04xH~MM6#rM)~+d(YAP>(=uSppnnkRn>mRH{A?K_~ zD7UGHVz7b}xOaI?6PA6}lWn)18rB6Wz%tw#;GKPSgQ(mFd!LyhRSsG;z=F>BPyvi{ zbtP)raG$8R>pUmdRAO7V2N8ODrh6!Dc&(AzJ(5piRFW}cqK_||5MLxZ5JZW&VY(6? zjy6-Fe4KT*-S?uCK6vw;uV_ybl?uK~#8~GZgaIlXD<4Ws$yUx8F_OT}_uik%ZGHst zgSnwpi0`2T zjFW@BISHH6A8a58nq*fxSN_?RcV08+k8%hr3xilo-)npl5%|+T91-}_C?fEuyG0sB zo_^zBy!bcT!cmLX4{RS<+vEH6hsq4w+@|X!HB*@jC52K~KTxTOeH<6C^L{7Qd<7eW z5eyiCSz7??FrBd3PrcgEnprVKyKA^r!{XENC~szlwhanCY|A%+UCQ2*2+da3)X-_` zsz_SJB%XPU^F|t7sod}xCH8NR;OkFqPwDs`H<`rO$>bBm%O%~ZFc3)2ZuWA@K;OnY zB$nyYa_Wxoc<@?_RmZSS%WH2?Q%T2%^esvSKiSnqOpkU4BhuXjK*J3sNO>cI0QwoNxauZIi^nQ`#PcVB9<5Kq_y?$-@oQ(`)Cbt&& z(Don2Xy*^5hekVHZeUQMbb72E2$ zMB{O=mh8I}a>E{p@g|3CSp1OBJWsc6A1yMq!a{o^OSanPHCe z;#z9$Z@EL^360Jp8OQ{KPB19Ars?$Wi;sF<;%3zsS+Xe(drqv}@WYZSqUr4{Ri6X? zGckL9NItA{XQd&V>h0}1G9t@v-$2vM!^G1>>q#j!+F`s|PEYQVLO3g`POvmGdo<|G zsZcLf6f2-0?$C9ObN8_{sb1EW{sJ0E!B;TIdB?r*q+*6Ef3Ii{{QD$rNey5I^WB!E z%IBlZj63*&g5`NW@F6PDz*&=#qv!G^dR_S}Q(h6uQ@>#oo%i@%bL?HFz1vn0d-Lze zm)g;X2QqK)>RyyZ@v*SS!7vBD6+gxcHD2mS9#O_gnsy2^p7Ub`sj$6RG{0qfNs^Fn zB=M54QP8}lrp0W_CbtP&2fRYp&i^M{RSYpSa7> znMjiMmovH-L^aapmbz=mXF&jPA9EC!;HbzUqn^}bO!HQ1v_W@yGrQ$++|^S(Y=#xh z(L9hr5P$cZbvn?eV+gq(cg*-rFY8pOUXN*~ZPlLlq6*lgzk9RwkXCEf)yT%&#&zU$ z0-&Q{m~@NfcTdcK^cuj4Xb+CO*CHzuMEmKxV4e*$Bj5Ji)sAR))F+wHqx#! z#V8}qa5BF8dQ9aE88{T49|YzqMuj6)F$5=2q$Euion78UXE3=v4lS{njCZ|K+Tsks zk{O-_(i{gqgjc!}J$b7&63X0Bdx7EchSLO;DtqDX6bBOnD?@b7=+Q@%lC?oxc&kcX z(cWTOZE5HhS$2ugDy`7nJd5?P0T-V{Iwy%Yi8n7^@uM z2}uG{8ev(S%s+{q*-W9#%Q{8aMBG8iHk*@G)&m0g~nsv$Bt4h(7g^0oG-pjRh-vz@s<9`QprLgEf z{cP7vGWt)_o#k=R5-`o=@MWb1EB9kwE{l+%5Tn$^*sRY?Kcf=sqJ~h6yhiFUoL^wK zC%HoLDE348Cd*Y^bnpPoo*X66(|%!QL}HtmNE=@z(eFA;WkkjqJ|O!|OJF%zFVpzOB;O^M-63 z3MJ!If%6K3b%tK>4r`g;iW+Pae*$j3#=YSYK}EBUB@2caIeU8nfe1^6p;N-Sm9*Cu z-_W(|1VRqpAk6bHt(_I?s#Rp_9FSnw64Qz@V5Pc$(9&zRcq7vYVll6GOM3d92*X~A z25t?fxUYA%u@;*NiCUsap9MXam37~X$ollTpjuU=4nn8tny41$-sPQwR>S? z_2fY%jMZIvfOA#+rwR$94z0!Cpq)M(hY^MVejg?(`SRgPoTL4vJt|2mX`F5r4`Jt8mr2%_V%zM&MPmb6V$`ZND^|=d8h4)Y$QmU7J2yZSJ zwK{KEUx~+UotwrJH`k|B%FpsD{>9_&S)IDAI2%vT-pd^Zzs*N2VFc&E5B_Ye7wmol zF~elKi}kx4%w3G+?@4c~ouCQjfDwjK`%@-%MpqIS@4ET1B@IQgX17jdc1_Wh{D~ib z)xU0y?@j>|XDni^ZQaIb;b=$XcUsSZ)l@vDXK)hwMbQ#}*|&}i*)1}+2ioeiN6`}A_M9fto`)Tc*=2s5PeD}Ee`Yu4{(0EY z^PlCE0KgBR+}M^?WP4P?5i6fN`)&_=ndErN!NIXxcQz3%9ovrL>jF9C9L1IM=fQSfBg0>sVj2s}B$R3o$JC`7Og=mL0~&Nbu802?i3Sdwxiy(|jW zl;am`b0eME9`m%-^@+cjZKkE58&_;8X!Zz**L%9epPc!i=dPe=xFm~Ktc=P=aFb-C zv-+KN9+k-&g-Y;Ow@JC3^V!WLuIk*Z9c+wkIfXx%`>4Fx=D-5VqQougP!-bvk%qj%Ik@olycH* z=ggn87npw!pOL?K*(089%T|dcWz%mHBctSIS%UCv*F|z-(gIfkM-TL^Am^meLRCr^ zXcm^|E_8t)oO}cWWwY??(u_tLJl{;O9D8b8GG|N2g(;+rww;PQahgW9_0rBdZWXU^ z$u;_9D{bVIMipb8RRREZQ4DKoXMD-w>$lm-V_Iemlcwj`pFJ>FnQdrG4|t$l0yZs| zr$-{e(?H58a#SZ7aq*slL0n^}s@#AogCVp^b8F}|Lns|@#4)+Rc3`vGX_na@b(!JT z9i+`*5vAbr*cXzY=hJnYC?iX=sqEblzfsHRRBl8UqIzL;x_9lpWi8!FPIaZ(ZC#Mo z5w~aQYT^U(6E;&a_;$FM`-uy`$~5QUhXgnw&Ha#`b(Xx1HNvdsA&1 z#xo=OY?3qCQ^?A0`TaLreuL|!W1XH;Oz>QNu-qx_zwgh}mY=X73Ro-=-=ONpmapd$8<}?Ed7>;Mdy$d}w=)+=%iZMex6~ zY{LiEvc})}!@6ya7~5lVw*gO4;AYZy1@sXGX6Pkr)SuCDNw)N&l?@Upo|KWJRRvbj zR6m&oGdYQ1I@SQY3#*cFJOsX~!H!rRp3+{8jit7eaKuOZlnDP&gYn3l zSg_Jsa@&5~9^oA^e-#Fcl6)6C`)D}@Sk}aycbN|Qk_ukzxzFj+M(hBXhFx3cl&W^X z^ePkWfGG}X&7Xf##-?v4DWR2VUfaR~Y-)JNrHY=rrfhwZ;@@w*@rsJHd7&rw+RkdT zBC~ZiC`6SQ#H)IZY?eEfdGBncHd@8rstCr1i>7tM&wIC_6v%1RP8~^`NEhR1iK3E4 z)!Hn3fZ*aXY?nRa?VR1S+Gcvv_tr6&L>a60*=EIs0k@neR zfW3P(Uv@POj}%`eNyN?NY>nLc1LP-M9N|Z!M&>CC|B>gT)~6p)*38SDdTh*VT@3Zj zMPhsGv_yjJQ}FuckGla}*G0^mwY0PDHkdE9kz6=YTu@536j^uKH0$lR&DCR&vUDnm z%06iJ$8Rs_3$KzYA=2zU38X}l8?@a5fE((N-XZCne>fVBPfoK+GQnp zfB#F#uJohwd%{a#bqTdasd;+=WBz64J%)+r#uSjcuBYLDUB=26Y_;Z4RY&%>!>G?@4lkbf2gAX(m^RRLbArf!QKL zEL6;~4VE+#v7H5CZ_+>a&86Mhjj}j51#GJ+k2;^#>8Y^=OIGx4EXX{4=HqA}RNq>| z>Dso3!M&&JU|n>}x(&Zedj;rotxEVV<$NnM;;X_z3m=pfvlS=pcg{nhcesAUlTqVL zFJJwLvZ%X6N(u;m9o~D~-|F0%Gm^ACYP{a>R!8p_m4RY;;JIB^a>(Xy!!JtO$Rig1>J@ZQg`fXY7@+fLvTVsb%aIp20Is(!`PXM3S% z_mEHw3plTk3(@X|*E|@NK6{$&?R1SkqCTnH715+mi3-rJxE>{ayXPW8D!N*5X@l6< z7w_6;hcd5n$iw4iFP|Ot>_`{3z0>t0_hYGU>ytEQB}Xx8HzpmYM6raqS;Oj|((P?` zH;XvkF|j))cEQ@8>Xc`!N+Hr_d8FKf-C*g~T~!u#@!gb;cjKBtkvH5&FHMilfXaSc z;ELmDy-$I<|25Xx1s-h&!%8aHAL$W7zBHR)46rtodW9B#`H1M-RHQCe8R@s(xUP-= zw;#OcEc};kuL`XN5sHh(`mCEaJY|oAD34~T)=F#9P_Rb(ca`28?%qI;4A~a>WOP4-TZ^|9F z-(VMk&J<6lgOJN@nXp1j-@x5t{^FkA2Ym2kHdtkC<}0g}qg^e{u>liEpeo)$jWM_W z{WdotxJVP(!RtArTe}Vpp!;C%NuOiJLNC*{*=!U6Q{1BU__Utb&bKiP)kXl=jj;~2 z=~Eddl^DPh+ssHmciM9IZW6ESasy%?$?)8ZkVX4=;=Kv+Ob=9+CiN8ENy3KlHQFOw z5rAqaSS5RycEL24>QiuR{Tna)q#QG1su9a`I3sJ$CKsKy>Tsma;avn$fF ztgY8`Q=0lwxfsL9*A|^xr(RAK)QUfCh{@?4UBR=Hu+<$S%wk^oE$Q3mNJ>(5lnDlL zd#qvp#cMtj3uypWt1cqb%&(7X^fI*1iyY&`t{9RbWu1p|*h-aP^(Z>z(W~*md7f=> zo!hOtW{~7IZjV4%a z%iXqTJHxj#uOvD4O{2Et#rd1GyGIxI1%(kpMI+kAw8>mv<_Pv)_S9F>W8KxFV zDNjdEbkx7Hzn!)ujdU1~c63$_vaDc4s-$;Gb2g+DJ=#iTxxy8J;5;1JspIZ^V3%j9 zYS0rkY3`(aNP7y&S040aId@F1J)`(!<+r24Dmjx=Pt8!M!p1~!--XO*W>zpw3A%YN zxS3cs|Mb8fq9MH%;MRxNnU9G4Wf7v>C%jtQSVHNj0>ih12}`G zBb^G{Vu=BOE@^9QVZk24Oyvy*(#lxMoW?6HAkg*NOop(ik_upzuQw}uFIiK|?RH{h zJ9rTT?cx~Zo6bMhjjwO#&t6GT%9EKJY4r^CVN{H#tW0W^OvbC+GhJZUJ^NkdZ~On~ zse-RXVF%}}8V7brCGFW(jiob}g50;_=LEnBr=P#_4_40bX|r038i3uZF|RcC+6BPX zAY=2rUbd?TP+Lc*N*bwY+(|iQTn|N;f_(m$8zJ`?l*#^PD?$xsNWqd8UW88>+ZtG6 z%s}q0kxj(&ZG3mT@ye@}pLz2JqDag4=1>|=GW=E`(z%VZwT-m#V&j$c%w5caD>;-( zn`|qqmlLAuD7$i|cB{s1ydy?R&A0#Y4@ z7UTI*R~>nAQP;UUd(PNh+B}@Hf=5Q8zJ-MDcp$c*nx*Nk#W&^Gy~(|IAxD8l8PTm< zxjfPVXyPS8i+17MBwMaQ{>7x{Z2IRKLjZNc?!fmFyD7jEKP^+a{#ablII_+7ft@#) z)V>f2Me}RWONs{Db_^2Hv3{gL9U(ZdXkV(kXIm#M`KF&}bk?zzl|L@&sRU+;?W7-0 zcdR5S15DAJ+3F3;InV-(i61pT@XtIjmnlQA-(J6TMX@R@X+er zf)<_9YssYKME89q+9T7L{SDpr-J%Az6%Z8`qBZVf{IX=WKLy=XgWzcS#gmIGolWXF%>?19JK z7u1t7m|T5*r;?N|xb{@Xc~U@~T$W`+BTIF}La#5kIB>UJi|l%rSJWko%KIOjz9N@% zEzD4D&6Ce!PpLT&L7G|RHgDK-+Sg}1Ms^?h}=-QL$(rI5?} zYRqgahua2gbgMtj0?ocF_5|~bs_=s>@4($5=pO3vkwSWv&SsJc+^PaV^mpM1w@;l8 z)Geb%M;CEdT(?R)nmYAy@J4=|ry=`^uFjZJ_%~5IT$-?*rU`!3HNb!5nRYq@T7t0k z#CN(XxcB9{OV2l+fdao$iu3dc)5sv|$?6w$KX+CTUwx;L}M1P`Gt|Lo9+;H_C}$mT3a990~F8 z;8NGZhB3v;h==u}Tq<@WpYXfE`yf&vV%Mann{^diSyc%3NJzECOCC09-k;&TTjEj? z?)e)Jn_z}>Pg^@}-2phf-^t!ct3T^9`-`e}?e@;D{3y>aT^W<=oq_tg`%QL1S zxf-~MI=eu!a)ixpj7HI6@a7;NnESY7%`E3A*nOMu8o{)T0cwY9&zj*cUc_EVB3 zaj|)K!)^K;uGKAE`4e+W(a>zDiurDH;*Fe5vx)k8Y2Ov5- zyuFL4?2OIS6dv3AYvqto1%0V4_RIRMt;Hl}n2Z@OU0H-o9Js9WXr)O4>k(laIn8Z* zq@Qg~nG#xtHY5~tq8l? z7if=doIj&A{`bD%JH-Ejmmk1h_f;S2XB3)|w4=AuBx)PA2o-xM?nk@qeIA zPiLwGS$C3`_KIXl=c@RFUw21qF>Qyv^UeFm^{ojw3gK(W6*<3A||aZQ%A#gAXFX_UpaFiB3C(CMV|qYwS9gT5FErBl(|0mCMg20m>*41xRE> z5TJAkLh)T}PWq)+@bvWT>Ih$db`^E&B92bjvpYMXr~5*CNK_>aY4t&t<}2-iMozAj zQ8oUZb%Wy_44|666u z>5gGb(u@VFqaOGCFb&0xZDYN9atCaSPAP~C`r^+jizx)Me3gJryzA6ONo$yD)uO{k zpZNdLF6g50q5-?-N5SWVcwsPmN4f7=4UD=oHu=BF-P#QlK)M0er>_w?VqoM{7a1j1 z!V`NH@kudmTT@NI7j3H|5vyJcF1#*n@wk(h*|$nL=qo$J$tU+bt-9Dp;mGJ_g5nul zJ;S3tc}7dagKwo8_EiISrt;hpxR)y7MfabXd->U@Yqc)C^`$eL#tvHXgm~EjlnfEl zxuET5ldYEjky}!DD-ZTt8yCgObG3kv33I?Pl6YQb1^MX>B&SbI&xglqEr-Q;F^s0B z_F$Y5ZZ2VRW{xTF%yn%(+aVxvoa&lp$ax49Iz7M=BJo6*owP8gg<6nP|0=T&hdO&m zCJ{KBswON)%J6EjYZg^{+$6;#;^+8cZyR^jKa!}_T0Sa0o3vy#bjBxra?8O?_tN1G zpv>S?p2((@WXAs0{H)-m@+GMBib1Yjf=X8pjvNyNTg6z;4KwF)ucz+B4GWmKjU|fz z5(HSYRznl6vR^2_?#i{nU_Vmc-L#XIWHL#13GwA3)%_Z1GyA&cPJtAKS`XCH(K&WZ zwKOC%`p9aKM#>R46n$5fmTK`KlQG5^Qb!dxT3mo9C1dJps%|-1E0rldAT~RV7)UdS z$Si;9D=^9FCxWVN*)+33|C-9WOk?9J%D%*QK7fW#F2nX^kbBilxrjG~#J`3(qov6u zpI-yS1Qy&t=?-)pqu5jDPa(SA!x>HKPIOVGVTSJwcv^@>(nQC63bvv zFh@?S{e(r6&n_JVw*!Fn_Z-=oQ#$52q%{K8*y7!1`H@H9{eMryk3E+YTGD;71gjb- z(I1cnfikl85PtoVAeA5|=QCU(*8;^nrFoH0;L8{e|%aVx_lCT3sF9mezAHA5hBJ z{S`2SnlX z9vmJyxy+EtAz0_C+tEA9)`ce!mes~$Yo|sVNMcZ;A%DlkPJa{@w z*INJ@&Njg|oXJt@3d~cdcP?Dr;2t7w$U8Ht4?YcdpeEt`2SxZbpA5Succo={39}9Q)dC0d3*Aeenw7_kkD<4Ai(6wMM${ zzhSq%zKyS+t)lA;4wFyTDVOr=xGAg~rF2PBCV@lYXA$hM?yx^}vixhcJ}X7EDUJCR zaXOwDEewVn9Emz z%GM)^ifoB-oXKRX4l@IP+`x2>9eiOpbtVDq-t4I2j;v$ZhgWArq)w!K!RJ&&u8$z&QS z0}FQ?9w38BGA}Nf@S{jck<}({$ajGMcweB4FP=F%&b$}8^pxPpG;HS#IjyuN8n&E; zXIogI+UoB;WU?l4!gD~V)+iHzUxbRmAnz5Xv_bJfo&u<44e^*>4KELf=^*zjuYzQa zvsYY+|4#>kNB zq9v>DgAK=Qtb8RpC4Tr+zmY0aAhmZ9y&($OJ0x@ae(EWHkUMoqAMrCyLBq+bstP3r zO?Sp6Otj2Zrn_0bKDw0+#iA;=1xFszSRzAs#n5wF7{S)L++$@-Q)G%r%Iu>6l^@B^ zN~vJASKkl;_!GB&ZhQ|VG>)e7f}9fMiYMFYhTdjsa5yH(>8>vGNl83jr%@ zw-CN*OH9cTt2tQKZ=O`lBYXd3KFl)aEGerFyZ+RRMo1o(s?2Lz<05$FlqxZG6?IBA z_|jbI|6bkxefia$idocl)q`bIOky}HF#_^bCXCjtU%fVElz~gj%bh-k?{8#SfF>}9 z?jS3ZJkIV0dnX7k8ZRWWFWtEpYuh^cYiV z4SH@6;H?3?iHPs~0@Tc2S~Py zj~Hn=<)!@K`LvJQx?1XYVWz7oVURx{hk65%rj0BA<&UrY7kA~qY+jl1VREvJGrz)O zF|G`g*3QO>|N6%#{;NCjUsEUMk`EiN;n5x=anK?gIYkvEA(>i(H>)Ab!;eno;ltbw zelGgqt1^qJ#2)PfBG&A)yhpKG(evs0rHDH>TA*#dPylpvky93h;!d62Ar1^Z^Tq~I^)KzN3*R*Xg^ zq@$^LtlKMz>XL4gDK#`4Xm_qmow$GD*SPjBKB2@)EuOQ5brq&KT-1$M^o{tO!!0U@ zQ%2Zyynv(t)+SLc+O<`rx2B~=-FgmCJ?>9!b8LX3#oQis+T-2`J4kN?t;`bIoX8)_ zD9@?f+b4XjhBH-)6A5SHySMnR6}fg$W5>A7F%1srMDERM#j=mI9|QV6N(J5;#Tv(RLX}o;Tnm!)_ z(C*bINF~_4>0n2gcm=pm;n}hLP*D~UsI8PN?xZ}#e-sRxTu3Ci%fFKQ)1cKt6-M6g!8wZB}YBDX+BD=p!fH{RqaX(sIOEOpbVTSNS z#i@x8@E|uC9;>p({V960$@^f!Y6c>c^IKj*4r}drd^$XV)~^56GFQW`pmrAL+sWA> zg~u_}q_AmkCF4uu%tFIzT^6r=i1}GYZUnuE<9j^&sKhVo#HMQYB>3#81z4DckulLU zCbva&N^NQRZxf_IPI9fckoud2L7s^Whe(^T_e=vsN+GP)nd2H)3_mBQ1mUo2T&zN- zSPP<=XWU~40jeVRqnYne~kw{xj1y{%uX~u~Y7! znR7PhAQ>>ogO$i{?6-sD62!>iGK2E4Y%Jv$nV4Xxn_U?kO}it^8)c|X5`e2NFr%|A z#{q6Y41;qqpX4xe;8Qw0v$ZbauZr#9c~y1>;SK=~S~UB?=c(1jFW**=7m-)0cJ>iz z_Yt1u^MRl=!bVJn?yk$;WQ(MKFMds>WLL362M`k$*dqsd^n+@kD{kD%^N;GU;kY3` z?EG^18f)bQbCQz%&>iO&eR{>zh7`B#`8L)J8P#%Fdz63W(rK{>0LC=f<{f$fGg2po zT@L_TIqD8hH<+_r#fmPi0mg$s;(Bqdr|VL>1}1l{Pdt9*5r#5;R;<<@e3=L>aRbOTOAX5wgvV+*^G4}W3*2f*r;~*7z3=d z%$#&O;^KtkH~+j=^$}P8HXF^(0|^DUP`(Wc`QWaQhQq-l&z?D4nHDqd9wa_T0#swa zaQ{LJFfL8D$%%!Ofdu^3G9;qm4_OWG2Qe*(@U<23r@Yo#JGxQk3GG^4_q7pNPASVtJVkTQtn8^vf=ms?T`K5zd676Z<|`j;pgysT7W`X_K`?fGS6y8akG>> z&-0c&Ya8dUTrMc)i7<%{hd(HaB1em0x-~Q&D*UI$@xf4PsrG&%nsB%Ei7JPVb23G9#5wE`7QczqiJg7#KcdUTw zws%62uTC*fpTy>fbDk%9fhW&TbMHiyvVpB#3zmLe5snnTGgE9 z<%iB%lrM{;p~$s+0$y<`b)cfw4EU$d(f3!5AqBk;O^w%St@J5zFuJT&yb++TQOR!@ z+@7r6J^Nu5n|j~(U9f3Eyo-4GW!VC`PlY8S{3>Y3^>yiWC3vK|v<4ry_do!MC!SJ1 z1cVU|78dpqlO>t5SO-@^xz{nSIjO)rVCy<8*tA}*wz&(#TWR^=oF~Kx%h?7)hi!G| zY+Z>fDt`i>d23hS<5*ly04SDiEd5Fcj6+mp)w}ZF@ONC8q(l zG-Zwwrvf#JxpKja>I~!}dGq^2BikKb|o)tQXE9B8DHI zv!O+NWBlsS&)>^!oIxL1rTM;CB(bl+Dp#Z9=b(HE2VZ9R$LJdcZP@i6yC5fz3&oJP zF!B~+%ElSiKp-8j=?zM{5M9U>v~nHJJO)p-3D$*hEA6TuB%_9okm6Ry$2S!UWvRR zaBanEx%QRxa9PHE+>Lj)zZVss4Z=*I!h&3m6)-&>{=Ym5-1zWF}$;B^?xG}K}xOV9&C)#EsZNa zNlAh)UJy*lBG!Cgcv1^bG{xY0a#4Shcc`siBvHoudAP?J2JA0hrU`!7jRpJKdS$YK z`{Bx=-(5R6N2NZ6g|zhn`-BBjqF=mxF3S`)=%$mBItq3kY&&@(1)v03K^5V?}x=P16LuY;vxR zUs~Qp4XeHvzYjQgIFKWKht}*?*TP7 zPcf#mnT^V?BmL_akw4TSh+M0vzHRFmM#M_;-1BR?5n}ivWkru4pgx6rsQ$7}yUCsI z!AK7Jzj`RRI_3D#`z0$Umx5A^$u!Q4mNi` zMSgnqx#s=UR!IL{Z(4laoS}$Oqz#6wZluxv?2JL6B|e-UhGE%0i?{WC>86FDo-f67 zr3wGf$4nbeQ?92RmpjIUvo-HchbC?}qmssfgkYH-l0zNqMfpZ(bdig$6?s>huB~~r zKd(Z$WnKk|RP`iir8HUDN6=LUyTF=yJ3Z6B8sxvW{uiA8?t6OsJ#HiR69=w-7mRn~ zoTk>NJ4u1URJUn`68*(a8emh*4|^o7m6Y=>Y5eqHT^9bm)dJU^J0eR%~(N}i!5 z17(@w#8V@ElyrCh>v{aJD~Q@3#<#3(2nXawGGW3LpAFkRNQ?5@gKb8o4ra`WZUVNX zON2x4HYyPt_k+Aw=3&EU-Tzq&pgjY!K*F&l4Z8Jk%AU6g%xB*cTP~3{ovdM5)=vB| zKwwxe)5Wr(ZS0xBor5LE!ZDpeUaL2(_GH6DJL_?Qoro((?8&q7RMGMTt?Xh@%OCh; zQg`sQvc{Oi?{p~9m`1Vykhnc3Dsa8ExMZl!g3NwAe_%{jf##pNUmm#XQf@ zb;r~lb^0v2?10``wx6W6@FN2f%jQRNdc(Jxj3AL9b`A|FhYN03I#wt{;9Ik+jZicd zy(&@zDGT6k92V)f*`Q@E=$(Nz;_wR~hDtl`E%iWaQu};^B1LD3Z#acHFV|!Vz3DNH z17pHO`v?7D*xHH^9x(YIH^F?y&k9B3N>D9oma?0i{KE7b)T68zHwn&L91#niiP-U3 zI5-Hhdz$;>=`pxRcnV;HeyO}iP#pxh4wE(U&R+QbndZ}i@AJi8hHi4&PHrC5-(lmiu_Wh;# zZuOzyB>^Hjc@4|W=x%0B7_#;G`!8iMxzK}E1%CVko;v? z-}4$a=kkkqRp$B~@2HxsO>@)0ntm8Mce&V9s-3!I1ksnUYb3s>UE zOL(k36nuGI|F9b)ptA@MPVzXEb~v}Qczn2uMO4=msT$O=U87Ko@Z-!L3V!if+&^Ph z8ICZrSXpxVz!?Ez!dOLs<$2E1g@JoG>;ef`06ECY(dQ;jh{IA-19WC`56_@j;;r(% z;Ql?u&*nSQJ3PmA`&EcP%I!gh@(>nFVs?FTs3Vh#wgc)79g5w!-%;KxbJh&adeB7_ zF9uAu%dJPVQhHaiK$L4Yzd5kyer&m@c|SjHGI~Aaro%h&Ru($~RbP#YWxl3+GjPq5 zp=;UTwWx{1i)lmnPcaXdt*?Lr@kE~7cXJR5L_6B)JZvb0R{kXZT3^F#78;dt%%<6V z7#viULP*0uIaO*~@VCcAedIV4YSr6r7yu=4ah zI}x)MjTSKD^(#1!`wuMakdcI*k<36ACM=ES?hx3n-#bbqEak)pIIN)UE}F&PfCG?# z5xCeYU}vtg&Jza(_nn}seTGUZ5@Z&dmYISXY_vdPtTu(CIowJ^(0n>g;wVpTMY=ky0GO;scdO$m5z8NA{dXdqDKx{)J+Xe2kh-@CT!R_Cd-!fgPvSUA!r zeS`P;n{g6HiWc8jbk=NA?FtG}t+8x-8iqiMl5x3pI*YlydA3$fFcfOVP*E3zTo7Hs z-FL+bP5VX6J^Lo&{urq#2`*e;k4mg*!+rf3u0Vk9g_bQoZ85Q=8>aN zGiL)UF4N9s_;MTO1|EgOW0J#DSs|v%>FyaLqogc8qXx)s8R~s7XPVOW52A31p(2zN zgQCpAr0?Bjj;zA03FnOetA>{HZXZKy=U>H z#gIk$EBQ&9-5{swRB;qa?2fOY0YUtU`I*+|@D)#(mpuInS{J+-F)@sqNefC~m?FBb ztk-~^wRoHLCil*;d=lM0vVO_k%ce0|ooE?RgE1}{%T+_fN$9g3B(Uuuu)ILs0-abFx?kmViQ)E zQ9#mBk}XF`U6`q(A$KVBSAAt~Y!*u|aIR%UD4ZmG1T`#}b;P#tafm+>BX;=s!=xC| zvZiI?@|MKR!D}-pU!j#uIizhe>og{E4(sJ;5RP+T#koYE0;I1sdx~L^I~T`j3_;oS zjTs8!i0<#X4ZA`OOcPW)Q=-Op(AZ%QZ#<}2IH82u5UNy%JDuJJ-ZcjkCyu)b1*x_x zF1HkW+eo$_H6$R%+m@kcQx-->Qgd;*NzlWqc1tw*WsfsnB-1_Il|)v3#S(AzWtExc zw>UKaaUPRpH3Y~*Sb}Po*Jz14$Fi?csU^v5NB2{?V%*OK`}=-D;VOd~@yY8JB*kIG zgSYtY)+fQ%luFA>^eClzzPN<_?Qu^8p*2_K_I%T2@#?&Ql;9P#=CV#H3X$b$Ag?$$WUeGNVVpAUTi8W+N6g*MY08Wym#<2AlZIx{zi~8Y1ce zCpSCE$p|xKPa8%)d+cBplL%&jT$M8)CS`UIl!yPR0^*rRiIpNyN)}o$otPu&=ZVg= zc-dgO3XNCONqQEgTaSNy3k@dyI{d8id%RefkFIluMkCC0kdT-C#Uy+>&@&V3-L5Fd zPRC}cnvV5*fBcXwiT!#j#UYZ@h-ZdX*WHtfILzu0VkDu9@hNI~&?k0+$03Ow;BUGn zo$qmhlNm9LCV#>v&IaZukFDbTf0`&;e1^t9>2#9L5-p9{kEk+BGBbceuJ*!Z%ZYN46Z1D)mC(J5(DqTF6m{P z{+0HPc9ZJ`rNtNr(1v(_9FOUo?Q~I>{*2dI5fcGPwi)IZ z{=xtLCp_#w{{ANb9slufP)h>@6aWAK2mr-eNl@l&NEPY72LOa^5dawg002)#LQqpL zRAqQ{FK}UUbTBY7IWBl;bZu;uy=iZ=>6Iq-JwX0LrSiF5F1s5@2W1bC?hZ1*BpJ+f zkOV={aN5;vV;tMCYsTH*NKq6wag#)m6e&@ZNKq>ni4u1b=%3Q&{VbpK7jj+a+|NTw zugX;ch__Vav)s$M&$-V2)xY_t|Myp){g)(Izd;aH#Km77XKluCK|NisOe)sjSe)73|_xoRb{q;AWfA-Bk|Mu&jeE!YX|Mbll zyxZ>p0HDCQdzxnw;>yv-+>cYrpx!Z$AI*mp{jQfBBEU{MFxm^P9i_yI=nN?|!WJk0b8gIqv^a zaQ|+_#F$)eXAuE$xE*mEj9Q@AquvPt&+oru>Pz0UW|jvFRUq=>s=4G1K~boOVxko$ASYeuBGjF`njT?!CmVsb8Dcv0r}lBQ-uS z-@{M*qm_5cZQSKn7fxlqp3m2loPAyI2m^C!L-#a-SG!j;Gmrc+vSa!Sx7#$MM|YNA zPfp#PiD{jzr+a)_H|DJ>d{;Ja4lwMMsZX8fsJA*ZtBSWe!Zq%!>OV$JJcE(D!wctl zV*1DKMbTZ{VEkAwGuUx+cW$xooYmK}sQYw`;bHJz^BQk=a&3%9-(~Vi=V)T`6})}( zoReKI^=KA1yr#dmo@BhmJ+B#0P5z4e(aE~08*g~c3*s++qG$$Z&Ta!&n)wu8dWqqB zu?ioEd(E0$o_hK9Whuyyw&& zFYrY?*IB%a`?$MuvW@k;#a-UZdaHy}>f;Gc`9&Apj=w(ufniykWP$rN@A-#aeiB9h z;D)mvNBoO2rx~ep@9>0510VCy@@p^nn0nu6JB5n zMI0ipx$mub7S^-XdQo#y8D~Fg(kmXre9tTndE>*Csgh3oyNYv|;|`ANAPmyjplOy- z4rae?(%0eZ{GCf~Svz5_s<=$o#I!ml$+Pp-7r*@ze1My{b)whPM>m%-tviqbPPe}^ z_RH58xzI_`k0!t(Knys-JpP#jcTqO+dp8N{DT>`p8qSWN@~ydFi1bK zuWM^oalbh;agbTdEaP0Forx2Rn>{)B)dffq=aCbCdBT%rd54&kN#B4V-NK&NxwMPc zA8^s~Mfa$I!C)?U&UaD*24h+`{_#?)8&gnsJ&Vc>7>4@#H24_!1}9($*|awu>vr zk@W(H_S(dE&Ab6d0Nxi|b8IG0Twjs5&V5tGr)f`|$Ev^NIfU52Msi%)C@2GzD%_vT zK@!P>$R5|@9B$F`z>{#Gye8tUia0#j0Pr2qpP$H@#R2(FdqHY=yHywrIX-!Jh7S?R zp|aDAhW?BM?W7{>S=$*d!EmvV>)9pdr8iq1@|? z*UJ^IBoo-_ajx@?#L*SP(@dn|W!iWGPM>8#y@^T?oIzj)I|dv>uu4d@?voQKZ3Hwp zXD18h=EOQcWls5=V<_y|W$0ww83*9kAKiKb+bHM#*6ZHrTL?3h&v*9Li@KK?nA$@3 z8B4_{EaR4ZuE+s&iaYLsB~*;x|L5QS^#A(u|NiO={_)ipKl>>;^s4Hdj|3pJl*@tzc+Y@l``oegxf#bG z984o-gpR#t`MX)TNQpNHU8gSRjdv5a{P8#rfL&MIPGveGG!++BS%Z#VPKrg`J8h(ZJX}WySM{j0rJJMHj_u<>v~c# zwGUBo6;-gzV~15*+++M;1_3hKyqeUNo0;*IX$?Vvc>4y5)>D2Yp&2r68#+-PTn0V#yptgtZE7;*q)GdV|#e4v!5`9EO?3O99rZh zx>5LK5>m2YiWO5Bn|X<MyIb$t%mV{JFUklBWf9-2^bVtqBo(2w6)OR$t1DRST>5# zZp-WKy<6Sad4r48ep-)-T_7Sru|!3^39;QNAAY`Og17cAqKY(G2L(4(uWs>)@>BLJM+USw@7WS&~k7P!!8J?n->l&MrP&iNui1qjZnMY8OCJ@%v5K z$8_JYE?IS5Fx&zH;U0!>{9s{p$eP4~>M z_;LE9@sd)&6e~T5S)T1k!{jfOALBg=_*EZy$FTWGund5$(W9AO;UP)}{sD!**TE?~ z!PxyW7g?=cz*rcgS|j;1c@!`o{>G3kg`AJP=K|M1c$%mWx9-t3Pik_8Z&dXlV+_WF zp#n&U>XJb2l;2zm0q0ejQUHR>C=#`Oyfsu%yZFMq!bcOuR>H@LjLc>s6kjxVzGsD)H*|fO2mB!A(K^1T$NGPmW9LM*W&Rdl6W8 z%QwV{*z1S3tl|Oyt}>E?NYy3@1InMBH3T=i;B9 zkqq!^QS?Amx@9y@t@a>=ffo7dBdYlT$dF)sRAf#jSv%u3#6ERQdA%r6%C)R^9PTM! z3Q;*f_jbo-dKS_WAiTTGafHRv24P|K79Eo$>0(j}temqG=$^Es-0|(W3#zm`J6+GO zWSgdx535tRR3+o>kDcfN>0EAE&qf$684pk)PIpL1A2~7O zvBFPbvnPRsjF2q|8H{1=@lWBgb$ra48?7!1ECq&L7tSeKg{9t9mgqpN zC|pT-IJLUcEe#I4`ByRD%V?pB?a>-2^v^4Eb}8IiO}JbQLvk0wWjsAN9L0PA=Vc-|`*Fbl8yNXU38YXZ;;&!xl++&Zaxfv&65qkjHMN35$4<0+BX7F^ zM}(3C%;$A>RR5vg4fIxsW3YNasX=XFI8Nf|1dQ2vY>NFbRH#MEo>g^kAx6NDm3vtg z?)l8*WdWd$=4x)Ss$4BRJ(ehBw>dl+mFb?kjVCiGd7UJv61RUJb2nK+DoY_ zet;3(*4&!GWF=|K&Gpq1qGwD0CVfF7EmxpKF6op8me8`gWfTgmD7B@sC_S|_iKikY z#?GY(nFI#_Rd#n}^$4{j(=c^QY8^u)?mO)hJr?>*uoldPyD7#(WHz6ugCJLrk+ zA*n8UVOm-KT1xn*RaJOYAu-DZgq5i+on}%ghXONxx1O9@t8-RdRFSr!WoL%%Q~so5 zAofh|k+<}(w&|0EaoL9~5_&lKaD6OCPxfEuQBoAHZ#rMVwsv1jQy54jZ#@PGeTX6kSK9-{wTi z1w`oGGjVs8tbs#a0Be+uUsJxO@BEpJdN_lY#6y6i zoIOww2`uRL6HcbB9LtQmpqjPVl?h=_0rw-sE<0Bik>^KV^HLFjFp^tbX694ujJYI$ z6OY`?B=$@z;T#?~nU!-Gr*F30BU~1bnL6Yx{!6DtU+eS8=4N{I$%FuslJv%t(-f@J zQpdlZaf_TR_KjfF0Tw^+*x-eSnZaG@p0)BF4e)AGZoO}cX|IO!dv`$!a&*&GJccp zO>7NFn`1Z{C<}p7Oawo+5}VvwHU&q}OYeNQ4sgoNBKtvNP@2o(e=c2TwGSVJzp7w5AI zY7JDOB~e8>bWVsVId^0;xOhd|KEx?xsge!$lq)PUo2ey*7-pv$ao|D0-cP8>#xB?Bk=EwyIS7LT!0Q&-ZKt4u zSLbmCaBMMaS-dX6wz|!GN=3{^ z5=F6msV-%^HDZw?k;fj?ok27&p-gVGOGX>FRN*9#iO3ZWDA2L3vbfgedT)Tm`4nBogslfVoQvwHhB z0}Pcg)tx+H7lOi9<^ErQ^JhVelN73a)G#91MICinp@X(An%1 z_XN>LOsZ#2PjD9rLrfTADk^^JhWKt+y*Ol$T9bwzZ*)qEN}NMq!r=XAd)suv1z)c8 z=&1;>M(ibaXOD4JvL+e~V)l*z`%sLr_$-HwmLG>}+3He6uUd>zJ@W3M^Z&84@Pl|h2g<#bn zJMXzb(weoMZraNdHaO8faJPSR@8t&TId=yV$Lp0vVuJp2s%VNTgRMXLh_3$mm%skQ z*S`i;wQfKVSa-b7lBTGZRMxjF)89dw9QV{JZfZ*IpU@DVe)g72%ZY#kBuo!sAWL{aU2Jni>Wt?;3Kgx3Dr(!V1m4Gs$Ia0L|7Eq(M2(q4KX_Lk&il^M& z5{{@EQWTYnRwCyOLQ57$8RGXb$EvS@#MTxDx|a=sk&|nCE8*`#Cu)-u2E>q=cQ!dy zUc}j4@Gl~MX$5`UUFN*UeYIk8F|QKpYoTkrUsRJeWB{?(@dI7ad8+)ORbF)xx<>l} zHY#1X`(52}C~JTPUg6r0AG`^}_|cyZ!}w7UhVi4VFpSWE==Dyp$@rHX5@$$eOcH2i zEtZpS6m|k=`Oz$g9E6J4eb_RveQH+=5fsg}jFI3is!Ulc9*#Rm0|O{Ni33JNFqr&t z5y~RNif8RGnwZYVc^)Hlj{Douk>9!b8pZ%HY{k>`$m_M~Pr??>OJ2615Ah;T7}$D# zPD->Iq$!k~<6fvfIblK%cKDqD95*rE4(0b>sF6LW664T6RPiI zZ`^c-i$DUHf_Smx1F%U6gg+*n)nMzhn;Nk*d-VYrJ|P=gfA{rVAnUmb#aJO zYt7%$m{TqjoXjN(RoEW4Up8K`4Hk`>V_}y&+K;_%1pv5(J(?KR8q^!Er#0nX66U`N zi*jd-1`$Jf)ftVzeL1^JqFlaId3^4UI>KQ@+#VepimqBJ{Yhe2z-8S>Z`J2C3;SU_ zEU&C2ol^-~PtjKA9*szC5|H5xty#Z}ozB@2ms>A}X$=iqLw4)a5rpk}AA9ZIB-0Wis09xc| zyqN8Iy$8huPW@i^LXttzy^%B6`Dl#vThJ0ht^(%$scGUh2zUs>w8cc%!)ZSOk+?_D zTT^1wJ>k<7^7N0a9WJm(lE@cz{yUz!^#8u0PVfq zk;$~Y!UAwtD4*sO8h>Uv0(dB`c>DCx>X@+yKSE<3y@TBsqDA$M1%t6s?bh`{YF8vE zDqhL#J@ZNlsKoj}Yhbut#fFwq6HlkPrP(AeQ=VAsngrEA_qod;sBX%-*`NWHhhcm- zx0fDz2|rsL%4$@+URD>16TvCKaf4DRZ`ZL2zluP(kn+RW0|8L$N!%(O$rq=W^@f+U z%VC=U))Ha^Ts82qC?pk@=!u z8~OD;u^``CcTr@{m**h;$~;QhhMKYjw~^Hgbj~V@QhBb{4&Ei9!k{ugDqxQEI;5^Z z3uTtPyl@{#@_oQZC*7u)6)V5j&w1AokvJJFj}42b*30$N+3ONo&e7@srYKE;X8n_b zSI$%Uo6Q*YzLRq9AGw)FCp1XJ;#dbxVGf49-0ao)2nv8MymN4XF_<2F^j81%_lZkNWaWA6xNgF%j+ZxFOP|vB#_Pn z9TiY{78=!bBua?xf}UFpEfP_UfR;x9 zhv?jm-l=w~9{%+#jk5~nNXPg-ZZ$||(Zz7n6K=1D*b_N3$;))o=4ygd?Ozo6sXsEQ zM}Vk331Hju@Gvx%#~9KGV6pN@2bnrYrn|HYcP|0atrz2{C$W_$jNDO2z%jLAZ!{zL z1Ad;?H25|2GpkaK=K$V`-664w8}E+kT(B3239s4qp2Zd*E+;$MJA!#X`V2u*P3Pk zjfY!w&CIrV+rPaQfgAWnD2vBpyaKPDYwn8$*rE(EXKqn9*(MeYLKzq6c&tfK)D)GY zf`@so7{PEe@FN9+G5ID`gEmG>jdsUqSCvqU)yabK`iZ<(UC@i0z%XQ`XIV9;6Fy!? ztp`cY6{F*!*#I^`$-lpV6;ro!B=p`tJzy3=Fe504zyl<-y6CbZ*ZI9f*pkw*4ib{$ z)@q=1$w3se+qi31Roz2t5nW2GJs#4nhgMvhprTPV^{FLEpvN-{ne5g8r4$$9B&7Yy zIeRhbl|(HpOma%(UAO|6`96t38ra5BUEEoxXl+bcvnoR(>lQny-g=SOo!ZXq`5UKH zb#h5{pS(YtJe3dIZZbXcUaw>3JIWL(Ddk4BoM0~rWZMbIhu61}EH)kWuAwG5*>7fn zk=jx>N`ed`zhSTj_1QwsdW|)0DwT!M4Flz!#~D*CsKJ~&jYB8W@ph)}ju^{877z$} zS?EVuB@{r5R*>5Ol(&rT)94HtyOTO}&xcN|w_b`-M|?n>L6DZCYY;}-t2!RWj)rGJ z1m{cYSw+oQRcEG3Xlo{Y?%UvS zW{@1qGb<7(ab+DDa*M8;aM>xBI(eso;<{YKMUkpx_0W#(^?F_}y)9owiEEm~f~c}3 zq0y43Dk`Ph(19{@)9&r1@zxy|}_CLa()ahDe# zmz}2)7{_{2@H#t;mYqt}fiWJ(r<#zuFv?>1e_epFQYR-AHaHYocxX zcv5)y6+TXKCCSBncxa4c0CHeZm2lT7&*zx_btnx^y%wYx?^~b3VozDThSSK|fZlMg zM^P0Tu4K_CoEXG(l=<@V zH~r9h+0oL>W9xAXQ>Gj8Va8ymBPnrkRTas2;&!a+|>`)Pa)p=F*#eq9Jq`9HG@0Jr{@Xu&Gr0~-$SS>xQ z<%D8Z{4a=5k*o8Z<2B-z){t|nMXx9(-C4(-J-N~f<+O3ICh%JupXnDOjwC4KbDma5A9PFD^$FE*!`eK*|93;<3(#7t;j295A zfwSybLh>}*XDVng>y$(lX`gt7h1cA-PN?{cv)gjOWUn)r9ql7@h-APM%=7^tzqFD% z011}ki0q5u0~(VgOpjZ@>o&6)^J1n`j#^u?rFozXim%mhr~!$9he%-0QRn&A8Kg8? zNNJB|pm|mCx6N*fb!;x}6}T3$sL3Z)&GhFplIXO=6`t0;AbUVY!9XdcDA6dUo4jC^NrJSzUKGI9x*hK?&2c?o zCK2d+n_x30qi>#oWifkCT%U1FuwBwVK{Rn*kBx{Ns7ad6AgH{SYB5MQKIN5O9P@|2^eSvlDOeVE~phP>P}K@J`&WR zu?gV*>v@aYdEHcr>Wyewq!Ug;C%D$Bh#!40`Lc${naS9qZ(VxebR3n^$ZKZRw58`i zRL=OQ-l-xWCtp}Ed0Ms+u6V7dgje8$a^TG}z8yfUwoeOPw}$7fiez)G8>(D8IXCtY zvM@5iAw#7YIkgYa+BI>)J%u4Qj%=}FP|vid$uc-6Uhe@y5rnAZ^=c!|O0Dw@$psQ#1W!A0*W2FI1QJq`Ia|4T`zkKc@WBf=&<*z;Qh2poxv%X7p<;fmNf_MIj2!Ri2 z@%Rps-rlKZ2dG=FH-!*$53j7{QwUm;_eyGlQV)xIqY1czcyKXa9GEfAK#ev-Aw&*b zoLpfhs(UojU~p^qtKY9DS8gw1CJf7jGNBO3#G|aaC8x-FXlXdP*SYi)X+5!8&4fEE zULHZm4}e)tTV zwE%b?pAel*TQ)0_jNok;Z7l!M@Kk&VmzdH%bi{BF@VYRz(aqee8%^w3sW)yNscAyB zN?jXT$blBwp=r0p(|TlTi!h`@g8^u&0qm})sHKRHMtveqqkyBS8LT`F^Qm7Qg>E1! z6;J@wk<`zd(H#u{IN2j&9VYPfjx;iq7teZ((P<4-0I9`-YK+#R(m2qFB*3;8;7hO8 ztNTJ+7>@(qtY--)Y74{JT(HFj^QnU|sH;e0)wy}l<$!(1H(D%6?V;}dwUZ%&(rGFV z^ABc%l9@TnCCbwlLhGkiagbCWXT=CGtIGx2X80=xDQlS7uGM8j$R`a=vt=w79y>d9 z&gx-tE-szKRNAV7yH#L%(RrS*>GocYtU4L`^~VrvhVC#u2VBopjAd(pTZR%$dU^sV zMPpJU&qV4P)K0QVt>NKBGj4LAGBmXOF<=W1$?&6k7cdVkI$Fyc zA|2}n)uMj0qI6I24rFWqH@$p;HIznsA zjke?lVH1DBT)pLuIMlNyD@IHaE#B%(9R{?!?H_xYE3w07obEI9dh3L`mcUKmGMvKX z%sXaPEzl{yl;Row;R6>kIrDEx>FzAaGO^d}@(rcI$U17Ym#CW^Ok!r~#j>(gm zj_HJICpdOV$MA1=!iA?McVN$9=t5L>z*Di9G2{*Z_LpL}IH!f?r~zfp5>v8jb(QFg zn>puaOI@M9)aAccahFXtlZ8L41k5F;jL)uN{6UL|(X&5&WVA>s0yfH(Q40rv2bOoa z3yoP;Nu=xfoPY_p=k^tO+ibJ0NIePBmpsD2a|<>BR#NVOfifm75B@^pmRRct@vh_n z^1RNj!lAHa!`ltF3RhvD)I6N|l@}7(#Tn7NoI3$ZH|xcrw<>4>9!5E7YAyDmEb%kF zjaFzLcW5Jv)op>LhlyPweF)G)?+EG)j_P;E%}IihiBzq9O=ELeA1Eaz=S@h!M`x3_ zwiomiHl9uKNhI6SdAM+^OX%Hxo}?0{ui_l7R?px%yE8bx)d zf|uPG4>UV~YWyLzwFFufjgauNM=g3bzUopNcB*Yo4N50=`wEX zhiKUXay&@~(^s2i)Tw7RbH_sFt0+z`;gqa~ScW31z)N&cgCZ@q=OinXud(z-*Lsd( zVZHi^L~=#fn13u;*Ptlp`4*_f zza3k4Au&{xe9(I#XcIlgvp1H=2u>Wn_H6H?umEK za3Tg=#ZwC7^vh6==_abL@ZExkSlv!x++`rybCg6V7E_Cd`gvzm;lA(3m3xzCNtI0} z-FENVX77yw3XfZfiq3P9PKLuhQx+eH@DIlLYnY{Y zZ^IQ}NZ`%AxBK0$|F?{U2HCCHI*Ey~8ylh{E%vg;Sn_411uFPLeH!-@{)E|VkYsR; ztx&u(u}d2tsykGv#)%2EKCV0WHj&X947Ic?g!yfhXngMxdN%PA6nw3LC~Af2N1a?- z|DXsGX6nbTO);qgjl&avFE^b2rwn7wBiZoR?UW$SE`80Q82&2p2f-7(+Z6N6Rg-(m zi}k|9l=$baqE(&!(n^xwpsQBAoi;?1ro}1_PX=jyU?<31W(EGcDNz5K-M=+9<%22WVjVuU<*+)83|K+dBOqH zXebuoD^@J-Ic1?~w?0?%u;q-5ib$LM*c{%1g=sP*J$HK}XMX<1JE@mJdh1$=O!AJ3 z&{PmcReI1{ih{L#Cjhvj%kpw z8|P8dmF3lbdBS}Mk*;`#y(?h~S5Ym&Ex78Q7DS202z@}#(aNNo966p)S~#7>U?X2kx0>oepd>{JT`gNGH6>`YyBV=4Q7sdC>#U*bBWHm#T>3XN zNr(AX{eC?@1SNo0xf)u#NJN*jo5FP77!Sm>Or9?CG8Bgr8zBbrH~?Ehu@;Z#<()|1 zvD$z%4(3~6)p|zWPN!3C!JV1b?bvGzLTJfQThA+QM`F~4b}_E zVaWw>lY0yxVc46l-P*woKe%v(SE^3O)DkzDZMYDp23msub4g)4Jt?qQW9Wu2uum*yM3mOKs^- zp~4f0a53E$iu%Cyd@SrVV>5omr2B0Yg2$}l-jJSBzq$0P#cd0_H7zpCPu@`PYpHna z9S!`V%FNUr6j}&v0SkI7H8GU3MWw^cq&9Z`}m zD1oI>RY#=s&bZ~2qb%8c8UYORF9n+3-FTV0cet_%0Vk}sB1OR^7E5Cn>({pW!T5^f z$<1i%6(cSwLQBF+G%MrbCED$sHT5IeNfB5`vKU%xzMkExO^F;Nc(%r!*>#nY5@dN& z)P~OZd?8Gm=D=f5YU|}NgYsfw9hp#%5$->=19kMt=_$RE9vj4=OwA8%?)`=4>#Ou4@ky%cMxmkBMc61B^n(gl zw{zehG=f)1p5$r4z00T_Ps9>iAkc81n^}v(!4Cb?G=xV)YtDr$qi#xa^XHK!?@Eu2 zs*+oHB&^$Es|37_ESWx z(4}T0>(3`pTEbYPFmf>%*R9G0jW1+bhsS*ja-gfoRGj^yCT6Hnli_sg9+)4gvcZ)m zHi!b5a2|&^v7PNmUuz_25+Q2R1<6)JXjU~dD6w5aB**>i-q;Ee*#E86ebqD=eQmJwLeHj)Teu>6f;Vb>bdWS3FD&?^8mK1A6II2iN2ov+K)){)hS)#h zHE?=`?(neu97$xEBq|B2N%D4FOb(j!D=Rv4hNs@aj=8SWqj^PhnPiu;28GwXu<;iR zK#QB)1+;RO+ys|fj({uw7|AFmWz|gquneha)g^C58YY~!>G@J0l*CiKZbj%RY+Nr- zooHq||3sgrX#^pe(5%;-n(0w!dvd2e_ff+9B$p!usv6EsqL>VYzQJzt>dW&wm(Y&M zhl9HqTQMmR&4GV*SEl$xZdtuH-O9$4tm3f;hRIk#lb~q!s|-$I25no2uAmNncE4f! z7b)mvj!&J_o_1VOCov~D9#hABdV1AnFOj%^TE)lf?0C<4T2L2Vr?#T%jnR&W0^D-i z|HQU@iRGDg9Cmc+4{Oy6QbTg*Y94AykNgrU|wwPkn2m??_qw6O{&V|vOxj{KGtthrBS|0W+ z5^sbqtbzhBsz0SPoraoqPy<|2i6mA4lA1XPEg3&(scsL*R7|E)Ajl00O}{;PDoZ)n za+HWni-JS7+@+4^$D;U{UK1qn8r0qhbGFou^?mBxh3ajn7FtdeebFrEO$xWvQ>W%e za7L}ty;*seRT~I+#keJW<2D|=%a#Ib4cCz?v<ghiALiv1&GK4BWf_+dWAJPnS2(SvMo&8>e#BW$(kQISFEq)mg(%! zE8&u1G0TQO7Ah{GK0xx#2X_YC|+^rTC7MO_i!P#Tg z@p|9pgk>6Pd$&=UQa)W(CE7Nnz9u&x5>~Fn09cZm6_zu)ur`oR7M8>^pF=1xc*;}$wcvq=-fmNa`TMD?t%$V%AR0jn_OH~Xc*kPI!_4)Ayy?)R%stH)!ku#Rd3RQ^J2kB_ zf_TYSYfKmeOO@UBA(IwrOQnNGiC>o}DD0-j2kW5{Fe9P0J<%E1!HkxW=^aVBR`YIC za_SpgsE|8Kt|akK=g{frnJQe#F(`15^@cstmE_a;Cz@4zj5XxafjjL{Pw<+3FJjZ? zMUCZ4xd?X+o9HRK}r&dt_WlA=$-LK$woqm{7CK7s~F}9)_4QZjl`Hr1W=`alup0? ziDb$IF~U;+2Aga0v>mcgO|;AoSvWg$w&Wm(zrR*2Y8DqNk~gAHBvQzKLdBfM#mG6> zQ7HXB)XD?BNQ^#~ewA~8Ltx=wCBB8!S6}GMZ6w}kNPDqh!*^A_$)dC>wG@@~Z|S++}gP9IlM`}~CgINlSc$4-Pn%YFGxz}*!koABp%v?)yu!D=O2Njul%fV}q z;bxaaoH+txo|qhwn$Q`k+^RKTkbgYoJS}V`FSZ~fzYZChzERDWYGRc$U!gVrU_Z<~ zvFBMYmLtu+VdBtrc9RTc*-c^qI@#?nt#v^{Q|$oMBPfDak+RrKOZZaAw;~Q~yKbt# zD}iVfreAqt1}HQ`&`$jxx*u(AIRiR)~rVdg$HTR#5#~9BMhSA4@{9?oP|6~;p&?1J zw)$|1RXz$M6xgBxQEaIe_;nQD5pW3wD7zKyN*qy=@W7^|$$@`*;8fa7vFI1=-biL1 z^TNd{AzeJDwq}_?IScn|(%^7$@1E9Zo~re1u`?-Wtf~7ntJkAy#^tZ&7v~sIBI~zt zB(BY2)Rgwjl+pYA<1k8N8q04;mQnNsQk0Iu_L;Qck%f_dJ;DuUQt^PXxAfLV`{Z_o zq#xOlGf)PzXE;>z63P)Z&aDb%+PcDTKC|P=vTQYkLLiF**S!TeYQfD{fLV0pwAlwy z7|IHuVR;>zI;hVirW%)I)!za&T0$6G&&Ebe0w)6Qd371>yu>VdQ7Xj#E`lO=t$jm3 z)C#oj-08W7c+?OM?1_R?yF;Vso$UYwhKYJCVJfz?t7(W{~W z1Cbgf4CmB(HBiUI$0X4MLH%SEy4x|e-xcj{uhimFT8fKxjoEM`XB$vRar>mLdaL>$g9e?f3pYB&HLB`U6DZ|3N-Ilt4xK^En)_%8pD~7(;?Gga_o(+l@7N@32&D0C|-lnkfWgH4Gb6+%EOzi&au&Yl%u-^Wi zrW(<}2qvGq)sQ5UK4UoYV5Wr$6iYEeNy%B_QfXSyb`8sT*dm77;PHemNIlt7BP7(X zH`i#S_48=E(y;^+iwPwD$}d%5CdNxgTZmQ$Oxqp7k^;Y>oIqwF#yO$T^bM(iB19xu#zpF9l`yfkDkvzoaB za7uqjYp4eYiUB37)+Wf`V((Z=hrx@{H?5;^^=EBv8>Rzm zU54kkRUW!8+yY59a#HNq@H&6rRaFn2ZOR~lkRjUr6Q>5Nm%p*AX%2E3{0pHz70Cx!^x8)+>VI{<;n43qe{q6IGZ3alBc!5!gP zq`F|x!A+xuwjA%uX;i^2@3go-OAWT?&P9(4dY*Sq_rh%mQ#V*Evo@5ooPv%;eP@_(GId*g zNjR9iPH1btsr6`7X=jyf>A^vB5)EGI(98ZN{9vpV+w1Pbk+3h|>A9LD1QOgbmOy%N z0Me|-j}k(_xL_%4DLhKrG6#*CZ~tXP4@mPYtkb^zyDTMBsbh9xwlBk~iRt@4k1mjBHW_*jA^c4KJ2(0Fh_MEL|wGC3%)# zg2Vs5>f4}A*Ju3Rq?_W|7y#_ih~2x8hF#3eP%o`;xqI!30t`!bkU9j_>iMzl^mKEj zXri?PO72S_7xqmw;l!r+xSAhRzOYVmiTHXI2akK5W#7}pIU7k%9}U@xY?hRRp&7bU zG}jfjU(J_I!qyE`ay1n(ZAWI*g{6gqv*_AFgzqFI1Ca2$i%u zWPzp?wwaOnd|0kctbSo_^mjtdDd*+zMoh7y#*(*{tsW@ogZMpRDt0S4r&Ykc&oNBtFv^D*l%Soj^qF4d4K+=pZDj% z^ZtD6c_L>fs-lMe2jNhht#(oNdRZJQx+}rAAIn54Hs{sBcVM2QWK_8u1 zF#2ZeZGxS(Ba7TpfJ#&*DPN}yKxc-Gf);H`3q5FX>pU&q%=Rz-^lbkknC)M@oh=Kz z_Y#(ZnqfJnYbq|YHn5&^KBv%}OQWX&=b&ZencRDLMJ9UQv;h~=CeyF7^`kp&vK1BZ zK0t+42bTd;i)eXb`{iKn4ST#j-ZqUKo<{F^P~Mq^`g83tj*KUxx-{)PSz1m~Q=}v> zk+O7)c508>HqFg}jXpdx$VdtyB+YLREt+HW*eTUa z>wyK<9!I@WqGoOx_OexcF|^fc085}x?1v9$=19%< zw@H2F^4U2rV+90O6us;nmV#!qT+dv@)E>#8N_i}ExU`U(xY)=Lvrm+W^=pE(b{pyi zrTKN8ELCgQ$#b+T2MHh&bRAm7_-nl5lsh~hQo)$CaZcQATQ-LNG7X>(Y6_5&kDlFV zPs7>Wy3n3%=~;;9& zlVMFbTgE#Gdn1&LFvR>-0?p+F(C)XL>c`VOYH$q;516SKYjUit9@MnnXsSUL3**jb zFYEbO+mAS>P0ccwxVyPK6~Co)`KHVcN_;RtR&&pSc4anxPC8?ff_AR0Z1~hTEa~ju zwxL>_k>(ONkcW=m~H6T8q)JN zKW7JI`eja?bjw{7**p(hnY!>#&+Q14Cv=P_Z}2F60xM-l@-%C|B(=~gEB@?Co#uy% z9#$Ilwpsu=r!lE~yiy3_rfxKtlk3LRayBJ%20L2?AK#xgAqsUUXn{_}PI{Bp(%2M8 z1-(nTb0-bJyi|3@Rzo?BQKW^n9zdS?zss$faH9SPo(l10|DFD>4j)Pq!{PuL2XqQsC!L1ci@ZQG5=I#0DXJ*!-H@nJ68 zeNm0y`Ys#eEn&fyjZ4EXtsY1DC3I{ffF+<76e*G=OJ`x+7N)S}BJ)5RNn1ICEOM|F z%S$J3P!8>l*)J^9YAgO^u`Rvt&W5#>U&JILDzaU=E*0h1pxuvkDFmHPZHl`TmkM8` zp~h@BF=kU?WpI`)E+;H@kgjPzX4@>>cDAZns1uY@6u=|(6>Cf8Brx-7KA ztN?LsQ~e~caI5qkn4L_DF+bQ}VyB$-wCrMW9>T&#K^d?d8DA{#=58eGe2;}&rPh^J zPoUn$6sr?fl-Q4%ng-&YNl)|_+`<5upp>QLa+Yxr#Dd6fN{o`%8j!myZT;%>hb)p0 z{W~!YNA8@ZXai>Uo%L6+_$U1*CtB7~8WoElQ76S#AA7c|Al9~**A8E*PuMHP!yvn# z^Xemaexv-|pE1RN3!)1SO?2_Ve9u+KkI@HdYA0@*C(h(Y(lWARjR(sWHG(YG{EFS0 zr+dn`!h%*>$XdmZ)6398zvzYy&UDRbSi$KNJ33`yJpwR9R;mIlpvi5TVcDRBZK1z!S=lT~WtTH;uXjCX4&Mfet zo{`v_Y0`+lxYH}=w4sAkV99HAqb1(PmPjP<3fo8%?T&`5gArINxK6@Rh>m(gQsU;m z{jl)9H8kT_iJ{}Fr>~vou4>vLbvu$uAdc&&Z3!XAj@4V$D+X=DeM*P>Z`q!*XYj&= zv_68^NZ-(}3Yjhi^;i?|YKJX^^Tka$yxv=op%2;?L1@~<6XE6oIi+E039dBn(`4yFcY|2}W zymFqzB)m&ctAsUDk}|)Ze@EP>nMsyu?jG!Tt0L2K=6x36d!m0;i^j_V;ZSL=7eY~- ztt%FidRY9*GTSYxCASHRF1Y)3UK!?LT;}|ndpA|H9{0R8S#6rZcVo6wdSFJfC5i&p zjmtJ-nl601YZ~?v!V;~kKwQ?kVJLoxF|<#^^hyO5>nFrh8aB_p&`^w3oepYk(kjEI zSgiJGvsp@}&HmIh8p?cZ-09m>L7}!PGb$$#a9pvAGc%uR1!Fh*>__rmhb!YB6`WGu z)|_BlkgRujMMd>yg=?fNLmuoJTgE-rF2@5&%$`ToBI!hC47#~yS#%MXR?Al5OXF@p zIm}fQ@gWAMgfnisrG3?2G-gM?)EIuE9SN`1ARTL(z>WyTN+E)P2E{^ zsVqxa6vvnaXFcwMiQ84pmcS_9ZP_1#O6gt?Bowy;o1cX2TV0A_@jarBuw7nQI8534 z75nnIpzulF9JA7sO)HnO=VJA**?^}V!g6VczG5*qaI>ze_w?k4o*mX;4hy>hL_Oa^ zKueWOTQJ=60f>Gb(vGO0vAinPgx`~)JH2HoKZd_0HCsn7aPNdn zQgMYYld<4ii@~Baf)5hla&#~Hxbo4FsAw^_vXdwN`RNPTwupNdN$Q-r7I5a19ig&)G;pSgIQUx_a5tr0L|B!Vd8JxlS?b#7tKO>r{fZpC8wfRt58%ILR*{~Q z2s#gFD2;qWLt!k=spV|jcOKXVE&nvXOj|UPTt_8{JnP?8Y#8-8_o)fhsV&Ltq@1}c z^&Fh;v)hT{`2nz&-4Z{+RNmjg;4W zP-~*CStLwef3>|7F5`@61gI$7YmHW|UuVlUkWt?K_p-4LhvU#Y7~AAnWO4;BT}arh{=!RMtpjmOjVIj_iTg*9LN27EX3hlsMp} z9z%`H(b_7Sn?r7Mz9X@383QyG&w0J&w(VA}WZI>{eJndCHlR=%L>ycQnW&|L7#BBzJF5Md+QZ=Vf+l3=FR1(9l#O ztQ{#<)e>!-nwEE*@KRGY)Qu0JRB3+#2HfXG8x1gu#- zZvy(WL-1GYx00^IVNHCs7e9B+7!-NH7#V2gTkeQg%}1G6aG#KA-*i^t^64AGyjyke zy>4e!gdL-T3M?NjmTa7)bd84I^Vz?QKCxnRq_pRz)wn_x3m_oFR>v z9>=@xqU=rw5_>LT(w!*FNI-1I>QIdFuO_N#w;JGWnhAxZ0@ zLFI#}5UV)Pj`e7G&wV<|rzNdgW4AoHvPA$Sgqa=>@t*%t+BSvJJviVrp0h~LHO9_V zucvFxTp*nfBJ?$9B+xE)jsbAlQu}J~w6%_A$MoU^soBDgrk3Gotrzg>&YrrVv23p9 zVMtF8@{^Y+F-CvEO1t-$-g92_rx<3?mA;~~er}><`b#x#v;Cx$r)NQS<(yKgOmU8P z8FlBUW}GxTam6{%NxdOM@CgYh7dR0RCS)$Qmq7x3@W#9b2~g}FNtO2gkuzK>sY(Y* z+e@6P=&ZBN*Q7X` z_GSu&na1)lw5)j__BaeHv1pvBRl`_SK1$=rB;%g3E>0+N80t@hC(gbn%DlXE66 zKU72`DcTfmz9!2Q7gm9}a~`XNz>5L33VbxvAczRJ{6>LNJZa9KaicZ6R%C{8iPR9k zsgf_-*Dm84kNm1N{%v&D1PkpvGML`q%c!B$89zD=>8&j#m|ue&0H;JK6ebE$p6$M9 zz=IYZ*TWDxvjt{@7MqS@cF1|zu8b@VmJ zi8qBBjU2Ok+6xm22w=@Q)@nPUNl)!(3>es}0cz>5c&3l7DI~u;Ij4K`mb`5LVcT7c zXwUA?ZeCMz>|xfx6RAWI8a32X!+O{0Gp#-qR-&U(8yY5f=VYkD(k|Hfjwz(PUW|or zYD+0vED>5~FT_NPE9RdC@#PevvW-C_YTGgit2wn-q8QY*|G6?w!zcA?!peHxh?ETPslq=dSPGWRkl5fJp; zkSYX16uOgoF-bU6Bfb;xMtXtDU%yr;%Gq?6f#oEl?WKj&H*Cp%v5Y~4>+m)FXsr!r zM}v@2>c)~`C8n&h3Ux-R#H!76y(&xGRmAEVaxvvhF14PGKzd>p+p75-bb!$QPc$!! zlR{Ey%Ql#>d#$mTwlS9k>6^s4)-tknm=os|P%G9}GuhHwI+>{R#nwFOM`@ug6t#H( z8+2m)L0X4eX55*C#djxWl?|V)LC07GHVl-pIi(BRgH?--wC=QSsQ29R_Go(YE6-}9 zW~gK#$F=G)hGY{RuZ=7vVoV|YdbS8pIq<%Y**X(Lja70+$PIB#T8zDKd#h`qGXHkR zM$1I+ylihf*@J)7YEJ1=yDckRVm)MmRL*GR4X<>OU*}O`645}zf}qM&xKpV+(YPO2 zGwQKHpSb3$iII@}(murcfN;Imjty^7MVs-r;~kT|la7K7O_Ku8P-G)D2FEPesV3rc zsM43@L$^EO?${c^Qq@knZArMPG$;y<4>lKYtLYqt(5fl@+MmQRDzS<4bM5b?nhx;M zri!GDO=l-AgT8UZmi+F zB-hg-c1KP+tKQm%%X-qqOhK_NQwZzb5~&3Fm!bg;p!Lv%b*ixkX$E9Pui4vhCZh$! zkusqK>+G*qmJ(-=lvjz!cDcK-37HM-N)I@O$hFPa$2VFBa$b5@2l6#=Eh!?ACijxK z1jQ}gu#PruB^1r`qlKj~jMXzG%t*^5OGRr@{e<@i@r!uc-T^-?(Eq?WI1?4Mt}CoV zqB12>dYa1YmZ~%qMo&!lLPze#&m^&r8IS}(EqaS)?+_o6Ijw zH-x}X?%^$(ccCzz-doMd3A|3;s9___wZh4&LO`=DtK-l!p+EgJLlG~8Umw_?{36Qf)MGC-cg9%l%wB-a| ztMQ%gB_wLZob>q7tcBXp{`A!Fa5$#B?)98i6aYXIId}io45{*)@(7>xWMJ}liiCo` zD6+{VoSO#!jkML~=ERxv6=cT|+J0mT-;Rn^Q+QZ0Ta8rY%aF2>j+oA*0AeX=(o&R= zN%W&{F`$v25B9^-uIij6)3}QICwbvfW$n!!>V+XA(tN~!d7p?2=(GvCulI@DL>V-b znHKe@-&GZ*9#2mYCPZVux~Ht+K<<5);6!`BBHF~c)?Zc9(2y|@6u6*@jyIteK_fJO zF5TJz$|g@zTZqYbPI}=KXxfn;qDK_wlGtWOSAKJ8@=tDUE+Vw#rV@-BF4ci1RPiwR zKt(^hl?Fp6Mj!wg8%>!D>0@J0fQB(kMC6fMT@tmm6JBR$TZp}FGc4YKpoXoj$0nK* zM=RzV8|bQ0w40M5rR|qFXO_VSEXR)(=`mvg#f-IuugVsWM3_z=*8cl8&x5USD?zoU zol?)9d(j}bnB!2CY+C^dEOkq5G4L$CEDHjE>T)5sxT{ci4&B|$xDq-wsDpj)XiiQE zwS>8&Bu0EG*qu#C7;@cDzXow$Hs&n|)V2aa9!T?#J~KIUPRV_lOgqc-Q9F-L{Nj&6 zTQROA6Q0Dda<93%ZEuGe8Pd0BPh)ArOjPA6Va%SImvnYsx6KYy5P;2VRW|fpbRR|1 z+mVcRsL2yc)d&0Pfgu}{{--)e3LN%|kLr+wHrSVmimMpEb;T&&r;n~}IQL){7iu7v zK>aD*hA}p_A^eHk(pFj@L@Mp&-0DJ&gSKM<%f&oM4<+$8O4l>)ZzoDhCZ5efLbBaw zr;lmUGNfHfrPYBN5Jit=v%qjEG{a6`;q|YuAiQ3?ILd0sj!0o-ao`BYW;-8S3@WHW z85WM!kY|!p|3u8#@i63F9j6SWoIJ5_6?-woLnAJEzG6Bpo1Wh^TvH~i{nRwroXBNx zW~N8BW>Y_{97#=#HYGqSI^jjrj&s?yHA?GAR&0@E1C5#Fl}{zVdO;$T29mx+MKTHY zk{&RY_)Q)Yvs5qeHwg?HY@=;iCGf?74XwSX1UNUZu^kdZwQ0pGAX-X^3*l`{-Qb@= zDo9gpQdeq#z`!x7Eaal$M54PQVXwp))qv+2lTfdO99~66NNUOe8j+zkWr9; zqkWqsTn>s1h^^w&+zxf?+p+?=20cO|Spb>*8N1eQDw+iu2I1Kct%Vew&?BFo6@myr zkv35KHQUPsgUlT3X?=$)MGjKiQxk>ik<^2wATe(|c&2Tj%v!r@vG}gEiTAk|+vP4a zv4gg@U8(y7lG6wjsdDlf#9A_-DczE zBmG--BhmV5Shle?$-a4LsI}ZlR-l8bS|I54!A-=p-E-J6S+*?c*Y>1X)}AKSZ-W`` zK9xL{msT5+=EBO9b6T7Qplng*pT{HT>3ejZkjsd+K)?E0rw;rcYPYye2&)YPn+>Lu@mg>+f2u`qEmv`5e**oorw`?WZweKFzG7#KD$zq;6C!)K@ZOtp)dqE^PpX7{_17=gqo$VmL=3rpQeAeYl`IsHfVIO8S`muH@)9}4f;8#zrqa~tAcCN#lJfBV*ARxT?yKDB$G|G2a^T= zNPsfQ@EQYmI>Lt&oC=`O;;Ll5b<5twGp){Y?If*)t+z|yMw)}qOB#%9G`DZ7=$&-| z$OK)j3y&MeWAEY)uZD`rRVoMrPTp!+4?DX|TlxBCFhR-)`LsO8VW3{t%zI9aCS&*d z-1PQnfj`mG<7Xj@vNz0%rin4`;^5yTf1Dh zmwkInDgsjUdg6mRyd^LRLY$q6+}>$eZRPK z4$f%Pd`!6);;5kDYV&*DZYaA^28;7)cw-^Xw0SA#gwsus_|jxG50(s;1qW}xnKDn{ zvSL=kFvU6Hu4W{>!MWyO;DBphJ3gYcF*Q+7*=CNI0(%Qj6(eluS?GkV4k}`Z?}<&b zab)HLy#^eHcv&wN8RV@-&Zj7Fgo~%5|ETr$d{DD2vgUrkN zLqHODwrgvGgXENSV|l-1Tcw-9jxL?ox@9Z|PFxFEUQ$LO7eF5IrMmUq)P?F0w2u?} z43z%Ca^f{ShCWy9vwTum&+ibL#P^Z$|d9?7k2UAov* zY6!17Wts|2Kn+bmdiopHc>jw~Nuf{=h5%s*Lkp4sJwQ(YBta5}03vEAb(sb&PC@Hi z-`X1q9`c?mDS~m$IYc6J=QhiHrk;<0+n59s1?g2M{=XMkb*RF|sUam;uz(*=q2$$2 zyj5)@tZpG_gAa5AOJ!1Wea$Zq07NXgSgjLF8sz3A2I!0^6RMglue$AM@T(V#NDT0K zK<3Ps6C`ECv@CSxG(kkHQ;3x$jSRIc$};B5I*MfaqU9~iyXN`@XXbos(Zc%rm{#HM z^pZB0L(+OL4yaBIr-5_5R0(Krd>3{hyz~`Rl;mLwBLsI#ONrs0vd6VX4BPHbjq(im z+wJ3^cE>8OF9V|rh+DmZT!B`-gM5=dfJDk#a#R3gLW1NIHgBT)OQ4h!oXTWs3L)jPB;t~TA;QC@4U!^T-yIt+9D$l;9v2Cm<0+Jn7;B|_Vq z4e0{aQgTzx6nHey4ni|*Xf~j>SX!o3sTsK$*}`|7P%^8NJJ(_9E_j=TwHpxMRE--G z{3XrcdT};ms{-&(jj)jGreD!PE?$`}uk6{QIc`;#qGIpbvLG@0624y;9DPw(nXNv0 zOx=bre=sN`>Ngng$l!25$XviZw+Gz#gX{F7wGQpUe3SDLcG87I{EVLERQDl+Vl}NB zBFCwPMfYdq&A~BpRK^5soU$*8s~uLk0*r@(qpw1zV9D5k{l3YYY^ThYEJbRs76<1a z-hq965>_|xzV?3HcYMEH+q^_8aCuYF8c}k47z8{SiL4Q~Cgb~l!V%Ow^1)s9T!9lH6tD;2)GA82DOEotwiO()Y0Y*`1vW1!?#?<2 zfJ&U|?Irzi%SjhgNk`uOLp|JRlLbaII@Ar*+d=pD1rn6|wX7zCM`b0l3qkOdh!4gt zwmP`Oc+)<7oipv@Uva1X4pu6gyF?Q}kxceK-b>%=Os?ojo@DhTc=s?3aFX^m38qj# zPHYdrStp|v6X`Q47h+ye$#=RP2DKo_s8(2<&DCZTpa52%!p;1Wz2wo7J!8oLg-DQG z=8|<7F3#~4SXQlIzo}MLaql6%HhBybPG>WegkUIe z$Ll0xAoeNn!B&~X@gyL~J9o>~Km{1L`E-jEzdw*ddlxEn3D!MK4+j^&d3^sD8X(LN?Uo zi(DJJ|46w7V@^Lf*DS_dkH^>_TC%@Bd*AUS;v&xUpqu!9i1(7A02(EtJK+XIk|?dG zbM+Kt%6)CUb>YPn%=bZOl!T;kq}afV#bt>SjGE~^CgG6Ddk#|*4I~FfB$ct^dz6F$ z@TfJF`@bcp^JBQla~w-X25JYka13?Bqdq8cy&a0m@DBkm*24->{TB#Cg`jjQsWieCp3rBqVwC?(L2`&DTu^K|eCR;3 zM}?q$dyRc&owGeVOx{m|+vlVRqrK{cprEYXX&boIJi8Mv>5NqFzBGY1L}9#o??&QL<3eJvZ=jLf#;%s1(dTO0&gJlS_QIBktGD zTcXQ{9W-)PEP&S}X^NO?V#|Tkk)uHJ3You`X^t3rnDZOE+vo71pxNXx7EWgx$-Ww$Yo2wg+iy6W4WWx}lH z%V+TmGP6=!-`W9uc)O>kgT)NONpbpc(ae+VDpv#jseMQd8Vt@=KiGU<@^|_*N#3Bm zd}?0d@)GR?c71O^zG`tOuWXm_#a|V2hY|u7mC(rTz|8 znFCM2`Jroy!K7**hP{}g33g;=G6{)IBcmQOC0eA?M82A4%|sHEH&mOe8)5B?$hmNs zLxH-Z$k$&MAd*0xx9p!|-h%v($!U#)E6FX#D$RW!T;=2PNKR>kY*-A+zX93tB%3tY z_I|IN)StvEskyNBH!dlEV!_2J<_;!Cdnq!|b+tnfXQ?6Gkgyk~6eSJ_t#`*bh7{m<0? z>cAKo)Z9~9DO{!5I9>eo?{{v^U{@`4tE%Al6sI)}ciM^HsC;g1c$;%>s5Y1i--VIL z^KMw0nuA%flGIQB^rS`aotIFemna8os9dC+zsVtXM$W8Tk^G76+#XpsSKR90O6KM= z8uR8wGO2;pJPv9j!%OX!U@G!uTWTM&r)rj<`aAOYA44QFL2Uy`wQF9n6iw_g&1`uQ zOR1GwX(IG$F9=+kS~Px8eCh2juAKey_BXh1Vaw^~<#h6V5haSAL>pb$fNJ##&09Ie zr_V{THcoisS;+pO#T*LCe|mhi*A3$_o1jVqOp`zHLJbIs5;{5dbcy%%CDKiv*c_JR zj)?mAOWI3P8v zemDR91(E8$aQ>(q4Gfmc;?j_6uIK4 zqGVdW#MQo=LcFpJAcop4C>`E3P8MBj*ei}C`B`UQBB_SNnympb-w)-oT7&)ivOu!f zE!e~Qhss@lOd8DXA%o^}zfZ3nXO=`GVp}bHRBDxpcw|Rhq2>j#Y+xN25`D(3t)*vJQSZ8v%85}2fI z0~bCz4YS%BRS!L=6Kkx*&=o03gt8a$~;-Qc**4vJ*}6$RP~xzDZO*@`G7U&Epg2ue0&dj$x5|3ynsZ+?o=` z&m#Gs)M?pwEfVGHa*GBU62TQf!|1`T(ru7KNLrRSP<{;3yT>Xxd86S|#Vjt|xy%Kn z9n>5&&~IMVTo$bK#ceyNsbG#ik=D z0=Wh`j_EyNhs9MNLHZAmpdtV(C%DdbtRM_sW*p}>vCOYiRzx!;l2km~O z5-pA_8PUj7tMm}_PF0$fCWcW}+C2ek$?%dj_+9&8T*zqgW1i3~ok3$^2{UG$nLkDss5j}uetR@v&5oWZ!yu<>Tzs;$ zxZk!ap-ghtkq0vxXMuyJPGHGE?u!AV`Y4=Og(h_=iKb*gGD>*+su6&62|fH2q*SOw zu5@g9<2$Cy%d4mBxdy< z&i8nJtFqKONtA%0i?j6d;*T4VcgUNhvvLtFtt2xJ(5w(qKr zXtAPICW`D5IbI2n<)TJ|Wm?%28rPNXi%Uh<_c z{Y53DmjkP}V--6UN?Q~M@k@;?b@@`jaO8YZNJD&;0aQ&D55huC{t){NLBxC5SUw#m zn&+>zI@CWFT4KrdOSQFG4(-5FDL%UhhEuGs$pKRG_uXK86>RPs4o4oXpAB~hh>G_I z!H!B1X0PQoaFg4Y5MI(Lr<<*6w65oa_B!YalMV)ISHpl=*NiYqyU_J1pDiXpr%1>o z%ZfsBKouoR5X$W0hWzPpGE{{HbX~#&g)i}KN~RFcil(@@_6XJ7_B*ui+UWlg?Ph(H zT0J<)hR^5Wpt)jM_D_FqS@uuPvh1G{mStYlE~pr!EE=E7yhF?QO#R2S#VmgqbdREw z=f&A*u|4A+rdznmR2{!9cG9pKm)LD>Pc?iLI;{L1ee`8~&1m}96Uj;`a#nPnDMiKu z!3{02o{Q9pc5(|$1rTdba7;lCVeJseDQA`7!EIj7DVkiNMs*=6Z^z?+Ac#9ZT83bt zoeqJ*aM&eEl|(fOg^q~IiSnoNBU^~vl|i(o6=YzY*SMe^Raxk>txwNNQ}D;y7I#<- zM*hi+Ml=+Nd%Hn%M&D0Q?^B7R8|6_o)s0MRsfRP{GMQ^0KfqYPv%95T56MxR3|vTm zkdrm2JkpTL>Wox>*ty0aReDPuE(!4yOi|b<{u}NcB%jfKpBGekETTs(7o*7InttS}vCgT`F3oiKzuI=Q?WKEY zsF+C=OQm}u*JRRX5^a(P?cS;_*=e||>>R!A==c^28*V3znmsZ$sP5xjsdv02IDl;u zV*}NJxYrwSplV0mQ5C?&+}zuY575Ci@NZ%-@I%Mk$_y>Na;Z{hq3tX`?jj#5J|EpF z0<$?tnlGrTrIyYfI!KU9h@8XM!s39o)k|k=VEJT&>lb87%RjBiqhCRN^|-PX>=3=a z2gKi$mCFEz72=`BKf$A%rsGx zoXaBGCm%Ju*bj?k;*Fri<}m^Ck?FQ#z`^Zgxa+4@R0l)Pu3S0>R!M8Kk zNmJMXC1o-~we+2QG&lLto}g-q$-j_Otqpl4D1eC_yjy4FCrvU|70ef-2rp>$V`r8J zjFcsYx*^D`Bp}HoUpiA|w#xxE)vZGf0u>HL=JrY*($#htt;Qdv#E`uN`Z~R0l6B~25BII zKLT&mc~*4ljI1DIU{nf_GEDn40hG{1yB<_?R^K*7H@Gr|)h%^}RKa;ULzOM+kuMOx zXaPG<`z`ZM zn7ncCvdSAzeBA(1QJ-YJW(Qp@F{I-*>gW^H&1!vVeYmtpr? z&#Ff3Tr1l$ULSz>slDT`MS#R67Njb2YD)?!H=uj+Ggp~E1cUs6rR~{k;>kX}n!3D7 zNp&CEVYd`lE|l~MYC7_FdgP^G`eo6MI#o)jWAq}G0yAQ0`^GebW(}h}sI1J#^ngt+ z84%Ol;}+`PQ9ORaF}GUN@YxIWgwpFgwZk5EIi^P7%Y7&R9)=m?8Pj4qoJFIcT6{OeneRj$dSolhhF@1N0 z9N?O7PZpYzvdNgX2Q@#OQ!;3<+|ngrM=kh~NY%92gm-s*D$|l>=b*kOd%paWJ!nXq ztKJQwCK~amP70lCwazvpj|O{tO|7wsDB!1L!lrJt*OadfNuc>>=kp@LdO@BPzZ`%$TuXyim$ zO>&xKp3nt8J(C~Vb&)sLE?8=ioCr5CJN5>*!F=Di1xcv-!wr&c#iCd>va=U#D?YWe zhlFo>%E-hvf#%@rUlmLhm*p4k@Ju}^R{Jr8vNz7P5#IPBmF5Rkf3L*moy!y#H}~P$ zCf0Pqfo@son= zBU4#PymR0CCG?HuF_~yf&vQq&3)b`M!7{^%?GQa5&iU}$k639|qZnws&9h$R>`WUDf^jL>n4lF;=UbOD$~%pFDDp%NRm-UYej1inT{SwI3x7NzSoL0Fth z!Ex`3_&bz}G@hdOYm|eu^ zz8M$p!Bf-9Yn*xxTQ8h>AP#C;5IG%0HtIR%NHJyFt&i!FYF!HuMBU_hw?IQ-RwedIj*WxOeTNNPH-5OpV&6nDeg58LRICinhuLv|d^xC!^?< zoONrwacOpe7PF@H@!jl~OyQ-A@}k!K-S$-Ea3g0_`C^%T6nOAc83a-#P9$gcA1hj~ zKlo;}Q7mx=C96x+43aCwa8tz)x`)Z81!CN49*JUq6P(h>{aN{Z=(QvqjQ;Pl;^!}c7c+xW% zg+t!RWD2-UQ5@{`_;HI4YXv`*;4^pEvp?6%0)DDk*pC^+!+q$F++)28dTJRztXs#~ zJSrfmU3t+z4d+ua997Z%v2?gf8GY!@?)UUh?qInKOMtpcz$#$7qSI!M9pq|Fexj2b`N0)Rr+6o_VeQN%wIOJY5eqzCZX0p= zGVV>dGEEQuDV?x4-7|4!4Wx05G@XR?iR5t?!EDPozr!2~eR^+58@nY|xXnRWcDnAq z=R(T%&3#tUXph)@OD8y0wl>sdSo=6M7_C>M_nS|n0e&6kFU^@tokM%*3V)tez5UInJ+?N+j{jy7FV*wj*PX5Ylv2eT^ zJWdf~ySc@oR`vCWlWz`sC)BgnQ0M~XgYF;z53j_<9CuY7`fae7R1Jg=IF#gv(@!t+ zo|BX*3zNm^+*HNgQ--_eEXpvRlABa?@@v>qZ^E;SAb(23a=(3gKpSQ1Kp=iZ)+(Eu zBPxI0wUjF60WHAn)hlRXsP{UNB&e#9mRyp=VP=PJqeaFM9V{p-4b6}I6aNsjVFx+; zST!zGq4jUxezqjHgB_%qXZ%5U9m{)u&kEn~SPqeS9kvQ9I}~imJMt0v@m(BnRCcbR zMeeTfA4s-P`ZFt-R~y(e{O88oih z1fZB6sj1k!C{rE1C-VHcW*ak&=P)l+wNrlesgJ9wj1>NH_)m5cFAMPwv3 zDP9>|RPPf7`?H<6S`6OTlq``)nQeTi6zD2q^2(jEBQ_W>N=}crs>v%pJIqF7m7!CW zMN^I+m9=*U(4r(XAH$kt!u`^p8||r33rVf8K%pXV-!K z=R^lq!>20}xPz0djIdlD??R@iV*J00_W$pH`}_a(x4%oQ-@Xa9ZyCp+jittB2qjv2 z;%88sLY?qx4s6~Ki|9`;*Hkgx+?^bbaVxX9IF65Af*K^^b*)clH+Tl^JX}}-Mz^Yb@Ci_2JE`fPZnEeotg)MB%ZUbrn$d&Usxghg0 zHti`&_3cb3?INFdy?k8bm=v0GJaY9s?wzw=X!^MKPr>{pNvMsEugnlv;e8C@{`lFs zhVs! zddmQHqvyiGH(%|4j4l)V<=4F%?gC5K*u~8R$bLyy{1VjVNHA!eN^^Z#Urn#g@v&wA z=+QOi3fRy$Ha%PL`^SJfu-4*CsaB=qGIAR@rG8~Q{`3|bHPk)WV*9=bJ7 zY!`fj+J|wUhJaOX?W-LORd6}jp(L#8e5F;|2%9G=2@q(%MHj2OWyi2up7FD`6(eQa z46gSh=fD~F8l-3a+0rG>&?`8j;3H|O)@jk}Ntb`KlgLmmcFw~7(0{+G8s=FFmm}ym zpNCZ09WtWDQ!6e#LXBi|8qe$UW&l}H^~v9DX4x8Xr>J3qqBjXor$KwLID2K8S2AZB zB>w4D)O}7{BUNM*$Z>a~$&oL(|K{_mSX;2uYCo-Fq{Zk7wIgJSy9Z0C;K?Y+O@3eA z`R>q~6cpuIkyVa&8%x%CJJllITe2GgX}v`Xgw8+UM3T zqe0{(=Z9{OL_B(6i?ZG}Q0(oEeDR5lLNXKOa7yMW$T(GlgMVe%CJhGuP&IP{C0^uE zUYWL>Bj0||c!DNH<0%9`<-j(ImH}hXx=LIJwZ+1wd1MSr@mYhvZ`g+2^A!+v=9<-e zq;)*!Oji4rdGLp~8;~O)TT}c$ki(Ksg*`-aQTbiFcmPsDB~H!g4EQ4#*Jkcw=YZHL zxz0*8Kt`Ccsp<<7?x?>|rPx9AFpH*7L8TUrFU?I$HGlcykcgB!L4CsJg$dD2kYrm& zM#njvr-G8qpml#^*rzl-BP<#Bufr9jW@v@bemXBH+2FaA_7hd zJw9qT;JL0VNh3YA5#MJ!TR)q?IV9V`PiJN(u1&+pDGwnyl4F$(qxNk)Z~4i|B(4J@dUEWf45m{ zTSm_5pqH229ZHmgtHn;*(@%r_!Eg5^G73Gh-a>Cxl9iJ z=M`92{=g`)eOP9*EumcmP+H`}=qM?xaVhE7Z%gc28*i)NgFy6!s}o(z_zDT0iAlpIHeaJ#P$22na03RA@>hjd zG(+W9&y_h+=m*nx-0JBW+os$=R7oFt0J5AhwnW^$m*BYgltl(BXWWTut97P$J1v_Z zz!FgJtY6TcR+%@$9{0y&8nxdMc|tJql)42rw_MB54~}YctzZt9Hc5_^{6(Te%>(T# zFaZ?2#Ovco>Zf@IElf=u!K-SKwKNDXqWa*1XQ0Ba=buKS*ki{~i}g?>4NK-8E|*#g zfjFlsw(m8sx|9?Jc zjPjB`X^^0|6wmLdMyLcyI0tYQL}r!Ql3)f9}HqffysmKtw(nb0K*2G{NXT1QB|D#`J@2e_FrN(x^Kp^9vwZm))# zNbz;ihI{=*Lz2u|^u8C*2!2|Z*!t5kv3XaxTQf*qTBh>gLA*Y_H6AR#{mQTjTyOZg z@(rX9yD!=bE=7g=$RY1FtSkrlXGF$q(`!n&bf-P)sFQ3VEZYu6+$ZBv|7(g#MJFN} z%fx6}EltuVUB-s^QSqE8f5Kumf`h_(P`~>aNxoTJ?J1_Lx$XAcU~9wgxyfQZ8&3Xt zIb6xTm@+{gRN!N12kLrM2z!yaA|6n|g~+Yh8*`z#&jua34!0L?WfX1s8185O!yCKF zAE9o5>zltGeV{EBr9%^f+Ev%TgJdAA;EgGPpm!l@Qz z76l~~OH;DlqSvQb1+G%o`MDj!Z*#01>l~n_LHZD9La%0G8?p=Rt;dhIHUhOWJEnfY zfIaUuo3_*O*#^C|;I8p-VeM6S5$bIuC1e5+45#sI&OPyi zV&n2fX17-f*3Ui@av%sxyO;w!-akF0L}?tPxB9aV1>;#`akLd3)xW-RnjveM6R&$y zf_FI6#i@#nQk>iUG+y1AWC!My`QZXL9;1p4}JA~CL)b;7TMzBP$@DlG;Ag4c23xUa(u-E#X zYX0R^L+gM$rW;ea9g6u(_9!iwRrxO$BB#E5(5bDwS14dE^KX(qI$$QY2@GS#V zyv8l)U6Lf`lv}?Cb?VQA3XzASe$2DDh<06~R(i2J2VSY4rLCHjopN3>61rB4N-7;oIkk8X<{xX!+($d{GV znrk_7+z6fgt4>1vO-c9;>yrE-kkrWf(;?zu0jBT-wn>7@w@zG*kCjU1UN697VQkEqKct*JATXNT>4eCE-Lpi^Debd-_^Sk6fk9hH}BypA(@I$n2;l|?2v=MT^@O4CQDweeA35-Tf;{P+pyG{JmXlPqODIl@=h@&kb;jS3%7$jnl|uo zs=Ec7;Kb{~4y)kA56WDqkzsr=Rq|bewyM(w&s3cxzgkNU1iYh)us5Z;Hc9g=?cjT^ z)2s?uacDSPoGZJoI$2rrDrDl4tqOFN^>@7W^zz2ZLz2I(q*Y^40P*VAXbdNtXp?!uE!RL@%k;$D_fNcESs-@6y~DlnpG-LrKHgUHLEt4C<`rd$M{fw)H9EXL&Q4frQR2 zRGY$S1nUoVW1yEf^64JC2KSanv`B$xb)V)+o5A(c{278#a5)Pe;8fp)Z zYH-iVOQCV3p0mG|t7q}Rs-&!3Y7rL=u!myM+km{^X-1X+J7FvJIc50aBzSqVo~i9vrEJZ>BZ&+fYg%qt4LSySLc4l={hxoh?=4o*UyH1;Q`oACjIu)g$Ppp{JtK zS(I(V=7~1WZPZOI4iur-uSK_*V?1F=4+XtjV!!usP{{(Io~l?wQU3}Jv04WGdHv^q zrVh-A0|{itGD$gsDpx_bZT_vz852&F!xa&2!mkQL`t(NkM`vCh1{wI#aah`1WYd7& zK2Y1KXXLqTEC#|9 zy9vOlEz*r8_oBKL%&%ajy{7g+JE{v(Iz~5)WQX-zq=fQMl?e&P`Cv4(hW-@1fVg@W zji2Gz*O6`NdXatrk)52j!dwC&c{*a(!=qlbvme(=@rEMuS+$a|^Xh_aTBrdXYh0?m z)z*dlJ06T6=HkwA&rY{2n7$^YSnE-PX0haL2ZxJxonb!w!rC{=JB2Q-q;wL)kX5K* zCiF*0EVS;80%h^R#*Kz9C2YWHu*Vtgm|;++=T&&Xr8E^G)VGY}4-bu#xPA9xUY4 zFV)A@9ZL-!X68Jt5DH=_K_}OV?>lA=kd9a{h>blq}`4%2--aJ4W` zoeWR2)9O13P>kjcH++64J7l=$?77=}+=DRWIeCqD;r%($_Pz`v!ya{x5#sjVXk%fC z;l-VWZII$n7aBI+`PHSzFs0|_<~j6DoQI6h9IXhZzf8Qm4Bh|qzx@4g|Lt%8$3Og! z|MtKC*T4P!-~aaS*ejCo&42lG_~ySj_~ySP;F~B2zSpAXU6>PWZGgb2!poqhjOuYI zgUnoI89-f=kd7j6-`O*MnTX85%&yKkl9`6enUqk&bXWTx^uJ2lTmXcH?&gCZ(=U`hs z>e!pnZ4XQM7wHj?!hdhTGbdM8WU$7e60kq-^3-OTVv&=a^^sFnan{$tRUHOzYJGzs z6wP?OP1Sdxzcb1+XDHx9fTmsfbXsiD$pd~^X?EH=LGxI_l!s_&jQPN)k z-hDfT;_@Z%7n53CSM+eH#2K;}Pvn4z8ae2nX`jZHT5TU?L#B1ZTbzEYWfx17S}Ej% zG66`MR}*Wilh3Nb<${|E1!-X0WLIE*4 zzM;GaLlPWqsy1Z>1g*HTx)`)~^_6T|K~)0>8Y{}x(DAIjeN5We@F+?Oq{cTJo1OeG zcdU?Ok5K?mFzn*gD9S-LkGt*Vmag?9_6|u5@^=H{5#5f#G!~J)VB_%j+41BPI2sn>!thIuPI2boSCb>mQn;@l5G#;AV z9cU3*w2^l=n5q5R9VHYOZjfm~|lDGh9F5bcQQ9tr) z!7&d;u+5!)U)pK?NMJ61<@g zS`5?Avac~@0?JYwz^c5f61m#YVIK!UbkQ~3-P_lQzDAl6c+SavUS5anj35vq(*Kjt z^87e_n}D8iP=|$z!q&}r*LBi!@LQ-F?|Rv?EO_q8GGh9{UJAxIb&9+t zy&gZFk@jeLq6#x125Led7S^GYDnA04{9!j3?;;@?x2UI}yOc%t*p~PpJzyW%{P_~! z7!rj?pB&n0gSg>jIlo(^iV6ooxq>Kme{t1#x(&-WdKk22I>^R@<5X+fpaIb1PT$4y zmO$S(mI;akqo;T+AMb3USg3eQjL&EuY?gvjbFp5t+{vR33MF_-x~4~PwM|?^Ql*+w z3vp*2)gGeaf%zP@-cjmMHnxP7GMIeJ@)Qy{BAI+|aHot;mOAoZF2dWk!FRTVwtQvt zcyCz7b<**_LlN8mAIBk{o=#@UbxzuvfNnb+FV@%5HFq=-tq_d;DdjU0;;H19!_9p_ zB&M6PQ#0B8fnvyUmrpF3c^atMh5!h{Cbg@9dU19{vZ%gn9gD^&nma*ah%la^MM1~0 zpI0>1|NE%u%a`DDnyv@atzZjOUT~97-<82q`2E1T7PLuOjmzqwlu*rsK+O2h@5rI= z+1CK3Q8uY{9MyiNSWqOxbkPTPqhR%G;%h*pt_(~9Kso=>{6>B>Pr2rsmEALZ-!asv zO0rOk8%zIkFRWfOEtKd-wr_o)1FTMU+ffk+&F)<36UbE=p&VrJ!+9!v-CZ*8s zQ{@0MN#zUZCm-X@KOOxQ`FOH%qO?$9bt2hM=0|Za?ZF^En76{CEISoKVs(Zz zKEzq6j{31LExil|OxIwM`F}YY)UsPTVwb<^yDKwpd(8f#z%0B6h z@F?rIp`YSn)hKA2#*mAPSuFE`0B`TtE5|S8k8y$b?2T3M@uO^To#x{hi$HcL*u2*B1{2kjB(x0LkuFov6E!T$YPxT2dT<1|yM$rXd?jgR-?B%u?)o{k7z z*z;7v`UCrZh^c3D`oUXBql7}6 z6MzyS@iwMHIyW?|Syjrzi>P8t3W#j#p{09 zN1Xt#_>hj7>}!!H_PKOi8+soyX5q-301lZVD}A|@m#cWdnk~$?6MSmtG^kyh@w+zh zoJ>3@+w4ZJR6GCm&#RsP>Z+apny7YS*N0)vQ0v05KsI3`kN%MFm-IVz6=(BdN-=6m zl?t;?Sx)jdN&MDk#&q^L2DQR5ii(05tWRG*j*F5O@JK9tF;J7E23!LNE|A;GPk$GY(7rk0bdTFa-}XBN#4vS4Ya^|7tO%r|o{$--Vf3bj0*NmV8f^v6b{6ll znHEf$wLS_fS7^fa%j8>7Uzv*`x;w!R*u61M)96_)NYp4JfFR$b_NS?qa$P}$^4v=e zS#zcX)kzp)P^m|s!jPzv2Tmv#UEtpR<<9xb)GI>J+P=ceA-#*v!n6aDJN$wVabj`S zK`!T%4!G+7ph$y{_aP!*8Xy1!QclMFcxketOsKc_XqoU`WdG{74_6YLdVz z>`oYox&nj#l{{})IRSnEwfQoEI;J=~I||cfo``=1)nFsc7M!Xb#r?GUdYyc$0?#<4 zRo1S6;+>Ua7oBv;u|vWB;?BD>+RC5a%MT*h_B-lWT0x|079Okphys73%etC7+Vn7@ z9tZuOYi-swsZq0-Y{nPryWW*3SEb(7S0=i7<7x84y(dX$EDu@qnt4Kd58=r@nEY#- z@wuj`*;;&l7hhdQCDlb&*&=-H@ht>ty?=xzf8aHPo^fa+s|}0~waOwFGk6=sFUK~x z9W=lsX$rF?09-($zu8qVFttK*7!sYzU%4F4F{2aiZYEPitqnfPT~N~Plg6R*0~vG! zCYle7jlQ#s#(VPeD9Bi5Pzhx_#xcnbmyVjI*%xQ_zeJk3{bU zOXuhhFS74k4A|NGa*-uVS-zxyh^pr$oagjv%AT5mM)60&#Q>UZNZCPf`Z|UD&}*%M zXi!?Qx-mFelA`s_Vb!j;N5wQ=%{?*pcRA#@Fa6`%tY;5$d`+KU`KOFdLc)2;QHFX* z+G{UTgcWxwdA92BTDG=3$DF>r32qNb8TfSOEs}>yK4zc|1&4UF7|N}~F4l}hnW}l{ z$Hk?ZC$x`On9$wNFVW9YNC$9}xY`a~;6a9b+&h;cQaIZ&^%M-G%7edtyx2MLYvvE{ zH&8ys&+#qI2|m=O!<1EOcVBLX(tzpfKvy!i^;PJ}6jf zVfy(UWa;Dz>#t$Ayo8R|x1-YmCQsJM(%UYDH4Mip4OMBW;aI#UehsT@K~-`>Knvy* zP0Y+ZlQYJ$8ZfLIWDOYkD*X@-#=IaEEd4cqodmoBD$$ZUzQIo=EXuQ}K>_7!sQ1TS zL;q3P&nc6c?M*zVAN~gVzwqVm?Z}kUQ>w)kidA!e0V5-~?|eG{F$vSd^lNf<_`71e zDm-fa$D5xK5JcXVmEB#@bRZU9a+6tuANo2uWhU#GnFQSnL>Z8(D>i89S&|r9z6y;R zj^b|DfK~Dl3B>XTWI1qzEXDZZc06mu-98X%$$2kRJMlEzm%0J8xd-r$mOLs|(N)8U zt;ne&mQTb6f&zdquU{-^8lnva=5`A8DTU?%V z%P(@m4yaebVq=U(hhAajvxJ;ypQGGWa8yG;@lXf)L>067a)Q(r`QTbSLu5uwfLsvo z(@7>-e1Xh<4_yTvX+O-+zJ+t&UeKJeP3^g8v^$5JTS7v{D;ETp2Vn24-x_;Lzs>*< zd9<(>`%m%O+v7=HXH(SsZz z-?Ld0jlxzLfh%}S*Ip0FbeNk1Bwn&{&)U|QIlp7AA-YH}z-&&j>&@;3IvH1UKwj&^ z;C=Tmp>36{A6!ZV0#Fl*hTFGjis+7t{`h+a{#{lr9TBw$!Lb&NTi^VCyK0`Gfz2!x zwsSPA3XbZ@fCuI|j&}paN{|__&l}>MC};y$$Y??WO5L51w4I(ofS|r1izM;{Urnbt zL4(>(RFKoN=%tN^*+ugWvwCu2RNkWwh2l}fqRi7#U6q5hZ}Xj=ArU=MS+f#3+}|;Ky*d>d zE~*5(+_AnbB#phy4K)B|<}6YGXrkgEhd*Ynsq`7c+qp6U<)+#T2<8-K!3LvEQgsJI zfgk3i=G%_6Oz+n;{MPeM$uvdfKj<%&?^U?<^keLl#I8z1EC2NW?A|rnB5wzxj6)NN8bDMZcqSH zhpb>ak|;T6lWO~zO9|}8r%{FX*exNI2)$I0>FrKTaYc(_65xU3eUVz+YPAlgCr>=r zzi^yz2$ra*Ya-nAe$e+a1*ls0b*^vL^1dNEN$9WTq9pjzL!v)MIm$%^wLKL%yr5zd zLE|6hXWI8~)5-R2u(64?26cFy|0)pAPBgap)RiW<=)2l4NP^d#p@1mIOK&Ic?Mepq zF|At5%NZsBdo8b^jm~&@CcDllPDN)XftC9J3RNvs|oA->OxKU40dWTvP=04~JC{#}vH+<;ljt6@gLs z)gde|#njz-V+WNSLQIW4WyBQw7-uBdVNRSj5eVWP)bE!^9+dhWhlI*LgQKvZ{)L*{ zbBPj8fhhES$NMB9<{9l$w&{yFZ8Gv)6=RgmAI+}f6#!Y62iTJ-v=5nly%+fgiF7t# z0)eQ z&_p=b`o*=A;f8c1p~S&%>6@y`suO5Z#hbF1HspE`7@|tHm-{o0Xk-=*8_PStM2KwD zg|-XU=H2*in5`M1l90h}cOl_p=~|9KGe7U|p_2cmbeUh|yZ9xB^p+E;bn3r~Z!c0k z7kaySbfRp)EEQ_ycHe79K=M$f$UcTggt*CO!%zm#L_;SYK5g!ulEoe@s~F(OpK_W+ zCl8ojbd`LXu~W{#-A27SLAPMO&Qbg%n0eL!?Ay&OE5AB^W%A>wl~gD6viDL=X+mZOKgpkT!b#&G0pTHc?UNa#VFA5}1^WwDe3Rbfj)?to~q z`%y%utWRq5I)*Y>M?3pLFB9}ID`f>D`c$H&2a95O_eMaU$jvM14@ltRHnz|2(?Zh> zm7K6&09`=!!qeS;wY| z(E<06SW%cgWoaAje>rOwZs8=o9q&=05{X%k##cf8%h?{?EaW>bi`PwQs zh1Ymih!Uzv@xvwjbt&kmxiGTkJfyXpJnbuch?s2SUi38b`wG7$XpZG5ktreL7$xKn z(84P~+eH4{>QY)bkc|iXUw?;eEZGgHFh$gx+&_D!#Gnu<3ua#HI;fOz_{$mFe^fiT zDr*z4VxDJ%GfAGU{4FCaNh)%VLLOzOLLR4B@qV%U?3e0qj%e4u{4V45Ot>Ua4>uwU zE_V*y&@x)`R-Y)A{d3S_i>MMZO@Jn9NTl2JzpwG1qIM;slIgHMktM~_R9I>^^Jr|C4!eL7e}vQn9R&)jdw-Xxx2g%3&0 zvnCrscOTHWoq5nbw>HAK8Du8WcI&rs5=mSb>h254e-w(cWhGG}AEHgua5&kjbNk-`B5^BXOC_=ULa_``u$5wr~9(jXebj*v%W& zbd~i~(RMDQcUaaMp;}Ib?rU(KmDp0Ey-!tp!Ln(b(kRnlhTFGcVa|(3YHuGMOx66O z%(A}6lqt^`2Y{TQfUZlJdYa+f!5Nl+lW(CMcsv_3F9t<`Xr0~{W77b(TB zs;&X*y#zN%^3vOpc=%&fG^hDhX#-*&In9kTy>SgvUh4uzuC+dE{6=*A6D;;p$H|Ue z_{2QPCgXcuUtY75FT(OEEPP9JL>)j#gWWYn7uYTNj(Xm%yNE5sYP;4g1xo4 z*wg6AiYlKDC-3=u5a3=r3DY-WVIU7})gj3MGN&d$GCK=%yYdUnEy2sERD+)EwJ)5J z!Cf)9+`>}roPWrT$+n|H=x8`@<`?@rq4unkP}LPwp`tU;MAZM_+5q>_V{X;Tk+?Ej z>5zJQWlI3NSr73Yj(bUT7=u=_i}g*wbVvQqRjnhl^>OTY4hW`^8qfb3?Y)X};c$nh zgXmDL)xtqpeyl#eHiQJs`aq6Gwg28<*`eA2LSp@taUMxr0D#SpquzQn=tXjH%1!p1r0J*=y-WC8^WbZFv6juYuKlPgnTiwy zHB)gcYg8DVegorOpaPwlB@tk#CbgP`0D}uTGgDfB@vxp-OxBF1F0n$lfX6==ESl)x z;^}1bPtU*{?Vy+EwXDL!fzsozCH_F9f-W^Vt5YEG_3Z@p5x276w}P}ZYvRe>Yp5lv zE7`BZn}{WUJ?WP%PtAj5)?f-a^&VGT?m!C&R!x<-`^>yBX@wE3TCC$bmCc}Z!Q{f4 zFV)ExJ~U1w@~!u&PL1qVDfTs6f;eMM$%nv3)}7JSawPyS|IY@-w*i~Auv@p#2+{?Q z4eo9!NJZ6NJ}+1ow92z9EBD#;9Ar8yE=~xjG_tC8lrU`zHx5i~9hzcd#&_aAdPz2Re}&B4Q9bDu31e*<`^yM39Mi}lKvZ(+++4pkmY97*a- zV;yX#!{>99MK;gk`r0D5_35Z_!QK%bt;6CZ_uCIZk;C&jD3*-1J@Gr~5b2{y+1 zgLrV^^`=y?70E(0y#@7JX5IW0wH%FWsN(h8q`5xu_vDjPj7j&KapMiyspLi11)*av`q-zF5yq|_3eMO!D7 zR1S9w;jvB|JtWaN>(^v~n1r;%ZS_gw)hOg^ANoZ>y$%?X>b`^dU+W~>N(gCbF`aOy zB63L`{Enz@^aW?g5wI=GmI;U%lIKP{VDCVh@_38RFa*uADjyZs0R}+D)r?;#nq)e( zkf?trz72P)twH%l3JphHJB{UkZRectONUn$Z1HxQp;4dH=3Mxxy#lNTOTJr`A|AR3~C|swCZ5yE3@ub`_2|vI*(Kf_QwiF)zRfCs$K{9T^As|%?Hzli0O#ys444RRBzdMV;Fr^#AImYT^< z=>TF_3U?~EkoO4&gFb^Mxl$_QIKxXgpE3< z(*rJhFs4y8QwT=2EO`>f;C`oQ3wEA`;kg<*f08y;P{%PXoFf=HV+LXpP{GZiZ313o zfchC~wz-k#737?W`)P1F-`j`|Nc2@GD+3S(P$$ZCmmH`R4}>LC zOv_l3@Zk1jVh@LAdyVqrHQbudoZETJNLY+VaBpiTIGihk;5`Ew&i8SYE&R0mTGeJL zIYjO_0}gvd#l7&jo-{YXmkb)yw#6LTObli2(8S8~m}I_>&mk*0D#x>9 zm?}WsqbN(?l1Gr0C)C=;q)zRIMH%1+ZyoSGdQi`g3M5#u)jpuF%6uL0sjU-pa&zi_ zajLE_=H3L*xH}hY7yxd6-w8T3iUj!&$|7H?3zanEEM5PRFy=IrZ?~_GUdGcS)91?+ z;WbfslGGdvsfl<%qp4-_K*KOLgBXA@tx$xsZqwi;p@ZfP_V9J8>>A7puuOD0CRc*_ zI33RDd-f&p^XDZSUM7x=+PA{xwf&A_Oz%Nvd~~Y#HfKutYhxTL(>kJtjK5X6uQ>M}=kkD=jeB8B8;`@A@C2d*s0t~Z%>r22M%Gb( zN%B;%d2(M>FuT!ya9_an9vjHo2X&B9JCVm58xD~A+3ZBEEV!Zl(5t)1C8C?mgal=dXPXJ8_1c zB}F2s+4jf#Wl+wBtwwY&ld+sczCnY&GY@iQ1i8b^Vi!%sAooVw0~AQ*S;h_}E`O-R z9&Cc|s2MM97OCIE(?iwvRn$ShiWFaJA?YNIXDuX4nlS{MySTzr zM<%AX?ZHa5kzaqAXOcn7*!XbU6k0xrCSQuc9DAPxB{PWxhEI-{30Iike)Vjvo+iTS8uN; zi$8q0TBLS7QkaW*anOb!>&|GAxecaUlKNTML_%H;A$2t|He~{8;W8t0gfvT+A>d}p z-yAUx;^SN5yd#whNGGdzLFE+T{k?)XU(#%b(f*y7IclS#12HZ`Pfo)f^HJd$q-tK; zz(vTL2OgK3gS?aJujTN_LnJXJc}lS!`?3n$GPR#PxbLVURuzBZ|x8)16| z3mhKHhl7t%1ybd*Cvsio-h#HqP4CK1b2sysXdGH}`MKWUD}AgtFnk1%HFsr!*SNVf zl6To{;g^kjg~$t&dEB-n49N~9C1!8%WVJveMS ztVqkz?{cyo)C(43kg@<>`wGy`TK_ezRAl+MpJg?$z5$IaM@~ag(l36?1-~Zd+|Mu@IVio`RU;bRJLjK<5D*o}mB=jmQ%YtM@ zKbQlqzDQ+sLeJF8QI$!#38(wCI+SF~*}^~S`FUjwfU?Y3y%JQ=4>Y4w zQeB+jBqADnvHM|ZS2J%(QZC`ga-gTc1)*rtF!wYoe(WD*xwIeT3+ zcORp=F6aY}FjaBXNKKu6iJLl>)jaW=Dc`Awej8iWv&gAw>MRlveBaz-E@?%P+Nj8( z9y40h)d!TD)b}p$6wq2rIp4qzEhyTmq;sHq^TnJP2!pG%{S)onD?SU}_?D)V&M^k7 zvtVk4RGvMZ)#3+9_b#{DKc3U@+WaeQus@ws1?(6pZsNp|mjGc7$h780J zUoqv@(HjR%#UZY~)Wj_In9HhF|BdmPRlvBxC|kZIg1LX30cTw9TQT7;LZ;}Gq{wNddA9T(66m(zHC^4HN8ay4N6R4HNw zxho^95pbBYt=rpE`w>UkN{7bxkT|j)0Thnwm{m1d#;4)%l#m=Gpyi^Bqxp70^7y?G zz8dq^&J4ZEUu-#}nx47#6d`c$9xkz43`;@f(C-tjaK5h?3*8&Oy$@So361SPZKGMe z)W0p4BqjMFzSm)uCp)U~ynmQ)#4WQ_Bd`{4XrhhnS^1{Pv+Ju0jIoV3fWqnzc{cym zq2mSh$p{U6Lwh&w%#quy%3QEeiJ{TzNK$(R`SjIhaJ^5{5(wbhyq6pLB;ke~PN#bF z`{}7$->-F3dd9UHL0NSa>eniJuQx%XO0?Lgf93J9dr^dyc_+M(L^VrM5TqD@n1Cy3^F>3jN8o#z=BmxN6Gde>b82y^1pXM~t@x3fq z$;lQfb+tHnL$yJ#gKBoZ2&IuZ(k3)!Am{ZQoNK}C{au@#8!Sp9x|?>DLIiWVuVyUl znzT{7K>5PEjbv-ud^p1b1&yMC!hu?vMx7&5=SWoMC`?H}b3E+@?~fiMZUEc%6=%fa zJTGzN(#T@gCOrtrVq5V5rE7_J*jN5}ZY6=2nzJj3M87H-+Tr+nXzSR+DFFU>6yGBk7RsRlJGCT!NA3A91v3n4lW@yg@St-bPV(>r`SNCu;orE5&_ob+-mq6916&aKR~nZm2tTXHX5YWMu`g{w*{Fx~~$ zvK&+jdM-7U<#8Dn=E+z`GZug}RJm@c{B9_$6V-4>^HN1N#&;C_;5XXsR8LIOjFR!^ zcX+<(wv5+u4)trnFcbDSBa@88k@D$u0;7rKMR|0Qby=CvBk*jXP$Qf&0gE3G2Xbqg zLs`MDQ~3SnytOigIe$&CJTXt9_`6Q=4vhzusvHjM@oQOA=rg-NG+IH5;)3%z@Y1@H z`D8b10$^v?R_&8#E|AvPZL(~HJK^hIRQxpe!1lfN}UhZ>^F|LU(@#aC<5$<5+y z8Z^g%4L|JT;&kwx&aJ1YeL1uYQ(5RqNy5~9WpK?Q#<7;`>tEHaouWfHXu=A$el7pm z+ll+P-^Awd{gZvA80dhb!g!@`Of11hS0uk_OLuuY-y}B$UCg=39>gR~X zOcG|#)kIWZWF7{TPvz{LXQPQ;;4GA?vA)aUGN=j8C&*QzT`*^e9-J|E!D3yfzC$F zE*hs=iI=w|7nJ;!{e1;@c70Vae$BDg?i)Jbo{z6sv;S1paR0yXjBj0Ia{-oW%wk#4 zFCn2M#etceN{PclRnCytXF221A5in1Pw!UIIE4y$tGq~8yd5LHeP!n)EVuf;7owA%mhZLm!N-Mw7C+sg&ggMHs-j?k+VrEdtgU)aqm`*h!Kt zQE&IqJ|zcry%Lq*|{Wf4_s?cg`-(!dFy-bIxttfqmCT14dX0(Bb0O~j7 zmrVh@g88eq#Ho1~tV0o>0VsMqkhtDdhOpD*9NsS0t8ueSL>Q~3iR8-(AFlEke}z`G z*CfzoJ1XeQDR}Set2Xeo2f`9*5M2=;)SG(od2ApmBp*VSgIT?^vPr z6ntV3gU#ze()|8Zi46KG`ZbQ95J>V3)n$1<1Vebo!V zRMZPvE^CIRP1v%qx!Sr9WQDdWACoFUVir{uoU6PX{CP?RqpfD5d8L;31rTYfvf)5sC9tWqlVZSN+gXJAQ3(Z|K zZ)C1bNz$lzgW6?3Pv4rqGF05fKfl!-kc9nV5+2PF^Bpz(p3No-)b>@h3&JyMDtmAzcDp7AlD3+*eqFEB0C(NGtf)E2-s`6v1LbWWJj&dZ{4 z3m>$hM#-(mV7xAO%M;p{20e@rMEJXd=nlB>aJL^_Z7sH_VZITy-h(~Ko7O;ZSd(LL z3&EFaP#{Q2-$iSE-iG`)P#^No$49o+Kb2Rf(qI6)%V`#tpTp)8cXi6wh8wb%K~E?= zeg$EK$5&mYji=k(v01FJtc8_&J$vn-NrV6#TdOi1-^(WGiIuvgD`kU?JQZ<6X?y<# zqgPV7c*-(O_9R$?aU$v=icXN}|JVVtMqZ_yQ`%9$+yyW#}E^8(qQ3Q{vadGKBOIE&*`HtplF%EL&8^xlIKjDj#i z?Yb{P*Gs-HGqrOdj68XmPWfMw;h5hgplX;QO$T#A9 zcFImO}T~w`Z;5J(zgDgO#M8()7i`AwXQE7DwdJ zfZ#)aN3yTDdWS$-3rBe8)0=3rkF{H!L|f2F0s`=;W9qf)!WU9af0_q+KyE{u^IAq* zDxI5xMB`L;5zM>kt#6*9Xja^gx(yB(`bu(FvN-gge@VOI`=$)x3UZIp{iadI&$`OW zbC7lg9Ia^6=$H}2^#6H~J`+NG;r*EbFl!k}xXFzmDo3SrFgAcyo?(h>!$z*WZcQ5P zRvG!AD(~igbf)b$sQ4g@y} zy-asbX$M;GP|29)l}ebs0hcKwo9*?l&Y{>kltGSy|3wa&MB|zrL4z069$00J2LrcS z%r6+F(wDdBH0}S;-ARGd2Vy9Ykx>?qr2|E|J|!Zs8>ln|fz&~zAE>Ck@gJWu0Qk1x zx(0@f7DafvefcbvEnG?No4L;R*5!e9%&(PatjYs?>)1_cEB1?>sjvN7QRasj-=Q}R zQibAUg+&;e!g_e%imHKPJB=N`TL_~H$JR!wmI7756q<@5-1PzO=x0ZdC;yOab{XRp}bhd18SlG$sp zy{YlaqwO0$4*Q|^>u@!udwng&}wl{1m`(TSy=)tg19&n*{~Q&lh_s|4DhY z+x)3%B6jtAs^dhHZCMOq9vWdpO)XM~(OA3gvZ-cks5s^B7sE5_UCicQ!kF19Hrt1D zD4K8e}Cb) zc`OSOk7f-3Mp9eg(hVzi1>(al*HzyV=ar%ifbscidD>HQ9vr+8Xd)|FC)$Wxi89YG z)7C=UoGR8a%^p0STD~1z9>6&za4}~Zl)E!f!a>CLU|k2IjbzTl?-^bs@!L3FI|RnR zzD>Q&pE63-%#Y|w^W9X~+6ea6w3c_xokV4wxZNwnQ=530E>-aRqU>c@?AuVvdA4)S zxX+V@X&sNLus?{ewzM#+l)ASw2D1jcQv^|ve-65b64c9di7uheg@~^@u^dx!JlCbs z7Kfhnog*ZE2Zuqoh;V3jylnQ+l(5*7Blg3Y4iVY6$ZFwOwCdxDm^M`$ z+CEa?aq{W~m54y~_HFU@5tVcK_?8^ZU*tzwEjI1&%Z=^D$uqMb5~r{s?wGpAug%gA zpsk*hTW7GH3RBnN^MwR~$uu0uD;Xcv^TUtYas8#R%JKN@g_0jyzo-4hm#KmqP&+eM zv{_M#2~(LcJy(9!xSgp;!jk>5grggZlx;lt&c4onQ z_N&)kLh#21EnhKw z4=Wk-^Q|~LL`f%e<4clqCnijTs^N)w(JK`5Ll0dTr*{W9ZZmgrYDpAX++N2SK-S~T zX?$>Jp*~|r3iwGltJfs4FFL-0;Y+K5ntkQMTLOJjx{};9g$^R0R<0Sf?hq(<0EQyk zB)&M{w@a$Mj8=7fg}_7Mj$Bc7_v@&x@tW$BuQ8rth3Ydw5C2@szKv|?w96kI%p_Mb z8mzwk@U^HMixoz866c0^h5cr5kj>M|duuM2aQf94rVcJBDXA}@OQI|(vcrg*&>XM_ zAZ4PKOv=1%KJx?iI89_v6&g(KMnWPzSEB60qA~h(^bu=tkl>;kB$OlNl%NAcaM6`S z#a|XDclt1DzlY_Pel;drIG90~RF;w~?So$Yc=n$dhxC`c7A0^t?|+f|QR$9CxN)tT z#SFik$tDyjvH#nOQ@%Vov3@5fR0Mc~G+G_r1B`ei*E87nlSHHP6CSP<64v8jfQeeH zm>&MlD5&jw-x1xxzTK>FakJ6;CXI=lBIKt*c{FB5#Rm?F3@z;a7b|=f;a(%o=J~kL zeURyi+^uYzkfwni&mbX+B#*p1%sZ`JG7a=vNM9-e0PxC{HASEs5GTI>xJ+spiN$yl z!Pz9eB1o|Ul-4(#F6?Dh01pfG z{dLoxG)XyYk0MyuSptN$pWBvS<5PI5D27EQ^~S_=p8VF%yq+7L5&iY+BwtQmhhjk7 zt4vUV+$NK#&e5?CS-iq;J@)of*@Cp;;?*E0`aJRasYXRrI#GDCjTiCI=7J35b-a0>T|t;%Edd_wzBz{TkU)u*+ls`gv?8x~Y>SU*nd(_S(fVf3 z23o<<0{U@M z8kAZW9@PQ=kW2RYZQ}dGq809g;kr>;``zGXI#1VTpXZMC^sdMjgV0%}Xb)m4h%BxZ zTs!R0I$;h%Mhk`xdV$e!8a5QY)+r-gouV5DdaJ~$vRiI#L}#zS0cQ*F_R`+T{8D9E zkH&DrN>!n1i>87E(M^c{4l3c@k^IuEMtCvRa#TI%c!aN#5}jzz!%Q54{1Jx)_tM{t zvqeJ-(2vw!rmqmnn8ec-T`Gd}H2_gZ_ohEt-PTzSj2T(dyzhn4}4w<~jkKS}|IQXL^hU zmi%iV2WWcHJP5 zreIapeq}&kuSbau>c=m?+)YGAzDIYH@oa3#| zd<;L+@a4hE?Os%e9_5q(csQg$^Q>PFIwSe^_$Esi8dN&grw9+zgzPZC@)zi6=ewrf z_qmTNeU$?Zy#C;3BzYGeuX{Zn)XBsE%8qFRa-Xc&-br{`^B@|E32E&@QSR-5k-&*; zQ8}lDDzt>73wZ+Z`>Xf#U=t2w*}e@bo6s5grrTyJ?(Q5mx_f0OJZMQciw#$6KCJM1 z7B7c?rjq;WzTjQ<~i-yPfw8q zUZF}3uQ>*k@2`M*No;bc8y`iSvt?sOj4DBG7a+CzCmw_f4oH|DR3EHpwoDEO&=!+Z z@E2XAM5OwwmuSI-wF3(C$-rUuvSKTVmviH^XjdMdQo*21HN|(cp29I*IBc(_zx7<0 zF{lqSGl{QR07p?(cD&Cu3c4E*Dt8~>6bzjviP{!~jogQ%fltWNxb79q3KJhZ^y-d) zc2HRvggzqM&fyJ!v|Du_Oi}TSSthSsrbXPl3UBYDhXd++&>kWwGxCeU)4E4aEB3g1 zRigU3j2NKFAbzy5`{ZC;H9u++9D^JXCv3q*RbSrckuysKBR`L9Jh@uROKH_ID#!*U z^XWLKt_8(&mY%&2k0y)9rp-6a&M!tT0|0`N92-w-`RQ6rUFe_=`RoM57BAnRi%0@@ zJ1~70iq9{cESdZ-C^qfe64kPKs@HD1Tkd)-9nwFMAmaaOrI6}@G8~*eWJ|)q z(|C}l36n;U*Z##kht02?E=?N$p}q8`UN;mLA6^4-p+1#bOF9oL`Ppe!fn| zR&;a71n#HAp2V9+>@UdjkIoIr5de6R+v6GkuW2I9ltQAPU*u=N|+W zK-Wyk&`M&^z)8>kU&9TV3_!h!vOtp1pMQkgH!!)j9pvk!%eWm(q8gnL(m|GfKEOYs zmXygN_#2N@RrfeawD%567RXRNPDWCq+pRIknd+T}Z9{8P$hzt&r)d9k^Q^P?;{rM9 zL76Li;~yJ5mL)pU>N9nOtl;Z=;{@Oz9V-EBq(Zg%nX_7%A8jF;T9GARg0jt_%ayZj z?$R1$Hy!tG%_{?%Rd+aK+k;?Q_Fo!(4oTT#V^6ocjcD&!PKbrd2PI!QKl%W7>v20g zTURomVjjR4zk;X2kxI;zay;|qsbfekcJ?e;Q3n+4joQ_eV;d1B-A2zZ@zv*A+IDhT z%XMg~lup)yHH zNKo|kY*6*z4uOO88{)C)mgMz-e`tw6nvUYmw#rx(e1-x2|-g#{n;YnlJ1L z5*&r)q=Jvg)+Cs1YSm030r4ATPEf~LKaxj;U0vpI?>xwkl3Te4I#`<^HDY^(BMpbK z^UKAm=w*DHf;-iYMCjMBgk)ctUPHqZ8botDk84|)9Sl5A@NC^)S6-?D>VVD06|O0) zqo*cwHudm@q#E-WifUqJo%e!9HGF*G#;*Y*IIP;yZ}{?`gRG$Z7g5t7p(3Rn98LHo zsJzKWPSh0ZjD^btxl;LwPc*%Cy;^8xGD*W!(oG19%(XDMx1*e=dp=vVeglUTkagO6w7sQr7Z--Xx~j{$Upkr0vo8gAmdF7SkUg}f1dO)%muuK!@B)N( znQNWJX@eK^8uI(Ns8~x4N+abK#F+~(aSeIE-D{aqlCt7rK5L-)WlNl-!T4TgDQ}IH zaSKD9x2+v>)kUP?K9eb?)+V47j)GYsBj2vA(--?;;d}=6W)EY__7+-Z zYoMA$2c7>&UCWQxPVkmo!N!rSi!YJX%d|3o;EU009bzFg zF6XT-&WG_GcsM7M@Ion(+Z*Z?UjUS3coQ}i9nm_)_3v!b0uletHLxc%QtUPb)xJzT z3MtMTNAUoZHoiS9ysN`#(f0=Uq+p%vN@j9}(eB4QR|qdQO;uP9mWxgBIprcp7mSPI z=L`6p%K@TNY0=|#P*r)8<}uue)kikGy#Qe2vxv?1C9T--V_f-JCa4w(%ET^lRbg_6 zb?1==#uoUM?HIdeUOnBQmB|9`$;2x8-8{7wAbIj!Vs)5cdLt(2_CrBU6MP@n^?=#* zDS>}4g-?8)E%Fi z)I%p|Y`NI$i;?xh0XyQG>u|eoV*Ul4MsjMC*`&-}el~Edt5VCrC=tiTF7 z!W%vKvLEuv5(~qKWL(2Hwx=l5N}k-7`Fhkwr=AXNY z7qJq6N2p-d%C|^%bA1%GC9!Qqw-Oe7j!0g_%%q#Ov`dz&Gk-K;)5FH}Fm?Y<>rduC5-7pwh?Di`Io&r^#z)e{?CF zZWbN2&f9 zd|6Uy?m@^gBr%}qvhFN&3r=?Ci13um0hE~WJ|OX1+f)q2+EDn(!ay;$CxZ4_*hMrd zhp`)Zo3h}`h~7OWe^<$f35Snb{|yG+`^ zL#mwbI{Q&9Jx=?`sR{W#fm=5i9l9t$v;ARK;kxB2X+ER6z1WPWcZ3)4BYAP$Gq{;S z$Zq(gm}f`~V`t^EniQg}d|Nu6wu~60ZKtr&g?Pr>X;9UQ?uVur2lW69_6mDEB#;tQ zjq6n^F!z|a@)52TlA}}FiKq8o1cN<#T%C@QRcg032`A=WkAyJq?nBYVNu;)x8LUHu zp?umxC2?z=y-hijxF01og;AEs=7U=}NCcO_3n`*N4w4Zo4sM?v7U&s=sLuf9XCWgrEXeHSar|zQxA|8k1Oji0e~hTDXy8SNOMW z5%wL7KtOBcx2}&vO!8h$>dCWPf~WMa5T|QuoyQ5Os$_-=nGD{)1UaU|sSlr0_>#&- zBdwL2eUj^uDKd{0I8?2{LpKpgm2bj}F}X*jVEdKhz|(E!ohhmO4VHt-bxY>?Jc6>5 z66+%8ACTlBEUXy^O~85T6MeDNre~)zkq!@zAQhz-qgw<-1tiW!)vj1{D!IGC_J*lL zmZr05Z7DPTG(!GBU|0Rt17R2`fsk0~atrsANwjw5nlm@3=xJm{+SYYhY28V9W$s4wl3#CQwkR0WM|rBx9TQBcTyIUd6AJE}tl#ehXhNc>;^$G`s1 zfBT#N_5evhw!g3c*T2hu{@4Hhub5RUz>>fJ4Y1_zJ+S2OR}@ex|Lx!Y+rRzyzxjXu z_rLi+|Hr@o>)-qz|KorApa1@U%LT4}`hWe+r~g;~>HjtH>BL(4u!*i4`V6dd?Hl?G zn%UG2jyo8O>@9NW;y#(8JS!msv)*4M2%@s^=9k6z@*%2a=TCcK@i4m59YYHzr~`dG zWB%m^C>r)l)(TZ&DxM#+VKpo>RVW3Y*P-h0%#WH_>X2PavAt?8Otdg|Ex# zqbP)we7);pnEns5XG9?S8q*Z#-AVd;2|!A8c#VVTxE*X}=l8c}d9sI%SH4A73j)MW z2Vzq|j|?pf>vtiTBoi^6WBz3@>coys>__-6o5iyan%Q28J|&c^5}1Ky+1Z;-wBDaT zNPdXK{qcGsx_AsW529Mm$dsL(_#}rQDqEXpcUViXtCA2%KXb{!(QqrQmxHZZuzw*t zHY6klrLgc6p1cIrLq?HIIXTE$6$6BMepK@45oO2a3{EDqqOCp%+JW&anNDn;8YX$s z;?qnqb)#3a23eN6bxMLHKa76?iBVJx!w8V#K1VKPt^nXi$On-PEp2n{UQ2Qhjy^RO zI;EhUwwKB2BJuBMC$2n8v^G=wEZ-2Ytyal?a{NX6>I&1Rnh;Jj=$1JZDOG?|$AOdc zsCQ2F4R$ZMZDG=)t_@BQZdrFsyk!q9LsSnYnlDk>W^fiK@_7K^(val3(%NHYvtYT z71K823?xgR@#vMQgw@^9E~UWni7O z<5V{J8^ot)EzVd3Z*;eoGpTUHu_fkKK5#D6X}D*s2z^;(l94GTz#e-Q6DpXaPI=P* z%h}c$U0|9IvMqiocCA5AIo8L_2n=T4gbqA+T6~3Ww%oz&?Bto+e5T?Iq;?xM{ud8- zBtJR7{Zit=^5@eswiHARU3o?e_D&i#{ul4PtjM3@k4<*T49Fl+=zfpU8;^fp012zI znb07@PczftavcMk60+xP9#~5jbdVcoiPj`~GS1Y|Y;M1sfTpZ^MUiQ98yu1Fxv+53 zTS4w3*e&b-?jdUIohOZnRNorA7RCG_ZJ1JG3V|5(qfym(MVrH*KeNGe{PAk{?kM>5ns>Ckce#sb)R#cefH1{}`Beqd zJDnOn!*Lw5XEp-=FJhBv2@8ma3%W(c`lxdxTYKN-T2*_x2 zcAA!>HvIUItHlIJZ%G)JY=(U?-FE%Xig~4sq2H6-0r)4b?r3x-KRi-x+R&z92T$@^`n#-E^oK&Fx4{%%RPNIEJC%}X_h+k7I&R`{Kj{<{M zd4N7so#9r+kPhByU|0wXs`U=Di4B$4JF|w>0W`RDQN!LWm}c3dwbrk;+~q+lh_FSR ztqSKa-8&I6UZ+78mMgq1##n{4m#?0RP<1JQEu0S zK`%WI%v{dn%THXx1M2t)-_~`vi(J8)pFJ%FMsK#oi+E5)--V zVcY}6Cn}r-E$+#;PA@h^>-qU*JubYc(%tsFv6Jk1E{*F{M8*J2w<+097r(IQ@udZq zH>u>uheW0@5-XkuA1&xotz`i%kZpL{_T&i!W%@nJHY}ozk*T6haeEf8Z%eutzV*qc ziSv(sZOJb^9|8~4Y3rl;aGj3srg$t%62rt|@J`Q@X|%RNB?*vwWvhVf3FW=y43u0? zHsG~8AUR7maCI;{jooU{Zb}nWt(RqisOVqMQ!057e|UvRuE2 z&uPE&09-gEyjLH`Um5FZcMaE*&xRdn4uiPM3IOO+U$H(~fH}mH8dmWkO2G4Ct(td3 z!_rXtnll-@l}-xI??E(B52RoV$KYbg zSW+SdnGj05#Ev9CIm10`(ddNT%!I5sE`)xmYN6awxi>{k}pbD z_bEYcl@KDMk{GfoFX21_fhVvSg0@701#92Db(fx|6rEY?NDzc;Ybijb4MrtNyq>a% z36mS*5X)Cxv9B)~y(%&A^7NIe{y&FyZZRHT>*-Nul?&D?%5lf|Yu!9JD}e~@?tPIU zve*DtJ60CWn~rYKZzH+U@?vzd9TuDOi;1caZW^aetE#fe0mjz8kjR1$#hjq??{GZJ zZ$xW-phXY5^P0we*9XBf{4VLYN@U>jp}3Oh!cm>=ggM!c8dtmwL$g)YsI_tj`nS3) zU{l1ps|0&n(N0|gtNFv>Y^-o4t&m{p$)F8-(U9Kghra2<0NjHoENWIqd)BtG_BV6# z?5tN(?E_q`17hRc8A-%JOAmjH%NPO>P2QJ)e#C zqS1zdj&$=O&k2BJy)RrFGmPO$LQxVSv-U1_5%_Fw+j5>X)t>e^+_^K;i?i48x<`I8 zN8rzOi@x=VWLL1V@9~<#ddo6?3kTunZVKw1Q+K9jB=PuYmuHID8dLYa2B{RjV?wTa|bM z3t2wNxHAds_YxffPSeU+>Y_y`aO5NbkegE5s`=g#`t{zNdgBcTl-v2tR7@{bRUa!R z*dZtS!4sn&tvlaq-%nz%J;(}I&>BbmS~ZD`0(8<3vag&zaqkRxTbXX{Cnyo`0po9L zw47FA>cecHNLu}?Qp-1uRIZ-j*e3aUryc}tRyl!PM-QPSMOSgEm|r$7iQZbQ-DJj5 zv4h1#UzNS1xWn`*71pk!N+-C?_@GVp7$5L041eAv7sTr)d8>5db79~KInlb;lA3&Q@*!1!M9L{Nk0vH&nBP@w2K3qff%qBtSE`s z_LT)4M#u72wf{g184AnCgpr6J5o+;#DX>E#69T)ubCm)h2h%23#xE(k`*zBP!xHL7 zu%S)~KS@^Rk7^imD#kbK!K9=aj(R*&dAofa-IgSS!igule!lB*Az`~n1PQ8Cr**8X zX_ivg5bj3B5XGZ~BPj*VvK&ysZkjU?L^Z`b$U0(uhX7Roy|ffUH@hzvk3FPeM>Lg) z$h!t&R41NnHH2L;6Zm~<1bk(dZQ7qULg+#sw745_nKJR@Z+I)DQ~E0<6g4_JU_hzz zNNSQWhVmDCdQt5JAB#-tjMBPG+wSzcyw}w?uo?J5x>r|=^^k}=2y5iOVB@fLKX|7v z`geIPKRxx>gT^vHmWowo({zn(CK}&+_ew#U34l{Q%p0vG!H=#Dted1_0| zK@VhEAb)g9_*BK1IkQD2?WAnEyuE{*^L7FN;}kG4w7kE(o(^D}t$AHNNR;v@f;&$4TNHA!WbO2uxvsr(dwn)(09k@k=L; zyfj#KV~e?8J_t_6aqrXrlE_(9DRaH#yF7r(QEFbSiKzB&ghgP7_%s3#5zl^DNU)&R z3yOgiEo3@3F1-Ypo8A6}bTva@-(kOEoti1}bbU4|V#rBh`>A`*PO~x> zqLD<$O`pv1moUSScu>nsKdSP1QFwiRi7DHEVo_{1gwHWZ7>$g7F*-U>7ruOD#kCY4<}&oiq1(D57SAYl)lA{)U!KPUl3g zU&XhVK7G&B$}W@S0yUMQ7A|Y&8vH)7Bdsk8_@T~IRr)~st=4$$>^y0BZYT@AS_;9> zrWa@y>Xyf70Zo_J{YAoTi}EZcKOu3NqPNUXOwC#t69$9N==Ru3MJaGgaFUNqR2kmV+6vzfMz{vcHUo%P2E-THl}8K`D=wBdyy4)|>TkzsB-r({br-6V0!DI37syJzIf zB=9JQ@&}dxuaGg^LMa|vQ@nz}Ik!-i_gy$&0}2Ea3P77;+a4cZU}Y**UpyP{vTFv;la_~)Q~>(D#21pka(x5j;2X*k!p)o! zF(rMG%IqCQPA!T9!zL!H#w*S&kcpnC70Zjsvw6}XdmlF_sT(5HjR&233B$sjl76gr z!Hdyi*-*l1IX#x_w1bu4E1RHdS<#ji_EG9m zf$x>MyXzVjIwU9n$?@O>i?M9F&$7C(R>$Wo2F2|OK4%2Onc(RTU7E^HFuj3>UG2lU z^Dd>!wC<C^cF@;GGinT0O&@~ zqu{g@k%7)PPiF z>{0)ezD%Yl;ASAzE13l9WQDSIBN8GMTAx@V{;9fZyV}MFg0hY7yzU_TdPJzg7}^qW zGtM|&L%w|r`y#4_t9GmOV^YzRdx@R(iQb|Uu-8%fz=Qd2T2>_xXetPTs=C6HHLyZh z9+r00OX@ag9TBOPlt6f{d?&jy)UudVu7NTP?qz1%Gfm4gUfvf= z9F(MmweWTHQVWlJKRvc&B?GwiEj6QuPUTaw1dPIoJkFaE0G|@0SCt!d(uehfawb)8 z+LA!JCwMz1-kGht^=fc3v0d4bL{MK-lVX1d@!P41VpMUQ#~)DeBykEG=Sfz!G6&xn zDy|vfQM`6QlR^|c))Cprf5T~tMi}Nn{&2>tg($X6H_iHzs8LeKwa;9DsH+56-p@cK z83LDNyX$oZP6^T z)~wBthi)by6@UmR2St@E80cw<(6?GBXKb1|iRZO&UI%=XbbB-3>g>Dhu1FUz;4s2^ zf!QP~V+#?sUXm6W@kIviaCqbSQ#L4`B=iV3J*Ss{A_u~M8uo@kmJ@^ZC;r>$mxFhi z9+XrhwAe>lHs{+J0J#+h6e*MG^ui`FRS`DDcnh3~WPC<4RMI%Rcfc7+mpn6ayoCqKPz`*Wex9z5hvF zL(WjjOQ@d1jZf6w@?R=7@&K}QVpYG;^n!h#ROZRI14ujA4*Po_wm*VW6B7FCQ${GL z1+Q9uvt7Be`_s&uohEWK(w`ATB)7uUj^glo65IyuQ$spvaTBeyMk?4A+LUnyOmInbS%Bk%?6 zSs9=~QtiD%K&=$KVzv+6Dt=!t$pN-dq|V=iDbkpWS< zM1niCpRHPlcloG|_uYEcH1v64aB>Jd2M<6{*e>AL!Dlr}$hD~ihC7{CKMGwb&t73n zCjr>qvD^q>z=ewOkzd}7I6J+E#*W zCr6B&CQd8*MBym-rL9!mto6U%8KMKWVWX9Fb295OCmsRxPT|hykNi43O*xbY(B+l? zhVR)`a?U^ehMe;co}BX!Npg;=_o;QtO(GesB)`WL{*YJ?5x*!XZ>jG=+zo&qg?a5I zJkEVV$!YvsU_5#HvncqaWqD)tF4-*Vq??Swu-_bv0fE%h)anhg z4pd0mI{q$opoEfFNHX@JE0$@_w-Kd4%?f!vWN2s&Q&EZ&2`~w?q|L-ak@P_8s*It$ zEXk^0hKf29xE*4wzF}-+BGFWkzd?5lmHg4t%E&aU?j$Ub9LrLrq}uhjM}xiDWd;_f z7drAAiLYD%?ix?OI3NV|``Z@|s-|@2OmNVUqNTzSHe&AOLH@!5cz9Tu+Lt<81P_})ii(=JYI?xQ1=1$ zw=b@Hu!iw|`t|T&kW|U0NE&4Z6?F;GY){o%()j8Uz`g<}=WgkHG_OU@Tg84s6)k*% zX)0DcwJ00~l*GVb&GKKy391je0005KjhS`UyR<7Cn6M zo9Oh+j`6(@A0GpXcm+-(;~;8qd>L;^a)K$&TMRbA9bbV-R=iR=IHM)_CPQr027`a1 z$_7ge(4<#^3Of|5+c;&NC8F)FUNoJx>Q#+n0w&Zh;TicImG5*a0LU$8n3B=IJoAOK zisoR%SLx`pL0-(ldqURB*mX%WIsv{+cF3r4!YcmK*f%XhdmJA3AYKg})7l>)cxWo< z&c$D!c9aSGvrlHCFGcCa69@-C)E0EM%*RK2%XPl=CO+>JzZ$EsKprCntOFJUqM!2Cv?Q zorhk0(UPrj<=ms2QsRWM%^ZQjJqtQ|Ulr7G3%k)dXvr&Dq0o?Eg;>b1B7rF06Q$!w3GALw}k^n`tvph7p5U5n(BS)zg1^IQ(ESWbJFJ;t*U6S3FD1WJ4PeR5SjYawxey!_ zIiO$O8VvWa$pbhC)0gD;m}DBX(@NAiqQt)L3KE+fupNYeHj6~{Pws=gz+CakL%Xj!8wbKBdOho)ANV9XL9Ayy=<$xb#ETu-x~qtswAiEx2x# z-4tmz;pjL%DUpm7COtG|&BCu}J6R-`b%On;H73%`2tcmj04BT|;X$Ktl8?@w_)#dI zIKCbDi#J-Um*f#{srTl+?3ia-ud4BC74yH2;B@)4Ij`Nf3f0CG(s9cW|`S%4f=U%9LQtel}j&`q5(KtE9XeN39zp06kJbKz zC3*h*s^T`VIu3D(m0C-L5OIN^V%6F~>WJqY>uCm41L`B~Sc+=AcG-1iMk#uovCrYr zqLy^Xgp-r(qoww|GLPGAuCPC#=8J7q1uLVlFwqxWuw-UMnS>S-AAI>Zd>sd$wK#=$ zM-NAau~ZwFB&Ql9cbkH5QhL**p}HHv#tB}TdJXGn`tdgmVN^s0q;&ajgnhsFi~J?J z9$A5Pl8>iGM^pu+M{4YFDw>wC!uMo?saoyB_uW~J&A(E`pxT5H&ru$-c-Jr)2dSf&Mm*xeBHaTjVf{YtjKJ8WKtZ>PUYx!j69tN}wT0szdmf2BK>0uk z1RX-t|K9atD!~~F(BZjyS#&?6Y1;pFewkBT-ZqEjdyRq?>D0uN^tD{U^7*XkE_V8( zejooWz#b=OS_9lO{^_1IYe^Bkr8_@j@`{!oFs1#e- z9{geFyIG#81TZ93NF>$Ky~N|mO#=6-J3o8XD$oX^90fF*^Y`TgCp^4>m9(X8naX$V z7-L!Ri?XlG2_O@&Hh|`y6BD6rnveIax0HRx_STyy01Czaa6KQL6j9XaO(?$`)Q9eH z#~$M?df_R=inOP%$PT16ZM?wQ-N{y}RZxr!GnlY(;ex{7A37?;t(a}~JEB4xLO`v4 zCtxNgstAp5A+a$Tjre(Qp^F-ShFhn~^Ujl$zi=*|Oj)3)1%mGhc02aCbtXvS5^hYi zzXZ_)0v2gZglK<&)KpPZP+>r21i(j!!B$w+Je8WKrx3f%mrVnJI!X%9HWGve#PlJ7 z&2F(NGhu#smW0vCu#kZ19=+CUCRuDlTC~99kZ+fyR6%*zvlZWohnQflhaEJOBz!0fIQ$_EK%$)FWE$C+;?YMP|O|@GMZnn6sS)tA0wK4rA z$Z()c4{6_~R;N2Vakt_I7_0mXF#?(Uc$bkE_*C9M+wZoksLuAnQRL-{ zQ8<)kqMjyy*gP~_Cq4p4{4r^sgIusFW7md%fvl8-hv6?`GjEHQM1i>46GK3r7?f)@ zpO3`(LwO!wA~qg1HvY|c0{;W=9;wILi(020nVwdrN+tk2{b)))tZ(+%Geq zCszt`LABOWaESICszU=Z`}!HhB)@0Z)_9X=oqq^EhjBNf4Bq;;Yil69R`D1)xHJk; zAC#ZyUKlG^+(O+!HkVaHDTQppfn_#IvsDB0@8%8tcYIv{=(xw1pj8M9Q-wBZl}rCu zz6E>YRvAqB`iXom5plc`t~c)Nc$qqasXI}bZXhzpB zOF)9o7#f-&2Qhso{jiEkE42#%g_jYlKCA$ICDoO1dYYMU6hJPRepvYEMfyg~d8R^a zDW}ZRKF({MHV?q@&%cLz?=dI461XT514X~#eN-*WvzymOn4W3b3Ga9msw?&sm9e*~ zRVa7w@yO&zg1+Rt1R*$Q%lUcJY+XsFlMm!~QF;2pPRPBJr%Gil;Wv685N7Bs{W-iL%zYd zu4c`9~$|f$ZdftkOuplGKZC@cHa@N^oCFb;oW| z%g!X&KpW&f-s#V;tI-}(BLbu%bI9uD1`wV-qM-B5StrSbak>{AT)PFzsc z5IJHGw%LeBIFHZ*NGXLhoQFN@ds6T;+`ppR9X80di{NvOn!DDk0p|1x*ONYu#+R77 z?bG?a9${M*s49Ox_!a_4K>A*2o!3SV)UgRQNo5$wRFn@yN$O@BpQ#@u69AtkF&o0C z5~)mNfX-AiMgkF_`x3i8<-H8QsmCtt%=f1ZX!sVJ_THnSo43Ldfb2c4I5kk)@Pa6R zR1^mX_GUT%R|#$_{7ngovw3{cPn*ro50nEJ2!4qpeVIuDO8L+~3J_Jh=@&;y@L=lB ztX)%046hvxQFZv15Gp9#3ri`F5I76(*?}u=Y{}2U>G&89sq;bla6E4Oi8@ztp_WFzKnl4hYI%w+#W zLV~hmmf}*1pno53Hc^wKtRu_dcSGbY;8fj)y;C!}XmF4mt5(wB$w%B90I}gB?S(^G z2Zt}g=Q>+p;dzdQIGWP3Bu?1B_3>3egvRVYmVR7I-}m$Bh+wXQFf&LQ_gTU;805kr z$ET~E1xYUzZ6KVvKosD1JI;67Mw5sM=2B%A{ zRb+C2v=Szd5K?i}w1t9lZo6R7AOEWMSQ4Q`O;DYH@aaqX)S?QPB=S-HGrrkDYm>9K z{`u3e{pAGCSfaz-=&OFbdi2kfCD9*x!eqErm#mx0>RgVT4^inUx?g9?B>SeM!O*up zo-CX_08Dt*tNF*Ou~JGgzZ$78OUswZmP87Qd+H-2xL%3OOFLK9;hDs18{yt4$f*`* z{c(P|!Qu=Wg^GH+f+pExM5~>W1Z)kUE43@zO&SYJl7L=GepnT@s2m1r7$hV`4dQdTc9oJgIUzsgYKx39L?wlU|(P3G3y^ z5v@@)*_(uo3IDrr3|dTu&K~LRzQBy2`BNi)_NB=Coo;}w(=R7!wIOY()u0=%!IRlnZVR z%#qWmUT5shn&RTgsa&m|x~~$Y!CSha;0t9ZL1nq3)&}(gldquPAn<>oNCxfnmgC8p zF3vOlo~fDPac>UgTjs}GWD^qSAV(Ertp7+I!Xlx5^&hDtM7OsoJs)?xE2TVHd5y%f zc)_GL&-TM%U4E=K$1#^&LR~L8fYd&R;LKpD9E`P;ouW=Bo7Be*;CK+9Ni)0DHp;Gy zo{armhrp}8%tc{HMl`OCZwJf?}N4G)y5SBRmVCQLdA4qTdMo9>Vng4Kvr`$aA zTBEG)p{SmDbxn`MVDG~lB2sA;iST)Usm1$pA2hZ#QjTVr`K zF5Vpvai?aFgW!n9j{F!(qIqWzBKspVaR=B+(QBrh&7+hvN4-zPat7rAc>v%k;-uopWbnC~wyr2pMu6Z&l zsN0n2s&v`i1(f2TDL--hBA%eyM!?s?SUayS75Pd%({?!aUl~-!u!Pbng^K!M5>N-z zP2LkcU^jN6V#mnqyLtRHZzNFl2MMXawBQE4|FB|=5j~0^jI@18EtWs2krOa7-?^TR z?_{KB!;;)$kl%ryqUug9i{greW)MOclF`GF_Vgqhq1^zD$LTKqmoqA7YYT((bQND6 znP647>ia(^XX+Va`iT9JoQ{~S+1o%SJ&x)waR5jFb3GGlNo@x0<3CEdW$xr*Da0d< zq@5qrZ)F?N5)*fs*6%!gk;vGZC+l#k$GjQ5T2uqh!Z^P5cxjvUP&6IX8?i9}EYvc>zQ)dwE>O@3EXS+EL2z=eB(YN{J32S!L=xHN&kZ zBzoCB*4F4$>&y~5IBFg*;?Dm3ep64;<0Xy~NZGOhKz?C9Drd?1)Z|EtMMOE5-Jnsm znl+%uHvpPVPvf^ee&NC)KeL{WIg2>Iy`Xbrd@i`}3Ag~gVlP~iL(Y&}T6s#)vU z0F+daR`=g9a}H*=^F>xdi%WnN#fnIYJPNHdB3xgogKyhuA}6L(^!IH8+?kvoPtZu2 zeSStxicW@`hs~ES#l+qpfuZ0|+u5WYPo5V}6~PbjkJ-skB1bhGJHJPut!N`2^4{Xl z1m#Kv(|Dc?7Ov$fQFGj3Gv(O!Dc_1^89#ljt}v=S_P-##FftY7Xk$0_lP0`E> z#3aR-U7$sRLq@xG%$w~ET0ok4t&*QSbCqTg63E)&e66}U6Sj#D_z6tOsO@e9H6^=Z z7v1mr*CPX@gkJMrVl};y>*Td5G8^q~<3%~$bKI}8U+};?W}I$XGjc4ZM)ER~Tb8Hf z$P8a9jlu4^C;x$2n7t*Z4O?CbZfe11Hmr_KyC(tdkLreIL(Q%N6<&$R|ERi52Af_s ziqkSH_Ri2uPb48oGS^ZP+mSuypDfb$Ngj@$R32CHO*C}ZE`m}{KE$w}>;uSpBed>q zQy*X6KV=RAu$gcLxR?EvqDZL6O327ux>&R^frIzGkJRuWBw}u~d}zA_O+ds%p&T38 z=s-)`nb-NzJ#rGI3^8ZMq>}i)e@%h_;#4g@YLQm`m{tD|Kua3mHsy(=!)zYg$~41x zz{5=3MzDh7oxtEcOn)+#CKt|2jZ?v%rCm0M$S1JISR=YsWE@k9_>>mxlC8^v2u@zvLIsl>ec*Yb3URa-5FJVf>zEq;!$%`PJ-;{wyf7~ z?ToH=mPJo54$_A>=KKf&c)Xc`XZnWukA+VyFbAjO@O%*6y~|;V5BXdV`ygO@g(XgP zyO-QBdi-=%rX!dvrS`*3a4OiPv0fnie5?IDEi$N?)#tG!kX~yR#Uj~?w9n%diI2GH z+6bumo^7tUJCN(m21@_5P$NfBtiZ(Dz`JB}r#rDL+CA0n(}_7a9Oe3O!C zPE|ugT-i|{U{R!a#OS0LG}kS{s$IwL+4#L^nAFp>teS;3C$S3ZDV39w<)DVPWCg>g;b45`LgI>&CgS{I${dJK7FD3Jts^_zQJ#I~X)yeEYWZ`d= zl_9Ty29?jj9y@9j`3*QMfcfn(KLFdq6n`awh9*`oZb1ZXA7zr zkM?2?25@lI1_7rizrqKDGukj6zTgy-4ZPZdoh-g(G#eD+lun6@P2UYc;BlQc`m}E8 z<`zW5)$9i}Ro!;M|8>?KYr$>>S+sL0gwL1;X)Km5oCqhn`qmpB0$}a@E$sph_W*v< zN$zpjJW2Jib6gS~(q!sGv=Bg1ip?Uhka#TUjA^WG3tY_^h!J7%<6KNnnP-FrJ-(IN z$r62d_Z;2V)X^+u&b>IP-_5(iH&#?(f#ea4TcXL8G|^_f%7Jogp(j@!X6mNU;hRzp1K|3E81`x*+4S1ifBMQiSe zSt!_qkSyaCQ%%(2YF6@js$(ll&C5atgO{+-{Y4Q67%c%h457wkLNZ@=(iP}Dyt z$&YR!+hESNPQjgi`-sy;&jtkvvopfjYm9(B9;%%Pa9BxBR_l}8!`UYaFbvc9ZxA?E z`6|X3(L`P1i10}1jo!dgE}OfrRwxitV4vH@R#g9_@;M(MRsdCC<;7j=^gEn+}2RSkZRNSUG#6q`0UbM{7TENcb+KC1U=lwd65 zLy7VV^V)rsNoz?^V$V7WrtC-kVF{aQJhO{%{|Y}(EnVf>(6^+)g>TSrG5@+XIU8o3J#@R3%HWLU#V%m%)txD!Gjo;u%00Z|i6X{wCC!mHVZn4A9fpUf^lJ zamFXeu7J^M)rkNom)r)l$rQcz3;Yfp46Mp^WUW){uggDDJ2b^clHA<`)paWat)TI? z{KFyujS>03*vdb)ohE5B$iB;OWE0VMtr6-Srn|WB=T`_s?Ov~HQT^j@w5a~kYf=4U zLW>IDwyBn?-bZvYU_bT`} zX**bzWkA96wgJ+z?{T}u3N{Lp877{4zBVcApRPnGu%++ip)V*asbV{Z9E9vtN)xW* z=<(J-`#>8*2MU#z`mNvoEH99m;8IA{HoCShFx(NUcs9zOA@GP0lT-7 zER+ht=MYDs2}o67KcgwU3`MXxRK`TgN@72?16jhOPe;G9vfDVq543p>w!Ky>3vGzR z;X(wegk%ZPMYQGAHX z5@sHv;(M4fQ6=^)nTgtl zQ9XdX*swwvl==I@3OZ{|56KcVvesqs$|{fgwzMYx<4gc^EN5BckCP-Q#ABCL#T zp!xYx6K^cOa+1#La;k3dH-XH@@`?+)Jwevc9b1r6#Q2SZ5r}E$iVTZy@nnJyno8x! z3xc+y&0i+^6(`YyB8v41hI^fGXPXbvo)>D|P0FNN&to#BRKF3y``NII%Io~4F2^oD z`Jp6_K%UM#my6bM%-Kh2{|bRk!en|j$;b}^Ju=)zm8BF4JcplTki+K}JeT6hJg3^# zN-bPAOUpgWC%PLrzV&5rvYYIJl$M%+87iBN#)j7a9D%Sv0|WjZmN)N3Od(0}bzx#p z!maH^c?C9r$BLH)d6|S0MIPpLZ^(0A@v-_Uzda_k5JNE5IF{W4lTdl^RK3%H z{ORO`H5G~3IqR%ousxQO3On3e#Rp?DIbnWuosQBHhg>W?hM@Ebd$wY2HdJo}7ZWZu zL7dfJVnw5>zUC`^im79p`sIZIwlxcyq%5f5GT0o5}yo;=FNy3sgKodgL0G; zeIoBv(RNSjP>&!$hB<&_Ti{8R4ua8pmw<&gn_I#*fsD7 zWi;?*4i@(jG3}RxJ?$%u^F_EnT4_>WRFYFLtoTp0foO*v8DIq zeR*v`L>pV%(dik<#PYp=n&0$G^Ts9HqaK(Xe6$zFRn6LimBU#LmprjPdD>edE$8;m zCNpzPYT4uU;>ktB98{AWlm-q4h#jjo{X@=*U*~e&OQLk`F>!f+A5SH$=_A~^c zSe2i>mXYC5wVdJ29`t*mjLkC{?di{Bb{$wNFq8Gn^(}kJ zkI?{CTV?2>q^Inc`2HqqXL5OQH;Y!2YwRLR8SkPxuiK$FTjPh&N7rwwq)iatg|F_M zu}e$Z`m%nZedI-=)XTBLv8)3!zm)qu;wTYd6kgn6BRLtPu$6w&!pBB@wWf0eh$1Q< z;4PbJ9ny+Y2~|s60;mUl?rKlzIfz685@Z2r3N`E6vI*hLG_}0(6faQ3f=<5|R?rxc zL0L}D+i8w1RiyiBqKmgXswE2g*Fbs1Zx5=!d?VWk@D&N!1}mIR9G+O-(kfx8R?G9d z*M&nMqREsQu!?Qkt~Vt)os8L}3zMaG-)qJ^B;FssYMV|$5nFz=eJUv*=MUzF3JY~e~gCvMw?KL?Vu@GbTri0c3N2tPJ7?#|QE zj*u4b;)CvTw@8`=opp@8+`o@o)2R9s6^;ykDl6sV!%Bg=RKwK0A_>jkNX3(^I!_L( zsn%bc&OG8KUErAf`Nt*06>6GR>^4<#Pu)0b%g;OoDSIr**Gs5Se)ODSrf$@_52mmc(N&nINi2y$(0Niikr}9cFUbb5rckPBmU)|TDjnrN ztjwY<3UwASaz4U@dROiRO$ChJzAWeOBcmnYSNW?6X=qV9qFzAely_%J9=;;@ZJ*Tg z$F=h&=|SN^S0$^)KS&X&kPvIOj=HJKZmOSsL-TJWs7Hp2mJKPq$jcKjtSf52WgHP3 z%^;0_ll;{dZgV}_vLp(c(OT!nOw1~eIxUy6PYCp%z$A!lbSGHe2N&V`luD$w>!@-D z)@A!eHT+K{#-8W*ax8_~@Ueq;hjIPfM>Kx46#@_A7YwW+1YM;}49<+-8r z`(p&qNNWpL18r;p^rF-<%;NXFoGnb?6X~}~E)k}v&s`bjsN@pG!PU==-}}pY1v5@& zCgFS*h%~)1jiZrT`$Gv4Nnak8)RP77$Wb9sonQTsRWe8bJ3z$0g^XLXD!8}}vWC+L zB|!TCD@6B(+n}4q4w19&STgPgSpTFScATL3s#P@$KnTPh4!sQ|T#!e*Kt?$wBY?9g zbnadQa4S=5yW~)Z(M#qgO*CE5ce8i@8IwL%YS|c z@^`y~zxyvMHQh8nINH6I(V4%b3{M3<0+~^A+uXUST&Z9N z)0(&1jUK{D6oe_rJD>%uH)P@KY~h#E>(N)P?;=a+{YPwU}ssrFZps0-{OM<@Li9>`O!MgxHs8jZ`f^@7uZqg9I57q zqv*11TcsjoWNh*J=X)D`y@YVD1HN>>f*9dsOz_Fl(vd1N={>n^Y(W}vDBc5%)Bj{g z`l4wf#~K3OiiFz-gp^=!al6V&>oNU4f7%1|P9pSAc|xu5>1Li%pmFEfjM8OCm19Ed z0sI8^0z8M@D3HqA0XlK`v~;jn>RB|zk38?Vt;#c*R|tXSX@xb2i?8#^I*8R}1%;RD zgxKRxAoftTBtfZ=RH+L%u(`JHp;5X}(&B7Xw9-rprA&0A2J8+d-d^qnpBa3(oKxI} z9F7~=&+wYLk=A_AnWkJ1oUM`aD(Dp)6zDJPph&XDO+AFx{1 zFji4m@2`sO$uW8T4Z}vg5P;#98we8Ro&b8?bM{rwAQ>F_CCaetgfn)GtAzi6jaVwqgda| zxZP^jB)4X7=b77iV<$XpX_io7dk~nJ{d@O0PxQ-zD};xXD6|rz;o}Dx(o{jWOneuj z`b^fa97;rt-?~&G#MEu1{75EI;VY3UV;)*S_S;-6%zn_i*j(|+bs_r-n7Ohc>mDm( za-tWw6flqSC}ts6YFsevXU3z5PL(zqZF`9hYn|3!|C83K>`>h?;G0idCR?hh6brXJ zJJmq($~%j&I;VVrD*}>mpMxxfEBa`Z(oB)lG2DMNT3kCr>?{ZoSP3A0gHB&P#2M@0 zs!0aSPs+ea@kf-ws9D#}$Z>};Qe+yP)Jd1pNDHQBN%a5%4gPZ8RsJ_d(bezQ>@%xo zLZFR>4LJ_#RwI!^ZTK3T4TH0c7W|4B)aEhdg%eNquT&|xeNFF8gER3SjChhvwdhB6Z&EN*NE;c()<>oUW|2WXdqL>h66p z_JYM+ZU`MK2|d3^alLtN=TBbRGYIT#47!Wlw2x2S`9A7(# zE2nS-^FV;lKJKqz8c=@4JK>q4!moPK@SZi7IKLt1_7|X~?Y{jRFhhnLv=)LAlF`$JA&Cxn3uHz11hY2gRG|HXvB**YPmT{5aVK!TmZ(%?{r4TpNT_AsK@|e&#eDnQW>`=K4$;;+fr*OiO z5zvPo-KSZ~M=NFX1YsS8(}!B+_mdg4_CclH*V|NHgnjzTl71_)pydGVS>+2^6Jj*B53$yw+i_9BL~GR;QdQe|?iX{r@3{uc~*xuFC59w|RrP zpU7K`)1>82HSscD7E?Za9?hZkBxCj42Zfe|Y7YyAeX97HX|R2{9tH&!mTgn&()_U1 zE?u{iQc%u&xod*69g4&e1M}Om)-ViP0K)~-heRA-GRt4Z)L^%eRiXH7EC3!9sXl(z z?&6Kq!h6VQRVM6B;><;Sn?ldO^Ylj@PdWIjEk%O#7Ea{FAi~=8UShMx^Q&7aF48vntrbCleZ@8uijuPvS`i86c6|a9os~=hnb#qpSt=vW_6C3-~idG_R`u)?z~wK%$x z2Z6hGQ;r#hMduUXjtN0E0R7$v2a53)`5EMn_S)2r3DJwo}Sf zt51TUMmr_X2<`ks3n8%`C&HhsB%nWi~Z}QCe2Kpz2(L&TgX0QOJ;dp2WR1o zg!vlY9bPjyn_o=%vf$*>7^cQgha@ozz?jeSqpu;sz#BrUAZx?&9610#UeLT&1TdJ_ z+_KI;e$k;D^5VbHeI>xe?ccs@odrcwJ5if=)RVwpyUz@iPw4TvX&D66&I{&6(A`;XL~{45s&(|d`R!Rt^9n)XNB(M}Sv zX5J}HTYA_-s`uf00sfzo;ct~;v(P?dJO(yVVmxi_4=c(kDhE>>H{`Vj%^TF6f6_N# z%~89IkX>_XblPOnO^M$q6PR6cKph*WM%URW192uJljvEpRjGenxfk1$Rkqac9^51; z@Dv``P}F!j2=Y7g!(QCg^*h`{kx}_1akm%uOlWL28iSAnY_xhfs=mhxbU}A%;uatp zuIF+zR@7%FEs-L=Iyc3QsN5BQ>66&m@D}!tluGZUnP5>!$w_9Il_d#Lv(I~b*$BV@ zBreIxW}p;T6Vav0RVfKJMXBXpB&q%jf)d4fJqIRd(d^(2ha+ohYs@olHpu$v#Fb?y za{oTQxsuQKWF+fM5S}SnOXI>*t$f#(4#W7ODNNAjN0<1K^X{k}?Ow}}Duff7Wq_!)eD`IljS!R8I1}nIQY6uF{nQHJUcAxnn+ToLGz{GD?St- z?VPQb{3Q8a14UBq77^sOd`U8)U8EMRk}{s7!0nc#?|_kKYrpAMRmrunaQdTRy}|KJ z`etD#Ot`VBU+-a1FxM1gt@F`HI!_S_DogJpKJ?BF>|zF68B|A`^`NZ{r_=~6(C+h0 zcHQigWBnZyA(n*1sPZe)EcF!l^1BOpa~GGj@@sfsf7XK1&aB@^XyYAf*KG=S!(L;x z!l>s|rtV`}vZHw;Rz&eKFGTE8YPGr+6wgf+LPoVqZ}T4M*`%F?y&BxQBqZBuL zs`Os*%FznTI3_MwPpA@T0TQIKZ7`Xl25_?{DOH#t48yZs;=oJ?6|$#h^gIea+QE2W zkGRq%t-+U|5vD^*t;vNBn|Dq)}*G)3o>#Ovwq_}J7YP1=1?!6y_!JA+wK7)FH`PbFGP z68J_)>JWqpxjbP1majqA7J}-#u?nzK#w^(DM5RYm^#Ljy$|D1>JE^+U&X{v{W;{=~ z!^$15M8Wt;9RcVjPywNwj^AGm-=j}9elH@yY_f8p$C29#Fb! zs?p%M4qi0c(uL$L<8iQlcmn((>V7W;i@}saZxWAPrKC`()KTuE`X{>eDzQPX58sG< z?c*8j@q}o!;r-L^;48egg15tkYg9Yut901io2zWW3M5bB{8~#-x3L5pNGLQvH5~^( z<)%k)nK)X9yi$LH&2VDI=G23dXXi1iw%ag@h6u=Z z7(ED2+rXU?2@n0r5#)`Eci<~anlmU#&?`s3lFthZCz=oSK>EA)hlIzo0E^qnABG3D zDDxy2;2$Wj=Pzdq%a{GGiaym2azt*o2AR!f76v=chcW zBkF%ERC{z_IBiXPDI~oh%@?tR644xn#)P)2wW!x&94UYEEJ{H16`@O$eq&U*3%17#C!$AfCJT5vRs3)eMhzh60xbmUC zm$p|!49HDaX7}7%63PWY#>ixt@09?{NGs)40WmVQXj;4=1e!Hi6&;1(h;~0r+5ZcV z&F%b{;XImkdIZ^)T%-XPP08EdxE0^z06qM){JN0b&&Cug~^r%`m$L7i%I zZN78%Ck1C`6PFJPkVeEtF}?GA)*sn4*uJKRYEAiqa^fz~w_Z#6>4%rfk2ktV;UKukOxS^L3nr#|vuC z?lqnYln^UF)5|EVzP%D2-CBiB>n+H&$rX}Wy^?A*yu&PShdC+LJr-t7>DJY8e{Vdh`#vj4?`%{e(7cZ};sr%aPlCa|>%#6b#n~XDK zcW6Zg>nrWf*QF^=wD>$h^+3sYp;vg6z^QiUKNcgPxfQ-5^U9u%Rj~-=D9Gloa{n)d z`RLG#zJofXl4r;!2sSVV(6MV6xvR40VoyX1$YswKbnzZu%)2A2Q6sco-0mk`c?sQ% zWmM%z;>A;IOwL3}MXOf`LQq~_wuVj3$`#M?=--P$<5=bxm)0-=JuGiZ7Mq2U&xMva0sY6anL@DFEx_$q)C6 z&mh5XyrTQLO4{Onq8j{FMdIM~{_RTdJ&H!V5GC5$j84w{p1E*jN%N=CcAgK1@I(@{ zN2tD%CM>~>dI(?%D`*0I3GK$3TN&ATay=^d<_F(Dnwg9h)7X9qyZXkfxeF$m3+z;~ zc5S`Cvn^OjYeyq_87fDjtggcj;!+PC27j|ky;|#o$Vs}d${bCzIYJ-ssp%{2(H;VO zv|SSOlNvtY;p&SiK9oE=@OH&gYe5f`RTP&R$0|Bq#+WCr_N&i|q*oHk$^*?eWgPTz zH^Oq;U~oh5UUlK8qJwSQ=jlhRyI)cnJZO)@Y}Y3F)Z}-)rlju%s`%q3u|Qe|x%aC; zSIu!WluYW1H3}AQ@qx1N0asmVAAdhGSn>+`PZIZ9m0Oh(utgMa|8fe+N@}ho`wI+F z=-7@>@CLE5!86b}C>f$!rwR;HuhX;9A@p0D$6&vz?6VCo47!i0REV%=ErSBW+ef(n zXo=@QCFBMr71zI6Nd)vQey8PGwn(rY;hmLHXJ=(QQYy^k8n07Ohjg28oSI6O%JASf zRcpqL8Us_rkmYxxO%@IgVfFc`qU{DHh9ADJ#Q^Wi&S2$7`nS8CoHsR39S8lsX}x`( zN24<$2eD)1-=iU0jZU9YK3pR!2nk6ns`5Z;+Ig)r|G|u5oq`%&=zX2XN;HZ0hWW!d zQ%B5``09nj8!~xWiQ?2c9{Z=VRaguL^jB z@gs?IX770T7H_q9nvmRzIY96k@A~Znz_C4d$WAj+`i-S0eZ)+i%GB33LLFSc(HX&j zCvIHv##S>~#){gn2~#6wR#*>i+2Dh_bBX(j7k7b3OdTHbmK(N@m#Ugt!c8id*tvPJ zX%fAeF|PbV8>YHT`y*+&gK>Gnry`A+rkj{w4#`by^|2msOt==P5gb--DeNHwXvaN^ zKfCF;C%>-{`eGc3Q41xDeAmAo>q}K)lV2n!2-U}MuASDC9~*tjT~uKV**POd)qjFr zn_H^9Jbuw{b6d`bMM8N4eG09#P^?Ppw-=r_ZPFIG9%Y31zrh3mFit9eN7h!pUNekP zDou#d4*~g(>p;olxUazuw|5d`ORQ?58#pMDl59#>O5^h{3wLrxfuqR-xjN5T6f3HE zue6`^N%pWbKsLW!&zG(}A!=IUTVaZ>T&LD}sl|n25rhlOgcPZn#vw>>w2$m7#u%>7 zUQoWk1xV(*uI`tTzm#Eh8a+vnAa{Kt|3EyfdvctATynac5tqp?C_F}acQ?WKIoK^5 zlF_5EsTVJABtBYuF2*||)kjr`u_*;m z?Ssxb2XHpf7-{z&`VTS{)ujsCOI2d6bpl0A{A_fv4D)oTZ9C29g3?rOoN2=Rc#LI}!%N9B-Cm zwHy|9F)GQOxr@e*Rle%sOOy*cFRVcNay>ae`Z6>%yiqSoLuV}wbs9@GIK^@K`RP?t zx7 zqGW?oDS9}!K|Vd^|MJ+Ccm3@@|I>d720isaA4(1eH<1Ggtd-1tG7h`j;D{7&B`=aN zA}(LWl@G%h!GRMkt9iN>96qbR?HK#JbKBDMsiK=>o{d|+QZd*$kjU2#tTgkyHivHy zYR#n3;U?v~WG0nLpemkRQa+OZ8(-|98ZM82<0NW+5(G2rPaulXFmgXsnI_GZcWI5@ zDby9?-UYlJPCih`J6}_z{%s(;Kh2Z7z3>%^HWKqKR2RY06^GztLksW1;i~tR~Ao$trQ0VxK3T=kk>376ZKK_%-2FFYDs%{EP%nqW{Z z+NSKIyn~2}<0R_N$NwK?Z?@aY7A1-ON}>F0ccJ>Vx_-p)LjkTvH(-|=?K13sBPCHH zDN)osQZuPp95hlKf&LU;6Ym61)wZ9f{>c~7% zM#RvK%%aBr0>s38mB)k1L%AgL?E%vq(poR-r6kEdRQ)~=b7DD7z@!3>VkF$t-Hp1w74Hev0&Lag7QT* zbM9Ir4cJJ{$1s7z)@dHGIKzF{KY{f5yjm=uj`^rlz^CY!DzLAm$Ayt_)eciDwnMcP zU!)chBDqcY))$c3MVpJ!?q#qNxZ2A+EMB*ZEo9fpQMGXJ%_Cr)#s7KwHa%ZY-t&KD z=q&6IIFU5j0D^ES z`SCCMNWsVlsR~QN!|wrmY7D)5!CA=9lujSCQuUi;t7EoQB`2p=w6#s^jKF?bWc2_f z+?T2lBTw_zw!L(I7ne3C&yC=AkpNhRP(B3YPGafx1q`U#@wW)D+9o`XYH4Ik#?C39 z*e68CbEwE~r?_EF6xjOI53;hqs%m|?YtlPg$Ydd<;?j^CBhNfN1FyM7pMKm^eGO}D>l)%%y=Z_v6NhDXE?!MU%OOb1$x*!|78p;3yetg}&A_pz*E$EW0f7MPWsS;&Jm=P{{lL|YVVYYiuD4#0_X#uCMax_3@~8HNzD zSWh6@aI(@FH(JjFFE2l^?T?k?q5V<&HgkI%h;pWM;R2KXn>cfm=PQ*+u!ofO?55-& zYxj<%Y!@fZUMLEOYmq{yj}q0clLc&3;4mIXw%evlBDiX40$s#@qWBcOUp#k_q`YB) zvl_=dQ@l&09!=P&N3-@h=8h#Py*zI}f25jq!B7aP=>cIHYX$xe#s(Ko9`hT`L^e!Q zO?qc90@W}{(=ijVHHwc$@ClivO$P0x|K#lW%OzXdKcq~bax$tDhsK{~xJeQGqsalv zby?j=`w?*f5eijwIbM8{5xEr-WCThD*{nDsVGRvfzZcurN z#>46E?MEv4oE+cB`Ig??A-@t2 zS`+pD7{b2$+*{58)XCMJIv!E;LVwbzO0sorDa54pz|wfbl9|aECx{qr^jc@?*K3x) zb@Y_fPJs!3d5e169Qs)TW;4A<%R-ZsuOV(f%d0sgoRi#Yg2m&U@6K-rY=M%6uP5=~ zHdqGXn4IHQ*bobbzV>+_!I}zN{JHUi5Z;!WKOrNfTL68zkJnHJ;5TN$r!+N_!ysgO zur_Hvd45eyA&Px8ErjIWYOEUmjE)T(_X0^A{@Z#`C4}r2B(=Jnn_MljUVKV$!->>2 z-2`_ZJ_hwavNC{FTA9@oQfrz9&$mH?PJpDDMW*~pbbc-Vl_2|ua;@2MmS{kPQ_JCv z7Kk!p1UmuA>Sw$huNDi@$FDRkn$?b0PJxtUY`HKI%xm5)o}Trw_Um2|EjsYC+^8Re)sOKF z)XK>FKN*4aRc7jwZ9N}cXdh6)xPn}f&g)}vI^FFP>Eoa8{0b6@>zqxt)leK|b0pGoOaOhl>LHs)IJN{$8iD}`#Ap%oa8rBo$yJmDHFndc6MBz15vVnRdw zuziafanSvKyNWLNL+>3%l5}%Q8(>%tM;7mZ4O;4ZnPUkl8sylQB$zLXrbk%m;86X4 zi#O4rOi1ti3#!3+}zg6QoIgVIB7o8Uq6IbQqR}t z>Tt#_M_sy&mk+TG%!@sgl;Jb#II)9}#k}B)mK#xJ9*%y0gnYPJ1W5UEF4=tjOxtB) zSYOebh)m36Pq+5XD2j$Igcje}bakm-6dSpEqq<43%e@y{CG52PYqHP6kR6{?o;9@t z%dXG6d+D&CZaumxN0)YlyRhs+J?P-@_eu(N{g6L9JwqI2Q7q(}ankKjz$*v~<#@OyR>#9*R!)mbi- zHi>Die&FSAMQ9oqM&B&e4yMtT0aqsQdvfilnMVV4w2Kq7nik2`Uz~$9WzxIEd0N91 zQ`9ZWnd;womn6LM2T}bwnZJ_`5zKaf-x+8N_gIzAa5B7%FLFuaIeBZ;KsX2yO8?7R3l-LUH1G92jOHqPWed{XAl(K}pzY4hTkzMK ztGC36`lBj>D)>&04jq&jV43!(<$KDhtbR#cI65)Cxwjh?;}p>80Al5!95L67I=NYa zuz6!I10a)ht^m3ki~YOxVS% zRaf|7jT0YO7A5|&B%jg3DwhGG?w(J^hxU);VZ)1CpcCoG%a>mJ7eVK!39rz5M1tX} z1mySRMCxY%DUEOJV7O!nI4*}-3?x1$a~bN9eso7bcXQ%Q<615jc(oU`)L#OVPyDpt z(GjC2PZ;c3+?^0CgHJplQDCKFvDcwHDe^{*x*jC&A;VZ`O0i4q@WWI0?>`%4= zi~AZ&`Kgrk7a>S!H60$)F+I!RYk~^c=gS=n(k3s@zf9|vHCG+)qjIewC-nxfmwy?K zw>L(YOCsI(ThBFMDOkk!l^BgNuD!PY<-6FD{E|id5xU^*FC}76mo=I?zl8p#e_zl=aKd102H(&--{~*;r3Oic^3hY6Q z#jl3Zy=ryQD8szkIgZ|+@YG1`EG8a~!Hvb#ngzY$En9Vz=56;`F7yZ*55$D>_$zr~ z!>6~`lev<7mQN4#@4qcCSP+VLZfW>MmKJ(7-`vVV6}^z3i1(JBC+%}ZZQi(H3&~=3 zKX~c9Iw$9sF!wtzjuMwg$QIRAZu%T#BoTxsRuWn|w;&4_I9~;{djCL}UV}}?wN(?@M4+g}@c#fwI`|F6AF+ICAN!kBUh4|IVZ_-VgPN$u=be749kx0ShQ{NjT}W3=*ug1g7=%~!b+8GoFIb_dF4V(65n!e!BZ z1dH;ZkUq#;Z5HJZPrZrJ!vM898yX$5-KPzxU8~>!&5wtZttYLL^SW*hqm5yBfL{Ng zz?r8mn)5BMM@8-?do1a8j>kEavC>0@Wgngbs$ln+4jl+77yrt503EK=WY~<}&*S1a z>MZNBokLkRx8>UeOKOgr``R3(W5CiPzs20bM0kfSYcXMiW|Sb|1BIUWn|Q{_wF4_Y zUkwqlzRVtygE1^WYo*OuPRKhfSbgWYYbneD0cH^$2R=#GIs0xQ@PJfn^|DOHdLybd zb%Kbt_R}#%WXa-a^F|nJ852sxtDJ!ub?R&?SN0V&qsvDt?i-www|<7PGtD9FWi&hN zAE0jG-%(7@HWK-?Kz$`V$Irk4Ix)ipkF~M@jX4qCB zMc0)Up5vA4pl9Ln7yCBuR(Kl1IY5&K%=6}?D71--EksM}ffF9=x}$fk%ItBbEc7^V zwr>PU>7O}mcD3b!ZM`P&X(|E3^nerRLFYv)mj%XxfPqh4sSPkyB-_9zll?BNUzUEn zy(q>d^Yo}yr}7iOEU}C&@p|safz#%HXRSB2!$_f!dL;LgLBsr8-Or*T7OWvQ;7C!l z`B+#{u_=XYOmhcux$%uoU6(|zjO7&30|s!9#x9rC4h_GQ+leaM;4`rYmU-SDZTwuD z)aC)(A_w$wjMLdZ-}@<3PWHWFazz9rS#Kw6_h+=essqyvRHKIrV9!=>LjHiBvS7RO zRo8O}!#}nw-z~*z3w*`s{4@wCM%6mW>GDbO{R9pj|=SA zzFVwv62>9Wg5YcH1#ZFkO8q;1ePDS1ey{WP5MN{+UEP$pQMoM)Np(r$;ezs56+#bw zxYF!}{CK6=Tlw9U1`i8;#!*q_Z9xB0l!_{tEFCVQYR)jnUN&hlN6+j}$0s*-G|Klu zN#{Ru<+xLtw9M0)G3;ux)hEJ&z-6}}{E#u_O{F#d}#zgwU;L=lei$^b6}8Vh)-EFi?;}4#kMUt|kdXW!j@q zmS$mwq2b$Len4e#iwCMGB*)v&K)Eb*k-DFaktvbM4(!^!^JrMNAFl1~bnhv6UZ>xs zO%%v>az+&)0qU}UTC12Vht;=8cV#JFU2!D04tR#qKfDV8Tou%!n&M7tdn?Lr;b96E z8FwbvY#ls47j52_G8nsO8 zVqFnZ&OAIwuj~WoE)|S;a6g`(&JU-Hr7)0?Zo+#K*li}wT}O?4_uF17;jo^bFeA7{ zZfYocM9tc)n=)7cdURnOGE;AFUaKuJIUW;J?DN(YU!gFnq;OmB)m2nLhZBz`F-c;VM}CrCF1#vxB6Du3;~ zEm_zE-Y8}NLZ}Px;8H(M2g5}*(-ASppOtbLKtEW}40?#r(9|%mT|SJ98`$D@>^r#+ z!9FN*0RCO=Dvfm8nUM#)JJb-UTj z=Jy$$mwmG6O|dYr3Y0BqVcqR(ho@3a4sxpDh|O{$no2z+b9kbb_TVAK1vuvL7ekts zhjtMc7G5D;L*jnz*+zZm^+PgGads! z1?-UFwh+@I!upk&c?K~csaN)MqV|D$_|t>64^wwmLLFL2lZWZ;+0x_4mZATC`llObRW1G31+`z>CIsaarXV?-+=& zBU2J{Vw<_^bX?>~LPC%TfOV*O*e3*$d0z`-X+eHvvIG|eCRJ{nPL=Q*3x@0`x#LV~ zr7VU~Kq(G_&ak1!X6?bGr+6<7FB0=+TYR$`f* zj924TPP%6UeYH6z~D*yDS5t%OBWq|Q>6$nDfirJBO`dO~n_J|E zWFzCK63hRCJai|PdgN=Vs5TR?o@4S`<4N67{BZs;fR-E@&7)PpHljwu3>8d5?OO2I z-(}MF64I^e%!lRY(_>4PtHO8Vgn+uX<`3Iql7~{1+YiscD?7V4T&5#Q0&CJDZg(f+ zT5>p0br*8Bmku2hpPOQH_K87i{aa8{XQoQUPR-<^fF_Q51gtuIYR02b(Wy!9*W;4~ z*=&8Sj{{MeSpgA7JdcpQNa`lEV#Mh03XI-qNc|6cYpxBhscybk-aT7({N3_#HaImZ zjw<@dNTorWnl+SJQIU~`7qmj8L0p~==r^_q6w{qGJEI0!-Lo`a8Wn(4Fn|(Y6;d_~ zF7;$GWhO=FrmCzQJpQz~N&r+oAfa5lf=rhIvBqIBs;H3&0KYk^5<`nlDu{#@G`EFa zjEvxM_hZZe=JZx?S1-m9E-84#=e+D>+m^4MPWubq=8zfYUJ%B8^0EN=?bQDLIl1=k z4SvdHo#y0b>{6d8(}(*%k=oR6V%wghc`vv9?7&1R7RG?sC@%$$=oy`tr733OdHB*+ z`w(y6-k&rdTmyoT4wk@o(DktYw%5%KSV+UT>vlSK2?7vIH}>$xxkry@fRws`nJ(N* z8W*Ectp~c0M?8>99!$JXCkZ%wicy8iOSlDbZ@z+E7M0CX2wk8X(r<)nJxVCoIUr(3 zBgC5wOI=8kbdHXhr&qJAz?OD$b`f%JJyi=iCe0q$)iV5hQpZpc!aKW6`hQm)NqrR& z!?ve_4jXyC*UVWL<+DCHctb1(#tuV%hCMxBg{RhNZYry2**;Xg&K8j~Ni5#0!M9nT z<&C4mV;=}inGplhOrY#6d}xwCkYc+}I*AI@+(CNns5mTiB6IX8LrTea9QX+qZfO2+2wGlJpnI zIzVl-ca%nMUZgS{&=X$}G@AmpL>2e(q9d3da!4{Q#Oqhn7g?QNVg+r(Y;( zG9E?m&(qNY`D@JpA3D=PkE(8s1|3G6)E1B+qM^bP_{fuAS}M(HtKFqAv*eEJ>Z-% zfi!5vhmYax!~6E`?BIj9wYQDg3QH5ZN0WE?)A zs~;^rAf4H`5qtsimJ2OSPKpxPt`mN5P>uKJy|`?b`rL=HwN0|}F4Q#MTO##c>Btrb zyK5cUQkAF?r?ztX2>=@KRAJz8^?Z z1Hn*Z7Y4+Zn(-OpkJ_~hCB0ojv$OhSVJxnJ3Y~HHW_oEcb{<^#!t15@evtHR9@!7C z|1lcg;B<7??8kzz`0WfRFjQ~pFi*A|>D{VM^BfN$7>QN4AoyMuZ-RfEF!;Ee5VawgFaxQbSKjF1-ZRRzAWpepO)d3LrSX4?u6`c-yBDR=} zQ$TWwY@H(1imj)c2*)fRK*fTKfv z){W!o$&2TPj2W;p2fIl<=bUNUf*P;@jLymO)LxIlT-UGBY;+N$uFl z_%6EIwIAl!i3Fev4(+8KM%*&UJ;aeibY9!!0tYbiBzn;z( z{q*`eZa-?C#f4S5Gv8pnT9R@Q$b#Wn*kQ46&rx?}t)ddUYGcrQ8Fyx>VxO%nawudW z1SqYp_5nEL%EJbB&KN>8Tws-hESA(;m_(;(`D+QP=;?SA8Ulm>Ci{KCV?n5I*JIBb z?aHDp>8HSCdo4Z0pmT!i@XKqs03mI&+)Kz+`};nyS-$gb%HY#KJ6y;3P9Un#Rzc5Wxn`-kFjL_mtM;Pi(?`Dmbv}X8&B8zh0%aKoR5X!` zAjt@$*R0YwV+$tvZ`|{OnzUoW<+R&rH(-J!;)ri$7zEVYi%}0@cw$~_ zV?Ms=fSbr3xJC5lhsS%9aae_4D?0)qgW3w&&T`V90qTFW1D7|^t=nPd8s{IWhH7T? zya+g#Eb8K0JU9)8nv|0{r-Td=a9h`G!>q`I1Q0#AnZRVW90qe|f-RD2S#AWv7mGBe zIhSsCnNwCJ!c++1*hGsKEdyF*p^0U%RaQai>3N+Sxk;PCw6$G(43*^}&r0y_kbgCS^x&c$zGp#B(Jl zpwWEF@Kk~iq`un(Q#)lbl9b)aq2iooRD;4UKA!t?nFR;MQf$hryC5MdV>9I+EQb00 zHqw-L(mPj_DzgeM-82v+O zLqr>udd;-cJ_RypGGi2z`O9!H*|yo!2%~pO6jIUm#>+cVAEAe+U0vd9`)zVo38M=k zLJxcMn{jb7a43=7&oDuqaWk6PcDkngOI+j3h1l)7On6EaRB14iwurt$S{ugNm~pqQ zyn``3w0P<}+PKlx+H4wzyfq(#E?!ew4(vF@U==_cMsB2_m-nUJ!uKNgtG;`@_Lqw*ZISb}X;XoRCoSBO-#aV|MfbF2;qzn~E6={v1VQ40e|T0%7Dn%$iV`4z z@U_3A5A&U2AK&c)U0JG3k62@AZ{d}7dot?~38^jq>J8OGk{OH#b058CU@rUdLW0+G z9ggQP9s@#%r+%_ios3=g4#-uIS+fdmUiW?-jYft8vOwO;Qm!DSZS$D*9pbT;rn}HB z6WBB@+d20o!sPKW#N^(eKYAOS+7DD(t+Yjk{*Onag^qLhHrr|_s^y^C9yHj}%Z3MF zJ^7m~6HZgH!>)ae+|8@@zj!RouE_fE1D>TDi1nrygNcLI9V+K%xn!{COT>!E*H|OF z#!ee@IcJxwcJnmlpIj}f=PUfnq_vF>Pzxq^d@^iPl!y z#oi4SbVi50WM?4B21IgehiFN@VQ&XR@v|W*3MKQq)GW$@EjYPqv#*LRuW>)ZGFOS& zLh;HY)lyEN2WSUbV0_q3P7ag9(dVFK2XV5wfU*F2;=UypU%pXgD{&6 z_?P;OkY!hwo zLwlTL1enKphgy-Cu%^dfrUYPlF4{9N$O8?5Dkr%$^Ld}bLYr?hONAQCpHuGv5x{J2 z^47{WT_(eEG^olRCd&_z2#o(uJnN7@qw8msGY44E{Hq; zTtK70Y~78(-3flLw#|7Pb^7!z$~ZGnpFkWz(FOaQ&0BLz@!&4m>N`k}Me7j6>1Ft@ zd1Agy^bsOA<18A)>}Q(Ulp%o;w&f?LPW4@uU^QXb65}vP>X{v;YMNMqN%uy0R!n8g zD9%tYko4wfif4^;N8~tJ{at*1*d=cCz^o$@QS?Dqod)0OKM{E;+lU{bQ59VeqRUO; z83`cmC099g)AyVB*zP=fOk%7`T_Dhc)Sy8ID1}^#(ReA!j^Fv+$6yzHW}{V{8B(I) z@<~F8LWz#Y!gzX!K8;jwFtHLkczmOpO=wq;)lyV>2oF16qd|iS)f_@`Dt0QGp1QNg zz>$_jn7Q*_uP+I0VLi?F>+A6Z=9`DH)4~e7k=ZRWH01 z+`kVlkwid;VMZDkb~%S?>|l_rlGoPGt-et(IJLtMo5|5Tk|JHk(HbI&;!ZT$Fngg1 zUmp@NGqkkiH^_+(tlK6D7z#fS_gj7vwe3v4vrn~=Lc#6@o~W=L z#?<{;nBRUilZ45T_<&Gq&aP8Feg#OkW*yo4Nn_GFSI0Ajq!fLygi`Madnp5y{RA~A zr};S)ZVC;{VeALXIJk?u-AQ9Soxe6iX%PpmXJyy^H-5ALoLspT{_oK!KHkmF&nCSW z$4_{0!q`Y!h?P_|~5OmnYS9`cmc`b!=?SE072lH!^$z zmZ;q^PpJ<{20iq9>@8}uwmtK-a5|Z(M;%~K=B@-ZalR{Fe6lo;%Iy6ku$a(CYv89= zv>%lYHE}G9nDmcrg`oo6L1#rYGH4)m&a{jw5qO5D1j}yWYCXE%^Ufc~vor?Ak6z!fEcPF&fJE2Uo_Q<4grhu$P| zX|C1h7vL^JJ7=XiF4^yWlCjuvR`Ba3Tor+wQugtFq|Wsv=wJ}0^wyL46SwF@!a>@S z^O9j3L|2g92WZ7lhr%N)wwP+(Kk#Y;??WP_(Y}B=&b>gue3ty8*H%xnUel1Y%kyuwpW~@ zMdoolj}F276QFD87uK^SQibvkY^MF0(Shp_HQ%S_HFuY?@NbV|=FYlBP3s3*V$|Qq zN0Zj16P5{}BDAnn4i_7a>vLhRsDavj|drNumAJ05}p=oGbS@8LuI<9o|BaJceoCu0%Emy^4Te5B-v@rWb8QUpJ?*5c{F)GQfKtrEC4RgF0wNxym+b=m0l_{ zVMKksI+$-o@|Vg$qpw3^AxORC^3r5c>yccf&_GcyP~A1%AiO6jD-a$t!uj3C2nC~V<~9iE>Um40 zc8{5pJ^%^)eZ|>m9DDCGuGlPMQ=k)c1ojVBwrV!q|&PVM5 zLqf-gVw7GiIov?=dN#>S|I2Pje>)See!1s}@7iQ#xtzse1J7^h;(-#|oSnG&=K z6!w;Z)w|l%8m+R=5mp3v{#!q+lku9Rsz|~vHXQmA2n$k)X4@DD3KlKsSk!Bh^R@#m z+2I18FFRIv@#uJx>-(ra19m@l3(hGeB72zx+}aTHz7{(}OO~oI(x7I06qOVXHS}=8 zz=*g%JGlG=TQ?TjG*!6i8F_Bsxo`P_e-RMutYx+tzH9^Mc=UmLNeFDL-~mx60%BIz zH4%_GuSxqHVnGBVdrK?NR%Z$X#<(1?J!o>NzH9d~-9N`D0cV3@Fi7zwXA-Tv;}K^{ zZ5$tXp1j}V6W$j-Q_%u{@Ak31S0iW1@Z20bsyO8FLX*TSI={=0|6)aWgW0iS3X5}5 zyqnF+ZLIkC$@=0Kt_Jomd_FVn#yTL-cAaLPs1x}0J8fYfG{#&_R{_;?PF zTt!!D=II>TSbr4~#@(Us)^T46t*locIaOjrbSB;o7i$!0NkYTz|arD4Co z#}ckQB#b`uPkOL#@jVn^JIf4ehck!J+Mb+UBw1PkWgX2M<*@j%NS(p@FTuop(6~%2 zMQs5ts9#j$Xuf@`Zqbo6gz_x{5`0)=X|wB(zMy}wFJrs|A1Uv z`isj$_k0s=-YTW?!!7y&^9lS+2WKu;=!3C?l7&l?=aHK-b2!>%#b^iXsozu`Sv{K?5WDE{74G-=3M_eN zD}b{dwUWcVWO*>z{ldqhn*9egQ-q};81P_f(Zt*V2y9YAD1vd&OPNXj%_79Bw;VsL zs3D-~jIcd0!b8p(Ek23>+~llnq7@nTauVR;3+GKDF&yHtE#eSa*hzp z{_AiS!dUHp152}}OEe>?`F^Eu(I%iI<~rzL%W-3nB07&ahCoIgdmQ;1;9EXjsAG~s zUdpKLfbTJ7T8)q9qig!`jTb+Ft9>o$C%HAI`vsvkEWD-A4-TfUDmH2*F0T2LQp3kS zVFW^e*%X55*%(0Z8dtQt z>t2RYBP>fAGEXm7<5O-QR-r_F zKyaT$vhUrnbG&3B?ab$QjP4g#^sYa3h!Qg7+-M5G|9aO@1Km2AsmZ>Z!(9iEY@6ln zOGNHsuEm{hL-98ttAM9Sg;C=6b5uLQbU|++xgLC`-1e4II4zpeLRNRDqFYT_jiOE= zZnIZFfT=C4EhhNUpuE+H1_&g>6e?naxl+^vyJCD~!SWuq>&Ex{qRrn)wi;Ns`hoyq z*gwaW_<8u54w^}vO;sj;#6+Ev_7ep+G(d>W62!n;<(ypqcy9*^Jjh714uj`T35H;P ziJ|u2VC=s8=tD!6mF9-=T3(;;@**22&gZJGDY(N?Ap}j{%7q88DJ?>V+xn3Ueyj_N z%Eu%PUB))ETtThog>@%^F$ds?rM=fMI z%E${3EXtt@<6%;!Iutr-$RRRqC>+D(iv8Fn+0};1MaY)a`cw8J!8ECHK_A3U=;#K} z?{Lca7N_zcSVjXQ7BZBpYcms zBwD+PHr8end|Fs#7>q{XogdFY6ZUv!_bd7(O-HIMiFa{(U}7QNDk2^cCrEg`!?>tS z$c)EPTIlG`KcTv$w{V0u*{rdW@*b~JQj!#VSV^885Y*`Su*^7F?m*w31Td*0eRnn9 zZ%!Zc(S^|aV3$?N7f3FEyb%O| zGd7J~A-CilJc}kS9UY0Z$VQt{PWDIk^)sFE!Gii`VY(|&yM(CrQa@dtTxIgdj%C`DkV_Jo{XqDLaS@W)<(! zw;y6<832S>!v6H_^)B3jn6o_Hd%T^h>20H4miMt=1G`vX+zfnI#pUh&~VkxtbA84K!I1Z)7t38iw~$ zl*L<~wn6pEhdSM_LxsD)X9vMHm;Grvzls#%eBRDWC@(nG8;FweX{?A=vKp1q-r-+K zm0c4)wKO_{}+p=rGjT|0g4)%06K3&HcZ3U5HeDY-fo2<5y{x&0|_H=30Yz<~@ zEJ~}LOgf8bBW=|zlf9BMvOq;V{bjs+WnT() zrK&P6NGO992ej3@K9oTrD-0Z>Fb|N%UxP0vr`5?kP>&nm}- z)h0&!3PB_XWl=IG&?Vkk|F;$qgrfkP21!8y?XFfr_#61G&_?as;aPHMv4#d;+L}Jq zuq8N*b9sWz&g{wJf(3VR{!(gay**F+t7vYtRGlL=e66QWDiB=UOE_Y=U3Bd1bV%K1 z?f!dVNd3R!fgM*3Z~UMHb9fx4qh%EIfirU>aD(1RjmJPn!-jE%>XFpQtfOi-IrNza zDBVa#A(I!mW7?)dYT0K6Bq+?QUE|1GHEM4uI`RJH`yjby0!GUl;1M{O`8H^aC=m~S z%h6$28CGJoZU@-_$VL0s&jT4X>iOnd#ycD)z_;tN|KHsHKm60*{OAAmKm6^#{2%}N z&;R4U|NFoH+rRlw|Mj2$%S=qX_u^SG?Y>P>PlY#Pa(GlE4R_9u7>h3#*J z!SM;8i=2&hSCUqEly?IFu0g$KDK4}_!&jvYA*tb3GjUY>(6=Aa13I;B<2_r-^PFzB ze)me-5gl}!ln1FI`dH|OHp`3~N;7X#AZCff`y1~?vYK3TX6Nm%btxV5BEH|`_+nAhVp(Ue&T53E^4EGlEF3Cfk|NU8x=~)HcV{v*7UDV|Ei=< z4iFI{LH)mG+_)o47%c%g>qVVTR35Vc!a%zJ3Vgcd1)a{M{TAGgybxl5uXawp)Vw8T zeJ}g4rnNQ`)tZ3A3fh%^D)yFB(xq~`Z8bhGL}$llkE7xZ%5)YlH1V(m^m8IS`$iUH zRd8@rk835nkc8wE{8>oFootLjn#}PMB-ffWuOm^AbFMgea$=|sg7Exj+Gar|;hP1u zWPwSX-|4X8kh*+XX>YQ7s3MO~F7dB{NdkIu|l^*>1jMU8Dd%H9SjPTm z6|J63+J#wxnmXI^1B`fwD1&TlNBcE>U?`CZeGFh24+5g0Rz~gmVNU|*f&*#MLV4LT zp^yXlEX6}T>GajA#Rsk-u=2-OU6xQIj&}JvIo(QbUPEEfo{q|QQ1vP_)M5%xho1HU zL(D0If$(_hD*t&|sZ~Wz_7%v44I>~^;|bWL;y5W>eT8i`6>dqq0AVj&GZ3-`LA@fGUKDr@BSaZ*+b#MLZ& zy=C;C+%_ zyfqT+%F%|$a|u~tp;buw1vqftI2elNE)bvYfoKBcLX=QXdShvMyV~zwHF_V~Pm+q9 z;c8Wj81LgN_{py3S>3buPM6lFeK1qW#3=#%-fnw)G02!9EjVd`eNpvREF1yLVowln9N_HW zzPJ?Hu1M&P&UB|Rtw@#aEA~E9xTCF}7SK&=IxHCFMriq^h1^;96~qd=>4^AYaBZ3i z!_^)(368zDD-?rj{IZHsm7dc}%B1_H@+qV2`991($LVdI{v9(Y(}%72iPK9fI|4D{ zj@IrFUA}eXq3ppW`7wU@3GqqCcQ_SMvaAdYFhQ*bqNwT;7C}f<-O&XkDHpyJR(*hyylS}4Z#F6| zpZFst_ta-Pj+rSLr8?=F>~XNV^CRQ)?Rqp#QZ9QNXxzlT*ix`-6Azc-=M7cc(P=ro;|Ky(m4!;wB36B(2uC zr%s9!Y|mN|fB=eKy|EE=f*oW@37Mdk<{e3cwN z(-}JpcfnlIy|LiUS)5bF6%`vPfKc!)XO@lM!iO^Qs_gw4=oc)2+-}?TBYYh<39>u$ z_T_?$X+*^)!gBRc8mThkLMqo{PjGcPK7ChnS(ORk0c+Rd0%7#do%2wi9=_TS;waII z3;>fb=k-gfzGrtWv_CTC43{i?>-VW>SbJ`RoRd?zwoq9yCptvKrb8?Sd-ld~veY6F z#~`wGs?gfX0Ksx}ihQ$IjxYOyeW}+k{K<@v`DF!`r$3I5M#;&O1H@JeGe6Z`(XGMt zP+NA=dJ8;cP}&?ST;BwM;i!QJYBAfhJ*=X<6&~pE0SX1ZTk}xK-KpXV4bO!Ny!MQm z+OwR_q7mxU0(sJ$$Ls)Rr*4zg!(`noz`N8E(ODz3K0e;Ia1^rx-!|>lGDc%Fp6D~> zcYqn^5NZ(C!?HlWo60*ZAjI?cqK`%~iRqiHM99lreN&Ygc5hO*`=zn5;Xdw4(dC9`TegMFJy~YKc>$lcfKIi0M%fL-57*04?@}YhtP~y~ z@cxFp0?)fYzR;UV<}YP+z3JZ~U3IHCkuwYT54+{*psU*4z2$>$@YcaV1c{$@!_$i#$bXWk6HJ}2izb)cQ zbBMo&Qb;K33$tg0v-}XX4{U$p`1HndVakKRTLgm83v8j2HB0=Xjh$%wEb8sDG=#gR z3iAwqC6tbMn|1>_9mrPw3(kgUn{@E;-k4i6g$~pL3&v}#rHnHgg6;B5M@b( zY@_cp%X>1`O?__!_q=%=Gcz>E?XA^$sK+N!^*MG(Fd_1n_XrU9iw@EJ>mHHoQj! z%UKJZ9i^Ef+jCc5zIH%tr;4$FqkRh(m4|}WndB3*mabiM>Ja0nYXDYtFDrAvAP;H`U7V%$EGoty* zFKbR_k}CuSTijr!YHJ=gl}AlX`aXuO$nghz@peJyR58Z)SS3^HndR~<(+QT~>LOX?yc9U9 z%dqPKQjrt|+C>heNzWS1cp466@(<=Wz;5iJ4zFXlie3t-sAHRnq4@(ro^ z7UN^$#1^s7#W(^zg3(BS0?z-~hmNC>1*k2MFx4ycfNRLyNk)a@bK`iLbNU&=-cay& z)S0CuEp{;quX^sd=9j!HXh#8+^CuF1 znJHZPQK~@7Vf--Lg6FkGUf@!0(k7Q)^&(p9i&i8I&$@axtNpnB)K*(!l2U?wQ8-dj zA`2(}(=+8Fdg4`@zXtR}Fl_SYeS28J!ReI>1(hzr=Ga~}tD+!kNQ_oy5DF!uw7@b; zb7%(f+}~g08nnbPk9gRP*2^%?tWw5-rj{3Gftd;dA%Il61O}AQ#j|5VNhaCPX>OqC zbh0w9oKZTu1P_#z$pSUQ3k!c`xq$VSCiNx)&v9!;w}#4|c?8S9QaH50u35cUbfU>D zf|u2A!CjlWo>bCo3xj1Xe_3+!klgn?Zj@?3aW>EkxLNKiTwHx*rl|48#-!~6AC{^p zLrn5_qUiigIgpSB5{vG}&}_1;-Wup_4y#``0(CJ9&qu7N-VpRAP97KG7&m^nRlDVtk85T6^ST${((;^jHpf8@&R#}Iux zl@NMdyT|RkpQ!UBjUU}9idhaeMj^&Nfq?##_?QZ|wG%TIy#2c8682okZHRD+o;5yM zo1Er@&p--l7qeDLdsMmUMiEk5XE~-cZ_|Tev^+|-s2O$u zP}#RZ%6QvOS}!0-zdc-{4TfG>Zc>Dk+}J_L(=kuwGIo4snm>?O^8yWZc zNz{~&LRW7gaFVH=p;=zPf`1x~vyM}wJi%qX526|!-s zsYIw?A^}e?Xjd2mLroS@Y06K8j$kW=a?d_iiKVU_ZP)H{D0#cl7bS50R*%NlCu0q9 zB_O*wu~gsZ8$~I?$rB4zy&YaV5f=&4iQ4kF?S#7v<4o)&xHbbyc<)LnG22!@nD+X~ z{AGBQKh3t$ILud_x5ajQ@6btziMGKECvoc{HuBV~@+|11Ll9Y)nLJ;_x!V9vN5m}Z zTD~i6W8Hh2->!Z?De5k7)+XzRvcFy(W&;LM4i|*wn`%HZ&y=g|T<|hzwaB;W>Xs`$ zp;yPuL$>_-K|&(D9(3V|BVBPyf&yXqlSLv7m3QU>^oRRo6+WzfBWAxa9hb(SPVDfj zJ&!YNV_`}_frS*Ed7(VUGdQY)S8Y)p3@&h1nCd-8+YD&EkwutkI0(mq9)rRo5|JTg;xs z5XSj9t7L@cu79;!PCj6tL!_&jdRGQ$cakP5u*uG2RDOyp=laKI+W7STu07dwT0l8x zHn8*mwLe+TxpRamFBZ-5r|KHC=GmK{@fEBBV~?kAn<{Oievo-jal9%fV2wB!VY+NR z7mgve3SFu=vy$!GxU@GJ9nYeI6t^1aDZVuMszp)kI#Twkl7)&2i7QPe#N5n3yqMh3{C++>5Ct|8}-ONllC=*BGqn>3d`w9 z&*@t{s3l+#CHR{TuwO*ZO~ykz4lWh>-c2s6nHtA|6h>gN-;Y2h{C1W+--*`Md{)d0 z4l>?fkOzFt^szQ6chZB9`(efG@-$~oT3}%2)+wZVoR4}LD%YA>n6s!mKRtX4jXf6! zv2a32T(XW!{Kit9=`DeJ87&+=8Wm6kzWMaB?-M1p-k~jI8OXPCd`h^X?LqM&OytfA z#I+NQ2dNCY3NSQ5sD!qp&{AM5a)%NZrEyFsuu#47C!I{((5v z?SbNnZ>-oq;{FXZ9?H<=&@)YX9Kb0(#!nj5+`@X6Z>5E)>Xm52*+)sIg3IMlRE<`4 zcsoTfFx$T$zya~`Zsx0`9Mz7MdM$R%-n=Qi0-agA4s}e_@%!krCdc>6XY7~36EFX%rY2ey5+4Ux9E z`J#*YBg0-!(PGs{9)h)j^;X`y-PSY>tV*7!Svx`8mOoT@c@QRVM|MfJTq=clQP>PG z7e`A6)@6JwIbm!mQi!b*fl#0)ET$_&EI68KZDCI*xn0!1#`B7+1`S=>gs<;>L?1CKrctgG$UZ4rw+oTDTu31xQ=HalA zP8ln6)DXSG$NOnK-?Gh|T(v`|+&)m&ds4ig9;{8ahO7qGRS5nLn@~NycgNImruvM1 zJDP_St3(IXbYwjxsP=+j*=J0cwWWw{HAOc|^;63yV_{oyg6|JIt@K zyNqEpyt1xIlTXqG+ERQ0kz=d^1p>A3eYTlwVMwnIyVE?`U*BKt0-{1*9~CX`+b4UH z2+YA#mJ%W>NvFF|Zm*KMcesxnG9s!gl&gkd|I+LIPnjG+TCTbt8i_|H@ z7o=l8fP=J&As((m+3Iq0>Lh*X+7eIT7u>yOBe3)(TdCPDdeSvZ>@z_50ivpu><3GM zB9z_81LA>)T{oL%l-AEbgH~c%XZaBIdT}R^pAr)f-gOVQ(`rk+-u+1R$lUR)9CFoP;JkCS$%S45*Dz&{Hc^qsX||#zgb&#$u|LB0S74uGJHEbpf#aJQ;5g3 z!d|jmeZ#~31ri#<7+imQ(UqEbo9fB=P9V^HHXtG44_I}S2p|;AVc}oH73BLC*5;S& z2e;2dja_}Z`0?JcR0tQKFMU5@6BPX3*cJ6>%THB}^}IE`Ja2M*?PY2bQ(HGKZ=3l_ z4%d_A4tAa8surC}u<5nTUy`q<$78M=ga-DBLXj^HLKZ_Zf#BQQ1_ZYLJWDyHvmo%t zU|SJjG`@0_?ZS!M6aA+95LO%Z@N_qXm#WK4#nA55{D`Fk>NX{X)nt*~vO+N`{P`?X zw$#qzz!&E2S-C)P@XUmC>JVr7NH!Bu`l%2x9ZR_6K4jdevDuUn3v^Kyl#Hsp<3v0m~!N{R}C{ zdXCaY-bITV?F>QrOQfHe0P!*o*y)E&!6=z1l|0>0jhGjvhP`IGoW+LvV_>QR6V{$H zFRNg!XYJ(GQV}eMoLcFpBjfop7wf970ZpEc%mu!yjzYcc0G5Tnpngzz|~2r zg6Hg&nqSh)fTvw^ZleE62O>Ku2l4`qlwx?M7QJsL_k+YD#8zAU4XlV;fpT0+=^4}XSECt5h81)W*pFi;B~nYvRIOKe5_}`b>P_?XHGc zFx+C1*!Hoy*VFz&yobV(S>|X&LJh#3!NCFW1U1wlrDSOlV|Xw<6&g`g$E;R-MCb50-aEx~&`le7VpNmvGy@RV z?vm<*y)js+hW_qa*)HJk==KzKAS5QN9RJ==$NnpXj!Mjft8kC zC6Dg`cAsT5%O)&ps6!?58`Q6S4ImZRr)sFQ3P3K$_00-EJw>bmQ`4c!N08jO{`_UV^wo%8C2SQz-S~ zTFV0a$!p;=%ORSn%-Gd}8lzGT)t?U0`Ss zk;b~mu~&I88|>qPqovcN-}AG7{^V3aT*lcGA@{nbh;1>=cLRlBJI8)g?`bDY7IvoR zMUBrz<)`Gih3r26Fg@!L@3><>Sl&S^KE!-!8X)1SfYuuC>l5gv!Ad{vB5sV{U2`oh zdS6*wn)EPoknO(9_9k~Hsbb4&a&(r|P7zA2y-XK3%+ z@l=I#=pNe5T0Rb4^o@9Hls&Mig7JzINA6gNaw+h%+W}T8B>VfR!J(afgiqg~S9d2q zBf+52F3%G~Hztr|53JQn+ochP%zddB4SEzihghI);2 zmD)`Ws$yL7P7{GILC-)N)rsLKCGL1Q+T<*qfoFLVX>fUB#&uu8c6bekV14Y$;^$t| zJ5ym=06hgplIkh1-l$I}&fD3ys4m?vpz4*O>_@GV7YzNNhmw|5a=Q+7HCtWX&DOF$ zq-6tU$qEyho?{;^SW0(7y0OjgBeKQ#1d1WJcRY9Wck)uX3>?(IBAC_f5&-lwOuvxL zK{Hw(gSzffyrK#?Lp>jvayl4>LPuo>Z)D>M_gHvFQ-eiU6sgP&AxUu#yFfsxtY1~Z z&;|H&KwFC)f9)Bi9`!2-(6*~_?lwR`>?fpDc#dgpCn_I@?xbX}zAuhF-}br)PeUsi z-aO?)bTW?Kq4owlIFCxzbvv97cU1;k=lJm*(DOwO!a;@N4ta!lZ#g*+LveVFv%u{) z^Zvpxr78|WIfv11a=ALI7`PWlBSGH7r+MB->qp!_q36w9a`NDBmx81{9eXH*iGOB9 z&2UHawJ3KIm2b2I5wTyi1+-;4e}SJ1AmlV5>^wj8&gf92@Os|s!5fx&2CvVQ zzu4|Yjxa9RaijinpJRU1+8NZf{{!kJOS9!SPC(LZ2&cCTz>sD;?RjnNEAjjoH76rL zK9c4xQrhK`ETr3t(5aV*8($1wBNVmn&{!di)pI~(1Y78P+fFxv zb2L^Si6qNeM&m?#LqNN-Gm{R6*g6V|mm zQX+tzueRJie><>xWwkh6sz`1?9Cw6B{$L?RVPlIEuk2tHlY7jc3q68lTP1nHPx}t( zo8%8vvewP&+_{~R)|HCApiL=qyy4+T9`LAlDYUnCZvdXoYF~6i5(^8RS(Lo$HTbNQ zdR-@_as&C5fDP~(4Hb%b0B^ifjQ{|l zPBSQ+0GIN#?I8g}JNqtR!S_~OHjX0oC_d~xS_bhMFq(8yaFm^OuK!3*WO}}+og)U` z5d28S&i)Hxg+R??SIFY0P)tGKOyLmfMQ5*il-^SqB2@mx*H@ygC6K%{8#CH#)*Hiz z*hBesd*JENHQOVeJYU%p0miI(%%15RJ1H>B!EqzfPMaFS9mP9KSb^Li5M!zN@~h89 zw}s;+lP1%a0(deN+ef=~)cyL6>7cLNXVza{eAH@$NG59UObgwp*q`hyB$?S2xh;$$ zZ>%6`DsChLW`BfN`flg>f`G{W0jySj36MPd%xc5(J{&I1pQLo{4w155C(}XH-!wmt z3Ki$-+*%S>CtAInLjR6%V^|ol&e-!i3zJeSRE)s{c%7TnETVo;+WspATzH^NWB{=I z6qv0BIz&X6m3b9`@iYM-A)#cxmTd1!u?gS=3!((6Pf0x?n%sW2EHb5>PT7j>^^h?` zwvOfM^c6~BOE1k$&Q>&@`kAsASGmMBYFV%S@gn~3(F!Cu&E0eQS^(MaCjh`!IpMpRgy=F0ZJVc-@H zsMSKbwN>$1VxeEss6b2yVk!F4k;iyI$6>omr=Zx9?>49Bd!eP`h{x~d1=pbG z#s0{%h>$EhAcJ!wHT6e<05D_!j}&x4trc^sma(p&yHo|B7j%p7U5@fDtK<$yOzB1& zX8PEjcFeHkr`zM{d2#wab`HrtX{l8NBjQN+qW8{t;XB)+&+y-~428aSzZ$J_ZPyl1 z_vSMGm3EKgwFJ;2$WY_@Dga_o^Wjn)kAAe-JNu#rYx%w%E?a-K*d8u@B0`>V?pi!b zDxiV9pgB~6hNyrJBD%Z=qy5}9N!}R`v(W$=w8Xa7(!5u%t=mzs-wKT!)Fnf2!ZosX*Y}q$knQl&II=RwioNi ztV2W`@^qtPm#1DB)|LsN7F;1y+T1@k2jK@QO~5sYuey7Rkae+;>>PlKD20N2cU~N({ULHwQ6(d-_T@>vb40d$gR*UP z&5W}*hQ37KF8tVF$NUNG#MifD zUvmd}5rY3s>H`@_db#gOl6H{T<`K@MZBo5U*W(zsopmJ^{=jPx^}wnh9ob!)~AimpS(e{b$G+@^xyI&)W6XT-n23Pi{c!D*{jwajtX4){Z;^6Wfj1K%(q#7 z2n_Qz>e>B5>jOG~>_}nI;}!}cIFZ1Ul4Z~N?{A`f@i`16H1$b~yt0`wO#A(85>2v% z7KyB$c$hF;G zwJ3}jD`|9N&#(0{##`*f<#c+3H8YaZud4GeM8gas-R@XCZa?w;qfJdLO_Ext6PgIyXFg`l?(^Y=m^U~#4GM}t>AP$ww}Bf2O4wEfU)W|sZ@YE^Vi{Tg-?Q6EU07FZ$1E0S8%G77kyv9eD)UWl0=o}G9*0@eduCKL%Im+;ZVR2Zo_99bpNdSMG zol*{ngXfp&66tGFob`3Z3UVKm%yR{Oh{rgc&R;)M2gqcS)WY0_9MgwtcCT z6o=lmv)dGe$_)OB1&s~61)s&a*|U^1I~*J}O36wSfj4K1QT$kh3!5ISC0Ba^s;06T zwloL!MXJ_T-A!8m!Cr76OSW(gZO31^2j8=GO18TuvqohT_06##$ zzXU88OWz+&iuX~YVGH}GJNcI>-rVG+{h6XTk=GuM9Hh@k30>LD8Baqq-%ctbI;N8G zom6W7$WZIYV&@~CC?4ljrgc$BLe7)<(Bv6Kr*mWyW(}UGI$U9jMn?l@d=`PKuFUr? zV|)A%-?^E&+Kkqi;f-=;Y(7(vV$z?7jjT~`<8?0Xp9%bmODI3-EjZSN#`Ngeeqfd? zFm)~GS4;SuV(R@8I9fo>I8*)Jw^hNd-@IZNAmH9YJmog;(yl#wg`rs}IMinf2o^2q zX9`<^+H@Hd9Z)&vqz8*`hi1Z)tG+tu7y}#H?%T6(VHN4i%c5@A>#DZ>bElNpN^$CZ z3oLqb9#xg`x&jlAt?itd>Al*DpGV#g8&+l~W4q{siw_sRsUPb4KrB?2z4G}q-n+86 z$xgN$ltwr0Y$45JyudIASPg{$J_uoveM)$Y9ony&cT!zDa2{iSJ#Cwt%6=oPF9qnp z&~F!m%E%^sMe}%)-%6hP0VX9!1a2t86jKMBRzIk4Qqc9%SA7^lpdjbC0I z!V@BC>>L;U!^O3xdB3~``|U3orM_qmN3<(=pgM&F{dH8 z8RlHvgl}&j?_`}Qm7_t2RlH@?UAn8%IYInF;U)GRPtRvNR zg%Rc@{l}*vNl}5%^5U^kGwY zIGuTWSk+0!zzUARR~ylPwqqGaWWuNE+Wz!hDdOT-&#PJ&Dsu272CLKK45FsE80vvRH@PY$!{hZwUl4=%!Ng>Xl`W( zaGc^XFmvfFoCy5jZwVSe{idJ+gB{hTod)%uN?`RHTiV&+qM7A^rSFxGE`@(3{lV}V zP^VJGXZ1B;zuMPiBP?O<9)SSEa6E_ZP5e|!c6OsepVMWTvHVnllK_iVy)sp|D$2s! z7dhbt1K1$KFq;%2EbP~ni<&D8I%ok3_et^P8@9u#sU@^hTgEjEYtaS5gvr$$-S-tD zsoFq)l`dhjJeSNrxOo}9O%LBJp|tqHd|bFZLGG}~UhOC<$kh#IVTF^$++@Dvt+>a& ztx_7OmK0PbNW~~zv$>9{;qIx$vw;>1=k=@zxW*WBT$){vnrGr2K!b-Etf+Yrt(Q^a z9o~Abzy*<=2mmj&tem{uyzTxF=Wn|Z73)3(BIF`J1j(+F^}%j3+{Lo9)~@1fLM)a5E4n?wB7NJOUZU=pULzkKEZavbq9P&wH|`T!Ilb+7&j_bC(Y)h*~{WJ zKSpB}z(5RS`wgOuK(rH_!GJ{bS`TX|7wz{ZuLY+sp#r46C36{)r{0NA-x;!21b1`b znzPxu7v?zsILOP#`GQee@1Hcu*pdlVh zsBv;XU`BERP@w2_nvXMhhyCW4qoi~vJw8-IV^s;-wiH8fZiTFdWpzymEfL(JNd~o< z*~f;{Vf$G{R$Rl{l~-*8X#4jY;G2diz(BoavU}dK8dpk=AQ}KxY>n;BgGbZtWVfIL zH5t`Z$fU~06W&-l4?|)&j2vQTHi3h0;YxCR3sC0zVy4=3qW^}ooaG*qHX(MtLsghz zr>b0jJ-ORS>zIAhc2s>+n1pS{Z2qIWIo-W>V)*J#a=)%)!aeq65hh^GY7EzUNGrFi zapg_-mVB6iJBCBFw$cu*OjPz8t*hLQ*dG6*0U4~ zRsB*(JjsJ=P~6^vCWzXWemw0Z2CtF!p`FK?Arf&C2-D)_!}$1BgLybyeJN(FX3roe zx^IF*4%H(l4e^30u`Yo_DTNtCL+NY^SR^*D$HN z-E$m#P~< zf=0>g>Ym1mH-FTSf3ZZ5u@VZ5GlU8F!!Po*1 zJ?i=#j7QHrgJ{Q>77F(4Q2c)Q{}_9--B#8vIq+4C>T9|)?MifiNRsJnt}XUt zr=@%?0duvvSodC56d$+BNv=i26}^T#QD=yuUMtSU3>&quczD*oI9Ej`+yTl$8?kl| zV4&s*_KI9lm?nz&hIdrt0hd_Syw)$QaB}Xrc64_`qZIF~Ii0FKRq0U=EVG82Y=6dk zH~A$U*Kd=_AduZ4Vc9(S>(qg8_8EnW_kWh1ki{EEmutW4m#XlK$CFmiZy^Y?z~RJW z8NO~CTArZzmuQJu*{U|-_GWaYFaTnOCf6CdCkRXuIU5Z80GVztJeapws!Y$u!I6ny zJ<$0Q{SN#lonSTkChP^Pewufajygz35g0bznWzUXX`E8;WH)K7C+nr?LOfc#>2V*h zsMjO=O?1ZQN{A(t)BZES2PF(Z$@^O%WD7B7)i-yTDFkA3t6mF;`g#{%h{d#R*kRa;w_mFdGp%oY$Rf$$5Y|jBk!!jx??J zKfXn*4Eg@Wu<$W~8x{-oLWG0;46UL^r6c3L4|W2bDT8ctHC^Z-8n;8j0ul=+?8l-A zG-3EwPTSpRvP|ZN$2C`DZJn(_WS^c7 zreoj)fOKxWC--~m$Azzq#KaW{kZhkZl{Qn~XSOiW2QSJZyB@CRPJA`==9M?61Tj#C~Alh2FqU~A}iRkiLNqI;YR!K z7PS9Up=gd#v@ygDkJg=3gXC@E&;NtiH8ZHlJFo>!{c56a#!Z;!LU(WNaC&l$nin_# zDv%bx%xDNNOFV?C(<}Jg@X~(WSfCE1^Z7$meXwIszFO2A$7gU&@?8CKZ{2=il6xhb zqvxo(V0qY)UwS}wtPhZN^l=+~mg2RAxZ~s#X=UGj;ivrhV)J7G|T*za%@`eB}pQt1^nrYd?SWUWNAn z(ZVxqVLTv**&7!*?A9M83slD>8@yfPP!r_^y04-_#5wkO$+(o7iCiaN63;!hJ>+KtJrHowJAj*~$?K^b6Oc={(4sfm`Wkl4TlHPZBQ6;bRoGny zy05-z@q?(aW`X3`Spy4UpR(JDq#&0|>WoJ}{h(}*8g3p-Wr=xwuq$QEh{$&r(en-P zySY{t9(Ou_>B+D@~g6} zc<%PRaUY%ZS@EAg0Hla)kx)e!FI!we*DQRTF%=NzS7KkRujMnLLJMSm`Jw+c?@y_A zOQAFc*y@s*WraGR`?|%pH zUZ=&!uOTT0mp{_=(JbqNg+hu2d-lKlrGtWKLnuD70UO)J$qvh3UKg$=yl+%nnI6>Q z=ZfYuE_Si5`j-|Pqs_ura&;$0t`o&h?MF#d6yQBScOQXpnSf(mc_{r7 zXZQ9bejY@%Cs3GJxc+e+HC~V+9Ky_|?-vMA3rA?Q&Gcey<;R_Ek3z-0M>wBnSBHDr z^7dKG?C=oBvBje68$iEWgjBh4FVR+%#T@q6&JdZATG##x-{Z4lHpD5|2RFE8^b7Pn z+Xu;DDC%(~3oOnAB|jmED9@1G1sSDYRq}AM28_>_au+w}&&gN&>R-#=`cv^~HGq1a zZx76eF(=S|kB^Vq^fN~~qoej7gwKROP!VOT7A^pX!9KDTh>-QBW?M*61NVP@B2PYJ`ucsyniYWA!D1vZ(zDJv1#-hHQ$r-y8rjlF?kjba$yG@TJ4+o;FZ^|>pT zJPFI_eG2tAXm6<}41;#MZSjR3H6K0*Wu(i3+JK|ZY9HoBfD_mLJF8u4B!lXQc#Dxn zzgh{)czXAQ1nW`3t83s^1aBfR7QO2L02T`o_AJGQghJ2)lO`H1>U?j)d|f<9%QAi^ zp1ILMm-)v@{!@?;dZP(#_00-loF|L+JYLpXxtFbg&)MomyDc4gVm{8F5mEPWI@q@# z*xtQ?5=?US<$DVPf)nszKcUMlp6uyGJ$S4DH3uoN`siM~kBPRh~-(!{N3LftJg9+(`w$JiR9x=}D>-&PaD)Vb=}m z1f1AFxf5hTE}^jkSf=1X5>?#jd4U_A|C&ONKw++rYgE-4?66N;|NZU2h;RD>6LfiJ zWBw!QNi|6cO`shR$D*(`q9nBSqtUy1u??seE1vSXYwWYRYm)ILT-o3f^9kXuPYMux z!k#h6b4L{-jC!@*D z#)qr@UiE%IMl*hbaQ>3oT%wI_Cp!L;YFC zD%$QrRq3NKoj%e7KeKhO9Vy$&(2YAE44e8p2`A5m_{HzO*hxJCz!9WmN~ z>FZm(*O>0VM|PNU4|?*AIS#}_mk0&HkRvt{|H>!S99qrQF#xQmC8-j zJST^Wvdbva(>m3Zshwpk7leKhdrbamZJ+Qup2j9?wWKXW*9@sT(P_;Xc8T$0O~@rd zszkdB{o;!{eww%Tqla;6f{bnr8u7f<^m><&ID`^#7)HNhx5EhPliQc5+0Qr&LEmWq zn@%i%IzfEYt6IRqiDNoqQg_bOvbi)T!6y_aS+JH+HYbGxdX7fR->M^KAC@Nc5*H+2 z;8AlnN8;!9oFw%S#DwZ+kovhxA5d>(SR^-04aB&Nj$*WOlok&IL2s^L#(dOd^UK^P z=ndHLiary=* zgGB1dE&Ac=^ErWdWP7&o{Ng-79sTl7n*}9Os6|6DAU{fqb7$n05tCxF@Q@Y?LZw)M zgS+Lg@AV|@4fQIpx!82Sq~p(MzYuNiWPC`6>Ygyq5T$WeJhE3_W{}cHE6Vag(lL{} zl02MxJv)e*40bhlQD;pBKee**M8;s|vb*MTZ{dddhXgVk>Pg@}G>58k!|-z#dS#CT zBp#cu)S6&Diib6X+TRGWVdYy~dPI2cCRe+0rxw4L<06RUr~7YiY4=K$nR-ob*}Z!; zvhCpPDOo2S^09(bEL5=ksECqI9^?;WghRvVReO4I;-EcLny=#1p_B*UQS6TKb?_OO zBIqD7Yy0SH(gCKYw`;RN&_*X(gJKEWG3wFol2hpEpO4q}Qa|$yjeC?iKt$S?G6VK6 zuh-MguLl|YfGQ{%UuI(u%X?!v>Mj0ty)!pKVRPBgp?1rtL^a*GyJ4nS!KQRM6!AGr zBASeR!L$AO(MedFuR_4PjPLG>y==6>0$t`{poy~C25z>sD%eEcN+)W1aw@6%A3trD zNid^~&m9&i;LIS^f9aP6#In<55+vtFzPDhb1k+bN1?k0V1rEb% z#bIGO~063cb;nhlz`3~z%VScbt zFuZ)Qd2Gc&K+k^X^II9E{cf8GL!B>RK}w4t412IDiVm}31szgm{Q`Nst%2RoZ+IQM zgGH(Bi{!>1FTB@0f2jG|?+9Ru_o}t!y8k|U<{$wAtLfuD0{PquPS134IoY}T#?FYI zZfD3yJ6F-_O1yKP>28;u(akB24#BXyyJt6%76&4)oH4OA$uI=|lI^%;sVi-6*o0C= zMJ^=DEP%?@7eEAl1GLH?yvWLHywvzJ-{W@-C8pI}osIpt*tMTIa|I!oK-V1|#%o2m zvV#*F|7h|Cm-yoeWrCewo~tpNGulCl)kfx_C@0N56AR@o@3W-zfdnwqw{y`DMvXPw z*BF87i9Ogq<#a_9O}JF6(1C!DuXr8Y7AMWV03)+pg_jAvdnJ^x;AqP$q6Up z2-)UDwCm+vP^D&wTc{NFQ8Ww+^15KoYeCo+(w--E)m+R2oL;UYw|tPn2Kd+_^l&K^ z3s_puPE9?YKr2!bh5Qpi0(%+BM$^Ah-^H5%Ti3p_1zGsoH%Vb4tD9 zp4APzt&eAY;4iCgP_w<7#QL3lHdT97!~sg^`@17qw7i*A0f_YVtgOYtlKr4vJy+tN z5t$+hCNoW0b)c@?=DdS0iyE?T;lMJAvBwtbK`wnx1rzM zevhR^@>-QnbXX%}d9Ws(H1v=>ZhO?0gQ@7q;I{*a?AunY3+RPWL{^~xP!sb2q&PQ0 zCyD5N`AlFro3+2L)RQJ-qEc4Z|=cU_|=#(O;8CFX~?_RvKADxd2 z4>}*yn@v%Sdz!9Rg|>iMb@PRu56oH06dUl@>E5$27;(iyt=0I_^%(-cf$$#WQkW-@ z9fW;pj!*+Rf%C;s`Bfbui=fL0K^M$CK`N*amIE#VApoTMsHf$ zjN1D@x0zmY?^GNd0qXAQGel@&@jz2IzK#h{+Y(Z{oA*2sR!pZP7v0rCs{}wGDS|~G z%C&_GIP&!v-)7xd`?ozBKj=D zRE01sr0>0(ke3PTDtZ^m0ErgcL6SPd}oyUG(2j zaYivexAZCKMbv~p+Q=~eK989k-dgBF_~HF0)K&=TjG$)`)r#pmQJ1U7En87_|xwK$j6lTHZvAmpKEGR`j%i|a*edum+_CfUx zh}t7uIXz!S(w5JV_i4Pv5fys6XiQ)sQ*iZ8yvVBv+z`Q9ycbfO%z}YsCiq5!gLri} zI(CM9FPMFt;Hj29kME~-=TpgXWwHuH*umczz7jC0(cUY`}E0P+`x8Lj$G?e##=5Dd7 zusDN3ZvYS&5)fx`sSeT~vvNGk^FacOwOw}Im2K-OjVp^0)mDJ4QrRgqwNN;cN&mZl zVXjjkZ#C;_eiIJxj`@QncB~A@OP(=dgag18Qqiiz$$PZ$&OROv19P3?Q!(YRF3pVN z+%noKKkJfJWlQw^UzvoYGPP&~DD}+Zt3brk-;LJ{k?+qXO_?UNzw*EsBmHK<;&2rM&GZ1(j?m_AkyTXbDBYh(h`e%xC*`Eia>TrP9ytS!Pob(62*JJv0 zA0MHg5)R3Fea^EJs0r2c#|J>kfrnS99H0%0Q<3z|)%j4%X5JS^6x|@VmsCW58w5uc z+xS49^eaD*rZTU6Qi#>BsXLNe+g7>-q`&k8bP|+j zZ*90(zo#Riqc+-S#dmE%6DceH^RO>$Yx$ba0 z80?7?O8+a2&^Zj!V@raLQ816jFGS4oY>@-T{>RD?v!@(L?h z%nNvpnT+wQ@7_|_Wh}^)$h6U+{(74C%`gtj2T93U%$)MN=Pn|xIJ6`EY_b<5L_4nE zS%ge8cmin&`GorF(YX^NIz0s2>DGH78@I(ngry=EI?rxY)wz{-Z{$g;N*CMfcR_DH z-Jis#$Y|T478teg82?O^CGWxhMqW|dN@iEH@XQliSfz(!DTBz}_5O!T@~@E^H~wWa zSn^RqKJ+wMGn=p?`Dx}63bt9|>M!W8*>)IwgylVlQOYm1)wsP+u8j%TCn6v?SEU=_ z!t+QJn`Moj^4HOFLHTq@vyDGd1tI7G<%fss{6R)UMS~5j??DbSIy$5(<-Kqc$mLbo z`?x;_bqe{4SfuxMOz*>4xd%o$D>|YTWZ3v0Avn`nolv9<7M0a^O8=myqEsmyJknx% zI+$0+d*_Huce~SPf_TieZmTo3tlukVF?}rg0mquFz%ID0Zc@Mc>La|jMF^Mge8Yb9 zNOF+WXQu^#leF}ncCG~_RB9Df3Q4XE7qp~*&)}<)^bH>Esf{fBY%eAmA$;KX#O5^v zctc>5z2-SQc46aOHd=!$fKCSFiq^{zr_d_Of@|?5gn9$sWwDX3zB8a1k@ z+|)2Ha@YU*XwJ0+a6tObu-&O)kq1|Nr%dMjW-!7|<(75AM2+pF{2rog1S2;a(d|B{ zc}S@S_OH@|n1+}e-4nJOK0lIx-{Lam`n|)dvISJS(=DKJ#r3JPf~8Mjx}pp07b8nvH(tC57t(>J|8i$V5Iqc#dH-dmh2 zw2;jL2^I}nVs`TG7t**@pz-GPl;Cx*lL`~J3IprA$zriy&n4LCSh}*IofMz1X`z_B zfM?FtcHrmSr>Ez@MGX(+7;Aa6Y5S0FMn?LgJc%kLI+dv21)Z#&u6v&7E;|vsfD>S3 z)BR(JG(JK<@U61|u!p<>tjgp-l;4oIu$SE)TMz~_`&JC!rOw75U|baBs<-lR++fo3 zL!o|=XXx&uDAAP`%Of50SwwFfM^nVNHKt5a5?FsouN<6Y)hE(}dU~^*w957a5{TA^ zb4cAF4x95F)aO}p2IGBHUT=zlJnzpce>2g#bRMu=+vl-`{H-qH*Nbl2evEe=ypkN> z#0$51_jpFZmjot-TK1g}GfE&1Ce9uM-oEpONoX{zCIf8AufYmlC#!_vF|q{{J!3g@sVWVkbJq+XTMSUmy<(2_m7lUl&i!gB; z=zFm(4AQt^-;Opk0F+3R(;Mr!^izNge>LI?Y-p z!JXs<(nUV?qq4mIOTu({2XIETFiwCReS?-BG6WVqsG8X;(5^SJ(uq7IAMEGXsKJiK z9bsMm4uwD264&ONKwC~GEcucMrjO%f|YP4A%3pxxXNA$j2Y!l^%d{S284X=z)T+CLgRz&s&vIF1^SU;6X8fICH>Q6c>2?_JfA6A&$zAU&+H8ETv*Uog{t*K=rW2ISL4N&FE7gSDo#l% z=k^no2P$bf5tL9DZqIFKe~xSW-HAcjd?(*9OZa+UA(m@vRq#=4P|?<8cqAI!J**`& zp>39EGmbXTSkU_h8&qfepV_{Wx(R)R;-UKU^}w5YN>iqeh~AmdmRIvN5OojLo#Kge zeUPl#e;HZKow0B?7T4xGcBuiK3^E4g9{G3jn2;b;=guFVWk^h{08_br7%Bd5bTX6o z^E6oB_*TGepyk^&U6kk!4_qU^f2A`$8>a_oiWX=|+PK+b%izVN?E16QpO}iT(J28x za>=ip=~&MDWJQ_j42;)wefU2f5>JaWC{^-Nsw1LC3`inZXsHhzzdSCdlcP*P^eF09 z)7Ol4>Ec288g!5^zWhiQlaA^4-aB$9LX1k?tIl;w>175s679|qVFK2v;7y;ENx&+3)ij-1~#V>QeDCf*iU57KjmtWa{35!R7qjw-OCoFXmT`9oZ{sH|*p z5iq&6L%>cSucZ-1Sm>#@zGXE_MDphkbE}+XsiN|M>Vk0@aZ8|w$`D4)%-;zSQ4bSw zvk|{GK~u4|60afG8IEx6etUkLS6kQd>Ci5-7;F~0)+|)meMFu#e<<SN6ma{lCsaqP^!E`v|!wC$U-Jm|O#fXm& ztM;y5@$cJGda>9xt({?n*ktP^?+lmu&s)oUv!Co4nR-uy$Kd@Z;uI*Xf%mI+9(rR? z+7n?)^HtC*EInYO(O)DYEZ$^=wEip6^?{0XnKtx~w6PNh+XlyS^8TjxWoczQMKU?>F{RMILYNdGjh@u#xHPo6#uuwPG#Y&5EMB9N zYA56f`}4Nt9#HN#@?xQgSw9S(PhKq^p;@;ar2c+8LPRd(5ql2WD(0~QR?e}kdz-F`9hnkxMjY=bGoqd3jL(Ewf*soJ~N(ZlCHqr%#nb4aZ?)4em-3n zMca=J$DFM5%1B3CwMlX9ELGx#>m;M(%@QYnFet3x=pM6N#qjsr_$07tfqI>A1Jkq2 ze<2lN`u2g|@60*QFA>z;s91(${H=|gD%=XRgiQxaP@z3~O^@6+)Xv6GDO)?g54q%) ze>p{A-p@z(qj>>~w#%lQCu|OXmAaUY1m+?8ftX2brg$}b9{O3J0BEcwlTz}$5Bk!B z5mJJ7_zpJ0y66x+P17wRdr6-;pr5*%bc^e*VJ&7$mTm_C4rb8T3 zzSH_mn4_HiL80N|Aq**dC-#xsUn~joVTTQpQH5Z9=jVld{n3tnXS}vB9ht*jR9M4Y z-=Qr;d>iFzm;fd=e()YILT)L3xy|~CR$XqyrhRzmY_kGIvR_gaytv+vj~1Ni+hS09 z@IUDw%w8&EbNOV4Y}Q}jbYW^_jlRps%Sv2*N;J@YgSkcc@vgE6c&Fl_9ja-&tAWG9 zT0a&`idK~e#DjFsIP)SfiAdIt*WJPv2J9HQ zMnGTz9D&dZ<~$Z=Q8J)7#Mz-5r5G(8TYoTyepRz6NQQ&vK3C)Yt9eTj6=r13)6P!R z9D{Rp;{|@(U(66_<%v!3Jl<#r9HP`ubUp;WM^th(Ti2B2n#uf@l5)jAszBJ*{hO$9 znHHRAD{4DpU)=#;7P>S5%$e>N={>#zZqscp5axUZXFEjNU(am#nQ7z4q4QXz90KUh%!h>Ecy)|= z^;sJQxp31!-|e;rMe$2lt47hxJk|2V6W@({#5zY!t(T;K zjvo@w@)wmA=ohoxc_P{)#%4$@dg#C`(Vcx~1Ul^9%$lD&z_uwSobX?qvKn&Q9 z)d^T;%Nr^;r8f)dTZ42B)%jd!YOS_t?Z6DVf2i$HiPE|6kfwEAV8KSUwCsDeim>py zY^7}4QC3V&Uee`8bhe>y2`&@-bA?EaON-`&@sHokz+7U%d`?hcYMbXlSV0q%r19&$ zi`+K4)BShd1TkpFgBqWXY&9lZt*G&yHmbhtkD7{r)2$GwUx!kZonpU$ zr%US<^zXDG^WaZ-(G@C3|E;Hre_fd89vEHnwPkq+udIp@hTdv!?X*q=nd2W{{g@?-03 z#7H*)N+27nEzf9m)802eyGkc@izAgk0QJJztvOi0D~Ksu0%R-%AsyE(f+?;1CY1SC zZ=gQ2pzP}6IIDi1={_I@p|mr6{BBVnp9T8WqhsYuy%!>&?b%|EQ}E*>eik#w3V}P1 zFxz4~W&s$+AopM(&=qQSsez`8qXI6t*~Zeid`-``T{JD@nV23nyraWx@a`khlAouF z(e1mO4ncU+M>q{>`x(*Ndljg=_iFNTqGGwLWd@Z5YIa5KN-}C=@$QwT*QnOoYoe6- zv@nlQ*u9|G1gVHzNTNTvz_pDM<%reSlqF!El1o|o4N}fP=8M-Cu%h_EX^9Ea_PHHI z$YDvpx^oyWzTKW-M(@inUQVQ7+Slh(e6W}UgMvN60VRy)(DXH_1?d?)%;Tj+y)Lp~zS@|1RKkhG zV5fD9f7YM8bJJMuxjvlmp;t8#M$XWTuK&n(N)V2OH?=aF%iFYU78vNYu{2 zUqW;P)pH@wFow*GsDkKoVR6exo2@1%B$O}P>`#kt(b^!|cX@McjrJNCE?);}l^tj# zc@J#6T3Q&K_KWRzbJjqHcQg?JwnfLu@JL%SXyVyYH&4?+C$^7HULhd3eQRHY8MH&Y z^O~$ITI7ZmrDE!G&2cJyY(2b=Ck|h12}$QoZY%`fiW4}k+*8To4Yt2|78k{YEU@7~ z6WBnZIN(;pLWqsBlwQ@=1He`4$Gg0VkIZF8rzR?(&5=EGBL3RNv+3DDxw6mzV8Kpw z)CdTUze-i_Iync9)W#vRX?rRW&JI8zJB4?(7Kbrh0B`9}GakRu8-W0LCo%A{k}`E9?P<;bEK1tV!9 zNxpQUgK}P&l<(KzhDTT7@&0<5^;RGy27LcjRGffOX1N@l)a}eg8xkiG|FJU(Ln^Vq zw04m$bH7kX4*$HbM60W0M6M+L8%FnbqFpPr4-cFS-m_m;e6qlbmdQTRih(LT=aT;FM-60hEcr@~ugT0W?imzz+9 zws?`mR5-t$D`Hbd|Iz`Fpvv>6%z@JKxH^Fjsp-Lb*l0L1YCADC(lPk-oy0CL?_I$e zD%Vhr*qwPv=srlBfq-H6Q>wecbq^0SbMj`SK;rZ3=yQ<&tNZE&a9_Y$3(PcUv9+H2VtQ6@tuH!mnp#s{XAi)ISj_P#)kI0 zFfOnU2WBY6%VFd~Ndmb)LcRkZiuCb7aE5s0 z-C@|H8hQjq1Bezj9wpRi=IWc2jvYkn*NWuWYD(?U-nE40!m<*tHwsX;A^2eCf+@H` z4TXkQiN)mNHvN1gBzA;zfV_k#Nsz8Zm^!iX;)Jvv|5+Db|11EPH{VeI6Z1~}96cI} zR0I)VBHbNci-32l>Em_OamjbQ&bXAtJ&vWFBX~0F>P;RF zep0)luPxJn;bx*rN=>R*NSTQ^qS3Vo1}XCGvH6BT1|98*7iC5gAEXW~kQ%JoPZpwW zWMyS|E@sjYg`e#a{tPg`laL4*V&Uf59s}#T2zhhjd-Ptr8w$Z;CWkv|ZT;($`AsTV z*neYdf(?hcybSY&nBGFnfIIy`Y-cN(_6CmdCCon(hzG(pqQBck5yZU4V)NJMwtd|G zH-3k_4H%jj1SA>dZa&fCIHRjiHzZ6Kfyat9eb|FhIh2c1;C=bRh1 zt<-J|A>~O+Ii9$FYvXSVTbn4qh6NZ5ZoX?W3w!mr=kYN;9ib8d+Q?f%HPI|n*1cLcojud6Z32Kru`Xy!low0Xae`3VO*HrBt!O+WN@KXrfvg|OcZuqtVYPuRcMzZ7?? zAe2~cX5Tq@YNyk!B186_%%6# z>SwM~;!Ap{AGTOdr9sa2m%?-#L?+Xd7ga)K$isLeY526F0u!UbZ`ZS^y6TJw%n`sT z=UNDV)fp*?&9DA;RCVNVqNr=6O8HHL@?e|sZu&SPXE@4*)W ztIY_B3peTOZQN2cvPR{%Rg;Da`@B}Xvj zW`-Ez;S)epupBbIWG6z)kEh2uF4pawQ$s202jjO!2Z9wMN_O+bwc;?930w7RG{gHS(eF}SBOt5|Bo#Xmu z(Es)jI-@}RF{gQL4vQj?I5xMBs=97h=q#!?YL=%`?0o8iq;vy{g)HFw>b0iZXRzO0 zmsdv?V7vt1gjAMk_dJ?BDc2S-wa)jmi^OZRxh89erOST7uie{7rN5c z{=PX+3P$7dM!~1UbM=tTV;g@zmy~2jdlzde<{FGAO1lK^#H4;_KOqwVnTfZL{}m!14F{Er@cd|6G_p1NoP3~%Y!?v}1zBfkK24>Wfi(n)~jEJG5Zph;pzhwNszl^t{G zoa$a|2jxL~S~#S;4a6p0{`tVpG6_-p$k%5nogDc}v&go)k#AcUu2mXvKC{_e$PLj% zCqtX@Ml>nOAJ3+EEqJCD9-*?8`IX|b#(SCV`mqdt==AYWc4>Kqof(-k@^0)s#i&wY z3SQf2;)#i+leBgQ&W63y=y6}3Z;;$ZhOP}SHRD3e45Q3@%d1?HZ^KZt3K9kc0wo)_ zQR$X+<)==>+Uq5m;tX?7WdYw2qKSu$*l9c@F)g9$9q&HM6U0(yuFC1G7hmi=njRh7 z593jY?9fT%r^v0S@~2`ln{i~6cDpXgho<~3TkSUcs;?kTDN3wfU-b-xr#$^ZfxbV8 zAJ3gF>Gc>d&g^0S8j)M%e~-awuTD!J9@72xSAo;{43&J%9cT2>UWQn91qV+$EN#Hw zSCz|;SE7KJ=GHjigtDjzikXF^Kbh{^STU+*K8sWqpczls*Q6*%k<(Y@ygY7JR3sQ1 zE5s;I>cN&Kk`oH!;BPLg_Av%Q89ZG5gA=AQqvXX8x<) zz4@N^3BgA+T!Qyvqamd5qOAuH7f{UJyHdD`x|ey#=A=D>qiB``AMn&*x_Pf8E)#i% z0`+;F(oQ9Raz~dUJ(O9YzdR=9@;bjKNNn-vg68P)BCRe2lkP=IT1#}%{LEF&#a!|X z93eFskoJxn5g#7fD)(k;PPK2hMKuQgYI;Cd#7Wj{!|r2PGG%o22!V>`2|ixDvI&H) zMfUVy!(%Q2zetok?^~L#k ziDT%yM5*Xrv>jYe#4Mqp7{KJdyYkL&Qm`VnO!}RWy8VImOKytnBN{jm-z;I4JjD?} zxE)$KnS%y>CeiDHP#~3j<~)>6tVQsLlLj-X@YUa#HkYLmi`f*<8IyN_Ew%d5(~dcQ zNhWLMt~i^!?CsL>G0c8#+JiLMMn<>|rw*YGuceUoxmlC}8ZKD8ZtU56>> z6Ub}7Xj=Z2R=U%}aY*q16FVA^Xn9LQ$ByzVXIe=%19mIg8ztW1 zfp&Uurr5-b;C{OkuN9SA$LoIw7--3R=W6dV*=^`dhMMc%>GbH&FiyEms zRmtsXah*+Y=HOSSLL=G{VWD%z=?U}yu%C9z)BSDvj}GTp|D{U7bZ;Qk4I*#6*U|Kx z?n74Z&Q~gd{WyVp?(Oy84Y{i7N_XRn>^x`M3wzhTls*NLM649BLE%NgfhWD$Ac>n3 z#Vd3TfVt&g05~n)c*sjv4u9Ra1qasdv-x7Pj9fgrY@1>8qG5ZSjM~$~R&tK*;s?He z5sRBhKNO`H%(4BTQLOmgERvoaO%Lvn7`Q2BC(J%l_l-wx#<%#q6E)0_ z=$qe%Y~#Xh<~H6&>(1?n#j}S_ajblH&nRmTWhAz#;{{vx6=(LopaX6^&S3@|VOcw1 zct2m0{ypW1YDs&K>@zp>6c@St)C%SKEnY816-fq#FJeKhMq5kRuU#X5& zH6AP&a_(S!>6yA6zWS>Y8zED`9=sj`T9d(Y^1KPZ_@tkl6@1Vt6W|BzD~1IP8kU)T z5JXe}Z#e#;P>lLsxCe>Au&-8DJzl(8vY1jqNm^V}IUdQ3hdVUqEs%p)kNvh3)tyHs zEfhmrnT}1IFqik>k82H?n%}oLCP;q(mUH_ORiE8>((gldr+yOMu;%-ENzn)!S*CZ*{a5AElQEi)<_ zZRb_A;`az<8_k<%IyegOBRzdE;j%kT~T_^7Sez#yN#a_DH#Ph5*;av{5(nVyj+@1%a zhSmj$?J`*j7(kK^1I%Y^)`#QSgeiLALE@3?^>w>nj&5jaTi9P&+&UN3EiH;Mk2ZL8oWz)V*#I7 z3IyVj9kQJT;O_a)WN_rj3M$I}{2*ir9+SI1ispN#9$aQu#-kQ8(AhY|6-Ko5ZD5@Q z!ObE<4`i7E4Ne;2AN>IAoMpT_>3b=Cuj=DS2DCq;12ppEEpiN%d8aq~eZ@I+(vzFtI^E4osT@$CVAkWS_vAYJNdOpv@B)RhOFULVBQk6*n} zS_YFwdba0#JQEmj#6FEG`)s7KOi2v#rvrAl0}NZ3H7QsqSCOAJ`AYr8*bZS13wAAQZ+qKkn(9aFT0q0tCDs)iavo@ z+di;=0%B@Ew0oRxB!omEiVn6qNnJs$d!m0ji9I??L6@xO5oo|SAfu1KW)21@A~QH# zfI*bH=539gN4y}B@L9GMy$_Bf0;}&z#+p%&bK02bG+AtX%dLihR3%L^ zrQn9I_vk`|%Kf@Z3Ru;9C0_;)C+W>HfCBAzdrdpD1j?07*53C=VkvdLcLpUHeAs7; zU#Ojk;mxwh&YI9Z18X6-fFESVH_w}fGo5S9+22UTo*o=VMe?p@%*Ea|Y@cdXP?CRL z{`olUy-V9xg<^)%?=C(sPIG=LIYdScvvafvKAiPsUr~Gub~HGq zPS=NY_?+^azxRF7eS$4wZwPcR)>T9PNijTc#Jt&xyA1#-M(4r)=gpuLZh(EY0naW& za=->kZ+*Q0!hN#<#1>$~3TpE-&;=-Z)6JHjAAtJ#ekd4x_Cra*Lh}nd@bO{3Rs{O0 z6|A??i?B7n8^AEXX}^PhS9bsU33b$Ti4Jy}CiXmgk7Ts>kI2(du0tV125!WyFiJF! zAhzy21@NInP(1lvT(PKm?r<_Qke@RDJrv-#=jpD^`D4R^**j8v73p5~nxW9G*CZu( zXxUI(v@oSU3-4t+*6B#>f;@{3z$|0YWn0P`B?@ZM%CZ^5uubAZ-Rm|P_k>WgdS#`g z__AB}QX#8K1<_mYCf|FF${;409^ zBbw{=98AHtqhywJYxjhe2#h>hDj1*Y2GPq*H5`GD4|Gglnou zQy^-d;TCVm<9_XqCAyZX%svwwdwsO zl&HC8GT-%HDII4w;Au6lmglR=>-AtObWii!)3b|kAC@u6w@xoHxJh3U^tSV*IS$h0 z&exoyCuXAK5NJHS@+vwna!y*@IwE4IBZ_%1hnAP8n9MS zSVzTaRgFc`vU9>I%3b&(r)()T)xFD7n&+r^pYiJ!c0<(QA7}YDu3sesoM_OQ0KC?X z0J?|2d(i?rh@kHGiD03RiFVuRNa5eb@11;p81NkB=_gDAY(7L?soq_I9?QmxeY7|} zdZqZFD{T*VJLz93jo|$q1QxloQD}(N8?RGdkI%3D`N=3_F2pP&i*o44a5!DwM2&QL zQ*fJE&<@GI5x{Ti??qeAONNoRU)qa&SkPCVGRej?{(TUf2vRE|@WQ9aagg?(A@Pzs zxq=TFtqOcE`3=qY{)x+rX1>VSBGrnS3et4Pe?Pz_5N>sLD-Qa{70Vn=jcY60L zDRu-D*4{)ofBB0175z!4)gd&A2*pSFY_5Kpo8pjxw@r~w9&FbON^6I&7*h4hO6zHl zfRn<^SNk*G-wIQpasWK5gHZrPgn@FaMROtki|_zmPl0-0T_@BmLmxOZOaEFP1$w@h z{An`}oZMq9UgYno92d*HP$4pNEnkPs ziL`0Ibdhb&r@W?nA0TzMWqJ2YSQ4oC*3M>GSsN|PFFVP?Cz|FKN(eB+$Jw<32e|)i zKY15Oj%YUi1^-^6>f8e-e84A8o+o>#;VeB?gad*F=A_Jo3gi)>$yM~1uCGaf3@@I6 zWmRKG(NAA$rY8Ki1x?+aSyz6=s)LX08%025p$CzAbEwYvC@R){Rb)`zS!ia-_SZMb zMx=M}gn7sQ2RXP-L(nbcVpTAVOBOL_tL6633vH7{bkSZHk(Ij0==A}Ih43Z@M162% zexBu70cx+_nVW4EMOzLSk%5x$bcqVK?tm5e{g+5NQ|_?FT;lI;Ve3u28Sgu`0OulaI=mDz>=RSj;CDyLAI_s==7O|lFpQppTZ=bt;!ZK_ z?%;R96gQ7iKZTIzsuL15cI^oEJKJF|>sQoSveMI7eC zUF=&ve>8_2tOVp5`^+6NS9Z`AN=`sI`&1_QaUWQaqT)M~M6#go2mc8A$ z&-B9Qv&)b$HuOO#uSgABAM|*HYGJyA9LRufQ{sg+i)%bv=7)T1w^yKEM%^QQP~D03$#PR1!4_IoG0k$EOv*y%19Qp3k>UF)>VJex^(;fvXS6ZU^b&KHG}SOf z6xzwIZ@MgEtNY{C80l=GMw1y9bDx|ym>g*^hDV+!w;@s;M`tB@06+=}BsJL7dQ9f8 zI>|%f)ZUk;v*!n-m;Or%Djz?NeOr6 zSG(omiVZ$PP^LbSQ#lz|O2u%!hvMAty@HOdwxdG^>@T(RqI zekJ9lro^~9ir2jyIrkEYe9#9yYOsZ|@}i}f7GB~OJ%r&UHJ_H9&K5wCW?)M3tXJnK z-rP}xvmkGw02lmKEn00NTvk1dOI;o!EBwiPp|a zV4VBw!w!zLQ;chE4@d>vYB5EbE0*cKP|e95cHwYWsHhGSBtQmcFbA;PtW$h@7+VRO z6|kJ=yz979SM!r2D9qkg&OOT^_@aVzK8aIr+Dw_9sjRTY%?%O0Yqb_{EX@;N!_(ln zn%|2a$z88OW4%65a1neEIfK@z53T!a}VSqNBrjjom+) z!$Z#h8l0stTttY&x^}BLv+OkFpD=@~zn~>=qw&lzHoL$}!*&GR7mW4W}wn4PNVgdHoA5ZccqCkuk-=guomR5L+ z^kyjr(Zj!;H`-&q6s zM&(V)PpqeBYw5_s4KD;c1zaezBFWi_SFW|4og$R!Yls&0&(Ph)J)(c&{#<6t^USh@ zA>;^F2y|Jin5pqy`CihKE2T3%I>w>@#FMo7Y`%(_sSp6lxJ|bnDeVJbQhd6Sw!6V! z4f>Sg!-*Pj>H=XuaAlKEHN>QoC0iTcOqozUxkDkLu%#WQs`<{uRc-sOaDw=VDyQog)s3>L%9(zBG@J!Y#_R9-CKZ(7wMlw=O@wCDTo95Nb+E1HmlIJwY6spukFp& zUp>a=C;jB)C5xV%%ElQwTU|w?xDTBWm=~raM9T>}Ua18$4elA04yx@i8sGC~$#yGk zwZdBREEa#sy7P&r>LT z&)(&b@^z`iPQe-Z>LL*sPveYHo)(6b&Rg8 zR@e3*RtP{E?eM)`r`vl4w-~hZKy@tDIsg({ly4Fu-P|e>61P|FrNX(Otrv`+bicvR;@DZS%NXZ1%1db0nJ?16+G>jx%+tRj=W;0&uD6wHmK53PB$TQM6Z z3XiXTCA#c0qO9P!X;?IL3J_X#Kk6=NJ><`t_~QfO#5}39k-z`(v{@RnKQD=nwt%2( z!>S~&RnSFN3e&ss^zKpPgIuu%Bh}Ms0lX>>LMZQ|sdSw*Xw`-2su52AXr0AMij3i@ zi15c_FFYeNP~MFfw&UXMe8Ifj3M=SngtJ1@K2wrVYE;R=I4ThB#^y-rQd-;^k6Uo~ zGfy7W8?_I+l_a$7KJh!!7b3xrU(VzAW-#D_PJyiN#d*5Y)+B9hnxVGgWel|+KfnCl zKm3dT^nd)jzxluapa1sn|K;EQn}7Q^|KdOXmw*2s{@vgF=YRMw|LtG@>%aZi|MUO% zAOG9`^?&|P`tyIVzyJN;{n!8ZKmYyz`fvX2|MqwP3jg(Y|LPz99@eqfm=YH{r>BbW}Z zA`U&zi1=^BF&)33*pK`8M^`Z9pChmm@*ycez;?czKoiUrsl5IWfe3atR??swi=urq zpAsV(VLcRHzQ#ughF%9`5L^qT6=n2+|7GAC7`>5+%=2SO!Qu2HU9FK8x9JnUR7Qf( z{`U>L*3Jzm(Usfaqg^cHk;?C=T(y2h{cV+5rsvCKf^cDXPy4~^*(JZeH?Es0LXwYu zf!>JR#!Oyzw>|Dre8#uLe>EOc%@&LTt>f&^t}0o6}D1?!_{+vIHvBG#669#d%T=B z-|fe1Bc3q6cP<8wkEe$%fNQO~1PqqCKMC&ncoi&YymlW|Z|Am$a|djK!zG|xBTMY| z2I5^gr{?VggWs=8nMC91UC`?Y`pL&he zQ8Y7)(DXi^p!NAkCwfCC8fuCB+}84f_+gV6~o) z0N%lsZ(Y}5$z;xP)-9FHOW1f=<`=rTTdF%>G#| z*H$^G?1Th>Zi153aM`vbp1FCR4dyAB6dN70Auv;`3${I@^-u2;o{%YPh>0c)jc;L# znJ*|de_20Oq@!^w8dswIrp5|%`GZ}c{&%aSblnH1-5shB7R~SgJaKL@f7!tQdZJOn zk!U+{eb0X*$~QI%xoXX@ufL+LgirOoQHfu=)>S9lR6)W>?=rh#H)|0Gh>rx;s@+aIS^mwJm03AN|tKMXOYE*E7sMS zcrh|aqisD9h$;1QN%r4QGwEg7D;+C8PFX0+^~d<-LP@OL zq=PjH{oAD?TJhDj0Ji;lkQ#>{x{MQq!*%LZ*<^G^rBeMy_ zrlC)9bP8@%QE}U?u14wGuF^1}co;oW)uni-^`B%)!#FZ@vShT%VgnVR9!r9G2*mUi z*F&G4^}hynboL)K^&%mA~8-;e|?nW{n-WJo4mUmhl1@$ARY~ zSM}8tupQybOkBX?6-V>m&`ZvUGXEDy#X zf9f%eg9>xj@oBbw_drd(nxMJl9EFc{{{Ca(+I~X1C1jznT-hP2Il^heITF%j-t#v) zMcjO_e5 zV%T(MnUQzzi^E&RVN{-5f(0!IK@WLSR}u!_)*Y%q89O?g83l*OvoGP0msn0r5J~eHuBLnwo2~ zqfiav4x)k6d!WV?bN{02tBBnmE~uSzT^yR4Z8~-Xgd_NfMB^PFfrbMfy#?UDjL;<XDbJVCarfjnoeaHy-_byTdgdL_~wK?bW z+*X1F#chH5urhBZA!_%3`A`4wUy1)NfT2+?jBSf1xbM`f>^8$J^kmWe7o0XL6=AQj zvG@^3o^51BJ4GANEU6;1(|DI`$-I+fzb?HelrBmYM?jWt0F3T`lY;hY5Q@Z1-Ez|L z!NDPZ?B$v9p&@bH!`w91UbVNTM+f#}RxrI;h(~St5pad%g=uyPA;mYooX2nX@khcX+)u_#Ebewi$t|zPR~HKyf{{5N?c^=Ge9b=(t@x^XJaCyP%QM(zfZIl= zZ(zd>g@3v&Vo=sw;~CzYu3GK2@Hzg8o8==O+yQy80^U@tq&g6yp3y6V)(Uy>BM z>l2UF3|J^eX|ngW^zXm{rSUP3JIMH!eq{n-^9ra%rSZ;%AIq6jk6pAh3E&|wv6wOI z-{>aFMnvN!WM*rX=!nrgv(>_4{&2%Rxg}z#oTCAsu63KP*3z{H7D|ym#@T-NncPnT znK6RD#Rl@rqdUD0QWPJz%El$dZn|}3QH#aj(dgW+ao3L_{_m-v`DMj6iuy_d-E5{e z%hMIlE+jd$-y9td*FY>4m?M~E`OYM5OAeQ9UVJV_zic_d`@Sgps-QrHZWCL_Knunb5=ik* z2j0r?)IOWfirJ*o6r4*wN5OsI%|VG}b>3WRznnu88f6J_;d)gH*=vEnl8y{ka_8I@ zEt5=5wWD~Rl9*Jn&xt7uY4pYhf?DccgpBO8aA@PneA0#83Ts39tK>DccSlm2@=i|f zaQZeq+_us7bDPfq*Py)^GP|L!qk3C>{65`0x4HOc;>6-SG(V`}fyK%TsINx{(5ynI zjkk+9^|Byq;;CbXINo{oGUv{-B3BGi^%)5Oo^8?f?JUFV$t#kr`v$k zP{uc*qZfW68y=!Y)!VR{=)yCj@!LlLeI}%7XC9(VQcb=fRY^b<6b_MY4=z}@XC96W zmnTTFHbUFr^Zw62x!9-jVQsoI`5&aO5-kNNft-Tsn*PUXd^HRtJ8}jBw~IpqEp#@= zuU?85D%gfu8W^M3zlndHi8jdD2%pas>rY$Ha`VKYgZLP6{C2dvue43vX_952oK!n* zLM?110!cBJaK@P295;%bo@locZ64Uiy@f2OG_97tCj1RWbl`Gr-#QHU{DEvW7OJ*z zhs|xMQXaJ73G8;9>%FEf`g3ZM5pK?h{A(axM)Yk)9@4e_Wr$R>pD^8AfcCe}&2BL{ zc}#vWz#3E?w{1431$0_m*@DvYZw!rCZ`(kV!#Qc6MdeK%9~Epj=|a%2o*pcj*-1jL z1&I*T#g?GJ!Wemo_Fbic5yLWcU0Yoc&wm^_HvxkoI~jSNKBS}T^rMs9t|~r*4Tn81 zO$*ym^<{bnhdVU>N$mmVdgt7^f-75brK{~fEnWms3#BbFbY=={O;V`Cn_I|W<>Qly zPKc2Q_bF^T?*`LLDlvJVL$PZ=L>@>ysjqW3ZI7YO*JCtWA8r$b3jLY#yX7e zn%~K-%xrR%+My6l9)t#i3vqBcJvxTStSGKjkP+Q%M7QLL9n_~+U2OBKmAGIl|19YfGJZ9LnH{(&V@SO_JHrt>naB0` z^%>6j_7g4`zD^JB34Fvirjw?BV{H-fiv`2BR>jCJ^F&vcKQ@O4!%HrS#Fc`mvtY+D@0o+#K@o74(VD=Euq9z3 zgPEoYe(&97^#|C-Rz+(Zx*ui+O2sc_^BAthm56;t9lunpl@3IvfYfQwm z`Rl_SfT|?z<1C|YhJtBjMI?#zpvX;47746v)kUjSN*=zWlvI3AO2@Gcf@Dz5ZnLOm z0YcKmmJdi@bQhBWJL_-!`BdR8GXCdm9O_qgWJ}pW)&olGi)`0_x{qpgAUm!eqdq$; zZl4gpwEE!JV18hx%9RDYjcT%SIK97}-Vf8_;k3EzsmdYyB3QlvVSWJBPV5*DGxtkfCl>4Q2en~1SiCNSE-ig_ahOmS&LUQ(0co!cC!GQ zGn)%#jWV1NQU}|IiuAFe-afvDjp*qqdb!qLqh)h-j`ZJ2VMCI}z=1vNPn#u-Y6j$) z7HZRCCXaW6q`rkh*o^(1ITzCFUR?1`LY%^TwuZYuq#3|+Tm6+*U*fl|WUy9yt8WeatceNtuK-XULc9cwgP^pRO#eOuQ#0C{l z^Ea7ghzqA?bT>f6Cp@Q#6_bgfOp6ZA>sxCAIs8C4vFk`fE$)!HKbq{rt zjLbJ$-i-He;+en#HbcNugF{QbY%pbNfl#T_tK*kKJHPc`YeF z0h`l6p@-^7Wzdc+y^FEe6N%sfUkx8|X(0${T~3QNXS@wnxP{x0@rZVhAU}9eo|ZP_ z#yYa2&XYy3)zuKLNDDy$ctU#xJjv;TKL*PmE+U&<5FIt=s>!0aFkj0Y3A_I`GVRkX z^FsH1-7Yrb%04`YVHGh#A0*vGk8Y&rtJ+h^1JniWnSEGF<@DnOi=^|alvK7o8T_tR z(#A9TkSQ@|U+Urf=LzPNSRoJ{UOXYdZ*;zK&Qb{*1AaZQU_ZQtSvKgKm{~B3N~UJl zRgrw+a!rp1kP)pkj<5wt5u2+&eW|C_)u2YKjRrEcY@-pdh7DpaXxh063Gh&ozIP8lZy#X||`KilTg&BZd#l%3X)QvO94- zT=SRCkLvs~XfV8u3xHB9%zIQ;&?1s?Epc)76)}nAbXq8ibUQDq^)>D!<+q@71j+E5 zO$30Il{uL#0Z_E+b0JXGelcj=w$kSeX+7sW3LZ6pa-Wh6p~wzLg$5kx^H$A*Q~PfK!7Aw6#LyMdEFo3W z^aH6&yKU5$-aykXhI899d${}c+0ED+E5Bfym`E4k7T+F(wDmIRjf z&I;l0d%(+ZN4p!-gLaGx695g3m-W^vblUOl8SD;}nB?2zPxVdn=hL_2s6pnPk7tsJ z;|_=&*h2#E$RcQayIYKdR+>&g5K-MdVGvgOG4+643W8~ekPHzW($}Xg-4Z0vUe5tH zrU=njZw!(z2$>RzumIo^B8ba%gnKp-nTD4hKEGn~B(1D9e7k?#0*N8M9dUHc7MP0e zqJH)*FW^k>p6Hk8KSbSX`YJBV_w=n0eVApC`vgMFd7hKsXjjI24YmhVXWzvKqur&n zqNW$LdP1OtT7;>~NI*^l**wbX;_J3M78D~~>U<)4BB8KOOjr8jS9`l1hYp3^@7d|( zatxu#;-L?kMP8pL@vjRw`ERdMLkmJS2)jNyz}0q?qW_-;}y9s@u;8 zQ>t7CS}4BtBUT;HWk@phdLGGAa-Lv;D5TdNMj^>aUhzQ9%X)sMnZ2HZyO@)lvFNwwh)Sg!pXU_!E6j zAbWOOcILwXWLq$;KH0j1tjgmR_QBCXyiBK?zlUwxCFtBn#kS_>7{4Dq#SjOFJ-~>5 zS_F1)AJjiBs#E!^HVs1oY4(P zq%o9{v(D7Oc=zKNli_pfyByzD_|q&WVua-W-f4We0*1x@gRq@p70{OL+rna7&4HL6 z(xpR>F*4y-H$d4WNSe;hNPPPr4-B$T6w!fgw2uPZH;$^uVYU0_rGc8Gu~a=Vi_zZ( z26mThV5i?zO!f!>|R~jshKD-c0Yt zlArl;SOgZ=`8;G9U@UqC4pfnomXB1`!+>M|UyZ;AA&}GdQ`F{*H=pHDA#QDtRi;O9 zls`2j$fa5sr!`C>o}pBZN|2@nQBG^9bzwWxJQ;a4>Bb(+U3Ol}v9Y5TW_I($44Qlr zIVW;Rw1ge~eR;iz%w3uuHh}rk;#!(O!FY2`U~ZuRDGf^e4tMy>+X)b< zJ4(J<4NE3{`#<9%NEr1@*L`Y-P)E#dSxWzIgdX2^--ZfUmtRa4oz{x7!)N)}cs^ zrbVcIr|q^Bn$p6a8KCLrlQ}YcM;L~zXme$jF)XfsqLvV<6Zyp$UL@0@RV5Iek{OvK z#@yKy*GUYBHS0n`G&a(q4^Go`VGuo)w55V)A?MD&l=Rn#KgfWsSP+tK^fWzB+^BxH zMt`nx%|&7_j!O9FDx%&?qR+H=7M|nMIl~1yTs?{i+%4OWh0_Aa2VQo51_ z_hhQxom!iP#67tFQ=y6mAqZm)Y|;OzupHbgr4r+l2E)Xm_84s9Hbiq~CSQf}Ge-sh zQk&$qYRWs&>1Na&#l?H`3gF=HlS_dKiDdACTx`Y;`r}1o5NLi-DYE$Q2{@p5#iBa! z|3k}q$u-n4MLW44q7mo!j4uiP@H5|&vh2`tDNzZ1B0pZTZ)eE@Y1?tlm0WCCD8yHfSJbxWIl+`38W>F zPi>}dXoq3Zlb*^!q7SQD?ip(!J8_7Cz>NEWcxW{uTjeJs+uzg4o12hY+3cC443Cz> zQ-W;Z@KgzIwKgE{Kz$xTaQ?jYOvn_Eh|iKX&3u8}_KUB(g$87JQ3ziEDAm(*^EQk-`kQ z^aJ)n%@qKY%5=Sx!AUZppn~YJCRae?Oim-Ib@yM9N-{(LXP?y@nTkvC{J=hNTk2;( z%5;lLoKU2(5H()nmu0!l!11Yc*{GS<^OfT){bo!6H@E_MdvE5CIJbF@rw#z#40wfH zIEmvRUN&!rVx)A}jIh)qx$kPdzEt-YT?MZ`L>7v=)**&--KEjKfLD(9JUl{x&guB4 zKcI^~EfkfuNhC{meDB%2KjUWCDkLi{MCuUfkO~VV;y0SKVGltSC%1cqI8e0&Bvy#& z;SwhvOHx#Mn+H#BKdPJKf2lzNnD72PeIfPc)@^b%j9UaKd#L0={!iC7H?%f`5u*lD zkjb65U1WZ^^lqb4$)em4grVcO`j`yP;*+&x!bYv(sVx|UMAb)gN$h)kdA=22mi7PW zueT|%`Ic@krB#KaOzsa~KS%G#3BJ5J>#%tlhi6g_bL{*zGo(!N`=!+1aZ~u8F%(gU0 zu8!GM^ePDf2gtS9-`0lqvAO8+b_Yck1<&+pa8CXYhQy+J5JJrocj@H9;Y_1BI%iqO zRe-zq9;5-C)H{@9#kvgK>-p7*>Ciigcdwiq`g^)5eyQ6BH+(Yp+sjvl{;V|yRIn8I zlqNWvP^c${Xjb9~HeEoH1*Av5X?WVt)f*rgP^UTYaxPXx~9O)mHzX3l>)5 zw?_+T;)e=ldjXVFrS}K%xHA37D?^pK`zxLi@5lVW^1evnRQ41kT#Xd*{gcX)L4@L` zK)Nm3)fIE_lKCq-lf-L}htXh*OpIpN=50u{qr+5nYQX4q04PW%@X&-!%R1ax_f}Vb z*4h-9a&hK2Hl>3gcS&7Xc<1JOPbhq|a22``)sqH;*z9RD^12z>y=Jd;txDO)MV$~{ z+y%RBPqxz4alpRO5txx3C0T!Oy!{Zru1K6hR6^P@snA5pPTSjUh{}bCX3n9w>nj?E zfbNOQJrx$x+G2dZ3*)uu)WLBOg5iQWOJ>%`&qjWx>bX~86dz6L%4b% zj%|ixx>s_^bO7+b>5JJ+uvg~q^s;OpqI4w{fz*Zg$@5%Ev|L#O!Q4}{Q4o`iCO}lV z0IAO0^>k~Zs)FYLc3xdeMJ(~zAZu~>6~*aPdZo1JSu|?=xWj;H`W5ml{VX+3YhsHG zP#`S74c5=o3AxVfq2P$IQ6AtfdpN2mzV)t`~1vAisDU3Bhono(AO`doqE ztU~$>WOJQ4N?LCcD$3udj)~sPSb_xDo1zC~b1E<8S*Luo&Bx4BE?0Mx^XmZk(lK8| z%IKWvts(iO!=f{OKh0QS!NPnN^5}Q#X$YEZ0g^jWvpP^_#dbNH8yN#34k!#IWd(k` z{;~H@nn6(UN)d7A9cfBnuj&e%qsCr3foFi&u+dSJ162dv!jMjEJZ_zLx@7zd#9&lGe4uh^D z+KjZuEtqJ6q770(RGY%9snnvCMf<2Y@I_8$RITxJxRz)e5rY9fQ(*O*-RVF^Y((7; zh^UMFys!>9@`-Dt*rY(6UR|O=a5Ljh+~elObwSUv?sk~< z4WFXl>D}yLo51<%&{xLliH()5ds=SDN**?S_xT}3VPSi5RS88VhBrV1s6JZW04_=$ z2S(BCe#;ong*Tj?O6@EdkO4Y-!kC~HeA~?w&nc%|AlzteF&w3 z<4??jQuW%uM5NEf2qY|nI);C?<<)xXBZLJGx-*kKF-4=mSEdq9+Od1dz?3g6^MF|YOarF))U+)dUy8@mu z-eE4BT%Fpoz5jr&vFkHBj>!*D)35_x_@Z<9PoKslVsJQiQeQSF-60|M<u5a+`0{;qK?CnigJlW;@R}DZ}h?!i1)U zQqYNW+0&d40w8h^@_Gv;jhgW790ty)aB;hvej24R^U4sUK1IqsDp0fjxXtU#+ z6Zb>VExJz^+Ty2&fOHngq?CG;_SPvI%CJV=`iUhd3?BR2~1+(;zA{*2Oj zF{kTzm0YYHHtU8G!U&m5Z6vl|2PcNI=J|49hczv};tpNt6C`#9$h0Ge-;VsvXK}R}sM`_`T~+-dAqfthNvU7cH#V)1`ZB)1{hy z@GGVQnI&J;BJ%i@R680yzA`Llt$K+6HlBiWg6)9OllPZo)ZD85VdzNRIXe}Mc2$uM z;JTB;c%?YggC>!0_?7%;sYE#}ojDA?wQ@2%6d^OJ7y`4Hd$Y2XWX$1e%CQ-eJXg^Z zld0M2B-!*JR#J9r+=)x1^A}Ioi0zv&ew`-XThprHLuo~ResgTCD#)j zLyT#rn}nuT+jX~-`)?wFaArfGU?;pkb;2cboT5Gn?lp)3!X!gXyZT#?0t5)ZuI3Z2kpGRA00ndt? zzl?Au_L4Dh_b++AtV(a!;RS=gnSYb|t6~~&imqHir1!E2KjNen9Uk(HIPOH;fU}9f z8^`Lr=SV7AYOKoMz~EJuRBmtr2s;CD9GL!6e_P6AA2VAdqCl#>3Xl|GbkLxn4s+T}L$wAauNf-9%;IrFs zxEMbXZD)5*CPq)n(%6fLnEc$e9L?I3a)Df4_xBZC_?SUC9BmflPy~-s8FQ_aljT z@;tG&_@KEeP!Te4oy~YsaAw{9YrJr5|0MG&dD1ezFUc3Ew5w^1c>1@V)I)qGfimhS zfCkxCfn_RVFXuh^u6?I_^8sm;Giv3DNW_r{VgIuxKzdzBI}fv)r%E9v##05c5#(YX zW|4i!{ResQ_ZGqw3sr3v*@iqhaOWj2sLQ}w8+hn?4f@#8;#)jA34%5Xk`z%%*X3LH z2>K5zVmtH)6i`(1(OD`qe&0c)E2WN1dRMHNNI=%#FdGL=l!e}J;{EMeDsgfM0iXQ* zk<1HS+Bnlh5*}UKk>*u~ad&beh3qq0JceSfpXNegWeq774y|Ld_mP(GfX8P5*s=C;bVSS`6?;=mhTH3J;tY6}w zAP6w0dJ9`#AL^rjX3zLjq3Y@j#BPuToVM4nP>asG=dDZ=`OOaIbz-1_|Z{q=S&v|@=OOAWyxCRMyJJZ?-0Abs~ z-unPV6pG-qDwS=DiqOsO2zY|7!p$CW2!MV*Jyl6VD@xif^;RQ~Ug^BmPahP)?AQqRb#@$WA+!)pu z8}{+J-K4zR)1H%{6_-4fYY|xQGVpL32n@ zvFUw?CeJG;fqkQdpUe_<_NT4AwEf_tebEoi=i#0DPB*whc+oBa8ERXh@UPU>q!!2a zbbnL5WSY_n`klg*CQ$?^QR`Tw$6q;tMBDexAgAWMt*@}-u?y_4M4QJQBwUH2aZ@2M zrtPHL$J2{;ybZ5&y73y7-eyEXk0tc-bvL>0fbGT>b9x{0h=BiIX_1!gNX{AXb}C1U zjPKeA%fHtL(&ht9+S;RG<|gaW@_JHlCRc0mc1Ol8FZ*ftU>lsOe^_qChtRC9R0k_s zZqV1;V1Vvlwc=@PwpTO_Fpj>20su4zcl|@I=eV?=dLRVo8G%-Zut)u_QBx z8r<=-)4v85f#Xd+hPTk=*SRmDn~A4}=#%NOX8-__UpiS7XBFz*;tsVh>)5(}Oj-Ce z&>*J6)WD{QrqA{xeMed@@%j*x7F}H@<=41&9JLOxL8M)=dOLq_tZk0)J!B+E7pNC2BN)mhGh>r^E z@C;{A|!;E^_NNab=Ul^?PKfHlKoZ4t5!v*7yX`+KL5o#dKlg z&za`m*>2^@5wB)DqV4+T0nDiO&Au#C!jdu}>ce(iN055VCm+~c%hif1vuGhaH~Wsp zN6epG^uir3CmEU5rUm1&GpkE0B!4X2`W*E_#3eGtgv3JeSx22nR8?7GuQ}Dsl{2)J zB|9Z$s}}o553_pfL+e)zd9L=f?fsfcU2+0Ao;=HIAs3ftCHyW+iv6jx9#!T-xlIbi z*vL!Qgj}sNqey{-U%X_q_(+CBtsdQ0cB?i(0i{#sL^0%LqY}oAmA0#Iq7|69K#wsIEz$ zJ@B!$6#-ISMcSM~-&ruRUYvhu1`+N!$j-L)#G`vc@y;(mj{J=9nN0uml$EXlWRVI{|Uw?WLqag{(q>0?M0S1c|qy zpo+TQqphRObah^y2GmhogvfqGO1uVPHG> z^Z;ya4nEmy1Bb2RBlfIuyg-d2+x66cFu+u?eMAK;pufnjftAkh(;gsp)8-PCi^F8I zxw=%dbSh92ep4^ab#LH-iA+yOO7D<7mzDX^P)E*fkm(xB=VnZL6GfQf~y?0+(Uh)%V@2b5u zmEJ50LM)Ueyn>Cg*{JL@0OGrN1%b~y-nqgci0^;1pI!m}9B+3&CvDknsQ8%kMmUr0 z)aVdsHq|TbK!sA-edc%jel9vbhA>jm%-}W1ysw6Gm^mws+}QSeHuI6c=52tcx^ZqU zZj$jwq5xEHyLJN2Z)*GO_|ex<6WbPo0*kKuqjUwBc))`P9Z)WvLEI?0E;!5hRl!Wk zm#ST@ZF@k(mhXdb(OIm)4o6W6d27>F*}_XyX6=?XF7R1japP>RV`amF2(6UpYE_(w zNJc%MMWt>wCgwZM(net@5Nc&j)JRVt6Sd168AFonS~{)L%?>doQx}1JuJ!2~s4W?G zeJkl1HOCTyOg7)(#IDxhuTDtPY|h1A5X_` z?S(6bLtH6^ky|U`7yze!oh37mEwbA=xp*+B*T>vfB5{f zT|VPPG2;X2_Cnl#fr?TfE;2*c-Hdz7_W4s#cCj0-AeEzL+~}?nU9RWf@>j;VgDCj0 zfZLng$WUWPz^*;UcFA>@*AAq;>PMxa{yV+BPUkAhN^=wG!u*bQfHLZC;{Pw6ZJ|wz z8%T?=NT5oU<89RUE_tL$o6Mc`V?niO{=;4RX6BAMJ+>rOU6?#O~|E)f*?EoK_C0_%I9!}EB%Go8DfbsN~N<*q5GGP(r24H8GniG|Jf z`+JKC_|k6RM9C`Xb-Vz`}xX9obBydQ)|SsO7|&yHuNSkbNVu%mhw zx^LgBo#Sxq@4Utn^&2&aXzWN(Tj(;VG(tuZX2o5u@X< zjS@h%K+Ri`g}}|XTj*Loz7Pp4Cj0rFU;@F3z#TqZrk%xKPbF=0Y>$IY5jW$}G+f6Q z@m_{MB}su83PfMwy~q-`pBw^^OSxv?9cIv#Dp8FYnKR*m_?Bxt`N=z*f1Hcqn+)%gm^tOx^mgf@3V0*6Pw&j z2va(T2evg!qa(DEq6c4^C#td3-Q04+~Zi_ z8nZ^9l8MaV@Gd9XeRNa>a<+8UiJL&4$<|k`{`pSu7b&6b=VE`xIFQs8H*8zbuo~BI z%<#iC==FfW`k=PydmX*elhYY_@!)A%oS=bLxvs4B&rJ~7Q8gi_%~Di)kFF2wx3*?& z^6Ncf&}>oMu15VWWeAcF+$84S{6l(*ULss~G$&mgUD~{o`0Y(=Im0H;N25+ux{H@- zLoSZAJg4^~Ixj$Z$7}DNd7{Ay8n2!hAVnQ+yLOTckK?DI7(6nmPOr_3~s4r*wE&$;fl9%twQ* z>2Npgyr2NFTuDDjdD+>C8kxEe%SKTHOd0ef7cI8A24yJSDdBon8TsFX)&^vSh zx&@Fd^0gY#>XvP3+AtJ0$~IYyU_&Dx%oA}rz2|gcZMs)d{gF7I!*qGm?gQ!j%9WV_ zatxn@!jB3hpgY)|q#qw?y%LVpLn`8M_sIrMm}(oBn(cP;D8>(N={$EyS$!SVOS(_C zj52?6RZJH5>=SS9+6M&ZRM287<0|<;46fie?3!O$`zE8{Stsf&`Zi-{7Mw3bcN?vi zqs_?pX8MRE8#AbzRZpb z0T@W9V6qFtq`gCGVRFThwtt38$aon6)0&)OGkb4`Cq?o8pklr#GD0n!A)!EK@K<3S z+AK+aTR(GwNDQVtBkIEwt=3(Q)mc+=g=QK%3qOA=<@?|N;UE9o-~HoX{WXip1))e# zEzDXMu!mF%p_=lSP7%m`d{D87_JSrXv}=JsIsV<;Go0Up0+J2vZ_~K`f!n8Sh;5Ak zEwx4#jpAL1)B0c_B7(nk3hVqR!ndd=Y zLLcP36j$1ydzBQ+crh7tqQ|4?V?C-q3ls}ye6NMXL2=1`NJ-W0uZ)7kJh)l6a_fVN zrYwwaL8%_CEd6Dt!eCj*Y?Jv)X7Z7S=uhlrv+08A=KgagCAOr^3SBFwE7AOwg9vsc zB@K-A4{PZBMCF_KfcBfIw9mnc8D+8Xzy+A>$)cG#L-mrqse12%V8m65-(}8)h@jK= zGuYFYH{0jGGT@l)JkEl}$I;z>z!a{W+iuTn&Oq8mh)B)q5mcT3l_ETkV}d-Hv_{#Kh-ti7L%V`P976oU zwR~abTZ?B654Im5gz{c%atwM7aX8NULYp&&G{OdjT{c5MJv>P=0X1(}Ee@yqtBCd{ zWPoqaTfC^D2}2had5hpC2NdxyD8Ob@M~$HpJzj zOSb)@Ht9S&klaLame6suwYE@^$Vl4mMiZA||A9Ex4;`CK@$f%oYVFbB$kPnwJ~J?- z^wowF2V{)_NcdhCB69@GtHPmpyKGkH$j=9NS;NH0 zvxFk!X4{wXaY=muL2IMKl z?b*JS!EarTnT80tSZ++yv#OG3NSK-Xw{z}D>+93ZzikRDt!5g$QzCmjaYa5vY&tt7 z;Fmwj-slLVFm=AzYLIM?Y`;b!c2aZWpQ&SHUc~N?VPOgl`k{~@@pXZhB`=7tY|n?n zX3^0)VLDgh!4?ar&k7~>`m52}i+z0eQ8qUNC~zk9Y{yqXigL1ru?v%Qay(u4Wvk}} zGQ)=PwJdaC9&8j~`>OYZ=dwq@ND_M#xZEAhCP8pCkVEAM1u#jU^h=@Rj-8MsGn2Y* zZ7W&6w^x8Lt@$oZa2pDAqKus!Htv0B>xnBLj&o;@jQM6{J;WaD-BBe#4DD2m0bjA3 zm#$E3FpLMc0MA32h9dPM=b>wpk~};G;R@&V@T+G>tt%I7Kt*dp#`{ zq!$V9QKH%jr^>yVU)1T(0u$OgX??0-^=+nQT)ny6*)FX8@SA!9#G%C8AtHdRamRZL zEJO-J=Q>TdUpWW`CUg5KMBjp&xR^qAJh~Iqf6iV(3~!?YQkc~Tzu`b%^?r*EGpe`a zW?DDVhFz{m@9SuK@xW%gdDefL+S)KsX0P0Qjgg#f-Gp9cPrf;8Fz3GoM059_7Cvys zqUMUy8T<`*3+qGkvhqvA+o#!}=1#i++L%IB`!Z&dH$5+@*$&f>1%6Cvna7MkU8rIu zc0GY$PT=9G&1A<*o5uSSs zlq%S+^&# zvs+b6W8yop%ztd+)Y+7I3|UG!9@wmZc{><^%{|ALFs5UJ5nrV(0nBHNnDLRY2C*Hzh8ZKa!+%ZK+?ThlIM~@jINH=UX`^0sn*nCteN1 zbpek8>2ZekNQG^f<@CG4$V}$d@vg=`C0%jDcxyX~{^)M4FfU#Vy9|C_>uDncNIKx) zJAF~L2QNsqMJ8CoCvZuJqk4Oc76r&nm*_ZI&dCrl^l1;_ghy@xcmOn)G5?3Tmh~^U| zugvlD9`gR_bg3@fjGLY22`F!Gk)S|!?&=(9MUqj*P;f?V78)KGOUgW_A2(!4JE7Ka zJw1I3Nktfzb=zxpT!?CKOpe8t1eeogaz{hJ>)rWi>643zKuFfKdl}W%W-pXyvj{Hj ziOBvo8Q(?^Sa+g16E})L8EI!<+J)Y$r!TJ-lH(huF~pD3xq-UPb`WeMw%DJu(h436BQ``@B%r&^p z>_41;_A9F4qlQv8GkYt0IP0g>G#K8CDdATsALm>p+h9h`J0ZqK(C9=hD+1_FR<-a8+u5D(01ceBel6KP94ZScs3I1o_XI zCR%^N!d?zT@;)_+pFCoIf$5zBU|X`io5QdthU)467y z<#5zrEI2)6;M16%?IM0Da?4v^u+OwG`uUTk+qgI%$lU}HQiHEg6=t-sj~|o?7a(DB z*TzcV%M;jYn}pkxb<^CF5J*N_AC;G)T`bBd|&?0!>Yqk#mANd~Y&YNv~Ql?tx@ z@gO-Z=$JoJ<#g%oTwx`olH#o%aYh*btoT@qPSASmF)1W2X1uid^@8fd%bQCv?(KWI z(@ag99zHD+%f4R0LF6*rR>nJ@rUOUn4aoha&*5Is_x5E3;1-IS^FQ3qxk+V*3!8sF zo}ko%eo?wfON-NE%Aep8l@N@~%4#TO+AP|dHVdF+sM{Q_{K$8~?>(S+3=<=YO%x2K zh52-E)>GtOXx4|Rm@9ZM_^X9=wPWreiy^-)QZtV=#v3wjf(~OQz@4TXv*M8ksTv+V zDUF48-u13g@kx=vA{1QIX`lxT3`5R$X5&0}uFzE@ALLJ5aX7>GP0tpS#sg9}yadua z7z&qGkWsQrcsI!XX+AX+?VY(<7$W;YQ1Ebi`Vk6<66OKIk;mAa1WDZ5H5Rf3ypoh{ zROREvJ7?Gg15}-SrZc6HJRy+u3U(WOr<{jEW;1!HIh@w-pxel5MO4_Et!TDZk`7@b z?RnNkOE_PoPD=G;@jg5GodO4oAHTA`AW>+S6DVPO#mlo(~q_r2Z+{W-S%2v2IB z!+A*xjA*^1n~}#mi*yI>^vf%%X#xVbuBJQJPEgdA6@txF#f@eJqoHmSWZg&mL3dR% z#9OMkmg@c(2a_-a&ZpnYO}#eUAqmFxqp(i*xZK-FrY-|`0xX~sb;<%dA@0>K%k zU;eU56m$KT`n86qcIHqP4?dW83}z%NG-JZ9cYLl=E8%a#s3A&pEdy5Z`#oAzF zo>tds==dv=-04@-v+DHV34Rnia*-Qn%Tvf9gJUd{qEJ(Uwnzp|BQkaz+5t)egb>&t zEvK(BTjM9lnPW4`s&bld5hc@5OC6oqvjcbhWWm}MQOx6b!RZk-W8<}VB*qI3V(K0s zv<;~4vV?Ixn`cv~TGdd4hKG$N;uu3-aePAF!{b0Bu3gm)KEVvinkos2-X0}UNk)>l zU6_IMW2E?gLHJ~S73z)X0D2@|T@Jz9L2dc?1N^MwnP3t`zJyYnnU$%*4e%W<;|PC@mD(3Yq?`=`OZO_qZr%K?v*E8HSE`P~n{P@SzMV63eA4%&78eR6WLd?g!J`9i@4{GWF#2 zV}1r;BVI_zOeRkE@Io0b1qh|EK+5>pp8Gl4oiqm7FM+8p zy^}wPUVI;=GUx_#2VlB3d$VLz@V#Lc>}Hl+hno9>ge$bI0FKhQ^{u~z$TS+wi7s5| zwcs9nQjRQsv3UZv-*~MnSD z3bhB^I5UkC&tH4e#+%a2OJu&?tb`Cy&Hbd>@m*4ce=kLCj?>-VbiSw?Qxe$DrbKIU z*bkBT)B-n#RPlG!2gEp85>Kq(dBCA(Yma={3YejVfbq{zZw(p54~h1tz38iCA^=-6T`~O6Kb3EZH*D ze8An-NT%>`gF?Ae!;W=jUWbF%N#+X<-Lo4;~QJw$W;)zpgGu z+lNu(&c1Z{Yg?WKIRLs(^#u@&jStXCTii&BcM`!%x=Z+E{}f^~ZZwkNE~abo4sKpf zdJg~dd=|eR+s7m8I^<^nb}heQB*~nIbyNUv0;pSdU(D->mMRhua@EyA%VMPgB)zd?AKXT_r>9F+@jvn0iG4z>lsS0bR+JtbqzC5Yyg?5m>$=0Z z?VQ?&#Ksw1O0p285-O{Q5#)2`#@BMu1h+6}85RgOPfScF0km8dQr@%WUaqE&&mT-G zHDr6hjBs%ziX60;6F>R+K2#zXlezctvm`p)`|H0No;D3+wtp)XF>N~(|X_MUbm-A3qEgsnD@C$vjYU| znP(dm6wt>jswbmv_LMS782WSr}Nk8S;;<8 zZAo{9!?xF=r<-)cyz%Yi>?)~Oz!7F^@NpSG+3BHM%mU%%3wy=8dc9d%Ao!& zew&{m2ge|ugGfC@KL3<)H|7C3-eJXrk7wjQh>mOBPPZni(F?|g(n+g^CeA8>WEuYd z8zLf$1;|ddA0Lz*6q-f52+dfeRtNxOg}DK&;d;>Vbeg`N;{h{&-V@qVetL%@+O&Bc z#uibA4Xkb7ja`l8bno^j98~wI;OlrELXgYrWL>4+(()ugXp$VYP$VLAc!`(5GZ5c` zgwI(?OEOVIt!G#2&{e9Q=(Ny;-a#dZ8gB)t0i8WKyab5l*^#;sN)jCiR^oZ>%;Oz& zC$8^BA8(9?Ebe%v(P;kWQ@G@kSs3zsh0zADYU>Kb3EQCJMsLN#1+oWXY9}LAo^wh# z9QcIq8P6!YT6K}P9)wyi&^S300w#<|oE{1Q zFi6@K^f(KXz>1@sN-}Cm+d19bC!%V}sdWG#1;kL)A@5*)dip!KbM1k&eb zGd-vKeEK0+nUF6^Z)>f{NK?4#Rw!mHj?sdhS^ZVXQ-xW&C*Pw+b#5<^2vVjbNJqT%_n(@m`QrOpKViPRhJxNdRar4=5h0Ot; z`@wx;?ozFrY@%y3onKMe%{6^s#y+6AJ?z@>+AX2IX|I>uIGa4`pRF7Fr(Ghh5Q|a9 zOq(9=rCp>Ypb!DIIIzk_Yh|_IB)vOZ#E@;u9zQ;K@n#xQf!GqzTZ^}j-1lcNYC9F4 z%N&OmAeJ~e3$0v>Z4^#FR_*hpn%m;r^nA-cD(NUEinY@(LTYzBL>KnjQrvvjsdO{Z zNv#~b&9|$lHNeBZaWS$9#^+20Vkls0Sf00!W4+(UP-3n; ziSHv`zJ{#HVZohcn}MUtFje52Ki?+Ja&n+{SV(i?SCqSsUjWCLHn);h^arFBvymOJ zEgg~h-Ff*3B-6h|!NfKhwgD+C@8Qv)8D<*ti<`$F*+)Es9`zJ_E-$ucN|8{5-_uC#8bj*mSQ1j*{W2f&g=5 zk^vR3>B5IQL_7ceC>h`2Hg+5F{*E+OzU4x+$MQn)+j2Yt!wW>)!C%TbztoHt2`ma0 ziL4x8B>AYD!LgZ-8OS9cCVX^vj$>>YZb66Hv06Jf@vbv&3mcmY>HhxTW-;C0{{4UW zFaPp)|NKAw%YXZ)zxp@-@E`xzzxuEL@SpzSKmX0Y{L|n5%|HCdzxiMO>aPJk7_20B zC;#q${`-IXmutuIG6*_x`TJ9+!W`W}Mw?Xn0iP2sHKNg@!fKa?{9bXE_x_dfG3Vu~ z86p7_qSF8DSLzH6l8R3s=Bv--NSQ^C3k50PI3O?!7NW*|wApf7Nq~WVn0B_J=7$dR z`)pUz)r+`Nk2(}dxZ5VgsDK>!N#8GxuJcDK*~|eTw7vEfS|Du+F=OT!8!{9??eCUt z>{+don1`lBB9%f9XP%{Z%zF_FDyUBFuQgXDE+ah>_DCUA8Mdq-SnDoEtL1o^Jv+;f z$xVNH`Ub6u!&)Rkbr#(eUWwWgrN-@rEE2gTfVlvRhA_GOt(%n%#hCiLY{5P}b>D`> zd@iSCU!J)@ES<>?CdTo_4{b|jFoN2gT07O+6Th$8M^or4Brxs!v&-mgK1*l0B5YvF zkNQLVYd%+oBB>3pJzae{uC6JpQzFhg#La=&DftGVcAL_feW23as_A%V=og$7)JiJ8 zQ|(MN#QQtoVuolXdR~xcZtS@KtYSK(Zl0pmVRZ6>?O%7h+cPilD{H^D`%- zp(L;?%c5r?drfS3hsuOxx!=1{2MB7a_S!AulY1dvKxcp8B5V5g| z{jlj7X>Rbsnx^e1Wu%jK0W5XRBhTTKO14LOBqc_utli$mL0~^~R{jXwMdnp?G-WN! zRsan(SBdXkV(n+WmCY&2y_nrliP;<3Y`#&rgUKbZ|cvD?Q3e&Rzu}CkD>PbIX0)T1|my1k;Q0mDIH}5zpR*Rlw4!`VVD%V z*bbKFwZ{nps&+Xk!vHB!yF!t@M3uooH3sQdMmenv-j6w7sgZo{DlRv$Oh%h*b8D*L zs}hfGI?ByPtp~uskW9Xc+AWuZF#ilqHy|lSZDMr}CAn-OVe2uQpUF%`H$8}EEY?8W ziHsAdD!)d@+R@NFc)KI2xo8Qb3gQw${6M!a<_WcZ$7_pV!_uq2e=-MvCax|{XBA~U zmDKOe-ab!)CD0#Y6Tf-$FbqKgRX)s7CK$kGAgOiVqE!eOgj^Hv=ZfjmI;(g+8D!Qn zzUd$dLyP|bzG!5YA$mCHfPfv+yhC`UV6ZyirsD@|Vlb?ND-0~$>Pigp_^$McK^-GT zvF>J6*!#@XXPq1a{6J)PTk6?)eC@wqGR<<0+%M~5@zQ$6ty!Ex#kmO2jdUw^V<9rc z-OkmcRs*YeC!<+!ek9Fya@hC5%<03#=D!}ED%P@3yxNd}qD@_ePwD)7y3on`l?p;a zYHJXuIdvol`-Yjn^Jb1#tIvgcwUD0*U&T+M|Z{J)sw(X+~5PC|!- z&7Hl4bh5_QC7+C}uNE~77SY&W?Vl)Qbq<}Cr~4ik*W<@q0F8fP;P<&{j;EN?!L~#ec9D)AmSQKQXow(G*AZ zV|z>)sz5Z2cy@h->5K7?3#ll?RgSEr>ji-BtgDc4wt`u^0Gf4FNI#Apb$EChb?qsR zEh>*ItRRt%(VSCPd*?Cn`(|2(QeE`E2O04v9YLZZjrz&-$w9R2HKR5pn8?qGr=#CaIAs3X$_=cZG*4OV!;U4W@$GKfR`8 zxM3f8i<${$IV_;T#`1I%G634-&EvqWW~zR;+u5S)lkC#%4NP zP|4aSKT{J*Gv@7ayaEcJ^lFjog4M|5RnGs0y?y?i0wUuH8VAdLtsO7{QY=7aLx_)> z??2*H-+Z+=9ydvuOw_5i4>**mU zo6;bha>^|e#dGKI-j9;9<{rb@<1{*mEKgUIA;(poFSsPpNF8=L&1amySC5`3*1UWX zue4;%J~O?T86J%R0i>T-PD9Be6giQ+ACPBT=os7cVZf0;K=0JWI6Xa&4{F@927vF? zhxuAWT>1FnUOD|tWg}_tm|Ge+45oXx!j^(gH>+d7-_HsWxZ5H9iv>u@roH~>@H`nj z!+tJTY;!^RqI`orP)he~oE2H7#j)?)8qZ3Bs9P6FC$~|lJJVUCA=gjEjuaTUf4Yg8 z;*Gs1?2Byp=QdyBLmcSkdwepv!RYPm+lStjkvN3QV7vO;wQVfl#O&Jh)Aw`Ov2KOnPT}1T)q6X89om4(UB8AP=m5F^{E!sux}Q2A%NQN(n5G*@mAH%GQj+40l)>+q9g zFi}ERs$!l1QV><0!|>M6qQg}>I}S67w|cWbbstquR@oAP@qC$}t0((l*!hAWlA|2| z?Rs47IO1Wsf~v5J8y0>20w1?~Q(7IHu1w@h3MLOaQZR^*hXpW{(Kk{j^Z>yPfPtg=2esaOf1-!BRN3 zSZ=!WhE^*?uq$fU49^l(Z=#YTgZ;0$CylCycDC@>8Tik_po?ar_B&!ngFXXdA_m0wG^2(G~(Eo>BC$!UdI@^9C_38T5)wd$@4SX zIM0vcLLDjWP9Ixs4#&U_sAFC0*Xl^%@w8I`<1S4tx~sEt$Yfsfpy8kCLSxq9&w@m< z0@IPcJu7biac{V*ym#@#ub}=R_8qiVI=``Q+uPOb42!jBZBdXH*)A9*iF9$jGvi;1 zi#P64nN2>tj1Ldo*|7+_yl)%d%naJdZ+=9hd6=O3aSEghsW4e3hN{&78ww}Dn*Sts z{vgxz`Tmi6O5Eh`=yOo<+!+-C)GCaaEc*sb0f%Sc5`yYW=2o?jgyT`Kg|=)b*v=JW zk^Omk*BvIHG%ChB*LbMm9@zWO@6g@XSpEEHCiNQ|kR*t<*$`bq!$gF4+UQY8cxdUb zxG0&0vE2`L@(t&Ky&I!pe$jgeGCSrW@Pu+9Py{~xV8V!0n0B9QyTFxnhD0c|V?ZsJ zqYqA%gJm^WC#54jrj78IO3+Y$XgL6m2^-jl_iI~vQ14x^c%>cH*-*{mf%{!^^T^=a zIY|ah2ATToJX;ggoDbL2Wn@Z32`zki-nb=q%;lUz6*pNPr8|6&14`0Uz!P^q*_~c) zOJ2`&8{>5~wEs?9g6h>2FGW4$op(isueiFyE{;rnuil{6p z5MqHBp25krQNwQd_!wWz;STNRYoln>yOO*)nKhJpbr^OzoIOYj?;?-n0x z98`Cl9l(qll~K>8o0mzKJh|DaqPvxFq-2PZ72SOQ%Cw2ZgCHD4(rkVXu5`R@h`vr@lVl7 zg$^Iih@Khms!i>~c)|MI1_bIM%@JBk*{iRFTg07w9QKWJrZ#L={ z)Ao6^R^=3`0;vQdzp}-_ZY?umcPbeb&83e}vyI zoisvx*$K+qe>Ov#?0wjnhQ+7cfLEP%KhhU4PTMn5lwxIuq!e6984kP8u1%H~yVWEU z$P!@-_D>5pvs{RaR*bf=BA?+n%crm>a)KAC8`!Ev+|P+jVmHbbHlRU*T}6!&8#PyC zc-TSMG~9@~AB>z{iPS|Dt|L+HHShkZ62DZ#@!(as1jO22A|htYWkgytHud9rbYda$ z0AbnjGyJ0srh>Rz#;=h5OP(wo?8eV@-`1A!*_*ddlHtrFoBE@H?Kw!yF;5*YKicifFWls+vE2BFZw;&k)ELXhZeFL_vwk8#52 z6uY#S9qCRw|NO@UItB0NfdR%#BdcrZ2PyM}wiRp<>tY+%0mZ>;MH_8Qa=x{YxRMG+ ze7KgDYtd?-uV8W71jr|9yeabzU?pvHGGq;_g9G4D>{^tdj)NMAG3hQLk-fj?TX7qp zESmh~s6+%Iu}1cDK%wmRPL@#m9InNuIHBg7CR=_j;9BN2*t1xa#`Tpnch$=MJMauO zRpkU1f~2C97rp|id*LuG%)=L;c{n}dR2>EQG%EmAK&rn}(C!foUjhHL(1_=s6=#BP zY=^Q>LGwj~e2jl$WNMnuY}D!5d8Wm-eV}DkzsXM)ELK(8=bxj=OFZY=+5Tm5WYLR@ zZ)6e;x_5ZnnYvJrXaFX~+_=l_=>0(|eijdtu;)TIj9N+luj=F;*VE2JApI2@FnZsz zRS3nvk~!8xXNuxhA-fG{y}b*XY7xL6WrV(C5`%%7w65RA?Fqsv^@um$op~tJ<_16F z{1w34^T+XP8D*NS^Sr#WpQQOQJzGdYg0kqgEqkQ^jklK23eT5WJB!cTw(^4x6kt-# zBV;&N>zIY+hnV}+Vk!N#92Yy_iDP;*8ZDr>LAG=lxM~&np2LgJeod8lJlXjj0%2SE z9hg6dALwJ6g{=M|&HR)YxcBX?T2p5|jk)GPl1C`Q2sPRWYNS-ydDU+#j z=JnxWxt3OlCS;$C2*1i*=rhjsL+Jo@h96D8Wc&S%?mJJgRMk)7=7}Bt(y##}wy`rc zd$HRf_3bR@|Hm*@7b1pp`MFN-H`uEMpCU&a?w`#5UUjK#*bOL7oJoDyCNw#<)hX#? z>0AZSQd}q`+iN&2+fx;N`x&T*Oo&)HUc13o#AO{9uF~H1SH>6SJRR%nX}A83iLbI@ zGg06YyH(#r`>!Ca+wBBtasQrK7mu@)hZJW=VW>S`6w=AUWx7Y=p*BfEe_@6aky%<8 z$E!tUS8U|f-)pN}KAx!krl(K}aYF4(UnImYpi3xrFgHd8@#>w$)+~akU^+H1T*- zN3UtKjeVlqu+S19lGR>xfqpi#*@!jF@jh5g%SSAxtVoI}?Lw>!`9}4p*`swg1(W^C zbuhvKk}q;_4NfRDk`?3Sjp%X9^^*rhu!(WxnJhg*?^gRr`Kzcrh$jW$hKG$%)cy4Z zd7CRuP+(yovqPU0V*|B{sog7@kbH*+`;o+_#tY7-SqzMCNc;*XO)={5&2;MkfUrs}UR#7UUd!pvU-Y2_&co2} z!Xv#Etx;CrHMrw5Eu61kTLI0pzuLj4+;w`s47wUgw}W+E%>+yvi&9Ce6ySr?n@8g^)9M_ymF{AmVwhV)+jFF= zm(hG9Acq{0+`7S;*$euoU)YlwV~v6?j<}*cbujl7ZLrOSTwoYgX_c~cqLbt52L-&f zof(&|gUpKOY+uBFfv4bW^^QkT)z4iA1hbED#zv$%i_g09T~h6*j~L|N?t$!mNb}h) zgh$B8P&|-t?+YMkOU5e^oc4Bgvhi+Vq6VwNy+bM>%<9`6PC#CuQiTnBYd=4EU@hmz zX5Ru)=8ts^NBN>ZJzFHwk=A?rzQIyv9jUFXW}SI&oyRL@l{UHDKn%>ncuJLXy2 z$LrkTyoZ!(D^JJ>RP-Y<7A+l;_B{HOmO+rGttJvdO3mIkkP)UufkC$*ZESY5` z3zB{@-d;*ZP24jvo#6my)FtuL=kP5mkQsCS1?>U-lg|lz5(rjupD;^FguhDmb9zHU zF^K{?gnFoKf4KS2aRZIJgH4cjRjzCVq<;`tZo|P@x2@}`>Jm2Wt{q5*#C(T|%L!b~ zS!jjV^nC(29hD$CrF#$~lJDay6VWE^1r)rnh$MXV_K3OH9MFrnKrz%7sj6e_u{U4H zVrdo#cB2)tvVMo%r`>r}*h5$IHMDa+-#^$u=}ciRg9rUw+&NPo4y8miOMwBn*=EfK zcfJa$+~0>|bXL^&mE2By{q$v(opbC=J}U+1NB>kb#JRD70OX?1mZ#*YA6M^&j9ue96hBTi86Pcnou>Y&11AilzP*B zN*{%MO~07d&g0#cq}kNcMt{-PO0>EVHOHRFBa@?(Uo(ymr7IeTvihNu)BEVXh`>}K zEQog>;yH5|kTRPV*8SCh7>?{Gn=QwetF{io+f!Zcb8OqLKMH;=pzr{g&cNV$A0OJGJR6=g@@HZc9* z^egvk>B77Jb2tvK_y^DrPEN}l2Cxc(BHRoh$M^7if}KHbuvP zacm~<9yE9zQ)w4k+eMs0YFhVBgF4;)8WL4z!0Y!(rn9T%fV6yWi-cqo|u0Oa_5et*Y87Tf-WZN6d>CsC=* zjkK4k@9;}FOGUeZeNo(sEf@Z_>^YduYKT6r04#~?*V9eR2i${MFd%{}e83t9ZBb7| z2g!AnY_W^f(%S;TVhPz%qEk^n0F!L{>?bWjt*37Lyr;ok=`JQ`armpPdT9i@S&#q{ zx?ieMd&jICYC5%Qyg5OO9haj)-l#d+g;&UMBqqi^lj8RKyX8H*!C;hjK>WHu&kWDeF8EEF~TqQ zym{Dy6!>ybHhTHR96`{Z48(Rj}#%*U8(g zOhOd_5!dQeWL2ZhXGI%N0U?3QA7B3T&AN|KvzH9F1dU54M`%4U>s?uzKC$LreNJl? zn_!-iuuW}#5dp$-)1v^i^%6x)wRsioY?)`u2d>(yd@RTqz%Ro;v1#0Ot!xURyX-cw z1ItOk6(JO~>gXx4=weP%afAXenf+`^pC+9nUlQf9vl|=4TV1!V7C5)|-H6%xovdXs zOL<1z!k2>6eiyP0Z`sDg%)SrE7L1$ym#?7YG>*({xb=qeoY{vJm_D(Jlfge+C|$51 zop3lVL+$l>8V0Gb`|X9K6RX(hj4frCc(2$c@~#e^3oJFaYBD?ylnWda~? ziP|kj&88sbzq^)&fK7&1$?zdwsi0%6VH*lI*>s_j3=gP9w4An|1hUGn^q+Zk2fg2i zvOIPZGoc!7h(+}kf92Z|dh9w~c%AS_iAi1O1KPA%FSa zNP2PbPgH^lrFs_|W}Afzkhtc`3X)?~JMh{(`+Q&v_Gn~QDM77mv#l9SEk#%6d$?cY&nWHG5z(%Z<)msGNKKs%qv z8Rr9D`uHKJNTaI1~ms4xmoO6m6}Cd3YrjxK<7 z3~O)+!ZyFI3+CJ~VoH++K0EcP>Yt=Jx%E;DMIe|FwUBL7E^VD_S; zvdd6;m~S`#F;Uq_df0h$n$ZqHR$Qs?(7~fTys+iLgN3f1cBo(KXyUcXCCy%-#q6g0Ha%cuEuM6&wzI4+`Q*rS( z4~iggeuJK>c9UMz%bW3j20#U+98lHu(VW5myh+{K`_@om5QXr$S%>! zFoArFC>+>Bp>V)bo##K%l!-_I{^5HG*wofOTA!bKp zZK7~ft>O_%&jRgxX@enQys`v}rX7kpWDkhY<70wgpIt((PQkqfZk~lI)mx=uMa2Y6 zY@OWk7A#Qe0K>w{AUuT4M}-@}C{+r1_Y5kk6~YTJjfY@Mf4o(}F>JNw#-JGs0^7?G z2vCaA%FyN>5WIFv?bqbt=T#8f5#W@(s{j{z;XN&%wIgcG`7hL7dYv|6*C$5#y`&P^b-k4qYEt zStBZ2!##jeZLFfZ(cXBa0N693q3QPRbZO1;5w;Ly+4y!m^_P1i7&OY3%&>@PQK<>2 zEUy5$tl?q$widlHhg`aks?WbJaOkh|Pc+fX$}Nce5lkYu9P{BFY<$}BQCGSu+F|mA zl=sGjl$0aaNHl50bJ$)#N9NcxbxT3)lVQS%a`l)4%yFRsT2$#o&tgWcZOQYQ={Avi zKJDEi6<@wlZZIo59!630{8@%@#JQd+N&puB}TGJhK~08tm^ z5Aaaj&cT;c1YP_{F5a^WW(|R=#1CvC|Db?03qM}BjSMG$9LhS0;nDkXR@bDTk+!cz z+YJui3L%l*#`L0_R4^dv%ZYOUxiXV$F#>P2?mQ+UibX}^q4n!KRX#_E;_1a}TqJc= zj$#sjq7$33jZ?%+%?K7^R4syAMs{nZq$YwSQ-q3kn*_7uQb{UWEj+^LG1aM*Cej_{ zSMLP1_ujY*wJ^Gub$&WHtnrqf;x#$3GUbF3o-lJBFHhj9R+e2D%r=O(4mLGcjsXZL zUKynG?_oQ@1QuH~3w+V;W3;~N(>1T+TpCK*1@>ex2rYiWfT(X#3GD#kVUWJ~*}qI4 z3H+qRh#rrK0AI9i!ku~B3g0qGFdBiGdKNE7GN~GyKnMB;f1z! zu(BLoFhHRH5ET#X#?r~^)aDQC1+Y~4SM!V5Uc9zMBF2I`g8_ap&uwyJABB+4Vow%K zn-Y4h=-9Fz6NA7uVi{}qk=YBJ+iWttd^c}3#M~ReI}XlJhO}h zd(sZXC%g~t`8avr(srrI2^0|F*5+E+t|Y5#=9IR1yd( zc-U9gW|-FR5Z;zvqszUl(G292I-!<{9DB1o_FUpB0A}#xh;o?g=t|x>N!#p<3sn`G zEWJ<{w#VGo&U=eHVMmPmw!#9}m-uI819Z<~%~t+jWRs|e7A)$-h^Z%D$mtAXfhKz_ zw?*4Ez5;o$(fA6*VjeKvm`v^MnCYN8Gtz*?g{Hm-YEFY$h0$}j2HIP6M@i%Ah=y< z=vS(G!})v%E3~i5s@aE{hhy&zxSgkLj#fgodX$ZMUCMKw{h(x;-l+#QAM0R(etAV0 znElG7+&dk6zqv)XErdp14P6x(%(wT3v|2%)wQ=me^zgz<>X=>d3S4Y>QkoWy-NKA( z-*&^nCa@eGfs|I0<2F9DJb(|Q!*Me?en1)eka8&;y3hADpQvUeZ6ukZmq4Rp6D3$& zl0j+z2S4TCm&drijh}M;=%4HkL!ycEltAOt)@K%ANE= z$LhGWP(ow!Ly^LcF&7tAHXGjNkfrR)VQi<=xLi*)2h> zp+fL3rg5tN}uiTM?glPaRjfME_%~zs;kqpF~NVK#NjeOlvX3Uqr zGYMU-+omHLJN(?j3hsk=?`WAA2cftxp?7li4zY#C6~w~kFl#ptCf#hB5PWM@|SP1Htn$>>d$UnUJT> z8ES}O=i*{X7LVh(3XA*ouh1%}G-i%e-U57!6d37LEKWomF_}k(uy<_^Iabr#8z488 z8wXGwjF4eqp&SNtuJ7b@qusR9i8hKvahE062QLMi@-C>hMuX|zo0^DV3YeWk236RD z@d1USTDF{LQHj>CEt&RBKFLN)MG?f}91<6c>lh6>DqqU0Pv*UFDch2zvLyuQ&i3Fm z>Q<+FwX_HDlC&f}%Ll+!Q{KB@G_xu$SjAjf0KkX=2q@Vx2ykc>FSN?oM{*m~xXB57 zEl8pM>tz&3zdL_+oU!qQy(uc+g?s|sfa7Pg2I=bfEAaNxLk_JQ-Y7%pb%5Jzi|g_3Rq(jHFUJNpqme-f(`Wu1?_!(1aP0QsP{aOE^}#-F?TJuDg0VQt z*&IO2ru&;xtVByJK+yoZMh)9H&oR@Kkt(z5l4TU8CSA%-IAnRW0>5|Lj;9>_>UPYB@f?cM-49ruZ=&4 zE#JW_R9mrOEInu2U&pDFv+jc|&3h3%H-aEd{qNt}M%wG&kO2nd$9X_)|982QtfFSuF`Uy&+}u zHa|emlD!m17uYjq-}@`zKVfh0j-}xZ*XyGmHODH`Om{kH5wb|x%iNHzghhR*r0o{v z?H6a+{*^`hObZ2dth*dFYHE8jWsb#FBI0T-y56-#r!(s&le-6WAC#^gpS*rfN3P&9 zSBhAx*T^aTcun7xGVQu)yPH&OQS1{}aQ7qQ_pfj1#RQ@4V#!_3iP^a#%$4mMi+e$U z#%Zz1$Sp-P78~!RctsEKk@QrH`BX8g<(O+5iunD;0XC^AxQ|-5wv&7g{nerNs}$PX zFhJXU^CTh|vP~nv%!LHcLER63L`XrQ(#5IYGs+@{Dat*=6P(PuCL{TQy%AwpM<03C zfDS}V)&Zc@Bgh#)CV4SUHX+GJ@auBy(W(X4X3m*%GfRK?Kk5$1-7{B0ZkL1gGWw-> z`)0acF;8K-0RU0*^nvuxXyAD!tn58VB6c4|(BjSav~wKWF_hyTPjMlw300+lFxr!8 zpB7xs9_UCgitZ~}9)r=c=OAKsSIYbZw}n100%#;+>o-Yr+acJk{p7jI&fmJiyRcSt zV=8L{2qRFEzk=g1;K}9#LM}F1(LpY00e#CDWg~_?TxO|SwU^75^L~1@V3UDR8rDUr zxD7OYtA-8_{t3sF_tMF#?L2~v#Ye^D4k;h=#Q)uY{V)IFA2V3M|Mq|WKmYje|KUIV z?|=7y|I5Gs&;Rtd|HohbwS;uwE`mt%nhB@}zRvTwIgyqvTe7|9NK8IXe#ufk=#K|? zQUbsRN5}q49XgF|_Gm78+pE0;MYwYEowep6s+Ad7-NsLQ(~rHhxG(u?^cn!3K?i^^ zW={R8q*Nr=hqeU^Imd17COW@wwT+J7t(gXUNpm$oiFQCpz>+IOvgN$xEw+<*1ap0O z;j%>*pv`QDpg|3sP3|aXKZ7G6Rg%j>T)oJ*Igm(Uk#?cvY&NPsXDts<%<>SU8X%p{ zn*?uadA2OK%(E({-81`q1;Ps23lyp4@M z1?54Z6M-~1IhO}Y=fqjT!ow9=eaL#LIzJgM%`GWiWk%jp4azHe0>R=D_QGgSnVFA| zc5=T4Je4$YePMh{R($2?Q{u{pz*ia2{lP&*3zMu_!=CqnKs8^4S+`D;ChR#bY$^Wo z7eP-cWP_m|>e=Jnxc8wM{{I2TQvSPt{J;L`zyH5C^8T6F8qR16ZRc58!j}JWq+#U& z<$s?2C`|smA+X`X%We9P{!RGRzx?yx{j>k**K16g`D^44*7=0E!Om#Lx$%%Ycm>Va zD%+B)9N4kOgHQS9(dS@2J!Oy7G6Hc=hGmjb0!sKE`c#=-biF+T*WX8 zjk{_-;~qp;MR{DllSFdP13Cz?J7&Nn&8YBo>ml^;MOqR?O!*u1D z9e0#@+REu^;r#BL4^?ajGU|DUlp+ih*_vcq1*s9YyDY}i-j0^(=z zU66}HQjU$dgIxiPT#=F}k(8)jq9m&CTaxP86R1bY)@pdASI8V=%=K|eI{QBb5C{8E z?h*UN~CiUg4f z_@Wsu@)sOdlshY&#>!e;D#tU7c)CEXfYD4t{k`G)Son};V^hS>;m2U0XR4_xLG4fq zjp>aDu{ zg84XSCG$D5&Vxq@m57BOJ$fMkf1r|JgDg7f9tie>{4S#{2lg>r!>A5vgKB@V4EPeb zqWn`um?#|~RJmDtYN1MR&ZV{tAH8y>d8i~_O?{Ae>yVt6FXmSQ>=}JqPD-m6Z z0P1i4L`JGda(+he6QAFrjWG2BXEy(iscLwH;MV&1BhK5AihigLC>8M7SuF0QH79xn zEj(rKDmg72Q@jU*UIG3<=DbEvuk5{?jz$7v2B8vk6LU>6REtX8WO3Eb?H5NShcfqf z4CuN~?G{2p08MB?m%qzU<1-oIU+##~7)L4sN^@3Xi)hJw#f-YP)K+P-$5lRVTEHvX z0NisYYMB$>?P1+bg*gXQNed|TLi3p3}$=0eyGY9 zK9j#8?`l$~Ucl_*d;3O@07@r{Xd4GyG-{P5y zoCi=5Wr?(&qxoUyPbC*`c%aPiWfeu23)v077erDF2LbY?*w$=Hvk)6vW;h3ZvH2!! zoX%P76j-6%J#`2`HRtF3xubJ1|Iyv~o$fg`KECRxZW2e!yvw0E0r0v=Yz+z(KB3wi zjCQCuM7cw?{_Q3M8N(ehy&P(NA}?YlhHg-I$K}@`*wsPVetVs|4C*V1idT+ zU;hJv{*P>Om*QHl!;yok?!{DOYrn3U*vhw&Sn?eWes>L1O~>1yLjAo%Y>4Ku8d=C>vf&MSXg{ycDa9hkr z*ysHA%Ux9mo!;EJc~GGD0BG34U`eUHI3MrgFuB@Ep4LSz`%|`C z@?!Vx%3?$pPSm<0O~^TrBCWl?i_pb<#~-UbP##f@`*xe2Q@G_*7Y5d@z1 z=dj~G20NHQI=)HYyLs43hC5jn3_6ka@qPso+ZO+E{)GxyQKgj(dLP{tDE4vkSP*;{ zu0@4a={q1Kqfd15yj@qW*zMcrYojPGuZ5TaAt_b}TIMQ?#+jDNv}Up6peuk&ihD`< zEt@`igByrZy!Y|ZhIF!kzU>~zvn^F{?M#y8g>2p<5V1J^{IkLsJ3;^l=unoOLjcl_ z^H8zJXZBMy5hf~Zp>=N6s1^hbQpMEvQ;{gnH0$C{DUh`U8VEsYa(ML_y6KGmQ9n2+ zI3eoiyfs1|?GYnitu3?s)U_3e4fQjm%vLYHNU9Q4y^1*?IC)cX`31ImYhSB~Ro+|B z2`=_NGt$L}{U{$aX#5K=g6lE+MZ;KJLDb0YxnD7pVf%zPs;@jmqeMTt&z1wA=eJTv z?T=JCY#-hS{SYE*eN4JMb7MPxa@r2}VcOR@+!vcPTTNEmZ*QDj8cvvNDh9NVyRxRT;d82&O_MlA{gU^$ae>ikSAz?DYR0KAt+q= zCf=bcWH9*Z3}EOSQ^chA{?UE3d@|`%fRn)t+*5N=dD-XS`&dGs^iA}YjtP9Z*-{0= zq_axXC)t9_2I1eV^wBEDX};g3wG)sG2c-kXei|t3-CK`}!PrrWvT6^I+TMx_ODWi!?RUlbK&MG1<&`JJFlK;f| z4*(-tX7A*wjY=}J7>x4W8nx#sWY;+ZUMBOLV!F)K<(2GfRJurKIf1CywpS=WK}p2I z$ZQrx1{Xe18N#{N`xQyrnKQME{S3e$RaXfJF*QDJ#`e`PYQK9L{CCNeHQ@TtRnN!56(Gc5DS79LiBn`H6SPX z4C-RiPA3~Pm(OKPh4iI`hkn(LiVK$1BMUoOG7spEDc2Q@I!j#%{;Hvn!g%b>@S^~V%yZ#%uQ0B@MP?No8I&+RkSzm{I z#v=#VE%kixQoR)Ni)dU@A2nKD;%Ge13L0);PIarB)EB^dtaIiYGe`C!oj+15Ew!?pTw;LbLmo%dXr$%>b>sPb4KXX7YsDGH-8IGY( zwQ`2ga=U5&FwZvGeVfcz)L#qtOhsMX7|Jng%7d3KvmphvZCPM7+l9ZPEdj};*SBjW zI{g;QdHy+Vo*$7deu<~n{! z-SmzlSGr^5vy{gF&Qd2<5g=56JRaKS zW9$o1M$5JgY{?TCHj9u4VK_)S{w8Oidzrm-4XON{yQF^mMGVLMl^t`XMnSEDMNGKN zC#*)8_D(0jx`MfyW+C<{OO61~+X)v}4D2&JwOfrkN@vERO^LArubx46C2E9x6b9Z` z9rp!mfn2dT=HM9oyTSnB!!BkUPiCQ1Gg&`OE&$c@e$`gnvN78ZO#86%g)KlU@TF@$ znI5u|U*VwY&n%l^V5JAiYcyO(`i^$bgC46~tCp5MecTpa7j^U4pm{6XH8P67qV5XH zODGqaH?Vt>yGxE`-ED%t9sHFn<9RL66_) z`YeY&9)KFZUl0Bb3U!@j9S{rP;S8)jkYw!+pF0L(I1gO6E#rQT59={1UPL_yzKVX5 zl!q8?aDL@2w$(MQc8Cj|wUI8=Q92a?0rhge3HH-f;2>OB;HGccUPdKjJgZJbP_R`0 zD4yNN1foqAm{*oy7K#_*Yry7L7Sn|prYzYu9Q5F*FHrBatOz@G%OKSVkt+rW!L5l|+j2ISb7MybCcVa&k0A-tw) z*PCa7=|Zr(m-_KOpaPK1yxVaHQ7Qp?x3DrbM*!VzfcWOD=V{yVOCE!4lE~-zC)C<= z;S9-lRn+g-*SX+fi!3q<1Ei1x6#(Iya=k}msnva})T$0`rX${86dP0%Tcm8smN_*= zNm54nmUY=bE$|4A{uh#9Wj|2PK^+SaVh=xuC}RYf2z^G^t6D4~ ziv3%Sqw=J-Ooy8x9_3Fz**4J-dR?8@aVso5SVlVpx#mx=@k=-Jk95L4!^?HarV0Zq z7^3$vK1f?d{o5jn^mapO_ZJ8#(IY{r35C`2BMPfzdwpi)JK={X4<+aWR0^77tP2so zSIi5=6@ol*b5(&C3d4GCdTMh^D?{Re=4+69ae3tJSZF|_z&y9&>~c!vsZ@Zg9{7bT z(YM8{aYayVExmXNP0}JmKBM{#XJwzJtxh@zC1lmfG#@G?Qb@}N$NrVqPW%i+vBkoQ z*&_*g5d$B;JrS>lG!%P*Wn=7xFiWwwWg7=Kmj8f++WV93II}08)FeSd12G3ir@dvb z*a?}>WXo?OlO%$;j>PqoJPW^aEopu9ZFh&D!476EyAAbq*Y}X%Fh{2cd=A7#dncJt zq?xQOZ3OJ)@|^_M+>CFXLQ!Y-`A^sFR6{1$8n&R~3s5J+h-ANNYsEckmthci=NkGJM z)QV);472uB0wLHD-DcMIDp3=gUFcXwYZY^>95$+fH2c9OTZp141?U150QkrNYZ*zc zaX~U2Uj%amsOTOcn9-a>3)^-YeoqQV6hyrhiXfeP^acNLHdWncu`0i`LWIL9CU;3T z^O+QHlx9(py<$=@euZv17biU6&PY%?9T~bAr+1oSN!lZLuOuDQ5U~OgcWx$^=KA;3 zeN-=$+)I0(S&Uz)7*C1jc$no8wECveY}Q6iTF$pRgF5LAj~#zwFCvhKuKN>6RuNS4&Qg#uJ>m8PV{Z>7~?E82Rk>} z&H2%moy&|fmB!UMV0t>umdm3==?q}C={U%Va4=Ox;&`ZY@3eG=D&PKz+ZtQMa`CfZ z>A-l~DQuM^sNJYc*byn+Hwk4EGg(ZV6w;(Ol$Jh% z3bDynSeK%3x_vj{Oe0A8oGdw>Urs#3VY&eC<}1)Xod;R~N548-r~!V->DxFTY93B!o?Z;2 ziv<@gx0QTx7?4i3l_c_j42yMr{Lsx?a(9Go8yHoM0LlvOaY^e(R~D3(<3d3s_jrhI zBx~MS=W(Six*7KAuxZIShu$|rL)(%d9{eIKFlg?fQZ=vk{?CGaTHM4Ks(jN!S$}gD zWmGb-uw~5u+OphlPxfv5Q^<&r1pTjUGDf1DOSY7-pw*V;9e?hv*z}ed!ZfdBg)-hh z3IG{^<4FLKexP*B@{I_;3CBKvGb3{Hl4lEotT?M;A%&6^Jq{ zfJ$6^jvtXF1qOG#G(=@%xFV@H711?5)ocse_?=GFcpyBxsCOo}Ym=K7OMmQ7Xm04u zg=NPk&@bSNUkedok!yg9PE{4|^yE5yJjtp+OW_xNBAVAmZp}{#@D{*CNv{<>9wvir zGjuGJo?`A)0si}_tNdlb7w&A)=v#jX_@X9P@SC_Vvc#X-F{KLE)2^CQJO5vfZLintky*UTV-V>z^t6b zR%-&a=v8DAlc}Vk!PZj^F~P?Mb)<)y*lW&xL=VyoXz)7Lz%B#e>P~XT>N4X!QOiSd zRUsLcL3v&3I*LG~NRKtiCH;MyZ0!n8BFF}oCHrP7;wd&0=S$^$Or!&9-HVn^QW%wT zWuGZf9CyINyxFcJ)irsHbH)`pWbZ?I2=7xj0RL;omQ{ZZj{qmjHR8rUx4DMxe!494 zIcbbbQQ^|rj#*D0{xmB%>%sB(Q%Z;=jGTJl7t5&c3L|TgQ^Vl&P_((+j!I>a^qWtx z^BiX|WjYYU0<5C+oo22je;q!6aCfcXF7k(FMgE>3dwn^J3%Bx9EL`jb4l=TDp4+6( zaZZ&7t(o-w$kC4ET87z1qK%{K(q8p0z4_csM?KDj%i{gUmvi79%U_)j>#+!jlUWe1 zaNSC4DBQ--+x!`sXsxQoi(^)5={54%c=Z9A|E&j=yc|YK@-nI%lz{WcYTJ{0N5-$Iz#-l2|0*z}( z+0-&*htfelNqR;7XIx_|Y*FHqK!~6KRh$+;etgz7$y*S{(-`E&RhpD?3DV&bGB1WW-rx%QuhhQnfc$5lIYeg7d4!jn4aLRI}{&_&Yco{IqWza;ApqGUzr3`|d^Xe?{h8Nik z2tp%e!KTZ`a%X!$?MH{Rk?)*mIf9A6*$rkbgUt!1a%ws!anMjWl;&ab>r{q*|wOEmQl~o{jO8*k=pM#Dl>b& zg5mt3GO81bn+1Dmz#sDqfDoZsWM;YamW-C6?}T)l!`-&qlc)XUriW6h#4+du@jx3@ z1jcq-b{eR^<*8fcnoA(&+|Xw>>MVL!c$#&D}2j|y*JD)JuHrt*<+n#zf-(&c>jzw;h+jGga zxjfP7U9xy=uXv@F!A=(y`Iw8em>*%k#hLFfTByiUU*F@l{rANg$ciXBHI82|$A|lY z-K1LtMw5khZ$}D%ah|i6(Q18aLuRgJHf^aW1X2l6+)3PIQE)T#lSsVcKYnKPe-Nix zA{K&4cR*B*WT_!2Ixp~6-L$B5hfT*CGW6(%_tBu`XHHX@kzYs^wrKppDd9gyacTZB ztzZ8qq(c3s=&1v-!PmB5RHhW6M&*kZNWq=i68Gm?Tl z8rlt~*GYeDCzE&g`Eg?*LQoQfXD3S)RBl*Rc2eh8+ZENHJ+8Jux6p^J^NE(zpzBkd zgO<-j*FnBSR@p=_nIjnUxs|lVDf4O#*q<1dgjkx9WFu(Ap<8Vq5WswO`fru!UHC3z zrRYy6+|{bm#13z|fd6St_>sJw_q!29!m&<#gSfBUq$=#@4WIRqVh^E{5b|Zb;JjtV zwcFk1bPVUfaw+=Ba5)8<5>7Jnq%z1~4y6Z?1w1P2MGcIxi#BX)7sGK>+l*GrlMLzc z>x(4gluxd^0aA1GMvBC^3H9dWbSGXq5xWK7<(w>k`V>xAYyfGjpgxfakI=EEbm#+11MqfusM%=ci@c$Jq?UhGVse|tdgltWIc^2#x;67wu$(9@>hQNScpfWHO zEWy9C7s}ujOhe0@tOrG*8up#q#$nEo=0mXpfdL^Lb`VV0zPyl{fU=KFCx=`dmEd-k zVaci<$J;yft|;}`cr89^%L2xWmRzKDwBkUZjO zS#Dz9N9DWE9L<9Bwh%4oy5!WHg)4@cCeqfAv3HiBcc9KJ4sNU3epG|rQFVk&I`9&j zRALtUs)pJ-r+iLD^1=RIidRk$x3@d6IhL8O5qfddOHRzf?};ae!v0+)x?KO#>B|O$ zp+~UYO`E`h#ADXgzkZ9!`y$8ElZuxEA$kN}TqINmC2mja&hgW%dqa0Os+Uy0PTR|t zTd}g?!h_Sgv`(hAsbE`|iFvXQXYtGEC*&DX(87axoXPD{78sY&vC1h=N>KvY0WU2iRKs@B(ZF40YNJZ*WT7@GoH`O*C>pL_*v#dMV-oWM*E3JH(iA?0 zH?i?8@~<9i1PMa2ZC9>-^!tQ*Hqu7Z)+Qkr)`h-&q0V(45Y} z35IK&&&A89!b{)-i#L$6X;NA1>BK@Ws4!7+H)&WzJ?}rq=3QLavRje9d*CEr{Ks)S ze>$$*d6>$%oIitSq`JBIR%AznRX(s|8zS)BznS&3aAg6dON)_KYhIRbz9HAhOd{NU zE*14S+}2Vi1mkYq5(iGR3YaL5EiF3Dp-?|KzzB5RjBuvUI6&Awwz=c_HM7rCB|XKE zM69K)Vq9xt+5*3*NE@A$MkhIHBn_xDLC_4kQk#HYbQf)(G6s8*8kJg&XuvUyv0L#g zC{z^of9^r$Ac)nShrXBJdLi)0pMy$dw$0O#S(po3jh?8|w|co%Z3_Wu*4IOo)vQNg zGyL(@nL8Mj6^!ADyuL#_`n)IY18=V|SOuy_BQ@<%b8ArAd)T$0Qt8Yms0jFPGD z=!NU{H#%xthujSxJ18Kp*}4T(b<{{(%*Qk5>kg5iSu|OO`?5}1|}A3?~mwz zy_JFF(U2_8CBY+R&*E3m^*Xo`90-|6@M_JffM_9wHu&!lkpvt^Zw6J7K zWV_Jf&*bH?Te*XR5zwwo+b^iN+An5P?{Rw}HG#wQ>Be%Nk6iS({4R|0tQ zvTy4XO~mYgJU7oUmS=Vo0(M zd+1V$3E}fko&4R9mP3e7pwo`|zvgZZ0x&GzTaZ~(w+>^Pw%0XxES`j7 z^SgUV(H0eV#rL-Bp(`kGCMsrX)Y`gbX5_VWepvY$&Y6qcqc3*cV5J8X5^r&e+(J*| z#i1Nd&jl_rrRjCa+Po-D=<}>!2^(xaE?Q<2imi5dSPKQ4!>H-xFx9?91ou^uc~#^f z43Bl^@jw}TPLs0S7S?_YL7F!~sO&U_o#&j$$LPS~cG)Wx=cSz<#`dvMxXEhp4$e8t zApWGEPRKe;%GZ{9s7;Bz9cZ#}bLB(L4Uamr@k_&5GM8Pv)}fkU|BwgA(4|b*>tlQ) z*PSbFG=qfOJdj$btj#(3jUn$cFk-QNP|4I0L!w!A<1ZuPA{IZ@YZ$|+9?zKm1DPS ze|-~y`WP;w#XKz@2Bq$zH19~yT~wP-T(|FyOWVcIU^_W^LDK{j3br=0(Kd^=41!RP z-L%Nk&*B?nW3M6nZuA(o2{E+pc@I_r2HP6rDpuA!uXLWhCL@q5oME|fVk%H~&H-;8 zoLgL%zFd5afjtX^WAD&a9;CP{Pw{PHY=}-j33d%jP6~3)^XB6N@qHO{G~BoiH{AGh zA+h*#3w7V#opf(>nap376w*)Xx57?qc6PGV_(s0eYK)(exg?FI#U2V`^>4?F^>=~2 zDZXLSP=$qP(#O-e4!TI)XA0?Gq%*Ueo=gRcg#(MLWd>!qd>Vq}8OB$311++$SDrKV zJ+`NWfYX%C^O~v8&JdTwe@m_wU9H8Dy}T*RVpKYQk7ptA{g>|WdJC_NhF~eJWJB#L zCRp?Ps1g@$%@N?gD|hN6OmaY5k4lmPJgyre-dvvkwyOpu1_kSrT7-y{Fpqlr@LheJcrBDwhhz|AkOA71=9wg}yHycEe%!EMPl6cX(lESqhet3sSWoo!S08XkV2L zvKR^$CF02{jIX`82dp2vGL7;?%mG}mU`DkCZ-X)nOV3JK8Q<&MXkE>&IDYtiFFCx5 zGXkq>m4C>+_F$WBBTvM#Y1iIsE-s|ak@pDfWHOEbs(e`nEv!3gYqP9!bF#+wRk6L# zy3ljJ4=96x%?^^wvLz{#-Sh0ubE9?w&6nRM!SX#uSS6sdBu(v+uivzd+8Ofs^v zk|x~SC9I0Hd=K2w>U>~dsv69G{jJ#_kckhA`3j_`46O^Os(hP(kduPoIrpXW79NWH zOL!Jx`Ne}flCxJ_tZ1c%?VN2H$9s^n?@Bh+CsdFQucjfidP5@D<~C#4K3|lRXO~pV z#X89q@YR)2g`WtS({P5`#i36Zgd7kyFD*o`OJUF_)|CYnr@M&8`QY%s=U0=heV;TZ zG}rQO7637@$8xarAbE16&vnP!#@#bbBtG>LuUmdn|Up+oPbc0(O6su zB}+L~6ir_bsVTaROzMQqth*fx20XRQi4XmBVbge6tn^CO8SLDCFDAoxIFMCHV;`YA zp4E^GxWD3EmVh%=?;d4%tsT)YKQk1uz{5PT#Z0h`y-}j#qw+a9FXt)~$!plDntjHa z2X=17Dd`w*J#?wn;YL6dV-;OM?cYz*0^n=$zpE(qG@t!_b#uZ%;eCzPrN+18Mvir* z2*L}`@&4;)==E^^>^A{3>{;_516%NPn(VdV626XfF)ta`v3pBu$C2BJU>5Vi&~nJX6D&aqT1Aw|KV=uDg)G)h>GaNIcPV-~}g%08Tk72ru>Me3Bu z6bf57&S~uEZbBtL>8gK*9@h4Q8M;^^ zzf^Vl8DMBo3v1v#r^yiaD=plqtOW#ek3z9DUb0~6A;_T1+6X5TT`y>oySwJ$2FA6F z%BhAjlLDM%WFO1C>&{#&*ou9T3D3f`z?vsznmp4DdO3u|~(L^F^85X+$@i_qvUGA42KWk73-*dp1gL z5~aE!Msv004M$pR)p@1}M(VF}I7nTg6l%^{i4T56;%eRJ$-%B>iDFOj19st);tUcK zvkY9rmdXLLK3IW*{K{G=3*!iM+0)g9k-=|aX0h~~(2}@9XW5>+J@Is|VlQMm)vDe3 z^mH*QKxOlLL^^Y0Plr~$I;lUv7ck9a1k#_nhSPF7w{7<)oIDH8HA#GlS_PzZ1|7Eq zA>OM`EOWeCjGqZjDQ|l%UE{ZUPwJSv){$lXwBCS~zP=;fwg>vmnKJcbjBM*X1mU8o z_AlkZBwy-$qRvU&YNYG?$zC(@@wkgq2ikqcL{!_AYu8cZMG!kX^5kqM8dE#derv03 zSwp%)J~;W3o^;p>nH}Q0tDSf=lkqci-6WADk zExGgTqwc0&C`UxU{44ImKF-9_0nL_D{K=$j7Carx94l=IM1iTypc!Dpumjv{A$k~_wj3UU+Q+=SGa zT(7rM2trwO6VK*iENozoa53pOe9x9Om*)ZlzBL*W;yn+pfy@#gu#U?&(O@pg*j^$D z5^nM0lUs!#Vgl&n-f}HnfM;f(wM_!>e#%K~9NHuPobq|MqJ@XhF8}B+CjDBd5BODN zXwP(R1R5;Wk-0c~apg+oK4uojQW4QQ2tUT{x&kc%>|&M_2!i<_?+79Tc?IFH0=`Gq)*Zg4!Q_x&L*Uz^E_ zsyFe7!f&L4asj;P{E<6z*xA(aF-^d&emnt_z0e2bgI68Zj#*!-dO)?bAN4N(5U1g^ zri)=-=@1Z8%vPq z{p$6cYM3y>%?<^LKa{US&THAL2FB3KhlU7xg?eXjuAn6u)*0sQ+WkRmdw3d(x_K=_ zuePxrhP>6RJyS5>rxoEg2}z~E#WdzuT4av0@`~F<2=S*A!7@{J(TyvcD7r4zqt#g< z2`8mmC~>RK^O;dC9N2SPq)gx+l#+1M3cv$TD|kVqVt0fQlg(@Iq1R?nglWDj~w+xPKb_F%K& zjVKhQ&2#v}?BrG3PT!v=b&PlRMk0c>nt$D#-hLT_EA85)j)%eQ4GpgPWH$hsJ(^%Y zY9-~@aHG6a@1v;sgG>bq}`dp=?qi?cL{F z8M+WpQ)V4=4Ucj77F7{i3LR#5168iq_w=NW=FEwG5jWgNF_15d6~ryhIPnT|#;A$` zEmX*%E{M7jRFu99GPN9QdnZ~g+Dm!)&*?pIVzraBx-L20zy8~Q@*n=sfBjeg`M>=A z-~G@3;-CM^zxpTt{=fa*zx&sJ^}5KgGZP`k(&o-{kK%f-ugEav(Uz^JG;O4nsw|_j)?E&6W~k ztWtVaj+*C|%6<-(zRU&5ju3S_A3cJx9GZM9s20QM1BwLRATK(+g8R(sj~wjrWgKJv zY=O<<3XSha_M(a)@e{o}FwNeN6vqRacKaNyFL|+E^5%;>@$-eHbIJLDeWS9ECm_jZ z+EAy8&}4Tm9j`&)cYjeU2$Ht-3roEa-zz;cB~_NK8raNFq04>scefx(Aj;2>?j|fMz!V1MLVfLGbPFBf&Z#1*xk6^MHnc4p)_m_xH)PuL*?Q;sI5ZD4J>^Fqo zQ|yQ+vpsZ)5Ly~=jczPrc;R3wjQGV8%7(~(F^7ZzIvkMwIh`twU_Rh-#_~P;QAa9d z)=@i5HK0)HwHP0D1$Fj7xa>ay-1DKmP(c-$rSn+=Sqtgvzr)kO= ze5h8E>$qbLUzY70F2^|vR5&1l3RICmlN8%?Yfp7B69fwmPyivqEnacdMHZl#OG&rq!tse0K}{K{@-7A>MhnMr z|0RCDjoaDC4D^!ci65$|9xYfK3Krc?QXE0<_@X0Fiw_T^7OUMrJWz6tpz_)-|H>w! z*>;OJoHI03718! zVnJnmCzakTx}G#j6pDfAO?s{5+4kA-$G9$TcvwErp||U!Yt)4bwTt^yy%yYEVPw`5 z+~Yu^f*lzvREl}$H|C`#^>_hBTZo4<@zRU}8#s)?K*!XZa6b=q3oXPU!~LW0p?uoQq`$0`j>F$-(P%O1 zlx6#1i!q_AhVgp)jkr!B$%Bh8m%wT+%0I&u2wl`QnsZwUMvxQJG^(O4ian_TK^>4* zSW=7BKza!vtVHswojoyYQGhfLP2-ij4i&nj#<5<5$b1}_m|r&I0qRpl5tVunp?@A z*k`83@fjpY%{q?C7Cj(Vo~y(&m%3eWJg@H`U8tJH{Y`tZ>we(HjCNUf49?8fNu?#K zsB#3`;Pz(zMq#zIi~5tUC|#@TigdyhI=TeMV$)|`5;u*rLi)SB#6VEf;F;Iz+EoJK zR908jg7`S=SQmA7)tAH+v>z$^x@RG#91hmuL&aWhk1;HobBgCy;`=8^*NjGrW-JU< z84PS)y7Q=X9lAQdx4U_=E~*B08{Ue}I92r|uPDTToYV3SQHt8{S&m>40>Ig*Kl(r= z1*>t;*FZ{&L>={rVcia8C&IJYKZ|OoX|n@tKBAVMXjR{49^yd@xGfqMW8W}i$)Si_ z?O=7&a>-uN`AW391zB#p+d^v|&j7AfJB`np(eX)Cx(}Yk4S4S|BBCdEcJdOU=Y4c{ zq+$uQimQY)RYVJwF9H2EU|w-@s3o9`xWi<}&ZTi`{|-Z)$oJqjC5(pdc>$IBt$T4x zJV;h$T%g$bM%3I1d)K)%_7Cj|TO%sNv9XlC9%^TZ58wkPhsQ!dB7?9D6r27m={<{q zfS;@0h=~+P*VwXag(>8Ss2!DVfA(d+O^Eyb8k97L>s?%JU|V8q6~ff4kWDfoT0vTQ zi4u1>Wp!8tk^P|3GX86~DwE<=cP4##HUCY0323-k^n&R<^Xofc%e623 zDwH^NY&W20;@#E>fA46v+07SkMd>Inez(CYrdCdi@pm>2*1`>wDmQvD0g^ChU#&l+rIBIm4eYGjcq)) z>N5)!n9cL) zO5U3jKj4nn7zOs0p4B)NV;qzOs4wPKzjrxDg*n{7V& z7b(Fa+}vl@x70R*UbRIjng_eNCzczY*LKU9yJpn*@5!!NNepnBw&hjE?v}6|yCqMX zDC7*ESgoo?$0ooDQ?>%U~W&sBEf8;1G?Y}gRVhPf6F454T7jD$?Ck_*DsX{0HF$Dh?}qLW)bZ- zj^eVs&Lxj?Ekl?yb`fmnWB(DkKCPH`%|5qO&^t_`{q*?Vv8HFyRM>DLdpwu$%rLoy9rMcR8)V5(}#~$zWNKE z(A-7kYO?eEF*vksf}6pAaPlkDSTjBx@|yI|EKtWSU*e<_*Vt&q2Q#(`(^J(wFIA3# z(XcdmVQsShsLzLFIT>u>b@UuxzF@9iZ~QscgeXJ@bvvb`f9jY)rixSTZ81j?(B4?| zj`3rwMJ%lI5}FQn&W)Gk+I;ne>?(m*W!?BsP6z>31YnXC+HE;Ki zy7gyt6L59$3n<{APVNCQ6tDJBD^NnwYp5EFhsjanR2_Jfe^H4g*&SNQfVu?}F5egn z2Ntd3-m=}LLq8}E~3D$$SspW{(z$V5(LQO_6vnev+bSf zmlN6j5EZg;P$_Uu&;|Q-u#;RBEcLToRr!l_&hn{{t9x>uu|(p9BlCv*>xvvPkP)`A zn%DV*fqq* z`pRviW1`0h@K7jbU;@|uw_;rUQnV+j|AxnFt2H?|Nta#6M-XRUBb|$Ej8`vyJHpFO z_4zbM+2!t3eK-^Gv2;8>mR5Kl_4c)SyXveI#L^@Wg4sDhd790A5G;?k|NUbCl+ve$ zrtusEkC;5|14C~i3~MT0x!b>1mjsF990HJd`I?tZH7lYy5odEo9?o#TN6^U~ZS;vf zg-Njv$RK2kbDbb*yly{51&lMcEF&2$Py6n9u_tq;y*sIF+h;yH!?4dF)pRxUnV~L{ z(MepQT$Hp?q_Aw~zgV$k&Nf6;zKM=zL46^N-W_Q7MS~4Ofi-$8eGFGzI@7|m!=l~r zbiAKvs3m92p-N;?+f@;#@p>yFr2MAb=6^EdlPp26$h8^^h$}VOv4#)Z{mS}4Q`^+wf>l`d=4)*W_YI797J*B0d>pQcG z0O|{L#<_2**Rp(*;tW9Qr3>`ho-HBmC5?uChDMRP-cKj?>nVUxFp3tev0vUq4BMZd zoKV?nb0NK2x4oXO4uK==zu3z{4s{Jwr*=!jP|69Y%+4`fatFje4O)dOT`_-uh#m*8 z0!QGS34;F7;1xiMzMQxs+o~&7huaQjEX4|(^X#rN3L5Msi!)|&nCy*!{$E+r6c+f} zvv%5=i^}ICl4t!JjDXxfLeee!V8P0ES1oSa3*L15 zO?;4Z3A!=|rQ97&>HG{iut+)l0vnD%DG%;e*wi|>$g@cBey2l*dk<8FmF~CQ2Cm#G zHfz)#T7Z}A4>Uf&(xi{hHsyd=70tHtx35P>%P6=UtOD(ChT-vXa`G0U7NCQa9QN$F z6_Xh<3Y)`t%S(0f)9z%n>*R>S3eKN+E!?@~^&pb$vGY|C-na39?&$eT(jUi%2l4Vv zymKt7e?BXO`Qef~J93bUtMJpeb^Ur&-o@sAd`#Q#lj4QFK(gL%gkl!c z+HD`rU?y!;|Lgz$U;p+$XYi%}^*{Z;|M}nihyUx}{@wrh`+xHv|I7dJfB)6r05k1f z)V<$bgXnPS_#M6%a3Yqym-`aT0$a?^(!z?$g2oMNc#lXjd0tk2dtz+yY6k`T%>`M5 z`2A5kRPH9usba}G#l;892T+sVd`wT?Eg)7I5BB*tem?I+B-hT={N256R^*-v)?XKt z<)xbt*$Huq$JVMhXli5~^$_!+wrBIgY9f$)^h@8ql01zlWdfA*WNtScTzU$Afdn(@ z1Oj8tMODOdFMBEVTa#U76vxHBJxAxb_OyAPw&tBhw%WbDf^48=^uVm{09I}y?cvjO22g=zYuqB5T)9|Gm==K zt_jd-Symu}*`|endy|^uY<4RLo9vAF(?e`0-ioO^V?iZ*${20KbR0-QSC$F6%sNdE$n*Uj$=2XJvl0=mYlLbrYN3NVR(_uZn9c)oV;&Ro z_q!I3*3rXc!2|2CcN>jg&54Kdte}DZpjXcALFb9G&NC#EYr0e{$C{P7Im!e*5gLU? zGLCG1qP*@Ash!VKPcnsU>C|LHGx!+Q8+#SZnKP?hTEr46p_qhH!10WI7qRQw&_moI z6um6~P;tn`EBOvPW(5*d+V(9sBm3|-$*@VmxVD9tp8+v!5%0^1ZKX+r(-bcID)yrb zG^S=25Bu$`PyiX#HM0bb)6%KEL|02s+R@-Ko1=}p^y%|8U%*Ftf12FwC~}C24-r_O z#b4x187jA->9qO@9W$vf#B*hoFy_iCl4VuBW!*sFo=G$cSM=-KjL!_tIGO2N)GEY- zrpgNLh0k=LN*NzrOm<4P7_d(-*5X+NVBCo`G7RwNv55vn|`I&KITj5?6%T3y5geljclXCJ^#vvbZ))eRj-yQy!+ z4K*iuM~?Ah6BSf>%WE6yQkU@JqRwry-cOD>VXnL?(Owe0s;aF?DmrcTkyHwHFWl(2 zxW~3_v*gGE+r^_Y9l=?&_MA+oKJYy0kJ2Xl#2vaWUr!r}!uj;Jx!Q@{^`MQc zNw{CVG(x0r$GJK}uQE3Q&^|Vug!_lV?PJMI$VcbJ=d{|Ytd1c@bbF4f$N8hQ9SG)U zcWFFpAsF0(24;0%G^Z)59cye2`pv_p-)(ykQqi;=5k!UqP-*%l|KwoDeoGTuvcRyY zSk!xxUnAJ$wrHnhrp3QvLD?1LZT)|Db z$47vKa80tMF3_J}DiO9=bmemD8C+_F!jA zmU5-96haWs`+{KqY+A2yL9QWMtxD+!@WHIIAI{c=0Xm&&JfQ=czrR0Cwn|bmMh7LQ z6OXS`Dn2@&gU&G@O*+2Aus%`DEjrBKWT2SZpFw+)Z5yBX_eW1$Tlug5Dbl6C`ODM~ zX{Mok*|uBRkgZK-y0W#BAHhZDA*h)~lSNWcCukj{OZTpc1iUaH>DZXIiB|5+>*f;| zzq7R5p0$Ichn)qVrZ_0%5Nb?nqTJ>votd^sT%C`gPBeweZ50}&(hp%KD;=ZbG*`UcQ$w z<@6_bK-Gu8-KU=da2U32OOV6ou;v;sQE>%&E;%HZYh$%u#At$hp!p7_G`>GGI|RVs zRgr}xX~!&l`*l?>nb=;Xv+O^%?XX+gLLsA>UdT7*JmZNFNg((X2~#Pp#srqilg&j5 zE{BXJy4s}rGfLLvKte_YJmkVAYC656jC{525@Tq)f#b(qZ#Q{9O1o2?aV6K^&h7Vw zJCBR_Fy;PWG*_J`PPyi)HnX}T;jZIZnN8@vX~?pCo8#v+8z^t|_gw5kRr7dmFFih$ z-3wJ)^HPp-FuTO!M_{b0v?EuM?|a9`kQoP#!EWAxgs-!aUgx)yoo74S_=#$+YOoM+ z8CQY+p7iGwu&Mm4YZL`cI};(0`jp*L{M7ws%Tx#nB~AMbcK)cG%pb)w6-`WYn$Y#h zM}M3_d(j1ATL0h+d_0Hwvy=h+;2c=oA}|BC9S*o!^Ik#s4O(QrgT38kCY2qDEBOT< zV-)nYG#7vcU{QH2>`>&!j@PwQ-s*4ZD4VCSFppK-?P$|@x9?;vx!?2vvSh&?iUCn! z2OuR)O|8_DI{^7r9Y-7Z2Tnx~3qQ?UBwStG7(ni_dy@3kE#A};(mR~3Or?%SCt9n1 zW?dIxzU<_)%M|2JIr`6Kp0D(I{07V%`bl%Fr%-ocier#06Nf{}A9|6ld&Ekjr3?F5 zFGOa=I~#HD4Qm!7_!>UNG;{^}b~9Guz3pUn2QL738&Tth@cf5-!E3Tdgo33k_fINP z{4Vw+TmZux(C)4zOHDPIql3DgQT&JyFKsL)P#b)hEG$eK^Y(u7yseASC+)8md;oiB zo73D^W9*#mT)$ufsgx=t8nd|?s!2xWH{jLy6JPocTqT~uQ^8pZ6sj?jgF5ez7G3Ki zpm%3fq95MdD>TD3qftWn;VXIQv3wBshJ!rfYCUZ>S-Wt~dHyuAWqk~ffVF-Mb>jz) zbJ)C2%VsHFzzR7iL_05NFpUqR^%;bpr3as9W~<7qsQvYT-kE^-teJAl1Nab8gn#U-DU9%{ z1_}ZSJ1ghu+S#vcRt+C;o(ik1FawN?ly$JHS`+F9 zVT@2{`K;6cA*V|)_k;7va2!C!q2z_QNmnY@X8G19iJSgTE0dM6XuCpKx?OnljY4BZ z#G!@Tzy*EcUwK*#DxQi)`8mg^?cy=G6`A)JOnT3(qyOtn;JKqy9}W#?RB^Vkkuo);e&JXLa^bS zTI#>J@+^_PnU6;~2*1KOkOU_$IO`p+?$%GWJSHcjXuPBd)0+{bTeE`4k(?O>7vB=M zU}Y_O+@jT5NUojihU7KWXu@cp<_Ws?U%w@gk-nRV9eG)d3s-J6Gp&4awnO3lqlX#5 zx<*xZy?f3bF*#c{7lDT|*tA3_Uj>abp|l|Bl1X;nP4=IrRr=RMI7m}Y!5Sw8>-_T-Jm4ZQ|Q0m{GnJsG*KP;Le%r_NYPwp590 zEN56=OMMVr(fyO9{;aY}y#kuQNn{yWDdP7+|fQZyu`tlm4l$kNKn-*7=;l=HX z8<(iN_MR>BOh?xr*+^GcPy0Pl?%*`f1qvvPNq_nKEMU5eNpS(?28|q2vJ6ZO=D`Je z52=~AD0A5Ucvy-mSAcsidw`^|W%fK3ko+oC&9kCR4;3LeXLdg*e-teu_puL6!~ zakTj~?ZPa@`3;u1ps^c@aA6MS*OMZ8Me+QiKLDmx(cXK=7V>jl+^I0+P?Z@;QJZ}l za%3FJ^KzxE<6|@i$f{SdSR3axD5zLW45O=NI_WS=TJyLN>GOTz#9mdQpxnQABJsne zl-NAf>E9!U;b@My(N@ZlQCmk*^;%X~Bh>Io%5-7aQD+aUzq}J~*S+w-qnV+R7KLn? z2-0bBZ*smm-4*&>6%x#i@vlx5Xsv`fU67+_uW1jE``?Re=A!O`Va4Ti4)BEKz_u66 zb9{`=a1%k&>zGfX9#RiJb-QkN^)DpU4`-svIcoD_h$lG)D9f*}(*d7a%rH*C(t|=L z?%*`(nFo1JU(fx+QeX0Empz>OrsXGneNm5>xZgEZ1f30G_r@ID@Rq3;$Z(-RgGE$* z0+^u5;g>o-3`y1EqLX^jK?L znw<2d({1Jk&#vCgC&r$t+d&vj#Y;uV#9Y+^*d-KCzRe?)f{(O*V8B=8_jRDUhqtA?KtvD`S9maKE zhN#EA-o}Hw5UJ5hub5f3EZY)Bbnjm|$LEizo(MCkb{^`MY&3ZHUO(qL^R>D;F}U1X zCEmvXdQJ0`T4r*1rK$pAM(qh!w-GX|@4^PvPU4q_17RDO+lajGH>VVWFU|hY$ZY+? zrC_?lcn?8z5Ql-vDA1P;pZUlxJq9+}o*+Blm09*1>fcWBGN)}$^j@4au6>$Av4*PU z^F{o87~GQu2;M8s_Ih+(jM@WpYVH>8urji?OUA3*F^wrg`uqm%kFWak7=HKkY&jXm zgHnRtt2gtSz%~D^x#|i2aw|HWmFfCNuC~%YjwYTlD~_) z#nzgl;^~J+bvK((;{_Ele3!H&_9wa}Pl7l#3I#;+L~(WRkJHG^9xn|e=9rfIYJYya zEkZs!ysBGrrY1R>Ix#)NPeHcK;PWoQi3qSr>1`lP=AVPQ1zy?uQsD*L`>h-oTRM*X zW^%U(!9FU8LA<+J$0N^fa=iJL3X`MC8Xvxs45-g;3BK|XH2ojW}E%1Pr2kI17QQ87lXK zqo+}PR3=@EA5JOaxs#k-2XV$cWR7|x)Tu1=eHa)4qxmL1jDD>mZ9)ClHmY}DEx=gq zr|rv0fptcaRh74v$GodR76D+hc{gnr(AYUB*#D*{ z6dGQ>hG4^kJ-&QUz}#U22E%^fzL%+D!OnlcdtK_MmprI_5= z{^4NeJg_5tING0`92_eq@UiYQB;R6I!J4c3P?19J)4r0-uZZ>J!mlfkf&NAPDm(;9H`r%$5Z-zm0an zb_t-FT@0e$6$7AEdur%*3@#ABVHxAP0-@95wq&;anL*coQgcfTiBT@XlhXlyrtSti&))ch? zXTgT5W9)^6H{Uvkp}J!WO`YbrvY3_+q0~kc=g0V(6}1A#oh*Mdag@1m2%QBZ;P<`^G8?T#z0(s7P(Ux$4MCYHBR$Dq1dCep(~+s??#;>yY> z$D35U@pe04NP?0s_Cw{$_N^_W==}xVKZJ$$zl*AMnz^4E9gGS3(oaK-!aU&T*S%lE zum)X_A+^=m=z$Q`-7%TM3o!IYtDt-DU)n33y|Ne4w~LnY!E+xyIO`+JIgmMpziPT2 z`Muaq^|ui5;4(R72)C4AXc)eq0y{I;6i}#z-6Cp=tCwVTy;!=ETYPu{( z)V47rvsy6!j`S?^W$DcJWag3q%#j&z7&PuEsuJt~MFr+U52-`XJBP$!nlY!y^6GrD z`Ka{bGaEhP!l~@bcoq6$ML!*_RPlJBVocDuUD4ne+A3tF|7Hg|sZ|vnGkSjrE6RxD z`n5^v9lBJ!IPK4LjJd$jZNY4ao|hLn12@cKfUM~8k*pW?v!3JY1|1*QGM0@Y%az6v#k?rhwZ9biQ0^udgT7%UT7NYU>6l6vJFwG{sJRaQhj(t8-tti7oja5q zbmO&W^<9$UtDLtmDxgGFCE)zAIizOpheZsDMd-55+_dmf0+PA7+&{OxV~8breaOVO#@)&Mzn`k4$_A@TZyEGTWD7{HCOxBFxh+%XQ%>U8;6;^8VJZkRQR~`FD@VG+1K!+!*s%*)#It{}2g7>>g%8FOXyCexz(4ycF zPWYbp%W0>EJTz&d`2*Ylqov+((sRMXgOj8;4j&F33lY2#5%CE~Yg`pX zpkm)j$;Ks$9ld9V*|j#qJE*_%qNZ(WV8^D40iT1ZM)r^vO_P;2?z?%e0|gWahWRL9Y*&(XLO}Hh*ZLw7gKfhuW6P zXV`qF7`!H<=G?I1hK?MnX@M{kErDGYzc0pv4coPtcae$X2?Cs!0Dcb)0Kf-FV>E*; zOW5w>QF0IgPKilos0oT!j9WU~PbXM@_z(ar>=;YN7V%#4cqaT#qeQs`@fFW86E8IV6G{ki0# zlZnn%r~=TF^q6cO>ivC$gWip!@Fz5j?sg`aH|_ueTvz|h&;P>A!{)c+00qTns7@v* z_WE?7S~Y<1B|$maTLGMKqv&d0*%rVskkWlrdX$`a{B(q9ueg~!6G(XT{?R>&X8Y0E zxmkIb()o8uT07p=*SI^-?z{Pzp+Oufte zVc{;CRpD7xkzqvCM+n(kK!v5(VLyLCqN&~qsTBbuZa*e3EffeU8`0Wpe1EL+3Tg_r zk!vp!Vm6T%oBf}rq6s4K8?MD$tQ-6IX1QqUFS25B94*O-KovLv@c75qd zAz7s)we7G*CvGmr)TYI*Wj`E&_}F}T(M!jhN6{L`0&xfA;V}-h1JabWV!}-Sw8CuZ zJA_coFSX2$b|9a#vmw?y(en8wBF6T>nfF3sL9NOq8S`JEVm_QJaNdjqrrr4cC7*U`%PaM(IT5bIamCCE+53A>}cdn3u!7jdyzjdtkmG6p7A~ z6GC=db02*|N(48yPhtdD&0I8B0;WhpF_ch1u)*2~z%y*_Yf724ASVaw&d{Sz!!BsP za@g%~s_tSpxqFn9u3#l}ZWlxQbz$Yz`bXy|yOS>A!hTb3rXY_0ZIKATHo4rE@CN}$ zUP;CVG-r4$1^8u0oZ8j37g2awWtBrwA*3!kBAhAN2$c|xN1B|@$1_JFpZ&_lP1)KD z9|L9s{_~t!3kHI0a@Qc%&&{F$CC0@MoHQ*^rwoPnLaoI>JQXNtWPQ!I( zlGTAdgv;TXnDs`(#ZnedMOC0mkG2rC26}dRpjTWtfO3c?NG(-xhcEj8Pp+;_Q=IV- zKQx49t8Wv2Ap8mAz4_M=bWcCf#waY*fk>!GtLyR0I*MF`5XW2X$-+ulHlNvSYz@Yi z4Uqu}fxJGG3661c((!`14|599U}oyk&?lOrYE`EXlfA+bvg`+I9_;uN;0dR5~Jq6(XqbdT_ zEqG8|t4K%ai6FF@>@&5?fX0H_YLkf^3)50B`7>uFY*K%i)G0MbTyQ9Oqg>6=je&42 z7ZGUJ@y;@IP0V#`ru=U@a@^HmT(lm1RtC!#Ugpts8R`##7H?N`cd3v_b$RR-U?~cI z9AGAJsJQWhL~j)g<&W+qfX37_=Mz15`S<=jbj049+6gFh3@y2M*0l!HK0O ze;J6-RRO!@fFKg6QB4`N!`0}O$SmJPD{W60~_z#%Q0VU#Hm){;!eQ^Hjm|bzt;8kqdFEK923FoUhI=N_~ouw z6s`-@je)=&{PlhI&{)IG1m=;Q)1`VF>!jHGsJFymfuYR|_nbqq2uKFGK!6N&pLaiI{VA1EI1n@oN-YDinRgb?>a z>oQvHTC(8EQJV}WR^HRA_0NpQfp})F6ZO#YgBjm$gBG-NjM!Uu$<>vQ;&Fk1sB4Lq zNa_%U{XpB{)H{_A`9qlOJE`AdJRJrM!>@Tx3WayHf8)gp^fky0FxP4Cd~~2%{n6V@ zhvpymqR~2Vf-ikGhYL~V$_FrKUqlnmEY{Yc?U;17lg<(BB!ad*cM6w%Q}yAUA6hUR z0oYniSDvua$~V!)MgCV*GSoT1mPnpK2Q0UV%40E)YMJ5SJ~_mU4V(99sqn1g%8l6} z+?L^~#%x1r>U=M)-n&g7)#KSCTetRKTM}U-dj(%Z52{s6=z*L{Cen{^+LqWZlum#^=Ce<6 zf$Q)g?ahFuO7^akwdAMMYBi7jB7i2%N30#FWOR-b1HG&S^mwJ82mja&wW9B z)ROgLBbjwD_}!<^0Q=7GN$wm_C9Cv|RcdQy*p_5*W}2;?&YJPZ>L=$P@4uBSzLXHB zvSN)F*4Pf;C)(SxfG=GPS|4s;)I^7{kzfIHr(~f|RBj+ls1$sdSr%Ek1WG2)hr6PI zw7gGB_(N8V%%AoYe;pT)`M+Dd_$)M@TiB!7_{A*aEqchgfB$ZYXsx3ZY_GwF#uZ7I z6F@ie_ddFhY56d(^MIanoh<5b=9zAgTYR$pr@unL(Nw$09+`%#XFLj9WcsfV<(6zX zPa~ICJ5ZJVU;PT6$oZboCV3j3`e`_GwMEan5ZOK`#811)u_iC>+AA#gtZKvbV5@B3 zvgeq#kAQ?bZAEQOJ71G+1)1Ti8;AzIWVS4sGHy(UM`(aBwURto7f ztiU_kmXMc>g4<|A0rT3pbVLDhwfTPK7QZsD<|q zszO0GFB<`FY3ycFe&h2$wcoGaN>mD2mp##4kguY((|j=<=h%A>`~v%(nurc~W}G<PqjVZ~^0liBHgPp^W))RNSAOu*%2rotQyq z0nf;rkc*Ww1@ z`-9X6eMfM(fOZ)$S)AaGt|qzjq5X>rWZsqJmpUbwEO-nQ$h6JDW&G~1LQt2zaVN6e zkBWOyla*M4y1l2B*rzzh8x-|1ono|L~p+>rt~p(PzS( z#XIKU_lybx#dbwa5(NjUXc^M66n^k8vJKlpKfwB{)2LP_JJ%vhoMBzy1Z(p zK_`el@A{IRPrNguxK}lTYz9j;ZPA;w?HSzTlcU3Q^!S;92N1|q zVJ~xSUhtTY{u?vcHC&XP_O9*fcP-20=t5nnkKtI+aymY;m(+kTRm5VL&1*YmUZw`B zIlU!xUeEWzl3I5iRpxjX!Gqw6M&n8M08v1$zjD&8L=Tr~nOZGOjFE+ISIsI+AKqp8 z>%;pb^E>TJARak^H4%s{$CX_!pad2;ts(-V?R{3-}pVB*U7P;_?Z zc3+)&@TF?Nz5;;@NSU4QeT?hMmwh}bCln-MP%5d!>HCq!7G(Z&`p9zw_V6%jRgBkZ zY~gXL(v#me(m&%Si=S*;ELtM#+7f4N3nQYLC#dF~S%*jGN;LA=B0=!#1sMnb!c$@@N)8 zzS_Oy>LeECF0O}}j{fzm+3!N_i|5hBV*J$CfC@V-79}T$@M4L=B$|l9#|iq%S2cTK zH`&+Q^X9yx^GE+t+eE9&(Z;Rg8@8(&9r1fhhuR?YIO{&jhA|*&!y3?9TZn4THB0B# z@IKEvL0qvl)$1O=s>2K6xHd4qFdH{}$-hyg=ud>Bz@R?3(^>R<-ejTs5esx8w`ha55`h`)Unf}#(2L3 zP1qf_mNMmVp`^2U9AyoZ7rR(ORq@G{mf9w~9Ou8?@< z_2T7qoa_3M@Av#vLrPx!azV(S>a%8tIY#v^y6k^yz^@tMAEqh{_leFsxPWFSZL!e8 zDX5BI@gVru{L_g51*y8U9NP5D`d<{8_HXeOOP*|P*q!3=Ge{VRfd%~)K+oPP-V@hs z+l(II2@`orK%P)m_M=Y`x^Cazw@U+ohM6(M!I%U6%FWr+95sj}6gQ$K^JYy!g@J?? z1fXYyBjo*@VHw&fAu{z!oGn+jW%QVVjp4VxaU?8K2w$gEXIG+e&evF}MXPJJbfn;v z|Iujwhz+h~FW0pkjVr#9ygi^1Uq26R7-_UDRuGA|H+@u)t_be3;@fI*AzoSlNbT&1 z|FGPb9;;TJ>}+e+OtL=+y#v_Yg@g2pO}qXZs7voxXv(xU~x*>gEZ3BU4q+X>tT^t|?^h+4Ps=ARsAj<$YAJf;v_<`|A=`EQVCbJLF0LjWo z39v5bO3=NkY`-{bw`Eb22<#Di-|VD`e24TIVPl9w*`I8lxZ))rt8Oo}>}X5`-Jxl! ze12^zsy6BE6)H4ipHp%-%wLG+F@OMaCE&@{J~Os8IksINE=<5L4O%thlezo`Q4tJK+iQAKK@@BH>lw6Nt^9AyEJ)21t}?KD z9ii@T=d=FyCb@K9U|q0}w=+@!%%`g{6o_r@v<2UDSz$5MHC2EiD$6(235aqthQ5qw z%NtaQK{Q?f8E5(bhsxmXGy{=F@3LiRF_X%53sxcqt~ z@d~Jl_+UmfMG7$0EHw&EEnkc@Z=kR*z+QU)m^K(K_V#6{00r;uNphwFt;9y6da~T1 zE3er&FeG1R=6JkA5C2`kSOHolE_FW$zbD)#UyT*6RKgsMGgHSg5;7bh+-G0?j=glMrDRL^4^b?6I~G-T|a9 z6O4=2hR&FgMq%+SZmlO@b>D;n6sYUBOh58L+r=-kSUD0-*tS^2-Box=yTtBu++Is| zM<{F%hB~d^kWQf-29JM@eqrIng%GLRE0Ma-JcB{PN+UQdWY4tEUw%a}%i7vxZg(E-~rQ_muIj62i^Fv@%|u!XCsxQ-lnzku_ykhqCf zCYo2R13-Xm`BE9_=V^ViT_kGL`ifvBD)aH=a%ee}SS5dXvyQ0gA0_^D*(5DrAZmO$8lC2AZhn7>ThQYbx8&zyzZ7ef= z+QlF`i`ci$;s?!C-T^`9px_D~YndLq83!U5p;-Pv0a7zcg;h|O@&tE|?9td$6j1F< zm}S{hfrZZ05Yu-Euf>&-w{EU??8LAfFVX0a_UG*-yg}OF7pre*q_i68@^x~BbtVLx z)L`&|{ekUe+y|g0_849O(}qu;*DOf3BgDrG(YUTI0|Q{Fv>{R%6#>2OpAp84YKo7u zpO>1F;+qsEZOBtEM|IgW*^|rQd*D+xOHPYej+7NA}LW+-%)+vlj45eXf=G|U&tI|%=K|ed!Mrl z0fd8n*etH~HS?Rzm}A(*L2O_)%GM4ke|1Y*54e-Yy{wtUAH5N+TJ;eq&!V7IzA@M9 z=Zu~gm2l27u4cZp#r0Hrz&5U4vUwa+{BsZjY@P*96;Rgn0hefuNj}V7Ay!z7} zX`(4j?qMtF>rYYS+wCQL4Uq%H63>Qz^NHz&4EdA;n{bx-)y5feQsIW}g3-}{wWLnG zPCMcrX%-%KHxNaVR4P0^?tF0tvJ!f5r1{U|>H~Ly`7ZTfoC9E6{c|Ym*e1GjAAZsy zcd(?b?>dG;YLIS0T8DX$HxQ*|a-XwNnWW%3#x&KOal=f0OB7rqAnY762N!T0gXVh{ ze^Io9!m>^r-J3E`!OuaSbk3OHu7fr~GDxI{%0`}j-cy*Jc>W6ME(@lJ6D9TPM%3BG zd6%XALE>})ctv2Z`XmNG4l6mGkZh1k{kgaXk7j8>+-7XeKxce#Ue(b+Ie5fGiiSdq zwB08ZxpTkhwu`qH*4`KRT(r0IF+9QpGLve@331nO*5ciRXi&=1Zsx1BfwbRzwQ<0s zWqnMU0t)E`nZ4!N&{NyJ`x0RLfuo|a0=&p5SbL`V{V+P5()L9A3IEr# zRW^zJZJ&#?efZTDJ9Ta}K5?Od16o-lA%z$2`7YM2a8F5S^bo)6V5qJKW#r=KJQ^SS z_jVonI!>iwzvaB6be_|GH{KhdoN#nwP7jdhbJtwe4){+`rjp*?k7?X&i4t*&xRDg} z`5WK;W{J(~nXPH-+g30W`_bM*ZgutiqX(2pDBHjzv)%c8C=8!s zRgumH2V0E-b~Ot=ytDo8B))w_GLpniqVD!tAUhy3+)dUe$l4>HIiOkLnpyatfnL>C z;z^y_b6jo+H6Gs`i$nm`pr`fG_VMU^BWmB_AL~Q7?wwscud+3gBiJmB&iM#Cn^>5j zEuD#)aKXlzFb?W+02jZ?0c2=URlW+r1v>D{7G1F#O0n_d7MSxI?NJeWNa&GeUJ3|^ zJqL-4c~>5d!h~PU9&tUkW|dhHhK&_Ab^7D*0M7McU1u8u?Pozz1D4*~5xc9YFkS4Z z0M#cMIzHY@#8+{#B^~OhE|(qle|jZ>J`j=**neSbAzQ7IR*R<&?T;f@fl}?t0c&#$Usx{nmh;%O zp4FfScg1YbG}CsgdnlPQZwuuo3z2sQuHh+wR z8Fy_0?-s?(>D8JKxGvth5!^bp@pRP%D+n)gr|fk=I}rJ5#F~)^ye~S2!97IPYR@#Y zC-y`WJ%!JGHkn*D*Z6zs1M*cBb2d>b=^X;qjmBTVB{kui=O9Xit4T4+6$5MW=9Rpj zm@-fD5Q2joI>mxKcmP0a@#3Jgs3I?6pDkx+$>u6{|6%Di{}$FeZx2{c0vo;4jl=-( zrt9GKqfx#>iq2LO4ZWY^h1xhr0B_gS)s&h2Xs;q})``R8Oq@vW1&hFvbXOwJlKyiv zb^8G{JU(gmh|Us@X}vOmt1|uzVA}kHfTb&c<~HB`t_Ed-e(L7u;)#lH_=6<)4UCPA z(xJtXhpO*^-wubFZGxS+-6l-fp5hEqRTTAG^JUC|Tzp zfzyI*o5m~SKp}NrM74OXV*#^+U5FlIDR<(rAZXk#g8QHT>}Ot=ZSia5J+Y|Njmt|( zUiTz(-ZWG0NLC>D4VRfI5_3^lV9wlRHN5bKrySJ{5o~5l+SwwWf%OCACN!**Dq5F@N0(7D-+uHF8kpA{xTR>yN z5M1uwR>s_{jMYTbGE<&}m9Cy89VQ@YLy`>i4c5mds@y|;^f%%Xs+wPQf{cQu-BS_9**Q~i0&W#>Om)m=&@%GMA` zAJrD)%WHG{LJXK+@e;;_J~ajIfGV3RCDOd!D~K}FrZB1BdEp~FC6Qt;m7#h^*hTu% z3KBvdyv$lq(F72g@ez-k3zu@(wk5bVI@$L!nj9{MqUMVQX9sUROxa&NbsIf{bU)s? zx7XA8TDow9wgG0T;V$>Md7fI))42je8yve;+q#fXw>w;TN5aMe?e%)Zsv#Jr$S18F zXLNcH?`#lbq%fQ+mJ9FpF?@Kn7%wj9lV&)?<^~6?zL}??%vbO)tCi*auUW+~iDoisi3W27Ym44jt6X9?Ro+ntsQ@!zQQ+ zs3ZjG!NfC3?3M1RPFh+vHzp{hV9lr&M$_QDJMXV(QMI+bF#~%v+_Rv|Hl^NmI>gL^ zkXjH}FRtW{x4?^CgSrIcAoX_kuH-#~!0Yt+7|v3cj9^zgUMkM)mseUsha$aQW+X^S z%QUS$EWX}dh2vy@6w&?4R!sbbveDrmwnD-`EMDrasSb_v@dBIhM zLDDd-2sV_V?BvtKg3&Qk;RCvw;77Q8c9YD9C{WLz(}HAtw9nEhaQuCzZHtg(NB!KL zM6+*5l`MPyXVTO~Cb-b<7;Qd{y^(5LT)Pg`vN+<@83$|^q^%;rVp+WfXAb*9qRtwC z%7q0sJ(_{tB88Ye>~@G&JVZZ288p7Ld+P$1sybd96dFHgl7OLWF_Q>a&4=z<1}x4w zYF{a~li?ORbZxbe5nbv$I8)0C^~^L~ijm8Kwj|sFTnAi!v!SlyjO)cY$RK27Fdu^# zNn+}@Rc4fjC!tP%{1zB3;=5yrFu*ajHNPDM1BKY4wE;pcS=&i&K?G|HL&-pSU=IGF zXuZCL+5)^5Z}t4-%4{Bf;yO1Eyjv!Y*|~zCg)&!jEJ%*9G|50mgOolH!%B?Hdndl|><+h7pHUzKeO!H> zWgk1B#~H(g%3S7S#D(jOeSx5f&lhCc<}h3~dVh@8&-9{W*(|V{LLkNwJ5Z$WQC?%8 zw&Eg~Zov5WrlZRu6R=PY5pqZp@A-p|X)Hj0Z11B=(<*-naz5TSK%$!4HNbV+8e5q2 zjhs93unvD=Y*k!R{S%MBeFWD<+vIqEvJK0#pap_6b{mqbDi|Wo*PXXNkAGD^%y8&l zC@UkaA+1J$G=K4Cdfve}n8xC1>^q%LMnB-M3oer3%H^y}(laDm6*D+=m(6p?A?+0i z$-GD|wjxJ@ZMdqZ?fUL~RPyYE2gt%Bh`o;~_xvo&Tm-6QxWN{p&@0#11t5)PUzl~R zvCRdA31{rf=<%{;Q_g=8wI1R}vL@JB!DE%zbgG(m zS4M-*JYMmXbp3jCG*AIWU}}y(=>XgIUqDTxO#%lB*De6M`RM#EnOXiA>_KHiRhZ@h z5~UYYF38?nOS+5UAc#xH=&zv*hkKj&W@PaP65&FmT+9@Eu6cAkgOc@hKTy9QiD>7` z-cSSLTn+WAR~P%MXv(_Z@~rpadtAE@w7j1GseqOYoqoM5DI5m!EdZ027VUNY8-2(< zBvlCYTBH$}6-DfXWTj*?)l7;v=4>!|>|8%mA18CnVfNdc%im4zSFHEJ|%dnZ>oQbet z-0~W2;AMsvpyZh;j&nRoEO7%4V7ALqOQ73ia$gFkS{24|uA+*pR)rDY6#8k>=XVVLlV~qJKeS8BTIeG;qWD~oO;5%zF+}+Cgr0U5%COC*;GIkAqbBC{7P=0!;LBK zeDtoBj2OF}X4s+dn*5>k>k1eNC8DxQA86<9K=~mS(<@FG@zdeT9%7h?R z&i|mSjGnR(`OF}K-21jbk+>`w@VxgsH+u3O#gQOE5JdX*YE(E-f(x0%@(WT){B=7e z1^PorCBf(M{3oBK*rE7I%|ofKW$x300##bG389*2(nL~_GnGH*SQecG z!VdIn}>3GZRmJoC^h~s&#ifRvH&J}ob zI{{k&|6$3Vx@5PG)ZnCc22qn_J>m1+%*aMcc7-Rfc${8Zh`R0>-m~@z1#XZ z;~7QCjB)}Ts28)kAMHx|*7W?OD1fSMT(H2;9bZkI5A9Jg`F#is`HbJqm7#}9Fg8bGhK~m){{IdVMc7>Iz?ZcTlDj1nr&PL zDBNVOraeNw3~Ad(jvPY5?E%oo^L0P6?dZHc3MDT4nC};}6;s`0b=OC4Zy#&*b87~R z#e`V(SIz4H_k?XIlB=SrexnasaXL%P}jfO%74H+<}`V!Udz`~hjlsr~vEz%U{pKOboj4@V35lJw?zKbpF!d^7o$ku~P-FR0)PTNLX7~5x?e)v6k9CNfT zNF8LYOYS#*F-K_BCdny}0CQ+}*q#5HU^y?s zb`T>yke#AGjKfiIl$iQ+Nz+m8W2G~WXP1)oA) zE@mnf*np7y4WuD_3wf}`OPG4rP*ALdhS!{(Dcs17kadjfC-L%?hk+6w$Tbd*wq7j^ zlv9fC4RZ!^d3A|;S_Bkrz;h1X)E6W{7$Q-RV*zJI6)8ay?Pqip6{Lb2Od0iOrOf8T zYXP7}X{nEb-TS;pxI^aL$OVoJyg4d^2hT7t`}fau3~X@t2UMULsL)2K$N8?)#dxQX z-X9^G+D594S`oDVU)^d+9AMU8XOGuno0mX2lS*3Qd+B*Z4|8F?hgc+5=EF-JL*$ zW9L~YNw@JfGpD_A1}4#28our@Nsa)|Pw zEgrdejg~g*k%Z46fY@!wTHru9S&TY%@j-mY`cmmqa7A>A?~2cQ9&Lv_ox~UtueZd^ zf)s3vj;b9gjCgd16TIJ znKl1|X*6TbU8l{fsPtxL^`qU2nhS0PJEzq1nhn#0V;RsLG)!vu*!WZb&YPx!pX-z* zc7jm^1vi;J5zb*^j3o~r)sEwn`{?k<90#Q_Fc&aOsF9kT4phQe8=081O_Mz!9w)=F zfc~bk>g;oy_fcKUV9t)~9NEk{VNB>o#Rq5cA@A0_mBlycUm~z8O(+2dLpjAja2zbz zpKo8W!+6OZoiivD+-yaQmrnRq-jMi{$ZBvt^bUddM+vBbV%OXG$AHSh4U66`+$U=F z(~I&ajHmYkRn)s6o<}^<;uNq|V%b64(vuCvXnRIAF1R5onNkfotvpJ(Ary+8_gEd* z8F>zXJe~E)+QRY&s zt8p-094MoV5jzr=!TIV)CE}6=1mJ&T{dPu98RMITU$tqOVD>Ry+}yxesbmm7}cir zx_aRN@)jw{>b1GX$~+<4YUYCGT@^o1*bu>Jq421%G&+9P(c*s{Nn z<-&TPYT@X3Haa+PgR^@nrWi~j9Vl-{6vTA*Qq~Dz_oEI9P^1|&k4cqDxdWmPnzR$ z?VD!|>nCjzUL##D$j`zD&^dH%{vE2gl>vM}W@5yH0bL)nt5SMUWWy6PeOw5cLcs=+ zFQh&E`FpBM*afG(kM6Y?9FmMxDma7U(~-IuJOntoufVAi3XN(K)#hB#mwIpbj17CS zZh!KN6H28=EkWTrKXmlGqT3<3W3%XcO-Y5)nF<}_Z(s}Hq!`|)P)T(ch$6GXKj}_G zRIT(+mJWgbb{k+2W|R*+fgxreb`FF4;pjHF)d(_94qz?_&$J`M)3n69DK7lByb=?f(M zns4y~+GE6;;}I}>CRK;m1Nw2(*izUe>neIC|5$GZi^qNoiUkLRa-0Ps9QeQHsuhup z^s#0C2kyiyPp01%P*(~B-N~`VN$NU@-suMLLq|hY1&OEl0 zz704qMurj-LAl8ZCn6*Pk`~_;-u^pXs-l4P8o=&beqxP0m zgF<8pv)P^TA6h$4dW(7xEcAl#LO(HB#~SOXtazDdpHzUYb_Y634Me`g-DXG_k@#iaAa6!!{f zPHs<|%NJ6E@yZI^l9oS|nir#!mKngYI)Tnn?}7nD2V9>$E+CQeED^XGS)3m(I|fa= z^&V;yfpVX`X{4=LTK;M!`n$4zx|EzN_J=>mn@fqzbrKFXK4zEE@UEYuC zEzKsA3dfp z<~=Hqg51WRyZ}i?IV0qncb!6jbJ3Zg_#oKn<%h|riYjUaMkcOoiFOU&f?*^l-P^s5 z3HtEaPprBw0{zWbeBgLG9Tq2vsI1R0lmEC5tvMpVA7}L|e1H+G9*d{D=!BR8>V{x#bV|Zq z;=6oBXoYn67Edp$ZG9}3J}`zXgeX-4z+j2CxNmvR{1c|hcXE$b9&H~9Wr@;U={=cW zvdx7XW8T`ISHx~obF)2?Z75=YxDjg46XG*YmeU7|rH{=JPQ#G#EjxCGYys)8jr6ds zA3LUtuLyprvJgHd|7t8wF@7M)`o2}LqWtHMLK43+PjI-7Pv9g7u828=ldLLrI)#Sw z#&wp1-G?A=h!QE^eE?n&*HMTh#XJjZO zLLx?KSeEzb6`Q5y{4xVY6z>h&D%_s!Q}Stt4KgZD!J_6cWmrG+s)x{5wC%IVUw81V zSv>O!ZjvXW^VGB?gG^p`;c?Q-f+rbBS?g@4b|k%>IXR`2lJq!8x$r<)fnq3`k|yNN z0eZ&8iI6;um40X(Fue0;-ZW-5wm7e^C@7m0|Cg9$%HAUXFQp0VW#QIaHD+_8`x0Ea?XxfCQ4oA2tL!OEQ3iMK#X3%FvT z1ERJH*Mi5J*Jqe8)U1a|QPVFhciz%rN0;7X>DBGN~@V#n^QZC4jZ+(8hBuAC{@ zEd#wiY{Vo>(u-0yjat=sog**C^6o+W*aha-9I&N@EEHl#0)iB*d`0x5t=IVeW$ZbzED8vH=~I{tcd zZK@#X-hP+|aIeFb*3O!OyK&aN@x`M9PG5eMfPu~g<6?^Atn=(Eew=7QCr}9dP#JcK z?kkh1O`zmJ4K|RnLeZWgJ-)#QE?R_!f#DANCWY%HC(i8<8-7tW0_;1kA21MPMBc#< znJ5&nJ%WXjIiQMyq)p}|=ylpaLhLPY#>dbM5ynAR;4-F@(-FXGf(Jo*pAgI7Bx@*q zuW@tv@U(`f_J}MO9C-THx^SE1^MCy2l884XZ ztrbzJrhD__4z^s@C86L%+FF&%>Hy(y`gK@$dy9LA%7VHv|K7RgV4wACKi9HG5a$xg zc#wmIPdd%y5e>dyJDW-S2>piB3pQczk28GDXxl=(bN?+?@x~;C&5yiiYlZI+9;c61 zdtX$!=1zEngQ2QLa=N}gl&zU+6$|(RD)MqU#*|Y58X}jK{lbL=rjz%QQm^A20vPukoDs)5(v(1Ps~e*hSX}{_;+;PBT9vbgSN1ay9ecmagK0$5`8qD zVNrKm9(r`v(&ib8M10Y6LA}%H{^?6dq0ojxXdMm~=Ba9kG=I9F`&>(F&j zU&yZai-45k?lhUdMdo2)HX3egOh)Yk-*gLe=n(zlZZWa!0kvI$pGTpvXaOCKLj^a6 zA6lwMb6vEFU#b6q%?flH5n0UFaIE7_PQe>7=qJOTJLC{#Fe1Jq2A#Bo+7Mu`l zHia{xWz`G{@8$j6Tv_ng3<^M8Ze&8h_tUB{s!^346@DA`$t+U=R)ep$OJ{xII@(-I z@;&QW*M0yF2glotQjnq#a9uG|I!J@WVD9uBp*ko5v(5|E{blRgzeS+hnmX- zvzeLnxP4`@6*d$r>_AN}q1+SA9m2Pt0$*Nm!bRf?9C3M>V8$vu{Q8DB7W0Yn2K+12 z#_T-qs$UoTJIMH!x}F@qr&KX@!Sy;Oi!fWIHRK}&))1_v4JrV#7zaNbq)9bqEnu8s zAIwR3?#53&a2R%*UcDk%f(<1wLGjxb$EV0#%_}N9l?&g$3pddU`gM}w7EY^N@y_0r z%=tLO7bAp09ujNY2F;9T{4zIMZ6m1Jm`N*5yncBUgaVV^_}tyQWHB#~i=7Q1ogh0y?j$S;zw@Hy}nWCB$qKiG^;Q z;gltf0Oy%;0aQdTx5gRCnF!5e?AGQ4XDx0atl?`l4Z|m4PY){TD3m-Z&y1=rIpl1_ z0wMK8I%r|X-2k(GB*p`?VW6=6?7+m;t>ok~WRiUqsj90`-A&Nk@9wxpJgU5Ry zqr@2Ab08H#j5nUR;x#P0a&r0Sh9~m#^GTXF@`oRg}ie)sJ=` z^K|DNmVW#&B}kZ?7shKJoeEm3nf5VLHrnH2rtG8hE3+1ZjAG+ZTSf_6xVWJJF*C#` zYloO?+s>yfM)YfmS`RaEWYz%}76%LT59P!@{G&nKzqE1~nj3zGh26w_xwO2#mQv z7UsNA?4jpX-bg@6;RCDJ z(#+s(6rH9;l>MJG328gkT}`dV@guVZ2!0ROk6r@%59W!;5T!74gGBc5b_auzTg zmQc+X>dUA;m6R^1ZSWd(V2aa|qPcuHa|f<*&%U}RD8t(CQj zBCX`j4M2W^Zd4M_gq23+O@h@=CnIL7i;@pY*(ojLvzqOLKWDo^m$iakWUk1J#%1Ko_oaRdM!uw&B+2Fu*wYP*EL^zMsmiM#MF!* zrY9{p1}{a>^eX4ZGPftkUJm&av;1i$1X_LccXnO~TfMOd^iWqz;sku5>GZ67hOErS z)f=;)f&X(N0Y`+7#KnbrqLA3!1SIo0`QWF9AR-j_i5~~?0o;D?$|}Al+Z)=RaHy2Q zTU@Z$H5wkvmz{>02}TwL9*=Nj*uHD*J8g_)p7}{gP4LuK(#c)@rG>OLA2OE2KHZ~8 z2L>`YPB_`+nPjO0EtoLN78-;asIszZ41%@KatN-DHd{lUt$G+(&4}9NQw+B>ba8!& zr_U_fwYwV=R7RdnB%_RyGJq(Y)7EN8#GxT6^PO<+yj>{S6J~j$nbl-;pw6&Us}$J(<#~)9YjBKwp$@jql(7 zF`2CwCMintPK6Wm%P@wU_bdbnyD@aiIl%BPhRI6bp3<^Be+Pde3d_kjWaa`*nP1K3 zH}ej*9;s4@>8&=jKm4?Ibfzm!&-_3acX!Ak--u1n(>!bhKS7N-01Me5EOr4BQ~oDY zbWRp_qt5wP_g=DC+ov?1lRLzXQ3b;H7fI5EMGscpol*y=Gx{zZph1JgbvT=*`;sS9 zsy`uY^_w)vqC>)tZ=&TYlBFcCC#ay3wYoxrFv}ZcQ5*ev*jO>Cyevd3E8>=bN3rV( zOaPcAP-ND7<}@y>;1?N?Druu|Kp9u_e&ekRph;~k`l4}YQXF1+)dSsR=toD5 zm1Ywrv@;v%!O*|HKFoCBE<9j=ceQV)GQL2PpZZ?j(+oF*jHeKZI0chBp6;?hWfC-h zdC&S9s$g(XbH!ZoeCT}iZQESaHF4@So;7G#JVj7+ga-O=K)KtFeU&(+K;!Gz$yLYQ zzwJJZ>R>b8xEifg;_~%~DoUX@{iDA`H74ZSMb`CmPRm1uCr6CjRdiYOO4^R#9ReA+ zx2?>E;yAd_)t$K1;=3M3DgK=VfafbHB|Pj4)0J$Nk_%3pjRS0W#cm^!w9nQes@Tmn zSE&pIP4;wRpj0=1c@s|T6Ne39nVxO?43I-th=nRQ~SrHJsRD;&)o9f6-`bN3Vm&~;#)MbkvD>! zu&W@ti%M?}gd?^#sy4(DKicXh$F-m$silbH#zHXmqT)K8g>ap5hNA$oeX|bBW^2#U zuxH5y(^ITPCcRZG`_EsOErL1C3SkpRg}YC!-tp!!mUmWqjW2my{^o6(MM+U z_4W`xoYtB)xib5(GaF{^=A3(@QnRQT?PHbaFAXVPt|g%bSO-*qKI@A&I>|&RVMA=J z`n$Wg8|n`?~Z-5LsQR2bzFZJ-&aeKk6#aKQEzphOEBsDQu2isIL2mXY(XJz3NozuaqO z+B}ZB4YA1Eojd6l6Cm*pp@|tQhO^npljk^VLPgjXA|@ULpVH1~M&B#^Eh308n8372b`i17253OC^VoUNLG63aYvD1yXobqViQfUj_@J^#_VMWJ@Va$Rfw%rh3uCI?H#Mc-4V-s8l0r zVA&qi>)**MQM?$)zu=u)(87#Ac4kI-q0EK0jWE&4rYGaj|j1O=!Z zt3gq1!zp*fgaE0)3mlOBuKY;3bZQWlu7N7wqn$O^g4jD6wTJQJff~YtAMo`-)Fr|; z7{)Ex{g@q>K{1D^IG2fjpNgNy20yxg@*qJ3JM`e`a3ECv`YXg`=A8!l@spoJ>otB3 zNbvzZT7r$pf-)bbjYR(8(f)c$qRAO zq)90wV}Y8bt&r?27kI^%oOX(z9IU&r_5Gd^JFtVJqXCbQ+mG&~s*U9|{gfk{Ek$#8 zbgHs($hAdr%@@e6@if{bX}rZGOk*MMz@CclWI^W92xi`PJ#MsZ7LRHI& z7rYMlb0&$5&u59PB#_PtB$ttcNWd1+W)}FlGeL5Ok!^f5Px#2OJl|Fvsz8d7H2-23AH}}vY(%wtchZm(b}BXUx7U9k`N6{-&!d43}c5JN%Ib!=xSo4iyi9cNv7C3 z4&W4z0w+|zSY&r6N!G{(y&n?uB)Q%N_u(X!X@^H0+~3$dIqY*dZvw)_f`0ph*68~Z zsWxvQ=fj-JSm-L`LiV%X^rCd$_4O|_KWMlwtRr)YT?2F_;h>8nG;)Wfk(n> z0UD74(|&AZeI8#bZ?5iLsrl)sbi(7im$23jLQ)|F5P|FV%X$vcCq4cQ&ailZ0IRt! zwit*^@L9ef`q8#H*i0JLun2XBS?u1?g3MQ*eT!K#CUl&4(j=?(#94NyQ8m+-&fSwrPSsB>T+PB-8T?bCBb zj-(dV>S%gfS+Ji*U;g2<+!2gbZ#lj@PHxY|lSE156SZsjynp_rOrKpRslKBq(IUgF zE&GEfED5m~XA1+ez?95HA-Z<-W5D<~KyMWA+a)ZCi?smp4i{I(2>Issr_tW_IBU(p z2kPYzn-axL)U${kDJLg?(d&=}rU04!QY#WpN;x;;rm`VD+pw==HNN9CRiOqa%l*rw z_XWzZ{>i9!26|QtRJOe*iL%4n4ujggf!5B-wu_OtnAxMGgGXD>QJ+oZykT#Y#Omq@ zE+moMkb4j}51!FHo}nZStI^##ZW3Hy*)3(615xKkkHvVmJkG=q@@|T^N)v?T)iCpA z_g7p~=k_?BI?pE$+&I_ENPBl?)90h8Jw0l?k>ZPST~57eB7%~AEDWP+$e6x%o0MZ+ z>H5)+eE!1Rhf5J8g%$pGW+#X&Aqi&iMKH8&xq^|1JtRq@6+SUd;-h4y1Vjt%cF2^3 zI}8syX02la*JVA~;v#c!kt!Ql2n6QwsDG7ow*WIdK5)lFvd?oCj@qiLilS-McqOOj z?#~70V5aNH>6Z8MgM(pl?o_U#W*tiB!#OPA&9liODRf7LqCK@TaO2)YSlQkB4MgwA zLNVV7S4@e6sTunNFxYG=FydtN?Df;sspr&-TcML zo>d0my|8XOD_X5(W&Z_1dfk@`Ajeh}9cG0+md_TNiEDn{oUqqCNslB1O} zAgJ5VqsAo?@a9tX_7P*BZbWBLPyGcwQ0$w#ij&;#p4fnS+CBf9oL>8)P#q*uLj6f; z4dr(AUAUQ>brC6#Glp$3WPSA4Kf#i?G$>WGXP!myF|jl#iaj}bnrBGa*Ad`5FV)4A zHzx#TgbX6Aq8DBXwm(y)&2KDv%Gi{EUv$sX)^qxNq9YN)e75%O=*yX+v5IrIM_|f3 zF4-`mskLmr+n%~Wp=Q{-agDP;Lj&j)7FTq3h7MTdyNdtx2436u1JUYdR^EBp!(BU( zzjAf!C!!$mYKWgGF!UfPUxWS|&hHtg=$0HSq8+NkMoS0_p|H)eRCIh9KQ}C7S8q6q zsunHOs&u3_1rOke!kdqay`+dbpdcmTyMOtcKl$x{_}72>yWjuur~mO^{)>P0r+@Od zfB5OI|Mj2#!*BlZ$3OeCfB9$s(|`HfKmPsS{SSKkukHQ6`pbX(fBxaG{;z-Wul{cf zd+lF;`9J^Wug1Od|Nh^u{_y+%^xv+28uu!^_nSXK5uCq*<#yN;t>xeU^oQU7=imN~ ze+s$KMYTHM(`N1Lp7uAB#rb%5&sMd*^KXCihu{C*Z-4hUzy0ZV|EMq0{lC#yfETgf z_~t8r_xu0!={o=`K}eF^#O*yAheB}1;3>(oqO(LXfNa^J3wGLm1Jp$APFj1z`l~;J z9Ig#$TXME7;=+p01#s0 zMO6yNRWhbfo)Fos@JNdW^P@RCM=$l;5O|sIMYG!qR?#8Ias=X{qj%is?g`gwhCVf? zBx`6Tk0Ok+WOeE2ubK}LI8NoPFaj(@t)d!mKolvtX9ApXR9Lh|656N(^|R60ed4k< zHE2Sbp>&CiZAM4s-~IIO|M;6f_{0vkDba?vASqzmvFXlSfb_%*73BXm=E9R=InXvx zjkcy)vFrR>uyL)uQ|Wd0-+6!S>^8kD``P~(eimz^Z~!Jw+mZ9)Q6uI0#VYRFCiiw( zcI^|UKn-mI^b9!P;k_9Pq>Wa15H_3XKi%A zI4x}cnjuw1AEt)uyC5G95}O%VwRS;Za2#i?b~==AKt%TJL2>{${{Q$}GaUB!oB#To z|L_wC_#spFZqJam?!e)^vhctD_IJPegTE^kj&uo%+d$OcRj||O)nPRR?BAa36e20^LM}f z>z{O=QLm$#RoZOZMzeSSx1WCZ+n->4&?PZ<`0>7|+6c;*rB{^H_s%pE%EY-3VUtuQ z6q5>d|L$+`8^8G@Zx*)SuKK&*{^NgVK6e5hlgc0)@3{RigBjk<^3pk z6=p&qa}v+3AU8GF0W}~`D$lSLw*8CX?Cgr-R439upUpg%vO5#XLqG;kZ+@vcp?&sM z_+o`oN=@+STaDUKYhbfJp@q}+&`^cMw>=2io<>KnD7-Irlf{NbG+-~TY}wXB;8}T( zIx|rNJ|z4DB`~MnRYeG+`ZX_4XHr@zI5HM*G~pH&Ip@tJLfnzkWRN;Q`KPv?%-;gr zHFZfAlLEXM8g(V^Wm$3h5MU18-@&4zrRaEhS8K>(!Bwi;pSQ)Fy$c|dNENBSjxi*m ztOKa2A2!;R7Fr>Gn2W1tAu?4GPn~?&5N!Z1pfdh;5Rez+3^(Eaxw%m0Dz)1{02KkF zR=P}0+p2T|)m|CouP_0%sU3W}E{5F@AtG^af1u5KrdM}@GrqhL-(FZW1ozuE{r)Rd zi#juI5_=FrW?>tr1m-l;ZpTfMS=R4g^;bJQyNm3Dta&S*PFEcxcU@AeUVeAw<2Fz9rMlwDWEgQTFz>rK4#!2^Fc+YjADuUPjd?WdKIU=tX8; z1=9`fXTTB*qvOqZ`!!u;`sHCWsUumfzTR|oCT=~)4~IJaV)MDkXNGK8b8|G+)sYCa za^nsw%A5QSMg?{w+3R*o8kWOlvF-uEut?pDhfTX05-iWazJ(9Nv0my2nI&!Q0J`x8 zUwecGXtQDJGQzDq5(fkob5GD!-8}o~*2MDbEqCU_zPFtKDOcAJk{}4kg{-d^N&;P? zAlOWTd49FNMA2)P-?Kljkg<&~+@98nJxKIWa)0Ok6vHd?!Q9aV^6F)9V|xYMihN=@2)7@fU@(v0_r3-!s}CXdJqs^0`IFvYhU^3y9luq;DXmF0W%Pk zvh~v!Qlo9Qk;AeU)yp>K+%?yLbDpf*AAW_yp3PU;Ay+xs#lXkuk`5N>_aG`9zg(Mr zOGN2c5Q@Ta-znL)GJcCjPFs|XJ0y=}4KmYNA<-IoYlyOsH_y>M20__RAbKpM`|057 zqRrYywe%{g*CgY=ah!yh;Tq2$-BYLCDlznIJs{@m_2P^)E^xKR?Irt@YN@}QYXMh7 zTY%=oGi4OZW}xJxdlTRwa8x+n&|>el**9BP)67&~0k&p)nM76^)zMCU0^eIZfD|9u z6Iu7YN)GN&cHuw98DE;DBFCSJZCrde&_0Q3k&-QrNF82$^iF@ArO)dUn0LWO4ankN zT4ckd1Jg5I!;n_;6~*L|hEyvP(t6?xX)R-w<_H_o;eq{O74=ufdGK<3 zPYMIkQakFci(f&3hGZ^Of($iE7iBl|3t5K!kP!B*!QTb@MMZUF_)$SC-7Ng*dKoe7 zZU?ndJFQl02>TA%P!;ex4RlV#i)ZP@xz8iCG9FaWMD5=;k-a-y7NSD^zP`uV^yx;} z5h3OHGpEaUg{~Ejg&0S}sFIeTvXiAgOMweLDcfb7K7>`vpFhj=swjze7Iystu?`iw z&N!=pJBJx3T{lcrL_2NF!-dGrpfpb=h0aX*m4)f+Xt}JcdvXb>4Vnw;VD*oa>gzb; z+7H_y;L62YKx_Xf$%xVQ4#W!3m~w3f6BoI!j0)J`j=^|Pu9<8chtq|2u;9YF&(J2MRX}s5r zpN;{3T|P>eW=5qI%(ai(q8>qbM{U69=q5cvbgA2pH_?t048DCG^j#Td860T?7siYC zjwb9ftyzH@)8W1uBFdGy?4P;B>B9{|hUp9MZ{vwZ-*RFic%TrNK`c#v`%A5Dbh0HQ zYz`{Mib|hxt_w5I?+)sEH6PDB*boUG}t(71Bpmx zv}4Y2P2rw>-Yy$w3=>FGbec#s3Zl0(6;~fZAk2o0Nte|Gn`CDx%w38FBE zoPF4GMLyaWI4FfuWsu@c2^LeV4+GDcPD2%1a1pjwV&aa^qxWuhS=2?;xCucX3l=2l zs@VB{-)454>mrqhk1I6M4kdkz@ub%rQ|xH$%5v!Jj0*)D_8)sqpPeF=v@mY#tz>OS zj+0^s^}9!{9h`~f7Pf%x&6j7SJ?~D^>QsotCm>Xo&T&SwE!bSacxNgfR=Zr-#G_b< zPu9hDlTIz9Q)oU&jxUlfn)RW-xJM@{qt&s+HaceB^5zOcxew&@tuG`)F~K)L7T!jC zN;2#vt0VgyGwdINrv$UM-hw+lU9`Wbc@*CsE15%&h)y!^$Jw|kkq-UQm)7WJ zYjm>j<{CszuzTrn&AnEOCBJC||LTk#uXs~<=Ax));>U}Gv;m^4432cRVC3Fca6heO z27QNO0}{`r(0%^yIt((lCo_beUN-;#9qf{yigUyOfI@)K6y{a7KZZyA7WEywiy>qH zyyTQ60%pZA-D;-`Jl_Ck?qF>Ur%B3HB;#_{ewXouM@viQGpMr-=xViasenTUg1pX* z6Mb21u5_RI(uAUlsu>*8NTcju$! zC!Z0eFYY$&FDcnEA)SFcb=wOsfz+Sq!OF8xW}Wk%Bvtd%_2>BY#c9LJvw}$Z9uzUj z?6#`{gRab7R#@rbk<_T#{;>}SHA2-;-9DPc?c=@3JCz8}XH z4KjZVHD)wcUW;*1;XLjzi%OE)wRHIIyk&z+HgO`@kwrzHz0SVbZ9NOnCZC@rgdy-7 zwF{(poqYiFwSDSfDv5Hi(3fNoc^3f{H`{b6ovGL#29x^*uJ6oHVqc&jB_<~fV7B(a z`-Q^-;JW$XY@>l&{zLc3q8_zk(=uR!ut#hS)X!9MM0N{htO`I8o2x(uvY9*hx9Im^ z`pXk08UH0YldcuxxON9asz4VM*Xv1li^$0`SI|HY zEA-@EJ;NM)T`~^!Ym3)Ld(TRNCJQ&8%kO{wgYx^Ihw}TM=gRLt=cK2y40;(Y8`MNZ zI%;U)-I=iDA>`G&icv&u=BKxeN-jMXJP3zXGTaYUP-i;|(yla+c?V?dy~nOYljmB} zw7dF6cMr2?8|z`pMX2}oQP7~4C-Mr!724W~?%$KeO8V&8I9ZpF%fy{@Iw8H}G8mrP zY={n9-D+v|)=ZahVd?e`qNUzh(i0CzA2sj$N?dHhw%P97zEAp_>F^p#SDl@3Wr-{* z>M}>eZqGiC;XOs~`h?;1<;K1kZR`TKs6BLAODb1r4Ws$=P5F3~)|$G)M`tr*_ zFvEI%eg!oaTtpAs(1UO!@qk~hkNuaOX36}F7sQ4uQSZzzxKXgD&WM)wlHN66&zfcz zXKYyX$$0t7?j&8jNxIke59UJ7Si!Z$c@1v9&Ux~3kK#{udx}c{?8;UM&Rfn1>U-JD z+Uq*OH18Tx8%B8R)4S|lUyvbJMNR}p7~ZX^wEh?!*jh!;D%e0Y8ks#7i40L=_z6lV z)kdW^Uu+f*!?kRl4|P5qdaFI6U_3=X{t4^x|~OWFWC- znD`;8t~Hvghc)A|g*KpV z!o{}>J3J;`=^H|?Zj%b(0!zK9exr$whKyPY*J+chYwj8cBLb%R;C4y5e%zCK2lY*F zkB|{L+qbYu$cv9b0|S0$?oZqPn=IVJ&a7SP=>9<;65}uhVMyo>Z_*(Op%yW)EvA8z z^5)ryJh1UbOD#d_G{UgIKVf(5S#|6<%Z*G4C{mJ2Tw1?z`*lJXS|H^>;IbgMU2LZ>hOXs&=jY0 z)dKMqxyE2%nXRcmA1gnHu~iyFQ5`BsQd83=)v;TB!4rKBLzPmMP$Cmc^HOc`_RMZ4 zy}$p8zt9AMTc6MWtd(C|%PL^mjoVd!o)WvQl6;?}bn#_yeMN2hMKUZ#(yuL`;+33);)UE>ws4a;0{FX7bEJBrJV!iQrx`u$gQ*R?_B+mN zFHXkVvs2Ym4guzZBBmiRBkrVl{aA7HgteJD!VU3D@#X?%$jHlTL#i_JO^@qPH+Nd3u!u;|Mq@gl=~yNw=;|`q8Z>HwXDCL+p5Y zL?X+*(8?*Q1am4dH9U61j@DZry)Cm3NlqLHOY815+T1mxFY*pe-EigIlc;v=sc2!;7q3QVEs=<6oqP;x@`X?&FRiQK?=Bfvls*t(2+|Tp z?_dwaMmoIA@Ft6dPRyTSng}HECZTUQKtsNVjrOwyFVLEmmMpscmK*?U386D`Ij){t z-ii+;U6T>;H3oSCL8ehBBja!wk)Q6)qsv6l!ug?`Ql@qYhLsd(W_5L#I#=4;fqLw8 z|K#$>*1l+?SE_uppPlKIXyb8!|8niB_MGT%4Efr z0RSmv;=@l5ij;H9tu!q~Ghf90>)ZiZ@WI))D|RepS(VXj3oM?AyF7dmEraINy|jLu zsbv*ZO=Icwkqr(|NF=mDQ;THDb_=4>h^Jre4=eD#qMS!wa%0jfOxE)6NU=_xxQ2~7 zuH@%r&3w^)5p-9r9bgI;ilp!^ib~e1m}gEjU;U$P zce0JH4Ml(Lh3IG>j$hdRRHFyEu*~u=>@xDw?10nL)*c|7*8yxR+}8LT$sDp^m-37d zYR5;srX-ed)*KKF1=~PXbJHQ>E@d_v0`7e!ZOrf>$sp4jU%}CO{wS4)o&U7t00oZeulJ|`6S?v4R&zUwAMTiCT^&UrbK z?m=?*9-wE=p-D(=p4L;iOI80cTp3;fW@NYq`qzG400gxisigxc!**qy5z9KvWc!-+ z7FRtNJuY^uL`mi1@?20}P*~ddfsap6n3T>1AXV1uix6zMZDApChzDU^*7?VQwj1>B zMc~~Ceu2;SRW=65dW{tUs;HK``;?<;##ZWXMQ6*N5npSHggqU)d?qG~p|oBx+xxAc zT5!k%***A(#2lS5FFSQCLuO~x%^c&vhytX^(SpK(sC^$*uMi#<;qkhPWNjr{TMDt# zk1f*a1@e}yhkVPvmsWDeIyU}hDe7#B%2v>TkFHs#Ws&V5A`{_kCQcBqy`#n}v|ahZ zNCWEfc|SiKqOtt)z{3AvLltO zyDB~eI)Rh00_MSQdz4jf#p!Gg7`rD$GZ)=f zFbMMl+qPKDImQ+Fx})tSE9p z->q5HC@6mz^;f7gxyVLsNNd>K;eJSctICX%z$`6>PD2b7OP~{|H*CAYB`Fl$M%X+Fs(CXB6mytC=PO~(CY&bGsfdxro^K5j##*&L)Pih>Lm z;^}+RQtjFhjWhZXY>KRDThvAq=C0u4;)YML8fP2P{gyXUs6`a&-S5EN4_LI^ZJ|1V zr3JSTwx#-NUY`X8P?21&x;kC;HB=g-#e)omx8VTH>SlU>kDehS?!EPvupLK@Wg^xf zLnpZwFkEEZ3Q0EqjQQLBdeV7|reI}pi>R*^9H zo#_5p&b?P?>{RYeIBMSZv zb)DEfEKNtXvR&UHg`i%!vse7C%sB&#g&z_>XZjVsJR<_*T*J&7GMUg7%%jr1Sivim3yevY00kJ}^g8sOhzl$@P9BZXd$ z)*j-KC=_woq@r1Xs%!J*RJA4a$%aV(E3S{ z-Ska(n;(6!{vfIvPU9?_y8hMYGWWFH5*&`PfqUUf1h}^OU~^R1|Am|S4#Z1qSP?r| zQ9qjtq=)W@(cu)T>fC6f^I3-$40r9MK?5xNCgb&O>@^O1{8CI#2Q0_C_OFHa@Y2Av zxR}l}ZXB@GcVQ0n-Vdfz4LnRh(vv-Wj}AIfw?j3n%k=r!?f`^A-I>wcGX0n8kNXw5 z!Tr$G-FMHFMT_nBAT49i{#(A4=I*vZ~f}%+u5Sb zuo5*-i{QOuCDx)wi!kM`Tawo_uuQeqoV@pK28W)3#lE(vtA!uO1ZUJ`PHh zSlQ)XMrwZCJNS_WLW3KiQ_O(;io3}|tvQS672Z2zmHbj}k(LBfOcuay+@Y^N^n}r` zkrU$5goH%ta@z>Hxr@vv-P_-3v7a zwwCH4ZnE+U$bpwXD!=Z_mYyN;Gy7mT|?Jd!t zf5Iy2Jn;$e>+$_tG=B>IGUP3){I3XxI*Qlh^>S48+$t*nw)}qi(dnSlLv}%I)fj%| z8}%9*ZgyE;V1JTB)H{#K^j(IbQ>oF*5XsG1s8|K~7R~@kUcEiqHbfrGT)0vRseV>8 zCM!fWafuF2g9cKdlpqO%WX{69#w8pxt~Z%0j+mDSYZ&Nh_%Xafs;Zz%6mOoV&u1z| zpjMJ4c7(OpPsh79);sw|A5W*uzD2Vw`wKNb8>{r?*opVPGpGb~9D7bwa5?aCu=9aH zQt?;D7Qw9#1C77aiMH(qiRP5@;MoQaBkC0}i@`Qo33D+grJ27ubJ&hdZm$ z_gDY)re_T>0=alj$&W`rM7MQIjd+ZYNk$)}q0K_2mB;)#a3~2sj4bW_tB|y|M~QT~ zRu@0cG#bz_S{VEKHA+Xqqauu1^z1;r8XZi>$0enl5Dqahtpb%S6Wrj>A($wNP(L6V zoCKTF$_DMEon=vNP6aAN1+^+rgLg}CbLw~69(pS<$LcKw`#95Clmd(#0qM0`w?Gbg zf5g>SQ}m~x>#Gr|Jx9GxI=q1uXdNfrJxNm7!TKd%PJ1FeFE5XLp`Z zAvL9X?1_-GJG2RsIgifPgmVsGPmgf}PDXZ0gJMRl;6;(IJ|H3A@I>p5RaItl0#SZh zbp6K_;Ej z^r(BiyhV>~Szd74ZY@UFR0rL9QWuq(r1%k)wsfg)$2`*dHj>RvbR4X8VNS~40c{T( z@B|1NmlhS$PHwEcJ)uOnJB@1VX`z@5i^)aPJ_9_52<|s~$@a!SqiXnFa|!xJ$b9zI zY7B0nwQawtFRRSPp2Pob$BdeX;`w28cb;6mqRX&W^yb%)ugm!E@>OPMKQ()Fx-ptt zlndlX5?VccuS}$BrDsL}56-*hfgjADlOiF{sdGdk1)2((9Owv=uh)Ei6dfM+0k>ud zgN{S=Awfe$#f3?O+AkjCT5wK<%&eeHUSj7$5m}zNaBY)>HZZlJs(83mvrt_3>z~Z0 z_H2~^R)9lC?`q?v7r@HVeJh){5ipqg32hj3kCeLNwZyv*-DsaR5E?b*%ak2szg)(H zQ>V<<0}^L0($}h|g-!1@sy%}XQfUu5hGuGm)#eAJ#7A|GwYQJ%Y)BTEA%G?|nOx9X zFx@8rxiNu^*(HPUc1k#5y7DrK!%l{V9iki z%1RLMvzoIKwM?2v(W#H&mt!wDdO;}y*0ZxVn!eOgk!0PlKT~4DHBS}Z{^G(6rbb3p zxt+W@3fDjaR)+Tx`$W2G;36*cVKZmX0>Z#IrzG;cI)z+lWO4l5g8f%YyjTM0crCa* zRHh^r+&g_BuL-10N}Rr40LsQbt80_Q6rN&OLbi6g6rInh#p9Qv zl=2RV@E&Xpjm5f=F*Zswn|D2LF++MnEr!-JMJ_i+jq7xQfk$O4X;6%c-UkjGE;uEs zf|js{WANmvA<1pi!lnPnzU@aP^_iSH9&O%p;^$Gwra}HxzAQHYLd)1Yol3Gbn>=lx z``=b}WjZV;&Q!u;YQ!`yhBly-qvT-vGJh-YB)h<{~18bCT?*_@sr%tfkHkOmkQnqS5 zwvse8ir_Q~WLQCTI_XM$9)z5^ygw0Zu}0>^h-y{;!C{->UX+*o*0^g_LBcq7lA3+& z_0r*6bWdWHwOdw|U^OC2{l$;lqro=Fx{gkwcHegX&&*GO|7_|q-K-S6^d zIQeMrvW=+Yk<8`=yasSufP~nGz50&xcWKdnTFW&ZE|0nvPSlCAfFbq*WueP{YtW_8 zCwjBLc)4wVlpU$M)owJRI;${1mrk83x%7l+k9B$i5ai zK~917SUiqSpY6ZtjEG=fk&`vkrUr%Tz97TGallnI)5E91hlvmmFa(c2?NLr=qNW`R z=JH%wu<^O+>o0!L^z|2^>FY0YO<%#CX4+%mT+QUo@J51ADpKi(_(;-AGKy_(vUl=V zbB%20bK0Gx{F)BR`SQuHCfc^mHGURZf-8I266HzrtNFF&n@XnPYk?)~SMRet7tIeL zz*T%5-S${k)QtR~+L2dSLhw_sq5rA4DsDmbC1R(Z_0$9L(LRkXmZEdAiVz$$?oAZE zsEI_5OJY2+NVcy(de0N0>LIamryEhDk14S@{c{A8h$Llxs7-)*I$8*Ru7gDCHz0g3 zII1-2ZGs~F`8ZiU2a8bGH6`^K*4#Fzr}CJ-EvKa+Ojm#C?k%Ao$wf=J01-~w$Lupo zk56u+`3%lg(xXJBwmE@vz*N;&?i$}^WtTDAscrzY5iDbTbWi@7fJB(I`(yDI`BM-K zj`@22-dF*un2BWZhK?LF_o))prV6Cfhb?!h7vMSe4UuAr&Hw6Z`TPZhYZ zY2uWTpz2NVSr{&Qu=N|U1pd<-S+GiI2cjmNtrXtWdH7&-w4W|M=mY=sCQz15zr8m3 z_?)Y(0N&Z?W7kZxP2gZg@?=|yZMko780i2|8GhT{780Na( zfttIw)i9r24V~MPxlTEk@xFyxHah3v+Qcy3x;Zf)&5p>&CtUNX5qHmUh%^RL2czI! zG1{w(v`HA1QQ;6jP0Se3HEhI4#KFcO==+0(fH}D?+S896*>_=11UBaFVRDIfz+WCa zaoXUsb1U)sNjUHEU{9;@`-X@R@i4QG_F#e2JSmZ=3ita$TkoKZIbKT5Vwfq0UPWK{_h5lec% zO3>M&XtR&0pDIvobRC?{L$T=wzJ1ZYiPS5dYNA50dyPOX!|2%OJ-5c77gRINJy@d} zP`S#ir{&xDWz|*s$PBG+MxfG}{Kbe>n%-<dsHct1L8Y5E`^V{SJAm+8xX zT)Cx~`Fq-&K`>V!`~yb4EcB#4Bk;O9;?)+LUu!&r=3;ntm0%|vwsU(PEtRDvICeMz ztVM>5KZq9)P@vZEBA9>C}f?0qE#Ptmq&MN$s!xN zx<~L(_6DQ&dE9KM4KE0HM+|Tw5A--dtT}&_EDUrVhr%I)5SLr&G-wsY{1%oX zer4)1Q{^CzZTd-v2Ivu%3-ocj>5Lhp2U0>^kJ?Z}NcO4U#!WsZt-rE`s0T3mk8AUG z&-h2>E}fy0RI6x11Zth>zOzr8Ls@*W>yHX`rjUy86sy43Dzt=4-6&5ydusjI`h*c2 zt_30jS8+2Z{=6=#u3(e_x{>e99D7S2X< z%ixL;+FOj-OZ~93;Kib?@jyeNG+=(l@xR9{#|xR)*{OykYFt_KYV+!1w0e-`pUZZW zzIdKjlvAS=e8K*!9f7&)ZsS3ox)!Y=!SgoAPgXkI*Na-ZATG$%fb$k6JSKE-4v)bj zaO(s0r6p-XZLxHVyz6(&Iti<$8J$_U(N>lWr&WOqZCJoLb<)Z#{)$R{h#Bwi;*B%m zY<(ZFQuAf6$OU1Q^Df$Y1}(?if#=cq5V9rQnup1TR7Yzp2poWjD0iv2dPaaqA-T0Z z1iFCGVyqr&QOUYW{Zn@`z!_u%80njX3HLLb!Y2D*|03)IJjLd%N41?BWcR20NOd%x z{TajYwRZ%9s2g&TH|CtrX74C&uGs&Mb7bE3fSR9p@yw~bq|*5QfV_3pY|oXe_il7~ z^j+Ws%?#emr;Bb1j)tt(Jo+B-@we2D=Pak`62U;R4WdrtSHjaG|_yAa+1+Yo6M z%2?VYN$U9*xpC8BDXzWwW-`;&(+%%pYG{!1!{ysrfP?$jkN2ZMq%qFOw`3u-w8i!W zkmH-Q6RR2xtegy8_GRVR@0xXlfy~mZ(bDwj><+GK)>N*b-X?l-H6eS2Ud%p5Gw^Jl z73_+cA`YfkLWCe;4i_cE;ijW9DW8foeECf)0UfE!v-YPK!EY^?9+_qY2*Oizs$dyZ zfu(lLj8G9B;uLYWL)DLTM1dPXS=^loZEk@Ci3KiQDS@T^fLIAV1Ikr)U*)wY&*pW4ZpOB5^W#=NYUoXQePFv?+ z)}#O%YB!cLWZK+8?SOX$!oQ8Xz!uC$m^cV=ci9FF7v%pYYrE`0-t``2zBt-?hO)Mq zj=>2&L%#rB9!Cs-i?4WV?kV0c!sFmq(#0FN2CD@bO!!S_?`k=*$JfSDg)r1qC4Pdv zY-We1!0C-iXFjGX5TrIN@HW#bwAtn{j*;1IG!E3usBQGt?BC(oG0zK6`f2}SLYT_hJ)A6ZdBU?KnXE@h1M-M2hw1zOD0{Qq=9aBVY%U%_73$R}z%>R> zz%U9%!S-(hHsI!olthV*M5?Fyo@zglR4WmetIL@2h)-JR`!gxCd}*E=GPZ%@b{Qr3zy|+FH7T*J**5@D~FIX`fPSq`PDp z*NkUxJKO4_^jE*pxG2nKvmqXLAa?p28Y>QLuTA|G?Rjt}%p`qFRyu-AB~6M949lr` z+d%iB#u*O9<6SyGHGUgS%qC+}xF)5^RK;JDqDbnicJa@0!jlQmbWhtw6td*rM<9OsKa zMS&1V=!#Z>Y*`@jbOtxu(M*=ml%?tzrUR;deF^M7OT=r=E$CrZL8zHBkdQ?EVl5au z%JcYsZ*?37akY^?-PprS9~wVRMZEbOOmq9u=VOHBy^8Jdy5%xoIt>&@#G|7iCFFD# zj_jJ_BUI%Oa9JD?G?O@7^$5&S08)N>ugx!xoxahtBLeq@{~~rs%3I-6e%z#p5W=Or zAFmob?ogV* z=Wpe)!93e|&sNEQCvW-C_jozbVq(O`@&nrjT~Zt};{Kqdj_McRDn(vp5D}++wbFvS zXs6JaoQr&B2`oXDufD!|fEmkxt)2wZljA$HmJe)fcYUAkJ?J|N?-JJpSDj^RMFduwov2MhCPnrhWwU?C+oYGLuy(gsr5icRbm@;a}}|M1u|0E3{;QE z`8(CD!&t_4AQ*2u`4q`O?Y+|#4>#1h>~(}aN*fF2=z@QvYvL9{=TN!&^@U>F2#(Q) z6hl3>J@3?TI$Z-oP)f}$=C4oD50H1;e2V6^0^`#1>_Ra|&JL8{Nx1W%uW%20`_ zAH-Rym=h>L#I~{I)neZMYIJcps#lxEKsft@WYPbtEn%t55&*H-HXGaj%8C2dIQXD^ zxQ?yT8n2uOAy33>k`tCq-fQONx;#|IS#v7-T%m1y+1B&*Aw1gr5#^kWS8GM|77eKc@M2Cgi zRB^-ONWN})(|{#B{0XxX>#+s{gvZGR|GNW6V}C_+YX4u^t7hjX?9YYvnFfD+?>(QI zzld%+>CELLr$s?;u6-0spGni6)UCEU0!D18~Fk4!p=-9h?(xFr0(SQb>E zw?o8f3_k*yCLzPJ`&||Dp=IBGAZ0nXtYs8mS*-r+RslxXxJSp+-ldw&<%x2sq(yGL zVokZ$D_+Xpn9pb;oPVnI1eU>-D-dtUhG)XjdyNBS)R*}E8{tEXS*q@uH*EHca6vzd`F9Zy~;RCmhC=pNX-G@d1SK2rn(rU3$1bK zAOz&|Kz!L@+_*&q{?Y)xd7z%&Y((n-D|EV^*hAbr8n2PoTzaCfgYo8*IBGwF+^z+C z;FYQDkrJt)h*}hD7Ih%nq~063E--?h)<%~8>iMRJ7fLSG9ahYv>ubDH^tD=fF;?1N z)1?;~1hXN&Ek_qY&=s1tNS*4PXnrG-?X%FM!g>zsD)|5s!dzxNeJ*i9Zz%5^+tbOW zfpXSAvLO1E_uAuaf=qku^m^WmQbICL)WF`SvnBupVELb$`u3D@hn7;!9gGh(cIkbW ziDtvpxjJXM2fO~K15_6vAIV52@1w*bc?O(oO;J2wvKw)cU3Jv>M#U7miF0I0To*He zWg_6JtejIIq?cX~|0*?vtG0)3ALspvIGDci9%+s6T?C%9aH7A2!u|81w+uDCQRox~ zJ#2dRYgXM#s}_f#$9nJ@AD9L2L1 z)Nn7R~E^-t#|ZF?io!dKCNF*QRIaUV5!bA|W_`v-k%EaYHvT#N4iF?Bnj!{_d zb4cLmO!B%f^N2T|gS{--CcWj!nPxz+qXJGa;u28ld27S3RbD198{DSVEi!7%CKrN5 zPQx9L<}Do|0CqZ!uUret*^}2brKOD3NzYcf7d__}-@yhsMCD7i39CSMn~z?kM;2j% z*b__3nl#M@cjNX`sOsVMNC3@~c3&)K5kpUu=3?b!38``U%7_1134?4~osw)v{Yg9g z;938mA%zo{YPNiIB)~w20reIHmIUXN(#KnD%Vnfy_HW6Di0lneYW`-zU}3L>NPGi$ z?E6Mina=Ksq?@gz2hVA@@$u#qyhQMZ*{m;R9~7-A6?vYPmc3s~l4BR`+c_`FMHF9v z&fjP^TXRMqkPcd$Ft`Nx6~xB2!&{;ff!DC?b^R7fMOW82j9gOGYo%_5DT{qpau8-D zFSqFLHbX;vKBuIbcx9T!HeKXqP6T9#D_o@dvj9p(Pl9`k^{W}aVJfIRc8T;CsLggsPI*EN6eEV|)>GHwGK=S29@Z4D3R16VGTqEmm za&T!G8k7+@P?C1*7D49cr3pEn-P`Of&H8sX%Sk-c-p(7RP^_Xa`5XJHkZbtJV!?W> z*CU?;)zTv2BA$(250&@=@xqE6LwYzo3DN+Eqt{gtUFNpjufLSaDFAVdQv3^_!`Fk zan^1Q?Fa0vW`zdNA0r{ct-Sf<|%Vl%09r^GZc}k@qG?)?M z*<9SXeVI*{z1LYCyabF3)$(=fB#+; zQ38H>wK*B*4GT4%c3xBMLsF*Wp#zqvSsrF$pfhXL;{T@YhA4k0_N2b{EA6VlJm49g zItD7HP6aIy;+bo++b-?1E)N(p%66@%lwaYerkSe`aQEt!ewr+KXthy2=W)h+S9`Xe z?g7KB3Id|AvE|my!=`tH(FGuZzRu*K?C#r-76iS+!6`Cr`~6niKHWp=lL1s7+8rsI z;bHa50TZfIF|P_$`St`)GF$!6MJjStbH zE5=7GvRqjt^WEdjInli9HdCP5DU-V5jlvy8S86XHz!}#Gzu+fpx9ifHszVhKT;l zThf)vhG*FjH7|)O>$9|%G)L-SD*O7)qr7(%u_!JF7t2zGoq%%T9^$c|1{1Vd3wNd<9FMg}#q~ zX4x5F_(y$oJI=EUxLZ^lN@k_wFI`QvpxtfZy+%l*bz-gXUF6tmg#S&1pdLwJiq4x) z0>0+GvNR^}kB#P+h@FpBL$nHGAhkeBUatt)Q;VYal!*KpOp0j(;a0&55VdtC!ktfN zq&SK4n?->zml7-Bf>nr*W)RJovne17){W9G+$OcDIhdHawN%M>AcJX1$MSI1kwuVZaol|IA za1edJIbI_$g}=cSUJlb;2EeU9c6{J}{gxKRJ&8WV&{m+H>_E6dlYACP~Ybi*{I79!48x?!?Y^B z<-4-`BSb7`6v|#>DeA%EQbTFGp=9ZGDGX;Sfo5D#s-5hI3dAb=b;rMU_ z95t2d5$)ibVZBi)~xFIdtdC?ve6t?QL;G_>AauJ)K#@ zc~PJn{;I$%>Wbsa&3#N1kGi&>9h}#F9IreIgZ-};;mjM__6wt@B#S;-1Zb?bknAo7 z{2#E9;9#hC)XO9QzT{*Eg(*Lfh}R8&1+Yvj8N@s&4W3ClHkC5 z-QO2Q0l+zUb_@d6DhYvlyUF}9ih{&cIaZu(_OZ^ZGdN+3JDp>M{F-J*Eey8A+q&JP6v*v+@G%#Lv*A(~ zr&*35)b?~pkl&K-LBzm#B0shPpY^@V)fSqIS&^B)#R+6y#7!CT*aGB3neORHaL-Rd zH%QZm{uaTp9<=B6JA2n(MTt-LT5$A~SdnY)1NqLjPkN3n)HDLsKxDbsuAqLOxm|^( zfNgI-XJ>tV9T7j{8xa>x%IvNsJ|JXaOpsp>FEzR;dRorye)PQ+%Hgc(liw?L|)Nw5Z1cAj5Z;E%zw`1G(!wVv7% zf0Hk;a`>wXkCR>TnHJ+NBvYZhlSLwGXKQbM5q(o6hJHUmjTWw3UaE=_6`CPUI#{PBiZ6^pI#bBWF8I%O0F&tk~vtaHLBn59ssK>{95*E|^l{BJ6wr3XGJHP=r0luDe#IY~Mvel#-z6@5l-Pm`;HG z5nsY8E}r;9K%6o{)vV;5l{zYI-dTJy`;1O=Oy*_iY zpY)c;m1jpSh!bG~dE|>Nk3PAH;K;v)-^F12`?A=ccUO6kMvB)Qi zfFIbqf_$WN^K;gZ|E-UwPAMsMB`h!Unzt4)7B$P}{`#pTXn|1oNZ{Zom-aC-<4}%N zh~%(%!RS_FJ6U@5$m(t7OXx+bwaCfS97gT|p(~0IE=&m%6P&gdiym3d-Hc>@ z*hwmtpGLUYzfc29frKY?Ottu2nluzN2rH-g)P?L)G*C3V$yn3%D#` z&0srnzDWB_{RrldlReKVuiwE4d!z?I^OqxXY_@IysEvyE&~txAO-LCy>cjm!mo(4Q>IgZ}^=b0H{8xc{ z)%yq*Tv1hgqNIty##dN6A*fLGpUu}Wdm`Mw@~ANkeD|fb0>p$$?w~_lqKi-{ezkfOc7cb9OfCtT9^gJx6gnvV7@;{Mvd)6+SC?EGfsPf6P=lttxV_|?@Ur?5L~r5ZFEQV>APum0#8D znm8AXz5jMP3ql&-yua!aW`3EQz-TX0%(1A{)^BCyD~qYJD1#8l!VIj!n=cNrdRYQ(zo zQlvA^_Ll8>2#xILNngj_Z20hv3DNmFtGtQL4T9X?j(a5k3^m)qB{V) zhF%sz484qq%A|6iwv}67*;b2XCOa_+th4@UNZ~ig)?%9+@ z)%mEy+ti$;>sTWM$9U7F=*?iesn8VFnzcgcsiQ-=LIU-shEyn=)=i(D(x)rQxj|%C zG#TrbCr@P(V*_an7&QD+cxX>abu(0o!9pTy2*-(T#1~%H&(H!v0B0#Nr?rbk91VGV z=VE4~jz+5a<#Q`H$pBDstfiT3dtxkPyD04Lp~ZP91N9vWgYkYe&+fDKGJYH)<8y>4 zrXVH$WmA6!oL;dAo|nq-AA&@TFe3K(T2<=hOuDoq`V%UNqY9w${aFl45eJy|{a4S^3Md#>YG3Wo!~YNiUis)5qR!j2Zo^s(VNxtXgTcoN~aT3FWgtQc`O6`3?LYv zKpL(Wh1;C4!?3@DRX#4KDOmjYBBeeRj{I!8H| z93)YYrT={O;$0Lz!axARwF#vW8Pd0cGWtS%9G-fS4>zsXRclCIK%c-e$E&)?LVBTu zB(xtREq`Qa1;P1X4|go;I#&Vlr!yBT1ZXU$Uf>J~*vE%<;SBTEPNbwkweFk6vzxgl zfx8{yDMGIpphV;5X6NV%?S%JsF--XMX=Y@e;D3EBeMTLWAD|X6WmK1tpLc5x>K9As z^>KPL#n2px;m=4V`$Q^`#p}GX`o(Tr*cv2|l_vS?Ps>DEU#hs^#{po$*;tbEs>JXQ zqU70IBmis?WvdVAQ7>r`>+p1^vX^2R)S>!dI;IV2q>hE?c)RG^{geM1gx<*l zYfSxF4r=4$h@ml?vzzW*VZK3Qm#0$}DMZ=~%>aqaTHi=0OmWO353Jv!v?oR?dfpU6 z|8QsH?K#VhUH0y{g2;sva*^y#u@6{CA7BGf!wqAa&Su*9BYLmcH4!hmGYa~oJD77L zWhpd%U>us*qWrfnS5+WRsOe!4u=t2sg^4sFe%u0|k<`qJ_W;B7-p(H$(SFys!d@C4f~f73k_RLfi# z>QmI;0{(k}ve}H0T(Ehtjl9vK&ePUs9Ao-g;?!RWGIqc^pz4DGzvg+eaFDdty@*2` z&-bs>--?pDd4CgpGXqy<7{AYe2bPoTIDn)#$e+&h$GT5Eld~zjk^qH12tvn4=9u=S z_@&zuVg`hk6}zRf&wShdU}53<+sB})H!AzFv{3i&T_35m{CI(Q*!2h^ zRFMn9LI#5e2y_xqD1mC!R{k7j=I3w2bYn$o z_lg@?0i4%_Vsd((9btS;8xJP2fW$@r$>P<66DI~>5i=rpy#oHcGhRJ3=ZhV3R!(+~ zlZB(tFz-0tyd<09yzmEKSjj+oT}|q{SVOxG#Hog#1!f~G5fE(H@Y!&~Ndl@wYFf}3 zU_-Ggq>w=KTjMs+^G;%6mS?mX;edn^-UP~xX-uy`8qauFcuF zg7zU=FoNV49^f%yEMFD!oR zuVeq%!T)n;hs75ykp9CuQMwsJ+m))ud(zfny4mHh<1}b;=o7qKPqO4jr-2Ca>V}m^Dm%+C^I#jNN-V8V%PGLWnEVHP^RYm=v z(fPS10DnjQJ^SwXj(27s%s68rkP}4M+k~n_hV|riMi$k95sQR-{$N#yVDBcI7N=9` z-j3jsPNYn0LmPO5)1(UqGB~-F&!Flhxl^@3FuV1wBDUINn{5XgxO8^kOJn`kc%_V( zkiZ~FTEG3t1|y|%Np+V+gY~Sl4(i>Pjbt}ug5j0eGYUB0ZUXGJha&zE1J=6u2L%r? z&0p16$iz56O{{f-M!V>6Sv~v+diL4XCMzD#$;nn!l}V~?l;KcTZi3_I3R?9Fm_1sv z=UBZ;O0T{TTZ^i-xVSc1h4EyoZQCJwW2}is%4?Y{n4MM~AqR%e*>#|L4`>q~_wBt! z^W}N#$%Xh9V{-asGObWa#9{ocjyW!swNMC(zGxh;N;e64&DT2S-xYBE#qz2cT)x`$ zC-roTJ=~o}^TtB-(e@a!BG==&db)~aCwpD9AImth>3!RWV6~Yeoq%nmsRR2NA8#Zh zY*)3GohWwaK~1vp?q+&@M89t<%nfgjd+r(;!GLxD`nJHYY2_%dyxR}1yjsdOhX`-X z_&{N6E1mk2+>=X2N^P5m$?lPQhtf?C0qH2#x5}1slL78CZu8uGx zZJtT|U4p>&e8+2}q>D*(EIxt1c-j11IxlpxQ~FwVh8};dF}@^^X8}CnQ;W09W~t!x z(b^=<4B>ZZv~b&Ceq&~oly`Jlyd_vp`{m!4@(F8>!9V<$8KPjizgYP0BW6TvE8j9W zG}P@2Ho?<|qkIn4+1vehV;QyItY<+3qLCKHrfJMIU5Y!jQo8isdPZ{^iGbn+O1iJA>V&gc;!udBi?R+=)=<`B{0N zvnpFWETYoqhF%%30N>5VCvp%-Gy<7wYl{s7!omRp>9>p6A@S_8z}$d#T@7R7%2mJJ zA>!V-%XH?!{-a`m@-C zl_)}oI~I~5Sp&GUKMN3fi${qde(1}V=VDkGE2}U9-DAW&;jR#Gly_`pT-tK9>3jeP zhFRhp9iXjY$L)RDl?aJD^c3Eb{n`b;Y3<7sbiix;>&dsj`d7A3;r+;{Qb6Gv?2iOt zBS_$1q13uIpYB}YFfvA>KBmBMpvg%VrU?OONs7~$lP$6Os7aFe>H6piIDjv}nI*bC zB6~syyp~#*G&@%$KdA zV?{_!tljAzd|v3!5dh_rv$-8-_L8L|kpJ&@$RC3P2=T-6*0-}9HTvv+(wUlBU~OP+ z#cx)wczfRLklHEfpvIevaz@^rvDKj1SpL*=Y)T)TspF{<^p#j+_XAa>RGXR< z%(#9j1e1Zr8rB#r>iuLitFoko6F(zmnl0w`0piustX2}(^lo2YJngr<9P~T@ z2bGLl@r&DD>OrU*;m4@$VlD+`X++NZcV>u?dYCWX?WBv>>Dp3Ml@pC3%QcU}p$66i zHh9-}vg!>^0Tp%8OIq)b=jO5j%3l(I5Lb;{p6k82iryLYbf)_;dXZ^D|0oE{IuqEz z%Xsr7y2w}zk=r_Oel#Z2c8?s0xw{x=^4XO`FZeUk#F~9GdjbSAXq9u~BUL@tK%@Cqof?fmiwZoi z-+-5K`Y>6cHs0ZJethRW0?bZV^4^dfV<)b#y*8isW-M^}t3)<9#Sg&iw;gd+S}cUq z6DDBIj0yIQ=wj(jL{nZsYaORc7sx&e^*U+a0%&WGgJPQFjmPAMJ*ILUEB{y>myf-& zA$czGD-T!f4rQwaQh}ra&iK{G%PturE>XR)8DjUL>;$aabA^1C1>}mt8LrYBP>0|_itWBfL5dFAXPGSQAo4f`BMM62+ z_$SLQC8O_n#4gw_uz-Qk6ovhHXKx9Vu}j`ZCfgHFQ)5Ec!jA^B)(qhN(B%gUb!LXU zr~{<)Q_1K79fvUU&-Abn%Pi1_okFTL$=ZK+t>epo~VfZu$7oF&{_a|L1V1I zw{|;u_bn^TJzI8U>2xGTKst8@jvw1txK23pY%M^QN~k@io!26;BLC5JcJav2WIRNbBwgtK%i)Q}OZu<;mbRI{ZoWTv(SS;?XDhMV^{JWWBb0Ovue6MrV z&w*^?J-6?GVe3bnn59A{>f zkBDhveF?AMp9UXcV_9#pz}RVzIPr*mu)9cr(t?xE@r{^LFt4<{3BjR@KOfI!6>WU$ zKHWR6x>3to*Ki+ppI(ir>b*tywf_lIM$mrJC#pK94ry!=7OQF!f=6X+=h*frOmua5 zA}kr;;AVS^hnLk$%%|l~`#%7DRnY4|_~}Md*~O3J5yKHON28}?ADx!3lhUR~WeSOV z=mkLMD}estucK-LAshi#J}=2zBtG^aE*?=0?mor?fq1OmnP|YQKBiOL{`8fqGpj8U z>!lt*5|Ap{q=<&I*ZhQK$@az<=-veHlCT6K%-1UrKT#3P8$DjVY{Vx1k2cv2P+LNm za?yOY_IW{|a19E6O4ZIjk+Xjj(qhX*%$2-C3Lv{))lQ(rJ_pdR69|Sa-e7exZJygR zRpTjX1$N2ai>#lRuwnUkdiL`fBnb1~jY>Vj02KB3(&4K8aBfpr_n8>sAG$?Z?xh1dS|E59piE-d-bCqFks(%uYqSotndn);;v4&;o>Q} zEgh73OmvJ&G}(l5eI1OJ9ck(VP;8N0##p_zAv_?!LMNF2v{=!86SZVM zhQp+OC}R>!-)j5%OfMi|(`l&$PKs%&PICQ0LTNddEk$qk*D2-6mSa4OqEj%FljJl6 zQMkSOb~?XgtNkfV6#Jo(214U5zkiCw!&6&i?x(0{1=&qe?76r(1H=nh0zGk5#dV+t zgNXJ2IraeF?qM~4-_ZG;I9E<{Rr7}<(M%{tO4t7A`)bj~?JjOuy%jXp(T-uG95cqY zyDZiEW}qVGSb6AY82Ko^#um-q2ye#Ty&O3JFp{=nLW+i(tP1P)N@`H*eD3PXO2%Vf z?`L-aD;aS1imvm~9zJE~j~ah!Am;u1{Qg+=*cj^qLpA*(DKDkxaga&Q97d@nwm4Q} z*jkFxH7>NLMzcNHvvL$Jh~T}Xx{DOxZH=PyCCmFPGfk&Xb?3-;SWJ-mO5Q&*BOoXs zj>&M4ce@_NSmr)~b1ax|RT){{>gV(+8igd1modQy3F8hrhF#&5VH}obLB-8a6dvYd zaB4Xw{6Bw>DqPSi6+LP;eGQsFr~sBQ&S6Fs3BsvnRHBeeC_$9;8#4l*0bGPsV%bv8 z4VFo-^-wfhCDIDB58t}j$l65cpjNT~48nLwux)4GqL`nz0Rv(Wk)QR;ohSe#OSEO& zpHWt2+JcAe2on;UPrOf<+;1-+{fDbe6uyP>k^JT`B2qlbo03R>B%_oO8WK=5aw@^4>cr{O7lY|3=Y6754ro}C?) zZo~%^?@D=0R#43FpzA9j#GeqL?m2}y8en4UE<1{p;XwUCx++Jce|gL5BVrHUq4J1O0!x!BQ2f( z3`%{|a;{zz{*x32ZKFn%WMSqt8A4X2NIZRx>n`tL^&B@lhYcpvA?ZHwj&F$;S|vCd z_PczxE`n6&OsSB`(ZV4?+yxq$zOxwV(>rvO(`{VbC~30c7T4+C|Qa?G;TvmUDy;|RNZu+n4Wp3m70gt?`Obrrcoo6Shl>km6q>( zJpAOsa$EpQ1LcBucZsAJ&n^q0>B1Q0Ip5mtqbLsH=eR|g3YK*g$Ri4XtR%vUYzG#? zYyYiF0cq7L*O&bW0-9I{4if$>nM=`_yvK@Dh-s=U*w&WU#fcA$nq+y}k(S;>{wh@B zTo=%+@7Fh?$MUulU$0-v9&47|+3lz(=2-O>&8>(!cbv5wGeEUcw%>`-bTV2@MoVH9 z0L9Sg%>wxdk#>_GSm`5hfVSsS7DAomB4P3;=O=IlJ2d4+Y-jy*&!Z-)7^J}hJvfbu z9d1EsExa>k4n$BXJMO<4&L3M;tuqa9j8``&z2C3q)4O@hma;$RX+v1B3lxxEPmrmz zp*jIF_g1MEzJZn(xeZ}=7n`tK)GVX{CUntOBj}2Iqr3N%bl=kQ8gZ#-@s`HJ9^^hd zd-%j4_cbmpqw!b^0ZXADSkMn>P6F5gioE7#;nun**k(^R8Wc?Wc`OL^@!-C4+wsc%x@xYY3r1^~#O6;QdQh(f>;)(@yqwvIl^ zMz7dKz_;6&0_WWPAfHAH$}&1oa^5%6!4b*Nn4prm2RB@(PoYxN*-I8*(uXH$!?|`O zg&5Gtw=guyR1ql6 z7ZO+ZXEc0FA1YWVJ{0tdI_=LuYlN(cxj{ZRtsx&geftVeJpvte(xo}*U@md{Z$cas zmwg}Mw4I#g6=-1PW=me0xTWWT-Ei{Gk-|Ah6v<|I{{MUep2!XR;@$LdDp{S&XW=Ht zufwFjZt==^XD6B49iMJyxAe-bR<_FYY5I^-z4P|O3A$D0-%Qt+NZ>u=qS*-77RR?c z=|&R=g~GfaQQOqwjM_?CBa1d$$oA0FI}GiDQ}*p5IT>Wz-Iy4|YEF}5uL2Sjb7J&M z4b|nd;lBL<7Vy9@<>2XWw|XqfSbV_TsqWpTSJWuo-O=A-#mbmqggf2mL{MP*#B1JP z?5`+&?lgY7CRFVe)Ha=I1Fqm?0BpCJ6Eq3xdg6ak?u15Y={J)QIdHwcXSr(Y*o+q& zCS4S(N9-3^SiTOpl>OK7y&^4rKg%K?&FnT$OqF5MKoautuhQF@RF=NohAkD*upU5q zGVYjIIakSQq&vH+JV!&NN{Ia)*6Vcm4HqrMrYNia3QF73r%$$zaL+G`8hLjc{mUXb zhYax-QNbCqng#hxpK^CGPCi1+p$efh7huZ^pg4PHzkSLz8on%ZWx?r#TI4bszGZKh zk~@`8Pj{ykFnqk!lKP>ZJqKs!H0tN=7d{F|6)>9w9vpxgXZao<&1P2zWPLwI`|WBy zTf9#X=8_R*%_%PE7vb8N>HkuW3gdd{liBupw~YT7lJ1dnhNPp;Ryr7HvMG!Pb-pdftv!F68wvzvBs+&|E%(RYyMp{VTUVL|2_`JP`#z`ECrZ_x`Wru$R zuSuqE&Cx4*Md8dWA#-Nr>c^G5vIq@j}T1@7p&mX@MK`VOyy zp>{o{+%LkuUgcra3H;xxC@IxA*xc0N3d~+Phim7L>E8=yJ(#0dGZlO_?f$O zk)boMfJK;kv79QMKA41kVl80q@!K-MN|DkqZC{YV81i6YyRPfP5fA0*gM&5p0Pg6# zDS*dR3QI3A6oh4o(6!ijv6GcmA7bFGg8=00XgXUw%8t)tBU~HE0!s|y{DVlfm@caW z;8D8m6;dIEq7ex)cm;VW54`O;a|9EXN=?PU1COszugB|r_kRF8uc&rWRItIw;N!*sM|j_?KN6M*K7Pr^QD|r9p+@^ z5}c40LIL>_Y>gUvzxgy)h~(-06wARM_Y2DDmvN)}U|6{?B$n!i+>cfJmWVh0fz|hp zra}Zxqd6E_L5_VD3v#se%ok~UzJdG+lzzQ^SR`VtK!EfHub)o+NxLq#mfcbFVZjzM+Wp#P)89nd=4qcLIV$9mhG7v1wh3D=mf|+SXIUIGw=e~ z2SE=0v}~46W-f+#5y}~WKYCXE^UCpnnK>-#;f)b4qT&gn7y^r z?boDrOHk&T*^JL14S|U2rIJ*y#&Zkf(vgZ{fQ*y)N{&X%UMS49uAyXQHx?9TG>G*< zwNv}1s)2b0{40-LzH%yp9c2fTS`o`90G*KV7=!eGmYg2)H@|ZL5^#-YIzf3MG>QNA z#>dNkc7K5UZ~NI^`5Ab@e!DOWeUn%iY+60DpX``X_(s3~c!QSn&(MqgpM81XY^{|} zv&cXi4CW+g-1*qz4U6CXSzXW%@atME9y?<>B`Q>RM`FqEs?ZCy1>REV*`8=Zal!#8 zv9Oh$d}-V7jQ}4DaYUqn&US0@<9(a)(8OUnjdsD)s#Aov=iya;*qQW&Y*$?jEW7h( ztORm&A#l3HK_*QndP8r75(i-qkcgynZ)h+h62Es5^zjcOk9c>Yv2f6BXI0~TF=tmK zQ>Z~Vz4}3-1Z6cGb!$UNq*2Z5_P}5A1&*c@g=y9dNIXnbeVTPW0}UIsa^M85#c6Nma={>CUT4pf`>;9@Fka5n@6(ni%*lfq0&&Ca;9& zbsy6<#tFy}R7N#-rfOf-4kp>X&+wz-k3EwLG8q7f}OwUC)Mdv1U15J+({%4dBfl zk>x>_VeUF9?I+!7XwX$J^X3z8qo4E;(R*{t-gU@;nM|uNq}6SyNJBcYKm8Ro()3ZW z&F;9oAg(AP<3VesF5~ZEJ1~qz3ysS&Ois>5sY*oK*s=;)yuJHehj1vJ4_eaO+aUeI zIds|q6b3+VZMS@-GBMDR_xnX0Me_0(;Thw@fw(NhGT}uCcHS|zT!!1sw#oSPdz7f; zF26p7U%Y`VXj0vbjdXiRe_NhFNbpMelHg;OYqImhgmS!!M_>CNDOPi9DtBB$F)uZOJVmH$x|zV)Q! z8)Qj{4d;QPrpd9e6eiGOk5H)8Kg4Smj_^jZaH_aC>CE{gZL7+Oj$=!;0dv29vFqfc zCotp6eF(W#c}gn`jY$CEIzo+YrH^j%7uN0UONhXy&U#NDFa2!)F1vccpZG-;gu(>w zJY?_9k7uH7n^)OV=tUsLc#BLxA^}b6tWpn7aO690`DpQ<7c7|f=B34KnzTPdSH#60 zUMM3rZIHF2aLZ}E1193mt`mB^Jc@u~Tw)Q6C{661lM4$pKh^kS1Wy6&+IUys#)j)# z#0jk5?hYLUAiFU&et)jR#CYgj_+y;5MN~GEl~U3o`mc4IEDpbAZ@wECyO=|?HB#w~ zam+G0ht!fwpD)Iz=dn*d$@z$XG3TOu9ycEOrB4>p-6{S)fJtc*Tz+MxoImxn!(tOy zxbA;ofYkH@XT*CIG}~r7+F%`yag@`aQw=;@yOj7(Miz6g5_Ml(1@`17Z6De44=}N=hm$vze3b z?WF71stF)XsJGJwh;ncR@Q?h#IGLr4O^Ph_Da}k2X)IkzBQ8WDT&q*(L9iQ8vPeRW zH@NBHmXgI^_m+Lj&K`Uer8~TQ-nz^NC!$2hjnqnVo7h#MZ#zyBL)<$oWgmH&M~S{YO3t4wS{(vm+|di#P*L+pdE_n}?18}*?bkmWY_jo77g zHo*6nokgyJ0NVGq9gYd5c+dnXTcD3R|fI!YW0X9rT4qaT&9#2M*0R%~g}RX-<|oC22DiMLM%;{s2mXOULMRvGUkVtDnkIqI zo`u^ETJa8Pd&lga#e;=v+aJgKabN<@V!aJswb(Qrza{xcT#zROq6zT zfk<7Ml|Wn~6%?!fXP^n?!CUxA!R$|YZZ^_^diiwFjJjD~yOb2o!yd`Cw!VC+E|e-F z^|{9Z+xJZrA#7LpxyU2&)Dh6&lJxL*n&G3DMq zC84T@xb<%i@r_7QkL2>T9f^6Jxt<;#<=s-9Yf|8okh<$*X_<{L-cepW9Xb~BpWUfLQ9--*60t4n@JSxoJpc)|yyanboeC}Z zZL>>RI>RJ|%fG!;PF7Ax^1+Nwc@M9Y0Itvoj_v z&Do@NOLs~=z2*>he{J*2b|!7dzBi5l(k&bru zQV8|!|J}uu&87T z`p*o}04tO=rk3HIH!M3)Th*I@txF$--8m-L#wtq6^Mh#my}VO`;tg_q*9E%w zCT5^$bfj3Qu{+HA<$glp%CRo)iiw7a1EBxOr<<*m+D5J8v_a=(+s~+9?ag??5FVe} zS;@_s$F24dXDb}{!Y0W?EdEZ$;qGC6=2f`-Y#HP!&m0~IH9F)E07P}iC8{E;-$AZY zN(DBUQFB5-bQ_F9a5GO`5R-+>bs`17LAuYKa|9F96%~&WZD26g&U>ABcbCKU*Jvz+ zlAD&JMKT?Tl088gRXJMr)FD^=41Heod_8Ka&t}2kV>TWx_&Rzh}ccB z8Q*rKH4^OBq+u1{LVteF4@T~BbpjNgads@kX+q_iBbOiGTrjGm1poVVn?}Pza563( zsDM2Q?77Dkc3PhDSAkhN4jO}|&oV8-VO^8H^A=-2#j7~|UuDb$nH48PB=+=`B*ndh zjKeIu6rl0ILsH;U=%K%^eJ7-qim((7x*>S}PA6U_(?ubq^CW3N6AZ#;wi*CHVmK-jD)uFYHx+ONoO7g~-f1#hAAI1y_rERW*eIkz!=nc`Ov+$D| zGblH4Wo%g@X4d7ypKd>1$Sz<>C`(xkKew?P`?KtgEHiF(L~{c@H8=kN(!}x5 zLh2Sr05R0?@%l`q+6&A1_%xc5;IXXzojinTrU_vM~Q z8ORc9uc(-rePz#5Vxb=%l11xhnK zvV+%jr=7G;;L~=Fvz1fK$JAaRsR5Nt3yZ5j`jLHEty_`ie*VUY|D}(-{SKOkz*vtP z4ti};VHR|!7@d0srPl%I{U6*|wmC$S###J`5)}-R-nAnlNwHQ$)k`wiaSiRtUl%RC ze+L6`vm;!K7**kX3O7J|Tp*%0!@o#vbP@?T4U9tb^3HhoKwzZgy_)U&(5;U&kuVhj zS!gP%}7OGIz~cH*aaf`r5lZ z(BD?Pj)DZ85;6DSe1#Il$*asKHXAWRc7-^dro_NcSSv@qHeWB+aKE}s9^AevWpSbcICCGjgn2 z$~OnaaMF-taC%-I=1*03Va1Sl%>Rfi&0i_Oa zk~+xek!>Zy$Mp#C4@=tJQ4GL^W5akf@LxyGD!`_g^{peF|j_yh7XOaVeF5}Ofn z)JnFGJ`n3IO8rotoPryT$fGbW)zStvnh)mkF2{dZ(G+hSXMzV1o##+2=mZ{`_JgSQ zU@DMv;5vGHd{_7^6b=QM74jfHLDh>CK-p5;eVU1O#o=en=HyfB*;${74U|vqHQCw@ zE2dH<4j7B!On^sFcjbMW9Ij1U99Cp%UK5eMf^H^0bi8q&-q!3VwkH(Ph@>3T>R(A@ zHLZ?4AjVT>ZZT!@)E)HR3wX-YcfVNd)>KkIn2^E}AW(!p6WfUg#6$8xxDt&CN<8f&OTW3K8v-Wj zk?D<}0p}NFUMH|~Pf!NiqS^QuRsz+*1mpA>rY3QahgFOcUC$)1gQVPXThXd=;F~b` z7RK(tFI(TvOYNlp=0^4UL?d9y+pGPyQUuwi$tH#8`lg z&Er7nX%yZipiTUA@gfk6HE^8A$#q)a_zcZQXm*{|s2jend@HFuLXV4R6X#gc{cG_H zqm+7fU%sq(B1ttuRc!!RK&QVYnHxH%j%7BxbNS(67PL*A!o0bhR6Q)5xCt^8y6WOa|?pd}mIT`pQ5HZDlQ zOM5Y#&dW18HiM=eN$ux+`i%p*j8(cd08DKK%A1;>wQU&}lONH9T9NJE{;USLKgq*^ zt~;2mXJQ5k_;33F%{?=B?Sq^|%b+KGI|5Zw?Uv7UC`d79V>`Oxyn75n+{zPx)3ukh zTbD_+Cz!5PG0gHq1%)8yGq&-U#1t5DtDw(+XiP*`EY2jP5S{Ct5~@FC7HJ00A0sp{ zlchUYu$RZ=+DSw#NMO_cQDq5xQrQ_B6UYMpM2X(<&MoQ+cb(*6Lk5A)@sGkDo&7k! z43ZweShr=FQO$?q2g=IH!U00E`#H1<33~nvoECTlGb2@%!rb7sOcstm-@@hu?OW^8 z%gTMIFr)ThzdW}6wt({710VzT+{FYR51<>FmwN@bI^eQkdNHp5x{uJ2qkzeCHLJR= zn)_~!K^0G~3VCrs0BsH9DIb4DOXtTwIzMMFUiYSNgyD{}w*3GvGvc%h%QINm)gBu^IGD;b z^?b8abcTeB#v-&XaehPKS1cbolc-pn7wXww^UI!@n{}=f%LL`|yHr{;^U`S~4bi9% zoX%~piCt|ulx=v6na`#GvlI<&c|N~C_VP^oG)~gtPYZTqZ}gI*kJmi_D^_+P2Ds+( z1sKw?6!mRrKloDI6_D0hG?!Y7Yh};zFUkjVm|+Iei`3Q-KM?en-y3?G`Yzi1h=0WX zE1p7vX9%L^(Fj6J;(5|)I6EE3n^DJyyXlPQ7F46k)`{EUKPGdW=4D%uH8l4b`JpfWN?d^4_+|mP<$AVn;j)*`LnXm%QFXkvXg}HD zG?R*HrIv24#RZo;i1rF4@b`By>3%xp&!&=VJc8q^Sk}l#O_%}+c=Gw;$n@tdp+@zZ zt0a>m%1@Df#ySkc{=FUfD0wW^=MjI4Y-EB(3MjYnU6pP;P}dJ zz~U|)K(9rFM}u1}J{r!8r~`n3uW1q^l`g%J#)3~4)PywBBiI&hrra+Mv_J|x*3+Jr z((6vvoWoeI2BlsRSlSo&`N*%kgiL(%PZ}@7#@M7ERThw0skcP38Z!K6{#EyoYM=FVlZ!8&A6c0#nQc)Ais*7(5 zwD64TCN`@_G}GZINI?Xn^=##w9j%0smh@MU){N zG`T5YQY570v{FC2KN?S+BBHoH^&Mlq1ijiL(1DfGKDp4^9AFtWPF7)c{T^mHc?kVS1Jc_E+@c&pLq$Bs zY3rW(@+`Z+LO9f}+56s3AE4O_zJ??4oB&JlwMv|v&P6#IUHQxSC%vA|nx&|=g|L&^ zs2*=#u+}lHY&1Jq%`P6bAg<+D-&3oekWRn|;syq3x`pV$WfVh&pG9o+W805ObvWLz z?TS))`p_`r_AyxUkv6ax4uq^vZ#T#9n>_v(*|sGw!${r%`kpMyb21BsqwZa-HGRA+3W^vo;*U_4fHe0~vPy`I z#Rk-flh<$;JUGyJSK1hP`>3}YLCs)ZEWU+ffmoJ$U5p#)+I@Npm89(KA{n$k25T1R zYH<*UubyYqXW4-8^y$syyHqe$8GOK(D_;Jpnn;9xbaHQa!s*#xRob9v*#_jJu- z*Q%s)=m)RU&MONJkj0?FKo2A`jrYu4|K`yC>V8K=PxlS`L8!^OO5n69%Vrjx7 z*tx?1*e++;2RkUh+I>zjzFjy@UR;fVayR!9GZbZ$TG`G*W*4cSnBlT`7~VEKi=vwl zE;yl*08Z%7N5CM5W$kWKzo79S`ET~7(ycBQGd=X$ycu~5@XH|;ZomnRGPB8m?vcefUjr*0OeaM4X*0wO4`vOg8OylEJ| zGHzRRNF3zC7JVay6o-n%1{ya;@@%p39ljBvQIfoH{EG1K&H1E6!gyAyCrUGbPrQ%xPVhj6mxc1CCb)6gH`5A%&dfD)g z(4Mgb4Vf|_UOm-nDj7j!5@dFekh(9JaC3fZ!APq)saT}(#5zMgX}u_^1oy4fO|{pG}G5qp~gJ5x%Khpkyp~p-V*gF6G4h)3x297*9=YtC(%*DIcgsO z1rTyByo*fj9x~yWKaQ_Xla*UU4*ckk*9{9zC5NJM;K?)cnG4&%L|caWcJBzRZYsNE zK(ZOpJ;M9IPR?SE*^KrlLDpJxpPbdu2|vgO0@hJ;Lp!x`9!x8HHkDHFMqfcKAS2{; zvBrl@x!Pk{e=(_ZxM_VyWWp%Rsz5^;UYz;ntb?_829e`;+Tu?7V`mhqbFX3 z+EVt*@$)eP=$V$sMvI=+h#wPE^e6k`>H1Wk9(CbHHeB#A&q6^&&0W;-12?-rh>FPD zOW@Kwx>D{0_i)z7vV1)os{N(AzOCiG&`xMNHV>Zuhnu(fo{Dv9PPg#$dSO3mcqrw_ z*5)l|&POacZNH;8^Zqp6egdi1dXFaW5hmkxg}Pe%1Q~Er&mzw4x(B1{eT)>52E&Yq zy$m^U(9gndm)R0U#KL{Hf5d6hQ)(}wtt)Chf?nC!i+|d_w*!nLS?ybRVfUF8bif@) zuXZC?7#f=6{}e%l8LTA@veHJ7sR0dd0DJ#Hb8vuJk57r-z$5`c;Ab{mM;#`0S(3%+ z{N9{voAt7DanVJPJE#!Cl16%kNRw{+O__}5D?}N_7V<&bK-m$92RjkAtHVVid$zmt zAp@z6o+840^9{7H9FjmhcYLLw`7pJ@)hw=&(wdXVh>ebjdEHYTdhqAHFaE&l( z;xjE|vDEZ)(q*i16cZXlkuU4_^@*?pp|u8A*x^s-`0mI3{IVAO!XGg!F&blG2sEO{ zmaYdZKW1F)6D=iXVf`|#2uKcwK%Y2*9>Fj7fHeuT4k$OiSlFWR+o>8J|Lq|Nw2=M?*&PbFe-xsLe9&E#de}I?3gE$&e$8w_^lU2+ z97$I*I;eM4EEY#MJ%YF8Pc@=}ciAJ@a6BS@qb^o59gj2Xl=cho! zrG3uQ;pFwg{iKyXl~bHC9v~a#IbVHc7PL6AGuz#89q4B%iqMc#WHH0Mln>`BA@7Wb z+dyi5Wfrze=`F?2ic_W91F#H1vGg;DAd3nakY;+rVn8L-j_&6(w14acaT4n@@&wK9 zOFv84cw+uIU2ECwS(yo~CmtFH@QFpVz$X998-0+ZYBbC3`{%dk&h{$%lwoDk z^0~^v{vbF=XZE2uvl-bf5r59yfCLp$D?26qCT8FiZ+BiW-d$S2v{Uy`^$2q-F@6I} z0mpzO%!HtyBQ@+|h9hjR;bYChXl=SPFwZ5w1M5BcE8v6i;*&4Zo&E@F+QpZtQC(CS zn`9~E;u2^Q;gdad0H^Rqp|4aAir0ketj!^2(Ay`Ad6b;M2#nX}#=8Q%BF_>3AVw`H zBBrRuQglZ}bnkFu;h{&gWsyMe=P_h84JEC~P&q3scn}tya*z33U~d=pK`LO!6=@+M zQ0bp03lcm$7Eh}N0aRPe?;j?3Wy`rVMFcLJITWDZ&H-6|b2fGh|2!g+en;=+r(w^# zU1+$ISkacTC&MJOpZh$=TH+EtK=eJMf?etzcl1Pq16ZGn>f?ig?+drF`c3 z+sa8w1y64yNIZ(zpEE<65}xGmU+)onfgu6D(PM3O6DX;dG}q7$s00WNKZ4Dpk|%k;9pwlPXXSHNfcAg9u0?}YOdX3> zGA{>~c-mqUO{cdm zuBNdZ0(=By%bQnu^XB9AyIi!U*=?7rnIoFd_@$gux%a{&eS&UG!1>xrih{6m%midKLe^4wFBlSQSwdbVD_2Mi-CCdl~zufUiLb$<#LQUS$)IcIiP$+S`EF1 zJPM)DA9TX(BB-h|>Q&PZ%R5a5QS*_~E#~l;1=BI&iK%r`ze6<8K1k|foCPa3&P;W& z7{_=zu^_JNfCQ;uIa}%MQ*t-NxVn=?mz`W^GT>Y#JozimoosU=c8;*$?5zu++@L9c zj4#;i*+yb(rId0`3nr^l0~Vmya;a1lv!8Hqw%QmgCbxj}+STyK^bdbitX-mZ#)SOi z9n;_N_mZQVyF-hfIVxUH6u+LVdLzmF5cT`gYu37szp?C59eezV4P@M>BQzb_jAOzf z!0%lhLLfiC$wQc@EpM@1&`zJ9)2f&G(L>{^;w+r3$5{ults)-P!@~X7(>D1h!y|)I zU|h!VOP>y%Ur(DGs!pc6hY|5Qel~}^|D{gxQU%Pm+>fHI#lz+L>v%or1++hfhE_P} zrPaqeW?5HXgud6yKHf+8Jx9)+FNzB z_Y9!~`kB50Dr$`9=8_hG8`(AGR9P$3)nd6Y;yROl-8OkK`lOu8GiXz#p35F=Tq1q$ z$FPFlco5f2Yb*KVaTXZqaD9oSLO1k6yvKRJf-iMmLOFvxY~LlLh}8myn)S-OcWtrN zr@F7iDT5G)kB{@=r&KXwhi!NWWsTR1Y|XZfZnA@}1>;v;pVr_}O}`0VX?1pzMOZ>^ z?yov00_j*F6A}RyhN`ad8Nn-UzUeU)nW0q8PgW0-);Tim+e5Ib-5y2?q>P$~;MTx( zCKH52!__3!R{W)2EMQ%12#2%0ko1;u{|CsEC(|%*E2_X|VOj{Mb@3(H*qEH4P}WR# z2FYU8S#{q2*bj{G$?K%b`94B@)*Qs#&?9SF04^`*;n)?oB>Ynh|0m*s>1yzTt(sX3 z742Pe4EO{P?CQYBnAk87MgU=<(pw;t|R`am(B(Kj300VfYcuEu!U^3EqHshoZv>N|Dt`6?w#w=lAR;JKL#QO zWCZvi!9{i6v7-WtM@?p&vVKePJ`!U)ID?72j`b;zf-uk=X#KADaC3& zwkWNW#Q#Bvyks{k_HxCLc&kdSnSb=KfK6kJ%& zdwaC=Ef#IX^)Wfu(Xh}pgNhOhvWTWyy25g{Wk><`o-WN!Op1%V%_qBCc-G<+I4!GA zp%mSD%ZE$Z`CE*bQ9G;u!CH|>2_2oc9WM|Z_nnf6#}@VqlOK2K(;;rJGZz85sv0=I z*l0SRB8IX14jxERf}Zs)ClWGItbX7qENqVqlWmQ02|!)*&S;aIZ6rNxKULvB36)C9 zPx#^7J9Hw~F7;P?BiuL36EV*8hWTsTITS+A+~;pZTg1U`T<~xYK?P;tk?C~Kh3z75 zLU1(AA()yP72CQWLsr07s`xoM)0dK*FnTkuCDrfphrPV}j0d-7wxyAG*(6wOI{d1& zkgR<7q}l2g+8E__I;+{5ImBA3YK1}!PtAt#$dK#}IWC9>lsC7QbW2X+fO4=8C0J~k z^mlbXQVv#=6^B=ZYcG%J)tw(Am|=3|OctW62yGIS8BX?#s4-N#gd8`cx^S=WsQ&KX z2Ki#p`vx(_M+dD+hajExlciVf)nf0N&-VxsCd;5ykiGg8$eOQ#4Wtp)*po^T-s4o@ zq=hw$QJ#bL(~pxiVV#&6fvYl*cuQ$pB;M)Mlei&7H?9}xPbfpbV*-y8Ax{d$(X$a@ z-xNw9s++6)9bLR+D9HHgWWsT>P@LW(7V~CLZW3-#CZMtn| z9^t);rwt4(5m5^!^XWTFtj4>0_LEUaUVI#gco)jaZFvHXSF3v)BqOoy$8z}q1jzDP zoxSYJr;THw04@Lwss~y1=37h8D+yg^wL(qf8-LFBebNJmeO?=+J3XOnzTt2IRQ&ob zpJ*4^4FhQrb79jy-8zahs0(Ye;VXZ=2%hX&IpW_{cb1&s2X#)+p>HiXM-N$y?fw;! zikCDDEY`r>FJ`d)Ym8bJ_@gGn&0F`X>P2cBjH^D~Dt^Y=^1VQNF{%6vBcw>}$$P3E z4D6c)B%@h?vo=;eJ8+TI$ygYitOT2tZcyUE)qKJe_Y=fXR7|MM&Bu?62so9baCX8+ zpqc8rr%@!kle|tjT9caGG0lmDX)q%U` zGtSA)ngt}2tt(yg@GfzAMa-bq8C8P9?5su-C-=|yV(}X%mfdF@z0Ix~S?$6tGq|>? zGRqerhL?S=Eu>5aby`(Wrp4$RlXQ?@!xcRS;)7D6wJVE^2z7=oDgXg#eR1Hp~( z>3-blr@NdPT^-twg9KM^u<@?vBjb#kfABBpnsaorz2X536m^E`iL#OZ5Ch{dEZYHZ z)a$8}PVbz@9%{1C_d;1|+0(s)dKzfaRA-J!oLM&39B5C(+o8r1@{5gY72Kj4Z8Cfuuc6?L&BlAi zM=#IYqItS!u{v4C5c$sy#w$B4LoFto=VIWXy9Dq;EmZ~~17(++tm-93yR4fWZ*a(30rr%uv`if@uh=yHOA7&;yAYaaI52&EyC0!w)c z`t)iF!m-}%V=?Oo_7B(!7JM{hMq9lhr}pu(Yp&T7{FD3icrCBpj{lfhW@!2fXhL4U z$=_c9dpu$;KeL6-Out2ZeRsU;oWe{lAn1q`qfbQ6>vKM{p4Qha>eDuWDT9#L2843x z#N~D;DRXNwGocx;Vii}TS59KY$r93(U&x<=w`qc9hC)}egt6BsSBrZ%S;ymk15DWd zOL##jQQDr|-t&(j|EmwJQp>lMZ9EPbK(({FyElZTJ+o3q=K7}OC0gnh48S?^2^dv7VL7S)HH(t|Zr5SgZU#Ie9 z>mMD~WaBOFrFR_*r{j)_RKGgfa#%VGF!-@nLp~2ycmQBREVO%=4Mv!E40Dz)XyBcQ z4cgK@M33(!Eqm0BEU5U!jS+^-EZicA5tc42IG*zCayIQFWop2Ew{NYhWa}vyoUO>{ zjZ%pn-o`6>C{Ifh;RW@KSyD*Qup0pHML;S;8a#3T^yPVf)&cYC^q7GRM#W47pK%D1 zs#4x7bo2mWaJ+(D$}tx4EFAaE_>YfH()zkE7HStt^fo(O6S_;|zuD}8{lMC5=0oMO z^%`o<^Fs{Z+_A$+;xu$P(V98RDrc%?*(;OfP2mQBuH!thr-c0pX|Q-5EJ2ozq%i5R z-1He}W1VN5waR3nmG`H^I9=24wnzyZ=G_55eeYuR9`95H5RTAIjlMPC?irTFIeUnE26cM-MJ6 zBUo5Z2Hf-Z!yW{gF0o5bojwwv0aQdA$?P3tq1CimLp(fu#B9?F%`cm<_5wH&F=n2; zBCL8ia4|4}64qZ(CxnZC14L}6p<+?I4o)aia{D1Pgs}a;f<(Dj)Wbi#Q(P+l42D^X zLAw@>lA}smzHru2F3Y5DDd}9>T|q}6+PYtcZ>s%d=XiYaM{zZC&qmxQC<#98$M$>R zDsaTPqg6B(Nk0N4nV{qrQAfxC>BBVzV%x^yID#Qq*!k3>_Uy{X>wU6lLE5~w6FA%8 zoo}4|n1;9bt=)N@mMsw$+K(zBcnYCFRF2>_l%qKt7b2gIfJ)d2oFKFpe8aV?rIqcS znRkdD1nI-#in%b?bsudqDY(K&3J=JbZ_M`ozz;sy=|JVp`SkU1qR<04HFzazQDT^q zJ#Xe&`@W1cu;76hz~w2^*91=RZX9t$0cG_<=P4i4M3_%nMdZGB=L}!c)m``PvbVzkbcXq z5R0zGJBQWP{gA&+2o0Evn@fu)Wq2JDC!M_q}lCb?Dj$*3b7geubP-eMLU)hCfyAn{?Bia0_+SRI@+v6nb532$sgSZ z4t0Hs+&s8}@ya_owtZ(6vOFT`ZeaZM|6}aUdK=5S?7+Vw^n0PvRh}LU1FoTMxT|cm zt6-oX&%l$-3qQpTYHBY2wQDcatLX^ZoBp>RZRO$|V(qHgid+l?0 zsZeAZ5Hb}Md3o;{_SwVQYdI;&$Vo<`7phcCnuV7H;}WOTWzrv_+3Zv2Hp~v=R*S#j zi`J`fGqPPnf(~c#&)iwG@d!(`@fdAZY=tkT0mKIhqMS!N8qt)1P(MK?0d&db0_a|(SE=;Sv6~DKrN^_Ykfrg`b09VHJvM(OW@dk-6 z;qjwvpY`3hB>6S!Q-#hOCdUyLo7Zg~h?8+iv=EqIr}=?sdqcDF8RYy+E8#}XnBm=@ z98v-R8X1$Qx=$)^xpQz;wr9C?$vq%mC1qudyijiD;PRQsfqv2GgIBR@;=?O&_~E3^ zk)07(XK|%!i28$hnZB!}&LT0|))^CLG6gP0rMu(qAsYj!NxY`DbRX%U`i49($VV_LVLzngi z+(MH!u#+(CbghR)Do8zR&tjNfQhz)5?8(ftJ4*J3#5+2d9!-k@VT>vle@yKKa zo6#u-W0`!;LbIh+j}1k!W13*xRG3QUA{fk}#k>U^3k6txiG&pvB1X_5Kwr1t0KyXW z6o7EX1>CbH>6d<-{(0(uy!kl&;b$?0liE{%`WxC)f9kcT{xqRI6*=A)kYD3O!|yN@ zxq&QQKdQ8ZW9Ofl%w`|nHQ8SjwLdy8h1(71^P9?^SNML#UvjO|WT%Iunx>8?4w^|- zArA@g9mDKXVmlTNVrD!t_rA^4L~-OENYZ1BEE~Fzie9hVOb|z)u|^JV){l^Ao$dRU zJhC*=q{~;wjUt6L(MPMtnI@pNJlKgUdH<}yLZix`{1kt|N>C9B*#+`(GFZr`(3agC zFyF-lV|bs77E64CcXzc4gI7Qwd!6(7QZHPkd1mn#@7WjYAz`4eP#VbaE=>c1I9L1b zklZ_569Xcq51_SDVM4*u6@me)E9ZUngx?jn?!wKom&V~*vXZ*%c+m(~_UQu;2=tQx zcSl{n6F_}7k7QBB_s8Np$w~_{52TKG>K%h6x^E0U+_|z)T_H^Mt0uKn4E*cG9|4<$ zG01eH?ooVrjI; zj`;@iovkuWm-O*D^t>WU$RU7rzzo@*Od02HVxC06tV!=rv%W5`v7{2R?Tt zu@`FcAdAtaLRT}SX`z%^;&XV!&xe7mkL@F|{`g`Y8!}5+x4zDe<{-xXYS4e~u94hb zJARI_<;2mvK8-H!P5Q665j@T@eHo@7#j;Fri@^;_G{8+NSrPqX0>F+W2gG8{tgJ#S zWa?ryI09f9O2Vd9J%06b620U-0NFWR&8|9Z7PI-mc{=FjBG*k~i&cDx`~krAI}1U3 zR~u(f*lPltg=X!7;ial6B=>kKNnGG;ck-&eKgXMO;P62u@lh5aGK)g5$N2- zA;1^uh`B}wbe1sj4KAIzpwjmRS6uM(89tRMKucGSaB+rwfg{cYpO4~U=~r%p)psmZ9;h;siZb!HLBjuV zWsf~ouGzwjW{^qa;Hh=!#Dwh(zTMUHC{KZ3xTL#R5D88knM5z~9I~9IRt=fC@NaPC z-ifJUk~H}u^-Pi<)PN0%AuBgZz<~ZjE8>DQsVU1$mv=koX|j?7Ym=qgxZts0`|>ob z2f53joegFvMv#Ign#7igQDx2@WDd2pZ}~3C@%j2aqxltpT9k`h!>vWS_!#Q?J%{(} z`^1d6*ammS_JD`epnRK5xFiP+dw~K`6pK>6%J@E$BtOxl0C3e~GMPqslsXEQ&oORF zAjaIE_8YaRI}6l{GVK7u(jgmjZ48=mV*GX9MoPZ0sGwSKFjMTwx(_2I`hVndPw~aB=Z!8$rqHs9s9ax|Q z(x9A21v>>#V0BA3$*KKKY|a=K@r^x9enYBD`D#NvT;>`zKFZXhY7f=Wx&L+3lWQDF z&MpQewU1?|yslm)+oz873>dSxnu|nf*i1XvgL+G}G%x;LL=GMI&Q}+)4pLS;0Ma`e z-`RX7tPE@^5T2kHBu&`Uqxf`2L89KhrW<7=$%8ACID4*5xU4>F9P$04cjQf2bFk@Z zM62>ncI9IQdk8?U4EvZW84Z)>Apq6MZ$-y?eiK1ZO`*K6UAK;0Z{PDv;uu?*33CO{ znH9>)zR5)Ol$||!f?^< zG`An_gKvS3HW;JC0h(Xon}KT2L5^&+`92WsCQfENsil%V_skjIKdj;-c+75Xa@?IJ-FEH*1fSp}adFI+TSWJ2z+y zJ(2~aKb;mum*G|S4k-eu>4)LhYXir8rw!Zr4J!u?>GXnDN?(5i(tGuLER4-gG}Pj! zp0(k6MqDvGlx&BkzLHBGK9AdpF4_1TZr1^nmN00eVG7x_ODo^>hmvDX-$?Edjzz9W zmTm7?Xql@7rrk1dVeA_dZ)uE7QAq$if*iy8q~4NaLUlUg`&a5qCPJ`#$fB8d2eH4r zkEM>zxZw<|rD7Rb*(^nge-?u;=q1OLk%eRN0;q)9>v8un5KK*Cla1SPQ)2paDr)Fg z8(|AC7*?}5@8x%_H?%4TCl{}p1?JMs;ls-8j?CVh9dPOYHAn! z(ghB&c!aO(UVlBXun#ittC!*=L9bF*6m4Vtun)XLwh0xs1yw`!c>jqF^;%?A-y?iL z|MX~Sn06{|Y!W5$t7>J9-Y5;RI{0*J4P;;Y2fu+#Zq#^bp3Sg~WOvqJeVofpP$nV0 z-v*-!TkuHEVpNpZJ(Lv=fjan>2ZK}LMmzlThj3TZJLa*rPngJpVALsCBp|zi6!%WN z45>vFBa~gj21VSUqt$RT&AKEq6DJ#*DmU<|H6fmC_?AhF?VKPw(i@AJu<+UUWq7T@ zG4R6yx5AZ`xLK0_>i(4Paw07}Z-&Jr_s25{(1R|7o3%-wGMYj=8uI zU35`-)Ip18uHsZmtxN{+T3Z%5&5@jl58)nm!g{`JP83u74J*u#dpJ73MfcVCD;P!q zIK3^AP)i-wq8ZS+va%HduoRtX3upRzbO>&RC=G;FxO^5iRMEP<;iM~5#DgKQURV7w z{kkywpxfa7IYAf!(uB1eN-g1Pg^Q=hErhlyMKU;o3FyPrI)on^_IoyC=zUyaD`?CF z4Q0T{gUMf(PS zCF~f%x44?S$XJj^XlP^*}HOQB$#}5 zeLenU4YOsX;Kj-ZR=?Vv$Vt?XWw8Omhxg>~tfZF@ElFsp~fjAP0k#PdG_H!p=L=ieXz(0IK^SKNO#2jv$_EL*uAW zlqd)T(yWppHF6Z!{4QMT;Y-YBdpB%cVM>)a zjthq{VSjXkGPpe^i^n9idMr4zsEFPL;1pW0lyXY%?pxVoQj!D*MROoNvvKU!ZiA(Y zBK}f5Py8#fgv=60D~SF%L8bWADMy37Fx3DGe)tg1EJF=2+Rc50EWUf0_4e zMEoyEe_9H9UDLip@pISZZYyx2b&kN{spGH2tu}x-t4Z*^i)=Ec)%iXikv&e=Xm1ms zK)DNXkY!#-EC1|T0|8s01fV$bOnNw4+FywR2vDReWZc*>bk6E7i4TW_qin$fNnP3|PC%43dSIN{j^=*X{e!yb2uV^GWZX z&!x-|M{%Pq{v8u65%_ZF!JMpO8{<1^qN^MK%~#lg3gh7N*iTO0DXBuoy-)T<;7M8k zp3TRWSg3+%ga#_;@O<{hCl zFH6~J6B*qZP+wuvUoMJ|HmW>?HwW0!3Y&uG0=aoR*oi1%f#tVrD1I@pS(c0@i&{F` zYH5K@`RlH8Ucmcnn#XY|PU4dJq8#A9us!}@chNrR4%n~XPl{C5!*GnJcY-C?udHO7 zWVgrL>W&02Ew*JxPqcxTl(3AnIH4tp0NP0m{uXJev>}lxpyZl`|Qz8nnG`06y8he$w`R^ASj9;OE6zFMSDTG>UDwvJo%G_e)HO*){abr&Hf0quxcrF|; zhA2_kRpv8ij^*MJHGyP1uML97+2kV-*u~g_r#V&DMziN=Gz3XQFPhOLtsL%JxCQue zQ^MjeYz||6>Ra4As8E1E<0i~)1*bhtZ))1J2XfJ`D~3;=AN4v%l5^_8 z9WWv&l-^j%wm>pLmS(%j@~K3hOsKL%6)dN$XNaz#8-(PN)*^H|kQH^lr5fi2iLEuG zwjIyq@W=-(wpRF3)OZRgZ+tO)RX@PEwNdAKW!HlgS_enGIC??sAHo2l2z3f6j`HTy zBWOQ)d&u79O8P8L<3VDGR6Cxzi03U^W9bdzT|s?A{M zAt+yYWXx0lK&hKbWMRShlM714Cs4teU6j@6Ms*A?1)q~L;u04%F-lAiJk;6mtLeil zvN7Q-Qyv{;SY=n1ub7faz6jJL&a5l;Qke6mG>t?tTa>IovWTK+;+zjFh(%<0$*+@2 zkMHNjjA+X;KLz6Ahcg_+CmU>1VQS}DyO2$eH?=~tE@&OCi#vV8=9{PP8qxj9=0$T4 zlu&o#NoD1b=SBw&X@iTQr}TTK&as%pLDs`Wpu??gTckq^7xEbDM3dH-3`~xDhzIX0 zlVw+%xzC`yRe2aybtT_5fjAKR)4OB;HCH3 z(e}x2GlGaOm)LPstfYnHnzt0)%sEMMm>Z*oi7FeIto#a6x%K;Sv+PbBz$g%vPI_kmlkqv@xNlA`&g6o#1o`O|~>GV)gQlAr39oBA6 znZZ{cMDc>2T_5?UQ|o${^Y>fd7-YA{%1?5hUOWVuTwE#ehI!VI{0t7WQtoM5q8^-X zyPE-wGFTE9bl>v6-&ji~2vP!4YJ4bY-uLx#wqoOmgtNow;K5Qs0DGxoqW(1^o0s@Uu3{DJJ42 z=elhsaq%)ul)+aPqwa0AdTIwU^OAB5YQ0Lkh}FV5+~!zkTvmrf5~d^o*s7Z)^$0q* z0LME0>!eEyx83#tOmJi;l4cfCXLrXwX3 z4(c6?k0*8Cf|WC)7~X0HYYRNatp=%71^pq9|2og6&COEy5%cu4#Qw~8<+`tZ! zKr0XuRVLzY=1!1U>>wPss*s)$J z42h@G{}o7W)H;((F;kV4^ob8^K_=r*1Dry-%VF3k{zW{|(is;a#Xx*R9g>czUH$96 ztrpY&X|b9O*kmOWFF-v;&f8>a!BDt_xmkW+gW7N7d!L4LAST{uP!qrmu>78A%r?r! z7gFipgt{1o|BHI6(%mS38+$jITSe=d$WgD*owAIRtqxq%q;V2 z;!_8^Wuq?y0m>$Tf%;ivRLrH4T2c~dhBK!q50jhU^@os5M}6%>-($?3JB~`#fo1m{ zOiCsf^e=)+CF~l7E{DiylK59PHaFJLJXvlsO@-Yw$VHh&V{TRADj3@Nj24O>f|T<1 zPJTqZITJ}&;u7puITm(Pas2|JgDj-{P2B3pnW@;81sSN(tjf%_u0f>RIup+Y7q9Q} zYEWH2-QYD19PUmz)Va4CfCrZ^p(Ee4Xd6@}8M*Vbpb2_P(E9WaBk_V)W}~tu#=dBa zVCxKi=sx79<3q)`9e$3wZE$ncHhDmigwb>N1Vsr)`r-}*sUo3*hL=$iD9s#etAXy=fE#K!>-}EG+R7+JitKd0Yo-B znTz0Pk7Wepp*4pGtY0&YqceNQt_>gA$l6mux+)yENlsyWT-|EzRepHtgET6-RF*^X zPf^%P;b4&?lm`pdR)dE)wF`-~U~`H$eWnntepyl)FDU2P-0Mm{=A}HeP*kc7)$+0E zmWNlZ&A*_h=CLoAlmX5UU$}i*R4wyPJ$xC7GlqYyJEq9BzEU!x`HkzSx2uGWlv759 z(O?qp#>Y76%0S8Jb|`a=!|ie|n9;6wNAjZu01(2Ez%A&jj(TVQq4`w_#U2|0sPXuo1OmsLiIhCw}K{Q1hsSv)fzeaZ1y;n5Im zi-$I(*&nUm%RlW17#>ESyZjw^@ZFNdyJXHfSWxQlg<$>w%@K8E?65*6ZOgOgMs(a{ z-jyvjBLUc-M>SjeLF-6Xfj=snzjZJ+ZgD;>@t}86Ih^I&+V@Xu80}D&u>$ zmhdpbS&a6y&t|3=%;`PgJ&f8FHjezX@gACrPOv^7w=S5dfGeUo62!+6%#~3`RRxw4 zIV@1F>~*7Sjy7_-w$JrN^MM&65n3lk@??$&4VK^jZMd<`#|aBJ(M88#c1KsRiM1M< zKME`AdI82x4*KwM-lWD?cL@&QiH}^}!m`}0CCuD|Aj`|rlWJ;_6IL6QuTholqJ$ni zcB9!Wk9ab`Vjm^ZKMSDrN|LiM0YF3}PLKoz49a(#8Cg80PoOzVd5>&BRkJ`@PqF`7 zOn1E!5$x8i`iJ^tAE|=vlhN*;3P=nX2#|+`y62ixd?40JzfQsIS~ybQOoi<8t8&0$ z4X+J+DTYnp9&t}7E<&&bgMep!vL^gHt=QD|d`1?ly3rwEK`(Vr3{$dWe4;<``UHHw zN=-tlSudZZ@HJ%yAMB2)B@iTTak8Q>gSc>`ZQI$PyT(ujqf|@>nJd0WPBJX`(+!V4 z(SrfbkA5|z~#m-vY8LFAOU&EJ_uJBG3a)WI)MALG7xoV)+)3kN| z$Um0=@|Lv;%U5s4sj=V|DAPf!SRZZOj@GuH6K&l(avKyt1tdn-IM^imax-bOABiJH zLOQH^aVS*DTR@<0*^ zDIhAIkqvR8&V@t?%cIT9r*1uR3}$dm^ixK#tPm#HQJpV2EoDM~d8t(f$S!o(a;wO` z$nMWAfE40VQ!>OgIcNpJ>!!vsdu<$gw%R!vKl}!!L zx!MeNt?EY8{xa17M?kp0-qyaR;}W0OsDRz`J`*f;=6bj_Tf@<#=;pY^rF(|hmu`r5 zG-41! zv%~J-OBH8Bb|c^L8^B3qaxT?Fsd&Cf2~u~>-IurO)}+?eB(7a$ zB^!A`1rPgr_KOb!jR&^08`U4_c;Y7G#1@;WMl$|_b`mVGe4i_avm9<7nI)MoLN#1( z(xRy9r4QLWXh4$zpaqK?ZGcE+@r(1GNPg4zcM0s`x4K?~wD=T9L8BL+W$ZrneteEl z%U73>+$N+?JN{uk6xw1Uepn1je{`o+;lWTg2oQK1ji@lAS-LNz#PFI^1`bFFUIr&c zl920Puh8adWQ^PF{)kfwoK{#8zVtM0gm3DG^IHHb6jP&*0ET=;CL24q%ntR2WodO< zz=e>xRI?6Ln#Z5Ir{PvDQVqW3#POPP5(V{+(X-F5g)^;RoLUFtCkSe42g~4bI781}L$at5GX?eCBG**I>Dll6Mb1>|# z3(jcYv=4-nJEGzHGxJcW{{mhi7z4q z-3dAFz?>@L3McP%Mv2f>OU`Msid}l9YMYamkoN#HD(6eqq~fS^_xyrPQodAi73RgO z&L90r**?QNZQ}$13BNQ63Q>mbng%!HW+=4g4mJ^mKinkKWq%S5a>Cs$!<;BPayfgN|*MFkZtn>b7T8ErE^$@>zYK9fHmY&q-Vg$Z+r=7 zuRQl=Jd=CUdBpeK{RVbn$Vd>u%$_Nme|GNM{|1- zE`-GBpO37m-W{5-5_11bi$NF4jN#t8wr*CRo%CnaBW)CfpU|nBI{Hm4MFOv&Y8{-c zW?9Z_!sa8DlaK3-7eqK?nORaqCKKm!0-k7zqu*5GfP#1wmLifZ`GEcMTKDFGO?~p) zi9%Cu0+>w=C^dgy9jzTQ?ig*)K|NRe+dj*rw*XK!${uclq=@YILJowq+w~xOflzzx z-051X)85-au0kR#MPLL)31q6)EiBu-zY;Iie5nm@P`XHFu&f_SI}YR^_JN5FrXzet zK*V%HZ^I}JH@hzI~4XaoD zCu1v1eq3}Rjw$!wU$LZ1Z-ej=)w{ffFM66DZE81`W3nM*p|TNnQMgk^kNE6(v;ck( z5;&2dl{p6Qss;0v(bhhf1WsP$S+|(75-%$*YMa;~?Q3gZuN`4&YAv1{7*W=I1);90 ziHY&|+}(&BbTjJq$)l@Z93fpQ_SD)p^wd6j6=O}93( z`s3MW$uXaQvEJaQob3aLXYF;%qZtL8Cer0TmrT@7LQH+pzKaw}-}s30X+76H`fer^ zhf!_Y)oh%3)X8%bZ&MYR?WVC1UKaeuHje(?8qRm%TCx&a z;#)RvpB-v2tith*`=4dOBgEF!d-6VUaHtf$O1Y<;MEB0G5nTQ1Fp5JZzM`c|&sNzK z5#>8T43p1L?CoYD7$ET(E-%R9e0Fs?R_31_*Owvfy7LxIuiP-N77v%8meMZDM)rN0 zGzErxRt2$W|A^H9ykhAQ@zqm++H{Z9k!yqA9A;2`=}qMZe>|1r75A2Cb+AR=Tn+C^ zsF}!&9L$U{CK~O+R#X#fyZ>1%1|!_(ub>KkVH>gMspi4tp?qMXGDA30Rkb0=Uoa`_ z8%PaAuJjGBa)ZCv6k`SlZ9-4>mXZc@Ofd19?pU&EmnO@pQUWq=`!Or=OV7w(sA{AQ zKk(y^5^KH0$Xs4AWH^{}HIY6aFpj;GOcT7Y{9we&dCD4esmnTpXwGKRu zcFsB!btu*doaJQhR$&84l9!2&Y|+PV&GqFI|_o@h(^ zx}|01nL{ez*=Q^-$7#a^m5km@H-d)vMg&g_rj&-<%B-^Cp7v#Xn7{p{9WN0xtqDGQe}quv|>D9_FAoU3sUgRD3A;tRtC+UGqv zsaM0|ez04n9h1GR;Z+3@!Ff7pK7v;PWZ)N3Zwv8`Rt~*mfJ#XFlG00FS`_W-nfp<7 zAv!A2rJ2xrOQ??}z=K^BpblYVKrUJ?iZ?}OT2}ngdoy2&57(ah7XX;FmG4(h!^dsf zx3AUDj`10>p6s)O!aF>#Skwds{g~nr z9F{wXzjVJ4_%Nyfr3u@+){y8)9+_(r^mv(jkWnjV0@gDrpSYo3`=A(1Fi0pUf*1`f zd*vx(^W+Pma}dkt$IkP!f=0)el?%!OUK@sAplCA|k({lHY31@xUXV7&YlXvNz@JHQ zuewS;&KlVi3yVN9%GY&ol_)liK(%;i;@1zS^0ud*79GkJ<;8roB_}7~(UlRTYm5^f zw9!1Hb~|aQUSSjK6(B&*hw{>#V#EMCyJb#^x;!XKmwHJs=~KHS&LlAtLH`nvy{g4f zT0}K40vRggtK(b~?yI7NwY&9(Z}vSxUIE8oTK z#2j6p5-30B^D5NB{0U0d&BAE*oF0z8e@JfdS5~itw;*@B_Mlqj4?jb0sxKp!vy?2u zs9{F2>Dr5x5Q7FLRJ+lVi;5#aH%zx%0Yo}P7RU`xB2<+00EGk3r4Y?JAt&w2@@|Q@ zD*o&uiIzc;CF4AHBS1L>T2(NgnuWg-@|A9d+7I%C;( z#T-{nv(LIZl4Is!L(<@M`jy`Z;OQ~d`uLouHyRzkbba5-2 zk*k9BCM)39ccA8@4tX*HqT4@K=pZ!%DcO7U7M7N?Q96_RZe} z4+^Y%sEt-`EV0%^vvja49@JG_%murbMk=Qu)2EJdBWPcf2lwI1v!_;jJ*kR&hFqK+ zQmIF|0lL{H4=v;7I^^+P3QVAHpYYoa2|^!9{5_kd&X(NO>tV0v4W1Qa=H+sLLrbN< z0pE&zLz5$a6I*3G<#GX)N5B?Wt~177o-h!31?{z@%)+R$KoJI4nLLW;P)^5Th05ot z{J`yfK;NP@MZUIF>CgJEa|icPB87)t9v65euPN$bHQ_ibGedthSVqGm_AYy?l@A{1 zKe>XEXukpz*}ONX8L3rClC=KWaP|ZqeQo3%hyZ|Ko+=XEYW~CL_FjODnUI6SLd&<5 z6%P&uL(b}pal0sty^_SRSZzvZu63O&j<8pAX2oebOKV82o{?KGp z%qi6wo5bszQDw{bH;sB*@}ufu09mLK@-~qjGJ0%F9G6gF&YQ;K(<^DU4a&*v=m1r} ztge2EMCwuLBKo|Xbbnr1B#QI|*Zga7unJlhOTho;1RfF9?)qNBkn8$r4zxn39fh;ti7bVCXhzG%3D47-`dy=a;QW-~$yI38i z%HH}S-{}e|oJSIX*tn_NXe7=GZSdJIVnfKa{ro~97NOYb7@4gcRLRjWf)PatS@0p= zK}t#d3#aH~?GL$OiG~l>PEe6>mMuwoY$;o6OsOs??Esw@ijX|1Bqm4{P3+=YTw0eh zS40L5$+U-q8(0H`&uc7|U@Oh2=}zyAKb4)wXgkjclo2jvsOnoy>O?p}n5^ZB#K>n_ zP8|V&0<1Uc4!KB$YFEjCl1Hm&utcAaSg>Ui8T-v@hNp{sp`ZebJ%JyANASu{9AqhM z%d~;DU6YF4(=Vh3;jQu^Kb%`#ZuXiae@S=(b+(~YEGt>vE{pXOMjPoOZdldJ#Xxlq zqh5v^lWiVGGbUfB(t`A!SfLfaLxIkRa`Uu!xWXj9S-!&X5jRa-0&2yC0~70?TeBTmeyPw-Gvk|rzkzP)=Pi4G`8{I&#Wp$=m=}2z-Ahgh0JeKRB8oH*XGYgkSsq#JoOU z(NP5nxi%TVze+Dy%*6D$`=V#<9%StJODYf4Ua$O1s*tRK+nXJ5$rQK7cU403-oB}i z;yl{uM0@+3L3#1n=o+?FDfgVnIB=tiXV}yop=JE!fv73x4!2u!D3Tf*_BL0eF#lJ{ z1ZW@F=3$|;m{45+${Bfp7^P9R1$Mour}q3vE3~gjhPXQ+4YD@^*!$#@8P%p1(z!g)A2Vm03918_79 z%?H>YU>Y|RDbXh3VA|S0p=B}_N0H#{ynrleVI@3xgl0_JK+^c@X-9r+ zEiKPJJCRHm#vx@Zp$bvpXh`G5)z0Y07oI#d={Hol5MQ!yW@DR?1+Zi4rWdVNgSuFWYS0`za&T<4ErDcf z*oJcYtSL=|ws($E@7ZNSRFWh7jabv?I+JJhi_|Jf)aZS4_F!^KJ>aU9c+AqZox^0Q znD{nm8#@S~p_C3DgOd$PZu_rJ`Uqp{dI^{_>9`@`+BRYT5VX_A?YO0qB9#X$^IVaK zGnm-cuC!ZCbGwR)H&0yRjKwbgyHwOO|J1E??KDq`qXA|zh^K(syv<~ae06-DGC(Ki z$9)U-xAV4GHi#R=uuB+gj;~L&A!M(DlS@#wQo2m{kZ+)t559DubS{#mQ1Ellp39vh zd;6l)Ei+QhS?;?sfV~&z>#iK1Wi3{tASb^=|4~ZG@W=))V+l@nS7g9)+6>$ z?&HrtynXZTdw=)g)(o#EufKoiUyg=pej2xQ(~|*Ud5VVuPB9s?{tAeS9}igJaRlKe zzQFo9%A^-V+YhW!=mh#~_n%|#KTZGc{mEs8UIP}D)f*Y|{b7MzXmQ?;u&anv1#3L1kZbb^#?YLo`m~5apPJympVk{6N)Js z;ec{Pgo_K$k2~QZa;&~pO}=pI_dia5`hZ)0+>`^B1H$d(2magH!=QeE%uz;8xDJ9| zRgobN7eem(EN1t$n`LR>_dmXWD<6>mfvlxb^zB7PC> z@y+xHe)?I}@RF{E?MGF4ra2eaVbne4Xife8?fVbkPx_D`1|KWV+?So_w}GRmm!tjzdT zG5P+t)1UrP-mjngSvTCv&juw$!(nQN;wb6!|6Z(TjQGm^`7pS&Vvf!4fLU znha=a8?#tOqbZe3`fFrAa~}TNo9{pUye=pNP#VfhifB8rJQ?C0Tr$0>d*W52JWfU)gSyK!?t62JlQ%o7z z%}(nmT51QWAUwd&AK%E!92mb*a9hQdI8V;}RM@BhaH56Uv5c%vGLJ!8D0w|7Urqh( z`;Q<0DA(o0$hhE3roNw^`dcx)Kg!Klro=*s1;U&7jw$z+KcD^}Z?WUAej-!Hqo4ME zw6;ws8+&!XUMy2|O}xB(;vL_An)(mCDH?U;=*m}OW0PxC?%?mHKYW<};mybCUy>v* zSS}|T{1&a0cfA=ligL335rUa3;w)_aAiu$hT3Yncn7qYbR4{yHvgZ?eL-H$s3&hmef7ys$}gC15-kISRYFM3eQke7atJ61DJUY)Xp z9S^pj|A&0d+jsBYU`xlXt7z*$>)4OsZJ!@!P|SNx=Eld*&*>9mIVCsz;my<^b*a4Z zH48s(KQjZX@lrNiMEO!FnfBwe8L)Y$GVn3Vn{uhRC5{{Rr>+zG{P%vL*h|yj%Zs{H zwJC@j>;_*>`d_~J>8Ce86KzYG2E;SnwP3gv z*P9M)tEwg43eAJe5?V{!Xi}fTWyhOltAvbPRm^c(en%}!cU!3%1&RO*s4q34k7FKXV=7zFOH2BU%i*@l8v0t>c z4_9N6L6u10gH&&V?gDrTZf@kJrvB6Pr=Q-x`{=C6!I<6HdE8b-=+`Cuj{0k4u&3&y z$$G6rdKlaBWRBqcXmdRt!W+X_J+2%0T!ZTH_MA<2_$NK9Z1b<*fA{gz_y2P$Y`25b zJhvP5Z5?~I26vUZwfE~(FrW+Sd!y})HMBKqHcRcUT=LV;vP#~4_wnu2-+lUi`rX@S zs~Bq2Q1x8?DAWJpyZ1j%+bm*NR|~R}_&NE!T7)-0zWsTM42!Q0(2EFyIh$mVf}WqR z(lB^FqcW&X{o(yPEZjf5$3Y_h`thf!q!KjvBy@kvUw)KX`@^Rnf7HV;X|iEkWoKRoopf5lnCmnLn0@TD?dpb|&1=gc)!Q!97sZ$G~O?!W8pV%y7=2M@ujvJfm^ z=A3x#`blEMzMhGmIgSJZnoulnoY>#C#%j==%5k>O+MJG&?1Gg;;j2zJl_r-BWbS3D(b;ltc$ro0`PU3wqtS zUT5fS&82;C4MAb^OwPXSe-*di9$$>(EDM#)9svF0-Zmbj9Awyt1rjfOW#;KI4;!$u zh~P^6wTj}Xx9fnE;J{n<=}~LI^vMZ!2{mx~Pr2()F*Why^wh*E;;Y;$@!ggDklI6! z&Lw1?n~y*`6a4wt-+%h>_hzS&1NsfGKf$XqZaVi|2@LGx;k5N~yRDXb_Yu)DCf2P*E;J(Uv^J5D`EocRCG+YjPBOmR54 zSLL%GT(oD+p6C=PqP$&Rn)=I6@BX{KVFLP`kVcHoixShZEnJ@?D?j*{RgE7v(d@N+ zPAYp-tp{s^#q4CAF!n$i6CYll%+Uv?PxVY@!%AOHdyx7nKR^3OzIik?p-PLp;R7;b zOUflWiAW!m=CBTmM@E!bO$SG_WJYAtX#DxHjaqVfU$qA6GHAj|;@|59UWK z*LaXE{fqz(4Lgm7&jBE{L0)OiCaaFLT@wv%3b}cOt2(-KBV`k1vwdhO@DdTuGKtRDdz-a5m>D zw6MuCMU}|4G>$eqado(d_vYhUgM)}U5!Y9xc`Zq-0C;*3){MMxsY(2sxKPGYRc$!N{mKbY zAGbEVxFN>|#2l9IrhICP)$1|G=^;(e9{jBR1-`F5D1Tv*TbV2LNT85#^M;MI2vHk* zMm4VWAz(OmK`4bul*98&JL+oCs@gCxmYVb+qX-uvzNmc)65gdf)GFF(jArdRI_F%D1eS_23%w)+14JGYfFeiG{a z<$L#nEXJw7`Xujoi=2q;g>lkJUS`_%^O>A%@LK?(m*F{o@lA;E%U6H(^LKB4oc`{| zx4-|r_d0O6Y##=@hal_Ox@YVib&k{*1DtQ;AQ)D5+n@FO^fiu<~zz{`)uY z94_GB|MdUA`}4Oy{N40Fe*E(v#o_%w{+&1hAT>EpF?Xyy)0?+U zkNx|%KYW`0`A`1l{fCcOKRF^2g2%F5@XbGb!qG8G?Vx2=M+>LQ^e6E-r`~@`HoW>V z8^g5HO`ir3(*^p-^in)jqEfvh1~7CjfA{Gl{V&P}S#8YmdHF-n%$N(HF?Jd>n;BLq zDAwwp9ady)s~AK*9>@pT9|ro0odI*>daFe-S41@#d}lM1dv)B$In}hsgHm7<21qs z7bGt(j20H29+&KheM|*=r}jI)>d!yC!B^o~W=0IAQ>t&6z+W%JWpZVeU*kGchT;da9o2hhfCH8?Amws1d-YN}y)`jq9}t zmQH0*py07QuV;3FK8ILvzs!*e;1XAq_ls~=!gKL!=@qd-#n-Zs!Afei%1+APqFZdE zA-hH*^@=e&0tUTb4)+wkb8?3BXnp&aNuCV`KjdH1$a53lnJy#e)L27BNW2<_=xLPK zB>|xx6AI3+w*f)k8t7QAQfPthy#}Rgvhto)vfaZhtWWkPBO#SSQ77A4F{M>s5qPE` zw`R%z=KZ^mKWRe!*^@w)ug0(b$+Pru_Y)9>E7(yKUQ)9-%x@Lpa)Or>RgqZHoT zd1?<>zv6>WjOKVD*%nubnntazUbft~9e*$*Cy2v@*LYGm zf&n+}LzSu-?1n{yAexiw0;6OyTJeg=ULgZ>bQRQcx*Ks3z9B-J6f!(G78(VB#MHil zGrG}Xk~~bMfM?70Mwb#!ErjXwX9MA!1t%cC39={Q## zn=1&ic&W5cv+@Wnj4A5~fATkPzx%`Vk1Q=FV;J!yuzw*LvBA9Z6h8GQ`l+eEdGl5# zgyfcToBAi#kj%rDk=05;c()3*Do~B$IeF4!H*IuyUOlx}p?#(Cg_Z|oIim(ts=&a@ zhRbg0D><(8unx$G2LL-M@;UMQlw{~KEG^3EYTZTpes&5lEAK6emG9J@FvxDbAFl6t zixw}{DAG=~N;IIC8&SVbCR|oJtm9d~#bA5v!qAV<;v0*rW+Rk5hU3T;olNFEvy7zr z2o%X-lFU+C9?14pgFX6V2gZAkDFb|@10fw*pf@wm)*iO}0_|uwqisFW zmjS>%ht1&eCfZyuI<0axENsYM0qpGz@*DGBd4kS~0iLVqGj5K*v~F^Dn*#R#8b}Y*qw7c!aR6&|H`8F-R_COp>pBM^D zZlg3FDJuCU6&B)5ji(@)uamvcf+{XDC3fajqjJB=HP$E@2#u{gK z$KR{2RNVg@o%Q^kqv1@`G`Ps-0(dkQH?*1K)L!2h$e+d#JBLeUmn_v~jO%a0poD{mjYDyk3 zt~Y}rT)6P=RBJki1jd5*8&U=PHjfUXOZ!V+Fp&FX(m>6dR+ViTF5{pq-jy|i7_Y8x z{%9__4}3aA%(%9AmMyn~kwAxuOUd(^R#AcR-FnhEP=%29-bBq%uMMNFnfJ zl2BSR_Gc)xye2~-pQROIbD^D$Y@Gh8!xG(B;?%gBv~evp9)hLM9s){OH`XUHeb)x~ ze4($URMKD+g&pn|#04kS!URzfrM69MEd^3hv3S&5UhKitRI_rp&@ZR%?nKEr$sF!F z9pR{EH_5v7Ob|UEoVgdp0CNy@f+}#Myu+>Ry}s^)if3*>azhI|=Cnmw>0b%)27SX- zgDpy=eD#^@(a}76k36jssS>|MW@HI;Dk8A~OKjIgH!dEsXH;pwj+oMp&sMl>*we!& zwJO3^CT_?fm1p2Vn0DNllNtXdrP>NI$d6Z!V?q^7zNEuy*2>eh4xG^XZJ1ggrLUp6 zy1R!Q9BO{r>eOD6pCHq-SAbmc^^38njb%PV+~^O7=0tCv{Pr^whwDt{X84xulq)WhtYqf#4LXv4}trJ%BG z=?{y!aJkJ`INUtNjfsDvQWO|Er;G9Am2sLkVY3Bd%KckT3R7bwpo|u)akI*E5Xpka z6Aw6#=a!@E!nh%r!~vulX;#Ir#*62N@)O zighbzBKd#0Xp^EI&!pvVU(;}570FrIKm-vFl-vZ~W|Os1T3WPnd4H~^_^!d zbK7~HlqGk^kTOzzR*aLAGjsIltcO8guUBFly;jdTym>H;%f014d;K`jh>)9J<*b=T zJ}C!F>k44EjwaunO!GsHESbPD>r15-wlBi{HO65szBM^sE)4<$BF`F7Y{kbJ99Hbi z(1S(O6Rv^NRUt`I{k7wOTrDc*6T02-2((v()n9rmr+i_OuELc$rUl-8i>!{M>_$_m%$@y`tsj6)8rn)N|zba-qdi* z)nO%`U}m(|7kiA5!ZAHka@8DRx69!uoux;gAI;6zF3K0W$S`uM)*OgUMfy<%#58X9 zqR3(KDC+jZ9AM@NQmM+A4Ayl&f<9FH&8)uCY{$bYU?SNofaR1hg2^C~7LL8n$u>)u z7u!(hh=dmh(7*&}u7zoBw`F%mu7OjD>D1==7Tm`as9GS=bN`%RJVOLieUx)M+S^xc z^a7HI^Z3B{fD?sO@#>(LXx~kyo#WB=hmrbAp!!y@k*%Oj$26m7S%0$`R{p-z7P^T&z|7&I*Rzhuau@zMs^y|fLJiGQAK!U~BXn=}^tQp33 zv9zoqGRQI})iO(Cx(a!-Ql-cng2p`Ppf_8-o%`7-*81L8utKPiBliv;0T0{g@Gz7E zIsANNE{XOtM+qJcb=7A*w?#OkJ&4>L>3bu!AzS<1J^68-T|=IMSP)fQLLP0q8=hZ= z%3o^tpb<9P-OW|Z=Rp-zJ6DObBRXzls^r{&QkE|D=q6(4!TQfhRoA&kR&Q%ylDYCq zR%=sea?V+6oa#`py7BBPFQbb=P+p8AgsoKKe%;8E6Bw;{SPD|(%%#C^Rp}I^wi?Di z$zg<%fmSq_kHF@m@ApW0c)N2qK^r+0$a^}Hpox5Ey&u#&JkCg`Y~Lu4@bJY~XBd2p zV`VXbU+K-;dJy|uKT0M5EJ9TWmIq~+S8)mnsT=!&T-jwYc}@YN-dmL@WGsi_@uQ4L zOgm=LBVc_VE6K7&;1GJ?zX1ziK9aLfZecBin9s$&Wo9hozkpy62c$lO!Xndb&L@J1 zZCI@0QKSHGDAu*OYL{Zu%l|$7;g9Gf0hT6ib$~)#JqIkuZfIfE8X~dz(A-Je6Q21JsjG z$h9|Q7}@A9W`A4|06E2$Jb2W-q{5Caxrs#73w9V2`kUE}=gN#V0r@`CP6Gb3+mlJe zKg9+*g%s0ZoNI&Qpm`%ujhh#+S9;3JaS2qu zGFU1!ePKdqNk!O|(+4E32sqrmJ!_k$A3cOSI&R#jPuIIFauPVb$gyXq>@BAr0YUV=VRF6HaWnbAk?|^)F~w+6qy=g z;0XoOPO|eT!8f3M;E)UeiE$w(-h#RiS1@#`70SaIrzHW>-2$0=SwXVwb*;~ZVe#N_ zk2waiQ-D9S-t?#~b?UNC5^j?pj1QZmRElLi|KJkTFu>7nI(UZON)QfZ44iTlDsY8a zJysG7a4Tm;As4ldl*l7H_1ABv{`UP3@3ax-3ZNS0ji~vWv*$#OOIJ9BGxx#i_AisV zT0wgeq<)%hVo@U5W5i?Xsgt8(^O)NM$Kse4YV2$@Z$Rw1t_&>gf`34p?o3MzvR5wP zIvhX5WPeRZiK4~RSt|bR+wb1Ld;8{>7X&T|ei1k`yL+f$D?2OJRo0=#-Lr%@Kq-)S z@|WMzRY_*|9oy}e&kB>hJSrE%*{XL4HFbd8Hf4kn1!Nb*!pCcmNcFWrXUR66un7Md z{T_XWJ~bfZRX1VG=&P))$O3JET8=3oj(qabSdd4RK1m;tlIccUFT(z=p~k7-NGBB!ew<;{|{@Y2jXGZzpmuEJ5Gzdt~CK8Djnro zsGlVC1PGkRv2KG2J zF2reNQu*+;IEfEFSn&8&QtRtz&ZwYj=a#4E0qp|7U%arRY}Z6=6eU1OFf5tc@GCwa;A1KK(arfFul*p^x26e@(B{;2urHf!?$)ZI) z`%FpUtIQ`J^KmO&S4G#ao!csiUy=V*wpzNC1#YB*gW#3T z4G9fJpwTP`1Lb8wZq2;DxV0a*j#0(U=Y1Ivgp8Fvx*}j~P(29Wq`WnslMS_LGX;i^_ zh$?kRMy**p`TO~5LOJT1dKMZ!5 zR<+vl=?tVmdbJ=u)SFTGa7J~%U$|{LN^!H`TfGuTk9|ar9!|Oempc0|h5|qaKmfYF zu0A^5Kt4g)e3Hf!yR0{ii@A7F91`_EwSjwd*bVYS1wLxRt#|+Q*p3%&!@CF8(1QMv zIYIM<+=sWBT!+T9+)ozeStSklDdEK+yd?zbfL19*Y6eFXb z?cK@O@oI8o`1tw|H?uessf$QHyGYE!vSz9kU@W&f`cjQ^;MPR)QcP=WSHrGy@TC%U z@4|B}uCf~||2fLZ6rT{FYqhuso+hLRTI2^QFCVvX{-WZe%@}00qJlRc2b9yf1zdc8 zKRDVW_NHa&7m%v0+daz3Qzsj(Rx*Ov7a3eZ^1zzv4H%@w`Z?{BbYe;f}>}7 z58&>b8?^OFcz9EgS&+l`*#T98%sCkB*Lt92lgpm%%W12}LB$L5y0lx~6moYDkpzCw zK0DXb-W4elFuN5k;a;xdMD2L404IG79lyL{BF9FUHA&*v6iB_Q+5DZe@J(Gx)Vr}8I#juL$ z?vsr=D9;4>gRy)Jw4w2Pkh%8yGI&wmximXE9HQ*fy&miLkv-X|i^9&6(|HXP_i*ia z7LWp4Op}Y6`8KTi%_9i4Yf%H@o9zv{Te3S$$~FPpl{q2XXT9@>Jn$x1uUX$9@RVyT5*B?B)gi%3v zjYrJa;y5JDe_g;!kK^%xtJ)N6qwMtxXTAihDgUIF6G(#^81Ciltu3TR%{~4J`V16k z_DfP!MJ5_h$AXNHF`25VGotp zFJfdJs4kD)XBA-hdPc~g#&IUtheay_%;S~qk!smTRZZ(D%{tuUa>4lbi4xVRQA&@3 zPUwklG(4Bt#)je1fWHUzd_E{%uO1Yy1KCw&Ek?;+G0S+Au<%RxC}-(Q(ER6w-IO9-tT8CV|uQuqaj2PDafzgmU_5ir_U6q8^B_t~>vn+OllV7Ftix$NfbG zeZ+lLRVMiez)SmGpZ`ILcB2uOZs@!EnCsa|AEK$IswT9~{l0DR&xK1kx-(aCDy0$D zV|1$L&ec9mC03M#qJsxm?;+X-i5Q927sI(7Bp(tSv=jc74ykHVb3a$cc3=l9e9IQ93_AEw{SfK3A0|J82*+W(aYwEwFFpnZ(hoR|z>STSDYA~Zii?4D&1X* zkJrXGd~y*gxQ&$tg}s>*9@1Kv-(L;yc%uoGxG=%%7QpLB`OB| z^1q>z0Lll8B2r*~Bk7!SQ-GeL3VruyMW}{%%4NOQNk)3O=j}#(He&{59(6Lgg4j?% z&2^R$aor-0wf^5Mx^BbPo{@KLUj(;Jc@J`GTK0=qccXMu!c@(rHiL&&@I5TB}Kbcc?g)C%k&`9zS7S{MszbH9!Foz^Uc+&~*7wrvq zm)3>9up3mg;Xbb@7BVdRRDxKUX8Wm=(PEOOdY1rz6UP_P&fUXk_lPt!szRO9nc50E zJxKIu)Xfk&>J_o_TLRTVli5}yus;tQ1Z1+tO zvn`k1k{^m*16ZCb#@S0T(^fBU9|A$rTZaGIDVf)+fizfkGBvp@i7?|rG2UHp5jBR9 zk(+D;%_~{)%rmoio)j$ddOzq4Z6&CJ#Fz%SQI7inslfC05ce5qpNv@=ncw&(;EpyMt12|s^%>TTO8 zOU;VO!%rp1Dpo>p-Hu^vz$G0I=Doz)i=+%ADAdx}+Alu(A@iQZVC~BW@eVZd>FIO& z6RNFv^P)+_>OD@SSZ@PNGt~H!@50(1l%CpsTSY1s0q^j*8LJvDJaUbhS$%x!^}trC z+k{KeewPKwz)VMDqW4~I(gBs^{;|BXi7pR9pqb!kbY2_A#nD0$Q=v0Z0=+Z?qU^GK+zj1K21iD_#cXN(uuEHtiXC^8 zoS|w8#0bQ#PIR>`k03h~%mqw(sy;g2CL8}D^E7NkdxT13jT!l9;#iS=8uqV!;*YBu zIlJw3n7HbNEf|Tf9#g1uTy8pv-^ys~PJTerey?@PyGsZz$~1K~V#(b5zC75>fu1A# zfWN?)Y?b77bP}z%kkWP1d_ikLM!;A1vH0t=L=3QJGrTK68s%U?yc!06(LpPjH)Kx} z7dCD~L7Z4fVz^E;*4mp&EmM51ts-v9& zB781&vVXYNd~q+i{QTN8Wx1u&D3wBs?hRVTeolM`dIqkXUs7pQ_y%?SB6j0+nXVJACJt?pghoV)_$-f)j+i%uZ=hC@8o*d-YJ0gDo|W_jW3K8_ z%z4QLVaz)Pew~iqJsh@$L+`s%-A-XTb9U#%zArX{T7d|4>~SgpJwU?0LNu|?seuvs zUMIO!@d3V{0z<#H*mBIl+K5M?bxL#8J&I8^R+!)9ac0M8Gtmu)Dt^ZFd?uR#EQXgO zL)|2{STa4wtQ=O_$zztxESQ65|M%o@{!NQUUpfS zqZQzZ#r!G{1dt8x9{5B`E3HJort?-oyf%p%OdiCpRtGTxnMC@%R${Cc*%Tk-W@vNp z)2Kwm-@ITI07 z0(c$uwov#vxrpxy99aBGl?M4IcN(st{;kY@)_G#Wr^}v$!i$;kdkyg9Tof7>3DAN} zE;^HE>5uDJzP>1~`|fhMH6tNvT)Lqe$hd3!E8=2URN39T%OKQy_rs6Vznhl8pUixw z&mw=jUJ}y-FVk^q>SWxE4)0%YQFGNBtF9;0592Jj(bQ2vQfnHHCk;&H`%D^{Oq+** zX)%qQ#Lo`7kBo@?v<5~mTB;F!;Bd8B5TI#aqWqObcz9Zg4lN`*uh+uEtUbSDOL^YC3sZ=n$`{&elxOqk=c&w79 z3aUY;WexvGiCHy?ZZXRmuqG~Sa0~k3#~EX)T>7ki6}k@Xc@w4mA zzY6ele8UQ}b@_g|pz=p_$3oTz*8N4(OI zAGuE4uZsgAQ2|@Qu}~EPKi+xm3~=IqcW1}u0S6@6|! z&?J)|N2@nPMliDmxPd9&qGIg1;H`IIkTqdeZHs}ioqWLdc>UQ%DJjY!zHH6X_Umb49f$!)Y7}5&_q@`sL81_>_Xzw_eF^1@=u9??FdZEyxeMN!Z73 z0$Ajh*EN8upv0W*OWJ(!ju98eq>q@yz4RDw=*M}jfl4g(HF@HYT3oY+y2@P!099cx8DnQ z2X>!|*JJD#_j@lMIjOhtty77GbW|g6de{`1TXFuFqhVd0@EJCg@R0Ht0rK@~A9fb& zXF-#L+71<_YEKmYdTg1ydE5+|8}fsZTWo`Y}wcsN#Gv zPAzE{&W@WVO^9nX7z6mambA0O4CEv{L;1Z+MVVmX+Wxw507+Ih@M}dBK#%%`Dxdan zpC?78fs#?~3kn!`Su2a9qiQ&FYMI&0y>cf?KvI@*lPlmc^IudX(D4(k?mv5$C2jdl z*7@VRdzlomU89{csyj=7ttmY1B3Mm_YXj)>sx*r^!Sl*8AVJg@nK*Q!jBXyo8}Mf- zeNQnc=k1(QT^zmhT3kR8MKkhptC|5R&Kl@LqKk)pi%--^c(E6J@0U46$;L-Qxn<>) zH_cXy^OipV8%XIwVil%(;e#mvfg~NtN;NjDgiOk}#dAS!iNl419vv0S@#QK{99800 zN|CReZCu9?Qiem9=?GS@y{&lV@Ljr!>)wUTz+)Bt$7!mt%Xr((XoRlxw*x@PL z(D~5;J(-4oXwXDqe6zxXfR!+9CCMS?d=;VKc+>5e>+FwqmgFbuo+_dDL@E~6vbQl- z>HErIBY2rLm`F8hsr06!n#CLPvJ;V!q#qtPfcAxnxM#vhnGBe@&YvUMs-N=peAKRX z2I9s$-=hi&?3r^Wueo?^ku1!kasW=HIrO~h6x%WuTisj(=x?T^Fw%JpT|1Ys`GBk7 z9y)DQq_ht{38~;vC>z0zHo~5Wd6(;Z(OKdr0fn;1}O3`&&P8&6vz?hVWem{ z;N$w5Ra6cUM8zbLk?Y9WgjN*5;lo+6nbqXlQ*$S7(h{5{E&j7**+Rln&tOgcdE00W zLuJDA(G>QJA~CI;S*O;qMA3M_N-N6Vj5nQ56TZs~i|Z%ettI-9loqwrLln7LXPXNS zHSzb>wv(Syq|Y@fj_bNxiJ(_dUa;6>i!f7N21O|^Jq;>x10A|nMboYn&0>IFH^}db zA5LKe;<>{7@@Q7f$d{+blixA$E-HLw^yuvyRj^u>WUImR2|BF5416p|%YYV=-9Nx}7I|`~%st$ir-XnhF=6zUI_pH3Eb(%}Gp`0l6o+YJb zpBD)im&3xjZ>;oH;4@fXMJ*~_+=@PZb=Hfsp4cGR|u8N6QMZ5vlX2fi^pt6SjH z)slZ<#seOj=0MR{d7eV0B)`iPw))!-&@f}#$L&6Kr?0^iqe-o3eLGS@(qMINbcq5m zZIs8Fjb_hBTlE!h{7!Rx>Ijo|g)_~7;5B!X8;!fFao27B$*ObJW3*aS=S;}EmI9v4o-)H$lj zO|4NXRkcNLssJ)>Fn&?C_Tzn?0`sc!$6~L`jLqJPYk&*^yvSLwKGyb#T*uZdwxUPb z)@AVl;brvZ;{}D~-0j78WwMy+i3-|(*_dO9;4Wlua~`0t85X49WPSds}UQBOzp^~y!GA!a7K5EOrE`gC@KZbt zw^X`pvm2eIMjeeNd*#v0DbORS`>3}Y=9MpO_AHvkUxVda)Z@}k6>{nmdPF`|$LE|i z!Ugfpba;bGMb_9TRUREHdr|!=I5<=$sQ*RToAkD~eb<3s#c++Q;wF;-j)BU!1~sTz zp$10cRE#9HVLL#oMx-c;jl@QML#l5`b!;T6VGqBvO`cxaM*i;@vMaO&g7KAH%ax->QA&DAKg*jn(2_ z39}c$RmB*~voGObEdGnm_%4GOmJ7619@#0L3F>Y?qX42_gG4_bp<#7ZeSCy35-&~; zkqy0mMC-CU>M;mgpvz%N8c>AlZB*J|xM|HrY2p>}O|BU47HR(Ni;lO&;zHLpY)3?| zmikzcE6UdmRaHFs3Aj$b0EiR9xY5Ybq?g3G2H&-OOuGk3^#3LCK?`CTXjv!6`mkTa?8h4o{y>^w z%DJ-T+@D^=F##S^*d-i`bP^#%)`z~v6tqn#r_ z&^5_q|J&RA%_$BWS+V#hV*mhPT7B9${~$}kKLTTMg{ZxG_8;Dfxed#i)Q`!*qLGKu zbE-y&jau2oRv&=U2|EO8z7YbyI9Y+KCcfW35Z0Xf1AC zewvKqjoAhHWbyFJhpo(KofR97-r$IgL@+w*D^X5;_u6{gD_g+OKY{EOD2Qh4>tOa+ zd_-A=pN>3$>WINrAKV@*reedir)r8;_`2Tn2xB?gjW6z1H8jtrUKY+|h9qu9gX7Z- znat&Eyh#WlDSgK-5%`F!3RG=vqjMKp6iwfCgc`cMc(hNHqy_l1d7OF2-^y*g1}F%i zjj|#8(DT*^tz<{FjHH~_HW3@VL-B90{YFnXCJ8WIrh!3PpjP3!0EYEuOtLX6uQ(SR z70+TF{fOf?tR01O*kZsoTMt!;k>FQtm~KQXonSJIifhrzJ5O8{2W$hNJU)y^2Zl@#6#QhqWQSy0m~pxP z4KzsEdXo_7YJk27K>b=`0dD?rcJcvOMxaQqDGX)3_4@fQw}i>kA0iDp@fEm%@d*4e>Iumfpu)JO2g^*9 zQBM$YOLm)i0WU15c@p5#I2TGj+YCxA``_b zq<(;Yo@}PF>$jWnX2XPTPqK1gP_0hM%yd9x0cY|YL%_70 zjGrIx+aK>oVk*!ly!WWB4b^Yw3e;o;Pa>p2{|@Iw4!yX0Wbv77ywtBjUsY^$^VGj$ zn=q?F#(Y}2qvEZFiIp-4F2uTNi(=3#$Cb-3Z_%)Z*;fXIxOlceZbK#wc?d)B*R_!W z?WkNRoLaG!UO#@ZJJ&q*=|Tk=a5J4}?B_<=pLSHC!-tP*j4i_PW^jCtO!3-FxLUM) zWoC;lGEu9CV*nH}wM0dS%1AUEa))}`@<$p3(&`&ijY(J>IX>75{S>RJDp?I4Tyy=t zyoBSk^Ga8RUttM~+E6?j@Iy*gKnx1eIk*!tA)7{Jk)s5gwcphIjY`Dnp-2f7RAJxC za!PqUL|72ti71At^SaE#oQ+1^aDaM4w7Huu$1(!1(k{yPB+8 zT*#@62s=8%RH9>*5DK?`FcJEqKT6SVEJ5(VewV$#td1{s6e+SX_bPp+$#*n~iyO*6 zFiHehmHl3v%6Ps>FHQLel*0Y|6*vRbs9Io;FKk37r+gP`(WITPZ!T8GfgI1>Y23T= z?-G)jxU?u`eQUhDe+ctX9>)E9O@Qu`FP7xW7%g3%`rM#Yq1J_FZ&#sX$F@M-9M;G6 zd>SbUM56Qh{Vky3w0{ygy^K#+f!`=k#4XBRqJ>YU|}&~#W#{m+B(u}h7V^}qjS6% zdckgZphXb=uG^?zA}-{p3ze|E7qqjB%j(h!Rb6h>d=$(AkG@q8ZieCss`5u-Wz?53 zw-LqIjcc@@51+i|ps`WNuMeNY-ez<-gVzahh_W5VO@PIM&H+Sx2QU6D%la;V(f4Ee zAGK(g5OOQ$7Q$wO7f)ZA;T=4>nlAHg{)&vyEmBwM=Cr3W+_xMh| zwhm0ave<9SEtrO03ri_pxe8zMX+spg_1Uoa4W>t70RXG9K-4USee5S)GRO*tuO$d` zIVMb?_9eo68Y1JOd_=m%RifgmFP~g&zawy}c>%U*h?j91pQ>vhXw4@!&c*M&PlO^3k=1i@Q`bd>+??KpHD1 zFEL6*7f-wlHWBhOVgzYt&EnDa7#x)=fqPMg9gDiwp>wdimx+hLKBftn}YTJD)1BL;T&(CUri z>x#>Sge5jtq8+E?4H#amc@6uW9aW8ts&|~=P@#~!4mE_G+n8Jk+7IUl9&vlX#DL#o z6kLKkA?%l!5S6ezESPT400Wp`||Hap(_7S>x51Trj{0m#h|F|wg)q)1?@;| z51b0?;UtHEbK75$|Du0d+>>(_K&tHT42A;$7YLL*o5Z~wTCf@bFZ$vVo~1F9NM51s zE1)8;Zv=11Rf{Wb`|k0Q3V7-A3mo{;HVa>xV0uLZ3^Om?w@~g%!yLM-BoD+j*Yap< z?!d6b(~kc-NJQ&Sh&o$_jQ7H%PKO4K|3GC z8D*7J3eC?HQ#TCMs#anZs)es?ZCE>#0;h-#Qt6Z3#lbUrFrG?C3>U|&VWJAOe~ZM1 zqH0*-St!9B%iX$8@LhJz5?imk60~*czFXWwb*v-=s^7lDnrHQ!W{Kf*Q0uY%9XHTW znpyoKtam%(I0LmS?7APfim>5VyHUP{D<5{fsRwZRrH58;@!Km|)QU|PI;rr`w?=+M z7S#mx>TmGAX`1WIR=6=D&K_Ssxi%6ZiDb2XpN;Hdqaszj#L;loitfZgF8C%HtbxNR zFp)C;3eTc)kY;R^6Z;TS5qRY4Mp8#Amq`f=u8ziu->S04NL?Fj-+VfxIQvt<{I3%T8l0|&nKq_?l!N>^B?yT|&w=>e;^sdgmGM<+LQhY2f_<`;lNF3d*#(+l zeY%zT@{1uX9|S!`dhKn7d)v|Yh(r{mZ28jP<&hLPF%?Y(_{{D#rL5GS(gbV%A!rcf zGJq3B>XBj(oq@_1!UoWP&K&aH-;|lgd7znKat3M20wE7od&|LI;kV=^QtonfA?nZW z8`p&c*9MhcMR|<*-A~2Tpxb-?CjK(hiR0)^7GuHIOAsM(B33Wj8N$0?t60PD$?Z=daX$Y-mlE`j<#q8rjF9Hxf<#~N zSQMMLQrlDpM1PQ5CN4#Brw19jLFCcnMwM#BiBht;bmE4NLN89dvp12kfBzF~2MS;CG4H!B+j{7y>PjdMx47Jft}4@wxmV zdRAnC#6GZKwX20LJdmG1XmTl4!_XY|VQ{wc`D?p{%M*F^W2AQVhbT3#in}d$o?g@K z=QdFtiZ-2O5SumEf$>py(J4ZTTU)lcN&bCW4c=Gc{#{V11~nNRWzHCz@G`K-!*h^- zxC)sys4MLxM2qSuaKcJZu_D#L!>?de%Y88*3~C5nWg3vuzWxearAQxdsC z>@w@>!NExxo zLHt@KHk};r=@T5*8wZdTs1WdyHN=tj`A;e~UDJgsMF(1S!wfbcl|pGe?aecR!lhq% zMB5mg(!ORp43LE?iEbY-$_$R9Y9n$idf3a#mBp{55Lo8Q+7LAcT8F8`oo8%zWot;( zPmo9K>#l4>juGT{V;Sq^R=k@r9;F;qJxML?U=(HZm!Q^W@j`8vGC9ef+L^Kz^$jHY z5H~6D#bUNf&yxfMYCI3XIEaF)hM95#uBnuFu7;RsI52f5INPoVKz6IR-*TqNJxf?E zw)FlCp0ml=XV*l;HPB(RX;13=cDrnok3Yt9Y1%R z7Ycch;R7|Dy{C_14c|JuTZ%CqeK%wW$LI0tyL>Xt-Sd-ndun;&7syONGVg36?jits zPW1`@p1lRrI|(Sfjg>Wtht&nCR5!4=6E@bXBbTvWp;O!=;J)4Be)g1zv+X0<4jR*0% zCr-lwms8r?dd|SkdlR{Bw6x7NH#xmPXjzjb0SCtPG3VoOe1v(~+OR55aSg2Yrpun5tw+{-PaYf3}gwx!T^^+ zxV96n3`ofd=CdaZg*9Wyx)R5rG2&st&R$TIO=^Z8+&MtCaV|SQC+6}w%JF9_@?S!~lw)nSH|_w0=&4ttrwDy;`twi2A@@H`o}4 zC;N-tf-K9Rv_gvM-!-HbdAV@dj?R=V{RZ8(S5BAtNdhMUFGQb7A?ebdAn`iBU=zR( zz%EjGN-*shKY*6Q?))xquI<{UXeWaA=JdarKo4%V7utesO`P+3pryy4Q{rtSwIpF@dr7kB zr)O1FAb9Mgh1*enYzf0}fD;PV-ogo%did~U=e4FfwHMANV$pm;z7EOEQnHfu^V(FV zXeYVISiR7ziR@Dr7f{Mm!{`!UH*sz)%ya?zsjr2bt+0#GK03V*Yb7!1@K@zdbdP*$ ziAMF&Hj$>55Pr2rxB}IInOOx5$NnogTvkqzNzikdArj6(%lg`YBsH9t4Cjve5+edp zS+p?*HHW6+ZKJ;Lflb$Y@}!RXJBymaAt)Glpul{w$f|?DkI_VsfnOEY;FDX>t$`bs zRc7pSxpvRj&*I35f6FUJ*_Xwml6xs^*~?1-y;s~*vwyC!&mq9eitDoT`g|kUTMf#$ zR-aVeB5PZDzk$#;OF4VJr6ld})fA4-H!&|vAiH_Nm^228+3axxX$HxT81{f^+kfBR zD)48@Ar0`5Sk(NOe5H%yEwD?dl8Y`a0Khc`bf<(4cZ-XwuuSn&NMvdf5@Ok5^O&Kl zoRVQ_-P4JM|P}Ti&N0rGS+QN4;Ul7An1-6=;RZ}#aOqu` zx2bfz%-$&Hyn~j?iGcJbtR0E>WSygzt24K}L}r8QfjqueW|vddIk$+ibr7tD)nV^Y zw=Zggkwkp`6&DVVg5D7*s5%?;7>Qf;jY_Z;TZdxApuQwaanKE$@Ku7sMm*~in26Sm zovwmsvM8_YwCNJ-89hR)JghI!zzUku7n_&z?D%~473Y_@8TvXr)kBzwMRs3|4D(|M z1c0Zw1zA|86%Vu$s{PLvS!-2vk)NlF@F;X1pXesKAPX{}R$AFf!7I$y{g_FJO%}6f z)*ORM7Dr932>x>U%a<1CGff>s3I_$a$<-nQZ%Vda^tk@%x|DD()GigB+@ZdhNlQpb zF2{;y9X}mc1>As%Bj4GBE;*>muLyzP6C0aeWBgb&Zb@(lBlEC>IJC8r9-RUiV-h}j032Fj;}F0k5}Q~&c5XY5Whkx$9u4xspE$C6CUTZ zDYFH#hMhxe33~53#`v+xZq#Z zD_{y++we}2cC?^_C*0Z!+66|q2onwl5<`8u!qCU$9V1*a#sRayDojIL9kjq50H!nf zm>Rlt*vKhH)_R8(Nq8I>0Tv6&yTCH-HcdZK>khbPzQkyeQ$T`tq=@Bk+--)JnGihd z8EVPl&Q*cY)T18n!s5VGJDu>Z!UJxfO{Civrs%t1PYOV#*oAdC%TP2@S_6df7P*^HG$)B=#A>|Wq!Wqx>sk*_SLS)Q}-ApL<&fjuaYB2l8iSn-)u=Qj{rbT_V8E zos?bs){plQ`ipz$Zo`&pSbD@?r6zwIv2TiC+PjOJT=xDLixY+JlYitvHq*5Q66&Cz zjaSY=#CiT8F_w`As4L1>!sFA3__x+vJQpDO@17*Q<6eP!(RLKwU0g}OwBopd)qRklu<0r z%+#o;WgVXbT%ZJK%5h(idBJj$AsXqrs^=DK>K2_pU{cBl0PQP?Io;Q!W(?}1(NRAd z8F0p^eyEz|Ql6|l;09iLD0wM|Btw7QPm9}!@O%@gsHFCiW!JD(05 z8Rbvn!4OgZFYPGIYsu%qUkTBS_HUH4A;}=g)MSR%OTlEs4=0h-Ksm*fT{|(1^J6eX z96SG{*k{i-v8Gg3hvVc7ovaO& zJSGi5hDqr=N{opY!K4{Zu3;XTkYU~c^iIALDU@QJzY?NBQ#F-#j?f3(9nu0qn!I#t z7^j(~F0mP0N*_%2_evDon4vYWd+Jj?_{um>u%uQcj$BS=hnzk{Q{u(KKt_OHhgB_% zNDT1>Zb=`BgdO7YB?2rG=*e0-$p+;H!(J60DXQsjd>iGn&W^k*AYLVp;$+D)y=(%N+`1&?QMfk^`nw*mtgel+ zh&<*=BB#}x0oSt96}D8X{6G9Z|J&dE=f9?cteox&P1ZK7tG%H1mc|g8YpzZGFzN)% z^?urqTxklDS%;J9!0<>sio>rI7baf3I@d<$3Xd^y2qC}a`-wFXZEJOTW6EF}3ygem z^BHX}{gp&#%2z!7%xdlnz!GW@yAo2^t)Li$JA4V>t1PmkPO1#qLG6b4G0k`%!PcvL z54)ycB%Ip-14k=pncXOx(<;&Kp)Ag`8n!gQn@JT^nS=(IR^vkBQ$=z z7!qltEUPo*YJ-q|HM)BGmPW09#`++H%%f&*t`rb#O@ba}gOBkV?s+^-WOBQpq>pls@%bB!N~RsGJSl*st&$Z_ za-Rg?Fhoc{l*yCkTM{{GisjVqhvklb-oh*mFOYj^^@7a_zUULka=b4KoDk2;yqDZb zn7=T#tM9mv7&LPqY1877GWDUu*k2rp!0EOZv1jqe4#3*ouW#`N7U!=xeAb%bdXsK8 znIXd+IEti$QLY~cTh15N?FYM8xGO=yW8#0N^2Pt0*^xir8|y!bF{z$f8^bb=7-(O$ z07fSAu!Hqq+(Q_;Q{V+{sG&dn#K&60mVNsAk^Saul%veqed#4nZM-Anw@cocvbBD$>ju zfqrD04{G9OoHDn>ehJHwWF`tEd{C@YYF}&TEYm6`FE@CJ2YpU4y9vpi;j?{Tt{ER5 z1(P!ZSBbif2N#wqbBI)( z+&%}56HkeyL2J$!Z8Y7>wIq)dTq+Etx05D>H%h~!8V;1w4AwFuHvf`H3L*i&;~q>_ za&XY_P`Jo-Y2hidM^=%pS{>jcp-;_G|R> zO_#%R_A3Dh==P-4jocd>X5c@p3_WJqJBdsrBVBX66^+CpT`_LewQ87cv*(IkYJVh$ zoVIov3nX^S=v7>8)kx7YTB293|7J$FF^f)Gz=qKtUG3o&y)$Nx2)zcmgEGpbKj7$> zv{>L6(d_K(4*i{^DF)Q}gXkY}!p!*-F||>$Qg3%arDjN$Cc^BD8IAs z6S}&KJMExqU`PytjtGgGtbvaT$WD?4Try%-3P{TM%D&ja#SYH?c&ff}=LwIjebPz= zJM(i!2oR(=ln#J#I+-I3oZM{lbkx%nq!l{sMc`oN6(wyaBM2wk%$(!Ah&vs0*IpDf zU@S31i%!*RO@!8ugWU&QO)a>$wp>HD`mZl!Wn&HG-@<&`(>nNBwy%h*`c#U~FMR+e z{-uXOVn?ae-q&5H#aL2C;WSd&_b+yzZU=hcw2?Wy+=|G0Vr4J%AQQ6Xmf0%Fr7&?U z$))m)Tqoq>G?wAibZ|hx6M+V$sf!y8^`~Mx_h5u_+%0%f$uFYka`-BT@tPgv;%7K! zKGvkLq;A)C)e@$HRCm28QyBK!nGHd`|RY4*J}{G zQ9>+QXY0gCaeO@oRjE%AH>S$h)?Vzw_mB`juD%6@HN%9;y_Ea%JG|c@-&|Z)e@h9+kjTjk ztax(6^igXbf>KOyQJ9~f^1d8L5>Ntwf4*D8x(qoz2j4196dU{AeC(TM+W-8yYt4JD z+68_WHP?Zf)b7(L1*f%45{~2ZXv2t&H0nLXK~|HXxoXKw`3Z40MpY|;YDbjiT|M=E z>SICUf@*e%o2H6^MZXAcKIqiK{kDgYBm=0mL0^=%1>2j_4k5Kch9Desc+1NJYaZ^I zbhwb=^zq}k%742sYEKb5wZ$DVuzTUkjgKgipBq~``q$6PF#-d8J#`mv7<#3E&Krqt z7W+fWPk7Bs19Tr}h*vdcCEl~*CiJ=Had$+u$e);30g?hBagY7w2oF{3hfE3KNfW_7 z7n}1d=&~|`Fy&5i&uVLkea6FZ^suJ$5cJ9#L>!w-pR0v?Q!xOG#~t}PRl$hPz_Bo& zfTZQ}#P!@DHsOEqq#Al)Msla&Yw=^W8SY+Mu0XSoO3F5s&o2&MY%R$lkew^$C(HJc za5s;9zN#BqBW8*SD4o(@GKUg#ebb=x=8>nE3+)(p-R4vsdt(!fVJc7S#D$?1qw(Y% zfjy(qrpiz44peuZ*jD98eYinAAmu%*8ugQyfBnqI=!!;Hn{TdJenK~rmiRuD{WBU| zAZ1&*urDeWUdgA*p9@^AE+9i%E*y|lZVOt*1BFCx1ch`2)7dw8TB$&S*l=QtiTMD^?n#`~0M1(nUk zsus(-*NaRBC2Kd`io~pdnZL3bj~;@4F_7ltf;;wtwkd59uBjDY(L$+*Hyn+@5x z@_ZWYUMGyPmCc}h=~>WGdLtO0Bd;AE9DnXFEFPDG_x&Hv^?+)iRT%UlOUVb9Z?xd9 zc^YmUkpMxVOx_LRwV>HPzFgwXSvYC#s&KOI2B|bd#36F~Nhs-vURVO=(dp%cX06 zXh*z`VL}|t?gXWH2E%{%G-|EO^yyGcSP?L|p+hdy z1&j31Q2AjwV^AOnj*jA%M1s0XH8TKTTfDzRNZZJ-d<;v-h&n^z@87z&W!4_iDnt;g zI=re~G6o-)j0RSqxc}WXBQuq=>FUV0Vfn@y#y57&aV;8=g;vw8-=x)TyU61@wh&Hr zlI~JMwNH<;Nwd{3Iv)zE3Bv4n6D$1RVvs~HrkXw!&Wk00`t+UAGwdoK~SEv;OxgW=x#0Y?^@UOgJG=T z2xAB+eaTWg*bJm*c@@2M2qc`J@Nz~Lf|A2&FJ*m|=^3sLKo#nngbe82?m$L4f4|sQ zl+tJiW81S(#IhZlYe#PH)M&In=Bv?k9}vv)W4t?yizjJn-zfVMytQ!7pD0h>xMqI& zEU1@);yxUEk^`uasYau+QFE|{1EoNocY^%*F%=G?eiWMKI zqItuUXM~w+V9Ynx%x;vgjvZG>BA9~{`09?? z3LT}a$5%y^2AG{B`Ml~FI?k^N9Zht$18%^r4fcTHE1Fae3bkmm?T>Ep%NChaZz!x& z>q|U=1aqH4WQb{GjhJ4?ktRpg02^T(Vv%6`&NB2%Z<+RiTnbEEwfiMLzxQS^Ia8^| z2EeAJnPIH#yO_H$S5`?7faD2-VCLxCMNL2kz&nT~*cZa4WFJ>to*Z>%8UU20m3wHM~tQKh=equR5 z#b{X97^7k&Hm}*R3AslZ20ZufT|&;*+7dJHLk9y5>^mDc55 z#2UI>up3*T*ap=Uq<)XV8agZy`4-GNtR0wG3_GpAGh4)@;}^w0gqZJZxZ41+cxOll z?AxXbIfb=a1-4yMe81n}A?s5=o6$v2{w$VqA=gr=iuCvmn{EqG(Oe7stcKbAKl1&9(FiUp;B5t1lI#drM4xGQ#) z1p{@vtJW_J(&(PW47#YW^@sVz{#c{;t)Q$uT;&ED0H0>S-iTi~-PU8NuqYH5!1x9o z3j-SO@sk2g)k8HJkQ9@%9UyG?p63_mW8?@jWEob!j{<29b%$r1jKhm8z^L*k{_$QD z2Zj7@eHyPGAw{J)TT;G$Izm#`y(9pGr?Xl!T&Wng)puxdyo-Bq0QG~;y8-g#&w)ea zC!*2Zfe?{V%>tr1EWY;8DeYi z)PrLvRL0w`7eof{;2BV53777)LaHL#HiTEVp%Q4Bg*}3J)+Y%P9PmnF3=eA<6ULBGh1Y!HR8ru6&}#l!19CVouG4)ekIK+;M@O^&hD#w1>mgW zMLUY0zgbxfdy6e4!6*-vJSz7wLUwzxePkO5nu{q2rV|7YJ!Q$y+o)097u_wOJ7d>yyYqcErk>e9wpbUy-NyWa-Jm zW<5PDC8dNDC;`1e$bpTNkktm2Zz{JVe)+|{1d-(bv;IQmvgOIdCsbnVXW<0*~{&3m(~< zy+G`q{9_kQQ6`hXPLa(uGLxcdBw2E#7tD@czW8{Hi(Bo46Ew2-0a#wCDKF30lAys_-?=^>s(!6mlC*J?74l z9RG1IYX=@5eR9P50HFb&6T=WQLgj8@vK*B($CmkNTpLQMEW2@M2tgkpwvQnPcd<=T zCpZ>^f_xEmv;0`gR#(C0{qol#EskRFm7Y>c#icuh9d09~pHr?YF}mv61lMr-tS3N| zwbAw~dOMzGQKN3mbZdw57w#O$A7(Fgd*OZ_EHjzB88{Vua7=1@q=e_i9qZ+AvHwO@ zDcImt-5S~}D!gJ@Hx}I7IRHL>#wqI{um`1jDq(ExKqDiIB4p91FILsJ%WwnL_Jtitqw;0-j}kD?FRXV*Gdq7y`tt?N{E0 zIK%!<*jH%*;8mY#Y`pvH*VVD$M(12haANmR>jGMmUkxSzTcIj{k`1n>B?TjaCXRR6bSS{X^FgK{*hi|w^&=CxaY-$G0 z>|Q|;@Ji$&!O&R&ZkgUs>PMZEDZkz?gvC9T{m91MN4`SK$o4MvJlC|pq;L0=tEKh* z($NZLsx$l$Z(QRvzYJLnh@5^cFnoLp1^cT1SBYB+kJis1Wx~cV1{6w6fmEH+F~QQD zUxw#Jc~}Sw06FbcxiIx#FSSH?rSSr$z)h10i?Zd@7Fz*XffTh@dL#aHm}=RJnIM+E z{M0eUjI!f$+q3P${|fFajLLBrUb-$9{c2h{d&y8BVLU2BlXe z9K;Y7&cKgI(N%_D#RDj-$$Z{#EQkDvpD;d}tBMCh(~X$TnG2EEH3qq3bA`dOMwkV| zWO?fS?vSs?#S<3Yg7HW~17DVnyKj2I0Y%7kAD0*X3H-b5yD+n>^x}{DN=du?%S`K| zjQDsN*P3Yv4}Ni0)Wdzm3x;pw@M#D+f;HBxT~=sIS@Bld(Me1Gxa0j_S|VlTo>+s`(mvQp8$y!)rEI(9?NNK&4Yoj;RkZh^6PPDhCFYsMy+JS zE_T|!Z~$9Cq`xU%;-^ROc}O7TSn37VSY}=XEQhFvH^dGq9d)Cpp=K0zumTDLtF$wT6m^XO;;^Q-jqO&3)GD`po;SKJmOy0;?sA;++?u~ zSTT`jDZbe#IfSsW%{`Xj6B-&{1g`86P9IdU%G^_5$=;q% zC2YY?QT&NZY8Qa9NzXW{DnpHJ*b?S=b|U($GF0$ z^X-ginsl8bLHQiK1!(*^z~P(8BUye>^(#k34z53DFY?y6X%rsjlML_(j)#{S=A`~F zwrbV__4$4~9GuuMe_yIh+qDm}zUw-0H&jiKVYN%D7Mmj1GD?=GG6DTOl98QP_$yCM zVvo{tNMWUeHYe+B&&zp00H?>Fkq*>@*A+a$NJa4s+wWkPNO&`-LWZh+lyxns(=n_#WzIOtsHUQN9h)fRJI7>bT@^i*} zHsE7^fYh;A_Sbbtwy$3=hT7FLd}YVi7s67uZHMK1D}o)H;MuRAw50STQ2~@&U0f)o zeD;VeUPgFG;wvXK%3mib5Ez^D*SujCl*D}v8Vq*wII735Yzg=Rg&?i8bpnvPV|}*R z$t3h&*0!2i>|Dv=BrZ31dpOvSGtXi6F{l$~{*Khy_!=3~@qt}grNVtT1xe5R2T;tU zn#cPFIH}~jk5{1<*SSdGW?lt)fN4;_O7^_5DUNbEL>OF=%YX*22toIC{m7 zt|cn1c3SOUqh+1|c_ldX$29rKk!9b`2EAhj0WdYy+qg7>cYOtZM;{X5X3rlM*U(>) zf8bPd#9@nJKB&Azr*P!H9N*@caZwn{*qsWVtux~gl@1rvxzQGO%_mX#>uD%43iDk? z!D4i$q>2gG+Q^@4TTqytL|J73^;%MjOVnS?xZ>fDH)dj+o-abK35Vci-ww2@OW_fhSJBnvV|>SyyXn6veVUCx^8wl1ZaOWY3TfRpstPDFd=oU``k1z}_0H{B zbfH|L?xkDVe}(;(>95cg;} z!%~?hHzSLavv{O+r>g-vup}UcgEw4Utj3C=&h#x9)bIqBgbOBMz1wR72&>3yl(mhWlpEnr7gUmra_(2O3_uQ@ zWhpnOsi;8|&K)@uyU7KprAyMSXuKWV9(hz6@7@f7djQXEt9!fZKLccvekT1BR7P+h zj%(uMg33L1@+HKwg87-r_Bk|!dN-T?S5S@Zj;vu|_(}wJ)Y+G_+nQ6@X`&%|+Dzbd z(|PjK_VcOnlVhgEY12pBJ5<`lBYJ|r24T!t0f6i%&JCEaLUfV#CjInloFh%Ze>!C% ztVJ#8SRd&gk~=sq6Jl_H8SNQ|rwW^1BkEf70_$v0XElOHm$Ala{XmbdL?19%dj=82 z@ip6EkR)2x5ip35v*rf1mw7*t(-9tKQb1_GdeSqn=YX3LsRxrYSUq%o{-$q8hJtZH4+0{yW?Pgd7R&z95~a!6jBHd1||~n z!y;E#EP800XNEJXWZKcnZUYZOp&M*dG~mA&-_^~eRVLt|q1J?2$C0P)&_gxs?)>nSswgZER5Lcz@n+PX zvLV@^NSznP0@Rl=v}0jpt6KiIk%ySEKB9AOike(2W5d=f60m?P>zGEBS;YWR1@)Uvbey=b7x2|dGP$YeNFa9 z)PD|}``VmqvNqNw4b0BB0|Zng^icKU`kcm&gnm>*5fQf@?5z^3uBIV1SP3)~yceEd z$;<14#i?_`?;`6nKOvR*$E=|Oa$t(5X`_}H688+#OVj8sXE(!vQ}q!`HBF5|no%4+ z_V@s>6v-8E4!gEqc7V-p<)ks6F_q?AWIOUF*OWho*ftI&EHQOp|2fe2PupW>WW9Hu$PV**aRW_-Lsu}p$10{_K7{{3J5t-}TU zumAP`{o8-{H~;tl@z?+TpZ?u{`MZDrpa1wTStGXOR^>d*V(1_SrvC^=+wu>li`0E? zq!s==hZ*@;m(;Wol|T$h1DjY8I8c?DHw8TON7#y7gDtAt?(YvS?`Q7OKCh)NA&E`nOwe^T2tz*`gd zn!#w73FE)`S6DKC`9G>khqAP}&4^r(V`#ph!m{5+0a`H*RMUV(=R6Q(>K~PeWAZ0;hgx!!3zuY|Q#J4o*3C#rEdebsO*K96Nws4=8)74CJmIP+eS0G1uf9RP^ed1{qk5FAwQ-UT=DUm(kaZkw0e#rDMEO?)I!D%0`9FpR4l9i* z(v|~R<-z{8bS%nK!*V4>|y;d`u3))19Du9_|5f$k)HbttgJ{ zKyDGK%I;A9H}UuNaPaVDuS3WhmUU?8`k>XuTgnQoEoR8r^MZO_-A2gq zM4Kb?0FwY)amlq}Affp=Ko+Ab%E4Iz=ZC$%-%`DY3V>{Km}>2vz&_7R;0xw#Ko3SY zBwh+9_Xa(C%7)Eik~ppvy+F=qieTwmjYD0(#_j8HEr3W`B0EQ<@y@to4_f*9T6FphdCSp#aK0(eoIweRDTzWtXdX^O8-*jM>3ny)vXIBaWkA z+6%nC_BUgws76>7o@{Mz#u2WyFS7p)yqEKFO)Z2DQwA7 zrmR8$=@4dgCS;F%wU8%SmYx1==~ECa0*LVt+O z-|U>?Q^+E3JZjB9FS^pV7`xq{L3wV%n`Pa+FEofS#lH%hekXg=a`P&Gt2f=g*fc)k-sGlbE z-*o#WvXhl|w1O!0;@(0nSN0Tl5!ZR|;A0ziKv-1HfMa%cCegWp-q@yGAt+r3S6aGJ zA~6e_DOT}*8LVA_zocJGpkt0jAgJtvANshIei2RBa-3eCrC)@#6h}?0lOh^|wYNpK zfZay{-PJ4k)4a>G4?qmhyL*A7_27CjUX5#zypj=%M$d3KTN&tZS4woSu~l_z&Fb{r=T4Sr_{W(ekr9EAT@;-&*SDIJ_TiPB^eEmCH~UnK^#lu_ zeZ=4HLkMoE6a(4tIqYphF}k%)$Jh{}`%mI-Mi*5OnMl+|ivK3??9{R~f~1{I)IjQ* z-Q6D$(jq_cG43sPUxSy8bj2O(=a-Ku&G}hSA!j@uHo9y_S+(S1(|`~y^W;TA=BsO< zB&v7JRp|Q7LC*O8U@=?e0fk!TEIHpWQKJ^k6(#T%Sv5|&9Y517Osce%N>vq!DPa2= za1x^{64rY)F8B_bSY$mZ$xATzE`ujelL9G5ieeR)^wV09x(X^d_!yOBZrS62%7$z> z*(gt0vENqqkyy>~(-9En#XSvEVlM;>-e2y4AS8^5 zCJ~uTB3ZWwqZmL?6P9sr8)b`mF3!y553^Tz2Iw2Yc8VDo6lC)4Cihn3Quouf@DgEjhSY|BaK_Z4FqCYYWYdmSPa^hv~KKQ^l(Ijt{;O(h)5W>ax9Dce}5{tRmZpz`o zZDZVH&ecHW@nsJw&f|J`mA9yM|JLewot$ag);4ABEY4rU>j~AKtzUg-W^H-mj~-vh zi7tBxZ7H25znjQKqNDixV$4{MX>mpNOxe0|5){UsEC2?lRIw7ecDphU!DSk5OyNPX z*GNvu_ea_{@rC04y_WO~MwCyzu!Bsnwd-O&m+Hujx&FfP#Sferrq%95nPq{|H-VPN z_f=D>o`RtW<$L(JWH4Y*WBuxbm!LBXR7eMd#=6kP6iC|1JGqYGJm~||{(hs@*fK$2 z&#cRiE_FJUy8hxG97>~SNLtCEC39`8VntFUd9q?0_9<3KO@jcnJwhX&Fz*fyN5$G{VtETFt@rr|Ymnfz+Bw^|0N;YGlh!3*G@W$Ngk{)h1Ye7s2k^sqU() zNFH{gWIF1Yvm40{ruwFJm@A=}mM@|H6K2<0b;CG|mzRHIuZJ)1!2~RW>0uMsbl4m3 z3M?hzT>%(Vo3>2_u#g$H8zj@*xNuPVC&-D^b(C^t>rM9u|?|K@ee z7WdY^d?sAq(&TsB$uMoQ4^2L!e6J%*%1%LSzdlC=pDuLCNf;@EE+@Hn)f|SiDn;x^)k6G#Nm#$k7eMr{^oR_t@+9K zAUozhL-h8FAOaSnYh){$X>#dsq)+9j)u-lU*((%aV!yr{G@I+xkJ{BbS&G)syYzkE zXmk1kd-I+u-i#`?ti`EB3#AE6f~=9bi{GUYu^@5Y0Bj#|uAwQL0eDwjDk2dEFE?d>6Q_)801Kda$T~OS zP2x4j-4p!8WW|TY>3v7onE`4EXm!M@L_;|8Yo||L>w0DpE@t_o#)KhGdwuq>fH)kt@o!zEJtyA*8m@UoTxFPiO6URl}#HUe||P zH=RIm1EPMvBIoRxhHjS#~ z57-oG2P32=TWePFZB@eTYjn6IH|MozyqLV1bN-ftn$nn|$A8e$1ZCsP71(UY5Bq)! z-kxeg>1AhCNPMe;v0Xnalhz}bust|SZk{5~*z!|9r?6IQO&bi63>v>h%N&W~v_LrV zr~oIf*-Ml-NK#j?#CN5oYmzd~h6vJ>7^2KB?p!8%qY2`Lqk7aj;0&7FtE|v98T=PQ zfjDk#8INDIgLmr?TiLl7aitVh3-k_BG>H$^_nT|s7j+DEPbatcp*rD=DS^hQ-GKMn zRlV@+N3HOnMfO)^J9mvFmD7M#e_4|$6t=h1UoPcu38u)===n+c@L=>`y%m1`0iQ-8LL7W zZaA6IG@}jpTdf;pk31o>;@>s#AVXII(>ePkPSQeY##Wkq$zll`9i9}+j{w?F< z;n!ugGzNgdYe%x&ce+ZrblPVN2=kZ^n^w|qaY51{(i~fowNItdRd?FY-SmP|2tlQ6 znW2GZgdNA3>`I*JlPj@8iIS20qgQ4E*EbF0;GQ3N3VHB_BRNBI`LKK)zMr9Ux4IG5&UtjxM9IwHH^cQj z(l^bg#Z8{4FwD`kDd$VvyVPYLEkz{g!UgOHuEOhM#W;yxXQaOtfA(02eJROHqYo=~peZo(3)Mty`mn`c=l4r;;dk{pLtr&$2(ySl&!xwA9{%)yN+C)r0XN zkTd@ptxux$V$@!z%Oyb#NG+WC(B69+Sfi8FGA3N)9z=0GpzPbP;DV2r=;?K|d_iu! zI6h=$0c$S%2IF;?a{=!!8ld8x%vAAHqHNDQ#{OGPZL2EqHjo8QmOUEh*`6RF2eQoX zUPR-8vkBg3AR1;8uwzYkh6HneydQ_%djjQT@A(P{R=m!pA+xh7-n1oi*)V)E1#*;Z zDsJvdh>iT_ytT+>Egz*`9e)&n1r_#l{KO-3JySdtz%43U4AubeM2pot@G%a1T?-8dcgDrpp=*4AR{l($VQ^XoLR5XzGb=e_5`SoYxUhg{I8 z%yH%Da27tCBR*`LAlFeo{_=JC?#EpUw`qh{^~EW3+6BKr@5B{z)Z?lASm^|$l$`rnXj6dj?5V6x5j?q z>9xiokO&W{=uNP(3|;ok$R_0LonxQh^DS@`TL*WQ2B=A#4*)wlf7x?@D-^dDnHBW2 zD2Fbf8JP`D>q8YxJraoExFBT1<@BCR2W7gwxZ99zh>|tLWs)ZF#A(yd;1RgOWtxfw z^PiLw*gn7f2usd}R@dWsevvt~I@$6%m#9F($h74TD%o&-{xLj`+Ru#Ql&W0e%x@iu zKnRbc+oaq<8KePg`-{7M_-D$PhGfldZLw3=#Qp#re_TnHo;0 zx`tnv6{Ay>3!>{2a=C|tlc0MVlp75HP07M_uO#_Pc zQ2LhJY>v`(K|8wivGix0ql<)+c%g`@<{2da5+At4v*mZLlN|hZDJ)w(C=j>E>PB4! zT=%RQS!qnuGB_yKBrak`cFLUJ$GAetti{1#aq#TnARq5nATpdji1F4#qaSQnlx1+8 zXDqu5eib*4t0#KT8M-ooTvn_|VGDM8f~uDM*CGh5)rO@m=u@ncuL@wTtzf61*eR%o z!?aM?#dH~z$ngC(cs#)QKkE4JetxOh&EFu~O5N;!31QUDia8w)>23us*Mj&{8xI+E zK1NWA_S_w4@OVe{6nq_}?P#OQnzG9toPJAG3_zwBDn({MZuLj#E)JxPc5phPkunTy z=P3<$HRD2w(eW`Cezblo_rl-zi%6AS4b9>KmcV-y`+C+MA;;O>Su)Q5`cM9_ahCVZ zIREQENg3zxvJ;-{b430iW|Zd`5;*h7c1_>PqqGX8(=Z~O%D(gpUH9>u! z&+I#S!D8H;$a0EKPO0$d^F>CN^o7aFsMS+gSvim&cc3~z6+TB=2DF)G<#GPAo#hv( z<%fzn8~$1G7xCa6_ttnL_AYWPXfS1~hq4}Q*0r?7qb72K9bcFmy_Q{AmZ+^pFf)=f z7YBcE$o&wq9f2Si-pMDF0d=3-b*Ihs@a?LEt1__z`5^uLTW(?Ux%YDbDGrvLLh zxG7cJldj9R4lCYb(UHK;-cy?m;~`=9CJM}+K`Onlt^H!M9YESmdoLW01DmDu^f5id z{;sY`IOfp?|E&Bs(Rs%l_s&ajeJx`azch?#qC1w&ZDUDpe~&JP?6XR8T@C2Z;aAv# zxtk}i43daQ8E&!)!N;L{N60{Qe`qP{cjahVLB%?S-7yF*YE-)RNs4DAHwIltn2*#^ zD=Ti6%SmjagrfCV5a!pq31gl3NzJzWE}X^3k`)e7^UiWW(mhQWVJ%2=Fl8rwOb@~4 zd$NjSq|pdA+ez|uZ&eI-P`{_i|8gnD-$+t6+u_*+3!rwTi{VuMu<({~dRT`mZBU=8 z6AY+Zxetk(N{MZ~eg@SBgDqgO{|MjWV4$*HfSn-kNLZEZPHiD(qL)LbjSl_j`IOoR z>4&u?Cy{_M@U!*TA1rc6%Bi?mTaTu7I^y!(Wt;h@zhg81)Z5HIP1#JWm)$aS7??wG zlg6pAbKv3Pi?Ts7x6?5Qmt{p)Z$TEnbG2B5Z-Ex5dG2F!7LBz#52R!FoFXRX$WM(} zUQ>H!ZMy@o9CwW>2j%j4-UOwHQfSQJzD{>hR(U%BcYzW^v!4=kl0y@(zaNNu<|_(b zKI6LJyJ-5JHZ3D^nFs7>UQv;a8fLFzRQq7j$}7CIT(;9f?&|5BJPAI(yfjv-aAu`R zYVv4e#_nGk)DZ`H9(Cr&yA>3ovfD(4fYP^}VJSRZd1Ak<%L#sMq5zkc#Faa3lG%Z` zM?Dn;t(sa+3{T38{cNUfmfoxEyaq{UE9+vu3Tv=rj7gv0JQkIMOC6Fo<-D(CKSn!D z%_YRuY@Ku+i6N-=azF@ma*^lnl)#9Z(VeI0_VuTeg+M%O=~Py>^)vjP+!=v7tVF}N zOS9FKiQD7^QEFc%J=20_8hfkur@|cB2px{kaRokya@2v}PF$d!HpaKw3yXDTC=rb9 zv_Y}aJ^rF~14=N3#l)Sf=%F31Ytcgipgu}qW|tRKV257E^=~GX8RsvkHq(0Wb`2Nc z5$!F;xv5|LbSwj48C3WJt~n9g-VfjU;Y;2%%345$6X&5#CZ6bU8rNj2oU+)09szwt zBhOcjRFwF&pONWrg`{vdk`00!^K83dTWYIvDJ z+Td5!5$!Qx`vlD1GM3f%@K}7TxYJJs)@k;u3XEH6h6qAKXHfYe8!A2!)dq_|+m*{! z)jUhzBp>ehtx?b_#uA z8ccMprX0@K$32bj*Q`TxonzA<1Vh0wasw0e5GP)68FX6%5y&zghQ{Q%&MUHGk zb6kCiJQR_xp$ROUdOi~7fz0QWbC5pwk=jy2Zi`6=o$dq`nQ(<3nvkqtT&7TiI#Y1V zPay48?D?3J)o!SCSwNuMm=@Nb<17 z@^9kGQ`^bb19wOLflZHEsW2t;u%Y~drEPha|Mk1iXrzCkOJqUq+hUd&w&Q&V4pIPL z?wJB0Fi53}%6PgqU+vk2t5OH^K%CtHj}lp1NCV-#CHe!Z6|6W5Z|7YF?aMIO%2kz1 z&({H1n|x;T9r2?~wu1u(jafoQB{zJMRgy#y@_#PZ`s0=BIJXy^tb3S)leowMKcJLA zP*Et>l~lMFzjbLyXgSbMy*rQB97|V<4eQgxCB<^T^?}A>Y5lc~%GPT+swxGQ*wL1f zNo_xgpMcr>?!yoi&{j&n1QLNwF^#Dcz>{7Dv#p@~>?=~}vMTmN+Zef;0JdmhV}IQAgYa4e3uWN^f|YC;Z=5WmP6wiXAk(WnJIr(T&f zFF_I7yy4y>jRN7Gat|M)D?81coVYKFDC*(bNSfUTl1!mI-R&BB`jmAq`byqh^`yKg zD4NvjM*328Y-O*4!}VT~rdLNyyTVAn_2YSyFaD;gLI$SLIihwXIUbm5HNcd(NyRnP z;l`JCg4OQhYF~G}M7zUJ$2Mg=g7aK>sG@ITjM}I``1WVU{$D=e)89W(AHf0i;seUZ z6lat#t5CDGxqn8Iruc1>TsU%7(id3^?}2RPu^!}8e~QPO`wYz(a@c3YJcx%of_?t~ z-XfWd^{w=07e~-4!U5`5u&*UTMmg8^wA(0FbWTjtS3P?IW3|csl&%qcmHtX_1+j{_ z)MY1Dx>t!0K_iJgTjvD%&0#6gnN7`>Rt3*BqEU#nxc>cf05}y$^f8rREUAbR^w&U3 zG2KQ1yz>e!^l6i=q+$CUJ8%_*mSL?HtR1F#AdNv$nYy_;gJC`zAINo-P+b>m4}J(v z80tw(fJih{b@o-kGmWrxfO!_T>bVy^?BK56k3Z(Ce#-@;)u=rQ`_L1J`p=jJ{g{^G zp_X7Bm9oj*RuQANIIJhWld?5>RaDH^;}x9sK2r4I<8>NR8^7k|13^C{SHR@50Hs&< z`%0$Ou0NCsx)w9>G1?SIn;SlzODD9SIzQUnKG6mOpro}N)Cte9PuPTsf2jQmk9(K} zg=n(5F?Q_koKg*8?o4jXa)0`7BL#D^*Wqdr z!o;h^C|3l=wTv16auM27hSJI)J4V0LX&nd5;4U6qK(Z%u6kNXtnORWZr00)XeNow= zFRMYN3Ut86iUlspK#XC@DDg#o6YVlb)+?#!T-h)V+1|%wg02+Yc0tx8rXCWT@9do(+d4YnV=1N^CwbH@JSNlDmDEkN&@Vt3zU zQCXcI86#CC zWK^dSHJZF+F~l=f zS}LI#%CGb03tsxJ0?QxCp99#raZ-|}rE?^qVnjZ+y9PMkF7MHTE>@*dCmA<8!CVvo zU)!hMaZN`ZWc8G0&*%&^|KooYzJkjvAq;ssXZ8;41DjJa9Lo&;bLK$&bb9FjoH?{Y z(0ZF9`eL-v z2|I7W`qjU%4x;swbS&{xw3Jkz4zJLyG<2F^`}sviOhqY}->ct$no6h3J}3}(3DIhJ zumHh9E0LqVaTSiwElcJ~9?Z3lZ1 zI^->})N$jGUvb5UJJMF$wp4JDg%BxGp+reKSCi?KpH@r@hD~NPy4MzFr(m4i>VG zh7M!zf}iA_d`?Q5^EQ+()~n33tQ2zguV{Cs_FN-WICk`Yig|(T&ebhkpz8S7Md4G^ ziK2jbxW#)9M#Jgc0CgAEyDr|J*+Ij`41Q4Al(juui;_-RMC(79Nf2p9L(kwW(=tGFzwZ;8kXYO}|I%mAJxkYxOlBJn%(O zfVE`)Mrg!^pnN4sR5~b6a^zETsB6 zjTt9_*8zQ|TE(cS4CBP*FDtM4&4cFL)mQJ0fsS7#pFc*s$sxy5y+*5X?j2S9m0@t9 zd?%y#P<2GSV~t5J_I|x*HY|hP^TEMxl{OcNYX|qR6~Q8>BZ8-r6T32L@{F?O7&uJW!8Swup>@)fsA$UrrS||H8Bqt!REx5WQpIvwRL|& z+gz@Jt*EFclIJTcHg6#suPwHUL3b^hfPfOh)Z57!nCMH7_d*%e1Dv{O+G;+Cc|zLt zJs+%XKpVt4NRU8kXnU)?RoMkuAKSR!$7tzx77(;P;xyvB{X?N{XX8tCM;*WrE5Pw9&nC*1HJ}b5A4s6X$%? zm2a^K!fovUY)Iu0(ulR(L>oHYPI$tnBfooO>sSt@b`@ssk~-!*V*tZqTYgBwnP7yp zImsN@q!x7x6a$2|9_un{@Nl(JORg-|<$wRXzx~HQ`uG3sZ~o}7{{FB3;cxzFx$ysI zzf<`CGhg`svoAm7$v-dlwKrJJpSU3~ z4Rru~b)h4lDQ*a|WRpy|GecfiMaun#q=uM3U16uxa7WV)Vw6!8$3T7<)y|?SDGw{! zS!n9n6cr_xG=~2r%OW<5yjbRkCvoE{K3!AmQ#AhDhlh{RhPM~qMwqT0d4a`u&<0<* zbDigFA`Ct!hVcbi3y!6XJXG3WWA6IPSFF`x|03?)hzIw{np<B}tOq79ficWz~ z#T>Ew8;ZY(ZxysW-dmibHNf{}A<;N}pt6rzAN&J5*%R8kkimDwL>J=Qx0Hf+%{P=r z{V_l3`y^3OD4TX&w4XPatd>{kmGVWti=OR~Hr{L$LiB7m0ttg|*kuoPZBM49Gik^s zo37!hlilfH&ucyfegYxTwauWv%ht+BIjBf^m_V*pkk$5@nCRx1*wc$!iszJWx{RJL@c1@(oViLuDhFu% z;=nDkGrDWu3}6YL-^b^wYp8EwNN-1^Nc;&%sn{lF5>SImg@)J+R)@8K8Yz*4Pj!Qo z+w@}XY4)Ah#-@MuFMR+)Zz#H*hv)3NE!ZlPwW;hnG}@kI%QHp#V1%aFvx3syP;W~c zYr5;=D2bsV`q5W(tjOlP674ePQ>(gV=ZU4&$aQHM|GUbMdJ0Y`5oBi{!+Lc6?kPA` z&}r#)h?a}fFY&yr5%Sq)$BUyn-kRqUy_H(m4~XqZvA_Klj|;)OgBEL&$lIs@^P*5r zXp(er@4WVwD5xrKgj)iH4gyrk+mkM^GZ1bxRH^n+R^~`=EZFXF4M%L5Vy=GqEi7+H=^@skCZj~? zSP%Qxz7}PKiF$^K5kd=v*LL%Ts~=JhN`<2cg}yQYqEXEXv+}IG3yOy4pP?U^)nbME z?y7laop@I66obB5w!zc+|Lu2W@4-W;@tYG+@h1U^*7?(kY@Rb1o}tE3COmUo)r&-T ziuy_tnH0GM!p;k8=S&#*VzHIR%EyZX*jB9rEGf<;u~v2LFvc2mv9`N=DSu?lvb>AN zR45nJ>Wj549&e1(JxO2aG{>XjtGBsH-@n|gd{ZOFea2E9wAzUQBbI3 zYexOr>)Glgnm2OX6vymiQeGThfW&&sskU;=mkFvZqXUFkb+K}z?R<_g@Z~M2EBLNb zTwG~?7fA^^+J&^_YZ4Y z7+|nh9>eh=ZckBBasMu;BvO<3VsQ^zA@bkerX_tHkx;tUWJi-cj)O^q@Lvqf`K>CB zu9H43*`uVga_%KkH+rg2=MNvwJ)`n4J>vmojm6I5qS*;OPL{dHD|?4vM&q$FhvEb7 zO-4qpAa1kzrNr7G7h)pPGNFbnks(qC8y9he15BD|*E?G|HtAJxO){lp znIeV9d-8JT1)z5iR;DAaMx0l-M?q^0_zP90-MoYwo0eOdjDkuo$Y6+AAoa_P3j<%# zEe7pA`H5!R@6azhj^o2&L0!3g#ug&LteO++B64jFHhOYUFRxEt$X)?>OgF9_?R4s->5-=s)n;4f?f;pmCO3Ulmrfn zNB)G+8rU5bFyjFlvEr*O`3YBBM>hi-y8M-sV>R^w`ur%qW^XZ^`JK3z)6G<%iA5<$ z<0=f8lif6kr9zw17uQ8`$Oc)z?ITP)?iX`fr(X_=ff>iRypLuxTwrOeb7=|6vIk z_6nX$&CWeKzVZ}Ioo<+|qxh%4h#MxRV-336vMQNlRG0cV%yliOapgcZ z6T%G02Ri5Cf8asXHw96&I1ahBkSSANCw?PMUi}#N<2Z2e7ZvjuF0j zwm=JrtK)E|yU438QP7^<}u=Kb`tA2%#QJtcj}lfffva)+@5B7fRC0 zRwU)c7U*smlZc#7Gx?;4VjyJ}ULV==b4^jeS<2lO``p^0W95}|47;Y-`$o~cijk4? z7TeSLGUl4UuiNpJ5K(PVD?Qm+$Jfy>YNpoYt57)080DVroILEHvi_b!R)I-L4O$5~ zWpNPaYULRkGRN0^g~knq3ppNLeqIB@935h;7J@~ZZHuq-n$<{Us)FWaP`UX0mtq~! z9^oK>9uvQW)0DX2P3+l8JTTVbv^bEeRjGA9n!%sY(unagsx9{vOmr^Er08P=CP+P& zj@U$uqGBg7)oF%0g?2Ok!V~LA|B>!E=ljUmb~->O1ASlpiQW!oc?M2M{LJl9qB}13 zIaMuFPvOwhgdw9sIMJ?kAs~Bmc@mvIhA&y!^6vc1fJfh8%Gx|!MV{AULLXt)s}fr< zszFZqI1^3xWrJu5jovYoLV#ac1sy)03oJ^SOGjJVw3z@+NJr4x4BDDX%DSvO;}+s%p`DhrK?&lhXz5*i>&C{^&R^5Ucxluy(PY<#;fjgCrZ zh9yZKUz-;wR!|c=Xf5P5ux3w(W68n|-geug%)jU>}Vc3QXhN}R>evF%W?yZ31M%odXiK;hJ6e%`h zqn46L^`d%_lteY`AN(hIv>QI@7d*!tb1iN)=LA4R=#ZP6d#}CLT(cQ-3@Gg$catZe zX^GoMGM?(%Sati8^8IwnGUm|K-O@G(JI`D(-U*V^F*TJRFGaI9!rWOK0iM^*pn~77 zTarhPQJ5U_4<5u~t_MuYzHfsa?JbA0`}m0s(2Thxkz=(ezaSC>2J#G)wK!44_$a(opt_G(O=3u zAw#F#frenFo2ERq^oZk34#tmS?323Jt>tBVEd=0sI#rqZuP!N%OD!m7dfK4Y63Tsy z-%c)ksts|JtXg8q2?$&}4G%_yI2)1bb6*0v`54N^o-1QzJ#;nWa2{;VBP*o=ZiF{2 zg&K~H?}YD=E&TC5IME!uj^uY6+!E?S>(MaB@}xxTK}8XT>ixuLt8opkl_l$)x)2u5 zMNVGP#x@ZGUd0`S+fI)E{gw<+^7wFhGrAa93hgwl=$rvjOrLyRsnO!cVcIqOHC;3~eb+IZ{FX%3mcW&{NM==% z^eJKzTfR1FqRG1|KetP1o#5)inG$FfI(FAW&}dMH0`at~1oOKp)0NWRQfz|64hH27 zxdt!0JLlA@AE08^txA}QC#C`^tYy6URCelvB>?KLO2KGBf-g{nY%T>ir}AbvZtI2t zya{lh5+Y}x6v^`G%%(>S+8$Xx_BN?NmV2HZu8E`|jh}pnX!f!1|eHStH^F0D?GFL9A)kXl75uG3hF9 z3Sgw5djd~Ht@<}8@y&#b`C%JHqTA+U`w&j48E69qJ6{TyfUb~lx^dV`Z%#qDL4<4* zG^pgfHg^X-ux~nC`~wDN)@0B>J}1m`Wg>nVJ_V_fNgwYwqQ>OaaRGa(Vjg2v^K;pX zrb><3nx{2x0Mzkb7V{h4&tSC3>X?{&uOm##Xanii55$0qf1`9WDD6ch@eUf|_<^~o zLx$olWtClEtLSWS8lC0j_-|vj#0^6Y@aB}e2De(r6JgvSSf-~aDq9N7`Bc6M$NHY$ zl~Fu?WUIj)#CAFm2AXe+@ERU*ex3m=l*v^~tkvweLW9VPuY*sNJuM42;>eRl%Z|BJ zwVfr|+N$}!jXy$Zx_z2*w-wav5L;q5BRrxq}gS&N0YmQEslm}7MH23XiNUmZJAz={&x2vUS zpUrVq%AI6?9Ui;Ff#--n)>9o#HpMr!8=ImHC2^)k2+u(#~gjdJ$ zDIG(xXR1+^;NhWb(vpplwtMNkc)ReM%+vYI z1%JrIhZI=@=k&yicrPjeE`t*(;+rZZOl?HjlW5@vH(o~zPP}m*-44SOF$Wh(ssK_3 zSzA*!qdF>tB}Ba=_MDgscQC4p;|!taT-MVe8N3w6oQvyv?jJ5rdvi)G&u>5e{L_E?;mek4=KdOuY43&HoqmTQ_pG0?TFJL1$bB6xzbois)ayqe*z%~%_8s=|yThQp>=&>B z9^PumiVvd+(%MITNC-J8xtE7yS5SKeBqLHP1)2X-5M+Fe*rCM0LAn_y5!0jhcvu20mVKa18L(Z3-vU}Dg` zB8{i~nQfoIHgtPhG}tA^ch+i$o7)^oz_$9>mBPC|JytrIu+H6FkZWKMIF?!P03^=J zn5#jFdN1t#T83$DG1H%T$CN$n^xr&O1xyfQ2?IA?1!8Qt7OyV&sDr$S%Ih#@%ALR! zWad@vKw^?v`X(%HMaSm`r&dF6*gg`S9q_K_!!H!pEq zj#uio=9VuFhnHwlv`obP20B>8ft%D3Vi_nm2j4rZN;gKze*)vAg+8RCRr|`52cq6V z+@7B8)mNF=QQy83OMu5w?RY*Ja;K0`g#kx`_11EEjF!Z)6R#L$h~e~Q+z6qHv_yPB zJlPAf&uq&9d`KKSg}nL|%r+Qw)4IF1rhVCJQh*K+VSpc1;%3J=F{f!Y6p%94Cn#+< zC?WSsGCp~fTsYYysL5=0fJAal^+}Rz|7Zx8@r53G7;4~E;!B)6(sc|5o<{_2vdl;; zhLRa5SslU2CTET{d&}MJrS;k6lLJU?c|-iRA7;DTv*DJFxjgPXN=0}g$6f4ElRaR` zN&rVdxWDUhc8bM97G~w)QFO}{#5UyGTz9o>KJnrTXE@@7lvT^)RLuj=UixKjUzS^8 z)fXl?6YK&75-;pn;zQR6tHj_UpU7|D0TEA>7=bWz{3pZ}|YtuwE*ttU)Duz~F!s%AC6FD|6&|1-5JR0Qjd@Pq zF^kSy><(76MG6P|%nP-Au}+m}=;c{_Y;hSn;4N8NwlnL}^LI*=YVw`9GYA`_==z#( z!fIJsb1u>T(fawxiRHX;q&!7^$JSFwf)|kU(!3|zvCs**GhsMj@r7njJOQ7l^Rvdk zTIOAbQoJKyEh^><;&OHDVwJOelr z-W0qTCiddVbapu4dY>KdAsJ1ZGnnu7*hzh4siIThomR4OvM8f#f}kypdgo?egRnVs zX#ddyQ-{!{3uky%IdiXtmuws>RBvv@OFiAT;E@LDCR#`jCoigmD;FutMBSJkZ`0hE z0$SEz6`>uS3=HP8dP25y?Bl~jd0}d)(Zgjxf3`$)L0oM*n6yIPBm^j@5sYphLFM-O zW**d@t-bV@C6;;_84doNu_t#8vJl{?8*lp3=G=Db37?pvC$8CoQ81(ox5C}YtEt;4 z&%NyG@@x9z;c1RxFeqA-{)6vWcW13&HUoVd^TJRchBW> zTTEieB|P>f7G2vlStuG0k6?Tgm*-gH8rH~O>LY$X zSOHkkvZUbsxIdCnz;EMjEk(+jEIn;y{b|Wh;<6I45+9Fda#2zuCdVZI98fzb?--TT z(N)-+sF>zO_}HOw;GT{*TdkMjF$SccK3- z%w%fhlS(0h@|uG&c;;$?1RT1?Ift~li`%N*(i~AH2>wO|JX>LPT@6euyc;vguO?asYBi1$D5kUHS@@(NWzK zgqoYt&Hzi6_(jbyzVXMBU*wVh<;P$C@aMn$_QU`9>tE#mfBNk&zxkBX5B{?+zyA8= zPe1?VHwlHTr>A+WN($=`JacM*rnw0^z-tpN1L%M5n$D{*Z#o1~*8*PLC269}X?SBD z8FL$+)C)Wq$?HWK#ytwsCb$F_BrukjjDNQpz9rQnn31SMMGIiB1UP!(TnsWSXSWyE z#?k)0>~!v@D~74G&Klp-qagkd*qeD#+09rYH|4G!L|%R4?h(oe@?Y&V`MgL^&RV)> z)f!3)iKM25A&m)(jX_Z>80#qLfv2OUy`|@ASsJ)DSx|%1AWbB45nb7?@jGhQ!a$?ULX zpPwxUAeWuL5aa2<0?iArln8=ndCjJ z4V(HqxphyLU+9Vpt1Dz9$UP+K#po(2o~8aG6TMUmvRA>VW4T{22hR$V1If7Fa9j0Z1 zluFIR7vHhrb@!6|Me}mfxDt` zy5Y4pi(MbcW!ip`xrf-5qgDn6LSC&glRVZywfGzjpFB$NYl4X!8B1k3o^3Be(yx9M z>|`CEi&B+~{XaaH%g30xLTqrmfTZ-oo#lnxpuP;tm?KSaK3hhbEn5k-*#yA2q=)Uy zZ&_=ktfjz=Xe)iV_vqN9Re4L>nBVZu$l5NX$WNzrcu`osrD#}2 zUxNIWs+seuf^LzHqtCulS6=l1(++nBCYrFb5vFhO-;L|9A7tkg?OgTRPq@==FMQ}l zoAn?&ggf1>8vV?42_6)fC-ZTBHEfoBE(@tAv0vJ05s!y-ivgK%qx8;g5Nm|Sa@PnS zJ$bn9HM`K=p<3>Q zPT(Ux2f6QuMe!O?@me{umW+q&8w8ygYXyCgyc4EP&k&pdClbmo_SBP?E&|urMrwYs zdgDq^UxQPb*q;d|VDFH2akqRD8eIAJMP;$ex*@zYXq}id2^O0va2XK}`FuIszmJRP zu))7-;y)=C)T&F7NX*OiI4*Ha2*XfBt#utD5>ld^_Y@mLNe}75*8`u_2 zBw-?q+hKp|E139^OjTmC+5YKlg4pYafB)An|NYlL{erxxemm?n5UrqinE&B_{nH=i z%>Fa9gYBPcbd>+$|N85fKmYj;Kll$#eN1sM<~~&9kEvW8(lTNk?)KGu<^R8nzy9>) zS8>M+{??JZaoy3ZL56K{mo%BKw;*5p@>i6)s4Q~OCw>vd`FuT)soWhgv8)DUi_F}P zb|?SCfBEy5U*+3=TyRLY=d3A4HTk8e(s+3u2j^KorpZqcD(`1L{Ro${pW#1~2LOst zS_QLN;=1J1IhGl6Cq)1fWS(pJbdL9CmzPZ6qb1g+xSFu8Ke^ythKa#VJsA^3>$kGE zfEyU;AG+Ri$tS3ZkQ0xYr`?)wQ1$FDFtH1Z@*}G;vI)bc}b`y`3^DATZ#Laod(NUx)_mbio;f; zJ&+PxhvKdcHrTR&5m+=zg$P1UMJ>Vrs4PKY5>x1V-o)O6`LmmgHdidoOa(ur7!}U8 zHGvuL)x)Qf?224?i2lcG#H0~FhM!oTS6>ML#KOyBBof-r7;>h0a`Xi31@Q%D}p+jLkADWwBU1}pNtSPI$_A+D( z9Nt;|GFpESZ&)@vwwG}-Bepr#avvEqzES*-J4cLG&54(2=Pdp4Fh8k~FIP=)LMeI8 zN@HFiEHy~2&eYLE7^8`Sc%c)nPw2?Zr64zs=>O_5B?`j?)$Y4vQ1RI6A<9}@0S(&t z+IoXW9ZzzodL8F*MfX-wQ&K}~@ff?^E5li;!JJbxO$UWD@x=f^t+!CV$X7okx-|2| z!QboxS>VW7;8A4N-^iy?1aRF&$*+eGpkWNwazXvnm7c8Y2%zZBZnS?hU-$=4)+wNT z1qK6IJ`b@iQXj(jpRk9N3UT)cS%hpqnP2guj-SYo8D+#MsU#DoN6};t%JQjI-F(j= zz6LIRGO25QK7l-*asPe1$5y1GRM4M99aYoP*+T}Mt)8Y&u0We$6>_4VKff25t{A$`4GKPsd9V-3f2S!za?p3$T}(cXpt>Rs6@rhE zgiufOIisRb?-QJc*Hoba)g>}?Gu{N}eZ@vF}!A&`*kY=$AlR)gt)}84M4F;NZ$e|KVIa)=nASCSfd>Kn)*gQ+v@^xUsdrSW7 zz$|TCGYP4+u!>elSK^09G=wNYXqew5of-cremzqM@nqXj`g<-ka-M_*W78$Y`Fx(n z^z%ktoPFP<9;t+(8{?+fWcKs{Q+V!sztX&CHYep8Pp^%EZYr4nJjWQkn?_3qy z5a<-1Tn4Axo{rCYJPQ+;v%*9*CV{ULJ1Y-eu}K&le56^_Ps|Vv{mzrT7?FCXkeb?b z0{DQy>bqY9+tRohtSO=_d+sYK33%I_+88ndn>W<#ug5j}s)-lr@H6F&Qo^^w>EdLZAQGKiu9UXc<@NW)VXyDQ7l*8b&e)h$9`owok zYDKQRlLl{eDpvqJ2Oq8t3y19 z?mDtdn_Ct)GxN;`7zMcaC~BSo%-mbw#>W)s!ZUafH0NQF&DuW0j#rPq-+4;97|{;Y z?Zt${>U*I;**8wpJ}n5YLAh}@f68PU?NGK2*QT6bAS2i9^gAo+n=7FTb`G)cMsr4g z;rT+W_N%hJy+eY&lH~1uxz51q#N~P9$11a8lfyh&vB3;^*8Wf(BAe&X3Up$M|t`p3%$ND~SRRymK$weQRqRO^%lj`@fc!$k+FiJ?!mYKS+%)b%)JD#Usm7$ENTMQA zl89o`VxS~3I70Cxbsrw+bbEW`Z1)HqGCLF2&F8XsiI#|9wCHzv0w4&(_TjVJ_HCKWD&lQCe}_v^6D^SA>v4E7 zGM}G$QIT$nl0@0FsIbJmD{0rwmVG#nPpOFk`a~&D2~Kbl>#OOKUC8Ie5ckQfR}hPy z+h1K$M=s11J#ClOH>a2%Mo+}f!cGrnt9NyXsYscrb*e!swyEy1v2;me)w}P(?j{NBly-C>yxJmr>D+7dyfr#B=5!r&1Et zy{c5#`^QD{fc8n;$pz2LakdC*331jX_9z};bCF+>t1T6R?6rb})CudX`}lGujuF?V zdN!~KTF7UCpNKJ5S5%JzP?(otDejc@$d&uZ({%et z(lUUFVT;@6FT*Eg3V8Z(H_N6`<~iOhKRah|GElc_Z(`s-Oj9s$rH$$^*_QdKF;503yh=R0;tJ-l z5@3B=$kq-Zb0qf`jSNvKRmFfKFf70w3%Y6J8{X)>jFo9#XBLVTn(qV0(aB;|%h8KY zDuzWH&%yWzC+SaTTkEKUH@imGO?=>_1VOz{pF1pX3-?Esq1rM)V&tQggQs8ehqy3@L9BkSYP#FHyc8FQgrlIs>Br4nXNXAlgw zwOp|Y_f{29SZ~lyje<3Zot(jvb*o|O(vrN@GQ1uyEvsZHZ{`a0Miyxj5H3}Q@xxwF z{j|sj{*{mR`Dz~#8?s(o!PD6+y@Ve@#M!_T%QI>GH;kbWe+IfI$c^i|!;!>(RZc4m_# z4q8hxc*M9_kDUs?f#y#Q67)SCQ_0)mF+X_`{k1{%{u_so)hD^gBS-xS@-!I*{9ejm zV&piQd?z*0hH8}3DyZ#nJ)JAhBjYd<^DJjrXosV9ashqMMO4l|&++jwTg}n52*Bk@ zk^EuLvukIc9aqAgo|C3uvL=f$^4j6yad?=2neIXkU}bAA*sfW4&%lq#2`a(7#n-j9 zVEvjm{{3`NGEXgMKzQm>Uh{Km-rxURuvU3>RR0`-xSN*Y(i{{<3<|?+6OgcSxQ&ee zLSKT;AU6bIS7T3Z@OOY$wJQnmgYIH5zC|Si>A^GRvfromRh^eaQJ}$v_fg^Ta64rO zcEJ!=ltfED_vb0aw1L(b&9`DxH^55*lL z1LEj+-)Z`OqcGr;MVj=F(pORD4A_F(bi8org|Zl^;j}V6HntIRDK(i9`k$?ui=kY6 z=K7A*D=DLm4h;@neeWv=-KMhuLUY_2&jQ)Kq8&DiQ zad2V~(oA(w(-#YBSPimmdAZy9G+}T>eCa3okLwkXXrbjT2mTP>FRp!^y39ei>`8os z%6{C8d!|~nYQttb*qn(2GA3e8Qh-sdcV<{- zLRrit$+x)q-ysN?`Jak55SvOq(gkP}ehrwIHd zib;%uLen4>#S3DU=c^OwkkO$r(T55G2F5QoGn5^kGsf~5XBn1YXN|>pf@O)O*NXw; zT~iTLfyQW3nH_7-hayEtg2pK>D@qnaw00`y3s*ip3|a-x41gTM`Z!|l`X@j{kL zxU`@y>y5INf*p6ZRg0%x*Ck<;gO*TICRp|Vx53*&Nph5p`VLH(LE)@=EYTkfCNwYl zNFg`(<69TpdyvHSO3?0y!$UF?zLDT~ybrerb50H-p>pex2 zd#&(sfjc-;ygb-daI7kX9kW|Q;raPF%vU|z5t)??8DHH>GF5#13gk1CHC4k54y-hns@D^y1C^`}n(Bpx8z>mz3GDU7t-`s}-B0G}=sNYao*Q{7ln}nE2osAd^Ch$R*G5X=dB?V6m@PTX@aO zwsv+g31UK?wQt)|%j%-3^LjMdFh+x+%1>j@@@%6fasmHDfeJSocws?*r7$N)!(`&D zkoJR4Z`?3B1Qa2+DNouiT1-UVI77r$v&kkQA%PJ}BLmtBRh){PaywW)+%aM88g$tw zJF|3I!uYV<);<1Kjkczc9MxOgZ33~U4^_5OgAFKMsejV+OW!xmg4 zx#1dk^&h_c0Vvz%xp$E$C5YrOr`6qk0^-|1s+0bab0W|tDbc<;IQbv`)1Ty=KUkXc zZWP{+c^0%0bk}4!p$)x;#>T z>DRyh^z+YOUwFV9ZZ4kVKmPd7|M2Sn%}?u)_f3v%ztzH%WNV##j!rB2x=VE*wvzXbd#IuRhpZa_nE%7C zfBD1z%@O#YfBEG%{U^UGdy8Z2kfVP3<3D||=t1Y2D zxuW_0fBw__8>LkXgCycC9|diBGmjDf@`wNF%g;am=`TP1VmGfxIX2+Dd@c{|*DpU) z;msW5dJB`ZG2$@2Tg2Y|Q1>Qr zr*ZL~ln+R~?;eV&fpB2%0reb}1`9e!P|R+!66F~xdsqnBZ@uFb3MvL_{T3l z|K_hXIvpy1w`|zWSBK<5U(MB)tUAx^jPj>~sYuI%!PB!VHGr-J$K!-P&-Mejh@%(iV6sxgip7@3A82U z{75Z11WMH0m)J0BXf|7Xq?3!6>F&#Tg=Zio2=y;O3<3wkJX*$#?DbA+GbWQkb`lwu zlUjJF6|>YZT*<-rQ0xp5y+EC{>Y#tlQcGgf^o5+syy;I0B6?ctG=j0%!Wm| zNFE7)5;*UR;8->7^H(kvsmJI9cvlSdnp#1n6dtJb!2Hd0uzf_=QA;~%wy3+IGyP(j zU~gJ$9DsqPTPA+P<$`s-FII!b1f>>5!n{!Q=`BYMPCne0^%z$2@+*cLKIw%|hf(j! z%9Khp?7E3u$eGOiEAyU?B(T>s9r1Jz`PiFNEcWL-+X(S|HD>Th`!~(4zRL7LK2ndw z$!8l=bS8Y`@(f}o@sE?S`c}b$?F3=*TJ`)&!BdaX+WQ-1ReyaYKFcxgV(}flfb9Y2 zm^{ZIzimgVLS@phu)vyBOb#}cA+2y1jBTD6{UA%R<+b>+=-;=nqW<{m;eoQBsWL~n z4(J)!?L1Y{(xq5-!$R)1xE_;?J^TF<(xmB5~yDG+P8CAR~!Lm?#B0E@P?>9#)}RxWcWN9s_| zV{(SOM21IKrI+yLux82c>qDkoEQdh>2+~$*!gx-8>EsHq-)5R~X*zKh5I8eYsc<3MbdNpx!jE<*Ug;lCJJ1Xtl9cL!fObD5VWs8D>_v|fVUKTw* zW0Wp^XC<=Bip+i)o?yaciZP`$ouG`#AZS@C%HQ&dBk?2e44z-6fQi4&C33}Fnr;sg zmR{cJ10s>ptD>BIyfOHeqE`!58UsB-1 z4R?AVcwTPJnwZ1z0#-|Le%VI@Z(563Ip5rsTd?hmd<)4yST^m={cs4PPdSY>wC1QDY=^ky?Wlxdlc4mZq4xa-S1U^;;*SSA+?;5l~%b=Ed! zTPl_6g{{Q1R>#)Ij=|ZwMA9IHJKQrrx+4J@K7C{N;8UZF6ZiVF)!T1^5jHdOnyY@Q z#{mlJ{@pBl8Lpm?A(cE1Y|j*1G&^d_G@jFFxy=ikjszv?2;?yJDOudY+jt-3}bWbW_{Uqu058>lCjQqPo z`MaQ2dw?jyVXNca0hFjI$pq8t`SKdIke_U}yoMNNb_gVE+)kOJ)h zae`PWH>c*&gK4C}5KvYhoDQ9nc5>5Ug(xUUtPg<#r5KB47nEER$GBED5Z2dwv)#S0 zI1bl4QD*;TuA}4#I6c=aQ5Ft9p&y30TG>Y!%vL|i83Hb}%son1J}v!6sEAAPq89W>EHso zi0IEaG+jhZ5uq7W29N^D=+afU4OXk1kza|nC9XXTmsi5lxq%y#;^1;^jS0f6_t#){ zmGsrN^;gAsp1-n1XR&I3jE65{JyrTi<7V@7S!<;~X4|V?0~*bW`=2a_YFQ(XN^&sS z#0E;q;{~0Q&{+t?-u9oxorqe`5GGT>*r?bS>mBXnUnaW-&JuIVBjuR7gz}rS^o;}! zFv81MVR4IlWwbewPrwD zUUQ6TO<*UN;Nb*ILqBJHSeeL&net4Ky~d7t+?9p%>Q&qH_OZJAP{BoTsX;2NpXTIr zah0vS{BAs*#%9tPFqfvSwGrQOs}JAZ!}nc$FDd0aw3$=>|K_ zvWjYZoxyifL&UIZIze0}me!G#)J;4pJjByIo}8UgrWrO?DH+Ft=~a=809duNf|JYm z;K+aj^+#;tM{;55SJJ~xvtj)VJ-ZSJO3dQqu>R(By6A;sTFQ=JfMf)A9C14dXYLHe zw!BNj%)KCup?n+RCtJf?21M(GR=g1LeaIJP#;+z3d=Niu+HyN=%Qf%-+?QO~_5io0 zZARqx;Ar3pYF_G-jAlkc=1_N5qRIA>mMwG zg&`-{nmuDBcIxFEULTG}fRIqri93ry{=~<@b8Z|Rq9i%%i`Qy!+=ag96~{k6tLpNc z@(pjk{b`t*lMD1x$b3@>3H0sGx5B3ysFov@!Ru!-jy|`I?S^Ml zu!&4X*&Y67T4M>ZS9DoHjK#NFIKNSYQ&o`TRK(yQmFs$F6HThP)Wv5p5fr?ST6`;zu5fH6iTzmv{t+^0L%#_=H$MIU<9GsWY}-o+b7<6hQZYAKJPSK+~H3I)uLWxdfq!Gzrq$e4Zcj}J5vm^%QCUU z%H^wTAb06Oxl9th~)13iM`@%3A`#_N1a9F`@Cs;xXU~`G2?Oo zw!*Ec%F>O=k`!I-!{$O>`Iy-#yxe>17PXNfOef;VKy2ITr`-kz7 z%pCFJ`gcG}l{3*rlA*w~=m52oeF3(7e`47M!5jy*rmPohvSg2Gg>9Gdo6n5vmTqwUk=K|A9YvaR36 zmGI#Sm3_@Zph4$Ktj%p)xe6cD$)B_XiPo!I;_WMpYAxJr+OHeu)jpkkuOu%6>1xMXnTb$K1Lmhr}b{Z~xNPTjM=qqy{ZW2G>K3o!>DE{`b#_fE&n zvjxiP%oX2*;H}Ll#gf&xWtHJl01p22X?t1m08X_+`vD>m& z+KKWHU`TV*p4E&`JCZm(0IO@ByM5$R3(#{KNxuU|%@Ih?I_nP7Ho&hhF9q!#{M@*0 zzbK=l9g;8OigzK@fSlk+dLz4;pnL$t7X4cag(od z!Dr8hVW$zV0I7@VoX}Q9NZ$wI6IsuL%_nzs9zn2 z9d{RNHdnZ5lK9Wif!vDNz~FjM{Q21n`stik*+-<3=*i^v0asAzhG29GF@$~z8T*|@ z(rTI0xPGf@4{NTlc@{t2BS(tVYni0KQG&7FIOW!#ER*vLC8C!}JD%J^oKu#=?rBt6 z;_eJ1(`ZL~mxy*(a%PwES8?|=-rg~-OsBT=uC|%DW9yoR=7Tsw+vBj_0`O8R=e_{- z9a1U8<~j#ozfqTa=^w~LPSVDDG8CkPrdh0)Ei^NVCrRQvEWqJm{HVx3CqM-3_Kh}8 zB(yK_qa$&{P`!^25jaF6edfhf@N}kK%a0I4E8Z#Pbi@7n7B`pVI5@U$rDK)t#_J)I z3+Hgz*sBZ53tlnwr5RFBc#OSj4A4iizpomyt=5fRT8`!b!~c zd7q2d4fxcQe9&IvbpH5YVfVF`>@i3*3gP+$aBcclYBI^lt|c;yIfCkPki7?nzMOe^ zUczK#n}p2t<1Q(U=B0PpX%&udyxYYh?z>$GE34QNpHAb+XW4f*`@T9A(|0Cz@fjP* z@`5sSfrgTe3F@7|^-;!mW$%^aWln4^g7mQ2bQ1Tq_QOwH;|>T({L5~#D@En9e&Qv_nQDt~-Bzvl7vfJ`SUrcs7d^jzdKN6u<5 zjop2ilRv;QvAIZRhEpR<*TR&k%xc}?##kA}!@qJ(9<4C~%%@)bfIWgELA3R20>Z=O z51=|nSHV&akzliH%{Q!E)77jkDi)(Q+uE1dEgFfZumVT=b{MplWEik_pkdvZ6%gi( zn_=TlP2!rBDdk{21}^tBgD6a=L)ezsq!xE?=dc1zeSf-i!(}v)1bN;3r+dM4o9$CR zHN?6wwg7P&)f_~gQ>dAqlYO2WU`jv^J^zAX`8OOTLCeh^DbX;56DI)CWs@T=oyo zYo`W-4WF<4Mx;SCa?RGq@iUSwQLm1n0x}5umH45@;$4v6p7YgT?Gu$Dr=8^rsF>8XEMC0DDqP&qTzx9s zR2bl$qW@%TnLMOtN&I( zImi9Ndh4B3lrOvZoQ&l#O}%O-`7Luy6eI(0&cG_;@OHtQWDmqn4n9Uwd9&l?E8KXq z8>E|tJ95#j0aS*M@xwuMGV(AUc}M<9M?$A=Hdxw?(>qF`OnlcqW|4Tw<%&-~$}wV| zc??Pw8`Drp_kwCE?iT$f7K)kAWP{2M-=uIiA-709DIKw0m^fL3%V7E--i7RAuL?y7 zp6=rEAxKB+2f+VhsA=G5Jj8;37T$d9AR9; z?g6wzPijF$%hs|^3#ITRn>gUe-v}_3eoaBW_GZ?)F;zO9?Q$5(sf&;JO5uLK3f6~; zUf;+1Di_5B&pTz664AfU;WDr6U4b&2NAy=LVg$~H;fZNu(qB*+Cv7fNEhVB&F`g19 z%4jrhtVAv|uvTGW78Dn9!Q&>;uZ&s%;_mhU{#_p$V-vOzc#JkZ^jW+~cb5zgW=Zw@ z6z?#@WX1s|rf@d_zEztY zam$SxAa;4!`nkw-V@0RJG91zq|?UVjOTB z)P{3JtyZ_m?I3IaWpKii&%H$jB(RdAf~#6hbM^<;yHT|Kmh#-iJ+$INLR`FYi3<~~ zugIwN&cspoB>c>}eChzo4*YZ%?AEvteeJ~(+n-6;b(dv$0`h}o)s21!>{(dt>WhN^*td=mc;vg~!=1ay7h7X5NMxJ{g=Bl1^ zZrBxYC2y;O$9(TV@+fK6IF zxMsb|?&@m$4c1(Xi{j7Gr6X3KDOwAdH9(SKlJk@5cn+r%*W1PI>`kyDuKp0H%xXF2 zqtwdx$UtHbpjhN3+B(6LNO#ek(iD$ zHzZF(zt6A*W@4ss#hogif2v~dQ@uK6-xQ&O(F}tBXORp5~1wWqJc7rO>_1Yz}*b*j;Xf9R28C=h$1NknGWUWg{ z@p|!jN>{8FXtet7DcVptZ#KBG5vajdVZh5q8<-VxNDdQ zT}*?6h1qch-dJc0D1<#Zi1@i&r;Qw?-dKvn|Bv}m($tK;iz>`#`! zNbjqxOS~Iy_B}q)(m|>Mj#82i!mBHhvV{ow{hOM)1N*)VMgAKfw{umgjO_|a#JH`f){kKzQ2QBlv#-8T}){Q z*59JP1=ApF(giAVk*}`&$%#(*n#S{+vJT|{n*yItch3xp@Im{Dlp(1SA7`W0rr1md zXkc4`-q~ez)&-Ocf?T6yk60!^J|Ki9004XRJCADEJD`?}f}Ye3#y35CQ02hUq*aXPL*sk={Q z={lRm=M1jJJ*5gudpsEN^Yg^^(p>b7#VD~w*l2D}t;k3rV&)Tw&^Sn{4%y3M{T%GK*D>Hgv%a>FOFNWXs4>I z&bCifhghRsN2`M#aZp1jSvmRal}JFd6X*+vQw<8zbrVcHIr9gg9DJ5jvGK&4Thr+F z9@O%QH%ab{g_@)^be}4d(vVOtSd;V=xZkF%zyhqg?s}0!z^Y)&Ca_Fo|7sti&8ODW zao&v27C`3xjOG+H+5#b&Mp0BDA@Vr>=C~7$=0cMUwqo*EVYT+1W&f5j7Un&>$3{Be z)lU^refXDn6>j7e3?E-c;IBfa-I`{0zn@6P#`~E5tl{7(SltXZ4zW!%i4Q87N6;L7 z!%|6HjYcDi906LLHlX435LLS2Cd)d;j|Vd6p4T=CIxTsH8(s0+^#OoVPi7lKBlal1 zDvKQwH0;fnE1FE9iYkjlxnF`C*&h2al1eTSPn4y>QDtFyRQ1_Uv*GPRP`m(BiOe>M z+|o;EpD3mz;J1gQyVg9P0(T0+RpD}hHRvG!m~6g|&Y_`f$=2OglEDw>UxJ2Qd<=3n zLO;JcL92N-r(KFRC*JjxjS)cYoLKLn7J(q)0(@a^JF08Bqc+y8)+M%)n>v#3&64$B zcZMoXGNeJF^DK_ht5Y@d^s3)+N47d-t+cwj)uoXRnq$T?HwtSoem+?R%$eW^^+;N8 znG{BiFHyp9pPsNyriH!)g2;hi3_@@@E${*jzo&pHY+p%d^5hH{MX@k+(lk~BJK$&s zWoH?Q{v+G&`6eMQ@xmtRQVGs2qyZI*rYL%aoh#Q0%tdzS0gc!~(+|Pq62PwZ5kf#H z6z9nDZ6B$IV?5o{X@c1bR+@GnlsWET`szq4IXmNzVSHhB>13a=x8HZ7-dX?vMJ z2!iW-u&k`ldD*nX;+AYujwhhtbC^L6-9}0bUij9*UlYnIKmw2I)DZA)`Dd{`24*si zt_Nh&lpm4%=8vGYrPWm`8g-UrjomJU&ov4AxxxB3;jiHRTbjvlOhLf8l-Zn?1m0p2 z2I>HySQpLXpll#B<`ZGEOV{-8P(#8y0F9v0I-@$2Dk8%-(N(3LsQ5*^xhqoy7>PtT zuQhWjs?gONw>-+6`>}!-my>XmP_D4596cUh(CNX)%-@>pAY1$8edL78-SGuHKa;D< zCus*YK-Qi&F*3bA^i~Gnoxd5#sJiRGWnFa zQX*t=>3rrITJwD9NGxD8mN^wvHELnx(OI`YkYpe}PX?#Y!{Cj1>BMTElS`A`d*TAJ zmVl>|Qv~hxb!M-qug!~9G&6yS@bmjGu#n7=qFU?McIQL{GJDv^B;%}uV| zp5+_<1o8HBk_4HCla#!|!WvlNb!&(y;(fam)^285ZCR52HhU&_^fDpR_RZ~t&Ff&W z&eD~*@hUe_vW~^7g1yVgRKyu2WPW#8t-`nT5`z zou_9TOR{2FuFz-$8p}Qxjkdfa1*NV}xCeYAir(=cP-`vPRrRa|O=t|xP-I|XQ)xM1 z)F=-}a-XC~h7v`E^$W$HFLM2Rf7klsGu5~^(06vI^q#m&W~#&X6oGTCV|w#bC6q2+ zgTzUt=uwo(Km9GWotS4mBTXPD=2_F?l%Yqbq<%kGpedRC`Zxhs95G_um!qVz0G_ zO2gs5sn2$g90lI8?^iT>Tquty<0<>D9}DQ(a$-;zv3gsk3u-nSZwQ;*A_T2#aARuUm z>vpgq`Fw}rlWMS5YY?Ox7NVV{;Ca`|%uS_@pw==y_~IR&Za1xCGI%$;m`I)bGacx> z5MoEgAL6;-MJOs+_U>S1^y&)Im~VLI25@Gd7-%^sdD6|il1W6jsQ57(KNcNDMbCOT zmU8%^Y*)62$n~y7+FLHqeNGLa?_07)!G!pA*{GIx=EdM|Ceo61B%=h8NI^xeVYF3K z_p9nlaITp_tI_T-?z~iGt-IHeZ^=o)7tod*16XFN1R8;$ znu!{1ke9fhLJyEq?8dcopsN%=jS}KgIacNBBuo|Co$h<{T6$^{)PR)Zbd+ZUxNCb4 z!;I`*#XuQ@yI>O!jLnX0K4JNtEDNu1*#l>(Bk^K^t5r5@p8Rd4Wz+g!hr6@GM++qx z0DInx(LgD{wlvqFISVl*GP&E2L3t-CT+B{$7>d;s6c9diD*MZfdoEK{K?&uIDuNj@V>@Vn>Rboqmq3u=c(RY{P(f9N5 zX)c~@({qs>@MT(u6*#$^ZQWC{gE5R3=-^3ULmLOd?cpqaLsA4(o||GWufpd3N4(q1 zWLLQXQt_G2`s^(dx{YyE?94lXoc4BDTE#^Ua>=D;H3I9Z0sRT~%aairUnbg`C7x-b zv5Hg0fRHkDrIvDbYp~P@w>rk8(5E#t4_9{oLYY-K?(bo91GzFWn%6p>)x)q*B5U$& zcMtf==dt`#EzmZapVZs(lRPM|%oewG1vk{gX#^v1^JqWoCjO|MBAGSK#Myq($!U}* z`;)cbfom$;3UW_D+elvw>B_!^zNMl2H@`ze_isE6-M>lD(BXl3 z$m~0}>^2(=kl;lV*%j&!0Q0XD3GAdtKra0kC){g##yb;LFoPZOuDch21F&7Ozpn~& zh5Q$Hio%+gI~02qw6}ulvm!9l9*7KGIZt?!IJ2h3;AMsKI0vVA21FmMTXra{pE4@| zjd4(8I{Hkfqf3q>2$ia$^L$tI-nees4yai%FP2<1iq$0SA4bzH`}qNhoR6$G|I^m^ zxV;GVx`s+)deAnzk9M14JA&f9{1^Gu$ttcvf{|L8h#~HMSo7*i_%mw|w?!{lRt2H- zWFsbl39d?U0h+HnMnR{J*(`R4qE49l!xl4RRvFdq28)#z`nI}G&Sa3m47R>)Rt9?m z3VTrv*j-JUntsz8D+!+t^~mTn9o`(FkS#N6dmX#l{vg^twsBBQj@{ImB4Aa<2$=&X zJffF}8Di=Tym*#)m}ng)6(a0OQMTQWn3D;=qrqh>E(Ygxfvq$|ZX2|FuuiMNEu0=4 zax?8`V@#KqYbTA21ukXny^4|1Oc&QTb_POe!E&6M97%&#%AmX68OtRd@V z*OZB5UxizNn(zP$&e~DsGoGQzf`<9Lcy8L;u_9h-M1Ir7>98%C)x4&Zn|E;%x|2AO(F;g{}JIkDlr)?{WVp{rx%nSQZJ*%)! zqVl78M}74YqEofL`6-U~$B!St{aWfv-pWS;AUcDviRrGq82`a-$=>_T%}PQWQyInA zM5BvGGysm+Xe(pI{L^SmzJ@Z%Q3MZ1kRM$ogyb2?1&#_qScPi7g% zzq6uS{V{P+;^({T22o$o4(;T?$GDRcR zR#00~T3nnt6yjvT49?=tGh-P9h^@__U1xHFQ7n+v-4!!v%Akn7i8G?VA82c^8CcH@ zpi;ZaL9`W5_FmtTR>{KC{Z2;X%^qz?_yVdPuTD8L`C9-Z-JHtBYjU?U?!Ke;BZ?Vj| zEZ<=PB>8A&Eih=wX)U!t>9A%A6;wxvN4rTf#^8L*uVdeu#PSZBUtAL*C|tB?h+O_= zF#!(U)kle}9BxyI_&$y;k?JzlnVKdQeRQFHNrknrV8{phTCa*a@()5H0X%CU-*)CH zc?S_RFsAalC_kR zUAIEaK!J4CGPQiI%;ZRc(B`|3Cqlr#SQW4^4WEM4=uO#5sjEm?Hal7Zd9_Okg7qH(?F(*0Qo3DZZjEK^uSuaI^M}0}6U778nQ%)O%|y1RXMZ zHx^lUh2EZ1kWTqmQl5&0*Pu8*Q$F>WMT_ZjPjPMh>Nvi5T6G!Ek=n>#5IjOYG;5|+ z17)pzrAEBen+=9h=9I(r3GpSt=h^86oV+|ma<{WjBG7Ar>aFFyzu&v)ht3G_-52uf+-wT8FqLz zFMfm#56!omd}nsL8F%X8&9WV)Tws{u5?(4~J?;##01nU-h-GlU!BRU>Phi;8eqyY~ zvoiWj#OF9zP$v($agVy6rI$!wZmpPN95t?!^EV6sIDY7v+5gt1;!4xe1 zj8Y0oND)~6>iPeHpGwJp;naaaVqhMNdgGWi{ZhEN6CWHUWiIDkAnr!r>5#lU4@qxm zi%PjEtnsC?&n+8va;&HjMU%2~mVp{eeDBhx=q%}l4O~BPpFCl zn*wN((ZTwNPDKqhhcpFiO=cPGS*hjO1&QnC)qdC^<+lhc=YZ=LQexX|>qEq&n-8i0 z*7#`dVO3df&@-BnFy(b*;!N)hVQ`Av3Cn&-n*vyt`bS1(AcM414{BE`Uo;N#1NH@a zD+rJ297ICT3Y&S{{I%NB0@4k~!XP5^LGApb99&fV=O+vAJkIQ4|*!W944^txX;M8`LIv zMue?$;*n6owhe8&V$i_UgE~{?WNc5Agte2Z3Ld)|aSMY^bcfUu#HYJ*&T=s7Gnb6c zg8VM_wZx9%cLfvr=(X^Y?P}$oxkIcMr{CknY4Pmd=EupHNQzU-2g}?zPl0PwE+d&Xs&n&*hDLjj(VJ#ym_H$< zSYASu$JsnvLh4 z-mmLBCq7xTNG0+9K>R#PF{z|gY8XHF<>wFeY*emh#w1THwa z3?H&`N7(XDkO{M3SJC?Tw6q;vpBo-d{<%Jh7jjPabJ?s7n|I_!7KZXtW)T(isH(t= zLdguoL@3_b0&*nJ#U$Fp_09L8>b=<)ck2BCBzRztzH&Uo<<+=*twDf^TKV8+j#lQc zYk!U+h`VrGCV3wdz`JsRPH?xN5sCiRO<}fFosDbSPq5(fC@pX=VHvKWZrJQfAQBWd z(K;P*etFEYR4XXdLXjS}be z!YOGAyT~;f;)W*vune+(%a$=~x&NpiEcG zgDL!^Cx%xdMVQC_PzMLyQ^D;aUi$0Ez8vjgpav%H4m){%k0e>@EZI`adYw6jy6gR) z7Od@^G4nD)8zz66=l@qSVq&dp9!YkKWQW03XqC&3mURK@U*PqM{1_G{?>>$k zw?8*;Uw>rpEbTs7+(<-5`ZZnE7#izA=MxB5(lKSLR?JJQ93=a=Hiy}I6X zkGh}lG&+f+m5pfgL2oK+XzOVi23iwzOdjH4Qr{&VJiFJGf8~P zdohu7YBmlUar@bk8P63?eNeytb(i!{@eP5}x6z zN~d9ZMEW4{V$DR7pCR#Gn4z345=+x5_(qfDbCt+XRRdrMSnXBGHm(}euyya?;zzgS zz}F&3#d^@7u!^mPyXLE>*VIapJc|(YVS9v|`V65XZrns_ORS7Iwe=%FLyE=um^YzB z=Gi657s1&=6h$(-`^kL`E0oZbtuA~#j~Epwzb3H0j!zfYpz($}F`5~6)k@|$;h_Sj zr3D%`^eMvwDI3kppO&o&Hqoe#1Zk(A6hB1Z>_I;oFIg2p8-3NHl|6;UyfH-gBUa04_|8EfGpHKZYg0(2vqr)}Jw0M=D-J9mYRe z1aDBZ!V-zv&SU8fIdgt!7vH~=pEgLdghRzTt0b>Z*MkkRpv+x-jvu;FsSZD0`CzFD zsC`d+J~fpTVuP{mj!{QdEH?v4!~@J8b;q*12gO}~*Fo+{c1O8#pHq8vVh1l&SkQKE zDmK4)cJtihC6$I89;RV{K(eVjMWkfT?wy3ni$G%!H4?;TP2l$8O1Y3 zpYvh{xP}$?;KTy44KVmtgalgN8hglSxFFJBpA42#ca3NDI|JE5IB;{;OyNTFZa+)t zc5vj8-VW+AoG{Uk@#Z%cMt|j zBss5;J0eNXSpE@nnxN3`OVPL@gjvUq9kJQEK5`#t4--OY$|%qfOwu=5la&LEN2-U?Sw!b*X@ zW^^i+zopF=W5e?_k71}~^hXC_{TzHd`h5MJ(T6jRrZ*|KK@;DU2|>s0VO?$mhVll% zUr@@#g*N(+6pItqKvV9ant+fD_2OjVIPx<3a6Wc{({PR^^I)kVuU8L6A!t=y(Y(sMn>Dgr_@HpY0Xg~B{6`b*pva(< zZ)e*VG`_CUI)#NPqo2)t!VYpO1S9ZaCmBOuMg~#RKi-vi&@Wx5sGX;t5rj!w6}eu5S3yix0)xl;pP%f!!_;g2Lhr z#-WCmz-XAK6HKCJJaO~n4VeS@jV?AI?d0-m`A|E5eAFInj+uSr87%*=_Ql^Xjf+L? zdJDl>Nq$-(QtDf~9nlJe(=BY(wH4i!C&5z>iD_MgSo5+z8UINP)Jgjw366p|l>G{m z#IM9VDpLE+#3p)-d7Tbg1*rhxtNT`1a`0_bkiPNt$O|mV;@?JMk_(USvZppMN|#ic zFqEj+k8iI$*V*eRFHaMhY%PvhpPd4tjIhGUxeBxnRKdX(lg)E?z%Me=)nA7UNf}{Q zuvzq|UOCbj65SucX)H}87r}_nd-Mj z$a^w`M7pnB%f=1=e`$a}%CcKR5hm_E`0XA|3Y{{#3EPix_cm(RUmdD0ygvdqy~4(~ zbg-O{3fssX_;;RqvKC*S`?FL5eI%0(O6Rq6*t@cJ--Z$8;J(4m{kz}6&iy-&o%?qQ?3|Bk;-wz4(ckPe`gG4%VtS;K203uJp7e|&_Xd{z ztE1@g;2OdQKEa;U+i&WzDA=lAfXX($OxtMCkfq4As#X(Y17P z77b3d*3*Kp&t?bFw)N0|at5{)Nmvhl{C<|ct!x0W{zx4!n*$E^-vOAVJEw%%E3BzN z2Z``xoV-?mU$eR#_XaG%MDKg8UGiYigs4}kEIWiI8#P5)KC`~-lZ#geVZ#j7C50rj zcJN>>!yZ-P%Qt#{ktHDH##v<-c6$#mb8s)$le}QZod9vv+3GN8OkVn@vr`r8?w`h~ zy48B*VY%DUWn{OBMVT064MQ#T#3SA~B6{l^Gnc$7WRPK-2zY5HdGKDfcH(aO-GzH- zDAsf41_=0dRD|NQRg!-Izx5dzoijZa%3^8{PUl{-!d9W2Cu2Z&xtb44S+p{cO}%+3 zLEvm5CH~o*0!-^Rztv6_sy6?_T<4Q!v?Vg2>xgyqBZp zh88C8!;JyOryQZ7;}!vV2Y`~V=Vb7Wr1u{BpJ=LR9;9p-mz&woP$ zU{FbK4tUq*glpwLv7U9Q@3%0qIytpX>5q&SmSuKwa-PH$EIO*^PQ^eT1Bi!AAMp*x zRRqf*$x``mA73oo!JpEKlv|0ijc40v}h?vAD(75)AC=c3c?H z*HN@_3!Uy-CG=Hy&FgGOr&YOEyt#TL*YYyz;R4;I$=|c*uc6jP$4;HpTrd`4hS@wZLCA4^K-f$ym~ES^Zi*ZBkx& z(rYX>t<;2t5;|J?4P2^nqEP3DSHhAjVa3MU(mO!uZFSigt)^}H=j-=)Ly>VCwPYVd z?mQ7B6P{%W1lglnW9+N)98#BBnlSwZ1?;;pXE5+8t?w}Ba1OU{`XMuXY* zlZU<$60LP$D4s%&p_cb((a$a)1Qp_*Wfwnj$rSmCWqWc4-oN~n`p!EP7UPDE=S>v6 z*wpccxU~9=3zl!;esI5`+$h>0t?dNFWRe!Z>dL)i85J2MIU)3zHdp3A5pjnTAOjY4 zKEV&`T=&C|3FKHzWL1#Molnt&C$Ubm6`=A`nRt7J|FwN|GEJh;4YlAJoe0&ZtIn{4 zCyabAiA3DD%GRZXjm;r?u^7d*9RTlZ`*d>LlJIn}*|!i+e61VV}# zL87W+6J)I=FQN{RGnW5ag-CI1l_67x^OXO<_;65EX{W=*>APdR1Av)bIE$`YU^UyX ziiaRB1l$#;&Hiz;G;;$@8w3BYrHwgD3)3?Dd{ryx-^YiCY}JUf40C^ zmJoGRw^Y?giN(GAkeWvJHdr$&()tIUO7G@5>U_(+>xO`=71 zi|1z#JkX4ZqEqx3t22;fqmc5P`anI)gWBrJ@}w_=^PDaaffhNmxCyIvcd!ulI^m!e zZr(_+^DRHQvu;c08{8-$YjO!RQrPj$d5^UcroN8mls^SV=Ty zDDvLd2vv{r5_pr_OL>`tpe4y5y+h!e?9A$1%whD(ZnKHlPVD&hPI#+YH0SEbI^OQt z(XP=fbZ_N=u-gkC*X8Be1e2U!R!Wpd^dR0_-I9Bxs!4FDfR!+F#*^N;w2{9mw+Do&;xW4l<+d2WvN) z6EmO7+$)vGz+K#5f&u3t9UrDtys#x(o!T29o zM5L!x5^sR$`O0dz+4{CGVSSWjy1GV8%UZd29+*nBeO8O4!LSggv~D#znAMRvXTltP z@^wduP?%uj^Asbsm0%ZMF2TLUh5bs0XxZi-GgGGw}| zvYG~XinaxPpDz*~OXCi{V`t;lX;y~S;~=*hZeg3D&yQN0c*#iUc9AqkH|QOg2pj`N zm-?joM@B2i0-T8(5}Y1u?V?9Q9;9yXIw~O=L(zaMm88NMwLah zp#X_YW}Hn}V-%U8JBbH%l#Nr5uyN*#E9iXMh!22Asct`38(rg{GLn^cK!;P51}&;~3(LkH_VN5cdo0W~mJ z6&2u?ywzD3PF19rSi)MZ* zI{jltfZ9HH)MqO5#kQf66_| zflvAiz1Lnlf+-#8d~Sd^&>@q_%*coxdsus|k}_6(8PocFpUw+1DUe&x?e)9N;KHJ) zmP{~M347FktU?Cnej^y<;3|ynKQx-IK6%Auf04;61X`W#$qV=8)e-8aWK@h+Zev-3&>LG~lHRpl&30~g0Q>8Fu3_0;K)#7? zpAZ&nA9ZQlVPW#YpSq0LlYRI_hmN?$`N79Qo?hgfHEVVo5 zC-N<@fkA_3J-A+1qdE#Vu0I;p-~EPB{hc?eze^ZZ4%PDX%GW`k9gA5mr_ex-e5NVC zRC$qZFRhZQeI=Wv2pRekz^2Heo5jft*n@mAEJGv$9=Azfp`#z^j=e{Kb4j7G4cc_;s8NSA9z9CL9fRlD zWV`^VJMRZaMR}9Nu3o%@MOr}k=B==B9-QunmFq>j#}Gs{?c3b3kXNUIfeR*JlF04J zZai)IBnp|m!)QRVpjX=-Io;&6=>u#bsx_vOb}nkaG6IWxS7D|C7kytB$MzK^j-Z4t z4&~Z_o7`7Ozj?TmGaW!ZA@^}$Z(1qzz?>h%1qEL;8nDqwAFFEo>W2K6UwKa;Y~#)~ z*Satma8FXAHOQy z=nXjnv52)q2m5ia2Mmf_`UoOABeX?(at?7jUeK!>Oyr}EMF(Q5oY)G448*08W9}Zo zKrGjGpO4b_ph7~c@}&x&??yW%BtP%Z^$(|Lo!JR`lf`%gsDykY>?;VRyDe5zx#}iH z)|T51w%UsW#g&|O!b6RQW!h^Y1NIDb)f;RowDc@>KBx^bsF0y3&Ua<^P_K9IJpt&z z0jkvP50DVge8YO1x{XGBNQIC6@!LSPR*TJ`j9oD}f*z1z;_lDkuiT##tSFIg&^QfB zyO`?i>RE39f2Gl)G-72KNem9OVJ%$lgQ@1Hl{%r~taKX0L2)2sTc? zt$A^k={izWPAX{u&=4&P@KoaUb6!=vaviTDO2$lfa=FoC-V~KJ?H8YA!mAUwP|Bkf z7VqUnz7~EF+F!dY80Fsv=V%pBFlv&=LzV-cm-fyr+7EH+DY{VRosD(5NX)(6Y;?bE z8N|bvpfK0bc!Y(|jx-7yiz|bHy)B~QN>d9y!(k%NHHii<7p+ayr&-Lb-e?-D9TX(Q z+K)R*s=dDjJ5$LAs#QfS_YzWmxegz(3j3oE(z{F*8@d+u{(DIMndHXfq%>rq2Uzb4rqgV3#-|$L) z@4b@WC#mcv2f@ak0er-fy4(}bJbX4ddE~k~8A>cNuV9ZHT);Z2xIx%0|0%WipZ=6W z-W>oX&3GzBPwqec%OAz2;S@)0O);!nEJq;WWg2hFh>1=9+5XE;{d$4GV7j%)Y$6Wt z9R#-}x{%S{j7duPMe0GZIw!MYabMLkq~>QwW5__~S6rXlUC_^p=>zm=_8M0n6#NSK z#oKUyv3_8u)kYeCyc$!YfUS=kRpXsSL$mkw7k{a6QN_S&|0Jx9CY{kMn7AF9U%8&J zsRG+$CVweph5TPcX(0)^G}|6@_TW&fum-?`;;tU-Myq@BLZFr1Bx{%kUHNExfESX2 zrD*ji+UrBZQ71OKDrRX@Ba#6bTtxY-9254$lJ}X-|B(<0TyEL&ymxM_*{rqlHdGnk z+r7A#TkLHU4U7e=+|TS91^38VhMMkg12hK5MX>`VpIAW#NBl;OtMGLSj45Qq>ib{G z#MiGRMlzCm-93OP)ug@bo5DmA5X-55a#CnK#;bhzYW(wS<> z0~)`F2+uCJw3S5sAO+YJH{}BLe@mO?PCz)jF?#8>d;m#&D{EpQclB1zjDp3uT-_KWR|S%%9L$eNq=9MOIn~_Lghg=7p!zks zD=*U6%hW~0(2CcQF3Jldl!HE0u(cl4FOo{6#$H7XSud?(JIXqh{UGY}sm@f~mEc3R z`o(0tIC}Er>&uxv%c0$8mciW&TVXR7jCPjU3I!QrL+cLtBVUY^K3yEl&d^L>Y$qJC zXQut!Y>(zdf|3W^JuwRZO1g zBDEb(Zo|PqiLd4!9fa_4vqY|cT+j9_Y|St`8V&dqnOoEsHjhkeRzf}9*-!{nT}@0q zB^EUuDee1)5Mbwt@qxHhVQZDU4ag-{GYF`=6Llj97uN&oAff<2%X)BhL`Od=b)xotbUu;qlK+LdHQs)7yN>|AeIHceA%*p{ zHF=J1HA!?C?N8%VRXW+oLhV<~Lv~|vu^+9l_x)5}5r-iNIo@kKrY zT4b|9RUfAI^8*c_9ub+!Ey|;(A|cG~J-{YfUX~@w`WV8JM;I1j2qyFyCzw>Wa(1U8C`Q@FlaQ-;Q18VggJ^& zPNM8^=Z;lFqv*tj;aHb{I_!tnl+>&(xr@DoHOy;i7t-gmjE8`lM?l&q9Yzd7Cl72> z?mD{M07YK4pseeby+*K>FdjbEBYy|W72HwYCq|>w#Iy#${xDlp+IsR?cqE>3T3rcj~UGgaT?km@V?^kK~u(u?I2$PK-zgjTbn1cesQW z&nilh!w*W<}4rxL5n03~u?jx5~QjYh&&7PD?D?vL#rpP?J-} zJEiOl;B?UgB(#8G-OAym5=}li9+bx5F_LvV$gy?Q0G8P@{JW~m%mTd*OtZCtD(I=! z@(Jo&uGK~>5Xk=;>V%Ld5;|a1^%q&bBv*w8qT+%9z3$5o$;H5Ol`o-Fq1U-wT`-F` zVRi*OAM2`>Yx4lTeeAw!KJnKIK8pjB>{07_$&{=ZBAyjV2k}P5Y(Au91+YVg~qRSfQR=Bq!_ZnC7MBn1)HWKahGG^BYpN4@Ftm4ip@vx(JOlg}q z`w?qp&<8ae5PBUJ;YSVzMrXLTj~uzv8Ib?J&FjD{Ir0We+F1l@!nBUfu@lc8bW)B# zwHtv9#;KbJ#e6UsCH4@t6yRC9Ko;52s6g3K$%w?vW6-7@?U+?=KqVAH`AeG@Is4Hu zs3cTMi>bnfWfd=wH+_D7Z=+<`z9D_O;!UxNIgE;sA?5#yvj&zU2=uO zcWcF6#S%u_nK4I$oo<->?tAL@GLrlGvc$l^%rtvUtRSUMDk$<2DnXvF>9c3$gMt(l z30zt=$jb`crB#lc4#1nyyO38ry-ThoZWl5+~Y zrJt`K?RuLfzg_U_8WB7O-E}@=#6jbt1Oi-#SW!1?!OA0v`QTjC+i&xS;Pj9qVB3h2 zV2h(plaG}%Jq3PVhHJG-{D2Moa1vb|n9QkTNYq*4eU`GkgEO4>#lFD0DyD<@moG@I zUH=t<(vh~dFIKM%>0WQVyJnLm#F)r8l{Dn_;Id_=^a?CV`{n9w0UvSXs0s(vZM?qV2C}%yi5AdPLi~PImxPcDV=6QJ9MP)~sJ-!I~8EYt|(svuL z77f_Ri<#mka^jMelnfBW8x%q_FJy>?`i(Nhn5VD&>$LnH9OfBV)C2&bGLJxAO8I z(Euba&qm(&PRTS;ivp2ARG5JPyjY|PNZakM$_o>Gju;opF0RMtXHC$FY-q31Q^A+h zJfs&R^icuRc@53PL^v`|C~ZJrnhc#U>Z>`YN*tVY56@P8UHCzAydK7tDbcf3qMLagTGcu1*cDmKj~?sZ?S%=^lwWjsEU|(& zbzyD~EbC~`-hSpjsz{*M*JJTMC7jZK;7P5-5Tu|>Ek@Y9F!5uefrNv%9e9VI(RU%4_1~AU| z=i!rb<5$p&rmGB%=xK& zVOkvzs)$$_JEk4r($wJ-t6cF3uQw`jp_H&6OpeV15MNMR<&tzg=)KFRh7hQDPJ>DY zptp0)3u{^i zD`BAy`AQ^Ma|Y6%j1X1uBFEZ6`CI`mn`}7`Ij})X*j~DomnHwj2XCF2C|Tj zx7=TX+B1(g+M3f_2JT{u^!*%HHx~(f{Hwl+iW>N*< ztWz$!t%&E5L@&SDv&Y)p&-N;KeOzSD@I$iJP7SSLzO$-7%2poD(@;OYYSIHpP7G|C zbn3)PpY_ZFRBt~Z8ftfxc1voTk>Z^NswC0LXLBk~Q?>@=DjT0l&yY8BJ}O7dQsw2% zK#Ac$oGnrOP+X7|s9=^=fXC~=1)Vbp8ha+e*2xbFsmO|JwSCA39$xq85w)D$C6w@t zYJmggK-;aQe4T=WjrRtG^dMtJzUMcz%Vl}7PHF~^S%vzkO}*_0SyC)4BH_(WNS&ct z1~U5{bcO_HS}DGMC0>loafsV0N)x#oY66zV{xSN_chrC=KI2%w6S#EUbulY1fCB?M z0bMWPf*!0Ij02F}`yUAfcAr%YyE|d}9{=v#q0U9}w7X*>NFjzYnJnuy`oMJ;orU)n ze_#<0GG43wL&iN(V)iYgVPi(PDXpgRytDgJX@^x$_HA%3&h?*Cdw=|wKm7AQ{oQ~2 zQ)>Ss0QAp)0|5Hx9sv61NdV|r9G@8(u)!K6Go^VP6<#D@^OMEHK>Z)f46KB9G6>n5 zxDSAcpBV2Bk>Tec$uMQO?D{!5%uY7T{EYn)ad$v38g8n`acVu=8XH_st*7|GPIUet zu8Xcm2>rtLYEnL4T}7FoRka<2x>HQk>+T=!^n>%JYHl1rSX*KY1?!`lUc8Pg%OmFJgX#K+XZc_M!JU)r z#6-n|Kq-f5DL(c7x#g_-m*N;&z}4;lo8=J0vGa&GDylNHN>JE%l{p&RKcz0@MRTbV zJYBNb$ZjFGB@>gP^B&Y>ZoPwFMozyVd1ttAMXy`l8&XK)PiPCc=}OW6Hpm0cB+o-D zNkAE7OJVI0CN;Gh9<}AP-ljv{QG+Yq7ZU6;A@owcBb7YhlU^*|U!58uF#xTrK`9f| zZb`%$<_c&6+?1KRkA^MyLp5Y?5+f!{=a;sUi2}5V-)}E>q7K4;YJ4IjX>~!=n1M8u zU-rpQfB)xy5k8#);gQ*-QkZ`NXj{r`hTTo*2BT{wEpbzF>4G2wU7F<#`Tok| z{s0Kw#A2ow0dh+%N655i71*yw?#pCIMu|Y_zn5XJc#keC8m4RFt|L3F7BGn*h1>J7 zex^C@ENp_VXkG@5#vlLg8ly1;Jq5rBY zcFaBA=)9PXk~c54DWtXv{3bof-UBxxog^hCPdZ{DoFB0X010~u7te2k>-D9uo#G7R z!b7yJj9U~RkY8~XN)RpN%PJ;!1ZhW=BZyZ`soUO3H)SJ=Pg3E_V=%jkDz>8G51HDY z?w@+)^nsGP#U?l}{!_Xwa{^0SyG)Y)vC&>Hz2p)LK*oZm?to?1eg#E%o1_ET`H)_4 z=?>lU!_pMyWJO^U4$~!*9IA@#`$hY~S1d@yj>RPhZ;zvuNn)~P#dQc%H;PtI`_k!W zpeqALS<|^&)v!yUd9t-1Bkn*AGb+}(iJ<(rNzTQapuHWxZcvsmc>rS4s_Ce}5S|?| zJH#G$IV}$s+Z~j4A;>eo^%u-)2RGm#mjyUX4@(*wkWyWw;a-SUlatFD(PMOH1hIi! zMx5F9Z-S^v-ds6OyxE9fkrXBS4ulBzr(x~ha)VlmPL@55REvqk`wL9}()hbY19xrS zaMP`b?32C&?;U|58HtUEB0(vtSy0~*%ru%ltVQck_Hm?5l(0_`LTKM-%EHHh!Jq^o zIL=((-3l1FV(eDda0}wPpY^;Y@bSBy!~sX)Z|`rRVmxkJyw;w^S1FX`3VL~E2$UJY zwaz8YBJP?-Z(=fAl(Dw4RPmyAR^d6wz0gP~?lpsUkukDH*6&^rUpeoyd2G4#ZkYmI zj*L~SH4C#jOK)}tsuyBOAs%2otEvIKIL*lXe491iX00&4$J7C)?%GCtS`3?`@Km)4 z<>#*1Y&i{HFYs^mN&W>t+I;#pttgzeL3F5&-W>Hd#b(6w8r}y_*!A1g=t>G zvLI~OUzMN6F>|020Jf{$c@6-+Nw8~hxPq48(pi|VM2^~UvG)>oo-q|E!HMjRYB{Xs zqDCQ{r{WhdGwR-c3vI%FTZLiNQqJZEpl0kt-9!Zrg3?a$&HzS0xxYw_B2Yc>2>Wn$ z687sT^fr$`_$3?A>b)lV95bd?HkQGiY(d>}kU?`!G@FK9TN-w-MuOn9NTk1PkKR9} zI)$zdz-Y|{J;!zOBTw;*U=R=D$m5?;C8d5Bw?0M2zB|qX)s-74Ukoniz|NLmnGr(iROV{_Iyy^7yLE2DNMojSA@vv&0Byy}drWC!KdaCaE(&*IKW+_6SShTr(^b{9^UG7tw3 zY59XuA9cyzJ=nC|x8%t(Q*pp&gg`fQDX+y&6FV94P^#Q%1qV zY8?fq!0Jn|vN&B=J%&RgT~{IYAcFt}(TOgorIw7${GAP72R3qB{m52FC&y-Ei8?LC z-I)30MM5#!&42C9Q%AD&^MKHpfUY}}arr2v_)uMncg?YjjY6Z$s1jVI<5g`wROBIU z87Rk@a-i+8-2jnDRSw=*+-(^nASKe7l_G>krhP#dU4H9hvEL2*UROd>fT!_h+IK^- zxmTMiRfb1=N%!{;B?5aJY`;4uFRHhELZ3K0rrpkJ8{PZriBn@+Jpoubg;vJhY1}(! zaeis3l>Wz>6y|$DZ)(I{&7KS^6149_-wiC3E?^E|iK$%;SWBi-dUspWEmIi%U@FB2Q)$|qRS;Ic5ZF@b~&-C=>J)^SzQs0i&@Kl%_oLq+ac~brb$BZuh z0Uz{RR9a-o22i*PIv|kx`3k|#QSNYlhkM&$y$x~gek-m%%0vO-unwb)4+lrB>9&kU z(Ay19t~rd$4)I#a3o!Hiae6zr92-DRqSfgszk*akb8w(R{MldI8PZ7!P_GBi_`>H2UQ{;-W}M z*)Ba-*FP=_+ zIo*@VKVu_P&9g=7AfnPC!@%kdAvDQ;F6EtsmkY$9YL!_`rx;SKP=&I^<+C_t02Nk; zzm$V8Y0aG*6obwW49}Q9iL&r z$h@B%gFHnsGgzzsyYd9}yC(M~CP1Rvqe^gmf*eTU*mS3r4F{2+G7xhx(IitjihCK@ zi0M2bE!!vMsDkE)^76dJJadp&2wM|n3HrBI#H{8}zU-`$(}CZO=ZE-p4bvoZ(KLy0x9W;#=l`cf=qMqq}W(xP+6H@VOI_+2pK@e5Uef zvNivQQ+Bm-mjd4WnO$S~9GBGC3mPK{z+qD!&XJ4Qn^A|EoUxdA@^n@@LFSoO%+J-u z-eWYH6Kq5L5Aes@B7t~Bb8E7c-=&)zOzg;Y2KwBT-_GcsQTL9WBO9ttu`vf*Q5=t&oa^D2{erM)7Ay zZ5ci`%a{w(A?f3-mG*w@vcL|Xm`jH$()Xof3+=mQ=LLS&$$o|v4OuI-r0WWEoO%*B zBJwd5UtLd5};qs_9GHJhZ2xWn}Y(aB8G1$v2a`GXDH$;q@xXHAGlNtG~r zxvp$2tG~fpq3B!j?fmI zQ7=+Sad0hbO5fT!3pNVA=>am!gQ6oh(15mnjIKhWM~MvEfXP6XE!SY~QX4Wl(cuj| z$BiX5i8b3x)H7L;IBXdW*1neQ$~-`_ZU10#o}fSiQA?e|Y2jMl*8;xdq5g)8)SDm7 zzI^#3KwNu!&X1Tci5xpAT689LVvgP&_?v#a)wc-$bgcT~V`GcfTrvs$$$Bi_^%nqs zg0@^CTiiN64`Kr>(9kR|$fVGamVq`<4pNg^U>OG&*&s7PAT0Z&c!jFg^3AAxKmj8e z2fBx#e99J9xfSou|8RwdOgj*fZ|0Z~q})r?sD{^ji}6~N?nZa2`MGizmR7uD z5ni8!#~a~cJ!r0n#Rmxp@ZZx@q#X%tTFsCnIg;xEe&jURm?ZgHumqLzChF9!9<9q> zjsdfLqGuf)dEgl71ZA|plb#0eXD)F)4-awA#2R7ly4&1$p@dOhCDrh<`A&SA=9M1} zu+A|3rwJNMNo(dvEK$6@!9>M(1kVY-{hLFKLta}B3>=^>4VJRa4^ePSu)Rqz7<5hz z^P{ThmYdJP%>h^y{b>+M_Y+pq|Ty`>1O98 zz*wrk1vn;ExSM&(gIQ&zb{jpZ1{B(NwGWowkHSphr{0g@!KlziGy*<>1VhPOKV>*I z@W{DllacSgMUg-i$SjhsD&Zf=ZHJK63q}|0*Fe)xK|3y8dBB5gWPf^hC@~{88=fq( zn)16I8RenEEtCld$6;b`;jbrz<1@9X2suIlyhI_kk*AGl3cHAI1GMkpHF-m6?$Bd|w>~*_STF zio6X$UdW4~tX|abdbp3LSwYQxyz2l~7&n|J*W-?$oJs9qI#vO!9_j?G8GEpCl8@~( z&V1|an`Oj4L5{~5%X6RFJebb11Thi}6-)qNo{pABx-|4MQ!Hl|+eNv{*OR!b3How@ zKY^2I42;09aY%HpF`_p{LFYh@5A!LPD%D*~TkCynX1}WjB%Td{!+6FYQDY!xgkMB# zMnIoC>^ox*1f<`H_A0^6ffm0jK_;)_G`F_Dbgqp?aeJl^`Afg>xxQ!}&DyIo>Qzt7%>jd}2Z zE>}!+-N&H?|_OP^;JCu7|(WaT%h zv==|WaH?4mN$i*Ymt~@NtxsAX5>R@eTlB5L9s!%oTgUs_e>zDqM)H_gttqX?XPG#& z4b~v?*2)x=L7naskH$_lC_JI>V4e0( zp`TOSRMln866>!(d|Jf=Rgmz=%X=XeJ3`+u;8_4t9EWS#vsA5x#buQv(&leF1Bp&^ zH>w>ujBYheCI)l$=>t=#>g-7nZ0Q0$;H#0gOpXMlg)0akb;}$l?-9^p;R)i`Bc>3< z0hNG{OdN~-oNQJu$0$R!vDhy%fKgIoRH(q9y^}?ab#TLi0YUX3b3`MXB7EwX@#RV| zfA-}s1fW}4>(ERTb4~R?_j71k$?oA0Q$O7w@`yTtj9Y-rmxHoX3e-AzZ^Pn&`wL^- z85FpR5x&kUe=>!(vZa}obIu?6?r3bNGX|PvLN8t0Fz~X<5@>DU(^GlH`A2z0j)m-p zi5W9dXS>`U>J!kW9^6~uqRKQS?%`e)WaCaYcykfl`n~*d+ zY!YmV6?F0wpO%Ffua0Hm&hihH@gkKEi`V8GOMJWw)9%jyr5>TGH3Guv9coP17Ja3| zK&9v5#Vd`JJyfz4Kb`;pbJP0r>SUKvbLkY;^e3=(daIby*L#=;y}nP*5$N@$Hp^rW z{m@9mTVodcM?wBCYi_z@t7MRg*Ou0vbZX&dCfMt{zq9f;ZY$G^S5CwHJ-o^My-7bT z!Sf#oyMlC8#*s{iRP4k1tu|(fI3?wLT-kb0&@mESB9~##t`@e#)D4T%T=%5-2Acrc zPh^klUx{s9qz<5Pa+QjEIrf7@$^;lps^kL<3%8~(&a|nvU}_3(7X%dAd?{0h%NbLj z12~6B518(n667mcbp1H0yat!WcomCbc|c-g;E)2{300Bihr`Yfg3PMU6bc-eJ~E6( zCx=wm#Y(iLJ$BUJ>pjTU217iqSo=)3wK#f$|CihKZ}OI{8&&z)O#g!MvkFNN2@8{= zb~ltsf4&wumJF*rOihB%6uiH3%9OZDEBCwd!b-1iu|+?uTv@B_tV52@cx|9pw8gKW z`S7x=9>o0JRM**q{q4kwoZ2Ic6Pz{XXHoM{ri?nz9#Cx=!b1mIVi!~clf^bN!gPj3 zFPm=sS)CJ0hKW6vKh~d&9JzHN4^uf;wC`(r6BW8#C}iD&E$E!dSKQpWiuP{V9>)A` z_y~PL(u&*rx>tGn2y~Q@{zM)^41?PWcQw=-C=+1`daf6P~++83H`+3 z)L^_r5}wFWjQ#%|ZAJ~sGBl(6!whlL%|dDF0kudmp;wqIdlPf9_qZf-TjN{eMK z>PRB@_0%G@`ZiJ_quFLqc!G^=6sT6j8(Ewk+Fl`HrUU`1ehUPcc$<0v?J+>`Ye)W9 zg55RXS$6t>foe}aE^K#S{;R2*Oi(ysN79$Ov&7$>JiaOpXXpBhMEUJL)8f|0I4;Bg zZPgTS^`XI^{kdW3D(YYQc*$JKgBexBw6P=a>qlQIf{_8*=R&YJlq=Z6Nvdb{tdq}~j{xNPfSgUuY=!Y;AW2G-!C7fs1oSy$1@CdIC! z#$Hssi}FLu`LS0;=Xy!{G$4~~ zJMvQS7MCIR;tWDyumw}R;I^HsjJ4vv;JQ5Rh>HTYt2%@^(3iu#wlCX;%7LXm%M58_ zeP4E$pty>cEY}l>+>aT}hR2iO9eR&CSp6Rw@rO5%kexw0iF+l3(#uXY^o%pfsZE#f%}hkm$G{*QQ#4 zPjiOA`*kvX05~W6KXnV_LbpDipWgY7oITO|yKHcC{87wp64%R-6F)631GAN6#_=$K zB)|doMFO#6#^k?F&Vu#huzese+*bb?Jc@uO17bzQHau2M4hFLnvNhUzgjp_c2 z9h|5v^qfjOzy28Aq`!=ajJ;ps)Rx<8UXhFX?W1a~&yiBbLFc1liqS)L9^0=bao{lLOPmo{n`vZUNUVL6=1PKi|qj4z8Kw z)Y6PZ9hV8k+6re0TA^F3Fe1;g0bbI4$bv*d&GFSlC!M$h(2>t?`u#V}khT8^vtd5aNmiJ?L@w@`K*5Gq_J<=F1A6;?kI?a8{m!-~OSk#t7BH zOY>qOb9-o#4$sB6QBLuMc7P^u+jvJAdk|shn2Uoc?mxMVls-a}n5;u)(hwr5jLC%p zo1!(zw_*O9iKgWum(b4b2ZIYNV6FaYet3@@4(NXCq~JI{YvA$GxeSYQa3F0z!1Al& zTY^H^xD$=YQOSP%B2?@=-qH4#FD9v&K3wGPM$kBAniq}b9-89X+WiQ@x1MLC#xBlN z*hGmrb0^PlY236RhX>Z_8Dc6~409|HUjWTzQdNgbp@{?y->-g7i%d*8sb0Vmn4zVS zqi+mpk_LccN(^J8{4<;GkP+F=B6&NhLd>dg<s4u(?<%o)k%_k|4Hw%E1WDk`=evfyu!(9q{j&GS`L$;`3gTqTUrdaGB3 z=0=}HJD6O%_V;qxDLQFHVeZ8RSeY28CV&<#O|B*_Q;6xSPK7zMat{A{7Sh&Ue?#q`Gjp z_+YfX$Pfj7PIKskj3p_#Z2Z?ta%r~VSVF+D)uV25F-)GHtW2H_Gu#xnq{wPAnk1YS zmjqghbzBO8c|7sks0h~HPAVwxuz{R0r_z9*$v&_+QQe(dNo7t^nrH8~p{>pVIV30y zyRNv>A7Mdgr<4iMd3<*o-wIzBB}+1u!L zKnP21=?rIPI=U*evI7&fBTxTQb}l{JCdXlk9rsuo5Ru$bB@YrDdN9BK?g(`aJB}ms z!B!{O-IIq%0E5GmphOoPUQ%;|J{*>R<1p^-$V=1eP#sZCk6WN|TPI3Jm9j#8waW&x zPt9Pm*1Y$DjZAsI;?!!qzk&LnCvK}%!1RtCu(EtJUq+E3dlNMV(NQC6n9A!CMRU6+ z0Wtds{e$2in2jwZ_0yTAm5Q<@n4ID#Y9JC?C|Q@nMJ|K0o$&E!`QKV0JZUdYmcp@u zhqjhP5J`#C85EQlBmteGw`%w?v4k~{03*OvY7sNzAdb0I_<2u*+7zHT&g2phff?SL zF0xgk)R>A2nmM3!B*+?E@GzVWd@nbAlrRppih*;S7SP*p5AdGK7$D_lU5phcr?sz$ zS$pjQJgX%?pacH(fBfA)Iat7d`tSeGKmF%F{MY~OAO5dD{^$Sp&wu}a{MmoR9GxM- zg6Ufv%EMS>RPaD%p_@RM6AnV~?iif?0S3^~!zh-hMosN6ahwh!28h6V#y4STud_|} zxZ8#ZQ6`5ntGH{Od{{Bv1>0Z-83~>>@&k|&TYoS8jw=3_Xq%+3ZQqbsDrYu|-UMJ~ zq)yh}dqXEW;(gPs_B_>UQrJm_GygRH;b0&}Nrf9MK_x+N{Q8t=I#4Gib(18UvJ~3h zqxrpLeM^useA@tKI(oW7$3=O72F`TG!~>Q-pvYv;N^WqS7kWWH(1cckraSOmnU<{U zugxtJ?itE#D?d^S3Dk+=bb)e?{4c0U&~IP2V-(HJ-2{!+YBO!N6JV?BS0~zqLAG_! zIK@;IxuCleJdKZ-0$F7*oGG7_FXWuGDjxg#?kEHBX}OPC!L*YW{fsu;l}>oscsd)C zpf(71dyB^=ai{oH+dVPy(bt!Oput4zzO<8{*BUH3KmXik>~pOoVe? zEmW_SK8|+j8?64jA|Vvwiat{9Ggw6igUKgdpR!ui2tCmF$?TSSZGcmyp3-{fOe?+x zTMB~?q6u-+N;k=gKxa8RKpO_Imb)5Mx7v)EiNcfb5)Blmx1(`WBfN6Z8ETTJOd29h zDPAHc*sBtF=;Z$z>;NIW@!hFdh5Z?v#7djk%pXam4mA_T&Hb4xZV*g%49+PQIx$LS zzv;-RqR?V*`)zuMLd{bn9Jdh{rf2FK9+#Q9DNpyF|kCg5P;vCki z@Hkv#+WuQ`J(R6aygVOF;Q3N|;Y7vcYOBdXP&jiZUaQK67FU~G0q$&y_tZX3%Yz=& zqfXs!P{T$t-}-sz`4EiOTYVPH^t`PJKQi>c#5I=lvv$g!%AnR=NK^|co{h!Yeo&kR zO3R~_e&wLs9){&p$}F1|;e!xQ&<%wTTK#13jehb(%wdC(?zf+OUm)==Wc!C|cp4rS7-&s@a8Vjbd_W~wTr_q2%4{mb_1n)tiwh7IsV9T2G z{00?dt|Tgg`MSR2KBl4haw`kUtD2GkF$f5Rsq)!?hITyFDP3C&+S^ImMH)#;2FW>L zQ8j~wmEwzJXu?Yo9z^3QvEwK9OjZ?`?d4@hj>s1=3T0Ok?N2lmVAmnZzd{MTfH3UF zbb>Vhd{tgx{VIcxeX)OzAn$kpCYf9<*w~ZDgs-?g2Z?-ex%eVzLz!9^`m)wsh8@+NilmO-cjnncRQGxx^SxA2>;6*7$aREmKRh zaPZDX^Kk|J1A|r5gWxDz@R9fqzrZ{b$ZA)vm`u`E3HK>SUrn5YgrExnn|mK^smQqL zIUPLz17`?=Fx6_Jxrj@**6U;Tu#7QPaWIp{5>FskqhqTf6dDn*g2cfrw4>1gR8%J< z1x|&nlc-}29u+&Ve2|W z4vf39qUpo7IUmDKJ5X?LYMF=vj10fRJRCtQtbm}E+w!&O@Q5f@Hn>?XB3S#Phwbn% z!V=5`Ao?W~uybpv0h zH-Kt0>fiW9BNDu~Y#$vVgrpzZbhe4>`RG2MqxPs@bhY6lZIvEDF57j|T8_$Zm&hS~ zsI?~vy_KZs#@n%^ZNaJb=5k?TotA8G&P?G`6&FHysU=~;-yGh3L>2D|o!m39)!gJS;^C0_;g09r>n&N@}N@=|c8e=qHI%d_d!adk~hhrk@w*HMMBd<&@wSBkQQ%LARlfD$Daulxd0PN3ma4 zlQuv3H)U2>P^gv{4#1?o7@kMB#l_$xnwbcx$2Wfv-xAlebLTQn%E>^wo?2(C#`Nl9)Uous!<3kS*TTG5*x9Wo_56kynA3e84ZgR+1VWw!H%ASjnwD7U?NINz!vNwG6l;k2}Vu3fchyqA@Z{1HL)rS zQ%OI7xtZ1ZH0ecH(LAMH(3d?c2C`4vwO*n9R{M9Cjb(}?F7;2uQhvk{hZ<%T((;7%YC1h7s6rYpEY1RB< z^mGEFG=Z9otjz;1ZM5qY^B}u!ye`IjZ<9itdf^xbn;)xOZeVp}DhZj&GUWpa{C}V1 zEj-L+u?xsnJ1>htes>T>{+IR{Uf=4)vUa39lubO~%@p;YuE{Y`J?nW+5IAUI^NS3V zc#`Lsf$=l4Q{>(CRyrE5v0fV0uv#sU(LyV0{jB6!Pc_3s2asUd2iBlF_WK<*S!|z` zt!;lN&JEdAhsA}Cp8`g>p0Q-DTjOE=22$BsiFxn8OqEd+4eNdQvS=LwU%X~KpAyOH1p}H#nhc)2N|Hc@|cJG2dOc4k3{qjI6V(h`mNOP0dQ8Gk#Pd zO`i{z;SlTlwvjdOEF-0QF7}Z`7Kuxx)REtRjlW1d8NDeCDWNj=7t!@gFadUz-E<(T zRSryEGvR;+;F%r9sjpLD z{1K~IVb^AOf7vSUgXKw>3)Z`LzXMCtomaT*qfmv^`$yme(N;j zc9C8@;1+dF3jDh!s=e{V$)AqgR;$Hfv}(yax1izu=z{)G9s+Dh+7GcT;|wm6 zxmdVdJ`iu79fbvp(tT(tbmXc93;J0&18cR#_t;@C|s9 zF|ncxiD~bR&-_ykmboMQ=^WY^A>5|51?@;%g+r*NGYnL*jpGsc+%M|GCF24FAM4sE zHDjc0OGcks&}(UinY`=l&VNB}8Kt=!sG=ytHXarV4y&wb1t;6AMet30*A>|?wqL#J z{W0po2P??&`?DqaXzb@uw?w4{cPb0ViC3altR=1ms(Cp-EAW1QS@Z+SK;MTjr7OI7 zGztb&L*wXr6pRY!e{~VMmdC_nJY4J>fLo@Yubkm}TMcEb}5O!Zmx+cCj7;|3ATep!^vS$l%~CTF0M`w~%TVtH zu~JluG2A%|?_D-eM!1v(pSh+$Nvdltz{^a|J~Q6f5p+CR1CJU7P_k#nWX=kDQxy4` zwJ1WlF200J*M#pfqMc%>RbFS@HFf4cIp0bfL40 z557-#XW8FTU4c53%W5RJ0@al+95Rn<`zq5gWewWMBcSHrtb5`e`XGSJx@^rdVg@v4 zsaWCxe+=ST3lD~UQo!QVN-3f9vZp@5mBU1`2lQC$rp|sA zk<@)yE)^ykF`k6SDWK;=P2Fu%xcGc3yn8f~(NYFiB@vsrqHuPq%dB>{g~^x#xe~cr zAQJnqLT6C+LsrRH`WAB-jklB(ue_*Vp?F`f5|-}kW=pU?`Lh}`(-4y1(o&N61xN{W zPPxOYTPhy?3tpgq5_eu%8q0kEZ!#~a8#j<4V=#?huRqaev~k$E@V8?$w?DzrFq5?* zh>16uQN|OKLfnt-qLc-x<@T5iBydRpe7Oo+bL8Qw#yD$#k1OHhzIfKQ;%Ap{lL0p? zUDHLFWV+|WDXp^iM}S`u4`_GK0*>A`jh8jDDwe|XSP4Xh-MD(baqSA69Y?F^=Md*& zdd!x6JbD=u&DbURDWNTVcNI5^HfWlT#hx>sGBok-4^n#b4EwwgBUbBZsmRqVsjt`X z#pEzm2yM}{;`?`y8pq9VX`}(gu1W-aU}dds1er{HlA=3ro4HnF9A(=clI|M$X$2U~ zrP}?3(8@ToG~bgP8J&IjX^sLKo^xgNY5<}f=Z`)8$ziqg;r}{lhaCKZ@Id|2Y*WKabRIoE7#%bF`(Vb zuVjf6eSfieDz;ju#6Cvm{0QV4^~y&FUvMb*IOQ1Zja|L#+Mz+NaHYA)Xec|8k zeNbr8{?lIRkgD>S%RNX;kJ&z}Q-)WkC^ShBpsbfkvu&g)^%DCQ>iz16SNb8%zB=rbO|MHFb2G*?26$;w=RN8(fp9Di$$uFY<5GIx_`P@ zx%f!S{8zt0%lucKmiey|w9Mpr5AOGL)fxw*-SJlxvY!-bl)M#^bJKlB(D>^8#jl@; zlA(}`8KX^vnwn^Gl;A0df1;}iy3bjou?R~WK|UeGsx<%R1G|V8DG(i;VB<77>>p?@ z-FFT2tlwphlfBibZ^%ZY=i!K8s%T3v$On{yJP8s(qE}%vN%{}ZE)V!g=G33Zly8)y zeA$*LyO=6qP&pPsxp*nXJX~>EMulT7hk~AR(Ht%sPahxsU;oCV|7-u~|N19JZuU5Y zcPCI0%8pe+^4@5-2gOiDIJ_S%ZeVn`u{do86SaIR`Ne1qpL!!}?TuA=^O{Bx98rTA z7~Hs?oY}?+9}c};kT?KjI}c-a#!7S*&&5xiqEAE#q%{YJ{xW8YHMJ*eSEX`lTO_EL zUopNEEun>57x9XC3M*m1t}0n6`mJx1KD1GkH59VQ`Yn8Yk_s-1pSA5(XDgo9DB`V& zo)UBg+;1Tuuc<^fc~Nv%Poi&~-pc(VwN0u|lg_H55c}@Q8_-=fW{{*hruXQKl-ib8c$hZ6pk|NnfL1q^#w?mvWuCYJuLQ>{=o_u(c<*9;b?9Kf z`4J2AeyrY90@>%yLCHH)c*GYx($-J8r1taZ*y1KYuCv_Rv=WUjy?N%2Wh4XQ#I>Km zgoCogkx_f94q`mLLw)We7Yx58M>16hLzOkPGu7d{49ZK<*(E!%)(PH5+qN%0pL&iv zIqbju;otn1Km6B!`saV)7e88#zxfTz@i*Rb{7u4g;7apb#IRxK(?sRlxb8Pg{uH|~ zz1d}VQFPD=`;Fl2R=3jY50~?o|L)h9BcI#l{N=y<$&e*QLj3sh65bW-D85Ymq9V}e zL-C?f^xJ9r%#7zo(>Q1c9okGKEuFV!klF(>!cj-?H-v)^7>q{V)EjriTC zM2HSHoF^qxHER3fnt!5xw&(*?w5v+RPJtVbOt5NPHmLN!Jip0rZ z0#;QP{!YjA1zVmIhNmU6L}j|r_caI*>n>!3aBJxL3@hF`uYG7JF(;H zfTN#-{LVRj)pGKRv`Z7SYqSx*l)Q--n;vA=VSID9nh~`ff+(Xh^@%Xs2qF;n|8fMmSkZVEun{y3=i;2KS~fg>9p!}1O?G6EK-A8ahPQ;T~h zAuGZ9YuL)mkHQ714K>`(A;jL(IP@EB4H*o6BYl8%zp^V{TX=e*u)L*+W~i!`wmaWV zjBHCel0imF#)Ic{*z3d799)Y_tPaBjiH(yKcKK;XK3b&Kt^7=%p_qrf&~yy-*|R+@ zw={#{&a&=!k&YU>;9DTH6yn)!3f#((;l5&&i|tQM*+3>Wjb7M-OUiB9W?E5JT%>tW z$gI}cAqz^JeQo^g7K2Wj2N2vH*Q<~PO?MUztqv+)8{3U?J)*DaDjjS+ito-QGA5^) z76Rna@%&Sk#G@9#LD5A{F-qTxxx&sxIx`7^&kmtW-GVk4nIA}j8I-fi(Ej3!J0vi` z33D~gZlYt-_L9yE46SR#_AwcwG(ak+56Ef^Y~7aaSQdpL!R3TY}8J#8y!46t@$e3n{AiT z9gX3P-(OHdyco)4f^!THvP=t)C%yh`X`J?u5j>Cxa@tugdeRbQGAYC^5Mrn^c`PRt z7{}Met1A?srQEKEIpn*Rk$N>}j_mp?FZI)o40OrPe%!e?E}rUHP#Z55Q9o)e{PGDc z113#=dwCRffLp;vAxSu(Mb@!`c+$(Eb*&E&I2dV*ZNeQO@2KZC`Q|FTfHmmXvp2wG z5@)4tF9voUm#GL3f)UNVB>RlKC;0ghcB=@*^g;3wVk23dqF_+nPzOKdiFh;@fIL2I zWw#MNtVFxdAA(+SZ+GrY{FIG3YgLpBU6VSzOW=0Oi&Wvq$F5n$8`yKjB7S}i$5)6y zwA#1WKVP&CjR{bt`ul(mqN$s&GC%vKQn!W% zVf)xO3%AB{WJ+1l3viqm%PGy18|ect&x&1gIIwWhA&wm^!cArsA_#{wcm=AmO0GQX zE!TH=E57lL$75v`@1vWwM8PG`n_E(W)XE%4@pk@SyBlpJT6)jRV1(rGrLh?2x5-6R zTZd;cd$m+_?k*@a!rW$42LTWy+3mwf_&EAA-b1KBh*89_GNNb=a zj;36y8p0f&i^KG5WB!f*lx2jt@(_1NAGf97{l>QRJHIXcF0m~c$_py$chTjMQ;b;t zAg;Tc4q7sOE-d=fdcScP>;8<#D{jZ9g*fR|s(Ymplw16UQZujp(gaA}^<&R!&14iqx?zWh8zaSDDE1-@bZK+hNscjBBi;f=xJdG`xarR4ur&51S_RRey zkKq z(c=;=$6W(bDi*Oze;J@J{euNCq9rJ9YrSJo*Xso}*mXSF+kI+Y5m#mlP>mnn)a;Qb zkpic!d^Z6{G#_i;w9QO{J@h9Qq5nfNkDoZ7emK=26aPhD*tOqeFdEN2iDP83119$o z@@GL~&G8J8XsT7?EyI$unl^J1LVs3TlRHfyIbk<0#>Q8nog;GbvRh+rsCW@}u+FL+ z6Sg*j(c0oP%iF{VP*Ye|L8FhRFa`=2V+26%B>uOQogg3ePi6X1Gzlx~r|aa88pP_m zG6%dr_Hch#A6nw%BtipC8jvdISKP3VA(&q-R?|!l0FztpgE(pJDDlNSh-5b(f$HE@&bAAOo=He1+St_ z7`Ux;+`syfAc6z$mI9#o^(Z%x7olDR5Cuo0pmFRSyLjG!=@(1nGTY|L%>ex*Q5F9S zwtVI0V)Z5}bbShPvAr*g$~>~md{h|554ZGfm^wCPmxQXUx$KW8$WA%y9NiufF^`OE zv5Isw*Vxm}VznZx5!Y$(p9UQ|OVOjd<62@3H2;X#>7^2Or*TfZGIHySY?Z)Vaf^AI zVYRkc-$YZ#>M_2n;(Asg&%B12EAO-#3f9`SmzQMdY8Q|DBs1)<&J^?JDX2rLf&mcu zi@hg_fbbmmS8+#~d_2o@3-o>AiquPcs}%IqlN8Tta{PHxJEl}@y(nlS+8;`~)Ou$n*#%kxM8{Ll8Kx7ZqV8b8p5q<!= z*`vMpxZ2qvtqO}y+Lhdnn(1h#O~@!JR}W+VPVkUHf7ANDEF*0PNQ07vv^~=;O~$R! znSt{lKjaAVv0Du@0C@~S$!*f`)j@PU0?qGgcNyWrFnqWSvhD#RB@?H5wq#&Pz-iw< z14jxjZa_yE_9^W&H>wi_bzxY_s0RbAS??e(d0X;6LtM_&XTS;XJqf@gdRvrIyIbwH5j zVtAi)TDD{8L&Jto3@-rFHUG08{rKPih9CcX@5lfCV@U*$T&bCoJV%&V*DtVgN`yq_ z#`yIJ5u7qmi{YXa3noOeGEeC))xc&Ssi}&zheiX`I<&lzp22s;5Sv4hEfz6s(sSZY zB%C>0)bEiKas%-0SQ~slEh1)#$mCo7Y*=iv+Vv*$y8y*c5Prgg1afLIk#)6AD3)(W zgz-;YoA3M~+zDt|{poklmzCQ`EU7AXrmNdsPK!ibxeKH1-O4&NM34z!u8Un^u6I2w zY>*Mw^0CAVklg?cjoNr{KQx@T3K_|^!o3enr`_#uCYe$y&EjX24Zx>>fEd zd8Pj9%!ql0Fu9wN++W+(NbLCs!xx^!*uvVt?HSnOIEzBUZ84avL{9!E=|O$klj+g% zzsn7?JHcAh1qfENQ4xOlbNbCRBr&I~mP3fPgdVbZI|H#-zbFP&bL@uq57l$95U30( z1f4_jcO8p(GSjWvUxDIrJDJCNm}oI2OCaoRm9 zQ9<0h3NsaDh%e%rFZS87gzx$r*S?VG=_q>Ik^dUJK#yU_`(>t$1FWQ7unfLsca}nl z<}e*(UJz)VPpm~sHwlm5VZ<12kAv*^d!H0Cb=@JtUPd(X-}OgU#jH8>`VJt}yNzIP zj90TqMGzpEJ5Q=dzQURr6XmGU?luA0IXq(anQX803RxUb!NU=&S;5LU+G;LRb!eQs z=-wa9#IRL$`pV8z1_4xb_#{>bwV+%Nza`FqW95_?iFQIUV@{IOCvu#S7)a8g+V!jz z*7Iv@!4Jp`Ks>yrNafKy-fEHmGJ(t7iSk)r#%2N!Gq_ccD&uH#HQwBhrq>9EtL3<^ zay_+jv^{3lkYQ<9I5#n_i+vh4P{u3b#>A-EK|$Hk!WB!KZ0Po6ltwVAv5IZJ1nwBD3VgPeX&Rs0~Q8#)Vh6&}@caIJydqC$}FBpSHq1Int zRrt6brI5V#J`#M_0A4_$zsD1@3x?HA!U*1m58>u!)Tj|hlT2h$5-rG{n7ttWAazU{ zgtu8Io*Az&GR-n)j{7on(Lu-jk=5$rdIB6kSEVu7Szo@4Ged1%*r3-6-$*M6@$(_i z%ya5)r5U-sMlz71V~JyqH?W66fM2^$w6*>u!f1uFYj7|777ZNiqGYP_aP-)n8qa1L|0AHljjTTcb64(@)+2n8uRmDAaD+0rxahx1 z3LL?k7N2+fMdD|#zz070+yS%Pis+a`)nm3YVf)Y@@xx=(HL}%bj}iB79?7QwV9Vvt z$MPKT^#lwHJv%C+LC9J(Iz_9iqkF_MRVszBei|3cR7I5i5$S;W>S8^QeEa;>dm`_S zn88Y=a^;094K<5l(^U6(0H;IJj#}hY+fcaG_1o|;d{_xPAjvQhm9w4jA{VrGe|(S| z{>R_B$M^UD_;>%~kN@y5|H~i$&wu_i_2d8b5C8QK|Lt%8_|Jd;w}1HG|MoBb>_2LD zHXq#{|A&A3kH7oH)5m&g^Z-)7-Dkzd=(B(b*o(HG!_#im=*!c`JJTxLIRm*|C4S@q zmO9&h;D05)69c}uo-M9l__X9B?vG)!jHKnp9$VckKe3%+)1=jiTr_QpT#RHdYw}_P zEZF5&&g2oo9q5+G{^x{QQf$7YTf^GRyK7JcC%3O$UF{(?XR=$_I5Rf3wB}uSe?~|> zK`s2c{|Ppaqgnpr9Yu~+5z#+OH(lZOz=1AB!4y`GUoq?T~CE`6HNc&++(lIp8d0K`W?-D9(HV-C4G3jj1 z!LW25Wuiyb`zXI}t**MmQmKH>^SdfJ<9*paI9q@r?krLVZxabnPW-c@mnkj*_LP)M zN_2;&YWGnCD3quORq2LB9|-S;{@KO-K02>u%buR`)&S9FbJ6)_xT@qisT-rr65p)Z zQa`b6J@s-W{#4To_Hg22W;s;});y)7>!VJsZ=nXerp)%Oi?Ddle=VD#GNI^%o{q!4E!O?%6p`_aK*J?a7unEtRw6t@ zGYs+Y(O}mk-X8BEP?1=3dJ*@B%)P`i`SlD)#a(X3wW%qesTa+ZVVFV<1sLk-1&dSI zlw~JyP1R8js%FIRkY2z9b;t@hEeB;3{Xx$nd;N3^%9Fk|UiR6E_$Nm`LuFkM!m06^+o-*|C13y5+@^AC z;LPw6*lxkH6k2d)3Z*CEdL>M|9);e6K}#ElHZi)dK}B50j3xC@lq`qo`!5IQH@!Qr z!Wwp~z?doK2P?64A`=o4hIA>3WUZ{DIg7|+rN2lL8KLb>t>e zm&K&xGT`~7E|L!&*fJLD6-yC13U{r&D1Ti>tk#LY>u4n(rEjCmC7bjN-l9Pt_J~%B zPDRwHM(OU41P?RoV4fjrvGRjbV+r54pvB8bL0s`0{S z-AqCK^s-1xXu{eRFe#yCyw_jsp|%FzIdzt>vx~2#-8t4srYUgz#6uAo42j>^)+iC; z6nQ6fs5~nTyB^@m z6%eBjPYs>asy)IfHqbw$r!BZELy3jgw1zv5}Y?p@0Rnt+>gfMWAqn0b2%F($>f$a z-#nY6;eetw+^Xp~YN%7{d*d}D%+1uOx+!I&0wB1a{V}qdI#8g21(Moi#?i9!+|$Mt zg>AeP7W=RAZ>XAd@%%9E^n&?1a>1|K#y=>S-%g9_0&gCMshDbMdISVt0B^`_KL=Rr zx6S*<%R^JaYL(Z0_hoZ=+F9(4!_tWY!?wd-11)Z^cQA2zv9t}2 zAv29+$FK;I?$-J4V*e^aRYJ8yw{FD4TotmQ%@QBnRuG&n!|$(e+#=gU1U&`#@Jp*sU*C#@eyd3rZvFpMwO@nK}G! zRa(!6w!->V7VPCfBzUIzYK5z*i-@-W=z-eLDB~^;YVwN2)mK(Sq`S-gWy|^O%6@lU z#zNYO()0F=ZY#h*$EuPVYHr%jfu53!nQqRbwA(oXBAf#$CiZ@**}S zztl@x^vW%M?IB*RKs)2+N;7yndV{HOR}CZgg?R;y3tAA;uWT>_tSnv#c_dEJfF%W4 zbJ;_)+QKcqXm867U|9t%^XCj6ec}RZUm38}{X=CTp6`(Z5U$It5?t(Cs)0?P6d%@c z;Gji`-c6h8&Z6QYUE|!H-^MSCbUm1B8f3Q~bzk9`SFWSRt~bRp6RZZN*O_d&kSQ%M zSc#1%K7t>Px(xtMV|l$}ph})SVt@F)f|K%S|E;WB6D^wGU~ICK%uo!Q|`9~=A z9jFi!nbYWUDCLSG93)aGn0%%p4;40WDYgip3#VWLK6%D{>#~CniKz9Lgj?`h=FJ|T zOO$@rSiTtLuUYP9YCTL9%DWypmJRGO_fVf*GI9?_%-*~W&Shb8 zaYcofFqJl^cUF&%`yiPg9;2iBX@~ZWp0h-G^qF-A}B6Bq&K3Ur5eINJnTQtt-mT`im zzQIy{f()NP{L0rMj<@DI13zDeZwMp>D~%Xa-e#0mtBl0CqJ4$Msfjk@uHB2_w^KLf z$KIcX&7)wJL4xQW{EA{O;MZNAg*zMXjw&G9p9R$y5Rzn`)JTdkX#;?ytmD>uqILgh zM|o|ON1cnsikQ`#sB|ksv>1Y%%RD`$!)3tbKV@@2{23X*@rF2W*fH~E6Nmu^p$7QS zLFmv!CLOL>AvYAXv9^mj`~@d1zVfj0Hhciv!SS;=Gk*7k1j8T$^ElUtZ#}bEy+ZD^ z+XCUa9;UP9FzRN5(GhcKj+`^69j6BfnjC91!Q0Uj5O50xaW?o)sXxsa$vrw|OxP*akcSdjc26g<;sfHf{qLej+7NA|F`nJZTlDC%(MRG?LG@vh%I9Q$^}*=}71#xV2}`!FhJZ7EvjQ zqCesj?U`C^V%vd2V|XANu(!#t`#f+3^E1diE5=0qksbowbdgx7$6w;|xP@|*$v?z!f_H+vkTnYL942)63*Uy0lYLqqG?BJ1@ zFjL$%hhyfye+x2mCF;SQ>oNh^M;jM!z9M1yc5U%1;>xz4v-dIi(YOxBGJn6$;4^Mo zoEu`;Ey0a|HUu+Tpt1@W;Yj8&>+fq^V7F5L+V@Wt-+`y7yM{6c7F3y7Q!vKQT4nWFc#l zBcV3PLf;lSW)4-&^dM{d9FLoqq_1!gE|B+Q!Rv3GWR;v~7S4WO9m&UfdennP*!o=F zdVEDDBw0e}jukU*6XGInOgF^?$`-4C*dq>fQ~wI!WQz(ZxkO@~^6=_o3WT1Y9~-)r$6E zV(#Sug0)GhmtBp;7Zvx-a2W9?gIA>8*b8YRDc>w}o^#tZdiI}K>p{Qd+-b5nNakN) z1M90m2q|f>d=;CwVUS6yswJb18zqe0D>(24#ze%}Af-US0~v_uPz6W^sQpIUasGrb zyy7Fgd}FpNS~KlIG2eyzg(!^K8QZxA*hv+y*)7;UyWA8hb_`LKY>}~rAbfi-*7Xn{ zHBTlluXsSY$s9w5zh;E?SdWvB0r#n2@Y#aKmWBB`n{3)lxk>o9{$@yYpUDeyeMb8; z5TsEs(KEDZz419}D$AN~^?)5ZLRsXSDFfVM3k0mx!o%|oM`{|djfD*?%>zGxcPER- z9n;Hd^kK?!;g}fT5I{{1p*Je#+E{|qD93}8j=ZUVi7^z3flQ)|3HG=f_{o!Q*-6f% zT(b#cpk(e2bEYy!Q|1LwY^OEguxMsa;8JDxg?f>HPAfEz?o^!9#=Akfl|munt4k{pSJYZ>@^eUlw;{ zBtNjZ%I0Mnd3K~p5Xaf2V|$_w9u#K>zoY3G9LHiDk?LsU?pvOOmy{mX)1zT}+Mcn; zw9Hmtp{!v0RJEfPFeUdu(y&uQr^a!2S}1S}qkCX3>l5gLT$!5Ktsl1;x9lIk=#>wm}Bp&lhQK!^*%O*;TQe{+)>p|7FZWhlWnXa@MOy&KC<=I z>CFaQ+Y`q*lE6d);^+b)8>1r$?Vil9PC76DRM^pF{8M39SCZv40m1cpRxh3X+Eo(|Yf}sFC-ajJLnM|M5^!p<}m*3AA&%lfx!@ zPyt-ILT=19$c(dXge>qum(xtExB~xX9JuH#KC)Ro?GL7l6)d{%UZTqMnIwQ!y9psJ zdfj?Y*x+nm*e8sWL}E#)ln#z(wVqHOvH_8^E&mo4W;px`)jIHlWj=;|JLC0B}4are^#JrXv=8BweDYA8Xd0@HZ!!OeuLi^f(iI{GU!Hwz_{(ZvN}P z=`a1)vA^_R=lV<0%DCIkKDNz$`;B_$-~7!f|4lsQzsa5Q({`pOMr$^FY;x9P^Bp%V zRI=yUGuyDuNy$^SMoijQOkOl46cgu!#1LTU4;u(n<_ePzc0{CE1zYSODnK-1(b{ki zg@?^uV5eyJ)r6B#ugjhd_UY#(>^)TdOvW$f$0z$1>6PK5e^l}0;`aYBW-js}E578H z#0i@9>hj+xaFM{zP`>_(~YZ81s`LY#GUy;z@E=MQwmM{`?m1 zwP9NTgIBroMA{t)7Xo3n{R8SP>`XfEx{}z&t6mfze|tbIhbQ}WavD3I;bi5|0iBao{^ruzw?SS?Le|+8jHk1RA_XpXk4fUu%ta&ry0N}wW)B1EQ*mVAy zLt(NRxeuA_^An;Kvvh!dR-1JWwfDo=c(9Ct%AqK1#GuAwF{f>o<}rj%lgDD(D&sbR zaIFzA-Sr!xp%-M{zmxVG zxkqy-rbPVW!W!b?b(+VuD~tIjgk_6s+F~|#9Q~X#@#1xu9;mh!q(4|-W}?JpeR0|T zX--^=6u2JZ$_< zwy;o7)}DyD=bT6P3&L-?O)9bL>#lLmvGNKW=XU-`2Q~%1J}31IAANg*$%@SKfHDX^&Da2jQklKe9HkXPomkD9r4++Mk5(OtIfz7hGA@r>iupc~_s)(v zxyU|Ff+HUIB10t=mevlSR5Ml108-bjF)`Qm;vB79(piT~aJ0>GAeYR-p{*~q8Nhe% zZ|E15YD{|OgdF}26f$VgrsQ0UaAfZiIcr6_3^bbBUhG9;aOWzr3Kn4R2QnBZ;f%8P zEfm3c21sHY9E5zwS7g#$_NFPbt{>h<9bI-N1Q!wisFvSf1W-F*wY8%4e=#I~29Y$+ zM;F%7!Ls;hFI>iH7l>q=X@#e+&`F}S@~oUmP+%Vam%ko+Gvh^St5Ocp9wMsF@73vE zUGJo?W!v1NX99|khSxsx>3f`65?BDC&OoA0WARW$Ef_r#q01H-kn*onpC?C?I>T=rzKN+UL;o78Ii7}#Q*C4l%RTrU+?-)j*Q z16>T(q|^7~8Dz~i$K10{FXrqKSOiOX?}9l|*;61^u)z%cHh4zk9a{ylFzGI_06@I> znTz}WKFf?OW9X2_40R@;w+V?uj%M*t0k#j3I*4ov9p0yVb6Rd}$6c{&!$%@VXL){7 zUe7j5F^z?-XY)qY@mWEUb#a+BG{*`TRo~8@QFxFBtJMuDD z{1@aU> z$F|_6OE&7x6p`*9PWGQC`>%GG%epGt|Mq}X>dqDT2?IhyNFIBzOo8qN!%rvfw|SRU znv`|}nc4LEF4>{WM)!6y-k;2`5@|3Cu(H6dpB63=iIV(`fVy!ScwlYpvA35>>0|S6 z*Q@Lndiw59Nkw%iz@*o+BqP^8nLOXqx__gPhjl-GMOQN0X0cpEp;W&~?za(|)Yav@`~6vo}(^T_DtZYIw`Apv z1xq#*sURJAXTG)D{YIU@c+Q(@kFU^{c)^x%+j!sFQQtDGwVe2<-U4vm}a7b7B6}e3{ z`PSM$jzqhMO|bUZCB-3K*PZUXO3;a6AO1za@xC&7>AI)${9<>cyI>nBLTV8u$`dr} zfl}c9If>q9)l!Fo3-9`e3Go%csz|qg)G{;E2Xi*GUx6(#j;`yOs?GOdjchTazetQ4 zl})hOP@n{dDRphn@EDh)HZOA4Z=;qz+J^KEK{UY6woX%vptkF<9M3PR71%0_FhlJP z&|nxbC(_wQessb1iPOlcE1yFj;S4N0AWvL7l-fBQ*3m-Jzt@$ZlXbBQCEQI?a}}#( z%5fn+pSBmp^kFUtoS{^b)X$Ozg-qH$%$EItZtyR&M2Y*Uf1 zb-9*Y?F3dz(2U!8uy4hhtNjW$hR+^?#IMjR2)FjU=iaP6tG9vHN&H15)0dag`430p zHpuVn=bL_$9{d?yLtfX~c58b0m+(*Yb4uEnbIYw!2a{vy>Q7JDv1H@xbMVZxP{_8{e8yVTVH2o* zY^H^&#tQdg&cDLC(>~pwi8C)Ly&?CpWAWr3u8R^}>PBT5yy)ylpyGxHrY|N}OX=Z; zj;E5;o}xZ?i|;OyMmZ>)*3*TtrV-YTt}u**Elkh)OMDbjEIh+WaASpQ8>M+ctfk0!1t%W~K z)XDfw%sCo&PaWlmEw%c^+KTbZ1@3>j6n7^O8?Su})?LV9^>er@HCbs%W`U_pqMm5I zG2e{j&WMnJXa1#U#V>}XVRu~VB>jc#YKT4ep<=O)QZ)?pJ@etV3dzXj=xydCX>aV| zz^3xyxTmp4QHU-Sngs-#k-WM_(4e$@(<=NWg5N9IaVE_OiI{5naZ5I5(}WC>0cQ2 z&0Ps;CDf;=r9mG^)z0alhTn= zaoqmc2FMQMuHEXRB*7sjk5D94E4)B}<{4T6R5PXV%aXSF z$A~APBEWi0^f#z79bIrVeh1u@4GT!9?Urqeqq4zmz36zr z#aMWDc%r^yKT$Jh7EDiK){y-dw3J!*D>S2a$wC@Pas8*|jFE*|C!cOVPKwK4q1K6U zqlgJkxb~C{F0+A!tY?!h?maztO_s+$+J01U6hyiS{o zd7>puu=0Z~2%JY+9h9h4WD*ZkO8IkO<8U_pWefW1E08AGJ6W+~7shJfo&tE$NyE@z z%w^lp_;+P4Fd{up->g(89$<^TIZJ08;%o&6FZl_o%#%uIvT}jJCtKp5R$G=#6lI}f6y&O6wPm|(JF#Yi1z~+5OA>@9LNEEMB z{TDDf2xZ1~)!aG(_ z;ay7CfO1t<(&`*m$If$9{Zy}wTyiZFR}qN;#v%OrXKxki9A!-b9P}(iKe=F$OGUE}X`Vm6^_K zxYvazo8QzK0-1<{BaYyj#lC6r)r`J0rC88;5WT56a0t-k8K^=s!Ow!htD2q{S5_4b#>GnsC|`=yNE4 zDx!I8uY|UL+}R8J;+aDsy$q*irf#&|YWjXXE5H$(ghhJ-X#fF8%(x&58t-SDyRL3i znUl^7w!;Sb3tD~2`62~huR8Jl_lQ4YLSWX%XyBx=Xfln{cN7pU)L*1Tq+e9~WA3eg z2B!UjlN`#SMjp@})YdMmVS6sgWG-Io(2krIm*hWwzK=+f3r!Q-;u*%!DH9g@{6h|o z+od7uQ9xVJF%c5P{7u^+qyiv837mP1{(Wv1HD?n6%NT@vPyJ}3k&W%t=D4_RO@xlHEr$*6HzXV7ahM%hdO(Y7 zDEX*#m=x;>r*3z3HX&&}rtM(Gd%Dz2AovY}I^JnFyX?|WqfniYcb7%B-n29or-eNf zW=Er}v8cr=XHSb&l7f8DtEefk(DA*dTT`{|Wo*sk!fC|X1| z23#8@$@zStj%@o(to<-JUNz5)OO5f<4_m`5d>CGr0ZP6+n?-qhjj; z%m`uUpf}kM8s@~43h^|#T+}&jdPhIp?hCyA8zbzNr^RfpA_sVuis(ZN<8!zTb+7#o zdwogn41F90N~c6^ZF8aT(?ShJ(aH#$JlpQfPHNacrR>2TsM%fffkw)vn4yc!8k0`P z+@Hzl%DplPcg~&WIm958(rZl0JmK~)SE311OF)}gzSJ2Mm0&H0zy!R|rC0k?l1KRe z;ZxGMRC>#kXprUmWph579fDgACMyr-Lrp`^rlcm(MAIY}7m2Q8k%16Q zq1+gw0F|h}*uWl}_st8Cu$MzZ0Qz9>>gtlKR0uP8{$cT^xlaEgs-m@%kSXyvG=@v+ zzQLzkU5s1c8dCKA&sIw@0mao}euUW@J1d2QU=Pj?W9O3_c;`M@w#AJ%o0ymwp;}3~ z&8VT{H63jo<^3O$l>o*hSIogmhY{Q}G8v+gRP?vP960$Ml7j`knnXVeB1Wt!QeuOMTf{(tQa7C1~0)2)cn zY^FWMt;m@I%DX~WpcS)zKTG7(hy-D|Jy3X@T_Qr+g16zrFUV{3b;4fzr#t@M7OkN%LhEYC zLB1D2<8aoPL1>t{kJ&kp-&QwCG;|YlaqPCPP8OdKKv$nd8x<)Oz&qO9#BN)@vz_8| zOtkySqCG}Tfx$7*V#8&%F=n?bpZz@r1zGu^|;G1PhnEbG3a5R8!vuRvX>iXdot+AmOkF*mHgF)hK( zj%;IMw`0Dymb`(@k15$T-Jnom+4$OC$gBSiz9TMNH$5>=@i*2-CS38hZVWs8`ue0> zbDV{J+Bk^awn=q9YaN2$_Sk_QioVp`E>kt@)AsG6oZm#Vl_Ps`ce+ov&Q)~RNj_cQ zs}j(w%SnG(CYpK)Taxts3`+BPi*4o_kq@_>$=jhVb)sZf+`N*mW%61Q+IE&qQ|Rc- zxtvcH&b7KoUUc@*gK!@t?Mtu8+eK1;g8KO0h|9@V?;YV2#FCB+zd0oFAp!fM^oypt z#(Q`cOZgTyO1%{K6#Q5}m>;1(vO@|%7D^&E+3ch|?XQ3yRLRs&GAc-a1Ps!WxXLwm z|Ix?T={S*U<(C{Nufx!M;!3x=9H4?P&HV<9aS%BHT~q(U0oG>^0?7Hbh&lcnB(R|F zUWaAFMOyvcm&kh#m@7FE2J9!0KYA4zm3eJ=)lY5T!-A&UncD)helNQvrhR-IvmUcN zMULd+k0LalI+2)}AOjayV8R-1D#4p>cGLDty0w(tt9QKx>s-76qeP`jLA9PwGxHgC z`v@==0FRNJAp(`sxfy++->aK8wNm9OOYf7_d55{=mn}UX@VPJN5*Fy?ToP4HoNy>` z^PR|;X(5Vl57qf}tC#JLCT&Ja!pGRjYv;CAm|;Z@rGQK&wj4yu@J4f}*Y7q&-TXHl={#l}i-F;Te0J3?-zp%WzBPx!%ZYP->I=3R-%T!u(`+P1qfW zX>`rWW?_;_8?jjcsh_zkh}n1#Ieyez00=+OLj$T;yGLzBCO6+FkE_QShq>Vz1BsnXONsl~Lo5VF^qCw)GjY2|BQe6pIp*X3cy7om4d*lcG5l zi1c;sIu$Urm0wwfol^V{Rj?cRENJ>#P8W)J&fD-{1sFmizrI4=NcKk2V5Wyov=PmWGzQD<1<7C*DjRgRq7 za9Pzvc-c+rl#(S<${~^qW2E~Sbu%ok%!C*$UU@CepkH+Lvp@;;MToBJLWiz*?Hcd~ za)A3d{t-?R;751%tvs=(lx{^k7MY`Fz!^sEKR!Z7W`N0fh-mLWj{sfhyy15(_^fZq zyR%3&8esI6)o;}kY0FFN<98Rpg;xYfEL8DYet<(8qw=*SG!55xkPgjN@EuM7FXI7? z4I8`g{OQrqx`101MulXaMDMOd0;{CD3{v8)B|DX{r_O39dNesTc9B(<@9}_YN%0lL zCcx<&+Pd(pEKDHLZv+fPMN4r{x$ZfW74!^k{+y*-_pT&3cctZkTQI{}Xyuo(83s{> z0PT8ERM{}8_ejt;rxJ9zO;<(vvu)Y5HN}dnEJKQTolBO(Ty8MehsZQ*v z7JS^u1~O9^wCeoi;{y$&g%iPW(iX}zSr9pLFe1Y!#|xI1KB-{EcRp;B!NW3(_i#Kr z{{D<*;WLU}`N67c>S1xr_u{VWbviELD6Wy!I+JDc4xRPV{W)`Dvd8UoPx#gAr2QoJ zg}B8jn}o0;=aNjSr%CS}Tx3g6UjcTa8D$Y4$|&~(Xx|E!*h{hp1opzdYc9n?QtgS`V z`DYlgIT4aqkj6!|7Z(id5N{B_qSmY+izeu;lAN(EV{&TYQ4_sRC;LhlNRAL8$#=ho zzUQ3=DlNUGr7PQFlIF6*%sv)XmU84S{ehr{=EN}B#tz*2l?yqNXf6mphs$dp;6e8p zxkDxZnP7Cu5y!8c1skzEHRg_H9PIKX`W7n{<%5F&v)P1q*4+mvdOPqK+kmjDH7$-I zMy#rqdH@e9b}_(swq}!)D4ho2*<;WJPY>?R{7!1N<1EWii)g_MQhy2rNmw(3tA;QN zHH4iSh!wX3!F+9iEy!m2eZ^ipcLf++b0~AFq&`VmxAggVb|bn0)xdvvetrzOb;zS;3E z!Ca0?!Ig9uC94RMu;O;QIFeg|J!i3$ZS9GJ%`42d%C~x6=frnucQ-~ZPtCQ0N2=np zQ}@9P+bm08ue}mpSO?IOb{e?3Kq16b7OH=786~6jWEqt0!q>aO+owEx;Np>{G-BTJ zBK)Ar-E{NGyE5*M^+j(=SCjC`tq6~1>@BoO!mg+L$Myo|qTKTtipPlihRlL~ zQcAl7mPBm6K}(vFd4&12`@MqbXi{w1jbo_$>v+VJ!-6NZ#;!VrL!DlPzd059*@75k zVmTLATdd1!B1twpipqGpDrBb5H)b4Tc6l#vN$)A^kFhI;k&*0Aq;A2Vvg?g1(xT0G z?d?gmYg@D$>0SIfh-N#rjVQ)x+aSo+s6iOEd>bWUlaC?i#sCqlZG-)F0YH8z{r;({ z6q^+kUFv&|dOY99v+AD-d}BN4zXV|H_51MwOmI-anREse2PKI8Xw$a6&;AC)N3sTP+*vBZwHi5Qv8HzLGDf}MY|T;?HI zq^rshA}0DLTCr*#c6fD&bkfZekdC~NjGb9X5A=EA(Cua%GQP7}_78(V zYNe9cRS&6U&2D^P*UBI)l$#%I-7F>bXLunN5VTGQ$fBsVMUyV@!-y0Zxiq#DPm4?H zdA09OcW;mo;I|@1R`&!QR{H4a(_IoR-@5Oct%AcVxv~ z`^fG#@c1Pz70Rpm@$?pVD>9=tDud zV{@9`)DY;(faDXU)X@-?|H}(VVazWJiy7kk70K_|zew=enBG0=&NVA0bH@R5RF!TL zXm?3imMk}I%F$~sQ9E&da$Eo&>Z9#NFinf6Cv)xdC&3O<1(hBWh$PCDE?hL8@S1lQ z<1B%;)z;cqDA!0&FJohmqi+ObA48-YIt8LZiUT00AxRO)eL(($6k2JKy&0>ye8J zHjiu|_{u+=SukNra<{tZa-X|P+iI&R#7lF0q`CXMZFF*%%}U*p1+l?~EYJ7OR-*Rd z?gOf-M?-wKM0Pk{p!3OadZv|YUHjjIPN-oVmlYe`zOhj#OJ=N(+`!@! zbD-7qS2f!h*m}mZ>%C4dwrmupg-W_|jbXHbuyJXf0xLA`rklGU-!(UUW8h1yf2lXk zJB_h5n~~b-Gj(ZHouDomLAU0OoWmzvBB8IK`lD@q%be$Iu7?TC?_x`{BOA5_4lQDv zyrC;p_E8y9&raQ+O`EUw(sGWMgkLwG0kQyX=b`wx$ZmJ3qO;7z{hrgMzjd-J8jY7O zE(sDY)FG)5c~|bD?sqgqrT6?Cz?aL#bbpP=P~>lDc~8>vSSmN_1J|EWq3o65*o>9H zxVC|s4mvQSXAhIgqnF}J(Bb@csp{RuT65AXm%44;*{wm1YU38SIi_BOg{rn^*u;Hj zUVF|v0JS}kaR!ajs>i}6C=;3cxup6ec6L^UI(pwG0Jt@Cm_86ZE%hCS({G?=zB7&o zM^8BB&_8=SG(h?y1N>Z!Q-|j?V8L4aYJp+C(f2MZRrQ7pVpLNl6n?aVUGI z)dE-|wac)i2YcB(Y6fU0xbCC7W#dc)u?Qc}p3|lEv~UDPvL)*2QAiMb*F3txCZ&Y@`i~V9m(qp5s?p>?AmjxJkDI43w{-|ajZ6Qe+DV(M6*BY_UAZf({c-dYo zNSvq7+jbb*?Ms!cbU7(7K7B4`yXOD*y`#vs{ALs3VX>P&ohK)|z%bq(AQL%vtFHjH zVfGX9w&=i~lm!`B_9B2i5j)`QI=k6UpAYQOd_|TI$b0tCmMs;6;SdFflS|OzR*%!6 z91$}3-aSI;;$tkLbPIW?`MH}v1GdEvG%MOj+DnT)eK@icCQI;V)0bxpF;HE$|2!Ny z!dfjEy{Dw!b%M*l+dVDp!8tr^AP}|@xY?d=w%|*YE<@uQrnHk=&(-XK!dR&T%&9pk zvw%sC>gRNwZVBfz3(_t|injmSiLx3$Y_t;;&EKnvg9A3l)4~RNgWft~8AA(NNclT? zYxP-et8D53i=WNCuL#@Rdro)P#dbkLu2P^cx{-7+KIQI(K{GF<$L>v=+kyBJR#Zf^ zMA&&@J_hU-V-8$SCn@hw+G7aIcQ;-+kY5cTsF^i^C8DqvmdZ&c0Y%|^#)0Dibh zsv2)u^Wp6;%#^gBI-=cyTqSVWsh8Ta_|Qdu!h7DL&jsd#rmf zP@RqRw4EMogE@t*>kQ|Q(#>w3&vg2JsBT!*on~@6)n$`*l+O4cNXiIG=9cv*iMck*sHzMU>7APb0EXAn76Ahv&<5^$HA0 z->0Y^8AtC7>)H(F;xZ0yp#4snHkSMEFb~a@eO>{_&iNBAvi|~K`hL|e4-<(32s++I zLneX@3XSBw4B`y2vL4xH2acl2+mmE@^uE1G`V4Neq3cDX>gZ--d~mb(AWx+0j)qhg zBsUZ!@~00K*D8Jf6-Xr0=A*qN1sqSJ`m0ORkf|0xlQ($&e-(<8-UVK7PxjI~Np&q5 zwf+C~ZJ|W}0$(^lu7Hnm*TV$Z0elt@F7)-n+Bii>HR#x|J&dVzV7Ch_Less$c(RK4 z!!wC#X@9=OmPQQCG~b^rlF)X8OhraCle)I@eQ434!u|41Iy@zF0zLmKC7i}D>X00! z58Q`@7cSYo4nZe zdM6NJ3Jf@X`E8lQ(F@ESOC$V$t04WX)k=OzR=EXVXF;3`A5Jv3TT zwfjdAW4e2TpQG~=NXY75l(vm#urE0pq;21DRY10mVGPwm_Z5(;sB@Cm#l0!-0GnZs zf2^QOaK2)w@IRqt&GM&P4iNwoEvVMQ1id;!v!%6{Ogx{?GsZKmM=(<-h*tfAv58hyV1S z{=@(MfBx71Z0;3uk)Zxt)Rvn*e7NfrFzG)n*2ygfcpZ&u)8Q}Q70-Kk0+kVK@XWa6 zz;2kitqKa3qmc+;zg!S&h7bc+MuRLbW( zFl{<7!bOTItzk&hm9hGriMe`q9%J(^&%rq0XeCZw?CP~T;9J{uG2CDZ5SVLIAbA_< z`kmUBDL!7|VY0bw#+aI*hqNo~(PcAQ*Zj%J2R3@gYNA2b6ASG;KY~?8&79Dk46_hq+izwpBhoe$6^> z=|)F$M!vuLJYafN$nSvCXS!RBO`d?%Am6#BE<|hyO#G^E6X^s-1KM63@3nx!jJ)L*(n%~i+ku^LG|-Kt=A&flo?(vRyTNfbgrOiqI5I6qY(L*YHteOPxBjrIU7 z9BYNZmsWEUK?3yb>){KG3a>P2a-D98)QRRT>aRXJ#k)W_oO zH@orExYa@Thgf!Q!CqMJx#gVqtZ}o7cV}3r8D2LjnL!(%7wBRhB`4Vs&*REP9!txuY!D> z;+^m`%>FYq9uM$b2oV|iB$)$Yn1$j6lq@!qguypgy>~b}*e-+gv*3{%Qz6JK=l4h# zq44(!gZW8l5iVXGB2>DGnxnH6bq@6yJ2wQt3L!YFCsd`?l}MBU6MOM7NY!FM())9j zp@8tiFBX#3o+RPT?L?5FDo?CMZ@-##Rn=OG8_{r4k)aS}Vu62M-C}DD{u3`A53V-w zK!?sd9)Vrt2)!3>RqAIHN(fL(y;*{)^rU_4<&NVkR6Avenkc^N2GQfhKa-`phezRT z2+nvC3>VKM5itUbcDydu>WW4R_kMh3Gen^(jKFZu;T{`imjIU(JD*Sf{k5dOpg;=s zkhm!LeuPj{&cNo+)?s z>D<8HiApGdCb2W$<6S9MGG34ugyqi=KibcDJ#o%6J-G@JoBnEcU%>|5-}rHW-Bi{e zgP)6_G|z|4^=3J+IXaE4LUwpRE!Z}<@Oy})uOs>(hK!x za6DHW1|0y|laGPf1Z*g^!B2}}j`wfNkonpw(t-2KSm1>l51RH{igbYB_$_e-{;Ad} zcp8~bRy%V1Q}Zx>9S8sL-kYP@r=jBHk|ip_Q^O8pX#4W<0ZOjrYjf(rshjI9(v?8+ zj5TxYJM^wyRYyErgR1$c7Eez%PUumiGJ`b>c<8zC5?p%DIVzVj+i!yDfOG@$!{cbH zr#~qT&9y+PwT1LNS_di2AVyz6R8MX{-{-X$?YEHDk_hqTsrgZPJwmt>uVtM)Y0P6H ziGHfGB!ZqOQ87J#m|T`;Ke~QsAsA9$-L2$!0}Yw=Gmr<_l3#vEn)hF!!lOTvX494% zM)hbd#VTMoNPXGcQ-Sj?XZt-n5^_Jw50h#|ojB_0`Tr2Va016Raum34|?&DDTQUV$=RwW^q`t2@Dhbel}Hy<-%RSt2HJ zz=^#k;~HST=No~{e2h)!fn}Vv<4FVM!K`+ht##4%+`P}aOX4Ir zr!V#*NhR)44l0&mX9FY@HoF=b zx3yV(N|unoepa4t-=K)WanQ~JKn38RJI)#Oc$^P~EF2byTn}AZ1>{T&zS*$A@+@)8 zm`=qA{zi5BrRW@&+t<*M@rK%4*?GGv$b>aJAh+P0F{jR!OiX~K#Vh$^&NkIJ05*qD zP_2sU6-jpvQxp&i(Zh+&GfY=sq!q}!{+`#2$%n5%Q603akVNtxJqlsC9EiDCrDwYU zJOVp_u=r$g9qN{pt+Z1qSLX84=RL$YhkfAM-qV1C0}G-o`e>el}3a*-PNMToZUu8wst!c0B#4 zr0eu_Iw27)}u9m6-Oyz7Gtu$m28qXV{0F4lSG`%Rii;@da;|$A7X^1PuheG87kQ32E3NdtzsZ{ zr3`esQ^)J>Q36jR{(jlj{bY;$q|2EW>$E4kIgBD1R z(zzoPH+EmAixuU3{$MNG(2PSO4qa_?sOAwWh4b%r)IRRiTI$2$F<6o?Vr3S8TKrcD z=gM?)p{fzIU)v|1q-wv;fH}iG<;wCW|0^oc-OMNTEzL}5rI)YMeFEi% z#e@)XZ*$^d5f5w+IxW}Z@n5Q6T+9i;m5l6|J+GeqcBFn6q~gacJ-uM&%gId2>tKpu ziYafg=Y)+m@vvh&E) zUr^16QJ$@!`fFO}!>zVSuNpWFzbityo$T~}cZZVpS+ZD~?v`z%fkWHBhX-YrWVaJl zU|e7^a^dYR;0F10FzY&R+ARDXi{giU#MI@c`7IG-Dl3=2$R8II)NpFZfsi3KKiWxu z$>tTNw8hBV=cq|msxGtee5iyQej@%BYsg7^@5gAwswsYM_ZMa08)WTxbM(jeUOunc zK2jp~D&<>*`~#C8hyBFaIPHZ+6EbN!Z5juzo&*L_ru<~yED zP@KhiJ9)2X^K)=h)wZ?jDx&&7+iR(WyMCK=Y2qG^2~??0A6uRc`)!=@FZX4qx+U|K zXSbp~5x$8cTcUT@F-i=w7LEEav#CzM05kIb4rlCc&CF4L`8b^u%vYZd8>97y63zg@ z&?3Ct@|!rv(HQaZ3+b%R5H=wcs%CvQ%xPpTf~pF`$PF|-S@fi3qzdZIqb($|ZL(a# z0o<{#dqbo7WBru~T0zbq5=bBE+XJeuyB&oCAXmy81hEw`Xa!*j`J|Gw1z~2*k|ce? z>kyBW(j$A3QHazExG()y=^Q^%vv`V11XM$D;@9^jdr7F5!9@qt=Kf4jW$qo2D#A2i z%^dB0%6qFUH7=ovy|-cmq6{H(ebo@!xG+dsDF6$<)${+enNKMcbVh8VGz=i~_Ex%G zli~f=6+`~Ev@*68@w@3zxIHtB%yDV=1a(mpEa$e&-2^e*ma&Sxn($*=i|J-pNxZcF zVZ((K$IYX}6a)ZQMBq1WX6ga*VW02Mp3@*6A>X@}JRMKEG)K%+;nVW&w*x|p1DIg$ zj*;e#{%!RMz9N%d_C;?MVO9|Cu?1+YVf=bF7z+>wS?!@6e+U_~H;%$j|W`UTN;Eya)3;yJ^ zXi?`mX)MUi!;wr|``=0l?D0wN&uquX8RqVi=dI-FJ~=HCn(b|f4%bE7;y7Vp$NWp8kgFV}dz4edq8@@TqSLJ0Xv4A(<1eO*mQwX`=s%LT35FYcrj zWP_Ck!E?#wcr{zR#zf(4V*JT&`E-)LHnZ^nkaIg>1gnrE&z5s~ux%#PCYVj#nH=_O z(~kTc9?^z0-Q}=Tz1&z>f%#)QLTwQ*yCi|WtIwzss>g_(8FmKnz$#-;PZcT3MF$7D zXU?4b@19j!9)prNCg-1zY>kk?+$I&vqrH{vvYY2|@QzZno7Iw|W7#pR-0I<^fvTV0 z(T@CAp_o2CrGsk(n1t5CthEZC!ySS6^1p?9UnnC?uz;d+ZU0B|d7&)2+b{J+&eu_B z9=%N}oosI@dEfu8Pw?;lMxWr{MSX&Qm(wSZ!%Lri5xuhP+<%EnPuu!wVBvCK{!Jf+x&WTo6|cJiaoZAkdc##0kal% z%zG#8fte|JeD`qqaxPBBtp8$`4^o7?O0iSlo(F3blk=ry$aWgGSle$gb}2frf~~y5 zyMu6Ef+mC7?|VBl6Bp?LpuOqJI5IGBqlWCoH@g^aUrUGGwDaTzs|S!5TwwPi8JQvV zZcf?mbJ`+hm#)NosL+QGWsMxc^^czbog;RVj(Ry_+9QaBsTZh?2DZ~$KAGpBkM}cs z5N7+Km z$Sio`2P5D;Le78qL%0uM+b-c@vEefmMX%ylFdHj?N?9=U732fFqr;wT zZGaAB^`rkjE6QkKgYG5-S?H;C>M4ajo6!pYMn&t_2JQNynktu%Api2*i=V)Cz$d6z+F6i*4)qNCFHfERJ_k!2L}r>a%}l58i!miKn2o3p|g&4Zfbnt^5zw($Xsy z@VJHk)ImMgE^W-R>z|z^N@~f=b&s0*5GuiI-b|OO$io*dY5sNsw@1U}+wYErlvk=J zt*@ue$Iz-066}lXYS@JvTqtIXhclf+i8J>X0fe{R1pw!!2-b0Tsw1=`r8IS>Eo@&} z2ZZmXi~MBZMDfQe#T4>{dl{W>DuCN`QxUAOJ$CwQJl%K!lO0{7C{hJ?ces(Pfi7*P zb6^*Peeou#TqdnPktfXUdo*+>)(t-N0*pnKHP+rZSzDHiI6Y}0K+sPwuFHKAq7S@| z4S@P|C6kw1d!>~-dwr4RAAVQ!2s!_)-C4U8fND$n#p(NLI=}2fv7~7O2(aKDqe_G^ zqX@TiWe5N6A2N>kO{k2w2A5)OIXPcRRwM%i2CGT8h#bXeJb69@fv*MTq>%C0Tt(7z zAgsiasv4+6$U410ByuAfFlaE~{2#>pu=CrQzrwF%8`o*AA}9r^5}M*~h)%3H+&xFi zMMs}t7yFP|Peuo1A~~@a_IP#?!K{a5T~ghYPNMB_<|_&{3cum97(P*+%;F}eu zm)6*Z;=m`8B`t7OTC7owD)O>R0Ikuj@u)wl-CrU_&tw|%VCm_Lg5r?H@|i<;%q$N^ zK-3c(K9;gT?SyeNJI$tH_3**D0SVyNWPLY1xt|y1Pe!BGomBpOKW2 zQc}O~f0{ga9KRV`q{7M;MUKErGGi`#OA15JiD^ca_wd?p;OW?MIF=?Ns^Rv32wkl2 zB1>ksu)m$bRujrw@7iEu`QL1V&79q|06L;U6D?DirIp9nJ@2qLZh}$0LlUl7HMgEb z)vw@(=69y&2t_BIe%c&bWKI8jK6#j%mWb#pqZxO4QPN=!SKyy`#H;8+&g#{yew5Xk z+1jpTKR}g!^^hK`K(K>cZV2M=#BE<|@4#8KXzQ{oKXTG)P0u@av!Cxpcin81Dogf4 zA8`3C-9#&}Iu4M8Y^3)UzH}Xzl{-2pUI~grz zN6#}(K-=q=*OD^JF}49w*&4S)YzZTDQc6P``!p?F*bD5tZ(!R}W#KFG0EQ4tHcd`l zY=TFCUp=w$%q|B%_C&z-7qDrhzv@*s@4_liKvv)kEdLG0CG6KTkEl^}=fPS-uoG%J!zDcy^ zv*!*>+?~}D;^@cWf+S00U-Bn4Tzv_PMy}tqC!0~S0tp3euWGPku2tMQ0L@ZPJlQEE z>zfW)A4Be43h@-$ITYF)iUp+I6gCEcRdxh;zknp?-%B7Nv#*=moG%ylTkPASTsgDW zSbBUD>h)%dOSi=Gy^5g9XCVCwwS)o$PQhi}rmG&;8*pqM29Xcc{5@rc+30M$&#gJ< zVnGWY^_E;p9W&is^;}6mR;EJS6}%dvLtmXAwzithYelaF_SMDc1~AKAb%0QN9=-d$ z2Sx!FByUakHq6JyWaF8MQ9M-ZM{;~?dnL+bu^$?KS2Jgh+E8C70zAfHBs1RLQoslhRaCe+o~?jhr&MtLEr^cCWre9-K6{;9ANiwhw;Hp4hcbWnm`Zr_l;;d!dh z*{y9N1K6uIFZ?+``n-pas!yIO3Tz6FndEj!xmCxoai4-}3pUfaUb=Z|Gj{g)?1IaC zXvC*ijC4c$HM{tjohztQm(}A*lNG47o%Eo^P_A z5l2Z!;(#NI0>tRO2oJ|jRYsF9ntHCs7MKujaVPkkqnnt5{IgjQB&^s7S-K<-)I znzSm03H6%gSGtI2KwVJU0GUv*?b>;>#lv*2;`GNMTX}T)*g$uQa@+m6`Fpk_Oy1UPBKcqj(M?IM zOHTpKq|GIHaX+73cQJN1tH=Fk{#R3oBSw&z3-`LXW?`M1-3^4dE01(;0rJFFmDAS@ zwhlGW(E5kes?&_^GvZM5)clkEKknv#1WlPU?H-v5a@GPr4_z#Rq=; zMf2eSW!ZUz0i^PHhHRRLjFmExX#!QZK zYoc+-7&am{TT(twKH>fNwo0s4YSqTO5Cr^YXt8+CmTyKAqVw}F!u09Nor;fQ$#9w$T=1>tSxcY zi~vHPJfnJeJZ>=Bw5ek%5u){dy+$`~lp%xjF!p4)+l74z|1;Loya5$vGz_B_5Q7 zma~l)C8KcT4fHYtJ4*3e5xqx>jHJE_;#dpo5K0{2wcikj-z;_zvcXnIrw4@3{)Oi; z;2WSnC_A{+`n7p8Ei`O20AJ+f5CzK2j-eb=p0xXFhC;NmF=XTRV-}=xr^A}PaQo&| zZwvza5&naPU_r$FH4t?Ck4GiF2OMy2zV1m{xS2d0PYc`M8gTA+?Zx)?t>zXz)0P@Rku% zbU$n>pY3j(NLc5?t!d#1%aA&2lWxsL!G53fjXPLi8?@1Zg;Z%_{VQ}DChHcC0Y>Ze zxK!9-_|=1Ft=ZMwjY;a`~Hl-ND>VcXv1C~B;in--alYX4c?J{ z0^pmuQ}F`j-Pg~LBZ()lq28CwKdw2#_el4TKL?;sql7ApxeuTZ#7b0)E)@f?VA=Km z6=?s2u@KoXg~0nDZ6J|Vp6(h?t@oZ?5MV3~1d^qjgDQ`dExJ`EmmadS;cOe&x`%mL zKEioc*3I$8Xgq^b=?`u^7Wh-z0xmQun3sDB%AMc1gYeUoz)`Op;L4yn1N8*`B8tkB z;mj=I^mssi&`mI4G*;zFMz){Xmjpo@0Ss0th2ZB;r>(Mg0FoYplwKm zprHr9iYTK9|H`ac`q=vlyfh-&hz^qdKTdd8P2(upUYU&tap`GIg{B` z={|gQp4f6AF7TrpqhvUbIUGdAXjdKj6KcDwI$kw0?1Q!INu{4G02dXZ9r^c@Gh)~5 z+NuxJ-D|&8{&d{1zKDwZ*1Use(o1zHL?S8Az6J-?k)>NLwp1@qj#sDGo{LjRuKa+A zo6tI4Y%y94Jvbh5GZiof)P&uLJ?X&BT6b4Vs#AQDN)}<`K}+4`tj8VMQ=68~r{_Zq zV7V(5C8v27`6X4vNDJEe3dPOXJ&n6wY*~aD+oF}^QCGE^l;g!%bRcDAEb6P38L@^F zCGM(g!-hx>m|9T~+magJ6%FaDvv@Hh;t--P!Xm-tE)D@ztgib4pQRUb$@m3;AGS(i zyE#7qWm#`5RRJ9^yRe|c8@WMr03PnyWh9LkX|!L7T?6v-w_elv{zVb;z<_KpIuK2h z$Y?{yivP5Y6^F%9ySa?Fh63QFkKHV=UN~AqS&q_!vm$i+3GugZ^5IL&st;cz!A0VN z+8MAsW*avSK@HK~o9?`(?HA$yGBGkSm=Y(O;sPwv`K#&9;Y>J6`^)Wl(tD<7NC;^- zNxt+sdz5dFlCi|Y>IGi*?*ws4X8|oX2%Si9)O*&&d*Q}xonQ>qs#VA58yI&c=VQbv zavapfYjJDIk%o_dS49?aLV=%Y|$W(e!xm5e+_`C`Yj6e)jdEGE(^(1 zS9LsCH8DKy4)ngp54{WGbz>(AI0?YFJLe^rz)6~y_WKGTSQJlSM3<9&&vRsp`F1v%r$CDW)m)SX~+-=^3SM+=H^(=$Y$2TN){nbp*tFe;1YN4`An=yt~)%us1W zuMABl15dgtY{JMtR$L)T;LH<8vqJ8{;k)cua`RIgNcJhR+^MZ3KbUd+^I8QOQu5;i zDG9U-M8duaP+_BZIB?U|Z@DOU!^K6iR&mx7FE+B+bJ?D!;KxEzzW_Ys2LTVEJ?Y~B zS{6^6>SqOdaeqD%Q~CZ=eFnJf{2;sB(br`x)6F|2zZDQC?MhNT)@t(W$-Sfg1LOq< z)!!Q(lwXVljc^RFZU99gOe}ds?!g>JQbj(;pAf$CQzT)n!{q49!GJ-Xg^Y%au_p=s z<96Ev#$5DyTnuJ?MQqsw;|m>RxT4g+2SuL5dW{&64nsavJjrDk}Hvga1E(~s=rRO}0H}Y5y zH|BPUyb$HeyE}vz0!wq+i&D$Z`PnPQ+<(4rSo6vjvP%H-SA_q?y@Ls zEJ^iY6I8aEOG>|J4%cgUi=3v6LRKCC3MtwB_rp|KyPq zheA8KI|5*=ewN~@dn-t~+(piD20h0vdHjCn{LUeBFUEX9jj$@`?^Ynt8Q2gg7F)dAm44rgx)4__pGHQ=2_3rI@PG7XFOo>)mwp~(NEf@z0B2Y?R z*YCT7+2O#>gPh-)>*)53<5WK}ssFKm+@r;g?V~$wC9CnKoNxcpD(*B7?9x$T7{>25p zjE~HZIzpo`ypeZi8qCwUmn-rl^CD}nJHochSXm21@8e1qKw7}OLYY)~BxxHr(c!`~ zN0$ThBtSgy;Pku2m+3tl@@n1W<3ugUv(T{Ki6A?GhH{94wkj1rI!KK6X1ZL^M%y_8 z(w03jdKLg<9`dl3&DFC1XH?)`*-}2kC&T-kq$X?vPfrh~_n`KnpTCypCz}@L%>qR3 zF=zE=UJ&XIWs(AxoYgO_uiFJrx^L>Qo!yIm&X$|`jnzwRh&+rN>mi$vmQ~q~E+6{N zR#>0hCf8%GgVv2+uGcxO->Xm{uL-2Z9~aVC$J*qk9GUl#k)pWEjHZ{qL5xr$W4)7d zu^G@s8sjyDt=uKq!iF9S+UNqwHm;J^B82o_R;EjUwkXg!V+ zX$tDo0xJXWZD0Gg#?8W)yGXv?lM>@&Gr3p&Bup5I`-T%Xu}noCHZ z_Sj12QB4^T_Y`B3UHqY@n*qN?BgsnOB9|YZEF*)%7@VmQNI5|K%*)FzF754^6 zqzYA5ElA<8+4V^6-C2HNn#^l0-kKYO2269nhM)|0E|BUo@~>CN*vF6FBKZo7V`Q3S z*CZIc#EC1e3qouZAUL9s4Ek`EIIdJM;T!F>+0;1l9i#C8LMx zim(Z9aB`Bk@|OOLQOh4?dkIjV;>UmdGM9yg(d(cYds!xqHB@U=0% zLNL#gD?o7vMWv3jK`A-CjePRSg@qPS>%yhk6`kKB$Qii?BMg?8gGbCT+jAvz+U14C z59xN%!hY=8US|iin-U3m`dMJY)3bZChUO%}0t9^lmB7sV2hp*Zw{3oO7u|Q+c>O7D z@FyYW?e@3(rtO`P6}_7$^Q^*`^HS@c#9KBl>8ax+Z)Fh1eE{22#05~~sjBR#t}05PB)@LR0I=_g5sFYsV_9(N7`CfF z*hPG8dF0OK_b8H2(AtBa2nC_Mw#E zeD7{-vi-|`9OK<37214#Qh>&#+E$Za)z5xA&OXGu7e!gN>BVk(dB_^)p$kZKdYa?D z>r1t_&x9PdK%?0)bKx80t%&;kDJTRT|>c0?y<+%O_mV|g+H0BA-RHFuY+ zZBDB4X>R|iu=79u*Z=3A&|p?hE!-)s2R{PTrP%-9E7OzhY<_N1txRgaAi-kW+TscT zSjPw0IajZ;!*TjlK{4;`&35wi^^xw;z3w7v7iqMyNdXIjjSS&VSZaK%d$Iwtf^n1A zB#MbutVId?GVb|Ov1jfIME1iCjK*l&tQ1k^7H70|F<%rt`c{{6*BGYXwgHQVRhTr> z6{n=8JSWCs-gKF<`3fD&T7UX(@_r9wPiNmN3B5z<-w5o*Yd%a1o1gC|?1d)RQh@J6 zQldywAr`dw6h_h|SKK513EPgb$@Nxj1N#S?uV}}zt$H&4h{3tVkiXv$#qJtjx(bMN z3w}iBIJ4BA>T<#Bn7q~!!Njbd*vszQGpEE$sEKt_s772dtlLU63cI-9_HJR-mVJcz zy99}2#NJms9_*nCzZDnXw;h6g1a!j6G4*T_2-^Ynkuy4fO6p9voj=I}dS^|cXy@0& zQL;vz7aCfxFuvco^GDVUJ7=5}*v~$WBnRMbsL;soB{XrL@BOpez1y$c)TbL?Mz*lG zViRTZa`5?qRwoM&Ju=!o0mjFv+zZ*|I@sB%tEw`)dT6GFy0bUY{r-V&OU?)b>G!kI z8OW3REqg(hf!ZBdb>>ul0&)*vs#VThrbmJQoqa=&)wX#ntjYeBHT{Tf9UMX!QQ|KJjb2~}rvM)ZEQYh+xvoA!&Yh7?KK z&LN-<{L2Q|a3@`q0Mb$|8PR}(^KVOO5Yz=A)Q!|JXm>~J=^MM5rFwB`ary0Muksb@ zIDZVOLM2KGTFiys^WO5U^u3%Z26 zIJrrYQ&}!bpGwr+w;lu!9Vu11f)z?D`~Z_ zEVgo>P?1AIbCA}ETC6qlR&0i3gHktAV>Z!~QYr53NJ3d`^KleA2q@Zoh=e0VLn0y zGCE#U1g5$gj7sBjQyi9r;fo zNiM671Yn*P@f1^4z7B}sllA#y0wu=8W~wPANbVRkE3$pApftY&+50UPQ7@B*c;Uf^ zp6nN<o%XZi-M|`sJSogi zcGu!6Ls7Ot*~Bm?-loLZNOd*2sctx#WgzBu*_X^t5K9m0zVaJnuqW-S812h-a2BZu zzM*_Z{H``^Ie|&(4t5|A6efL}J@2SGFfTv*x&HR_SAQ0-28RF}%Lq;;<=ipVLQMVu z0#5|wGvk8{`1yy31#SIsD{#h6ra5fI6{A?OD$U;_r=ZA*h1V<37VB#uDPitt9+bzg!qKYR`Cy1w18a-6)c0&4n1E6Yj4>lt_`_?{-bT?7_Q+VYLlcp%&{eIk!ri2Lieh!#=1%SBq{DmhwgLmI+oigtOp)icCiIp}e;>@XJ&9R%WicDBb&c?~X8bxDkq~YgpGBa%Fz!I{lR+n;+#r z)zLLgW;8I5ldTN002c|n$+Ibe7y)6d`O`Rxo~PU_H7ep&{#Al16KnR?GPZsUK{wZ7 zyZVAX0+QHq^I2vs7=d}yljyGZ}<((kN4Ozd3n z+Co9Rc#Di~r4}CyJ;g0NMwVNNsX#0HXV0AsdvU8TGxJ{s2h>TZBx>x1857Z?c-q9& zh|;I(zjFXX9b3n~i@1IOR+;%^!Y%-x3sHH+2EeumfYqaYCZ1aHYmr0+bvOTuFV4S6 zpI)Xt=O(YEy$57A8ymCnC~7jjTsjMQTK5T@O=qaJZ zEM~z2^5AmDEJn{z7-+57%J`+?>#VnI?@pdZ6kw@qvjmg~fe95@$o<~jFXMm^=m^t< z1Tf7%cF44>f(x!sEmjP5r63^}vv0}WiC2aEpgXX@Z9c*lra?}#r@zAH&{m_PD?16b z0p5G408^bf0bziF*Ni)qUy7sv9>awr^)VfRBa}A5A)p9mR} zjD}yI4JRKZH^N@Dq}c<;Uo`@RnYj`C+V66!8iQqlTeUz?kif|{deW-M-qfK&UQtv@w?t zE&E|t`z26lBvkkC|5aJ{&pC{2qH6Jw04MnXVt9~gl;fp6# z#+B%Hh{EIYtVjZ(<#*dPd0+#1eU4Qeh5N+HEADQaga=vQkoF+Thl_78yeqe=^C@i! z58$Da46on;fN`1YCYRxXZ8>hq*YY$WxwOIVV@AvZg5`F4Fz*BU>#S!^vG}zE-vJytH;GX@#ZpKm}hpXD9-&iQiZ&pMVD3NVYUYheA@ zv8l5zP>RH7U`2;(OoWJ^v3$5Z*P_t;Vq7FvSRb7aM|%;&P(5KFIsO_R0)8{@&A|=L zDL=R(PZSZQ0C@lQLAZFE3uu`z6AAiXj&y&DYgVf`(a)}Dw$w)lc1^{q*}(5(?)5FX zA=GUH`+i)^w%b9zH(8^rsChoRY@njIgp*kQjdvrk6EnPDm?9jgpU2n(7Bz1XG+b^7 z6P)(Y6{Z5aV2VlCxj{UU&N?Y7vnvZ&&}%DZW%J<*Jf3Yp9-J$l7eUr_X*no>J1HEC zB+^8SNv^K!3XpT-y|}d(?@okQw#W)>Ih~iU(elqj;{W{1A@P60A@P55hs1mx?^N}y znNYdoNw6OuDn5`OU@=JmLqNR0?yu*R50da2KHElyufkrK@2r%Tl%FCuatmQ!!PPP6 z$GmxUn(ln2h2oD#`CtFzzkd|_yFbeR`X9MR5eN*Mz3h&y&5dRee3wrzwn=QiVAG_J zXE@C_51=5lTtaE(fdUg~rF{wehGNb`hb)}F2G$lVG}?vl3{B#X%op=C40>32M@Ow> z>oR^T5y9Jw_f~QJ3?lRA1#|YrqO6McTv~ldccysA0nC}ix|4bnwkG@dUlyr&q%xqp zTNZBu#q_1GkJ%2}kM|cKLSBE0u9iJz%l&PekAcH2cnz08j^|PYitjIPO!snpjP@>Xj{3)C2Pn zwq;IPSw}-Y^#zFrE;=Z_Otf!2^s0XT-$q;EIv1%qI~o<*&%h%aa_4iEuyZJ{bUfK^<5h-uFcb= z4!xDZss)UG1qwmW4&JG{mW8<&PvDp#T1cuWXrQnyS}1|7jcLfdPlBc%^WI40;B?NT z4zkyO8shHw`z|~(US_uJ$a64^=LL6*)*zTtph@t8sw07SKxejIlPW%Ci2+D zsVziN4MiqHEtLCj=DU#MV-LN-3*;K=Hq!1;+`Oonqj7ZA2|$$T{lz~+dT>8*EpQrM zCZCVq(eY3rDVY}zq|PRC&N&+Y(e~|IGU=L=Zuej}CYoptdKJh^oBd2vTkTkS8~4El zR8F9L*8$nx$2xNR^%01GD$|hJ#-^p-2kpW(e_B92PM(l+-aAQ&h5c#M|L4Eh^#2)b z`v1(?bSE>*AopmdhW1P4JJ&kk_<3bQZ10^1v5{@ICcGeeZFkgI$`;oXHv9P2bxM`2 zflhBDtI9@PboPZ{WddgLuPe|3naQSb!EVccHUWsRCR)Fg>Ljd9`99izMqfKKM;Lvx zHjqxIs!gRJ8apl{icAxG>1S{GFnQRHhTC7CM^P8Kr=)Bv;8}g-z_&NHA@>5N`)8;4 zJVoi60Q`MBemxH+LgAeDq`I|$EoygvE0_{0qGV)9qXAShD1$#`z4ilYOUCZ(nD-D@{3;Y1O_h$v;WRi8c{qd-{9Yi z!$7Mi-aLYFYIepZNB45nVfXAyOD~8#*y5YyDA23 zzil{|vBo+@_4xru*y4-Ib9u@v$?|IH0b;BIB7xu{iI|gkAIcK0B{}Q8No|E>pYt59c+owXwbtpNx?N>U1zr zSIe`lA+)@)u5d&qJAm;*pmU$V*!2%{k+DhZH*xjiKOS4Cw{FJAN6F|jYLH~F{1jIY z)$}Ors6eD>of;l%oN@mjpXu2JPL|^nB7EM{JxBv*4S{o-2B$*WR7^sq!Q!@geEA}# zqfgi>Y=a<1zh_62rUtuK%baV2vmF$NW%B3?|)_+-PzKVCaUv-D3+4FtCRGxJYpdk^dr9w$dlWq9FULdV$)X~OtB zBfYZ{G2hLc5#T|EYa5VsGJ(7rX%+2Tl8)KrJqBmYCoDFY=V&Jt0&pKF;c9QLZN}ph zw7L<#aXEG*mErQC<5o67lc)tv3a83-p?#)T`=!>kM2*ox_K#%%4mOfrp*f5 zppKuM(M*AP%+6|NYnCN*GruzF#O3~?b)Za;j4+R6aKeV_Z2x8|$p~wlTtMyOtLxFY z7gs;ht4+l{-erkze-y06VRE)9GAVP$*i$wxu&qIjf;Jt6qv-P$n`^fRu8kYCFIx0S z|7}j>2)x|Si;I3!@<14$dgnJmCB2V4_hT^2NO?0knV#-p1k5ud>=o6H|8N_kZ^}s= zdiu&teg=p|llVnHUTs29$gDenwat*@!Pd{sc3=^cM%mW~I`;!1x4L~XW`!#^a?>Ij zxIQQ7zeWS5nVb*os^@9aIYzwqQJGgRr)BBJYvHSA6nN{YJ@|s{%N`iqWbVd(F_gn> zY)sP6bv4M^4a83i(Z@)Z8+Z7VA`yF~NcVhNCUuW@unK=J{A1vp#_WObr8$Sm4V$`x z$7T6ayGmVGHFefId4*I5NB3dVL@Vs&Ac#5?hUOhIWTBahkWcr(3bio+D*LFAf2aGP z{j;dI7Hv?%vD!{XH~Jj`Q+GeAA10Se{)&auSIa0-4e!8!^da<9({In5<5nRX@Okl0 zBN-INP=&M&TCi|^LS~f%B^NMpi!C7vY<)q$XQ z{*D^opS2Wq1#}aL#yDe8n+t%br+@;r@USwUZVuolL9dfgs`0jb6c>3u|F#G9JhwMn zbkA_x=IC9H{_=i{T*Zw?B~0uf^j|d9NBQTSs9RrEnjeNDmzc^2C&Ff+VB*Gp=u7Uh z7_aRnHxNF8bu{zB&OW;_yP7~`Af_ISY}eyD&Cma2oYog@fuyUKs$R|`aCG<#|HFrv zScF6)K9SJ?Ce1D$)qCWJ4wPE1VF}XlCNTtZ)bfpg&o`5uV(Jc&mPK!%tIcAEJh!L% ziF8EH*_SL-ZBE0U!CfsvkWnivEkG7Qf8xBJrIlwFUuad*GqS~M)oKT3FV2d4(dYi} z7rDx#-YC5)x%2SRb|F-Iz$bFm9bCA1)!?9)rf$bjdgc8ISXeZ0NhYQAoiWCz2ZvS%1)!ta3vi_F93;Xm zRjVL|s5VhJMSZYCN|dT=i+t?Qc0QBV2~izw=SSOlj<#x{1o*EZu%Ljy;sTVg{${58k;-LI``O!hqvDu(FrURAMn>|m+Pn! znPLjC`!T*|5Q@m_MrjmEC_xb+I@)iT9}n@t6G5Rqir682PAySO6sgu<7D zin(EN=R8`YOvWnM_3PZW6X*h)P#q)77}Lnp{ogH-u+>0Kq3H%|=TnK)3y zvW_}9`=0@%v}-crM!JJY7lgX^+dvM9Xh0vqp0*A*kZpvZ@z|`7Ttr0r&xCt&Wt`6`;;4jfinf* zZMAc~eG~mf#wa!nbt_S~7(DPGs}R0L5TE&{3R9pGxp(5n0dBR}^5AGP#LsIH9H!@3 z;R46;;teNCJ3qF-WZtSXsIffX_PD0jkGDU-|5flCz+a&_o;~%bj=V}pr*t|n4#Uf+ z^dah#+0C2HAcpQ@XSV-h>z2a7RoH*~caOZgN|AX|8uDI%#G^y25ZQq;vdv5U?J1!m z=w_TiA^HV{bcDAQj{_4ZB3bM~CP~^N5dO}XdVolf)|IWLrv)1pXy6>|j}SI?%&$6^{5Q|;b92_`Yli0q(jz(PjdTF! zIK;CLe^ZRI{kznFaVX!UwF=auHtm=gMDJ5nF@C->=a?YCKyp7{gQK{2mzFo<7SFq- zc6wD&@c@n+I=ENUr9)JLhIhF)*fn<$KJ$4&T<;P&Y^lwT;CavF^0Nzo2KAqnO+YaF z^f5-K>08!7pQ%&LS;sBTEEI*7Rk4|PGCtAfnx1i9lhS5nt_<0IrcDqzK*#MpOIf%g z6)F$nXQbwZ{i|+8#Gl*O>a9TNTcB*jufeoiJ?z5STdk#QcUUC*C-}P06Pt0JlFBr? zc~o-*S>Ih3a^)7T&i%Qaj7d{^OM`^d~3AEmaknwckPLg&fog&kMw=F!A9g?Zw)}yGLVRq~^q?WphWZ2r3 zKAe{FLAp4=Mkuc*cZ>$hcYv_}eB>>>Yh0qlOv}5UR=L6R|F!4BEul1vOOJK zGTR+lmK*7(?ngX6As^@q;h}8-mS)>HHU5QWUapK|65$O}S#q&|wv5WG$->>f-4 z&^h#QCBvuL`F^~Lu2kKXWF|sKPauc=W&@*SGUEL@w3rts`8VS!eiqB3Ybw5`8GeG%9W*W*3zUj`fwCu6?#zyyDQfNDD;;FIc)fOi5{T z>e$K(S!bR%W>1u)AKt~)yR?CjJlVRm!xWEpT|=b5z5y`PxF_sB=-7&{_*Weul>W5O z+L1JSIkpcfMISxxhAYEi*!dK#PP)3C?y>uKcoyFr*bl50zb{Sn^ZumPWL#ZJKR1BT6FQPy;TGfA%4hk5 ztup+@n;E(mM?XfxrN1~5=3v+=rJ#n3RrP3aRzcv%HiIE%pFmE9@ZiEIZJH0}|J`ok zziKX8{Y3I^a!K{l8yMu>Bh9|ugP2SthJquTDA@0et;J99-6PksWN(W4RKlK8%}B+d z5LW!WYsx;zx#)lTp0CrBW0;32=%u5H%`6_6d}nd}_Sf~~jwX5afB92h`^@J7w zYfpjTh#gcaCjgga{s}v0fqiT2>8q0)W?BY|N&6u^Cv^LKV17H#owc;|8M^dmMsUtrr|C=M9@ zm&R}^+UsclSbRtp_w9#TGreT=iXW6fUYsMqt^LMqk&Y!HMq~;es7XewG@zcMPHWt2 zhz}ZTl49t3I^OVYT(}ZYEV(V(ag0Ba#>_!3_EYwDc!MH`kJ19=gP8vPBjN;a5is;AwartV=E0u zoBfi@*E6MD6qVi|iF?8=kzQX$?Y^`F9;HkuS!|*4&YA3?sIjn+dYM|J`9HQ$JIBf% zJ0Ux%&rt`c2tB4=Kp z3g)C07jCn-W6>Y;kMWFp19Q$b?A!vNs|g&h-(qZd9{E>XZYF!g4YPI-T^=~^yen@+&fZ#=72_9@ixH0Pc7<#Rz3rIbQUOeQe4sDF z+B5%$45~r)5owd9Hb@c6PguGr4x(}tZQenZ%ogpF^1XlshHv!NTstxl?2lD2`XwqO z;tm-@BuGUt33kbIbC5(El9yhH_qXG{j)lgyLS~2NgcNz&!lC_+<>?f}8+Kxf+J($?G{e6y) zxE_S9YOlhQlaEmw7Re~OxKKRLxP!d?xLOrwG18LNC)>O>eL02*u=cxH_7urrBB+8O-QscfY6T45w^RL&kPypS2Ps*8C?du5 zy-hyMHCH2$>_i4Ab+Mlti`2^4Yn_Mqbj<+-&!p_1t#Zf+w?4ZXwUw+XU@#_j6hXUvblsY1s&pV4C!sG@! zpar1lQU_)D#xH7a=9PYC2e)72KDm`^QN@C|p<*QkcX%jLcLmQXD!#GZdS6gI#I3&` zlg=UL=vN>=E6RcHY zARTQu=_Wh3WCi|FS5n5FN_9xudr)6J1kg$il?rXLU>_E~QcJE^XTwp;Jz{aO*;my>M;*SvVtcj-+a>Hh$>)vzSR9p>X%xu# zp+YPUiN^_6z;RJ|?YSRs;rGJ@q=(oNr+7~`TB3_UnGq#~rMY63H|wkEOw^byQ4|tg zy^y%&=xcb9os8s+bQ z<<_|XcW&d+YP9i^#hg>rc&a<;+e?z^v;CPK!WmDT?pzF*YI2T(rK|l*;F-?u8D3`` z1x~2Tvc%(^jGC_}8Lr*6&%1BZGZ0od+^Ub&#~b*;P&4DoDyWVa=LM7iwp?}LPV zw9-f?-bg?Jy)xkbi)GkQMFPWBAkKND1$G}~Ph|L-$94mn9VI1|4nux0V`q+*ThjK7 zs~e=fXHwgK^bvE%St0mQIjGdq!IS(XRd#XzU9@fd9(iUxkm)mb)&^=Yk&i0}*VeFt zH?^RLG>ZNjVt9C*izQc#w7s^||N88*LFqAo49K&4!YX4uJ$(;Y79`!?M)$I(ygfK0ipZ%b*C0pCAAMwWCj4%n!-kL2?b;F-ptt#Ih^%E;gx9 z2G+&|^IbLGd3WdopfJ1I+G(w)-L0eLw>*5IC_ac>(%jP}!00d3;)6qB+#O9g9^hzH z!JD_?`KD|<@d|TWbXCX6ceD{MZB$e4Lca`iw^Sl|54TCM1^pTxB;j%rG%NK)yaxytyxwkPm{ zpU2Vg(h+79adm^QTp_!6F{*nVsMXn1+mA)#%LwEWakMZqm29_yoM5&#Y-a1>yr=f> z?}@7goh}W7Lp`AD{%>G++bhodPnEj{{6C4QLPuOVa)xKl{o=&cvGGxUyt)n-# zYD{Emesl{?wn9SOW*;Zo$7=AdfMH@iJ6KT|nanBFS#0(*L{?7I5oCyXnna~Lr~nKQ zU0673&!`HhIT-1uKZ4f@_)cfBDlg}`UIQ{9X49o}LFU|s?<~bE=>fS%NFiBxd5kh) zwDJbrPw_2&>?fIO86n{a?PiBq0Kl_bY)O=fk8STriYv%ZsgCuuz)o63K^AiYu|)4s zXaF>LlYw5$L%O)2t3DU3g6M-Vtp%X4W7I&$>(Rv0OqAZ7Lxl@z1cNvx5beR!3Gv{E>jY+Oah-Rv8G>@P<)5QPadk~7-aGJ8#2Z5iR5>`XG+ijUeN8o=mvUqjgy z(`2EtIQ%WL9c_6nL}OdJMp2*d5g{nF7noN?#(DPuB||+stpsO{Z2&<=?{95&-;!6F zBVAy|!9iYqlJ`X|z9M-0Np=I_%`H3Nj%+_7=h8*sfc|>H?0OK3hERian5!;!g79_o z362)Qud?SLUaT!T?Yp@2+MQ&5nLIEqc>DgO20SLU`P=ZlA3=PG$R)1|Wd( zc@-}e=f=t0C@#7r?!BDS@>0;3>1Q$lIPjjEe{0sYv!lrjgoBs&)qz6qO2Ar&m7%sCS-NU$k zZLX7)wNO%Tk@ID>qbc)i+Rg0T2EjZAi!WT9*KzAk?rMNiph%4_cqfz45DDIyq0q|+ zZE5lY>+;w5f^H5Gx%YFM6jhJFVRyHh+b@NP4XHdI#HIJv;cIOhm5%KZ1%C;3RKsXe))3lDKcc>20?? zT{16*iv&4F^G%e_K}BZe1O%g-llbL)j>iAVYy@7d{&{@35Pg#ScDa=79{%|@2z-9- z^ItBQ?Be7*n-Oj=2{3ktmNjgOUs9lG<)O_wyNzDGk#_F@aj!WIs{k? zjw|)}pao4Rj}eh8MWiy({~Z?W5Vj1>LJ!bapIp8in%Vv#@yCrJN;& z3_Ltn>-t`2l>Wnv;GTQS;(|&tGQoJY1Y749K^c^JK8G}fCLM0Z`N!ky+q65K9k!CQ zTG*j6Nm(Gq^Zsn1Kg{n&m56t*GO$!ZSz<}$HV057%T%CjQ_pVqf(jHquGt9<+B_|z z562VcmncboKU^dH9n^z}R06P;ePJO%h4=8U-Y?$-gHTkyL4ss>_hms_u@epFK396R zWU+#O<6z)j!P3MMD>un}u`zq&e1sj99sqHNY!V~y%WE61kg*s4R=BrN5D^^0v!SDX z)i3^xS@Y__CUlcl%h7NKq`EE1;9;Ei0vl zlJH7}z9_4w_Sta{lq;<=^v$SC@7O!CTqeR>5B9}|3b;UhlMK(A$*R?1z%x^Xl|054+4XRXrQW8 z?HlR(>`Mz24b#~TJHwKaPIPGF98JkL;kJBO=npyyhfzbQBLI)6yrqSWq>PD+H{LEa zSOAu2^(h)vQK2EF7i;R~IC^}I*Z~=gp&U4+YXCH~Smxu2Ht{3s4Lp`)6y|C3U@7eN ztRimiE>bdg>52IeFljZk8E> z71DP$C?1S{L9U~t^*=MWV7{M>;@Z0wfBJDL+dUVT!_?mfx-sQ8B`6o_Qj%p-i&4fI zRP`^V&P~)s%!22#J2dybdZ;j2GM!w6xQLm~WOYv|P31o!opf|IJE*1W6Hj4Xv>-q- zE(jPM@3-S!!j)_!FBeo7M@+iD9AX@83N0jIRkIXj4VFZOM#-dFv~au!D2%PNtf=8{ zo__wBwvC@{L+y(>Pcb+$KU6B_NwyeGyV3Xw>FePqs@*#HPcEo$u|Lm3^Sfqyc1Snp zDKbjbV2df=3*}+wP7Qcs)v8ps0Dx6|!Jg6C#RseL)i`K-%!-TTGC;$Rb zI|ythHwF3qb{fTn;+)dH^8zYGTEfsi3YHmg(rpWpXs1^)t#frfdb1F+wOjDj*4I3l zP_M9$H>Yh?omUwI)(jINWPEzLY?c%Euucdpn5XPqSl313H4-6_Rw3LK%(cZ5ueVGf ztf3R0UC^_$i@3Tgpo2{l$UHzGa1qt20hukbTJV>Xd)ls$7MH`rM(gcpo9(ZqCp^^s znQLX}dlh3mHNa1FbRbghuaA=bpi}e#tztkatq<}$Vpb@`lWtNvc9NjZcKo)6v*vRm zg7c&~22Uz6RnRWCH?wU!y4tfJ1T&xQIh9PV(qXF?OYwFQKRC`FJTXY0_^+oe(jB?H zI(w5IJ)>gh)ZX=+A5Gheu@f2$b|09aAdrYsup%JPY7~~*dj-w)A>Tvb?Lhv7Zz_h*D zhRJm(>Q4pizupp&zVX5Jto00{j*qO^A$o7MLpP7LXJPcfyR@2z#e8RFnt91`JpR*e zJ7F==ljvR`cdv~zZRxI{UCA93MdIN))QZI-SX`SeSN!Oq1S~xSuYI#PQZz>*uCh?b zm?NiE?Vovp?{QH?*(z&>Dh7_8#|F9!M60J3Xhy%kxD2A@10^*= z{OoUIq0>t$wj`z>X>SDiJN^zgeOTprI%jM0^t-vFqs`=YFM^@2BAG7t9v1^=QRor;CHg^rZinxm?U6B? z59&8A#H+iAS66p~jq=cIy*HaUd^vi&Al9}fDY#7d^aIfaxQkqI4cVpPYV>((Ki)N= zI?k|}EVq$?Vn>HEuH2Q*`iV!@1hMSMPPWykMkOa=VY58E!vh2#%qPqpW=+JTgQEER zZ(NrR$avq6CmwB{9?E$11s9IGAL;X&-`LMu28OYIEtQNP>E*H6oT+WY^s%LBf|~u~ zvP)`AcG#zid#rU71c7{qjmENCE`1k35=5MdRnpQ`o^g!sbvZj(x3EQ+l+6rHfMMy1D>DQ& zsBe;UN0Q!QkA#G_`P=c*XC|}52If%@R3ij`>qLe>P;5!PGr!sqCXfTdGaaMbP$K{X zK5NiO82uqp1hHk73?z7#kaQlYwC&c{;K+WoX2gjQFWx)9(Q`!(2|K;}aHX2p$ROKD zs-!5cW#VwWTZzr>z8QBH?I*KZe0FHawVfRM;!xe@iPQ%(y+-@e_?0vVp9OTPWRmfA zD#^XKV?yAQ^z&U+c$`YTo#d_!^4Nwg>?%?f@8;fDvV1``ek~>!Q?N(dv-8R#HHW73 zBQV5Kqv~nL29QG7O?fSs?i*Si4i2Mk9}*V7>?Dnz^zb|yrG4WG+ky5@&P#+=#}qOb zfoLN;6j+%p-$*0GY!M7h}#it1c zN?hkhNmuVdO1D)&OVy|&$wP0ALyf5d8Evj@t$#BkN^r-ucGP_d7m0ti+<<)6-g#k> z+S+`6IUwB5k4#fAE`|=`Dn7y{F5ILA`)aW(?#0VfCas21nQc)HP;tUg|I)^Nv`x}x z!u$~6|C*7EF&&rsPvl{1YG;6@VJhfHeL-~=HIz+HPS?F_Dr7Ygnt() z!8x2QPQ*rH{x56Ms7=sYscU(Lv}XX$_+ICyK#+}jMyG&~O-hHvkAt|l$?U=gERe17 z&!!`@8d*atNqW6mgD@OMGc^@QkT>qN=eVAW+oYW(#-uWC&VKdU15jNbHelUeoE=W_ zo-^CTsG9xYddmb1B%nT*FeDC3Yv0Q{nfjMETxUc^^iAfk2=gBX#3l=2B8P(DrtNgP zNNmwYm^H_fJ2;4>gaTFssbf)nHuj@6csD9h>Ax(dSlHomlfQ0;Ia`b47l7=e{YXzw zAr`eV^qb7`(&qax(fFL~HhxU;)yO+Xl#?L9DsTDJG!0zR=z*3?l z5JI8;X+c|G!~V;ZMn$uuXCdrRdMtf=!KP<4@MpQxw}S*R&6ZHaPoRw1;g!d8x*4xQBVl9mc@TFlrD2Qn5EJ?1*G#FVDRMUTK`YotaQ5=CnFlQW{a zumc-+4&tLlsm&1)Q-jR76PDm!VDY*`0MBe@%^GkMJvdkZt{SeVor& z|KzG&YQ&OrMGqH`mqsUU-6h+j+4KOh>5(! zYs|7m^@$eA;$YEto;VyJ%mPXYwY+pS_|y6z20}7kurt~>2`O0kD^|Jo^I!qo_iad%P$kh|HUvUv)!L)AKSEc>fj5fwB77yU>WUf;@ zD5Y0Rad|VEGF4A%YgDvB*ZXN+r@OtY6_B?dbist*Uet?uE`9uW^B}eBteg^9R~0{L zSbqHKVc0be5?oO^52Qe|!g@SdS2y(6@B%&Qxw)WjdPfyX&DS{`)G3JR=o_;_5-1c=c{fv8e zG`VfX*<31h)Ttkrv4k?u8b`oZ(TqQi3_+i|XFjC-MOhZ~ujxFhRhS?FAv|r-K|B~} zQ-IhcV*y2H*5FdOds#@ABp^P^*XpDezKfNd)u>b!&6m4=XkIHqM3DiOZ^`#Au6A)K zFaT#0Yd&4SjvmL*o2q0$S{b+Xdc3gBp+N34XpZLJA25LN;)kf85^Wb(?xK%TLS zXvr_)M3bw@f->zkbCyh9%!s807ev2f&j_nUPz2sDUf$f;Mn{)PeI?90Mt}!8QGP=K z71C9-R(uC0A0qwp1s01%APp(>7pCCT`@R?bgEZ7bPe`BKiWmeN@T!J0z1K|kyj^-u zbL@-&JKYd zy(!WLH8c^Yy+c`hg`R-sk*plkp-w&aIIF)0%(3e(qNn#zGUFcA56A)$4_+80<)>Kz zdl_yglFid-Fi9@RZe+(<@bEXKW@lkB{G8;rm~lB4ytcp|aL?v0TzlZgX|?r}Qn=1s z_q6|-#S7Wu*V|CIJ2W={Sb+U!$Z9NH$JHj=$O`D*g|0J@&P+!!YXU#NO#68N)}x1t zYz6-W0HaM}U}nb$g#g`jiFX`-(nmKN`vdX6OB_|?fAB8OqeF-JZCokD zu-F7cvGpDupz9Iyy8;dhU>U{>!Cbh7kxk&Gd@$7jXLh5|5sR|TI9;#1sJwzPX}Kz! znOsMF~(znWqlccTO-H{meg&1k&maun*!fGQve zFbivdnSUUIo1R{$(`hJ^s+$e7Om!s8DKV37C$p19yg=%Lr`>~>j!bYaUrX8ezI2NO z7DxyL4Vmw(Yh;h?8D5_Wz%8#HFshX>tH+yJK{Ajr#`T+|x$D^v(URn@so}Lx{Uf0k zp8HyFpfxBsq7P02H2@Nl1~^TS&@1F5kw8-X{vIEp2^}nCWh8mDIDva=um$lo8pGy8)#;GMv%NE)$d93S@1@hKzuY8Mo0;SSCFUt+3wT)Y~BhuV0dWlKK zX77p`A`x9U4_^eA%)<5}Yi^9)oRvj+>x*&vycSY7>DpqlLtH;aqx9^cDq1YfRoAp_ zNvdXtOXd`T(I_Y=MCW(1ODZAa4dYt~b&=UpY@*<)<8}yzM2Y)26o^NX$|FoCp65RT zBbjyn*%*2Ya?vdt?w_<3G?fKZlL*WcJTiX|5Wvbv($EgbQXU}~#b|h$=dYeyIWrnL znaw1V7=cP-?u1eb+@cZ`#@QSFO#*FaRTb8Hb8U8pE?ZTHRMN3WV_N1gByFf8*vewt zTOfd1nda;E2h!?1;?t}1*^0~PB0CXC|E9=)%MC;F`{6=KC+!+RX>2K~4B~Qz5N&+7 zQ(kU%z&+yL768r%(uZ}=NPMKyHQUe5O4fdX2?xZ~4uTf?iU!X% zjNZx&@0~d3gAw?YR$Fv;hx)6qzR}hOW^Er19%$RiB$K?flb4-Pr2XMDpwYjfvz~GW z<>-;*VB|3q-K)o3Swu$J%`^FXzmtuPa=5~;qXf zyh$w5jk6rHal=DAzDEQJDB<=T$xj#Mrv{_a_|FS4N>{6Z$MhBf#+z^;Rj+D%=8nQn-&P$*VWF% zO{yZ%x9Z-DjcCxt;@|086c(31!EDK=)|Erz8tB(iO-@&$(uQo{>L<|VoPy+Yl;JPz z_^#*GV!1V=orj28_w@ z>>so3_RHdfcRaVov&+@cZ6s?$tjd9RaH_||Zo3ac_+ARn%%3O|HjQl~j|)Pwcwwkcu9OMo6879_vHwan z%`HYoc&N;z9dLHK$x#GjM`;wiP>|%mfw=+Os(6Ec7f%}Rw?~S6ROYcF-wyHy<|1QSFdK(ER!$Fa=s@ zM4!VZSy*3QnXS}kgVS`OA{QIu8jO(HDq9!jU1fAsaK;^uCgD^;dEpS8Q08`V6?D>t zMTQPXz;0HXs!7T_jvq$$lQes_NJ(dKYu}z+PQJ4a^R#~(-Q4EAX#q+Ud!fJTauatl zK@rJ(D0A8V)rti6)9;M*6eo-bN{-fH7%p~!C@QsP=k@%0^lp~>%uD*%2S)Y`q`z@z z%yo_b`j-9a{ECgwWwei6Xv>!s%R9b~8s~N(tJTsr7RXsLr})=p(Q-%j2e(Gly!AGN z#>VW79ec~qPA$3l677*wU|7udgx!7MKMMKW{bKS=YV!U14S3$(Ky} zXzT%?!|$2=APh{g9(J+Rm6ZL_=1Wl*__Ng0R@T8WTg)`X?JexD>?XN3;M>B-3@pe@ z|D&n8dV)#EXFuZoEvOCby}Q5D0M}2PDT)TJ2R>#kS-49Jg<$E!26rgcQUe4`d!?xH z4(cTqilgyRDH()x^y8vp3rx4!0NR`);QMnb(P<+d(^F+KJi79cDPt|!z=~Wmdyo4p z)E0&V!u5two4uHPL&fKp-Sco^n2m53JCmFZXb60f1sTLgcnG@$j~*T$JCdO$S)Gsk z*Z9QdLj7#^UHGE)`wU8Oq}4*ado^9V{}#T0-x!YEz*Rut1;_9RPS70?3SHc^B#>(Zz{f2wn z%*0glAJmQglPRTYcB1i;TE)I|`D}^`4u9Nr!;D|_(~7C0w{d>QQ`JK=C|#G`Dh%vY<(`gBs5N;ZF24hZlw5CSI$|Hc>Hf zDP9{Z`X+8t#!G=kC?@%0un7T1nUwGC+hxPue_@t4qw$7t3Od~EIA{b79D<3adwGLK z!gby`PvqJDtCq3aqFiT;%@WXw>VR26hEBCXHAy;G_amXhX!mdGKndH;s~i?>n+0Pv zQsX9GJb$k2sWmv+6aWVJs{t?CK8YIsDb*+-;FiVT<}Az0#;sm$A+fhPKdrL7wU<5w z#QO=pENYP>6P#P#$<3R^^w4Q1+8*f4kU5x7P&t!-=b5q0u}G0j}@4Sh3j8vDC#?eoK zN4D7QxjB+o^PM$Bp?{s&UL-$+sN%Bs_bDz=F{zFQZO71hz3w|!#7srR&KbGE3hlNi|B$CD=u6hIga`} z4lIl08t(uLl-j|3*|$}^jZkwenp@jx^N#T8Hl^7 zquA$$a$2@fNC!#C_SgJwU?0Dzg{qtIfm} z3eaXU`mZrTM0gxRED-1swxoI`dqb;!MpB&zXRwG-DeFwt^HMPV`j$|w5aYefy%MV7 z8y(Jv8cjWDp9#+slps92D-19RTlDepMR?IpSyqwcf1nPMJs|2(D{G-pg(LGq4M3>B zyW7eO3WJgVpe@tc(m{IV<2H{K#Y~djhRqbAIPfVW3nV7@x}WciLPYYNNha(qC_=nD z@uYXA`iB}QpBm$KzX7mo4P45B0y8ZX?I5%hf}FndeTBt#js^nk1kOdMA33|KL>qr@ z#k6~&LY31^Q0VPDN1&}nH}|44nl7x3!pPaV#e&jBm~8>RT7N=OOqAV11o5G&SVcCQ zlNLmOKAyEE6=%X(`N@4n7#MqlKJPGD!#j-XUMblF_}1=0gdv1FlTHV2RwXVyqF7(L zig(%l*&U*8xYV#;5bV9~GV^(e^(K0#RzWU;R%#8HL#j%^mU2FfbY{sOH8^VC0u@Lcnqu=9q)Wv8213<&s_@o$d@DN%xO2%bio zR=ZDmt2m9d2V4cxg1t|d894<(1z;pA(ze#OqrbDSB0P-i9zMFt>GATJGC483gkH?Vhb&CxD zdfTFILk@rW5xMu~t)9{Of(Qj+f_>nLlFBMIqq#xA?m5zWKox0wpT^-+`Ev@0-^MRH zv&B02xF$Q%GDDr*>w=Z)YC@nXM0Yyj)@o3c7J-lOmUCEpfL{(q0_pMfQ7H9(jg|$W z7qQ-~RHMJ?E~>ODk_@BnU6?8YDtDQ8aqikb(8W1z7rPE9e=e9IB~1&VytlI9o;wgF zz%PVSp1W^&A)6U(-3oodCPfBj8Cpii-#5wA=6c?Rh?xURbX9QgNJcE~t+CQ?CT&0;=@Y z>~jg4)DP!rmDyrfQp33~w-P6s{j7R&*F zFd@-7dnl2_am_95$8);0jMjfmgcJ!G49uv^l3X?@fO{$P=)qz0M4j0IxQn8yf{Io< zq{d)LcvpbYn(r#NyH;g4+$u3wS)uS}&!zd|gto3CaR5Nta#-iK>73|=l(NQaZ^sa_eQ6 zsJbko?*!R{AyS|}IWKHsrdI^~{#>N!+(Iz_jL67B0Ac1kE`W zuQFG&A{wgV_fva1=l<;Vh04T6*KwC|uX`fp;X>v__}To6Ix%p~QcaNm46$C(HPyA7 z*6-k*0b;WP#rW;R2<}+fwY*r-RZqSLLj;>B%l$<*J4Z%mY+p<*A|z)ACl_*kB(gBU zrR8P2*KZc(u1!YQW0#(Leaw;rbB34b5zO7@GHCCn(`78_hjoSUvqDpRM)FGJL5K+@ z(~iFR-Q!I$376Rk6m(foqV}fQEi%vZn=v26e3q4yXzgQmT(dvn4Y!0C^JbEhe!O?3 zCID~#6VC3WPwYVPPa){IK$3#VM3P6CT&g!am*nEhT;)cb#nY0A;6rzdVjZRT?MPR} z1gv=7LuADtM#8K)Bfo46DS)A{vYo-%3fKB?fJmriiY4V`*E6Kl3^IEebszkKpMO#* z{s#h=+|zT}m3KR+UzCJW$SxQ@mdda#Oo28dSUCm*Z$W6`U=*TCU*UKw3W{Lund>yT z6{v(j(G8UdkqaB0D|@NelZ+)NFpR|eQ`jZWI1J0vQ&PVXb9!KY{m#16elyYR9Q=|4 znR7Ij543(9dS>_eM;or*3DFCtyu=7LTd7Nx*OfnhqUoc{l{`&`^jgTp){}5twEn@O z!%bR!0-yL1D&D$g{7j0sg?qMtJw)flwDp;`HbtpGE97M5UxNz}->lhDvllf^l25v~ z$9w4Zf43=P*`nE>9lWEN?Bx{Ke|*=x|AK2_W=oaiY7svO&~KCWi$w#`S}AH0Gh1L3 z@^%ottm03{ggM*{XNLzck5@&JTQU5_XW@YJmEhuGS}89dzjnnIEgc2Alexk^wU}@Z z-BmQPRW!?Bh(lID)GAC-+R=&mecWcyb`gD)qRRt8T%`sEBD2X2G17v(w718sz)CW{rJy?9Kq)7I5CrdWrqALEYF==7GnBe5;5@ZJ zF6E|V4_X61SJY5$SF?L#77<~k{jT-`yHz#8`*7Kv+aNrDfMaMIAoTck195YyV;}hr z6(dmH0W$V;03oZeP1e=MGrkeceCG@$`Ivz$Ppo0X4fOMU ztj-QljubxBfy@)a@OwuH!7DfNQiSyJf`u)KMPjlFw+f78So9R|Ol&+yq^4d3i!d{* zi^^!Kp7IM^tbQFId`aA^6kDl9tDC^WELL?oMDJbnFD`uo6ay86?SIkEf@cE)#cF0& zP*Q^PrWT>`2|V+QB_y?kiGpHmFmOn*4{1ENZaX@n#-GKv#nzCSxT1+5_Z7pIGLpVwivKP?c>ETctYSSvJ)u2 zK22V#Ut|jW&Nw0zv&_y`LZL;)9$2mimz+}{69)JFIb;q!nJ`#OOGup|+_o>xcm$mU z!}h9q&K-Ku(#z@`D?-G42bSiohdGNZy;#^{(i!S?_$8f{{FK9eJnA5mqY^vE)>~uf zfz8g3QK*nW&2cfA>`0E;--8TZ#-#GMJJ-jvdgL8XU&il)nx;5@o~E64;24A7ECn0p z=&5Uz(YzI2P#fTa@u0?juXd6lq`iR`V)~ab(GI1Mh9Pv~1Qm5N_N8XL;@4un?aTfI zLAH&3=Pu5(ZIo|4xA~*_x0#QWL(7s5D)%@)+WFHf*bcb@(c@vb4d%dUCQ@F9KL zNdy%Waq-dVtZ*oKD?5!)HAH)UTmMD(v_&IJWjxwaIjGixAMxl62#n@_ytnFRB|E5K z_15d4jDRoogH|dFMQ@1X*_F4!uE_y_UR5-P#FZ@_Jc1n}tomHkUlp=}0b|8nqHSbR znhzcW*!Zt(XuDY`XFr%J9bnVXxbhZnte`EWu}Q7Tn}7ZvnT^frhgu6T6y4{1isU=1 zU7-&3Ad`V_nU!*l6< zz-r`p2cVyAK3DgQS*ne=^d6VMVkamW`@vSd_Dkz)Q346XE8jVSWxYYQbbCV*n!6xi zu!jmEL8t(p{u~Fnhx6{rn<>FrSEM0m=p$Ymyf{RpxQk}3e+orm&5|NCcS5Ky>!W*y zR~RJNmZ67@m>8yQm6_HLyFTO=mS2>l2vYz)XEv+M4wj*>RD3u0Py>rG?Ck0HAYo&# zphfv&MMqpzk{9Mqt6Kh8FvLZo!!bj&CW+27$ChsZ`rNL3x}Eex1<4+}@yfrXNdoz~J|x#qM38Y=$<= z$H=XdZz=^9&eOcvnCc5zXxNHZ$0(q$Y={aQ^GgzUm0O^@jr)M^g~Fq4TebQFIJPRcKs8H_gew)YSUF+s}3v+^@1RS*|9#ZT__ncR2A{>D0J zI1U`->-7v!%@2{B%f-j2F07Yl1w4g7uWD8aWL2uffQN4TI((ypZG#K31lKbzY(|qa zG^L}b7lUJa5Ka{pUBj3-S1>W`8f2*SqAoQ8uNKc!zmsgWqX-S^$Xi6Ty%ZCh#Fj@XT( z-fRJ#aC~GBB@jKlGTUn#NM?gtbAJjOm6JORiAg;8?vcGmkh4D*C;H(z`$6l-V*sXX z{p_$u;6>ohao909O9S-Gvxyg?N_Hrhj&0%s+8P|2Br{5|PBH;?wvNCj+%H6%JMMT; zo{E&MQ@Nn{_UBVD(*fkZYHNTgjrN?$i}j80u(QLdGR<+V&aO!9J4e|Op?oWLMZp-8 zPo_E55@Wu!Jro#W+5u4iHL3#9KRN})>(QprWJ&+df5~v)a*D8A;mOoh+<-r`(E<(o zRw3G|xRX|eia|QvL9J_Jn`Gwm$%+fNN`%vh;j0}H?_7{;f1NuAqIx;-9E2$sS4n4} zn#0!sJhyXoB}Ta+*TCLdW6JeiM2jb@}~twyppcRQa{=xbMJyp**B3EpsW)5PZ0#)X}+;A z1i{yGkSwJGv3@|#^`xj0J+XX`dpNbe;Jr{Ft6zC@DOeuZ3Fj1N>3gKN~i zfI1iX-ot$94e)|;E;Pc<;(O?M!-x$5w^UpZPCD0a_-F^TnG8tuS;JOcKQ?RT0qWue z>05!`9!9hKv4B?Jp%-UFdFZDF9;}a{ZXg&YoD($Ac0g*-t*DZUt&uO-XXRv6R}Mze z$%6TN5#a)ueej}kcmL(wEE5Mn`_s5&6ob7Fhz9*kVQy62*W5vc3ncT)a!a86I66X1 z+UU)WPJ}Q(3dRDx4EzU_bZuQHX?{~j!<}T5wb5q9z*%#J0oPX2eu&~d_~K9Md+~pH{YM!hricIJw!_&P)Heo~ zfleH18glkz8O%8mHlp*OMe^4w^7d2M%H|`39Er&sIlMo-t>sOWYBFO?12#gzwfp8c zBKtz_c>Chxc3^0e{%e>dmbCQ0zlzSi$#h+d-m;Mxk9?R z%Zl=*xzCHxHlJ)_mTdp6brgRDYFY6-1dIv@%9urzl19kXVOw->(%uMAQkJym&wkX9 zR4*R0_Lx4M;ww}$E^K~ff;QOJ$P>(20+Mz!Az7d3umV>!kglz^B&RTL78nhm#k8&d zhktRU+1U~d71Gn2uPSxS_8giY`dHJ&7I-*Wmjd;^GsITor5$BxgRiZ`$^5c~lI)Ww zOU4DfKDd#PZ9h1vZ2Ptzlku)jmALz=&4F?2 zKEvtg93ypEdb3|>wAfyCU`3?U<{a7mFy-_5gP@OkZ8k56^_BJ{lXG|j zL;03%4XE_=SM3N&KQQU(yIB`WYHtWZ5^AnLti<0emO6O?wY7|~RDfWT2@n;839jW* zI~=Oct+Cqxp~?_VWlmJJcM^49l8k{fM5Q(n?y%b(KEK4P%ke3<+sZANwAZr|Y^5VT zgaCRMs|>hnsu$ucVsM6d#rxa}S2&uu<$d<+tMLgpFD0t%@RuG!zHiVon%SWWrVct9 z&f`t0ob>%Dxg5>gjflLNr;dnx=Eechv{|`iw1u7ZH(QRr7_j;||3ttRWjXuouNiGB zk%@tNWIl)Q&tF0JZuMbyxSxKuXPZZUs(JhJZCV+|tsWJuy+M!C=9g-Pn=_h_))y3O z59|3YPOs=D+FXZ%h}kpvJuEwJ*&(_EMx`Dp74Jn z1_KGEIF$zR;<8yz0nh?Lw%13|b#UPa6;cXUQEg+kbfEBr_NWlLfq%+B-G&Tgkl_Y? z_pBA&oTbZB@LkE^9;l2)gYKNswNT~3 zAkTT)F<&P*5Q3ilZL48LlOdlT)NcHK7utqhw(;W)R-G!YOzptrB73)(1#NuAabx92 zgz0ZD!q54isE5mhVuep*L;Hj>>v#t|5B4-4Z-^uJRzgF8sFP-U@Adn@86^{E z+Xrb6z3w8P4CXJbZKjXZI~bp!AYlI0`(1K1neF$zNVQywx|vA#$t{rlM~^N5eQ^bb zy+z6@l3PCX=6z?y9~traA<=4!q$s^wMk?{*DjJ|0Wp=h4wcGh<7{HO0p^~X^6sv{k z{fhUwA5|&z^po`f?lBKscE`-MVv~%BFIzsfsJH^|%Kn)e@_*!FKc1Cq#4jsD06R_= zBm<(HicK7-4cKv}9yBF{V8ZvhU*v-Gwpc7uXbPT!a0B6@E!c}gAoN#k8W;5GdFQ)1 z>;hq~ekLd8>CXkvsDE?$PbLdsGda(+GV>+ifa}kTkNM&9>(k8WNX~x96bEvKkWLM7 zO0niU9+jjV0SJIM7uUf>pwJ!VScaMnbM~wHIv{pUd z4hC1q$2i=30ov1khEZq~A)TfcKzF!|s%je9^y${c@@06nPQc_<^4-P|4A4zTSVqWKOJ0rDX|A7dl`0p3# zy5-N>y?G8Ub2iZe$ScH4hv^BpKa*}BUX#0l|GJ7@**!b97@SeD&AK z(Y!cJ?t0%DU!nICiluA1r*l6TINV*9?pB3SeK_`_GG-Z1D@$O3xa#A1?$9ZNO0Fvl z06c)C7_RJZ#zuM}AQ<8kl5`7&Dvv@LX_)w3zjIv>$%P($?gucG*!iARn!-5STGMys zA7PH;wg9Hlix|MmHpPpr^sVR|Qnja~cn7i9#;y{o;Ua9x->_$ow?T9@yW2-MGx)7g z&<9Fv!de^Ch5&MqLR39+K&)TfppT9OvP5^G9G3MmtqG#^3Q<`vX+lllss0m*$6kmtq&T0?DtPim;qPg>DdQFIYz zShXJ1PN@pAtxfewCK;_EbK{#DpJee$DO~WE;Eb<9&81PcGYs4YJ(Rb+H<&Z-Rga8A z7K2kH&8WF>2gf`Q$~gFy@kT{{nU;M;=FqkjNu$;fIx71oDDkif+Q)8H%>m$I8Fh4V zNcfOdUw1B9D5$D;hru%WI3EJco78V?$A`2n3tr4d!e8?DOGSW<_7JUrF3r~kRs}2X$!Ft_JSwKYS+%T4^yMngIGXB*;zKA`>IUemS z7lTvt^x6(`G9!CkIJ7wYpxYCthhN-rrwY#j>;k%!umb{3+0MQ>F$HGn*H$~7xwB~H z4S!v)Xm~LNW``Fa(o^o%gR{6ZcD^tMj9=povR<(X6O}0}DlD`1Qnt+Y73L}-n>-+* ziJo@!u-=6H@f?I_bZVgzO3w*tM>TDY_uEOciQW1)dt#5AzBWUJ zH|;G&<%{TQo5;dLd7tJx>WRGMtpt8=CoVqV-<|t^O>_n@7zQnOex*wr0-JeZNK>X$ z$<`YWCaO>@dECUucVy@NB@5!Cbn0RFKR?BJzg#Tgo=KlIm08Vw*H8nC*|2qsjh_tB zK^Ir|lRevpk8or@p1uZ)QRyyuA+#ftOz0L~ zc#lt3qLt-vP)5rKQqKad-f=PXQAZCX$VPKMP+Jxn$;q;X4gTDRJyc;{9-)nKT+EKM z0;qRBPhFE~9cAs5eWjmXyaN_`LC-b&oF3?5LkB5U^Mv-?Cs{I9<`L)1!hnB zI(lRRH=~Q&**-DWjlH;anJ(JC-k3EJwZ?;+=wbgmYqU-)&)~N1-*KtmBsW9h2XLJw z@DEC)Drq*7;aQ5)mRYC;aPoO<-k(Mv=zD+~_~Vs(HIL2NLCwp!YP_th*bnNkwguJ} zY)fL{HP@4~Cwnm<&V^eg0S{$hoJ?zoP&s>Kxa0x+Q+k8za&hH-nA;=oT$yy?N0pD_ zmu7G+oWVc4CiJiOyi-)LqIt#nkAHgls^(uYPblJ2;JADCcmuFR7&X_)VDwd$awHP1@T*N8lsRmy0XR z9XiR2E*WoTs=ZBQGb>5bi+`M;$&$?+Z~(~4k!5=d)SK>y$3#75?*tqWJyJ0}PV5Yg zs;4STV4T6bgFBB(C1A9!Pmu#87~0$5I2vDrDe`zLM;7NNqNkMFFaJ6#)MiCs<<(yW z&b+Hn9||#;5DcKIgYJrkj%#4myz7sEhE+tMWslChtks{Hf{l3jMr+#VFld&B=z)Dra$)Uvz?YKyuxMh&mEn`54ZNZDmnrZ$leCluIOUNt~M*ZL*bom z6}G36Q>WL;y74aKo2SIaWOLEW0xOH24&&y+4V3rogI<1ETaG>tlABLa69IHIgzQuF zIK`QDG4==SQz`!QHQL-%^E2dmh;fg$z3B?rT8qemlrZmwEz_dT$&%{kItGDP{9XrT zD(a5(jzaO8ceoKgsFqXZCqh08&~Ajn5W-^x)2{S2JcKp6T8Ad7SwXhpVa+}R-uvg} zk(bTyt*x<-6Wc@J+ir~o<@m~k1=Ghxum771xzkEYSJ8xGv%4Q?+kaS#n`Yr2LLZun zcR0quAGRG8IsXr9a(=@vxyT=`9EbvJMO^OM8$3h^_5bas@Fy)&AKLPv{Xjxu@JDlF zE~D)2qkO>7;-UU4xJ&eN5pHgX3cexGqEJFADR{V`lfi~)`^h_2n#bQcW+x`I9^!{H z6u6}*9(qS>FZ0K#ozT(#z{P{xsk`}K7r@6Q z!GFwqb`Q?OJZeDeYCwIu_a{3>f}Su>IZvF%6e$7G(BrEHRhAW+ZSXclW|JNeP6W8$ja9zDiK)nsx(SDy2++$>epT}wf zL`Lahgx4SYzLhgEM|8DZ90IvhaGWOgB3o@KI8tF%;l)hOY-=c*-N1FrCQR?l(nq-0 zAEO?%!6!H1hzyO^kT}8lkhSUVd(TQ;pDF}6`L8h1%(EGIsY&C&5tNC#z1j{a3SS{u zOp34ZPQ$#I5EjGRJ-bt@5gJe{)oA>bd8Qrl7eU?3_SAToESAIBf<()->pf!SVf;x} zSwwZ6sN(W%NZ5?p_A?vxkQ=*r(mCV&+q?mHj(E*zbvk=kh%Sb+ho#_kxI0Du9s+stN@JK`u^`Q?U{I9OL+uQOFf3iV}OOrzBE6sa_-{Q4)Is^(g+d z8(!%ZGRGWqEpB!HZ$S8W&bUq@*V97o$&@|qXr;prx@D2vM zUbDlPUQ&DbO1o(y%jY{m|4za?aC$gZ;zjy>y8t#%g>7Qf`#9~>pb)(y|35V3Eo(^R z>{k$JqPKuF=Q#nP!iF3ita%%Y^q!N#d~+QGmStQ6Yd0_hx}w?UW-f{D4``fR8d#}n zRsloNv^l@qk|-_Cp`&PiJBA;zQid?M%+)9Mg>)3sTjE_QWJvM*`6Rf-PmpxZAl1SaNH)AC;z(EAnBH z@miIzFRuyOAycHV2Gg3R`;o2=hYEPVOvNXcKN6DVw5uP!D9&m8To7YrZ&2CfXo%2k zry608IYdhZ>(il?u6XZ`I0GH zJ?G|WmC#z*L-Tn;r1(dwh|I1oqPR2C)c9yYPuUrKK3@5GkD|#bj@MuOJ!mT)RD0r7 zCf+mAy;rYkuEL|*6OahVbdLb|YVD8*U>ho2!l0#}$r)jtI;UN3Amo!3@KY!IHHEEq3)P`q;>i&$u~ld2Q)85NeC&-7Y3+iA)OJh41n zJ|(LUmTGrF@Q9b5AHig9C6)@%Hkk6O#J%LHP7x2K@tR(%tT z%e6Hse(E6wn^(~&QljVx7)`TY4%?QpY;pAg>34cVtTBUW9IspfT#s~~(dPW}ATF+V z6||v#M5&I25Q#XS*9W%C=Y+*%6Kr3iS|ZZq}-r`iW-NtPm(B#f9LWKcF+(I zY97~nBOtB5*)xVfaaXQuK4wMJv}|f=<>P?xVjlS9+I5skzpET}|%Z?s;Epb=G!NYCq+ph4+u$ks;pEH2&1kGwMRi|myFst<7T zeD`F&Cp$=YzN)Y}xm#sMWmq3hE8!sHT~I72cebE%Bws<)a5a;cf<~(k^v|Qpe7}mg ze+{i^-gQS;dws*@-FLhkA*@!nD)BEWhuI5EhO8#eS671ODgZ&BROvx4rJ6*M2PqO0 zvU+TMn2y%ZHzt133iFBnNx6>)njdY2y_&eS+GwakSNg9lb{4v+MKN1P(4nD?Nfi$s zReExd_;3X(m&t1iz1D@Yd(RJJ@4WU91pn{=oTL?sb7G1L#~23L z1XOxPJjA$nXK900Ej)b;&R5v|9&B1t5=-QB8pA6@Y44n&KnaZy<$q3ERzezGl4%7=j|;XNF1nzvtY+rLt8#(C5Z*%h(h7OnZyKs!`rOrqsQCS#Oyhqr`+1A1qe(*os`RgbMHwTa8LOg6`a_Cf<+SR3% zx0Np=(V8Wx<<0)4_T(gtR1plz4OFf60T)?Z7ClV%NZM9&yES*GAFj$qE3>y?oloG-e0zZ#?Z0`O)2fxb#k`Gs^b34clTu9U~oO-J^U zH^&~1+gAJ(T^ubZU4o54-ENy%?@t1yZ9^L8qeC?0MvZY?Jcs-|cVF3f=R1|KUIcTWN5XzuH3euyeX zE^Dk{W6wZfqaZ7V!)nIf3n>_21Kr2VBzR&}hUm+Qf)l@C<<2Ll99Yi6QvkazJZt7D z_o&cJtq)TrrxSmWG143tred^{2RNZ|!iSKX%N-znyn4)3vbk#x&4OHveX$xYyB=_+ zt4JB~o?Fq-uFk~bjerot9xy14g1hr*yF>t0xI2xXZV1!zMXsnYi0^f=xA!BDpzGd8 z^@0qSe8nphI}#`}FEUC{?7m$mPFEXspx8huDt!xLA_nvE2*vB|2KMG=k5US8=`uJn zGJ(+P$OgL)^48u+C$tOgnqb@s<@PSn{eb$!C~c8v4rJB}=YUXHm?@YLvL&_4*V~L zm}E>U#^#@W#)RBDf&c*IdSqT1-E2 zigR*fJ^M(v3=Ad~KA^j{Wr#tiVIZAs_e7UPmMHc-hHwH=hlgDdBl(a#?5Ge=-v! zw7=;Q69+Fh^L_)GBtFE%{d0LkmL*bcaEThd%re@LD%an1R4G&Tr5K`kZQ`?L6uD%> z10jfEzCs8hn;&3=8NFA*G^ZwX8269j0U~pTf81guEa8fqtMpu0An}nlv{CCOT?{tY zv0jb`%1#Zal|oij*VC1ekSKXdqso<;7_PrzYOin?#WJr|d~=g^u(6X%CG8>W%iTxY z^WMe_J$s*Ek~K~xhH$&8`xGusur&Jv{ioiF!sTP@jdRjqk(#qdd+||`E(nm~>MX(!FbKZsw40x*D*@id%^qS^r!>y4)=*+9q+|e`^-Wh~aP@>= zuj4+YEsS$bx!!PNjthgdP`-to>>FH@pOSgknm0X`pM`fdSuxfv=;$p0D^VK8nLeGW z;C>yhd=494w0;<5SxKmA+7-7HR!{8Yv{1Zly=NZt!|R`_XOE6vFs)QnQqHoT1}In0 z27h;sxHwy~eIj3|PAaQ6z?C=yN_*k0yA`G7er7kmg!OR{c9fT13u4@VWIJEnr1Am8 z<+EVW=htnI;)t!hn3FMkTDVFSQ8$H<61fNP6f2Li?&hg{SiG{<#QFqGo-8 zbWWGiXk~Vxa|-MOx|7bh!E>dD4}0PG7#aOFLo@&$)L)A_FLW1>UTqB=b7z+_^$=M@ zx}o$sh9HKx5zc|Trdpiu)A85R!+MJh4<=YS+;-G9DC6XVwHvvgpo^wybRX{>Vp;ig zjXX$cC%PIU$Cf(aAb2%shI;*n4uK#<`&Z^YRo^=K3p{VCzao|6{<1^OxAK#393q~aIM?GKiu+LohN6|c`ThQXOIwhH^YoAt-h{h8BW|%nw>QTJB zK|eaL0v-+M4OlBaIP{F?m8jQ=pLXp*oLqTQLsRJ) zRxnny26=P@fdl3%kIg#1bQ9zvLIvzB8@ErbnRUMk%*&ul2ZZB5kQdT7V!BgDJ`|Ko z#61`>!bX$lH`au~d3gBDDyUtnR^^3A!3#{yDFRo#b(edY6<+DP(}jasYCWZ|MsVU`2FvG^LKyyxBvLlZ-4jOpZ@VT zfBz4^`Mq4@FMs{h-~QkK=8t~+yFdKqfBcib_}72*)8G95H~;0|{Lw%B`uBhM<3IkB zKmMQo+u!`*@Bi+9;K%<(KL6EU{^NiBhhP2gfAO#XkH7p^`0X$M)vtf0+hz+4r9KNZ z6d&YK9#<~?)Bl3&{q1jm^V47d`v3gh?|<{@qJQ!W7yT1|(LYIC6igP_X3u05{%}fi znpU-j3z^OwayTh7^mBn!Du+;xe@7Wo31!qdm)%S@y$WPu5`7#j5C8Z=Vc=arr^p-E za3sc+tOag=19C#A0OKM=Ym+PbeR3zstM$NBgkPI#V? z_qOCs5-kJMpDMBCm@M~5-auq6?~k9?w=s9x&x;7h?W}CTg2nH&;K%evO38Jklehdj z$b;{_jle^EK}13KSqNauCNzcsIbodS?Kcv*(;FiJZ66vZnL_wwk<=pSHmJw7TS!W5LR);SPyBOg&l}G%P&z*eR}5{c#ZI|otMF+B&+&x za6V*Dil+lVP#zwG8P`>O_vBRKqWMDuiAh%#2}@1VDZqOeX{U=PSZI#JVnfD|wQ>t5 z`ghg<^i`Csej2`d{}|q_%G?CCSmBuc(yTTCR12)insR_5RU^AIl4V2Bv0iy~;_TQz z_L|0@(|G}99zQ~U2&1Bl>Hzjyvl!6JMQb@JaqNJom5W+0tSypUDkTz@D?5V`E-$nI>O_t~t%iy8~=dj;izPl1Ubn@)Cxi z0HDc2m`n}66jYUB=2Z3xtK_=`@q%Z$HHr83 z9*oJ4MWCklIKLg+*}U)?MHc1LBGO;><_|AOV9x(?1Ng-@Qu9)%1)C_wAsUdVu5uCN zo`KhwyUp#}-2ZChQzJ$aS))U6dA6V{j`D4ApYps{sIf3z0P?H>OfeUit&L1LBr;Cg`VEA596U?!(Nwr&zWNIq>0! zlf+LFd*sYFmu=z_gm@%8R(2f?GDpQ={ZThBD4AL{ubU&;3*K$vk|mlqM_EC}MV6!8 z)}Vr|v(=!r;}c1U7PhZ>e%%>s+zjF+$nRPLv73u-*XL&yOQ4_c#m{Ge!uHg^8&vUK z3O+1&ot5uFK}~P2KmZSidf8q(RTpiXzQ&ek4p##}<$Re9?vX?-#U)M5jjU#(W?C!} z-Bs`Tu!5H?12PbU$C$!k_F>b{#4zQ+h&B(aS&JY|G+Qe+3ex_<$=C}!T zoH!NPN9aT@S&|;B_IydncT35)U@Cfez+DaaQPE{}_brL+5>G5U!Yq1eTilqt0bh`* z$1a8x527Ez5PE)VG2CJfM~Es^ReU{Eu;LF2ZZH&Bx@3sXqAOz#YYJFGEh$`GlKspj z-42o$B^FBsAoHjm_W_92o^sdpK~S`_C%%&9^;p$WgpOl)pVxFGY@WCR;gTtA$lHXT znQE`&X0+;quJ=ld83*eY(fLd={`u~6*nWC*33RqZVIQE5`BxlZiJAW9ki5o;)TwKh zCg&j(zO{vUkLaQstdFAwNnhS0TfK2w?1PQG*%&*mE6`QT94e(D*fJ5!n_bm7NwMbT zxhLnf0f7;kg}|~ve6XfK94AjzGT!;xF z|Hyp28LSQL$ggUX-TNpf#xx5@RpEy6OEd)oznx%rEuQHsWH%Jr_JLgn%cs(z09U%d z7G3P}_h_^dXVH#@m08V2+kJ7nF|LzM^;r~uB|E`n6OGcq{M?1lIVG>?hg;VBfo&$S zhjR74kv3Vc4y(O=9nW6Odp)brd|TIq`)@d0^La#~^T>*T$GIQD94NHFcB!R@Ab&xg zr=YTeJ=!&KQ&rvPem~v|!jlnni-F5X$Ub04FU!LfgtQ1VRcdudc4}qP^R0coOS}mM^$i4=#7b3uR}SiO;y6N)EP+irl9>tOj;B zWEeE$lo+?I`y~CM2|;K(xdnO-V}rj;GpNMR%J6VBFYx9{l7Ir7j2It#zK|r?(AtHR zC;*REJ7tGB`vH9)fmLzb-;IJ$_W!iWHlrY&fzUD$qrTsP?*)W6?9O0|eLjVED*yIP zn9}D(gYu(kJcGm{nnrER1651RUX+mE;olJ77zy(l%4?20}y;qJ{ zQ};0rlKr_oJS;iP&M#%wu`M_9EaI7}5B-Ae^Y>{uO^xXvjjq;PBWi)~dtNRLhn1-S zPbY@E{Q%}$%%}%oW|AE54!DJ6#t36@b#y9eH6R*#iHa6>*zgytD#*(oF8F{pP6{Z;s@A3{c|squf4u z^uVP7-}DwP(OFjvh9;FsI*Y^rdvoLNCSW8IzWe_kRGGXY`ctuD7b?ZqG)&H@rE6s; z&h+EfQGB14mxg;+nDruCsAqVk9Mo2GzOs?D@1W70Wpt}J2s=06&|T+uz|9 zPx>KGW?+>BQf#Y#@#>XYsx54JvZtSC@i<0FtNAr@Y|S$8u;qlqZ5l`ey0xe5-C?Co zn~WtO&Z@{jKB!wkD9N6g;LaO{^>K828$Qf}hyIV0lipRu=jdT7^AX;K{+D=A7;hj7 zRrP`?xd1~zyub9S+{2rL@6Q{nkc=3e1j7sCa-s>LI>fN9_pFr%&5cpo0&u}hHcG(F z(Hy^eJ@22f#~QOcK}c+xg4)z8K?~xR;W>U-oLL&k7U7kpyzGtVfTh0P}G?DAs zp2U)xZtXD>=6e!kqtm@^Xtaz+DCmn-AgN7MYA_Fn%~kgeShakSJr!gq^XuNYR?onT zEYmw~_caoHVKNp|Lc6_R$6d%4iUZ-q2Ncc@KNr%W8z7DkpNcL&v6JKwX5c|oH=E0q z!{`FeVQGgVJ-8Fg2Q2EEh<4SnCHEy%j`nh4O}kK<`wMSPvn-DJV`o9ACqZLji2)}d z+RR|!fuXTtT1umgE4iRvN_XcyFJb;Sh=yqNmYKc){Q)_CbN#-`o0=k>ft%*p(sK*#2P}Yz- z8PQ`Qd{+9$l;Vu_w6DXhxNsk2Z{{^r4G~0d-P_);8w_bR@IGZw*X*3YcfMz@0Fh0n zWlALMd)tsHd`m>BF5HGnO^>Y2M|J>RC?B*S;9XV4OS|+DG;axchHA&Oob=8k*A>SD zlIVqnshI6~>T4dx0e?+!yVE>--Xb#GVqQ=w%&D4snHgg`fQ{M3d34u8Hcg4Wi7H~z z;d2L`u|DcOkb#X7$?#p|S!8!t@|rKFUQ(IXu`6H<$^}bWsD8QxG5BNQ(gdQx_*niZ zzp{K3cTX9}(+9JRrT*QrzAlboCD$NREs2DxKN8yFMhpI4rIY1SYWaT1C$l~R{b3iR z8$wu{46wXfkC-E-dbhv8SxV4&mp6?y<@nMwr#+leW++QfMhLI;=-BwN8ZxdGri51g z!)xr&>+ciYE_VG)?qnrHiD@Cc?gioy3kPn-&jP3<^k%66Mu%U7hyEkGomFy_WpxF*WdCC|2 z<|uSfU&!5%G!%#%7BWuvg33PLvN+yHmEicqA8$2+*4WBtS>*5+$hm$FEh7gf{O)`+ zOJqg(kY^gl`o?q~ewo~=w8Hut>Ywa6T=b?`93&9yWa+(=pQw^Y&t&5gxY>jrFgA=W zr8{iii}x<8C#c@|jLk3U)|;HnH^BsZMS&q@Ztl~3#Y1NY)=I3u>pZ~0-*rKSZ`B9%y*LQ%+pSe@mRomo~OM+BnyH|8ADa;yG*> z2*Sm3SjNYF_Le4@P%w8~rJJxi@A3!fD)5Kyi^NM}Bi>Uv`}8W-n3hC7%a}!u+1Rs+ z1gj?t*Bhke6|lD)w1R1h7gZ+nlsImlng=00x=kcNEm_r`InMSz8fxl&r{8Te5yPv0 zOpXRK)$`4CbOgeMcnKjf;B7JorWMw!U@{7qd`3&P)Q4gILSCO`+6T|Roz{4a<^A@a zd^79vU^d*d6tx8D55*jLnPd)NYSl=J1569aI?JFZh&>lc!bJi+gY|gFChodN? z6c3K(9n-)QFLLn79CT6UG1{x4$qv~qa*7GeTv#kPtg{HpOz<0pfEC)a2$vNNf@zQ- zjej$ZgL|bg19p+*O)wJU6rFKxD!fd@bIR_db;K`t5_K!`gN7|+eU<&E;*4>PlT2b> z&&qzO*@^`;m($7GU|I3g_y(^@rK7~;fXC{*s(Is)5zae8A6w=cBL-to@c4MwH12U5 zXXt1WheMfeK(aPXeRvR@^WcQqa*SXY9KY+!wsxW;|BBruifE*mW#ppB3Y512v%1ey zQxiimnt(s?Js8}g8CBd_aH8Iw#ZLfA`*jyIcYG(4>S!(s(qFg*tWR&BvL~Hy5ViKN zOSwp?u}{E3=abeHFN%ncleR>jp5pQyusVAS^e%YAJOZ_ESu)uHD&@;wlUwk zB8@@Z1t*(U3#^Kq6emI0p|d8O$PC?Byq1K{=66e3+k`qiUYYlfb<>^6PofLO`K8(( z&3-D?^~>|k7|@sv&7BqlBM#>m^OtZc7C+#A8|jK6dE^baw4||kvFP^Isjxsb$>m$6 z=`(8}sP2%1F=!Lci%F>I*7|Bfy9+ujFN)(Ec;N4S^DV@Dvt4bbLe_U)Ykwy{j`<^T zfpy8}JmSnmnjGn((Ix4)u>unu)L@WgRseTqLf<5%Ts#-^WeARo3xX`!ulm`rweK)C zUkYmxC?!RA^jZvYE)(w1$%%an8_$e7y? _>Y+<`lj^_QjhIR_E?tmVRD**3z-OkNa+ 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

    !t%IHn{U!z-7;E|D~t1S*?k!?Q7d76lv)(qY~ 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%0D^q^4-M_)cQ!v;?f z0=m3ih9Q(xBgF~fgYE$*kB@Q;U|?w|Q004r+DYl)H&MCOis{k(0d=5@6p3>IhYpAe z9heAqqLt* zyb0ONS)ONL*_no?Yny?fr8-v3FxSo3z!BoBuJL4u-cIV1oXoy9w}c9Pdx}82YfF3o z57?eUL*5zw)PI`Y^ZtXlX9H)r`i~#|14$v1s%3|z<2enwVRmF~8aS*X!Al#)9u4sB z8GH+SvM4!rs%nPAIqx2hR?m{{+2jmuK1`jDaeIi?8PU5;rDjX<_-w-rhNQy;7pbZS zNoUu7@TJ1u7QPh8fB0U8ku~T?^yY;8knA_GMP{34XYB!`6jqJ3TWA{Xo_d*sgLS%c zU9-d6&CuE6urlQ+kMfhGKIPEB)$Hke#X|n<#-4Wwn9TEpMH3&E)=ew?Wo;LFTmfXm zW4<#xu-#RR;VPtbF3*s%W{3o40Voq52 zS1*CyQCx~PB-%8Vga+ekP9*jMM4E)@YiHvZOK>ZcbsU1tX%#T+XaHz>Q*UvZB5g%9 zuXjexi(p9ivt~snu1MO&16T(=cm&$h$%9ecT=xtH;o?~O$KVv&Lb~@(S+|dEV^2BK zWRj`}82nua(ZH&Ubga}<`4sF{jZ+wtoi4=$oViSoM#Df(NUU)6yevjXz!>%)G{Qpk zT+h-zgkvm|F%$~S+qS(y^1AIsI#nZ--A*82{OGTsA_95OlE#?6ahW+>{r8hMAA$b} zzVH4}b4Z@hpOt^zjj|GG&)A)^sq@jB%X)R0i*#e(vg(90TUq%UNCR{F4B0~E)D<+{ zfxb?rk9G>?2t4rrhk!`65AdTsK?>RMTyU6O+ll86r2e#{BA+3UTjH#BDy&6Fw~y8Hy+? zyYrzI^cazr@ybzlBlMinB%+EBD$qOoXqe|uYL_Y)C)?ZO_X>3SIKTt}EeL|kovskP zXg^Ng0Dz#5Vk`!dF%}mS@13wn>?AV~f$4)#F4AXkvOB(5mQjT!+?0jL0izRNQ`GQ{ zT_qe~Zo^`g$yOVeeb`E>GwE7KU~^}jvFmIcgYDCfU+aSHr5e0?cQxA_2y#xU%k3}Q z0A~sFMB}oa5Q8(N{Ao+?)r(`Wg1vmb51eg5m0Zjzaoc7$tH4NK^a20wa3rm?pWX~) zHBcl(Vy3-=TDL$$3HoHF*GZJf0 zC2;YR-Y)WNdVknk5GTM5a>y>5XyXSFNiCmUc28WXdJj21FG~-8Ydct`CD_@rkCKxm zd>*|LP+MdCC}~$H!iUmt4qO_(|rc)O>Cz zJd4SmpZwb^RllZkV_Qcf;h5yCZ>cni?b2QyTa}kq3_%M7?kB2%pu~wAayf8h-SvGh z1(ogAxAOXNepU0#d~pd3xoF!zsj8AvEmT<@^YHpuX>_WQx2L^M zX`la89_`#GOHHNR1ml9ENNN=T%~^QzdIr;mgdbqpe0p2O;&kuo&oHqfas;FN6%`=I zMIy_>5wrrpn(nXW69+izEFWOF8(kAmyg*T4M=>y(6pIL7k~Ul6?rM>-=0}`WAb%m~ zge)rNZmD^T^ne$Y1?Ue7ICfeI4HIWX@yucaqHON-WjLGjltbEh)NS!R@Hmmnt}v3s zlVGPicJ>1L1S3`C@o~;K9h=_GX!n4M30JNwMoBRAT95Y>K7JHfdR2Dwb&@jY@N!gY zBAH*n9H`UKDCch+lZ0^61L#UkTBddsyer7o&lla}uj5tU;Ot5lMGyEHkouou(qR#y zxHYl@9V(uVt@goN?6z>=X;-2$qVfUs^JPD&JWxM|b$N8+0NmHul|W_bLKlXvFiRe3 zs{9sML69V=Blr#;^WzCs5R%$N^4|rWH1P-x&+#zuX`B*|!Y5t{=ro{J2Hx!Dblb@*r0Il6)v^sxNdaB} zQb4W0?VygYT;!7LwXd^eSD`f=JngM_>RXeHx}idoHMjFQnwZ6FQMBW*A@@Rt8m!i@ zw>2Ux#-Pjk|0g1Yg1zuQt&EH&P?92AT%7u|Zz!^{9 z^@M!W*hBjEq!sU35=(%xf?HQbJAF@&$fe5S3kK^3FWF?(Yk8u?7h`L)r$xe^BSenn zhJ7d_+5>r78BLZ)XPYWsL=GTXZ_44l|2d(5fSj$++!i+~Sd<;V+3Bt0OpLnn?wNr@17rj&|FQsS;*rvv1m1d1(tN8aml zgW7AK1-%5#>tF%NmZ0w~j>F?m(hRo*u6l>HJ-M^*=cqsXrb`y*=YGRncs{TqkV|Z-9qn+ zmgnY?HfK6t8?88RovT!STNY`OPh6OX1^ccXH?JR$Pp;?NQz$P2qV=|KnTYLqpoGF@ z|5;uex^#YiEipkap2h)RTHUg%g(vW=c@F#@E0e!oGv^kTM1G20#4A^41zT}Y%^%;e zuWauvUASUD5BUgU#@XsqR%ZGGt-=SPWqpF>w69JmgzoJSm3r(AUlPa& zxN~ynO!CEj1@^h62NyPORNZ4OuGn3Sg*7b@n!R&xuyB!9hjK3(F&pb-sa6P1j5#|9 zwn`{#qJ3h!qAF1mpP~(FzTOC{ZXpv36F&CUcEPUhVc*q!^yteTcjH=sR0kiBu1!Xj zO`uu33k`>;o?E1#(Ii^hzD69_-ghy)0t+-;Wp#$Q)oNsB0Id9EOQ3L>HDH`3-f%IU z$E0)f8HB*m3HyrUb&Fk~9sI|?q#gXnNIUqC1=_*C-ng;_s<+9lqijJW3hGWbhd=v2 zo()jO{H3e=5`1xW)L76ONdyb^OL@4jA0?1`bj;+oJQLNmn50ncM&|W4rp{rNL`trL z&0-(h=8Ge~6dp%olUmBa7;HRzyzgmiBB3ME9w|s5e#Uv3xzSF^;{fOuY~y8}JFfu+ zTFTKOI=GH0we{)V>TIN)?X(6}Tjgbc3(}fVBLK$k4(|M8u$^|!l{|cgVdnT63bR(c z@&ERkoi)ax$?)8KKPHCGkMk)^ImGA$im0NSC&>#U_{VdfX0t%9b}2a{FEcV|`2G~W zgSF{pcXs8TlT(x;|4hgx$`}TgI>zW8TiApc<>x3)r+e-`@pnXwQpzMe5N|GCHi)CAMdOXoHj{HK`eC4gUiujs_Al$q=8jW!{QiMr+8 zgj3ww2ERGR)Fn3;?nwA9+sH@P$?C~ydYOfRU64GGfK>=dl({gQWo~H0=ampy&tR5j zu^LL`OF|vlWiwL-<`c^}oJOgJ{OaG`DChL0G6gHG8J-~$My%mr;o}t`@AT;GGk}Wx z|BtQ}=F<#7iqSP5k1rHVMsiyuOa05SvnYHB3NvRD$?O4XmstPYy-fDE6wvzb-xkqp z!3=MY0K8l69MpcbhP$Wf^I7`Phsm+Dy4_R5-kx=lMF)2m2~&1%?61O5V^n1oGH?Nc z`+bQVk7r@Sf^FtmSdOR4XJkTay{X&8aKhPvQGh+!2kLxK!Vcs=F*ruljr#5%gIzPg zS-%DQRCyLsK@XZb0vH&GjLhlMv`#-rx>)HM&D8V9eKqg3TbL=7f!n<7!Y#huj>;G5 z>uYjjS#*Pe3dmi7$hGu*lLfX&v`rhV>ja(A)x63<=m9fh`*>@3u?@>ha>AUF-QEry?kU^Vbgsl7#b_sn zflq?LSpFVQPDF2`Q4EjJG}z|AM54mIv^6Hzy{$RwyVx)WN99)jOudZZ z3?qwm7`KH=6t~U_h*Ck6lJXW%UbDQN7T`f>YB1CUNN=m5`YRvq4Z6Z#jRVa7@g~Z{ zW&~F1&M~sHtA$m7suB1QtCyt3C2rBYbCFgS)HTDLcIW~4Us1O_RZA7x7VGVFvjr8o z{YlMEL%QJf7SC7A;FweeZYG9H;|L2?L_WkFw9F9BkdQ|kCSIyLW&2XwSMO_)YbBfC zNrv-2*Ji)Dg8ULJNht8(?l{WqV^Oz9Fow4$e+v@vm{}N3bM(2N&_sU%!?YwMn|xD7 z+OgPt{FR_meTLE1iN2kg{)UFT;;iYf@A4_o(0Km#g1<$Hr!eX2;?}Eo#R)4%NIxFi ziO?(nPB+BS$rOtWWlqPf*kZ>OYEnxh1NO?su^p~axs}eH$= zhrTMXtT;qdL+YjCV8)OQja2Aaq7CH$r(wcYWK;cHX_A$$P=G z4#g;s2f}1vL?>u|F9;X~`XfArs*gjm!iTeYa7C%p^0)UU)r<7tZPaWf-8J?auD_{M zXHtJIosS#!?cHRabDWmJRUUMMv7c{S8jCDWmxC7!({r#k+glc0lHi6>^vR-Ov@z z#b*%YLV#+1(|#i0=JcURV5=ef_#1sGP1X!P6G!Pn9owXGDu_O3>RhG6%|6*kWb}Og zrRf=cCgASwcGP|U=(ZeXLTy5hOUxb(#@odNi(FQBMbFp>pmuE^-os zLlcu{I&?5A`5aLy##XRI63so zE~cnl{uT!|*`T-{G+a5})o?b0bOJxq&_H}@kExZk$!5#3Po1ta`>fAoz$cPY< z9WF+9!K5o}OCOFj=7Y9fb=~{T2j3b8L1T22i05n*bYMrj|JB(QaD z1r`Eg)lQryd)EL|a8$`_MI>ya3CPbR^^S0;k+w@W>x1q`AtRqiT2 zOlvD?ty8Qx1&AuKiHj_Na|Sp%0t>*L?Kw)Ju?vY$GqXwQj=u$kI`v-sZ~>ZGA9GNZ zx4b9{U8Otm)WhQscWs?Da}Uvx$qI~Z@E4z?R07D7?6~9pPj$)JQ#nwJS^~16h5Ya( zZa>l7L@`&pfX@QVLq`DjSgHAJ;KZ9Fk2PD~zD8O)Yl#n`U13LQATDlK<@Fd{v`zA` zW~pwJ4T!QjxR@Z!ELCP~x!O#A0l6J$!ed$3NOQF3KS?}KsyvS z_aGs_*xgn11$d@ASAr+`$Qybt)0npkoQJ=b%07uPO-ntm3UaVKxvnK=%lIGj>E;4> zgMSy{J?G~IUdPkH01~Nj4oDuN?sMDD~ zn{k*W$B5>zEj#GCgQMf~#XoZ~_uO20xBFS}dPwTqyQ8CxXNE#b7UON(d`Yy46K1g87(n%rjt9P)lH>u*prO& zJyg?4U%o?bt|>^DJ3yqGPqfG03bk9ZJf4BMeTzm{yhmVK~>NJstiNLBzy?XxWY==T1>LFp zntIY=VCaiI&_`o5LK6`3-VIw*7tv@)Ey=@nd%5kmWa%tmUMN_y(Eltr$?%unD;S(k zPXp_k8Bxzz*fzkfpDT4htF=2VI`fAxZslFf-eC6OV30q;gHvh+hL9vs z`r1O+DvNY3U)xbpV>0{|tB0YgTP{4*f{=2G5hNer)il=T{=H}@>~}Y?a;u|c{~~LU zV;mvIxf)JlDI^^p0Y-Q>2b*b5+PAzJ%8}*xB3QQ#Y_Z$~k%Ew0rH5T=iImMlD*M&i zvOkWQDdsCgd+Ss_vpppc%&_o9^y7w(;^4-4x;aukF5Ren3>$j6$uIjynFhHNOHQ8w zU@ZktBtQ3%fs|;8-mgH?s0^?z!$)2UTO~<$LOnI`Y%l2&x%%Kp{20vI3G*0q{K%Ss zxTdg2tB@@Wl9oA?{KR;I)b5pFF)(_=IWci~{&wXiIX*zXaeOULjJw{FJb~=`HM>1b zE)1J6OVr@3OJkwsitAjJ7MDY1OD-d@$+hhlKLRheAOJB6&78a|XqE&^;W z&)a8mGH+8f(kwWR?{XVC&zTyG>X}7$7O`5;M85Yx5F)o9p6v!QOW749Hm6qTeFp~I zZsxk5uZ--2-;SD~XyAYdf|XP%K(YhUTqtVEtMARStO;H>PwAtWvWNa;mb|!F4gdui zEKb9a`6GPR5A$(AYe<%tYzF4%e1=|5*n#7=lf9C=ApR+a#>IT8a(&9O`Y}qNvC#sF zbPGfFckF{r6CEs-4+|TcTPluWV0rVgWJe7C-Op+m^M8ZSaV|xFRcFZpNI)DqZ3A{em9__;dQ%0ULHtO4! zXCpA#xzPy$j9NI#`j^5K{Vn7vQ=kZ?anB7&lKo6z3gJT`-R1n1hS9d9`iaOW-G&sk zTH4n!R7YxP=1LXLnBm0xr5rZ?x{qd609R}oni1n#0HIqXB(gQgl<72$Ty%;`Wo-~B zTO7ZpM_Uuyadz8D7m9D`@(gUd6yM4Z00o~xSTyTD%2uaq*PcjMQfP66d_wDB8shP` zLp=WeF=~0J729$OkS+HcZDK#88$WBAiI{iCCMJRwKW)yVJu9g(SqaJ5JY#mXdqoHMmFzS9=d#lAwB+aNH#$=fP*E28-9ezISLwBva zg3shZ@aM;$jfvXSj25KT2~6zJU=#mp9-u5$2bd6aVTQHE&^OylLl^kN39d4Iny0R;Ir|eqcifc$!r&^DvXo$NjK53li$iRnYY4}3DC2^K1O+}f#&7%V|b=ISBf-m$Gt&wWh=1s`k$BQ3l5DXWGHurh2mEm^c{T$WdwWN- zVnGASq7eLk1nF6#?yo23l;NB^O3On{r)UFR-4&Te7aRTz#EVMAS(t;Oz<2lZuxL(M zo@lGQt1M#Z?p_EGf++*B1`WB#m)7L^4$;BOa#G&~!=T-&jh>mKv)gQCRz(wd4#&${ zl`d}yz|b>`Wjtw5T4VqF5ScbF1*I>Hq7?Y8ag0s7iIxSgy6-L zz858fWSci=k=2b`!=3#j8{OzI^#j?RK!Hry1|FHmeH zb6@AtK;8vDt~h9zmUlznJ+%=tp_IK3;38hkd!fP1=G}3+@gNGg&!A%nTCnpeEtrM9 zFu&c3$Vc#iW!DZhQ|SQaWkd~{Euz-uUQWdS+r5|S$O4>o{lts%mxtX;<(Zr3g5Qu!4ZB0-50!f=D;W_p*F zE*Xt_w-JoM<4i%Jcr~)|dgV8eQmH$=xZA2U^Ar1_&LENeaDi0CVlOBH+Ffis<&l!5 z%dblUJx~%^_<)TAm_Fqn>`s(r#mky;249^Y4|PxmmT4D$NW@xT9){VgAj?7q7j7qn z&-dc4I^kOKhn1(Alotdkad9p_mny11kZdFmj~OruJz%>bQHzH;;`5SP4b(RTGd`RG z*9#e;nDex-==BJsQPNer`26{94O zS*Xy{qHIIwJccc5(;&2aSG|u|!s{J#SrM8Qi@7WTD{$6+p{Wwo7>P6C)phA)wKV-L zVEJYBh6p;I?vLp|pQh~8D#E3bH`_13fP=--I>D5iUt`H^F>VUZyZKP|E(2HmR2TLV zAjYKl_q|N)Km7}_)4I!wD)7iL45dTBCn8P5{<%h=xM{{NgV^Jsq$u9+>c{y=W*%sy*7_3KDBy37Q4oV>R5X#yFTY zECT#~C#SbrAggqEXDE2Zgo*UU$cy0H@r2a}$hEI6XRYnDwyi2a-hM*d!F*=4{9bf> z?s=ooVoN0eoQ?YFS*wdseXD|&il;%$EfCGJWv@76G*4~^%lPRMCVYKIb-n5J@Fw(YjsKxwKwz(Y=?bCITKT&vWgi^?-JQx5{& z#YG?9;RYI=hr5&Vy_r6&>mEeG()-K&t)tj8rqj*AQ_O2`%^hGhG=}GOaVwBaps&F! z{ABw{yMQ;~*juKUuR8w-!G&`!OagXrs#PS*m0W^2!*ga5F7t;*)ZWsatD+$!1F2hr zpHE-KF$SUG3&*UOQ?#oEh1C5F6UZl9%89|5W-vx0+cId1Rlk{#P%F0(07bmU|?m9k?!(fN4IA&DnM zK-UMl#>ZKyW|{?pb#Fw-&NsCvraR8qDr5s*DMdlN9Q~+yD0r1FvjUTF>=#zQ>mN|x z^J}7Ih<(8*=(iu_IDu8i!Vt#z2!Xk3km|W1Dx155qDyZsw+T#v2}y5%ddtk6pguY+ zOhh>6G`QxOKSlU8en$r0*4G|iA{zJ0=I=SD4>ekx)|Cz$eVd~w-az-Ygi)HWqsha} zIMx?h*DaDt&gxzpTD&r!lUICBE|;=FRdE^gY|!t_#2WcGuy&r;@;QohaJ2s|=$t71 z`>6(>ht>F^JuNVgvK{&@z!`+6fc3sR_5g&!ser5pa#v+~WBLd;M)@=nZY+4>luZPf z4ENjF#!m5dh?UpxL0Kuvnt?`mA*5XBjZfc8?H8iLr?I_0-K{`VWZ`(`;78|YIUD?f zp@wIOst0nd+~9s{2fJ3|I*69=pY@K}c4z%-hTTNj8~UpjK4V36H|@wsOwAG`E-ivz z__Xh%?D|y|Gvp&QD-4n01_IR%(C5*!p5T4jV_hL+4Q86 z-LEJ8b-@&iZ$SnsP6p?{v;C14zQ`jaVF2_F6nIi}+TtF>n0l&o8Jy}r`0bw&Cw2jF z6is4{-pDvGdM&THNxO{@7|!-qnb}UKuM(Wn=0kMn zRBr{UM8#-wUyDj|TBa9kKJfs>ArONgzuS!dtlIv@j6wBmWkc9@yQxFJi;= zsp8h40RG$r(yUk_!Tn3?mNf`mhyjJnf)_6~9|BWkD}P(E4b=4$Y6}|tWc4a(J!gX# z=~*R@gdF$Y)8SFF+)oa@tvjQbT;6z#w4_*W5(noTaCHcJ-D%@W?p*%9hxal%iG;_F zW?@dr>;6i^F1FG~Y%zAgw{xl|sJKaq_8hl_SM%Zn&eOV5>QyNUS4A9Pgu#1?iTv#< zCEf@SvrqDNAc(>~>-_RmwXo?# z9aoT?Dc~(pG(WwvPu{z?58U$l39~4pq#jT!K_pM<5sS^S#W3W|2AA33KJT1hEr%KP zw^$JfD*m}7!7y-k3*$+u0c?vwgFxAMXG^fzXrHr3dvFyOylv)`NP%RJ(s74Qb> zC+JH8X&WrhWcwNRN`=k>niSca4OH}!?dSY*4ZF3|?;qg?r|&0)nwB zV7b~lzGO!W+|##hXHITGEv12 zK@Yd%_8Mt4+ONsVtamWi>cXj_1IRa;(v(oB4#6`N5!$mT1T;vI5;`R*V7=(nENo*( zW{;fCQ;tj92dUOk%=5(huedvWIw?EdYUBJuYjCKO^9}pJm#$P$1L9B@(dk|fV(Jpj zLq*Ah&H)L&D!kjP9zWZj{X@G5C#jRhoU%)Kw2o1d?`7%~sGN0fj0d=3yz zZ&g#Boqcf1b7t*heIG92z<7r{-kq8qAmQ%cpy@HINXCic^oV}lG><1_cy%7DySDVx zTnB&(aY_VTC|T;%|Me5>yumy|VN|TIgV(57knJDmCoGTB3CUez=sszUlBW57HCr$F z=}ubROt;R>^NGg`ycB3D|G+o2c4czB z3-hegAKoj zPR}%~o1{a|(k$zb*&juxS$tuE7Lj-dxq?y~U{GM~1q}r$qDB6aQM|G>8Kh@wi@)*xf{4vezia8{P^| z4q&*^F2Yt-?n$R2M%pn&0fngvIoeOiYBUD$fFMW^Gw{XEC1=^EB(ORYCuTp#P~{Ja8d8gZZQ8FV@Sp zxym7cl`NHG>EbUequp~s2r{WR1k^JtrX=$BxkuGnZ>DmQSKI#$t03h zI|`v$b@IOMvu$7q&bKNotJh*fOa6SDUAwjx#vFQf%jRCA(as*Ta^@6A0pO5 za4<_*?A2+JhAFh34qmkfAkob1TbQ@I(;z{;{ozRNd^Rmh?y=Q>yRse|?132QTqF-8 z2!6ahCKUe)SCS(pXURDO%r2Y2m9t>svnHxv%}Mu?2X}tkDslB* ziMK<7L#7AM+_!McgQ?ibQ%CCm;=HOiO;Lm&i1aA;?Fjpz}nEP zN+1I;e0DkAL4nX~kW}>kjH-cL zk_i3*kzXX1YY9n4o5Ks>bi#*77uBDb#F=&TLJRg8k<+q=0;5B?=-;D|1f+T8&ZQ@4 zE%MXfk)F$=+Tr%3Rr#DYP&7VNR5L*Jh z{lxqf+tAo+02*yBqx@x)QaU&8rvMVXsmGa|Hk2p#Oft%6;DizBZ_?k&zLEpDv@^9R zzLAh>m&pDGspEHKfJq`c?XB5@kBYh~5k&TX60h0Fm3mc$&{{gRH1 zPhn>uO(6-?SLW%&-~ca@n1yUF!|1urQP~2Ly!Hf98nR!}ozmpAmx`obu&j^$*gT&usI!k)yZ=jnn zn8p8ecq3mWwA-`itG~vQ~0f4Lb5sKMAdnUXsNSasSHOPx#oDZSI6!{c$TD z-a<{GQ)iu)oTs5==kQ?y;-*Tk66$2{EQA>j*O4`+`~Im;Q-p9xqC4K!oTI^fUKwOx z@o_$R7%;d3Y(I!9z8u*7#5IK@$%BQxo2fh`(FSw2U?+D#Y9Q2PAC;WSWO$S{ZnIUi z!KqS|^bd+PL($bJgI18_b0I=F<6M9-oBZb8@Vs+b}C zY50zJhQXy;S9;0zwr5++t30DHH(JkWTMCwEYH;|!S-)coGq!p-yi4^@s1Q~I)RF00 z+f`?J77OI#Q~Si^AVGY1Cj^+^M-eSySX>;iF-R8oxoXDg{RuKbv-9cip`FJL{;r#Dj&r(aVjg0c@EHJfKRpUT7;I;x{O`T9qJr^D%9o24pp!hZ zuV=xgz;_37!Q(e2zi@ks(JWYJ@<3J*-_O4#zwc34E`_~vdBK)Hwyot_T;0ebmG+U( z<;jbJIsdWf9_9CUDiOr&#CL4Acnns4A*^k+vx6HT*jK4dgn}$(dd#?-Ju}%;N*hOP zlU!hq(2O7k#oQeN+>k51O^6-H{0Eg!QLjXf&{I7p~CXc zd8|>WGVVOz%eE{3)?>;65|e|IstxXBE2rFm&f0n=8A56CQ8S(ly&~yd^H(e4qtBm0 zk}Cm}D-pDf8^0w@2#cK0cGKD|^kBFvOn#M<{jEqrnV!~?*2#2ZP+8XenEhS6veir9 z%wl>Xh#7gm!>D8DL3Oa!k;M_<8S%XGQDJFCvxOL&%9?5liyj6@O@D8|4B3<*#CKW- zi8R#Z`)u&+9jwFtaERj4h$z#*6~)yh3|sU_CgrVkeypc<8r#{C6ls*)v(PSiyF>uIv=g5f z=9SI?=&%mg@m!&qI=-o?$p(%(=%LA{QLlkAY4*CAw#Xl5(~TWOT!-th?6%U|UHF$w zZwnhBTW`+mUk24NMWWkKzTD$6wuOEcFz3ajrI$$;&}o>LN}{a!=9yt)@Da41WdUo% zYZbaJlz@wRG=b8sIFqNu0&Lh1VYyo#Ep4xIm{-ayiGHpfE~avPidrCt(%&Jt_>eU~ zFf37<7(NyADe+g4A4X19y2)l+t`|rT^(sCwdcP<8JMPaEM=y>8e`1ysXKVHG_Pe1g zjnLnCQLi_W^&NoT(q&RTQ@TwINKr9O=-FbkfR4wV^Cutu3ulvSJqzGB&FGo$6i&{Y zDMen;$aSDPiCT$6`QqZ|k;t9(EF1+Xacty|Kb&??v}ciN4}jQ@ZbR)VqRv-it(+cv^GlElkysvoIzXBOU7k@WMWJe)t9}Ia9NrXU!wY2Np)sC;J3U+ z>Co*4355{$cbYDI+k{TMPpW@!{zu<}MPpK_%(^uWo{fd{aURBk5`^0y2e@2gE$KIl zOT!-rT{+j_zF^rL$y|o|`ergannriCi^*`tLqyvaTYYRs>_Ns(QP{*44grfp=pDF* zzP`;!!AhXXR=kAw^r_bgoxH8+eocp(QE@>5((y>bjuy?1`hvlq&vYbL%L(euFddz;K+R zb26#^3=hrZawVoQvg#=7Um(dB-U@u-nE~?pzXvg!o(1B5X*Y(fr?Z_pOxdQFjqfJ( zAfu0~Iqfw4i>;6DL(*C1_S5_rq7-hccVc#M{R;1%#EUE)R8af=s=gyp>nL-dN{WC% zrkzBfL!|@F3KZ4+B%>KOr>WHD+8}X|f9Nt4G+MZmf)FIy(byp;`Sm{vns$GsS2x)0nrng_=5xD3ZlD8`jZX?-va|6= z|18<7y4`h-`F| ztkjF#H~Bj`dYl+yiDa+r5(%>~6s)lIP6c_xPER}TDO#zybQER@W zFH5>xy{l+X$msfn)EBW9h#8ty>|32?EIi7QjrkXE8wh5a)A}VTzsGDPu5#w3-#<>Z z>W&`5dE+HLW}nBmdxf{Uh5F}(6v9stekr+3Kf-JsddcvMlYBd#hD`;4CS4p z%cc35{TFM58H^~L1ZO-x{Y21HMcC6ko_mRAXQRu$wKnB0;-f0QG#*FhR#-mROITg37@VRF78;sPY$kApP2Y#Kx9KVUQY zUM7RaXXr`vnGBZ8ayC=T$30IgF@@@&gfOZI*teD^r`tA5KMUYHdlBj2+S%=9PP6eD zCgkllXzpg7*j<9ImaKB=w-?GDG+DC{kqL5RAYgxg!Cp;a1@n&b`f)lO`+BtZwN%R= zPJ)gDdq4MvdRZo4g^rx@|LypB0~-8SJnqxdULb=VN> zHRwgi*6&qdfPtMIsYg=v4=>e#v~v$+DSKCUnq&M>@nC7>wYU~M5Q4{e*nFoyNW zb|E~k+Iv0tHOskep3m1Hc+348eR_9U1q=J4y1`8M!{v{SQv z=bO|Zkj&V!nL@PxRPlPZ>B1ZgI*%*KORReF7tBdc4MIR>#&cq z>w!k`xdcl$A525%v0(EeI$$FEMKSB{7}oOJT@hh}c)M1Ts!kRp%e8AD6?BNXowUa0 z9bp>mjL`Hd-m3M-s1_$bicjj__!+9V$w{U7J?d!u617iSm@liffHzesAwELVtLQeO zmSytRwo|d!Y6GP=UxQ=S)FK$-+k;0e%O9E;)ZHIbyK*p?7Lo(3_KsrmABk&axtR?~ z=E16z&vjw_gi|c|Kkx^-72MUitKMJ&a94`i8+ekN4hZ>q+ zv{a_ZIl8RMJK`zmKSUa|>BtA~%hOHo+p4Ah5jl~MuaGUGd;tE+=XGbB4=b{)q`8dG z-n@M@@#OGhb0b_9DHvIq)DsPd)TBi0M-%lm6=zB*pq1%Wy&7PD|;L~H$g zFaB41HN9uAgTLIQ!&_vh1$Q2>7lb9 zxcy2rjr{!_ z=|4t8-<)TtQX-U_Vmp*RvTXtZ+DtE+V$?y{NRDph@fdueJuZLyW|w(J$?4AYGV{}Z z$WjPYN1h_0>jK)6VyQyl44Og1q%uluY*yKLd}7r-{^HGS?LDBL4i_ZztQY z_BhHT{ecFDDG_Bt6EZRuvPn}{)%mMcxywEO?f$%#f^Yx8CN5qP48V+Qm;jZ z1GvoV(pIy*>1WUiUwUp8B79pQ zVO9CkseVEYF%#iTzZJ`@N%JUKsm7WKLz0uY-+9kj*iaOqV12R4PbMOYSbhG9^D~zD z#7yPo=GonRaTGJMfMePM@0HUwDU_GCrhl@?{rL(NmN#Mqf9LryO8 zl?!wDv%yA8J75Rg8+yUuV#ZuqUua?a>HBo=F7JS>{{MYTt5y4dd;dig;D7#yD8T<5 zQGoxsfC5Bkj@^T~(}Q;#qByJL)wKtG28dLI*K@~VE1|O}ldeiY5sC@MwgCw~Mht^A zA3ujq9UoAUHn!VS>us*MAm(B{u+ctx1C6j6exyT3HZwndt$>K2=Lz)TATT@q`2@XKxtmm8hfOmi)m zv&+Ae*7mL*TavBzpOYj%3YDLsI4ON7bQA5i;p9~3i>_>xl5qkzU>F+db2;6sQk`(g z=48?v0v3N}(5;lp! zocE&K19Nvb*bVnf`LAF3#+VhKw(pNetFoLn_#hu1?4+ynuBS$i7Yl@lJM@@|<;KN0 zcAYSM%AQ@kj+T|s=$F8krt|nWh zVO81(MBwaxYt{2`jOj!?GF<|nS7CfmGY%DYN0`))G=Ru{^B+l2B%h|{0yY&jaqb9q zPE3`1ikfjN#3ofMCADi{A{LJDjAxIc#ZF86#aG~Lz%~Lu#*O(&PF=VSZ0g63twiTsq&NM(WH47*D_Mj{af_tD-X%vx{!fgZmWs<$U}Lu zb&r2g6$le)rpEmgw2HAIIlJxT9Uywr#octZOKF~(ns|%zxyah0wT2}uyvqEVRF9o1 zp9@@&a&Jhc%Mq>m^zBHztbg_~*j8ovQxzGcSjptJI>b=4XJhG2jBS61%p5;2jfHzb zXuwbcx%$x{JtQM~kYG!@*OQAY2`c$cy|z3#WomACo(-#X8nMgc2D+7eTodGYN_+we z9IPxELvc#GFK3tLH!45Dg&W*|Mx8_v|HcL?%FKy2-0K1a=im)q&PPkA;zc~OlS#}~ zQRA@xHAnraHZ`P3q~pzo6AttuumI26@?b^ZtkHSJS zN{womr57_E1CptpSvWE+6ted*_E*;^_BBoe27^c1S>%+`_xmN&D!d;w%Lu}pN{~yo zNh?vxo`Gf`%kcC?)i*?A+=!aT+^hfD(iM=u|0ler3qA$+&(w$xRhiw*_eLmRt0IekG&e=J#ftryS77B+Y zzv>baO&*(OTOjx-$)Wv)WVu8hgcs*>+c zEVcXrvMfO990E%S|DilTHBhlX@bp3Fj8<3Pj(NOtGaOhF5|7A>wsy55iuTsK^b6m_ zT@SlS+!Wq-bVa0<=vU;&Thi1>#=P9+G>4eqxY%k1ZKHM?g);-kpBD&4+G z32`<_B%77hSh1=+n*U5~nz}cRl5i`oI5etgt7SM7zlYyTxkG1Mqq(ywh$UuFM{cG3<8<$rzV}UZa&FN0~|(l6YSE-g;XG6SJD30 z*T$qBL;<*XjL>WLI0MFhWy!u?Ldj2@fyo~*&yN9Kwa81sS9V!~M&Z+Ya4kdvG~^(@kixmJ``Ex5LsiB!C;wfn45%Wjuo73n<0OadONe}+!)rFyo* zSO3s71BkwZ$7Z4FDrVf2Eo(d6$_}CtQ>v zwevok6l8Qj{T-tC$d$uUU9tg>*Y$XRumkflJYrM8?sQ|aNxQb3KM-Ych`y(okiH1~TR(MjH6cB{X5sKn z8H=d$3VUmIX*57X%HmZr?1ePWw2OPP{eqv9mR9`d$+(RfxHN-G&B0cBav~2+iFbq; zM;2Va0xK9wdw_eLoS_Aqg=5dX47-rfsxuI)FKL;4hH5o;QqY?L$1*$0E*~PC00lvF zu~tZr9DWtcB6eC_r52D6l+_5d$p`s!2g!CeSAG`oEreR{h&Fse)u-qyBFcs=PAhtM z(5rg+rHk6Oi*_vnEtE?2Jx*dzK)*NCv2V*Cvu?hwp?30NF>%`6uE1pFvt94FF*~p@ zqY@ziX%;XZ5c4_X#pp;l`lZJ^Y7yS8!u_yqSGg?b%Y}v}auI{38_Bb4WGA+cCNnom zp}=$plRFh!GUL{JPI?T?c}pHjce@Z5288hVQt+9aEQEYZlM;$`hnln6t}xI$`3s>vtzSKICF{%zJn?0_3mos+E=pZN z5;UH$=-N4)M)9ewFFF98{+;dSb0{MMlfP)cYSIUL`xrL8*Q{^DUMsFUE&-cYO9;4KBbd#B#>L7jV zNrK9b!ImnJ%)_&=-|~C}_f2=Vva_;#FYHHv^v|%A&(6dC%*^3D=8%)QJ*$Gs(Yzh) z^6B!GTtQX=mV7UOL7M@nNfWs85HkZlpIO%Qh$+I8RtA%D9c|Hl3bb|5?IYH79Cq#D zNwk?kXwP3$gum(?Swyd=_OAaJ4$v!RS)u8XyA61(3o|IgP4dn9=4ki8*96g9RRr*+ z4ksr^*+cgy$7c+j|CZ|>sx#9hEl~~0uQGJHgG#SlUsuHIRxHwC?Peu^J=Hu3P>Msk zQscbx4phdXqbAf0ZZ^uk*F$OMhZpqjaff2_l{-{O;mLGtLZ-)8=}SAW(`G(AOA~zR z=!T*{chyMq!YVksp6pa6rw3BTG}9!Sa5e*=^QE?m8 z=l94A+M9q$>QnvtA}oL#>dw}@kzjZZ58iy2EreA}qx_0xS3YXrdnUUT_4&mjmLwG+ z

    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 r*2TTuH?{Q3c8b+JbET(0$jo(V% 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

    m9a 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 z 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 =x<;Mn`O5RvWR+kEiT|!DbN9M~& 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

    g+mkMW&m~|{HXUa|u{$ql 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

    (6BPnrsW4S)3gb*r$ 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%0AqI3=%I_djur?H(CSqsi52y5u?N)lYu`BrhxiSZ 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

    Tc|K$f?F_IDp51b$kghde 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

    +

    404 Not Found

    +
    +
    +
    webman
    + + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b9f722e0eeed8dc7f3639bd3295a7b0376b98eca GIT binary patch literal 4286 zcmbuDc}!GC9LI-{lvLYdn`%sIykgTPHU44S)cR&9&1g0})ukRu+b zsI4iH+Tum=wxm?+g|1x7X%O&eYs0dFEXuJv?|~SRU%$V%yN_jIWzi)cX5Q?Z`F`g& z^PBfT2tWLcA20Z~I66XzQ9_8f0h+{zfZMeXzI$!B14qNqe+Ms>0t^d|k|#hpcn^q~ z;CVg3dWG2j%ifLf3af($0x zFqHZ@&|>{}K^tIw<{IEO5%LUi;PHV0JOSi}L_G^kF%-24L#d6mnNZLTT>4y=fJs32 z>T3n#v;Jb>u1$s#{kl4$sCDYsB{mVVOo|!b%Y>Or`)Ip-WMT~hhU&qo|1rvkx`)Dc z3eN*q@6-It4HR~%KIfv@I@xr$`J)wSwu_-_>;xY!T~{fgJ^dN=dHt(3eaw6QQ5(&Q zwbSe!_bDQ$p3rC#TC=DQ1t2=B$w95sS3oCG8?O+V{O^KwP2A z#JKe59cj_##AAmi*eL7j1FC3lq3dmSsf7^;4_WBvlMm=;#>pmNa_ zbN6mz6D^FlYx?YA-dafqFMD`^pBqx8l17ELWJ#L6Tv|SjloLN+GW0x%FxdnZY!{J* zO>bu3zE@n@Xrm(g1kiF6>)}|NZnR~9*Ma-cgVuwiY@)K+DvIix zgRsv#uD3~jt+NXh3XhXo&T-yFZlPoKYP(QS z*TQ4y`W)ZW)fHq&oMLL^ISVq=dQNX$&xlL$K1x# z*7(XDl{RE3ywB*nWQl#}H3ly4Cosk+Zyun@=e8?%w36eyYL}hLt={+9v0{aOIj?AY z&fVhxb&f+O2n7A&0BwGLmwI}bwM^2!bF$w)ca6_E*FOh3kc$sBYV94a`E&Ugq}JFv zUI2YO@bePdQ$U|M@LuPAo?E48`R&s6T0+lcHq#kXA^lZmqVmQj`0L|ALEl9{RJ+9? zBwEvF5AT3{ps$4w`&^&nANhHd5c>@!tuxTZHQ}@=WhEJJ-SqVEFZ8Fd2lo#&S)Z8* z_5ps5X+Ag(Ntt}s_vQln>$*J0l6s4#{qxQkI&ok-*hafkmQvcTMCbFO_kQ%<4_@^2 zzeWJ+2eNu`#%p8DK354;Lol7p6fud@%wulH<1{44HRY0Ks{v&TtXTdEpTWA|O34LUvWxqcXMUTb6W9?1XuHtqZ&nG)l^rKAmuHEs4) zB@AIt%@K#v30S=-d0QdDYxZT9iy zD*2z!VqR{nZf6e)`*;iRdk3Gh&V8v;dak0+*M06>|6-+l@VPb}Ttsel z@|n4OhceLL37RLIYdu32dP)cEJ5k+^SlHD-nud)91PZ{o+ zzq%#)Txl0+$CLm(L*M6p4y`kYcOBka9)liSH{d#+x;9dMR}dLv$B}VbAQ?vokWn}= z3x8s4pi9FKr63Hx5d?v8ATSXag$OVU;co-o_?H7Z`k|xHI-r3NX+lrJ=!7o`Ul1Dq E2mbpSrT_o{ literal 0 HcmV?d00001 diff --git a/public/zlibproxy/jquery-3.6.3.min.js b/public/zlibproxy/jquery-3.6.3.min.js new file mode 100644 index 0000000..b04d0fc --- /dev/null +++ b/public/zlibproxy/jquery-3.6.3.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.3 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,y=n.hasOwnProperty,a=y.toString,l=a.call(Object),v={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},S=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||S).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.3",E=function(e,t){return new E.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,S)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&v(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!y||!y.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ve(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=E)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{if(d.cssSupportsSelector&&!CSS.supports("selector(:is("+c+"))"))throw new Error;return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===E&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[E]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ye(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ve(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,S=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.cssSupportsSelector=ce(function(){return CSS.supports("selector(*)")&&C.querySelectorAll(":is(:jqfake)")&&!CSS.supports("selector(:is(*,:jqfake))")}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=E,!C.getElementsByName||!C.getElementsByName(E).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&S){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&S){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&S)return t.getElementsByClassName(e)},s=[],y=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+E+"-]").length||y.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||y.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+E+"+*").length||y.push(".#.+[+~]"),e.querySelectorAll("\\\f"),y.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),d.cssSupportsSelector||y.push(":has"),y=y.length&&new RegExp(y.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),v=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType&&e.documentElement||e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&v(p,e)?-1:t==C||t.ownerDocument==p&&v(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&S&&!N[t+" "]&&(!s||!s.test(t))&&(!y||!y.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?E.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?E.grep(e,function(e){return e===n!==r}):"string"!=typeof n?E.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(E.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof E?t[0]:t,E.merge(this,E.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:S,!0)),N.test(r[1])&&E.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=S.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(E):E.makeArray(e,this)}).prototype=E.fn,D=E(S);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}E.fn.extend({has:function(e){var t=E(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=S.createDocumentFragment().appendChild(S.createElement("div")),(fe=S.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),v.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",v.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",v.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?E.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&E(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),S.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;E.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||E.expando+"_"+Ct.guid++;return this[e]=!0,e}}),E.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||E.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?E(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),v.createHTMLDocument=((Ut=S.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Ut.childNodes.length),E.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(v.createHTMLDocument?((r=(t=S.implementation.createHTMLDocument("")).createElement("base")).href=S.location.href,t.head.appendChild(r)):t=S),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&E(o).remove(),E.merge([],i.childNodes)));var r,i,o},E.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(E.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},E.expr.pseudos.animated=function(t){return E.grep(E.timers,function(e){return t===e.elem}).length},E.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=E.css(e,"position"),c=E(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=E.css(e,"top"),u=E.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,E.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},E.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){E.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===E.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===E.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=E(e).offset()).top+=E.css(e,"borderTopWidth",!0),i.left+=E.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-E.css(r,"marginTop",!0),left:t.left-i.left-E.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===E.css(e,"position"))e=e.offsetParent;return e||re})}}),E.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;E.fn[t]=function(e){return B(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),E.each(["top","left"],function(e,n){E.cssHooks[n]=_e(v.pixelPosition,function(e,t){if(t)return t=Be(e,n),Pe.test(t)?E(e).position()[n]+"px":t})}),E.each({Height:"height",Width:"width"},function(a,s){E.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){E.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?E.css(e,t,i):E.style(e,t,n,i)},s,n?e:void 0,n)}})}),E.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){E.fn[t]=function(e){return this.on(t,e)}}),E.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),E.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){E.fn[n]=function(e,t){return 0 1 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey ) + return + + // Ignore cross origin links + if ( location.protocol !== link.protocol || location.hostname !== link.hostname ) + return + + // Ignore case when a hash is being tacked on the current URL + if ( link.href.indexOf('#') > -1 && stripHash(link) == stripHash(location) ) + return + + // Ignore event with default prevented + if (event.isDefaultPrevented()) + return + + var defaults = { + url: link.href, + container: $link.attr('data-pjax'), + target: link + } + + var opts = $.extend({}, defaults, options) + var clickEvent = $.Event('pjax:click') + $link.trigger(clickEvent, [opts]) + + if (!clickEvent.isDefaultPrevented()) { + pjax(opts) + event.preventDefault() + $link.trigger('pjax:clicked', [opts]) + } +} + +// Public: pjax on form submit handler +// +// Exported as $.pjax.submit +// +// event - "click" jQuery.Event +// options - pjax options +// +// Examples +// +// $(document).on('submit', 'form', function(event) { +// $.pjax.submit(event, '[data-pjax-container]') +// }) +// +// Returns nothing. +function handleSubmit(event, container, options) { + options = optionsFor(container, options) + + var form = event.currentTarget + var $form = $(form) + + if (form.tagName.toUpperCase() !== 'FORM') + throw "$.pjax.submit requires a form element" + + var defaults = { + type: ($form.attr('method') || 'GET').toUpperCase(), + url: $form.attr('action'), + container: $form.attr('data-pjax'), + target: form + } + + if (defaults.type !== 'GET' && window.FormData !== undefined) { + defaults.data = new FormData(form) + defaults.processData = false + defaults.contentType = false + } else { + // Can't handle file uploads, exit + if ($form.find(':file').length) { + return + } + + // Fallback to manually serializing the fields + defaults.data = $form.serializeArray() + } + + pjax($.extend({}, defaults, options)) + + event.preventDefault() +} + +// Loads a URL with ajax, puts the response body inside a container, +// then pushState()'s the loaded URL. +// +// Works just like $.ajax in that it accepts a jQuery ajax +// settings object (with keys like url, type, data, etc). +// +// Accepts these extra keys: +// +// container - String selector for where to stick the response body. +// push - Whether to pushState the URL. Defaults to true (of course). +// replace - Want to use replaceState instead? That's cool. +// +// Use it just like $.ajax: +// +// var xhr = $.pjax({ url: this.href, container: '#main' }) +// console.log( xhr.readyState ) +// +// Returns whatever $.ajax returns. +function pjax(options) { + options = $.extend(true, {}, $.ajaxSettings, pjax.defaults, options) + + if ($.isFunction(options.url)) { + options.url = options.url() + } + + var hash = parseURL(options.url).hash + + var containerType = $.type(options.container) + if (containerType !== 'string') { + throw "expected string value for 'container' option; got " + containerType + } + var context = options.context = $(options.container) + if (!context.length) { + throw "the container selector '" + options.container + "' did not match anything" + } + + // We want the browser to maintain two separate internal caches: one + // for pjax'd partial page loads and one for normal page loads. + // Without adding this secret parameter, some browsers will often + // confuse the two. + if (!options.data) options.data = {} + if ($.isArray(options.data)) { + options.data.push({name: '_pjax', value: options.container}) + } else { + options.data._pjax = options.container + } + + function fire(type, args, props) { + if (!props) props = {} + props.relatedTarget = options.target + var event = $.Event(type, props) + context.trigger(event, args) + return !event.isDefaultPrevented() + } + + var timeoutTimer + + options.beforeSend = function(xhr, settings) { + // No timeout for non-GET requests + // Its not safe to request the resource again with a fallback method. + if (settings.type !== 'GET') { + settings.timeout = 0 + } + + xhr.setRequestHeader('X-PJAX', 'true') + xhr.setRequestHeader('X-PJAX-Container', options.container) + + if (!fire('pjax:beforeSend', [xhr, settings])) + return false + + if (settings.timeout > 0) { + timeoutTimer = setTimeout(function() { + if (fire('pjax:timeout', [xhr, options])) + xhr.abort('timeout') + }, settings.timeout) + + // Clear timeout setting so jquerys internal timeout isn't invoked + settings.timeout = 0 + } + + var url = parseURL(settings.url) + if (hash) url.hash = hash + options.requestUrl = stripInternalParams(url) + } + + options.complete = function(xhr, textStatus) { + if (timeoutTimer) + clearTimeout(timeoutTimer) + + fire('pjax:complete', [xhr, textStatus, options]) + + fire('pjax:end', [xhr, options]) + } + + options.error = function(xhr, textStatus, errorThrown) { + var container = extractContainer("", xhr, options) + + var allowed = fire('pjax:error', [xhr, textStatus, errorThrown, options]) + if (options.type == 'GET' && textStatus !== 'abort' && allowed) { + locationReplace(container.url) + } + } + + options.success = function(data, status, xhr) { + var previousState = pjax.state + + // If $.pjax.defaults.version is a function, invoke it first. + // Otherwise it can be a static string. + var currentVersion = typeof $.pjax.defaults.version === 'function' ? + $.pjax.defaults.version() : + $.pjax.defaults.version + + var latestVersion = xhr.getResponseHeader('X-PJAX-Version') + + var container = extractContainer(data, xhr, options) + + var url = parseURL(container.url) + if (hash) { + url.hash = hash + container.url = url.href + } + + // If there is a layout version mismatch, hard load the new url + if (currentVersion && latestVersion && currentVersion !== latestVersion) { + locationReplace(container.url) + return + } + + // If the new response is missing a body, hard load the page + if (!container.contents) { + locationReplace(container.url) + return + } + + pjax.state = { + id: options.id || uniqueId(), + url: container.url, + title: container.title, + container: options.container, + fragment: options.fragment, + timeout: options.timeout + } + + if (options.push || options.replace) { + window.history.replaceState(pjax.state, container.title, container.url) + } + + // Only blur the focus if the focused element is within the container. + var blurFocus = $.contains(context, document.activeElement) + + // Clear out any focused controls before inserting new page contents. + if (blurFocus) { + try { + document.activeElement.blur() + } catch (e) { /* ignore */ } + } + + if (container.title) document.title = container.title + + fire('pjax:beforeReplace', [container.contents, options], { + state: pjax.state, + previousState: previousState + }) + context.html(container.contents) + + // FF bug: Won't autofocus fields that are inserted via JS. + // This behavior is incorrect. So if theres no current focus, autofocus + // the last field. + // + // http://www.w3.org/html/wg/drafts/html/master/forms.html + var autofocusEl = context.find('input[autofocus], textarea[autofocus]').last()[0] + if (autofocusEl && document.activeElement !== autofocusEl) { + autofocusEl.focus() + } + + executeScriptTags(container.scripts) + + var scrollTo = options.scrollTo + + // Ensure browser scrolls to the element referenced by the URL anchor + if (hash) { + var name = decodeURIComponent(hash.slice(1)) + var target = document.getElementById(name) || document.getElementsByName(name)[0] + if (target) scrollTo = $(target).offset().top + } + + if (typeof scrollTo == 'number') $(window).scrollTop(scrollTo) + + fire('pjax:success', [data, status, xhr, options]) + } + + + // Initialize pjax.state for the initial page load. Assume we're + // using the container and options of the link we're loading for the + // back button to the initial page. This ensures good back button + // behavior. + if (!pjax.state) { + pjax.state = { + id: uniqueId(), + url: window.location.href, + title: document.title, + container: options.container, + fragment: options.fragment, + timeout: options.timeout + } + window.history.replaceState(pjax.state, document.title) + } + + // Cancel the current request if we're already pjaxing + abortXHR(pjax.xhr) + + pjax.options = options + var xhr = pjax.xhr = $.ajax(options) + + if (xhr.readyState > 0) { + if (options.push && !options.replace) { + // Cache current container element before replacing it + cachePush(pjax.state.id, [options.container, cloneContents(context)]) + + window.history.pushState(null, "", options.requestUrl) + } + + fire('pjax:start', [xhr, options]) + fire('pjax:send', [xhr, options]) + } + + return pjax.xhr +} + +// Public: Reload current page with pjax. +// +// Returns whatever $.pjax returns. +function pjaxReload(container, options) { + var defaults = { + url: window.location.href, + push: false, + replace: true, + scrollTo: false + } + + return pjax($.extend(defaults, optionsFor(container, options))) +} + +// Internal: Hard replace current state with url. +// +// Work for around WebKit +// https://bugs.webkit.org/show_bug.cgi?id=93506 +// +// Returns nothing. +function locationReplace(url) { + window.history.replaceState(null, "", pjax.state.url) + window.location.replace(url) +} + + +var initialPop = true +var initialURL = window.location.href +var initialState = window.history.state + +// Initialize $.pjax.state if possible +// Happens when reloading a page and coming forward from a different +// session history. +if (initialState && initialState.container) { + pjax.state = initialState +} + +// Non-webkit browsers don't fire an initial popstate event +if ('state' in window.history) { + initialPop = false +} + +// popstate handler takes care of the back and forward buttons +// +// You probably shouldn't use pjax on pages with other pushState +// stuff yet. +function onPjaxPopstate(event) { + + // Hitting back or forward should override any pending PJAX request. + if (!initialPop) { + abortXHR(pjax.xhr) + } + + var previousState = pjax.state + var state = event.state + var direction + + if (state && state.container) { + // When coming forward from a separate history session, will get an + // initial pop with a state we are already at. Skip reloading the current + // page. + if (initialPop && initialURL == state.url) return + + if (previousState) { + // If popping back to the same state, just skip. + // Could be clicking back from hashchange rather than a pushState. + if (previousState.id === state.id) return + + // Since state IDs always increase, we can deduce the navigation direction + direction = previousState.id < state.id ? 'forward' : 'back' + } + + var cache = cacheMapping[state.id] || [] + var containerSelector = cache[0] || state.container + var container = $(containerSelector), contents = cache[1] + + if (container.length) { + if (previousState) { + // Cache current container before replacement and inform the + // cache which direction the history shifted. + cachePop(direction, previousState.id, [containerSelector, cloneContents(container)]) + } + + var popstateEvent = $.Event('pjax:popstate', { + state: state, + direction: direction + }) + container.trigger(popstateEvent) + + var options = { + id: state.id, + url: state.url, + container: containerSelector, + push: false, + fragment: state.fragment, + timeout: state.timeout, + scrollTo: false + } + + if (contents) { + container.trigger('pjax:start', [null, options]) + + pjax.state = state + if (state.title) document.title = state.title + var beforeReplaceEvent = $.Event('pjax:beforeReplace', { + state: state, + previousState: previousState + }) + container.trigger(beforeReplaceEvent, [contents, options]) + container.html(contents) + + container.trigger('pjax:end', [null, options]) + } else { + pjax(options) + } + + // Force reflow/relayout before the browser tries to restore the + // scroll position. + container[0].offsetHeight // eslint-disable-line no-unused-expressions + } else { + locationReplace(location.href) + } + } + initialPop = false +} + +// Fallback version of main pjax function for browsers that don't +// support pushState. +// +// Returns nothing since it retriggers a hard form submission. +function fallbackPjax(options) { + var url = $.isFunction(options.url) ? options.url() : options.url, + method = options.type ? options.type.toUpperCase() : 'GET' + + var form = $('
    ', { + method: method === 'GET' ? 'GET' : 'POST', + action: url, + style: 'display:none' + }) + + if (method !== 'GET' && method !== 'POST') { + form.append($('', { + type: 'hidden', + name: '_method', + value: method.toLowerCase() + })) + } + + var data = options.data + if (typeof data === 'string') { + $.each(data.split('&'), function(index, value) { + var pair = value.split('=') + form.append($('', {type: 'hidden', name: pair[0], value: pair[1]})) + }) + } else if ($.isArray(data)) { + $.each(data, function(index, value) { + form.append($('', {type: 'hidden', name: value.name, value: value.value})) + }) + } else if (typeof data === 'object') { + var key + for (key in data) + form.append($('', {type: 'hidden', name: key, value: data[key]})) + } + + $(document.body).append(form) + form.submit() +} + +// Internal: Abort an XmlHttpRequest if it hasn't been completed, +// also removing its event handlers. +function abortXHR(xhr) { + if ( xhr && xhr.readyState < 4) { + xhr.onreadystatechange = $.noop + xhr.abort() + } +} + +// Internal: Generate unique id for state object. +// +// Use a timestamp instead of a counter since ids should still be +// unique across page loads. +// +// Returns Number. +function uniqueId() { + return (new Date).getTime() +} + +function cloneContents(container) { + var cloned = container.clone() + // Unmark script tags as already being eval'd so they can get executed again + // when restored from cache. HAXX: Uses jQuery internal method. + cloned.find('script').each(function(){ + if (!this.src) $._data(this, 'globalEval', false) + }) + return cloned.contents() +} + +// Internal: Strip internal query params from parsed URL. +// +// Returns sanitized url.href String. +function stripInternalParams(url) { + url.search = url.search.replace(/([?&])(_pjax|_)=[^&]*/g, '').replace(/^&/, '') + return url.href.replace(/\?($|#)/, '$1') +} + +// Internal: Parse URL components and returns a Locationish object. +// +// url - String URL +// +// Returns HTMLAnchorElement that acts like Location. +function parseURL(url) { + var a = document.createElement('a') + a.href = url + return a +} + +// Internal: Return the `href` component of given URL object with the hash +// portion removed. +// +// location - Location or HTMLAnchorElement +// +// Returns String +function stripHash(location) { + return location.href.replace(/#.*/, '') +} + +// Internal: Build options Object for arguments. +// +// For convenience the first parameter can be either the container or +// the options object. +// +// Examples +// +// optionsFor('#container') +// // => {container: '#container'} +// +// optionsFor('#container', {push: true}) +// // => {container: '#container', push: true} +// +// optionsFor({container: '#container', push: true}) +// // => {container: '#container', push: true} +// +// Returns options Object. +function optionsFor(container, options) { + if (container && options) { + options = $.extend({}, options) + options.container = container + return options + } else if ($.isPlainObject(container)) { + return container + } else { + return {container: container} + } +} + +// Internal: Filter and find all elements matching the selector. +// +// Where $.fn.find only matches descendants, findAll will test all the +// top level elements in the jQuery object as well. +// +// elems - jQuery object of Elements +// selector - String selector to match +// +// Returns a jQuery object. +function findAll(elems, selector) { + return elems.filter(selector).add(elems.find(selector)) +} + +function parseHTML(html) { + return $.parseHTML(html, document, true) +} + +// Internal: Extracts container and metadata from response. +// +// 1. Extracts X-PJAX-URL header if set +// 2. Extracts inline tags +// 3. Builds response Element and extracts fragment if set +// +// data - String response data +// xhr - XHR response +// options - pjax options Object +// +// Returns an Object with url, title, and contents keys. +function extractContainer(data, xhr, options) { + var obj = {}, fullDocument = /<html/i.test(data) + + // Prefer X-PJAX-URL header if it was set, otherwise fallback to + // using the original requested url. + var serverUrl = xhr.getResponseHeader('X-PJAX-URL') + obj.url = serverUrl ? stripInternalParams(parseURL(serverUrl)) : options.requestUrl + + var $head, $body + // Attempt to parse response html into elements + if (fullDocument) { + $body = $(parseHTML(data.match(/<body[^>]*>([\s\S.]*)<\/body>/i)[0])) + var head = data.match(/<head[^>]*>([\s\S.]*)<\/head>/i) + $head = head != null ? $(parseHTML(head[0])) : $body + } else { + $head = $body = $(parseHTML(data)) + } + + // If response data is empty, return fast + if ($body.length === 0) + return obj + + // If there's a <title> tag in the header, use it as + // the page's title. + obj.title = findAll($head, 'title').last().text() + + if (options.fragment) { + var $fragment = $body + // If they specified a fragment, look for it in the response + // and pull it out. + if (options.fragment !== 'body') { + $fragment = findAll($fragment, options.fragment).first() + } + + if ($fragment.length) { + obj.contents = options.fragment === 'body' ? $fragment : $fragment.contents() + + // If there's no title, look for data-title and title attributes + // on the fragment + if (!obj.title) + obj.title = $fragment.attr('title') || $fragment.data('title') + } + + } else if (!fullDocument) { + obj.contents = $body + } + + // Clean up any <title> tags + if (obj.contents) { + // Remove any parent title elements + obj.contents = obj.contents.not(function() { return $(this).is('title') }) + + // Then scrub any titles from their descendants + obj.contents.find('title').remove() + + // Gather all script[src] elements + obj.scripts = findAll(obj.contents, 'script[src]').remove() + obj.contents = obj.contents.not(obj.scripts) + } + + // Trim any whitespace off the title + if (obj.title) obj.title = $.trim(obj.title) + + return obj +} + +// Load an execute scripts using standard script request. +// +// Avoids jQuery's traditional $.getScript which does a XHR request and +// globalEval. +// +// scripts - jQuery object of script Elements +// +// Returns nothing. +function executeScriptTags(scripts) { + if (!scripts) return + + var existingScripts = $('script[src]') + + scripts.each(function() { + var src = this.src + var matchedScripts = existingScripts.filter(function() { + return this.src === src + }) + if (matchedScripts.length) return + + var script = document.createElement('script') + var type = $(this).attr('type') + if (type) script.type = type + script.src = $(this).attr('src') + document.head.appendChild(script) + }) +} + +// Internal: History DOM caching class. +var cacheMapping = {} +var cacheForwardStack = [] +var cacheBackStack = [] + +// Push previous state id and container contents into the history +// cache. Should be called in conjunction with `pushState` to save the +// previous container contents. +// +// id - State ID Number +// value - DOM Element to cache +// +// Returns nothing. +function cachePush(id, value) { + cacheMapping[id] = value + cacheBackStack.push(id) + + // Remove all entries in forward history stack after pushing a new page. + trimCacheStack(cacheForwardStack, 0) + + // Trim back history stack to max cache length. + trimCacheStack(cacheBackStack, pjax.defaults.maxCacheLength) +} + +// Shifts cache from directional history cache. Should be +// called on `popstate` with the previous state id and container +// contents. +// +// direction - "forward" or "back" String +// id - State ID Number +// value - DOM Element to cache +// +// Returns nothing. +function cachePop(direction, id, value) { + var pushStack, popStack + cacheMapping[id] = value + + if (direction === 'forward') { + pushStack = cacheBackStack + popStack = cacheForwardStack + } else { + pushStack = cacheForwardStack + popStack = cacheBackStack + } + + pushStack.push(id) + id = popStack.pop() + if (id) delete cacheMapping[id] + + // Trim whichever stack we just pushed to to max cache length. + trimCacheStack(pushStack, pjax.defaults.maxCacheLength) +} + +// Trim a cache stack (either cacheBackStack or cacheForwardStack) to be no +// longer than the specified length, deleting cached DOM elements as necessary. +// +// stack - Array of state IDs +// length - Maximum length to trim to +// +// Returns nothing. +function trimCacheStack(stack, length) { + while (stack.length > length) + delete cacheMapping[stack.shift()] +} + +// Public: Find version identifier for the initial page load. +// +// Returns String version or undefined. +function findVersion() { + return $('meta').filter(function() { + var name = $(this).attr('http-equiv') + return name && name.toUpperCase() === 'X-PJAX-VERSION' + }).attr('content') +} + +// Install pjax functions on $.pjax to enable pushState behavior. +// +// Does nothing if already enabled. +// +// Examples +// +// $.pjax.enable() +// +// Returns nothing. +function enable() { + $.fn.pjax = fnPjax + $.pjax = pjax + $.pjax.enable = $.noop + $.pjax.disable = disable + $.pjax.click = handleClick + $.pjax.submit = handleSubmit + $.pjax.reload = pjaxReload + $.pjax.defaults = { + timeout: 650, + push: true, + replace: false, + type: 'GET', + dataType: 'html', + scrollTo: 0, + maxCacheLength: 20, + version: findVersion + } + $(window).on('popstate.pjax', onPjaxPopstate) +} + +// Disable pushState behavior. +// +// This is the case when a browser doesn't support pushState. It is +// sometimes useful to disable pushState for debugging on a modern +// browser. +// +// Examples +// +// $.pjax.disable() +// +// Returns nothing. +function disable() { + $.fn.pjax = function() { return this } + $.pjax = fallbackPjax + $.pjax.enable = enable + $.pjax.disable = $.noop + $.pjax.click = $.noop + $.pjax.submit = $.noop + $.pjax.reload = function() { window.location.reload() } + + $(window).off('popstate.pjax', onPjaxPopstate) +} + + +// Add the state property to jQuery's event object so we can use it in +// $(window).bind('popstate') +if ($.event.props && $.inArray('state', $.event.props) < 0) { + $.event.props.push('state') +} else if (!('state' in $.Event.prototype)) { + $.event.addProp('state') +} + +// Is pjax supported by this browser? +$.support.pjax = + window.history && window.history.pushState && window.history.replaceState && + // pushState isn't reliable on iOS until 5. + !navigator.userAgent.match(/((iPod|iPhone|iPad).+\bOS\s+[1-4]\D|WebApps\/.+CFNetwork)/) + +if ($.support.pjax) { + enable() +} else { + disable() +} + +})(jQuery) diff --git a/public/zlibproxy/normalize.css b/public/zlibproxy/normalize.css new file mode 100644 index 0000000..c45a85f --- /dev/null +++ b/public/zlibproxy/normalize.css @@ -0,0 +1,349 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + + html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + } + + /* Sections + ========================================================================== */ + + /** + * Remove the margin in all browsers. + */ + + body { + margin: 0; + } + + /** + * Render the `main` element consistently in IE. + */ + + main { + display: block; + } + + /** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + + h1 { + font-size: 2em; + margin: 0.67em 0; + } + + /* Grouping content + ========================================================================== */ + + /** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + + hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /* Text-level semantics + ========================================================================== */ + + /** + * Remove the gray background on active links in IE 10. + */ + + a { + background-color: transparent; + } + + /** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + + abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ + } + + /** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + + b, + strong { + font-weight: bolder; + } + + /** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + + code, + kbd, + samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ + } + + /** + * Add the correct font size in all browsers. + */ + + small { + font-size: 80%; + } + + /** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + + sub, + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + + sub { + bottom: -0.25em; + } + + sup { + top: -0.5em; + } + + /* Embedded content + ========================================================================== */ + + /** + * Remove the border on images inside links in IE 10. + */ + + img { + border-style: none; + } + + /* Forms + ========================================================================== */ + + /** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + + button, + input, + optgroup, + select, + textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ + } + + /** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + + button, + input { /* 1 */ + overflow: visible; + } + + /** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + + button, + select { /* 1 */ + text-transform: none; + } + + /** + * Correct the inability to style clickable types in iOS and Safari. + */ + + button, + [type="button"], + [type="reset"], + [type="submit"] { + -webkit-appearance: button; + } + + /** + * Remove the inner border and padding in Firefox. + */ + + button::-moz-focus-inner, + [type="button"]::-moz-focus-inner, + [type="reset"]::-moz-focus-inner, + [type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; + } + + /** + * Restore the focus styles unset by the previous rule. + */ + + button:-moz-focusring, + [type="button"]:-moz-focusring, + [type="reset"]:-moz-focusring, + [type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; + } + + /** + * Correct the padding in Firefox. + */ + + fieldset { + padding: 0.35em 0.75em 0.625em; + } + + /** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + + legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ + } + + /** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + + progress { + vertical-align: baseline; + } + + /** + * Remove the default vertical scrollbar in IE 10+. + */ + + textarea { + overflow: auto; + } + + /** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + + [type="checkbox"], + [type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ + } + + /** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + + [type="number"]::-webkit-inner-spin-button, + [type="number"]::-webkit-outer-spin-button { + height: auto; + } + + /** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + + [type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ + } + + /** + * Remove the inner padding in Chrome and Safari on macOS. + */ + + [type="search"]::-webkit-search-decoration { + -webkit-appearance: none; + } + + /** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + + ::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ + } + + /* Interactive + ========================================================================== */ + + /* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + + details { + display: block; + } + + /* + * Add the correct display in all browsers. + */ + + summary { + display: list-item; + } + + /* Misc + ========================================================================== */ + + /** + * Add the correct display in IE 10+. + */ + + template { + display: none; + } + + /** + * Add the correct display in IE 10. + */ + + [hidden] { + display: none; + } \ No newline at end of file diff --git a/public/zlibproxy/sakura-dark.css b/public/zlibproxy/sakura-dark.css new file mode 100644 index 0000000..1686bfc --- /dev/null +++ b/public/zlibproxy/sakura-dark.css @@ -0,0 +1,223 @@ +/* $color-text: #dedce5; */ +/* Sakura.css v1.4.1 + * ================ + * Minimal css theme. + * Project: https://github.com/oxalorg/sakura/ + */ +/* Body */ +html { + font-size: 62.5%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif; + } + + body { + font-size: 1.8rem; + line-height: 1.618; + max-width: 38em; + margin: auto; + color: #c9c9c9; + background-color: #222222; + padding: 13px; + } + + @media (max-width: 684px) { + body { + font-size: 1.53rem; + } + } + @media (max-width: 382px) { + body { + font-size: 1.35rem; + } + } + h1, h2, h3, h4, h5, h6 { + line-height: 1.1; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif; + font-weight: 700; + margin-top: 3rem; + margin-bottom: 1.5rem; + overflow-wrap: break-word; + word-wrap: break-word; + -ms-word-break: break-all; + word-break: break-word; + } + + h1 { + font-size: 2.35em; + } + + h2 { + font-size: 2em; + } + + h3 { + font-size: 1.75em; + } + + h4 { + font-size: 1.5em; + } + + h5 { + font-size: 1.25em; + } + + h6 { + font-size: 1em; + } + + p { + margin-top: 0px; + margin-bottom: 2.5rem; + } + + small, sub, sup { + font-size: 75%; + } + + hr { + border-color: #ffffff; + } + + a { + text-decoration: none; + color: #ffffff; + } + a:visited { + color: #e6e6e6; + } + a:hover { + color: #c9c9c9; + border-bottom: 2px solid #c9c9c9; + } + + ul { + padding-left: 1.4em; + margin-top: 0px; + margin-bottom: 2.5rem; + } + + li { + margin-bottom: 0.4em; + } + + blockquote { + margin-left: 0px; + margin-right: 0px; + padding-left: 1em; + padding-top: 0.8em; + padding-bottom: 0.8em; + padding-right: 0.8em; + border-left: 5px solid #ffffff; + margin-bottom: 2.5rem; + background-color: #4a4a4a; + } + + blockquote p { + margin-bottom: 0; + } + + img, video { + height: auto; + max-width: 100%; + margin-top: 0px; + margin-bottom: 2.5rem; + } + + /* Pre and Code */ + pre { + background-color: #4a4a4a; + display: block; + padding: 1em; + overflow-x: auto; + margin-top: 0px; + margin-bottom: 2.5rem; + font-size: 0.9em; + } + + code, kbd, samp { + font-size: 0.9em; + padding: 0 0.5em; + background-color: #4a4a4a; + white-space: pre-wrap; + } + + pre > code { + padding: 0; + background-color: transparent; + white-space: pre; + font-size: 1em; + } + + /* Tables */ + table { + text-align: justify; + width: 100%; + border-collapse: collapse; + } + + td, th { + padding: 0.5em; + border-bottom: 1px solid #4a4a4a; + } + + /* Buttons, forms and input */ + input, textarea { + border: 1px solid #c9c9c9; + } + input:focus, textarea:focus { + border: 1px solid #ffffff; + } + + textarea { + width: 100%; + } + + .button, button, input[type=submit], input[type=reset], input[type=button] { + display: inline-block; + padding: 5px 10px; + text-align: center; + text-decoration: none; + white-space: nowrap; + background-color: #ffffff; + color: #222222; + border-radius: 1px; + border: 1px solid #ffffff; + cursor: pointer; + box-sizing: border-box; + } + .button[disabled], button[disabled], input[type=submit][disabled], input[type=reset][disabled], input[type=button][disabled] { + cursor: default; + opacity: 0.5; + } + .button:focus:enabled, .button:hover:enabled, button:focus:enabled, button:hover:enabled, input[type=submit]:focus:enabled, input[type=submit]:hover:enabled, input[type=reset]:focus:enabled, input[type=reset]:hover:enabled, input[type=button]:focus:enabled, input[type=button]:hover:enabled { + background-color: #c9c9c9; + border-color: #c9c9c9; + color: #222222; + outline: 0; + } + + textarea, select, input { + color: #c9c9c9; + padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */ + margin-bottom: 10px; + background-color: #4a4a4a; + border: 1px solid #4a4a4a; + border-radius: 4px; + box-shadow: none; + box-sizing: border-box; + } + textarea:focus, select:focus, input:focus { + border: 1px solid #ffffff; + outline: 0; + } + + input[type=checkbox]:focus { + outline: 1px dotted #ffffff; + } + + label, legend, fieldset { + display: block; + margin-bottom: 0.5rem; + font-weight: 600; + } \ No newline at end of file diff --git a/public/zlibproxy/sakura.css b/public/zlibproxy/sakura.css new file mode 100644 index 0000000..6b9c6bf --- /dev/null +++ b/public/zlibproxy/sakura.css @@ -0,0 +1,222 @@ +/* Sakura.css v1.4.1 + * ================ + * Minimal css theme. + * Project: https://github.com/oxalorg/sakura/ + */ +/* Body */ +html { + font-size: 62.5%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif; + } + + body { + font-size: 1.8rem; + line-height: 1.618; + max-width: 38em; + margin: auto; + color: #4a4a4a; + background-color: #f9f9f9; + padding: 13px; + } + + @media (max-width: 684px) { + body { + font-size: 1.53rem; + } + } + @media (max-width: 382px) { + body { + font-size: 1.35rem; + } + } + h1, h2, h3, h4, h5, h6 { + line-height: 1.1; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif; + font-weight: 700; + margin-top: 3rem; + margin-bottom: 1.5rem; + overflow-wrap: break-word; + word-wrap: break-word; + -ms-word-break: break-all; + word-break: break-word; + } + + h1 { + font-size: 2.35em; + } + + h2 { + font-size: 2em; + } + + h3 { + font-size: 1.75em; + } + + h4 { + font-size: 1.5em; + } + + h5 { + font-size: 1.25em; + } + + h6 { + font-size: 1em; + } + + p { + margin-top: 0px; + margin-bottom: 2.5rem; + } + + small, sub, sup { + font-size: 75%; + } + + hr { + border-color: #1d7484; + } + + a { + text-decoration: none; + color: #1d7484; + } + a:visited { + color: #144f5a; + } + a:hover { + color: #982c61; + border-bottom: 2px solid #4a4a4a; + } + + ul { + padding-left: 1.4em; + margin-top: 0px; + margin-bottom: 2.5rem; + } + + li { + margin-bottom: 0.4em; + } + + blockquote { + margin-left: 0px; + margin-right: 0px; + padding-left: 1em; + padding-top: 0.8em; + padding-bottom: 0.8em; + padding-right: 0.8em; + border-left: 5px solid #1d7484; + margin-bottom: 2.5rem; + background-color: #f1f1f1; + } + + blockquote p { + margin-bottom: 0; + } + + img, video { + height: auto; + max-width: 100%; + margin-top: 0px; + margin-bottom: 2.5rem; + } + + /* Pre and Code */ + pre { + background-color: #f1f1f1; + display: block; + padding: 1em; + overflow-x: auto; + margin-top: 0px; + margin-bottom: 2.5rem; + font-size: 0.9em; + } + + code, kbd, samp { + font-size: 0.9em; + padding: 0 0.5em; + background-color: #f1f1f1; + white-space: pre-wrap; + } + + pre > code { + padding: 0; + background-color: transparent; + white-space: pre; + font-size: 1em; + } + + /* Tables */ + table { + text-align: justify; + width: 100%; + border-collapse: collapse; + } + + td, th { + padding: 0.5em; + border-bottom: 1px solid #f1f1f1; + } + + /* Buttons, forms and input */ + input, textarea { + border: 1px solid #4a4a4a; + } + input:focus, textarea:focus { + border: 1px solid #1d7484; + } + + textarea { + width: 100%; + } + + .button, button, input[type=submit], input[type=reset], input[type=button] { + display: inline-block; + padding: 5px 10px; + text-align: center; + text-decoration: none; + white-space: nowrap; + background-color: #1d7484; + color: #f9f9f9; + border-radius: 1px; + border: 1px solid #1d7484; + cursor: pointer; + box-sizing: border-box; + } + .button[disabled], button[disabled], input[type=submit][disabled], input[type=reset][disabled], input[type=button][disabled] { + cursor: default; + opacity: 0.5; + } + .button:focus:enabled, .button:hover:enabled, button:focus:enabled, button:hover:enabled, input[type=submit]:focus:enabled, input[type=submit]:hover:enabled, input[type=reset]:focus:enabled, input[type=reset]:hover:enabled, input[type=button]:focus:enabled, input[type=button]:hover:enabled { + background-color: #982c61; + border-color: #982c61; + color: #f9f9f9; + outline: 0; + } + + textarea, select, input { + color: #4a4a4a; + padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */ + margin-bottom: 10px; + background-color: #f1f1f1; + border: 1px solid #f1f1f1; + border-radius: 4px; + box-shadow: none; + box-sizing: border-box; + } + textarea:focus, select:focus, input:focus { + border: 1px solid #1d7484; + outline: 0; + } + + input[type=checkbox]:focus { + outline: 1px dotted #1d7484; + } + + label, legend, fieldset { + display: block; + margin-bottom: 0.5rem; + font-weight: 600; + } \ No newline at end of file diff --git a/runtime/.gitignore b/runtime/.gitignore new file mode 100644 index 0000000..1283e48 --- /dev/null +++ b/runtime/.gitignore @@ -0,0 +1,4 @@ +* +!logs +!views +!.gitignore diff --git a/runtime/logs/.gitignore b/runtime/logs/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/runtime/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/runtime/views/.gitignore b/runtime/views/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/runtime/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/start.php b/start.php new file mode 100755 index 0000000..489e447 --- /dev/null +++ b/start.php @@ -0,0 +1,4 @@ +#!/usr/bin/env php +<?php +require_once __DIR__ . '/vendor/autoload.php'; +support\App::run(); diff --git a/support/Request.php b/support/Request.php new file mode 100644 index 0000000..e3f6ac3 --- /dev/null +++ b/support/Request.php @@ -0,0 +1,24 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support; + +/** + * Class Request + * @package support + */ +class Request extends \Webman\Http\Request +{ + +} \ No newline at end of file diff --git a/support/Response.php b/support/Response.php new file mode 100644 index 0000000..9bc4e1e --- /dev/null +++ b/support/Response.php @@ -0,0 +1,24 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support; + +/** + * Class Response + * @package support + */ +class Response extends \Webman\Http\Response +{ + +} \ No newline at end of file diff --git a/support/bootstrap.php b/support/bootstrap.php new file mode 100644 index 0000000..7a08896 --- /dev/null +++ b/support/bootstrap.php @@ -0,0 +1,132 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Dotenv\Dotenv; +use support\Log; +use Webman\Bootstrap; +use Webman\Config; +use Webman\Route; +use Webman\Middleware; +use Webman\Util; + +$worker = $worker ?? null; + +set_error_handler(function ($level, $message, $file = '', $line = 0) { + if (error_reporting() & $level) { + throw new ErrorException($message, 0, $level, $file, $line); + } +}); + +if ($worker) { + register_shutdown_function(function ($start_time) { + if (time() - $start_time <= 1) { + sleep(1); + } + }, time()); +} + +if (class_exists('Dotenv\Dotenv') && file_exists(base_path() . '/.env')) { + if (method_exists('Dotenv\Dotenv', 'createUnsafeImmutable')) { + Dotenv::createUnsafeImmutable(base_path())->load(); + } else { + Dotenv::createMutable(base_path())->load(); + } +} + +Config::clear(); +support\App::loadAllConfig(['route']); +if ($timezone = config('app.default_timezone')) { + date_default_timezone_set($timezone); +} + +foreach (config('autoload.files', []) as $file) { + include_once $file; +} +foreach (config('plugin', []) as $firm => $projects) { + foreach ($projects as $name => $project) { + if (!is_array($project)) { + continue; + } + foreach ($project['autoload']['files'] ?? [] as $file) { + include_once $file; + } + } + foreach ($projects['autoload']['files'] ?? [] as $file) { + include_once $file; + } +} + +Middleware::load(config('middleware', []), ''); +foreach (config('plugin', []) as $firm => $projects) { + foreach ($projects as $name => $project) { + if (!is_array($project) || $name === 'static') { + continue; + } + Middleware::load($project['middleware'] ?? [], ''); + } + Middleware::load($projects['middleware'] ?? [], $firm); + if ($static_middlewares = config("plugin.$firm.static.middleware")) { + Middleware::load(['__static__' => $static_middlewares], $firm); + } +} +Middleware::load(['__static__' => config('static.middleware', [])], ''); + +foreach (config('bootstrap', []) as $class_name) { + if (!class_exists($class_name)) { + $log = "Warning: Class $class_name setting in config/bootstrap.php not found\r\n"; + echo $log; + Log::error($log); + continue; + } + /** @var Bootstrap $class_name */ + $class_name::start($worker); +} + +foreach (config('plugin', []) as $firm => $projects) { + foreach ($projects as $name => $project) { + if (!is_array($project)) { + continue; + } + foreach ($project['bootstrap'] ?? [] as $class_name) { + if (!class_exists($class_name)) { + $log = "Warning: Class $class_name setting in config/plugin/$firm/$name/bootstrap.php not found\r\n"; + echo $log; + Log::error($log); + continue; + } + /** @var Bootstrap $class_name */ + $class_name::start($worker); + } + } + foreach ($projects['bootstrap'] ?? [] as $class_name) { + if (!class_exists($class_name)) { + $log = "Warning: Class $class_name setting in plugin/$firm/config/bootstrap.php not found\r\n"; + echo $log; + Log::error($log); + continue; + } + /** @var Bootstrap $class_name */ + $class_name::start($worker); + } +} + +$directory = base_path() . '/plugin'; +$paths = [config_path()]; +foreach (Util::scanDir($directory) as $path) { + if (is_dir($path = "$path/config")) { + $paths[] = $path; + } +} +Route::load($paths); + diff --git a/support/helpers.php b/support/helpers.php new file mode 100644 index 0000000..68f88e1 --- /dev/null +++ b/support/helpers.php @@ -0,0 +1,543 @@ +<?php + +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use support\Container; +use support\Request; +use support\Response; +use support\Translation; +use support\view\Raw; +use support\view\Blade; +use support\view\ThinkPHP; +use support\view\Twig; +use Workerman\Worker; +use Webman\App; +use Webman\Config; +use Webman\Route; + +// Webman version +const WEBMAN_VERSION = '1.4'; + +// Project base path +define('BASE_PATH', dirname(__DIR__)); + +/** + * return the program execute directory + * @param string $path + * @return string + */ +function run_path(string $path = ''): string +{ + static $run_path = ''; + if (!$run_path) { + $run_path = \is_phar() ? \dirname(\Phar::running(false)) : BASE_PATH; + } + return \path_combine($run_path, $path); +} + +/** + * if the param $path equal false,will return this program current execute directory + * @param string|false $path + * @return string + */ +function base_path($path = ''): string +{ + if (false === $path) { + return \run_path(); + } + return \path_combine(BASE_PATH, $path); +} + +/** + * App path + * @param string $path + * @return string + */ +function app_path(string $path = ''): string +{ + return \path_combine(BASE_PATH . DIRECTORY_SEPARATOR . 'app', $path); +} + +/** + * Public path + * @param string $path + * @return string + */ +function public_path(string $path = ''): string +{ + static $public_path = ''; + if (!$public_path) { + $public_path = \config('app.public_path') ? : \run_path('public'); + } + return \path_combine($public_path, $path); +} + +/** + * Config path + * @param string $path + * @return string + */ +function config_path(string $path = ''): string +{ + return \path_combine(BASE_PATH . DIRECTORY_SEPARATOR . 'config', $path); +} + +/** + * Runtime path + * @param string $path + * @return string + */ +function runtime_path(string $path = ''): string +{ + static $runtime_path = ''; + if (!$runtime_path) { + $runtime_path = \config('app.runtime_path') ? : \run_path('runtime'); + } + return \path_combine($runtime_path, $path); +} + +/** + * Generate paths based on given information + * @param string $front + * @param string $back + * @return string + */ +function path_combine(string $front, string $back): string +{ + return $front . ($back ? (DIRECTORY_SEPARATOR . ltrim($back, DIRECTORY_SEPARATOR)) : $back); +} + +/** + * Response + * @param int $status + * @param array $headers + * @param string $body + * @return Response + */ +function response(string $body = '', int $status = 200, array $headers = []): Response +{ + return new Response($status, $headers, $body); +} + +/** + * Json response + * @param $data + * @param int $options + * @return Response + */ +function json($data, int $options = JSON_UNESCAPED_UNICODE): Response +{ + return new Response(200, ['Content-Type' => 'application/json'], \json_encode($data, $options)); +} + +/** + * Xml response + * @param $xml + * @return Response + */ +function xml($xml): Response +{ + if ($xml instanceof SimpleXMLElement) { + $xml = $xml->asXML(); + } + return new Response(200, ['Content-Type' => 'text/xml'], $xml); +} + +/** + * Jsonp response + * @param $data + * @param string $callback_name + * @return Response + */ +function jsonp($data, string $callback_name = 'callback'): Response +{ + if (!\is_scalar($data) && null !== $data) { + $data = \json_encode($data); + } + return new Response(200, [], "$callback_name($data)"); +} + +/** + * Redirect response + * @param string $location + * @param int $status + * @param array $headers + * @return Response + */ +function redirect(string $location, int $status = 302, array $headers = []): Response +{ + $response = new Response($status, ['Location' => $location]); + if (!empty($headers)) { + $response->withHeaders($headers); + } + return $response; +} + +/** + * View response + * @param string $template + * @param array $vars + * @param string|null $app + * @return Response + */ +function view(string $template, array $vars = [], string $app = null): Response +{ + $request = \request(); + $plugin = $request->plugin ?? ''; + $handler = \config($plugin ? "plugin.$plugin.view.handler" : 'view.handler'); + return new Response(200, [], $handler::render($template, $vars, $app)); +} + +/** + * Raw view response + * @param string $template + * @param array $vars + * @param string|null $app + * @return Response + * @throws Throwable + */ +function raw_view(string $template, array $vars = [], string $app = null): Response +{ + return new Response(200, [], Raw::render($template, $vars, $app)); +} + +/** + * Blade view response + * @param string $template + * @param array $vars + * @param string|null $app + * @return Response + */ +function blade_view(string $template, array $vars = [], string $app = null): Response +{ + return new Response(200, [], Blade::render($template, $vars, $app)); +} + +/** + * Think view response + * @param string $template + * @param array $vars + * @param string|null $app + * @return Response + */ +function think_view(string $template, array $vars = [], string $app = null): Response +{ + return new Response(200, [], ThinkPHP::render($template, $vars, $app)); +} + +/** + * Twig view response + * @param string $template + * @param array $vars + * @param string|null $app + * @return Response + */ +function twig_view(string $template, array $vars = [], string $app = null): Response +{ + return new Response(200, [], Twig::render($template, $vars, $app)); +} + +/** + * Get request + * @return \Webman\Http\Request|Request|null + */ +function request() +{ + return App::request(); +} + +/** + * Get config + * @param string|null $key + * @param $default + * @return array|mixed|null + */ +function config(string $key = null, $default = null) +{ + return Config::get($key, $default); +} + +/** + * Create url + * @param string $name + * @param ...$parameters + * @return string + */ +function route(string $name, ...$parameters): string +{ + $route = Route::getByName($name); + if (!$route) { + return ''; + } + + if (!$parameters) { + return $route->url(); + } + + if (\is_array(\current($parameters))) { + $parameters = \current($parameters); + } + + return $route->url($parameters); +} + +/** + * Session + * @param mixed $key + * @param mixed $default + * @return mixed + */ +function session($key = null, $default = null) +{ + $session = \request()->session(); + if (null === $key) { + return $session; + } + if (\is_array($key)) { + $session->put($key); + return null; + } + if (\strpos($key, '.')) { + $key_array = \explode('.', $key); + $value = $session->all(); + foreach ($key_array as $index) { + if (!isset($value[$index])) { + return $default; + } + $value = $value[$index]; + } + return $value; + } + return $session->get($key, $default); +} + +/** + * Translation + * @param string $id + * @param array $parameters + * @param string|null $domain + * @param string|null $locale + * @return string + */ +function trans(string $id, array $parameters = [], string $domain = null, string $locale = null): string +{ + $res = Translation::trans($id, $parameters, $domain, $locale); + return $res === '' ? $id : $res; +} + +/** + * Locale + * @param string|null $locale + * @return void + */ +function locale(string $locale = null): string +{ + if (!$locale) { + return Translation::getLocale(); + } + Translation::setLocale($locale); +} + +/** + * 404 not found + * @return Response + */ +function not_found(): Response +{ + return new Response(404, [], \file_get_contents(public_path() . '/404.html')); +} + +/** + * Copy dir + * @param string $source + * @param string $dest + * @param bool $overwrite + * @return void + */ +function copy_dir(string $source, string $dest, bool $overwrite = false) +{ + if (\is_dir($source)) { + if (!is_dir($dest)) { + \mkdir($dest); + } + $files = \scandir($source); + foreach ($files as $file) { + if ($file !== "." && $file !== "..") { + \copy_dir("$source/$file", "$dest/$file"); + } + } + } else if (\file_exists($source) && ($overwrite || !\file_exists($dest))) { + \copy($source, $dest); + } +} + +/** + * Remove dir + * @param string $dir + * @return bool + */ +function remove_dir(string $dir): bool +{ + if (\is_link($dir) || \is_file($dir)) { + return \unlink($dir); + } + $files = \array_diff(\scandir($dir), array('.', '..')); + foreach ($files as $file) { + (\is_dir("$dir/$file") && !\is_link($dir)) ? \remove_dir("$dir/$file") : \unlink("$dir/$file"); + } + return \rmdir($dir); +} + +/** + * Bind worker + * @param $worker + * @param $class + */ +function worker_bind($worker, $class) +{ + $callback_map = [ + 'onConnect', + 'onMessage', + 'onClose', + 'onError', + 'onBufferFull', + 'onBufferDrain', + 'onWorkerStop', + 'onWebSocketConnect' + ]; + foreach ($callback_map as $name) { + if (\method_exists($class, $name)) { + $worker->$name = [$class, $name]; + } + } + if (\method_exists($class, 'onWorkerStart')) { + \call_user_func([$class, 'onWorkerStart'], $worker); + } +} + +/** + * Start worker + * @param $process_name + * @param $config + * @return void + */ +function worker_start($process_name, $config) +{ + $worker = new Worker($config['listen'] ?? null, $config['context'] ?? []); + $property_map = [ + 'count', + 'user', + 'group', + 'reloadable', + 'reusePort', + 'transport', + 'protocol', + ]; + $worker->name = $process_name; + foreach ($property_map as $property) { + if (isset($config[$property])) { + $worker->$property = $config[$property]; + } + } + + $worker->onWorkerStart = function ($worker) use ($config) { + require_once \base_path() . '/support/bootstrap.php'; + + foreach ($config['services'] ?? [] as $server) { + if (!\class_exists($server['handler'])) { + echo "process error: class {$server['handler']} not exists\r\n"; + continue; + } + $listen = new Worker($server['listen'] ?? null, $server['context'] ?? []); + if (isset($server['listen'])) { + echo "listen: {$server['listen']}\n"; + } + $instance = Container::make($server['handler'], $server['constructor'] ?? []); + \worker_bind($listen, $instance); + $listen->listen(); + } + + if (isset($config['handler'])) { + if (!\class_exists($config['handler'])) { + echo "process error: class {$config['handler']} not exists\r\n"; + return; + } + + $instance = Container::make($config['handler'], $config['constructor'] ?? []); + \worker_bind($worker, $instance); + } + }; +} + +/** + * Get realpath + * @param string $file_path + * @return string + */ +function get_realpath(string $file_path): string +{ + if (\strpos($file_path, 'phar://') === 0) { + return $file_path; + } else { + return \realpath($file_path); + } +} + +/** + * Is phar + * @return bool + */ +function is_phar(): bool +{ + return \class_exists(\Phar::class, false) && Phar::running(); +} + +/** + * Get cpu count + * @return int + */ +function cpu_count(): int +{ + // Windows does not support the number of processes setting. + if (\DIRECTORY_SEPARATOR === '\\') { + return 1; + } + $count = 4; + if (\is_callable('shell_exec')) { + if (\strtolower(PHP_OS) === 'darwin') { + $count = (int)\shell_exec('sysctl -n machdep.cpu.core_count'); + } else { + $count = (int)\shell_exec('nproc'); + } + } + return $count > 0 ? $count : 4; +} + +function trans_byte($byte){ + $KB = 1024; + $MB = 1024 * $KB; + $GB = 1024 * $MB; + $TB = 1024 * $GB; + if ($byte < $KB) { + return $byte . "B"; + } elseif ($byte < $MB) { + return round($byte / $KB, 2) . "KB"; + } elseif ($byte < $GB) { + return round($byte / $MB, 2) . "MB"; + } elseif ($byte < $TB) { + return round($byte / $GB, 2) . "GB"; + } else { + return round($byte / $TB, 2) . "TB"; + } +} diff --git a/test.php b/test.php new file mode 100644 index 0000000..ab24c74 --- /dev/null +++ b/test.php @@ -0,0 +1,44 @@ + +<?php +require_once __DIR__ . '/vendor/autoload.php'; +require_once __DIR__ . '/support/bootstrap.php'; +use yzh52521\EasyHttp\Response; +use yzh52521\EasyHttp\RequestException; +use yzh52521\EasyHttp\Http; +use support\Redis; +use support\Cache; + +/** +$redis = Redis::connection('default'); +$kf='ProxyCache_'; +$path='/test2'; +$rpath=$kf.base64_encode($path); +$ct=array('1'=>'2','3'=>'4'); +$ct=json_encode($ct); +$redis->hset($rpath,'CT',$ct); + +**/ +/** +$auth=array('remix_userid'=>"22770140",'remix_userkey'=>"1e8f326d20604ada541b4f3a67d19946",'siteLanguageV2'=>'zh','selectedSiteMode'=>'books'); +$url='http://bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion/dl/7228066/aa9a95'; +$return=Http::withProxy('socks5h://10.1.5.2:19100')->withCookies($auth,'bookszlibb74ugqojhzhg2a63w5i2atv5bqarulgczawnbmsb6s6qead.onion')->head($url); + +$size=round(($return->header('Content-Length')/1048576),2); +if($size>=30){ + echo "Too Large"; +} +if($return->header('Content-Type')=='text/html; charset=UTF-8'){ + echo "Error 404"; +} + + +echo("\n"); +print_r($return->headers()); +**/ + +$af= <<<EOF +attachment; filename="How to:如何不切实际地解决实际问题(What if作者新作!比尔·盖茨推荐他每一本书!百万级畅销书作者、全球科普网红兰道尔·门罗超大脑洞来袭!)... (z-lib.org).epub";filename*=utf-8''How%20to%EF%BC%9A%E5%A6%82%E4%BD%95%E4%B8%8D%E5%88%87%E5%AE%9E%E9%99%85%E5%9C%B0%E8%A7%A3%E5%86%B3%E5%AE%9E%E9%99%85%E9%97%AE%E9%A2%98%EF%BC%88What%20if%E4%BD%9C%E8%80%85%E6%96%B0%E4%BD%9C%EF%BC%81%E6%AF%94%E5%B0%94%C2%B7%E7%9B%96%E8%8C%A8%E6%8E%A8%E8%8D%90%E4%BB%96%E6%AF%8F%E4%B8%80%E6%9C%AC%E4%B9%A6%EF%BC%81%E7%99%BE%E4%B8%87%E7%BA%A7%E7%95%85%E9%94%80%E4%B9%A6%E4%BD%9C%E8%80%85%E3%80%81%E5%85%A8%E7%90%83%E7%A7%91%E6%99%AE%E7%BD%91%E7%BA%A2%E5%85%B0%E9%81%93%E5%B0%94%C2%B7%E9%97%A8%E7%BD%97%E8%B6%85%E5%A4%A7%E8%84%91%E6%B4%9E%E6%9D%A5%E8%A2%AD%EF%BC%81%EF%BC%89...%20%28z-lib.org%29.epub +EOF; + +$filerealname=explode('"',explode(";",$af)[1])[1]; +print_r($filerealname); \ No newline at end of file diff --git a/vendor/autoload.php b/vendor/autoload.php new file mode 100644 index 0000000..86dacb6 --- /dev/null +++ b/vendor/autoload.php @@ -0,0 +1,25 @@ +<?php + +// autoload.php @generated by Composer + +if (PHP_VERSION_ID < 50600) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, $err); + } elseif (!headers_sent()) { + echo $err; + } + } + trigger_error( + $err, + E_USER_ERROR + ); +} + +require_once __DIR__ . '/composer/autoload_real.php'; + +return ComposerAutoloaderInit958477a3aed1c453d9f493182493e578::getLoader(); diff --git a/vendor/bin/carbon b/vendor/bin/carbon new file mode 100755 index 0000000..05f6df2 --- /dev/null +++ b/vendor/bin/carbon @@ -0,0 +1,120 @@ +#!/usr/bin/env php +<?php + +/** + * Proxy PHP file generated by Composer + * + * This file includes the referenced bin path (../nesbot/carbon/bin/carbon) + * using a stream wrapper to prevent the shebang from being output on PHP<8 + * + * @generated + */ + +namespace Composer; + +$GLOBALS['_composer_bin_dir'] = __DIR__; +$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php'; + +if (PHP_VERSION_ID < 80000) { + if (!class_exists('Composer\BinProxyWrapper')) { + /** + * @internal + */ + final class BinProxyWrapper + { + private $handle; + private $position; + private $realpath; + + public function stream_open($path, $mode, $options, &$opened_path) + { + // get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution + $opened_path = substr($path, 17); + $this->realpath = realpath($opened_path) ?: $opened_path; + $opened_path = $this->realpath; + $this->handle = fopen($this->realpath, $mode); + $this->position = 0; + + return (bool) $this->handle; + } + + public function stream_read($count) + { + $data = fread($this->handle, $count); + + if ($this->position === 0) { + $data = preg_replace('{^#!.*\r?\n}', '', $data); + } + + $this->position += strlen($data); + + return $data; + } + + public function stream_cast($castAs) + { + return $this->handle; + } + + public function stream_close() + { + fclose($this->handle); + } + + public function stream_lock($operation) + { + return $operation ? flock($this->handle, $operation) : true; + } + + public function stream_seek($offset, $whence) + { + if (0 === fseek($this->handle, $offset, $whence)) { + $this->position = ftell($this->handle); + return true; + } + + return false; + } + + public function stream_tell() + { + return $this->position; + } + + public function stream_eof() + { + return feof($this->handle); + } + + public function stream_stat() + { + return array(); + } + + public function stream_set_option($option, $arg1, $arg2) + { + return true; + } + + public function url_stat($path, $flags) + { + $path = substr($path, 17); + if (file_exists($path)) { + return stat($path); + } + + return false; + } + } + } + + if ( + (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) + || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) + ) { + include("phpvfscomposer://" . __DIR__ . '/..'.'/nesbot/carbon/bin/carbon'); + exit(0); + } +} + +include __DIR__ . '/..'.'/nesbot/carbon/bin/carbon'; diff --git a/vendor/bin/carbon.bat b/vendor/bin/carbon.bat new file mode 100755 index 0000000..44bca20 --- /dev/null +++ b/vendor/bin/carbon.bat @@ -0,0 +1,5 @@ +@ECHO OFF +setlocal DISABLEDELAYEDEXPANSION +SET BIN_TARGET=%~dp0/carbon +SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 +php "%BIN_TARGET%" %* diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php new file mode 100644 index 0000000..afef3fa --- /dev/null +++ b/vendor/composer/ClassLoader.php @@ -0,0 +1,572 @@ +<?php + +/* + * This file is part of Composer. + * + * (c) Nils Adermann <naderman@naderman.de> + * Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier <fabien@symfony.com> + * @author Jordi Boggiano <j.boggiano@seld.be> + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + /** @var ?string */ + private $vendorDir; + + // PSR-4 + /** + * @var array[] + * @psalm-var array<string, array<string, int>> + */ + private $prefixLengthsPsr4 = array(); + /** + * @var array[] + * @psalm-var array<string, array<int, string>> + */ + private $prefixDirsPsr4 = array(); + /** + * @var array[] + * @psalm-var array<string, string> + */ + private $fallbackDirsPsr4 = array(); + + // PSR-0 + /** + * @var array[] + * @psalm-var array<string, array<string, string[]>> + */ + private $prefixesPsr0 = array(); + /** + * @var array[] + * @psalm-var array<string, string> + */ + private $fallbackDirsPsr0 = array(); + + /** @var bool */ + private $useIncludePath = false; + + /** + * @var string[] + * @psalm-var array<string, string> + */ + private $classMap = array(); + + /** @var bool */ + private $classMapAuthoritative = false; + + /** + * @var bool[] + * @psalm-var array<string, bool> + */ + private $missingClasses = array(); + + /** @var ?string */ + private $apcuPrefix; + + /** + * @var self[] + */ + private static $registeredLoaders = array(); + + /** + * @param ?string $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + } + + /** + * @return string[] + */ + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + /** + * @return array[] + * @psalm-return array<string, array<int, string>> + */ + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + /** + * @return array[] + * @psalm-return array<string, string> + */ + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + /** + * @return array[] + * @psalm-return array<string, string> + */ + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + /** + * @return string[] Array of classname => path + * @psalm-return array<string, string> + */ + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param string[] $classMap Class to filename map + * @psalm-param array<string, string> $classMap + * + * @return void + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param string[]|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param string[]|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param string[]|string $paths The PSR-0 base directories + * + * @return void + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param string[]|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + * + * @return void + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + * + * @return void + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + * + * @return void + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + * + * @return void + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } + } + + /** + * Unregisters this instance as an autoloader. + * + * @return void + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return true|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + + return null; + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + /** + * Returns the currently registered loaders indexed by their corresponding vendor directories. + * + * @return self[] + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + /** + * @param string $class + * @param string $ext + * @return string|false + */ + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + * @private + */ +function includeFile($file) +{ + include $file; +} diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php new file mode 100644 index 0000000..c6b54af --- /dev/null +++ b/vendor/composer/InstalledVersions.php @@ -0,0 +1,352 @@ +<?php + +/* + * This file is part of Composer. + * + * (c) Nils Adermann <naderman@naderman.de> + * Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer; + +use Composer\Autoload\ClassLoader; +use Composer\Semver\VersionParser; + +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require its presence, you can require `composer-runtime-api ^2.0` + * + * @final + */ +class InstalledVersions +{ + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null + */ + private static $installed; + + /** + * @var bool|null + */ + private static $canGetVendors; + + /** + * @var array[] + * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> + */ + private static $installedByVendor = array(); + + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list<string> + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = array_keys($installed['versions']); + } + + if (1 === \count($packages)) { + return $packages[0]; + } + + return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); + } + + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list<string> + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); + + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + + return $packagesByType; + } + + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); + } + } + + return false; + } + + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints($constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + + return $provided->matches($constraint); + } + + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + + return implode(' || ', $ranges); + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + + return $installed['versions'][$packageName]['version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + + return $installed['versions'][$packageName]['pretty_version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + + return $installed['versions'][$packageName]['reference']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @return array + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + + return $installed[0]['root']; + } + + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} + */ + public static function getRawData() + { + @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = include __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + + return self::$installed; + } + + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + + /** + * @return array[] + * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + + if (self::$canGetVendors) { + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; + if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { + self::$installed = $installed[count($installed) - 1]; + } + } + } + } + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = require __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + $installed[] = self::$installed; + + return $installed; + } +} diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE new file mode 100644 index 0000000..f27399a --- /dev/null +++ b/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..5490b88 --- /dev/null +++ b/vendor/composer/autoload_classmap.php @@ -0,0 +1,15 @@ +<?php + +// autoload_classmap.php @generated by Composer + +$vendorDir = dirname(__DIR__); +$baseDir = dirname($vendorDir); + +return array( + 'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', + 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', + 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', + 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', + 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', + 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', +); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php new file mode 100644 index 0000000..51224a8 --- /dev/null +++ b/vendor/composer/autoload_files.php @@ -0,0 +1,23 @@ +<?php + +// autoload_files.php @generated by Composer + +$vendorDir = dirname(__DIR__); +$baseDir = dirname($vendorDir); + +return array( + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', + '60799491728b879e74601d83e38b2cad' => $vendorDir . '/illuminate/collections/helpers.php', + 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', + 'a1105708a18b76903365ca1c4aa61b02' => $vendorDir . '/symfony/translation/Resources/functions.php', + '72579e7bd17821bb1321b87411366eae' => $vendorDir . '/illuminate/support/helpers.php', + '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', + '253c157292f75eb38082b5acb06f3f01' => $vendorDir . '/nikic/fast-route/src/functions.php', + '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', + 'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php', + '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', + '2df68f9e79c919e2d88506611769ed2e' => $vendorDir . '/respect/stringifier/src/stringify.php', + '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', + 'ef65a1626449d89d0811cf9befce46f0' => $vendorDir . '/illuminate/events/functions.php', + 'da5b71a9ad8465d48da441e2f36823b6' => $baseDir . '/support/helpers.php', +); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php new file mode 100644 index 0000000..15a2ff3 --- /dev/null +++ b/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ +<?php + +// autoload_namespaces.php @generated by Composer + +$vendorDir = dirname(__DIR__); +$baseDir = dirname($vendorDir); + +return array( +); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php new file mode 100644 index 0000000..296119e --- /dev/null +++ b/vendor/composer/autoload_psr4.php @@ -0,0 +1,59 @@ +<?php + +// autoload_psr4.php @generated by Composer + +$vendorDir = dirname(__DIR__); +$baseDir = dirname($vendorDir); + +return array( + 'yzh52521\\middleware\\' => array($vendorDir . '/yzh52521/webman-throttle/src'), + 'yzh52521\\EasyHttp\\' => array($vendorDir . '/yzh52521/easyhttp/src'), + 'voku\\' => array($vendorDir . '/voku/portable-ascii/src/voku'), + 'support\\' => array($vendorDir . '/workerman/webman-framework/src/support'), + 'app\\View\\Components\\' => array($baseDir . '/app/view/components'), + 'app\\' => array($baseDir . '/app'), + 'Workerman\\' => array($vendorDir . '/workerman/workerman'), + 'Webman\\Captcha\\' => array($vendorDir . '/webman/captcha/src'), + 'Webman\\' => array($vendorDir . '/workerman/webman-framework/src'), + 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), + 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), + 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), + 'Symfony\\Contracts\\Translation\\' => array($vendorDir . '/symfony/translation-contracts'), + 'Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), + 'Symfony\\Contracts\\Cache\\' => array($vendorDir . '/symfony/cache-contracts'), + 'Symfony\\Component\\VarExporter\\' => array($vendorDir . '/symfony/var-exporter'), + 'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'), + 'Symfony\\Component\\Cache\\' => array($vendorDir . '/symfony/cache'), + 'Support\\View\\' => array($vendorDir . '/workerman/webman-framework/src/support/view'), + 'Support\\Exception\\' => array($vendorDir . '/workerman/webman-framework/src/support/exception'), + 'Support\\Bootstrap\\' => array($vendorDir . '/workerman/webman-framework/src/support/bootstrap'), + 'Support\\' => array($vendorDir . '/workerman/webman-framework/src/support'), + 'Respect\\Validation\\' => array($vendorDir . '/workerman/validation/library'), + 'Respect\\Stringifier\\' => array($vendorDir . '/respect/stringifier/src'), + 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), + 'Psr\\Log\\' => array($vendorDir . '/psr/log/src'), + 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src', $vendorDir . '/psr/http-factory/src'), + 'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'), + 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), + 'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'), + 'PhpOption\\' => array($vendorDir . '/phpoption/phpoption/src/PhpOption'), + 'NspTeam\\WebmanThrottler\\' => array($vendorDir . '/nsp-team/webman-throttler/src'), + 'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'), + 'Illuminate\\Support\\' => array($vendorDir . '/illuminate/collections', $vendorDir . '/illuminate/conditionable', $vendorDir . '/illuminate/macroable', $vendorDir . '/illuminate/support'), + 'Illuminate\\Redis\\' => array($vendorDir . '/illuminate/redis'), + 'Illuminate\\Pipeline\\' => array($vendorDir . '/illuminate/pipeline'), + 'Illuminate\\Events\\' => array($vendorDir . '/illuminate/events'), + 'Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'), + 'Illuminate\\Container\\' => array($vendorDir . '/illuminate/container'), + 'Illuminate\\Bus\\' => array($vendorDir . '/illuminate/bus'), + 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), + 'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'), + 'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'), + 'GrahamCampbell\\ResultType\\' => array($vendorDir . '/graham-campbell/result-type/src'), + 'FastRoute\\' => array($vendorDir . '/nikic/fast-route/src'), + 'Dotenv\\' => array($vendorDir . '/vlucas/phpdotenv/src'), + 'Doctrine\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector'), + 'Carbon\\' => array($vendorDir . '/nesbot/carbon/src/Carbon'), + 'App\\' => array($baseDir . '/app'), + '' => array($baseDir . '/'), +); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php new file mode 100644 index 0000000..30210a5 --- /dev/null +++ b/vendor/composer/autoload_real.php @@ -0,0 +1,57 @@ +<?php + +// autoload_real.php @generated by Composer + +class ComposerAutoloaderInit958477a3aed1c453d9f493182493e578 +{ + private static $loader; + + public static function loadClassLoader($class) + { + if ('Composer\Autoload\ClassLoader' === $class) { + require __DIR__ . '/ClassLoader.php'; + } + } + + /** + * @return \Composer\Autoload\ClassLoader + */ + public static function getLoader() + { + if (null !== self::$loader) { + return self::$loader; + } + + require __DIR__ . '/platform_check.php'; + + spl_autoload_register(array('ComposerAutoloaderInit958477a3aed1c453d9f493182493e578', 'loadClassLoader'), true, true); + self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); + spl_autoload_unregister(array('ComposerAutoloaderInit958477a3aed1c453d9f493182493e578', 'loadClassLoader')); + + require __DIR__ . '/autoload_static.php'; + call_user_func(\Composer\Autoload\ComposerStaticInit958477a3aed1c453d9f493182493e578::getInitializer($loader)); + + $loader->register(true); + + $includeFiles = \Composer\Autoload\ComposerStaticInit958477a3aed1c453d9f493182493e578::$files; + foreach ($includeFiles as $fileIdentifier => $file) { + composerRequire958477a3aed1c453d9f493182493e578($fileIdentifier, $file); + } + + return $loader; + } +} + +/** + * @param string $fileIdentifier + * @param string $file + * @return void + */ +function composerRequire958477a3aed1c453d9f493182493e578($fileIdentifier, $file) +{ + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + + require $file; + } +} diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php new file mode 100644 index 0000000..89198e0 --- /dev/null +++ b/vendor/composer/autoload_static.php @@ -0,0 +1,352 @@ +<?php + +// autoload_static.php @generated by Composer + +namespace Composer\Autoload; + +class ComposerStaticInit958477a3aed1c453d9f493182493e578 +{ + public static $files = array ( + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', + '60799491728b879e74601d83e38b2cad' => __DIR__ . '/..' . '/illuminate/collections/helpers.php', + 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', + 'a1105708a18b76903365ca1c4aa61b02' => __DIR__ . '/..' . '/symfony/translation/Resources/functions.php', + '72579e7bd17821bb1321b87411366eae' => __DIR__ . '/..' . '/illuminate/support/helpers.php', + '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', + '253c157292f75eb38082b5acb06f3f01' => __DIR__ . '/..' . '/nikic/fast-route/src/functions.php', + '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', + 'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php', + '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', + '2df68f9e79c919e2d88506611769ed2e' => __DIR__ . '/..' . '/respect/stringifier/src/stringify.php', + '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', + 'ef65a1626449d89d0811cf9befce46f0' => __DIR__ . '/..' . '/illuminate/events/functions.php', + 'da5b71a9ad8465d48da441e2f36823b6' => __DIR__ . '/../..' . '/support/helpers.php', + ); + + public static $prefixLengthsPsr4 = array ( + 'y' => + array ( + 'yzh52521\\middleware\\' => 20, + 'yzh52521\\EasyHttp\\' => 18, + ), + 'v' => + array ( + 'voku\\' => 5, + ), + 's' => + array ( + 'support\\' => 8, + ), + 'a' => + array ( + 'app\\View\\Components\\' => 20, + 'app\\' => 4, + ), + 'W' => + array ( + 'Workerman\\' => 10, + 'Webman\\Captcha\\' => 15, + 'Webman\\' => 7, + ), + 'S' => + array ( + 'Symfony\\Polyfill\\Php80\\' => 23, + 'Symfony\\Polyfill\\Mbstring\\' => 26, + 'Symfony\\Polyfill\\Ctype\\' => 23, + 'Symfony\\Contracts\\Translation\\' => 30, + 'Symfony\\Contracts\\Service\\' => 26, + 'Symfony\\Contracts\\Cache\\' => 24, + 'Symfony\\Component\\VarExporter\\' => 30, + 'Symfony\\Component\\Translation\\' => 30, + 'Symfony\\Component\\Cache\\' => 24, + 'Support\\View\\' => 13, + 'Support\\Exception\\' => 18, + 'Support\\Bootstrap\\' => 18, + 'Support\\' => 8, + ), + 'R' => + array ( + 'Respect\\Validation\\' => 19, + 'Respect\\Stringifier\\' => 20, + ), + 'P' => + array ( + 'Psr\\SimpleCache\\' => 16, + 'Psr\\Log\\' => 8, + 'Psr\\Http\\Message\\' => 17, + 'Psr\\Http\\Client\\' => 16, + 'Psr\\Container\\' => 14, + 'Psr\\Cache\\' => 10, + 'PhpOption\\' => 10, + ), + 'N' => + array ( + 'NspTeam\\WebmanThrottler\\' => 24, + ), + 'M' => + array ( + 'Monolog\\' => 8, + ), + 'I' => + array ( + 'Illuminate\\Support\\' => 19, + 'Illuminate\\Redis\\' => 17, + 'Illuminate\\Pipeline\\' => 20, + 'Illuminate\\Events\\' => 18, + 'Illuminate\\Contracts\\' => 21, + 'Illuminate\\Container\\' => 21, + 'Illuminate\\Bus\\' => 15, + ), + 'G' => + array ( + 'GuzzleHttp\\Psr7\\' => 16, + 'GuzzleHttp\\Promise\\' => 19, + 'GuzzleHttp\\' => 11, + 'GrahamCampbell\\ResultType\\' => 26, + ), + 'F' => + array ( + 'FastRoute\\' => 10, + ), + 'D' => + array ( + 'Dotenv\\' => 7, + 'Doctrine\\Inflector\\' => 19, + ), + 'C' => + array ( + 'Carbon\\' => 7, + ), + 'A' => + array ( + 'App\\' => 4, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'yzh52521\\middleware\\' => + array ( + 0 => __DIR__ . '/..' . '/yzh52521/webman-throttle/src', + ), + 'yzh52521\\EasyHttp\\' => + array ( + 0 => __DIR__ . '/..' . '/yzh52521/easyhttp/src', + ), + 'voku\\' => + array ( + 0 => __DIR__ . '/..' . '/voku/portable-ascii/src/voku', + ), + 'support\\' => + array ( + 0 => __DIR__ . '/..' . '/workerman/webman-framework/src/support', + ), + 'app\\View\\Components\\' => + array ( + 0 => __DIR__ . '/../..' . '/app/view/components', + ), + 'app\\' => + array ( + 0 => __DIR__ . '/../..' . '/app', + ), + 'Workerman\\' => + array ( + 0 => __DIR__ . '/..' . '/workerman/workerman', + ), + 'Webman\\Captcha\\' => + array ( + 0 => __DIR__ . '/..' . '/webman/captcha/src', + ), + 'Webman\\' => + array ( + 0 => __DIR__ . '/..' . '/workerman/webman-framework/src', + ), + 'Symfony\\Polyfill\\Php80\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', + ), + 'Symfony\\Polyfill\\Mbstring\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', + ), + 'Symfony\\Polyfill\\Ctype\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', + ), + 'Symfony\\Contracts\\Translation\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/translation-contracts', + ), + 'Symfony\\Contracts\\Service\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/service-contracts', + ), + 'Symfony\\Contracts\\Cache\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/cache-contracts', + ), + 'Symfony\\Component\\VarExporter\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/var-exporter', + ), + 'Symfony\\Component\\Translation\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/translation', + ), + 'Symfony\\Component\\Cache\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/cache', + ), + 'Support\\View\\' => + array ( + 0 => __DIR__ . '/..' . '/workerman/webman-framework/src/support/view', + ), + 'Support\\Exception\\' => + array ( + 0 => __DIR__ . '/..' . '/workerman/webman-framework/src/support/exception', + ), + 'Support\\Bootstrap\\' => + array ( + 0 => __DIR__ . '/..' . '/workerman/webman-framework/src/support/bootstrap', + ), + 'Support\\' => + array ( + 0 => __DIR__ . '/..' . '/workerman/webman-framework/src/support', + ), + 'Respect\\Validation\\' => + array ( + 0 => __DIR__ . '/..' . '/workerman/validation/library', + ), + 'Respect\\Stringifier\\' => + array ( + 0 => __DIR__ . '/..' . '/respect/stringifier/src', + ), + 'Psr\\SimpleCache\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/simple-cache/src', + ), + 'Psr\\Log\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/log/src', + ), + 'Psr\\Http\\Message\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/http-message/src', + 1 => __DIR__ . '/..' . '/psr/http-factory/src', + ), + 'Psr\\Http\\Client\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/http-client/src', + ), + 'Psr\\Container\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/container/src', + ), + 'Psr\\Cache\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/cache/src', + ), + 'PhpOption\\' => + array ( + 0 => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption', + ), + 'NspTeam\\WebmanThrottler\\' => + array ( + 0 => __DIR__ . '/..' . '/nsp-team/webman-throttler/src', + ), + 'Monolog\\' => + array ( + 0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog', + ), + 'Illuminate\\Support\\' => + array ( + 0 => __DIR__ . '/..' . '/illuminate/collections', + 1 => __DIR__ . '/..' . '/illuminate/conditionable', + 2 => __DIR__ . '/..' . '/illuminate/macroable', + 3 => __DIR__ . '/..' . '/illuminate/support', + ), + 'Illuminate\\Redis\\' => + array ( + 0 => __DIR__ . '/..' . '/illuminate/redis', + ), + 'Illuminate\\Pipeline\\' => + array ( + 0 => __DIR__ . '/..' . '/illuminate/pipeline', + ), + 'Illuminate\\Events\\' => + array ( + 0 => __DIR__ . '/..' . '/illuminate/events', + ), + 'Illuminate\\Contracts\\' => + array ( + 0 => __DIR__ . '/..' . '/illuminate/contracts', + ), + 'Illuminate\\Container\\' => + array ( + 0 => __DIR__ . '/..' . '/illuminate/container', + ), + 'Illuminate\\Bus\\' => + array ( + 0 => __DIR__ . '/..' . '/illuminate/bus', + ), + 'GuzzleHttp\\Psr7\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', + ), + 'GuzzleHttp\\Promise\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/promises/src', + ), + 'GuzzleHttp\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', + ), + 'GrahamCampbell\\ResultType\\' => + array ( + 0 => __DIR__ . '/..' . '/graham-campbell/result-type/src', + ), + 'FastRoute\\' => + array ( + 0 => __DIR__ . '/..' . '/nikic/fast-route/src', + ), + 'Dotenv\\' => + array ( + 0 => __DIR__ . '/..' . '/vlucas/phpdotenv/src', + ), + 'Doctrine\\Inflector\\' => + array ( + 0 => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector', + ), + 'Carbon\\' => + array ( + 0 => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon', + ), + 'App\\' => + array ( + 0 => __DIR__ . '/../..' . '/app', + ), + ); + + public static $fallbackDirsPsr4 = array ( + 0 => __DIR__ . '/../..' . '/', + ); + + public static $classMap = array ( + 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', + 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', + 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', + 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit958477a3aed1c453d9f493182493e578::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit958477a3aed1c453d9f493182493e578::$prefixDirsPsr4; + $loader->fallbackDirsPsr4 = ComposerStaticInit958477a3aed1c453d9f493182493e578::$fallbackDirsPsr4; + $loader->classMap = ComposerStaticInit958477a3aed1c453d9f493182493e578::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json new file mode 100644 index 0000000..e390773 --- /dev/null +++ b/vendor/composer/installed.json @@ -0,0 +1,3579 @@ +{ + "packages": [ + { + "name": "doctrine/inflector", + "version": "2.0.4", + "version_normalized": "2.0.4.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^4.10" + }, + "time": "2021-10-22T20:16:43+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "install-path": "../doctrine/inflector" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.0.4", + "version_normalized": "1.0.4.0", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "0690bde05318336c7221785f2a932467f98b64ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/0690bde05318336c7221785f2a932467f98b64ca", + "reference": "0690bde05318336c7221785f2a932467f98b64ca", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.0 || ^8.0", + "phpoption/phpoption": "^1.8" + }, + "require-dev": { + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + }, + "time": "2021-11-21T21:41:47+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "install-path": "../graham-campbell/result-type" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.5.0", + "version_normalized": "7.5.0.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9 || ^2.4", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "time": "2022-08-28T15:39:27+00:00", + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "7.5-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "install-path": "../guzzlehttp/guzzle" + }, + { + "name": "guzzlehttp/promises", + "version": "1.5.2", + "version_normalized": "1.5.2.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "b94b2807d85443f9719887892882d0329d1e2598" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", + "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "time": "2022-08-28T14:55:35+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "install-path": "../guzzlehttp/promises" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.4.3", + "version_normalized": "2.4.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "67c26b443f348a51926030c83481b85718457d3d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d", + "reference": "67c26b443f348a51926030c83481b85718457d3d", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "time": "2022-10-26T14:07:24+00:00", + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.4.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "install-path": "../guzzlehttp/psr7" + }, + { + "name": "illuminate/bus", + "version": "v9.45.1", + "version_normalized": "9.45.1.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/bus.git", + "reference": "c7f09872054f2b361f8ed9e9e988b3c9be06c596" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/bus/zipball/c7f09872054f2b361f8ed9e9e988b3c9be06c596", + "reference": "c7f09872054f2b361f8ed9e9e988b3c9be06c596", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "illuminate/collections": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/pipeline": "^9.0", + "illuminate/support": "^9.0", + "php": "^8.0.2" + }, + "suggest": { + "illuminate/queue": "Required to use closures when chaining jobs (^7.0)." + }, + "time": "2022-11-25T07:56:47+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Illuminate\\Bus\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Bus package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "install-path": "../illuminate/bus" + }, + { + "name": "illuminate/collections", + "version": "v9.45.0", + "version_normalized": "9.45.0.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "7a8afa0875d7de162f30865d9fae33c8fb235fa2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/7a8afa0875d7de162f30865d9fae33c8fb235fa2", + "reference": "7a8afa0875d7de162f30865d9fae33c8fb235fa2", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "illuminate/conditionable": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/macroable": "^9.0", + "php": "^8.0.2" + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump method (^6.0)." + }, + "time": "2022-12-02T18:48:05+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "install-path": "../illuminate/collections" + }, + { + "name": "illuminate/conditionable", + "version": "v9.45.0", + "version_normalized": "9.45.0.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/conditionable.git", + "reference": "5b40f51ccb07e0e7b1ec5559d8db9e0e2dc51883" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/conditionable/zipball/5b40f51ccb07e0e7b1ec5559d8db9e0e2dc51883", + "reference": "5b40f51ccb07e0e7b1ec5559d8db9e0e2dc51883", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^8.0.2" + }, + "time": "2022-07-29T19:44:19+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Conditionable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "install-path": "../illuminate/conditionable" + }, + { + "name": "illuminate/container", + "version": "v9.45.1", + "version_normalized": "9.45.1.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/container.git", + "reference": "8ca3036459e26dc7cdedaf0f882b625757cc341e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/container/zipball/8ca3036459e26dc7cdedaf0f882b625757cc341e", + "reference": "8ca3036459e26dc7cdedaf0f882b625757cc341e", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "illuminate/contracts": "^9.0", + "php": "^8.0.2", + "psr/container": "^1.1.1|^2.0.1" + }, + "provide": { + "psr/container-implementation": "1.1|2.0" + }, + "time": "2022-09-05T15:58:42+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Illuminate\\Container\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Container package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "install-path": "../illuminate/container" + }, + { + "name": "illuminate/contracts", + "version": "v9.45.1", + "version_normalized": "9.45.1.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "c7cc6e6198cac6dfdead111f9758de25413188b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/c7cc6e6198cac6dfdead111f9758de25413188b7", + "reference": "c7cc6e6198cac6dfdead111f9758de25413188b7", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^8.0.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/simple-cache": "^1.0|^2.0|^3.0" + }, + "time": "2022-10-31T22:25:40+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "install-path": "../illuminate/contracts" + }, + { + "name": "illuminate/events", + "version": "v9.45.1", + "version_normalized": "9.45.1.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/events.git", + "reference": "8e534676bac23bc17925f5c74c128f9c09b98f69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/events/zipball/8e534676bac23bc17925f5c74c128f9c09b98f69", + "reference": "8e534676bac23bc17925f5c74c128f9c09b98f69", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "illuminate/bus": "^9.0", + "illuminate/collections": "^9.0", + "illuminate/container": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/macroable": "^9.0", + "illuminate/support": "^9.0", + "php": "^8.0.2" + }, + "time": "2022-09-15T13:14:12+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Illuminate\\Events\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Events package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "install-path": "../illuminate/events" + }, + { + "name": "illuminate/macroable", + "version": "v9.45.1", + "version_normalized": "9.45.1.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "e3bfaf6401742a9c6abca61b9b10e998e5b6449a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/e3bfaf6401742a9c6abca61b9b10e998e5b6449a", + "reference": "e3bfaf6401742a9c6abca61b9b10e998e5b6449a", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^8.0.2" + }, + "time": "2022-08-09T13:29:29+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "install-path": "../illuminate/macroable" + }, + { + "name": "illuminate/pipeline", + "version": "v9.45.1", + "version_normalized": "9.45.1.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/pipeline.git", + "reference": "e0be3f3f79f8235ad7334919ca4094d5074e02f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/pipeline/zipball/e0be3f3f79f8235ad7334919ca4094d5074e02f6", + "reference": "e0be3f3f79f8235ad7334919ca4094d5074e02f6", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "illuminate/contracts": "^9.0", + "illuminate/support": "^9.0", + "php": "^8.0.2" + }, + "time": "2022-06-09T14:13:53+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Illuminate\\Pipeline\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Pipeline package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "install-path": "../illuminate/pipeline" + }, + { + "name": "illuminate/redis", + "version": "v9.45.1", + "version_normalized": "9.45.1.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/redis.git", + "reference": "0684a40c7f820b274acdc57e19dc691609de9097" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/redis/zipball/0684a40c7f820b274acdc57e19dc691609de9097", + "reference": "0684a40c7f820b274acdc57e19dc691609de9097", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "illuminate/collections": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/macroable": "^9.0", + "illuminate/support": "^9.0", + "php": "^8.0.2" + }, + "suggest": { + "ext-redis": "Required to use the phpredis connector (^4.0|^5.0).", + "predis/predis": "Required to use the predis connector (^1.1.9|^2.0.2)." + }, + "time": "2022-12-19T10:26:22+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Illuminate\\Redis\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Redis package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "install-path": "../illuminate/redis" + }, + { + "name": "illuminate/support", + "version": "v9.45.1", + "version_normalized": "9.45.1.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/support.git", + "reference": "d7f7c07e35a2c09cbeeddc0168826cf05a2eeb84" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/support/zipball/d7f7c07e35a2c09cbeeddc0168826cf05a2eeb84", + "reference": "d7f7c07e35a2c09cbeeddc0168826cf05a2eeb84", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "doctrine/inflector": "^2.0", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/collections": "^9.0", + "illuminate/conditionable": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/macroable": "^9.0", + "nesbot/carbon": "^2.62.1", + "php": "^8.0.2", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "suggest": { + "illuminate/filesystem": "Required to use the composer class (^9.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.0.2).", + "ramsey/uuid": "Required to use Str::uuid() (^4.7).", + "symfony/process": "Required to use the composer class (^6.0).", + "symfony/uid": "Required to use Str::ulid() (^6.0).", + "symfony/var-dumper": "Required to use the dd function (^6.0).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.4.1)." + }, + "time": "2022-12-20T14:03:34+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "install-path": "../illuminate/support" + }, + { + "name": "monolog/monolog", + "version": "2.8.0", + "version_normalized": "2.8.0.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "720488632c590286b88b80e62aa3d3d551ad4a50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50", + "reference": "720488632c590286b88b80e62aa3d3d551ad4a50", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5.14", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "time": "2022-07-24T11:55:47+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.8.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "install-path": "../monolog/monolog" + }, + { + "name": "nesbot/carbon", + "version": "2.64.0", + "version_normalized": "2.64.0.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "889546413c97de2d05063b8cb7b193c2531ea211" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/889546413c97de2d05063b8cb7b193c2531ea211", + "reference": "889546413c97de2d05063b8cb7b193c2531ea211", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "time": "2022-11-26T17:36:00+00:00", + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "install-path": "../nesbot/carbon" + }, + { + "name": "nikic/fast-route", + "version": "v1.3.0", + "version_normalized": "1.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/FastRoute.git", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "time": "2018-02-13T20:26:39+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "FastRoute\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "description": "Fast request router for PHP", + "keywords": [ + "router", + "routing" + ], + "support": { + "issues": "https://github.com/nikic/FastRoute/issues", + "source": "https://github.com/nikic/FastRoute/tree/master" + }, + "install-path": "../nikic/fast-route" + }, + { + "name": "nsp-team/webman-throttler", + "version": "v1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/nsp-team/webman-throttler.git", + "reference": "5572496db0ea5b04bb313fb7479332126fde46a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nsp-team/webman-throttler/zipball/5572496db0ea5b04bb313fb7479332126fde46a7", + "reference": "5572496db0ea5b04bb313fb7479332126fde46a7", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2", + "workerman/webman-framework": "^1.2.1" + }, + "time": "2022-04-06T00:53:55+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "NspTeam\\WebmanThrottler\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "maoxp", + "email": "maoxingpei8686@163.com" + } + ], + "description": "very Very easy to use a current limiting component, the code is very simple, based on the webman framework.", + "support": { + "issues": "https://github.com/nsp-team/webman-throttler/issues", + "source": "https://github.com/nsp-team/webman-throttler/tree/v1.0.1" + }, + "install-path": "../nsp-team/webman-throttler" + }, + { + "name": "phpoption/phpoption", + "version": "1.8.1", + "version_normalized": "1.8.1.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", + "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + }, + "time": "2021-12-04T23:24:31+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.8.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "install-path": "../phpoption/phpoption" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "version_normalized": "3.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.0" + }, + "time": "2021-02-03T23:26:27+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "install-path": "../psr/cache" + }, + { + "name": "psr/container", + "version": "1.1.2", + "version_normalized": "1.1.2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.4.0" + }, + "time": "2021-11-05T16:50:12+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "install-path": "../psr/container" + }, + { + "name": "psr/http-client", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "time": "2020-06-29T06:28:15+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "install-path": "../psr/http-client" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "time": "2019-04-30T12:38:16+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "install-path": "../psr/http-factory" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2016-08-06T14:39:51+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "install-path": "../psr/http-message" + }, + { + "name": "psr/log", + "version": "3.0.0", + "version_normalized": "3.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.0" + }, + "time": "2021-07-14T16:46:02+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "install-path": "../psr/log" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "version_normalized": "3.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.0" + }, + "time": "2021-10-29T13:26:27+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "install-path": "../psr/simple-cache" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "version_normalized": "3.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "time": "2019-03-08T08:55:37+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "install-path": "../ralouphie/getallheaders" + }, + { + "name": "respect/stringifier", + "version": "0.2.0", + "version_normalized": "0.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/Respect/Stringifier.git", + "reference": "e55af3c8aeaeaa2abb5fa47a58a8e9688cc23b59" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Respect/Stringifier/zipball/e55af3c8aeaeaa2abb5fa47a58a8e9688cc23b59", + "reference": "e55af3c8aeaeaa2abb5fa47a58a8e9688cc23b59", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.8", + "malukenho/docheader": "^0.1.7", + "phpunit/phpunit": "^6.4" + }, + "time": "2017-12-29T19:39:25+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/stringify.php" + ], + "psr-4": { + "Respect\\Stringifier\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Respect/Stringifier Contributors", + "homepage": "https://github.com/Respect/Stringifier/graphs/contributors" + } + ], + "description": "Converts any value to a string", + "homepage": "http://respect.github.io/Stringifier/", + "keywords": [ + "respect", + "stringifier", + "stringify" + ], + "support": { + "issues": "https://github.com/Respect/Stringifier/issues", + "source": "https://github.com/Respect/Stringifier/tree/0.2.0" + }, + "install-path": "../respect/stringifier" + }, + { + "name": "symfony/cache", + "version": "v6.0.18", + "version_normalized": "6.0.18.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "079ec0afe323fdcd5ac1f16e3ffdb4991fb5d4c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/079ec0afe323fdcd5ac1f16e3ffdb4991fb5d4c9", + "reference": "079ec0afe323fdcd5ac1f16e3ffdb4991fb5d4c9", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.2", + "psr/cache": "^2.0|^3.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^1.1.7|^2|^3", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/var-exporter": "^5.4|^6.0" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/var-dumper": "<5.4" + }, + "provide": { + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/dbal": "^2.13.1|^3.0", + "predis/predis": "^1.1", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/messenger": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "time": "2022-12-29T16:27:58+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v6.0.18" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/cache" + }, + { + "name": "symfony/cache-contracts", + "version": "v3.0.2", + "version_normalized": "3.0.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "1c0a181c9ee221afe4fa55b2d13fc63c5ae14348" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/1c0a181c9ee221afe4fa55b2d13fc63c5ae14348", + "reference": "1c0a181c9ee221afe4fa55b2d13fc63c5ae14348", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.2", + "psr/cache": "^3.0" + }, + "suggest": { + "symfony/cache-implementation": "" + }, + "time": "2022-01-02T09:55:41+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/cache-contracts" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.0.2", + "version_normalized": "3.0.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", + "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.2" + }, + "time": "2022-01-02T09:55:41+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/deprecation-contracts" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.27.0", + "version_normalized": "1.27.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "time": "2022-11-03T14:55:06+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-ctype" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.27.0", + "version_normalized": "1.27.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "time": "2022-11-03T14:55:06+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-mbstring" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.27.0", + "version_normalized": "1.27.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "time": "2022-11-03T14:55:06+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/polyfill-php80" + }, + { + "name": "symfony/service-contracts", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "time": "2022-05-30T19:17:29+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/service-contracts" + }, + { + "name": "symfony/translation", + "version": "v6.0.14", + "version_normalized": "6.0.14.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "6f99eb179aee4652c0a7cd7c11f2a870d904330c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/6f99eb179aee4652c0a7cd7c11f2a870d904330c", + "reference": "6f99eb179aee4652c0a7cd7c11f2a870d904330c", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.3|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^5.4|^6.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "time": "2022-10-07T08:02:12+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.0.14" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/translation" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.0.2", + "version_normalized": "3.0.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "acbfbb274e730e5a0236f619b6168d9dedb3e282" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/acbfbb274e730e5a0236f619b6168d9dedb3e282", + "reference": "acbfbb274e730e5a0236f619b6168d9dedb3e282", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.2" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "time": "2022-06-27T17:10:44+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/translation-contracts" + }, + { + "name": "symfony/var-exporter", + "version": "v6.0.17", + "version_normalized": "6.0.17.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "d87c15d59421d38fe5eb4f6724eb75891479e3da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/d87c15d59421d38fe5eb4f6724eb75891479e3da", + "reference": "d87c15d59421d38fe5eb4f6724eb75891479e3da", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.2" + }, + "require-dev": { + "symfony/var-dumper": "^5.4|^6.0" + }, + "time": "2022-12-22T17:53:58+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v6.0.17" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/var-exporter" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.4.1", + "version_normalized": "5.4.1.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/264dce589e7ce37a7ba99cb901eed8249fbec92f", + "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "time": "2021-12-12T23:22:04+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "install-path": "../vlucas/phpdotenv" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "version_normalized": "2.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "time": "2022-03-08T17:03:00+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "install-path": "../voku/portable-ascii" + }, + { + "name": "webman/captcha", + "version": "v1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/webman-php/captcha.git", + "reference": "7a78f861d40c326575112d6698c7d47c5f326be9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webman-php/captcha/zipball/7a78f861d40c326575112d6698c7d47c5f326be9", + "reference": "7a78f861d40c326575112d6698c7d47c5f326be9", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-gd": "*", + "ext-mbstring": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.4" + }, + "time": "2022-09-28T11:55:22+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Webman\\Captcha\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "walkor", + "email": "walkor@workerman.net" + }, + { + "name": "Grégoire Passault", + "email": "g.passault@gmail.com", + "homepage": "http://www.gregwar.com/" + }, + { + "name": "Jeremy Livingston", + "email": "jeremy.j.livingston@gmail.com" + } + ], + "description": "Captcha generator", + "keywords": [ + "bot", + "captcha", + "spam" + ], + "support": { + "source": "https://github.com/webman-php/captcha/tree/v1.0.0" + }, + "install-path": "../webman/captcha" + }, + { + "name": "workerman/validation", + "version": "v3.0.2", + "version_normalized": "3.0.2.0", + "source": { + "type": "git", + "url": "https://github.com/walkor/validation.git", + "reference": "49387fff74acb63277ea7ed9a476ffe339348772" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/walkor/validation/zipball/49387fff74acb63277ea7ed9a476ffe339348772", + "reference": "49387fff74acb63277ea7ed9a476ffe339348772", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2", + "respect/stringifier": "^0.2.0", + "symfony/polyfill-mbstring": "^1.2" + }, + "require-dev": { + "egulias/email-validator": "^2.1", + "malukenho/docheader": "^0.1", + "mikey179/vfsstream": "^1.6", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.5", + "respect/coding-standard": "^2.1", + "squizlabs/php_codesniffer": "^3.5", + "symfony/validator": "^3.0||^4.0", + "zendframework/zend-validator": "^2.1" + }, + "suggest": { + "egulias/email-validator": "Strict (RFC compliant) email validation", + "ext-bcmath": "Arbitrary Precision Mathematics", + "ext-fileinfo": "File Information", + "ext-mbstring": "Multibyte String Functions", + "symfony/validator": "Use Symfony validator through Respect\\Validation", + "zendframework/zend-validator": "Use Zend Framework validator through Respect\\Validation" + }, + "time": "2022-04-19T03:49:38+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Respect\\Validation\\": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Respect/Validation Contributors", + "homepage": "https://github.com/Respect/Validation/graphs/contributors" + } + ], + "description": "The most awesome validation engine ever created for PHP. Respect/Validation 汉化版本", + "homepage": "http://respect.github.io/Validation/", + "keywords": [ + "respect", + "validation", + "validator" + ], + "support": { + "source": "https://github.com/walkor/validation/tree/v3.0.2" + }, + "install-path": "../workerman/validation" + }, + { + "name": "workerman/webman-framework", + "version": "v1.4.10", + "version_normalized": "1.4.10.0", + "source": { + "type": "git", + "url": "https://github.com/walkor/webman-framework.git", + "reference": "d9d6a5317f1f11486e37bf5613aa0d1601b83edd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/walkor/webman-framework/zipball/d9d6a5317f1f11486e37bf5613aa0d1601b83edd", + "reference": "d9d6a5317f1f11486e37bf5613aa0d1601b83edd", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "nikic/fast-route": "^1.3", + "php": ">=7.2", + "psr/container": ">=1.0", + "workerman/workerman": "^4.0.4" + }, + "suggest": { + "ext-event": "For better performance. " + }, + "time": "2022-12-12T07:54:21+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Webman\\": "./src", + "Support\\": "./src/support", + "support\\": "./src/support", + "Support\\View\\": "./src/support/view", + "Support\\Bootstrap\\": "./src/support/bootstrap", + "Support\\Exception\\": "./src/support/exception" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "walkor", + "email": "walkor@workerman.net", + "homepage": "https://www.workerman.net", + "role": "Developer" + } + ], + "description": "High performance HTTP Service Framework.", + "homepage": "https://www.workerman.net", + "keywords": [ + "High Performance", + "http service" + ], + "support": { + "email": "walkor@workerman.net", + "forum": "https://wenda.workerman.net/", + "issues": "https://github.com/walkor/webman/issues", + "source": "https://github.com/walkor/webman-framework", + "wiki": "https://doc.workerman.net/" + }, + "install-path": "../workerman/webman-framework" + }, + { + "name": "workerman/workerman", + "version": "v4.1.5", + "version_normalized": "4.1.5.0", + "source": { + "type": "git", + "url": "https://github.com/walkor/workerman.git", + "reference": "16bcfc2c7574feea46cdadaaa8ae73f14d464b21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/walkor/workerman/zipball/16bcfc2c7574feea46cdadaaa8ae73f14d464b21", + "reference": "16bcfc2c7574feea46cdadaaa8ae73f14d464b21", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.0" + }, + "suggest": { + "ext-event": "For better performance. " + }, + "time": "2022-12-14T11:58:06+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Workerman\\": "./" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "walkor", + "email": "walkor@workerman.net", + "homepage": "http://www.workerman.net", + "role": "Developer" + } + ], + "description": "An asynchronous event driven PHP framework for easily building fast, scalable network applications.", + "homepage": "http://www.workerman.net", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "email": "walkor@workerman.net", + "forum": "http://wenda.workerman.net/", + "issues": "https://github.com/walkor/workerman/issues", + "source": "https://github.com/walkor/workerman", + "wiki": "http://doc.workerman.net/" + }, + "funding": [ + { + "url": "https://opencollective.com/workerman", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/walkor", + "type": "patreon" + } + ], + "install-path": "../workerman/workerman" + }, + { + "name": "yzh52521/easyhttp", + "version": "v1.0.5", + "version_normalized": "1.0.5.0", + "source": { + "type": "git", + "url": "https://github.com/yzh52521/easyhttp.git", + "reference": "a74fa5a1d4f701bd20e581b0731e885aac3daf9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yzh52521/easyhttp/zipball/a74fa5a1d4f701bd20e581b0731e885aac3daf9f", + "reference": "a74fa5a1d4f701bd20e581b0731e885aac3daf9f", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "guzzlehttp/guzzle": "^6.0|^7.0", + "php": "^7.2.5|^8.0", + "psr/log": "^1.0|^2.0|^3.0" + }, + "time": "2022-12-05T12:18:34+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "yzh52521\\EasyHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "yzh52521", + "email": "396751927@qq.com" + } + ], + "description": "EasyHttp 是一个轻量级、语义化、对IDE友好的HTTP客户端,支持常见的HTTP请求、异步请求和并发请求,让你可以快速地使用 HTTP 请求与其他 Web 应用进行通信。", + "homepage": "https://github.com/yzh52521/easyhttp", + "keywords": [ + "EasyHttp", + "curl", + "easy-http", + "http", + "php", + "php-http", + "phphttp" + ], + "support": { + "issues": "https://github.com/yzh52521/easyhttp/issues", + "source": "https://github.com/yzh52521/easyhttp/tree/v1.0.5" + }, + "install-path": "../yzh52521/easyhttp" + }, + { + "name": "yzh52521/webman-throttle", + "version": "v1.0.10", + "version_normalized": "1.0.10.0", + "source": { + "type": "git", + "url": "https://github.com/yzh52521/webman-throttle.git", + "reference": "66c69086bd98f3ccb5fc2bf9a59b9f02516384a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yzh52521/webman-throttle/zipball/66c69086bd98f3ccb5fc2bf9a59b9f02516384a5", + "reference": "66c69086bd98f3ccb5fc2bf9a59b9f02516384a5", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2", + "workerman/webman-framework": "^1.2.1" + }, + "time": "2022-09-13T07:37:11+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "yzh52521\\middleware\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "yzh52521", + "email": "396751927@qq.com" + } + ], + "description": "Webman框架限流中间件", + "keywords": [ + "middleware", + "php", + "throttle", + "webman" + ], + "support": { + "issues": "https://github.com/yzh52521/webman-throttle/issues", + "source": "https://github.com/yzh52521/webman-throttle/tree/v1.0.10" + }, + "install-path": "../yzh52521/webman-throttle" + } + ], + "dev": true, + "dev-package-names": [] +} diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php new file mode 100644 index 0000000..576b737 --- /dev/null +++ b/vendor/composer/installed.php @@ -0,0 +1,500 @@ +<?php return array( + 'root' => array( + 'name' => 'workerman/webman', + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'reference' => NULL, + 'type' => 'project', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev' => true, + ), + 'versions' => array( + 'doctrine/inflector' => array( + 'pretty_version' => '2.0.4', + 'version' => '2.0.4.0', + 'reference' => '8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89', + 'type' => 'library', + 'install_path' => __DIR__ . '/../doctrine/inflector', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'graham-campbell/result-type' => array( + 'pretty_version' => 'v1.0.4', + 'version' => '1.0.4.0', + 'reference' => '0690bde05318336c7221785f2a932467f98b64ca', + 'type' => 'library', + 'install_path' => __DIR__ . '/../graham-campbell/result-type', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'guzzlehttp/guzzle' => array( + 'pretty_version' => '7.5.0', + 'version' => '7.5.0.0', + 'reference' => 'b50a2a1251152e43f6a37f0fa053e730a67d25ba', + 'type' => 'library', + 'install_path' => __DIR__ . '/../guzzlehttp/guzzle', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'guzzlehttp/promises' => array( + 'pretty_version' => '1.5.2', + 'version' => '1.5.2.0', + 'reference' => 'b94b2807d85443f9719887892882d0329d1e2598', + 'type' => 'library', + 'install_path' => __DIR__ . '/../guzzlehttp/promises', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'guzzlehttp/psr7' => array( + 'pretty_version' => '2.4.3', + 'version' => '2.4.3.0', + 'reference' => '67c26b443f348a51926030c83481b85718457d3d', + 'type' => 'library', + 'install_path' => __DIR__ . '/../guzzlehttp/psr7', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'illuminate/bus' => array( + 'pretty_version' => 'v9.45.1', + 'version' => '9.45.1.0', + 'reference' => 'c7f09872054f2b361f8ed9e9e988b3c9be06c596', + 'type' => 'library', + 'install_path' => __DIR__ . '/../illuminate/bus', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'illuminate/collections' => array( + 'pretty_version' => 'v9.45.0', + 'version' => '9.45.0.0', + 'reference' => '7a8afa0875d7de162f30865d9fae33c8fb235fa2', + 'type' => 'library', + 'install_path' => __DIR__ . '/../illuminate/collections', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'illuminate/conditionable' => array( + 'pretty_version' => 'v9.45.0', + 'version' => '9.45.0.0', + 'reference' => '5b40f51ccb07e0e7b1ec5559d8db9e0e2dc51883', + 'type' => 'library', + 'install_path' => __DIR__ . '/../illuminate/conditionable', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'illuminate/container' => array( + 'pretty_version' => 'v9.45.1', + 'version' => '9.45.1.0', + 'reference' => '8ca3036459e26dc7cdedaf0f882b625757cc341e', + 'type' => 'library', + 'install_path' => __DIR__ . '/../illuminate/container', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'illuminate/contracts' => array( + 'pretty_version' => 'v9.45.1', + 'version' => '9.45.1.0', + 'reference' => 'c7cc6e6198cac6dfdead111f9758de25413188b7', + 'type' => 'library', + 'install_path' => __DIR__ . '/../illuminate/contracts', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'illuminate/events' => array( + 'pretty_version' => 'v9.45.1', + 'version' => '9.45.1.0', + 'reference' => '8e534676bac23bc17925f5c74c128f9c09b98f69', + 'type' => 'library', + 'install_path' => __DIR__ . '/../illuminate/events', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'illuminate/macroable' => array( + 'pretty_version' => 'v9.45.1', + 'version' => '9.45.1.0', + 'reference' => 'e3bfaf6401742a9c6abca61b9b10e998e5b6449a', + 'type' => 'library', + 'install_path' => __DIR__ . '/../illuminate/macroable', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'illuminate/pipeline' => array( + 'pretty_version' => 'v9.45.1', + 'version' => '9.45.1.0', + 'reference' => 'e0be3f3f79f8235ad7334919ca4094d5074e02f6', + 'type' => 'library', + 'install_path' => __DIR__ . '/../illuminate/pipeline', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'illuminate/redis' => array( + 'pretty_version' => 'v9.45.1', + 'version' => '9.45.1.0', + 'reference' => '0684a40c7f820b274acdc57e19dc691609de9097', + 'type' => 'library', + 'install_path' => __DIR__ . '/../illuminate/redis', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'illuminate/support' => array( + 'pretty_version' => 'v9.45.1', + 'version' => '9.45.1.0', + 'reference' => 'd7f7c07e35a2c09cbeeddc0168826cf05a2eeb84', + 'type' => 'library', + 'install_path' => __DIR__ . '/../illuminate/support', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'monolog/monolog' => array( + 'pretty_version' => '2.8.0', + 'version' => '2.8.0.0', + 'reference' => '720488632c590286b88b80e62aa3d3d551ad4a50', + 'type' => 'library', + 'install_path' => __DIR__ . '/../monolog/monolog', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'nesbot/carbon' => array( + 'pretty_version' => '2.64.0', + 'version' => '2.64.0.0', + 'reference' => '889546413c97de2d05063b8cb7b193c2531ea211', + 'type' => 'library', + 'install_path' => __DIR__ . '/../nesbot/carbon', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'nikic/fast-route' => array( + 'pretty_version' => 'v1.3.0', + 'version' => '1.3.0.0', + 'reference' => '181d480e08d9476e61381e04a71b34dc0432e812', + 'type' => 'library', + 'install_path' => __DIR__ . '/../nikic/fast-route', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'nsp-team/webman-throttler' => array( + 'pretty_version' => 'v1.0.1', + 'version' => '1.0.1.0', + 'reference' => '5572496db0ea5b04bb313fb7479332126fde46a7', + 'type' => 'library', + 'install_path' => __DIR__ . '/../nsp-team/webman-throttler', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'phpoption/phpoption' => array( + 'pretty_version' => '1.8.1', + 'version' => '1.8.1.0', + 'reference' => 'eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15', + 'type' => 'library', + 'install_path' => __DIR__ . '/../phpoption/phpoption', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/cache' => array( + 'pretty_version' => '3.0.0', + 'version' => '3.0.0.0', + 'reference' => 'aa5030cfa5405eccfdcb1083ce040c2cb8d253bf', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/cache', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/cache-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '2.0|3.0', + ), + ), + 'psr/container' => array( + 'pretty_version' => '1.1.2', + 'version' => '1.1.2.0', + 'reference' => '513e0666f7216c7459170d56df27dfcefe1689ea', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/container', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/container-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '1.1|2.0', + ), + ), + 'psr/http-client' => array( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'reference' => '2dfb5f6c5eff0e91e20e913f8c5452ed95b86621', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/http-client', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/http-client-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '1.0', + ), + ), + 'psr/http-factory' => array( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/http-factory', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/http-factory-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '1.0', + ), + ), + 'psr/http-message' => array( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/http-message', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/http-message-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '1.0', + ), + ), + 'psr/log' => array( + 'pretty_version' => '3.0.0', + 'version' => '3.0.0.0', + 'reference' => 'fe5ea303b0887d5caefd3d431c3e61ad47037001', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/log', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/log-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '1.0.0 || 2.0.0 || 3.0.0', + ), + ), + 'psr/simple-cache' => array( + 'pretty_version' => '3.0.0', + 'version' => '3.0.0.0', + 'reference' => '764e0b3939f5ca87cb904f570ef9be2d78a07865', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/simple-cache', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/simple-cache-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '1.0|2.0|3.0', + ), + ), + 'ralouphie/getallheaders' => array( + 'pretty_version' => '3.0.3', + 'version' => '3.0.3.0', + 'reference' => '120b605dfeb996808c31b6477290a714d356e822', + 'type' => 'library', + 'install_path' => __DIR__ . '/../ralouphie/getallheaders', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'respect/stringifier' => array( + 'pretty_version' => '0.2.0', + 'version' => '0.2.0.0', + 'reference' => 'e55af3c8aeaeaa2abb5fa47a58a8e9688cc23b59', + 'type' => 'library', + 'install_path' => __DIR__ . '/../respect/stringifier', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/cache' => array( + 'pretty_version' => 'v6.0.18', + 'version' => '6.0.18.0', + 'reference' => '079ec0afe323fdcd5ac1f16e3ffdb4991fb5d4c9', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/cache', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/cache-contracts' => array( + 'pretty_version' => 'v3.0.2', + 'version' => '3.0.2.0', + 'reference' => '1c0a181c9ee221afe4fa55b2d13fc63c5ae14348', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/cache-contracts', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/cache-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '1.1|2.0|3.0', + ), + ), + 'symfony/deprecation-contracts' => array( + 'pretty_version' => 'v3.0.2', + 'version' => '3.0.2.0', + 'reference' => '26954b3d62a6c5fd0ea8a2a00c0353a14978d05c', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-ctype' => array( + 'pretty_version' => 'v1.27.0', + 'version' => '1.27.0.0', + 'reference' => '5bbc823adecdae860bb64756d639ecfec17b050a', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-mbstring' => array( + 'pretty_version' => 'v1.27.0', + 'version' => '1.27.0.0', + 'reference' => '8ad114f6b39e2c98a8b0e3bd907732c207c2b534', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/polyfill-php80' => array( + 'pretty_version' => 'v1.27.0', + 'version' => '1.27.0.0', + 'reference' => '7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/polyfill-php80', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/service-contracts' => array( + 'pretty_version' => 'v2.5.2', + 'version' => '2.5.2.0', + 'reference' => '4b426aac47d6427cc1a1d0f7e2ac724627f5966c', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/service-contracts', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/translation' => array( + 'pretty_version' => 'v6.0.14', + 'version' => '6.0.14.0', + 'reference' => '6f99eb179aee4652c0a7cd7c11f2a870d904330c', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/translation', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/translation-contracts' => array( + 'pretty_version' => 'v3.0.2', + 'version' => '3.0.2.0', + 'reference' => 'acbfbb274e730e5a0236f619b6168d9dedb3e282', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/translation-contracts', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'symfony/translation-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '2.3|3.0', + ), + ), + 'symfony/var-exporter' => array( + 'pretty_version' => 'v6.0.17', + 'version' => '6.0.17.0', + 'reference' => 'd87c15d59421d38fe5eb4f6724eb75891479e3da', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/var-exporter', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'vlucas/phpdotenv' => array( + 'pretty_version' => 'v5.4.1', + 'version' => '5.4.1.0', + 'reference' => '264dce589e7ce37a7ba99cb901eed8249fbec92f', + 'type' => 'library', + 'install_path' => __DIR__ . '/../vlucas/phpdotenv', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'voku/portable-ascii' => array( + 'pretty_version' => '2.0.1', + 'version' => '2.0.1.0', + 'reference' => 'b56450eed252f6801410d810c8e1727224ae0743', + 'type' => 'library', + 'install_path' => __DIR__ . '/../voku/portable-ascii', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'webman/captcha' => array( + 'pretty_version' => 'v1.0.0', + 'version' => '1.0.0.0', + 'reference' => '7a78f861d40c326575112d6698c7d47c5f326be9', + 'type' => 'library', + 'install_path' => __DIR__ . '/../webman/captcha', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'workerman/validation' => array( + 'pretty_version' => 'v3.0.2', + 'version' => '3.0.2.0', + 'reference' => '49387fff74acb63277ea7ed9a476ffe339348772', + 'type' => 'library', + 'install_path' => __DIR__ . '/../workerman/validation', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'workerman/webman' => array( + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'reference' => NULL, + 'type' => 'project', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'workerman/webman-framework' => array( + 'pretty_version' => 'v1.4.10', + 'version' => '1.4.10.0', + 'reference' => 'd9d6a5317f1f11486e37bf5613aa0d1601b83edd', + 'type' => 'library', + 'install_path' => __DIR__ . '/../workerman/webman-framework', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'workerman/workerman' => array( + 'pretty_version' => 'v4.1.5', + 'version' => '4.1.5.0', + 'reference' => '16bcfc2c7574feea46cdadaaa8ae73f14d464b21', + 'type' => 'library', + 'install_path' => __DIR__ . '/../workerman/workerman', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'yzh52521/easyhttp' => array( + 'pretty_version' => 'v1.0.5', + 'version' => '1.0.5.0', + 'reference' => 'a74fa5a1d4f701bd20e581b0731e885aac3daf9f', + 'type' => 'library', + 'install_path' => __DIR__ . '/../yzh52521/easyhttp', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'yzh52521/webman-throttle' => array( + 'pretty_version' => 'v1.0.10', + 'version' => '1.0.10.0', + 'reference' => '66c69086bd98f3ccb5fc2bf9a59b9f02516384a5', + 'type' => 'library', + 'install_path' => __DIR__ . '/../yzh52521/webman-throttle', + 'aliases' => array(), + 'dev_requirement' => false, + ), + ), +); diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php new file mode 100644 index 0000000..b168ddd --- /dev/null +++ b/vendor/composer/platform_check.php @@ -0,0 +1,26 @@ +<?php + +// platform_check.php @generated by Composer + +$issues = array(); + +if (!(PHP_VERSION_ID >= 80002)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 8.0.2". You are running ' . PHP_VERSION . '.'; +} + +if ($issues) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); + } elseif (!headers_sent()) { + echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; + } + } + trigger_error( + 'Composer detected issues in your platform: ' . implode(' ', $issues), + E_USER_ERROR + ); +} diff --git a/vendor/doctrine/inflector/LICENSE b/vendor/doctrine/inflector/LICENSE new file mode 100644 index 0000000..8c38cc1 --- /dev/null +++ b/vendor/doctrine/inflector/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2006-2015 Doctrine Project + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/doctrine/inflector/README.md b/vendor/doctrine/inflector/README.md new file mode 100644 index 0000000..6e3a97f --- /dev/null +++ b/vendor/doctrine/inflector/README.md @@ -0,0 +1,7 @@ +# Doctrine Inflector + +Doctrine Inflector is a small library that can perform string manipulations +with regard to uppercase/lowercase and singular/plural forms of words. + +[![Build Status](https://github.com/doctrine/inflector/workflows/Continuous%20Integration/badge.svg)](https://github.com/doctrine/inflector/actions?query=workflow%3A%22Continuous+Integration%22+branch%3A4.0.x) +[![Code Coverage](https://codecov.io/gh/doctrine/inflector/branch/2.0.x/graph/badge.svg)](https://codecov.io/gh/doctrine/inflector/branch/2.0.x) diff --git a/vendor/doctrine/inflector/composer.json b/vendor/doctrine/inflector/composer.json new file mode 100644 index 0000000..f08fdc3 --- /dev/null +++ b/vendor/doctrine/inflector/composer.json @@ -0,0 +1,36 @@ +{ + "name": "doctrine/inflector", + "type": "library", + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "keywords": ["php", "strings", "words", "manipulation", "inflector", "inflection", "uppercase", "lowercase", "singular", "plural"], + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "license": "MIT", + "authors": [ + {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"}, + {"name": "Roman Borschel", "email": "roman@code-factory.org"}, + {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"}, + {"name": "Jonathan Wage", "email": "jonwage@gmail.com"}, + {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"} + ], + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^4.10" + }, + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "autoload-dev": { + "psr-4": { + "Doctrine\\Tests\\Inflector\\": "tests/Doctrine/Tests/Inflector" + } + } +} diff --git a/vendor/doctrine/inflector/docs/en/index.rst b/vendor/doctrine/inflector/docs/en/index.rst new file mode 100644 index 0000000..29866f4 --- /dev/null +++ b/vendor/doctrine/inflector/docs/en/index.rst @@ -0,0 +1,226 @@ +Introduction +============ + +The Doctrine Inflector has methods for inflecting text. The features include pluralization, +singularization, converting between camelCase and under_score and capitalizing +words. + +Installation +============ + +You can install the Inflector with composer: + +.. code-block:: console + + $ composer require doctrine/inflector + +Usage +===== + +Using the inflector is easy, you can create a new ``Doctrine\Inflector\Inflector`` instance by using +the ``Doctrine\Inflector\InflectorFactory`` class: + +.. code-block:: php + + use Doctrine\Inflector\InflectorFactory; + + $inflector = InflectorFactory::create()->build(); + +By default it will create an English inflector. If you want to use another language, just pass the language +you want to create an inflector for to the ``createForLanguage()`` method: + +.. code-block:: php + + use Doctrine\Inflector\InflectorFactory; + use Doctrine\Inflector\Language; + + $inflector = InflectorFactory::createForLanguage(Language::SPANISH)->build(); + +The supported languages are as follows: + +- ``Language::ENGLISH`` +- ``Language::FRENCH`` +- ``Language::NORWEGIAN_BOKMAL`` +- ``Language::PORTUGUESE`` +- ``Language::SPANISH`` +- ``Language::TURKISH`` + +If you want to manually construct the inflector instead of using a factory, you can do so like this: + +.. code-block:: php + + use Doctrine\Inflector\CachedWordInflector; + use Doctrine\Inflector\RulesetInflector; + use Doctrine\Inflector\Rules\English; + + $inflector = new Inflector( + new CachedWordInflector(new RulesetInflector( + English\Rules::getSingularRuleset() + )), + new CachedWordInflector(new RulesetInflector( + English\Rules::getPluralRuleset() + )) + ); + +Adding Languages +---------------- + +If you are interested in adding support for your language, take a look at the other languages defined in the +``Doctrine\Inflector\Rules`` namespace and the tests located in ``Doctrine\Tests\Inflector\Rules``. You can copy +one of the languages and update the rules for your language. + +Once you have done this, send a pull request to the ``doctrine/inflector`` repository with the additions. + +Custom Setup +============ + +If you want to setup custom singular and plural rules, you can configure these in the factory: + +.. code-block:: php + + use Doctrine\Inflector\InflectorFactory; + use Doctrine\Inflector\Rules\Pattern; + use Doctrine\Inflector\Rules\Patterns; + use Doctrine\Inflector\Rules\Ruleset; + use Doctrine\Inflector\Rules\Substitution; + use Doctrine\Inflector\Rules\Substitutions; + use Doctrine\Inflector\Rules\Transformation; + use Doctrine\Inflector\Rules\Transformations; + use Doctrine\Inflector\Rules\Word; + + $inflector = InflectorFactory::create() + ->withSingularRules( + new Ruleset( + new Transformations( + new Transformation(new Pattern('/^(bil)er$/i'), '\1'), + new Transformation(new Pattern('/^(inflec|contribu)tors$/i'), '\1ta') + ), + new Patterns(new Pattern('singulars')), + new Substitutions(new Substitution(new Word('spins'), new Word('spinor'))) + ) + ) + ->withPluralRules( + new Ruleset( + new Transformations( + new Transformation(new Pattern('^(bil)er$'), '\1'), + new Transformation(new Pattern('^(inflec|contribu)tors$'), '\1ta') + ), + new Patterns(new Pattern('noflect'), new Pattern('abtuse')), + new Substitutions( + new Substitution(new Word('amaze'), new Word('amazable')), + new Substitution(new Word('phone'), new Word('phonezes')) + ) + ) + ) + ->build(); + +No operation inflector +---------------------- + +The ``Doctrine\Inflector\NoopWordInflector`` may be used to configure an inflector that doesn't perform any operation for +pluralization and/or singularization. If will simply return the input as output. + +This is an implementation of the `Null Object design pattern <https://sourcemaking.com/design_patterns/null_object>`_. + +.. code-block:: php + + use Doctrine\Inflector\Inflector; + use Doctrine\Inflector\NoopWordInflector; + + $inflector = new Inflector(new NoopWordInflector(), new NoopWordInflector()); + +Tableize +======== + +Converts ``ModelName`` to ``model_name``: + +.. code-block:: php + + echo $inflector->tableize('ModelName'); // model_name + +Classify +======== + +Converts ``model_name`` to ``ModelName``: + +.. code-block:: php + + echo $inflector->classify('model_name'); // ModelName + +Camelize +======== + +This method uses `Classify`_ and then converts the first character to lowercase: + +.. code-block:: php + + echo $inflector->camelize('model_name'); // modelName + +Capitalize +========== + +Takes a string and capitalizes all of the words, like PHP's built-in +``ucwords`` function. This extends that behavior, however, by allowing the +word delimiters to be configured, rather than only separating on +whitespace. + +Here is an example: + +.. code-block:: php + + $string = 'top-o-the-morning to all_of_you!'; + + echo $inflector->capitalize($string); // Top-O-The-Morning To All_of_you! + + echo $inflector->capitalize($string, '-_ '); // Top-O-The-Morning To All_Of_You! + +Pluralize +========= + +Returns a word in plural form. + +.. code-block:: php + + echo $inflector->pluralize('browser'); // browsers + +Singularize +=========== + +Returns a word in singular form. + +.. code-block:: php + + echo $inflector->singularize('browsers'); // browser + +Urlize +====== + +Generate a URL friendly string from a string of text: + +.. code-block:: php + + echo $inflector->urlize('My first blog post'); // my-first-blog-post + +Unaccent +======== + +You can unaccent a string of text using the ``unaccent()`` method: + +.. code-block:: php + + echo $inflector->unaccent('año'); // ano + +Legacy API +========== + +The API present in Inflector 1.x is still available, but will be deprecated in a future release and dropped for 3.0. +Support for languages other than English is available in the 2.0 API only. + +Acknowledgements +================ + +The language rules in this library have been adapted from several different sources, including but not limited to: + +- `Ruby On Rails Inflector <http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html>`_ +- `ICanBoogie Inflector <https://github.com/ICanBoogie/Inflector>`_ +- `CakePHP Inflector <https://book.cakephp.org/3.0/en/core-libraries/inflector.html>`_ diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php new file mode 100644 index 0000000..2d52908 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/CachedWordInflector.php @@ -0,0 +1,24 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector; + +class CachedWordInflector implements WordInflector +{ + /** @var WordInflector */ + private $wordInflector; + + /** @var string[] */ + private $cache = []; + + public function __construct(WordInflector $wordInflector) + { + $this->wordInflector = $wordInflector; + } + + public function inflect(string $word): string + { + return $this->cache[$word] ?? $this->cache[$word] = $this->wordInflector->inflect($word); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php new file mode 100644 index 0000000..166061d --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/GenericLanguageInflectorFactory.php @@ -0,0 +1,66 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector; + +use Doctrine\Inflector\Rules\Ruleset; + +use function array_unshift; + +abstract class GenericLanguageInflectorFactory implements LanguageInflectorFactory +{ + /** @var Ruleset[] */ + private $singularRulesets = []; + + /** @var Ruleset[] */ + private $pluralRulesets = []; + + final public function __construct() + { + $this->singularRulesets[] = $this->getSingularRuleset(); + $this->pluralRulesets[] = $this->getPluralRuleset(); + } + + final public function build(): Inflector + { + return new Inflector( + new CachedWordInflector(new RulesetInflector( + ...$this->singularRulesets + )), + new CachedWordInflector(new RulesetInflector( + ...$this->pluralRulesets + )) + ); + } + + final public function withSingularRules(?Ruleset $singularRules, bool $reset = false): LanguageInflectorFactory + { + if ($reset) { + $this->singularRulesets = []; + } + + if ($singularRules instanceof Ruleset) { + array_unshift($this->singularRulesets, $singularRules); + } + + return $this; + } + + final public function withPluralRules(?Ruleset $pluralRules, bool $reset = false): LanguageInflectorFactory + { + if ($reset) { + $this->pluralRulesets = []; + } + + if ($pluralRules instanceof Ruleset) { + array_unshift($this->pluralRulesets, $pluralRules); + } + + return $this; + } + + abstract protected function getSingularRuleset(): Ruleset; + + abstract protected function getPluralRuleset(): Ruleset; +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php new file mode 100644 index 0000000..610a4cf --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Inflector.php @@ -0,0 +1,507 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector; + +use RuntimeException; + +use function chr; +use function function_exists; +use function lcfirst; +use function mb_strtolower; +use function ord; +use function preg_match; +use function preg_replace; +use function sprintf; +use function str_replace; +use function strlen; +use function strtolower; +use function strtr; +use function trim; +use function ucwords; + +class Inflector +{ + private const ACCENTED_CHARACTERS = [ + 'À' => 'A', + 'Á' => 'A', + 'Â' => 'A', + 'Ã' => 'A', + 'Ä' => 'Ae', + 'Æ' => 'Ae', + 'Å' => 'Aa', + 'æ' => 'a', + 'Ç' => 'C', + 'È' => 'E', + 'É' => 'E', + 'Ê' => 'E', + 'Ë' => 'E', + 'Ì' => 'I', + 'Í' => 'I', + 'Î' => 'I', + 'Ï' => 'I', + 'Ñ' => 'N', + 'Ò' => 'O', + 'Ó' => 'O', + 'Ô' => 'O', + 'Õ' => 'O', + 'Ö' => 'Oe', + 'Ù' => 'U', + 'Ú' => 'U', + 'Û' => 'U', + 'Ü' => 'Ue', + 'Ý' => 'Y', + 'ß' => 'ss', + 'à' => 'a', + 'á' => 'a', + 'â' => 'a', + 'ã' => 'a', + 'ä' => 'ae', + 'å' => 'aa', + 'ç' => 'c', + 'è' => 'e', + 'é' => 'e', + 'ê' => 'e', + 'ë' => 'e', + 'ì' => 'i', + 'í' => 'i', + 'î' => 'i', + 'ï' => 'i', + 'ñ' => 'n', + 'ò' => 'o', + 'ó' => 'o', + 'ô' => 'o', + 'õ' => 'o', + 'ö' => 'oe', + 'ù' => 'u', + 'ú' => 'u', + 'û' => 'u', + 'ü' => 'ue', + 'ý' => 'y', + 'ÿ' => 'y', + 'Ā' => 'A', + 'ā' => 'a', + 'Ă' => 'A', + 'ă' => 'a', + 'Ą' => 'A', + 'ą' => 'a', + 'Ć' => 'C', + 'ć' => 'c', + 'Ĉ' => 'C', + 'ĉ' => 'c', + 'Ċ' => 'C', + 'ċ' => 'c', + 'Č' => 'C', + 'č' => 'c', + 'Ď' => 'D', + 'ď' => 'd', + 'Đ' => 'D', + 'đ' => 'd', + 'Ē' => 'E', + 'ē' => 'e', + 'Ĕ' => 'E', + 'ĕ' => 'e', + 'Ė' => 'E', + 'ė' => 'e', + 'Ę' => 'E', + 'ę' => 'e', + 'Ě' => 'E', + 'ě' => 'e', + 'Ĝ' => 'G', + 'ĝ' => 'g', + 'Ğ' => 'G', + 'ğ' => 'g', + 'Ġ' => 'G', + 'ġ' => 'g', + 'Ģ' => 'G', + 'ģ' => 'g', + 'Ĥ' => 'H', + 'ĥ' => 'h', + 'Ħ' => 'H', + 'ħ' => 'h', + 'Ĩ' => 'I', + 'ĩ' => 'i', + 'Ī' => 'I', + 'ī' => 'i', + 'Ĭ' => 'I', + 'ĭ' => 'i', + 'Į' => 'I', + 'į' => 'i', + 'İ' => 'I', + 'ı' => 'i', + 'IJ' => 'IJ', + 'ij' => 'ij', + 'Ĵ' => 'J', + 'ĵ' => 'j', + 'Ķ' => 'K', + 'ķ' => 'k', + 'ĸ' => 'k', + 'Ĺ' => 'L', + 'ĺ' => 'l', + 'Ļ' => 'L', + 'ļ' => 'l', + 'Ľ' => 'L', + 'ľ' => 'l', + 'Ŀ' => 'L', + 'ŀ' => 'l', + 'Ł' => 'L', + 'ł' => 'l', + 'Ń' => 'N', + 'ń' => 'n', + 'Ņ' => 'N', + 'ņ' => 'n', + 'Ň' => 'N', + 'ň' => 'n', + 'ʼn' => 'N', + 'Ŋ' => 'n', + 'ŋ' => 'N', + 'Ō' => 'O', + 'ō' => 'o', + 'Ŏ' => 'O', + 'ŏ' => 'o', + 'Ő' => 'O', + 'ő' => 'o', + 'Œ' => 'OE', + 'œ' => 'oe', + 'Ø' => 'O', + 'ø' => 'o', + 'Ŕ' => 'R', + 'ŕ' => 'r', + 'Ŗ' => 'R', + 'ŗ' => 'r', + 'Ř' => 'R', + 'ř' => 'r', + 'Ś' => 'S', + 'ś' => 's', + 'Ŝ' => 'S', + 'ŝ' => 's', + 'Ş' => 'S', + 'ş' => 's', + 'Š' => 'S', + 'š' => 's', + 'Ţ' => 'T', + 'ţ' => 't', + 'Ť' => 'T', + 'ť' => 't', + 'Ŧ' => 'T', + 'ŧ' => 't', + 'Ũ' => 'U', + 'ũ' => 'u', + 'Ū' => 'U', + 'ū' => 'u', + 'Ŭ' => 'U', + 'ŭ' => 'u', + 'Ů' => 'U', + 'ů' => 'u', + 'Ű' => 'U', + 'ű' => 'u', + 'Ų' => 'U', + 'ų' => 'u', + 'Ŵ' => 'W', + 'ŵ' => 'w', + 'Ŷ' => 'Y', + 'ŷ' => 'y', + 'Ÿ' => 'Y', + 'Ź' => 'Z', + 'ź' => 'z', + 'Ż' => 'Z', + 'ż' => 'z', + 'Ž' => 'Z', + 'ž' => 'z', + 'ſ' => 's', + '€' => 'E', + '£' => '', + ]; + + /** @var WordInflector */ + private $singularizer; + + /** @var WordInflector */ + private $pluralizer; + + public function __construct(WordInflector $singularizer, WordInflector $pluralizer) + { + $this->singularizer = $singularizer; + $this->pluralizer = $pluralizer; + } + + /** + * Converts a word into the format for a Doctrine table name. Converts 'ModelName' to 'model_name'. + */ + public function tableize(string $word): string + { + $tableized = preg_replace('~(?<=\\w)([A-Z])~u', '_$1', $word); + + if ($tableized === null) { + throw new RuntimeException(sprintf( + 'preg_replace returned null for value "%s"', + $word + )); + } + + return mb_strtolower($tableized); + } + + /** + * Converts a word into the format for a Doctrine class name. Converts 'table_name' to 'TableName'. + */ + public function classify(string $word): string + { + return str_replace([' ', '_', '-'], '', ucwords($word, ' _-')); + } + + /** + * Camelizes a word. This uses the classify() method and turns the first character to lowercase. + */ + public function camelize(string $word): string + { + return lcfirst($this->classify($word)); + } + + /** + * Uppercases words with configurable delimiters between words. + * + * Takes a string and capitalizes all of the words, like PHP's built-in + * ucwords function. This extends that behavior, however, by allowing the + * word delimiters to be configured, rather than only separating on + * whitespace. + * + * Here is an example: + * <code> + * <?php + * $string = 'top-o-the-morning to all_of_you!'; + * echo $inflector->capitalize($string); + * // Top-O-The-Morning To All_of_you! + * + * echo $inflector->capitalize($string, '-_ '); + * // Top-O-The-Morning To All_Of_You! + * ?> + * </code> + * + * @param string $string The string to operate on. + * @param string $delimiters A list of word separators. + * + * @return string The string with all delimiter-separated words capitalized. + */ + public function capitalize(string $string, string $delimiters = " \n\t\r\0\x0B-"): string + { + return ucwords($string, $delimiters); + } + + /** + * Checks if the given string seems like it has utf8 characters in it. + * + * @param string $string The string to check for utf8 characters in. + */ + public function seemsUtf8(string $string): bool + { + for ($i = 0; $i < strlen($string); $i++) { + if (ord($string[$i]) < 0x80) { + continue; // 0bbbbbbb + } + + if ((ord($string[$i]) & 0xE0) === 0xC0) { + $n = 1; // 110bbbbb + } elseif ((ord($string[$i]) & 0xF0) === 0xE0) { + $n = 2; // 1110bbbb + } elseif ((ord($string[$i]) & 0xF8) === 0xF0) { + $n = 3; // 11110bbb + } elseif ((ord($string[$i]) & 0xFC) === 0xF8) { + $n = 4; // 111110bb + } elseif ((ord($string[$i]) & 0xFE) === 0xFC) { + $n = 5; // 1111110b + } else { + return false; // Does not match any model + } + + for ($j = 0; $j < $n; $j++) { // n bytes matching 10bbbbbb follow ? + if (++$i === strlen($string) || ((ord($string[$i]) & 0xC0) !== 0x80)) { + return false; + } + } + } + + return true; + } + + /** + * Remove any illegal characters, accents, etc. + * + * @param string $string String to unaccent + * + * @return string Unaccented string + */ + public function unaccent(string $string): string + { + if (preg_match('/[\x80-\xff]/', $string) === false) { + return $string; + } + + if ($this->seemsUtf8($string)) { + $string = strtr($string, self::ACCENTED_CHARACTERS); + } else { + $characters = []; + + // Assume ISO-8859-1 if not UTF-8 + $characters['in'] = + chr(128) + . chr(131) + . chr(138) + . chr(142) + . chr(154) + . chr(158) + . chr(159) + . chr(162) + . chr(165) + . chr(181) + . chr(192) + . chr(193) + . chr(194) + . chr(195) + . chr(196) + . chr(197) + . chr(199) + . chr(200) + . chr(201) + . chr(202) + . chr(203) + . chr(204) + . chr(205) + . chr(206) + . chr(207) + . chr(209) + . chr(210) + . chr(211) + . chr(212) + . chr(213) + . chr(214) + . chr(216) + . chr(217) + . chr(218) + . chr(219) + . chr(220) + . chr(221) + . chr(224) + . chr(225) + . chr(226) + . chr(227) + . chr(228) + . chr(229) + . chr(231) + . chr(232) + . chr(233) + . chr(234) + . chr(235) + . chr(236) + . chr(237) + . chr(238) + . chr(239) + . chr(241) + . chr(242) + . chr(243) + . chr(244) + . chr(245) + . chr(246) + . chr(248) + . chr(249) + . chr(250) + . chr(251) + . chr(252) + . chr(253) + . chr(255); + + $characters['out'] = 'EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'; + + $string = strtr($string, $characters['in'], $characters['out']); + + $doubleChars = []; + + $doubleChars['in'] = [ + chr(140), + chr(156), + chr(198), + chr(208), + chr(222), + chr(223), + chr(230), + chr(240), + chr(254), + ]; + + $doubleChars['out'] = ['OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th']; + + $string = str_replace($doubleChars['in'], $doubleChars['out'], $string); + } + + return $string; + } + + /** + * Convert any passed string to a url friendly string. + * Converts 'My first blog post' to 'my-first-blog-post' + * + * @param string $string String to urlize. + * + * @return string Urlized string. + */ + public function urlize(string $string): string + { + // Remove all non url friendly characters with the unaccent function + $unaccented = $this->unaccent($string); + + if (function_exists('mb_strtolower')) { + $lowered = mb_strtolower($unaccented); + } else { + $lowered = strtolower($unaccented); + } + + $replacements = [ + '/\W/' => ' ', + '/([A-Z]+)([A-Z][a-z])/' => '\1_\2', + '/([a-z\d])([A-Z])/' => '\1_\2', + '/[^A-Z^a-z^0-9^\/]+/' => '-', + ]; + + $urlized = $lowered; + + foreach ($replacements as $pattern => $replacement) { + $replaced = preg_replace($pattern, $replacement, $urlized); + + if ($replaced === null) { + throw new RuntimeException(sprintf( + 'preg_replace returned null for value "%s"', + $urlized + )); + } + + $urlized = $replaced; + } + + return trim($urlized, '-'); + } + + /** + * Returns a word in singular form. + * + * @param string $word The word in plural form. + * + * @return string The word in singular form. + */ + public function singularize(string $word): string + { + return $this->singularizer->inflect($word); + } + + /** + * Returns a word in plural form. + * + * @param string $word The word in singular form. + * + * @return string The word in plural form. + */ + public function pluralize(string $word): string + { + return $this->pluralizer->inflect($word); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php new file mode 100644 index 0000000..a0740a7 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/InflectorFactory.php @@ -0,0 +1,52 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector; + +use Doctrine\Inflector\Rules\English; +use Doctrine\Inflector\Rules\French; +use Doctrine\Inflector\Rules\NorwegianBokmal; +use Doctrine\Inflector\Rules\Portuguese; +use Doctrine\Inflector\Rules\Spanish; +use Doctrine\Inflector\Rules\Turkish; +use InvalidArgumentException; + +use function sprintf; + +final class InflectorFactory +{ + public static function create(): LanguageInflectorFactory + { + return self::createForLanguage(Language::ENGLISH); + } + + public static function createForLanguage(string $language): LanguageInflectorFactory + { + switch ($language) { + case Language::ENGLISH: + return new English\InflectorFactory(); + + case Language::FRENCH: + return new French\InflectorFactory(); + + case Language::NORWEGIAN_BOKMAL: + return new NorwegianBokmal\InflectorFactory(); + + case Language::PORTUGUESE: + return new Portuguese\InflectorFactory(); + + case Language::SPANISH: + return new Spanish\InflectorFactory(); + + case Language::TURKISH: + return new Turkish\InflectorFactory(); + + default: + throw new InvalidArgumentException(sprintf( + 'Language "%s" is not supported.', + $language + )); + } + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Language.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Language.php new file mode 100644 index 0000000..78c3cc7 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Language.php @@ -0,0 +1,19 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector; + +final class Language +{ + public const ENGLISH = 'english'; + public const FRENCH = 'french'; + public const NORWEGIAN_BOKMAL = 'norwegian-bokmal'; + public const PORTUGUESE = 'portuguese'; + public const SPANISH = 'spanish'; + public const TURKISH = 'turkish'; + + private function __construct() + { + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php new file mode 100644 index 0000000..a58f43c --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/LanguageInflectorFactory.php @@ -0,0 +1,33 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector; + +use Doctrine\Inflector\Rules\Ruleset; + +interface LanguageInflectorFactory +{ + /** + * Applies custom rules for singularisation + * + * @param bool $reset If true, will unset default inflections for all new rules + * + * @return $this + */ + public function withSingularRules(?Ruleset $singularRules, bool $reset = false): self; + + /** + * Applies custom rules for pluralisation + * + * @param bool $reset If true, will unset default inflections for all new rules + * + * @return $this + */ + public function withPluralRules(?Ruleset $pluralRules, bool $reset = false): self; + + /** + * Builds the inflector instance with all applicable rules + */ + public function build(): Inflector; +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php new file mode 100644 index 0000000..2fdf535 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/NoopWordInflector.php @@ -0,0 +1,13 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector; + +class NoopWordInflector implements WordInflector +{ + public function inflect(string $word): string + { + return $word; + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php new file mode 100644 index 0000000..8f0919f --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Inflectible.php @@ -0,0 +1,182 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\English; + +use Doctrine\Inflector\Rules\Pattern; +use Doctrine\Inflector\Rules\Substitution; +use Doctrine\Inflector\Rules\Transformation; +use Doctrine\Inflector\Rules\Word; + +class Inflectible +{ + /** + * @return Transformation[] + */ + public static function getSingular(): iterable + { + yield new Transformation(new Pattern('(s)tatuses$'), '\1\2tatus'); + yield new Transformation(new Pattern('(s)tatus$'), '\1\2tatus'); + yield new Transformation(new Pattern('(c)ampus$'), '\1\2ampus'); + yield new Transformation(new Pattern('^(.*)(menu)s$'), '\1\2'); + yield new Transformation(new Pattern('(quiz)zes$'), '\\1'); + yield new Transformation(new Pattern('(matr)ices$'), '\1ix'); + yield new Transformation(new Pattern('(vert|ind)ices$'), '\1ex'); + yield new Transformation(new Pattern('^(ox)en'), '\1'); + yield new Transformation(new Pattern('(alias)(es)*$'), '\1'); + yield new Transformation(new Pattern('(buffal|her|potat|tomat|volcan)oes$'), '\1o'); + yield new Transformation(new Pattern('(alumn|bacill|cact|foc|fung|nucle|radi|stimul|syllab|termin|viri?)i$'), '\1us'); + yield new Transformation(new Pattern('([ftw]ax)es'), '\1'); + yield new Transformation(new Pattern('(analys|ax|cris|test|thes)es$'), '\1is'); + yield new Transformation(new Pattern('(shoe|slave)s$'), '\1'); + yield new Transformation(new Pattern('(o)es$'), '\1'); + yield new Transformation(new Pattern('ouses$'), 'ouse'); + yield new Transformation(new Pattern('([^a])uses$'), '\1us'); + yield new Transformation(new Pattern('([m|l])ice$'), '\1ouse'); + yield new Transformation(new Pattern('(x|ch|ss|sh)es$'), '\1'); + yield new Transformation(new Pattern('(m)ovies$'), '\1\2ovie'); + yield new Transformation(new Pattern('(s)eries$'), '\1\2eries'); + yield new Transformation(new Pattern('([^aeiouy]|qu)ies$'), '\1y'); + yield new Transformation(new Pattern('([lr])ves$'), '\1f'); + yield new Transformation(new Pattern('(tive)s$'), '\1'); + yield new Transformation(new Pattern('(hive)s$'), '\1'); + yield new Transformation(new Pattern('(drive)s$'), '\1'); + yield new Transformation(new Pattern('(dive)s$'), '\1'); + yield new Transformation(new Pattern('(olive)s$'), '\1'); + yield new Transformation(new Pattern('([^fo])ves$'), '\1fe'); + yield new Transformation(new Pattern('(^analy)ses$'), '\1sis'); + yield new Transformation(new Pattern('(analy|diagno|^ba|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$'), '\1\2sis'); + yield new Transformation(new Pattern('(tax)a$'), '\1on'); + yield new Transformation(new Pattern('(c)riteria$'), '\1riterion'); + yield new Transformation(new Pattern('([ti])a$'), '\1um'); + yield new Transformation(new Pattern('(p)eople$'), '\1\2erson'); + yield new Transformation(new Pattern('(m)en$'), '\1an'); + yield new Transformation(new Pattern('(c)hildren$'), '\1\2hild'); + yield new Transformation(new Pattern('(f)eet$'), '\1oot'); + yield new Transformation(new Pattern('(n)ews$'), '\1\2ews'); + yield new Transformation(new Pattern('eaus$'), 'eau'); + yield new Transformation(new Pattern('s$'), ''); + } + + /** + * @return Transformation[] + */ + public static function getPlural(): iterable + { + yield new Transformation(new Pattern('(s)tatus$'), '\1\2tatuses'); + yield new Transformation(new Pattern('(quiz)$'), '\1zes'); + yield new Transformation(new Pattern('^(ox)$'), '\1\2en'); + yield new Transformation(new Pattern('([m|l])ouse$'), '\1ice'); + yield new Transformation(new Pattern('(matr|vert|ind)(ix|ex)$'), '\1ices'); + yield new Transformation(new Pattern('(x|ch|ss|sh)$'), '\1es'); + yield new Transformation(new Pattern('([^aeiouy]|qu)y$'), '\1ies'); + yield new Transformation(new Pattern('(hive|gulf)$'), '\1s'); + yield new Transformation(new Pattern('(?:([^f])fe|([lr])f)$'), '\1\2ves'); + yield new Transformation(new Pattern('sis$'), 'ses'); + yield new Transformation(new Pattern('([ti])um$'), '\1a'); + yield new Transformation(new Pattern('(tax)on$'), '\1a'); + yield new Transformation(new Pattern('(c)riterion$'), '\1riteria'); + yield new Transformation(new Pattern('(p)erson$'), '\1eople'); + yield new Transformation(new Pattern('(m)an$'), '\1en'); + yield new Transformation(new Pattern('(c)hild$'), '\1hildren'); + yield new Transformation(new Pattern('(f)oot$'), '\1eet'); + yield new Transformation(new Pattern('(buffal|her|potat|tomat|volcan)o$'), '\1\2oes'); + yield new Transformation(new Pattern('(alumn|bacill|cact|foc|fung|nucle|radi|stimul|syllab|termin|vir)us$'), '\1i'); + yield new Transformation(new Pattern('us$'), 'uses'); + yield new Transformation(new Pattern('(alias)$'), '\1es'); + yield new Transformation(new Pattern('(analys|ax|cris|test|thes)is$'), '\1es'); + yield new Transformation(new Pattern('s$'), 's'); + yield new Transformation(new Pattern('^$'), ''); + yield new Transformation(new Pattern('$'), 's'); + } + + /** + * @return Substitution[] + */ + public static function getIrregular(): iterable + { + yield new Substitution(new Word('atlas'), new Word('atlases')); + yield new Substitution(new Word('axe'), new Word('axes')); + yield new Substitution(new Word('beef'), new Word('beefs')); + yield new Substitution(new Word('brother'), new Word('brothers')); + yield new Substitution(new Word('cafe'), new Word('cafes')); + yield new Substitution(new Word('chateau'), new Word('chateaux')); + yield new Substitution(new Word('niveau'), new Word('niveaux')); + yield new Substitution(new Word('child'), new Word('children')); + yield new Substitution(new Word('canvas'), new Word('canvases')); + yield new Substitution(new Word('cookie'), new Word('cookies')); + yield new Substitution(new Word('corpus'), new Word('corpuses')); + yield new Substitution(new Word('cow'), new Word('cows')); + yield new Substitution(new Word('criterion'), new Word('criteria')); + yield new Substitution(new Word('curriculum'), new Word('curricula')); + yield new Substitution(new Word('demo'), new Word('demos')); + yield new Substitution(new Word('domino'), new Word('dominoes')); + yield new Substitution(new Word('echo'), new Word('echoes')); + yield new Substitution(new Word('foot'), new Word('feet')); + yield new Substitution(new Word('fungus'), new Word('fungi')); + yield new Substitution(new Word('ganglion'), new Word('ganglions')); + yield new Substitution(new Word('gas'), new Word('gases')); + yield new Substitution(new Word('genie'), new Word('genies')); + yield new Substitution(new Word('genus'), new Word('genera')); + yield new Substitution(new Word('goose'), new Word('geese')); + yield new Substitution(new Word('graffito'), new Word('graffiti')); + yield new Substitution(new Word('hippopotamus'), new Word('hippopotami')); + yield new Substitution(new Word('hoof'), new Word('hoofs')); + yield new Substitution(new Word('human'), new Word('humans')); + yield new Substitution(new Word('iris'), new Word('irises')); + yield new Substitution(new Word('larva'), new Word('larvae')); + yield new Substitution(new Word('leaf'), new Word('leaves')); + yield new Substitution(new Word('lens'), new Word('lenses')); + yield new Substitution(new Word('loaf'), new Word('loaves')); + yield new Substitution(new Word('man'), new Word('men')); + yield new Substitution(new Word('medium'), new Word('media')); + yield new Substitution(new Word('memorandum'), new Word('memoranda')); + yield new Substitution(new Word('money'), new Word('monies')); + yield new Substitution(new Word('mongoose'), new Word('mongooses')); + yield new Substitution(new Word('motto'), new Word('mottoes')); + yield new Substitution(new Word('move'), new Word('moves')); + yield new Substitution(new Word('mythos'), new Word('mythoi')); + yield new Substitution(new Word('niche'), new Word('niches')); + yield new Substitution(new Word('nucleus'), new Word('nuclei')); + yield new Substitution(new Word('numen'), new Word('numina')); + yield new Substitution(new Word('occiput'), new Word('occiputs')); + yield new Substitution(new Word('octopus'), new Word('octopuses')); + yield new Substitution(new Word('opus'), new Word('opuses')); + yield new Substitution(new Word('ox'), new Word('oxen')); + yield new Substitution(new Word('passerby'), new Word('passersby')); + yield new Substitution(new Word('penis'), new Word('penises')); + yield new Substitution(new Word('person'), new Word('people')); + yield new Substitution(new Word('plateau'), new Word('plateaux')); + yield new Substitution(new Word('runner-up'), new Word('runners-up')); + yield new Substitution(new Word('safe'), new Word('safes')); + yield new Substitution(new Word('sex'), new Word('sexes')); + yield new Substitution(new Word('soliloquy'), new Word('soliloquies')); + yield new Substitution(new Word('son-in-law'), new Word('sons-in-law')); + yield new Substitution(new Word('syllabus'), new Word('syllabi')); + yield new Substitution(new Word('testis'), new Word('testes')); + yield new Substitution(new Word('thief'), new Word('thieves')); + yield new Substitution(new Word('tooth'), new Word('teeth')); + yield new Substitution(new Word('tornado'), new Word('tornadoes')); + yield new Substitution(new Word('trilby'), new Word('trilbys')); + yield new Substitution(new Word('turf'), new Word('turfs')); + yield new Substitution(new Word('valve'), new Word('valves')); + yield new Substitution(new Word('volcano'), new Word('volcanoes')); + yield new Substitution(new Word('abuse'), new Word('abuses')); + yield new Substitution(new Word('avalanche'), new Word('avalanches')); + yield new Substitution(new Word('cache'), new Word('caches')); + yield new Substitution(new Word('criterion'), new Word('criteria')); + yield new Substitution(new Word('curve'), new Word('curves')); + yield new Substitution(new Word('emphasis'), new Word('emphases')); + yield new Substitution(new Word('foe'), new Word('foes')); + yield new Substitution(new Word('grave'), new Word('graves')); + yield new Substitution(new Word('hoax'), new Word('hoaxes')); + yield new Substitution(new Word('medium'), new Word('media')); + yield new Substitution(new Word('neurosis'), new Word('neuroses')); + yield new Substitution(new Word('save'), new Word('saves')); + yield new Substitution(new Word('wave'), new Word('waves')); + yield new Substitution(new Word('oasis'), new Word('oases')); + yield new Substitution(new Word('valve'), new Word('valves')); + yield new Substitution(new Word('zombie'), new Word('zombies')); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php new file mode 100644 index 0000000..85f92aa --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/InflectorFactory.php @@ -0,0 +1,21 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\English; + +use Doctrine\Inflector\GenericLanguageInflectorFactory; +use Doctrine\Inflector\Rules\Ruleset; + +final class InflectorFactory extends GenericLanguageInflectorFactory +{ + protected function getSingularRuleset(): Ruleset + { + return Rules::getSingularRuleset(); + } + + protected function getPluralRuleset(): Ruleset + { + return Rules::getPluralRuleset(); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php new file mode 100644 index 0000000..7ccc103 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Rules.php @@ -0,0 +1,31 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\English; + +use Doctrine\Inflector\Rules\Patterns; +use Doctrine\Inflector\Rules\Ruleset; +use Doctrine\Inflector\Rules\Substitutions; +use Doctrine\Inflector\Rules\Transformations; + +final class Rules +{ + public static function getSingularRuleset(): Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getSingular()), + new Patterns(...Uninflected::getSingular()), + (new Substitutions(...Inflectible::getIrregular()))->getFlippedSubstitutions() + ); + } + + public static function getPluralRuleset(): Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getPlural()), + new Patterns(...Uninflected::getPlural()), + new Substitutions(...Inflectible::getIrregular()) + ); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php new file mode 100644 index 0000000..e2656cc --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/English/Uninflected.php @@ -0,0 +1,193 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\English; + +use Doctrine\Inflector\Rules\Pattern; + +final class Uninflected +{ + /** + * @return Pattern[] + */ + public static function getSingular(): iterable + { + yield from self::getDefault(); + + yield new Pattern('.*ss'); + yield new Pattern('clothes'); + yield new Pattern('data'); + yield new Pattern('fascia'); + yield new Pattern('fuchsia'); + yield new Pattern('galleria'); + yield new Pattern('mafia'); + yield new Pattern('militia'); + yield new Pattern('pants'); + yield new Pattern('petunia'); + yield new Pattern('sepia'); + yield new Pattern('trivia'); + yield new Pattern('utopia'); + } + + /** + * @return Pattern[] + */ + public static function getPlural(): iterable + { + yield from self::getDefault(); + + yield new Pattern('people'); + yield new Pattern('trivia'); + yield new Pattern('\w+ware$'); + yield new Pattern('media'); + } + + /** + * @return Pattern[] + */ + private static function getDefault(): iterable + { + yield new Pattern('\w+media'); + yield new Pattern('advice'); + yield new Pattern('aircraft'); + yield new Pattern('amoyese'); + yield new Pattern('art'); + yield new Pattern('audio'); + yield new Pattern('baggage'); + yield new Pattern('bison'); + yield new Pattern('borghese'); + yield new Pattern('bream'); + yield new Pattern('breeches'); + yield new Pattern('britches'); + yield new Pattern('buffalo'); + yield new Pattern('butter'); + yield new Pattern('cantus'); + yield new Pattern('carp'); + yield new Pattern('chassis'); + yield new Pattern('clippers'); + yield new Pattern('clothing'); + yield new Pattern('coal'); + yield new Pattern('cod'); + yield new Pattern('coitus'); + yield new Pattern('compensation'); + yield new Pattern('congoese'); + yield new Pattern('contretemps'); + yield new Pattern('coreopsis'); + yield new Pattern('corps'); + yield new Pattern('cotton'); + yield new Pattern('data'); + yield new Pattern('debris'); + yield new Pattern('deer'); + yield new Pattern('diabetes'); + yield new Pattern('djinn'); + yield new Pattern('education'); + yield new Pattern('eland'); + yield new Pattern('elk'); + yield new Pattern('emoji'); + yield new Pattern('equipment'); + yield new Pattern('evidence'); + yield new Pattern('faroese'); + yield new Pattern('feedback'); + yield new Pattern('fish'); + yield new Pattern('flounder'); + yield new Pattern('flour'); + yield new Pattern('foochowese'); + yield new Pattern('food'); + yield new Pattern('furniture'); + yield new Pattern('gallows'); + yield new Pattern('genevese'); + yield new Pattern('genoese'); + yield new Pattern('gilbertese'); + yield new Pattern('gold'); + yield new Pattern('headquarters'); + yield new Pattern('herpes'); + yield new Pattern('hijinks'); + yield new Pattern('homework'); + yield new Pattern('hottentotese'); + yield new Pattern('impatience'); + yield new Pattern('information'); + yield new Pattern('innings'); + yield new Pattern('jackanapes'); + yield new Pattern('jeans'); + yield new Pattern('jedi'); + yield new Pattern('kiplingese'); + yield new Pattern('knowledge'); + yield new Pattern('kongoese'); + yield new Pattern('leather'); + yield new Pattern('love'); + yield new Pattern('lucchese'); + yield new Pattern('luggage'); + yield new Pattern('mackerel'); + yield new Pattern('Maltese'); + yield new Pattern('management'); + yield new Pattern('metadata'); + yield new Pattern('mews'); + yield new Pattern('money'); + yield new Pattern('moose'); + yield new Pattern('mumps'); + yield new Pattern('music'); + yield new Pattern('nankingese'); + yield new Pattern('news'); + yield new Pattern('nexus'); + yield new Pattern('niasese'); + yield new Pattern('nutrition'); + yield new Pattern('offspring'); + yield new Pattern('oil'); + yield new Pattern('patience'); + yield new Pattern('pekingese'); + yield new Pattern('piedmontese'); + yield new Pattern('pincers'); + yield new Pattern('pistoiese'); + yield new Pattern('plankton'); + yield new Pattern('pliers'); + yield new Pattern('pokemon'); + yield new Pattern('police'); + yield new Pattern('polish'); + yield new Pattern('portuguese'); + yield new Pattern('proceedings'); + yield new Pattern('progress'); + yield new Pattern('rabies'); + yield new Pattern('rain'); + yield new Pattern('research'); + yield new Pattern('rhinoceros'); + yield new Pattern('rice'); + yield new Pattern('salmon'); + yield new Pattern('sand'); + yield new Pattern('sarawakese'); + yield new Pattern('scissors'); + yield new Pattern('sea[- ]bass'); + yield new Pattern('series'); + yield new Pattern('shavese'); + yield new Pattern('shears'); + yield new Pattern('sheep'); + yield new Pattern('siemens'); + yield new Pattern('silk'); + yield new Pattern('sms'); + yield new Pattern('soap'); + yield new Pattern('social media'); + yield new Pattern('spam'); + yield new Pattern('species'); + yield new Pattern('staff'); + yield new Pattern('sugar'); + yield new Pattern('swine'); + yield new Pattern('talent'); + yield new Pattern('toothpaste'); + yield new Pattern('traffic'); + yield new Pattern('travel'); + yield new Pattern('trousers'); + yield new Pattern('trout'); + yield new Pattern('tuna'); + yield new Pattern('us'); + yield new Pattern('vermontese'); + yield new Pattern('vinegar'); + yield new Pattern('weather'); + yield new Pattern('wenchowese'); + yield new Pattern('wheat'); + yield new Pattern('whiting'); + yield new Pattern('wildebeest'); + yield new Pattern('wood'); + yield new Pattern('wool'); + yield new Pattern('yengeese'); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php new file mode 100644 index 0000000..c8f1f8f --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Inflectible.php @@ -0,0 +1,50 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\French; + +use Doctrine\Inflector\Rules\Pattern; +use Doctrine\Inflector\Rules\Substitution; +use Doctrine\Inflector\Rules\Transformation; +use Doctrine\Inflector\Rules\Word; + +class Inflectible +{ + /** + * @return Transformation[] + */ + public static function getSingular(): iterable + { + yield new Transformation(new Pattern('/(b|cor|ém|gemm|soupir|trav|vant|vitr)aux$/'), '\1ail'); + yield new Transformation(new Pattern('/ails$/'), 'ail'); + yield new Transformation(new Pattern('/(journ|chev)aux$/'), '\1al'); + yield new Transformation(new Pattern('/(bijou|caillou|chou|genou|hibou|joujou|pou|au|eu|eau)x$/'), '\1'); + yield new Transformation(new Pattern('/s$/'), ''); + } + + /** + * @return Transformation[] + */ + public static function getPlural(): iterable + { + yield new Transformation(new Pattern('/(s|x|z)$/'), '\1'); + yield new Transformation(new Pattern('/(b|cor|ém|gemm|soupir|trav|vant|vitr)ail$/'), '\1aux'); + yield new Transformation(new Pattern('/ail$/'), 'ails'); + yield new Transformation(new Pattern('/(chacal|carnaval|festival|récital)$/'), '\1s'); + yield new Transformation(new Pattern('/al$/'), 'aux'); + yield new Transformation(new Pattern('/(bleu|émeu|landau|pneu|sarrau)$/'), '\1s'); + yield new Transformation(new Pattern('/(bijou|caillou|chou|genou|hibou|joujou|lieu|pou|au|eu|eau)$/'), '\1x'); + yield new Transformation(new Pattern('/$/'), 's'); + } + + /** + * @return Substitution[] + */ + public static function getIrregular(): iterable + { + yield new Substitution(new Word('monsieur'), new Word('messieurs')); + yield new Substitution(new Word('madame'), new Word('mesdames')); + yield new Substitution(new Word('mademoiselle'), new Word('mesdemoiselles')); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php new file mode 100644 index 0000000..62e31f0 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/InflectorFactory.php @@ -0,0 +1,21 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\French; + +use Doctrine\Inflector\GenericLanguageInflectorFactory; +use Doctrine\Inflector\Rules\Ruleset; + +final class InflectorFactory extends GenericLanguageInflectorFactory +{ + protected function getSingularRuleset(): Ruleset + { + return Rules::getSingularRuleset(); + } + + protected function getPluralRuleset(): Ruleset + { + return Rules::getPluralRuleset(); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php new file mode 100644 index 0000000..6cd45bc --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Rules.php @@ -0,0 +1,31 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\French; + +use Doctrine\Inflector\Rules\Patterns; +use Doctrine\Inflector\Rules\Ruleset; +use Doctrine\Inflector\Rules\Substitutions; +use Doctrine\Inflector\Rules\Transformations; + +final class Rules +{ + public static function getSingularRuleset(): Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getSingular()), + new Patterns(...Uninflected::getSingular()), + (new Substitutions(...Inflectible::getIrregular()))->getFlippedSubstitutions() + ); + } + + public static function getPluralRuleset(): Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getPlural()), + new Patterns(...Uninflected::getPlural()), + new Substitutions(...Inflectible::getIrregular()) + ); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php new file mode 100644 index 0000000..3cf2444 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/French/Uninflected.php @@ -0,0 +1,34 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\French; + +use Doctrine\Inflector\Rules\Pattern; + +final class Uninflected +{ + /** + * @return Pattern[] + */ + public static function getSingular(): iterable + { + yield from self::getDefault(); + } + + /** + * @return Pattern[] + */ + public static function getPlural(): iterable + { + yield from self::getDefault(); + } + + /** + * @return Pattern[] + */ + private static function getDefault(): iterable + { + yield new Pattern(''); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php new file mode 100644 index 0000000..c00317d --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Inflectible.php @@ -0,0 +1,40 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\NorwegianBokmal; + +use Doctrine\Inflector\Rules\Pattern; +use Doctrine\Inflector\Rules\Substitution; +use Doctrine\Inflector\Rules\Transformation; +use Doctrine\Inflector\Rules\Word; + +class Inflectible +{ + /** + * @return Transformation[] + */ + public static function getSingular(): iterable + { + yield new Transformation(new Pattern('/re$/i'), 'r'); + yield new Transformation(new Pattern('/er$/i'), ''); + } + + /** + * @return Transformation[] + */ + public static function getPlural(): iterable + { + yield new Transformation(new Pattern('/e$/i'), 'er'); + yield new Transformation(new Pattern('/r$/i'), 're'); + yield new Transformation(new Pattern('/$/'), 'er'); + } + + /** + * @return Substitution[] + */ + public static function getIrregular(): iterable + { + yield new Substitution(new Word('konto'), new Word('konti')); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php new file mode 100644 index 0000000..912ae41 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/InflectorFactory.php @@ -0,0 +1,21 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\NorwegianBokmal; + +use Doctrine\Inflector\GenericLanguageInflectorFactory; +use Doctrine\Inflector\Rules\Ruleset; + +final class InflectorFactory extends GenericLanguageInflectorFactory +{ + protected function getSingularRuleset(): Ruleset + { + return Rules::getSingularRuleset(); + } + + protected function getPluralRuleset(): Ruleset + { + return Rules::getPluralRuleset(); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php new file mode 100644 index 0000000..9902d35 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Rules.php @@ -0,0 +1,31 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\NorwegianBokmal; + +use Doctrine\Inflector\Rules\Patterns; +use Doctrine\Inflector\Rules\Ruleset; +use Doctrine\Inflector\Rules\Substitutions; +use Doctrine\Inflector\Rules\Transformations; + +final class Rules +{ + public static function getSingularRuleset(): Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getSingular()), + new Patterns(...Uninflected::getSingular()), + (new Substitutions(...Inflectible::getIrregular()))->getFlippedSubstitutions() + ); + } + + public static function getPluralRuleset(): Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getPlural()), + new Patterns(...Uninflected::getPlural()), + new Substitutions(...Inflectible::getIrregular()) + ); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php new file mode 100644 index 0000000..5d878c6 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/NorwegianBokmal/Uninflected.php @@ -0,0 +1,36 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\NorwegianBokmal; + +use Doctrine\Inflector\Rules\Pattern; + +final class Uninflected +{ + /** + * @return Pattern[] + */ + public static function getSingular(): iterable + { + yield from self::getDefault(); + } + + /** + * @return Pattern[] + */ + public static function getPlural(): iterable + { + yield from self::getDefault(); + } + + /** + * @return Pattern[] + */ + private static function getDefault(): iterable + { + yield new Pattern('barn'); + yield new Pattern('fjell'); + yield new Pattern('hus'); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php new file mode 100644 index 0000000..a5f0ef7 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Pattern.php @@ -0,0 +1,42 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules; + +use function preg_match; + +final class Pattern +{ + /** @var string */ + private $pattern; + + /** @var string */ + private $regex; + + public function __construct(string $pattern) + { + $this->pattern = $pattern; + + if (isset($this->pattern[0]) && $this->pattern[0] === '/') { + $this->regex = $this->pattern; + } else { + $this->regex = '/' . $this->pattern . '/i'; + } + } + + public function getPattern(): string + { + return $this->pattern; + } + + public function getRegex(): string + { + return $this->regex; + } + + public function matches(string $word): bool + { + return preg_match($this->getRegex(), $word) === 1; + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php new file mode 100644 index 0000000..e8d45cb --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Patterns.php @@ -0,0 +1,34 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules; + +use function array_map; +use function implode; +use function preg_match; + +class Patterns +{ + /** @var Pattern[] */ + private $patterns; + + /** @var string */ + private $regex; + + public function __construct(Pattern ...$patterns) + { + $this->patterns = $patterns; + + $patterns = array_map(static function (Pattern $pattern): string { + return $pattern->getPattern(); + }, $this->patterns); + + $this->regex = '/^(?:' . implode('|', $patterns) . ')$/i'; + } + + public function matches(string $word): bool + { + return preg_match($this->regex, $word, $regs) === 1; + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php new file mode 100644 index 0000000..95564d4 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Inflectible.php @@ -0,0 +1,104 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\Portuguese; + +use Doctrine\Inflector\Rules\Pattern; +use Doctrine\Inflector\Rules\Substitution; +use Doctrine\Inflector\Rules\Transformation; +use Doctrine\Inflector\Rules\Word; + +class Inflectible +{ + /** + * @return Transformation[] + */ + public static function getSingular(): iterable + { + yield new Transformation(new Pattern('/^(g|)ases$/i'), '\1ás'); + yield new Transformation(new Pattern('/(japon|escoc|ingl|dinamarqu|fregu|portugu)eses$/i'), '\1ês'); + yield new Transformation(new Pattern('/(ae|ao|oe)s$/'), 'ao'); + yield new Transformation(new Pattern('/(ãe|ão|õe)s$/'), 'ão'); + yield new Transformation(new Pattern('/^(.*[^s]s)es$/i'), '\1'); + yield new Transformation(new Pattern('/sses$/i'), 'sse'); + yield new Transformation(new Pattern('/ns$/i'), 'm'); + yield new Transformation(new Pattern('/(r|t|f|v)is$/i'), '\1il'); + yield new Transformation(new Pattern('/uis$/i'), 'ul'); + yield new Transformation(new Pattern('/ois$/i'), 'ol'); + yield new Transformation(new Pattern('/eis$/i'), 'ei'); + yield new Transformation(new Pattern('/éis$/i'), 'el'); + yield new Transformation(new Pattern('/([^p])ais$/i'), '\1al'); + yield new Transformation(new Pattern('/(r|z)es$/i'), '\1'); + yield new Transformation(new Pattern('/^(á|gá)s$/i'), '\1s'); + yield new Transformation(new Pattern('/([^ê])s$/i'), '\1'); + } + + /** + * @return Transformation[] + */ + public static function getPlural(): iterable + { + yield new Transformation(new Pattern('/^(alem|c|p)ao$/i'), '\1aes'); + yield new Transformation(new Pattern('/^(irm|m)ao$/i'), '\1aos'); + yield new Transformation(new Pattern('/ao$/i'), 'oes'); + yield new Transformation(new Pattern('/^(alem|c|p)ão$/i'), '\1ães'); + yield new Transformation(new Pattern('/^(irm|m)ão$/i'), '\1ãos'); + yield new Transformation(new Pattern('/ão$/i'), 'ões'); + yield new Transformation(new Pattern('/^(|g)ás$/i'), '\1ases'); + yield new Transformation(new Pattern('/^(japon|escoc|ingl|dinamarqu|fregu|portugu)ês$/i'), '\1eses'); + yield new Transformation(new Pattern('/m$/i'), 'ns'); + yield new Transformation(new Pattern('/([^aeou])il$/i'), '\1is'); + yield new Transformation(new Pattern('/ul$/i'), 'uis'); + yield new Transformation(new Pattern('/ol$/i'), 'ois'); + yield new Transformation(new Pattern('/el$/i'), 'eis'); + yield new Transformation(new Pattern('/al$/i'), 'ais'); + yield new Transformation(new Pattern('/(z|r)$/i'), '\1es'); + yield new Transformation(new Pattern('/(s)$/i'), '\1'); + yield new Transformation(new Pattern('/$/'), 's'); + } + + /** + * @return Substitution[] + */ + public static function getIrregular(): iterable + { + yield new Substitution(new Word('abdomen'), new Word('abdomens')); + yield new Substitution(new Word('alemão'), new Word('alemães')); + yield new Substitution(new Word('artesã'), new Word('artesãos')); + yield new Substitution(new Word('álcool'), new Word('álcoois')); + yield new Substitution(new Word('árvore'), new Word('árvores')); + yield new Substitution(new Word('bencão'), new Word('bencãos')); + yield new Substitution(new Word('cão'), new Word('cães')); + yield new Substitution(new Word('campus'), new Word('campi')); + yield new Substitution(new Word('cadáver'), new Word('cadáveres')); + yield new Substitution(new Word('capelão'), new Word('capelães')); + yield new Substitution(new Word('capitão'), new Word('capitães')); + yield new Substitution(new Word('chão'), new Word('chãos')); + yield new Substitution(new Word('charlatão'), new Word('charlatães')); + yield new Substitution(new Word('cidadão'), new Word('cidadãos')); + yield new Substitution(new Word('consul'), new Word('consules')); + yield new Substitution(new Word('cristão'), new Word('cristãos')); + yield new Substitution(new Word('difícil'), new Word('difíceis')); + yield new Substitution(new Word('email'), new Word('emails')); + yield new Substitution(new Word('escrivão'), new Word('escrivães')); + yield new Substitution(new Word('fóssil'), new Word('fósseis')); + yield new Substitution(new Word('gás'), new Word('gases')); + yield new Substitution(new Word('germens'), new Word('germen')); + yield new Substitution(new Word('grão'), new Word('grãos')); + yield new Substitution(new Word('hífen'), new Word('hífens')); + yield new Substitution(new Word('irmão'), new Word('irmãos')); + yield new Substitution(new Word('liquens'), new Word('liquen')); + yield new Substitution(new Word('mal'), new Word('males')); + yield new Substitution(new Word('mão'), new Word('mãos')); + yield new Substitution(new Word('orfão'), new Word('orfãos')); + yield new Substitution(new Word('país'), new Word('países')); + yield new Substitution(new Word('pai'), new Word('pais')); + yield new Substitution(new Word('pão'), new Word('pães')); + yield new Substitution(new Word('projétil'), new Word('projéteis')); + yield new Substitution(new Word('réptil'), new Word('répteis')); + yield new Substitution(new Word('sacristão'), new Word('sacristães')); + yield new Substitution(new Word('sotão'), new Word('sotãos')); + yield new Substitution(new Word('tabelião'), new Word('tabeliães')); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php new file mode 100644 index 0000000..bf12d54 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/InflectorFactory.php @@ -0,0 +1,21 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\Portuguese; + +use Doctrine\Inflector\GenericLanguageInflectorFactory; +use Doctrine\Inflector\Rules\Ruleset; + +final class InflectorFactory extends GenericLanguageInflectorFactory +{ + protected function getSingularRuleset(): Ruleset + { + return Rules::getSingularRuleset(); + } + + protected function getPluralRuleset(): Ruleset + { + return Rules::getPluralRuleset(); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php new file mode 100644 index 0000000..897f177 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Rules.php @@ -0,0 +1,31 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\Portuguese; + +use Doctrine\Inflector\Rules\Patterns; +use Doctrine\Inflector\Rules\Ruleset; +use Doctrine\Inflector\Rules\Substitutions; +use Doctrine\Inflector\Rules\Transformations; + +final class Rules +{ + public static function getSingularRuleset(): Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getSingular()), + new Patterns(...Uninflected::getSingular()), + (new Substitutions(...Inflectible::getIrregular()))->getFlippedSubstitutions() + ); + } + + public static function getPluralRuleset(): Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getPlural()), + new Patterns(...Uninflected::getPlural()), + new Substitutions(...Inflectible::getIrregular()) + ); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php new file mode 100644 index 0000000..58c34f9 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Portuguese/Uninflected.php @@ -0,0 +1,38 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\Portuguese; + +use Doctrine\Inflector\Rules\Pattern; + +final class Uninflected +{ + /** + * @return Pattern[] + */ + public static function getSingular(): iterable + { + yield from self::getDefault(); + } + + /** + * @return Pattern[] + */ + public static function getPlural(): iterable + { + yield from self::getDefault(); + } + + /** + * @return Pattern[] + */ + private static function getDefault(): iterable + { + yield new Pattern('tórax'); + yield new Pattern('tênis'); + yield new Pattern('ônibus'); + yield new Pattern('lápis'); + yield new Pattern('fênix'); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php new file mode 100644 index 0000000..39889b7 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Ruleset.php @@ -0,0 +1,39 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules; + +class Ruleset +{ + /** @var Transformations */ + private $regular; + + /** @var Patterns */ + private $uninflected; + + /** @var Substitutions */ + private $irregular; + + public function __construct(Transformations $regular, Patterns $uninflected, Substitutions $irregular) + { + $this->regular = $regular; + $this->uninflected = $uninflected; + $this->irregular = $irregular; + } + + public function getRegular(): Transformations + { + return $this->regular; + } + + public function getUninflected(): Patterns + { + return $this->uninflected; + } + + public function getIrregular(): Substitutions + { + return $this->irregular; + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php new file mode 100644 index 0000000..c6862fa --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Inflectible.php @@ -0,0 +1,53 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\Spanish; + +use Doctrine\Inflector\Rules\Pattern; +use Doctrine\Inflector\Rules\Substitution; +use Doctrine\Inflector\Rules\Transformation; +use Doctrine\Inflector\Rules\Word; + +class Inflectible +{ + /** + * @return Transformation[] + */ + public static function getSingular(): iterable + { + yield new Transformation(new Pattern('/ereses$/'), 'erés'); + yield new Transformation(new Pattern('/iones$/'), 'ión'); + yield new Transformation(new Pattern('/ces$/'), 'z'); + yield new Transformation(new Pattern('/es$/'), ''); + yield new Transformation(new Pattern('/s$/'), ''); + } + + /** + * @return Transformation[] + */ + public static function getPlural(): iterable + { + yield new Transformation(new Pattern('/ú([sn])$/i'), 'u\1es'); + yield new Transformation(new Pattern('/ó([sn])$/i'), 'o\1es'); + yield new Transformation(new Pattern('/í([sn])$/i'), 'i\1es'); + yield new Transformation(new Pattern('/é([sn])$/i'), 'e\1es'); + yield new Transformation(new Pattern('/á([sn])$/i'), 'a\1es'); + yield new Transformation(new Pattern('/z$/i'), 'ces'); + yield new Transformation(new Pattern('/([aeiou]s)$/i'), '\1'); + yield new Transformation(new Pattern('/([^aeéiou])$/i'), '\1es'); + yield new Transformation(new Pattern('/$/'), 's'); + } + + /** + * @return Substitution[] + */ + public static function getIrregular(): iterable + { + yield new Substitution(new Word('el'), new Word('los')); + yield new Substitution(new Word('papá'), new Word('papás')); + yield new Substitution(new Word('mamá'), new Word('mamás')); + yield new Substitution(new Word('sofá'), new Word('sofás')); + yield new Substitution(new Word('mes'), new Word('meses')); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php new file mode 100644 index 0000000..85084ca --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/InflectorFactory.php @@ -0,0 +1,21 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\Spanish; + +use Doctrine\Inflector\GenericLanguageInflectorFactory; +use Doctrine\Inflector\Rules\Ruleset; + +final class InflectorFactory extends GenericLanguageInflectorFactory +{ + protected function getSingularRuleset(): Ruleset + { + return Rules::getSingularRuleset(); + } + + protected function getPluralRuleset(): Ruleset + { + return Rules::getPluralRuleset(); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php new file mode 100644 index 0000000..d739972 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Rules.php @@ -0,0 +1,31 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\Spanish; + +use Doctrine\Inflector\Rules\Patterns; +use Doctrine\Inflector\Rules\Ruleset; +use Doctrine\Inflector\Rules\Substitutions; +use Doctrine\Inflector\Rules\Transformations; + +final class Rules +{ + public static function getSingularRuleset(): Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getSingular()), + new Patterns(...Uninflected::getSingular()), + (new Substitutions(...Inflectible::getIrregular()))->getFlippedSubstitutions() + ); + } + + public static function getPluralRuleset(): Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getPlural()), + new Patterns(...Uninflected::getPlural()), + new Substitutions(...Inflectible::getIrregular()) + ); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php new file mode 100644 index 0000000..c743b39 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Spanish/Uninflected.php @@ -0,0 +1,36 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\Spanish; + +use Doctrine\Inflector\Rules\Pattern; + +final class Uninflected +{ + /** + * @return Pattern[] + */ + public static function getSingular(): iterable + { + yield from self::getDefault(); + } + + /** + * @return Pattern[] + */ + public static function getPlural(): iterable + { + yield from self::getDefault(); + } + + /** + * @return Pattern[] + */ + private static function getDefault(): iterable + { + yield new Pattern('lunes'); + yield new Pattern('rompecabezas'); + yield new Pattern('crisis'); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php new file mode 100644 index 0000000..471aff9 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitution.php @@ -0,0 +1,30 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules; + +final class Substitution +{ + /** @var Word */ + private $from; + + /** @var Word */ + private $to; + + public function __construct(Word $from, Word $to) + { + $this->from = $from; + $this->to = $to; + } + + public function getFrom(): Word + { + return $this->from; + } + + public function getTo(): Word + { + return $this->to; + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php new file mode 100644 index 0000000..17ee296 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Substitutions.php @@ -0,0 +1,57 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules; + +use Doctrine\Inflector\WordInflector; + +use function strtolower; +use function strtoupper; +use function substr; + +class Substitutions implements WordInflector +{ + /** @var Substitution[] */ + private $substitutions; + + public function __construct(Substitution ...$substitutions) + { + foreach ($substitutions as $substitution) { + $this->substitutions[$substitution->getFrom()->getWord()] = $substitution; + } + } + + public function getFlippedSubstitutions(): Substitutions + { + $substitutions = []; + + foreach ($this->substitutions as $substitution) { + $substitutions[] = new Substitution( + $substitution->getTo(), + $substitution->getFrom() + ); + } + + return new Substitutions(...$substitutions); + } + + public function inflect(string $word): string + { + $lowerWord = strtolower($word); + + if (isset($this->substitutions[$lowerWord])) { + $firstLetterUppercase = $lowerWord[0] !== $word[0]; + + $toWord = $this->substitutions[$lowerWord]->getTo()->getWord(); + + if ($firstLetterUppercase) { + return strtoupper($toWord[0]) . substr($toWord, 1); + } + + return $toWord; + } + + return $word; + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php new file mode 100644 index 0000000..30dcd59 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformation.php @@ -0,0 +1,39 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules; + +use Doctrine\Inflector\WordInflector; + +use function preg_replace; + +final class Transformation implements WordInflector +{ + /** @var Pattern */ + private $pattern; + + /** @var string */ + private $replacement; + + public function __construct(Pattern $pattern, string $replacement) + { + $this->pattern = $pattern; + $this->replacement = $replacement; + } + + public function getPattern(): Pattern + { + return $this->pattern; + } + + public function getReplacement(): string + { + return $this->replacement; + } + + public function inflect(string $word): string + { + return (string) preg_replace($this->pattern->getRegex(), $this->replacement, $word); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php new file mode 100644 index 0000000..b6a48fa --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Transformations.php @@ -0,0 +1,29 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules; + +use Doctrine\Inflector\WordInflector; + +class Transformations implements WordInflector +{ + /** @var Transformation[] */ + private $transformations; + + public function __construct(Transformation ...$transformations) + { + $this->transformations = $transformations; + } + + public function inflect(string $word): string + { + foreach ($this->transformations as $transformation) { + if ($transformation->getPattern()->matches($word)) { + return $transformation->inflect($word); + } + } + + return $word; + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php new file mode 100644 index 0000000..d7b7064 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Inflectible.php @@ -0,0 +1,40 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\Turkish; + +use Doctrine\Inflector\Rules\Pattern; +use Doctrine\Inflector\Rules\Substitution; +use Doctrine\Inflector\Rules\Transformation; +use Doctrine\Inflector\Rules\Word; + +class Inflectible +{ + /** + * @return Transformation[] + */ + public static function getSingular(): iterable + { + yield new Transformation(new Pattern('/l[ae]r$/i'), ''); + } + + /** + * @return Transformation[] + */ + public static function getPlural(): iterable + { + yield new Transformation(new Pattern('/([eöiü][^aoıueöiü]{0,6})$/u'), '\1ler'); + yield new Transformation(new Pattern('/([aoıu][^aoıueöiü]{0,6})$/u'), '\1lar'); + } + + /** + * @return Substitution[] + */ + public static function getIrregular(): iterable + { + yield new Substitution(new Word('ben'), new Word('biz')); + yield new Substitution(new Word('sen'), new Word('siz')); + yield new Substitution(new Word('o'), new Word('onlar')); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php new file mode 100644 index 0000000..c6cdebe --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/InflectorFactory.php @@ -0,0 +1,21 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\Turkish; + +use Doctrine\Inflector\GenericLanguageInflectorFactory; +use Doctrine\Inflector\Rules\Ruleset; + +final class InflectorFactory extends GenericLanguageInflectorFactory +{ + protected function getSingularRuleset(): Ruleset + { + return Rules::getSingularRuleset(); + } + + protected function getPluralRuleset(): Ruleset + { + return Rules::getPluralRuleset(); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php new file mode 100644 index 0000000..ea564ac --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Rules.php @@ -0,0 +1,31 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\Turkish; + +use Doctrine\Inflector\Rules\Patterns; +use Doctrine\Inflector\Rules\Ruleset; +use Doctrine\Inflector\Rules\Substitutions; +use Doctrine\Inflector\Rules\Transformations; + +final class Rules +{ + public static function getSingularRuleset(): Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getSingular()), + new Patterns(...Uninflected::getSingular()), + (new Substitutions(...Inflectible::getIrregular()))->getFlippedSubstitutions() + ); + } + + public static function getPluralRuleset(): Ruleset + { + return new Ruleset( + new Transformations(...Inflectible::getPlural()), + new Patterns(...Uninflected::getPlural()), + new Substitutions(...Inflectible::getIrregular()) + ); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php new file mode 100644 index 0000000..a75d248 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Turkish/Uninflected.php @@ -0,0 +1,36 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules\Turkish; + +use Doctrine\Inflector\Rules\Pattern; + +final class Uninflected +{ + /** + * @return Pattern[] + */ + public static function getSingular(): iterable + { + yield from self::getDefault(); + } + + /** + * @return Pattern[] + */ + public static function getPlural(): iterable + { + yield from self::getDefault(); + } + + /** + * @return Pattern[] + */ + private static function getDefault(): iterable + { + yield new Pattern('lunes'); + yield new Pattern('rompecabezas'); + yield new Pattern('crisis'); + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php new file mode 100644 index 0000000..98e93ba --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/Rules/Word.php @@ -0,0 +1,21 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector\Rules; + +class Word +{ + /** @var string */ + private $word; + + public function __construct(string $word) + { + $this->word = $word; + } + + public function getWord(): string + { + return $this->word; + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php new file mode 100644 index 0000000..12b2ed5 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/RulesetInflector.php @@ -0,0 +1,56 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector; + +use Doctrine\Inflector\Rules\Ruleset; + +use function array_merge; + +/** + * Inflects based on multiple rulesets. + * + * Rules: + * - If the word matches any uninflected word pattern, it is not inflected + * - The first ruleset that returns a different value for an irregular word wins + * - The first ruleset that returns a different value for a regular word wins + * - If none of the above match, the word is left as-is + */ +class RulesetInflector implements WordInflector +{ + /** @var Ruleset[] */ + private $rulesets; + + public function __construct(Ruleset $ruleset, Ruleset ...$rulesets) + { + $this->rulesets = array_merge([$ruleset], $rulesets); + } + + public function inflect(string $word): string + { + if ($word === '') { + return ''; + } + + foreach ($this->rulesets as $ruleset) { + if ($ruleset->getUninflected()->matches($word)) { + return $word; + } + + $inflected = $ruleset->getIrregular()->inflect($word); + + if ($inflected !== $word) { + return $inflected; + } + + $inflected = $ruleset->getRegular()->inflect($word); + + if ($inflected !== $word) { + return $inflected; + } + } + + return $word; + } +} diff --git a/vendor/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php b/vendor/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php new file mode 100644 index 0000000..b88b1d6 --- /dev/null +++ b/vendor/doctrine/inflector/lib/Doctrine/Inflector/WordInflector.php @@ -0,0 +1,10 @@ +<?php + +declare(strict_types=1); + +namespace Doctrine\Inflector; + +interface WordInflector +{ + public function inflect(string $word): string; +} diff --git a/vendor/doctrine/inflector/phpstan.neon.dist b/vendor/doctrine/inflector/phpstan.neon.dist new file mode 100644 index 0000000..5f3f16b --- /dev/null +++ b/vendor/doctrine/inflector/phpstan.neon.dist @@ -0,0 +1,13 @@ +includes: + - vendor/phpstan/phpstan-phpunit/extension.neon + - vendor/phpstan/phpstan-phpunit/rules.neon + - vendor/phpstan/phpstan-strict-rules/rules.neon + +parameters: + level: 7 + paths: + - lib + - tests + + excludes_analyse: + - %rootDir%/../../../tests/Doctrine/Tests/Common/* diff --git a/vendor/doctrine/inflector/psalm.xml b/vendor/doctrine/inflector/psalm.xml new file mode 100644 index 0000000..677e8d4 --- /dev/null +++ b/vendor/doctrine/inflector/psalm.xml @@ -0,0 +1,15 @@ +<?xml version="1.0"?> +<psalm + errorLevel="7" + resolveFromConfigFile="true" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns="https://getpsalm.org/schema/config" + xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd" +> + <projectFiles> + <directory name="lib/Doctrine/Inflector" /> + <ignoreFiles> + <directory name="vendor" /> + </ignoreFiles> + </projectFiles> +</psalm> diff --git a/vendor/graham-campbell/result-type/LICENSE b/vendor/graham-campbell/result-type/LICENSE new file mode 100644 index 0000000..f2a2eec --- /dev/null +++ b/vendor/graham-campbell/result-type/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2020-2021 Graham Campbell <hello@gjcampbell.co.uk> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/graham-campbell/result-type/composer.json b/vendor/graham-campbell/result-type/composer.json new file mode 100644 index 0000000..f53f9be --- /dev/null +++ b/vendor/graham-campbell/result-type/composer.json @@ -0,0 +1,33 @@ +{ + "name": "graham-campbell/result-type", + "description": "An Implementation Of The Result Type", + "keywords": ["result", "result-type", "Result", "Result Type", "Result-Type", "Graham Campbell", "GrahamCampbell"], + "license": "MIT", + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "require": { + "php": "^7.0 || ^8.0", + "phpoption/phpoption": "^1.8" + }, + "require-dev": { + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + }, + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "GrahamCampbell\\Tests\\ResultType\\": "tests/" + } + }, + "config": { + "preferred-install": "dist" + } +} diff --git a/vendor/graham-campbell/result-type/src/Error.php b/vendor/graham-campbell/result-type/src/Error.php new file mode 100644 index 0000000..add9b2d --- /dev/null +++ b/vendor/graham-campbell/result-type/src/Error.php @@ -0,0 +1,120 @@ +<?php + +declare(strict_types=1); + +/* + * This file is part of Result Type. + * + * (c) Graham Campbell <hello@gjcampbell.co.uk> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace GrahamCampbell\ResultType; + +use PhpOption\None; +use PhpOption\Some; + +/** + * @template T + * @template E + * @extends \GrahamCampbell\ResultType\Result<T,E> + */ +final class Error extends Result +{ + /** + * @var E + */ + private $value; + + /** + * Internal constructor for an error value. + * + * @param E $value + * + * @return void + */ + private function __construct($value) + { + $this->value = $value; + } + + /** + * Create a new error value. + * + * @template F + * + * @param F $value + * + * @return \GrahamCampbell\ResultType\Result<T,F> + */ + public static function create($value) + { + return new self($value); + } + + /** + * Get the success option value. + * + * @return \PhpOption\Option<T> + */ + public function success() + { + return None::create(); + } + + /** + * Map over the success value. + * + * @template S + * + * @param callable(T):S $f + * + * @return \GrahamCampbell\ResultType\Result<S,E> + */ + public function map(callable $f) + { + return self::create($this->value); + } + + /** + * Flat map over the success value. + * + * @template S + * @template F + * + * @param callable(T):\GrahamCampbell\ResultType\Result<S,F> $f + * + * @return \GrahamCampbell\ResultType\Result<S,F> + */ + public function flatMap(callable $f) + { + /** @var \GrahamCampbell\ResultType\Result<S,F> */ + return self::create($this->value); + } + + /** + * Get the error option value. + * + * @return \PhpOption\Option<E> + */ + public function error() + { + return Some::create($this->value); + } + + /** + * Map over the error value. + * + * @template F + * + * @param callable(E):F $f + * + * @return \GrahamCampbell\ResultType\Result<T,F> + */ + public function mapError(callable $f) + { + return self::create($f($this->value)); + } +} diff --git a/vendor/graham-campbell/result-type/src/Result.php b/vendor/graham-campbell/result-type/src/Result.php new file mode 100644 index 0000000..8c67bcd --- /dev/null +++ b/vendor/graham-campbell/result-type/src/Result.php @@ -0,0 +1,69 @@ +<?php + +declare(strict_types=1); + +/* + * This file is part of Result Type. + * + * (c) Graham Campbell <hello@gjcampbell.co.uk> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace GrahamCampbell\ResultType; + +/** + * @template T + * @template E + */ +abstract class Result +{ + /** + * Get the success option value. + * + * @return \PhpOption\Option<T> + */ + abstract public function success(); + + /** + * Map over the success value. + * + * @template S + * + * @param callable(T):S $f + * + * @return \GrahamCampbell\ResultType\Result<S,E> + */ + abstract public function map(callable $f); + + /** + * Flat map over the success value. + * + * @template S + * @template F + * + * @param callable(T):\GrahamCampbell\ResultType\Result<S,F> $f + * + * @return \GrahamCampbell\ResultType\Result<S,F> + */ + abstract public function flatMap(callable $f); + + /** + * Get the error option value. + * + * @return \PhpOption\Option<E> + */ + abstract public function error(); + + /** + * Map over the error value. + * + * @template F + * + * @param callable(E):F $f + * + * @return \GrahamCampbell\ResultType\Result<T,F> + */ + abstract public function mapError(callable $f); +} diff --git a/vendor/graham-campbell/result-type/src/Success.php b/vendor/graham-campbell/result-type/src/Success.php new file mode 100644 index 0000000..b68ad57 --- /dev/null +++ b/vendor/graham-campbell/result-type/src/Success.php @@ -0,0 +1,119 @@ +<?php + +declare(strict_types=1); + +/* + * This file is part of Result Type. + * + * (c) Graham Campbell <hello@gjcampbell.co.uk> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace GrahamCampbell\ResultType; + +use PhpOption\None; +use PhpOption\Some; + +/** + * @template T + * @template E + * @extends \GrahamCampbell\ResultType\Result<T,E> + */ +final class Success extends Result +{ + /** + * @var T + */ + private $value; + + /** + * Internal constructor for a success value. + * + * @param T $value + * + * @return void + */ + private function __construct($value) + { + $this->value = $value; + } + + /** + * Create a new error value. + * + * @template S + * + * @param S $value + * + * @return \GrahamCampbell\ResultType\Result<S,E> + */ + public static function create($value) + { + return new self($value); + } + + /** + * Get the success option value. + * + * @return \PhpOption\Option<T> + */ + public function success() + { + return Some::create($this->value); + } + + /** + * Map over the success value. + * + * @template S + * + * @param callable(T):S $f + * + * @return \GrahamCampbell\ResultType\Result<S,E> + */ + public function map(callable $f) + { + return self::create($f($this->value)); + } + + /** + * Flat map over the success value. + * + * @template S + * @template F + * + * @param callable(T):\GrahamCampbell\ResultType\Result<S,F> $f + * + * @return \GrahamCampbell\ResultType\Result<S,F> + */ + public function flatMap(callable $f) + { + return $f($this->value); + } + + /** + * Get the error option value. + * + * @return \PhpOption\Option<E> + */ + public function error() + { + return None::create(); + } + + /** + * Map over the error value. + * + * @template F + * + * @param callable(E):F $f + * + * @return \GrahamCampbell\ResultType\Result<T,F> + */ + public function mapError(callable $f) + { + return self::create($this->value); + } +} diff --git a/vendor/guzzlehttp/guzzle/CHANGELOG.md b/vendor/guzzlehttp/guzzle/CHANGELOG.md new file mode 100644 index 0000000..12949ba --- /dev/null +++ b/vendor/guzzlehttp/guzzle/CHANGELOG.md @@ -0,0 +1,1519 @@ +# Change Log + +Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version. + +## 7.5.0 - 2022-08-28 + +### Added + +- Support PHP 8.2 +- Add request to delay closure params + +## 7.4.5 - 2022-06-20 + +* Fix change in port should be considered a change in origin +* Fix `CURLOPT_HTTPAUTH` option not cleared on change of origin + +## 7.4.4 - 2022-06-09 + +* Fix failure to strip Authorization header on HTTP downgrade +* Fix failure to strip the Cookie header on change in host or HTTP downgrade + +## 7.4.3 - 2022-05-25 + +* Fix cross-domain cookie leakage + +## 7.4.2 - 2022-03-20 + +### Fixed + +- Remove curl auth on cross-domain redirects to align with the Authorization HTTP header +- Reject non-HTTP schemes in StreamHandler +- Set a default ssl.peer_name context in StreamHandler to allow `force_ip_resolve` + +## 7.4.1 - 2021-12-06 + +### Changed + +- Replaced implicit URI to string coercion [#2946](https://github.com/guzzle/guzzle/pull/2946) +- Allow `symfony/deprecation-contracts` version 3 [#2961](https://github.com/guzzle/guzzle/pull/2961) + +### Fixed + +- Only close curl handle if it's done [#2950](https://github.com/guzzle/guzzle/pull/2950) + +## 7.4.0 - 2021-10-18 + +### Added + +- Support PHP 8.1 [#2929](https://github.com/guzzle/guzzle/pull/2929), [#2939](https://github.com/guzzle/guzzle/pull/2939) +- Support `psr/log` version 2 and 3 [#2943](https://github.com/guzzle/guzzle/pull/2943) + +### Fixed + +- Make sure we always call `restore_error_handler()` [#2915](https://github.com/guzzle/guzzle/pull/2915) +- Fix progress parameter type compatibility between the cURL and stream handlers [#2936](https://github.com/guzzle/guzzle/pull/2936) +- Throw `InvalidArgumentException` when an incorrect `headers` array is provided [#2916](https://github.com/guzzle/guzzle/pull/2916), [#2942](https://github.com/guzzle/guzzle/pull/2942) + +### Changed + +- Be more strict with types [#2914](https://github.com/guzzle/guzzle/pull/2914), [#2917](https://github.com/guzzle/guzzle/pull/2917), [#2919](https://github.com/guzzle/guzzle/pull/2919), [#2945](https://github.com/guzzle/guzzle/pull/2945) + +## 7.3.0 - 2021-03-23 + +### Added + +- Support for DER and P12 certificates [#2413](https://github.com/guzzle/guzzle/pull/2413) +- Support the cURL (http://) scheme for StreamHandler proxies [#2850](https://github.com/guzzle/guzzle/pull/2850) +- Support for `guzzlehttp/psr7:^2.0` [#2878](https://github.com/guzzle/guzzle/pull/2878) + +### Fixed + +- Handle exceptions on invalid header consistently between PHP versions and handlers [#2872](https://github.com/guzzle/guzzle/pull/2872) + +## 7.2.0 - 2020-10-10 + +### Added + +- Support for PHP 8 [#2712](https://github.com/guzzle/guzzle/pull/2712), [#2715](https://github.com/guzzle/guzzle/pull/2715), [#2789](https://github.com/guzzle/guzzle/pull/2789) +- Support passing a body summarizer to the http errors middleware [#2795](https://github.com/guzzle/guzzle/pull/2795) + +### Fixed + +- Handle exceptions during response creation [#2591](https://github.com/guzzle/guzzle/pull/2591) +- Fix CURLOPT_ENCODING not to be overwritten [#2595](https://github.com/guzzle/guzzle/pull/2595) +- Make sure the Request always has a body object [#2804](https://github.com/guzzle/guzzle/pull/2804) + +### Changed + +- The `TooManyRedirectsException` has a response [#2660](https://github.com/guzzle/guzzle/pull/2660) +- Avoid "functions" from dependencies [#2712](https://github.com/guzzle/guzzle/pull/2712) + +### Deprecated + +- Using environment variable GUZZLE_CURL_SELECT_TIMEOUT [#2786](https://github.com/guzzle/guzzle/pull/2786) + +## 7.1.1 - 2020-09-30 + +### Fixed + +- Incorrect EOF detection for response body streams on Windows. + +### Changed + +- We dont connect curl `sink` on HEAD requests. +- Removed some PHP 5 workarounds + +## 7.1.0 - 2020-09-22 + +### Added + +- `GuzzleHttp\MessageFormatterInterface` + +### Fixed + +- Fixed issue that caused cookies with no value not to be stored. +- On redirects, we allow all safe methods like GET, HEAD and OPTIONS. +- Fixed logging on empty responses. +- Make sure MessageFormatter::format returns string + +### Deprecated + +- All functions in `GuzzleHttp` has been deprecated. Use static methods on `Utils` instead. +- `ClientInterface::getConfig()` +- `Client::getConfig()` +- `Client::__call()` +- `Utils::defaultCaBundle()` +- `CurlFactory::LOW_CURL_VERSION_NUMBER` + +## 7.0.1 - 2020-06-27 + +* Fix multiply defined functions fatal error [#2699](https://github.com/guzzle/guzzle/pull/2699) + +## 7.0.0 - 2020-06-27 + +No changes since 7.0.0-rc1. + +## 7.0.0-rc1 - 2020-06-15 + +### Changed + +* Use error level for logging errors in Middleware [#2629](https://github.com/guzzle/guzzle/pull/2629) +* Disabled IDN support by default and require ext-intl to use it [#2675](https://github.com/guzzle/guzzle/pull/2675) + +## 7.0.0-beta2 - 2020-05-25 + +### Added + +* Using `Utils` class instead of functions in the `GuzzleHttp` namespace. [#2546](https://github.com/guzzle/guzzle/pull/2546) +* `ClientInterface::MAJOR_VERSION` [#2583](https://github.com/guzzle/guzzle/pull/2583) + +### Changed + +* Avoid the `getenv` function when unsafe [#2531](https://github.com/guzzle/guzzle/pull/2531) +* Added real client methods [#2529](https://github.com/guzzle/guzzle/pull/2529) +* Avoid functions due to global install conflicts [#2546](https://github.com/guzzle/guzzle/pull/2546) +* Use Symfony intl-idn polyfill [#2550](https://github.com/guzzle/guzzle/pull/2550) +* Adding methods for HTTP verbs like `Client::get()`, `Client::head()`, `Client::patch()` etc [#2529](https://github.com/guzzle/guzzle/pull/2529) +* `ConnectException` extends `TransferException` [#2541](https://github.com/guzzle/guzzle/pull/2541) +* Updated the default User Agent to "GuzzleHttp/7" [#2654](https://github.com/guzzle/guzzle/pull/2654) + +### Fixed + +* Various intl icu issues [#2626](https://github.com/guzzle/guzzle/pull/2626) + +### Removed + +* Pool option `pool_size` [#2528](https://github.com/guzzle/guzzle/pull/2528) + +## 7.0.0-beta1 - 2019-12-30 + +The diff might look very big but 95% of Guzzle users will be able to upgrade without modification. +Please see [the upgrade document](UPGRADING.md) that describes all BC breaking changes. + +### Added + +* Implement PSR-18 and dropped PHP 5 support [#2421](https://github.com/guzzle/guzzle/pull/2421) [#2474](https://github.com/guzzle/guzzle/pull/2474) +* PHP 7 types [#2442](https://github.com/guzzle/guzzle/pull/2442) [#2449](https://github.com/guzzle/guzzle/pull/2449) [#2466](https://github.com/guzzle/guzzle/pull/2466) [#2497](https://github.com/guzzle/guzzle/pull/2497) [#2499](https://github.com/guzzle/guzzle/pull/2499) +* IDN support for redirects [2424](https://github.com/guzzle/guzzle/pull/2424) + +### Changed + +* Dont allow passing null as third argument to `BadResponseException::__construct()` [#2427](https://github.com/guzzle/guzzle/pull/2427) +* Use SAPI constant instead of method call [#2450](https://github.com/guzzle/guzzle/pull/2450) +* Use native function invocation [#2444](https://github.com/guzzle/guzzle/pull/2444) +* Better defaults for PHP installations with old ICU lib [2454](https://github.com/guzzle/guzzle/pull/2454) +* Added visibility to all constants [#2462](https://github.com/guzzle/guzzle/pull/2462) +* Dont allow passing `null` as URI to `Client::request()` and `Client::requestAsync()` [#2461](https://github.com/guzzle/guzzle/pull/2461) +* Widen the exception argument to throwable [#2495](https://github.com/guzzle/guzzle/pull/2495) + +### Fixed + +* Logging when Promise rejected with a string [#2311](https://github.com/guzzle/guzzle/pull/2311) + +### Removed + +* Class `SeekException` [#2162](https://github.com/guzzle/guzzle/pull/2162) +* `RequestException::getResponseBodySummary()` [#2425](https://github.com/guzzle/guzzle/pull/2425) +* `CookieJar::getCookieValue()` [#2433](https://github.com/guzzle/guzzle/pull/2433) +* `uri_template()` and `UriTemplate` [#2440](https://github.com/guzzle/guzzle/pull/2440) +* Request options `save_to` and `exceptions` [#2464](https://github.com/guzzle/guzzle/pull/2464) + +## 6.5.2 - 2019-12-23 + +* idn_to_ascii() fix for old PHP versions [#2489](https://github.com/guzzle/guzzle/pull/2489) + +## 6.5.1 - 2019-12-21 + +* Better defaults for PHP installations with old ICU lib [#2454](https://github.com/guzzle/guzzle/pull/2454) +* IDN support for redirects [#2424](https://github.com/guzzle/guzzle/pull/2424) + +## 6.5.0 - 2019-12-07 + +* Improvement: Added support for reset internal queue in MockHandler. [#2143](https://github.com/guzzle/guzzle/pull/2143) +* Improvement: Added support to pass arbitrary options to `curl_multi_init`. [#2287](https://github.com/guzzle/guzzle/pull/2287) +* Fix: Gracefully handle passing `null` to the `header` option. [#2132](https://github.com/guzzle/guzzle/pull/2132) +* Fix: `RetryMiddleware` did not do exponential delay between retires due unit mismatch. [#2132](https://github.com/guzzle/guzzle/pull/2132) +* Fix: Prevent undefined offset when using array for ssl_key options. [#2348](https://github.com/guzzle/guzzle/pull/2348) +* Deprecated `ClientInterface::VERSION` + +## 6.4.1 - 2019-10-23 + +* No `guzzle.phar` was created in 6.4.0 due expired API token. This release will fix that +* Added `parent::__construct()` to `FileCookieJar` and `SessionCookieJar` + +## 6.4.0 - 2019-10-23 + +* Improvement: Improved error messages when using curl < 7.21.2 [#2108](https://github.com/guzzle/guzzle/pull/2108) +* Fix: Test if response is readable before returning a summary in `RequestException::getResponseBodySummary()` [#2081](https://github.com/guzzle/guzzle/pull/2081) +* Fix: Add support for GUZZLE_CURL_SELECT_TIMEOUT environment variable [#2161](https://github.com/guzzle/guzzle/pull/2161) +* Improvement: Added `GuzzleHttp\Exception\InvalidArgumentException` [#2163](https://github.com/guzzle/guzzle/pull/2163) +* Improvement: Added `GuzzleHttp\_current_time()` to use `hrtime()` if that function exists. [#2242](https://github.com/guzzle/guzzle/pull/2242) +* Improvement: Added curl's `appconnect_time` in `TransferStats` [#2284](https://github.com/guzzle/guzzle/pull/2284) +* Improvement: Make GuzzleException extend Throwable wherever it's available [#2273](https://github.com/guzzle/guzzle/pull/2273) +* Fix: Prevent concurrent writes to file when saving `CookieJar` [#2335](https://github.com/guzzle/guzzle/pull/2335) +* Improvement: Update `MockHandler` so we can test transfer time [#2362](https://github.com/guzzle/guzzle/pull/2362) + +## 6.3.3 - 2018-04-22 + +* Fix: Default headers when decode_content is specified + + +## 6.3.2 - 2018-03-26 + +* Fix: Release process + + +## 6.3.1 - 2018-03-26 + +* Bug fix: Parsing 0 epoch expiry times in cookies [#2014](https://github.com/guzzle/guzzle/pull/2014) +* Improvement: Better ConnectException detection [#2012](https://github.com/guzzle/guzzle/pull/2012) +* Bug fix: Malformed domain that contains a "/" [#1999](https://github.com/guzzle/guzzle/pull/1999) +* Bug fix: Undefined offset when a cookie has no first key-value pair [#1998](https://github.com/guzzle/guzzle/pull/1998) +* Improvement: Support PHPUnit 6 [#1953](https://github.com/guzzle/guzzle/pull/1953) +* Bug fix: Support empty headers [#1915](https://github.com/guzzle/guzzle/pull/1915) +* Bug fix: Ignore case during header modifications [#1916](https://github.com/guzzle/guzzle/pull/1916) + ++ Minor code cleanups, documentation fixes and clarifications. + + +## 6.3.0 - 2017-06-22 + +* Feature: force IP resolution (ipv4 or ipv6) [#1608](https://github.com/guzzle/guzzle/pull/1608), [#1659](https://github.com/guzzle/guzzle/pull/1659) +* Improvement: Don't include summary in exception message when body is empty [#1621](https://github.com/guzzle/guzzle/pull/1621) +* Improvement: Handle `on_headers` option in MockHandler [#1580](https://github.com/guzzle/guzzle/pull/1580) +* Improvement: Added SUSE Linux CA path [#1609](https://github.com/guzzle/guzzle/issues/1609) +* Improvement: Use class reference for getting the name of the class instead of using hardcoded strings [#1641](https://github.com/guzzle/guzzle/pull/1641) +* Feature: Added `read_timeout` option [#1611](https://github.com/guzzle/guzzle/pull/1611) +* Bug fix: PHP 7.x fixes [#1685](https://github.com/guzzle/guzzle/pull/1685), [#1686](https://github.com/guzzle/guzzle/pull/1686), [#1811](https://github.com/guzzle/guzzle/pull/1811) +* Deprecation: BadResponseException instantiation without a response [#1642](https://github.com/guzzle/guzzle/pull/1642) +* Feature: Added NTLM auth [#1569](https://github.com/guzzle/guzzle/pull/1569) +* Feature: Track redirect HTTP status codes [#1711](https://github.com/guzzle/guzzle/pull/1711) +* Improvement: Check handler type during construction [#1745](https://github.com/guzzle/guzzle/pull/1745) +* Improvement: Always include the Content-Length if there's a body [#1721](https://github.com/guzzle/guzzle/pull/1721) +* Feature: Added convenience method to access a cookie by name [#1318](https://github.com/guzzle/guzzle/pull/1318) +* Bug fix: Fill `CURLOPT_CAPATH` and `CURLOPT_CAINFO` properly [#1684](https://github.com/guzzle/guzzle/pull/1684) +* Improvement: Use `\GuzzleHttp\Promise\rejection_for` function instead of object init [#1827](https://github.com/guzzle/guzzle/pull/1827) + + ++ Minor code cleanups, documentation fixes and clarifications. + +## 6.2.3 - 2017-02-28 + +* Fix deprecations with guzzle/psr7 version 1.4 + +## 6.2.2 - 2016-10-08 + +* Allow to pass nullable Response to delay callable +* Only add scheme when host is present +* Fix drain case where content-length is the literal string zero +* Obfuscate in-URL credentials in exceptions + +## 6.2.1 - 2016-07-18 + +* Address HTTP_PROXY security vulnerability, CVE-2016-5385: + https://httpoxy.org/ +* Fixing timeout bug with StreamHandler: + https://github.com/guzzle/guzzle/pull/1488 +* Only read up to `Content-Length` in PHP StreamHandler to avoid timeouts when + a server does not honor `Connection: close`. +* Ignore URI fragment when sending requests. + +## 6.2.0 - 2016-03-21 + +* Feature: added `GuzzleHttp\json_encode` and `GuzzleHttp\json_decode`. + https://github.com/guzzle/guzzle/pull/1389 +* Bug fix: Fix sleep calculation when waiting for delayed requests. + https://github.com/guzzle/guzzle/pull/1324 +* Feature: More flexible history containers. + https://github.com/guzzle/guzzle/pull/1373 +* Bug fix: defer sink stream opening in StreamHandler. + https://github.com/guzzle/guzzle/pull/1377 +* Bug fix: do not attempt to escape cookie values. + https://github.com/guzzle/guzzle/pull/1406 +* Feature: report original content encoding and length on decoded responses. + https://github.com/guzzle/guzzle/pull/1409 +* Bug fix: rewind seekable request bodies before dispatching to cURL. + https://github.com/guzzle/guzzle/pull/1422 +* Bug fix: provide an empty string to `http_build_query` for HHVM workaround. + https://github.com/guzzle/guzzle/pull/1367 + +## 6.1.1 - 2015-11-22 + +* Bug fix: Proxy::wrapSync() now correctly proxies to the appropriate handler + https://github.com/guzzle/guzzle/commit/911bcbc8b434adce64e223a6d1d14e9a8f63e4e4 +* Feature: HandlerStack is now more generic. + https://github.com/guzzle/guzzle/commit/f2102941331cda544745eedd97fc8fd46e1ee33e +* Bug fix: setting verify to false in the StreamHandler now disables peer + verification. https://github.com/guzzle/guzzle/issues/1256 +* Feature: Middleware now uses an exception factory, including more error + context. https://github.com/guzzle/guzzle/pull/1282 +* Feature: better support for disabled functions. + https://github.com/guzzle/guzzle/pull/1287 +* Bug fix: fixed regression where MockHandler was not using `sink`. + https://github.com/guzzle/guzzle/pull/1292 + +## 6.1.0 - 2015-09-08 + +* Feature: Added the `on_stats` request option to provide access to transfer + statistics for requests. https://github.com/guzzle/guzzle/pull/1202 +* Feature: Added the ability to persist session cookies in CookieJars. + https://github.com/guzzle/guzzle/pull/1195 +* Feature: Some compatibility updates for Google APP Engine + https://github.com/guzzle/guzzle/pull/1216 +* Feature: Added support for NO_PROXY to prevent the use of a proxy based on + a simple set of rules. https://github.com/guzzle/guzzle/pull/1197 +* Feature: Cookies can now contain square brackets. + https://github.com/guzzle/guzzle/pull/1237 +* Bug fix: Now correctly parsing `=` inside of quotes in Cookies. + https://github.com/guzzle/guzzle/pull/1232 +* Bug fix: Cusotm cURL options now correctly override curl options of the + same name. https://github.com/guzzle/guzzle/pull/1221 +* Bug fix: Content-Type header is now added when using an explicitly provided + multipart body. https://github.com/guzzle/guzzle/pull/1218 +* Bug fix: Now ignoring Set-Cookie headers that have no name. +* Bug fix: Reason phrase is no longer cast to an int in some cases in the + cURL handler. https://github.com/guzzle/guzzle/pull/1187 +* Bug fix: Remove the Authorization header when redirecting if the Host + header changes. https://github.com/guzzle/guzzle/pull/1207 +* Bug fix: Cookie path matching fixes + https://github.com/guzzle/guzzle/issues/1129 +* Bug fix: Fixing the cURL `body_as_string` setting + https://github.com/guzzle/guzzle/pull/1201 +* Bug fix: quotes are no longer stripped when parsing cookies. + https://github.com/guzzle/guzzle/issues/1172 +* Bug fix: `form_params` and `query` now always uses the `&` separator. + https://github.com/guzzle/guzzle/pull/1163 +* Bug fix: Adding a Content-Length to PHP stream wrapper requests if not set. + https://github.com/guzzle/guzzle/pull/1189 + +## 6.0.2 - 2015-07-04 + +* Fixed a memory leak in the curl handlers in which references to callbacks + were not being removed by `curl_reset`. +* Cookies are now extracted properly before redirects. +* Cookies now allow more character ranges. +* Decoded Content-Encoding responses are now modified to correctly reflect + their state if the encoding was automatically removed by a handler. This + means that the `Content-Encoding` header may be removed an the + `Content-Length` modified to reflect the message size after removing the + encoding. +* Added a more explicit error message when trying to use `form_params` and + `multipart` in the same request. +* Several fixes for HHVM support. +* Functions are now conditionally required using an additional level of + indirection to help with global Composer installations. + +## 6.0.1 - 2015-05-27 + +* Fixed a bug with serializing the `query` request option where the `&` + separator was missing. +* Added a better error message for when `body` is provided as an array. Please + use `form_params` or `multipart` instead. +* Various doc fixes. + +## 6.0.0 - 2015-05-26 + +* See the UPGRADING.md document for more information. +* Added `multipart` and `form_params` request options. +* Added `synchronous` request option. +* Added the `on_headers` request option. +* Fixed `expect` handling. +* No longer adding default middlewares in the client ctor. These need to be + present on the provided handler in order to work. +* Requests are no longer initiated when sending async requests with the + CurlMultiHandler. This prevents unexpected recursion from requests completing + while ticking the cURL loop. +* Removed the semantics of setting `default` to `true`. This is no longer + required now that the cURL loop is not ticked for async requests. +* Added request and response logging middleware. +* No longer allowing self signed certificates when using the StreamHandler. +* Ensuring that `sink` is valid if saving to a file. +* Request exceptions now include a "handler context" which provides handler + specific contextual information. +* Added `GuzzleHttp\RequestOptions` to allow request options to be applied + using constants. +* `$maxHandles` has been removed from CurlMultiHandler. +* `MultipartPostBody` is now part of the `guzzlehttp/psr7` package. + +## 5.3.0 - 2015-05-19 + +* Mock now supports `save_to` +* Marked `AbstractRequestEvent::getTransaction()` as public. +* Fixed a bug in which multiple headers using different casing would overwrite + previous headers in the associative array. +* Added `Utils::getDefaultHandler()` +* Marked `GuzzleHttp\Client::getDefaultUserAgent` as deprecated. +* URL scheme is now always lowercased. + +## 6.0.0-beta.1 + +* Requires PHP >= 5.5 +* Updated to use PSR-7 + * Requires immutable messages, which basically means an event based system + owned by a request instance is no longer possible. + * Utilizing the [Guzzle PSR-7 package](https://github.com/guzzle/psr7). + * Removed the dependency on `guzzlehttp/streams`. These stream abstractions + are available in the `guzzlehttp/psr7` package under the `GuzzleHttp\Psr7` + namespace. +* Added middleware and handler system + * Replaced the Guzzle event and subscriber system with a middleware system. + * No longer depends on RingPHP, but rather places the HTTP handlers directly + in Guzzle, operating on PSR-7 messages. + * Retry logic is now encapsulated in `GuzzleHttp\Middleware::retry`, which + means the `guzzlehttp/retry-subscriber` is now obsolete. + * Mocking responses is now handled using `GuzzleHttp\Handler\MockHandler`. +* Asynchronous responses + * No longer supports the `future` request option to send an async request. + Instead, use one of the `*Async` methods of a client (e.g., `requestAsync`, + `getAsync`, etc.). + * Utilizing `GuzzleHttp\Promise` instead of React's promise library to avoid + recursion required by chaining and forwarding react promises. See + https://github.com/guzzle/promises + * Added `requestAsync` and `sendAsync` to send request asynchronously. + * Added magic methods for `getAsync()`, `postAsync()`, etc. to send requests + asynchronously. +* Request options + * POST and form updates + * Added the `form_fields` and `form_files` request options. + * Removed the `GuzzleHttp\Post` namespace. + * The `body` request option no longer accepts an array for POST requests. + * The `exceptions` request option has been deprecated in favor of the + `http_errors` request options. + * The `save_to` request option has been deprecated in favor of `sink` request + option. +* Clients no longer accept an array of URI template string and variables for + URI variables. You will need to expand URI templates before passing them + into a client constructor or request method. +* Client methods `get()`, `post()`, `put()`, `patch()`, `options()`, etc. are + now magic methods that will send synchronous requests. +* Replaced `Utils.php` with plain functions in `functions.php`. +* Removed `GuzzleHttp\Collection`. +* Removed `GuzzleHttp\BatchResults`. Batched pool results are now returned as + an array. +* Removed `GuzzleHttp\Query`. Query string handling is now handled using an + associative array passed into the `query` request option. The query string + is serialized using PHP's `http_build_query`. If you need more control, you + can pass the query string in as a string. +* `GuzzleHttp\QueryParser` has been replaced with the + `GuzzleHttp\Psr7\parse_query`. + +## 5.2.0 - 2015-01-27 + +* Added `AppliesHeadersInterface` to make applying headers to a request based + on the body more generic and not specific to `PostBodyInterface`. +* Reduced the number of stack frames needed to send requests. +* Nested futures are now resolved in the client rather than the RequestFsm +* Finishing state transitions is now handled in the RequestFsm rather than the + RingBridge. +* Added a guard in the Pool class to not use recursion for request retries. + +## 5.1.0 - 2014-12-19 + +* Pool class no longer uses recursion when a request is intercepted. +* The size of a Pool can now be dynamically adjusted using a callback. + See https://github.com/guzzle/guzzle/pull/943. +* Setting a request option to `null` when creating a request with a client will + ensure that the option is not set. This allows you to overwrite default + request options on a per-request basis. + See https://github.com/guzzle/guzzle/pull/937. +* Added the ability to limit which protocols are allowed for redirects by + specifying a `protocols` array in the `allow_redirects` request option. +* Nested futures due to retries are now resolved when waiting for synchronous + responses. See https://github.com/guzzle/guzzle/pull/947. +* `"0"` is now an allowed URI path. See + https://github.com/guzzle/guzzle/pull/935. +* `Query` no longer typehints on the `$query` argument in the constructor, + allowing for strings and arrays. +* Exceptions thrown in the `end` event are now correctly wrapped with Guzzle + specific exceptions if necessary. + +## 5.0.3 - 2014-11-03 + +This change updates query strings so that they are treated as un-encoded values +by default where the value represents an un-encoded value to send over the +wire. A Query object then encodes the value before sending over the wire. This +means that even value query string values (e.g., ":") are url encoded. This +makes the Query class match PHP's http_build_query function. However, if you +want to send requests over the wire using valid query string characters that do +not need to be encoded, then you can provide a string to Url::setQuery() and +pass true as the second argument to specify that the query string is a raw +string that should not be parsed or encoded (unless a call to getQuery() is +subsequently made, forcing the query-string to be converted into a Query +object). + +## 5.0.2 - 2014-10-30 + +* Added a trailing `\r\n` to multipart/form-data payloads. See + https://github.com/guzzle/guzzle/pull/871 +* Added a `GuzzleHttp\Pool::send()` convenience method to match the docs. +* Status codes are now returned as integers. See + https://github.com/guzzle/guzzle/issues/881 +* No longer overwriting an existing `application/x-www-form-urlencoded` header + when sending POST requests, allowing for customized headers. See + https://github.com/guzzle/guzzle/issues/877 +* Improved path URL serialization. + + * No longer double percent-encoding characters in the path or query string if + they are already encoded. + * Now properly encoding the supplied path to a URL object, instead of only + encoding ' ' and '?'. + * Note: This has been changed in 5.0.3 to now encode query string values by + default unless the `rawString` argument is provided when setting the query + string on a URL: Now allowing many more characters to be present in the + query string without being percent encoded. See https://tools.ietf.org/html/rfc3986#appendix-A + +## 5.0.1 - 2014-10-16 + +Bugfix release. + +* Fixed an issue where connection errors still returned response object in + error and end events event though the response is unusable. This has been + corrected so that a response is not returned in the `getResponse` method of + these events if the response did not complete. https://github.com/guzzle/guzzle/issues/867 +* Fixed an issue where transfer statistics were not being populated in the + RingBridge. https://github.com/guzzle/guzzle/issues/866 + +## 5.0.0 - 2014-10-12 + +Adding support for non-blocking responses and some minor API cleanup. + +### New Features + +* Added support for non-blocking responses based on `guzzlehttp/guzzle-ring`. +* Added a public API for creating a default HTTP adapter. +* Updated the redirect plugin to be non-blocking so that redirects are sent + concurrently. Other plugins like this can now be updated to be non-blocking. +* Added a "progress" event so that you can get upload and download progress + events. +* Added `GuzzleHttp\Pool` which implements FutureInterface and transfers + requests concurrently using a capped pool size as efficiently as possible. +* Added `hasListeners()` to EmitterInterface. +* Removed `GuzzleHttp\ClientInterface::sendAll` and marked + `GuzzleHttp\Client::sendAll` as deprecated (it's still there, just not the + recommended way). + +### Breaking changes + +The breaking changes in this release are relatively minor. The biggest thing to +look out for is that request and response objects no longer implement fluent +interfaces. + +* Removed the fluent interfaces (i.e., `return $this`) from requests, + responses, `GuzzleHttp\Collection`, `GuzzleHttp\Url`, + `GuzzleHttp\Query`, `GuzzleHttp\Post\PostBody`, and + `GuzzleHttp\Cookie\SetCookie`. This blog post provides a good outline of + why I did this: https://ocramius.github.io/blog/fluent-interfaces-are-evil/. + This also makes the Guzzle message interfaces compatible with the current + PSR-7 message proposal. +* Removed "functions.php", so that Guzzle is truly PSR-4 compliant. Except + for the HTTP request functions from function.php, these functions are now + implemented in `GuzzleHttp\Utils` using camelCase. `GuzzleHttp\json_decode` + moved to `GuzzleHttp\Utils::jsonDecode`. `GuzzleHttp\get_path` moved to + `GuzzleHttp\Utils::getPath`. `GuzzleHttp\set_path` moved to + `GuzzleHttp\Utils::setPath`. `GuzzleHttp\batch` should now be + `GuzzleHttp\Pool::batch`, which returns an `objectStorage`. Using functions.php + caused problems for many users: they aren't PSR-4 compliant, require an + explicit include, and needed an if-guard to ensure that the functions are not + declared multiple times. +* Rewrote adapter layer. + * Removing all classes from `GuzzleHttp\Adapter`, these are now + implemented as callables that are stored in `GuzzleHttp\Ring\Client`. + * Removed the concept of "parallel adapters". Sending requests serially or + concurrently is now handled using a single adapter. + * Moved `GuzzleHttp\Adapter\Transaction` to `GuzzleHttp\Transaction`. The + Transaction object now exposes the request, response, and client as public + properties. The getters and setters have been removed. +* Removed the "headers" event. This event was only useful for changing the + body a response once the headers of the response were known. You can implement + a similar behavior in a number of ways. One example might be to use a + FnStream that has access to the transaction being sent. For example, when the + first byte is written, you could check if the response headers match your + expectations, and if so, change the actual stream body that is being + written to. +* Removed the `asArray` parameter from + `GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header + value as an array, then use the newly added `getHeaderAsArray()` method of + `MessageInterface`. This change makes the Guzzle interfaces compatible with + the PSR-7 interfaces. +* `GuzzleHttp\Message\MessageFactory` no longer allows subclasses to add + custom request options using double-dispatch (this was an implementation + detail). Instead, you should now provide an associative array to the + constructor which is a mapping of the request option name mapping to a + function that applies the option value to a request. +* Removed the concept of "throwImmediately" from exceptions and error events. + This control mechanism was used to stop a transfer of concurrent requests + from completing. This can now be handled by throwing the exception or by + cancelling a pool of requests or each outstanding future request individually. +* Updated to "GuzzleHttp\Streams" 3.0. + * `GuzzleHttp\Stream\StreamInterface::getContents()` no longer accepts a + `maxLen` parameter. This update makes the Guzzle streams project + compatible with the current PSR-7 proposal. + * `GuzzleHttp\Stream\Stream::__construct`, + `GuzzleHttp\Stream\Stream::factory`, and + `GuzzleHttp\Stream\Utils::create` no longer accept a size in the second + argument. They now accept an associative array of options, including the + "size" key and "metadata" key which can be used to provide custom metadata. + +## 4.2.2 - 2014-09-08 + +* Fixed a memory leak in the CurlAdapter when reusing cURL handles. +* No longer using `request_fulluri` in stream adapter proxies. +* Relative redirects are now based on the last response, not the first response. + +## 4.2.1 - 2014-08-19 + +* Ensuring that the StreamAdapter does not always add a Content-Type header +* Adding automated github releases with a phar and zip + +## 4.2.0 - 2014-08-17 + +* Now merging in default options using a case-insensitive comparison. + Closes https://github.com/guzzle/guzzle/issues/767 +* Added the ability to automatically decode `Content-Encoding` response bodies + using the `decode_content` request option. This is set to `true` by default + to decode the response body if it comes over the wire with a + `Content-Encoding`. Set this value to `false` to disable decoding the + response content, and pass a string to provide a request `Accept-Encoding` + header and turn on automatic response decoding. This feature now allows you + to pass an `Accept-Encoding` header in the headers of a request but still + disable automatic response decoding. + Closes https://github.com/guzzle/guzzle/issues/764 +* Added the ability to throw an exception immediately when transferring + requests in parallel. Closes https://github.com/guzzle/guzzle/issues/760 +* Updating guzzlehttp/streams dependency to ~2.1 +* No longer utilizing the now deprecated namespaced methods from the stream + package. + +## 4.1.8 - 2014-08-14 + +* Fixed an issue in the CurlFactory that caused setting the `stream=false` + request option to throw an exception. + See: https://github.com/guzzle/guzzle/issues/769 +* TransactionIterator now calls rewind on the inner iterator. + See: https://github.com/guzzle/guzzle/pull/765 +* You can now set the `Content-Type` header to `multipart/form-data` + when creating POST requests to force multipart bodies. + See https://github.com/guzzle/guzzle/issues/768 + +## 4.1.7 - 2014-08-07 + +* Fixed an error in the HistoryPlugin that caused the same request and response + to be logged multiple times when an HTTP protocol error occurs. +* Ensuring that cURL does not add a default Content-Type when no Content-Type + has been supplied by the user. This prevents the adapter layer from modifying + the request that is sent over the wire after any listeners may have already + put the request in a desired state (e.g., signed the request). +* Throwing an exception when you attempt to send requests that have the + "stream" set to true in parallel using the MultiAdapter. +* Only calling curl_multi_select when there are active cURL handles. This was + previously changed and caused performance problems on some systems due to PHP + always selecting until the maximum select timeout. +* Fixed a bug where multipart/form-data POST fields were not correctly + aggregated (e.g., values with "&"). + +## 4.1.6 - 2014-08-03 + +* Added helper methods to make it easier to represent messages as strings, + including getting the start line and getting headers as a string. + +## 4.1.5 - 2014-08-02 + +* Automatically retrying cURL "Connection died, retrying a fresh connect" + errors when possible. +* cURL implementation cleanup +* Allowing multiple event subscriber listeners to be registered per event by + passing an array of arrays of listener configuration. + +## 4.1.4 - 2014-07-22 + +* Fixed a bug that caused multi-part POST requests with more than one field to + serialize incorrectly. +* Paths can now be set to "0" +* `ResponseInterface::xml` now accepts a `libxml_options` option and added a + missing default argument that was required when parsing XML response bodies. +* A `save_to` stream is now created lazily, which means that files are not + created on disk unless a request succeeds. + +## 4.1.3 - 2014-07-15 + +* Various fixes to multipart/form-data POST uploads +* Wrapping function.php in an if-statement to ensure Guzzle can be used + globally and in a Composer install +* Fixed an issue with generating and merging in events to an event array +* POST headers are only applied before sending a request to allow you to change + the query aggregator used before uploading +* Added much more robust query string parsing +* Fixed various parsing and normalization issues with URLs +* Fixing an issue where multi-valued headers were not being utilized correctly + in the StreamAdapter + +## 4.1.2 - 2014-06-18 + +* Added support for sending payloads with GET requests + +## 4.1.1 - 2014-06-08 + +* Fixed an issue related to using custom message factory options in subclasses +* Fixed an issue with nested form fields in a multi-part POST +* Fixed an issue with using the `json` request option for POST requests +* Added `ToArrayInterface` to `GuzzleHttp\Cookie\CookieJar` + +## 4.1.0 - 2014-05-27 + +* Added a `json` request option to easily serialize JSON payloads. +* Added a `GuzzleHttp\json_decode()` wrapper to safely parse JSON. +* Added `setPort()` and `getPort()` to `GuzzleHttp\Message\RequestInterface`. +* Added the ability to provide an emitter to a client in the client constructor. +* Added the ability to persist a cookie session using $_SESSION. +* Added a trait that can be used to add event listeners to an iterator. +* Removed request method constants from RequestInterface. +* Fixed warning when invalid request start-lines are received. +* Updated MessageFactory to work with custom request option methods. +* Updated cacert bundle to latest build. + +4.0.2 (2014-04-16) +------------------ + +* Proxy requests using the StreamAdapter now properly use request_fulluri (#632) +* Added the ability to set scalars as POST fields (#628) + +## 4.0.1 - 2014-04-04 + +* The HTTP status code of a response is now set as the exception code of + RequestException objects. +* 303 redirects will now correctly switch from POST to GET requests. +* The default parallel adapter of a client now correctly uses the MultiAdapter. +* HasDataTrait now initializes the internal data array as an empty array so + that the toArray() method always returns an array. + +## 4.0.0 - 2014-03-29 + +* For information on changes and upgrading, see: + https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40 +* Added `GuzzleHttp\batch()` as a convenience function for sending requests in + parallel without needing to write asynchronous code. +* Restructured how events are added to `GuzzleHttp\ClientInterface::sendAll()`. + You can now pass a callable or an array of associative arrays where each + associative array contains the "fn", "priority", and "once" keys. + +## 4.0.0.rc-2 - 2014-03-25 + +* Removed `getConfig()` and `setConfig()` from clients to avoid confusion + around whether things like base_url, message_factory, etc. should be able to + be retrieved or modified. +* Added `getDefaultOption()` and `setDefaultOption()` to ClientInterface +* functions.php functions were renamed using snake_case to match PHP idioms +* Added support for `HTTP_PROXY`, `HTTPS_PROXY`, and + `GUZZLE_CURL_SELECT_TIMEOUT` environment variables +* Added the ability to specify custom `sendAll()` event priorities +* Added the ability to specify custom stream context options to the stream + adapter. +* Added a functions.php function for `get_path()` and `set_path()` +* CurlAdapter and MultiAdapter now use a callable to generate curl resources +* MockAdapter now properly reads a body and emits a `headers` event +* Updated Url class to check if a scheme and host are set before adding ":" + and "//". This allows empty Url (e.g., "") to be serialized as "". +* Parsing invalid XML no longer emits warnings +* Curl classes now properly throw AdapterExceptions +* Various performance optimizations +* Streams are created with the faster `Stream\create()` function +* Marked deprecation_proxy() as internal +* Test server is now a collection of static methods on a class + +## 4.0.0-rc.1 - 2014-03-15 + +* See https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40 + +## 3.8.1 - 2014-01-28 + +* Bug: Always using GET requests when redirecting from a 303 response +* Bug: CURLOPT_SSL_VERIFYHOST is now correctly set to false when setting `$certificateAuthority` to false in + `Guzzle\Http\ClientInterface::setSslVerification()` +* Bug: RedirectPlugin now uses strict RFC 3986 compliance when combining a base URL with a relative URL +* Bug: The body of a request can now be set to `"0"` +* Sending PHP stream requests no longer forces `HTTP/1.0` +* Adding more information to ExceptionCollection exceptions so that users have more context, including a stack trace of + each sub-exception +* Updated the `$ref` attribute in service descriptions to merge over any existing parameters of a schema (rather than + clobbering everything). +* Merging URLs will now use the query string object from the relative URL (thus allowing custom query aggregators) +* Query strings are now parsed in a way that they do no convert empty keys with no value to have a dangling `=`. + For example `foo&bar=baz` is now correctly parsed and recognized as `foo&bar=baz` rather than `foo=&bar=baz`. +* Now properly escaping the regular expression delimiter when matching Cookie domains. +* Network access is now disabled when loading XML documents + +## 3.8.0 - 2013-12-05 + +* Added the ability to define a POST name for a file +* JSON response parsing now properly walks additionalProperties +* cURL error code 18 is now retried automatically in the BackoffPlugin +* Fixed a cURL error when URLs contain fragments +* Fixed an issue in the BackoffPlugin retry event where it was trying to access all exceptions as if they were + CurlExceptions +* CURLOPT_PROGRESS function fix for PHP 5.5 (69fcc1e) +* Added the ability for Guzzle to work with older versions of cURL that do not support `CURLOPT_TIMEOUT_MS` +* Fixed a bug that was encountered when parsing empty header parameters +* UriTemplate now has a `setRegex()` method to match the docs +* The `debug` request parameter now checks if it is truthy rather than if it exists +* Setting the `debug` request parameter to true shows verbose cURL output instead of using the LogPlugin +* Added the ability to combine URLs using strict RFC 3986 compliance +* Command objects can now return the validation errors encountered by the command +* Various fixes to cache revalidation (#437 and 29797e5) +* Various fixes to the AsyncPlugin +* Cleaned up build scripts + +## 3.7.4 - 2013-10-02 + +* Bug fix: 0 is now an allowed value in a description parameter that has a default value (#430) +* Bug fix: SchemaFormatter now returns an integer when formatting to a Unix timestamp + (see https://github.com/aws/aws-sdk-php/issues/147) +* Bug fix: Cleaned up and fixed URL dot segment removal to properly resolve internal dots +* Minimum PHP version is now properly specified as 5.3.3 (up from 5.3.2) (#420) +* Updated the bundled cacert.pem (#419) +* OauthPlugin now supports adding authentication to headers or query string (#425) + +## 3.7.3 - 2013-09-08 + +* Added the ability to get the exception associated with a request/command when using `MultiTransferException` and + `CommandTransferException`. +* Setting `additionalParameters` of a response to false is now honored when parsing responses with a service description +* Schemas are only injected into response models when explicitly configured. +* No longer guessing Content-Type based on the path of a request. Content-Type is now only guessed based on the path of + an EntityBody. +* Bug fix: ChunkedIterator can now properly chunk a \Traversable as well as an \Iterator. +* Bug fix: FilterIterator now relies on `\Iterator` instead of `\Traversable`. +* Bug fix: Gracefully handling malformed responses in RequestMediator::writeResponseBody() +* Bug fix: Replaced call to canCache with canCacheRequest in the CallbackCanCacheStrategy of the CachePlugin +* Bug fix: Visiting XML attributes first before visiting XML children when serializing requests +* Bug fix: Properly parsing headers that contain commas contained in quotes +* Bug fix: mimetype guessing based on a filename is now case-insensitive + +## 3.7.2 - 2013-08-02 + +* Bug fix: Properly URL encoding paths when using the PHP-only version of the UriTemplate expander + See https://github.com/guzzle/guzzle/issues/371 +* Bug fix: Cookie domains are now matched correctly according to RFC 6265 + See https://github.com/guzzle/guzzle/issues/377 +* Bug fix: GET parameters are now used when calculating an OAuth signature +* Bug fix: Fixed an issue with cache revalidation where the If-None-Match header was being double quoted +* `Guzzle\Common\AbstractHasDispatcher::dispatch()` now returns the event that was dispatched +* `Guzzle\Http\QueryString::factory()` now guesses the most appropriate query aggregator to used based on the input. + See https://github.com/guzzle/guzzle/issues/379 +* Added a way to add custom domain objects to service description parsing using the `operation.parse_class` event. See + https://github.com/guzzle/guzzle/pull/380 +* cURL multi cleanup and optimizations + +## 3.7.1 - 2013-07-05 + +* Bug fix: Setting default options on a client now works +* Bug fix: Setting options on HEAD requests now works. See #352 +* Bug fix: Moving stream factory before send event to before building the stream. See #353 +* Bug fix: Cookies no longer match on IP addresses per RFC 6265 +* Bug fix: Correctly parsing header parameters that are in `<>` and quotes +* Added `cert` and `ssl_key` as request options +* `Host` header can now diverge from the host part of a URL if the header is set manually +* `Guzzle\Service\Command\LocationVisitor\Request\XmlVisitor` was rewritten to change from using SimpleXML to XMLWriter +* OAuth parameters are only added via the plugin if they aren't already set +* Exceptions are now thrown when a URL cannot be parsed +* Returning `false` if `Guzzle\Http\EntityBody::getContentMd5()` fails +* Not setting a `Content-MD5` on a command if calculating the Content-MD5 fails via the CommandContentMd5Plugin + +## 3.7.0 - 2013-06-10 + +* See UPGRADING.md for more information on how to upgrade. +* Requests now support the ability to specify an array of $options when creating a request to more easily modify a + request. You can pass a 'request.options' configuration setting to a client to apply default request options to + every request created by a client (e.g. default query string variables, headers, curl options, etc.). +* Added a static facade class that allows you to use Guzzle with static methods and mount the class to `\Guzzle`. + See `Guzzle\Http\StaticClient::mount`. +* Added `command.request_options` to `Guzzle\Service\Command\AbstractCommand` to pass request options to requests + created by a command (e.g. custom headers, query string variables, timeout settings, etc.). +* Stream size in `Guzzle\Stream\PhpStreamRequestFactory` will now be set if Content-Length is returned in the + headers of a response +* Added `Guzzle\Common\Collection::setPath($path, $value)` to set a value into an array using a nested key + (e.g. `$collection->setPath('foo/baz/bar', 'test'); echo $collection['foo']['bar']['bar'];`) +* ServiceBuilders now support storing and retrieving arbitrary data +* CachePlugin can now purge all resources for a given URI +* CachePlugin can automatically purge matching cached items when a non-idempotent request is sent to a resource +* CachePlugin now uses the Vary header to determine if a resource is a cache hit +* `Guzzle\Http\Message\Response` now implements `\Serializable` +* Added `Guzzle\Cache\CacheAdapterFactory::fromCache()` to more easily create cache adapters +* `Guzzle\Service\ClientInterface::execute()` now accepts an array, single command, or Traversable +* Fixed a bug in `Guzzle\Http\Message\Header\Link::addLink()` +* Better handling of calculating the size of a stream in `Guzzle\Stream\Stream` using fstat() and caching the size +* `Guzzle\Common\Exception\ExceptionCollection` now creates a more readable exception message +* Fixing BC break: Added back the MonologLogAdapter implementation rather than extending from PsrLog so that older + Symfony users can still use the old version of Monolog. +* Fixing BC break: Added the implementation back in for `Guzzle\Http\Message\AbstractMessage::getTokenizedHeader()`. + Now triggering an E_USER_DEPRECATED warning when used. Use `$message->getHeader()->parseParams()`. +* Several performance improvements to `Guzzle\Common\Collection` +* Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`: + createRequest, head, delete, put, patch, post, options, prepareRequest +* Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()` +* Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface` +* Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to + `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a + resource, string, or EntityBody into the $options parameter to specify the download location of the response. +* Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a + default `array()` +* Added `Guzzle\Stream\StreamInterface::isRepeatable` +* Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use + $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or + $client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))`. +* Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use $client->getConfig()->getPath('request.options/headers')`. +* Removed `Guzzle\Http\ClientInterface::expandTemplate()` +* Removed `Guzzle\Http\ClientInterface::setRequestFactory()` +* Removed `Guzzle\Http\ClientInterface::getCurlMulti()` +* Removed `Guzzle\Http\Message\RequestInterface::canCache` +* Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect` +* Removed `Guzzle\Http\Message\RequestInterface::isRedirect` +* Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods. +* You can now enable E_USER_DEPRECATED warnings to see if you are using a deprecated method by setting + `Guzzle\Common\Version::$emitWarnings` to true. +* Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use + `$request->getResponseBody()->isRepeatable()` instead. +* Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use + `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +* Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use + `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +* Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead. +* Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead. +* Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated +* Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. + These will work through Guzzle 4.0 +* Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use [request.options][params]. +* Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client. +* Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use $client->getConfig()->getPath('request.options/headers')`. +* Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. +* Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8. +* Marked `Guzzle\Common\Collection::inject()` as deprecated. +* Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest');` +* CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a + CacheStorageInterface. These two objects and interface will be removed in a future version. +* Always setting X-cache headers on cached responses +* Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin +* `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface + $request, Response $response);` +* `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);` +* `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);` +* Added `CacheStorageInterface::purge($url)` +* `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin + $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache, + CanCacheStrategyInterface $canCache = null)` +* Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)` + +## 3.6.0 - 2013-05-29 + +* ServiceDescription now implements ToArrayInterface +* Added command.hidden_params to blacklist certain headers from being treated as additionalParameters +* Guzzle can now correctly parse incomplete URLs +* Mixed casing of headers are now forced to be a single consistent casing across all values for that header. +* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution +* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader(). +* Specific header implementations can be created for complex headers. When a message creates a header, it uses a + HeaderFactory which can map specific headers to specific header classes. There is now a Link header and + CacheControl header implementation. +* Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate +* Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti() +* Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in + Guzzle\Http\Curl\RequestMediator +* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string. +* Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface +* Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders() +* Removed Guzzle\Parser\ParserRegister::get(). Use getParser() +* Removed Guzzle\Parser\ParserRegister::set(). Use registerParser(). +* All response header helper functions return a string rather than mixing Header objects and strings inconsistently +* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle + directly via interfaces +* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist + but are a no-op until removed. +* Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a + `Guzzle\Service\Command\ArrayCommandInterface`. +* Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response + on a request while the request is still being transferred +* The ability to case-insensitively search for header values +* Guzzle\Http\Message\Header::hasExactHeader +* Guzzle\Http\Message\Header::raw. Use getAll() +* Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object + instead. +* `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess +* Added the ability to cast Model objects to a string to view debug information. + +## 3.5.0 - 2013-05-13 + +* Bug: Fixed a regression so that request responses are parsed only once per oncomplete event rather than multiple times +* Bug: Better cleanup of one-time events across the board (when an event is meant to fire once, it will now remove + itself from the EventDispatcher) +* Bug: `Guzzle\Log\MessageFormatter` now properly writes "total_time" and "connect_time" values +* Bug: Cloning an EntityEnclosingRequest now clones the EntityBody too +* Bug: Fixed an undefined index error when parsing nested JSON responses with a sentAs parameter that reference a + non-existent key +* Bug: All __call() method arguments are now required (helps with mocking frameworks) +* Deprecating Response::getRequest() and now using a shallow clone of a request object to remove a circular reference + to help with refcount based garbage collection of resources created by sending a request +* Deprecating ZF1 cache and log adapters. These will be removed in the next major version. +* Deprecating `Response::getPreviousResponse()` (method signature still exists, but it's deprecated). Use the + HistoryPlugin for a history. +* Added a `responseBody` alias for the `response_body` location +* Refactored internals to no longer rely on Response::getRequest() +* HistoryPlugin can now be cast to a string +* HistoryPlugin now logs transactions rather than requests and responses to more accurately keep track of the requests + and responses that are sent over the wire +* Added `getEffectiveUrl()` and `getRedirectCount()` to Response objects + +## 3.4.3 - 2013-04-30 + +* Bug fix: Fixing bug introduced in 3.4.2 where redirect responses are duplicated on the final redirected response +* Added a check to re-extract the temp cacert bundle from the phar before sending each request + +## 3.4.2 - 2013-04-29 + +* Bug fix: Stream objects now work correctly with "a" and "a+" modes +* Bug fix: Removing `Transfer-Encoding: chunked` header when a Content-Length is present +* Bug fix: AsyncPlugin no longer forces HEAD requests +* Bug fix: DateTime timezones are now properly handled when using the service description schema formatter +* Bug fix: CachePlugin now properly handles stale-if-error directives when a request to the origin server fails +* Setting a response on a request will write to the custom request body from the response body if one is specified +* LogPlugin now writes to php://output when STDERR is undefined +* Added the ability to set multiple POST files for the same key in a single call +* application/x-www-form-urlencoded POSTs now use the utf-8 charset by default +* Added the ability to queue CurlExceptions to the MockPlugin +* Cleaned up how manual responses are queued on requests (removed "queued_response" and now using request.before_send) +* Configuration loading now allows remote files + +## 3.4.1 - 2013-04-16 + +* Large refactoring to how CurlMulti handles work. There is now a proxy that sits in front of a pool of CurlMulti + handles. This greatly simplifies the implementation, fixes a couple bugs, and provides a small performance boost. +* Exceptions are now properly grouped when sending requests in parallel +* Redirects are now properly aggregated when a multi transaction fails +* Redirects now set the response on the original object even in the event of a failure +* Bug fix: Model names are now properly set even when using $refs +* Added support for PHP 5.5's CurlFile to prevent warnings with the deprecated @ syntax +* Added support for oauth_callback in OAuth signatures +* Added support for oauth_verifier in OAuth signatures +* Added support to attempt to retrieve a command first literally, then ucfirst, the with inflection + +## 3.4.0 - 2013-04-11 + +* Bug fix: URLs are now resolved correctly based on https://tools.ietf.org/html/rfc3986#section-5.2. #289 +* Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289 +* Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263 +* Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264. +* Bug fix: Added `number` type to service descriptions. +* Bug fix: empty parameters are removed from an OAuth signature +* Bug fix: Revalidating a cache entry prefers the Last-Modified over the Date header +* Bug fix: Fixed "array to string" error when validating a union of types in a service description +* Bug fix: Removed code that attempted to determine the size of a stream when data is written to the stream +* Bug fix: Not including an `oauth_token` if the value is null in the OauthPlugin. +* Bug fix: Now correctly aggregating successful requests and failed requests in CurlMulti when a redirect occurs. +* The new default CURLOPT_TIMEOUT setting has been increased to 150 seconds so that Guzzle works on poor connections. +* Added a feature to EntityEnclosingRequest::setBody() that will automatically set the Content-Type of the request if + the Content-Type can be determined based on the entity body or the path of the request. +* Added the ability to overwrite configuration settings in a client when grabbing a throwaway client from a builder. +* Added support for a PSR-3 LogAdapter. +* Added a `command.after_prepare` event +* Added `oauth_callback` parameter to the OauthPlugin +* Added the ability to create a custom stream class when using a stream factory +* Added a CachingEntityBody decorator +* Added support for `additionalParameters` in service descriptions to define how custom parameters are serialized. +* The bundled SSL certificate is now provided in the phar file and extracted when running Guzzle from a phar. +* You can now send any EntityEnclosingRequest with POST fields or POST files and cURL will handle creating bodies +* POST requests using a custom entity body are now treated exactly like PUT requests but with a custom cURL method. This + means that the redirect behavior of POST requests with custom bodies will not be the same as POST requests that use + POST fields or files (the latter is only used when emulating a form POST in the browser). +* Lots of cleanup to CurlHandle::factory and RequestFactory::createRequest + +## 3.3.1 - 2013-03-10 + +* Added the ability to create PHP streaming responses from HTTP requests +* Bug fix: Running any filters when parsing response headers with service descriptions +* Bug fix: OauthPlugin fixes to allow for multi-dimensional array signing, and sorting parameters before signing +* Bug fix: Removed the adding of default empty arrays and false Booleans to responses in order to be consistent across + response location visitors. +* Bug fix: Removed the possibility of creating configuration files with circular dependencies +* RequestFactory::create() now uses the key of a POST file when setting the POST file name +* Added xmlAllowEmpty to serialize an XML body even if no XML specific parameters are set + +## 3.3.0 - 2013-03-03 + +* A large number of performance optimizations have been made +* Bug fix: Added 'wb' as a valid write mode for streams +* Bug fix: `Guzzle\Http\Message\Response::json()` now allows scalar values to be returned +* Bug fix: Fixed bug in `Guzzle\Http\Message\Response` where wrapping quotes were stripped from `getEtag()` +* BC: Removed `Guzzle\Http\Utils` class +* BC: Setting a service description on a client will no longer modify the client's command factories. +* BC: Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using + the 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io' +* BC: `Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getSteamType()` are no longer converted to + lowercase +* Operation parameter objects are now lazy loaded internally +* Added ErrorResponsePlugin that can throw errors for responses defined in service description operations' errorResponses +* Added support for instantiating responseType=class responseClass classes. Classes must implement + `Guzzle\Service\Command\ResponseClassInterface` +* Added support for additionalProperties for top-level parameters in responseType=model responseClasses. These + additional properties also support locations and can be used to parse JSON responses where the outermost part of the + JSON is an array +* Added support for nested renaming of JSON models (rename sentAs to name) +* CachePlugin + * Added support for stale-if-error so that the CachePlugin can now serve stale content from the cache on error + * Debug headers can now added to cached response in the CachePlugin + +## 3.2.0 - 2013-02-14 + +* CurlMulti is no longer reused globally. A new multi object is created per-client. This helps to isolate clients. +* URLs with no path no longer contain a "/" by default +* Guzzle\Http\QueryString does no longer manages the leading "?". This is now handled in Guzzle\Http\Url. +* BadResponseException no longer includes the full request and response message +* Adding setData() to Guzzle\Service\Description\ServiceDescriptionInterface +* Adding getResponseBody() to Guzzle\Http\Message\RequestInterface +* Various updates to classes to use ServiceDescriptionInterface type hints rather than ServiceDescription +* Header values can now be normalized into distinct values when multiple headers are combined with a comma separated list +* xmlEncoding can now be customized for the XML declaration of a XML service description operation +* Guzzle\Http\QueryString now uses Guzzle\Http\QueryAggregator\QueryAggregatorInterface objects to add custom value + aggregation and no longer uses callbacks +* The URL encoding implementation of Guzzle\Http\QueryString can now be customized +* Bug fix: Filters were not always invoked for array service description parameters +* Bug fix: Redirects now use a target response body rather than a temporary response body +* Bug fix: The default exponential backoff BackoffPlugin was not giving when the request threshold was exceeded +* Bug fix: Guzzle now takes the first found value when grabbing Cache-Control directives + +## 3.1.2 - 2013-01-27 + +* Refactored how operation responses are parsed. Visitors now include a before() method responsible for parsing the + response body. For example, the XmlVisitor now parses the XML response into an array in the before() method. +* Fixed an issue where cURL would not automatically decompress responses when the Accept-Encoding header was sent +* CURLOPT_SSL_VERIFYHOST is never set to 1 because it is deprecated (see 5e0ff2ef20f839e19d1eeb298f90ba3598784444) +* Fixed a bug where redirect responses were not chained correctly using getPreviousResponse() +* Setting default headers on a client after setting the user-agent will not erase the user-agent setting + +## 3.1.1 - 2013-01-20 + +* Adding wildcard support to Guzzle\Common\Collection::getPath() +* Adding alias support to ServiceBuilder configs +* Adding Guzzle\Service\Resource\CompositeResourceIteratorFactory and cleaning up factory interface + +## 3.1.0 - 2013-01-12 + +* BC: CurlException now extends from RequestException rather than BadResponseException +* BC: Renamed Guzzle\Plugin\Cache\CanCacheStrategyInterface::canCache() to canCacheRequest() and added CanCacheResponse() +* Added getData to ServiceDescriptionInterface +* Added context array to RequestInterface::setState() +* Bug: Removing hard dependency on the BackoffPlugin from Guzzle\Http +* Bug: Adding required content-type when JSON request visitor adds JSON to a command +* Bug: Fixing the serialization of a service description with custom data +* Made it easier to deal with exceptions thrown when transferring commands or requests in parallel by providing + an array of successful and failed responses +* Moved getPath from Guzzle\Service\Resource\Model to Guzzle\Common\Collection +* Added Guzzle\Http\IoEmittingEntityBody +* Moved command filtration from validators to location visitors +* Added `extends` attributes to service description parameters +* Added getModels to ServiceDescriptionInterface + +## 3.0.7 - 2012-12-19 + +* Fixing phar detection when forcing a cacert to system if null or true +* Allowing filename to be passed to `Guzzle\Http\Message\Request::setResponseBody()` +* Cleaning up `Guzzle\Common\Collection::inject` method +* Adding a response_body location to service descriptions + +## 3.0.6 - 2012-12-09 + +* CurlMulti performance improvements +* Adding setErrorResponses() to Operation +* composer.json tweaks + +## 3.0.5 - 2012-11-18 + +* Bug: Fixing an infinite recursion bug caused from revalidating with the CachePlugin +* Bug: Response body can now be a string containing "0" +* Bug: Using Guzzle inside of a phar uses system by default but now allows for a custom cacert +* Bug: QueryString::fromString now properly parses query string parameters that contain equal signs +* Added support for XML attributes in service description responses +* DefaultRequestSerializer now supports array URI parameter values for URI template expansion +* Added better mimetype guessing to requests and post files + +## 3.0.4 - 2012-11-11 + +* Bug: Fixed a bug when adding multiple cookies to a request to use the correct glue value +* Bug: Cookies can now be added that have a name, domain, or value set to "0" +* Bug: Using the system cacert bundle when using the Phar +* Added json and xml methods to Response to make it easier to parse JSON and XML response data into data structures +* Enhanced cookie jar de-duplication +* Added the ability to enable strict cookie jars that throw exceptions when invalid cookies are added +* Added setStream to StreamInterface to actually make it possible to implement custom rewind behavior for entity bodies +* Added the ability to create any sort of hash for a stream rather than just an MD5 hash + +## 3.0.3 - 2012-11-04 + +* Implementing redirects in PHP rather than cURL +* Added PECL URI template extension and using as default parser if available +* Bug: Fixed Content-Length parsing of Response factory +* Adding rewind() method to entity bodies and streams. Allows for custom rewinding of non-repeatable streams. +* Adding ToArrayInterface throughout library +* Fixing OauthPlugin to create unique nonce values per request + +## 3.0.2 - 2012-10-25 + +* Magic methods are enabled by default on clients +* Magic methods return the result of a command +* Service clients no longer require a base_url option in the factory +* Bug: Fixed an issue with URI templates where null template variables were being expanded + +## 3.0.1 - 2012-10-22 + +* Models can now be used like regular collection objects by calling filter, map, etc. +* Models no longer require a Parameter structure or initial data in the constructor +* Added a custom AppendIterator to get around a PHP bug with the `\AppendIterator` + +## 3.0.0 - 2012-10-15 + +* Rewrote service description format to be based on Swagger + * Now based on JSON schema + * Added nested input structures and nested response models + * Support for JSON and XML input and output models + * Renamed `commands` to `operations` + * Removed dot class notation + * Removed custom types +* Broke the project into smaller top-level namespaces to be more component friendly +* Removed support for XML configs and descriptions. Use arrays or JSON files. +* Removed the Validation component and Inspector +* Moved all cookie code to Guzzle\Plugin\Cookie +* Magic methods on a Guzzle\Service\Client now return the command un-executed. +* Calling getResult() or getResponse() on a command will lazily execute the command if needed. +* Now shipping with cURL's CA certs and using it by default +* Added previousResponse() method to response objects +* No longer sending Accept and Accept-Encoding headers on every request +* Only sending an Expect header by default when a payload is greater than 1MB +* Added/moved client options: + * curl.blacklist to curl.option.blacklist + * Added ssl.certificate_authority +* Added a Guzzle\Iterator component +* Moved plugins from Guzzle\Http\Plugin to Guzzle\Plugin +* Added a more robust backoff retry strategy (replaced the ExponentialBackoffPlugin) +* Added a more robust caching plugin +* Added setBody to response objects +* Updating LogPlugin to use a more flexible MessageFormatter +* Added a completely revamped build process +* Cleaning up Collection class and removing default values from the get method +* Fixed ZF2 cache adapters + +## 2.8.8 - 2012-10-15 + +* Bug: Fixed a cookie issue that caused dot prefixed domains to not match where popular browsers did + +## 2.8.7 - 2012-09-30 + +* Bug: Fixed config file aliases for JSON includes +* Bug: Fixed cookie bug on a request object by using CookieParser to parse cookies on requests +* Bug: Removing the path to a file when sending a Content-Disposition header on a POST upload +* Bug: Hardening request and response parsing to account for missing parts +* Bug: Fixed PEAR packaging +* Bug: Fixed Request::getInfo +* Bug: Fixed cases where CURLM_CALL_MULTI_PERFORM return codes were causing curl transactions to fail +* Adding the ability for the namespace Iterator factory to look in multiple directories +* Added more getters/setters/removers from service descriptions +* Added the ability to remove POST fields from OAuth signatures +* OAuth plugin now supports 2-legged OAuth + +## 2.8.6 - 2012-09-05 + +* Added the ability to modify and build service descriptions +* Added the use of visitors to apply parameters to locations in service descriptions using the dynamic command +* Added a `json` parameter location +* Now allowing dot notation for classes in the CacheAdapterFactory +* Using the union of two arrays rather than an array_merge when extending service builder services and service params +* Ensuring that a service is a string before doing strpos() checks on it when substituting services for references + in service builder config files. +* Services defined in two different config files that include one another will by default replace the previously + defined service, but you can now create services that extend themselves and merge their settings over the previous +* The JsonLoader now supports aliasing filenames with different filenames. This allows you to alias something like + '_default' with a default JSON configuration file. + +## 2.8.5 - 2012-08-29 + +* Bug: Suppressed empty arrays from URI templates +* Bug: Added the missing $options argument from ServiceDescription::factory to enable caching +* Added support for HTTP responses that do not contain a reason phrase in the start-line +* AbstractCommand commands are now invokable +* Added a way to get the data used when signing an Oauth request before a request is sent + +## 2.8.4 - 2012-08-15 + +* Bug: Custom delay time calculations are no longer ignored in the ExponentialBackoffPlugin +* Added the ability to transfer entity bodies as a string rather than streamed. This gets around curl error 65. Set `body_as_string` in a request's curl options to enable. +* Added a StreamInterface, EntityBodyInterface, and added ftell() to Guzzle\Common\Stream +* Added an AbstractEntityBodyDecorator and a ReadLimitEntityBody decorator to transfer only a subset of a decorated stream +* Stream and EntityBody objects will now return the file position to the previous position after a read required operation (e.g. getContentMd5()) +* Added additional response status codes +* Removed SSL information from the default User-Agent header +* DELETE requests can now send an entity body +* Added an EventDispatcher to the ExponentialBackoffPlugin and added an ExponentialBackoffLogger to log backoff retries +* Added the ability of the MockPlugin to consume mocked request bodies +* LogPlugin now exposes request and response objects in the extras array + +## 2.8.3 - 2012-07-30 + +* Bug: Fixed a case where empty POST requests were sent as GET requests +* Bug: Fixed a bug in ExponentialBackoffPlugin that caused fatal errors when retrying an EntityEnclosingRequest that does not have a body +* Bug: Setting the response body of a request to null after completing a request, not when setting the state of a request to new +* Added multiple inheritance to service description commands +* Added an ApiCommandInterface and added `getParamNames()` and `hasParam()` +* Removed the default 2mb size cutoff from the Md5ValidatorPlugin so that it now defaults to validating everything +* Changed CurlMulti::perform to pass a smaller timeout to CurlMulti::executeHandles + +## 2.8.2 - 2012-07-24 + +* Bug: Query string values set to 0 are no longer dropped from the query string +* Bug: A Collection object is no longer created each time a call is made to `Guzzle\Service\Command\AbstractCommand::getRequestHeaders()` +* Bug: `+` is now treated as an encoded space when parsing query strings +* QueryString and Collection performance improvements +* Allowing dot notation for class paths in filters attribute of a service descriptions + +## 2.8.1 - 2012-07-16 + +* Loosening Event Dispatcher dependency +* POST redirects can now be customized using CURLOPT_POSTREDIR + +## 2.8.0 - 2012-07-15 + +* BC: Guzzle\Http\Query + * Query strings with empty variables will always show an equal sign unless the variable is set to QueryString::BLANK (e.g. ?acl= vs ?acl) + * Changed isEncodingValues() and isEncodingFields() to isUrlEncoding() + * Changed setEncodeValues(bool) and setEncodeFields(bool) to useUrlEncoding(bool) + * Changed the aggregation functions of QueryString to be static methods + * Can now use fromString() with querystrings that have a leading ? +* cURL configuration values can be specified in service descriptions using `curl.` prefixed parameters +* Content-Length is set to 0 before emitting the request.before_send event when sending an empty request body +* Cookies are no longer URL decoded by default +* Bug: URI template variables set to null are no longer expanded + +## 2.7.2 - 2012-07-02 + +* BC: Moving things to get ready for subtree splits. Moving Inflection into Common. Moving Guzzle\Http\Parser to Guzzle\Parser. +* BC: Removing Guzzle\Common\Batch\Batch::count() and replacing it with isEmpty() +* CachePlugin now allows for a custom request parameter function to check if a request can be cached +* Bug fix: CachePlugin now only caches GET and HEAD requests by default +* Bug fix: Using header glue when transferring headers over the wire +* Allowing deeply nested arrays for composite variables in URI templates +* Batch divisors can now return iterators or arrays + +## 2.7.1 - 2012-06-26 + +* Minor patch to update version number in UA string +* Updating build process + +## 2.7.0 - 2012-06-25 + +* BC: Inflection classes moved to Guzzle\Inflection. No longer static methods. Can now inject custom inflectors into classes. +* BC: Removed magic setX methods from commands +* BC: Magic methods mapped to service description commands are now inflected in the command factory rather than the client __call() method +* Verbose cURL options are no longer enabled by default. Set curl.debug to true on a client to enable. +* Bug: Now allowing colons in a response start-line (e.g. HTTP/1.1 503 Service Unavailable: Back-end server is at capacity) +* Guzzle\Service\Resource\ResourceIteratorApplyBatched now internally uses the Guzzle\Common\Batch namespace +* Added Guzzle\Service\Plugin namespace and a PluginCollectionPlugin +* Added the ability to set POST fields and files in a service description +* Guzzle\Http\EntityBody::factory() now accepts objects with a __toString() method +* Adding a command.before_prepare event to clients +* Added BatchClosureTransfer and BatchClosureDivisor +* BatchTransferException now includes references to the batch divisor and transfer strategies +* Fixed some tests so that they pass more reliably +* Added Guzzle\Common\Log\ArrayLogAdapter + +## 2.6.6 - 2012-06-10 + +* BC: Removing Guzzle\Http\Plugin\BatchQueuePlugin +* BC: Removing Guzzle\Service\Command\CommandSet +* Adding generic batching system (replaces the batch queue plugin and command set) +* Updating ZF cache and log adapters and now using ZF's composer repository +* Bug: Setting the name of each ApiParam when creating through an ApiCommand +* Adding result_type, result_doc, deprecated, and doc_url to service descriptions +* Bug: Changed the default cookie header casing back to 'Cookie' + +## 2.6.5 - 2012-06-03 + +* BC: Renaming Guzzle\Http\Message\RequestInterface::getResourceUri() to getResource() +* BC: Removing unused AUTH_BASIC and AUTH_DIGEST constants from +* BC: Guzzle\Http\Cookie is now used to manage Set-Cookie data, not Cookie data +* BC: Renaming methods in the CookieJarInterface +* Moving almost all cookie logic out of the CookiePlugin and into the Cookie or CookieJar implementations +* Making the default glue for HTTP headers ';' instead of ',' +* Adding a removeValue to Guzzle\Http\Message\Header +* Adding getCookies() to request interface. +* Making it easier to add event subscribers to HasDispatcherInterface classes. Can now directly call addSubscriber() + +## 2.6.4 - 2012-05-30 + +* BC: Cleaning up how POST files are stored in EntityEnclosingRequest objects. Adding PostFile class. +* BC: Moving ApiCommand specific functionality from the Inspector and on to the ApiCommand +* Bug: Fixing magic method command calls on clients +* Bug: Email constraint only validates strings +* Bug: Aggregate POST fields when POST files are present in curl handle +* Bug: Fixing default User-Agent header +* Bug: Only appending or prepending parameters in commands if they are specified +* Bug: Not requiring response reason phrases or status codes to match a predefined list of codes +* Allowing the use of dot notation for class namespaces when using instance_of constraint +* Added any_match validation constraint +* Added an AsyncPlugin +* Passing request object to the calculateWait method of the ExponentialBackoffPlugin +* Allowing the result of a command object to be changed +* Parsing location and type sub values when instantiating a service description rather than over and over at runtime + +## 2.6.3 - 2012-05-23 + +* [BC] Guzzle\Common\FromConfigInterface no longer requires any config options. +* [BC] Refactoring how POST files are stored on an EntityEnclosingRequest. They are now separate from POST fields. +* You can now use an array of data when creating PUT request bodies in the request factory. +* Removing the requirement that HTTPS requests needed a Cache-Control: public directive to be cacheable. +* [Http] Adding support for Content-Type in multipart POST uploads per upload +* [Http] Added support for uploading multiple files using the same name (foo[0], foo[1]) +* Adding more POST data operations for easier manipulation of POST data. +* You can now set empty POST fields. +* The body of a request is only shown on EntityEnclosingRequest objects that do not use POST files. +* Split the Guzzle\Service\Inspector::validateConfig method into two methods. One to initialize when a command is created, and one to validate. +* CS updates + +## 2.6.2 - 2012-05-19 + +* [Http] Better handling of nested scope requests in CurlMulti. Requests are now always prepares in the send() method rather than the addRequest() method. + +## 2.6.1 - 2012-05-19 + +* [BC] Removing 'path' support in service descriptions. Use 'uri'. +* [BC] Guzzle\Service\Inspector::parseDocBlock is now protected. Adding getApiParamsForClass() with cache. +* [BC] Removing Guzzle\Common\NullObject. Use https://github.com/mtdowling/NullObject if you need it. +* [BC] Removing Guzzle\Common\XmlElement. +* All commands, both dynamic and concrete, have ApiCommand objects. +* Adding a fix for CurlMulti so that if all of the connections encounter some sort of curl error, then the loop exits. +* Adding checks to EntityEnclosingRequest so that empty POST files and fields are ignored. +* Making the method signature of Guzzle\Service\Builder\ServiceBuilder::factory more flexible. + +## 2.6.0 - 2012-05-15 + +* [BC] Moving Guzzle\Service\Builder to Guzzle\Service\Builder\ServiceBuilder +* [BC] Executing a Command returns the result of the command rather than the command +* [BC] Moving all HTTP parsing logic to Guzzle\Http\Parsers. Allows for faster C implementations if needed. +* [BC] Changing the Guzzle\Http\Message\Response::setProtocol() method to accept a protocol and version in separate args. +* [BC] Moving ResourceIterator* to Guzzle\Service\Resource +* [BC] Completely refactored ResourceIterators to iterate over a cloned command object +* [BC] Moved Guzzle\Http\UriTemplate to Guzzle\Http\Parser\UriTemplate\UriTemplate +* [BC] Guzzle\Guzzle is now deprecated +* Moving Guzzle\Common\Guzzle::inject to Guzzle\Common\Collection::inject +* Adding Guzzle\Version class to give version information about Guzzle +* Adding Guzzle\Http\Utils class to provide getDefaultUserAgent() and getHttpDate() +* Adding Guzzle\Curl\CurlVersion to manage caching curl_version() data +* ServiceDescription and ServiceBuilder are now cacheable using similar configs +* Changing the format of XML and JSON service builder configs. Backwards compatible. +* Cleaned up Cookie parsing +* Trimming the default Guzzle User-Agent header +* Adding a setOnComplete() method to Commands that is called when a command completes +* Keeping track of requests that were mocked in the MockPlugin +* Fixed a caching bug in the CacheAdapterFactory +* Inspector objects can be injected into a Command object +* Refactoring a lot of code and tests to be case insensitive when dealing with headers +* Adding Guzzle\Http\Message\HeaderComparison for easy comparison of HTTP headers using a DSL +* Adding the ability to set global option overrides to service builder configs +* Adding the ability to include other service builder config files from within XML and JSON files +* Moving the parseQuery method out of Url and on to QueryString::fromString() as a static factory method. + +## 2.5.0 - 2012-05-08 + +* Major performance improvements +* [BC] Simplifying Guzzle\Common\Collection. Please check to see if you are using features that are now deprecated. +* [BC] Using a custom validation system that allows a flyweight implementation for much faster validation. No longer using Symfony2 Validation component. +* [BC] No longer supporting "{{ }}" for injecting into command or UriTemplates. Use "{}" +* Added the ability to passed parameters to all requests created by a client +* Added callback functionality to the ExponentialBackoffPlugin +* Using microtime in ExponentialBackoffPlugin to allow more granular backoff strategies. +* Rewinding request stream bodies when retrying requests +* Exception is thrown when JSON response body cannot be decoded +* Added configurable magic method calls to clients and commands. This is off by default. +* Fixed a defect that added a hash to every parsed URL part +* Fixed duplicate none generation for OauthPlugin. +* Emitting an event each time a client is generated by a ServiceBuilder +* Using an ApiParams object instead of a Collection for parameters of an ApiCommand +* cache.* request parameters should be renamed to params.cache.* +* Added the ability to set arbitrary curl options on requests (disable_wire, progress, etc.). See CurlHandle. +* Added the ability to disable type validation of service descriptions +* ServiceDescriptions and ServiceBuilders are now Serializable diff --git a/vendor/guzzlehttp/guzzle/LICENSE b/vendor/guzzlehttp/guzzle/LICENSE new file mode 100644 index 0000000..fd2375d --- /dev/null +++ b/vendor/guzzlehttp/guzzle/LICENSE @@ -0,0 +1,27 @@ +The MIT License (MIT) + +Copyright (c) 2011 Michael Dowling <mtdowling@gmail.com> +Copyright (c) 2012 Jeremy Lindblom <jeremeamia@gmail.com> +Copyright (c) 2014 Graham Campbell <hello@gjcampbell.co.uk> +Copyright (c) 2015 Márk Sági-Kazár <mark.sagikazar@gmail.com> +Copyright (c) 2015 Tobias Schultze <webmaster@tubo-world.de> +Copyright (c) 2016 Tobias Nyholm <tobias.nyholm@gmail.com> +Copyright (c) 2016 George Mponos <gmponos@gmail.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/guzzlehttp/guzzle/README.md b/vendor/guzzlehttp/guzzle/README.md new file mode 100644 index 0000000..f287fa9 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/README.md @@ -0,0 +1,94 @@ +![Guzzle](.github/logo.png?raw=true) + +# Guzzle, PHP HTTP client + +[![Latest Version](https://img.shields.io/github/release/guzzle/guzzle.svg?style=flat-square)](https://github.com/guzzle/guzzle/releases) +[![Build Status](https://img.shields.io/github/workflow/status/guzzle/guzzle/CI?label=ci%20build&style=flat-square)](https://github.com/guzzle/guzzle/actions?query=workflow%3ACI) +[![Total Downloads](https://img.shields.io/packagist/dt/guzzlehttp/guzzle.svg?style=flat-square)](https://packagist.org/packages/guzzlehttp/guzzle) + +Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and +trivial to integrate with web services. + +- Simple interface for building query strings, POST requests, streaming large + uploads, streaming large downloads, using HTTP cookies, uploading JSON data, + etc... +- Can send both synchronous and asynchronous requests using the same interface. +- Uses PSR-7 interfaces for requests, responses, and streams. This allows you + to utilize other PSR-7 compatible libraries with Guzzle. +- Supports PSR-18 allowing interoperability between other PSR-18 HTTP Clients. +- Abstracts away the underlying HTTP transport, allowing you to write + environment and transport agnostic code; i.e., no hard dependency on cURL, + PHP streams, sockets, or non-blocking event loops. +- Middleware system allows you to augment and compose client behavior. + +```php +$client = new \GuzzleHttp\Client(); +$response = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle'); + +echo $response->getStatusCode(); // 200 +echo $response->getHeaderLine('content-type'); // 'application/json; charset=utf8' +echo $response->getBody(); // '{"id": 1420053, "name": "guzzle", ...}' + +// Send an asynchronous request. +$request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org'); +$promise = $client->sendAsync($request)->then(function ($response) { + echo 'I completed! ' . $response->getBody(); +}); + +$promise->wait(); +``` + +## Help and docs + +We use GitHub issues only to discuss bugs and new features. For support please refer to: + +- [Documentation](https://docs.guzzlephp.org) +- [Stack Overflow](https://stackoverflow.com/questions/tagged/guzzle) +- [#guzzle](https://app.slack.com/client/T0D2S9JCT/CE6UAAKL4) channel on [PHP-HTTP Slack](https://slack.httplug.io/) +- [Gitter](https://gitter.im/guzzle/guzzle) + + +## Installing Guzzle + +The recommended way to install Guzzle is through +[Composer](https://getcomposer.org/). + +```bash +composer require guzzlehttp/guzzle +``` + + +## Version Guidance + +| Version | Status | Packagist | Namespace | Repo | Docs | PSR-7 | PHP Version | +|---------|----------------|---------------------|--------------|---------------------|---------------------|-------|--------------| +| 3.x | EOL | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >=5.3.3,<7.0 | +| 4.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >=5.4,<7.0 | +| 5.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >=5.4,<7.4 | +| 6.x | Security fixes | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >=5.5,<8.0 | +| 7.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v7][guzzle-7-repo] | [v7][guzzle-7-docs] | Yes | >=7.2.5,<8.2 | + +[guzzle-3-repo]: https://github.com/guzzle/guzzle3 +[guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x +[guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3 +[guzzle-6-repo]: https://github.com/guzzle/guzzle/tree/6.5 +[guzzle-7-repo]: https://github.com/guzzle/guzzle +[guzzle-3-docs]: https://guzzle3.readthedocs.io/ +[guzzle-5-docs]: https://docs.guzzlephp.org/en/5.3/ +[guzzle-6-docs]: https://docs.guzzlephp.org/en/6.5/ +[guzzle-7-docs]: https://docs.guzzlephp.org/en/latest/ + + +## Security + +If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/guzzle/security/policy) for more information. + +## License + +Guzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information. + +## For Enterprise + +Available as part of the Tidelift Subscription + +The maintainers of Guzzle and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-guzzlehttp-guzzle?utm_source=packagist-guzzlehttp-guzzle&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/vendor/guzzlehttp/guzzle/UPGRADING.md b/vendor/guzzlehttp/guzzle/UPGRADING.md new file mode 100644 index 0000000..45417a7 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/UPGRADING.md @@ -0,0 +1,1253 @@ +Guzzle Upgrade Guide +==================== + +6.0 to 7.0 +---------- + +In order to take advantage of the new features of PHP, Guzzle dropped the support +of PHP 5. The minimum supported PHP version is now PHP 7.2. Type hints and return +types for functions and methods have been added wherever possible. + +Please make sure: +- You are calling a function or a method with the correct type. +- If you extend a class of Guzzle; update all signatures on methods you override. + +#### Other backwards compatibility breaking changes + +- Class `GuzzleHttp\UriTemplate` is removed. +- Class `GuzzleHttp\Exception\SeekException` is removed. +- Classes `GuzzleHttp\Exception\BadResponseException`, `GuzzleHttp\Exception\ClientException`, + `GuzzleHttp\Exception\ServerException` can no longer be initialized with an empty + Response as argument. +- Class `GuzzleHttp\Exception\ConnectException` now extends `GuzzleHttp\Exception\TransferException` + instead of `GuzzleHttp\Exception\RequestException`. +- Function `GuzzleHttp\Exception\ConnectException::getResponse()` is removed. +- Function `GuzzleHttp\Exception\ConnectException::hasResponse()` is removed. +- Constant `GuzzleHttp\ClientInterface::VERSION` is removed. Added `GuzzleHttp\ClientInterface::MAJOR_VERSION` instead. +- Function `GuzzleHttp\Exception\RequestException::getResponseBodySummary` is removed. + Use `\GuzzleHttp\Psr7\get_message_body_summary` as an alternative. +- Function `GuzzleHttp\Cookie\CookieJar::getCookieValue` is removed. +- Request option `exception` is removed. Please use `http_errors`. +- Request option `save_to` is removed. Please use `sink`. +- Pool option `pool_size` is removed. Please use `concurrency`. +- We now look for environment variables in the `$_SERVER` super global, due to thread safety issues with `getenv`. We continue to fallback to `getenv` in CLI environments, for maximum compatibility. +- The `get`, `head`, `put`, `post`, `patch`, `delete`, `getAsync`, `headAsync`, `putAsync`, `postAsync`, `patchAsync`, and `deleteAsync` methods are now implemented as genuine methods on `GuzzleHttp\Client`, with strong typing. The original `__call` implementation remains unchanged for now, for maximum backwards compatibility, but won't be invoked under normal operation. +- The `log` middleware will log the errors with level `error` instead of `notice` +- Support for international domain names (IDN) is now disabled by default, and enabling it requires installing ext-intl, linked against a modern version of the C library (ICU 4.6 or higher). + +#### Native functions calls + +All internal native functions calls of Guzzle are now prefixed with a slash. This +change makes it impossible for method overloading by other libraries or applications. +Example: + +```php +// Before: +curl_version(); + +// After: +\curl_version(); +``` + +For the full diff you can check [here](https://github.com/guzzle/guzzle/compare/6.5.4..master). + +5.0 to 6.0 +---------- + +Guzzle now uses [PSR-7](https://www.php-fig.org/psr/psr-7/) for HTTP messages. +Due to the fact that these messages are immutable, this prompted a refactoring +of Guzzle to use a middleware based system rather than an event system. Any +HTTP message interaction (e.g., `GuzzleHttp\Message\Request`) need to be +updated to work with the new immutable PSR-7 request and response objects. Any +event listeners or subscribers need to be updated to become middleware +functions that wrap handlers (or are injected into a +`GuzzleHttp\HandlerStack`). + +- Removed `GuzzleHttp\BatchResults` +- Removed `GuzzleHttp\Collection` +- Removed `GuzzleHttp\HasDataTrait` +- Removed `GuzzleHttp\ToArrayInterface` +- The `guzzlehttp/streams` dependency has been removed. Stream functionality + is now present in the `GuzzleHttp\Psr7` namespace provided by the + `guzzlehttp/psr7` package. +- Guzzle no longer uses ReactPHP promises and now uses the + `guzzlehttp/promises` library. We use a custom promise library for three + significant reasons: + 1. React promises (at the time of writing this) are recursive. Promise + chaining and promise resolution will eventually blow the stack. Guzzle + promises are not recursive as they use a sort of trampolining technique. + Note: there has been movement in the React project to modify promises to + no longer utilize recursion. + 2. Guzzle needs to have the ability to synchronously block on a promise to + wait for a result. Guzzle promises allows this functionality (and does + not require the use of recursion). + 3. Because we need to be able to wait on a result, doing so using React + promises requires wrapping react promises with RingPHP futures. This + overhead is no longer needed, reducing stack sizes, reducing complexity, + and improving performance. +- `GuzzleHttp\Mimetypes` has been moved to a function in + `GuzzleHttp\Psr7\mimetype_from_extension` and + `GuzzleHttp\Psr7\mimetype_from_filename`. +- `GuzzleHttp\Query` and `GuzzleHttp\QueryParser` have been removed. Query + strings must now be passed into request objects as strings, or provided to + the `query` request option when creating requests with clients. The `query` + option uses PHP's `http_build_query` to convert an array to a string. If you + need a different serialization technique, you will need to pass the query + string in as a string. There are a couple helper functions that will make + working with query strings easier: `GuzzleHttp\Psr7\parse_query` and + `GuzzleHttp\Psr7\build_query`. +- Guzzle no longer has a dependency on RingPHP. Due to the use of a middleware + system based on PSR-7, using RingPHP and it's middleware system as well adds + more complexity than the benefits it provides. All HTTP handlers that were + present in RingPHP have been modified to work directly with PSR-7 messages + and placed in the `GuzzleHttp\Handler` namespace. This significantly reduces + complexity in Guzzle, removes a dependency, and improves performance. RingPHP + will be maintained for Guzzle 5 support, but will no longer be a part of + Guzzle 6. +- As Guzzle now uses a middleware based systems the event system and RingPHP + integration has been removed. Note: while the event system has been removed, + it is possible to add your own type of event system that is powered by the + middleware system. + - Removed the `Event` namespace. + - Removed the `Subscriber` namespace. + - Removed `Transaction` class + - Removed `RequestFsm` + - Removed `RingBridge` + - `GuzzleHttp\Subscriber\Cookie` is now provided by + `GuzzleHttp\Middleware::cookies` + - `GuzzleHttp\Subscriber\HttpError` is now provided by + `GuzzleHttp\Middleware::httpError` + - `GuzzleHttp\Subscriber\History` is now provided by + `GuzzleHttp\Middleware::history` + - `GuzzleHttp\Subscriber\Mock` is now provided by + `GuzzleHttp\Handler\MockHandler` + - `GuzzleHttp\Subscriber\Prepare` is now provided by + `GuzzleHttp\PrepareBodyMiddleware` + - `GuzzleHttp\Subscriber\Redirect` is now provided by + `GuzzleHttp\RedirectMiddleware` +- Guzzle now uses `Psr\Http\Message\UriInterface` (implements in + `GuzzleHttp\Psr7\Uri`) for URI support. `GuzzleHttp\Url` is now gone. +- Static functions in `GuzzleHttp\Utils` have been moved to namespaced + functions under the `GuzzleHttp` namespace. This requires either a Composer + based autoloader or you to include functions.php. +- `GuzzleHttp\ClientInterface::getDefaultOption` has been renamed to + `GuzzleHttp\ClientInterface::getConfig`. +- `GuzzleHttp\ClientInterface::setDefaultOption` has been removed. +- The `json` and `xml` methods of response objects has been removed. With the + migration to strictly adhering to PSR-7 as the interface for Guzzle messages, + adding methods to message interfaces would actually require Guzzle messages + to extend from PSR-7 messages rather then work with them directly. + +## Migrating to middleware + +The change to PSR-7 unfortunately required significant refactoring to Guzzle +due to the fact that PSR-7 messages are immutable. Guzzle 5 relied on an event +system from plugins. The event system relied on mutability of HTTP messages and +side effects in order to work. With immutable messages, you have to change your +workflow to become more about either returning a value (e.g., functional +middlewares) or setting a value on an object. Guzzle v6 has chosen the +functional middleware approach. + +Instead of using the event system to listen for things like the `before` event, +you now create a stack based middleware function that intercepts a request on +the way in and the promise of the response on the way out. This is a much +simpler and more predictable approach than the event system and works nicely +with PSR-7 middleware. Due to the use of promises, the middleware system is +also asynchronous. + +v5: + +```php +use GuzzleHttp\Event\BeforeEvent; +$client = new GuzzleHttp\Client(); +// Get the emitter and listen to the before event. +$client->getEmitter()->on('before', function (BeforeEvent $e) { + // Guzzle v5 events relied on mutation + $e->getRequest()->setHeader('X-Foo', 'Bar'); +}); +``` + +v6: + +In v6, you can modify the request before it is sent using the `mapRequest` +middleware. The idiomatic way in v6 to modify the request/response lifecycle is +to setup a handler middleware stack up front and inject the handler into a +client. + +```php +use GuzzleHttp\Middleware; +// Create a handler stack that has all of the default middlewares attached +$handler = GuzzleHttp\HandlerStack::create(); +// Push the handler onto the handler stack +$handler->push(Middleware::mapRequest(function (RequestInterface $request) { + // Notice that we have to return a request object + return $request->withHeader('X-Foo', 'Bar'); +})); +// Inject the handler into the client +$client = new GuzzleHttp\Client(['handler' => $handler]); +``` + +## POST Requests + +This version added the [`form_params`](http://guzzle.readthedocs.org/en/latest/request-options.html#form_params) +and `multipart` request options. `form_params` is an associative array of +strings or array of strings and is used to serialize an +`application/x-www-form-urlencoded` POST request. The +[`multipart`](http://guzzle.readthedocs.org/en/latest/request-options.html#multipart) +option is now used to send a multipart/form-data POST request. + +`GuzzleHttp\Post\PostFile` has been removed. Use the `multipart` option to add +POST files to a multipart/form-data request. + +The `body` option no longer accepts an array to send POST requests. Please use +`multipart` or `form_params` instead. + +The `base_url` option has been renamed to `base_uri`. + +4.x to 5.0 +---------- + +## Rewritten Adapter Layer + +Guzzle now uses [RingPHP](http://ringphp.readthedocs.org/en/latest) to send +HTTP requests. The `adapter` option in a `GuzzleHttp\Client` constructor +is still supported, but it has now been renamed to `handler`. Instead of +passing a `GuzzleHttp\Adapter\AdapterInterface`, you must now pass a PHP +`callable` that follows the RingPHP specification. + +## Removed Fluent Interfaces + +[Fluent interfaces were removed](https://ocramius.github.io/blog/fluent-interfaces-are-evil/) +from the following classes: + +- `GuzzleHttp\Collection` +- `GuzzleHttp\Url` +- `GuzzleHttp\Query` +- `GuzzleHttp\Post\PostBody` +- `GuzzleHttp\Cookie\SetCookie` + +## Removed functions.php + +Removed "functions.php", so that Guzzle is truly PSR-4 compliant. The following +functions can be used as replacements. + +- `GuzzleHttp\json_decode` -> `GuzzleHttp\Utils::jsonDecode` +- `GuzzleHttp\get_path` -> `GuzzleHttp\Utils::getPath` +- `GuzzleHttp\Utils::setPath` -> `GuzzleHttp\set_path` +- `GuzzleHttp\Pool::batch` -> `GuzzleHttp\batch`. This function is, however, + deprecated in favor of using `GuzzleHttp\Pool::batch()`. + +The "procedural" global client has been removed with no replacement (e.g., +`GuzzleHttp\get()`, `GuzzleHttp\post()`, etc.). Use a `GuzzleHttp\Client` +object as a replacement. + +## `throwImmediately` has been removed + +The concept of "throwImmediately" has been removed from exceptions and error +events. This control mechanism was used to stop a transfer of concurrent +requests from completing. This can now be handled by throwing the exception or +by cancelling a pool of requests or each outstanding future request +individually. + +## headers event has been removed + +Removed the "headers" event. This event was only useful for changing the +body a response once the headers of the response were known. You can implement +a similar behavior in a number of ways. One example might be to use a +FnStream that has access to the transaction being sent. For example, when the +first byte is written, you could check if the response headers match your +expectations, and if so, change the actual stream body that is being +written to. + +## Updates to HTTP Messages + +Removed the `asArray` parameter from +`GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header +value as an array, then use the newly added `getHeaderAsArray()` method of +`MessageInterface`. This change makes the Guzzle interfaces compatible with +the PSR-7 interfaces. + +3.x to 4.0 +---------- + +## Overarching changes: + +- Now requires PHP 5.4 or greater. +- No longer requires cURL to send requests. +- Guzzle no longer wraps every exception it throws. Only exceptions that are + recoverable are now wrapped by Guzzle. +- Various namespaces have been removed or renamed. +- No longer requiring the Symfony EventDispatcher. A custom event dispatcher + based on the Symfony EventDispatcher is + now utilized in `GuzzleHttp\Event\EmitterInterface` (resulting in significant + speed and functionality improvements). + +Changes per Guzzle 3.x namespace are described below. + +## Batch + +The `Guzzle\Batch` namespace has been removed. This is best left to +third-parties to implement on top of Guzzle's core HTTP library. + +## Cache + +The `Guzzle\Cache` namespace has been removed. (Todo: No suitable replacement +has been implemented yet, but hoping to utilize a PSR cache interface). + +## Common + +- Removed all of the wrapped exceptions. It's better to use the standard PHP + library for unrecoverable exceptions. +- `FromConfigInterface` has been removed. +- `Guzzle\Common\Version` has been removed. The VERSION constant can be found + at `GuzzleHttp\ClientInterface::VERSION`. + +### Collection + +- `getAll` has been removed. Use `toArray` to convert a collection to an array. +- `inject` has been removed. +- `keySearch` has been removed. +- `getPath` no longer supports wildcard expressions. Use something better like + JMESPath for this. +- `setPath` now supports appending to an existing array via the `[]` notation. + +### Events + +Guzzle no longer requires Symfony's EventDispatcher component. Guzzle now uses +`GuzzleHttp\Event\Emitter`. + +- `Symfony\Component\EventDispatcher\EventDispatcherInterface` is replaced by + `GuzzleHttp\Event\EmitterInterface`. +- `Symfony\Component\EventDispatcher\EventDispatcher` is replaced by + `GuzzleHttp\Event\Emitter`. +- `Symfony\Component\EventDispatcher\Event` is replaced by + `GuzzleHttp\Event\Event`, and Guzzle now has an EventInterface in + `GuzzleHttp\Event\EventInterface`. +- `AbstractHasDispatcher` has moved to a trait, `HasEmitterTrait`, and + `HasDispatcherInterface` has moved to `HasEmitterInterface`. Retrieving the + event emitter of a request, client, etc. now uses the `getEmitter` method + rather than the `getDispatcher` method. + +#### Emitter + +- Use the `once()` method to add a listener that automatically removes itself + the first time it is invoked. +- Use the `listeners()` method to retrieve a list of event listeners rather than + the `getListeners()` method. +- Use `emit()` instead of `dispatch()` to emit an event from an emitter. +- Use `attach()` instead of `addSubscriber()` and `detach()` instead of + `removeSubscriber()`. + +```php +$mock = new Mock(); +// 3.x +$request->getEventDispatcher()->addSubscriber($mock); +$request->getEventDispatcher()->removeSubscriber($mock); +// 4.x +$request->getEmitter()->attach($mock); +$request->getEmitter()->detach($mock); +``` + +Use the `on()` method to add a listener rather than the `addListener()` method. + +```php +// 3.x +$request->getEventDispatcher()->addListener('foo', function (Event $event) { /* ... */ } ); +// 4.x +$request->getEmitter()->on('foo', function (Event $event, $name) { /* ... */ } ); +``` + +## Http + +### General changes + +- The cacert.pem certificate has been moved to `src/cacert.pem`. +- Added the concept of adapters that are used to transfer requests over the + wire. +- Simplified the event system. +- Sending requests in parallel is still possible, but batching is no longer a + concept of the HTTP layer. Instead, you must use the `complete` and `error` + events to asynchronously manage parallel request transfers. +- `Guzzle\Http\Url` has moved to `GuzzleHttp\Url`. +- `Guzzle\Http\QueryString` has moved to `GuzzleHttp\Query`. +- QueryAggregators have been rewritten so that they are simply callable + functions. +- `GuzzleHttp\StaticClient` has been removed. Use the functions provided in + `functions.php` for an easy to use static client instance. +- Exceptions in `GuzzleHttp\Exception` have been updated to all extend from + `GuzzleHttp\Exception\TransferException`. + +### Client + +Calling methods like `get()`, `post()`, `head()`, etc. no longer create and +return a request, but rather creates a request, sends the request, and returns +the response. + +```php +// 3.0 +$request = $client->get('/'); +$response = $request->send(); + +// 4.0 +$response = $client->get('/'); + +// or, to mirror the previous behavior +$request = $client->createRequest('GET', '/'); +$response = $client->send($request); +``` + +`GuzzleHttp\ClientInterface` has changed. + +- The `send` method no longer accepts more than one request. Use `sendAll` to + send multiple requests in parallel. +- `setUserAgent()` has been removed. Use a default request option instead. You + could, for example, do something like: + `$client->setConfig('defaults/headers/User-Agent', 'Foo/Bar ' . $client::getDefaultUserAgent())`. +- `setSslVerification()` has been removed. Use default request options instead, + like `$client->setConfig('defaults/verify', true)`. + +`GuzzleHttp\Client` has changed. + +- The constructor now accepts only an associative array. You can include a + `base_url` string or array to use a URI template as the base URL of a client. + You can also specify a `defaults` key that is an associative array of default + request options. You can pass an `adapter` to use a custom adapter, + `batch_adapter` to use a custom adapter for sending requests in parallel, or + a `message_factory` to change the factory used to create HTTP requests and + responses. +- The client no longer emits a `client.create_request` event. +- Creating requests with a client no longer automatically utilize a URI + template. You must pass an array into a creational method (e.g., + `createRequest`, `get`, `put`, etc.) in order to expand a URI template. + +### Messages + +Messages no longer have references to their counterparts (i.e., a request no +longer has a reference to it's response, and a response no loger has a +reference to its request). This association is now managed through a +`GuzzleHttp\Adapter\TransactionInterface` object. You can get references to +these transaction objects using request events that are emitted over the +lifecycle of a request. + +#### Requests with a body + +- `GuzzleHttp\Message\EntityEnclosingRequest` and + `GuzzleHttp\Message\EntityEnclosingRequestInterface` have been removed. The + separation between requests that contain a body and requests that do not + contain a body has been removed, and now `GuzzleHttp\Message\RequestInterface` + handles both use cases. +- Any method that previously accepts a `GuzzleHttp\Response` object now accept a + `GuzzleHttp\Message\ResponseInterface`. +- `GuzzleHttp\Message\RequestFactoryInterface` has been renamed to + `GuzzleHttp\Message\MessageFactoryInterface`. This interface is used to create + both requests and responses and is implemented in + `GuzzleHttp\Message\MessageFactory`. +- POST field and file methods have been removed from the request object. You + must now use the methods made available to `GuzzleHttp\Post\PostBodyInterface` + to control the format of a POST body. Requests that are created using a + standard `GuzzleHttp\Message\MessageFactoryInterface` will automatically use + a `GuzzleHttp\Post\PostBody` body if the body was passed as an array or if + the method is POST and no body is provided. + +```php +$request = $client->createRequest('POST', '/'); +$request->getBody()->setField('foo', 'bar'); +$request->getBody()->addFile(new PostFile('file_key', fopen('/path/to/content', 'r'))); +``` + +#### Headers + +- `GuzzleHttp\Message\Header` has been removed. Header values are now simply + represented by an array of values or as a string. Header values are returned + as a string by default when retrieving a header value from a message. You can + pass an optional argument of `true` to retrieve a header value as an array + of strings instead of a single concatenated string. +- `GuzzleHttp\PostFile` and `GuzzleHttp\PostFileInterface` have been moved to + `GuzzleHttp\Post`. This interface has been simplified and now allows the + addition of arbitrary headers. +- Custom headers like `GuzzleHttp\Message\Header\Link` have been removed. Most + of the custom headers are now handled separately in specific + subscribers/plugins, and `GuzzleHttp\Message\HeaderValues::parseParams()` has + been updated to properly handle headers that contain parameters (like the + `Link` header). + +#### Responses + +- `GuzzleHttp\Message\Response::getInfo()` and + `GuzzleHttp\Message\Response::setInfo()` have been removed. Use the event + system to retrieve this type of information. +- `GuzzleHttp\Message\Response::getRawHeaders()` has been removed. +- `GuzzleHttp\Message\Response::getMessage()` has been removed. +- `GuzzleHttp\Message\Response::calculateAge()` and other cache specific + methods have moved to the CacheSubscriber. +- Header specific helper functions like `getContentMd5()` have been removed. + Just use `getHeader('Content-MD5')` instead. +- `GuzzleHttp\Message\Response::setRequest()` and + `GuzzleHttp\Message\Response::getRequest()` have been removed. Use the event + system to work with request and response objects as a transaction. +- `GuzzleHttp\Message\Response::getRedirectCount()` has been removed. Use the + Redirect subscriber instead. +- `GuzzleHttp\Message\Response::isSuccessful()` and other related methods have + been removed. Use `getStatusCode()` instead. + +#### Streaming responses + +Streaming requests can now be created by a client directly, returning a +`GuzzleHttp\Message\ResponseInterface` object that contains a body stream +referencing an open PHP HTTP stream. + +```php +// 3.0 +use Guzzle\Stream\PhpStreamRequestFactory; +$request = $client->get('/'); +$factory = new PhpStreamRequestFactory(); +$stream = $factory->fromRequest($request); +$data = $stream->read(1024); + +// 4.0 +$response = $client->get('/', ['stream' => true]); +// Read some data off of the stream in the response body +$data = $response->getBody()->read(1024); +``` + +#### Redirects + +The `configureRedirects()` method has been removed in favor of a +`allow_redirects` request option. + +```php +// Standard redirects with a default of a max of 5 redirects +$request = $client->createRequest('GET', '/', ['allow_redirects' => true]); + +// Strict redirects with a custom number of redirects +$request = $client->createRequest('GET', '/', [ + 'allow_redirects' => ['max' => 5, 'strict' => true] +]); +``` + +#### EntityBody + +EntityBody interfaces and classes have been removed or moved to +`GuzzleHttp\Stream`. All classes and interfaces that once required +`GuzzleHttp\EntityBodyInterface` now require +`GuzzleHttp\Stream\StreamInterface`. Creating a new body for a request no +longer uses `GuzzleHttp\EntityBody::factory` but now uses +`GuzzleHttp\Stream\Stream::factory` or even better: +`GuzzleHttp\Stream\create()`. + +- `Guzzle\Http\EntityBodyInterface` is now `GuzzleHttp\Stream\StreamInterface` +- `Guzzle\Http\EntityBody` is now `GuzzleHttp\Stream\Stream` +- `Guzzle\Http\CachingEntityBody` is now `GuzzleHttp\Stream\CachingStream` +- `Guzzle\Http\ReadLimitEntityBody` is now `GuzzleHttp\Stream\LimitStream` +- `Guzzle\Http\IoEmittyinEntityBody` has been removed. + +#### Request lifecycle events + +Requests previously submitted a large number of requests. The number of events +emitted over the lifecycle of a request has been significantly reduced to make +it easier to understand how to extend the behavior of a request. All events +emitted during the lifecycle of a request now emit a custom +`GuzzleHttp\Event\EventInterface` object that contains context providing +methods and a way in which to modify the transaction at that specific point in +time (e.g., intercept the request and set a response on the transaction). + +- `request.before_send` has been renamed to `before` and now emits a + `GuzzleHttp\Event\BeforeEvent` +- `request.complete` has been renamed to `complete` and now emits a + `GuzzleHttp\Event\CompleteEvent`. +- `request.sent` has been removed. Use `complete`. +- `request.success` has been removed. Use `complete`. +- `error` is now an event that emits a `GuzzleHttp\Event\ErrorEvent`. +- `request.exception` has been removed. Use `error`. +- `request.receive.status_line` has been removed. +- `curl.callback.progress` has been removed. Use a custom `StreamInterface` to + maintain a status update. +- `curl.callback.write` has been removed. Use a custom `StreamInterface` to + intercept writes. +- `curl.callback.read` has been removed. Use a custom `StreamInterface` to + intercept reads. + +`headers` is a new event that is emitted after the response headers of a +request have been received before the body of the response is downloaded. This +event emits a `GuzzleHttp\Event\HeadersEvent`. + +You can intercept a request and inject a response using the `intercept()` event +of a `GuzzleHttp\Event\BeforeEvent`, `GuzzleHttp\Event\CompleteEvent`, and +`GuzzleHttp\Event\ErrorEvent` event. + +See: http://docs.guzzlephp.org/en/latest/events.html + +## Inflection + +The `Guzzle\Inflection` namespace has been removed. This is not a core concern +of Guzzle. + +## Iterator + +The `Guzzle\Iterator` namespace has been removed. + +- `Guzzle\Iterator\AppendIterator`, `Guzzle\Iterator\ChunkedIterator`, and + `Guzzle\Iterator\MethodProxyIterator` are nice, but not a core requirement of + Guzzle itself. +- `Guzzle\Iterator\FilterIterator` is no longer needed because an equivalent + class is shipped with PHP 5.4. +- `Guzzle\Iterator\MapIterator` is not really needed when using PHP 5.5 because + it's easier to just wrap an iterator in a generator that maps values. + +For a replacement of these iterators, see https://github.com/nikic/iter + +## Log + +The LogPlugin has moved to https://github.com/guzzle/log-subscriber. The +`Guzzle\Log` namespace has been removed. Guzzle now relies on +`Psr\Log\LoggerInterface` for all logging. The MessageFormatter class has been +moved to `GuzzleHttp\Subscriber\Log\Formatter`. + +## Parser + +The `Guzzle\Parser` namespace has been removed. This was previously used to +make it possible to plug in custom parsers for cookies, messages, URI +templates, and URLs; however, this level of complexity is not needed in Guzzle +so it has been removed. + +- Cookie: Cookie parsing logic has been moved to + `GuzzleHttp\Cookie\SetCookie::fromString`. +- Message: Message parsing logic for both requests and responses has been moved + to `GuzzleHttp\Message\MessageFactory::fromMessage`. Message parsing is only + used in debugging or deserializing messages, so it doesn't make sense for + Guzzle as a library to add this level of complexity to parsing messages. +- UriTemplate: URI template parsing has been moved to + `GuzzleHttp\UriTemplate`. The Guzzle library will automatically use the PECL + URI template library if it is installed. +- Url: URL parsing is now performed in `GuzzleHttp\Url::fromString` (previously + it was `Guzzle\Http\Url::factory()`). If custom URL parsing is necessary, + then developers are free to subclass `GuzzleHttp\Url`. + +## Plugin + +The `Guzzle\Plugin` namespace has been renamed to `GuzzleHttp\Subscriber`. +Several plugins are shipping with the core Guzzle library under this namespace. + +- `GuzzleHttp\Subscriber\Cookie`: Replaces the old CookiePlugin. Cookie jar + code has moved to `GuzzleHttp\Cookie`. +- `GuzzleHttp\Subscriber\History`: Replaces the old HistoryPlugin. +- `GuzzleHttp\Subscriber\HttpError`: Throws errors when a bad HTTP response is + received. +- `GuzzleHttp\Subscriber\Mock`: Replaces the old MockPlugin. +- `GuzzleHttp\Subscriber\Prepare`: Prepares the body of a request just before + sending. This subscriber is attached to all requests by default. +- `GuzzleHttp\Subscriber\Redirect`: Replaces the RedirectPlugin. + +The following plugins have been removed (third-parties are free to re-implement +these if needed): + +- `GuzzleHttp\Plugin\Async` has been removed. +- `GuzzleHttp\Plugin\CurlAuth` has been removed. +- `GuzzleHttp\Plugin\ErrorResponse\ErrorResponsePlugin` has been removed. This + functionality should instead be implemented with event listeners that occur + after normal response parsing occurs in the guzzle/command package. + +The following plugins are not part of the core Guzzle package, but are provided +in separate repositories: + +- `Guzzle\Http\Plugin\BackoffPlugin` has been rewritten to be much simpler + to build custom retry policies using simple functions rather than various + chained classes. See: https://github.com/guzzle/retry-subscriber +- `Guzzle\Http\Plugin\Cache\CachePlugin` has moved to + https://github.com/guzzle/cache-subscriber +- `Guzzle\Http\Plugin\Log\LogPlugin` has moved to + https://github.com/guzzle/log-subscriber +- `Guzzle\Http\Plugin\Md5\Md5Plugin` has moved to + https://github.com/guzzle/message-integrity-subscriber +- `Guzzle\Http\Plugin\Mock\MockPlugin` has moved to + `GuzzleHttp\Subscriber\MockSubscriber`. +- `Guzzle\Http\Plugin\Oauth\OauthPlugin` has moved to + https://github.com/guzzle/oauth-subscriber + +## Service + +The service description layer of Guzzle has moved into two separate packages: + +- http://github.com/guzzle/command Provides a high level abstraction over web + services by representing web service operations using commands. +- http://github.com/guzzle/guzzle-services Provides an implementation of + guzzle/command that provides request serialization and response parsing using + Guzzle service descriptions. + +## Stream + +Stream have moved to a separate package available at +https://github.com/guzzle/streams. + +`Guzzle\Stream\StreamInterface` has been given a large update to cleanly take +on the responsibilities of `Guzzle\Http\EntityBody` and +`Guzzle\Http\EntityBodyInterface` now that they have been removed. The number +of methods implemented by the `StreamInterface` has been drastically reduced to +allow developers to more easily extend and decorate stream behavior. + +## Removed methods from StreamInterface + +- `getStream` and `setStream` have been removed to better encapsulate streams. +- `getMetadata` and `setMetadata` have been removed in favor of + `GuzzleHttp\Stream\MetadataStreamInterface`. +- `getWrapper`, `getWrapperData`, `getStreamType`, and `getUri` have all been + removed. This data is accessible when + using streams that implement `GuzzleHttp\Stream\MetadataStreamInterface`. +- `rewind` has been removed. Use `seek(0)` for a similar behavior. + +## Renamed methods + +- `detachStream` has been renamed to `detach`. +- `feof` has been renamed to `eof`. +- `ftell` has been renamed to `tell`. +- `readLine` has moved from an instance method to a static class method of + `GuzzleHttp\Stream\Stream`. + +## Metadata streams + +`GuzzleHttp\Stream\MetadataStreamInterface` has been added to denote streams +that contain additional metadata accessible via `getMetadata()`. +`GuzzleHttp\Stream\StreamInterface::getMetadata` and +`GuzzleHttp\Stream\StreamInterface::setMetadata` have been removed. + +## StreamRequestFactory + +The entire concept of the StreamRequestFactory has been removed. The way this +was used in Guzzle 3 broke the actual interface of sending streaming requests +(instead of getting back a Response, you got a StreamInterface). Streaming +PHP requests are now implemented through the `GuzzleHttp\Adapter\StreamAdapter`. + +3.6 to 3.7 +---------- + +### Deprecations + +- You can now enable E_USER_DEPRECATED warnings to see if you are using any deprecated methods.: + +```php +\Guzzle\Common\Version::$emitWarnings = true; +``` + +The following APIs and options have been marked as deprecated: + +- Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use `$request->getResponseBody()->isRepeatable()` instead. +- Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +- Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +- Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead. +- Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead. +- Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated +- Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client. +- Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8. +- Marked `Guzzle\Common\Collection::inject()` as deprecated. +- Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use + `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` or + `$client->setDefaultOption('auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` + +3.7 introduces `request.options` as a parameter for a client configuration and as an optional argument to all creational +request methods. When paired with a client's configuration settings, these options allow you to specify default settings +for various aspects of a request. Because these options make other previous configuration options redundant, several +configuration options and methods of a client and AbstractCommand have been deprecated. + +- Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use `$client->getDefaultOption('headers')`. +- Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use `$client->setDefaultOption('headers/{header_name}', 'value')`. +- Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use `$client->setDefaultOption('params/{param_name}', 'value')` +- Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. These will work through Guzzle 4.0 + + $command = $client->getCommand('foo', array( + 'command.headers' => array('Test' => '123'), + 'command.response_body' => '/path/to/file' + )); + + // Should be changed to: + + $command = $client->getCommand('foo', array( + 'command.request_options' => array( + 'headers' => array('Test' => '123'), + 'save_as' => '/path/to/file' + ) + )); + +### Interface changes + +Additions and changes (you will need to update any implementations or subclasses you may have created): + +- Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`: + createRequest, head, delete, put, patch, post, options, prepareRequest +- Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()` +- Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface` +- Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to + `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a + resource, string, or EntityBody into the $options parameter to specify the download location of the response. +- Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a + default `array()` +- Added `Guzzle\Stream\StreamInterface::isRepeatable` +- Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods. + +The following methods were removed from interfaces. All of these methods are still available in the concrete classes +that implement them, but you should update your code to use alternative methods: + +- Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use + `$client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or + `$client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))` or + `$client->setDefaultOption('headers/{header_name}', 'value')`. or + `$client->setDefaultOption('headers', array('header_name' => 'value'))`. +- Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use `$client->getConfig()->getPath('request.options/headers')`. +- Removed `Guzzle\Http\ClientInterface::expandTemplate()`. This is an implementation detail. +- Removed `Guzzle\Http\ClientInterface::setRequestFactory()`. This is an implementation detail. +- Removed `Guzzle\Http\ClientInterface::getCurlMulti()`. This is a very specific implementation detail. +- Removed `Guzzle\Http\Message\RequestInterface::canCache`. Use the CachePlugin. +- Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect`. Use the HistoryPlugin. +- Removed `Guzzle\Http\Message\RequestInterface::isRedirect`. Use the HistoryPlugin. + +### Cache plugin breaking changes + +- CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a + CacheStorageInterface. These two objects and interface will be removed in a future version. +- Always setting X-cache headers on cached responses +- Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin +- `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface + $request, Response $response);` +- `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);` +- `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);` +- Added `CacheStorageInterface::purge($url)` +- `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin + $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache, + CanCacheStrategyInterface $canCache = null)` +- Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)` + +3.5 to 3.6 +---------- + +* Mixed casing of headers are now forced to be a single consistent casing across all values for that header. +* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution +* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader(). + For example, setHeader() first removes the header using unset on a HeaderCollection and then calls addHeader(). + Keeping the Host header and URL host in sync is now handled by overriding the addHeader method in Request. +* Specific header implementations can be created for complex headers. When a message creates a header, it uses a + HeaderFactory which can map specific headers to specific header classes. There is now a Link header and + CacheControl header implementation. +* Moved getLinks() from Response to just be used on a Link header object. + +If you previously relied on Guzzle\Http\Message\Header::raw(), then you will need to update your code to use the +HeaderInterface (e.g. toArray(), getAll(), etc.). + +### Interface changes + +* Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate +* Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti() +* Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in + Guzzle\Http\Curl\RequestMediator +* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string. +* Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface +* Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders() + +### Removed deprecated functions + +* Removed Guzzle\Parser\ParserRegister::get(). Use getParser() +* Removed Guzzle\Parser\ParserRegister::set(). Use registerParser(). + +### Deprecations + +* The ability to case-insensitively search for header values +* Guzzle\Http\Message\Header::hasExactHeader +* Guzzle\Http\Message\Header::raw. Use getAll() +* Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object + instead. + +### Other changes + +* All response header helper functions return a string rather than mixing Header objects and strings inconsistently +* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle + directly via interfaces +* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist + but are a no-op until removed. +* Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a + `Guzzle\Service\Command\ArrayCommandInterface`. +* Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response + on a request while the request is still being transferred +* `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess + +3.3 to 3.4 +---------- + +Base URLs of a client now follow the rules of https://tools.ietf.org/html/rfc3986#section-5.2.2 when merging URLs. + +3.2 to 3.3 +---------- + +### Response::getEtag() quote stripping removed + +`Guzzle\Http\Message\Response::getEtag()` no longer strips quotes around the ETag response header + +### Removed `Guzzle\Http\Utils` + +The `Guzzle\Http\Utils` class was removed. This class was only used for testing. + +### Stream wrapper and type + +`Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getStreamType()` are no longer converted to lowercase. + +### curl.emit_io became emit_io + +Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using the +'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io' + +3.1 to 3.2 +---------- + +### CurlMulti is no longer reused globally + +Before 3.2, the same CurlMulti object was reused globally for each client. This can cause issue where plugins added +to a single client can pollute requests dispatched from other clients. + +If you still wish to reuse the same CurlMulti object with each client, then you can add a listener to the +ServiceBuilder's `service_builder.create_client` event to inject a custom CurlMulti object into each client as it is +created. + +```php +$multi = new Guzzle\Http\Curl\CurlMulti(); +$builder = Guzzle\Service\Builder\ServiceBuilder::factory('/path/to/config.json'); +$builder->addListener('service_builder.create_client', function ($event) use ($multi) { + $event['client']->setCurlMulti($multi); +} +}); +``` + +### No default path + +URLs no longer have a default path value of '/' if no path was specified. + +Before: + +```php +$request = $client->get('http://www.foo.com'); +echo $request->getUrl(); +// >> http://www.foo.com/ +``` + +After: + +```php +$request = $client->get('http://www.foo.com'); +echo $request->getUrl(); +// >> http://www.foo.com +``` + +### Less verbose BadResponseException + +The exception message for `Guzzle\Http\Exception\BadResponseException` no longer contains the full HTTP request and +response information. You can, however, get access to the request and response object by calling `getRequest()` or +`getResponse()` on the exception object. + +### Query parameter aggregation + +Multi-valued query parameters are no longer aggregated using a callback function. `Guzzle\Http\Query` now has a +setAggregator() method that accepts a `Guzzle\Http\QueryAggregator\QueryAggregatorInterface` object. This object is +responsible for handling the aggregation of multi-valued query string variables into a flattened hash. + +2.8 to 3.x +---------- + +### Guzzle\Service\Inspector + +Change `\Guzzle\Service\Inspector::fromConfig` to `\Guzzle\Common\Collection::fromConfig` + +**Before** + +```php +use Guzzle\Service\Inspector; + +class YourClient extends \Guzzle\Service\Client +{ + public static function factory($config = array()) + { + $default = array(); + $required = array('base_url', 'username', 'api_key'); + $config = Inspector::fromConfig($config, $default, $required); + + $client = new self( + $config->get('base_url'), + $config->get('username'), + $config->get('api_key') + ); + $client->setConfig($config); + + $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json')); + + return $client; + } +``` + +**After** + +```php +use Guzzle\Common\Collection; + +class YourClient extends \Guzzle\Service\Client +{ + public static function factory($config = array()) + { + $default = array(); + $required = array('base_url', 'username', 'api_key'); + $config = Collection::fromConfig($config, $default, $required); + + $client = new self( + $config->get('base_url'), + $config->get('username'), + $config->get('api_key') + ); + $client->setConfig($config); + + $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json')); + + return $client; + } +``` + +### Convert XML Service Descriptions to JSON + +**Before** + +```xml +<?xml version="1.0" encoding="UTF-8"?> +<client> + <commands> + <!-- Groups --> + <command name="list_groups" method="GET" uri="groups.json"> + <doc>Get a list of groups</doc> + </command> + <command name="search_groups" method="GET" uri='search.json?query="{{query}} type:group"'> + <doc>Uses a search query to get a list of groups</doc> + <param name="query" type="string" required="true" /> + </command> + <command name="create_group" method="POST" uri="groups.json"> + <doc>Create a group</doc> + <param name="data" type="array" location="body" filters="json_encode" doc="Group JSON"/> + <param name="Content-Type" location="header" static="application/json"/> + </command> + <command name="delete_group" method="DELETE" uri="groups/{{id}}.json"> + <doc>Delete a group by ID</doc> + <param name="id" type="integer" required="true"/> + </command> + <command name="get_group" method="GET" uri="groups/{{id}}.json"> + <param name="id" type="integer" required="true"/> + </command> + <command name="update_group" method="PUT" uri="groups/{{id}}.json"> + <doc>Update a group</doc> + <param name="id" type="integer" required="true"/> + <param name="data" type="array" location="body" filters="json_encode" doc="Group JSON"/> + <param name="Content-Type" location="header" static="application/json"/> + </command> + </commands> +</client> +``` + +**After** + +```json +{ + "name": "Zendesk REST API v2", + "apiVersion": "2012-12-31", + "description":"Provides access to Zendesk views, groups, tickets, ticket fields, and users", + "operations": { + "list_groups": { + "httpMethod":"GET", + "uri": "groups.json", + "summary": "Get a list of groups" + }, + "search_groups":{ + "httpMethod":"GET", + "uri": "search.json?query=\"{query} type:group\"", + "summary": "Uses a search query to get a list of groups", + "parameters":{ + "query":{ + "location": "uri", + "description":"Zendesk Search Query", + "type": "string", + "required": true + } + } + }, + "create_group": { + "httpMethod":"POST", + "uri": "groups.json", + "summary": "Create a group", + "parameters":{ + "data": { + "type": "array", + "location": "body", + "description":"Group JSON", + "filters": "json_encode", + "required": true + }, + "Content-Type":{ + "type": "string", + "location":"header", + "static": "application/json" + } + } + }, + "delete_group": { + "httpMethod":"DELETE", + "uri": "groups/{id}.json", + "summary": "Delete a group", + "parameters":{ + "id":{ + "location": "uri", + "description":"Group to delete by ID", + "type": "integer", + "required": true + } + } + }, + "get_group": { + "httpMethod":"GET", + "uri": "groups/{id}.json", + "summary": "Get a ticket", + "parameters":{ + "id":{ + "location": "uri", + "description":"Group to get by ID", + "type": "integer", + "required": true + } + } + }, + "update_group": { + "httpMethod":"PUT", + "uri": "groups/{id}.json", + "summary": "Update a group", + "parameters":{ + "id": { + "location": "uri", + "description":"Group to update by ID", + "type": "integer", + "required": true + }, + "data": { + "type": "array", + "location": "body", + "description":"Group JSON", + "filters": "json_encode", + "required": true + }, + "Content-Type":{ + "type": "string", + "location":"header", + "static": "application/json" + } + } + } +} +``` + +### Guzzle\Service\Description\ServiceDescription + +Commands are now called Operations + +**Before** + +```php +use Guzzle\Service\Description\ServiceDescription; + +$sd = new ServiceDescription(); +$sd->getCommands(); // @returns ApiCommandInterface[] +$sd->hasCommand($name); +$sd->getCommand($name); // @returns ApiCommandInterface|null +$sd->addCommand($command); // @param ApiCommandInterface $command +``` + +**After** + +```php +use Guzzle\Service\Description\ServiceDescription; + +$sd = new ServiceDescription(); +$sd->getOperations(); // @returns OperationInterface[] +$sd->hasOperation($name); +$sd->getOperation($name); // @returns OperationInterface|null +$sd->addOperation($operation); // @param OperationInterface $operation +``` + +### Guzzle\Common\Inflection\Inflector + +Namespace is now `Guzzle\Inflection\Inflector` + +### Guzzle\Http\Plugin + +Namespace is now `Guzzle\Plugin`. Many other changes occur within this namespace and are detailed in their own sections below. + +### Guzzle\Http\Plugin\LogPlugin and Guzzle\Common\Log + +Now `Guzzle\Plugin\Log\LogPlugin` and `Guzzle\Log` respectively. + +**Before** + +```php +use Guzzle\Common\Log\ClosureLogAdapter; +use Guzzle\Http\Plugin\LogPlugin; + +/** @var \Guzzle\Http\Client */ +$client; + +// $verbosity is an integer indicating desired message verbosity level +$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $verbosity = LogPlugin::LOG_VERBOSE); +``` + +**After** + +```php +use Guzzle\Log\ClosureLogAdapter; +use Guzzle\Log\MessageFormatter; +use Guzzle\Plugin\Log\LogPlugin; + +/** @var \Guzzle\Http\Client */ +$client; + +// $format is a string indicating desired message format -- @see MessageFormatter +$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $format = MessageFormatter::DEBUG_FORMAT); +``` + +### Guzzle\Http\Plugin\CurlAuthPlugin + +Now `Guzzle\Plugin\CurlAuth\CurlAuthPlugin`. + +### Guzzle\Http\Plugin\ExponentialBackoffPlugin + +Now `Guzzle\Plugin\Backoff\BackoffPlugin`, and other changes. + +**Before** + +```php +use Guzzle\Http\Plugin\ExponentialBackoffPlugin; + +$backoffPlugin = new ExponentialBackoffPlugin($maxRetries, array_merge( + ExponentialBackoffPlugin::getDefaultFailureCodes(), array(429) + )); + +$client->addSubscriber($backoffPlugin); +``` + +**After** + +```php +use Guzzle\Plugin\Backoff\BackoffPlugin; +use Guzzle\Plugin\Backoff\HttpBackoffStrategy; + +// Use convenient factory method instead -- see implementation for ideas of what +// you can do with chaining backoff strategies +$backoffPlugin = BackoffPlugin::getExponentialBackoff($maxRetries, array_merge( + HttpBackoffStrategy::getDefaultFailureCodes(), array(429) + )); +$client->addSubscriber($backoffPlugin); +``` + +### Known Issues + +#### [BUG] Accept-Encoding header behavior changed unintentionally. + +(See #217) (Fixed in 09daeb8c666fb44499a0646d655a8ae36456575e) + +In version 2.8 setting the `Accept-Encoding` header would set the CURLOPT_ENCODING option, which permitted cURL to +properly handle gzip/deflate compressed responses from the server. In versions affected by this bug this does not happen. +See issue #217 for a workaround, or use a version containing the fix. diff --git a/vendor/guzzlehttp/guzzle/composer.json b/vendor/guzzlehttp/guzzle/composer.json new file mode 100644 index 0000000..f369ce6 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/composer.json @@ -0,0 +1,105 @@ +{ + "name": "guzzlehttp/guzzle", + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "framework", + "http", + "rest", + "web service", + "curl", + "client", + "HTTP client", + "PSR-7", + "PSR-18" + ], + "license": "MIT", + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "require": { + "php": "^7.2.5 || ^8.0", + "ext-json": "*", + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9 || ^2.4", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "ext-curl": "*", + "bamarni/composer-bin-plugin": "^1.8.1", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "config": { + "allow-plugins": { + "bamarni/composer-bin-plugin": true + }, + "preferred-install": "dist", + "sort-packages": true + }, + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "7.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "autoload-dev": { + "psr-4": { + "GuzzleHttp\\Tests\\": "tests/" + } + } +} diff --git a/vendor/guzzlehttp/guzzle/src/BodySummarizer.php b/vendor/guzzlehttp/guzzle/src/BodySummarizer.php new file mode 100644 index 0000000..6eca94e --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/BodySummarizer.php @@ -0,0 +1,28 @@ +<?php + +namespace GuzzleHttp; + +use Psr\Http\Message\MessageInterface; + +final class BodySummarizer implements BodySummarizerInterface +{ + /** + * @var int|null + */ + private $truncateAt; + + public function __construct(int $truncateAt = null) + { + $this->truncateAt = $truncateAt; + } + + /** + * Returns a summarized message body. + */ + public function summarize(MessageInterface $message): ?string + { + return $this->truncateAt === null + ? \GuzzleHttp\Psr7\Message::bodySummary($message) + : \GuzzleHttp\Psr7\Message::bodySummary($message, $this->truncateAt); + } +} diff --git a/vendor/guzzlehttp/guzzle/src/BodySummarizerInterface.php b/vendor/guzzlehttp/guzzle/src/BodySummarizerInterface.php new file mode 100644 index 0000000..3e02e03 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/BodySummarizerInterface.php @@ -0,0 +1,13 @@ +<?php + +namespace GuzzleHttp; + +use Psr\Http\Message\MessageInterface; + +interface BodySummarizerInterface +{ + /** + * Returns a summarized message body. + */ + public function summarize(MessageInterface $message): ?string; +} diff --git a/vendor/guzzlehttp/guzzle/src/Client.php b/vendor/guzzlehttp/guzzle/src/Client.php new file mode 100644 index 0000000..58f1d89 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Client.php @@ -0,0 +1,477 @@ +<?php + +namespace GuzzleHttp; + +use GuzzleHttp\Cookie\CookieJar; +use GuzzleHttp\Exception\GuzzleException; +use GuzzleHttp\Exception\InvalidArgumentException; +use GuzzleHttp\Promise as P; +use GuzzleHttp\Promise\PromiseInterface; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\UriInterface; + +/** + * @final + */ +class Client implements ClientInterface, \Psr\Http\Client\ClientInterface +{ + use ClientTrait; + + /** + * @var array Default request options + */ + private $config; + + /** + * Clients accept an array of constructor parameters. + * + * Here's an example of creating a client using a base_uri and an array of + * default request options to apply to each request: + * + * $client = new Client([ + * 'base_uri' => 'http://www.foo.com/1.0/', + * 'timeout' => 0, + * 'allow_redirects' => false, + * 'proxy' => '192.168.16.1:10' + * ]); + * + * Client configuration settings include the following options: + * + * - handler: (callable) Function that transfers HTTP requests over the + * wire. The function is called with a Psr7\Http\Message\RequestInterface + * and array of transfer options, and must return a + * GuzzleHttp\Promise\PromiseInterface that is fulfilled with a + * Psr7\Http\Message\ResponseInterface on success. + * If no handler is provided, a default handler will be created + * that enables all of the request options below by attaching all of the + * default middleware to the handler. + * - base_uri: (string|UriInterface) Base URI of the client that is merged + * into relative URIs. Can be a string or instance of UriInterface. + * - **: any request option + * + * @param array $config Client configuration settings. + * + * @see \GuzzleHttp\RequestOptions for a list of available request options. + */ + public function __construct(array $config = []) + { + if (!isset($config['handler'])) { + $config['handler'] = HandlerStack::create(); + } elseif (!\is_callable($config['handler'])) { + throw new InvalidArgumentException('handler must be a callable'); + } + + // Convert the base_uri to a UriInterface + if (isset($config['base_uri'])) { + $config['base_uri'] = Psr7\Utils::uriFor($config['base_uri']); + } + + $this->configureDefaults($config); + } + + /** + * @param string $method + * @param array $args + * + * @return PromiseInterface|ResponseInterface + * + * @deprecated Client::__call will be removed in guzzlehttp/guzzle:8.0. + */ + public function __call($method, $args) + { + if (\count($args) < 1) { + throw new InvalidArgumentException('Magic request methods require a URI and optional options array'); + } + + $uri = $args[0]; + $opts = $args[1] ?? []; + + return \substr($method, -5) === 'Async' + ? $this->requestAsync(\substr($method, 0, -5), $uri, $opts) + : $this->request($method, $uri, $opts); + } + + /** + * Asynchronously send an HTTP request. + * + * @param array $options Request options to apply to the given + * request and to the transfer. See \GuzzleHttp\RequestOptions. + */ + public function sendAsync(RequestInterface $request, array $options = []): PromiseInterface + { + // Merge the base URI into the request URI if needed. + $options = $this->prepareDefaults($options); + + return $this->transfer( + $request->withUri($this->buildUri($request->getUri(), $options), $request->hasHeader('Host')), + $options + ); + } + + /** + * Send an HTTP request. + * + * @param array $options Request options to apply to the given + * request and to the transfer. See \GuzzleHttp\RequestOptions. + * + * @throws GuzzleException + */ + public function send(RequestInterface $request, array $options = []): ResponseInterface + { + $options[RequestOptions::SYNCHRONOUS] = true; + return $this->sendAsync($request, $options)->wait(); + } + + /** + * The HttpClient PSR (PSR-18) specify this method. + * + * @inheritDoc + */ + public function sendRequest(RequestInterface $request): ResponseInterface + { + $options[RequestOptions::SYNCHRONOUS] = true; + $options[RequestOptions::ALLOW_REDIRECTS] = false; + $options[RequestOptions::HTTP_ERRORS] = false; + + return $this->sendAsync($request, $options)->wait(); + } + + /** + * Create and send an asynchronous HTTP request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. Use an array to provide a URL + * template and additional variables to use in the URL template expansion. + * + * @param string $method HTTP method + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. + */ + public function requestAsync(string $method, $uri = '', array $options = []): PromiseInterface + { + $options = $this->prepareDefaults($options); + // Remove request modifying parameter because it can be done up-front. + $headers = $options['headers'] ?? []; + $body = $options['body'] ?? null; + $version = $options['version'] ?? '1.1'; + // Merge the URI into the base URI. + $uri = $this->buildUri(Psr7\Utils::uriFor($uri), $options); + if (\is_array($body)) { + throw $this->invalidBody(); + } + $request = new Psr7\Request($method, $uri, $headers, $body, $version); + // Remove the option so that they are not doubly-applied. + unset($options['headers'], $options['body'], $options['version']); + + return $this->transfer($request, $options); + } + + /** + * Create and send an HTTP request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. + * + * @param string $method HTTP method. + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. + * + * @throws GuzzleException + */ + public function request(string $method, $uri = '', array $options = []): ResponseInterface + { + $options[RequestOptions::SYNCHRONOUS] = true; + return $this->requestAsync($method, $uri, $options)->wait(); + } + + /** + * Get a client configuration option. + * + * These options include default request options of the client, a "handler" + * (if utilized by the concrete client), and a "base_uri" if utilized by + * the concrete client. + * + * @param string|null $option The config option to retrieve. + * + * @return mixed + * + * @deprecated Client::getConfig will be removed in guzzlehttp/guzzle:8.0. + */ + public function getConfig(?string $option = null) + { + return $option === null + ? $this->config + : ($this->config[$option] ?? null); + } + + private function buildUri(UriInterface $uri, array $config): UriInterface + { + if (isset($config['base_uri'])) { + $uri = Psr7\UriResolver::resolve(Psr7\Utils::uriFor($config['base_uri']), $uri); + } + + if (isset($config['idn_conversion']) && ($config['idn_conversion'] !== false)) { + $idnOptions = ($config['idn_conversion'] === true) ? \IDNA_DEFAULT : $config['idn_conversion']; + $uri = Utils::idnUriConvert($uri, $idnOptions); + } + + return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri; + } + + /** + * Configures the default options for a client. + */ + private function configureDefaults(array $config): void + { + $defaults = [ + 'allow_redirects' => RedirectMiddleware::$defaultSettings, + 'http_errors' => true, + 'decode_content' => true, + 'verify' => true, + 'cookies' => false, + 'idn_conversion' => false, + ]; + + // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set. + + // We can only trust the HTTP_PROXY environment variable in a CLI + // process due to the fact that PHP has no reliable mechanism to + // get environment variables that start with "HTTP_". + if (\PHP_SAPI === 'cli' && ($proxy = Utils::getenv('HTTP_PROXY'))) { + $defaults['proxy']['http'] = $proxy; + } + + if ($proxy = Utils::getenv('HTTPS_PROXY')) { + $defaults['proxy']['https'] = $proxy; + } + + if ($noProxy = Utils::getenv('NO_PROXY')) { + $cleanedNoProxy = \str_replace(' ', '', $noProxy); + $defaults['proxy']['no'] = \explode(',', $cleanedNoProxy); + } + + $this->config = $config + $defaults; + + if (!empty($config['cookies']) && $config['cookies'] === true) { + $this->config['cookies'] = new CookieJar(); + } + + // Add the default user-agent header. + if (!isset($this->config['headers'])) { + $this->config['headers'] = ['User-Agent' => Utils::defaultUserAgent()]; + } else { + // Add the User-Agent header if one was not already set. + foreach (\array_keys($this->config['headers']) as $name) { + if (\strtolower($name) === 'user-agent') { + return; + } + } + $this->config['headers']['User-Agent'] = Utils::defaultUserAgent(); + } + } + + /** + * Merges default options into the array. + * + * @param array $options Options to modify by reference + */ + private function prepareDefaults(array $options): array + { + $defaults = $this->config; + + if (!empty($defaults['headers'])) { + // Default headers are only added if they are not present. + $defaults['_conditional'] = $defaults['headers']; + unset($defaults['headers']); + } + + // Special handling for headers is required as they are added as + // conditional headers and as headers passed to a request ctor. + if (\array_key_exists('headers', $options)) { + // Allows default headers to be unset. + if ($options['headers'] === null) { + $defaults['_conditional'] = []; + unset($options['headers']); + } elseif (!\is_array($options['headers'])) { + throw new InvalidArgumentException('headers must be an array'); + } + } + + // Shallow merge defaults underneath options. + $result = $options + $defaults; + + // Remove null values. + foreach ($result as $k => $v) { + if ($v === null) { + unset($result[$k]); + } + } + + return $result; + } + + /** + * Transfers the given request and applies request options. + * + * The URI of the request is not modified and the request options are used + * as-is without merging in default options. + * + * @param array $options See \GuzzleHttp\RequestOptions. + */ + private function transfer(RequestInterface $request, array $options): PromiseInterface + { + $request = $this->applyOptions($request, $options); + /** @var HandlerStack $handler */ + $handler = $options['handler']; + + try { + return P\Create::promiseFor($handler($request, $options)); + } catch (\Exception $e) { + return P\Create::rejectionFor($e); + } + } + + /** + * Applies the array of request options to a request. + */ + private function applyOptions(RequestInterface $request, array &$options): RequestInterface + { + $modify = [ + 'set_headers' => [], + ]; + + if (isset($options['headers'])) { + if (array_keys($options['headers']) === range(0, count($options['headers']) - 1)) { + throw new InvalidArgumentException('The headers array must have header name as keys.'); + } + $modify['set_headers'] = $options['headers']; + unset($options['headers']); + } + + if (isset($options['form_params'])) { + if (isset($options['multipart'])) { + throw new InvalidArgumentException('You cannot use ' + . 'form_params and multipart at the same time. Use the ' + . 'form_params option if you want to send application/' + . 'x-www-form-urlencoded requests, and the multipart ' + . 'option to send multipart/form-data requests.'); + } + $options['body'] = \http_build_query($options['form_params'], '', '&'); + unset($options['form_params']); + // Ensure that we don't have the header in different case and set the new value. + $options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']); + $options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded'; + } + + if (isset($options['multipart'])) { + $options['body'] = new Psr7\MultipartStream($options['multipart']); + unset($options['multipart']); + } + + if (isset($options['json'])) { + $options['body'] = Utils::jsonEncode($options['json']); + unset($options['json']); + // Ensure that we don't have the header in different case and set the new value. + $options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']); + $options['_conditional']['Content-Type'] = 'application/json'; + } + + if (!empty($options['decode_content']) + && $options['decode_content'] !== true + ) { + // Ensure that we don't have the header in different case and set the new value. + $options['_conditional'] = Psr7\Utils::caselessRemove(['Accept-Encoding'], $options['_conditional']); + $modify['set_headers']['Accept-Encoding'] = $options['decode_content']; + } + + if (isset($options['body'])) { + if (\is_array($options['body'])) { + throw $this->invalidBody(); + } + $modify['body'] = Psr7\Utils::streamFor($options['body']); + unset($options['body']); + } + + if (!empty($options['auth']) && \is_array($options['auth'])) { + $value = $options['auth']; + $type = isset($value[2]) ? \strtolower($value[2]) : 'basic'; + switch ($type) { + case 'basic': + // Ensure that we don't have the header in different case and set the new value. + $modify['set_headers'] = Psr7\Utils::caselessRemove(['Authorization'], $modify['set_headers']); + $modify['set_headers']['Authorization'] = 'Basic ' + . \base64_encode("$value[0]:$value[1]"); + break; + case 'digest': + // @todo: Do not rely on curl + $options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_DIGEST; + $options['curl'][\CURLOPT_USERPWD] = "$value[0]:$value[1]"; + break; + case 'ntlm': + $options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_NTLM; + $options['curl'][\CURLOPT_USERPWD] = "$value[0]:$value[1]"; + break; + } + } + + if (isset($options['query'])) { + $value = $options['query']; + if (\is_array($value)) { + $value = \http_build_query($value, '', '&', \PHP_QUERY_RFC3986); + } + if (!\is_string($value)) { + throw new InvalidArgumentException('query must be a string or array'); + } + $modify['query'] = $value; + unset($options['query']); + } + + // Ensure that sink is not an invalid value. + if (isset($options['sink'])) { + // TODO: Add more sink validation? + if (\is_bool($options['sink'])) { + throw new InvalidArgumentException('sink must not be a boolean'); + } + } + + $request = Psr7\Utils::modifyRequest($request, $modify); + if ($request->getBody() instanceof Psr7\MultipartStream) { + // Use a multipart/form-data POST if a Content-Type is not set. + // Ensure that we don't have the header in different case and set the new value. + $options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']); + $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary=' + . $request->getBody()->getBoundary(); + } + + // Merge in conditional headers if they are not present. + if (isset($options['_conditional'])) { + // Build up the changes so it's in a single clone of the message. + $modify = []; + foreach ($options['_conditional'] as $k => $v) { + if (!$request->hasHeader($k)) { + $modify['set_headers'][$k] = $v; + } + } + $request = Psr7\Utils::modifyRequest($request, $modify); + // Don't pass this internal value along to middleware/handlers. + unset($options['_conditional']); + } + + return $request; + } + + /** + * Return an InvalidArgumentException with pre-set message. + */ + private function invalidBody(): InvalidArgumentException + { + return new InvalidArgumentException('Passing in the "body" request ' + . 'option as an array to send a request is not supported. ' + . 'Please use the "form_params" request option to send a ' + . 'application/x-www-form-urlencoded request, or the "multipart" ' + . 'request option to send a multipart/form-data request.'); + } +} diff --git a/vendor/guzzlehttp/guzzle/src/ClientInterface.php b/vendor/guzzlehttp/guzzle/src/ClientInterface.php new file mode 100644 index 0000000..6aaee61 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/ClientInterface.php @@ -0,0 +1,84 @@ +<?php + +namespace GuzzleHttp; + +use GuzzleHttp\Exception\GuzzleException; +use GuzzleHttp\Promise\PromiseInterface; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\UriInterface; + +/** + * Client interface for sending HTTP requests. + */ +interface ClientInterface +{ + /** + * The Guzzle major version. + */ + public const MAJOR_VERSION = 7; + + /** + * Send an HTTP request. + * + * @param RequestInterface $request Request to send + * @param array $options Request options to apply to the given + * request and to the transfer. + * + * @throws GuzzleException + */ + public function send(RequestInterface $request, array $options = []): ResponseInterface; + + /** + * Asynchronously send an HTTP request. + * + * @param RequestInterface $request Request to send + * @param array $options Request options to apply to the given + * request and to the transfer. + */ + public function sendAsync(RequestInterface $request, array $options = []): PromiseInterface; + + /** + * Create and send an HTTP request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. + * + * @param string $method HTTP method. + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + * + * @throws GuzzleException + */ + public function request(string $method, $uri, array $options = []): ResponseInterface; + + /** + * Create and send an asynchronous HTTP request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. Use an array to provide a URL + * template and additional variables to use in the URL template expansion. + * + * @param string $method HTTP method + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + */ + public function requestAsync(string $method, $uri, array $options = []): PromiseInterface; + + /** + * Get a client configuration option. + * + * These options include default request options of the client, a "handler" + * (if utilized by the concrete client), and a "base_uri" if utilized by + * the concrete client. + * + * @param string|null $option The config option to retrieve. + * + * @return mixed + * + * @deprecated ClientInterface::getConfig will be removed in guzzlehttp/guzzle:8.0. + */ + public function getConfig(?string $option = null); +} diff --git a/vendor/guzzlehttp/guzzle/src/ClientTrait.php b/vendor/guzzlehttp/guzzle/src/ClientTrait.php new file mode 100644 index 0000000..c584c76 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/ClientTrait.php @@ -0,0 +1,241 @@ +<?php + +namespace GuzzleHttp; + +use GuzzleHttp\Exception\GuzzleException; +use GuzzleHttp\Promise\PromiseInterface; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\UriInterface; + +/** + * Client interface for sending HTTP requests. + */ +trait ClientTrait +{ + /** + * Create and send an HTTP request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. + * + * @param string $method HTTP method. + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + * + * @throws GuzzleException + */ + abstract public function request(string $method, $uri, array $options = []): ResponseInterface; + + /** + * Create and send an HTTP GET request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + * + * @throws GuzzleException + */ + public function get($uri, array $options = []): ResponseInterface + { + return $this->request('GET', $uri, $options); + } + + /** + * Create and send an HTTP HEAD request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + * + * @throws GuzzleException + */ + public function head($uri, array $options = []): ResponseInterface + { + return $this->request('HEAD', $uri, $options); + } + + /** + * Create and send an HTTP PUT request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + * + * @throws GuzzleException + */ + public function put($uri, array $options = []): ResponseInterface + { + return $this->request('PUT', $uri, $options); + } + + /** + * Create and send an HTTP POST request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + * + * @throws GuzzleException + */ + public function post($uri, array $options = []): ResponseInterface + { + return $this->request('POST', $uri, $options); + } + + /** + * Create and send an HTTP PATCH request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + * + * @throws GuzzleException + */ + public function patch($uri, array $options = []): ResponseInterface + { + return $this->request('PATCH', $uri, $options); + } + + /** + * Create and send an HTTP DELETE request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + * + * @throws GuzzleException + */ + public function delete($uri, array $options = []): ResponseInterface + { + return $this->request('DELETE', $uri, $options); + } + + /** + * Create and send an asynchronous HTTP request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. Use an array to provide a URL + * template and additional variables to use in the URL template expansion. + * + * @param string $method HTTP method + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + */ + abstract public function requestAsync(string $method, $uri, array $options = []): PromiseInterface; + + /** + * Create and send an asynchronous HTTP GET request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. Use an array to provide a URL + * template and additional variables to use in the URL template expansion. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + */ + public function getAsync($uri, array $options = []): PromiseInterface + { + return $this->requestAsync('GET', $uri, $options); + } + + /** + * Create and send an asynchronous HTTP HEAD request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. Use an array to provide a URL + * template and additional variables to use in the URL template expansion. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + */ + public function headAsync($uri, array $options = []): PromiseInterface + { + return $this->requestAsync('HEAD', $uri, $options); + } + + /** + * Create and send an asynchronous HTTP PUT request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. Use an array to provide a URL + * template and additional variables to use in the URL template expansion. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + */ + public function putAsync($uri, array $options = []): PromiseInterface + { + return $this->requestAsync('PUT', $uri, $options); + } + + /** + * Create and send an asynchronous HTTP POST request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. Use an array to provide a URL + * template and additional variables to use in the URL template expansion. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + */ + public function postAsync($uri, array $options = []): PromiseInterface + { + return $this->requestAsync('POST', $uri, $options); + } + + /** + * Create and send an asynchronous HTTP PATCH request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. Use an array to provide a URL + * template and additional variables to use in the URL template expansion. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + */ + public function patchAsync($uri, array $options = []): PromiseInterface + { + return $this->requestAsync('PATCH', $uri, $options); + } + + /** + * Create and send an asynchronous HTTP DELETE request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. Use an array to provide a URL + * template and additional variables to use in the URL template expansion. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + */ + public function deleteAsync($uri, array $options = []): PromiseInterface + { + return $this->requestAsync('DELETE', $uri, $options); + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php new file mode 100644 index 0000000..9985a98 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php @@ -0,0 +1,317 @@ +<?php + +namespace GuzzleHttp\Cookie; + +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; + +/** + * Cookie jar that stores cookies as an array + */ +class CookieJar implements CookieJarInterface +{ + /** + * @var SetCookie[] Loaded cookie data + */ + private $cookies = []; + + /** + * @var bool + */ + private $strictMode; + + /** + * @param bool $strictMode Set to true to throw exceptions when invalid + * cookies are added to the cookie jar. + * @param array $cookieArray Array of SetCookie objects or a hash of + * arrays that can be used with the SetCookie + * constructor + */ + public function __construct(bool $strictMode = false, array $cookieArray = []) + { + $this->strictMode = $strictMode; + + foreach ($cookieArray as $cookie) { + if (!($cookie instanceof SetCookie)) { + $cookie = new SetCookie($cookie); + } + $this->setCookie($cookie); + } + } + + /** + * Create a new Cookie jar from an associative array and domain. + * + * @param array $cookies Cookies to create the jar from + * @param string $domain Domain to set the cookies to + */ + public static function fromArray(array $cookies, string $domain): self + { + $cookieJar = new self(); + foreach ($cookies as $name => $value) { + $cookieJar->setCookie(new SetCookie([ + 'Domain' => $domain, + 'Name' => $name, + 'Value' => $value, + 'Discard' => true + ])); + } + + return $cookieJar; + } + + /** + * Evaluate if this cookie should be persisted to storage + * that survives between requests. + * + * @param SetCookie $cookie Being evaluated. + * @param bool $allowSessionCookies If we should persist session cookies + */ + public static function shouldPersist(SetCookie $cookie, bool $allowSessionCookies = false): bool + { + if ($cookie->getExpires() || $allowSessionCookies) { + if (!$cookie->getDiscard()) { + return true; + } + } + + return false; + } + + /** + * Finds and returns the cookie based on the name + * + * @param string $name cookie name to search for + * + * @return SetCookie|null cookie that was found or null if not found + */ + public function getCookieByName(string $name): ?SetCookie + { + foreach ($this->cookies as $cookie) { + if ($cookie->getName() !== null && \strcasecmp($cookie->getName(), $name) === 0) { + return $cookie; + } + } + + return null; + } + + /** + * @inheritDoc + */ + public function toArray(): array + { + return \array_map(static function (SetCookie $cookie): array { + return $cookie->toArray(); + }, $this->getIterator()->getArrayCopy()); + } + + /** + * @inheritDoc + */ + public function clear(?string $domain = null, ?string $path = null, ?string $name = null): void + { + if (!$domain) { + $this->cookies = []; + return; + } elseif (!$path) { + $this->cookies = \array_filter( + $this->cookies, + static function (SetCookie $cookie) use ($domain): bool { + return !$cookie->matchesDomain($domain); + } + ); + } elseif (!$name) { + $this->cookies = \array_filter( + $this->cookies, + static function (SetCookie $cookie) use ($path, $domain): bool { + return !($cookie->matchesPath($path) && + $cookie->matchesDomain($domain)); + } + ); + } else { + $this->cookies = \array_filter( + $this->cookies, + static function (SetCookie $cookie) use ($path, $domain, $name) { + return !($cookie->getName() == $name && + $cookie->matchesPath($path) && + $cookie->matchesDomain($domain)); + } + ); + } + } + + /** + * @inheritDoc + */ + public function clearSessionCookies(): void + { + $this->cookies = \array_filter( + $this->cookies, + static function (SetCookie $cookie): bool { + return !$cookie->getDiscard() && $cookie->getExpires(); + } + ); + } + + /** + * @inheritDoc + */ + public function setCookie(SetCookie $cookie): bool + { + // If the name string is empty (but not 0), ignore the set-cookie + // string entirely. + $name = $cookie->getName(); + if (!$name && $name !== '0') { + return false; + } + + // Only allow cookies with set and valid domain, name, value + $result = $cookie->validate(); + if ($result !== true) { + if ($this->strictMode) { + throw new \RuntimeException('Invalid cookie: ' . $result); + } + $this->removeCookieIfEmpty($cookie); + return false; + } + + // Resolve conflicts with previously set cookies + foreach ($this->cookies as $i => $c) { + // Two cookies are identical, when their path, and domain are + // identical. + if ($c->getPath() != $cookie->getPath() || + $c->getDomain() != $cookie->getDomain() || + $c->getName() != $cookie->getName() + ) { + continue; + } + + // The previously set cookie is a discard cookie and this one is + // not so allow the new cookie to be set + if (!$cookie->getDiscard() && $c->getDiscard()) { + unset($this->cookies[$i]); + continue; + } + + // If the new cookie's expiration is further into the future, then + // replace the old cookie + if ($cookie->getExpires() > $c->getExpires()) { + unset($this->cookies[$i]); + continue; + } + + // If the value has changed, we better change it + if ($cookie->getValue() !== $c->getValue()) { + unset($this->cookies[$i]); + continue; + } + + // The cookie exists, so no need to continue + return false; + } + + $this->cookies[] = $cookie; + + return true; + } + + public function count(): int + { + return \count($this->cookies); + } + + /** + * @return \ArrayIterator<int, SetCookie> + */ + public function getIterator(): \ArrayIterator + { + return new \ArrayIterator(\array_values($this->cookies)); + } + + public function extractCookies(RequestInterface $request, ResponseInterface $response): void + { + if ($cookieHeader = $response->getHeader('Set-Cookie')) { + foreach ($cookieHeader as $cookie) { + $sc = SetCookie::fromString($cookie); + if (!$sc->getDomain()) { + $sc->setDomain($request->getUri()->getHost()); + } + if (0 !== \strpos($sc->getPath(), '/')) { + $sc->setPath($this->getCookiePathFromRequest($request)); + } + if (!$sc->matchesDomain($request->getUri()->getHost())) { + continue; + } + // Note: At this point `$sc->getDomain()` being a public suffix should + // be rejected, but we don't want to pull in the full PSL dependency. + $this->setCookie($sc); + } + } + } + + /** + * Computes cookie path following RFC 6265 section 5.1.4 + * + * @link https://tools.ietf.org/html/rfc6265#section-5.1.4 + */ + private function getCookiePathFromRequest(RequestInterface $request): string + { + $uriPath = $request->getUri()->getPath(); + if ('' === $uriPath) { + return '/'; + } + if (0 !== \strpos($uriPath, '/')) { + return '/'; + } + if ('/' === $uriPath) { + return '/'; + } + $lastSlashPos = \strrpos($uriPath, '/'); + if (0 === $lastSlashPos || false === $lastSlashPos) { + return '/'; + } + + return \substr($uriPath, 0, $lastSlashPos); + } + + public function withCookieHeader(RequestInterface $request): RequestInterface + { + $values = []; + $uri = $request->getUri(); + $scheme = $uri->getScheme(); + $host = $uri->getHost(); + $path = $uri->getPath() ?: '/'; + + foreach ($this->cookies as $cookie) { + if ($cookie->matchesPath($path) && + $cookie->matchesDomain($host) && + !$cookie->isExpired() && + (!$cookie->getSecure() || $scheme === 'https') + ) { + $values[] = $cookie->getName() . '=' + . $cookie->getValue(); + } + } + + return $values + ? $request->withHeader('Cookie', \implode('; ', $values)) + : $request; + } + + /** + * If a cookie already exists and the server asks to set it again with a + * null value, the cookie must be deleted. + */ + private function removeCookieIfEmpty(SetCookie $cookie): void + { + $cookieValue = $cookie->getValue(); + if ($cookieValue === null || $cookieValue === '') { + $this->clear( + $cookie->getDomain(), + $cookie->getPath(), + $cookie->getName() + ); + } + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php new file mode 100644 index 0000000..7df374b --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php @@ -0,0 +1,79 @@ +<?php + +namespace GuzzleHttp\Cookie; + +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; + +/** + * Stores HTTP cookies. + * + * It extracts cookies from HTTP requests, and returns them in HTTP responses. + * CookieJarInterface instances automatically expire contained cookies when + * necessary. Subclasses are also responsible for storing and retrieving + * cookies from a file, database, etc. + * + * @link https://docs.python.org/2/library/cookielib.html Inspiration + * @extends \IteratorAggregate<SetCookie> + */ +interface CookieJarInterface extends \Countable, \IteratorAggregate +{ + /** + * Create a request with added cookie headers. + * + * If no matching cookies are found in the cookie jar, then no Cookie + * header is added to the request and the same request is returned. + * + * @param RequestInterface $request Request object to modify. + * + * @return RequestInterface returns the modified request. + */ + public function withCookieHeader(RequestInterface $request): RequestInterface; + + /** + * Extract cookies from an HTTP response and store them in the CookieJar. + * + * @param RequestInterface $request Request that was sent + * @param ResponseInterface $response Response that was received + */ + public function extractCookies(RequestInterface $request, ResponseInterface $response): void; + + /** + * Sets a cookie in the cookie jar. + * + * @param SetCookie $cookie Cookie to set. + * + * @return bool Returns true on success or false on failure + */ + public function setCookie(SetCookie $cookie): bool; + + /** + * Remove cookies currently held in the cookie jar. + * + * Invoking this method without arguments will empty the whole cookie jar. + * If given a $domain argument only cookies belonging to that domain will + * be removed. If given a $domain and $path argument, cookies belonging to + * the specified path within that domain are removed. If given all three + * arguments, then the cookie with the specified name, path and domain is + * removed. + * + * @param string|null $domain Clears cookies matching a domain + * @param string|null $path Clears cookies matching a domain and path + * @param string|null $name Clears cookies matching a domain, path, and name + */ + public function clear(?string $domain = null, ?string $path = null, ?string $name = null): void; + + /** + * Discard all sessions cookies. + * + * Removes cookies that don't have an expire field or a have a discard + * field set to true. To be called when the user agent shuts down according + * to RFC 2965. + */ + public function clearSessionCookies(): void; + + /** + * Converts the cookie jar to an array. + */ + public function toArray(): array; +} diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php b/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php new file mode 100644 index 0000000..290236d --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php @@ -0,0 +1,101 @@ +<?php + +namespace GuzzleHttp\Cookie; + +use GuzzleHttp\Utils; + +/** + * Persists non-session cookies using a JSON formatted file + */ +class FileCookieJar extends CookieJar +{ + /** + * @var string filename + */ + private $filename; + + /** + * @var bool Control whether to persist session cookies or not. + */ + private $storeSessionCookies; + + /** + * Create a new FileCookieJar object + * + * @param string $cookieFile File to store the cookie data + * @param bool $storeSessionCookies Set to true to store session cookies + * in the cookie jar. + * + * @throws \RuntimeException if the file cannot be found or created + */ + public function __construct(string $cookieFile, bool $storeSessionCookies = false) + { + parent::__construct(); + $this->filename = $cookieFile; + $this->storeSessionCookies = $storeSessionCookies; + + if (\file_exists($cookieFile)) { + $this->load($cookieFile); + } + } + + /** + * Saves the file when shutting down + */ + public function __destruct() + { + $this->save($this->filename); + } + + /** + * Saves the cookies to a file. + * + * @param string $filename File to save + * + * @throws \RuntimeException if the file cannot be found or created + */ + public function save(string $filename): void + { + $json = []; + /** @var SetCookie $cookie */ + foreach ($this as $cookie) { + if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { + $json[] = $cookie->toArray(); + } + } + + $jsonStr = Utils::jsonEncode($json); + if (false === \file_put_contents($filename, $jsonStr, \LOCK_EX)) { + throw new \RuntimeException("Unable to save file {$filename}"); + } + } + + /** + * Load cookies from a JSON formatted file. + * + * Old cookies are kept unless overwritten by newly loaded ones. + * + * @param string $filename Cookie file to load. + * + * @throws \RuntimeException if the file cannot be loaded. + */ + public function load(string $filename): void + { + $json = \file_get_contents($filename); + if (false === $json) { + throw new \RuntimeException("Unable to load file {$filename}"); + } + if ($json === '') { + return; + } + + $data = Utils::jsonDecode($json, true); + if (\is_array($data)) { + foreach ($data as $cookie) { + $this->setCookie(new SetCookie($cookie)); + } + } elseif (\is_scalar($data) && !empty($data)) { + throw new \RuntimeException("Invalid cookie file: {$filename}"); + } + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php b/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php new file mode 100644 index 0000000..5d51ca9 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php @@ -0,0 +1,77 @@ +<?php + +namespace GuzzleHttp\Cookie; + +/** + * Persists cookies in the client session + */ +class SessionCookieJar extends CookieJar +{ + /** + * @var string session key + */ + private $sessionKey; + + /** + * @var bool Control whether to persist session cookies or not. + */ + private $storeSessionCookies; + + /** + * Create a new SessionCookieJar object + * + * @param string $sessionKey Session key name to store the cookie + * data in session + * @param bool $storeSessionCookies Set to true to store session cookies + * in the cookie jar. + */ + public function __construct(string $sessionKey, bool $storeSessionCookies = false) + { + parent::__construct(); + $this->sessionKey = $sessionKey; + $this->storeSessionCookies = $storeSessionCookies; + $this->load(); + } + + /** + * Saves cookies to session when shutting down + */ + public function __destruct() + { + $this->save(); + } + + /** + * Save cookies to the client session + */ + public function save(): void + { + $json = []; + /** @var SetCookie $cookie */ + foreach ($this as $cookie) { + if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { + $json[] = $cookie->toArray(); + } + } + + $_SESSION[$this->sessionKey] = \json_encode($json); + } + + /** + * Load the contents of the client session into the data array + */ + protected function load(): void + { + if (!isset($_SESSION[$this->sessionKey])) { + return; + } + $data = \json_decode($_SESSION[$this->sessionKey], true); + if (\is_array($data)) { + foreach ($data as $cookie) { + $this->setCookie(new SetCookie($cookie)); + } + } elseif (\strlen($data)) { + throw new \RuntimeException("Invalid cookie data"); + } + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php new file mode 100644 index 0000000..a613c77 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php @@ -0,0 +1,446 @@ +<?php + +namespace GuzzleHttp\Cookie; + +/** + * Set-Cookie object + */ +class SetCookie +{ + /** + * @var array + */ + private static $defaults = [ + 'Name' => null, + 'Value' => null, + 'Domain' => null, + 'Path' => '/', + 'Max-Age' => null, + 'Expires' => null, + 'Secure' => false, + 'Discard' => false, + 'HttpOnly' => false + ]; + + /** + * @var array Cookie data + */ + private $data; + + /** + * Create a new SetCookie object from a string. + * + * @param string $cookie Set-Cookie header string + */ + public static function fromString(string $cookie): self + { + // Create the default return array + $data = self::$defaults; + // Explode the cookie string using a series of semicolons + $pieces = \array_filter(\array_map('trim', \explode(';', $cookie))); + // The name of the cookie (first kvp) must exist and include an equal sign. + if (!isset($pieces[0]) || \strpos($pieces[0], '=') === false) { + return new self($data); + } + + // Add the cookie pieces into the parsed data array + foreach ($pieces as $part) { + $cookieParts = \explode('=', $part, 2); + $key = \trim($cookieParts[0]); + $value = isset($cookieParts[1]) + ? \trim($cookieParts[1], " \n\r\t\0\x0B") + : true; + + // Only check for non-cookies when cookies have been found + if (!isset($data['Name'])) { + $data['Name'] = $key; + $data['Value'] = $value; + } else { + foreach (\array_keys(self::$defaults) as $search) { + if (!\strcasecmp($search, $key)) { + $data[$search] = $value; + continue 2; + } + } + $data[$key] = $value; + } + } + + return new self($data); + } + + /** + * @param array $data Array of cookie data provided by a Cookie parser + */ + public function __construct(array $data = []) + { + /** @var array|null $replaced will be null in case of replace error */ + $replaced = \array_replace(self::$defaults, $data); + if ($replaced === null) { + throw new \InvalidArgumentException('Unable to replace the default values for the Cookie.'); + } + + $this->data = $replaced; + // Extract the Expires value and turn it into a UNIX timestamp if needed + if (!$this->getExpires() && $this->getMaxAge()) { + // Calculate the Expires date + $this->setExpires(\time() + $this->getMaxAge()); + } elseif (null !== ($expires = $this->getExpires()) && !\is_numeric($expires)) { + $this->setExpires($expires); + } + } + + public function __toString() + { + $str = $this->data['Name'] . '=' . ($this->data['Value'] ?? '') . '; '; + foreach ($this->data as $k => $v) { + if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) { + if ($k === 'Expires') { + $str .= 'Expires=' . \gmdate('D, d M Y H:i:s \G\M\T', $v) . '; '; + } else { + $str .= ($v === true ? $k : "{$k}={$v}") . '; '; + } + } + } + + return \rtrim($str, '; '); + } + + public function toArray(): array + { + return $this->data; + } + + /** + * Get the cookie name. + * + * @return string + */ + public function getName() + { + return $this->data['Name']; + } + + /** + * Set the cookie name. + * + * @param string $name Cookie name + */ + public function setName($name): void + { + if (!is_string($name)) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['Name'] = (string) $name; + } + + /** + * Get the cookie value. + * + * @return string|null + */ + public function getValue() + { + return $this->data['Value']; + } + + /** + * Set the cookie value. + * + * @param string $value Cookie value + */ + public function setValue($value): void + { + if (!is_string($value)) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['Value'] = (string) $value; + } + + /** + * Get the domain. + * + * @return string|null + */ + public function getDomain() + { + return $this->data['Domain']; + } + + /** + * Set the domain of the cookie. + * + * @param string|null $domain + */ + public function setDomain($domain): void + { + if (!is_string($domain) && null !== $domain) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['Domain'] = null === $domain ? null : (string) $domain; + } + + /** + * Get the path. + * + * @return string + */ + public function getPath() + { + return $this->data['Path']; + } + + /** + * Set the path of the cookie. + * + * @param string $path Path of the cookie + */ + public function setPath($path): void + { + if (!is_string($path)) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['Path'] = (string) $path; + } + + /** + * Maximum lifetime of the cookie in seconds. + * + * @return int|null + */ + public function getMaxAge() + { + return null === $this->data['Max-Age'] ? null : (int) $this->data['Max-Age']; + } + + /** + * Set the max-age of the cookie. + * + * @param int|null $maxAge Max age of the cookie in seconds + */ + public function setMaxAge($maxAge): void + { + if (!is_int($maxAge) && null !== $maxAge) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['Max-Age'] = $maxAge === null ? null : (int) $maxAge; + } + + /** + * The UNIX timestamp when the cookie Expires. + * + * @return string|int|null + */ + public function getExpires() + { + return $this->data['Expires']; + } + + /** + * Set the unix timestamp for which the cookie will expire. + * + * @param int|string|null $timestamp Unix timestamp or any English textual datetime description. + */ + public function setExpires($timestamp): void + { + if (!is_int($timestamp) && !is_string($timestamp) && null !== $timestamp) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int, string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['Expires'] = null === $timestamp ? null : (\is_numeric($timestamp) ? (int) $timestamp : \strtotime((string) $timestamp)); + } + + /** + * Get whether or not this is a secure cookie. + * + * @return bool + */ + public function getSecure() + { + return $this->data['Secure']; + } + + /** + * Set whether or not the cookie is secure. + * + * @param bool $secure Set to true or false if secure + */ + public function setSecure($secure): void + { + if (!is_bool($secure)) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['Secure'] = (bool) $secure; + } + + /** + * Get whether or not this is a session cookie. + * + * @return bool|null + */ + public function getDiscard() + { + return $this->data['Discard']; + } + + /** + * Set whether or not this is a session cookie. + * + * @param bool $discard Set to true or false if this is a session cookie + */ + public function setDiscard($discard): void + { + if (!is_bool($discard)) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['Discard'] = (bool) $discard; + } + + /** + * Get whether or not this is an HTTP only cookie. + * + * @return bool + */ + public function getHttpOnly() + { + return $this->data['HttpOnly']; + } + + /** + * Set whether or not this is an HTTP only cookie. + * + * @param bool $httpOnly Set to true or false if this is HTTP only + */ + public function setHttpOnly($httpOnly): void + { + if (!is_bool($httpOnly)) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['HttpOnly'] = (bool) $httpOnly; + } + + /** + * Check if the cookie matches a path value. + * + * A request-path path-matches a given cookie-path if at least one of + * the following conditions holds: + * + * - The cookie-path and the request-path are identical. + * - The cookie-path is a prefix of the request-path, and the last + * character of the cookie-path is %x2F ("/"). + * - The cookie-path is a prefix of the request-path, and the first + * character of the request-path that is not included in the cookie- + * path is a %x2F ("/") character. + * + * @param string $requestPath Path to check against + */ + public function matchesPath(string $requestPath): bool + { + $cookiePath = $this->getPath(); + + // Match on exact matches or when path is the default empty "/" + if ($cookiePath === '/' || $cookiePath == $requestPath) { + return true; + } + + // Ensure that the cookie-path is a prefix of the request path. + if (0 !== \strpos($requestPath, $cookiePath)) { + return false; + } + + // Match if the last character of the cookie-path is "/" + if (\substr($cookiePath, -1, 1) === '/') { + return true; + } + + // Match if the first character not included in cookie path is "/" + return \substr($requestPath, \strlen($cookiePath), 1) === '/'; + } + + /** + * Check if the cookie matches a domain value. + * + * @param string $domain Domain to check against + */ + public function matchesDomain(string $domain): bool + { + $cookieDomain = $this->getDomain(); + if (null === $cookieDomain) { + return true; + } + + // Remove the leading '.' as per spec in RFC 6265. + // https://tools.ietf.org/html/rfc6265#section-5.2.3 + $cookieDomain = \ltrim(\strtolower($cookieDomain), '.'); + + $domain = \strtolower($domain); + + // Domain not set or exact match. + if ('' === $cookieDomain || $domain === $cookieDomain) { + return true; + } + + // Matching the subdomain according to RFC 6265. + // https://tools.ietf.org/html/rfc6265#section-5.1.3 + if (\filter_var($domain, \FILTER_VALIDATE_IP)) { + return false; + } + + return (bool) \preg_match('/\.' . \preg_quote($cookieDomain, '/') . '$/', $domain); + } + + /** + * Check if the cookie is expired. + */ + public function isExpired(): bool + { + return $this->getExpires() !== null && \time() > $this->getExpires(); + } + + /** + * Check if the cookie is valid according to RFC 6265. + * + * @return bool|string Returns true if valid or an error message if invalid + */ + public function validate() + { + $name = $this->getName(); + if ($name === '') { + return 'The cookie name must not be empty'; + } + + // Check if any of the invalid characters are present in the cookie name + if (\preg_match( + '/[\x00-\x20\x22\x28-\x29\x2c\x2f\x3a-\x40\x5c\x7b\x7d\x7f]/', + $name + )) { + return 'Cookie name must not contain invalid characters: ASCII ' + . 'Control characters (0-31;127), space, tab and the ' + . 'following characters: ()<>@,;:\"/?={}'; + } + + // Value must not be null. 0 and empty string are valid. Empty strings + // are technically against RFC 6265, but known to happen in the wild. + $value = $this->getValue(); + if ($value === null) { + return 'The cookie value must not be empty'; + } + + // Domains must not be empty, but can be 0. "0" is not a valid internet + // domain, but may be used as server name in a private network. + $domain = $this->getDomain(); + if ($domain === null || $domain === '') { + return 'The cookie domain must not be empty'; + } + + return true; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php b/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php new file mode 100644 index 0000000..a80956c --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php @@ -0,0 +1,39 @@ +<?php + +namespace GuzzleHttp\Exception; + +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; + +/** + * Exception when an HTTP error occurs (4xx or 5xx error) + */ +class BadResponseException extends RequestException +{ + public function __construct( + string $message, + RequestInterface $request, + ResponseInterface $response, + \Throwable $previous = null, + array $handlerContext = [] + ) { + parent::__construct($message, $request, $response, $previous, $handlerContext); + } + + /** + * Current exception and the ones that extend it will always have a response. + */ + public function hasResponse(): bool + { + return true; + } + + /** + * This function narrows the return type from the parent class and does not allow it to be nullable. + */ + public function getResponse(): ResponseInterface + { + /** @var ResponseInterface */ + return parent::getResponse(); + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php b/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php new file mode 100644 index 0000000..12fa5e3 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Exception/ClientException.php @@ -0,0 +1,10 @@ +<?php + +namespace GuzzleHttp\Exception; + +/** + * Exception when a client error is encountered (4xx codes) + */ +class ClientException extends BadResponseException +{ +} diff --git a/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php b/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php new file mode 100644 index 0000000..e1a3151 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php @@ -0,0 +1,56 @@ +<?php + +namespace GuzzleHttp\Exception; + +use Psr\Http\Client\NetworkExceptionInterface; +use Psr\Http\Message\RequestInterface; + +/** + * Exception thrown when a connection cannot be established. + * + * Note that no response is present for a ConnectException + */ +class ConnectException extends TransferException implements NetworkExceptionInterface +{ + /** + * @var RequestInterface + */ + private $request; + + /** + * @var array + */ + private $handlerContext; + + public function __construct( + string $message, + RequestInterface $request, + \Throwable $previous = null, + array $handlerContext = [] + ) { + parent::__construct($message, 0, $previous); + $this->request = $request; + $this->handlerContext = $handlerContext; + } + + /** + * Get the request that caused the exception + */ + public function getRequest(): RequestInterface + { + return $this->request; + } + + /** + * Get contextual information about the error from the underlying handler. + * + * The contents of this array will vary depending on which handler you are + * using. It may also be just an empty array. Relying on this data will + * couple you to a specific handler, but can give more debug information + * when needed. + */ + public function getHandlerContext(): array + { + return $this->handlerContext; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php b/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php new file mode 100644 index 0000000..fa3ed69 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php @@ -0,0 +1,9 @@ +<?php + +namespace GuzzleHttp\Exception; + +use Psr\Http\Client\ClientExceptionInterface; + +interface GuzzleException extends ClientExceptionInterface +{ +} diff --git a/vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php b/vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..bfd20e2 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php @@ -0,0 +1,7 @@ +<?php + +namespace GuzzleHttp\Exception; + +final class InvalidArgumentException extends \InvalidArgumentException implements GuzzleException +{ +} diff --git a/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php b/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php new file mode 100644 index 0000000..c2d0a9c --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Exception/RequestException.php @@ -0,0 +1,166 @@ +<?php + +namespace GuzzleHttp\Exception; + +use GuzzleHttp\BodySummarizer; +use GuzzleHttp\BodySummarizerInterface; +use Psr\Http\Client\RequestExceptionInterface; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\UriInterface; + +/** + * HTTP Request exception + */ +class RequestException extends TransferException implements RequestExceptionInterface +{ + /** + * @var RequestInterface + */ + private $request; + + /** + * @var ResponseInterface|null + */ + private $response; + + /** + * @var array + */ + private $handlerContext; + + public function __construct( + string $message, + RequestInterface $request, + ResponseInterface $response = null, + \Throwable $previous = null, + array $handlerContext = [] + ) { + // Set the code of the exception if the response is set and not future. + $code = $response ? $response->getStatusCode() : 0; + parent::__construct($message, $code, $previous); + $this->request = $request; + $this->response = $response; + $this->handlerContext = $handlerContext; + } + + /** + * Wrap non-RequestExceptions with a RequestException + */ + public static function wrapException(RequestInterface $request, \Throwable $e): RequestException + { + return $e instanceof RequestException ? $e : new RequestException($e->getMessage(), $request, null, $e); + } + + /** + * Factory method to create a new exception with a normalized error message + * + * @param RequestInterface $request Request sent + * @param ResponseInterface $response Response received + * @param \Throwable|null $previous Previous exception + * @param array $handlerContext Optional handler context + * @param BodySummarizerInterface|null $bodySummarizer Optional body summarizer + */ + public static function create( + RequestInterface $request, + ResponseInterface $response = null, + \Throwable $previous = null, + array $handlerContext = [], + BodySummarizerInterface $bodySummarizer = null + ): self { + if (!$response) { + return new self( + 'Error completing request', + $request, + null, + $previous, + $handlerContext + ); + } + + $level = (int) \floor($response->getStatusCode() / 100); + if ($level === 4) { + $label = 'Client error'; + $className = ClientException::class; + } elseif ($level === 5) { + $label = 'Server error'; + $className = ServerException::class; + } else { + $label = 'Unsuccessful request'; + $className = __CLASS__; + } + + $uri = $request->getUri(); + $uri = static::obfuscateUri($uri); + + // Client Error: `GET /` resulted in a `404 Not Found` response: + // <html> ... (truncated) + $message = \sprintf( + '%s: `%s %s` resulted in a `%s %s` response', + $label, + $request->getMethod(), + $uri->__toString(), + $response->getStatusCode(), + $response->getReasonPhrase() + ); + + $summary = ($bodySummarizer ?? new BodySummarizer())->summarize($response); + + if ($summary !== null) { + $message .= ":\n{$summary}\n"; + } + + return new $className($message, $request, $response, $previous, $handlerContext); + } + + /** + * Obfuscates URI if there is a username and a password present + */ + private static function obfuscateUri(UriInterface $uri): UriInterface + { + $userInfo = $uri->getUserInfo(); + + if (false !== ($pos = \strpos($userInfo, ':'))) { + return $uri->withUserInfo(\substr($userInfo, 0, $pos), '***'); + } + + return $uri; + } + + /** + * Get the request that caused the exception + */ + public function getRequest(): RequestInterface + { + return $this->request; + } + + /** + * Get the associated response + */ + public function getResponse(): ?ResponseInterface + { + return $this->response; + } + + /** + * Check if a response was received + */ + public function hasResponse(): bool + { + return $this->response !== null; + } + + /** + * Get contextual information about the error from the underlying handler. + * + * The contents of this array will vary depending on which handler you are + * using. It may also be just an empty array. Relying on this data will + * couple you to a specific handler, but can give more debug information + * when needed. + */ + public function getHandlerContext(): array + { + return $this->handlerContext; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php b/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php new file mode 100644 index 0000000..8055e06 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php @@ -0,0 +1,10 @@ +<?php + +namespace GuzzleHttp\Exception; + +/** + * Exception when a server error is encountered (5xx codes) + */ +class ServerException extends BadResponseException +{ +} diff --git a/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php b/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php new file mode 100644 index 0000000..fad3a57 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php @@ -0,0 +1,7 @@ +<?php + +namespace GuzzleHttp\Exception; + +class TooManyRedirectsException extends RequestException +{ +} diff --git a/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php b/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php new file mode 100644 index 0000000..5076336 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Exception/TransferException.php @@ -0,0 +1,7 @@ +<?php + +namespace GuzzleHttp\Exception; + +class TransferException extends \RuntimeException implements GuzzleException +{ +} diff --git a/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php b/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php new file mode 100644 index 0000000..0c45089 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php @@ -0,0 +1,595 @@ +<?php + +namespace GuzzleHttp\Handler; + +use GuzzleHttp\Exception\ConnectException; +use GuzzleHttp\Exception\RequestException; +use GuzzleHttp\Promise as P; +use GuzzleHttp\Promise\FulfilledPromise; +use GuzzleHttp\Promise\PromiseInterface; +use GuzzleHttp\Psr7\LazyOpenStream; +use GuzzleHttp\TransferStats; +use GuzzleHttp\Utils; +use Psr\Http\Message\RequestInterface; + +/** + * Creates curl resources from a request + * + * @final + */ +class CurlFactory implements CurlFactoryInterface +{ + public const CURL_VERSION_STR = 'curl_version'; + + /** + * @deprecated + */ + public const LOW_CURL_VERSION_NUMBER = '7.21.2'; + + /** + * @var resource[]|\CurlHandle[] + */ + private $handles = []; + + /** + * @var int Total number of idle handles to keep in cache + */ + private $maxHandles; + + /** + * @param int $maxHandles Maximum number of idle handles. + */ + public function __construct(int $maxHandles) + { + $this->maxHandles = $maxHandles; + } + + public function create(RequestInterface $request, array $options): EasyHandle + { + if (isset($options['curl']['body_as_string'])) { + $options['_body_as_string'] = $options['curl']['body_as_string']; + unset($options['curl']['body_as_string']); + } + + $easy = new EasyHandle; + $easy->request = $request; + $easy->options = $options; + $conf = $this->getDefaultConf($easy); + $this->applyMethod($easy, $conf); + $this->applyHandlerOptions($easy, $conf); + $this->applyHeaders($easy, $conf); + unset($conf['_headers']); + + // Add handler options from the request configuration options + if (isset($options['curl'])) { + $conf = \array_replace($conf, $options['curl']); + } + + $conf[\CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy); + $easy->handle = $this->handles ? \array_pop($this->handles) : \curl_init(); + curl_setopt_array($easy->handle, $conf); + + return $easy; + } + + public function release(EasyHandle $easy): void + { + $resource = $easy->handle; + unset($easy->handle); + + if (\count($this->handles) >= $this->maxHandles) { + \curl_close($resource); + } else { + // Remove all callback functions as they can hold onto references + // and are not cleaned up by curl_reset. Using curl_setopt_array + // does not work for some reason, so removing each one + // individually. + \curl_setopt($resource, \CURLOPT_HEADERFUNCTION, null); + \curl_setopt($resource, \CURLOPT_READFUNCTION, null); + \curl_setopt($resource, \CURLOPT_WRITEFUNCTION, null); + \curl_setopt($resource, \CURLOPT_PROGRESSFUNCTION, null); + \curl_reset($resource); + $this->handles[] = $resource; + } + } + + /** + * Completes a cURL transaction, either returning a response promise or a + * rejected promise. + * + * @param callable(RequestInterface, array): PromiseInterface $handler + * @param CurlFactoryInterface $factory Dictates how the handle is released + */ + public static function finish(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory): PromiseInterface + { + if (isset($easy->options['on_stats'])) { + self::invokeStats($easy); + } + + if (!$easy->response || $easy->errno) { + return self::finishError($handler, $easy, $factory); + } + + // Return the response if it is present and there is no error. + $factory->release($easy); + + // Rewind the body of the response if possible. + $body = $easy->response->getBody(); + if ($body->isSeekable()) { + $body->rewind(); + } + + return new FulfilledPromise($easy->response); + } + + private static function invokeStats(EasyHandle $easy): void + { + $curlStats = \curl_getinfo($easy->handle); + $curlStats['appconnect_time'] = \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME); + $stats = new TransferStats( + $easy->request, + $easy->response, + $curlStats['total_time'], + $easy->errno, + $curlStats + ); + ($easy->options['on_stats'])($stats); + } + + /** + * @param callable(RequestInterface, array): PromiseInterface $handler + */ + private static function finishError(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory): PromiseInterface + { + // Get error information and release the handle to the factory. + $ctx = [ + 'errno' => $easy->errno, + 'error' => \curl_error($easy->handle), + 'appconnect_time' => \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME), + ] + \curl_getinfo($easy->handle); + $ctx[self::CURL_VERSION_STR] = \curl_version()['version']; + $factory->release($easy); + + // Retry when nothing is present or when curl failed to rewind. + if (empty($easy->options['_err_message']) && (!$easy->errno || $easy->errno == 65)) { + return self::retryFailedRewind($handler, $easy, $ctx); + } + + return self::createRejection($easy, $ctx); + } + + private static function createRejection(EasyHandle $easy, array $ctx): PromiseInterface + { + static $connectionErrors = [ + \CURLE_OPERATION_TIMEOUTED => true, + \CURLE_COULDNT_RESOLVE_HOST => true, + \CURLE_COULDNT_CONNECT => true, + \CURLE_SSL_CONNECT_ERROR => true, + \CURLE_GOT_NOTHING => true, + ]; + + if ($easy->createResponseException) { + return P\Create::rejectionFor( + new RequestException( + 'An error was encountered while creating the response', + $easy->request, + $easy->response, + $easy->createResponseException, + $ctx + ) + ); + } + + // If an exception was encountered during the onHeaders event, then + // return a rejected promise that wraps that exception. + if ($easy->onHeadersException) { + return P\Create::rejectionFor( + new RequestException( + 'An error was encountered during the on_headers event', + $easy->request, + $easy->response, + $easy->onHeadersException, + $ctx + ) + ); + } + + $message = \sprintf( + 'cURL error %s: %s (%s)', + $ctx['errno'], + $ctx['error'], + 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html' + ); + $uriString = (string) $easy->request->getUri(); + if ($uriString !== '' && false === \strpos($ctx['error'], $uriString)) { + $message .= \sprintf(' for %s', $uriString); + } + + // Create a connection exception if it was a specific error code. + $error = isset($connectionErrors[$easy->errno]) + ? new ConnectException($message, $easy->request, null, $ctx) + : new RequestException($message, $easy->request, $easy->response, null, $ctx); + + return P\Create::rejectionFor($error); + } + + /** + * @return array<int|string, mixed> + */ + private function getDefaultConf(EasyHandle $easy): array + { + $conf = [ + '_headers' => $easy->request->getHeaders(), + \CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(), + \CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''), + \CURLOPT_RETURNTRANSFER => false, + \CURLOPT_HEADER => false, + \CURLOPT_CONNECTTIMEOUT => 150, + ]; + + if (\defined('CURLOPT_PROTOCOLS')) { + $conf[\CURLOPT_PROTOCOLS] = \CURLPROTO_HTTP | \CURLPROTO_HTTPS; + } + + $version = $easy->request->getProtocolVersion(); + if ($version == 1.1) { + $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_1; + } elseif ($version == 2.0) { + $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_2_0; + } else { + $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_0; + } + + return $conf; + } + + private function applyMethod(EasyHandle $easy, array &$conf): void + { + $body = $easy->request->getBody(); + $size = $body->getSize(); + + if ($size === null || $size > 0) { + $this->applyBody($easy->request, $easy->options, $conf); + return; + } + + $method = $easy->request->getMethod(); + if ($method === 'PUT' || $method === 'POST') { + // See https://tools.ietf.org/html/rfc7230#section-3.3.2 + if (!$easy->request->hasHeader('Content-Length')) { + $conf[\CURLOPT_HTTPHEADER][] = 'Content-Length: 0'; + } + } elseif ($method === 'HEAD') { + $conf[\CURLOPT_NOBODY] = true; + unset( + $conf[\CURLOPT_WRITEFUNCTION], + $conf[\CURLOPT_READFUNCTION], + $conf[\CURLOPT_FILE], + $conf[\CURLOPT_INFILE] + ); + } + } + + private function applyBody(RequestInterface $request, array $options, array &$conf): void + { + $size = $request->hasHeader('Content-Length') + ? (int) $request->getHeaderLine('Content-Length') + : null; + + // Send the body as a string if the size is less than 1MB OR if the + // [curl][body_as_string] request value is set. + if (($size !== null && $size < 1000000) || !empty($options['_body_as_string'])) { + $conf[\CURLOPT_POSTFIELDS] = (string) $request->getBody(); + // Don't duplicate the Content-Length header + $this->removeHeader('Content-Length', $conf); + $this->removeHeader('Transfer-Encoding', $conf); + } else { + $conf[\CURLOPT_UPLOAD] = true; + if ($size !== null) { + $conf[\CURLOPT_INFILESIZE] = $size; + $this->removeHeader('Content-Length', $conf); + } + $body = $request->getBody(); + if ($body->isSeekable()) { + $body->rewind(); + } + $conf[\CURLOPT_READFUNCTION] = static function ($ch, $fd, $length) use ($body) { + return $body->read($length); + }; + } + + // If the Expect header is not present, prevent curl from adding it + if (!$request->hasHeader('Expect')) { + $conf[\CURLOPT_HTTPHEADER][] = 'Expect:'; + } + + // cURL sometimes adds a content-type by default. Prevent this. + if (!$request->hasHeader('Content-Type')) { + $conf[\CURLOPT_HTTPHEADER][] = 'Content-Type:'; + } + } + + private function applyHeaders(EasyHandle $easy, array &$conf): void + { + foreach ($conf['_headers'] as $name => $values) { + foreach ($values as $value) { + $value = (string) $value; + if ($value === '') { + // cURL requires a special format for empty headers. + // See https://github.com/guzzle/guzzle/issues/1882 for more details. + $conf[\CURLOPT_HTTPHEADER][] = "$name;"; + } else { + $conf[\CURLOPT_HTTPHEADER][] = "$name: $value"; + } + } + } + + // Remove the Accept header if one was not set + if (!$easy->request->hasHeader('Accept')) { + $conf[\CURLOPT_HTTPHEADER][] = 'Accept:'; + } + } + + /** + * Remove a header from the options array. + * + * @param string $name Case-insensitive header to remove + * @param array $options Array of options to modify + */ + private function removeHeader(string $name, array &$options): void + { + foreach (\array_keys($options['_headers']) as $key) { + if (!\strcasecmp($key, $name)) { + unset($options['_headers'][$key]); + return; + } + } + } + + private function applyHandlerOptions(EasyHandle $easy, array &$conf): void + { + $options = $easy->options; + if (isset($options['verify'])) { + if ($options['verify'] === false) { + unset($conf[\CURLOPT_CAINFO]); + $conf[\CURLOPT_SSL_VERIFYHOST] = 0; + $conf[\CURLOPT_SSL_VERIFYPEER] = false; + } else { + $conf[\CURLOPT_SSL_VERIFYHOST] = 2; + $conf[\CURLOPT_SSL_VERIFYPEER] = true; + if (\is_string($options['verify'])) { + // Throw an error if the file/folder/link path is not valid or doesn't exist. + if (!\file_exists($options['verify'])) { + throw new \InvalidArgumentException("SSL CA bundle not found: {$options['verify']}"); + } + // If it's a directory or a link to a directory use CURLOPT_CAPATH. + // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO. + if ( + \is_dir($options['verify']) || + ( + \is_link($options['verify']) === true && + ($verifyLink = \readlink($options['verify'])) !== false && + \is_dir($verifyLink) + ) + ) { + $conf[\CURLOPT_CAPATH] = $options['verify']; + } else { + $conf[\CURLOPT_CAINFO] = $options['verify']; + } + } + } + } + + if (!isset($options['curl'][\CURLOPT_ENCODING]) && !empty($options['decode_content'])) { + $accept = $easy->request->getHeaderLine('Accept-Encoding'); + if ($accept) { + $conf[\CURLOPT_ENCODING] = $accept; + } else { + // The empty string enables all available decoders and implicitly + // sets a matching 'Accept-Encoding' header. + $conf[\CURLOPT_ENCODING] = ''; + // But as the user did not specify any acceptable encodings we need + // to overwrite this implicit header with an empty one. + $conf[\CURLOPT_HTTPHEADER][] = 'Accept-Encoding:'; + } + } + + if (!isset($options['sink'])) { + // Use a default temp stream if no sink was set. + $options['sink'] = \GuzzleHttp\Psr7\Utils::tryFopen('php://temp', 'w+'); + } + $sink = $options['sink']; + if (!\is_string($sink)) { + $sink = \GuzzleHttp\Psr7\Utils::streamFor($sink); + } elseif (!\is_dir(\dirname($sink))) { + // Ensure that the directory exists before failing in curl. + throw new \RuntimeException(\sprintf('Directory %s does not exist for sink value of %s', \dirname($sink), $sink)); + } else { + $sink = new LazyOpenStream($sink, 'w+'); + } + $easy->sink = $sink; + $conf[\CURLOPT_WRITEFUNCTION] = static function ($ch, $write) use ($sink): int { + return $sink->write($write); + }; + + $timeoutRequiresNoSignal = false; + if (isset($options['timeout'])) { + $timeoutRequiresNoSignal |= $options['timeout'] < 1; + $conf[\CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000; + } + + // CURL default value is CURL_IPRESOLVE_WHATEVER + if (isset($options['force_ip_resolve'])) { + if ('v4' === $options['force_ip_resolve']) { + $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V4; + } elseif ('v6' === $options['force_ip_resolve']) { + $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V6; + } + } + + if (isset($options['connect_timeout'])) { + $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1; + $conf[\CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000; + } + + if ($timeoutRequiresNoSignal && \strtoupper(\substr(\PHP_OS, 0, 3)) !== 'WIN') { + $conf[\CURLOPT_NOSIGNAL] = true; + } + + if (isset($options['proxy'])) { + if (!\is_array($options['proxy'])) { + $conf[\CURLOPT_PROXY] = $options['proxy']; + } else { + $scheme = $easy->request->getUri()->getScheme(); + if (isset($options['proxy'][$scheme])) { + $host = $easy->request->getUri()->getHost(); + if (!isset($options['proxy']['no']) || !Utils::isHostInNoProxy($host, $options['proxy']['no'])) { + $conf[\CURLOPT_PROXY] = $options['proxy'][$scheme]; + } + } + } + } + + if (isset($options['cert'])) { + $cert = $options['cert']; + if (\is_array($cert)) { + $conf[\CURLOPT_SSLCERTPASSWD] = $cert[1]; + $cert = $cert[0]; + } + if (!\file_exists($cert)) { + throw new \InvalidArgumentException("SSL certificate not found: {$cert}"); + } + # OpenSSL (versions 0.9.3 and later) also support "P12" for PKCS#12-encoded files. + # see https://curl.se/libcurl/c/CURLOPT_SSLCERTTYPE.html + $ext = pathinfo($cert, \PATHINFO_EXTENSION); + if (preg_match('#^(der|p12)$#i', $ext)) { + $conf[\CURLOPT_SSLCERTTYPE] = strtoupper($ext); + } + $conf[\CURLOPT_SSLCERT] = $cert; + } + + if (isset($options['ssl_key'])) { + if (\is_array($options['ssl_key'])) { + if (\count($options['ssl_key']) === 2) { + [$sslKey, $conf[\CURLOPT_SSLKEYPASSWD]] = $options['ssl_key']; + } else { + [$sslKey] = $options['ssl_key']; + } + } + + $sslKey = $sslKey ?? $options['ssl_key']; + + if (!\file_exists($sslKey)) { + throw new \InvalidArgumentException("SSL private key not found: {$sslKey}"); + } + $conf[\CURLOPT_SSLKEY] = $sslKey; + } + + if (isset($options['progress'])) { + $progress = $options['progress']; + if (!\is_callable($progress)) { + throw new \InvalidArgumentException('progress client option must be callable'); + } + $conf[\CURLOPT_NOPROGRESS] = false; + $conf[\CURLOPT_PROGRESSFUNCTION] = static function ($resource, int $downloadSize, int $downloaded, int $uploadSize, int $uploaded) use ($progress) { + $progress($downloadSize, $downloaded, $uploadSize, $uploaded); + }; + } + + if (!empty($options['debug'])) { + $conf[\CURLOPT_STDERR] = Utils::debugResource($options['debug']); + $conf[\CURLOPT_VERBOSE] = true; + } + } + + /** + * This function ensures that a response was set on a transaction. If one + * was not set, then the request is retried if possible. This error + * typically means you are sending a payload, curl encountered a + * "Connection died, retrying a fresh connect" error, tried to rewind the + * stream, and then encountered a "necessary data rewind wasn't possible" + * error, causing the request to be sent through curl_multi_info_read() + * without an error status. + * + * @param callable(RequestInterface, array): PromiseInterface $handler + */ + private static function retryFailedRewind(callable $handler, EasyHandle $easy, array $ctx): PromiseInterface + { + try { + // Only rewind if the body has been read from. + $body = $easy->request->getBody(); + if ($body->tell() > 0) { + $body->rewind(); + } + } catch (\RuntimeException $e) { + $ctx['error'] = 'The connection unexpectedly failed without ' + . 'providing an error. The request would have been retried, ' + . 'but attempting to rewind the request body failed. ' + . 'Exception: ' . $e; + return self::createRejection($easy, $ctx); + } + + // Retry no more than 3 times before giving up. + if (!isset($easy->options['_curl_retries'])) { + $easy->options['_curl_retries'] = 1; + } elseif ($easy->options['_curl_retries'] == 2) { + $ctx['error'] = 'The cURL request was retried 3 times ' + . 'and did not succeed. The most likely reason for the failure ' + . 'is that cURL was unable to rewind the body of the request ' + . 'and subsequent retries resulted in the same error. Turn on ' + . 'the debug option to see what went wrong. See ' + . 'https://bugs.php.net/bug.php?id=47204 for more information.'; + return self::createRejection($easy, $ctx); + } else { + $easy->options['_curl_retries']++; + } + + return $handler($easy->request, $easy->options); + } + + private function createHeaderFn(EasyHandle $easy): callable + { + if (isset($easy->options['on_headers'])) { + $onHeaders = $easy->options['on_headers']; + + if (!\is_callable($onHeaders)) { + throw new \InvalidArgumentException('on_headers must be callable'); + } + } else { + $onHeaders = null; + } + + return static function ($ch, $h) use ( + $onHeaders, + $easy, + &$startingResponse + ) { + $value = \trim($h); + if ($value === '') { + $startingResponse = true; + try { + $easy->createResponse(); + } catch (\Exception $e) { + $easy->createResponseException = $e; + return -1; + } + if ($onHeaders !== null) { + try { + $onHeaders($easy->response); + } catch (\Exception $e) { + // Associate the exception with the handle and trigger + // a curl header write error by returning 0. + $easy->onHeadersException = $e; + return -1; + } + } + } elseif ($startingResponse) { + $startingResponse = false; + $easy->headers = [$value]; + } else { + $easy->headers[] = $value; + } + return \strlen($h); + }; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php b/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php new file mode 100644 index 0000000..fe57ed5 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php @@ -0,0 +1,25 @@ +<?php + +namespace GuzzleHttp\Handler; + +use Psr\Http\Message\RequestInterface; + +interface CurlFactoryInterface +{ + /** + * Creates a cURL handle resource. + * + * @param RequestInterface $request Request + * @param array $options Transfer options + * + * @throws \RuntimeException when an option cannot be applied + */ + public function create(RequestInterface $request, array $options): EasyHandle; + + /** + * Release an easy handle, allowing it to be reused or closed. + * + * This function must call unset on the easy handle's "handle" property. + */ + public function release(EasyHandle $easy): void; +} diff --git a/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php new file mode 100644 index 0000000..9ad10a9 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php @@ -0,0 +1,49 @@ +<?php + +namespace GuzzleHttp\Handler; + +use GuzzleHttp\Promise\PromiseInterface; +use Psr\Http\Message\RequestInterface; + +/** + * HTTP handler that uses cURL easy handles as a transport layer. + * + * When using the CurlHandler, custom curl options can be specified as an + * associative array of curl option constants mapping to values in the + * **curl** key of the "client" key of the request. + * + * @final + */ +class CurlHandler +{ + /** + * @var CurlFactoryInterface + */ + private $factory; + + /** + * Accepts an associative array of options: + * + * - handle_factory: Optional curl factory used to create cURL handles. + * + * @param array{handle_factory?: ?CurlFactoryInterface} $options Array of options to use with the handler + */ + public function __construct(array $options = []) + { + $this->factory = $options['handle_factory'] + ?? new CurlFactory(3); + } + + public function __invoke(RequestInterface $request, array $options): PromiseInterface + { + if (isset($options['delay'])) { + \usleep($options['delay'] * 1000); + } + + $easy = $this->factory->create($request, $options); + \curl_exec($easy->handle); + $easy->errno = \curl_errno($easy->handle); + + return CurlFactory::finish($this, $easy, $this->factory); + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php new file mode 100644 index 0000000..4356d02 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php @@ -0,0 +1,262 @@ +<?php + +namespace GuzzleHttp\Handler; + +use GuzzleHttp\Promise as P; +use GuzzleHttp\Promise\Promise; +use GuzzleHttp\Promise\PromiseInterface; +use GuzzleHttp\Utils; +use Psr\Http\Message\RequestInterface; + +/** + * Returns an asynchronous response using curl_multi_* functions. + * + * When using the CurlMultiHandler, custom curl options can be specified as an + * associative array of curl option constants mapping to values in the + * **curl** key of the provided request options. + * + * @property resource|\CurlMultiHandle $_mh Internal use only. Lazy loaded multi-handle. + * + * @final + */ +#[\AllowDynamicProperties] +class CurlMultiHandler +{ + /** + * @var CurlFactoryInterface + */ + private $factory; + + /** + * @var int + */ + private $selectTimeout; + + /** + * @var int Will be higher than 0 when `curl_multi_exec` is still running. + */ + private $active = 0; + + /** + * @var array Request entry handles, indexed by handle id in `addRequest`. + * + * @see CurlMultiHandler::addRequest + */ + private $handles = []; + + /** + * @var array<int, float> An array of delay times, indexed by handle id in `addRequest`. + * + * @see CurlMultiHandler::addRequest + */ + private $delays = []; + + /** + * @var array<mixed> An associative array of CURLMOPT_* options and corresponding values for curl_multi_setopt() + */ + private $options = []; + + /** + * This handler accepts the following options: + * + * - handle_factory: An optional factory used to create curl handles + * - select_timeout: Optional timeout (in seconds) to block before timing + * out while selecting curl handles. Defaults to 1 second. + * - options: An associative array of CURLMOPT_* options and + * corresponding values for curl_multi_setopt() + */ + public function __construct(array $options = []) + { + $this->factory = $options['handle_factory'] ?? new CurlFactory(50); + + if (isset($options['select_timeout'])) { + $this->selectTimeout = $options['select_timeout']; + } elseif ($selectTimeout = Utils::getenv('GUZZLE_CURL_SELECT_TIMEOUT')) { + @trigger_error('Since guzzlehttp/guzzle 7.2.0: Using environment variable GUZZLE_CURL_SELECT_TIMEOUT is deprecated. Use option "select_timeout" instead.', \E_USER_DEPRECATED); + $this->selectTimeout = (int) $selectTimeout; + } else { + $this->selectTimeout = 1; + } + + $this->options = $options['options'] ?? []; + } + + /** + * @param string $name + * + * @return resource|\CurlMultiHandle + * + * @throws \BadMethodCallException when another field as `_mh` will be gotten + * @throws \RuntimeException when curl can not initialize a multi handle + */ + public function __get($name) + { + if ($name !== '_mh') { + throw new \BadMethodCallException("Can not get other property as '_mh'."); + } + + $multiHandle = \curl_multi_init(); + + if (false === $multiHandle) { + throw new \RuntimeException('Can not initialize curl multi handle.'); + } + + $this->_mh = $multiHandle; + + foreach ($this->options as $option => $value) { + // A warning is raised in case of a wrong option. + curl_multi_setopt($this->_mh, $option, $value); + } + + return $this->_mh; + } + + public function __destruct() + { + if (isset($this->_mh)) { + \curl_multi_close($this->_mh); + unset($this->_mh); + } + } + + public function __invoke(RequestInterface $request, array $options): PromiseInterface + { + $easy = $this->factory->create($request, $options); + $id = (int) $easy->handle; + + $promise = new Promise( + [$this, 'execute'], + function () use ($id) { + return $this->cancel($id); + } + ); + + $this->addRequest(['easy' => $easy, 'deferred' => $promise]); + + return $promise; + } + + /** + * Ticks the curl event loop. + */ + public function tick(): void + { + // Add any delayed handles if needed. + if ($this->delays) { + $currentTime = Utils::currentTime(); + foreach ($this->delays as $id => $delay) { + if ($currentTime >= $delay) { + unset($this->delays[$id]); + \curl_multi_add_handle( + $this->_mh, + $this->handles[$id]['easy']->handle + ); + } + } + } + + // Step through the task queue which may add additional requests. + P\Utils::queue()->run(); + + if ($this->active && \curl_multi_select($this->_mh, $this->selectTimeout) === -1) { + // Perform a usleep if a select returns -1. + // See: https://bugs.php.net/bug.php?id=61141 + \usleep(250); + } + + while (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM); + + $this->processMessages(); + } + + /** + * Runs until all outstanding connections have completed. + */ + public function execute(): void + { + $queue = P\Utils::queue(); + + while ($this->handles || !$queue->isEmpty()) { + // If there are no transfers, then sleep for the next delay + if (!$this->active && $this->delays) { + \usleep($this->timeToNext()); + } + $this->tick(); + } + } + + private function addRequest(array $entry): void + { + $easy = $entry['easy']; + $id = (int) $easy->handle; + $this->handles[$id] = $entry; + if (empty($easy->options['delay'])) { + \curl_multi_add_handle($this->_mh, $easy->handle); + } else { + $this->delays[$id] = Utils::currentTime() + ($easy->options['delay'] / 1000); + } + } + + /** + * Cancels a handle from sending and removes references to it. + * + * @param int $id Handle ID to cancel and remove. + * + * @return bool True on success, false on failure. + */ + private function cancel($id): bool + { + if (!is_int($id)) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an integer to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + // Cannot cancel if it has been processed. + if (!isset($this->handles[$id])) { + return false; + } + + $handle = $this->handles[$id]['easy']->handle; + unset($this->delays[$id], $this->handles[$id]); + \curl_multi_remove_handle($this->_mh, $handle); + \curl_close($handle); + + return true; + } + + private function processMessages(): void + { + while ($done = \curl_multi_info_read($this->_mh)) { + if ($done['msg'] !== \CURLMSG_DONE) { + // if it's not done, then it would be premature to remove the handle. ref https://github.com/guzzle/guzzle/pull/2892#issuecomment-945150216 + continue; + } + $id = (int) $done['handle']; + \curl_multi_remove_handle($this->_mh, $done['handle']); + + if (!isset($this->handles[$id])) { + // Probably was cancelled. + continue; + } + + $entry = $this->handles[$id]; + unset($this->handles[$id], $this->delays[$id]); + $entry['easy']->errno = $done['result']; + $entry['deferred']->resolve( + CurlFactory::finish($this, $entry['easy'], $this->factory) + ); + } + } + + private function timeToNext(): int + { + $currentTime = Utils::currentTime(); + $nextTime = \PHP_INT_MAX; + foreach ($this->delays as $time) { + if ($time < $nextTime) { + $nextTime = $time; + } + } + + return ((int) \max(0, $nextTime - $currentTime)) * 1000000; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php b/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php new file mode 100644 index 0000000..224344d --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php @@ -0,0 +1,112 @@ +<?php + +namespace GuzzleHttp\Handler; + +use GuzzleHttp\Psr7\Response; +use GuzzleHttp\Utils; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\StreamInterface; + +/** + * Represents a cURL easy handle and the data it populates. + * + * @internal + */ +final class EasyHandle +{ + /** + * @var resource|\CurlHandle cURL resource + */ + public $handle; + + /** + * @var StreamInterface Where data is being written + */ + public $sink; + + /** + * @var array Received HTTP headers so far + */ + public $headers = []; + + /** + * @var ResponseInterface|null Received response (if any) + */ + public $response; + + /** + * @var RequestInterface Request being sent + */ + public $request; + + /** + * @var array Request options + */ + public $options = []; + + /** + * @var int cURL error number (if any) + */ + public $errno = 0; + + /** + * @var \Throwable|null Exception during on_headers (if any) + */ + public $onHeadersException; + + /** + * @var \Exception|null Exception during createResponse (if any) + */ + public $createResponseException; + + /** + * Attach a response to the easy handle based on the received headers. + * + * @throws \RuntimeException if no headers have been received or the first + * header line is invalid. + */ + public function createResponse(): void + { + [$ver, $status, $reason, $headers] = HeaderProcessor::parseHeaders($this->headers); + + $normalizedKeys = Utils::normalizeHeaderKeys($headers); + + if (!empty($this->options['decode_content']) && isset($normalizedKeys['content-encoding'])) { + $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']]; + unset($headers[$normalizedKeys['content-encoding']]); + if (isset($normalizedKeys['content-length'])) { + $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']]; + + $bodyLength = (int) $this->sink->getSize(); + if ($bodyLength) { + $headers[$normalizedKeys['content-length']] = $bodyLength; + } else { + unset($headers[$normalizedKeys['content-length']]); + } + } + } + + // Attach a response to the easy handle with the parsed headers. + $this->response = new Response( + $status, + $headers, + $this->sink, + $ver, + $reason + ); + } + + /** + * @param string $name + * + * @return void + * + * @throws \BadMethodCallException + */ + public function __get($name) + { + $msg = $name === 'handle' ? 'The EasyHandle has been released' : 'Invalid property: ' . $name; + throw new \BadMethodCallException($msg); + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php b/vendor/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php new file mode 100644 index 0000000..a098884 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php @@ -0,0 +1,42 @@ +<?php + +namespace GuzzleHttp\Handler; + +use GuzzleHttp\Utils; + +/** + * @internal + */ +final class HeaderProcessor +{ + /** + * Returns the HTTP version, status code, reason phrase, and headers. + * + * @param string[] $headers + * + * @throws \RuntimeException + * + * @return array{0:string, 1:int, 2:?string, 3:array} + */ + public static function parseHeaders(array $headers): array + { + if ($headers === []) { + throw new \RuntimeException('Expected a non-empty array of header data'); + } + + $parts = \explode(' ', \array_shift($headers), 3); + $version = \explode('/', $parts[0])[1] ?? null; + + if ($version === null) { + throw new \RuntimeException('HTTP version missing from header data'); + } + + $status = $parts[1] ?? null; + + if ($status === null) { + throw new \RuntimeException('HTTP status code missing from header data'); + } + + return [$version, (int) $status, $parts[2] ?? null, Utils::headersFromLines($headers)]; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php new file mode 100644 index 0000000..79664e2 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php @@ -0,0 +1,211 @@ +<?php + +namespace GuzzleHttp\Handler; + +use GuzzleHttp\Exception\RequestException; +use GuzzleHttp\HandlerStack; +use GuzzleHttp\Promise as P; +use GuzzleHttp\Promise\PromiseInterface; +use GuzzleHttp\TransferStats; +use GuzzleHttp\Utils; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\StreamInterface; + +/** + * Handler that returns responses or throw exceptions from a queue. + * + * @final + */ +class MockHandler implements \Countable +{ + /** + * @var array + */ + private $queue = []; + + /** + * @var RequestInterface|null + */ + private $lastRequest; + + /** + * @var array + */ + private $lastOptions = []; + + /** + * @var callable|null + */ + private $onFulfilled; + + /** + * @var callable|null + */ + private $onRejected; + + /** + * Creates a new MockHandler that uses the default handler stack list of + * middlewares. + * + * @param array|null $queue Array of responses, callables, or exceptions. + * @param callable|null $onFulfilled Callback to invoke when the return value is fulfilled. + * @param callable|null $onRejected Callback to invoke when the return value is rejected. + */ + public static function createWithMiddleware(array $queue = null, callable $onFulfilled = null, callable $onRejected = null): HandlerStack + { + return HandlerStack::create(new self($queue, $onFulfilled, $onRejected)); + } + + /** + * The passed in value must be an array of + * {@see \Psr\Http\Message\ResponseInterface} objects, Exceptions, + * callables, or Promises. + * + * @param array<int, mixed>|null $queue The parameters to be passed to the append function, as an indexed array. + * @param callable|null $onFulfilled Callback to invoke when the return value is fulfilled. + * @param callable|null $onRejected Callback to invoke when the return value is rejected. + */ + public function __construct(array $queue = null, callable $onFulfilled = null, callable $onRejected = null) + { + $this->onFulfilled = $onFulfilled; + $this->onRejected = $onRejected; + + if ($queue) { + // array_values included for BC + $this->append(...array_values($queue)); + } + } + + public function __invoke(RequestInterface $request, array $options): PromiseInterface + { + if (!$this->queue) { + throw new \OutOfBoundsException('Mock queue is empty'); + } + + if (isset($options['delay']) && \is_numeric($options['delay'])) { + \usleep((int) $options['delay'] * 1000); + } + + $this->lastRequest = $request; + $this->lastOptions = $options; + $response = \array_shift($this->queue); + + if (isset($options['on_headers'])) { + if (!\is_callable($options['on_headers'])) { + throw new \InvalidArgumentException('on_headers must be callable'); + } + try { + $options['on_headers']($response); + } catch (\Exception $e) { + $msg = 'An error was encountered during the on_headers event'; + $response = new RequestException($msg, $request, $response, $e); + } + } + + if (\is_callable($response)) { + $response = $response($request, $options); + } + + $response = $response instanceof \Throwable + ? P\Create::rejectionFor($response) + : P\Create::promiseFor($response); + + return $response->then( + function (?ResponseInterface $value) use ($request, $options) { + $this->invokeStats($request, $options, $value); + if ($this->onFulfilled) { + ($this->onFulfilled)($value); + } + + if ($value !== null && isset($options['sink'])) { + $contents = (string) $value->getBody(); + $sink = $options['sink']; + + if (\is_resource($sink)) { + \fwrite($sink, $contents); + } elseif (\is_string($sink)) { + \file_put_contents($sink, $contents); + } elseif ($sink instanceof StreamInterface) { + $sink->write($contents); + } + } + + return $value; + }, + function ($reason) use ($request, $options) { + $this->invokeStats($request, $options, null, $reason); + if ($this->onRejected) { + ($this->onRejected)($reason); + } + return P\Create::rejectionFor($reason); + } + ); + } + + /** + * Adds one or more variadic requests, exceptions, callables, or promises + * to the queue. + * + * @param mixed ...$values + */ + public function append(...$values): void + { + foreach ($values as $value) { + if ($value instanceof ResponseInterface + || $value instanceof \Throwable + || $value instanceof PromiseInterface + || \is_callable($value) + ) { + $this->queue[] = $value; + } else { + throw new \TypeError('Expected a Response, Promise, Throwable or callable. Found ' . Utils::describeType($value)); + } + } + } + + /** + * Get the last received request. + */ + public function getLastRequest(): ?RequestInterface + { + return $this->lastRequest; + } + + /** + * Get the last received request options. + */ + public function getLastOptions(): array + { + return $this->lastOptions; + } + + /** + * Returns the number of remaining items in the queue. + */ + public function count(): int + { + return \count($this->queue); + } + + public function reset(): void + { + $this->queue = []; + } + + /** + * @param mixed $reason Promise or reason. + */ + private function invokeStats( + RequestInterface $request, + array $options, + ResponseInterface $response = null, + $reason = null + ): void { + if (isset($options['on_stats'])) { + $transferTime = $options['transfer_time'] ?? 0; + $stats = new TransferStats($request, $response, $transferTime, $reason); + ($options['on_stats'])($stats); + } + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php b/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php new file mode 100644 index 0000000..f045b52 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php @@ -0,0 +1,51 @@ +<?php + +namespace GuzzleHttp\Handler; + +use GuzzleHttp\Promise\PromiseInterface; +use GuzzleHttp\RequestOptions; +use Psr\Http\Message\RequestInterface; + +/** + * Provides basic proxies for handlers. + * + * @final + */ +class Proxy +{ + /** + * Sends synchronous requests to a specific handler while sending all other + * requests to another handler. + * + * @param callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface $default Handler used for normal responses + * @param callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface $sync Handler used for synchronous responses. + * + * @return callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface Returns the composed handler. + */ + public static function wrapSync(callable $default, callable $sync): callable + { + return static function (RequestInterface $request, array $options) use ($default, $sync): PromiseInterface { + return empty($options[RequestOptions::SYNCHRONOUS]) ? $default($request, $options) : $sync($request, $options); + }; + } + + /** + * Sends streaming requests to a streaming compatible handler while sending + * all other requests to a default handler. + * + * This, for example, could be useful for taking advantage of the + * performance benefits of curl while still supporting true streaming + * through the StreamHandler. + * + * @param callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface $default Handler used for non-streaming responses + * @param callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface $streaming Handler used for streaming responses + * + * @return callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface Returns the composed handler. + */ + public static function wrapStreaming(callable $default, callable $streaming): callable + { + return static function (RequestInterface $request, array $options) use ($default, $streaming): PromiseInterface { + return empty($options['stream']) ? $default($request, $options) : $streaming($request, $options); + }; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php new file mode 100644 index 0000000..543f825 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php @@ -0,0 +1,593 @@ +<?php + +namespace GuzzleHttp\Handler; + +use GuzzleHttp\Exception\ConnectException; +use GuzzleHttp\Exception\RequestException; +use GuzzleHttp\Promise as P; +use GuzzleHttp\Promise\FulfilledPromise; +use GuzzleHttp\Promise\PromiseInterface; +use GuzzleHttp\Psr7; +use GuzzleHttp\TransferStats; +use GuzzleHttp\Utils; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\StreamInterface; +use Psr\Http\Message\UriInterface; + +/** + * HTTP handler that uses PHP's HTTP stream wrapper. + * + * @final + */ +class StreamHandler +{ + /** + * @var array + */ + private $lastHeaders = []; + + /** + * Sends an HTTP request. + * + * @param RequestInterface $request Request to send. + * @param array $options Request transfer options. + */ + public function __invoke(RequestInterface $request, array $options): PromiseInterface + { + // Sleep if there is a delay specified. + if (isset($options['delay'])) { + \usleep($options['delay'] * 1000); + } + + $startTime = isset($options['on_stats']) ? Utils::currentTime() : null; + + try { + // Does not support the expect header. + $request = $request->withoutHeader('Expect'); + + // Append a content-length header if body size is zero to match + // cURL's behavior. + if (0 === $request->getBody()->getSize()) { + $request = $request->withHeader('Content-Length', '0'); + } + + return $this->createResponse( + $request, + $options, + $this->createStream($request, $options), + $startTime + ); + } catch (\InvalidArgumentException $e) { + throw $e; + } catch (\Exception $e) { + // Determine if the error was a networking error. + $message = $e->getMessage(); + // This list can probably get more comprehensive. + if (false !== \strpos($message, 'getaddrinfo') // DNS lookup failed + || false !== \strpos($message, 'Connection refused') + || false !== \strpos($message, "couldn't connect to host") // error on HHVM + || false !== \strpos($message, "connection attempt failed") + ) { + $e = new ConnectException($e->getMessage(), $request, $e); + } else { + $e = RequestException::wrapException($request, $e); + } + $this->invokeStats($options, $request, $startTime, null, $e); + + return P\Create::rejectionFor($e); + } + } + + private function invokeStats( + array $options, + RequestInterface $request, + ?float $startTime, + ResponseInterface $response = null, + \Throwable $error = null + ): void { + if (isset($options['on_stats'])) { + $stats = new TransferStats($request, $response, Utils::currentTime() - $startTime, $error, []); + ($options['on_stats'])($stats); + } + } + + /** + * @param resource $stream + */ + private function createResponse(RequestInterface $request, array $options, $stream, ?float $startTime): PromiseInterface + { + $hdrs = $this->lastHeaders; + $this->lastHeaders = []; + + try { + [$ver, $status, $reason, $headers] = HeaderProcessor::parseHeaders($hdrs); + } catch (\Exception $e) { + return P\Create::rejectionFor( + new RequestException('An error was encountered while creating the response', $request, null, $e) + ); + } + + [$stream, $headers] = $this->checkDecode($options, $headers, $stream); + $stream = Psr7\Utils::streamFor($stream); + $sink = $stream; + + if (\strcasecmp('HEAD', $request->getMethod())) { + $sink = $this->createSink($stream, $options); + } + + try { + $response = new Psr7\Response($status, $headers, $sink, $ver, $reason); + } catch (\Exception $e) { + return P\Create::rejectionFor( + new RequestException('An error was encountered while creating the response', $request, null, $e) + ); + } + + if (isset($options['on_headers'])) { + try { + $options['on_headers']($response); + } catch (\Exception $e) { + return P\Create::rejectionFor( + new RequestException('An error was encountered during the on_headers event', $request, $response, $e) + ); + } + } + + // Do not drain when the request is a HEAD request because they have + // no body. + if ($sink !== $stream) { + $this->drain($stream, $sink, $response->getHeaderLine('Content-Length')); + } + + $this->invokeStats($options, $request, $startTime, $response, null); + + return new FulfilledPromise($response); + } + + private function createSink(StreamInterface $stream, array $options): StreamInterface + { + if (!empty($options['stream'])) { + return $stream; + } + + $sink = $options['sink'] ?? Psr7\Utils::tryFopen('php://temp', 'r+'); + + return \is_string($sink) ? new Psr7\LazyOpenStream($sink, 'w+') : Psr7\Utils::streamFor($sink); + } + + /** + * @param resource $stream + */ + private function checkDecode(array $options, array $headers, $stream): array + { + // Automatically decode responses when instructed. + if (!empty($options['decode_content'])) { + $normalizedKeys = Utils::normalizeHeaderKeys($headers); + if (isset($normalizedKeys['content-encoding'])) { + $encoding = $headers[$normalizedKeys['content-encoding']]; + if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') { + $stream = new Psr7\InflateStream(Psr7\Utils::streamFor($stream)); + $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']]; + + // Remove content-encoding header + unset($headers[$normalizedKeys['content-encoding']]); + + // Fix content-length header + if (isset($normalizedKeys['content-length'])) { + $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']]; + $length = (int) $stream->getSize(); + if ($length === 0) { + unset($headers[$normalizedKeys['content-length']]); + } else { + $headers[$normalizedKeys['content-length']] = [$length]; + } + } + } + } + } + + return [$stream, $headers]; + } + + /** + * Drains the source stream into the "sink" client option. + * + * @param string $contentLength Header specifying the amount of + * data to read. + * + * @throws \RuntimeException when the sink option is invalid. + */ + private function drain(StreamInterface $source, StreamInterface $sink, string $contentLength): StreamInterface + { + // If a content-length header is provided, then stop reading once + // that number of bytes has been read. This can prevent infinitely + // reading from a stream when dealing with servers that do not honor + // Connection: Close headers. + Psr7\Utils::copyToStream( + $source, + $sink, + (\strlen($contentLength) > 0 && (int) $contentLength > 0) ? (int) $contentLength : -1 + ); + + $sink->seek(0); + $source->close(); + + return $sink; + } + + /** + * Create a resource and check to ensure it was created successfully + * + * @param callable $callback Callable that returns stream resource + * + * @return resource + * + * @throws \RuntimeException on error + */ + private function createResource(callable $callback) + { + $errors = []; + \set_error_handler(static function ($_, $msg, $file, $line) use (&$errors): bool { + $errors[] = [ + 'message' => $msg, + 'file' => $file, + 'line' => $line + ]; + return true; + }); + + try { + $resource = $callback(); + } finally { + \restore_error_handler(); + } + + if (!$resource) { + $message = 'Error creating resource: '; + foreach ($errors as $err) { + foreach ($err as $key => $value) { + $message .= "[$key] $value" . \PHP_EOL; + } + } + throw new \RuntimeException(\trim($message)); + } + + return $resource; + } + + /** + * @return resource + */ + private function createStream(RequestInterface $request, array $options) + { + static $methods; + if (!$methods) { + $methods = \array_flip(\get_class_methods(__CLASS__)); + } + + if (!\in_array($request->getUri()->getScheme(), ['http', 'https'])) { + throw new RequestException(\sprintf("The scheme '%s' is not supported.", $request->getUri()->getScheme()), $request); + } + + // HTTP/1.1 streams using the PHP stream wrapper require a + // Connection: close header + if ($request->getProtocolVersion() == '1.1' + && !$request->hasHeader('Connection') + ) { + $request = $request->withHeader('Connection', 'close'); + } + + // Ensure SSL is verified by default + if (!isset($options['verify'])) { + $options['verify'] = true; + } + + $params = []; + $context = $this->getDefaultContext($request); + + if (isset($options['on_headers']) && !\is_callable($options['on_headers'])) { + throw new \InvalidArgumentException('on_headers must be callable'); + } + + if (!empty($options)) { + foreach ($options as $key => $value) { + $method = "add_{$key}"; + if (isset($methods[$method])) { + $this->{$method}($request, $context, $value, $params); + } + } + } + + if (isset($options['stream_context'])) { + if (!\is_array($options['stream_context'])) { + throw new \InvalidArgumentException('stream_context must be an array'); + } + $context = \array_replace_recursive($context, $options['stream_context']); + } + + // Microsoft NTLM authentication only supported with curl handler + if (isset($options['auth'][2]) && 'ntlm' === $options['auth'][2]) { + throw new \InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler'); + } + + $uri = $this->resolveHost($request, $options); + + $contextResource = $this->createResource( + static function () use ($context, $params) { + return \stream_context_create($context, $params); + } + ); + + return $this->createResource( + function () use ($uri, &$http_response_header, $contextResource, $context, $options, $request) { + $resource = @\fopen((string) $uri, 'r', false, $contextResource); + $this->lastHeaders = $http_response_header ?? []; + + if (false === $resource) { + throw new ConnectException(sprintf('Connection refused for URI %s', $uri), $request, null, $context); + } + + if (isset($options['read_timeout'])) { + $readTimeout = $options['read_timeout']; + $sec = (int) $readTimeout; + $usec = ($readTimeout - $sec) * 100000; + \stream_set_timeout($resource, $sec, $usec); + } + + return $resource; + } + ); + } + + private function resolveHost(RequestInterface $request, array $options): UriInterface + { + $uri = $request->getUri(); + + if (isset($options['force_ip_resolve']) && !\filter_var($uri->getHost(), \FILTER_VALIDATE_IP)) { + if ('v4' === $options['force_ip_resolve']) { + $records = \dns_get_record($uri->getHost(), \DNS_A); + if (false === $records || !isset($records[0]['ip'])) { + throw new ConnectException(\sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request); + } + return $uri->withHost($records[0]['ip']); + } + if ('v6' === $options['force_ip_resolve']) { + $records = \dns_get_record($uri->getHost(), \DNS_AAAA); + if (false === $records || !isset($records[0]['ipv6'])) { + throw new ConnectException(\sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request); + } + return $uri->withHost('[' . $records[0]['ipv6'] . ']'); + } + } + + return $uri; + } + + private function getDefaultContext(RequestInterface $request): array + { + $headers = ''; + foreach ($request->getHeaders() as $name => $value) { + foreach ($value as $val) { + $headers .= "$name: $val\r\n"; + } + } + + $context = [ + 'http' => [ + 'method' => $request->getMethod(), + 'header' => $headers, + 'protocol_version' => $request->getProtocolVersion(), + 'ignore_errors' => true, + 'follow_location' => 0, + ], + 'ssl' => [ + 'peer_name' => $request->getUri()->getHost(), + ], + ]; + + $body = (string) $request->getBody(); + + if (!empty($body)) { + $context['http']['content'] = $body; + // Prevent the HTTP handler from adding a Content-Type header. + if (!$request->hasHeader('Content-Type')) { + $context['http']['header'] .= "Content-Type:\r\n"; + } + } + + $context['http']['header'] = \rtrim($context['http']['header']); + + return $context; + } + + /** + * @param mixed $value as passed via Request transfer options. + */ + private function add_proxy(RequestInterface $request, array &$options, $value, array &$params): void + { + $uri = null; + + if (!\is_array($value)) { + $uri = $value; + } else { + $scheme = $request->getUri()->getScheme(); + if (isset($value[$scheme])) { + if (!isset($value['no']) || !Utils::isHostInNoProxy($request->getUri()->getHost(), $value['no'])) { + $uri = $value[$scheme]; + } + } + } + + if (!$uri) { + return; + } + + $parsed = $this->parse_proxy($uri); + $options['http']['proxy'] = $parsed['proxy']; + + if ($parsed['auth']) { + if (!isset($options['http']['header'])) { + $options['http']['header'] = []; + } + $options['http']['header'] .= "\r\nProxy-Authorization: {$parsed['auth']}"; + } + } + + /** + * Parses the given proxy URL to make it compatible with the format PHP's stream context expects. + */ + private function parse_proxy(string $url): array + { + $parsed = \parse_url($url); + + if ($parsed !== false && isset($parsed['scheme']) && $parsed['scheme'] === 'http') { + if (isset($parsed['host']) && isset($parsed['port'])) { + $auth = null; + if (isset($parsed['user']) && isset($parsed['pass'])) { + $auth = \base64_encode("{$parsed['user']}:{$parsed['pass']}"); + } + + return [ + 'proxy' => "tcp://{$parsed['host']}:{$parsed['port']}", + 'auth' => $auth ? "Basic {$auth}" : null, + ]; + } + } + + // Return proxy as-is. + return [ + 'proxy' => $url, + 'auth' => null, + ]; + } + + /** + * @param mixed $value as passed via Request transfer options. + */ + private function add_timeout(RequestInterface $request, array &$options, $value, array &$params): void + { + if ($value > 0) { + $options['http']['timeout'] = $value; + } + } + + /** + * @param mixed $value as passed via Request transfer options. + */ + private function add_verify(RequestInterface $request, array &$options, $value, array &$params): void + { + if ($value === false) { + $options['ssl']['verify_peer'] = false; + $options['ssl']['verify_peer_name'] = false; + + return; + } + + if (\is_string($value)) { + $options['ssl']['cafile'] = $value; + if (!\file_exists($value)) { + throw new \RuntimeException("SSL CA bundle not found: $value"); + } + } elseif ($value !== true) { + throw new \InvalidArgumentException('Invalid verify request option'); + } + + $options['ssl']['verify_peer'] = true; + $options['ssl']['verify_peer_name'] = true; + $options['ssl']['allow_self_signed'] = false; + } + + /** + * @param mixed $value as passed via Request transfer options. + */ + private function add_cert(RequestInterface $request, array &$options, $value, array &$params): void + { + if (\is_array($value)) { + $options['ssl']['passphrase'] = $value[1]; + $value = $value[0]; + } + + if (!\file_exists($value)) { + throw new \RuntimeException("SSL certificate not found: {$value}"); + } + + $options['ssl']['local_cert'] = $value; + } + + /** + * @param mixed $value as passed via Request transfer options. + */ + private function add_progress(RequestInterface $request, array &$options, $value, array &$params): void + { + self::addNotification( + $params, + static function ($code, $a, $b, $c, $transferred, $total) use ($value) { + if ($code == \STREAM_NOTIFY_PROGRESS) { + // The upload progress cannot be determined. Use 0 for cURL compatibility: + // https://curl.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html + $value($total, $transferred, 0, 0); + } + } + ); + } + + /** + * @param mixed $value as passed via Request transfer options. + */ + private function add_debug(RequestInterface $request, array &$options, $value, array &$params): void + { + if ($value === false) { + return; + } + + static $map = [ + \STREAM_NOTIFY_CONNECT => 'CONNECT', + \STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED', + \STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT', + \STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS', + \STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS', + \STREAM_NOTIFY_REDIRECTED => 'REDIRECTED', + \STREAM_NOTIFY_PROGRESS => 'PROGRESS', + \STREAM_NOTIFY_FAILURE => 'FAILURE', + \STREAM_NOTIFY_COMPLETED => 'COMPLETED', + \STREAM_NOTIFY_RESOLVE => 'RESOLVE', + ]; + static $args = ['severity', 'message', 'message_code', 'bytes_transferred', 'bytes_max']; + + $value = Utils::debugResource($value); + $ident = $request->getMethod() . ' ' . $request->getUri()->withFragment(''); + self::addNotification( + $params, + static function (int $code, ...$passed) use ($ident, $value, $map, $args): void { + \fprintf($value, '<%s> [%s] ', $ident, $map[$code]); + foreach (\array_filter($passed) as $i => $v) { + \fwrite($value, $args[$i] . ': "' . $v . '" '); + } + \fwrite($value, "\n"); + } + ); + } + + private static function addNotification(array &$params, callable $notify): void + { + // Wrap the existing function if needed. + if (!isset($params['notification'])) { + $params['notification'] = $notify; + } else { + $params['notification'] = self::callArray([ + $params['notification'], + $notify + ]); + } + } + + private static function callArray(array $functions): callable + { + return static function (...$args) use ($functions) { + foreach ($functions as $fn) { + $fn(...$args); + } + }; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/HandlerStack.php b/vendor/guzzlehttp/guzzle/src/HandlerStack.php new file mode 100644 index 0000000..e0a1d11 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/HandlerStack.php @@ -0,0 +1,275 @@ +<?php + +namespace GuzzleHttp; + +use GuzzleHttp\Promise\PromiseInterface; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; + +/** + * Creates a composed Guzzle handler function by stacking middlewares on top of + * an HTTP handler function. + * + * @final + */ +class HandlerStack +{ + /** + * @var (callable(RequestInterface, array): PromiseInterface)|null + */ + private $handler; + + /** + * @var array{(callable(callable(RequestInterface, array): PromiseInterface): callable), (string|null)}[] + */ + private $stack = []; + + /** + * @var (callable(RequestInterface, array): PromiseInterface)|null + */ + private $cached; + + /** + * Creates a default handler stack that can be used by clients. + * + * The returned handler will wrap the provided handler or use the most + * appropriate default handler for your system. The returned HandlerStack has + * support for cookies, redirects, HTTP error exceptions, and preparing a body + * before sending. + * + * The returned handler stack can be passed to a client in the "handler" + * option. + * + * @param (callable(RequestInterface, array): PromiseInterface)|null $handler HTTP handler function to use with the stack. If no + * handler is provided, the best handler for your + * system will be utilized. + */ + public static function create(?callable $handler = null): self + { + $stack = new self($handler ?: Utils::chooseHandler()); + $stack->push(Middleware::httpErrors(), 'http_errors'); + $stack->push(Middleware::redirect(), 'allow_redirects'); + $stack->push(Middleware::cookies(), 'cookies'); + $stack->push(Middleware::prepareBody(), 'prepare_body'); + + return $stack; + } + + /** + * @param (callable(RequestInterface, array): PromiseInterface)|null $handler Underlying HTTP handler. + */ + public function __construct(callable $handler = null) + { + $this->handler = $handler; + } + + /** + * Invokes the handler stack as a composed handler + * + * @return ResponseInterface|PromiseInterface + */ + public function __invoke(RequestInterface $request, array $options) + { + $handler = $this->resolve(); + + return $handler($request, $options); + } + + /** + * Dumps a string representation of the stack. + * + * @return string + */ + public function __toString() + { + $depth = 0; + $stack = []; + + if ($this->handler !== null) { + $stack[] = "0) Handler: " . $this->debugCallable($this->handler); + } + + $result = ''; + foreach (\array_reverse($this->stack) as $tuple) { + $depth++; + $str = "{$depth}) Name: '{$tuple[1]}', "; + $str .= "Function: " . $this->debugCallable($tuple[0]); + $result = "> {$str}\n{$result}"; + $stack[] = $str; + } + + foreach (\array_keys($stack) as $k) { + $result .= "< {$stack[$k]}\n"; + } + + return $result; + } + + /** + * Set the HTTP handler that actually returns a promise. + * + * @param callable(RequestInterface, array): PromiseInterface $handler Accepts a request and array of options and + * returns a Promise. + */ + public function setHandler(callable $handler): void + { + $this->handler = $handler; + $this->cached = null; + } + + /** + * Returns true if the builder has a handler. + */ + public function hasHandler(): bool + { + return $this->handler !== null ; + } + + /** + * Unshift a middleware to the bottom of the stack. + * + * @param callable(callable): callable $middleware Middleware function + * @param string $name Name to register for this middleware. + */ + public function unshift(callable $middleware, ?string $name = null): void + { + \array_unshift($this->stack, [$middleware, $name]); + $this->cached = null; + } + + /** + * Push a middleware to the top of the stack. + * + * @param callable(callable): callable $middleware Middleware function + * @param string $name Name to register for this middleware. + */ + public function push(callable $middleware, string $name = ''): void + { + $this->stack[] = [$middleware, $name]; + $this->cached = null; + } + + /** + * Add a middleware before another middleware by name. + * + * @param string $findName Middleware to find + * @param callable(callable): callable $middleware Middleware function + * @param string $withName Name to register for this middleware. + */ + public function before(string $findName, callable $middleware, string $withName = ''): void + { + $this->splice($findName, $withName, $middleware, true); + } + + /** + * Add a middleware after another middleware by name. + * + * @param string $findName Middleware to find + * @param callable(callable): callable $middleware Middleware function + * @param string $withName Name to register for this middleware. + */ + public function after(string $findName, callable $middleware, string $withName = ''): void + { + $this->splice($findName, $withName, $middleware, false); + } + + /** + * Remove a middleware by instance or name from the stack. + * + * @param callable|string $remove Middleware to remove by instance or name. + */ + public function remove($remove): void + { + if (!is_string($remove) && !is_callable($remove)) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a callable or string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->cached = null; + $idx = \is_callable($remove) ? 0 : 1; + $this->stack = \array_values(\array_filter( + $this->stack, + static function ($tuple) use ($idx, $remove) { + return $tuple[$idx] !== $remove; + } + )); + } + + /** + * Compose the middleware and handler into a single callable function. + * + * @return callable(RequestInterface, array): PromiseInterface + */ + public function resolve(): callable + { + if ($this->cached === null) { + if (($prev = $this->handler) === null) { + throw new \LogicException('No handler has been specified'); + } + + foreach (\array_reverse($this->stack) as $fn) { + /** @var callable(RequestInterface, array): PromiseInterface $prev */ + $prev = $fn[0]($prev); + } + + $this->cached = $prev; + } + + return $this->cached; + } + + private function findByName(string $name): int + { + foreach ($this->stack as $k => $v) { + if ($v[1] === $name) { + return $k; + } + } + + throw new \InvalidArgumentException("Middleware not found: $name"); + } + + /** + * Splices a function into the middleware list at a specific position. + */ + private function splice(string $findName, string $withName, callable $middleware, bool $before): void + { + $this->cached = null; + $idx = $this->findByName($findName); + $tuple = [$middleware, $withName]; + + if ($before) { + if ($idx === 0) { + \array_unshift($this->stack, $tuple); + } else { + $replacement = [$tuple, $this->stack[$idx]]; + \array_splice($this->stack, $idx, 1, $replacement); + } + } elseif ($idx === \count($this->stack) - 1) { + $this->stack[] = $tuple; + } else { + $replacement = [$this->stack[$idx], $tuple]; + \array_splice($this->stack, $idx, 1, $replacement); + } + } + + /** + * Provides a debug string for a given callable. + * + * @param callable|string $fn Function to write as a string. + */ + private function debugCallable($fn): string + { + if (\is_string($fn)) { + return "callable({$fn})"; + } + + if (\is_array($fn)) { + return \is_string($fn[0]) + ? "callable({$fn[0]}::{$fn[1]})" + : "callable(['" . \get_class($fn[0]) . "', '{$fn[1]}'])"; + } + + /** @var object $fn */ + return 'callable(' . \spl_object_hash($fn) . ')'; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/MessageFormatter.php b/vendor/guzzlehttp/guzzle/src/MessageFormatter.php new file mode 100644 index 0000000..da49954 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/MessageFormatter.php @@ -0,0 +1,198 @@ +<?php + +namespace GuzzleHttp; + +use Psr\Http\Message\MessageInterface; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; + +/** + * Formats log messages using variable substitutions for requests, responses, + * and other transactional data. + * + * The following variable substitutions are supported: + * + * - {request}: Full HTTP request message + * - {response}: Full HTTP response message + * - {ts}: ISO 8601 date in GMT + * - {date_iso_8601} ISO 8601 date in GMT + * - {date_common_log} Apache common log date using the configured timezone. + * - {host}: Host of the request + * - {method}: Method of the request + * - {uri}: URI of the request + * - {version}: Protocol version + * - {target}: Request target of the request (path + query + fragment) + * - {hostname}: Hostname of the machine that sent the request + * - {code}: Status code of the response (if available) + * - {phrase}: Reason phrase of the response (if available) + * - {error}: Any error messages (if available) + * - {req_header_*}: Replace `*` with the lowercased name of a request header to add to the message + * - {res_header_*}: Replace `*` with the lowercased name of a response header to add to the message + * - {req_headers}: Request headers + * - {res_headers}: Response headers + * - {req_body}: Request body + * - {res_body}: Response body + * + * @final + */ +class MessageFormatter implements MessageFormatterInterface +{ + /** + * Apache Common Log Format. + * + * @link https://httpd.apache.org/docs/2.4/logs.html#common + * + * @var string + */ + public const CLF = "{hostname} {req_header_User-Agent} - [{date_common_log}] \"{method} {target} HTTP/{version}\" {code} {res_header_Content-Length}"; + public const DEBUG = ">>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}"; + public const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}'; + + /** + * @var string Template used to format log messages + */ + private $template; + + /** + * @param string $template Log message template + */ + public function __construct(?string $template = self::CLF) + { + $this->template = $template ?: self::CLF; + } + + /** + * Returns a formatted message string. + * + * @param RequestInterface $request Request that was sent + * @param ResponseInterface|null $response Response that was received + * @param \Throwable|null $error Exception that was received + */ + public function format(RequestInterface $request, ?ResponseInterface $response = null, ?\Throwable $error = null): string + { + $cache = []; + + /** @var string */ + return \preg_replace_callback( + '/{\s*([A-Za-z_\-\.0-9]+)\s*}/', + function (array $matches) use ($request, $response, $error, &$cache) { + if (isset($cache[$matches[1]])) { + return $cache[$matches[1]]; + } + + $result = ''; + switch ($matches[1]) { + case 'request': + $result = Psr7\Message::toString($request); + break; + case 'response': + $result = $response ? Psr7\Message::toString($response) : ''; + break; + case 'req_headers': + $result = \trim($request->getMethod() + . ' ' . $request->getRequestTarget()) + . ' HTTP/' . $request->getProtocolVersion() . "\r\n" + . $this->headers($request); + break; + case 'res_headers': + $result = $response ? + \sprintf( + 'HTTP/%s %d %s', + $response->getProtocolVersion(), + $response->getStatusCode(), + $response->getReasonPhrase() + ) . "\r\n" . $this->headers($response) + : 'NULL'; + break; + case 'req_body': + $result = $request->getBody()->__toString(); + break; + case 'res_body': + if (!$response instanceof ResponseInterface) { + $result = 'NULL'; + break; + } + + $body = $response->getBody(); + + if (!$body->isSeekable()) { + $result = 'RESPONSE_NOT_LOGGEABLE'; + break; + } + + $result = $response->getBody()->__toString(); + break; + case 'ts': + case 'date_iso_8601': + $result = \gmdate('c'); + break; + case 'date_common_log': + $result = \date('d/M/Y:H:i:s O'); + break; + case 'method': + $result = $request->getMethod(); + break; + case 'version': + $result = $request->getProtocolVersion(); + break; + case 'uri': + case 'url': + $result = $request->getUri()->__toString(); + break; + case 'target': + $result = $request->getRequestTarget(); + break; + case 'req_version': + $result = $request->getProtocolVersion(); + break; + case 'res_version': + $result = $response + ? $response->getProtocolVersion() + : 'NULL'; + break; + case 'host': + $result = $request->getHeaderLine('Host'); + break; + case 'hostname': + $result = \gethostname(); + break; + case 'code': + $result = $response ? $response->getStatusCode() : 'NULL'; + break; + case 'phrase': + $result = $response ? $response->getReasonPhrase() : 'NULL'; + break; + case 'error': + $result = $error ? $error->getMessage() : 'NULL'; + break; + default: + // handle prefixed dynamic headers + if (\strpos($matches[1], 'req_header_') === 0) { + $result = $request->getHeaderLine(\substr($matches[1], 11)); + } elseif (\strpos($matches[1], 'res_header_') === 0) { + $result = $response + ? $response->getHeaderLine(\substr($matches[1], 11)) + : 'NULL'; + } + } + + $cache[$matches[1]] = $result; + return $result; + }, + $this->template + ); + } + + /** + * Get headers from message as string + */ + private function headers(MessageInterface $message): string + { + $result = ''; + foreach ($message->getHeaders() as $name => $values) { + $result .= $name . ': ' . \implode(', ', $values) . "\r\n"; + } + + return \trim($result); + } +} diff --git a/vendor/guzzlehttp/guzzle/src/MessageFormatterInterface.php b/vendor/guzzlehttp/guzzle/src/MessageFormatterInterface.php new file mode 100644 index 0000000..a39ac24 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/MessageFormatterInterface.php @@ -0,0 +1,18 @@ +<?php + +namespace GuzzleHttp; + +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; + +interface MessageFormatterInterface +{ + /** + * Returns a formatted message string. + * + * @param RequestInterface $request Request that was sent + * @param ResponseInterface|null $response Response that was received + * @param \Throwable|null $error Exception that was received + */ + public function format(RequestInterface $request, ?ResponseInterface $response = null, ?\Throwable $error = null): string; +} diff --git a/vendor/guzzlehttp/guzzle/src/Middleware.php b/vendor/guzzlehttp/guzzle/src/Middleware.php new file mode 100644 index 0000000..7035c77 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Middleware.php @@ -0,0 +1,260 @@ +<?php + +namespace GuzzleHttp; + +use GuzzleHttp\Cookie\CookieJarInterface; +use GuzzleHttp\Exception\RequestException; +use GuzzleHttp\Promise as P; +use GuzzleHttp\Promise\PromiseInterface; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; +use Psr\Log\LoggerInterface; + +/** + * Functions used to create and wrap handlers with handler middleware. + */ +final class Middleware +{ + /** + * Middleware that adds cookies to requests. + * + * The options array must be set to a CookieJarInterface in order to use + * cookies. This is typically handled for you by a client. + * + * @return callable Returns a function that accepts the next handler. + */ + public static function cookies(): callable + { + return static function (callable $handler): callable { + return static function ($request, array $options) use ($handler) { + if (empty($options['cookies'])) { + return $handler($request, $options); + } elseif (!($options['cookies'] instanceof CookieJarInterface)) { + throw new \InvalidArgumentException('cookies must be an instance of GuzzleHttp\Cookie\CookieJarInterface'); + } + $cookieJar = $options['cookies']; + $request = $cookieJar->withCookieHeader($request); + return $handler($request, $options) + ->then( + static function (ResponseInterface $response) use ($cookieJar, $request): ResponseInterface { + $cookieJar->extractCookies($request, $response); + return $response; + } + ); + }; + }; + } + + /** + * Middleware that throws exceptions for 4xx or 5xx responses when the + * "http_errors" request option is set to true. + * + * @param BodySummarizerInterface|null $bodySummarizer The body summarizer to use in exception messages. + * + * @return callable(callable): callable Returns a function that accepts the next handler. + */ + public static function httpErrors(BodySummarizerInterface $bodySummarizer = null): callable + { + return static function (callable $handler) use ($bodySummarizer): callable { + return static function ($request, array $options) use ($handler, $bodySummarizer) { + if (empty($options['http_errors'])) { + return $handler($request, $options); + } + return $handler($request, $options)->then( + static function (ResponseInterface $response) use ($request, $bodySummarizer) { + $code = $response->getStatusCode(); + if ($code < 400) { + return $response; + } + throw RequestException::create($request, $response, null, [], $bodySummarizer); + } + ); + }; + }; + } + + /** + * Middleware that pushes history data to an ArrayAccess container. + * + * @param array|\ArrayAccess<int, array> $container Container to hold the history (by reference). + * + * @return callable(callable): callable Returns a function that accepts the next handler. + * + * @throws \InvalidArgumentException if container is not an array or ArrayAccess. + */ + public static function history(&$container): callable + { + if (!\is_array($container) && !$container instanceof \ArrayAccess) { + throw new \InvalidArgumentException('history container must be an array or object implementing ArrayAccess'); + } + + return static function (callable $handler) use (&$container): callable { + return static function (RequestInterface $request, array $options) use ($handler, &$container) { + return $handler($request, $options)->then( + static function ($value) use ($request, &$container, $options) { + $container[] = [ + 'request' => $request, + 'response' => $value, + 'error' => null, + 'options' => $options + ]; + return $value; + }, + static function ($reason) use ($request, &$container, $options) { + $container[] = [ + 'request' => $request, + 'response' => null, + 'error' => $reason, + 'options' => $options + ]; + return P\Create::rejectionFor($reason); + } + ); + }; + }; + } + + /** + * Middleware that invokes a callback before and after sending a request. + * + * The provided listener cannot modify or alter the response. It simply + * "taps" into the chain to be notified before returning the promise. The + * before listener accepts a request and options array, and the after + * listener accepts a request, options array, and response promise. + * + * @param callable $before Function to invoke before forwarding the request. + * @param callable $after Function invoked after forwarding. + * + * @return callable Returns a function that accepts the next handler. + */ + public static function tap(callable $before = null, callable $after = null): callable + { + return static function (callable $handler) use ($before, $after): callable { + return static function (RequestInterface $request, array $options) use ($handler, $before, $after) { + if ($before) { + $before($request, $options); + } + $response = $handler($request, $options); + if ($after) { + $after($request, $options, $response); + } + return $response; + }; + }; + } + + /** + * Middleware that handles request redirects. + * + * @return callable Returns a function that accepts the next handler. + */ + public static function redirect(): callable + { + return static function (callable $handler): RedirectMiddleware { + return new RedirectMiddleware($handler); + }; + } + + /** + * Middleware that retries requests based on the boolean result of + * invoking the provided "decider" function. + * + * If no delay function is provided, a simple implementation of exponential + * backoff will be utilized. + * + * @param callable $decider Function that accepts the number of retries, + * a request, [response], and [exception] and + * returns true if the request is to be retried. + * @param callable $delay Function that accepts the number of retries and + * returns the number of milliseconds to delay. + * + * @return callable Returns a function that accepts the next handler. + */ + public static function retry(callable $decider, callable $delay = null): callable + { + return static function (callable $handler) use ($decider, $delay): RetryMiddleware { + return new RetryMiddleware($decider, $handler, $delay); + }; + } + + /** + * Middleware that logs requests, responses, and errors using a message + * formatter. + * + * @phpstan-param \Psr\Log\LogLevel::* $logLevel Level at which to log requests. + * + * @param LoggerInterface $logger Logs messages. + * @param MessageFormatterInterface|MessageFormatter $formatter Formatter used to create message strings. + * @param string $logLevel Level at which to log requests. + * + * @return callable Returns a function that accepts the next handler. + */ + public static function log(LoggerInterface $logger, $formatter, string $logLevel = 'info'): callable + { + // To be compatible with Guzzle 7.1.x we need to allow users to pass a MessageFormatter + if (!$formatter instanceof MessageFormatter && !$formatter instanceof MessageFormatterInterface) { + throw new \LogicException(sprintf('Argument 2 to %s::log() must be of type %s', self::class, MessageFormatterInterface::class)); + } + + return static function (callable $handler) use ($logger, $formatter, $logLevel): callable { + return static function (RequestInterface $request, array $options = []) use ($handler, $logger, $formatter, $logLevel) { + return $handler($request, $options)->then( + static function ($response) use ($logger, $request, $formatter, $logLevel): ResponseInterface { + $message = $formatter->format($request, $response); + $logger->log($logLevel, $message); + return $response; + }, + static function ($reason) use ($logger, $request, $formatter): PromiseInterface { + $response = $reason instanceof RequestException ? $reason->getResponse() : null; + $message = $formatter->format($request, $response, P\Create::exceptionFor($reason)); + $logger->error($message); + return P\Create::rejectionFor($reason); + } + ); + }; + }; + } + + /** + * This middleware adds a default content-type if possible, a default + * content-length or transfer-encoding header, and the expect header. + */ + public static function prepareBody(): callable + { + return static function (callable $handler): PrepareBodyMiddleware { + return new PrepareBodyMiddleware($handler); + }; + } + + /** + * Middleware that applies a map function to the request before passing to + * the next handler. + * + * @param callable $fn Function that accepts a RequestInterface and returns + * a RequestInterface. + */ + public static function mapRequest(callable $fn): callable + { + return static function (callable $handler) use ($fn): callable { + return static function (RequestInterface $request, array $options) use ($handler, $fn) { + return $handler($fn($request), $options); + }; + }; + } + + /** + * Middleware that applies a map function to the resolved promise's + * response. + * + * @param callable $fn Function that accepts a ResponseInterface and + * returns a ResponseInterface. + */ + public static function mapResponse(callable $fn): callable + { + return static function (callable $handler) use ($fn): callable { + return static function (RequestInterface $request, array $options) use ($handler, $fn) { + return $handler($request, $options)->then($fn); + }; + }; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Pool.php b/vendor/guzzlehttp/guzzle/src/Pool.php new file mode 100644 index 0000000..6277c61 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Pool.php @@ -0,0 +1,125 @@ +<?php + +namespace GuzzleHttp; + +use GuzzleHttp\Promise as P; +use GuzzleHttp\Promise\EachPromise; +use GuzzleHttp\Promise\PromiseInterface; +use GuzzleHttp\Promise\PromisorInterface; +use Psr\Http\Message\RequestInterface; + +/** + * Sends an iterator of requests concurrently using a capped pool size. + * + * The pool will read from an iterator until it is cancelled or until the + * iterator is consumed. When a request is yielded, the request is sent after + * applying the "request_options" request options (if provided in the ctor). + * + * When a function is yielded by the iterator, the function is provided the + * "request_options" array that should be merged on top of any existing + * options, and the function MUST then return a wait-able promise. + * + * @final + */ +class Pool implements PromisorInterface +{ + /** + * @var EachPromise + */ + private $each; + + /** + * @param ClientInterface $client Client used to send the requests. + * @param array|\Iterator $requests Requests or functions that return + * requests to send concurrently. + * @param array $config Associative array of options + * - concurrency: (int) Maximum number of requests to send concurrently + * - options: Array of request options to apply to each request. + * - fulfilled: (callable) Function to invoke when a request completes. + * - rejected: (callable) Function to invoke when a request is rejected. + */ + public function __construct(ClientInterface $client, $requests, array $config = []) + { + if (!isset($config['concurrency'])) { + $config['concurrency'] = 25; + } + + if (isset($config['options'])) { + $opts = $config['options']; + unset($config['options']); + } else { + $opts = []; + } + + $iterable = P\Create::iterFor($requests); + $requests = static function () use ($iterable, $client, $opts) { + foreach ($iterable as $key => $rfn) { + if ($rfn instanceof RequestInterface) { + yield $key => $client->sendAsync($rfn, $opts); + } elseif (\is_callable($rfn)) { + yield $key => $rfn($opts); + } else { + throw new \InvalidArgumentException('Each value yielded by the iterator must be a Psr7\Http\Message\RequestInterface or a callable that returns a promise that fulfills with a Psr7\Message\Http\ResponseInterface object.'); + } + } + }; + + $this->each = new EachPromise($requests(), $config); + } + + /** + * Get promise + */ + public function promise(): PromiseInterface + { + return $this->each->promise(); + } + + /** + * Sends multiple requests concurrently and returns an array of responses + * and exceptions that uses the same ordering as the provided requests. + * + * IMPORTANT: This method keeps every request and response in memory, and + * as such, is NOT recommended when sending a large number or an + * indeterminate number of requests concurrently. + * + * @param ClientInterface $client Client used to send the requests + * @param array|\Iterator $requests Requests to send concurrently. + * @param array $options Passes through the options available in + * {@see \GuzzleHttp\Pool::__construct} + * + * @return array Returns an array containing the response or an exception + * in the same order that the requests were sent. + * + * @throws \InvalidArgumentException if the event format is incorrect. + */ + public static function batch(ClientInterface $client, $requests, array $options = []): array + { + $res = []; + self::cmpCallback($options, 'fulfilled', $res); + self::cmpCallback($options, 'rejected', $res); + $pool = new static($client, $requests, $options); + $pool->promise()->wait(); + \ksort($res); + + return $res; + } + + /** + * Execute callback(s) + */ + private static function cmpCallback(array &$options, string $name, array &$results): void + { + if (!isset($options[$name])) { + $options[$name] = static function ($v, $k) use (&$results) { + $results[$k] = $v; + }; + } else { + $currentFn = $options[$name]; + $options[$name] = static function ($v, $k) use (&$results, $currentFn) { + $currentFn($v, $k); + $results[$k] = $v; + }; + } + } +} diff --git a/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php b/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php new file mode 100644 index 0000000..7ca6283 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php @@ -0,0 +1,104 @@ +<?php + +namespace GuzzleHttp; + +use GuzzleHttp\Promise\PromiseInterface; +use Psr\Http\Message\RequestInterface; + +/** + * Prepares requests that contain a body, adding the Content-Length, + * Content-Type, and Expect headers. + * + * @final + */ +class PrepareBodyMiddleware +{ + /** + * @var callable(RequestInterface, array): PromiseInterface + */ + private $nextHandler; + + /** + * @param callable(RequestInterface, array): PromiseInterface $nextHandler Next handler to invoke. + */ + public function __construct(callable $nextHandler) + { + $this->nextHandler = $nextHandler; + } + + public function __invoke(RequestInterface $request, array $options): PromiseInterface + { + $fn = $this->nextHandler; + + // Don't do anything if the request has no body. + if ($request->getBody()->getSize() === 0) { + return $fn($request, $options); + } + + $modify = []; + + // Add a default content-type if possible. + if (!$request->hasHeader('Content-Type')) { + if ($uri = $request->getBody()->getMetadata('uri')) { + if (is_string($uri) && $type = Psr7\MimeType::fromFilename($uri)) { + $modify['set_headers']['Content-Type'] = $type; + } + } + } + + // Add a default content-length or transfer-encoding header. + if (!$request->hasHeader('Content-Length') + && !$request->hasHeader('Transfer-Encoding') + ) { + $size = $request->getBody()->getSize(); + if ($size !== null) { + $modify['set_headers']['Content-Length'] = $size; + } else { + $modify['set_headers']['Transfer-Encoding'] = 'chunked'; + } + } + + // Add the expect header if needed. + $this->addExpectHeader($request, $options, $modify); + + return $fn(Psr7\Utils::modifyRequest($request, $modify), $options); + } + + /** + * Add expect header + */ + private function addExpectHeader(RequestInterface $request, array $options, array &$modify): void + { + // Determine if the Expect header should be used + if ($request->hasHeader('Expect')) { + return; + } + + $expect = $options['expect'] ?? null; + + // Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0 + if ($expect === false || $request->getProtocolVersion() < 1.1) { + return; + } + + // The expect header is unconditionally enabled + if ($expect === true) { + $modify['set_headers']['Expect'] = '100-Continue'; + return; + } + + // By default, send the expect header when the payload is > 1mb + if ($expect === null) { + $expect = 1048576; + } + + // Always add if the body cannot be rewound, the size cannot be + // determined, or the size is greater than the cutoff threshold + $body = $request->getBody(); + $size = $body->getSize(); + + if ($size === null || $size >= (int) $expect || !$body->isSeekable()) { + $modify['set_headers']['Expect'] = '100-Continue'; + } + } +} diff --git a/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php b/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php new file mode 100644 index 0000000..f67d448 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php @@ -0,0 +1,228 @@ +<?php + +namespace GuzzleHttp; + +use GuzzleHttp\Exception\BadResponseException; +use GuzzleHttp\Exception\TooManyRedirectsException; +use GuzzleHttp\Promise\PromiseInterface; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\UriInterface; + +/** + * Request redirect middleware. + * + * Apply this middleware like other middleware using + * {@see \GuzzleHttp\Middleware::redirect()}. + * + * @final + */ +class RedirectMiddleware +{ + public const HISTORY_HEADER = 'X-Guzzle-Redirect-History'; + + public const STATUS_HISTORY_HEADER = 'X-Guzzle-Redirect-Status-History'; + + /** + * @var array + */ + public static $defaultSettings = [ + 'max' => 5, + 'protocols' => ['http', 'https'], + 'strict' => false, + 'referer' => false, + 'track_redirects' => false, + ]; + + /** + * @var callable(RequestInterface, array): PromiseInterface + */ + private $nextHandler; + + /** + * @param callable(RequestInterface, array): PromiseInterface $nextHandler Next handler to invoke. + */ + public function __construct(callable $nextHandler) + { + $this->nextHandler = $nextHandler; + } + + public function __invoke(RequestInterface $request, array $options): PromiseInterface + { + $fn = $this->nextHandler; + + if (empty($options['allow_redirects'])) { + return $fn($request, $options); + } + + if ($options['allow_redirects'] === true) { + $options['allow_redirects'] = self::$defaultSettings; + } elseif (!\is_array($options['allow_redirects'])) { + throw new \InvalidArgumentException('allow_redirects must be true, false, or array'); + } else { + // Merge the default settings with the provided settings + $options['allow_redirects'] += self::$defaultSettings; + } + + if (empty($options['allow_redirects']['max'])) { + return $fn($request, $options); + } + + return $fn($request, $options) + ->then(function (ResponseInterface $response) use ($request, $options) { + return $this->checkRedirect($request, $options, $response); + }); + } + + /** + * @return ResponseInterface|PromiseInterface + */ + public function checkRedirect(RequestInterface $request, array $options, ResponseInterface $response) + { + if (\strpos((string) $response->getStatusCode(), '3') !== 0 + || !$response->hasHeader('Location') + ) { + return $response; + } + + $this->guardMax($request, $response, $options); + $nextRequest = $this->modifyRequest($request, $options, $response); + + // If authorization is handled by curl, unset it if URI is cross-origin. + if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $nextRequest->getUri()) && defined('\CURLOPT_HTTPAUTH')) { + unset( + $options['curl'][\CURLOPT_HTTPAUTH], + $options['curl'][\CURLOPT_USERPWD] + ); + } + + if (isset($options['allow_redirects']['on_redirect'])) { + ($options['allow_redirects']['on_redirect'])( + $request, + $response, + $nextRequest->getUri() + ); + } + + $promise = $this($nextRequest, $options); + + // Add headers to be able to track history of redirects. + if (!empty($options['allow_redirects']['track_redirects'])) { + return $this->withTracking( + $promise, + (string) $nextRequest->getUri(), + $response->getStatusCode() + ); + } + + return $promise; + } + + /** + * Enable tracking on promise. + */ + private function withTracking(PromiseInterface $promise, string $uri, int $statusCode): PromiseInterface + { + return $promise->then( + static function (ResponseInterface $response) use ($uri, $statusCode) { + // Note that we are pushing to the front of the list as this + // would be an earlier response than what is currently present + // in the history header. + $historyHeader = $response->getHeader(self::HISTORY_HEADER); + $statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER); + \array_unshift($historyHeader, $uri); + \array_unshift($statusHeader, (string) $statusCode); + + return $response->withHeader(self::HISTORY_HEADER, $historyHeader) + ->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader); + } + ); + } + + /** + * Check for too many redirects. + * + * @throws TooManyRedirectsException Too many redirects. + */ + private function guardMax(RequestInterface $request, ResponseInterface $response, array &$options): void + { + $current = $options['__redirect_count'] + ?? 0; + $options['__redirect_count'] = $current + 1; + $max = $options['allow_redirects']['max']; + + if ($options['__redirect_count'] > $max) { + throw new TooManyRedirectsException("Will not follow more than {$max} redirects", $request, $response); + } + } + + public function modifyRequest(RequestInterface $request, array $options, ResponseInterface $response): RequestInterface + { + // Request modifications to apply. + $modify = []; + $protocols = $options['allow_redirects']['protocols']; + + // Use a GET request if this is an entity enclosing request and we are + // not forcing RFC compliance, but rather emulating what all browsers + // would do. + $statusCode = $response->getStatusCode(); + if ($statusCode == 303 || + ($statusCode <= 302 && !$options['allow_redirects']['strict']) + ) { + $safeMethods = ['GET', 'HEAD', 'OPTIONS']; + $requestMethod = $request->getMethod(); + + $modify['method'] = in_array($requestMethod, $safeMethods) ? $requestMethod : 'GET'; + $modify['body'] = ''; + } + + $uri = self::redirectUri($request, $response, $protocols); + if (isset($options['idn_conversion']) && ($options['idn_conversion'] !== false)) { + $idnOptions = ($options['idn_conversion'] === true) ? \IDNA_DEFAULT : $options['idn_conversion']; + $uri = Utils::idnUriConvert($uri, $idnOptions); + } + + $modify['uri'] = $uri; + Psr7\Message::rewindBody($request); + + // Add the Referer header if it is told to do so and only + // add the header if we are not redirecting from https to http. + if ($options['allow_redirects']['referer'] + && $modify['uri']->getScheme() === $request->getUri()->getScheme() + ) { + $uri = $request->getUri()->withUserInfo(''); + $modify['set_headers']['Referer'] = (string) $uri; + } else { + $modify['remove_headers'][] = 'Referer'; + } + + // Remove Authorization and Cookie headers if URI is cross-origin. + if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $modify['uri'])) { + $modify['remove_headers'][] = 'Authorization'; + $modify['remove_headers'][] = 'Cookie'; + } + + return Psr7\Utils::modifyRequest($request, $modify); + } + + /** + * Set the appropriate URL on the request based on the location header. + */ + private static function redirectUri( + RequestInterface $request, + ResponseInterface $response, + array $protocols + ): UriInterface { + $location = Psr7\UriResolver::resolve( + $request->getUri(), + new Psr7\Uri($response->getHeaderLine('Location')) + ); + + // Ensure that the redirect URI is allowed based on the protocols. + if (!\in_array($location->getScheme(), $protocols)) { + throw new BadResponseException(\sprintf('Redirect URI, %s, does not use one of the allowed redirect protocols: %s', $location, \implode(', ', $protocols)), $request, $response); + } + + return $location; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/RequestOptions.php b/vendor/guzzlehttp/guzzle/src/RequestOptions.php new file mode 100644 index 0000000..20b31bc --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/RequestOptions.php @@ -0,0 +1,264 @@ +<?php + +namespace GuzzleHttp; + +/** + * This class contains a list of built-in Guzzle request options. + * + * More documentation for each option can be found at http://guzzlephp.org/. + * + * @link http://docs.guzzlephp.org/en/v6/request-options.html + */ +final class RequestOptions +{ + /** + * allow_redirects: (bool|array) Controls redirect behavior. Pass false + * to disable redirects, pass true to enable redirects, pass an + * associative to provide custom redirect settings. Defaults to "false". + * This option only works if your handler has the RedirectMiddleware. When + * passing an associative array, you can provide the following key value + * pairs: + * + * - max: (int, default=5) maximum number of allowed redirects. + * - strict: (bool, default=false) Set to true to use strict redirects + * meaning redirect POST requests with POST requests vs. doing what most + * browsers do which is redirect POST requests with GET requests + * - referer: (bool, default=false) Set to true to enable the Referer + * header. + * - protocols: (array, default=['http', 'https']) Allowed redirect + * protocols. + * - on_redirect: (callable) PHP callable that is invoked when a redirect + * is encountered. The callable is invoked with the request, the redirect + * response that was received, and the effective URI. Any return value + * from the on_redirect function is ignored. + */ + public const ALLOW_REDIRECTS = 'allow_redirects'; + + /** + * auth: (array) Pass an array of HTTP authentication parameters to use + * with the request. The array must contain the username in index [0], + * the password in index [1], and you can optionally provide a built-in + * authentication type in index [2]. Pass null to disable authentication + * for a request. + */ + public const AUTH = 'auth'; + + /** + * body: (resource|string|null|int|float|StreamInterface|callable|\Iterator) + * Body to send in the request. + */ + public const BODY = 'body'; + + /** + * cert: (string|array) Set to a string to specify the path to a file + * containing a PEM formatted SSL client side certificate. If a password + * is required, then set cert to an array containing the path to the PEM + * file in the first array element followed by the certificate password + * in the second array element. + */ + public const CERT = 'cert'; + + /** + * cookies: (bool|GuzzleHttp\Cookie\CookieJarInterface, default=false) + * Specifies whether or not cookies are used in a request or what cookie + * jar to use or what cookies to send. This option only works if your + * handler has the `cookie` middleware. Valid values are `false` and + * an instance of {@see \GuzzleHttp\Cookie\CookieJarInterface}. + */ + public const COOKIES = 'cookies'; + + /** + * connect_timeout: (float, default=0) Float describing the number of + * seconds to wait while trying to connect to a server. Use 0 to wait + * indefinitely (the default behavior). + */ + public const CONNECT_TIMEOUT = 'connect_timeout'; + + /** + * debug: (bool|resource) Set to true or set to a PHP stream returned by + * fopen() enable debug output with the HTTP handler used to send a + * request. + */ + public const DEBUG = 'debug'; + + /** + * decode_content: (bool, default=true) Specify whether or not + * Content-Encoding responses (gzip, deflate, etc.) are automatically + * decoded. + */ + public const DECODE_CONTENT = 'decode_content'; + + /** + * delay: (int) The amount of time to delay before sending in milliseconds. + */ + public const DELAY = 'delay'; + + /** + * expect: (bool|integer) Controls the behavior of the + * "Expect: 100-Continue" header. + * + * Set to `true` to enable the "Expect: 100-Continue" header for all + * requests that sends a body. Set to `false` to disable the + * "Expect: 100-Continue" header for all requests. Set to a number so that + * the size of the payload must be greater than the number in order to send + * the Expect header. Setting to a number will send the Expect header for + * all requests in which the size of the payload cannot be determined or + * where the body is not rewindable. + * + * By default, Guzzle will add the "Expect: 100-Continue" header when the + * size of the body of a request is greater than 1 MB and a request is + * using HTTP/1.1. + */ + public const EXPECT = 'expect'; + + /** + * form_params: (array) Associative array of form field names to values + * where each value is a string or array of strings. Sets the Content-Type + * header to application/x-www-form-urlencoded when no Content-Type header + * is already present. + */ + public const FORM_PARAMS = 'form_params'; + + /** + * headers: (array) Associative array of HTTP headers. Each value MUST be + * a string or array of strings. + */ + public const HEADERS = 'headers'; + + /** + * http_errors: (bool, default=true) Set to false to disable exceptions + * when a non- successful HTTP response is received. By default, + * exceptions will be thrown for 4xx and 5xx responses. This option only + * works if your handler has the `httpErrors` middleware. + */ + public const HTTP_ERRORS = 'http_errors'; + + /** + * idn: (bool|int, default=true) A combination of IDNA_* constants for + * idn_to_ascii() PHP's function (see "options" parameter). Set to false to + * disable IDN support completely, or to true to use the default + * configuration (IDNA_DEFAULT constant). + */ + public const IDN_CONVERSION = 'idn_conversion'; + + /** + * json: (mixed) Adds JSON data to a request. The provided value is JSON + * encoded and a Content-Type header of application/json will be added to + * the request if no Content-Type header is already present. + */ + public const JSON = 'json'; + + /** + * multipart: (array) Array of associative arrays, each containing a + * required "name" key mapping to the form field, name, a required + * "contents" key mapping to a StreamInterface|resource|string, an + * optional "headers" associative array of custom headers, and an + * optional "filename" key mapping to a string to send as the filename in + * the part. If no "filename" key is present, then no "filename" attribute + * will be added to the part. + */ + public const MULTIPART = 'multipart'; + + /** + * on_headers: (callable) A callable that is invoked when the HTTP headers + * of the response have been received but the body has not yet begun to + * download. + */ + public const ON_HEADERS = 'on_headers'; + + /** + * on_stats: (callable) allows you to get access to transfer statistics of + * a request and access the lower level transfer details of the handler + * associated with your client. ``on_stats`` is a callable that is invoked + * when a handler has finished sending a request. The callback is invoked + * with transfer statistics about the request, the response received, or + * the error encountered. Included in the data is the total amount of time + * taken to send the request. + */ + public const ON_STATS = 'on_stats'; + + /** + * progress: (callable) Defines a function to invoke when transfer + * progress is made. The function accepts the following positional + * arguments: the total number of bytes expected to be downloaded, the + * number of bytes downloaded so far, the number of bytes expected to be + * uploaded, the number of bytes uploaded so far. + */ + public const PROGRESS = 'progress'; + + /** + * proxy: (string|array) Pass a string to specify an HTTP proxy, or an + * array to specify different proxies for different protocols (where the + * key is the protocol and the value is a proxy string). + */ + public const PROXY = 'proxy'; + + /** + * query: (array|string) Associative array of query string values to add + * to the request. This option uses PHP's http_build_query() to create + * the string representation. Pass a string value if you need more + * control than what this method provides + */ + public const QUERY = 'query'; + + /** + * sink: (resource|string|StreamInterface) Where the data of the + * response is written to. Defaults to a PHP temp stream. Providing a + * string will write data to a file by the given name. + */ + public const SINK = 'sink'; + + /** + * synchronous: (bool) Set to true to inform HTTP handlers that you intend + * on waiting on the response. This can be useful for optimizations. Note + * that a promise is still returned if you are using one of the async + * client methods. + */ + public const SYNCHRONOUS = 'synchronous'; + + /** + * ssl_key: (array|string) Specify the path to a file containing a private + * SSL key in PEM format. If a password is required, then set to an array + * containing the path to the SSL key in the first array element followed + * by the password required for the certificate in the second element. + */ + public const SSL_KEY = 'ssl_key'; + + /** + * stream: Set to true to attempt to stream a response rather than + * download it all up-front. + */ + public const STREAM = 'stream'; + + /** + * verify: (bool|string, default=true) Describes the SSL certificate + * verification behavior of a request. Set to true to enable SSL + * certificate verification using the system CA bundle when available + * (the default). Set to false to disable certificate verification (this + * is insecure!). Set to a string to provide the path to a CA bundle on + * disk to enable verification using a custom certificate. + */ + public const VERIFY = 'verify'; + + /** + * timeout: (float, default=0) Float describing the timeout of the + * request in seconds. Use 0 to wait indefinitely (the default behavior). + */ + public const TIMEOUT = 'timeout'; + + /** + * read_timeout: (float, default=default_socket_timeout ini setting) Float describing + * the body read timeout, for stream requests. + */ + public const READ_TIMEOUT = 'read_timeout'; + + /** + * version: (float) Specifies the HTTP protocol version to attempt to use. + */ + public const VERSION = 'version'; + + /** + * force_ip_resolve: (bool) Force client to use only ipv4 or ipv6 protocol + */ + public const FORCE_IP_RESOLVE = 'force_ip_resolve'; +} diff --git a/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php b/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php new file mode 100644 index 0000000..0236a9d --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/RetryMiddleware.php @@ -0,0 +1,116 @@ +<?php + +namespace GuzzleHttp; + +use GuzzleHttp\Promise as P; +use GuzzleHttp\Promise\PromiseInterface; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; + +/** + * Middleware that retries requests based on the boolean result of + * invoking the provided "decider" function. + * + * @final + */ +class RetryMiddleware +{ + /** + * @var callable(RequestInterface, array): PromiseInterface + */ + private $nextHandler; + + /** + * @var callable + */ + private $decider; + + /** + * @var callable(int) + */ + private $delay; + + /** + * @param callable $decider Function that accepts the number of retries, + * a request, [response], and [exception] and + * returns true if the request is to be + * retried. + * @param callable(RequestInterface, array): PromiseInterface $nextHandler Next handler to invoke. + * @param (callable(int): int)|null $delay Function that accepts the number of retries + * and returns the number of + * milliseconds to delay. + */ + public function __construct(callable $decider, callable $nextHandler, callable $delay = null) + { + $this->decider = $decider; + $this->nextHandler = $nextHandler; + $this->delay = $delay ?: __CLASS__ . '::exponentialDelay'; + } + + /** + * Default exponential backoff delay function. + * + * @return int milliseconds. + */ + public static function exponentialDelay(int $retries): int + { + return (int) \pow(2, $retries - 1) * 1000; + } + + public function __invoke(RequestInterface $request, array $options): PromiseInterface + { + if (!isset($options['retries'])) { + $options['retries'] = 0; + } + + $fn = $this->nextHandler; + return $fn($request, $options) + ->then( + $this->onFulfilled($request, $options), + $this->onRejected($request, $options) + ); + } + + /** + * Execute fulfilled closure + */ + private function onFulfilled(RequestInterface $request, array $options): callable + { + return function ($value) use ($request, $options) { + if (!($this->decider)( + $options['retries'], + $request, + $value, + null + )) { + return $value; + } + return $this->doRetry($request, $options, $value); + }; + } + + /** + * Execute rejected closure + */ + private function onRejected(RequestInterface $req, array $options): callable + { + return function ($reason) use ($req, $options) { + if (!($this->decider)( + $options['retries'], + $req, + null, + $reason + )) { + return P\Create::rejectionFor($reason); + } + return $this->doRetry($req, $options); + }; + } + + private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null): PromiseInterface + { + $options['delay'] = ($this->delay)(++$options['retries'], $response, $request); + + return $this($request, $options); + } +} diff --git a/vendor/guzzlehttp/guzzle/src/TransferStats.php b/vendor/guzzlehttp/guzzle/src/TransferStats.php new file mode 100644 index 0000000..93fa334 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/TransferStats.php @@ -0,0 +1,133 @@ +<?php + +namespace GuzzleHttp; + +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\UriInterface; + +/** + * Represents data at the point after it was transferred either successfully + * or after a network error. + */ +final class TransferStats +{ + /** + * @var RequestInterface + */ + private $request; + + /** + * @var ResponseInterface|null + */ + private $response; + + /** + * @var float|null + */ + private $transferTime; + + /** + * @var array + */ + private $handlerStats; + + /** + * @var mixed|null + */ + private $handlerErrorData; + + /** + * @param RequestInterface $request Request that was sent. + * @param ResponseInterface|null $response Response received (if any) + * @param float|null $transferTime Total handler transfer time. + * @param mixed $handlerErrorData Handler error data. + * @param array $handlerStats Handler specific stats. + */ + public function __construct( + RequestInterface $request, + ?ResponseInterface $response = null, + ?float $transferTime = null, + $handlerErrorData = null, + array $handlerStats = [] + ) { + $this->request = $request; + $this->response = $response; + $this->transferTime = $transferTime; + $this->handlerErrorData = $handlerErrorData; + $this->handlerStats = $handlerStats; + } + + public function getRequest(): RequestInterface + { + return $this->request; + } + + /** + * Returns the response that was received (if any). + */ + public function getResponse(): ?ResponseInterface + { + return $this->response; + } + + /** + * Returns true if a response was received. + */ + public function hasResponse(): bool + { + return $this->response !== null; + } + + /** + * Gets handler specific error data. + * + * This might be an exception, a integer representing an error code, or + * anything else. Relying on this value assumes that you know what handler + * you are using. + * + * @return mixed + */ + public function getHandlerErrorData() + { + return $this->handlerErrorData; + } + + /** + * Get the effective URI the request was sent to. + */ + public function getEffectiveUri(): UriInterface + { + return $this->request->getUri(); + } + + /** + * Get the estimated time the request was being transferred by the handler. + * + * @return float|null Time in seconds. + */ + public function getTransferTime(): ?float + { + return $this->transferTime; + } + + /** + * Gets an array of all of the handler specific transfer data. + */ + public function getHandlerStats(): array + { + return $this->handlerStats; + } + + /** + * Get a specific handler statistic from the handler by name. + * + * @param string $stat Handler specific transfer stat to retrieve. + * + * @return mixed|null + */ + public function getHandlerStat(string $stat) + { + return $this->handlerStats[$stat] ?? null; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Utils.php b/vendor/guzzlehttp/guzzle/src/Utils.php new file mode 100644 index 0000000..e355f32 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Utils.php @@ -0,0 +1,385 @@ +<?php + +namespace GuzzleHttp; + +use GuzzleHttp\Exception\InvalidArgumentException; +use GuzzleHttp\Handler\CurlHandler; +use GuzzleHttp\Handler\CurlMultiHandler; +use GuzzleHttp\Handler\Proxy; +use GuzzleHttp\Handler\StreamHandler; +use Psr\Http\Message\UriInterface; + +final class Utils +{ + /** + * Debug function used to describe the provided value type and class. + * + * @param mixed $input + * + * @return string Returns a string containing the type of the variable and + * if a class is provided, the class name. + */ + public static function describeType($input): string + { + switch (\gettype($input)) { + case 'object': + return 'object(' . \get_class($input) . ')'; + case 'array': + return 'array(' . \count($input) . ')'; + default: + \ob_start(); + \var_dump($input); + // normalize float vs double + /** @var string $varDumpContent */ + $varDumpContent = \ob_get_clean(); + + return \str_replace('double(', 'float(', \rtrim($varDumpContent)); + } + } + + /** + * Parses an array of header lines into an associative array of headers. + * + * @param iterable $lines Header lines array of strings in the following + * format: "Name: Value" + */ + public static function headersFromLines(iterable $lines): array + { + $headers = []; + + foreach ($lines as $line) { + $parts = \explode(':', $line, 2); + $headers[\trim($parts[0])][] = isset($parts[1]) ? \trim($parts[1]) : null; + } + + return $headers; + } + + /** + * Returns a debug stream based on the provided variable. + * + * @param mixed $value Optional value + * + * @return resource + */ + public static function debugResource($value = null) + { + if (\is_resource($value)) { + return $value; + } + if (\defined('STDOUT')) { + return \STDOUT; + } + + return \GuzzleHttp\Psr7\Utils::tryFopen('php://output', 'w'); + } + + /** + * Chooses and creates a default handler to use based on the environment. + * + * The returned handler is not wrapped by any default middlewares. + * + * @throws \RuntimeException if no viable Handler is available. + * + * @return callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface Returns the best handler for the given system. + */ + public static function chooseHandler(): callable + { + $handler = null; + + if (\defined('CURLOPT_CUSTOMREQUEST')) { + if (\function_exists('curl_multi_exec') && \function_exists('curl_exec')) { + $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler()); + } elseif (\function_exists('curl_exec')) { + $handler = new CurlHandler(); + } elseif (\function_exists('curl_multi_exec')) { + $handler = new CurlMultiHandler(); + } + } + + if (\ini_get('allow_url_fopen')) { + $handler = $handler + ? Proxy::wrapStreaming($handler, new StreamHandler()) + : new StreamHandler(); + } elseif (!$handler) { + throw new \RuntimeException('GuzzleHttp requires cURL, the allow_url_fopen ini setting, or a custom HTTP handler.'); + } + + return $handler; + } + + /** + * Get the default User-Agent string to use with Guzzle. + */ + public static function defaultUserAgent(): string + { + return sprintf('GuzzleHttp/%d', ClientInterface::MAJOR_VERSION); + } + + /** + * Returns the default cacert bundle for the current system. + * + * First, the openssl.cafile and curl.cainfo php.ini settings are checked. + * If those settings are not configured, then the common locations for + * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X + * and Windows are checked. If any of these file locations are found on + * disk, they will be utilized. + * + * Note: the result of this function is cached for subsequent calls. + * + * @throws \RuntimeException if no bundle can be found. + * + * @deprecated Utils::defaultCaBundle will be removed in guzzlehttp/guzzle:8.0. This method is not needed in PHP 5.6+. + */ + public static function defaultCaBundle(): string + { + static $cached = null; + static $cafiles = [ + // Red Hat, CentOS, Fedora (provided by the ca-certificates package) + '/etc/pki/tls/certs/ca-bundle.crt', + // Ubuntu, Debian (provided by the ca-certificates package) + '/etc/ssl/certs/ca-certificates.crt', + // FreeBSD (provided by the ca_root_nss package) + '/usr/local/share/certs/ca-root-nss.crt', + // SLES 12 (provided by the ca-certificates package) + '/var/lib/ca-certificates/ca-bundle.pem', + // OS X provided by homebrew (using the default path) + '/usr/local/etc/openssl/cert.pem', + // Google app engine + '/etc/ca-certificates.crt', + // Windows? + 'C:\\windows\\system32\\curl-ca-bundle.crt', + 'C:\\windows\\curl-ca-bundle.crt', + ]; + + if ($cached) { + return $cached; + } + + if ($ca = \ini_get('openssl.cafile')) { + return $cached = $ca; + } + + if ($ca = \ini_get('curl.cainfo')) { + return $cached = $ca; + } + + foreach ($cafiles as $filename) { + if (\file_exists($filename)) { + return $cached = $filename; + } + } + + throw new \RuntimeException( + <<< EOT +No system CA bundle could be found in any of the the common system locations. +PHP versions earlier than 5.6 are not properly configured to use the system's +CA bundle by default. In order to verify peer certificates, you will need to +supply the path on disk to a certificate bundle to the 'verify' request +option: http://docs.guzzlephp.org/en/latest/clients.html#verify. If you do not +need a specific certificate bundle, then Mozilla provides a commonly used CA +bundle which can be downloaded here (provided by the maintainer of cURL): +https://curl.haxx.se/ca/cacert.pem. Once +you have a CA bundle available on disk, you can set the 'openssl.cafile' PHP +ini setting to point to the path to the file, allowing you to omit the 'verify' +request option. See https://curl.haxx.se/docs/sslcerts.html for more +information. +EOT + ); + } + + /** + * Creates an associative array of lowercase header names to the actual + * header casing. + */ + public static function normalizeHeaderKeys(array $headers): array + { + $result = []; + foreach (\array_keys($headers) as $key) { + $result[\strtolower($key)] = $key; + } + + return $result; + } + + /** + * Returns true if the provided host matches any of the no proxy areas. + * + * This method will strip a port from the host if it is present. Each pattern + * can be matched with an exact match (e.g., "foo.com" == "foo.com") or a + * partial match: (e.g., "foo.com" == "baz.foo.com" and ".foo.com" == + * "baz.foo.com", but ".foo.com" != "foo.com"). + * + * Areas are matched in the following cases: + * 1. "*" (without quotes) always matches any hosts. + * 2. An exact match. + * 3. The area starts with "." and the area is the last part of the host. e.g. + * '.mit.edu' will match any host that ends with '.mit.edu'. + * + * @param string $host Host to check against the patterns. + * @param string[] $noProxyArray An array of host patterns. + * + * @throws InvalidArgumentException + */ + public static function isHostInNoProxy(string $host, array $noProxyArray): bool + { + if (\strlen($host) === 0) { + throw new InvalidArgumentException('Empty host provided'); + } + + // Strip port if present. + [$host] = \explode(':', $host, 2); + + foreach ($noProxyArray as $area) { + // Always match on wildcards. + if ($area === '*') { + return true; + } + + if (empty($area)) { + // Don't match on empty values. + continue; + } + + if ($area === $host) { + // Exact matches. + return true; + } + // Special match if the area when prefixed with ".". Remove any + // existing leading "." and add a new leading ".". + $area = '.' . \ltrim($area, '.'); + if (\substr($host, -(\strlen($area))) === $area) { + return true; + } + } + + return false; + } + + /** + * Wrapper for json_decode that throws when an error occurs. + * + * @param string $json JSON data to parse + * @param bool $assoc When true, returned objects will be converted + * into associative arrays. + * @param int $depth User specified recursion depth. + * @param int $options Bitmask of JSON decode options. + * + * @return object|array|string|int|float|bool|null + * + * @throws InvalidArgumentException if the JSON cannot be decoded. + * + * @link https://www.php.net/manual/en/function.json-decode.php + */ + public static function jsonDecode(string $json, bool $assoc = false, int $depth = 512, int $options = 0) + { + $data = \json_decode($json, $assoc, $depth, $options); + if (\JSON_ERROR_NONE !== \json_last_error()) { + throw new InvalidArgumentException('json_decode error: ' . \json_last_error_msg()); + } + + return $data; + } + + /** + * Wrapper for JSON encoding that throws when an error occurs. + * + * @param mixed $value The value being encoded + * @param int $options JSON encode option bitmask + * @param int $depth Set the maximum depth. Must be greater than zero. + * + * @throws InvalidArgumentException if the JSON cannot be encoded. + * + * @link https://www.php.net/manual/en/function.json-encode.php + */ + public static function jsonEncode($value, int $options = 0, int $depth = 512): string + { + $json = \json_encode($value, $options, $depth); + if (\JSON_ERROR_NONE !== \json_last_error()) { + throw new InvalidArgumentException('json_encode error: ' . \json_last_error_msg()); + } + + /** @var string */ + return $json; + } + + /** + * Wrapper for the hrtime() or microtime() functions + * (depending on the PHP version, one of the two is used) + * + * @return float UNIX timestamp + * + * @internal + */ + public static function currentTime(): float + { + return (float) \function_exists('hrtime') ? \hrtime(true) / 1e9 : \microtime(true); + } + + /** + * @throws InvalidArgumentException + * + * @internal + */ + public static function idnUriConvert(UriInterface $uri, int $options = 0): UriInterface + { + if ($uri->getHost()) { + $asciiHost = self::idnToAsci($uri->getHost(), $options, $info); + if ($asciiHost === false) { + $errorBitSet = $info['errors'] ?? 0; + + $errorConstants = array_filter(array_keys(get_defined_constants()), static function (string $name): bool { + return substr($name, 0, 11) === 'IDNA_ERROR_'; + }); + + $errors = []; + foreach ($errorConstants as $errorConstant) { + if ($errorBitSet & constant($errorConstant)) { + $errors[] = $errorConstant; + } + } + + $errorMessage = 'IDN conversion failed'; + if ($errors) { + $errorMessage .= ' (errors: ' . implode(', ', $errors) . ')'; + } + + throw new InvalidArgumentException($errorMessage); + } + if ($uri->getHost() !== $asciiHost) { + // Replace URI only if the ASCII version is different + $uri = $uri->withHost($asciiHost); + } + } + + return $uri; + } + + /** + * @internal + */ + public static function getenv(string $name): ?string + { + if (isset($_SERVER[$name])) { + return (string) $_SERVER[$name]; + } + + if (\PHP_SAPI === 'cli' && ($value = \getenv($name)) !== false && $value !== null) { + return (string) $value; + } + + return null; + } + + /** + * @return string|false + */ + private static function idnToAsci(string $domain, int $options, ?array &$info = []) + { + if (\function_exists('idn_to_ascii') && \defined('INTL_IDNA_VARIANT_UTS46')) { + return \idn_to_ascii($domain, $options, \INTL_IDNA_VARIANT_UTS46, $info); + } + + throw new \Error('ext-idn or symfony/polyfill-intl-idn not loaded or too old'); + } +} diff --git a/vendor/guzzlehttp/guzzle/src/functions.php b/vendor/guzzlehttp/guzzle/src/functions.php new file mode 100644 index 0000000..a70d2cb --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/functions.php @@ -0,0 +1,167 @@ +<?php + +namespace GuzzleHttp; + +/** + * Debug function used to describe the provided value type and class. + * + * @param mixed $input Any type of variable to describe the type of. This + * parameter misses a typehint because of that. + * + * @return string Returns a string containing the type of the variable and + * if a class is provided, the class name. + * + * @deprecated describe_type will be removed in guzzlehttp/guzzle:8.0. Use Utils::describeType instead. + */ +function describe_type($input): string +{ + return Utils::describeType($input); +} + +/** + * Parses an array of header lines into an associative array of headers. + * + * @param iterable $lines Header lines array of strings in the following + * format: "Name: Value" + * + * @deprecated headers_from_lines will be removed in guzzlehttp/guzzle:8.0. Use Utils::headersFromLines instead. + */ +function headers_from_lines(iterable $lines): array +{ + return Utils::headersFromLines($lines); +} + +/** + * Returns a debug stream based on the provided variable. + * + * @param mixed $value Optional value + * + * @return resource + * + * @deprecated debug_resource will be removed in guzzlehttp/guzzle:8.0. Use Utils::debugResource instead. + */ +function debug_resource($value = null) +{ + return Utils::debugResource($value); +} + +/** + * Chooses and creates a default handler to use based on the environment. + * + * The returned handler is not wrapped by any default middlewares. + * + * @throws \RuntimeException if no viable Handler is available. + * + * @return callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface Returns the best handler for the given system. + * + * @deprecated choose_handler will be removed in guzzlehttp/guzzle:8.0. Use Utils::chooseHandler instead. + */ +function choose_handler(): callable +{ + return Utils::chooseHandler(); +} + +/** + * Get the default User-Agent string to use with Guzzle. + * + * @deprecated default_user_agent will be removed in guzzlehttp/guzzle:8.0. Use Utils::defaultUserAgent instead. + */ +function default_user_agent(): string +{ + return Utils::defaultUserAgent(); +} + +/** + * Returns the default cacert bundle for the current system. + * + * First, the openssl.cafile and curl.cainfo php.ini settings are checked. + * If those settings are not configured, then the common locations for + * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X + * and Windows are checked. If any of these file locations are found on + * disk, they will be utilized. + * + * Note: the result of this function is cached for subsequent calls. + * + * @throws \RuntimeException if no bundle can be found. + * + * @deprecated default_ca_bundle will be removed in guzzlehttp/guzzle:8.0. This function is not needed in PHP 5.6+. + */ +function default_ca_bundle(): string +{ + return Utils::defaultCaBundle(); +} + +/** + * Creates an associative array of lowercase header names to the actual + * header casing. + * + * @deprecated normalize_header_keys will be removed in guzzlehttp/guzzle:8.0. Use Utils::normalizeHeaderKeys instead. + */ +function normalize_header_keys(array $headers): array +{ + return Utils::normalizeHeaderKeys($headers); +} + +/** + * Returns true if the provided host matches any of the no proxy areas. + * + * This method will strip a port from the host if it is present. Each pattern + * can be matched with an exact match (e.g., "foo.com" == "foo.com") or a + * partial match: (e.g., "foo.com" == "baz.foo.com" and ".foo.com" == + * "baz.foo.com", but ".foo.com" != "foo.com"). + * + * Areas are matched in the following cases: + * 1. "*" (without quotes) always matches any hosts. + * 2. An exact match. + * 3. The area starts with "." and the area is the last part of the host. e.g. + * '.mit.edu' will match any host that ends with '.mit.edu'. + * + * @param string $host Host to check against the patterns. + * @param string[] $noProxyArray An array of host patterns. + * + * @throws Exception\InvalidArgumentException + * + * @deprecated is_host_in_noproxy will be removed in guzzlehttp/guzzle:8.0. Use Utils::isHostInNoProxy instead. + */ +function is_host_in_noproxy(string $host, array $noProxyArray): bool +{ + return Utils::isHostInNoProxy($host, $noProxyArray); +} + +/** + * Wrapper for json_decode that throws when an error occurs. + * + * @param string $json JSON data to parse + * @param bool $assoc When true, returned objects will be converted + * into associative arrays. + * @param int $depth User specified recursion depth. + * @param int $options Bitmask of JSON decode options. + * + * @return object|array|string|int|float|bool|null + * + * @throws Exception\InvalidArgumentException if the JSON cannot be decoded. + * + * @link https://www.php.net/manual/en/function.json-decode.php + * @deprecated json_decode will be removed in guzzlehttp/guzzle:8.0. Use Utils::jsonDecode instead. + */ +function json_decode(string $json, bool $assoc = false, int $depth = 512, int $options = 0) +{ + return Utils::jsonDecode($json, $assoc, $depth, $options); +} + +/** + * Wrapper for JSON encoding that throws when an error occurs. + * + * @param mixed $value The value being encoded + * @param int $options JSON encode option bitmask + * @param int $depth Set the maximum depth. Must be greater than zero. + * + * @throws Exception\InvalidArgumentException if the JSON cannot be encoded. + * + * @link https://www.php.net/manual/en/function.json-encode.php + * @deprecated json_encode will be removed in guzzlehttp/guzzle:8.0. Use Utils::jsonEncode instead. + */ +function json_encode($value, int $options = 0, int $depth = 512): string +{ + return Utils::jsonEncode($value, $options, $depth); +} diff --git a/vendor/guzzlehttp/guzzle/src/functions_include.php b/vendor/guzzlehttp/guzzle/src/functions_include.php new file mode 100644 index 0000000..6636a42 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/functions_include.php @@ -0,0 +1,6 @@ +<?php + +// Don't redefine the functions if included multiple times. +if (!\function_exists('GuzzleHttp\describe_type')) { + require __DIR__ . '/functions.php'; +} diff --git a/vendor/guzzlehttp/promises/CHANGELOG.md b/vendor/guzzlehttp/promises/CHANGELOG.md new file mode 100644 index 0000000..253282e --- /dev/null +++ b/vendor/guzzlehttp/promises/CHANGELOG.md @@ -0,0 +1,110 @@ +# CHANGELOG + +## 1.5.2 - 2022-08-07 + +### Changed + +- Officially support PHP 8.2 + +## 1.5.1 - 2021-10-22 + +### Fixed + +- Revert "Call handler when waiting on fulfilled/rejected Promise" +- Fix pool memory leak when empty array of promises provided + +## 1.5.0 - 2021-10-07 + +### Changed + +- Call handler when waiting on fulfilled/rejected Promise +- Officially support PHP 8.1 + +### Fixed + +- Fix manually settle promises generated with `Utils::task` + +## 1.4.1 - 2021-02-18 + +### Fixed + +- Fixed `each_limit` skipping promises and failing + +## 1.4.0 - 2020-09-30 + +### Added + +- Support for PHP 8 +- Optional `$recursive` flag to `all` +- Replaced functions by static methods + +### Fixed + +- Fix empty `each` processing +- Fix promise handling for Iterators of non-unique keys +- Fixed `method_exists` crashes on PHP 8 +- Memory leak on exceptions + + +## 1.3.1 - 2016-12-20 + +### Fixed + +- `wait()` foreign promise compatibility + + +## 1.3.0 - 2016-11-18 + +### Added + +- Adds support for custom task queues. + +### Fixed + +- Fixed coroutine promise memory leak. + + +## 1.2.0 - 2016-05-18 + +### Changed + +- Update to now catch `\Throwable` on PHP 7+ + + +## 1.1.0 - 2016-03-07 + +### Changed + +- Update EachPromise to prevent recurring on a iterator when advancing, as this + could trigger fatal generator errors. +- Update Promise to allow recursive waiting without unwrapping exceptions. + + +## 1.0.3 - 2015-10-15 + +### Changed + +- Update EachPromise to immediately resolve when the underlying promise iterator + is empty. Previously, such a promise would throw an exception when its `wait` + function was called. + + +## 1.0.2 - 2015-05-15 + +### Changed + +- Conditionally require functions.php. + + +## 1.0.1 - 2015-06-24 + +### Changed + +- Updating EachPromise to call next on the underlying promise iterator as late + as possible to ensure that generators that generate new requests based on + callbacks are not iterated until after callbacks are invoked. + + +## 1.0.0 - 2015-05-12 + +- Initial release diff --git a/vendor/guzzlehttp/promises/LICENSE b/vendor/guzzlehttp/promises/LICENSE new file mode 100644 index 0000000..9f0f943 --- /dev/null +++ b/vendor/guzzlehttp/promises/LICENSE @@ -0,0 +1,24 @@ +The MIT License (MIT) + +Copyright (c) 2015 Michael Dowling <mtdowling@gmail.com> +Copyright (c) 2015 Graham Campbell <hello@gjcampbell.co.uk> +Copyright (c) 2017 Tobias Schultze <webmaster@tubo-world.de> +Copyright (c) 2020 Tobias Nyholm <tobias.nyholm@gmail.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/guzzlehttp/promises/README.md b/vendor/guzzlehttp/promises/README.md new file mode 100644 index 0000000..1ea667a --- /dev/null +++ b/vendor/guzzlehttp/promises/README.md @@ -0,0 +1,546 @@ +# Guzzle Promises + +[Promises/A+](https://promisesaplus.com/) implementation that handles promise +chaining and resolution iteratively, allowing for "infinite" promise chaining +while keeping the stack size constant. Read [this blog post](https://blog.domenic.me/youre-missing-the-point-of-promises/) +for a general introduction to promises. + +- [Features](#features) +- [Quick start](#quick-start) +- [Synchronous wait](#synchronous-wait) +- [Cancellation](#cancellation) +- [API](#api) + - [Promise](#promise) + - [FulfilledPromise](#fulfilledpromise) + - [RejectedPromise](#rejectedpromise) +- [Promise interop](#promise-interop) +- [Implementation notes](#implementation-notes) + + +## Features + +- [Promises/A+](https://promisesaplus.com/) implementation. +- Promise resolution and chaining is handled iteratively, allowing for + "infinite" promise chaining. +- Promises have a synchronous `wait` method. +- Promises can be cancelled. +- Works with any object that has a `then` function. +- C# style async/await coroutine promises using + `GuzzleHttp\Promise\Coroutine::of()`. + + +## Quick Start + +A *promise* represents the eventual result of an asynchronous operation. The +primary way of interacting with a promise is through its `then` method, which +registers callbacks to receive either a promise's eventual value or the reason +why the promise cannot be fulfilled. + +### Callbacks + +Callbacks are registered with the `then` method by providing an optional +`$onFulfilled` followed by an optional `$onRejected` function. + + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise(); +$promise->then( + // $onFulfilled + function ($value) { + echo 'The promise was fulfilled.'; + }, + // $onRejected + function ($reason) { + echo 'The promise was rejected.'; + } +); +``` + +*Resolving* a promise means that you either fulfill a promise with a *value* or +reject a promise with a *reason*. Resolving a promise triggers callbacks +registered with the promise's `then` method. These callbacks are triggered +only once and in the order in which they were added. + +### Resolving a Promise + +Promises are fulfilled using the `resolve($value)` method. Resolving a promise +with any value other than a `GuzzleHttp\Promise\RejectedPromise` will trigger +all of the onFulfilled callbacks (resolving a promise with a rejected promise +will reject the promise and trigger the `$onRejected` callbacks). + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise(); +$promise + ->then(function ($value) { + // Return a value and don't break the chain + return "Hello, " . $value; + }) + // This then is executed after the first then and receives the value + // returned from the first then. + ->then(function ($value) { + echo $value; + }); + +// Resolving the promise triggers the $onFulfilled callbacks and outputs +// "Hello, reader." +$promise->resolve('reader.'); +``` + +### Promise Forwarding + +Promises can be chained one after the other. Each then in the chain is a new +promise. The return value of a promise is what's forwarded to the next +promise in the chain. Returning a promise in a `then` callback will cause the +subsequent promises in the chain to only be fulfilled when the returned promise +has been fulfilled. The next promise in the chain will be invoked with the +resolved value of the promise. + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise(); +$nextPromise = new Promise(); + +$promise + ->then(function ($value) use ($nextPromise) { + echo $value; + return $nextPromise; + }) + ->then(function ($value) { + echo $value; + }); + +// Triggers the first callback and outputs "A" +$promise->resolve('A'); +// Triggers the second callback and outputs "B" +$nextPromise->resolve('B'); +``` + +### Promise Rejection + +When a promise is rejected, the `$onRejected` callbacks are invoked with the +rejection reason. + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise(); +$promise->then(null, function ($reason) { + echo $reason; +}); + +$promise->reject('Error!'); +// Outputs "Error!" +``` + +### Rejection Forwarding + +If an exception is thrown in an `$onRejected` callback, subsequent +`$onRejected` callbacks are invoked with the thrown exception as the reason. + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise(); +$promise->then(null, function ($reason) { + throw new Exception($reason); +})->then(null, function ($reason) { + assert($reason->getMessage() === 'Error!'); +}); + +$promise->reject('Error!'); +``` + +You can also forward a rejection down the promise chain by returning a +`GuzzleHttp\Promise\RejectedPromise` in either an `$onFulfilled` or +`$onRejected` callback. + +```php +use GuzzleHttp\Promise\Promise; +use GuzzleHttp\Promise\RejectedPromise; + +$promise = new Promise(); +$promise->then(null, function ($reason) { + return new RejectedPromise($reason); +})->then(null, function ($reason) { + assert($reason === 'Error!'); +}); + +$promise->reject('Error!'); +``` + +If an exception is not thrown in a `$onRejected` callback and the callback +does not return a rejected promise, downstream `$onFulfilled` callbacks are +invoked using the value returned from the `$onRejected` callback. + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise(); +$promise + ->then(null, function ($reason) { + return "It's ok"; + }) + ->then(function ($value) { + assert($value === "It's ok"); + }); + +$promise->reject('Error!'); +``` + + +## Synchronous Wait + +You can synchronously force promises to complete using a promise's `wait` +method. When creating a promise, you can provide a wait function that is used +to synchronously force a promise to complete. When a wait function is invoked +it is expected to deliver a value to the promise or reject the promise. If the +wait function does not deliver a value, then an exception is thrown. The wait +function provided to a promise constructor is invoked when the `wait` function +of the promise is called. + +```php +$promise = new Promise(function () use (&$promise) { + $promise->resolve('foo'); +}); + +// Calling wait will return the value of the promise. +echo $promise->wait(); // outputs "foo" +``` + +If an exception is encountered while invoking the wait function of a promise, +the promise is rejected with the exception and the exception is thrown. + +```php +$promise = new Promise(function () use (&$promise) { + throw new Exception('foo'); +}); + +$promise->wait(); // throws the exception. +``` + +Calling `wait` on a promise that has been fulfilled will not trigger the wait +function. It will simply return the previously resolved value. + +```php +$promise = new Promise(function () { die('this is not called!'); }); +$promise->resolve('foo'); +echo $promise->wait(); // outputs "foo" +``` + +Calling `wait` on a promise that has been rejected will throw an exception. If +the rejection reason is an instance of `\Exception` the reason is thrown. +Otherwise, a `GuzzleHttp\Promise\RejectionException` is thrown and the reason +can be obtained by calling the `getReason` method of the exception. + +```php +$promise = new Promise(); +$promise->reject('foo'); +$promise->wait(); +``` + +> PHP Fatal error: Uncaught exception 'GuzzleHttp\Promise\RejectionException' with message 'The promise was rejected with value: foo' + +### Unwrapping a Promise + +When synchronously waiting on a promise, you are joining the state of the +promise into the current state of execution (i.e., return the value of the +promise if it was fulfilled or throw an exception if it was rejected). This is +called "unwrapping" the promise. Waiting on a promise will by default unwrap +the promise state. + +You can force a promise to resolve and *not* unwrap the state of the promise +by passing `false` to the first argument of the `wait` function: + +```php +$promise = new Promise(); +$promise->reject('foo'); +// This will not throw an exception. It simply ensures the promise has +// been resolved. +$promise->wait(false); +``` + +When unwrapping a promise, the resolved value of the promise will be waited +upon until the unwrapped value is not a promise. This means that if you resolve +promise A with a promise B and unwrap promise A, the value returned by the +wait function will be the value delivered to promise B. + +**Note**: when you do not unwrap the promise, no value is returned. + + +## Cancellation + +You can cancel a promise that has not yet been fulfilled using the `cancel()` +method of a promise. When creating a promise you can provide an optional +cancel function that when invoked cancels the action of computing a resolution +of the promise. + + +## API + +### Promise + +When creating a promise object, you can provide an optional `$waitFn` and +`$cancelFn`. `$waitFn` is a function that is invoked with no arguments and is +expected to resolve the promise. `$cancelFn` is a function with no arguments +that is expected to cancel the computation of a promise. It is invoked when the +`cancel()` method of a promise is called. + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise( + function () use (&$promise) { + $promise->resolve('waited'); + }, + function () { + // do something that will cancel the promise computation (e.g., close + // a socket, cancel a database query, etc...) + } +); + +assert('waited' === $promise->wait()); +``` + +A promise has the following methods: + +- `then(callable $onFulfilled, callable $onRejected) : PromiseInterface` + + Appends fulfillment and rejection handlers to the promise, and returns a new promise resolving to the return value of the called handler. + +- `otherwise(callable $onRejected) : PromiseInterface` + + Appends a rejection handler callback to the promise, and returns a new promise resolving to the return value of the callback if it is called, or to its original fulfillment value if the promise is instead fulfilled. + +- `wait($unwrap = true) : mixed` + + Synchronously waits on the promise to complete. + + `$unwrap` controls whether or not the value of the promise is returned for a + fulfilled promise or if an exception is thrown if the promise is rejected. + This is set to `true` by default. + +- `cancel()` + + Attempts to cancel the promise if possible. The promise being cancelled and + the parent most ancestor that has not yet been resolved will also be + cancelled. Any promises waiting on the cancelled promise to resolve will also + be cancelled. + +- `getState() : string` + + Returns the state of the promise. One of `pending`, `fulfilled`, or + `rejected`. + +- `resolve($value)` + + Fulfills the promise with the given `$value`. + +- `reject($reason)` + + Rejects the promise with the given `$reason`. + + +### FulfilledPromise + +A fulfilled promise can be created to represent a promise that has been +fulfilled. + +```php +use GuzzleHttp\Promise\FulfilledPromise; + +$promise = new FulfilledPromise('value'); + +// Fulfilled callbacks are immediately invoked. +$promise->then(function ($value) { + echo $value; +}); +``` + + +### RejectedPromise + +A rejected promise can be created to represent a promise that has been +rejected. + +```php +use GuzzleHttp\Promise\RejectedPromise; + +$promise = new RejectedPromise('Error'); + +// Rejected callbacks are immediately invoked. +$promise->then(null, function ($reason) { + echo $reason; +}); +``` + + +## Promise Interoperability + +This library works with foreign promises that have a `then` method. This means +you can use Guzzle promises with [React promises](https://github.com/reactphp/promise) +for example. When a foreign promise is returned inside of a then method +callback, promise resolution will occur recursively. + +```php +// Create a React promise +$deferred = new React\Promise\Deferred(); +$reactPromise = $deferred->promise(); + +// Create a Guzzle promise that is fulfilled with a React promise. +$guzzlePromise = new GuzzleHttp\Promise\Promise(); +$guzzlePromise->then(function ($value) use ($reactPromise) { + // Do something something with the value... + // Return the React promise + return $reactPromise; +}); +``` + +Please note that wait and cancel chaining is no longer possible when forwarding +a foreign promise. You will need to wrap a third-party promise with a Guzzle +promise in order to utilize wait and cancel functions with foreign promises. + + +### Event Loop Integration + +In order to keep the stack size constant, Guzzle promises are resolved +asynchronously using a task queue. When waiting on promises synchronously, the +task queue will be automatically run to ensure that the blocking promise and +any forwarded promises are resolved. When using promises asynchronously in an +event loop, you will need to run the task queue on each tick of the loop. If +you do not run the task queue, then promises will not be resolved. + +You can run the task queue using the `run()` method of the global task queue +instance. + +```php +// Get the global task queue +$queue = GuzzleHttp\Promise\Utils::queue(); +$queue->run(); +``` + +For example, you could use Guzzle promises with React using a periodic timer: + +```php +$loop = React\EventLoop\Factory::create(); +$loop->addPeriodicTimer(0, [$queue, 'run']); +``` + +*TODO*: Perhaps adding a `futureTick()` on each tick would be faster? + + +## Implementation Notes + +### Promise Resolution and Chaining is Handled Iteratively + +By shuffling pending handlers from one owner to another, promises are +resolved iteratively, allowing for "infinite" then chaining. + +```php +<?php +require 'vendor/autoload.php'; + +use GuzzleHttp\Promise\Promise; + +$parent = new Promise(); +$p = $parent; + +for ($i = 0; $i < 1000; $i++) { + $p = $p->then(function ($v) { + // The stack size remains constant (a good thing) + echo xdebug_get_stack_depth() . ', '; + return $v + 1; + }); +} + +$parent->resolve(0); +var_dump($p->wait()); // int(1000) + +``` + +When a promise is fulfilled or rejected with a non-promise value, the promise +then takes ownership of the handlers of each child promise and delivers values +down the chain without using recursion. + +When a promise is resolved with another promise, the original promise transfers +all of its pending handlers to the new promise. When the new promise is +eventually resolved, all of the pending handlers are delivered the forwarded +value. + +### A Promise is the Deferred + +Some promise libraries implement promises using a deferred object to represent +a computation and a promise object to represent the delivery of the result of +the computation. This is a nice separation of computation and delivery because +consumers of the promise cannot modify the value that will be eventually +delivered. + +One side effect of being able to implement promise resolution and chaining +iteratively is that you need to be able for one promise to reach into the state +of another promise to shuffle around ownership of handlers. In order to achieve +this without making the handlers of a promise publicly mutable, a promise is +also the deferred value, allowing promises of the same parent class to reach +into and modify the private properties of promises of the same type. While this +does allow consumers of the value to modify the resolution or rejection of the +deferred, it is a small price to pay for keeping the stack size constant. + +```php +$promise = new Promise(); +$promise->then(function ($value) { echo $value; }); +// The promise is the deferred value, so you can deliver a value to it. +$promise->resolve('foo'); +// prints "foo" +``` + + +## Upgrading from Function API + +A static API was first introduced in 1.4.0, in order to mitigate problems with +functions conflicting between global and local copies of the package. The +function API will be removed in 2.0.0. A migration table has been provided here +for your convenience: + +| Original Function | Replacement Method | +|----------------|----------------| +| `queue` | `Utils::queue` | +| `task` | `Utils::task` | +| `promise_for` | `Create::promiseFor` | +| `rejection_for` | `Create::rejectionFor` | +| `exception_for` | `Create::exceptionFor` | +| `iter_for` | `Create::iterFor` | +| `inspect` | `Utils::inspect` | +| `inspect_all` | `Utils::inspectAll` | +| `unwrap` | `Utils::unwrap` | +| `all` | `Utils::all` | +| `some` | `Utils::some` | +| `any` | `Utils::any` | +| `settle` | `Utils::settle` | +| `each` | `Each::of` | +| `each_limit` | `Each::ofLimit` | +| `each_limit_all` | `Each::ofLimitAll` | +| `!is_fulfilled` | `Is::pending` | +| `is_fulfilled` | `Is::fulfilled` | +| `is_rejected` | `Is::rejected` | +| `is_settled` | `Is::settled` | +| `coroutine` | `Coroutine::of` | + + +## Security + +If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/promises/security/policy) for more information. + + +## License + +Guzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information. + + +## For Enterprise + +Available as part of the Tidelift Subscription + +The maintainers of Guzzle and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-guzzlehttp-promises?utm_source=packagist-guzzlehttp-promises&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/vendor/guzzlehttp/promises/composer.json b/vendor/guzzlehttp/promises/composer.json new file mode 100644 index 0000000..c959fb3 --- /dev/null +++ b/vendor/guzzlehttp/promises/composer.json @@ -0,0 +1,58 @@ +{ + "name": "guzzlehttp/promises", + "description": "Guzzle promises library", + "keywords": ["promise"], + "license": "MIT", + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": ["src/functions_include.php"] + }, + "autoload-dev": { + "psr-4": { + "GuzzleHttp\\Promise\\Tests\\": "tests/" + } + }, + "scripts": { + "test": "vendor/bin/simple-phpunit", + "test-ci": "vendor/bin/simple-phpunit --coverage-text" + }, + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "config": { + "preferred-install": "dist", + "sort-packages": true + } +} diff --git a/vendor/guzzlehttp/promises/src/AggregateException.php b/vendor/guzzlehttp/promises/src/AggregateException.php new file mode 100644 index 0000000..d2b5712 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/AggregateException.php @@ -0,0 +1,17 @@ +<?php + +namespace GuzzleHttp\Promise; + +/** + * Exception thrown when too many errors occur in the some() or any() methods. + */ +class AggregateException extends RejectionException +{ + public function __construct($msg, array $reasons) + { + parent::__construct( + $reasons, + sprintf('%s; %d rejected promises', $msg, count($reasons)) + ); + } +} diff --git a/vendor/guzzlehttp/promises/src/CancellationException.php b/vendor/guzzlehttp/promises/src/CancellationException.php new file mode 100644 index 0000000..56a1ed6 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/CancellationException.php @@ -0,0 +1,10 @@ +<?php + +namespace GuzzleHttp\Promise; + +/** + * Exception that is set as the reason for a promise that has been cancelled. + */ +class CancellationException extends RejectionException +{ +} diff --git a/vendor/guzzlehttp/promises/src/Coroutine.php b/vendor/guzzlehttp/promises/src/Coroutine.php new file mode 100644 index 0000000..670da47 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/Coroutine.php @@ -0,0 +1,169 @@ +<?php + +namespace GuzzleHttp\Promise; + +use Exception; +use Generator; +use Throwable; + +/** + * Creates a promise that is resolved using a generator that yields values or + * promises (somewhat similar to C#'s async keyword). + * + * When called, the Coroutine::of method will start an instance of the generator + * and returns a promise that is fulfilled with its final yielded value. + * + * Control is returned back to the generator when the yielded promise settles. + * This can lead to less verbose code when doing lots of sequential async calls + * with minimal processing in between. + * + * use GuzzleHttp\Promise; + * + * function createPromise($value) { + * return new Promise\FulfilledPromise($value); + * } + * + * $promise = Promise\Coroutine::of(function () { + * $value = (yield createPromise('a')); + * try { + * $value = (yield createPromise($value . 'b')); + * } catch (\Exception $e) { + * // The promise was rejected. + * } + * yield $value . 'c'; + * }); + * + * // Outputs "abc" + * $promise->then(function ($v) { echo $v; }); + * + * @param callable $generatorFn Generator function to wrap into a promise. + * + * @return Promise + * + * @link https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration + */ +final class Coroutine implements PromiseInterface +{ + /** + * @var PromiseInterface|null + */ + private $currentPromise; + + /** + * @var Generator + */ + private $generator; + + /** + * @var Promise + */ + private $result; + + public function __construct(callable $generatorFn) + { + $this->generator = $generatorFn(); + $this->result = new Promise(function () { + while (isset($this->currentPromise)) { + $this->currentPromise->wait(); + } + }); + try { + $this->nextCoroutine($this->generator->current()); + } catch (\Exception $exception) { + $this->result->reject($exception); + } catch (Throwable $throwable) { + $this->result->reject($throwable); + } + } + + /** + * Create a new coroutine. + * + * @return self + */ + public static function of(callable $generatorFn) + { + return new self($generatorFn); + } + + public function then( + callable $onFulfilled = null, + callable $onRejected = null + ) { + return $this->result->then($onFulfilled, $onRejected); + } + + public function otherwise(callable $onRejected) + { + return $this->result->otherwise($onRejected); + } + + public function wait($unwrap = true) + { + return $this->result->wait($unwrap); + } + + public function getState() + { + return $this->result->getState(); + } + + public function resolve($value) + { + $this->result->resolve($value); + } + + public function reject($reason) + { + $this->result->reject($reason); + } + + public function cancel() + { + $this->currentPromise->cancel(); + $this->result->cancel(); + } + + private function nextCoroutine($yielded) + { + $this->currentPromise = Create::promiseFor($yielded) + ->then([$this, '_handleSuccess'], [$this, '_handleFailure']); + } + + /** + * @internal + */ + public function _handleSuccess($value) + { + unset($this->currentPromise); + try { + $next = $this->generator->send($value); + if ($this->generator->valid()) { + $this->nextCoroutine($next); + } else { + $this->result->resolve($value); + } + } catch (Exception $exception) { + $this->result->reject($exception); + } catch (Throwable $throwable) { + $this->result->reject($throwable); + } + } + + /** + * @internal + */ + public function _handleFailure($reason) + { + unset($this->currentPromise); + try { + $nextYield = $this->generator->throw(Create::exceptionFor($reason)); + // The throw was caught, so keep iterating on the coroutine + $this->nextCoroutine($nextYield); + } catch (Exception $exception) { + $this->result->reject($exception); + } catch (Throwable $throwable) { + $this->result->reject($throwable); + } + } +} diff --git a/vendor/guzzlehttp/promises/src/Create.php b/vendor/guzzlehttp/promises/src/Create.php new file mode 100644 index 0000000..8d038e9 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/Create.php @@ -0,0 +1,84 @@ +<?php + +namespace GuzzleHttp\Promise; + +final class Create +{ + /** + * Creates a promise for a value if the value is not a promise. + * + * @param mixed $value Promise or value. + * + * @return PromiseInterface + */ + public static function promiseFor($value) + { + if ($value instanceof PromiseInterface) { + return $value; + } + + // Return a Guzzle promise that shadows the given promise. + if (is_object($value) && method_exists($value, 'then')) { + $wfn = method_exists($value, 'wait') ? [$value, 'wait'] : null; + $cfn = method_exists($value, 'cancel') ? [$value, 'cancel'] : null; + $promise = new Promise($wfn, $cfn); + $value->then([$promise, 'resolve'], [$promise, 'reject']); + return $promise; + } + + return new FulfilledPromise($value); + } + + /** + * Creates a rejected promise for a reason if the reason is not a promise. + * If the provided reason is a promise, then it is returned as-is. + * + * @param mixed $reason Promise or reason. + * + * @return PromiseInterface + */ + public static function rejectionFor($reason) + { + if ($reason instanceof PromiseInterface) { + return $reason; + } + + return new RejectedPromise($reason); + } + + /** + * Create an exception for a rejected promise value. + * + * @param mixed $reason + * + * @return \Exception|\Throwable + */ + public static function exceptionFor($reason) + { + if ($reason instanceof \Exception || $reason instanceof \Throwable) { + return $reason; + } + + return new RejectionException($reason); + } + + /** + * Returns an iterator for the given value. + * + * @param mixed $value + * + * @return \Iterator + */ + public static function iterFor($value) + { + if ($value instanceof \Iterator) { + return $value; + } + + if (is_array($value)) { + return new \ArrayIterator($value); + } + + return new \ArrayIterator([$value]); + } +} diff --git a/vendor/guzzlehttp/promises/src/Each.php b/vendor/guzzlehttp/promises/src/Each.php new file mode 100644 index 0000000..1dda354 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/Each.php @@ -0,0 +1,90 @@ +<?php + +namespace GuzzleHttp\Promise; + +final class Each +{ + /** + * Given an iterator that yields promises or values, returns a promise that + * is fulfilled with a null value when the iterator has been consumed or + * the aggregate promise has been fulfilled or rejected. + * + * $onFulfilled is a function that accepts the fulfilled value, iterator + * index, and the aggregate promise. The callback can invoke any necessary + * side effects and choose to resolve or reject the aggregate if needed. + * + * $onRejected is a function that accepts the rejection reason, iterator + * index, and the aggregate promise. The callback can invoke any necessary + * side effects and choose to resolve or reject the aggregate if needed. + * + * @param mixed $iterable Iterator or array to iterate over. + * @param callable $onFulfilled + * @param callable $onRejected + * + * @return PromiseInterface + */ + public static function of( + $iterable, + callable $onFulfilled = null, + callable $onRejected = null + ) { + return (new EachPromise($iterable, [ + 'fulfilled' => $onFulfilled, + 'rejected' => $onRejected + ]))->promise(); + } + + /** + * Like of, but only allows a certain number of outstanding promises at any + * given time. + * + * $concurrency may be an integer or a function that accepts the number of + * pending promises and returns a numeric concurrency limit value to allow + * for dynamic a concurrency size. + * + * @param mixed $iterable + * @param int|callable $concurrency + * @param callable $onFulfilled + * @param callable $onRejected + * + * @return PromiseInterface + */ + public static function ofLimit( + $iterable, + $concurrency, + callable $onFulfilled = null, + callable $onRejected = null + ) { + return (new EachPromise($iterable, [ + 'fulfilled' => $onFulfilled, + 'rejected' => $onRejected, + 'concurrency' => $concurrency + ]))->promise(); + } + + /** + * Like limit, but ensures that no promise in the given $iterable argument + * is rejected. If any promise is rejected, then the aggregate promise is + * rejected with the encountered rejection. + * + * @param mixed $iterable + * @param int|callable $concurrency + * @param callable $onFulfilled + * + * @return PromiseInterface + */ + public static function ofLimitAll( + $iterable, + $concurrency, + callable $onFulfilled = null + ) { + return each_limit( + $iterable, + $concurrency, + $onFulfilled, + function ($reason, $idx, PromiseInterface $aggregate) { + $aggregate->reject($reason); + } + ); + } +} diff --git a/vendor/guzzlehttp/promises/src/EachPromise.php b/vendor/guzzlehttp/promises/src/EachPromise.php new file mode 100644 index 0000000..280d799 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/EachPromise.php @@ -0,0 +1,247 @@ +<?php + +namespace GuzzleHttp\Promise; + +/** + * Represents a promise that iterates over many promises and invokes + * side-effect functions in the process. + */ +class EachPromise implements PromisorInterface +{ + private $pending = []; + + private $nextPendingIndex = 0; + + /** @var \Iterator|null */ + private $iterable; + + /** @var callable|int|null */ + private $concurrency; + + /** @var callable|null */ + private $onFulfilled; + + /** @var callable|null */ + private $onRejected; + + /** @var Promise|null */ + private $aggregate; + + /** @var bool|null */ + private $mutex; + + /** + * Configuration hash can include the following key value pairs: + * + * - fulfilled: (callable) Invoked when a promise fulfills. The function + * is invoked with three arguments: the fulfillment value, the index + * position from the iterable list of the promise, and the aggregate + * promise that manages all of the promises. The aggregate promise may + * be resolved from within the callback to short-circuit the promise. + * - rejected: (callable) Invoked when a promise is rejected. The + * function is invoked with three arguments: the rejection reason, the + * index position from the iterable list of the promise, and the + * aggregate promise that manages all of the promises. The aggregate + * promise may be resolved from within the callback to short-circuit + * the promise. + * - concurrency: (integer) Pass this configuration option to limit the + * allowed number of outstanding concurrently executing promises, + * creating a capped pool of promises. There is no limit by default. + * + * @param mixed $iterable Promises or values to iterate. + * @param array $config Configuration options + */ + public function __construct($iterable, array $config = []) + { + $this->iterable = Create::iterFor($iterable); + + if (isset($config['concurrency'])) { + $this->concurrency = $config['concurrency']; + } + + if (isset($config['fulfilled'])) { + $this->onFulfilled = $config['fulfilled']; + } + + if (isset($config['rejected'])) { + $this->onRejected = $config['rejected']; + } + } + + /** @psalm-suppress InvalidNullableReturnType */ + public function promise() + { + if ($this->aggregate) { + return $this->aggregate; + } + + try { + $this->createPromise(); + /** @psalm-assert Promise $this->aggregate */ + $this->iterable->rewind(); + $this->refillPending(); + } catch (\Throwable $e) { + $this->aggregate->reject($e); + } catch (\Exception $e) { + $this->aggregate->reject($e); + } + + /** + * @psalm-suppress NullableReturnStatement + * @phpstan-ignore-next-line + */ + return $this->aggregate; + } + + private function createPromise() + { + $this->mutex = false; + $this->aggregate = new Promise(function () { + if ($this->checkIfFinished()) { + return; + } + reset($this->pending); + // Consume a potentially fluctuating list of promises while + // ensuring that indexes are maintained (precluding array_shift). + while ($promise = current($this->pending)) { + next($this->pending); + $promise->wait(); + if (Is::settled($this->aggregate)) { + return; + } + } + }); + + // Clear the references when the promise is resolved. + $clearFn = function () { + $this->iterable = $this->concurrency = $this->pending = null; + $this->onFulfilled = $this->onRejected = null; + $this->nextPendingIndex = 0; + }; + + $this->aggregate->then($clearFn, $clearFn); + } + + private function refillPending() + { + if (!$this->concurrency) { + // Add all pending promises. + while ($this->addPending() && $this->advanceIterator()); + return; + } + + // Add only up to N pending promises. + $concurrency = is_callable($this->concurrency) + ? call_user_func($this->concurrency, count($this->pending)) + : $this->concurrency; + $concurrency = max($concurrency - count($this->pending), 0); + // Concurrency may be set to 0 to disallow new promises. + if (!$concurrency) { + return; + } + // Add the first pending promise. + $this->addPending(); + // Note this is special handling for concurrency=1 so that we do + // not advance the iterator after adding the first promise. This + // helps work around issues with generators that might not have the + // next value to yield until promise callbacks are called. + while (--$concurrency + && $this->advanceIterator() + && $this->addPending()); + } + + private function addPending() + { + if (!$this->iterable || !$this->iterable->valid()) { + return false; + } + + $promise = Create::promiseFor($this->iterable->current()); + $key = $this->iterable->key(); + + // Iterable keys may not be unique, so we use a counter to + // guarantee uniqueness + $idx = $this->nextPendingIndex++; + + $this->pending[$idx] = $promise->then( + function ($value) use ($idx, $key) { + if ($this->onFulfilled) { + call_user_func( + $this->onFulfilled, + $value, + $key, + $this->aggregate + ); + } + $this->step($idx); + }, + function ($reason) use ($idx, $key) { + if ($this->onRejected) { + call_user_func( + $this->onRejected, + $reason, + $key, + $this->aggregate + ); + } + $this->step($idx); + } + ); + + return true; + } + + private function advanceIterator() + { + // Place a lock on the iterator so that we ensure to not recurse, + // preventing fatal generator errors. + if ($this->mutex) { + return false; + } + + $this->mutex = true; + + try { + $this->iterable->next(); + $this->mutex = false; + return true; + } catch (\Throwable $e) { + $this->aggregate->reject($e); + $this->mutex = false; + return false; + } catch (\Exception $e) { + $this->aggregate->reject($e); + $this->mutex = false; + return false; + } + } + + private function step($idx) + { + // If the promise was already resolved, then ignore this step. + if (Is::settled($this->aggregate)) { + return; + } + + unset($this->pending[$idx]); + + // Only refill pending promises if we are not locked, preventing the + // EachPromise to recursively invoke the provided iterator, which + // cause a fatal error: "Cannot resume an already running generator" + if ($this->advanceIterator() && !$this->checkIfFinished()) { + // Add more pending promises if possible. + $this->refillPending(); + } + } + + private function checkIfFinished() + { + if (!$this->pending && !$this->iterable->valid()) { + // Resolve the promise if there's nothing left to do. + $this->aggregate->resolve(null); + return true; + } + + return false; + } +} diff --git a/vendor/guzzlehttp/promises/src/FulfilledPromise.php b/vendor/guzzlehttp/promises/src/FulfilledPromise.php new file mode 100644 index 0000000..98f72a6 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/FulfilledPromise.php @@ -0,0 +1,84 @@ +<?php + +namespace GuzzleHttp\Promise; + +/** + * A promise that has been fulfilled. + * + * Thenning off of this promise will invoke the onFulfilled callback + * immediately and ignore other callbacks. + */ +class FulfilledPromise implements PromiseInterface +{ + private $value; + + public function __construct($value) + { + if (is_object($value) && method_exists($value, 'then')) { + throw new \InvalidArgumentException( + 'You cannot create a FulfilledPromise with a promise.' + ); + } + + $this->value = $value; + } + + public function then( + callable $onFulfilled = null, + callable $onRejected = null + ) { + // Return itself if there is no onFulfilled function. + if (!$onFulfilled) { + return $this; + } + + $queue = Utils::queue(); + $p = new Promise([$queue, 'run']); + $value = $this->value; + $queue->add(static function () use ($p, $value, $onFulfilled) { + if (Is::pending($p)) { + try { + $p->resolve($onFulfilled($value)); + } catch (\Throwable $e) { + $p->reject($e); + } catch (\Exception $e) { + $p->reject($e); + } + } + }); + + return $p; + } + + public function otherwise(callable $onRejected) + { + return $this->then(null, $onRejected); + } + + public function wait($unwrap = true, $defaultDelivery = null) + { + return $unwrap ? $this->value : null; + } + + public function getState() + { + return self::FULFILLED; + } + + public function resolve($value) + { + if ($value !== $this->value) { + throw new \LogicException("Cannot resolve a fulfilled promise"); + } + } + + public function reject($reason) + { + throw new \LogicException("Cannot reject a fulfilled promise"); + } + + public function cancel() + { + // pass + } +} diff --git a/vendor/guzzlehttp/promises/src/Is.php b/vendor/guzzlehttp/promises/src/Is.php new file mode 100644 index 0000000..c3ed8d0 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/Is.php @@ -0,0 +1,46 @@ +<?php + +namespace GuzzleHttp\Promise; + +final class Is +{ + /** + * Returns true if a promise is pending. + * + * @return bool + */ + public static function pending(PromiseInterface $promise) + { + return $promise->getState() === PromiseInterface::PENDING; + } + + /** + * Returns true if a promise is fulfilled or rejected. + * + * @return bool + */ + public static function settled(PromiseInterface $promise) + { + return $promise->getState() !== PromiseInterface::PENDING; + } + + /** + * Returns true if a promise is fulfilled. + * + * @return bool + */ + public static function fulfilled(PromiseInterface $promise) + { + return $promise->getState() === PromiseInterface::FULFILLED; + } + + /** + * Returns true if a promise is rejected. + * + * @return bool + */ + public static function rejected(PromiseInterface $promise) + { + return $promise->getState() === PromiseInterface::REJECTED; + } +} diff --git a/vendor/guzzlehttp/promises/src/Promise.php b/vendor/guzzlehttp/promises/src/Promise.php new file mode 100644 index 0000000..7593905 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/Promise.php @@ -0,0 +1,278 @@ +<?php + +namespace GuzzleHttp\Promise; + +/** + * Promises/A+ implementation that avoids recursion when possible. + * + * @link https://promisesaplus.com/ + */ +class Promise implements PromiseInterface +{ + private $state = self::PENDING; + private $result; + private $cancelFn; + private $waitFn; + private $waitList; + private $handlers = []; + + /** + * @param callable $waitFn Fn that when invoked resolves the promise. + * @param callable $cancelFn Fn that when invoked cancels the promise. + */ + public function __construct( + callable $waitFn = null, + callable $cancelFn = null + ) { + $this->waitFn = $waitFn; + $this->cancelFn = $cancelFn; + } + + public function then( + callable $onFulfilled = null, + callable $onRejected = null + ) { + if ($this->state === self::PENDING) { + $p = new Promise(null, [$this, 'cancel']); + $this->handlers[] = [$p, $onFulfilled, $onRejected]; + $p->waitList = $this->waitList; + $p->waitList[] = $this; + return $p; + } + + // Return a fulfilled promise and immediately invoke any callbacks. + if ($this->state === self::FULFILLED) { + $promise = Create::promiseFor($this->result); + return $onFulfilled ? $promise->then($onFulfilled) : $promise; + } + + // It's either cancelled or rejected, so return a rejected promise + // and immediately invoke any callbacks. + $rejection = Create::rejectionFor($this->result); + return $onRejected ? $rejection->then(null, $onRejected) : $rejection; + } + + public function otherwise(callable $onRejected) + { + return $this->then(null, $onRejected); + } + + public function wait($unwrap = true) + { + $this->waitIfPending(); + + if ($this->result instanceof PromiseInterface) { + return $this->result->wait($unwrap); + } + if ($unwrap) { + if ($this->state === self::FULFILLED) { + return $this->result; + } + // It's rejected so "unwrap" and throw an exception. + throw Create::exceptionFor($this->result); + } + } + + public function getState() + { + return $this->state; + } + + public function cancel() + { + if ($this->state !== self::PENDING) { + return; + } + + $this->waitFn = $this->waitList = null; + + if ($this->cancelFn) { + $fn = $this->cancelFn; + $this->cancelFn = null; + try { + $fn(); + } catch (\Throwable $e) { + $this->reject($e); + } catch (\Exception $e) { + $this->reject($e); + } + } + + // Reject the promise only if it wasn't rejected in a then callback. + /** @psalm-suppress RedundantCondition */ + if ($this->state === self::PENDING) { + $this->reject(new CancellationException('Promise has been cancelled')); + } + } + + public function resolve($value) + { + $this->settle(self::FULFILLED, $value); + } + + public function reject($reason) + { + $this->settle(self::REJECTED, $reason); + } + + private function settle($state, $value) + { + if ($this->state !== self::PENDING) { + // Ignore calls with the same resolution. + if ($state === $this->state && $value === $this->result) { + return; + } + throw $this->state === $state + ? new \LogicException("The promise is already {$state}.") + : new \LogicException("Cannot change a {$this->state} promise to {$state}"); + } + + if ($value === $this) { + throw new \LogicException('Cannot fulfill or reject a promise with itself'); + } + + // Clear out the state of the promise but stash the handlers. + $this->state = $state; + $this->result = $value; + $handlers = $this->handlers; + $this->handlers = null; + $this->waitList = $this->waitFn = null; + $this->cancelFn = null; + + if (!$handlers) { + return; + } + + // If the value was not a settled promise or a thenable, then resolve + // it in the task queue using the correct ID. + if (!is_object($value) || !method_exists($value, 'then')) { + $id = $state === self::FULFILLED ? 1 : 2; + // It's a success, so resolve the handlers in the queue. + Utils::queue()->add(static function () use ($id, $value, $handlers) { + foreach ($handlers as $handler) { + self::callHandler($id, $value, $handler); + } + }); + } elseif ($value instanceof Promise && Is::pending($value)) { + // We can just merge our handlers onto the next promise. + $value->handlers = array_merge($value->handlers, $handlers); + } else { + // Resolve the handlers when the forwarded promise is resolved. + $value->then( + static function ($value) use ($handlers) { + foreach ($handlers as $handler) { + self::callHandler(1, $value, $handler); + } + }, + static function ($reason) use ($handlers) { + foreach ($handlers as $handler) { + self::callHandler(2, $reason, $handler); + } + } + ); + } + } + + /** + * Call a stack of handlers using a specific callback index and value. + * + * @param int $index 1 (resolve) or 2 (reject). + * @param mixed $value Value to pass to the callback. + * @param array $handler Array of handler data (promise and callbacks). + */ + private static function callHandler($index, $value, array $handler) + { + /** @var PromiseInterface $promise */ + $promise = $handler[0]; + + // The promise may have been cancelled or resolved before placing + // this thunk in the queue. + if (Is::settled($promise)) { + return; + } + + try { + if (isset($handler[$index])) { + /* + * If $f throws an exception, then $handler will be in the exception + * stack trace. Since $handler contains a reference to the callable + * itself we get a circular reference. We clear the $handler + * here to avoid that memory leak. + */ + $f = $handler[$index]; + unset($handler); + $promise->resolve($f($value)); + } elseif ($index === 1) { + // Forward resolution values as-is. + $promise->resolve($value); + } else { + // Forward rejections down the chain. + $promise->reject($value); + } + } catch (\Throwable $reason) { + $promise->reject($reason); + } catch (\Exception $reason) { + $promise->reject($reason); + } + } + + private function waitIfPending() + { + if ($this->state !== self::PENDING) { + return; + } elseif ($this->waitFn) { + $this->invokeWaitFn(); + } elseif ($this->waitList) { + $this->invokeWaitList(); + } else { + // If there's no wait function, then reject the promise. + $this->reject('Cannot wait on a promise that has ' + . 'no internal wait function. You must provide a wait ' + . 'function when constructing the promise to be able to ' + . 'wait on a promise.'); + } + + Utils::queue()->run(); + + /** @psalm-suppress RedundantCondition */ + if ($this->state === self::PENDING) { + $this->reject('Invoking the wait callback did not resolve the promise'); + } + } + + private function invokeWaitFn() + { + try { + $wfn = $this->waitFn; + $this->waitFn = null; + $wfn(true); + } catch (\Exception $reason) { + if ($this->state === self::PENDING) { + // The promise has not been resolved yet, so reject the promise + // with the exception. + $this->reject($reason); + } else { + // The promise was already resolved, so there's a problem in + // the application. + throw $reason; + } + } + } + + private function invokeWaitList() + { + $waitList = $this->waitList; + $this->waitList = null; + + foreach ($waitList as $result) { + do { + $result->waitIfPending(); + $result = $result->result; + } while ($result instanceof Promise); + + if ($result instanceof PromiseInterface) { + $result->wait(false); + } + } + } +} diff --git a/vendor/guzzlehttp/promises/src/PromiseInterface.php b/vendor/guzzlehttp/promises/src/PromiseInterface.php new file mode 100644 index 0000000..e598331 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/PromiseInterface.php @@ -0,0 +1,97 @@ +<?php + +namespace GuzzleHttp\Promise; + +/** + * A promise represents the eventual result of an asynchronous operation. + * + * The primary way of interacting with a promise is through its then method, + * which registers callbacks to receive either a promise’s eventual value or + * the reason why the promise cannot be fulfilled. + * + * @link https://promisesaplus.com/ + */ +interface PromiseInterface +{ + const PENDING = 'pending'; + const FULFILLED = 'fulfilled'; + const REJECTED = 'rejected'; + + /** + * Appends fulfillment and rejection handlers to the promise, and returns + * a new promise resolving to the return value of the called handler. + * + * @param callable $onFulfilled Invoked when the promise fulfills. + * @param callable $onRejected Invoked when the promise is rejected. + * + * @return PromiseInterface + */ + public function then( + callable $onFulfilled = null, + callable $onRejected = null + ); + + /** + * Appends a rejection handler callback to the promise, and returns a new + * promise resolving to the return value of the callback if it is called, + * or to its original fulfillment value if the promise is instead + * fulfilled. + * + * @param callable $onRejected Invoked when the promise is rejected. + * + * @return PromiseInterface + */ + public function otherwise(callable $onRejected); + + /** + * Get the state of the promise ("pending", "rejected", or "fulfilled"). + * + * The three states can be checked against the constants defined on + * PromiseInterface: PENDING, FULFILLED, and REJECTED. + * + * @return string + */ + public function getState(); + + /** + * Resolve the promise with the given value. + * + * @param mixed $value + * + * @throws \RuntimeException if the promise is already resolved. + */ + public function resolve($value); + + /** + * Reject the promise with the given reason. + * + * @param mixed $reason + * + * @throws \RuntimeException if the promise is already resolved. + */ + public function reject($reason); + + /** + * Cancels the promise if possible. + * + * @link https://github.com/promises-aplus/cancellation-spec/issues/7 + */ + public function cancel(); + + /** + * Waits until the promise completes if possible. + * + * Pass $unwrap as true to unwrap the result of the promise, either + * returning the resolved value or throwing the rejected exception. + * + * If the promise cannot be waited on, then the promise will be rejected. + * + * @param bool $unwrap + * + * @return mixed + * + * @throws \LogicException if the promise has no wait function or if the + * promise does not settle after waiting. + */ + public function wait($unwrap = true); +} diff --git a/vendor/guzzlehttp/promises/src/PromisorInterface.php b/vendor/guzzlehttp/promises/src/PromisorInterface.php new file mode 100644 index 0000000..2d2e342 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/PromisorInterface.php @@ -0,0 +1,16 @@ +<?php + +namespace GuzzleHttp\Promise; + +/** + * Interface used with classes that return a promise. + */ +interface PromisorInterface +{ + /** + * Returns a promise. + * + * @return PromiseInterface + */ + public function promise(); +} diff --git a/vendor/guzzlehttp/promises/src/RejectedPromise.php b/vendor/guzzlehttp/promises/src/RejectedPromise.php new file mode 100644 index 0000000..d291846 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/RejectedPromise.php @@ -0,0 +1,91 @@ +<?php + +namespace GuzzleHttp\Promise; + +/** + * A promise that has been rejected. + * + * Thenning off of this promise will invoke the onRejected callback + * immediately and ignore other callbacks. + */ +class RejectedPromise implements PromiseInterface +{ + private $reason; + + public function __construct($reason) + { + if (is_object($reason) && method_exists($reason, 'then')) { + throw new \InvalidArgumentException( + 'You cannot create a RejectedPromise with a promise.' + ); + } + + $this->reason = $reason; + } + + public function then( + callable $onFulfilled = null, + callable $onRejected = null + ) { + // If there's no onRejected callback then just return self. + if (!$onRejected) { + return $this; + } + + $queue = Utils::queue(); + $reason = $this->reason; + $p = new Promise([$queue, 'run']); + $queue->add(static function () use ($p, $reason, $onRejected) { + if (Is::pending($p)) { + try { + // Return a resolved promise if onRejected does not throw. + $p->resolve($onRejected($reason)); + } catch (\Throwable $e) { + // onRejected threw, so return a rejected promise. + $p->reject($e); + } catch (\Exception $e) { + // onRejected threw, so return a rejected promise. + $p->reject($e); + } + } + }); + + return $p; + } + + public function otherwise(callable $onRejected) + { + return $this->then(null, $onRejected); + } + + public function wait($unwrap = true, $defaultDelivery = null) + { + if ($unwrap) { + throw Create::exceptionFor($this->reason); + } + + return null; + } + + public function getState() + { + return self::REJECTED; + } + + public function resolve($value) + { + throw new \LogicException("Cannot resolve a rejected promise"); + } + + public function reject($reason) + { + if ($reason !== $this->reason) { + throw new \LogicException("Cannot reject a rejected promise"); + } + } + + public function cancel() + { + // pass + } +} diff --git a/vendor/guzzlehttp/promises/src/RejectionException.php b/vendor/guzzlehttp/promises/src/RejectionException.php new file mode 100644 index 0000000..e2f1377 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/RejectionException.php @@ -0,0 +1,48 @@ +<?php + +namespace GuzzleHttp\Promise; + +/** + * A special exception that is thrown when waiting on a rejected promise. + * + * The reason value is available via the getReason() method. + */ +class RejectionException extends \RuntimeException +{ + /** @var mixed Rejection reason. */ + private $reason; + + /** + * @param mixed $reason Rejection reason. + * @param string $description Optional description + */ + public function __construct($reason, $description = null) + { + $this->reason = $reason; + + $message = 'The promise was rejected'; + + if ($description) { + $message .= ' with reason: ' . $description; + } elseif (is_string($reason) + || (is_object($reason) && method_exists($reason, '__toString')) + ) { + $message .= ' with reason: ' . $this->reason; + } elseif ($reason instanceof \JsonSerializable) { + $message .= ' with reason: ' + . json_encode($this->reason, JSON_PRETTY_PRINT); + } + + parent::__construct($message); + } + + /** + * Returns the rejection reason. + * + * @return mixed + */ + public function getReason() + { + return $this->reason; + } +} diff --git a/vendor/guzzlehttp/promises/src/TaskQueue.php b/vendor/guzzlehttp/promises/src/TaskQueue.php new file mode 100644 index 0000000..f0fba2c --- /dev/null +++ b/vendor/guzzlehttp/promises/src/TaskQueue.php @@ -0,0 +1,67 @@ +<?php + +namespace GuzzleHttp\Promise; + +/** + * A task queue that executes tasks in a FIFO order. + * + * This task queue class is used to settle promises asynchronously and + * maintains a constant stack size. You can use the task queue asynchronously + * by calling the `run()` function of the global task queue in an event loop. + * + * GuzzleHttp\Promise\Utils::queue()->run(); + */ +class TaskQueue implements TaskQueueInterface +{ + private $enableShutdown = true; + private $queue = []; + + public function __construct($withShutdown = true) + { + if ($withShutdown) { + register_shutdown_function(function () { + if ($this->enableShutdown) { + // Only run the tasks if an E_ERROR didn't occur. + $err = error_get_last(); + if (!$err || ($err['type'] ^ E_ERROR)) { + $this->run(); + } + } + }); + } + } + + public function isEmpty() + { + return !$this->queue; + } + + public function add(callable $task) + { + $this->queue[] = $task; + } + + public function run() + { + while ($task = array_shift($this->queue)) { + /** @var callable $task */ + $task(); + } + } + + /** + * The task queue will be run and exhausted by default when the process + * exits IFF the exit is not the result of a PHP E_ERROR error. + * + * You can disable running the automatic shutdown of the queue by calling + * this function. If you disable the task queue shutdown process, then you + * MUST either run the task queue (as a result of running your event loop + * or manually using the run() method) or wait on each outstanding promise. + * + * Note: This shutdown will occur before any destructors are triggered. + */ + public function disableShutdown() + { + $this->enableShutdown = false; + } +} diff --git a/vendor/guzzlehttp/promises/src/TaskQueueInterface.php b/vendor/guzzlehttp/promises/src/TaskQueueInterface.php new file mode 100644 index 0000000..723d4d5 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/TaskQueueInterface.php @@ -0,0 +1,24 @@ +<?php + +namespace GuzzleHttp\Promise; + +interface TaskQueueInterface +{ + /** + * Returns true if the queue is empty. + * + * @return bool + */ + public function isEmpty(); + + /** + * Adds a task to the queue that will be executed the next time run is + * called. + */ + public function add(callable $task); + + /** + * Execute all of the pending task in the queue. + */ + public function run(); +} diff --git a/vendor/guzzlehttp/promises/src/Utils.php b/vendor/guzzlehttp/promises/src/Utils.php new file mode 100644 index 0000000..8647126 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/Utils.php @@ -0,0 +1,276 @@ +<?php + +namespace GuzzleHttp\Promise; + +final class Utils +{ + /** + * Get the global task queue used for promise resolution. + * + * This task queue MUST be run in an event loop in order for promises to be + * settled asynchronously. It will be automatically run when synchronously + * waiting on a promise. + * + * <code> + * while ($eventLoop->isRunning()) { + * GuzzleHttp\Promise\Utils::queue()->run(); + * } + * </code> + * + * @param TaskQueueInterface $assign Optionally specify a new queue instance. + * + * @return TaskQueueInterface + */ + public static function queue(TaskQueueInterface $assign = null) + { + static $queue; + + if ($assign) { + $queue = $assign; + } elseif (!$queue) { + $queue = new TaskQueue(); + } + + return $queue; + } + + /** + * Adds a function to run in the task queue when it is next `run()` and + * returns a promise that is fulfilled or rejected with the result. + * + * @param callable $task Task function to run. + * + * @return PromiseInterface + */ + public static function task(callable $task) + { + $queue = self::queue(); + $promise = new Promise([$queue, 'run']); + $queue->add(function () use ($task, $promise) { + try { + if (Is::pending($promise)) { + $promise->resolve($task()); + } + } catch (\Throwable $e) { + $promise->reject($e); + } catch (\Exception $e) { + $promise->reject($e); + } + }); + + return $promise; + } + + /** + * Synchronously waits on a promise to resolve and returns an inspection + * state array. + * + * Returns a state associative array containing a "state" key mapping to a + * valid promise state. If the state of the promise is "fulfilled", the + * array will contain a "value" key mapping to the fulfilled value of the + * promise. If the promise is rejected, the array will contain a "reason" + * key mapping to the rejection reason of the promise. + * + * @param PromiseInterface $promise Promise or value. + * + * @return array + */ + public static function inspect(PromiseInterface $promise) + { + try { + return [ + 'state' => PromiseInterface::FULFILLED, + 'value' => $promise->wait() + ]; + } catch (RejectionException $e) { + return ['state' => PromiseInterface::REJECTED, 'reason' => $e->getReason()]; + } catch (\Throwable $e) { + return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; + } catch (\Exception $e) { + return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; + } + } + + /** + * Waits on all of the provided promises, but does not unwrap rejected + * promises as thrown exception. + * + * Returns an array of inspection state arrays. + * + * @see inspect for the inspection state array format. + * + * @param PromiseInterface[] $promises Traversable of promises to wait upon. + * + * @return array + */ + public static function inspectAll($promises) + { + $results = []; + foreach ($promises as $key => $promise) { + $results[$key] = inspect($promise); + } + + return $results; + } + + /** + * Waits on all of the provided promises and returns the fulfilled values. + * + * Returns an array that contains the value of each promise (in the same + * order the promises were provided). An exception is thrown if any of the + * promises are rejected. + * + * @param iterable<PromiseInterface> $promises Iterable of PromiseInterface objects to wait on. + * + * @return array + * + * @throws \Exception on error + * @throws \Throwable on error in PHP >=7 + */ + public static function unwrap($promises) + { + $results = []; + foreach ($promises as $key => $promise) { + $results[$key] = $promise->wait(); + } + + return $results; + } + + /** + * Given an array of promises, return a promise that is fulfilled when all + * the items in the array are fulfilled. + * + * The promise's fulfillment value is an array with fulfillment values at + * respective positions to the original array. If any promise in the array + * rejects, the returned promise is rejected with the rejection reason. + * + * @param mixed $promises Promises or values. + * @param bool $recursive If true, resolves new promises that might have been added to the stack during its own resolution. + * + * @return PromiseInterface + */ + public static function all($promises, $recursive = false) + { + $results = []; + $promise = Each::of( + $promises, + function ($value, $idx) use (&$results) { + $results[$idx] = $value; + }, + function ($reason, $idx, Promise $aggregate) { + $aggregate->reject($reason); + } + )->then(function () use (&$results) { + ksort($results); + return $results; + }); + + if (true === $recursive) { + $promise = $promise->then(function ($results) use ($recursive, &$promises) { + foreach ($promises as $promise) { + if (Is::pending($promise)) { + return self::all($promises, $recursive); + } + } + return $results; + }); + } + + return $promise; + } + + /** + * Initiate a competitive race between multiple promises or values (values + * will become immediately fulfilled promises). + * + * When count amount of promises have been fulfilled, the returned promise + * is fulfilled with an array that contains the fulfillment values of the + * winners in order of resolution. + * + * This promise is rejected with a {@see AggregateException} if the number + * of fulfilled promises is less than the desired $count. + * + * @param int $count Total number of promises. + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + */ + public static function some($count, $promises) + { + $results = []; + $rejections = []; + + return Each::of( + $promises, + function ($value, $idx, PromiseInterface $p) use (&$results, $count) { + if (Is::settled($p)) { + return; + } + $results[$idx] = $value; + if (count($results) >= $count) { + $p->resolve(null); + } + }, + function ($reason) use (&$rejections) { + $rejections[] = $reason; + } + )->then( + function () use (&$results, &$rejections, $count) { + if (count($results) !== $count) { + throw new AggregateException( + 'Not enough promises to fulfill count', + $rejections + ); + } + ksort($results); + return array_values($results); + } + ); + } + + /** + * Like some(), with 1 as count. However, if the promise fulfills, the + * fulfillment value is not an array of 1 but the value directly. + * + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + */ + public static function any($promises) + { + return self::some(1, $promises)->then(function ($values) { + return $values[0]; + }); + } + + /** + * Returns a promise that is fulfilled when all of the provided promises have + * been fulfilled or rejected. + * + * The returned promise is fulfilled with an array of inspection state arrays. + * + * @see inspect for the inspection state array format. + * + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + */ + public static function settle($promises) + { + $results = []; + + return Each::of( + $promises, + function ($value, $idx) use (&$results) { + $results[$idx] = ['state' => PromiseInterface::FULFILLED, 'value' => $value]; + }, + function ($reason, $idx) use (&$results) { + $results[$idx] = ['state' => PromiseInterface::REJECTED, 'reason' => $reason]; + } + )->then(function () use (&$results) { + ksort($results); + return $results; + }); + } +} diff --git a/vendor/guzzlehttp/promises/src/functions.php b/vendor/guzzlehttp/promises/src/functions.php new file mode 100644 index 0000000..c03d39d --- /dev/null +++ b/vendor/guzzlehttp/promises/src/functions.php @@ -0,0 +1,363 @@ +<?php + +namespace GuzzleHttp\Promise; + +/** + * Get the global task queue used for promise resolution. + * + * This task queue MUST be run in an event loop in order for promises to be + * settled asynchronously. It will be automatically run when synchronously + * waiting on a promise. + * + * <code> + * while ($eventLoop->isRunning()) { + * GuzzleHttp\Promise\queue()->run(); + * } + * </code> + * + * @param TaskQueueInterface $assign Optionally specify a new queue instance. + * + * @return TaskQueueInterface + * + * @deprecated queue will be removed in guzzlehttp/promises:2.0. Use Utils::queue instead. + */ +function queue(TaskQueueInterface $assign = null) +{ + return Utils::queue($assign); +} + +/** + * Adds a function to run in the task queue when it is next `run()` and returns + * a promise that is fulfilled or rejected with the result. + * + * @param callable $task Task function to run. + * + * @return PromiseInterface + * + * @deprecated task will be removed in guzzlehttp/promises:2.0. Use Utils::task instead. + */ +function task(callable $task) +{ + return Utils::task($task); +} + +/** + * Creates a promise for a value if the value is not a promise. + * + * @param mixed $value Promise or value. + * + * @return PromiseInterface + * + * @deprecated promise_for will be removed in guzzlehttp/promises:2.0. Use Create::promiseFor instead. + */ +function promise_for($value) +{ + return Create::promiseFor($value); +} + +/** + * Creates a rejected promise for a reason if the reason is not a promise. If + * the provided reason is a promise, then it is returned as-is. + * + * @param mixed $reason Promise or reason. + * + * @return PromiseInterface + * + * @deprecated rejection_for will be removed in guzzlehttp/promises:2.0. Use Create::rejectionFor instead. + */ +function rejection_for($reason) +{ + return Create::rejectionFor($reason); +} + +/** + * Create an exception for a rejected promise value. + * + * @param mixed $reason + * + * @return \Exception|\Throwable + * + * @deprecated exception_for will be removed in guzzlehttp/promises:2.0. Use Create::exceptionFor instead. + */ +function exception_for($reason) +{ + return Create::exceptionFor($reason); +} + +/** + * Returns an iterator for the given value. + * + * @param mixed $value + * + * @return \Iterator + * + * @deprecated iter_for will be removed in guzzlehttp/promises:2.0. Use Create::iterFor instead. + */ +function iter_for($value) +{ + return Create::iterFor($value); +} + +/** + * Synchronously waits on a promise to resolve and returns an inspection state + * array. + * + * Returns a state associative array containing a "state" key mapping to a + * valid promise state. If the state of the promise is "fulfilled", the array + * will contain a "value" key mapping to the fulfilled value of the promise. If + * the promise is rejected, the array will contain a "reason" key mapping to + * the rejection reason of the promise. + * + * @param PromiseInterface $promise Promise or value. + * + * @return array + * + * @deprecated inspect will be removed in guzzlehttp/promises:2.0. Use Utils::inspect instead. + */ +function inspect(PromiseInterface $promise) +{ + return Utils::inspect($promise); +} + +/** + * Waits on all of the provided promises, but does not unwrap rejected promises + * as thrown exception. + * + * Returns an array of inspection state arrays. + * + * @see inspect for the inspection state array format. + * + * @param PromiseInterface[] $promises Traversable of promises to wait upon. + * + * @return array + * + * @deprecated inspect will be removed in guzzlehttp/promises:2.0. Use Utils::inspectAll instead. + */ +function inspect_all($promises) +{ + return Utils::inspectAll($promises); +} + +/** + * Waits on all of the provided promises and returns the fulfilled values. + * + * Returns an array that contains the value of each promise (in the same order + * the promises were provided). An exception is thrown if any of the promises + * are rejected. + * + * @param iterable<PromiseInterface> $promises Iterable of PromiseInterface objects to wait on. + * + * @return array + * + * @throws \Exception on error + * @throws \Throwable on error in PHP >=7 + * + * @deprecated unwrap will be removed in guzzlehttp/promises:2.0. Use Utils::unwrap instead. + */ +function unwrap($promises) +{ + return Utils::unwrap($promises); +} + +/** + * Given an array of promises, return a promise that is fulfilled when all the + * items in the array are fulfilled. + * + * The promise's fulfillment value is an array with fulfillment values at + * respective positions to the original array. If any promise in the array + * rejects, the returned promise is rejected with the rejection reason. + * + * @param mixed $promises Promises or values. + * @param bool $recursive If true, resolves new promises that might have been added to the stack during its own resolution. + * + * @return PromiseInterface + * + * @deprecated all will be removed in guzzlehttp/promises:2.0. Use Utils::all instead. + */ +function all($promises, $recursive = false) +{ + return Utils::all($promises, $recursive); +} + +/** + * Initiate a competitive race between multiple promises or values (values will + * become immediately fulfilled promises). + * + * When count amount of promises have been fulfilled, the returned promise is + * fulfilled with an array that contains the fulfillment values of the winners + * in order of resolution. + * + * This promise is rejected with a {@see AggregateException} if the number of + * fulfilled promises is less than the desired $count. + * + * @param int $count Total number of promises. + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + * + * @deprecated some will be removed in guzzlehttp/promises:2.0. Use Utils::some instead. + */ +function some($count, $promises) +{ + return Utils::some($count, $promises); +} + +/** + * Like some(), with 1 as count. However, if the promise fulfills, the + * fulfillment value is not an array of 1 but the value directly. + * + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + * + * @deprecated any will be removed in guzzlehttp/promises:2.0. Use Utils::any instead. + */ +function any($promises) +{ + return Utils::any($promises); +} + +/** + * Returns a promise that is fulfilled when all of the provided promises have + * been fulfilled or rejected. + * + * The returned promise is fulfilled with an array of inspection state arrays. + * + * @see inspect for the inspection state array format. + * + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + * + * @deprecated settle will be removed in guzzlehttp/promises:2.0. Use Utils::settle instead. + */ +function settle($promises) +{ + return Utils::settle($promises); +} + +/** + * Given an iterator that yields promises or values, returns a promise that is + * fulfilled with a null value when the iterator has been consumed or the + * aggregate promise has been fulfilled or rejected. + * + * $onFulfilled is a function that accepts the fulfilled value, iterator index, + * and the aggregate promise. The callback can invoke any necessary side + * effects and choose to resolve or reject the aggregate if needed. + * + * $onRejected is a function that accepts the rejection reason, iterator index, + * and the aggregate promise. The callback can invoke any necessary side + * effects and choose to resolve or reject the aggregate if needed. + * + * @param mixed $iterable Iterator or array to iterate over. + * @param callable $onFulfilled + * @param callable $onRejected + * + * @return PromiseInterface + * + * @deprecated each will be removed in guzzlehttp/promises:2.0. Use Each::of instead. + */ +function each( + $iterable, + callable $onFulfilled = null, + callable $onRejected = null +) { + return Each::of($iterable, $onFulfilled, $onRejected); +} + +/** + * Like each, but only allows a certain number of outstanding promises at any + * given time. + * + * $concurrency may be an integer or a function that accepts the number of + * pending promises and returns a numeric concurrency limit value to allow for + * dynamic a concurrency size. + * + * @param mixed $iterable + * @param int|callable $concurrency + * @param callable $onFulfilled + * @param callable $onRejected + * + * @return PromiseInterface + * + * @deprecated each_limit will be removed in guzzlehttp/promises:2.0. Use Each::ofLimit instead. + */ +function each_limit( + $iterable, + $concurrency, + callable $onFulfilled = null, + callable $onRejected = null +) { + return Each::ofLimit($iterable, $concurrency, $onFulfilled, $onRejected); +} + +/** + * Like each_limit, but ensures that no promise in the given $iterable argument + * is rejected. If any promise is rejected, then the aggregate promise is + * rejected with the encountered rejection. + * + * @param mixed $iterable + * @param int|callable $concurrency + * @param callable $onFulfilled + * + * @return PromiseInterface + * + * @deprecated each_limit_all will be removed in guzzlehttp/promises:2.0. Use Each::ofLimitAll instead. + */ +function each_limit_all( + $iterable, + $concurrency, + callable $onFulfilled = null +) { + return Each::ofLimitAll($iterable, $concurrency, $onFulfilled); +} + +/** + * Returns true if a promise is fulfilled. + * + * @return bool + * + * @deprecated is_fulfilled will be removed in guzzlehttp/promises:2.0. Use Is::fulfilled instead. + */ +function is_fulfilled(PromiseInterface $promise) +{ + return Is::fulfilled($promise); +} + +/** + * Returns true if a promise is rejected. + * + * @return bool + * + * @deprecated is_rejected will be removed in guzzlehttp/promises:2.0. Use Is::rejected instead. + */ +function is_rejected(PromiseInterface $promise) +{ + return Is::rejected($promise); +} + +/** + * Returns true if a promise is fulfilled or rejected. + * + * @return bool + * + * @deprecated is_settled will be removed in guzzlehttp/promises:2.0. Use Is::settled instead. + */ +function is_settled(PromiseInterface $promise) +{ + return Is::settled($promise); +} + +/** + * Create a new coroutine. + * + * @see Coroutine + * + * @return PromiseInterface + * + * @deprecated coroutine will be removed in guzzlehttp/promises:2.0. Use Coroutine::of instead. + */ +function coroutine(callable $generatorFn) +{ + return Coroutine::of($generatorFn); +} diff --git a/vendor/guzzlehttp/promises/src/functions_include.php b/vendor/guzzlehttp/promises/src/functions_include.php new file mode 100644 index 0000000..34cd171 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/functions_include.php @@ -0,0 +1,6 @@ +<?php + +// Don't redefine the functions if included multiple times. +if (!function_exists('GuzzleHttp\Promise\promise_for')) { + require __DIR__ . '/functions.php'; +} diff --git a/vendor/guzzlehttp/psr7/CHANGELOG.md b/vendor/guzzlehttp/psr7/CHANGELOG.md new file mode 100644 index 0000000..3fcf18a --- /dev/null +++ b/vendor/guzzlehttp/psr7/CHANGELOG.md @@ -0,0 +1,396 @@ +# Change Log + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Unreleased + +## 2.4.3 - 2022-10-26 + +### Changed + +- Replaced `sha1(uniqid())` by `bin2hex(random_bytes(20))` + +## 2.4.2 - 2022-10-25 + +### Fixed + +- Fixed erroneous behaviour when combining host and relative path + +## 2.4.1 - 2022-08-28 + +### Fixed + +- Rewind body before reading in `Message::bodySummary` + +## 2.4.0 - 2022-06-20 + +### Added + +- Added provisional PHP 8.2 support +- Added `UriComparator::isCrossOrigin` method + +## 2.3.0 - 2022-06-09 + +### Fixed + +- Added `Header::splitList` method +- Added `Utils::tryGetContents` method +- Improved `Stream::getContents` method +- Updated mimetype mappings + +## 2.2.2 - 2022-06-08 + +### Fixed + +- Fix `Message::parseRequestUri` for numeric headers +- Re-wrap exceptions thrown in `fread` into runtime exceptions +- Throw an exception when multipart options is misformatted + +## 2.2.1 - 2022-03-20 + +### Fixed + +- Correct header value validation + +## 2.2.0 - 2022-03-20 + +### Added + +- A more compressive list of mime types +- Add JsonSerializable to Uri +- Missing return types + +### Fixed + +- Bug MultipartStream no `uri` metadata +- Bug MultipartStream with filename for `data://` streams +- Fixed new line handling in MultipartStream +- Reduced RAM usage when copying streams +- Updated parsing in `Header::normalize()` + +## 2.1.1 - 2022-03-20 + +### Fixed + +- Validate header values properly + +## 2.1.0 - 2021-10-06 + +### Changed + +- Attempting to create a `Uri` object from a malformed URI will no longer throw a generic + `InvalidArgumentException`, but rather a `MalformedUriException`, which inherits from the former + for backwards compatibility. Callers relying on the exception being thrown to detect invalid + URIs should catch the new exception. + +### Fixed + +- Return `null` in caching stream size if remote size is `null` + +## 2.0.0 - 2021-06-30 + +Identical to the RC release. + +## 2.0.0@RC-1 - 2021-04-29 + +### Fixed + +- Handle possibly unset `url` in `stream_get_meta_data` + +## 2.0.0@beta-1 - 2021-03-21 + +### Added + +- PSR-17 factories +- Made classes final +- PHP7 type hints + +### Changed + +- When building a query string, booleans are represented as 1 and 0. + +### Removed + +- PHP < 7.2 support +- All functions in the `GuzzleHttp\Psr7` namespace + +## 1.8.1 - 2021-03-21 + +### Fixed + +- Issue parsing IPv6 URLs +- Issue modifying ServerRequest lost all its attributes + +## 1.8.0 - 2021-03-21 + +### Added + +- Locale independent URL parsing +- Most classes got a `@final` annotation to prepare for 2.0 + +### Fixed + +- Issue when creating stream from `php://input` and curl-ext is not installed +- Broken `Utils::tryFopen()` on PHP 8 + +## 1.7.0 - 2020-09-30 + +### Added + +- Replaced functions by static methods + +### Fixed + +- Converting a non-seekable stream to a string +- Handle multiple Set-Cookie correctly +- Ignore array keys in header values when merging +- Allow multibyte characters to be parsed in `Message:bodySummary()` + +### Changed + +- Restored partial HHVM 3 support + + +## [1.6.1] - 2019-07-02 + +### Fixed + +- Accept null and bool header values again + + +## [1.6.0] - 2019-06-30 + +### Added + +- Allowed version `^3.0` of `ralouphie/getallheaders` dependency (#244) +- Added MIME type for WEBP image format (#246) +- Added more validation of values according to PSR-7 and RFC standards, e.g. status code range (#250, #272) + +### Changed + +- Tests don't pass with HHVM 4.0, so HHVM support got dropped. Other libraries like composer have done the same. (#262) +- Accept port number 0 to be valid (#270) + +### Fixed + +- Fixed subsequent reads from `php://input` in ServerRequest (#247) +- Fixed readable/writable detection for certain stream modes (#248) +- Fixed encoding of special characters in the `userInfo` component of an URI (#253) + + +## [1.5.2] - 2018-12-04 + +### Fixed + +- Check body size when getting the message summary + + +## [1.5.1] - 2018-12-04 + +### Fixed + +- Get the summary of a body only if it is readable + + +## [1.5.0] - 2018-12-03 + +### Added + +- Response first-line to response string exception (fixes #145) +- A test for #129 behavior +- `get_message_body_summary` function in order to get the message summary +- `3gp` and `mkv` mime types + +### Changed + +- Clarify exception message when stream is detached + +### Deprecated + +- Deprecated parsing folded header lines as per RFC 7230 + +### Fixed + +- Fix `AppendStream::detach` to not close streams +- `InflateStream` preserves `isSeekable` attribute of the underlying stream +- `ServerRequest::getUriFromGlobals` to support URLs in query parameters + + +Several other fixes and improvements. + + +## [1.4.2] - 2017-03-20 + +### Fixed + +- Reverted BC break to `Uri::resolve` and `Uri::removeDotSegments` by removing + calls to `trigger_error` when deprecated methods are invoked. + + +## [1.4.1] - 2017-02-27 + +### Added + +- Rriggering of silenced deprecation warnings. + +### Fixed + +- Reverted BC break by reintroducing behavior to automagically fix a URI with a + relative path and an authority by adding a leading slash to the path. It's only + deprecated now. + + +## [1.4.0] - 2017-02-21 + +### Added + +- Added common URI utility methods based on RFC 3986 (see documentation in the readme): + - `Uri::isDefaultPort` + - `Uri::isAbsolute` + - `Uri::isNetworkPathReference` + - `Uri::isAbsolutePathReference` + - `Uri::isRelativePathReference` + - `Uri::isSameDocumentReference` + - `Uri::composeComponents` + - `UriNormalizer::normalize` + - `UriNormalizer::isEquivalent` + - `UriResolver::relativize` + +### Changed + +- Ensure `ServerRequest::getUriFromGlobals` returns a URI in absolute form. +- Allow `parse_response` to parse a response without delimiting space and reason. +- Ensure each URI modification results in a valid URI according to PSR-7 discussions. + Invalid modifications will throw an exception instead of returning a wrong URI or + doing some magic. + - `(new Uri)->withPath('foo')->withHost('example.com')` will throw an exception + because the path of a URI with an authority must start with a slash "/" or be empty + - `(new Uri())->withScheme('http')` will return `'http://localhost'` + +### Deprecated + +- `Uri::resolve` in favor of `UriResolver::resolve` +- `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments` + +### Fixed + +- `Stream::read` when length parameter <= 0. +- `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory. +- `ServerRequest::getUriFromGlobals` when `Host` header contains port. +- Compatibility of URIs with `file` scheme and empty host. + + +## [1.3.1] - 2016-06-25 + +### Fixed + +- `Uri::__toString` for network path references, e.g. `//example.org`. +- Missing lowercase normalization for host. +- Handling of URI components in case they are `'0'` in a lot of places, + e.g. as a user info password. +- `Uri::withAddedHeader` to correctly merge headers with different case. +- Trimming of header values in `Uri::withAddedHeader`. Header values may + be surrounded by whitespace which should be ignored according to RFC 7230 + Section 3.2.4. This does not apply to header names. +- `Uri::withAddedHeader` with an array of header values. +- `Uri::resolve` when base path has no slash and handling of fragment. +- Handling of encoding in `Uri::with(out)QueryValue` so one can pass the + key/value both in encoded as well as decoded form to those methods. This is + consistent with withPath, withQuery etc. +- `ServerRequest::withoutAttribute` when attribute value is null. + + +## [1.3.0] - 2016-04-13 + +### Added + +- Remaining interfaces needed for full PSR7 compatibility + (ServerRequestInterface, UploadedFileInterface, etc.). +- Support for stream_for from scalars. + +### Changed + +- Can now extend Uri. + +### Fixed +- A bug in validating request methods by making it more permissive. + + +## [1.2.3] - 2016-02-18 + +### Fixed + +- Support in `GuzzleHttp\Psr7\CachingStream` for seeking forward on remote + streams, which can sometimes return fewer bytes than requested with `fread`. +- Handling of gzipped responses with FNAME headers. + + +## [1.2.2] - 2016-01-22 + +### Added + +- Support for URIs without any authority. +- Support for HTTP 451 'Unavailable For Legal Reasons.' +- Support for using '0' as a filename. +- Support for including non-standard ports in Host headers. + + +## [1.2.1] - 2015-11-02 + +### Changes + +- Now supporting negative offsets when seeking to SEEK_END. + + +## [1.2.0] - 2015-08-15 + +### Changed + +- Body as `"0"` is now properly added to a response. +- Now allowing forward seeking in CachingStream. +- Now properly parsing HTTP requests that contain proxy targets in + `parse_request`. +- functions.php is now conditionally required. +- user-info is no longer dropped when resolving URIs. + + +## [1.1.0] - 2015-06-24 + +### Changed + +- URIs can now be relative. +- `multipart/form-data` headers are now overridden case-insensitively. +- URI paths no longer encode the following characters because they are allowed + in URIs: "(", ")", "*", "!", "'" +- A port is no longer added to a URI when the scheme is missing and no port is + present. + + +## 1.0.0 - 2015-05-19 + +Initial release. + +Currently unsupported: + +- `Psr\Http\Message\ServerRequestInterface` +- `Psr\Http\Message\UploadedFileInterface` + + + +[1.6.0]: https://github.com/guzzle/psr7/compare/1.5.2...1.6.0 +[1.5.2]: https://github.com/guzzle/psr7/compare/1.5.1...1.5.2 +[1.5.1]: https://github.com/guzzle/psr7/compare/1.5.0...1.5.1 +[1.5.0]: https://github.com/guzzle/psr7/compare/1.4.2...1.5.0 +[1.4.2]: https://github.com/guzzle/psr7/compare/1.4.1...1.4.2 +[1.4.1]: https://github.com/guzzle/psr7/compare/1.4.0...1.4.1 +[1.4.0]: https://github.com/guzzle/psr7/compare/1.3.1...1.4.0 +[1.3.1]: https://github.com/guzzle/psr7/compare/1.3.0...1.3.1 +[1.3.0]: https://github.com/guzzle/psr7/compare/1.2.3...1.3.0 +[1.2.3]: https://github.com/guzzle/psr7/compare/1.2.2...1.2.3 +[1.2.2]: https://github.com/guzzle/psr7/compare/1.2.1...1.2.2 +[1.2.1]: https://github.com/guzzle/psr7/compare/1.2.0...1.2.1 +[1.2.0]: https://github.com/guzzle/psr7/compare/1.1.0...1.2.0 +[1.1.0]: https://github.com/guzzle/psr7/compare/1.0.0...1.1.0 diff --git a/vendor/guzzlehttp/psr7/LICENSE b/vendor/guzzlehttp/psr7/LICENSE new file mode 100644 index 0000000..51c7ec8 --- /dev/null +++ b/vendor/guzzlehttp/psr7/LICENSE @@ -0,0 +1,26 @@ +The MIT License (MIT) + +Copyright (c) 2015 Michael Dowling <mtdowling@gmail.com> +Copyright (c) 2015 Márk Sági-Kazár <mark.sagikazar@gmail.com> +Copyright (c) 2015 Graham Campbell <hello@gjcampbell.co.uk> +Copyright (c) 2016 Tobias Schultze <webmaster@tubo-world.de> +Copyright (c) 2016 George Mponos <gmponos@gmail.com> +Copyright (c) 2018 Tobias Nyholm <tobias.nyholm@gmail.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/guzzlehttp/psr7/README.md b/vendor/guzzlehttp/psr7/README.md new file mode 100644 index 0000000..8b9929a --- /dev/null +++ b/vendor/guzzlehttp/psr7/README.md @@ -0,0 +1,872 @@ +# PSR-7 Message Implementation + +This repository contains a full [PSR-7](https://www.php-fig.org/psr/psr-7/) +message implementation, several stream decorators, and some helpful +functionality like query string parsing. + +![CI](https://github.com/guzzle/psr7/workflows/CI/badge.svg) +![Static analysis](https://github.com/guzzle/psr7/workflows/Static%20analysis/badge.svg) + + +# Stream implementation + +This package comes with a number of stream implementations and stream +decorators. + + +## AppendStream + +`GuzzleHttp\Psr7\AppendStream` + +Reads from multiple streams, one after the other. + +```php +use GuzzleHttp\Psr7; + +$a = Psr7\Utils::streamFor('abc, '); +$b = Psr7\Utils::streamFor('123.'); +$composed = new Psr7\AppendStream([$a, $b]); + +$composed->addStream(Psr7\Utils::streamFor(' Above all listen to me')); + +echo $composed; // abc, 123. Above all listen to me. +``` + + +## BufferStream + +`GuzzleHttp\Psr7\BufferStream` + +Provides a buffer stream that can be written to fill a buffer, and read +from to remove bytes from the buffer. + +This stream returns a "hwm" metadata value that tells upstream consumers +what the configured high water mark of the stream is, or the maximum +preferred size of the buffer. + +```php +use GuzzleHttp\Psr7; + +// When more than 1024 bytes are in the buffer, it will begin returning +// false to writes. This is an indication that writers should slow down. +$buffer = new Psr7\BufferStream(1024); +``` + + +## CachingStream + +The CachingStream is used to allow seeking over previously read bytes on +non-seekable streams. This can be useful when transferring a non-seekable +entity body fails due to needing to rewind the stream (for example, resulting +from a redirect). Data that is read from the remote stream will be buffered in +a PHP temp stream so that previously read bytes are cached first in memory, +then on disk. + +```php +use GuzzleHttp\Psr7; + +$original = Psr7\Utils::streamFor(fopen('http://www.google.com', 'r')); +$stream = new Psr7\CachingStream($original); + +$stream->read(1024); +echo $stream->tell(); +// 1024 + +$stream->seek(0); +echo $stream->tell(); +// 0 +``` + + +## DroppingStream + +`GuzzleHttp\Psr7\DroppingStream` + +Stream decorator that begins dropping data once the size of the underlying +stream becomes too full. + +```php +use GuzzleHttp\Psr7; + +// Create an empty stream +$stream = Psr7\Utils::streamFor(); + +// Start dropping data when the stream has more than 10 bytes +$dropping = new Psr7\DroppingStream($stream, 10); + +$dropping->write('01234567890123456789'); +echo $stream; // 0123456789 +``` + + +## FnStream + +`GuzzleHttp\Psr7\FnStream` + +Compose stream implementations based on a hash of functions. + +Allows for easy testing and extension of a provided stream without needing +to create a concrete class for a simple extension point. + +```php + +use GuzzleHttp\Psr7; + +$stream = Psr7\Utils::streamFor('hi'); +$fnStream = Psr7\FnStream::decorate($stream, [ + 'rewind' => function () use ($stream) { + echo 'About to rewind - '; + $stream->rewind(); + echo 'rewound!'; + } +]); + +$fnStream->rewind(); +// Outputs: About to rewind - rewound! +``` + + +## InflateStream + +`GuzzleHttp\Psr7\InflateStream` + +Uses PHP's zlib.inflate filter to inflate zlib (HTTP deflate, RFC1950) or gzipped (RFC1952) content. + +This stream decorator converts the provided stream to a PHP stream resource, +then appends the zlib.inflate filter. The stream is then converted back +to a Guzzle stream resource to be used as a Guzzle stream. + + +## LazyOpenStream + +`GuzzleHttp\Psr7\LazyOpenStream` + +Lazily reads or writes to a file that is opened only after an IO operation +take place on the stream. + +```php +use GuzzleHttp\Psr7; + +$stream = new Psr7\LazyOpenStream('/path/to/file', 'r'); +// The file has not yet been opened... + +echo $stream->read(10); +// The file is opened and read from only when needed. +``` + + +## LimitStream + +`GuzzleHttp\Psr7\LimitStream` + +LimitStream can be used to read a subset or slice of an existing stream object. +This can be useful for breaking a large file into smaller pieces to be sent in +chunks (e.g. Amazon S3's multipart upload API). + +```php +use GuzzleHttp\Psr7; + +$original = Psr7\Utils::streamFor(fopen('/tmp/test.txt', 'r+')); +echo $original->getSize(); +// >>> 1048576 + +// Limit the size of the body to 1024 bytes and start reading from byte 2048 +$stream = new Psr7\LimitStream($original, 1024, 2048); +echo $stream->getSize(); +// >>> 1024 +echo $stream->tell(); +// >>> 0 +``` + + +## MultipartStream + +`GuzzleHttp\Psr7\MultipartStream` + +Stream that when read returns bytes for a streaming multipart or +multipart/form-data stream. + + +## NoSeekStream + +`GuzzleHttp\Psr7\NoSeekStream` + +NoSeekStream wraps a stream and does not allow seeking. + +```php +use GuzzleHttp\Psr7; + +$original = Psr7\Utils::streamFor('foo'); +$noSeek = new Psr7\NoSeekStream($original); + +echo $noSeek->read(3); +// foo +var_export($noSeek->isSeekable()); +// false +$noSeek->seek(0); +var_export($noSeek->read(3)); +// NULL +``` + + +## PumpStream + +`GuzzleHttp\Psr7\PumpStream` + +Provides a read only stream that pumps data from a PHP callable. + +When invoking the provided callable, the PumpStream will pass the amount of +data requested to read to the callable. The callable can choose to ignore +this value and return fewer or more bytes than requested. Any extra data +returned by the provided callable is buffered internally until drained using +the read() function of the PumpStream. The provided callable MUST return +false when there is no more data to read. + + +## Implementing stream decorators + +Creating a stream decorator is very easy thanks to the +`GuzzleHttp\Psr7\StreamDecoratorTrait`. This trait provides methods that +implement `Psr\Http\Message\StreamInterface` by proxying to an underlying +stream. Just `use` the `StreamDecoratorTrait` and implement your custom +methods. + +For example, let's say we wanted to call a specific function each time the last +byte is read from a stream. This could be implemented by overriding the +`read()` method. + +```php +use Psr\Http\Message\StreamInterface; +use GuzzleHttp\Psr7\StreamDecoratorTrait; + +class EofCallbackStream implements StreamInterface +{ + use StreamDecoratorTrait; + + private $callback; + + public function __construct(StreamInterface $stream, callable $cb) + { + $this->stream = $stream; + $this->callback = $cb; + } + + public function read($length) + { + $result = $this->stream->read($length); + + // Invoke the callback when EOF is hit. + if ($this->eof()) { + call_user_func($this->callback); + } + + return $result; + } +} +``` + +This decorator could be added to any existing stream and used like so: + +```php +use GuzzleHttp\Psr7; + +$original = Psr7\Utils::streamFor('foo'); + +$eofStream = new EofCallbackStream($original, function () { + echo 'EOF!'; +}); + +$eofStream->read(2); +$eofStream->read(1); +// echoes "EOF!" +$eofStream->seek(0); +$eofStream->read(3); +// echoes "EOF!" +``` + + +## PHP StreamWrapper + +You can use the `GuzzleHttp\Psr7\StreamWrapper` class if you need to use a +PSR-7 stream as a PHP stream resource. + +Use the `GuzzleHttp\Psr7\StreamWrapper::getResource()` method to create a PHP +stream from a PSR-7 stream. + +```php +use GuzzleHttp\Psr7\StreamWrapper; + +$stream = GuzzleHttp\Psr7\Utils::streamFor('hello!'); +$resource = StreamWrapper::getResource($stream); +echo fread($resource, 6); // outputs hello! +``` + + +# Static API + +There are various static methods available under the `GuzzleHttp\Psr7` namespace. + + +## `GuzzleHttp\Psr7\Message::toString` + +`public static function toString(MessageInterface $message): string` + +Returns the string representation of an HTTP message. + +```php +$request = new GuzzleHttp\Psr7\Request('GET', 'http://example.com'); +echo GuzzleHttp\Psr7\Message::toString($request); +``` + + +## `GuzzleHttp\Psr7\Message::bodySummary` + +`public static function bodySummary(MessageInterface $message, int $truncateAt = 120): string|null` + +Get a short summary of the message body. + +Will return `null` if the response is not printable. + + +## `GuzzleHttp\Psr7\Message::rewindBody` + +`public static function rewindBody(MessageInterface $message): void` + +Attempts to rewind a message body and throws an exception on failure. + +The body of the message will only be rewound if a call to `tell()` +returns a value other than `0`. + + +## `GuzzleHttp\Psr7\Message::parseMessage` + +`public static function parseMessage(string $message): array` + +Parses an HTTP message into an associative array. + +The array contains the "start-line" key containing the start line of +the message, "headers" key containing an associative array of header +array values, and a "body" key containing the body of the message. + + +## `GuzzleHttp\Psr7\Message::parseRequestUri` + +`public static function parseRequestUri(string $path, array $headers): string` + +Constructs a URI for an HTTP request message. + + +## `GuzzleHttp\Psr7\Message::parseRequest` + +`public static function parseRequest(string $message): Request` + +Parses a request message string into a request object. + + +## `GuzzleHttp\Psr7\Message::parseResponse` + +`public static function parseResponse(string $message): Response` + +Parses a response message string into a response object. + + +## `GuzzleHttp\Psr7\Header::parse` + +`public static function parse(string|array $header): array` + +Parse an array of header values containing ";" separated data into an +array of associative arrays representing the header key value pair data +of the header. When a parameter does not contain a value, but just +contains a key, this function will inject a key with a '' string value. + + +## `GuzzleHttp\Psr7\Header::splitList` + +`public static function splitList(string|string[] $header): string[]` + +Splits a HTTP header defined to contain a comma-separated list into +each individual value: + +``` +$knownEtags = Header::splitList($request->getHeader('if-none-match')); +``` + +Example headers include `accept`, `cache-control` and `if-none-match`. + + +## `GuzzleHttp\Psr7\Header::normalize` (deprecated) + +`public static function normalize(string|array $header): array` + +`Header::normalize()` is deprecated in favor of [`Header::splitList()`](README.md#guzzlehttppsr7headersplitlist) +which performs the same operation with a cleaned up API and improved +documentation. + +Converts an array of header values that may contain comma separated +headers into an array of headers with no comma separated values. + + +## `GuzzleHttp\Psr7\Query::parse` + +`public static function parse(string $str, int|bool $urlEncoding = true): array` + +Parse a query string into an associative array. + +If multiple values are found for the same key, the value of that key +value pair will become an array. This function does not parse nested +PHP style arrays into an associative array (e.g., `foo[a]=1&foo[b]=2` +will be parsed into `['foo[a]' => '1', 'foo[b]' => '2'])`. + + +## `GuzzleHttp\Psr7\Query::build` + +`public static function build(array $params, int|false $encoding = PHP_QUERY_RFC3986): string` + +Build a query string from an array of key value pairs. + +This function can use the return value of `parse()` to build a query +string. This function does not modify the provided keys when an array is +encountered (like `http_build_query()` would). + + +## `GuzzleHttp\Psr7\Utils::caselessRemove` + +`public static function caselessRemove(iterable<string> $keys, $keys, array $data): array` + +Remove the items given by the keys, case insensitively from the data. + + +## `GuzzleHttp\Psr7\Utils::copyToStream` + +`public static function copyToStream(StreamInterface $source, StreamInterface $dest, int $maxLen = -1): void` + +Copy the contents of a stream into another stream until the given number +of bytes have been read. + + +## `GuzzleHttp\Psr7\Utils::copyToString` + +`public static function copyToString(StreamInterface $stream, int $maxLen = -1): string` + +Copy the contents of a stream into a string until the given number of +bytes have been read. + + +## `GuzzleHttp\Psr7\Utils::hash` + +`public static function hash(StreamInterface $stream, string $algo, bool $rawOutput = false): string` + +Calculate a hash of a stream. + +This method reads the entire stream to calculate a rolling hash, based on +PHP's `hash_init` functions. + + +## `GuzzleHttp\Psr7\Utils::modifyRequest` + +`public static function modifyRequest(RequestInterface $request, array $changes): RequestInterface` + +Clone and modify a request with the given changes. + +This method is useful for reducing the number of clones needed to mutate +a message. + +- method: (string) Changes the HTTP method. +- set_headers: (array) Sets the given headers. +- remove_headers: (array) Remove the given headers. +- body: (mixed) Sets the given body. +- uri: (UriInterface) Set the URI. +- query: (string) Set the query string value of the URI. +- version: (string) Set the protocol version. + + +## `GuzzleHttp\Psr7\Utils::readLine` + +`public static function readLine(StreamInterface $stream, int $maxLength = null): string` + +Read a line from the stream up to the maximum allowed buffer length. + + +## `GuzzleHttp\Psr7\Utils::streamFor` + +`public static function streamFor(resource|string|null|int|float|bool|StreamInterface|callable|\Iterator $resource = '', array $options = []): StreamInterface` + +Create a new stream based on the input type. + +Options is an associative array that can contain the following keys: + +- metadata: Array of custom metadata. +- size: Size of the stream. + +This method accepts the following `$resource` types: + +- `Psr\Http\Message\StreamInterface`: Returns the value as-is. +- `string`: Creates a stream object that uses the given string as the contents. +- `resource`: Creates a stream object that wraps the given PHP stream resource. +- `Iterator`: If the provided value implements `Iterator`, then a read-only + stream object will be created that wraps the given iterable. Each time the + stream is read from, data from the iterator will fill a buffer and will be + continuously called until the buffer is equal to the requested read size. + Subsequent read calls will first read from the buffer and then call `next` + on the underlying iterator until it is exhausted. +- `object` with `__toString()`: If the object has the `__toString()` method, + the object will be cast to a string and then a stream will be returned that + uses the string value. +- `NULL`: When `null` is passed, an empty stream object is returned. +- `callable` When a callable is passed, a read-only stream object will be + created that invokes the given callable. The callable is invoked with the + number of suggested bytes to read. The callable can return any number of + bytes, but MUST return `false` when there is no more data to return. The + stream object that wraps the callable will invoke the callable until the + number of requested bytes are available. Any additional bytes will be + buffered and used in subsequent reads. + +```php +$stream = GuzzleHttp\Psr7\Utils::streamFor('foo'); +$stream = GuzzleHttp\Psr7\Utils::streamFor(fopen('/path/to/file', 'r')); + +$generator = function ($bytes) { + for ($i = 0; $i < $bytes; $i++) { + yield ' '; + } +} + +$stream = GuzzleHttp\Psr7\Utils::streamFor($generator(100)); +``` + + +## `GuzzleHttp\Psr7\Utils::tryFopen` + +`public static function tryFopen(string $filename, string $mode): resource` + +Safely opens a PHP stream resource using a filename. + +When fopen fails, PHP normally raises a warning. This function adds an +error handler that checks for errors and throws an exception instead. + + +## `GuzzleHttp\Psr7\Utils::tryGetContents` + +`public static function tryGetContents(resource $stream): string` + +Safely gets the contents of a given stream. + +When stream_get_contents fails, PHP normally raises a warning. This +function adds an error handler that checks for errors and throws an +exception instead. + + +## `GuzzleHttp\Psr7\Utils::uriFor` + +`public static function uriFor(string|UriInterface $uri): UriInterface` + +Returns a UriInterface for the given value. + +This function accepts a string or UriInterface and returns a +UriInterface for the given value. If the value is already a +UriInterface, it is returned as-is. + + +## `GuzzleHttp\Psr7\MimeType::fromFilename` + +`public static function fromFilename(string $filename): string|null` + +Determines the mimetype of a file by looking at its extension. + + +## `GuzzleHttp\Psr7\MimeType::fromExtension` + +`public static function fromExtension(string $extension): string|null` + +Maps a file extensions to a mimetype. + + +## Upgrading from Function API + +The static API was first introduced in 1.7.0, in order to mitigate problems with functions conflicting between global and local copies of the package. The function API was removed in 2.0.0. A migration table has been provided here for your convenience: + +| Original Function | Replacement Method | +|----------------|----------------| +| `str` | `Message::toString` | +| `uri_for` | `Utils::uriFor` | +| `stream_for` | `Utils::streamFor` | +| `parse_header` | `Header::parse` | +| `normalize_header` | `Header::normalize` | +| `modify_request` | `Utils::modifyRequest` | +| `rewind_body` | `Message::rewindBody` | +| `try_fopen` | `Utils::tryFopen` | +| `copy_to_string` | `Utils::copyToString` | +| `copy_to_stream` | `Utils::copyToStream` | +| `hash` | `Utils::hash` | +| `readline` | `Utils::readLine` | +| `parse_request` | `Message::parseRequest` | +| `parse_response` | `Message::parseResponse` | +| `parse_query` | `Query::parse` | +| `build_query` | `Query::build` | +| `mimetype_from_filename` | `MimeType::fromFilename` | +| `mimetype_from_extension` | `MimeType::fromExtension` | +| `_parse_message` | `Message::parseMessage` | +| `_parse_request_uri` | `Message::parseRequestUri` | +| `get_message_body_summary` | `Message::bodySummary` | +| `_caseless_remove` | `Utils::caselessRemove` | + + +# Additional URI Methods + +Aside from the standard `Psr\Http\Message\UriInterface` implementation in form of the `GuzzleHttp\Psr7\Uri` class, +this library also provides additional functionality when working with URIs as static methods. + +## URI Types + +An instance of `Psr\Http\Message\UriInterface` can either be an absolute URI or a relative reference. +An absolute URI has a scheme. A relative reference is used to express a URI relative to another URI, +the base URI. Relative references can be divided into several forms according to +[RFC 3986 Section 4.2](https://tools.ietf.org/html/rfc3986#section-4.2): + +- network-path references, e.g. `//example.com/path` +- absolute-path references, e.g. `/path` +- relative-path references, e.g. `subpath` + +The following methods can be used to identify the type of the URI. + +### `GuzzleHttp\Psr7\Uri::isAbsolute` + +`public static function isAbsolute(UriInterface $uri): bool` + +Whether the URI is absolute, i.e. it has a scheme. + +### `GuzzleHttp\Psr7\Uri::isNetworkPathReference` + +`public static function isNetworkPathReference(UriInterface $uri): bool` + +Whether the URI is a network-path reference. A relative reference that begins with two slash characters is +termed an network-path reference. + +### `GuzzleHttp\Psr7\Uri::isAbsolutePathReference` + +`public static function isAbsolutePathReference(UriInterface $uri): bool` + +Whether the URI is a absolute-path reference. A relative reference that begins with a single slash character is +termed an absolute-path reference. + +### `GuzzleHttp\Psr7\Uri::isRelativePathReference` + +`public static function isRelativePathReference(UriInterface $uri): bool` + +Whether the URI is a relative-path reference. A relative reference that does not begin with a slash character is +termed a relative-path reference. + +### `GuzzleHttp\Psr7\Uri::isSameDocumentReference` + +`public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool` + +Whether the URI is a same-document reference. A same-document reference refers to a URI that is, aside from its +fragment component, identical to the base URI. When no base URI is given, only an empty URI reference +(apart from its fragment) is considered a same-document reference. + +## URI Components + +Additional methods to work with URI components. + +### `GuzzleHttp\Psr7\Uri::isDefaultPort` + +`public static function isDefaultPort(UriInterface $uri): bool` + +Whether the URI has the default port of the current scheme. `Psr\Http\Message\UriInterface::getPort` may return null +or the standard port. This method can be used independently of the implementation. + +### `GuzzleHttp\Psr7\Uri::composeComponents` + +`public static function composeComponents($scheme, $authority, $path, $query, $fragment): string` + +Composes a URI reference string from its various components according to +[RFC 3986 Section 5.3](https://tools.ietf.org/html/rfc3986#section-5.3). Usually this method does not need to be called +manually but instead is used indirectly via `Psr\Http\Message\UriInterface::__toString`. + +### `GuzzleHttp\Psr7\Uri::fromParts` + +`public static function fromParts(array $parts): UriInterface` + +Creates a URI from a hash of [`parse_url`](https://www.php.net/manual/en/function.parse-url.php) components. + + +### `GuzzleHttp\Psr7\Uri::withQueryValue` + +`public static function withQueryValue(UriInterface $uri, $key, $value): UriInterface` + +Creates a new URI with a specific query string value. Any existing query string values that exactly match the +provided key are removed and replaced with the given key value pair. A value of null will set the query string +key without a value, e.g. "key" instead of "key=value". + +### `GuzzleHttp\Psr7\Uri::withQueryValues` + +`public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface` + +Creates a new URI with multiple query string values. It has the same behavior as `withQueryValue()` but for an +associative array of key => value. + +### `GuzzleHttp\Psr7\Uri::withoutQueryValue` + +`public static function withoutQueryValue(UriInterface $uri, $key): UriInterface` + +Creates a new URI with a specific query string value removed. Any existing query string values that exactly match the +provided key are removed. + +## Cross-Origin Detection + +`GuzzleHttp\Psr7\UriComparator` provides methods to determine if a modified URL should be considered cross-origin. + +### `GuzzleHttp\Psr7\UriComparator::isCrossOrigin` + +`public static function isCrossOrigin(UriInterface $original, UriInterface $modified): bool` + +Determines if a modified URL should be considered cross-origin with respect to an original URL. + +## Reference Resolution + +`GuzzleHttp\Psr7\UriResolver` provides methods to resolve a URI reference in the context of a base URI according +to [RFC 3986 Section 5](https://tools.ietf.org/html/rfc3986#section-5). This is for example also what web browsers +do when resolving a link in a website based on the current request URI. + +### `GuzzleHttp\Psr7\UriResolver::resolve` + +`public static function resolve(UriInterface $base, UriInterface $rel): UriInterface` + +Converts the relative URI into a new URI that is resolved against the base URI. + +### `GuzzleHttp\Psr7\UriResolver::removeDotSegments` + +`public static function removeDotSegments(string $path): string` + +Removes dot segments from a path and returns the new path according to +[RFC 3986 Section 5.2.4](https://tools.ietf.org/html/rfc3986#section-5.2.4). + +### `GuzzleHttp\Psr7\UriResolver::relativize` + +`public static function relativize(UriInterface $base, UriInterface $target): UriInterface` + +Returns the target URI as a relative reference from the base URI. This method is the counterpart to resolve(): + +```php +(string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target)) +``` + +One use-case is to use the current request URI as base URI and then generate relative links in your documents +to reduce the document size or offer self-contained downloadable document archives. + +```php +$base = new Uri('http://example.com/a/b/'); +echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'. +echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'. +echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'. +echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'. +``` + +## Normalization and Comparison + +`GuzzleHttp\Psr7\UriNormalizer` provides methods to normalize and compare URIs according to +[RFC 3986 Section 6](https://tools.ietf.org/html/rfc3986#section-6). + +### `GuzzleHttp\Psr7\UriNormalizer::normalize` + +`public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS): UriInterface` + +Returns a normalized URI. The scheme and host component are already normalized to lowercase per PSR-7 UriInterface. +This methods adds additional normalizations that can be configured with the `$flags` parameter which is a bitmask +of normalizations to apply. The following normalizations are available: + +- `UriNormalizer::PRESERVING_NORMALIZATIONS` + + Default normalizations which only include the ones that preserve semantics. + +- `UriNormalizer::CAPITALIZE_PERCENT_ENCODING` + + All letters within a percent-encoding triplet (e.g., "%3A") are case-insensitive, and should be capitalized. + + Example: `http://example.org/a%c2%b1b` → `http://example.org/a%C2%B1b` + +- `UriNormalizer::DECODE_UNRESERVED_CHARACTERS` + + Decodes percent-encoded octets of unreserved characters. For consistency, percent-encoded octets in the ranges of + ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39), hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should + not be created by URI producers and, when found in a URI, should be decoded to their corresponding unreserved + characters by URI normalizers. + + Example: `http://example.org/%7Eusern%61me/` → `http://example.org/~username/` + +- `UriNormalizer::CONVERT_EMPTY_PATH` + + Converts the empty path to "/" for http and https URIs. + + Example: `http://example.org` → `http://example.org/` + +- `UriNormalizer::REMOVE_DEFAULT_HOST` + + Removes the default host of the given URI scheme from the URI. Only the "file" scheme defines the default host + "localhost". All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile` are equivalent according to + RFC 3986. + + Example: `file://localhost/myfile` → `file:///myfile` + +- `UriNormalizer::REMOVE_DEFAULT_PORT` + + Removes the default port of the given URI scheme from the URI. + + Example: `http://example.org:80/` → `http://example.org/` + +- `UriNormalizer::REMOVE_DOT_SEGMENTS` + + Removes unnecessary dot-segments. Dot-segments in relative-path references are not removed as it would + change the semantics of the URI reference. + + Example: `http://example.org/../a/b/../c/./d.html` → `http://example.org/a/c/d.html` + +- `UriNormalizer::REMOVE_DUPLICATE_SLASHES` + + Paths which include two or more adjacent slashes are converted to one. Webservers usually ignore duplicate slashes + and treat those URIs equivalent. But in theory those URIs do not need to be equivalent. So this normalization + may change the semantics. Encoded slashes (%2F) are not removed. + + Example: `http://example.org//foo///bar.html` → `http://example.org/foo/bar.html` + +- `UriNormalizer::SORT_QUERY_PARAMETERS` + + Sort query parameters with their values in alphabetical order. However, the order of parameters in a URI may be + significant (this is not defined by the standard). So this normalization is not safe and may change the semantics + of the URI. + + Example: `?lang=en&article=fred` → `?article=fred&lang=en` + +### `GuzzleHttp\Psr7\UriNormalizer::isEquivalent` + +`public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS): bool` + +Whether two URIs can be considered equivalent. Both URIs are normalized automatically before comparison with the given +`$normalizations` bitmask. The method also accepts relative URI references and returns true when they are equivalent. +This of course assumes they will be resolved against the same base URI. If this is not the case, determination of +equivalence or difference of relative references does not mean anything. + + +## Version Guidance + +| Version | Status | PHP Version | +|---------|----------------|------------------| +| 1.x | Security fixes | >=5.4,<8.1 | +| 2.x | Latest | ^7.2.5 \|\| ^8.0 | + + +## Security + +If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/psr7/security/policy) for more information. + + +## License + +Guzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information. + + +## For Enterprise + +Available as part of the Tidelift Subscription + +The maintainers of Guzzle and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-guzzlehttp-psr7?utm_source=packagist-guzzlehttp-psr7&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/vendor/guzzlehttp/psr7/composer.json b/vendor/guzzlehttp/psr7/composer.json new file mode 100644 index 0000000..cd91040 --- /dev/null +++ b/vendor/guzzlehttp/psr7/composer.json @@ -0,0 +1,96 @@ +{ + "name": "guzzlehttp/psr7", + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "request", + "response", + "message", + "stream", + "http", + "uri", + "url", + "psr-7" + ], + "license": "MIT", + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "GuzzleHttp\\Tests\\Psr7\\": "tests/" + } + }, + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "config": { + "allow-plugins": { + "bamarni/composer-bin-plugin": true + }, + "preferred-install": "dist", + "sort-packages": true + } +} diff --git a/vendor/guzzlehttp/psr7/src/AppendStream.php b/vendor/guzzlehttp/psr7/src/AppendStream.php new file mode 100644 index 0000000..cbcfaee --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/AppendStream.php @@ -0,0 +1,248 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\StreamInterface; + +/** + * Reads from multiple streams, one after the other. + * + * This is a read-only stream decorator. + */ +final class AppendStream implements StreamInterface +{ + /** @var StreamInterface[] Streams being decorated */ + private $streams = []; + + /** @var bool */ + private $seekable = true; + + /** @var int */ + private $current = 0; + + /** @var int */ + private $pos = 0; + + /** + * @param StreamInterface[] $streams Streams to decorate. Each stream must + * be readable. + */ + public function __construct(array $streams = []) + { + foreach ($streams as $stream) { + $this->addStream($stream); + } + } + + public function __toString(): string + { + try { + $this->rewind(); + return $this->getContents(); + } catch (\Throwable $e) { + if (\PHP_VERSION_ID >= 70400) { + throw $e; + } + trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR); + return ''; + } + } + + /** + * Add a stream to the AppendStream + * + * @param StreamInterface $stream Stream to append. Must be readable. + * + * @throws \InvalidArgumentException if the stream is not readable + */ + public function addStream(StreamInterface $stream): void + { + if (!$stream->isReadable()) { + throw new \InvalidArgumentException('Each stream must be readable'); + } + + // The stream is only seekable if all streams are seekable + if (!$stream->isSeekable()) { + $this->seekable = false; + } + + $this->streams[] = $stream; + } + + public function getContents(): string + { + return Utils::copyToString($this); + } + + /** + * Closes each attached stream. + */ + public function close(): void + { + $this->pos = $this->current = 0; + $this->seekable = true; + + foreach ($this->streams as $stream) { + $stream->close(); + } + + $this->streams = []; + } + + /** + * Detaches each attached stream. + * + * Returns null as it's not clear which underlying stream resource to return. + */ + public function detach() + { + $this->pos = $this->current = 0; + $this->seekable = true; + + foreach ($this->streams as $stream) { + $stream->detach(); + } + + $this->streams = []; + + return null; + } + + public function tell(): int + { + return $this->pos; + } + + /** + * Tries to calculate the size by adding the size of each stream. + * + * If any of the streams do not return a valid number, then the size of the + * append stream cannot be determined and null is returned. + */ + public function getSize(): ?int + { + $size = 0; + + foreach ($this->streams as $stream) { + $s = $stream->getSize(); + if ($s === null) { + return null; + } + $size += $s; + } + + return $size; + } + + public function eof(): bool + { + return !$this->streams || + ($this->current >= count($this->streams) - 1 && + $this->streams[$this->current]->eof()); + } + + public function rewind(): void + { + $this->seek(0); + } + + /** + * Attempts to seek to the given position. Only supports SEEK_SET. + */ + public function seek($offset, $whence = SEEK_SET): void + { + if (!$this->seekable) { + throw new \RuntimeException('This AppendStream is not seekable'); + } elseif ($whence !== SEEK_SET) { + throw new \RuntimeException('The AppendStream can only seek with SEEK_SET'); + } + + $this->pos = $this->current = 0; + + // Rewind each stream + foreach ($this->streams as $i => $stream) { + try { + $stream->rewind(); + } catch (\Exception $e) { + throw new \RuntimeException('Unable to seek stream ' + . $i . ' of the AppendStream', 0, $e); + } + } + + // Seek to the actual position by reading from each stream + while ($this->pos < $offset && !$this->eof()) { + $result = $this->read(min(8096, $offset - $this->pos)); + if ($result === '') { + break; + } + } + } + + /** + * Reads from all of the appended streams until the length is met or EOF. + */ + public function read($length): string + { + $buffer = ''; + $total = count($this->streams) - 1; + $remaining = $length; + $progressToNext = false; + + while ($remaining > 0) { + // Progress to the next stream if needed. + if ($progressToNext || $this->streams[$this->current]->eof()) { + $progressToNext = false; + if ($this->current === $total) { + break; + } + $this->current++; + } + + $result = $this->streams[$this->current]->read($remaining); + + if ($result === '') { + $progressToNext = true; + continue; + } + + $buffer .= $result; + $remaining = $length - strlen($buffer); + } + + $this->pos += strlen($buffer); + + return $buffer; + } + + public function isReadable(): bool + { + return true; + } + + public function isWritable(): bool + { + return false; + } + + public function isSeekable(): bool + { + return $this->seekable; + } + + public function write($string): int + { + throw new \RuntimeException('Cannot write to an AppendStream'); + } + + /** + * {@inheritdoc} + * + * @return mixed + */ + public function getMetadata($key = null) + { + return $key ? null : []; + } +} diff --git a/vendor/guzzlehttp/psr7/src/BufferStream.php b/vendor/guzzlehttp/psr7/src/BufferStream.php new file mode 100644 index 0000000..21be8c0 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/BufferStream.php @@ -0,0 +1,149 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\StreamInterface; + +/** + * Provides a buffer stream that can be written to to fill a buffer, and read + * from to remove bytes from the buffer. + * + * This stream returns a "hwm" metadata value that tells upstream consumers + * what the configured high water mark of the stream is, or the maximum + * preferred size of the buffer. + */ +final class BufferStream implements StreamInterface +{ + /** @var int */ + private $hwm; + + /** @var string */ + private $buffer = ''; + + /** + * @param int $hwm High water mark, representing the preferred maximum + * buffer size. If the size of the buffer exceeds the high + * water mark, then calls to write will continue to succeed + * but will return 0 to inform writers to slow down + * until the buffer has been drained by reading from it. + */ + public function __construct(int $hwm = 16384) + { + $this->hwm = $hwm; + } + + public function __toString(): string + { + return $this->getContents(); + } + + public function getContents(): string + { + $buffer = $this->buffer; + $this->buffer = ''; + + return $buffer; + } + + public function close(): void + { + $this->buffer = ''; + } + + public function detach() + { + $this->close(); + + return null; + } + + public function getSize(): ?int + { + return strlen($this->buffer); + } + + public function isReadable(): bool + { + return true; + } + + public function isWritable(): bool + { + return true; + } + + public function isSeekable(): bool + { + return false; + } + + public function rewind(): void + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET): void + { + throw new \RuntimeException('Cannot seek a BufferStream'); + } + + public function eof(): bool + { + return strlen($this->buffer) === 0; + } + + public function tell(): int + { + throw new \RuntimeException('Cannot determine the position of a BufferStream'); + } + + /** + * Reads data from the buffer. + */ + public function read($length): string + { + $currentLength = strlen($this->buffer); + + if ($length >= $currentLength) { + // No need to slice the buffer because we don't have enough data. + $result = $this->buffer; + $this->buffer = ''; + } else { + // Slice up the result to provide a subset of the buffer. + $result = substr($this->buffer, 0, $length); + $this->buffer = substr($this->buffer, $length); + } + + return $result; + } + + /** + * Writes data to the buffer. + */ + public function write($string): int + { + $this->buffer .= $string; + + if (strlen($this->buffer) >= $this->hwm) { + return 0; + } + + return strlen($string); + } + + /** + * {@inheritdoc} + * + * @return mixed + */ + public function getMetadata($key = null) + { + if ($key === 'hwm') { + return $this->hwm; + } + + return $key ? null : []; + } +} diff --git a/vendor/guzzlehttp/psr7/src/CachingStream.php b/vendor/guzzlehttp/psr7/src/CachingStream.php new file mode 100644 index 0000000..f34722c --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/CachingStream.php @@ -0,0 +1,153 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\StreamInterface; + +/** + * Stream decorator that can cache previously read bytes from a sequentially + * read stream. + */ +final class CachingStream implements StreamInterface +{ + use StreamDecoratorTrait; + + /** @var StreamInterface Stream being wrapped */ + private $remoteStream; + + /** @var int Number of bytes to skip reading due to a write on the buffer */ + private $skipReadBytes = 0; + + /** + * @var StreamInterface + */ + private $stream; + + /** + * We will treat the buffer object as the body of the stream + * + * @param StreamInterface $stream Stream to cache. The cursor is assumed to be at the beginning of the stream. + * @param StreamInterface $target Optionally specify where data is cached + */ + public function __construct( + StreamInterface $stream, + StreamInterface $target = null + ) { + $this->remoteStream = $stream; + $this->stream = $target ?: new Stream(Utils::tryFopen('php://temp', 'r+')); + } + + public function getSize(): ?int + { + $remoteSize = $this->remoteStream->getSize(); + + if (null === $remoteSize) { + return null; + } + + return max($this->stream->getSize(), $remoteSize); + } + + public function rewind(): void + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET): void + { + if ($whence === SEEK_SET) { + $byte = $offset; + } elseif ($whence === SEEK_CUR) { + $byte = $offset + $this->tell(); + } elseif ($whence === SEEK_END) { + $size = $this->remoteStream->getSize(); + if ($size === null) { + $size = $this->cacheEntireStream(); + } + $byte = $size + $offset; + } else { + throw new \InvalidArgumentException('Invalid whence'); + } + + $diff = $byte - $this->stream->getSize(); + + if ($diff > 0) { + // Read the remoteStream until we have read in at least the amount + // of bytes requested, or we reach the end of the file. + while ($diff > 0 && !$this->remoteStream->eof()) { + $this->read($diff); + $diff = $byte - $this->stream->getSize(); + } + } else { + // We can just do a normal seek since we've already seen this byte. + $this->stream->seek($byte); + } + } + + public function read($length): string + { + // Perform a regular read on any previously read data from the buffer + $data = $this->stream->read($length); + $remaining = $length - strlen($data); + + // More data was requested so read from the remote stream + if ($remaining) { + // If data was written to the buffer in a position that would have + // been filled from the remote stream, then we must skip bytes on + // the remote stream to emulate overwriting bytes from that + // position. This mimics the behavior of other PHP stream wrappers. + $remoteData = $this->remoteStream->read( + $remaining + $this->skipReadBytes + ); + + if ($this->skipReadBytes) { + $len = strlen($remoteData); + $remoteData = substr($remoteData, $this->skipReadBytes); + $this->skipReadBytes = max(0, $this->skipReadBytes - $len); + } + + $data .= $remoteData; + $this->stream->write($remoteData); + } + + return $data; + } + + public function write($string): int + { + // When appending to the end of the currently read stream, you'll want + // to skip bytes from being read from the remote stream to emulate + // other stream wrappers. Basically replacing bytes of data of a fixed + // length. + $overflow = (strlen($string) + $this->tell()) - $this->remoteStream->tell(); + if ($overflow > 0) { + $this->skipReadBytes += $overflow; + } + + return $this->stream->write($string); + } + + public function eof(): bool + { + return $this->stream->eof() && $this->remoteStream->eof(); + } + + /** + * Close both the remote stream and buffer stream + */ + public function close(): void + { + $this->remoteStream->close(); + $this->stream->close(); + } + + private function cacheEntireStream(): int + { + $target = new FnStream(['write' => 'strlen']); + Utils::copyToStream($this, $target); + + return $this->tell(); + } +} diff --git a/vendor/guzzlehttp/psr7/src/DroppingStream.php b/vendor/guzzlehttp/psr7/src/DroppingStream.php new file mode 100644 index 0000000..6e3d209 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/DroppingStream.php @@ -0,0 +1,49 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\StreamInterface; + +/** + * Stream decorator that begins dropping data once the size of the underlying + * stream becomes too full. + */ +final class DroppingStream implements StreamInterface +{ + use StreamDecoratorTrait; + + /** @var int */ + private $maxLength; + + /** @var StreamInterface */ + private $stream; + + /** + * @param StreamInterface $stream Underlying stream to decorate. + * @param int $maxLength Maximum size before dropping data. + */ + public function __construct(StreamInterface $stream, int $maxLength) + { + $this->stream = $stream; + $this->maxLength = $maxLength; + } + + public function write($string): int + { + $diff = $this->maxLength - $this->stream->getSize(); + + // Begin returning 0 when the underlying stream is too large. + if ($diff <= 0) { + return 0; + } + + // Write the stream or a subset of the stream if needed. + if (strlen($string) < $diff) { + return $this->stream->write($string); + } + + return $this->stream->write(substr($string, 0, $diff)); + } +} diff --git a/vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.php b/vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.php new file mode 100644 index 0000000..3a08477 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.php @@ -0,0 +1,14 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7\Exception; + +use InvalidArgumentException; + +/** + * Exception thrown if a URI cannot be parsed because it's malformed. + */ +class MalformedUriException extends InvalidArgumentException +{ +} diff --git a/vendor/guzzlehttp/psr7/src/FnStream.php b/vendor/guzzlehttp/psr7/src/FnStream.php new file mode 100644 index 0000000..3a1a951 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/FnStream.php @@ -0,0 +1,180 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\StreamInterface; + +/** + * Compose stream implementations based on a hash of functions. + * + * Allows for easy testing and extension of a provided stream without needing + * to create a concrete class for a simple extension point. + */ +#[\AllowDynamicProperties] +final class FnStream implements StreamInterface +{ + private const SLOTS = [ + '__toString', 'close', 'detach', 'rewind', + 'getSize', 'tell', 'eof', 'isSeekable', 'seek', 'isWritable', 'write', + 'isReadable', 'read', 'getContents', 'getMetadata' + ]; + + /** @var array<string, callable> */ + private $methods; + + /** + * @param array<string, callable> $methods Hash of method name to a callable. + */ + public function __construct(array $methods) + { + $this->methods = $methods; + + // Create the functions on the class + foreach ($methods as $name => $fn) { + $this->{'_fn_' . $name} = $fn; + } + } + + /** + * Lazily determine which methods are not implemented. + * + * @throws \BadMethodCallException + */ + public function __get(string $name): void + { + throw new \BadMethodCallException(str_replace('_fn_', '', $name) + . '() is not implemented in the FnStream'); + } + + /** + * The close method is called on the underlying stream only if possible. + */ + public function __destruct() + { + if (isset($this->_fn_close)) { + call_user_func($this->_fn_close); + } + } + + /** + * An unserialize would allow the __destruct to run when the unserialized value goes out of scope. + * + * @throws \LogicException + */ + public function __wakeup(): void + { + throw new \LogicException('FnStream should never be unserialized'); + } + + /** + * Adds custom functionality to an underlying stream by intercepting + * specific method calls. + * + * @param StreamInterface $stream Stream to decorate + * @param array<string, callable> $methods Hash of method name to a closure + * + * @return FnStream + */ + public static function decorate(StreamInterface $stream, array $methods) + { + // If any of the required methods were not provided, then simply + // proxy to the decorated stream. + foreach (array_diff(self::SLOTS, array_keys($methods)) as $diff) { + /** @var callable $callable */ + $callable = [$stream, $diff]; + $methods[$diff] = $callable; + } + + return new self($methods); + } + + public function __toString(): string + { + try { + return call_user_func($this->_fn___toString); + } catch (\Throwable $e) { + if (\PHP_VERSION_ID >= 70400) { + throw $e; + } + trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR); + return ''; + } + } + + public function close(): void + { + call_user_func($this->_fn_close); + } + + public function detach() + { + return call_user_func($this->_fn_detach); + } + + public function getSize(): ?int + { + return call_user_func($this->_fn_getSize); + } + + public function tell(): int + { + return call_user_func($this->_fn_tell); + } + + public function eof(): bool + { + return call_user_func($this->_fn_eof); + } + + public function isSeekable(): bool + { + return call_user_func($this->_fn_isSeekable); + } + + public function rewind(): void + { + call_user_func($this->_fn_rewind); + } + + public function seek($offset, $whence = SEEK_SET): void + { + call_user_func($this->_fn_seek, $offset, $whence); + } + + public function isWritable(): bool + { + return call_user_func($this->_fn_isWritable); + } + + public function write($string): int + { + return call_user_func($this->_fn_write, $string); + } + + public function isReadable(): bool + { + return call_user_func($this->_fn_isReadable); + } + + public function read($length): string + { + return call_user_func($this->_fn_read, $length); + } + + public function getContents(): string + { + return call_user_func($this->_fn_getContents); + } + + /** + * {@inheritdoc} + * + * @return mixed + */ + public function getMetadata($key = null) + { + return call_user_func($this->_fn_getMetadata, $key); + } +} diff --git a/vendor/guzzlehttp/psr7/src/Header.php b/vendor/guzzlehttp/psr7/src/Header.php new file mode 100644 index 0000000..4d7005b --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Header.php @@ -0,0 +1,134 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +final class Header +{ + /** + * Parse an array of header values containing ";" separated data into an + * array of associative arrays representing the header key value pair data + * of the header. When a parameter does not contain a value, but just + * contains a key, this function will inject a key with a '' string value. + * + * @param string|array $header Header to parse into components. + */ + public static function parse($header): array + { + static $trimmed = "\"' \n\t\r"; + $params = $matches = []; + + foreach ((array) $header as $value) { + foreach (self::splitList($value) as $val) { + $part = []; + foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) { + if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) { + $m = $matches[0]; + if (isset($m[1])) { + $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed); + } else { + $part[] = trim($m[0], $trimmed); + } + } + } + if ($part) { + $params[] = $part; + } + } + } + + return $params; + } + + /** + * Converts an array of header values that may contain comma separated + * headers into an array of headers with no comma separated values. + * + * @param string|array $header Header to normalize. + * + * @deprecated Use self::splitList() instead. + */ + public static function normalize($header): array + { + $result = []; + foreach ((array) $header as $value) { + foreach (self::splitList($value) as $parsed) { + $result[] = $parsed; + } + } + + return $result; + } + + /** + * Splits a HTTP header defined to contain a comma-separated list into + * each individual value. Empty values will be removed. + * + * Example headers include 'accept', 'cache-control' and 'if-none-match'. + * + * This method must not be used to parse headers that are not defined as + * a list, such as 'user-agent' or 'set-cookie'. + * + * @param string|string[] $values Header value as returned by MessageInterface::getHeader() + * + * @return string[] + */ + public static function splitList($values): array + { + if (!\is_array($values)) { + $values = [$values]; + } + + $result = []; + foreach ($values as $value) { + if (!\is_string($value)) { + throw new \TypeError('$header must either be a string or an array containing strings.'); + } + + $v = ''; + $isQuoted = false; + $isEscaped = false; + for ($i = 0, $max = \strlen($value); $i < $max; $i++) { + if ($isEscaped) { + $v .= $value[$i]; + $isEscaped = false; + + continue; + } + + if (!$isQuoted && $value[$i] === ',') { + $v = \trim($v); + if ($v !== '') { + $result[] = $v; + } + + $v = ''; + continue; + } + + if ($isQuoted && $value[$i] === '\\') { + $isEscaped = true; + $v .= $value[$i]; + + continue; + } + if ($value[$i] === '"') { + $isQuoted = !$isQuoted; + $v .= $value[$i]; + + continue; + } + + $v .= $value[$i]; + } + + $v = \trim($v); + if ($v !== '') { + $result[] = $v; + } + } + + return $result; + } +} diff --git a/vendor/guzzlehttp/psr7/src/HttpFactory.php b/vendor/guzzlehttp/psr7/src/HttpFactory.php new file mode 100644 index 0000000..30be222 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/HttpFactory.php @@ -0,0 +1,100 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\RequestFactoryInterface; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseFactoryInterface; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestFactoryInterface; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Message\StreamFactoryInterface; +use Psr\Http\Message\StreamInterface; +use Psr\Http\Message\UploadedFileFactoryInterface; +use Psr\Http\Message\UploadedFileInterface; +use Psr\Http\Message\UriFactoryInterface; +use Psr\Http\Message\UriInterface; + +/** + * Implements all of the PSR-17 interfaces. + * + * Note: in consuming code it is recommended to require the implemented interfaces + * and inject the instance of this class multiple times. + */ +final class HttpFactory implements + RequestFactoryInterface, + ResponseFactoryInterface, + ServerRequestFactoryInterface, + StreamFactoryInterface, + UploadedFileFactoryInterface, + UriFactoryInterface +{ + public function createUploadedFile( + StreamInterface $stream, + int $size = null, + int $error = \UPLOAD_ERR_OK, + string $clientFilename = null, + string $clientMediaType = null + ): UploadedFileInterface { + if ($size === null) { + $size = $stream->getSize(); + } + + return new UploadedFile($stream, $size, $error, $clientFilename, $clientMediaType); + } + + public function createStream(string $content = ''): StreamInterface + { + return Utils::streamFor($content); + } + + public function createStreamFromFile(string $file, string $mode = 'r'): StreamInterface + { + try { + $resource = Utils::tryFopen($file, $mode); + } catch (\RuntimeException $e) { + if ('' === $mode || false === \in_array($mode[0], ['r', 'w', 'a', 'x', 'c'], true)) { + throw new \InvalidArgumentException(sprintf('Invalid file opening mode "%s"', $mode), 0, $e); + } + + throw $e; + } + + return Utils::streamFor($resource); + } + + public function createStreamFromResource($resource): StreamInterface + { + return Utils::streamFor($resource); + } + + public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface + { + if (empty($method)) { + if (!empty($serverParams['REQUEST_METHOD'])) { + $method = $serverParams['REQUEST_METHOD']; + } else { + throw new \InvalidArgumentException('Cannot determine HTTP method'); + } + } + + return new ServerRequest($method, $uri, [], null, '1.1', $serverParams); + } + + public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface + { + return new Response($code, [], null, '1.1', $reasonPhrase); + } + + public function createRequest(string $method, $uri): RequestInterface + { + return new Request($method, $uri); + } + + public function createUri(string $uri = ''): UriInterface + { + return new Uri($uri); + } +} diff --git a/vendor/guzzlehttp/psr7/src/InflateStream.php b/vendor/guzzlehttp/psr7/src/InflateStream.php new file mode 100644 index 0000000..8e00f1c --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/InflateStream.php @@ -0,0 +1,37 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\StreamInterface; + +/** + * Uses PHP's zlib.inflate filter to inflate zlib (HTTP deflate, RFC1950) or gzipped (RFC1952) content. + * + * This stream decorator converts the provided stream to a PHP stream resource, + * then appends the zlib.inflate filter. The stream is then converted back + * to a Guzzle stream resource to be used as a Guzzle stream. + * + * @link http://tools.ietf.org/html/rfc1950 + * @link http://tools.ietf.org/html/rfc1952 + * @link http://php.net/manual/en/filters.compression.php + */ +final class InflateStream implements StreamInterface +{ + use StreamDecoratorTrait; + + /** @var StreamInterface */ + private $stream; + + public function __construct(StreamInterface $stream) + { + $resource = StreamWrapper::getResource($stream); + // Specify window=15+32, so zlib will use header detection to both gzip (with header) and zlib data + // See http://www.zlib.net/manual.html#Advanced definition of inflateInit2 + // "Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection" + // Default window size is 15. + stream_filter_append($resource, 'zlib.inflate', STREAM_FILTER_READ, ['window' => 15 + 32]); + $this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource)); + } +} diff --git a/vendor/guzzlehttp/psr7/src/LazyOpenStream.php b/vendor/guzzlehttp/psr7/src/LazyOpenStream.php new file mode 100644 index 0000000..5618331 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/LazyOpenStream.php @@ -0,0 +1,41 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\StreamInterface; + +/** + * Lazily reads or writes to a file that is opened only after an IO operation + * take place on the stream. + */ +#[\AllowDynamicProperties] +final class LazyOpenStream implements StreamInterface +{ + use StreamDecoratorTrait; + + /** @var string */ + private $filename; + + /** @var string */ + private $mode; + + /** + * @param string $filename File to lazily open + * @param string $mode fopen mode to use when opening the stream + */ + public function __construct(string $filename, string $mode) + { + $this->filename = $filename; + $this->mode = $mode; + } + + /** + * Creates the underlying stream lazily when required. + */ + protected function createStream(): StreamInterface + { + return Utils::streamFor(Utils::tryFopen($this->filename, $this->mode)); + } +} diff --git a/vendor/guzzlehttp/psr7/src/LimitStream.php b/vendor/guzzlehttp/psr7/src/LimitStream.php new file mode 100644 index 0000000..fb22325 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/LimitStream.php @@ -0,0 +1,157 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\StreamInterface; + +/** + * Decorator used to return only a subset of a stream. + */ +final class LimitStream implements StreamInterface +{ + use StreamDecoratorTrait; + + /** @var int Offset to start reading from */ + private $offset; + + /** @var int Limit the number of bytes that can be read */ + private $limit; + + /** @var StreamInterface */ + private $stream; + + /** + * @param StreamInterface $stream Stream to wrap + * @param int $limit Total number of bytes to allow to be read + * from the stream. Pass -1 for no limit. + * @param int $offset Position to seek to before reading (only + * works on seekable streams). + */ + public function __construct( + StreamInterface $stream, + int $limit = -1, + int $offset = 0 + ) { + $this->stream = $stream; + $this->setLimit($limit); + $this->setOffset($offset); + } + + public function eof(): bool + { + // Always return true if the underlying stream is EOF + if ($this->stream->eof()) { + return true; + } + + // No limit and the underlying stream is not at EOF + if ($this->limit === -1) { + return false; + } + + return $this->stream->tell() >= $this->offset + $this->limit; + } + + /** + * Returns the size of the limited subset of data + */ + public function getSize(): ?int + { + if (null === ($length = $this->stream->getSize())) { + return null; + } elseif ($this->limit === -1) { + return $length - $this->offset; + } else { + return min($this->limit, $length - $this->offset); + } + } + + /** + * Allow for a bounded seek on the read limited stream + */ + public function seek($offset, $whence = SEEK_SET): void + { + if ($whence !== SEEK_SET || $offset < 0) { + throw new \RuntimeException(sprintf( + 'Cannot seek to offset %s with whence %s', + $offset, + $whence + )); + } + + $offset += $this->offset; + + if ($this->limit !== -1) { + if ($offset > $this->offset + $this->limit) { + $offset = $this->offset + $this->limit; + } + } + + $this->stream->seek($offset); + } + + /** + * Give a relative tell() + */ + public function tell(): int + { + return $this->stream->tell() - $this->offset; + } + + /** + * Set the offset to start limiting from + * + * @param int $offset Offset to seek to and begin byte limiting from + * + * @throws \RuntimeException if the stream cannot be seeked. + */ + public function setOffset(int $offset): void + { + $current = $this->stream->tell(); + + if ($current !== $offset) { + // If the stream cannot seek to the offset position, then read to it + if ($this->stream->isSeekable()) { + $this->stream->seek($offset); + } elseif ($current > $offset) { + throw new \RuntimeException("Could not seek to stream offset $offset"); + } else { + $this->stream->read($offset - $current); + } + } + + $this->offset = $offset; + } + + /** + * Set the limit of bytes that the decorator allows to be read from the + * stream. + * + * @param int $limit Number of bytes to allow to be read from the stream. + * Use -1 for no limit. + */ + public function setLimit(int $limit): void + { + $this->limit = $limit; + } + + public function read($length): string + { + if ($this->limit === -1) { + return $this->stream->read($length); + } + + // Check if the current position is less than the total allowed + // bytes + original offset + $remaining = ($this->offset + $this->limit) - $this->stream->tell(); + if ($remaining > 0) { + // Only return the amount of requested data, ensuring that the byte + // limit is not exceeded + return $this->stream->read(min($remaining, $length)); + } + + return ''; + } +} diff --git a/vendor/guzzlehttp/psr7/src/Message.php b/vendor/guzzlehttp/psr7/src/Message.php new file mode 100644 index 0000000..61c1a5d --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Message.php @@ -0,0 +1,246 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\MessageInterface; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; + +final class Message +{ + /** + * Returns the string representation of an HTTP message. + * + * @param MessageInterface $message Message to convert to a string. + */ + public static function toString(MessageInterface $message): string + { + if ($message instanceof RequestInterface) { + $msg = trim($message->getMethod() . ' ' + . $message->getRequestTarget()) + . ' HTTP/' . $message->getProtocolVersion(); + if (!$message->hasHeader('host')) { + $msg .= "\r\nHost: " . $message->getUri()->getHost(); + } + } elseif ($message instanceof ResponseInterface) { + $msg = 'HTTP/' . $message->getProtocolVersion() . ' ' + . $message->getStatusCode() . ' ' + . $message->getReasonPhrase(); + } else { + throw new \InvalidArgumentException('Unknown message type'); + } + + foreach ($message->getHeaders() as $name => $values) { + if (strtolower($name) === 'set-cookie') { + foreach ($values as $value) { + $msg .= "\r\n{$name}: " . $value; + } + } else { + $msg .= "\r\n{$name}: " . implode(', ', $values); + } + } + + return "{$msg}\r\n\r\n" . $message->getBody(); + } + + /** + * Get a short summary of the message body. + * + * Will return `null` if the response is not printable. + * + * @param MessageInterface $message The message to get the body summary + * @param int $truncateAt The maximum allowed size of the summary + */ + public static function bodySummary(MessageInterface $message, int $truncateAt = 120): ?string + { + $body = $message->getBody(); + + if (!$body->isSeekable() || !$body->isReadable()) { + return null; + } + + $size = $body->getSize(); + + if ($size === 0) { + return null; + } + + $body->rewind(); + $summary = $body->read($truncateAt); + $body->rewind(); + + if ($size > $truncateAt) { + $summary .= ' (truncated...)'; + } + + // Matches any printable character, including unicode characters: + // letters, marks, numbers, punctuation, spacing, and separators. + if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/u', $summary)) { + return null; + } + + return $summary; + } + + /** + * Attempts to rewind a message body and throws an exception on failure. + * + * The body of the message will only be rewound if a call to `tell()` + * returns a value other than `0`. + * + * @param MessageInterface $message Message to rewind + * + * @throws \RuntimeException + */ + public static function rewindBody(MessageInterface $message): void + { + $body = $message->getBody(); + + if ($body->tell()) { + $body->rewind(); + } + } + + /** + * Parses an HTTP message into an associative array. + * + * The array contains the "start-line" key containing the start line of + * the message, "headers" key containing an associative array of header + * array values, and a "body" key containing the body of the message. + * + * @param string $message HTTP request or response to parse. + */ + public static function parseMessage(string $message): array + { + if (!$message) { + throw new \InvalidArgumentException('Invalid message'); + } + + $message = ltrim($message, "\r\n"); + + $messageParts = preg_split("/\r?\n\r?\n/", $message, 2); + + if ($messageParts === false || count($messageParts) !== 2) { + throw new \InvalidArgumentException('Invalid message: Missing header delimiter'); + } + + [$rawHeaders, $body] = $messageParts; + $rawHeaders .= "\r\n"; // Put back the delimiter we split previously + $headerParts = preg_split("/\r?\n/", $rawHeaders, 2); + + if ($headerParts === false || count($headerParts) !== 2) { + throw new \InvalidArgumentException('Invalid message: Missing status line'); + } + + [$startLine, $rawHeaders] = $headerParts; + + if (preg_match("/(?:^HTTP\/|^[A-Z]+ \S+ HTTP\/)(\d+(?:\.\d+)?)/i", $startLine, $matches) && $matches[1] === '1.0') { + // Header folding is deprecated for HTTP/1.1, but allowed in HTTP/1.0 + $rawHeaders = preg_replace(Rfc7230::HEADER_FOLD_REGEX, ' ', $rawHeaders); + } + + /** @var array[] $headerLines */ + $count = preg_match_all(Rfc7230::HEADER_REGEX, $rawHeaders, $headerLines, PREG_SET_ORDER); + + // If these aren't the same, then one line didn't match and there's an invalid header. + if ($count !== substr_count($rawHeaders, "\n")) { + // Folding is deprecated, see https://tools.ietf.org/html/rfc7230#section-3.2.4 + if (preg_match(Rfc7230::HEADER_FOLD_REGEX, $rawHeaders)) { + throw new \InvalidArgumentException('Invalid header syntax: Obsolete line folding'); + } + + throw new \InvalidArgumentException('Invalid header syntax'); + } + + $headers = []; + + foreach ($headerLines as $headerLine) { + $headers[$headerLine[1]][] = $headerLine[2]; + } + + return [ + 'start-line' => $startLine, + 'headers' => $headers, + 'body' => $body, + ]; + } + + /** + * Constructs a URI for an HTTP request message. + * + * @param string $path Path from the start-line + * @param array $headers Array of headers (each value an array). + */ + public static function parseRequestUri(string $path, array $headers): string + { + $hostKey = array_filter(array_keys($headers), function ($k) { + // Numeric array keys are converted to int by PHP. + $k = (string) $k; + + return strtolower($k) === 'host'; + }); + + // If no host is found, then a full URI cannot be constructed. + if (!$hostKey) { + return $path; + } + + $host = $headers[reset($hostKey)][0]; + $scheme = substr($host, -4) === ':443' ? 'https' : 'http'; + + return $scheme . '://' . $host . '/' . ltrim($path, '/'); + } + + /** + * Parses a request message string into a request object. + * + * @param string $message Request message string. + */ + public static function parseRequest(string $message): RequestInterface + { + $data = self::parseMessage($message); + $matches = []; + if (!preg_match('/^[\S]+\s+([a-zA-Z]+:\/\/|\/).*/', $data['start-line'], $matches)) { + throw new \InvalidArgumentException('Invalid request string'); + } + $parts = explode(' ', $data['start-line'], 3); + $version = isset($parts[2]) ? explode('/', $parts[2])[1] : '1.1'; + + $request = new Request( + $parts[0], + $matches[1] === '/' ? self::parseRequestUri($parts[1], $data['headers']) : $parts[1], + $data['headers'], + $data['body'], + $version + ); + + return $matches[1] === '/' ? $request : $request->withRequestTarget($parts[1]); + } + + /** + * Parses a response message string into a response object. + * + * @param string $message Response message string. + */ + public static function parseResponse(string $message): ResponseInterface + { + $data = self::parseMessage($message); + // According to https://tools.ietf.org/html/rfc7230#section-3.1.2 the space + // between status-code and reason-phrase is required. But browsers accept + // responses without space and reason as well. + if (!preg_match('/^HTTP\/.* [0-9]{3}( .*|$)/', $data['start-line'])) { + throw new \InvalidArgumentException('Invalid response string: ' . $data['start-line']); + } + $parts = explode(' ', $data['start-line'], 3); + + return new Response( + (int) $parts[1], + $data['headers'], + $data['body'], + explode('/', $parts[0])[1], + $parts[2] ?? null + ); + } +} diff --git a/vendor/guzzlehttp/psr7/src/MessageTrait.php b/vendor/guzzlehttp/psr7/src/MessageTrait.php new file mode 100644 index 0000000..d2dc28b --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/MessageTrait.php @@ -0,0 +1,264 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\MessageInterface; +use Psr\Http\Message\StreamInterface; + +/** + * Trait implementing functionality common to requests and responses. + */ +trait MessageTrait +{ + /** @var array<string, string[]> Map of all registered headers, as original name => array of values */ + private $headers = []; + + /** @var array<string, string> Map of lowercase header name => original name at registration */ + private $headerNames = []; + + /** @var string */ + private $protocol = '1.1'; + + /** @var StreamInterface|null */ + private $stream; + + public function getProtocolVersion(): string + { + return $this->protocol; + } + + public function withProtocolVersion($version): MessageInterface + { + if ($this->protocol === $version) { + return $this; + } + + $new = clone $this; + $new->protocol = $version; + return $new; + } + + public function getHeaders(): array + { + return $this->headers; + } + + public function hasHeader($header): bool + { + return isset($this->headerNames[strtolower($header)]); + } + + public function getHeader($header): array + { + $header = strtolower($header); + + if (!isset($this->headerNames[$header])) { + return []; + } + + $header = $this->headerNames[$header]; + + return $this->headers[$header]; + } + + public function getHeaderLine($header): string + { + return implode(', ', $this->getHeader($header)); + } + + public function withHeader($header, $value): MessageInterface + { + $this->assertHeader($header); + $value = $this->normalizeHeaderValue($value); + $normalized = strtolower($header); + + $new = clone $this; + if (isset($new->headerNames[$normalized])) { + unset($new->headers[$new->headerNames[$normalized]]); + } + $new->headerNames[$normalized] = $header; + $new->headers[$header] = $value; + + return $new; + } + + public function withAddedHeader($header, $value): MessageInterface + { + $this->assertHeader($header); + $value = $this->normalizeHeaderValue($value); + $normalized = strtolower($header); + + $new = clone $this; + if (isset($new->headerNames[$normalized])) { + $header = $this->headerNames[$normalized]; + $new->headers[$header] = array_merge($this->headers[$header], $value); + } else { + $new->headerNames[$normalized] = $header; + $new->headers[$header] = $value; + } + + return $new; + } + + public function withoutHeader($header): MessageInterface + { + $normalized = strtolower($header); + + if (!isset($this->headerNames[$normalized])) { + return $this; + } + + $header = $this->headerNames[$normalized]; + + $new = clone $this; + unset($new->headers[$header], $new->headerNames[$normalized]); + + return $new; + } + + public function getBody(): StreamInterface + { + if (!$this->stream) { + $this->stream = Utils::streamFor(''); + } + + return $this->stream; + } + + public function withBody(StreamInterface $body): MessageInterface + { + if ($body === $this->stream) { + return $this; + } + + $new = clone $this; + $new->stream = $body; + return $new; + } + + /** + * @param array<string|int, string|string[]> $headers + */ + private function setHeaders(array $headers): void + { + $this->headerNames = $this->headers = []; + foreach ($headers as $header => $value) { + // Numeric array keys are converted to int by PHP. + $header = (string) $header; + + $this->assertHeader($header); + $value = $this->normalizeHeaderValue($value); + $normalized = strtolower($header); + if (isset($this->headerNames[$normalized])) { + $header = $this->headerNames[$normalized]; + $this->headers[$header] = array_merge($this->headers[$header], $value); + } else { + $this->headerNames[$normalized] = $header; + $this->headers[$header] = $value; + } + } + } + + /** + * @param mixed $value + * + * @return string[] + */ + private function normalizeHeaderValue($value): array + { + if (!is_array($value)) { + return $this->trimAndValidateHeaderValues([$value]); + } + + if (count($value) === 0) { + throw new \InvalidArgumentException('Header value can not be an empty array.'); + } + + return $this->trimAndValidateHeaderValues($value); + } + + /** + * Trims whitespace from the header values. + * + * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field. + * + * header-field = field-name ":" OWS field-value OWS + * OWS = *( SP / HTAB ) + * + * @param mixed[] $values Header values + * + * @return string[] Trimmed header values + * + * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 + */ + private function trimAndValidateHeaderValues(array $values): array + { + return array_map(function ($value) { + if (!is_scalar($value) && null !== $value) { + throw new \InvalidArgumentException(sprintf( + 'Header value must be scalar or null but %s provided.', + is_object($value) ? get_class($value) : gettype($value) + )); + } + + $trimmed = trim((string) $value, " \t"); + $this->assertValue($trimmed); + + return $trimmed; + }, array_values($values)); + } + + /** + * @see https://tools.ietf.org/html/rfc7230#section-3.2 + * + * @param mixed $header + */ + private function assertHeader($header): void + { + if (!is_string($header)) { + throw new \InvalidArgumentException(sprintf( + 'Header name must be a string but %s provided.', + is_object($header) ? get_class($header) : gettype($header) + )); + } + + if (! preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/', $header)) { + throw new \InvalidArgumentException( + sprintf( + '"%s" is not valid header name', + $header + ) + ); + } + } + + /** + * @see https://tools.ietf.org/html/rfc7230#section-3.2 + * + * field-value = *( field-content / obs-fold ) + * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] + * field-vchar = VCHAR / obs-text + * VCHAR = %x21-7E + * obs-text = %x80-FF + * obs-fold = CRLF 1*( SP / HTAB ) + */ + private function assertValue(string $value): void + { + // The regular expression intentionally does not support the obs-fold production, because as + // per RFC 7230#3.2.4: + // + // A sender MUST NOT generate a message that includes + // line folding (i.e., that has any field-value that contains a match to + // the obs-fold rule) unless the message is intended for packaging + // within the message/http media type. + // + // Clients must not send a request with line folding and a server sending folded headers is + // likely very rare. Line folding is a fairly obscure feature of HTTP/1.1 and thus not accepting + // folding is not likely to break any legitimate use case. + if (! preg_match('/^[\x20\x09\x21-\x7E\x80-\xFF]*$/', $value)) { + throw new \InvalidArgumentException(sprintf('"%s" is not valid header value', $value)); + } + } +} diff --git a/vendor/guzzlehttp/psr7/src/MimeType.php b/vendor/guzzlehttp/psr7/src/MimeType.php new file mode 100644 index 0000000..0debbd1 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/MimeType.php @@ -0,0 +1,1237 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +final class MimeType +{ + private const MIME_TYPES = [ + '1km' => 'application/vnd.1000minds.decision-model+xml', + '3dml' => 'text/vnd.in3d.3dml', + '3ds' => 'image/x-3ds', + '3g2' => 'video/3gpp2', + '3gp' => 'video/3gp', + '3gpp' => 'video/3gpp', + '3mf' => 'model/3mf', + '7z' => 'application/x-7z-compressed', + '7zip' => 'application/x-7z-compressed', + '123' => 'application/vnd.lotus-1-2-3', + 'aab' => 'application/x-authorware-bin', + 'aac' => 'audio/x-acc', + 'aam' => 'application/x-authorware-map', + 'aas' => 'application/x-authorware-seg', + 'abw' => 'application/x-abiword', + 'ac' => 'application/vnd.nokia.n-gage.ac+xml', + 'ac3' => 'audio/ac3', + 'acc' => 'application/vnd.americandynamics.acc', + 'ace' => 'application/x-ace-compressed', + 'acu' => 'application/vnd.acucobol', + 'acutc' => 'application/vnd.acucorp', + 'adp' => 'audio/adpcm', + 'aep' => 'application/vnd.audiograph', + 'afm' => 'application/x-font-type1', + 'afp' => 'application/vnd.ibm.modcap', + 'age' => 'application/vnd.age', + 'ahead' => 'application/vnd.ahead.space', + 'ai' => 'application/pdf', + 'aif' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'air' => 'application/vnd.adobe.air-application-installer-package+zip', + 'ait' => 'application/vnd.dvb.ait', + 'ami' => 'application/vnd.amiga.ami', + 'amr' => 'audio/amr', + 'apk' => 'application/vnd.android.package-archive', + 'apng' => 'image/apng', + 'appcache' => 'text/cache-manifest', + 'application' => 'application/x-ms-application', + 'apr' => 'application/vnd.lotus-approach', + 'arc' => 'application/x-freearc', + 'arj' => 'application/x-arj', + 'asc' => 'application/pgp-signature', + 'asf' => 'video/x-ms-asf', + 'asm' => 'text/x-asm', + 'aso' => 'application/vnd.accpac.simply.aso', + 'asx' => 'video/x-ms-asf', + 'atc' => 'application/vnd.acucorp', + 'atom' => 'application/atom+xml', + 'atomcat' => 'application/atomcat+xml', + 'atomdeleted' => 'application/atomdeleted+xml', + 'atomsvc' => 'application/atomsvc+xml', + 'atx' => 'application/vnd.antix.game-component', + 'au' => 'audio/x-au', + 'avci' => 'image/avci', + 'avcs' => 'image/avcs', + 'avi' => 'video/x-msvideo', + 'avif' => 'image/avif', + 'aw' => 'application/applixware', + 'azf' => 'application/vnd.airzip.filesecure.azf', + 'azs' => 'application/vnd.airzip.filesecure.azs', + 'azv' => 'image/vnd.airzip.accelerator.azv', + 'azw' => 'application/vnd.amazon.ebook', + 'b16' => 'image/vnd.pco.b16', + 'bat' => 'application/x-msdownload', + 'bcpio' => 'application/x-bcpio', + 'bdf' => 'application/x-font-bdf', + 'bdm' => 'application/vnd.syncml.dm+wbxml', + 'bdoc' => 'application/x-bdoc', + 'bed' => 'application/vnd.realvnc.bed', + 'bh2' => 'application/vnd.fujitsu.oasysprs', + 'bin' => 'application/octet-stream', + 'blb' => 'application/x-blorb', + 'blorb' => 'application/x-blorb', + 'bmi' => 'application/vnd.bmi', + 'bmml' => 'application/vnd.balsamiq.bmml+xml', + 'bmp' => 'image/bmp', + 'book' => 'application/vnd.framemaker', + 'box' => 'application/vnd.previewsystems.box', + 'boz' => 'application/x-bzip2', + 'bpk' => 'application/octet-stream', + 'bpmn' => 'application/octet-stream', + 'bsp' => 'model/vnd.valve.source.compiled-map', + 'btif' => 'image/prs.btif', + 'buffer' => 'application/octet-stream', + 'bz' => 'application/x-bzip', + 'bz2' => 'application/x-bzip2', + 'c' => 'text/x-c', + 'c4d' => 'application/vnd.clonk.c4group', + 'c4f' => 'application/vnd.clonk.c4group', + 'c4g' => 'application/vnd.clonk.c4group', + 'c4p' => 'application/vnd.clonk.c4group', + 'c4u' => 'application/vnd.clonk.c4group', + 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', + 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', + 'cab' => 'application/vnd.ms-cab-compressed', + 'caf' => 'audio/x-caf', + 'cap' => 'application/vnd.tcpdump.pcap', + 'car' => 'application/vnd.curl.car', + 'cat' => 'application/vnd.ms-pki.seccat', + 'cb7' => 'application/x-cbr', + 'cba' => 'application/x-cbr', + 'cbr' => 'application/x-cbr', + 'cbt' => 'application/x-cbr', + 'cbz' => 'application/x-cbr', + 'cc' => 'text/x-c', + 'cco' => 'application/x-cocoa', + 'cct' => 'application/x-director', + 'ccxml' => 'application/ccxml+xml', + 'cdbcmsg' => 'application/vnd.contact.cmsg', + 'cdf' => 'application/x-netcdf', + 'cdfx' => 'application/cdfx+xml', + 'cdkey' => 'application/vnd.mediastation.cdkey', + 'cdmia' => 'application/cdmi-capability', + 'cdmic' => 'application/cdmi-container', + 'cdmid' => 'application/cdmi-domain', + 'cdmio' => 'application/cdmi-object', + 'cdmiq' => 'application/cdmi-queue', + 'cdr' => 'application/cdr', + 'cdx' => 'chemical/x-cdx', + 'cdxml' => 'application/vnd.chemdraw+xml', + 'cdy' => 'application/vnd.cinderella', + 'cer' => 'application/pkix-cert', + 'cfs' => 'application/x-cfs-compressed', + 'cgm' => 'image/cgm', + 'chat' => 'application/x-chat', + 'chm' => 'application/vnd.ms-htmlhelp', + 'chrt' => 'application/vnd.kde.kchart', + 'cif' => 'chemical/x-cif', + 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', + 'cil' => 'application/vnd.ms-artgalry', + 'cjs' => 'application/node', + 'cla' => 'application/vnd.claymore', + 'class' => 'application/octet-stream', + 'clkk' => 'application/vnd.crick.clicker.keyboard', + 'clkp' => 'application/vnd.crick.clicker.palette', + 'clkt' => 'application/vnd.crick.clicker.template', + 'clkw' => 'application/vnd.crick.clicker.wordbank', + 'clkx' => 'application/vnd.crick.clicker', + 'clp' => 'application/x-msclip', + 'cmc' => 'application/vnd.cosmocaller', + 'cmdf' => 'chemical/x-cmdf', + 'cml' => 'chemical/x-cml', + 'cmp' => 'application/vnd.yellowriver-custom-menu', + 'cmx' => 'image/x-cmx', + 'cod' => 'application/vnd.rim.cod', + 'coffee' => 'text/coffeescript', + 'com' => 'application/x-msdownload', + 'conf' => 'text/plain', + 'cpio' => 'application/x-cpio', + 'cpl' => 'application/cpl+xml', + 'cpp' => 'text/x-c', + 'cpt' => 'application/mac-compactpro', + 'crd' => 'application/x-mscardfile', + 'crl' => 'application/pkix-crl', + 'crt' => 'application/x-x509-ca-cert', + 'crx' => 'application/x-chrome-extension', + 'cryptonote' => 'application/vnd.rig.cryptonote', + 'csh' => 'application/x-csh', + 'csl' => 'application/vnd.citationstyles.style+xml', + 'csml' => 'chemical/x-csml', + 'csp' => 'application/vnd.commonspace', + 'csr' => 'application/octet-stream', + 'css' => 'text/css', + 'cst' => 'application/x-director', + 'csv' => 'text/csv', + 'cu' => 'application/cu-seeme', + 'curl' => 'text/vnd.curl', + 'cww' => 'application/prs.cww', + 'cxt' => 'application/x-director', + 'cxx' => 'text/x-c', + 'dae' => 'model/vnd.collada+xml', + 'daf' => 'application/vnd.mobius.daf', + 'dart' => 'application/vnd.dart', + 'dataless' => 'application/vnd.fdsn.seed', + 'davmount' => 'application/davmount+xml', + 'dbf' => 'application/vnd.dbf', + 'dbk' => 'application/docbook+xml', + 'dcr' => 'application/x-director', + 'dcurl' => 'text/vnd.curl.dcurl', + 'dd2' => 'application/vnd.oma.dd2+xml', + 'ddd' => 'application/vnd.fujixerox.ddd', + 'ddf' => 'application/vnd.syncml.dmddf+xml', + 'dds' => 'image/vnd.ms-dds', + 'deb' => 'application/x-debian-package', + 'def' => 'text/plain', + 'deploy' => 'application/octet-stream', + 'der' => 'application/x-x509-ca-cert', + 'dfac' => 'application/vnd.dreamfactory', + 'dgc' => 'application/x-dgc-compressed', + 'dic' => 'text/x-c', + 'dir' => 'application/x-director', + 'dis' => 'application/vnd.mobius.dis', + 'disposition-notification' => 'message/disposition-notification', + 'dist' => 'application/octet-stream', + 'distz' => 'application/octet-stream', + 'djv' => 'image/vnd.djvu', + 'djvu' => 'image/vnd.djvu', + 'dll' => 'application/octet-stream', + 'dmg' => 'application/x-apple-diskimage', + 'dmn' => 'application/octet-stream', + 'dmp' => 'application/vnd.tcpdump.pcap', + 'dms' => 'application/octet-stream', + 'dna' => 'application/vnd.dna', + 'doc' => 'application/msword', + 'docm' => 'application/vnd.ms-word.template.macroEnabled.12', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'dot' => 'application/msword', + 'dotm' => 'application/vnd.ms-word.template.macroEnabled.12', + 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', + 'dp' => 'application/vnd.osgi.dp', + 'dpg' => 'application/vnd.dpgraph', + 'dra' => 'audio/vnd.dra', + 'drle' => 'image/dicom-rle', + 'dsc' => 'text/prs.lines.tag', + 'dssc' => 'application/dssc+der', + 'dtb' => 'application/x-dtbook+xml', + 'dtd' => 'application/xml-dtd', + 'dts' => 'audio/vnd.dts', + 'dtshd' => 'audio/vnd.dts.hd', + 'dump' => 'application/octet-stream', + 'dvb' => 'video/vnd.dvb.file', + 'dvi' => 'application/x-dvi', + 'dwd' => 'application/atsc-dwd+xml', + 'dwf' => 'model/vnd.dwf', + 'dwg' => 'image/vnd.dwg', + 'dxf' => 'image/vnd.dxf', + 'dxp' => 'application/vnd.spotfire.dxp', + 'dxr' => 'application/x-director', + 'ear' => 'application/java-archive', + 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', + 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', + 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', + 'ecma' => 'application/ecmascript', + 'edm' => 'application/vnd.novadigm.edm', + 'edx' => 'application/vnd.novadigm.edx', + 'efif' => 'application/vnd.picsel', + 'ei6' => 'application/vnd.pg.osasli', + 'elc' => 'application/octet-stream', + 'emf' => 'image/emf', + 'eml' => 'message/rfc822', + 'emma' => 'application/emma+xml', + 'emotionml' => 'application/emotionml+xml', + 'emz' => 'application/x-msmetafile', + 'eol' => 'audio/vnd.digital-winds', + 'eot' => 'application/vnd.ms-fontobject', + 'eps' => 'application/postscript', + 'epub' => 'application/epub+zip', + 'es' => 'application/ecmascript', + 'es3' => 'application/vnd.eszigno3+xml', + 'esa' => 'application/vnd.osgi.subsystem', + 'esf' => 'application/vnd.epson.esf', + 'et3' => 'application/vnd.eszigno3+xml', + 'etx' => 'text/x-setext', + 'eva' => 'application/x-eva', + 'evy' => 'application/x-envoy', + 'exe' => 'application/octet-stream', + 'exi' => 'application/exi', + 'exp' => 'application/express', + 'exr' => 'image/aces', + 'ext' => 'application/vnd.novadigm.ext', + 'ez' => 'application/andrew-inset', + 'ez2' => 'application/vnd.ezpix-album', + 'ez3' => 'application/vnd.ezpix-package', + 'f' => 'text/x-fortran', + 'f4v' => 'video/mp4', + 'f77' => 'text/x-fortran', + 'f90' => 'text/x-fortran', + 'fbs' => 'image/vnd.fastbidsheet', + 'fcdt' => 'application/vnd.adobe.formscentral.fcdt', + 'fcs' => 'application/vnd.isac.fcs', + 'fdf' => 'application/vnd.fdf', + 'fdt' => 'application/fdt+xml', + 'fe_launch' => 'application/vnd.denovo.fcselayout-link', + 'fg5' => 'application/vnd.fujitsu.oasysgp', + 'fgd' => 'application/x-director', + 'fh' => 'image/x-freehand', + 'fh4' => 'image/x-freehand', + 'fh5' => 'image/x-freehand', + 'fh7' => 'image/x-freehand', + 'fhc' => 'image/x-freehand', + 'fig' => 'application/x-xfig', + 'fits' => 'image/fits', + 'flac' => 'audio/x-flac', + 'fli' => 'video/x-fli', + 'flo' => 'application/vnd.micrografx.flo', + 'flv' => 'video/x-flv', + 'flw' => 'application/vnd.kde.kivio', + 'flx' => 'text/vnd.fmi.flexstor', + 'fly' => 'text/vnd.fly', + 'fm' => 'application/vnd.framemaker', + 'fnc' => 'application/vnd.frogans.fnc', + 'fo' => 'application/vnd.software602.filler.form+xml', + 'for' => 'text/x-fortran', + 'fpx' => 'image/vnd.fpx', + 'frame' => 'application/vnd.framemaker', + 'fsc' => 'application/vnd.fsc.weblaunch', + 'fst' => 'image/vnd.fst', + 'ftc' => 'application/vnd.fluxtime.clip', + 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', + 'fvt' => 'video/vnd.fvt', + 'fxp' => 'application/vnd.adobe.fxp', + 'fxpl' => 'application/vnd.adobe.fxp', + 'fzs' => 'application/vnd.fuzzysheet', + 'g2w' => 'application/vnd.geoplan', + 'g3' => 'image/g3fax', + 'g3w' => 'application/vnd.geospace', + 'gac' => 'application/vnd.groove-account', + 'gam' => 'application/x-tads', + 'gbr' => 'application/rpki-ghostbusters', + 'gca' => 'application/x-gca-compressed', + 'gdl' => 'model/vnd.gdl', + 'gdoc' => 'application/vnd.google-apps.document', + 'ged' => 'text/vnd.familysearch.gedcom', + 'geo' => 'application/vnd.dynageo', + 'geojson' => 'application/geo+json', + 'gex' => 'application/vnd.geometry-explorer', + 'ggb' => 'application/vnd.geogebra.file', + 'ggt' => 'application/vnd.geogebra.tool', + 'ghf' => 'application/vnd.groove-help', + 'gif' => 'image/gif', + 'gim' => 'application/vnd.groove-identity-message', + 'glb' => 'model/gltf-binary', + 'gltf' => 'model/gltf+json', + 'gml' => 'application/gml+xml', + 'gmx' => 'application/vnd.gmx', + 'gnumeric' => 'application/x-gnumeric', + 'gpg' => 'application/gpg-keys', + 'gph' => 'application/vnd.flographit', + 'gpx' => 'application/gpx+xml', + 'gqf' => 'application/vnd.grafeq', + 'gqs' => 'application/vnd.grafeq', + 'gram' => 'application/srgs', + 'gramps' => 'application/x-gramps-xml', + 'gre' => 'application/vnd.geometry-explorer', + 'grv' => 'application/vnd.groove-injector', + 'grxml' => 'application/srgs+xml', + 'gsf' => 'application/x-font-ghostscript', + 'gsheet' => 'application/vnd.google-apps.spreadsheet', + 'gslides' => 'application/vnd.google-apps.presentation', + 'gtar' => 'application/x-gtar', + 'gtm' => 'application/vnd.groove-tool-message', + 'gtw' => 'model/vnd.gtw', + 'gv' => 'text/vnd.graphviz', + 'gxf' => 'application/gxf', + 'gxt' => 'application/vnd.geonext', + 'gz' => 'application/gzip', + 'gzip' => 'application/gzip', + 'h' => 'text/x-c', + 'h261' => 'video/h261', + 'h263' => 'video/h263', + 'h264' => 'video/h264', + 'hal' => 'application/vnd.hal+xml', + 'hbci' => 'application/vnd.hbci', + 'hbs' => 'text/x-handlebars-template', + 'hdd' => 'application/x-virtualbox-hdd', + 'hdf' => 'application/x-hdf', + 'heic' => 'image/heic', + 'heics' => 'image/heic-sequence', + 'heif' => 'image/heif', + 'heifs' => 'image/heif-sequence', + 'hej2' => 'image/hej2k', + 'held' => 'application/atsc-held+xml', + 'hh' => 'text/x-c', + 'hjson' => 'application/hjson', + 'hlp' => 'application/winhlp', + 'hpgl' => 'application/vnd.hp-hpgl', + 'hpid' => 'application/vnd.hp-hpid', + 'hps' => 'application/vnd.hp-hps', + 'hqx' => 'application/mac-binhex40', + 'hsj2' => 'image/hsj2', + 'htc' => 'text/x-component', + 'htke' => 'application/vnd.kenameaapp', + 'htm' => 'text/html', + 'html' => 'text/html', + 'hvd' => 'application/vnd.yamaha.hv-dic', + 'hvp' => 'application/vnd.yamaha.hv-voice', + 'hvs' => 'application/vnd.yamaha.hv-script', + 'i2g' => 'application/vnd.intergeo', + 'icc' => 'application/vnd.iccprofile', + 'ice' => 'x-conference/x-cooltalk', + 'icm' => 'application/vnd.iccprofile', + 'ico' => 'image/x-icon', + 'ics' => 'text/calendar', + 'ief' => 'image/ief', + 'ifb' => 'text/calendar', + 'ifm' => 'application/vnd.shana.informed.formdata', + 'iges' => 'model/iges', + 'igl' => 'application/vnd.igloader', + 'igm' => 'application/vnd.insors.igm', + 'igs' => 'model/iges', + 'igx' => 'application/vnd.micrografx.igx', + 'iif' => 'application/vnd.shana.informed.interchange', + 'img' => 'application/octet-stream', + 'imp' => 'application/vnd.accpac.simply.imp', + 'ims' => 'application/vnd.ms-ims', + 'in' => 'text/plain', + 'ini' => 'text/plain', + 'ink' => 'application/inkml+xml', + 'inkml' => 'application/inkml+xml', + 'install' => 'application/x-install-instructions', + 'iota' => 'application/vnd.astraea-software.iota', + 'ipfix' => 'application/ipfix', + 'ipk' => 'application/vnd.shana.informed.package', + 'irm' => 'application/vnd.ibm.rights-management', + 'irp' => 'application/vnd.irepository.package+xml', + 'iso' => 'application/x-iso9660-image', + 'itp' => 'application/vnd.shana.informed.formtemplate', + 'its' => 'application/its+xml', + 'ivp' => 'application/vnd.immervision-ivp', + 'ivu' => 'application/vnd.immervision-ivu', + 'jad' => 'text/vnd.sun.j2me.app-descriptor', + 'jade' => 'text/jade', + 'jam' => 'application/vnd.jam', + 'jar' => 'application/java-archive', + 'jardiff' => 'application/x-java-archive-diff', + 'java' => 'text/x-java-source', + 'jhc' => 'image/jphc', + 'jisp' => 'application/vnd.jisp', + 'jls' => 'image/jls', + 'jlt' => 'application/vnd.hp-jlyt', + 'jng' => 'image/x-jng', + 'jnlp' => 'application/x-java-jnlp-file', + 'joda' => 'application/vnd.joost.joda-archive', + 'jp2' => 'image/jp2', + 'jpe' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpf' => 'image/jpx', + 'jpg' => 'image/jpeg', + 'jpg2' => 'image/jp2', + 'jpgm' => 'video/jpm', + 'jpgv' => 'video/jpeg', + 'jph' => 'image/jph', + 'jpm' => 'video/jpm', + 'jpx' => 'image/jpx', + 'js' => 'application/javascript', + 'json' => 'application/json', + 'json5' => 'application/json5', + 'jsonld' => 'application/ld+json', + 'jsonml' => 'application/jsonml+json', + 'jsx' => 'text/jsx', + 'jxr' => 'image/jxr', + 'jxra' => 'image/jxra', + 'jxrs' => 'image/jxrs', + 'jxs' => 'image/jxs', + 'jxsc' => 'image/jxsc', + 'jxsi' => 'image/jxsi', + 'jxss' => 'image/jxss', + 'kar' => 'audio/midi', + 'karbon' => 'application/vnd.kde.karbon', + 'kdb' => 'application/octet-stream', + 'kdbx' => 'application/x-keepass2', + 'key' => 'application/x-iwork-keynote-sffkey', + 'kfo' => 'application/vnd.kde.kformula', + 'kia' => 'application/vnd.kidspiration', + 'kml' => 'application/vnd.google-earth.kml+xml', + 'kmz' => 'application/vnd.google-earth.kmz', + 'kne' => 'application/vnd.kinar', + 'knp' => 'application/vnd.kinar', + 'kon' => 'application/vnd.kde.kontour', + 'kpr' => 'application/vnd.kde.kpresenter', + 'kpt' => 'application/vnd.kde.kpresenter', + 'kpxx' => 'application/vnd.ds-keypoint', + 'ksp' => 'application/vnd.kde.kspread', + 'ktr' => 'application/vnd.kahootz', + 'ktx' => 'image/ktx', + 'ktx2' => 'image/ktx2', + 'ktz' => 'application/vnd.kahootz', + 'kwd' => 'application/vnd.kde.kword', + 'kwt' => 'application/vnd.kde.kword', + 'lasxml' => 'application/vnd.las.las+xml', + 'latex' => 'application/x-latex', + 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', + 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', + 'les' => 'application/vnd.hhe.lesson-player', + 'less' => 'text/less', + 'lgr' => 'application/lgr+xml', + 'lha' => 'application/octet-stream', + 'link66' => 'application/vnd.route66.link66+xml', + 'list' => 'text/plain', + 'list3820' => 'application/vnd.ibm.modcap', + 'listafp' => 'application/vnd.ibm.modcap', + 'litcoffee' => 'text/coffeescript', + 'lnk' => 'application/x-ms-shortcut', + 'log' => 'text/plain', + 'lostxml' => 'application/lost+xml', + 'lrf' => 'application/octet-stream', + 'lrm' => 'application/vnd.ms-lrm', + 'ltf' => 'application/vnd.frogans.ltf', + 'lua' => 'text/x-lua', + 'luac' => 'application/x-lua-bytecode', + 'lvp' => 'audio/vnd.lucent.voice', + 'lwp' => 'application/vnd.lotus-wordpro', + 'lzh' => 'application/octet-stream', + 'm1v' => 'video/mpeg', + 'm2a' => 'audio/mpeg', + 'm2v' => 'video/mpeg', + 'm3a' => 'audio/mpeg', + 'm3u' => 'text/plain', + 'm3u8' => 'application/vnd.apple.mpegurl', + 'm4a' => 'audio/x-m4a', + 'm4p' => 'application/mp4', + 'm4s' => 'video/iso.segment', + 'm4u' => 'application/vnd.mpegurl', + 'm4v' => 'video/x-m4v', + 'm13' => 'application/x-msmediaview', + 'm14' => 'application/x-msmediaview', + 'm21' => 'application/mp21', + 'ma' => 'application/mathematica', + 'mads' => 'application/mads+xml', + 'maei' => 'application/mmt-aei+xml', + 'mag' => 'application/vnd.ecowin.chart', + 'maker' => 'application/vnd.framemaker', + 'man' => 'text/troff', + 'manifest' => 'text/cache-manifest', + 'map' => 'application/json', + 'mar' => 'application/octet-stream', + 'markdown' => 'text/markdown', + 'mathml' => 'application/mathml+xml', + 'mb' => 'application/mathematica', + 'mbk' => 'application/vnd.mobius.mbk', + 'mbox' => 'application/mbox', + 'mc1' => 'application/vnd.medcalcdata', + 'mcd' => 'application/vnd.mcd', + 'mcurl' => 'text/vnd.curl.mcurl', + 'md' => 'text/markdown', + 'mdb' => 'application/x-msaccess', + 'mdi' => 'image/vnd.ms-modi', + 'mdx' => 'text/mdx', + 'me' => 'text/troff', + 'mesh' => 'model/mesh', + 'meta4' => 'application/metalink4+xml', + 'metalink' => 'application/metalink+xml', + 'mets' => 'application/mets+xml', + 'mfm' => 'application/vnd.mfmp', + 'mft' => 'application/rpki-manifest', + 'mgp' => 'application/vnd.osgeo.mapguide.package', + 'mgz' => 'application/vnd.proteus.magazine', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mie' => 'application/x-mie', + 'mif' => 'application/vnd.mif', + 'mime' => 'message/rfc822', + 'mj2' => 'video/mj2', + 'mjp2' => 'video/mj2', + 'mjs' => 'application/javascript', + 'mk3d' => 'video/x-matroska', + 'mka' => 'audio/x-matroska', + 'mkd' => 'text/x-markdown', + 'mks' => 'video/x-matroska', + 'mkv' => 'video/x-matroska', + 'mlp' => 'application/vnd.dolby.mlp', + 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', + 'mmf' => 'application/vnd.smaf', + 'mml' => 'text/mathml', + 'mmr' => 'image/vnd.fujixerox.edmics-mmr', + 'mng' => 'video/x-mng', + 'mny' => 'application/x-msmoney', + 'mobi' => 'application/x-mobipocket-ebook', + 'mods' => 'application/mods+xml', + 'mov' => 'video/quicktime', + 'movie' => 'video/x-sgi-movie', + 'mp2' => 'audio/mpeg', + 'mp2a' => 'audio/mpeg', + 'mp3' => 'audio/mpeg', + 'mp4' => 'video/mp4', + 'mp4a' => 'audio/mp4', + 'mp4s' => 'application/mp4', + 'mp4v' => 'video/mp4', + 'mp21' => 'application/mp21', + 'mpc' => 'application/vnd.mophun.certificate', + 'mpd' => 'application/dash+xml', + 'mpe' => 'video/mpeg', + 'mpeg' => 'video/mpeg', + 'mpf' => 'application/media-policy-dataset+xml', + 'mpg' => 'video/mpeg', + 'mpg4' => 'video/mp4', + 'mpga' => 'audio/mpeg', + 'mpkg' => 'application/vnd.apple.installer+xml', + 'mpm' => 'application/vnd.blueice.multipass', + 'mpn' => 'application/vnd.mophun.application', + 'mpp' => 'application/vnd.ms-project', + 'mpt' => 'application/vnd.ms-project', + 'mpy' => 'application/vnd.ibm.minipay', + 'mqy' => 'application/vnd.mobius.mqy', + 'mrc' => 'application/marc', + 'mrcx' => 'application/marcxml+xml', + 'ms' => 'text/troff', + 'mscml' => 'application/mediaservercontrol+xml', + 'mseed' => 'application/vnd.fdsn.mseed', + 'mseq' => 'application/vnd.mseq', + 'msf' => 'application/vnd.epson.msf', + 'msg' => 'application/vnd.ms-outlook', + 'msh' => 'model/mesh', + 'msi' => 'application/x-msdownload', + 'msl' => 'application/vnd.mobius.msl', + 'msm' => 'application/octet-stream', + 'msp' => 'application/octet-stream', + 'msty' => 'application/vnd.muvee.style', + 'mtl' => 'model/mtl', + 'mts' => 'model/vnd.mts', + 'mus' => 'application/vnd.musician', + 'musd' => 'application/mmt-usd+xml', + 'musicxml' => 'application/vnd.recordare.musicxml+xml', + 'mvb' => 'application/x-msmediaview', + 'mvt' => 'application/vnd.mapbox-vector-tile', + 'mwf' => 'application/vnd.mfer', + 'mxf' => 'application/mxf', + 'mxl' => 'application/vnd.recordare.musicxml', + 'mxmf' => 'audio/mobile-xmf', + 'mxml' => 'application/xv+xml', + 'mxs' => 'application/vnd.triscape.mxs', + 'mxu' => 'video/vnd.mpegurl', + 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', + 'n3' => 'text/n3', + 'nb' => 'application/mathematica', + 'nbp' => 'application/vnd.wolfram.player', + 'nc' => 'application/x-netcdf', + 'ncx' => 'application/x-dtbncx+xml', + 'nfo' => 'text/x-nfo', + 'ngdat' => 'application/vnd.nokia.n-gage.data', + 'nitf' => 'application/vnd.nitf', + 'nlu' => 'application/vnd.neurolanguage.nlu', + 'nml' => 'application/vnd.enliven', + 'nnd' => 'application/vnd.noblenet-directory', + 'nns' => 'application/vnd.noblenet-sealer', + 'nnw' => 'application/vnd.noblenet-web', + 'npx' => 'image/vnd.net-fpx', + 'nq' => 'application/n-quads', + 'nsc' => 'application/x-conference', + 'nsf' => 'application/vnd.lotus-notes', + 'nt' => 'application/n-triples', + 'ntf' => 'application/vnd.nitf', + 'numbers' => 'application/x-iwork-numbers-sffnumbers', + 'nzb' => 'application/x-nzb', + 'oa2' => 'application/vnd.fujitsu.oasys2', + 'oa3' => 'application/vnd.fujitsu.oasys3', + 'oas' => 'application/vnd.fujitsu.oasys', + 'obd' => 'application/x-msbinder', + 'obgx' => 'application/vnd.openblox.game+xml', + 'obj' => 'model/obj', + 'oda' => 'application/oda', + 'odb' => 'application/vnd.oasis.opendocument.database', + 'odc' => 'application/vnd.oasis.opendocument.chart', + 'odf' => 'application/vnd.oasis.opendocument.formula', + 'odft' => 'application/vnd.oasis.opendocument.formula-template', + 'odg' => 'application/vnd.oasis.opendocument.graphics', + 'odi' => 'application/vnd.oasis.opendocument.image', + 'odm' => 'application/vnd.oasis.opendocument.text-master', + 'odp' => 'application/vnd.oasis.opendocument.presentation', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + 'odt' => 'application/vnd.oasis.opendocument.text', + 'oga' => 'audio/ogg', + 'ogex' => 'model/vnd.opengex', + 'ogg' => 'audio/ogg', + 'ogv' => 'video/ogg', + 'ogx' => 'application/ogg', + 'omdoc' => 'application/omdoc+xml', + 'onepkg' => 'application/onenote', + 'onetmp' => 'application/onenote', + 'onetoc' => 'application/onenote', + 'onetoc2' => 'application/onenote', + 'opf' => 'application/oebps-package+xml', + 'opml' => 'text/x-opml', + 'oprc' => 'application/vnd.palm', + 'opus' => 'audio/ogg', + 'org' => 'text/x-org', + 'osf' => 'application/vnd.yamaha.openscoreformat', + 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', + 'osm' => 'application/vnd.openstreetmap.data+xml', + 'otc' => 'application/vnd.oasis.opendocument.chart-template', + 'otf' => 'font/otf', + 'otg' => 'application/vnd.oasis.opendocument.graphics-template', + 'oth' => 'application/vnd.oasis.opendocument.text-web', + 'oti' => 'application/vnd.oasis.opendocument.image-template', + 'otp' => 'application/vnd.oasis.opendocument.presentation-template', + 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', + 'ott' => 'application/vnd.oasis.opendocument.text-template', + 'ova' => 'application/x-virtualbox-ova', + 'ovf' => 'application/x-virtualbox-ovf', + 'owl' => 'application/rdf+xml', + 'oxps' => 'application/oxps', + 'oxt' => 'application/vnd.openofficeorg.extension', + 'p' => 'text/x-pascal', + 'p7a' => 'application/x-pkcs7-signature', + 'p7b' => 'application/x-pkcs7-certificates', + 'p7c' => 'application/pkcs7-mime', + 'p7m' => 'application/pkcs7-mime', + 'p7r' => 'application/x-pkcs7-certreqresp', + 'p7s' => 'application/pkcs7-signature', + 'p8' => 'application/pkcs8', + 'p10' => 'application/x-pkcs10', + 'p12' => 'application/x-pkcs12', + 'pac' => 'application/x-ns-proxy-autoconfig', + 'pages' => 'application/x-iwork-pages-sffpages', + 'pas' => 'text/x-pascal', + 'paw' => 'application/vnd.pawaafile', + 'pbd' => 'application/vnd.powerbuilder6', + 'pbm' => 'image/x-portable-bitmap', + 'pcap' => 'application/vnd.tcpdump.pcap', + 'pcf' => 'application/x-font-pcf', + 'pcl' => 'application/vnd.hp-pcl', + 'pclxl' => 'application/vnd.hp-pclxl', + 'pct' => 'image/x-pict', + 'pcurl' => 'application/vnd.curl.pcurl', + 'pcx' => 'image/x-pcx', + 'pdb' => 'application/x-pilot', + 'pde' => 'text/x-processing', + 'pdf' => 'application/pdf', + 'pem' => 'application/x-x509-user-cert', + 'pfa' => 'application/x-font-type1', + 'pfb' => 'application/x-font-type1', + 'pfm' => 'application/x-font-type1', + 'pfr' => 'application/font-tdpfr', + 'pfx' => 'application/x-pkcs12', + 'pgm' => 'image/x-portable-graymap', + 'pgn' => 'application/x-chess-pgn', + 'pgp' => 'application/pgp', + 'phar' => 'application/octet-stream', + 'php' => 'application/x-httpd-php', + 'php3' => 'application/x-httpd-php', + 'php4' => 'application/x-httpd-php', + 'phps' => 'application/x-httpd-php-source', + 'phtml' => 'application/x-httpd-php', + 'pic' => 'image/x-pict', + 'pkg' => 'application/octet-stream', + 'pki' => 'application/pkixcmp', + 'pkipath' => 'application/pkix-pkipath', + 'pkpass' => 'application/vnd.apple.pkpass', + 'pl' => 'application/x-perl', + 'plb' => 'application/vnd.3gpp.pic-bw-large', + 'plc' => 'application/vnd.mobius.plc', + 'plf' => 'application/vnd.pocketlearn', + 'pls' => 'application/pls+xml', + 'pm' => 'application/x-perl', + 'pml' => 'application/vnd.ctc-posml', + 'png' => 'image/png', + 'pnm' => 'image/x-portable-anymap', + 'portpkg' => 'application/vnd.macports.portpkg', + 'pot' => 'application/vnd.ms-powerpoint', + 'potm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', + 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', + 'ppa' => 'application/vnd.ms-powerpoint', + 'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', + 'ppd' => 'application/vnd.cups-ppd', + 'ppm' => 'image/x-portable-pixmap', + 'pps' => 'application/vnd.ms-powerpoint', + 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', + 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', + 'ppt' => 'application/powerpoint', + 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'pqa' => 'application/vnd.palm', + 'prc' => 'model/prc', + 'pre' => 'application/vnd.lotus-freelance', + 'prf' => 'application/pics-rules', + 'provx' => 'application/provenance+xml', + 'ps' => 'application/postscript', + 'psb' => 'application/vnd.3gpp.pic-bw-small', + 'psd' => 'application/x-photoshop', + 'psf' => 'application/x-font-linux-psf', + 'pskcxml' => 'application/pskc+xml', + 'pti' => 'image/prs.pti', + 'ptid' => 'application/vnd.pvi.ptid1', + 'pub' => 'application/x-mspublisher', + 'pvb' => 'application/vnd.3gpp.pic-bw-var', + 'pwn' => 'application/vnd.3m.post-it-notes', + 'pya' => 'audio/vnd.ms-playready.media.pya', + 'pyv' => 'video/vnd.ms-playready.media.pyv', + 'qam' => 'application/vnd.epson.quickanime', + 'qbo' => 'application/vnd.intu.qbo', + 'qfx' => 'application/vnd.intu.qfx', + 'qps' => 'application/vnd.publishare-delta-tree', + 'qt' => 'video/quicktime', + 'qwd' => 'application/vnd.quark.quarkxpress', + 'qwt' => 'application/vnd.quark.quarkxpress', + 'qxb' => 'application/vnd.quark.quarkxpress', + 'qxd' => 'application/vnd.quark.quarkxpress', + 'qxl' => 'application/vnd.quark.quarkxpress', + 'qxt' => 'application/vnd.quark.quarkxpress', + 'ra' => 'audio/x-realaudio', + 'ram' => 'audio/x-pn-realaudio', + 'raml' => 'application/raml+yaml', + 'rapd' => 'application/route-apd+xml', + 'rar' => 'application/x-rar', + 'ras' => 'image/x-cmu-raster', + 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', + 'rdf' => 'application/rdf+xml', + 'rdz' => 'application/vnd.data-vision.rdz', + 'relo' => 'application/p2p-overlay+xml', + 'rep' => 'application/vnd.businessobjects', + 'res' => 'application/x-dtbresource+xml', + 'rgb' => 'image/x-rgb', + 'rif' => 'application/reginfo+xml', + 'rip' => 'audio/vnd.rip', + 'ris' => 'application/x-research-info-systems', + 'rl' => 'application/resource-lists+xml', + 'rlc' => 'image/vnd.fujixerox.edmics-rlc', + 'rld' => 'application/resource-lists-diff+xml', + 'rm' => 'audio/x-pn-realaudio', + 'rmi' => 'audio/midi', + 'rmp' => 'audio/x-pn-realaudio-plugin', + 'rms' => 'application/vnd.jcp.javame.midlet-rms', + 'rmvb' => 'application/vnd.rn-realmedia-vbr', + 'rnc' => 'application/relax-ng-compact-syntax', + 'rng' => 'application/xml', + 'roa' => 'application/rpki-roa', + 'roff' => 'text/troff', + 'rp9' => 'application/vnd.cloanto.rp9', + 'rpm' => 'audio/x-pn-realaudio-plugin', + 'rpss' => 'application/vnd.nokia.radio-presets', + 'rpst' => 'application/vnd.nokia.radio-preset', + 'rq' => 'application/sparql-query', + 'rs' => 'application/rls-services+xml', + 'rsa' => 'application/x-pkcs7', + 'rsat' => 'application/atsc-rsat+xml', + 'rsd' => 'application/rsd+xml', + 'rsheet' => 'application/urc-ressheet+xml', + 'rss' => 'application/rss+xml', + 'rtf' => 'text/rtf', + 'rtx' => 'text/richtext', + 'run' => 'application/x-makeself', + 'rusd' => 'application/route-usd+xml', + 'rv' => 'video/vnd.rn-realvideo', + 's' => 'text/x-asm', + 's3m' => 'audio/s3m', + 'saf' => 'application/vnd.yamaha.smaf-audio', + 'sass' => 'text/x-sass', + 'sbml' => 'application/sbml+xml', + 'sc' => 'application/vnd.ibm.secure-container', + 'scd' => 'application/x-msschedule', + 'scm' => 'application/vnd.lotus-screencam', + 'scq' => 'application/scvp-cv-request', + 'scs' => 'application/scvp-cv-response', + 'scss' => 'text/x-scss', + 'scurl' => 'text/vnd.curl.scurl', + 'sda' => 'application/vnd.stardivision.draw', + 'sdc' => 'application/vnd.stardivision.calc', + 'sdd' => 'application/vnd.stardivision.impress', + 'sdkd' => 'application/vnd.solent.sdkm+xml', + 'sdkm' => 'application/vnd.solent.sdkm+xml', + 'sdp' => 'application/sdp', + 'sdw' => 'application/vnd.stardivision.writer', + 'sea' => 'application/octet-stream', + 'see' => 'application/vnd.seemail', + 'seed' => 'application/vnd.fdsn.seed', + 'sema' => 'application/vnd.sema', + 'semd' => 'application/vnd.semd', + 'semf' => 'application/vnd.semf', + 'senmlx' => 'application/senml+xml', + 'sensmlx' => 'application/sensml+xml', + 'ser' => 'application/java-serialized-object', + 'setpay' => 'application/set-payment-initiation', + 'setreg' => 'application/set-registration-initiation', + 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', + 'sfs' => 'application/vnd.spotfire.sfs', + 'sfv' => 'text/x-sfv', + 'sgi' => 'image/sgi', + 'sgl' => 'application/vnd.stardivision.writer-global', + 'sgm' => 'text/sgml', + 'sgml' => 'text/sgml', + 'sh' => 'application/x-sh', + 'shar' => 'application/x-shar', + 'shex' => 'text/shex', + 'shf' => 'application/shf+xml', + 'shtml' => 'text/html', + 'sid' => 'image/x-mrsid-image', + 'sieve' => 'application/sieve', + 'sig' => 'application/pgp-signature', + 'sil' => 'audio/silk', + 'silo' => 'model/mesh', + 'sis' => 'application/vnd.symbian.install', + 'sisx' => 'application/vnd.symbian.install', + 'sit' => 'application/x-stuffit', + 'sitx' => 'application/x-stuffitx', + 'siv' => 'application/sieve', + 'skd' => 'application/vnd.koan', + 'skm' => 'application/vnd.koan', + 'skp' => 'application/vnd.koan', + 'skt' => 'application/vnd.koan', + 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', + 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', + 'slim' => 'text/slim', + 'slm' => 'text/slim', + 'sls' => 'application/route-s-tsid+xml', + 'slt' => 'application/vnd.epson.salt', + 'sm' => 'application/vnd.stepmania.stepchart', + 'smf' => 'application/vnd.stardivision.math', + 'smi' => 'application/smil', + 'smil' => 'application/smil', + 'smv' => 'video/x-smv', + 'smzip' => 'application/vnd.stepmania.package', + 'snd' => 'audio/basic', + 'snf' => 'application/x-font-snf', + 'so' => 'application/octet-stream', + 'spc' => 'application/x-pkcs7-certificates', + 'spdx' => 'text/spdx', + 'spf' => 'application/vnd.yamaha.smaf-phrase', + 'spl' => 'application/x-futuresplash', + 'spot' => 'text/vnd.in3d.spot', + 'spp' => 'application/scvp-vp-response', + 'spq' => 'application/scvp-vp-request', + 'spx' => 'audio/ogg', + 'sql' => 'application/x-sql', + 'src' => 'application/x-wais-source', + 'srt' => 'application/x-subrip', + 'sru' => 'application/sru+xml', + 'srx' => 'application/sparql-results+xml', + 'ssdl' => 'application/ssdl+xml', + 'sse' => 'application/vnd.kodak-descriptor', + 'ssf' => 'application/vnd.epson.ssf', + 'ssml' => 'application/ssml+xml', + 'sst' => 'application/octet-stream', + 'st' => 'application/vnd.sailingtracker.track', + 'stc' => 'application/vnd.sun.xml.calc.template', + 'std' => 'application/vnd.sun.xml.draw.template', + 'stf' => 'application/vnd.wt.stf', + 'sti' => 'application/vnd.sun.xml.impress.template', + 'stk' => 'application/hyperstudio', + 'stl' => 'model/stl', + 'stpx' => 'model/step+xml', + 'stpxz' => 'model/step-xml+zip', + 'stpz' => 'model/step+zip', + 'str' => 'application/vnd.pg.format', + 'stw' => 'application/vnd.sun.xml.writer.template', + 'styl' => 'text/stylus', + 'stylus' => 'text/stylus', + 'sub' => 'text/vnd.dvb.subtitle', + 'sus' => 'application/vnd.sus-calendar', + 'susp' => 'application/vnd.sus-calendar', + 'sv4cpio' => 'application/x-sv4cpio', + 'sv4crc' => 'application/x-sv4crc', + 'svc' => 'application/vnd.dvb.service', + 'svd' => 'application/vnd.svd', + 'svg' => 'image/svg+xml', + 'svgz' => 'image/svg+xml', + 'swa' => 'application/x-director', + 'swf' => 'application/x-shockwave-flash', + 'swi' => 'application/vnd.aristanetworks.swi', + 'swidtag' => 'application/swid+xml', + 'sxc' => 'application/vnd.sun.xml.calc', + 'sxd' => 'application/vnd.sun.xml.draw', + 'sxg' => 'application/vnd.sun.xml.writer.global', + 'sxi' => 'application/vnd.sun.xml.impress', + 'sxm' => 'application/vnd.sun.xml.math', + 'sxw' => 'application/vnd.sun.xml.writer', + 't' => 'text/troff', + 't3' => 'application/x-t3vm-image', + 't38' => 'image/t38', + 'taglet' => 'application/vnd.mynfc', + 'tao' => 'application/vnd.tao.intent-module-archive', + 'tap' => 'image/vnd.tencent.tap', + 'tar' => 'application/x-tar', + 'tcap' => 'application/vnd.3gpp2.tcap', + 'tcl' => 'application/x-tcl', + 'td' => 'application/urc-targetdesc+xml', + 'teacher' => 'application/vnd.smart.teacher', + 'tei' => 'application/tei+xml', + 'teicorpus' => 'application/tei+xml', + 'tex' => 'application/x-tex', + 'texi' => 'application/x-texinfo', + 'texinfo' => 'application/x-texinfo', + 'text' => 'text/plain', + 'tfi' => 'application/thraud+xml', + 'tfm' => 'application/x-tex-tfm', + 'tfx' => 'image/tiff-fx', + 'tga' => 'image/x-tga', + 'tgz' => 'application/x-tar', + 'thmx' => 'application/vnd.ms-officetheme', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'tk' => 'application/x-tcl', + 'tmo' => 'application/vnd.tmobile-livetv', + 'toml' => 'application/toml', + 'torrent' => 'application/x-bittorrent', + 'tpl' => 'application/vnd.groove-tool-template', + 'tpt' => 'application/vnd.trid.tpt', + 'tr' => 'text/troff', + 'tra' => 'application/vnd.trueapp', + 'trig' => 'application/trig', + 'trm' => 'application/x-msterminal', + 'ts' => 'video/mp2t', + 'tsd' => 'application/timestamped-data', + 'tsv' => 'text/tab-separated-values', + 'ttc' => 'font/collection', + 'ttf' => 'font/ttf', + 'ttl' => 'text/turtle', + 'ttml' => 'application/ttml+xml', + 'twd' => 'application/vnd.simtech-mindmapper', + 'twds' => 'application/vnd.simtech-mindmapper', + 'txd' => 'application/vnd.genomatix.tuxedo', + 'txf' => 'application/vnd.mobius.txf', + 'txt' => 'text/plain', + 'u3d' => 'model/u3d', + 'u8dsn' => 'message/global-delivery-status', + 'u8hdr' => 'message/global-headers', + 'u8mdn' => 'message/global-disposition-notification', + 'u8msg' => 'message/global', + 'u32' => 'application/x-authorware-bin', + 'ubj' => 'application/ubjson', + 'udeb' => 'application/x-debian-package', + 'ufd' => 'application/vnd.ufdl', + 'ufdl' => 'application/vnd.ufdl', + 'ulx' => 'application/x-glulx', + 'umj' => 'application/vnd.umajin', + 'unityweb' => 'application/vnd.unity', + 'uoml' => 'application/vnd.uoml+xml', + 'uri' => 'text/uri-list', + 'uris' => 'text/uri-list', + 'urls' => 'text/uri-list', + 'usdz' => 'model/vnd.usdz+zip', + 'ustar' => 'application/x-ustar', + 'utz' => 'application/vnd.uiq.theme', + 'uu' => 'text/x-uuencode', + 'uva' => 'audio/vnd.dece.audio', + 'uvd' => 'application/vnd.dece.data', + 'uvf' => 'application/vnd.dece.data', + 'uvg' => 'image/vnd.dece.graphic', + 'uvh' => 'video/vnd.dece.hd', + 'uvi' => 'image/vnd.dece.graphic', + 'uvm' => 'video/vnd.dece.mobile', + 'uvp' => 'video/vnd.dece.pd', + 'uvs' => 'video/vnd.dece.sd', + 'uvt' => 'application/vnd.dece.ttml+xml', + 'uvu' => 'video/vnd.uvvu.mp4', + 'uvv' => 'video/vnd.dece.video', + 'uvva' => 'audio/vnd.dece.audio', + 'uvvd' => 'application/vnd.dece.data', + 'uvvf' => 'application/vnd.dece.data', + 'uvvg' => 'image/vnd.dece.graphic', + 'uvvh' => 'video/vnd.dece.hd', + 'uvvi' => 'image/vnd.dece.graphic', + 'uvvm' => 'video/vnd.dece.mobile', + 'uvvp' => 'video/vnd.dece.pd', + 'uvvs' => 'video/vnd.dece.sd', + 'uvvt' => 'application/vnd.dece.ttml+xml', + 'uvvu' => 'video/vnd.uvvu.mp4', + 'uvvv' => 'video/vnd.dece.video', + 'uvvx' => 'application/vnd.dece.unspecified', + 'uvvz' => 'application/vnd.dece.zip', + 'uvx' => 'application/vnd.dece.unspecified', + 'uvz' => 'application/vnd.dece.zip', + 'vbox' => 'application/x-virtualbox-vbox', + 'vbox-extpack' => 'application/x-virtualbox-vbox-extpack', + 'vcard' => 'text/vcard', + 'vcd' => 'application/x-cdlink', + 'vcf' => 'text/x-vcard', + 'vcg' => 'application/vnd.groove-vcard', + 'vcs' => 'text/x-vcalendar', + 'vcx' => 'application/vnd.vcx', + 'vdi' => 'application/x-virtualbox-vdi', + 'vds' => 'model/vnd.sap.vds', + 'vhd' => 'application/x-virtualbox-vhd', + 'vis' => 'application/vnd.visionary', + 'viv' => 'video/vnd.vivo', + 'vlc' => 'application/videolan', + 'vmdk' => 'application/x-virtualbox-vmdk', + 'vob' => 'video/x-ms-vob', + 'vor' => 'application/vnd.stardivision.writer', + 'vox' => 'application/x-authorware-bin', + 'vrml' => 'model/vrml', + 'vsd' => 'application/vnd.visio', + 'vsf' => 'application/vnd.vsf', + 'vss' => 'application/vnd.visio', + 'vst' => 'application/vnd.visio', + 'vsw' => 'application/vnd.visio', + 'vtf' => 'image/vnd.valve.source.texture', + 'vtt' => 'text/vtt', + 'vtu' => 'model/vnd.vtu', + 'vxml' => 'application/voicexml+xml', + 'w3d' => 'application/x-director', + 'wad' => 'application/x-doom', + 'wadl' => 'application/vnd.sun.wadl+xml', + 'war' => 'application/java-archive', + 'wasm' => 'application/wasm', + 'wav' => 'audio/x-wav', + 'wax' => 'audio/x-ms-wax', + 'wbmp' => 'image/vnd.wap.wbmp', + 'wbs' => 'application/vnd.criticaltools.wbs+xml', + 'wbxml' => 'application/wbxml', + 'wcm' => 'application/vnd.ms-works', + 'wdb' => 'application/vnd.ms-works', + 'wdp' => 'image/vnd.ms-photo', + 'weba' => 'audio/webm', + 'webapp' => 'application/x-web-app-manifest+json', + 'webm' => 'video/webm', + 'webmanifest' => 'application/manifest+json', + 'webp' => 'image/webp', + 'wg' => 'application/vnd.pmi.widget', + 'wgt' => 'application/widget', + 'wif' => 'application/watcherinfo+xml', + 'wks' => 'application/vnd.ms-works', + 'wm' => 'video/x-ms-wm', + 'wma' => 'audio/x-ms-wma', + 'wmd' => 'application/x-ms-wmd', + 'wmf' => 'image/wmf', + 'wml' => 'text/vnd.wap.wml', + 'wmlc' => 'application/wmlc', + 'wmls' => 'text/vnd.wap.wmlscript', + 'wmlsc' => 'application/vnd.wap.wmlscriptc', + 'wmv' => 'video/x-ms-wmv', + 'wmx' => 'video/x-ms-wmx', + 'wmz' => 'application/x-msmetafile', + 'woff' => 'font/woff', + 'woff2' => 'font/woff2', + 'word' => 'application/msword', + 'wpd' => 'application/vnd.wordperfect', + 'wpl' => 'application/vnd.ms-wpl', + 'wps' => 'application/vnd.ms-works', + 'wqd' => 'application/vnd.wqd', + 'wri' => 'application/x-mswrite', + 'wrl' => 'model/vrml', + 'wsc' => 'message/vnd.wfa.wsc', + 'wsdl' => 'application/wsdl+xml', + 'wspolicy' => 'application/wspolicy+xml', + 'wtb' => 'application/vnd.webturbo', + 'wvx' => 'video/x-ms-wvx', + 'x3d' => 'model/x3d+xml', + 'x3db' => 'model/x3d+fastinfoset', + 'x3dbz' => 'model/x3d+binary', + 'x3dv' => 'model/x3d-vrml', + 'x3dvz' => 'model/x3d+vrml', + 'x3dz' => 'model/x3d+xml', + 'x32' => 'application/x-authorware-bin', + 'x_b' => 'model/vnd.parasolid.transmit.binary', + 'x_t' => 'model/vnd.parasolid.transmit.text', + 'xaml' => 'application/xaml+xml', + 'xap' => 'application/x-silverlight-app', + 'xar' => 'application/vnd.xara', + 'xav' => 'application/xcap-att+xml', + 'xbap' => 'application/x-ms-xbap', + 'xbd' => 'application/vnd.fujixerox.docuworks.binder', + 'xbm' => 'image/x-xbitmap', + 'xca' => 'application/xcap-caps+xml', + 'xcs' => 'application/calendar+xml', + 'xdf' => 'application/xcap-diff+xml', + 'xdm' => 'application/vnd.syncml.dm+xml', + 'xdp' => 'application/vnd.adobe.xdp+xml', + 'xdssc' => 'application/dssc+xml', + 'xdw' => 'application/vnd.fujixerox.docuworks', + 'xel' => 'application/xcap-el+xml', + 'xenc' => 'application/xenc+xml', + 'xer' => 'application/patch-ops-error+xml', + 'xfdf' => 'application/vnd.adobe.xfdf', + 'xfdl' => 'application/vnd.xfdl', + 'xht' => 'application/xhtml+xml', + 'xhtml' => 'application/xhtml+xml', + 'xhvml' => 'application/xv+xml', + 'xif' => 'image/vnd.xiff', + 'xl' => 'application/excel', + 'xla' => 'application/vnd.ms-excel', + 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', + 'xlc' => 'application/vnd.ms-excel', + 'xlf' => 'application/xliff+xml', + 'xlm' => 'application/vnd.ms-excel', + 'xls' => 'application/vnd.ms-excel', + 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', + 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xlt' => 'application/vnd.ms-excel', + 'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12', + 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', + 'xlw' => 'application/vnd.ms-excel', + 'xm' => 'audio/xm', + 'xml' => 'application/xml', + 'xns' => 'application/xcap-ns+xml', + 'xo' => 'application/vnd.olpc-sugar', + 'xop' => 'application/xop+xml', + 'xpi' => 'application/x-xpinstall', + 'xpl' => 'application/xproc+xml', + 'xpm' => 'image/x-xpixmap', + 'xpr' => 'application/vnd.is-xpr', + 'xps' => 'application/vnd.ms-xpsdocument', + 'xpw' => 'application/vnd.intercon.formnet', + 'xpx' => 'application/vnd.intercon.formnet', + 'xsd' => 'application/xml', + 'xsl' => 'application/xml', + 'xslt' => 'application/xslt+xml', + 'xsm' => 'application/vnd.syncml+xml', + 'xspf' => 'application/xspf+xml', + 'xul' => 'application/vnd.mozilla.xul+xml', + 'xvm' => 'application/xv+xml', + 'xvml' => 'application/xv+xml', + 'xwd' => 'image/x-xwindowdump', + 'xyz' => 'chemical/x-xyz', + 'xz' => 'application/x-xz', + 'yaml' => 'text/yaml', + 'yang' => 'application/yang', + 'yin' => 'application/yin+xml', + 'yml' => 'text/yaml', + 'ymp' => 'text/x-suse-ymp', + 'z' => 'application/x-compress', + 'z1' => 'application/x-zmachine', + 'z2' => 'application/x-zmachine', + 'z3' => 'application/x-zmachine', + 'z4' => 'application/x-zmachine', + 'z5' => 'application/x-zmachine', + 'z6' => 'application/x-zmachine', + 'z7' => 'application/x-zmachine', + 'z8' => 'application/x-zmachine', + 'zaz' => 'application/vnd.zzazz.deck+xml', + 'zip' => 'application/zip', + 'zir' => 'application/vnd.zul', + 'zirz' => 'application/vnd.zul', + 'zmm' => 'application/vnd.handheld-entertainment+xml', + 'zsh' => 'text/x-scriptzsh', + ]; + + /** + * Determines the mimetype of a file by looking at its extension. + * + * @link https://raw.githubusercontent.com/jshttp/mime-db/master/db.json + */ + public static function fromFilename(string $filename): ?string + { + return self::fromExtension(pathinfo($filename, PATHINFO_EXTENSION)); + } + + /** + * Maps a file extensions to a mimetype. + * + * @link https://raw.githubusercontent.com/jshttp/mime-db/master/db.json + */ + public static function fromExtension(string $extension): ?string + { + return self::MIME_TYPES[strtolower($extension)] ?? null; + } +} diff --git a/vendor/guzzlehttp/psr7/src/MultipartStream.php b/vendor/guzzlehttp/psr7/src/MultipartStream.php new file mode 100644 index 0000000..3e12b74 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/MultipartStream.php @@ -0,0 +1,159 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\StreamInterface; + +/** + * Stream that when read returns bytes for a streaming multipart or + * multipart/form-data stream. + */ +final class MultipartStream implements StreamInterface +{ + use StreamDecoratorTrait; + + /** @var string */ + private $boundary; + + /** @var StreamInterface */ + private $stream; + + /** + * @param array $elements Array of associative arrays, each containing a + * required "name" key mapping to the form field, + * name, a required "contents" key mapping to a + * StreamInterface/resource/string, an optional + * "headers" associative array of custom headers, + * and an optional "filename" key mapping to a + * string to send as the filename in the part. + * @param string $boundary You can optionally provide a specific boundary + * + * @throws \InvalidArgumentException + */ + public function __construct(array $elements = [], string $boundary = null) + { + $this->boundary = $boundary ?: bin2hex(random_bytes(20)); + $this->stream = $this->createStream($elements); + } + + public function getBoundary(): string + { + return $this->boundary; + } + + public function isWritable(): bool + { + return false; + } + + /** + * Get the headers needed before transferring the content of a POST file + * + * @param array<string, string> $headers + */ + private function getHeaders(array $headers): string + { + $str = ''; + foreach ($headers as $key => $value) { + $str .= "{$key}: {$value}\r\n"; + } + + return "--{$this->boundary}\r\n" . trim($str) . "\r\n\r\n"; + } + + /** + * Create the aggregate stream that will be used to upload the POST data + */ + protected function createStream(array $elements = []): StreamInterface + { + $stream = new AppendStream(); + + foreach ($elements as $element) { + if (!is_array($element)) { + throw new \UnexpectedValueException("An array is expected"); + } + $this->addElement($stream, $element); + } + + // Add the trailing boundary with CRLF + $stream->addStream(Utils::streamFor("--{$this->boundary}--\r\n")); + + return $stream; + } + + private function addElement(AppendStream $stream, array $element): void + { + foreach (['contents', 'name'] as $key) { + if (!array_key_exists($key, $element)) { + throw new \InvalidArgumentException("A '{$key}' key is required"); + } + } + + $element['contents'] = Utils::streamFor($element['contents']); + + if (empty($element['filename'])) { + $uri = $element['contents']->getMetadata('uri'); + if ($uri && \is_string($uri) && \substr($uri, 0, 6) !== 'php://' && \substr($uri, 0, 7) !== 'data://') { + $element['filename'] = $uri; + } + } + + [$body, $headers] = $this->createElement( + $element['name'], + $element['contents'], + $element['filename'] ?? null, + $element['headers'] ?? [] + ); + + $stream->addStream(Utils::streamFor($this->getHeaders($headers))); + $stream->addStream($body); + $stream->addStream(Utils::streamFor("\r\n")); + } + + private function createElement(string $name, StreamInterface $stream, ?string $filename, array $headers): array + { + // Set a default content-disposition header if one was no provided + $disposition = $this->getHeader($headers, 'content-disposition'); + if (!$disposition) { + $headers['Content-Disposition'] = ($filename === '0' || $filename) + ? sprintf( + 'form-data; name="%s"; filename="%s"', + $name, + basename($filename) + ) + : "form-data; name=\"{$name}\""; + } + + // Set a default content-length header if one was no provided + $length = $this->getHeader($headers, 'content-length'); + if (!$length) { + if ($length = $stream->getSize()) { + $headers['Content-Length'] = (string) $length; + } + } + + // Set a default Content-Type if one was not supplied + $type = $this->getHeader($headers, 'content-type'); + if (!$type && ($filename === '0' || $filename)) { + if ($type = MimeType::fromFilename($filename)) { + $headers['Content-Type'] = $type; + } + } + + return [$stream, $headers]; + } + + private function getHeader(array $headers, string $key) + { + $lowercaseHeader = strtolower($key); + foreach ($headers as $k => $v) { + if (strtolower($k) === $lowercaseHeader) { + return $v; + } + } + + return null; + } +} diff --git a/vendor/guzzlehttp/psr7/src/NoSeekStream.php b/vendor/guzzlehttp/psr7/src/NoSeekStream.php new file mode 100644 index 0000000..161a224 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/NoSeekStream.php @@ -0,0 +1,28 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\StreamInterface; + +/** + * Stream decorator that prevents a stream from being seeked. + */ +final class NoSeekStream implements StreamInterface +{ + use StreamDecoratorTrait; + + /** @var StreamInterface */ + private $stream; + + public function seek($offset, $whence = SEEK_SET): void + { + throw new \RuntimeException('Cannot seek a NoSeekStream'); + } + + public function isSeekable(): bool + { + return false; + } +} diff --git a/vendor/guzzlehttp/psr7/src/PumpStream.php b/vendor/guzzlehttp/psr7/src/PumpStream.php new file mode 100644 index 0000000..e90389c --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/PumpStream.php @@ -0,0 +1,179 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\StreamInterface; + +/** + * Provides a read only stream that pumps data from a PHP callable. + * + * When invoking the provided callable, the PumpStream will pass the amount of + * data requested to read to the callable. The callable can choose to ignore + * this value and return fewer or more bytes than requested. Any extra data + * returned by the provided callable is buffered internally until drained using + * the read() function of the PumpStream. The provided callable MUST return + * false when there is no more data to read. + */ +final class PumpStream implements StreamInterface +{ + /** @var callable|null */ + private $source; + + /** @var int|null */ + private $size; + + /** @var int */ + private $tellPos = 0; + + /** @var array */ + private $metadata; + + /** @var BufferStream */ + private $buffer; + + /** + * @param callable(int): (string|null|false) $source Source of the stream data. The callable MAY + * accept an integer argument used to control the + * amount of data to return. The callable MUST + * return a string when called, or false|null on error + * or EOF. + * @param array{size?: int, metadata?: array} $options Stream options: + * - metadata: Hash of metadata to use with stream. + * - size: Size of the stream, if known. + */ + public function __construct(callable $source, array $options = []) + { + $this->source = $source; + $this->size = $options['size'] ?? null; + $this->metadata = $options['metadata'] ?? []; + $this->buffer = new BufferStream(); + } + + public function __toString(): string + { + try { + return Utils::copyToString($this); + } catch (\Throwable $e) { + if (\PHP_VERSION_ID >= 70400) { + throw $e; + } + trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR); + return ''; + } + } + + public function close(): void + { + $this->detach(); + } + + public function detach() + { + $this->tellPos = 0; + $this->source = null; + + return null; + } + + public function getSize(): ?int + { + return $this->size; + } + + public function tell(): int + { + return $this->tellPos; + } + + public function eof(): bool + { + return $this->source === null; + } + + public function isSeekable(): bool + { + return false; + } + + public function rewind(): void + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET): void + { + throw new \RuntimeException('Cannot seek a PumpStream'); + } + + public function isWritable(): bool + { + return false; + } + + public function write($string): int + { + throw new \RuntimeException('Cannot write to a PumpStream'); + } + + public function isReadable(): bool + { + return true; + } + + public function read($length): string + { + $data = $this->buffer->read($length); + $readLen = strlen($data); + $this->tellPos += $readLen; + $remaining = $length - $readLen; + + if ($remaining) { + $this->pump($remaining); + $data .= $this->buffer->read($remaining); + $this->tellPos += strlen($data) - $readLen; + } + + return $data; + } + + public function getContents(): string + { + $result = ''; + while (!$this->eof()) { + $result .= $this->read(1000000); + } + + return $result; + } + + /** + * {@inheritdoc} + * + * @return mixed + */ + public function getMetadata($key = null) + { + if (!$key) { + return $this->metadata; + } + + return $this->metadata[$key] ?? null; + } + + private function pump(int $length): void + { + if ($this->source) { + do { + $data = call_user_func($this->source, $length); + if ($data === false || $data === null) { + $this->source = null; + return; + } + $this->buffer->write($data); + $length -= strlen($data); + } while ($length > 0); + } + } +} diff --git a/vendor/guzzlehttp/psr7/src/Query.php b/vendor/guzzlehttp/psr7/src/Query.php new file mode 100644 index 0000000..2faab3a --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Query.php @@ -0,0 +1,113 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +final class Query +{ + /** + * Parse a query string into an associative array. + * + * If multiple values are found for the same key, the value of that key + * value pair will become an array. This function does not parse nested + * PHP style arrays into an associative array (e.g., `foo[a]=1&foo[b]=2` + * will be parsed into `['foo[a]' => '1', 'foo[b]' => '2'])`. + * + * @param string $str Query string to parse + * @param int|bool $urlEncoding How the query string is encoded + */ + public static function parse(string $str, $urlEncoding = true): array + { + $result = []; + + if ($str === '') { + return $result; + } + + if ($urlEncoding === true) { + $decoder = function ($value) { + return rawurldecode(str_replace('+', ' ', (string) $value)); + }; + } elseif ($urlEncoding === PHP_QUERY_RFC3986) { + $decoder = 'rawurldecode'; + } elseif ($urlEncoding === PHP_QUERY_RFC1738) { + $decoder = 'urldecode'; + } else { + $decoder = function ($str) { + return $str; + }; + } + + foreach (explode('&', $str) as $kvp) { + $parts = explode('=', $kvp, 2); + $key = $decoder($parts[0]); + $value = isset($parts[1]) ? $decoder($parts[1]) : null; + if (!array_key_exists($key, $result)) { + $result[$key] = $value; + } else { + if (!is_array($result[$key])) { + $result[$key] = [$result[$key]]; + } + $result[$key][] = $value; + } + } + + return $result; + } + + /** + * Build a query string from an array of key value pairs. + * + * This function can use the return value of `parse()` to build a query + * string. This function does not modify the provided keys when an array is + * encountered (like `http_build_query()` would). + * + * @param array $params Query string parameters. + * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986 + * to encode using RFC3986, or PHP_QUERY_RFC1738 + * to encode using RFC1738. + */ + public static function build(array $params, $encoding = PHP_QUERY_RFC3986): string + { + if (!$params) { + return ''; + } + + if ($encoding === false) { + $encoder = function (string $str): string { + return $str; + }; + } elseif ($encoding === PHP_QUERY_RFC3986) { + $encoder = 'rawurlencode'; + } elseif ($encoding === PHP_QUERY_RFC1738) { + $encoder = 'urlencode'; + } else { + throw new \InvalidArgumentException('Invalid type'); + } + + $qs = ''; + foreach ($params as $k => $v) { + $k = $encoder((string) $k); + if (!is_array($v)) { + $qs .= $k; + $v = is_bool($v) ? (int) $v : $v; + if ($v !== null) { + $qs .= '=' . $encoder((string) $v); + } + $qs .= '&'; + } else { + foreach ($v as $vv) { + $qs .= $k; + $vv = is_bool($vv) ? (int) $vv : $vv; + if ($vv !== null) { + $qs .= '=' . $encoder((string) $vv); + } + $qs .= '&'; + } + } + } + + return $qs ? (string) substr($qs, 0, -1) : ''; + } +} diff --git a/vendor/guzzlehttp/psr7/src/Request.php b/vendor/guzzlehttp/psr7/src/Request.php new file mode 100644 index 0000000..b17af66 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Request.php @@ -0,0 +1,157 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use InvalidArgumentException; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\StreamInterface; +use Psr\Http\Message\UriInterface; + +/** + * PSR-7 request implementation. + */ +class Request implements RequestInterface +{ + use MessageTrait; + + /** @var string */ + private $method; + + /** @var string|null */ + private $requestTarget; + + /** @var UriInterface */ + private $uri; + + /** + * @param string $method HTTP method + * @param string|UriInterface $uri URI + * @param array<string, string|string[]> $headers Request headers + * @param string|resource|StreamInterface|null $body Request body + * @param string $version Protocol version + */ + public function __construct( + string $method, + $uri, + array $headers = [], + $body = null, + string $version = '1.1' + ) { + $this->assertMethod($method); + if (!($uri instanceof UriInterface)) { + $uri = new Uri($uri); + } + + $this->method = strtoupper($method); + $this->uri = $uri; + $this->setHeaders($headers); + $this->protocol = $version; + + if (!isset($this->headerNames['host'])) { + $this->updateHostFromUri(); + } + + if ($body !== '' && $body !== null) { + $this->stream = Utils::streamFor($body); + } + } + + public function getRequestTarget(): string + { + if ($this->requestTarget !== null) { + return $this->requestTarget; + } + + $target = $this->uri->getPath(); + if ($target === '') { + $target = '/'; + } + if ($this->uri->getQuery() != '') { + $target .= '?' . $this->uri->getQuery(); + } + + return $target; + } + + public function withRequestTarget($requestTarget): RequestInterface + { + if (preg_match('#\s#', $requestTarget)) { + throw new InvalidArgumentException( + 'Invalid request target provided; cannot contain whitespace' + ); + } + + $new = clone $this; + $new->requestTarget = $requestTarget; + return $new; + } + + public function getMethod(): string + { + return $this->method; + } + + public function withMethod($method): RequestInterface + { + $this->assertMethod($method); + $new = clone $this; + $new->method = strtoupper($method); + return $new; + } + + public function getUri(): UriInterface + { + return $this->uri; + } + + public function withUri(UriInterface $uri, $preserveHost = false): RequestInterface + { + if ($uri === $this->uri) { + return $this; + } + + $new = clone $this; + $new->uri = $uri; + + if (!$preserveHost || !isset($this->headerNames['host'])) { + $new->updateHostFromUri(); + } + + return $new; + } + + private function updateHostFromUri(): void + { + $host = $this->uri->getHost(); + + if ($host == '') { + return; + } + + if (($port = $this->uri->getPort()) !== null) { + $host .= ':' . $port; + } + + if (isset($this->headerNames['host'])) { + $header = $this->headerNames['host']; + } else { + $header = 'Host'; + $this->headerNames['host'] = 'Host'; + } + // Ensure Host is the first header. + // See: http://tools.ietf.org/html/rfc7230#section-5.4 + $this->headers = [$header => [$host]] + $this->headers; + } + + /** + * @param mixed $method + */ + private function assertMethod($method): void + { + if (!is_string($method) || $method === '') { + throw new InvalidArgumentException('Method must be a non-empty string.'); + } + } +} diff --git a/vendor/guzzlehttp/psr7/src/Response.php b/vendor/guzzlehttp/psr7/src/Response.php new file mode 100644 index 0000000..4c6ee6f --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Response.php @@ -0,0 +1,160 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\StreamInterface; + +/** + * PSR-7 response implementation. + */ +class Response implements ResponseInterface +{ + use MessageTrait; + + /** Map of standard HTTP status code/reason phrases */ + private const PHRASES = [ + 100 => 'Continue', + 101 => 'Switching Protocols', + 102 => 'Processing', + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + 207 => 'Multi-status', + 208 => 'Already Reported', + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 306 => 'Switch Proxy', + 307 => 'Temporary Redirect', + 308 => 'Permanent Redirect', + 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 Time-out', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Large', + 415 => 'Unsupported Media Type', + 416 => 'Requested range not satisfiable', + 417 => 'Expectation Failed', + 418 => 'I\'m a teapot', + 422 => 'Unprocessable Entity', + 423 => 'Locked', + 424 => 'Failed Dependency', + 425 => 'Unordered Collection', + 426 => 'Upgrade Required', + 428 => 'Precondition Required', + 429 => 'Too Many Requests', + 431 => 'Request Header Fields Too Large', + 451 => 'Unavailable For Legal Reasons', + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Time-out', + 505 => 'HTTP Version not supported', + 506 => 'Variant Also Negotiates', + 507 => 'Insufficient Storage', + 508 => 'Loop Detected', + 510 => 'Not Extended', + 511 => 'Network Authentication Required', + ]; + + /** @var string */ + private $reasonPhrase; + + /** @var int */ + private $statusCode; + + /** + * @param int $status Status code + * @param array<string, string|string[]> $headers Response headers + * @param string|resource|StreamInterface|null $body Response body + * @param string $version Protocol version + * @param string|null $reason Reason phrase (when empty a default will be used based on the status code) + */ + public function __construct( + int $status = 200, + array $headers = [], + $body = null, + string $version = '1.1', + string $reason = null + ) { + $this->assertStatusCodeRange($status); + + $this->statusCode = $status; + + if ($body !== '' && $body !== null) { + $this->stream = Utils::streamFor($body); + } + + $this->setHeaders($headers); + if ($reason == '' && isset(self::PHRASES[$this->statusCode])) { + $this->reasonPhrase = self::PHRASES[$this->statusCode]; + } else { + $this->reasonPhrase = (string) $reason; + } + + $this->protocol = $version; + } + + public function getStatusCode(): int + { + return $this->statusCode; + } + + public function getReasonPhrase(): string + { + return $this->reasonPhrase; + } + + public function withStatus($code, $reasonPhrase = ''): ResponseInterface + { + $this->assertStatusCodeIsInteger($code); + $code = (int) $code; + $this->assertStatusCodeRange($code); + + $new = clone $this; + $new->statusCode = $code; + if ($reasonPhrase == '' && isset(self::PHRASES[$new->statusCode])) { + $reasonPhrase = self::PHRASES[$new->statusCode]; + } + $new->reasonPhrase = (string) $reasonPhrase; + return $new; + } + + /** + * @param mixed $statusCode + */ + private function assertStatusCodeIsInteger($statusCode): void + { + if (filter_var($statusCode, FILTER_VALIDATE_INT) === false) { + throw new \InvalidArgumentException('Status code must be an integer value.'); + } + } + + private function assertStatusCodeRange(int $statusCode): void + { + if ($statusCode < 100 || $statusCode >= 600) { + throw new \InvalidArgumentException('Status code must be an integer value between 1xx and 5xx.'); + } + } +} diff --git a/vendor/guzzlehttp/psr7/src/Rfc7230.php b/vendor/guzzlehttp/psr7/src/Rfc7230.php new file mode 100644 index 0000000..3022401 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Rfc7230.php @@ -0,0 +1,23 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +/** + * @internal + */ +final class Rfc7230 +{ + /** + * Header related regular expressions (based on amphp/http package) + * + * Note: header delimiter (\r\n) is modified to \r?\n to accept line feed only delimiters for BC reasons. + * + * @link https://github.com/amphp/http/blob/v1.0.1/src/Rfc7230.php#L12-L15 + * + * @license https://github.com/amphp/http/blob/v1.0.1/LICENSE + */ + public const HEADER_REGEX = "(^([^()<>@,;:\\\"/[\]?={}\x01-\x20\x7F]++):[ \t]*+((?:[ \t]*+[\x21-\x7E\x80-\xFF]++)*+)[ \t]*+\r?\n)m"; + public const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)"; +} diff --git a/vendor/guzzlehttp/psr7/src/ServerRequest.php b/vendor/guzzlehttp/psr7/src/ServerRequest.php new file mode 100644 index 0000000..43cbb50 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/ServerRequest.php @@ -0,0 +1,344 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use InvalidArgumentException; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Message\StreamInterface; +use Psr\Http\Message\UploadedFileInterface; +use Psr\Http\Message\UriInterface; + +/** + * Server-side HTTP request + * + * Extends the Request definition to add methods for accessing incoming data, + * specifically server parameters, cookies, matched path parameters, query + * string arguments, body parameters, and upload file information. + * + * "Attributes" are discovered via decomposing the request (and usually + * specifically the URI path), and typically will be injected by the application. + * + * Requests are considered immutable; all methods that might change state are + * implemented such that they retain the internal state of the current + * message and return a new instance that contains the changed state. + */ +class ServerRequest extends Request implements ServerRequestInterface +{ + /** + * @var array + */ + private $attributes = []; + + /** + * @var array + */ + private $cookieParams = []; + + /** + * @var array|object|null + */ + private $parsedBody; + + /** + * @var array + */ + private $queryParams = []; + + /** + * @var array + */ + private $serverParams; + + /** + * @var array + */ + private $uploadedFiles = []; + + /** + * @param string $method HTTP method + * @param string|UriInterface $uri URI + * @param array<string, string|string[]> $headers Request headers + * @param string|resource|StreamInterface|null $body Request body + * @param string $version Protocol version + * @param array $serverParams Typically the $_SERVER superglobal + */ + public function __construct( + string $method, + $uri, + array $headers = [], + $body = null, + string $version = '1.1', + array $serverParams = [] + ) { + $this->serverParams = $serverParams; + + parent::__construct($method, $uri, $headers, $body, $version); + } + + /** + * Return an UploadedFile instance array. + * + * @param array $files An array which respect $_FILES structure + * + * @throws InvalidArgumentException for unrecognized values + */ + public static function normalizeFiles(array $files): array + { + $normalized = []; + + foreach ($files as $key => $value) { + if ($value instanceof UploadedFileInterface) { + $normalized[$key] = $value; + } elseif (is_array($value) && isset($value['tmp_name'])) { + $normalized[$key] = self::createUploadedFileFromSpec($value); + } elseif (is_array($value)) { + $normalized[$key] = self::normalizeFiles($value); + continue; + } else { + throw new InvalidArgumentException('Invalid value in files specification'); + } + } + + return $normalized; + } + + /** + * Create and return an UploadedFile instance from a $_FILES specification. + * + * If the specification represents an array of values, this method will + * delegate to normalizeNestedFileSpec() and return that return value. + * + * @param array $value $_FILES struct + * + * @return UploadedFileInterface|UploadedFileInterface[] + */ + private static function createUploadedFileFromSpec(array $value) + { + if (is_array($value['tmp_name'])) { + return self::normalizeNestedFileSpec($value); + } + + return new UploadedFile( + $value['tmp_name'], + (int) $value['size'], + (int) $value['error'], + $value['name'], + $value['type'] + ); + } + + /** + * Normalize an array of file specifications. + * + * Loops through all nested files and returns a normalized array of + * UploadedFileInterface instances. + * + * @return UploadedFileInterface[] + */ + private static function normalizeNestedFileSpec(array $files = []): array + { + $normalizedFiles = []; + + foreach (array_keys($files['tmp_name']) as $key) { + $spec = [ + 'tmp_name' => $files['tmp_name'][$key], + 'size' => $files['size'][$key], + 'error' => $files['error'][$key], + 'name' => $files['name'][$key], + 'type' => $files['type'][$key], + ]; + $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec); + } + + return $normalizedFiles; + } + + /** + * Return a ServerRequest populated with superglobals: + * $_GET + * $_POST + * $_COOKIE + * $_FILES + * $_SERVER + */ + public static function fromGlobals(): ServerRequestInterface + { + $method = $_SERVER['REQUEST_METHOD'] ?? 'GET'; + $headers = getallheaders(); + $uri = self::getUriFromGlobals(); + $body = new CachingStream(new LazyOpenStream('php://input', 'r+')); + $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1'; + + $serverRequest = new ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER); + + return $serverRequest + ->withCookieParams($_COOKIE) + ->withQueryParams($_GET) + ->withParsedBody($_POST) + ->withUploadedFiles(self::normalizeFiles($_FILES)); + } + + private static function extractHostAndPortFromAuthority(string $authority): array + { + $uri = 'http://' . $authority; + $parts = parse_url($uri); + if (false === $parts) { + return [null, null]; + } + + $host = $parts['host'] ?? null; + $port = $parts['port'] ?? null; + + return [$host, $port]; + } + + /** + * Get a Uri populated with values from $_SERVER. + */ + public static function getUriFromGlobals(): UriInterface + { + $uri = new Uri(''); + + $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http'); + + $hasPort = false; + if (isset($_SERVER['HTTP_HOST'])) { + [$host, $port] = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']); + if ($host !== null) { + $uri = $uri->withHost($host); + } + + if ($port !== null) { + $hasPort = true; + $uri = $uri->withPort($port); + } + } elseif (isset($_SERVER['SERVER_NAME'])) { + $uri = $uri->withHost($_SERVER['SERVER_NAME']); + } elseif (isset($_SERVER['SERVER_ADDR'])) { + $uri = $uri->withHost($_SERVER['SERVER_ADDR']); + } + + if (!$hasPort && isset($_SERVER['SERVER_PORT'])) { + $uri = $uri->withPort($_SERVER['SERVER_PORT']); + } + + $hasQuery = false; + if (isset($_SERVER['REQUEST_URI'])) { + $requestUriParts = explode('?', $_SERVER['REQUEST_URI'], 2); + $uri = $uri->withPath($requestUriParts[0]); + if (isset($requestUriParts[1])) { + $hasQuery = true; + $uri = $uri->withQuery($requestUriParts[1]); + } + } + + if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) { + $uri = $uri->withQuery($_SERVER['QUERY_STRING']); + } + + return $uri; + } + + public function getServerParams(): array + { + return $this->serverParams; + } + + public function getUploadedFiles(): array + { + return $this->uploadedFiles; + } + + public function withUploadedFiles(array $uploadedFiles): ServerRequestInterface + { + $new = clone $this; + $new->uploadedFiles = $uploadedFiles; + + return $new; + } + + public function getCookieParams(): array + { + return $this->cookieParams; + } + + public function withCookieParams(array $cookies): ServerRequestInterface + { + $new = clone $this; + $new->cookieParams = $cookies; + + return $new; + } + + public function getQueryParams(): array + { + return $this->queryParams; + } + + public function withQueryParams(array $query): ServerRequestInterface + { + $new = clone $this; + $new->queryParams = $query; + + return $new; + } + + /** + * {@inheritdoc} + * + * @return array|object|null + */ + public function getParsedBody() + { + return $this->parsedBody; + } + + public function withParsedBody($data): ServerRequestInterface + { + $new = clone $this; + $new->parsedBody = $data; + + return $new; + } + + public function getAttributes(): array + { + return $this->attributes; + } + + /** + * {@inheritdoc} + * + * @return mixed + */ + public function getAttribute($attribute, $default = null) + { + if (false === array_key_exists($attribute, $this->attributes)) { + return $default; + } + + return $this->attributes[$attribute]; + } + + public function withAttribute($attribute, $value): ServerRequestInterface + { + $new = clone $this; + $new->attributes[$attribute] = $value; + + return $new; + } + + public function withoutAttribute($attribute): ServerRequestInterface + { + if (false === array_key_exists($attribute, $this->attributes)) { + return $this; + } + + $new = clone $this; + unset($new->attributes[$attribute]); + + return $new; + } +} diff --git a/vendor/guzzlehttp/psr7/src/Stream.php b/vendor/guzzlehttp/psr7/src/Stream.php new file mode 100644 index 0000000..ecd3186 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Stream.php @@ -0,0 +1,282 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\StreamInterface; + +/** + * PHP stream implementation. + */ +class Stream implements StreamInterface +{ + /** + * @see http://php.net/manual/function.fopen.php + * @see http://php.net/manual/en/function.gzopen.php + */ + private const READABLE_MODES = '/r|a\+|ab\+|w\+|wb\+|x\+|xb\+|c\+|cb\+/'; + private const WRITABLE_MODES = '/a|w|r\+|rb\+|rw|x|c/'; + + /** @var resource */ + private $stream; + /** @var int|null */ + private $size; + /** @var bool */ + private $seekable; + /** @var bool */ + private $readable; + /** @var bool */ + private $writable; + /** @var string|null */ + private $uri; + /** @var mixed[] */ + private $customMetadata; + + /** + * This constructor accepts an associative array of options. + * + * - size: (int) If a read stream would otherwise have an indeterminate + * size, but the size is known due to foreknowledge, then you can + * provide that size, in bytes. + * - metadata: (array) Any additional metadata to return when the metadata + * of the stream is accessed. + * + * @param resource $stream Stream resource to wrap. + * @param array{size?: int, metadata?: array} $options Associative array of options. + * + * @throws \InvalidArgumentException if the stream is not a stream resource + */ + public function __construct($stream, array $options = []) + { + if (!is_resource($stream)) { + throw new \InvalidArgumentException('Stream must be a resource'); + } + + if (isset($options['size'])) { + $this->size = $options['size']; + } + + $this->customMetadata = $options['metadata'] ?? []; + $this->stream = $stream; + $meta = stream_get_meta_data($this->stream); + $this->seekable = $meta['seekable']; + $this->readable = (bool)preg_match(self::READABLE_MODES, $meta['mode']); + $this->writable = (bool)preg_match(self::WRITABLE_MODES, $meta['mode']); + $this->uri = $this->getMetadata('uri'); + } + + /** + * Closes the stream when the destructed + */ + public function __destruct() + { + $this->close(); + } + + public function __toString(): string + { + try { + if ($this->isSeekable()) { + $this->seek(0); + } + return $this->getContents(); + } catch (\Throwable $e) { + if (\PHP_VERSION_ID >= 70400) { + throw $e; + } + trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR); + return ''; + } + } + + public function getContents(): string + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + if (!$this->readable) { + throw new \RuntimeException('Cannot read from non-readable stream'); + } + + return Utils::tryGetContents($this->stream); + } + + public function close(): void + { + if (isset($this->stream)) { + if (is_resource($this->stream)) { + fclose($this->stream); + } + $this->detach(); + } + } + + public function detach() + { + if (!isset($this->stream)) { + return null; + } + + $result = $this->stream; + unset($this->stream); + $this->size = $this->uri = null; + $this->readable = $this->writable = $this->seekable = false; + + return $result; + } + + public function getSize(): ?int + { + if ($this->size !== null) { + return $this->size; + } + + if (!isset($this->stream)) { + return null; + } + + // Clear the stat cache if the stream has a URI + if ($this->uri) { + clearstatcache(true, $this->uri); + } + + $stats = fstat($this->stream); + if (is_array($stats) && isset($stats['size'])) { + $this->size = $stats['size']; + return $this->size; + } + + return null; + } + + public function isReadable(): bool + { + return $this->readable; + } + + public function isWritable(): bool + { + return $this->writable; + } + + public function isSeekable(): bool + { + return $this->seekable; + } + + public function eof(): bool + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + return feof($this->stream); + } + + public function tell(): int + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + + $result = ftell($this->stream); + + if ($result === false) { + throw new \RuntimeException('Unable to determine stream position'); + } + + return $result; + } + + public function rewind(): void + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET): void + { + $whence = (int) $whence; + + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + if (!$this->seekable) { + throw new \RuntimeException('Stream is not seekable'); + } + if (fseek($this->stream, $offset, $whence) === -1) { + throw new \RuntimeException('Unable to seek to stream position ' + . $offset . ' with whence ' . var_export($whence, true)); + } + } + + public function read($length): string + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + if (!$this->readable) { + throw new \RuntimeException('Cannot read from non-readable stream'); + } + if ($length < 0) { + throw new \RuntimeException('Length parameter cannot be negative'); + } + + if (0 === $length) { + return ''; + } + + try { + $string = fread($this->stream, $length); + } catch (\Exception $e) { + throw new \RuntimeException('Unable to read from stream', 0, $e); + } + + if (false === $string) { + throw new \RuntimeException('Unable to read from stream'); + } + + return $string; + } + + public function write($string): int + { + if (!isset($this->stream)) { + throw new \RuntimeException('Stream is detached'); + } + if (!$this->writable) { + throw new \RuntimeException('Cannot write to a non-writable stream'); + } + + // We can't know the size after writing anything + $this->size = null; + $result = fwrite($this->stream, $string); + + if ($result === false) { + throw new \RuntimeException('Unable to write to stream'); + } + + return $result; + } + + /** + * {@inheritdoc} + * + * @return mixed + */ + public function getMetadata($key = null) + { + if (!isset($this->stream)) { + return $key ? null : []; + } elseif (!$key) { + return $this->customMetadata + stream_get_meta_data($this->stream); + } elseif (isset($this->customMetadata[$key])) { + return $this->customMetadata[$key]; + } + + $meta = stream_get_meta_data($this->stream); + + return $meta[$key] ?? null; + } +} diff --git a/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php b/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php new file mode 100644 index 0000000..56d4104 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php @@ -0,0 +1,155 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\StreamInterface; + +/** + * Stream decorator trait + * + * @property StreamInterface $stream + */ +trait StreamDecoratorTrait +{ + /** + * @param StreamInterface $stream Stream to decorate + */ + public function __construct(StreamInterface $stream) + { + $this->stream = $stream; + } + + /** + * Magic method used to create a new stream if streams are not added in + * the constructor of a decorator (e.g., LazyOpenStream). + * + * @return StreamInterface + */ + public function __get(string $name) + { + if ($name === 'stream') { + $this->stream = $this->createStream(); + return $this->stream; + } + + throw new \UnexpectedValueException("$name not found on class"); + } + + public function __toString(): string + { + try { + if ($this->isSeekable()) { + $this->seek(0); + } + return $this->getContents(); + } catch (\Throwable $e) { + if (\PHP_VERSION_ID >= 70400) { + throw $e; + } + trigger_error(sprintf('%s::__toString exception: %s', self::class, (string) $e), E_USER_ERROR); + return ''; + } + } + + public function getContents(): string + { + return Utils::copyToString($this); + } + + /** + * Allow decorators to implement custom methods + * + * @return mixed + */ + public function __call(string $method, array $args) + { + /** @var callable $callable */ + $callable = [$this->stream, $method]; + $result = call_user_func_array($callable, $args); + + // Always return the wrapped object if the result is a return $this + return $result === $this->stream ? $this : $result; + } + + public function close(): void + { + $this->stream->close(); + } + + /** + * {@inheritdoc} + * + * @return mixed + */ + public function getMetadata($key = null) + { + return $this->stream->getMetadata($key); + } + + public function detach() + { + return $this->stream->detach(); + } + + public function getSize(): ?int + { + return $this->stream->getSize(); + } + + public function eof(): bool + { + return $this->stream->eof(); + } + + public function tell(): int + { + return $this->stream->tell(); + } + + public function isReadable(): bool + { + return $this->stream->isReadable(); + } + + public function isWritable(): bool + { + return $this->stream->isWritable(); + } + + public function isSeekable(): bool + { + return $this->stream->isSeekable(); + } + + public function rewind(): void + { + $this->seek(0); + } + + public function seek($offset, $whence = SEEK_SET): void + { + $this->stream->seek($offset, $whence); + } + + public function read($length): string + { + return $this->stream->read($length); + } + + public function write($string): int + { + return $this->stream->write($string); + } + + /** + * Implement in subclasses to dynamically create streams when requested. + * + * @throws \BadMethodCallException + */ + protected function createStream(): StreamInterface + { + throw new \BadMethodCallException('Not implemented'); + } +} diff --git a/vendor/guzzlehttp/psr7/src/StreamWrapper.php b/vendor/guzzlehttp/psr7/src/StreamWrapper.php new file mode 100644 index 0000000..2a93464 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/StreamWrapper.php @@ -0,0 +1,175 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\StreamInterface; + +/** + * Converts Guzzle streams into PHP stream resources. + * + * @see https://www.php.net/streamwrapper + */ +final class StreamWrapper +{ + /** @var resource */ + public $context; + + /** @var StreamInterface */ + private $stream; + + /** @var string r, r+, or w */ + private $mode; + + /** + * Returns a resource representing the stream. + * + * @param StreamInterface $stream The stream to get a resource for + * + * @return resource + * + * @throws \InvalidArgumentException if stream is not readable or writable + */ + public static function getResource(StreamInterface $stream) + { + self::register(); + + if ($stream->isReadable()) { + $mode = $stream->isWritable() ? 'r+' : 'r'; + } elseif ($stream->isWritable()) { + $mode = 'w'; + } else { + throw new \InvalidArgumentException('The stream must be readable, ' + . 'writable, or both.'); + } + + return fopen('guzzle://stream', $mode, false, self::createStreamContext($stream)); + } + + /** + * Creates a stream context that can be used to open a stream as a php stream resource. + * + * @return resource + */ + public static function createStreamContext(StreamInterface $stream) + { + return stream_context_create([ + 'guzzle' => ['stream' => $stream] + ]); + } + + /** + * Registers the stream wrapper if needed + */ + public static function register(): void + { + if (!in_array('guzzle', stream_get_wrappers())) { + stream_wrapper_register('guzzle', __CLASS__); + } + } + + public function stream_open(string $path, string $mode, int $options, string &$opened_path = null): bool + { + $options = stream_context_get_options($this->context); + + if (!isset($options['guzzle']['stream'])) { + return false; + } + + $this->mode = $mode; + $this->stream = $options['guzzle']['stream']; + + return true; + } + + public function stream_read(int $count): string + { + return $this->stream->read($count); + } + + public function stream_write(string $data): int + { + return $this->stream->write($data); + } + + public function stream_tell(): int + { + return $this->stream->tell(); + } + + public function stream_eof(): bool + { + return $this->stream->eof(); + } + + public function stream_seek(int $offset, int $whence): bool + { + $this->stream->seek($offset, $whence); + + return true; + } + + /** + * @return resource|false + */ + public function stream_cast(int $cast_as) + { + $stream = clone($this->stream); + $resource = $stream->detach(); + + return $resource ?? false; + } + + /** + * @return array<int|string, int> + */ + public function stream_stat(): array + { + static $modeMap = [ + 'r' => 33060, + 'rb' => 33060, + 'r+' => 33206, + 'w' => 33188, + 'wb' => 33188 + ]; + + return [ + 'dev' => 0, + 'ino' => 0, + 'mode' => $modeMap[$this->mode], + 'nlink' => 0, + 'uid' => 0, + 'gid' => 0, + 'rdev' => 0, + 'size' => $this->stream->getSize() ?: 0, + 'atime' => 0, + 'mtime' => 0, + 'ctime' => 0, + 'blksize' => 0, + 'blocks' => 0 + ]; + } + + /** + * @return array<int|string, int> + */ + public function url_stat(string $path, int $flags): array + { + return [ + 'dev' => 0, + 'ino' => 0, + 'mode' => 0, + 'nlink' => 0, + 'uid' => 0, + 'gid' => 0, + 'rdev' => 0, + 'size' => 0, + 'atime' => 0, + 'mtime' => 0, + 'ctime' => 0, + 'blksize' => 0, + 'blocks' => 0 + ]; + } +} diff --git a/vendor/guzzlehttp/psr7/src/UploadedFile.php b/vendor/guzzlehttp/psr7/src/UploadedFile.php new file mode 100644 index 0000000..b1521bc --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/UploadedFile.php @@ -0,0 +1,211 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use InvalidArgumentException; +use Psr\Http\Message\StreamInterface; +use Psr\Http\Message\UploadedFileInterface; +use RuntimeException; + +class UploadedFile implements UploadedFileInterface +{ + private const ERRORS = [ + UPLOAD_ERR_OK, + UPLOAD_ERR_INI_SIZE, + UPLOAD_ERR_FORM_SIZE, + UPLOAD_ERR_PARTIAL, + UPLOAD_ERR_NO_FILE, + UPLOAD_ERR_NO_TMP_DIR, + UPLOAD_ERR_CANT_WRITE, + UPLOAD_ERR_EXTENSION, + ]; + + /** + * @var string|null + */ + private $clientFilename; + + /** + * @var string|null + */ + private $clientMediaType; + + /** + * @var int + */ + private $error; + + /** + * @var string|null + */ + private $file; + + /** + * @var bool + */ + private $moved = false; + + /** + * @var int|null + */ + private $size; + + /** + * @var StreamInterface|null + */ + private $stream; + + /** + * @param StreamInterface|string|resource $streamOrFile + */ + public function __construct( + $streamOrFile, + ?int $size, + int $errorStatus, + string $clientFilename = null, + string $clientMediaType = null + ) { + $this->setError($errorStatus); + $this->size = $size; + $this->clientFilename = $clientFilename; + $this->clientMediaType = $clientMediaType; + + if ($this->isOk()) { + $this->setStreamOrFile($streamOrFile); + } + } + + /** + * Depending on the value set file or stream variable + * + * @param StreamInterface|string|resource $streamOrFile + * + * @throws InvalidArgumentException + */ + private function setStreamOrFile($streamOrFile): void + { + if (is_string($streamOrFile)) { + $this->file = $streamOrFile; + } elseif (is_resource($streamOrFile)) { + $this->stream = new Stream($streamOrFile); + } elseif ($streamOrFile instanceof StreamInterface) { + $this->stream = $streamOrFile; + } else { + throw new InvalidArgumentException( + 'Invalid stream or file provided for UploadedFile' + ); + } + } + + /** + * @throws InvalidArgumentException + */ + private function setError(int $error): void + { + if (false === in_array($error, UploadedFile::ERRORS, true)) { + throw new InvalidArgumentException( + 'Invalid error status for UploadedFile' + ); + } + + $this->error = $error; + } + + private function isStringNotEmpty($param): bool + { + return is_string($param) && false === empty($param); + } + + /** + * Return true if there is no upload error + */ + private function isOk(): bool + { + return $this->error === UPLOAD_ERR_OK; + } + + public function isMoved(): bool + { + return $this->moved; + } + + /** + * @throws RuntimeException if is moved or not ok + */ + private function validateActive(): void + { + if (false === $this->isOk()) { + throw new RuntimeException('Cannot retrieve stream due to upload error'); + } + + if ($this->isMoved()) { + throw new RuntimeException('Cannot retrieve stream after it has already been moved'); + } + } + + public function getStream(): StreamInterface + { + $this->validateActive(); + + if ($this->stream instanceof StreamInterface) { + return $this->stream; + } + + /** @var string $file */ + $file = $this->file; + + return new LazyOpenStream($file, 'r+'); + } + + public function moveTo($targetPath): void + { + $this->validateActive(); + + if (false === $this->isStringNotEmpty($targetPath)) { + throw new InvalidArgumentException( + 'Invalid path provided for move operation; must be a non-empty string' + ); + } + + if ($this->file) { + $this->moved = PHP_SAPI === 'cli' + ? rename($this->file, $targetPath) + : move_uploaded_file($this->file, $targetPath); + } else { + Utils::copyToStream( + $this->getStream(), + new LazyOpenStream($targetPath, 'w') + ); + + $this->moved = true; + } + + if (false === $this->moved) { + throw new RuntimeException( + sprintf('Uploaded file could not be moved to %s', $targetPath) + ); + } + } + + public function getSize(): ?int + { + return $this->size; + } + + public function getError(): int + { + return $this->error; + } + + public function getClientFilename(): ?string + { + return $this->clientFilename; + } + + public function getClientMediaType(): ?string + { + return $this->clientMediaType; + } +} diff --git a/vendor/guzzlehttp/psr7/src/Uri.php b/vendor/guzzlehttp/psr7/src/Uri.php new file mode 100644 index 0000000..09e878d --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Uri.php @@ -0,0 +1,740 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use GuzzleHttp\Psr7\Exception\MalformedUriException; +use Psr\Http\Message\UriInterface; + +/** + * PSR-7 URI implementation. + * + * @author Michael Dowling + * @author Tobias Schultze + * @author Matthew Weier O'Phinney + */ +class Uri implements UriInterface, \JsonSerializable +{ + /** + * Absolute http and https URIs require a host per RFC 7230 Section 2.7 + * but in generic URIs the host can be empty. So for http(s) URIs + * we apply this default host when no host is given yet to form a + * valid URI. + */ + private const HTTP_DEFAULT_HOST = 'localhost'; + + private const DEFAULT_PORTS = [ + 'http' => 80, + 'https' => 443, + 'ftp' => 21, + 'gopher' => 70, + 'nntp' => 119, + 'news' => 119, + 'telnet' => 23, + 'tn3270' => 23, + 'imap' => 143, + 'pop' => 110, + 'ldap' => 389, + ]; + + /** + * Unreserved characters for use in a regex. + * + * @link https://tools.ietf.org/html/rfc3986#section-2.3 + */ + private const CHAR_UNRESERVED = 'a-zA-Z0-9_\-\.~'; + + /** + * Sub-delims for use in a regex. + * + * @link https://tools.ietf.org/html/rfc3986#section-2.2 + */ + private const CHAR_SUB_DELIMS = '!\$&\'\(\)\*\+,;='; + private const QUERY_SEPARATORS_REPLACEMENT = ['=' => '%3D', '&' => '%26']; + + /** @var string Uri scheme. */ + private $scheme = ''; + + /** @var string Uri user info. */ + private $userInfo = ''; + + /** @var string Uri host. */ + private $host = ''; + + /** @var int|null Uri port. */ + private $port; + + /** @var string Uri path. */ + private $path = ''; + + /** @var string Uri query string. */ + private $query = ''; + + /** @var string Uri fragment. */ + private $fragment = ''; + + /** @var string|null String representation */ + private $composedComponents; + + public function __construct(string $uri = '') + { + if ($uri !== '') { + $parts = self::parse($uri); + if ($parts === false) { + throw new MalformedUriException("Unable to parse URI: $uri"); + } + $this->applyParts($parts); + } + } + /** + * UTF-8 aware \parse_url() replacement. + * + * The internal function produces broken output for non ASCII domain names + * (IDN) when used with locales other than "C". + * + * On the other hand, cURL understands IDN correctly only when UTF-8 locale + * is configured ("C.UTF-8", "en_US.UTF-8", etc.). + * + * @see https://bugs.php.net/bug.php?id=52923 + * @see https://www.php.net/manual/en/function.parse-url.php#114817 + * @see https://curl.haxx.se/libcurl/c/CURLOPT_URL.html#ENCODING + * + * @return array|false + */ + private static function parse(string $url) + { + // If IPv6 + $prefix = ''; + if (preg_match('%^(.*://\[[0-9:a-f]+\])(.*?)$%', $url, $matches)) { + /** @var array{0:string, 1:string, 2:string} $matches */ + $prefix = $matches[1]; + $url = $matches[2]; + } + + /** @var string */ + $encodedUrl = preg_replace_callback( + '%[^:/@?&=#]+%usD', + static function ($matches) { + return urlencode($matches[0]); + }, + $url + ); + + $result = parse_url($prefix . $encodedUrl); + + if ($result === false) { + return false; + } + + return array_map('urldecode', $result); + } + + public function __toString(): string + { + if ($this->composedComponents === null) { + $this->composedComponents = self::composeComponents( + $this->scheme, + $this->getAuthority(), + $this->path, + $this->query, + $this->fragment + ); + } + + return $this->composedComponents; + } + + /** + * Composes a URI reference string from its various components. + * + * Usually this method does not need to be called manually but instead is used indirectly via + * `Psr\Http\Message\UriInterface::__toString`. + * + * PSR-7 UriInterface treats an empty component the same as a missing component as + * getQuery(), getFragment() etc. always return a string. This explains the slight + * difference to RFC 3986 Section 5.3. + * + * Another adjustment is that the authority separator is added even when the authority is missing/empty + * for the "file" scheme. This is because PHP stream functions like `file_get_contents` only work with + * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But + * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to + * that format). + * + * @link https://tools.ietf.org/html/rfc3986#section-5.3 + */ + public static function composeComponents(?string $scheme, ?string $authority, string $path, ?string $query, ?string $fragment): string + { + $uri = ''; + + // weak type checks to also accept null until we can add scalar type hints + if ($scheme != '') { + $uri .= $scheme . ':'; + } + + if ($authority != '' || $scheme === 'file') { + $uri .= '//' . $authority; + } + + if ($authority != '' && $path != '' && $path[0] != '/') { + $path = '/' . $path; + } + + $uri .= $path; + + if ($query != '') { + $uri .= '?' . $query; + } + + if ($fragment != '') { + $uri .= '#' . $fragment; + } + + return $uri; + } + + /** + * Whether the URI has the default port of the current scheme. + * + * `Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used + * independently of the implementation. + */ + public static function isDefaultPort(UriInterface $uri): bool + { + return $uri->getPort() === null + || (isset(self::DEFAULT_PORTS[$uri->getScheme()]) && $uri->getPort() === self::DEFAULT_PORTS[$uri->getScheme()]); + } + + /** + * Whether the URI is absolute, i.e. it has a scheme. + * + * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true + * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative + * to another URI, the base URI. Relative references can be divided into several forms: + * - network-path references, e.g. '//example.com/path' + * - absolute-path references, e.g. '/path' + * - relative-path references, e.g. 'subpath' + * + * @see Uri::isNetworkPathReference + * @see Uri::isAbsolutePathReference + * @see Uri::isRelativePathReference + * @link https://tools.ietf.org/html/rfc3986#section-4 + */ + public static function isAbsolute(UriInterface $uri): bool + { + return $uri->getScheme() !== ''; + } + + /** + * Whether the URI is a network-path reference. + * + * A relative reference that begins with two slash characters is termed an network-path reference. + * + * @link https://tools.ietf.org/html/rfc3986#section-4.2 + */ + public static function isNetworkPathReference(UriInterface $uri): bool + { + return $uri->getScheme() === '' && $uri->getAuthority() !== ''; + } + + /** + * Whether the URI is a absolute-path reference. + * + * A relative reference that begins with a single slash character is termed an absolute-path reference. + * + * @link https://tools.ietf.org/html/rfc3986#section-4.2 + */ + public static function isAbsolutePathReference(UriInterface $uri): bool + { + return $uri->getScheme() === '' + && $uri->getAuthority() === '' + && isset($uri->getPath()[0]) + && $uri->getPath()[0] === '/'; + } + + /** + * Whether the URI is a relative-path reference. + * + * A relative reference that does not begin with a slash character is termed a relative-path reference. + * + * @link https://tools.ietf.org/html/rfc3986#section-4.2 + */ + public static function isRelativePathReference(UriInterface $uri): bool + { + return $uri->getScheme() === '' + && $uri->getAuthority() === '' + && (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/'); + } + + /** + * Whether the URI is a same-document reference. + * + * A same-document reference refers to a URI that is, aside from its fragment + * component, identical to the base URI. When no base URI is given, only an empty + * URI reference (apart from its fragment) is considered a same-document reference. + * + * @param UriInterface $uri The URI to check + * @param UriInterface|null $base An optional base URI to compare against + * + * @link https://tools.ietf.org/html/rfc3986#section-4.4 + */ + public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool + { + if ($base !== null) { + $uri = UriResolver::resolve($base, $uri); + + return ($uri->getScheme() === $base->getScheme()) + && ($uri->getAuthority() === $base->getAuthority()) + && ($uri->getPath() === $base->getPath()) + && ($uri->getQuery() === $base->getQuery()); + } + + return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === ''; + } + + /** + * Creates a new URI with a specific query string value removed. + * + * Any existing query string values that exactly match the provided key are + * removed. + * + * @param UriInterface $uri URI to use as a base. + * @param string $key Query string key to remove. + */ + public static function withoutQueryValue(UriInterface $uri, string $key): UriInterface + { + $result = self::getFilteredQueryString($uri, [$key]); + + return $uri->withQuery(implode('&', $result)); + } + + /** + * Creates a new URI with a specific query string value. + * + * Any existing query string values that exactly match the provided key are + * removed and replaced with the given key value pair. + * + * A value of null will set the query string key without a value, e.g. "key" + * instead of "key=value". + * + * @param UriInterface $uri URI to use as a base. + * @param string $key Key to set. + * @param string|null $value Value to set + */ + public static function withQueryValue(UriInterface $uri, string $key, ?string $value): UriInterface + { + $result = self::getFilteredQueryString($uri, [$key]); + + $result[] = self::generateQueryString($key, $value); + + return $uri->withQuery(implode('&', $result)); + } + + /** + * Creates a new URI with multiple specific query string values. + * + * It has the same behavior as withQueryValue() but for an associative array of key => value. + * + * @param UriInterface $uri URI to use as a base. + * @param array<string, string|null> $keyValueArray Associative array of key and values + */ + public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface + { + $result = self::getFilteredQueryString($uri, array_keys($keyValueArray)); + + foreach ($keyValueArray as $key => $value) { + $result[] = self::generateQueryString((string) $key, $value !== null ? (string) $value : null); + } + + return $uri->withQuery(implode('&', $result)); + } + + /** + * Creates a URI from a hash of `parse_url` components. + * + * @link http://php.net/manual/en/function.parse-url.php + * + * @throws MalformedUriException If the components do not form a valid URI. + */ + public static function fromParts(array $parts): UriInterface + { + $uri = new self(); + $uri->applyParts($parts); + $uri->validateState(); + + return $uri; + } + + public function getScheme(): string + { + return $this->scheme; + } + + public function getAuthority(): string + { + $authority = $this->host; + if ($this->userInfo !== '') { + $authority = $this->userInfo . '@' . $authority; + } + + if ($this->port !== null) { + $authority .= ':' . $this->port; + } + + return $authority; + } + + public function getUserInfo(): string + { + return $this->userInfo; + } + + public function getHost(): string + { + return $this->host; + } + + public function getPort(): ?int + { + return $this->port; + } + + public function getPath(): string + { + return $this->path; + } + + public function getQuery(): string + { + return $this->query; + } + + public function getFragment(): string + { + return $this->fragment; + } + + public function withScheme($scheme): UriInterface + { + $scheme = $this->filterScheme($scheme); + + if ($this->scheme === $scheme) { + return $this; + } + + $new = clone $this; + $new->scheme = $scheme; + $new->composedComponents = null; + $new->removeDefaultPort(); + $new->validateState(); + + return $new; + } + + public function withUserInfo($user, $password = null): UriInterface + { + $info = $this->filterUserInfoComponent($user); + if ($password !== null) { + $info .= ':' . $this->filterUserInfoComponent($password); + } + + if ($this->userInfo === $info) { + return $this; + } + + $new = clone $this; + $new->userInfo = $info; + $new->composedComponents = null; + $new->validateState(); + + return $new; + } + + public function withHost($host): UriInterface + { + $host = $this->filterHost($host); + + if ($this->host === $host) { + return $this; + } + + $new = clone $this; + $new->host = $host; + $new->composedComponents = null; + $new->validateState(); + + return $new; + } + + public function withPort($port): UriInterface + { + $port = $this->filterPort($port); + + if ($this->port === $port) { + return $this; + } + + $new = clone $this; + $new->port = $port; + $new->composedComponents = null; + $new->removeDefaultPort(); + $new->validateState(); + + return $new; + } + + public function withPath($path): UriInterface + { + $path = $this->filterPath($path); + + if ($this->path === $path) { + return $this; + } + + $new = clone $this; + $new->path = $path; + $new->composedComponents = null; + $new->validateState(); + + return $new; + } + + public function withQuery($query): UriInterface + { + $query = $this->filterQueryAndFragment($query); + + if ($this->query === $query) { + return $this; + } + + $new = clone $this; + $new->query = $query; + $new->composedComponents = null; + + return $new; + } + + public function withFragment($fragment): UriInterface + { + $fragment = $this->filterQueryAndFragment($fragment); + + if ($this->fragment === $fragment) { + return $this; + } + + $new = clone $this; + $new->fragment = $fragment; + $new->composedComponents = null; + + return $new; + } + + public function jsonSerialize(): string + { + return $this->__toString(); + } + + /** + * Apply parse_url parts to a URI. + * + * @param array $parts Array of parse_url parts to apply. + */ + private function applyParts(array $parts): void + { + $this->scheme = isset($parts['scheme']) + ? $this->filterScheme($parts['scheme']) + : ''; + $this->userInfo = isset($parts['user']) + ? $this->filterUserInfoComponent($parts['user']) + : ''; + $this->host = isset($parts['host']) + ? $this->filterHost($parts['host']) + : ''; + $this->port = isset($parts['port']) + ? $this->filterPort($parts['port']) + : null; + $this->path = isset($parts['path']) + ? $this->filterPath($parts['path']) + : ''; + $this->query = isset($parts['query']) + ? $this->filterQueryAndFragment($parts['query']) + : ''; + $this->fragment = isset($parts['fragment']) + ? $this->filterQueryAndFragment($parts['fragment']) + : ''; + if (isset($parts['pass'])) { + $this->userInfo .= ':' . $this->filterUserInfoComponent($parts['pass']); + } + + $this->removeDefaultPort(); + } + + /** + * @param mixed $scheme + * + * @throws \InvalidArgumentException If the scheme is invalid. + */ + private function filterScheme($scheme): string + { + if (!is_string($scheme)) { + throw new \InvalidArgumentException('Scheme must be a string'); + } + + return \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); + } + + /** + * @param mixed $component + * + * @throws \InvalidArgumentException If the user info is invalid. + */ + private function filterUserInfoComponent($component): string + { + if (!is_string($component)) { + throw new \InvalidArgumentException('User info must be a string'); + } + + return preg_replace_callback( + '/(?:[^%' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . ']+|%(?![A-Fa-f0-9]{2}))/', + [$this, 'rawurlencodeMatchZero'], + $component + ); + } + + /** + * @param mixed $host + * + * @throws \InvalidArgumentException If the host is invalid. + */ + private function filterHost($host): string + { + if (!is_string($host)) { + throw new \InvalidArgumentException('Host must be a string'); + } + + return \strtr($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); + } + + /** + * @param mixed $port + * + * @throws \InvalidArgumentException If the port is invalid. + */ + private function filterPort($port): ?int + { + if ($port === null) { + return null; + } + + $port = (int) $port; + if (0 > $port || 0xffff < $port) { + throw new \InvalidArgumentException( + sprintf('Invalid port: %d. Must be between 0 and 65535', $port) + ); + } + + return $port; + } + + /** + * @param string[] $keys + * + * @return string[] + */ + private static function getFilteredQueryString(UriInterface $uri, array $keys): array + { + $current = $uri->getQuery(); + + if ($current === '') { + return []; + } + + $decodedKeys = array_map('rawurldecode', $keys); + + return array_filter(explode('&', $current), function ($part) use ($decodedKeys) { + return !in_array(rawurldecode(explode('=', $part)[0]), $decodedKeys, true); + }); + } + + private static function generateQueryString(string $key, ?string $value): string + { + // Query string separators ("=", "&") within the key or value need to be encoded + // (while preventing double-encoding) before setting the query string. All other + // chars that need percent-encoding will be encoded by withQuery(). + $queryString = strtr($key, self::QUERY_SEPARATORS_REPLACEMENT); + + if ($value !== null) { + $queryString .= '=' . strtr($value, self::QUERY_SEPARATORS_REPLACEMENT); + } + + return $queryString; + } + + private function removeDefaultPort(): void + { + if ($this->port !== null && self::isDefaultPort($this)) { + $this->port = null; + } + } + + /** + * Filters the path of a URI + * + * @param mixed $path + * + * @throws \InvalidArgumentException If the path is invalid. + */ + private function filterPath($path): string + { + if (!is_string($path)) { + throw new \InvalidArgumentException('Path must be a string'); + } + + return preg_replace_callback( + '/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\/]++|%(?![A-Fa-f0-9]{2}))/', + [$this, 'rawurlencodeMatchZero'], + $path + ); + } + + /** + * Filters the query string or fragment of a URI. + * + * @param mixed $str + * + * @throws \InvalidArgumentException If the query or fragment is invalid. + */ + private function filterQueryAndFragment($str): string + { + if (!is_string($str)) { + throw new \InvalidArgumentException('Query and fragment must be a string'); + } + + return preg_replace_callback( + '/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\/\?]++|%(?![A-Fa-f0-9]{2}))/', + [$this, 'rawurlencodeMatchZero'], + $str + ); + } + + private function rawurlencodeMatchZero(array $match): string + { + return rawurlencode($match[0]); + } + + private function validateState(): void + { + if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) { + $this->host = self::HTTP_DEFAULT_HOST; + } + + if ($this->getAuthority() === '') { + if (0 === strpos($this->path, '//')) { + throw new MalformedUriException('The path of a URI without an authority must not start with two slashes "//"'); + } + if ($this->scheme === '' && false !== strpos(explode('/', $this->path, 2)[0], ':')) { + throw new MalformedUriException('A relative URI must not have a path beginning with a segment containing a colon'); + } + } + } +} diff --git a/vendor/guzzlehttp/psr7/src/UriComparator.php b/vendor/guzzlehttp/psr7/src/UriComparator.php new file mode 100644 index 0000000..70c582a --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/UriComparator.php @@ -0,0 +1,52 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\UriInterface; + +/** + * Provides methods to determine if a modified URL should be considered cross-origin. + * + * @author Graham Campbell + */ +final class UriComparator +{ + /** + * Determines if a modified URL should be considered cross-origin with + * respect to an original URL. + */ + public static function isCrossOrigin(UriInterface $original, UriInterface $modified): bool + { + if (\strcasecmp($original->getHost(), $modified->getHost()) !== 0) { + return true; + } + + if ($original->getScheme() !== $modified->getScheme()) { + return true; + } + + if (self::computePort($original) !== self::computePort($modified)) { + return true; + } + + return false; + } + + private static function computePort(UriInterface $uri): int + { + $port = $uri->getPort(); + + if (null !== $port) { + return $port; + } + + return 'https' === $uri->getScheme() ? 443 : 80; + } + + private function __construct() + { + // cannot be instantiated + } +} diff --git a/vendor/guzzlehttp/psr7/src/UriNormalizer.php b/vendor/guzzlehttp/psr7/src/UriNormalizer.php new file mode 100644 index 0000000..e12971e --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/UriNormalizer.php @@ -0,0 +1,220 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\UriInterface; + +/** + * Provides methods to normalize and compare URIs. + * + * @author Tobias Schultze + * + * @link https://tools.ietf.org/html/rfc3986#section-6 + */ +final class UriNormalizer +{ + /** + * Default normalizations which only include the ones that preserve semantics. + */ + public const PRESERVING_NORMALIZATIONS = + self::CAPITALIZE_PERCENT_ENCODING | + self::DECODE_UNRESERVED_CHARACTERS | + self::CONVERT_EMPTY_PATH | + self::REMOVE_DEFAULT_HOST | + self::REMOVE_DEFAULT_PORT | + self::REMOVE_DOT_SEGMENTS; + + /** + * All letters within a percent-encoding triplet (e.g., "%3A") are case-insensitive, and should be capitalized. + * + * Example: http://example.org/a%c2%b1b → http://example.org/a%C2%B1b + */ + public const CAPITALIZE_PERCENT_ENCODING = 1; + + /** + * Decodes percent-encoded octets of unreserved characters. + * + * For consistency, percent-encoded octets in the ranges of ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39), + * hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should not be created by URI producers and, + * when found in a URI, should be decoded to their corresponding unreserved characters by URI normalizers. + * + * Example: http://example.org/%7Eusern%61me/ → http://example.org/~username/ + */ + public const DECODE_UNRESERVED_CHARACTERS = 2; + + /** + * Converts the empty path to "/" for http and https URIs. + * + * Example: http://example.org → http://example.org/ + */ + public const CONVERT_EMPTY_PATH = 4; + + /** + * Removes the default host of the given URI scheme from the URI. + * + * Only the "file" scheme defines the default host "localhost". + * All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile` + * are equivalent according to RFC 3986. The first format is not accepted + * by PHPs stream functions and thus already normalized implicitly to the + * second format in the Uri class. See `GuzzleHttp\Psr7\Uri::composeComponents`. + * + * Example: file://localhost/myfile → file:///myfile + */ + public const REMOVE_DEFAULT_HOST = 8; + + /** + * Removes the default port of the given URI scheme from the URI. + * + * Example: http://example.org:80/ → http://example.org/ + */ + public const REMOVE_DEFAULT_PORT = 16; + + /** + * Removes unnecessary dot-segments. + * + * Dot-segments in relative-path references are not removed as it would + * change the semantics of the URI reference. + * + * Example: http://example.org/../a/b/../c/./d.html → http://example.org/a/c/d.html + */ + public const REMOVE_DOT_SEGMENTS = 32; + + /** + * Paths which include two or more adjacent slashes are converted to one. + * + * Webservers usually ignore duplicate slashes and treat those URIs equivalent. + * But in theory those URIs do not need to be equivalent. So this normalization + * may change the semantics. Encoded slashes (%2F) are not removed. + * + * Example: http://example.org//foo///bar.html → http://example.org/foo/bar.html + */ + public const REMOVE_DUPLICATE_SLASHES = 64; + + /** + * Sort query parameters with their values in alphabetical order. + * + * However, the order of parameters in a URI may be significant (this is not defined by the standard). + * So this normalization is not safe and may change the semantics of the URI. + * + * Example: ?lang=en&article=fred → ?article=fred&lang=en + * + * Note: The sorting is neither locale nor Unicode aware (the URI query does not get decoded at all) as the + * purpose is to be able to compare URIs in a reproducible way, not to have the params sorted perfectly. + */ + public const SORT_QUERY_PARAMETERS = 128; + + /** + * Returns a normalized URI. + * + * The scheme and host component are already normalized to lowercase per PSR-7 UriInterface. + * This methods adds additional normalizations that can be configured with the $flags parameter. + * + * PSR-7 UriInterface cannot distinguish between an empty component and a missing component as + * getQuery(), getFragment() etc. always return a string. This means the URIs "/?#" and "/" are + * treated equivalent which is not necessarily true according to RFC 3986. But that difference + * is highly uncommon in reality. So this potential normalization is implied in PSR-7 as well. + * + * @param UriInterface $uri The URI to normalize + * @param int $flags A bitmask of normalizations to apply, see constants + * + * @link https://tools.ietf.org/html/rfc3986#section-6.2 + */ + public static function normalize(UriInterface $uri, int $flags = self::PRESERVING_NORMALIZATIONS): UriInterface + { + if ($flags & self::CAPITALIZE_PERCENT_ENCODING) { + $uri = self::capitalizePercentEncoding($uri); + } + + if ($flags & self::DECODE_UNRESERVED_CHARACTERS) { + $uri = self::decodeUnreservedCharacters($uri); + } + + if ($flags & self::CONVERT_EMPTY_PATH && $uri->getPath() === '' && + ($uri->getScheme() === 'http' || $uri->getScheme() === 'https') + ) { + $uri = $uri->withPath('/'); + } + + if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') { + $uri = $uri->withHost(''); + } + + if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) { + $uri = $uri->withPort(null); + } + + if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) { + $uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath())); + } + + if ($flags & self::REMOVE_DUPLICATE_SLASHES) { + $uri = $uri->withPath(preg_replace('#//++#', '/', $uri->getPath())); + } + + if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') { + $queryKeyValues = explode('&', $uri->getQuery()); + sort($queryKeyValues); + $uri = $uri->withQuery(implode('&', $queryKeyValues)); + } + + return $uri; + } + + /** + * Whether two URIs can be considered equivalent. + * + * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also + * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be + * resolved against the same base URI. If this is not the case, determination of equivalence or difference of + * relative references does not mean anything. + * + * @param UriInterface $uri1 An URI to compare + * @param UriInterface $uri2 An URI to compare + * @param int $normalizations A bitmask of normalizations to apply, see constants + * + * @link https://tools.ietf.org/html/rfc3986#section-6.1 + */ + public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, int $normalizations = self::PRESERVING_NORMALIZATIONS): bool + { + return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations); + } + + private static function capitalizePercentEncoding(UriInterface $uri): UriInterface + { + $regex = '/(?:%[A-Fa-f0-9]{2})++/'; + + $callback = function (array $match) { + return strtoupper($match[0]); + }; + + return + $uri->withPath( + preg_replace_callback($regex, $callback, $uri->getPath()) + )->withQuery( + preg_replace_callback($regex, $callback, $uri->getQuery()) + ); + } + + private static function decodeUnreservedCharacters(UriInterface $uri): UriInterface + { + $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i'; + + $callback = function (array $match) { + return rawurldecode($match[0]); + }; + + return + $uri->withPath( + preg_replace_callback($regex, $callback, $uri->getPath()) + )->withQuery( + preg_replace_callback($regex, $callback, $uri->getQuery()) + ); + } + + private function __construct() + { + // cannot be instantiated + } +} diff --git a/vendor/guzzlehttp/psr7/src/UriResolver.php b/vendor/guzzlehttp/psr7/src/UriResolver.php new file mode 100644 index 0000000..426e5c9 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/UriResolver.php @@ -0,0 +1,211 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\UriInterface; + +/** + * Resolves a URI reference in the context of a base URI and the opposite way. + * + * @author Tobias Schultze + * + * @link https://tools.ietf.org/html/rfc3986#section-5 + */ +final class UriResolver +{ + /** + * Removes dot segments from a path and returns the new path. + * + * @link http://tools.ietf.org/html/rfc3986#section-5.2.4 + */ + public static function removeDotSegments(string $path): string + { + if ($path === '' || $path === '/') { + return $path; + } + + $results = []; + $segments = explode('/', $path); + foreach ($segments as $segment) { + if ($segment === '..') { + array_pop($results); + } elseif ($segment !== '.') { + $results[] = $segment; + } + } + + $newPath = implode('/', $results); + + if ($path[0] === '/' && (!isset($newPath[0]) || $newPath[0] !== '/')) { + // Re-add the leading slash if necessary for cases like "/.." + $newPath = '/' . $newPath; + } elseif ($newPath !== '' && ($segment === '.' || $segment === '..')) { + // Add the trailing slash if necessary + // If newPath is not empty, then $segment must be set and is the last segment from the foreach + $newPath .= '/'; + } + + return $newPath; + } + + /** + * Converts the relative URI into a new URI that is resolved against the base URI. + * + * @link http://tools.ietf.org/html/rfc3986#section-5.2 + */ + public static function resolve(UriInterface $base, UriInterface $rel): UriInterface + { + if ((string) $rel === '') { + // we can simply return the same base URI instance for this same-document reference + return $base; + } + + if ($rel->getScheme() != '') { + return $rel->withPath(self::removeDotSegments($rel->getPath())); + } + + if ($rel->getAuthority() != '') { + $targetAuthority = $rel->getAuthority(); + $targetPath = self::removeDotSegments($rel->getPath()); + $targetQuery = $rel->getQuery(); + } else { + $targetAuthority = $base->getAuthority(); + if ($rel->getPath() === '') { + $targetPath = $base->getPath(); + $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery(); + } else { + if ($rel->getPath()[0] === '/') { + $targetPath = $rel->getPath(); + } else { + if ($targetAuthority != '' && $base->getPath() === '') { + $targetPath = '/' . $rel->getPath(); + } else { + $lastSlashPos = strrpos($base->getPath(), '/'); + if ($lastSlashPos === false) { + $targetPath = $rel->getPath(); + } else { + $targetPath = substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath(); + } + } + } + $targetPath = self::removeDotSegments($targetPath); + $targetQuery = $rel->getQuery(); + } + } + + return new Uri(Uri::composeComponents( + $base->getScheme(), + $targetAuthority, + $targetPath, + $targetQuery, + $rel->getFragment() + )); + } + + /** + * Returns the target URI as a relative reference from the base URI. + * + * This method is the counterpart to resolve(): + * + * (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target)) + * + * One use-case is to use the current request URI as base URI and then generate relative links in your documents + * to reduce the document size or offer self-contained downloadable document archives. + * + * $base = new Uri('http://example.com/a/b/'); + * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'. + * echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'. + * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'. + * echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'. + * + * This method also accepts a target that is already relative and will try to relativize it further. Only a + * relative-path reference will be returned as-is. + * + * echo UriResolver::relativize($base, new Uri('/a/b/c')); // prints 'c' as well + */ + public static function relativize(UriInterface $base, UriInterface $target): UriInterface + { + if ($target->getScheme() !== '' && + ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '') + ) { + return $target; + } + + if (Uri::isRelativePathReference($target)) { + // As the target is already highly relative we return it as-is. It would be possible to resolve + // the target with `$target = self::resolve($base, $target);` and then try make it more relative + // by removing a duplicate query. But let's not do that automatically. + return $target; + } + + if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) { + return $target->withScheme(''); + } + + // We must remove the path before removing the authority because if the path starts with two slashes, the URI + // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also + // invalid. + $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost(''); + + if ($base->getPath() !== $target->getPath()) { + return $emptyPathUri->withPath(self::getRelativePath($base, $target)); + } + + if ($base->getQuery() === $target->getQuery()) { + // Only the target fragment is left. And it must be returned even if base and target fragment are the same. + return $emptyPathUri->withQuery(''); + } + + // If the base URI has a query but the target has none, we cannot return an empty path reference as it would + // inherit the base query component when resolving. + if ($target->getQuery() === '') { + $segments = explode('/', $target->getPath()); + /** @var string $lastSegment */ + $lastSegment = end($segments); + + return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment); + } + + return $emptyPathUri; + } + + private static function getRelativePath(UriInterface $base, UriInterface $target): string + { + $sourceSegments = explode('/', $base->getPath()); + $targetSegments = explode('/', $target->getPath()); + array_pop($sourceSegments); + $targetLastSegment = array_pop($targetSegments); + foreach ($sourceSegments as $i => $segment) { + if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) { + unset($sourceSegments[$i], $targetSegments[$i]); + } else { + break; + } + } + $targetSegments[] = $targetLastSegment; + $relativePath = str_repeat('../', count($sourceSegments)) . implode('/', $targetSegments); + + // A reference to am empty last segment or an empty first sub-segment must be prefixed with "./". + // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used + // as the first segment of a relative-path reference, as it would be mistaken for a scheme name. + if ('' === $relativePath || false !== strpos(explode('/', $relativePath, 2)[0], ':')) { + $relativePath = "./$relativePath"; + } elseif ('/' === $relativePath[0]) { + if ($base->getAuthority() != '' && $base->getPath() === '') { + // In this case an extra slash is added by resolve() automatically. So we must not add one here. + $relativePath = ".$relativePath"; + } else { + $relativePath = "./$relativePath"; + } + } + + return $relativePath; + } + + private function __construct() + { + // cannot be instantiated + } +} diff --git a/vendor/guzzlehttp/psr7/src/Utils.php b/vendor/guzzlehttp/psr7/src/Utils.php new file mode 100644 index 0000000..3a4cf39 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Utils.php @@ -0,0 +1,459 @@ +<?php + +declare(strict_types=1); + +namespace GuzzleHttp\Psr7; + +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Message\StreamInterface; +use Psr\Http\Message\UriInterface; + +final class Utils +{ + /** + * Remove the items given by the keys, case insensitively from the data. + * + * @param string[] $keys + */ + public static function caselessRemove(array $keys, array $data): array + { + $result = []; + + foreach ($keys as &$key) { + $key = strtolower($key); + } + + foreach ($data as $k => $v) { + if (!is_string($k) || !in_array(strtolower($k), $keys)) { + $result[$k] = $v; + } + } + + return $result; + } + + /** + * Copy the contents of a stream into another stream until the given number + * of bytes have been read. + * + * @param StreamInterface $source Stream to read from + * @param StreamInterface $dest Stream to write to + * @param int $maxLen Maximum number of bytes to read. Pass -1 + * to read the entire stream. + * + * @throws \RuntimeException on error. + */ + public static function copyToStream(StreamInterface $source, StreamInterface $dest, int $maxLen = -1): void + { + $bufferSize = 8192; + + if ($maxLen === -1) { + while (!$source->eof()) { + if (!$dest->write($source->read($bufferSize))) { + break; + } + } + } else { + $remaining = $maxLen; + while ($remaining > 0 && !$source->eof()) { + $buf = $source->read(min($bufferSize, $remaining)); + $len = strlen($buf); + if (!$len) { + break; + } + $remaining -= $len; + $dest->write($buf); + } + } + } + + /** + * Copy the contents of a stream into a string until the given number of + * bytes have been read. + * + * @param StreamInterface $stream Stream to read + * @param int $maxLen Maximum number of bytes to read. Pass -1 + * to read the entire stream. + * + * @throws \RuntimeException on error. + */ + public static function copyToString(StreamInterface $stream, int $maxLen = -1): string + { + $buffer = ''; + + if ($maxLen === -1) { + while (!$stream->eof()) { + $buf = $stream->read(1048576); + if ($buf === '') { + break; + } + $buffer .= $buf; + } + return $buffer; + } + + $len = 0; + while (!$stream->eof() && $len < $maxLen) { + $buf = $stream->read($maxLen - $len); + if ($buf === '') { + break; + } + $buffer .= $buf; + $len = strlen($buffer); + } + + return $buffer; + } + + /** + * Calculate a hash of a stream. + * + * This method reads the entire stream to calculate a rolling hash, based + * on PHP's `hash_init` functions. + * + * @param StreamInterface $stream Stream to calculate the hash for + * @param string $algo Hash algorithm (e.g. md5, crc32, etc) + * @param bool $rawOutput Whether or not to use raw output + * + * @throws \RuntimeException on error. + */ + public static function hash(StreamInterface $stream, string $algo, bool $rawOutput = false): string + { + $pos = $stream->tell(); + + if ($pos > 0) { + $stream->rewind(); + } + + $ctx = hash_init($algo); + while (!$stream->eof()) { + hash_update($ctx, $stream->read(1048576)); + } + + $out = hash_final($ctx, $rawOutput); + $stream->seek($pos); + + return $out; + } + + /** + * Clone and modify a request with the given changes. + * + * This method is useful for reducing the number of clones needed to mutate + * a message. + * + * The changes can be one of: + * - method: (string) Changes the HTTP method. + * - set_headers: (array) Sets the given headers. + * - remove_headers: (array) Remove the given headers. + * - body: (mixed) Sets the given body. + * - uri: (UriInterface) Set the URI. + * - query: (string) Set the query string value of the URI. + * - version: (string) Set the protocol version. + * + * @param RequestInterface $request Request to clone and modify. + * @param array $changes Changes to apply. + */ + public static function modifyRequest(RequestInterface $request, array $changes): RequestInterface + { + if (!$changes) { + return $request; + } + + $headers = $request->getHeaders(); + + if (!isset($changes['uri'])) { + $uri = $request->getUri(); + } else { + // Remove the host header if one is on the URI + if ($host = $changes['uri']->getHost()) { + $changes['set_headers']['Host'] = $host; + + if ($port = $changes['uri']->getPort()) { + $standardPorts = ['http' => 80, 'https' => 443]; + $scheme = $changes['uri']->getScheme(); + if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) { + $changes['set_headers']['Host'] .= ':' . $port; + } + } + } + $uri = $changes['uri']; + } + + if (!empty($changes['remove_headers'])) { + $headers = self::caselessRemove($changes['remove_headers'], $headers); + } + + if (!empty($changes['set_headers'])) { + $headers = self::caselessRemove(array_keys($changes['set_headers']), $headers); + $headers = $changes['set_headers'] + $headers; + } + + if (isset($changes['query'])) { + $uri = $uri->withQuery($changes['query']); + } + + if ($request instanceof ServerRequestInterface) { + $new = (new ServerRequest( + $changes['method'] ?? $request->getMethod(), + $uri, + $headers, + $changes['body'] ?? $request->getBody(), + $changes['version'] ?? $request->getProtocolVersion(), + $request->getServerParams() + )) + ->withParsedBody($request->getParsedBody()) + ->withQueryParams($request->getQueryParams()) + ->withCookieParams($request->getCookieParams()) + ->withUploadedFiles($request->getUploadedFiles()); + + foreach ($request->getAttributes() as $key => $value) { + $new = $new->withAttribute($key, $value); + } + + return $new; + } + + return new Request( + $changes['method'] ?? $request->getMethod(), + $uri, + $headers, + $changes['body'] ?? $request->getBody(), + $changes['version'] ?? $request->getProtocolVersion() + ); + } + + /** + * Read a line from the stream up to the maximum allowed buffer length. + * + * @param StreamInterface $stream Stream to read from + * @param int|null $maxLength Maximum buffer length + */ + public static function readLine(StreamInterface $stream, ?int $maxLength = null): string + { + $buffer = ''; + $size = 0; + + while (!$stream->eof()) { + if ('' === ($byte = $stream->read(1))) { + return $buffer; + } + $buffer .= $byte; + // Break when a new line is found or the max length - 1 is reached + if ($byte === "\n" || ++$size === $maxLength - 1) { + break; + } + } + + return $buffer; + } + + /** + * Create a new stream based on the input type. + * + * Options is an associative array that can contain the following keys: + * - metadata: Array of custom metadata. + * - size: Size of the stream. + * + * This method accepts the following `$resource` types: + * - `Psr\Http\Message\StreamInterface`: Returns the value as-is. + * - `string`: Creates a stream object that uses the given string as the contents. + * - `resource`: Creates a stream object that wraps the given PHP stream resource. + * - `Iterator`: If the provided value implements `Iterator`, then a read-only + * stream object will be created that wraps the given iterable. Each time the + * stream is read from, data from the iterator will fill a buffer and will be + * continuously called until the buffer is equal to the requested read size. + * Subsequent read calls will first read from the buffer and then call `next` + * on the underlying iterator until it is exhausted. + * - `object` with `__toString()`: If the object has the `__toString()` method, + * the object will be cast to a string and then a stream will be returned that + * uses the string value. + * - `NULL`: When `null` is passed, an empty stream object is returned. + * - `callable` When a callable is passed, a read-only stream object will be + * created that invokes the given callable. The callable is invoked with the + * number of suggested bytes to read. The callable can return any number of + * bytes, but MUST return `false` when there is no more data to return. The + * stream object that wraps the callable will invoke the callable until the + * number of requested bytes are available. Any additional bytes will be + * buffered and used in subsequent reads. + * + * @param resource|string|int|float|bool|StreamInterface|callable|\Iterator|null $resource Entity body data + * @param array{size?: int, metadata?: array} $options Additional options + * + * @throws \InvalidArgumentException if the $resource arg is not valid. + */ + public static function streamFor($resource = '', array $options = []): StreamInterface + { + if (is_scalar($resource)) { + $stream = self::tryFopen('php://temp', 'r+'); + if ($resource !== '') { + fwrite($stream, (string) $resource); + fseek($stream, 0); + } + return new Stream($stream, $options); + } + + switch (gettype($resource)) { + case 'resource': + /* + * The 'php://input' is a special stream with quirks and inconsistencies. + * We avoid using that stream by reading it into php://temp + */ + + /** @var resource $resource */ + if ((\stream_get_meta_data($resource)['uri'] ?? '') === 'php://input') { + $stream = self::tryFopen('php://temp', 'w+'); + stream_copy_to_stream($resource, $stream); + fseek($stream, 0); + $resource = $stream; + } + return new Stream($resource, $options); + case 'object': + /** @var object $resource */ + if ($resource instanceof StreamInterface) { + return $resource; + } elseif ($resource instanceof \Iterator) { + return new PumpStream(function () use ($resource) { + if (!$resource->valid()) { + return false; + } + $result = $resource->current(); + $resource->next(); + return $result; + }, $options); + } elseif (method_exists($resource, '__toString')) { + return self::streamFor((string) $resource, $options); + } + break; + case 'NULL': + return new Stream(self::tryFopen('php://temp', 'r+'), $options); + } + + if (is_callable($resource)) { + return new PumpStream($resource, $options); + } + + throw new \InvalidArgumentException('Invalid resource type: ' . gettype($resource)); + } + + /** + * Safely opens a PHP stream resource using a filename. + * + * When fopen fails, PHP normally raises a warning. This function adds an + * error handler that checks for errors and throws an exception instead. + * + * @param string $filename File to open + * @param string $mode Mode used to open the file + * + * @return resource + * + * @throws \RuntimeException if the file cannot be opened + */ + public static function tryFopen(string $filename, string $mode) + { + $ex = null; + set_error_handler(static function (int $errno, string $errstr) use ($filename, $mode, &$ex): bool { + $ex = new \RuntimeException(sprintf( + 'Unable to open "%s" using mode "%s": %s', + $filename, + $mode, + $errstr + )); + + return true; + }); + + try { + /** @var resource $handle */ + $handle = fopen($filename, $mode); + } catch (\Throwable $e) { + $ex = new \RuntimeException(sprintf( + 'Unable to open "%s" using mode "%s": %s', + $filename, + $mode, + $e->getMessage() + ), 0, $e); + } + + restore_error_handler(); + + if ($ex) { + /** @var $ex \RuntimeException */ + throw $ex; + } + + return $handle; + } + + /** + * Safely gets the contents of a given stream. + * + * When stream_get_contents fails, PHP normally raises a warning. This + * function adds an error handler that checks for errors and throws an + * exception instead. + * + * @param resource $stream + * + * @throws \RuntimeException if the stream cannot be read + */ + public static function tryGetContents($stream): string + { + $ex = null; + set_error_handler(static function (int $errno, string $errstr) use (&$ex): bool { + $ex = new \RuntimeException(sprintf( + 'Unable to read stream contents: %s', + $errstr + )); + + return true; + }); + + try { + /** @var string|false $contents */ + $contents = stream_get_contents($stream); + + if ($contents === false) { + $ex = new \RuntimeException('Unable to read stream contents'); + } + } catch (\Throwable $e) { + $ex = new \RuntimeException(sprintf( + 'Unable to read stream contents: %s', + $e->getMessage() + ), 0, $e); + } + + restore_error_handler(); + + if ($ex) { + /** @var $ex \RuntimeException */ + throw $ex; + } + + return $contents; + } + + /** + * Returns a UriInterface for the given value. + * + * This function accepts a string or UriInterface and returns a + * UriInterface for the given value. If the value is already a + * UriInterface, it is returned as-is. + * + * @param string|UriInterface $uri + * + * @throws \InvalidArgumentException + */ + public static function uriFor($uri): UriInterface + { + if ($uri instanceof UriInterface) { + return $uri; + } + + if (is_string($uri)) { + return new Uri($uri); + } + + throw new \InvalidArgumentException('URI must be a string or UriInterface'); + } +} diff --git a/vendor/illuminate/bus/Batch.php b/vendor/illuminate/bus/Batch.php new file mode 100644 index 0000000..644bfbc --- /dev/null +++ b/vendor/illuminate/bus/Batch.php @@ -0,0 +1,480 @@ +<?php + +namespace Illuminate\Bus; + +use Carbon\CarbonImmutable; +use Closure; +use Illuminate\Contracts\Queue\Factory as QueueFactory; +use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Queue\CallQueuedClosure; +use Illuminate\Support\Arr; +use Illuminate\Support\Collection; +use JsonSerializable; +use Throwable; + +class Batch implements Arrayable, JsonSerializable +{ + /** + * The queue factory implementation. + * + * @var \Illuminate\Contracts\Queue\Factory + */ + protected $queue; + + /** + * The repository implementation. + * + * @var \Illuminate\Bus\BatchRepository + */ + protected $repository; + + /** + * The batch ID. + * + * @var string + */ + public $id; + + /** + * The batch name. + * + * @var string + */ + public $name; + + /** + * The total number of jobs that belong to the batch. + * + * @var int + */ + public $totalJobs; + + /** + * The total number of jobs that are still pending. + * + * @var int + */ + public $pendingJobs; + + /** + * The total number of jobs that have failed. + * + * @var int + */ + public $failedJobs; + + /** + * The IDs of the jobs that have failed. + * + * @var array + */ + public $failedJobIds; + + /** + * The batch options. + * + * @var array + */ + public $options; + + /** + * The date indicating when the batch was created. + * + * @var \Carbon\CarbonImmutable + */ + public $createdAt; + + /** + * The date indicating when the batch was cancelled. + * + * @var \Carbon\CarbonImmutable|null + */ + public $cancelledAt; + + /** + * The date indicating when the batch was finished. + * + * @var \Carbon\CarbonImmutable|null + */ + public $finishedAt; + + /** + * Create a new batch instance. + * + * @param \Illuminate\Contracts\Queue\Factory $queue + * @param \Illuminate\Bus\BatchRepository $repository + * @param string $id + * @param string $name + * @param int $totalJobs + * @param int $pendingJobs + * @param int $failedJobs + * @param array $failedJobIds + * @param array $options + * @param \Carbon\CarbonImmutable $createdAt + * @param \Carbon\CarbonImmutable|null $cancelledAt + * @param \Carbon\CarbonImmutable|null $finishedAt + * @return void + */ + public function __construct(QueueFactory $queue, + BatchRepository $repository, + string $id, + string $name, + int $totalJobs, + int $pendingJobs, + int $failedJobs, + array $failedJobIds, + array $options, + CarbonImmutable $createdAt, + ?CarbonImmutable $cancelledAt = null, + ?CarbonImmutable $finishedAt = null) + { + $this->queue = $queue; + $this->repository = $repository; + $this->id = $id; + $this->name = $name; + $this->totalJobs = $totalJobs; + $this->pendingJobs = $pendingJobs; + $this->failedJobs = $failedJobs; + $this->failedJobIds = $failedJobIds; + $this->options = $options; + $this->createdAt = $createdAt; + $this->cancelledAt = $cancelledAt; + $this->finishedAt = $finishedAt; + } + + /** + * Get a fresh instance of the batch represented by this ID. + * + * @return self + */ + public function fresh() + { + return $this->repository->find($this->id); + } + + /** + * Add additional jobs to the batch. + * + * @param \Illuminate\Support\Enumerable|object|array $jobs + * @return self + */ + public function add($jobs) + { + $count = 0; + + $jobs = Collection::wrap($jobs)->map(function ($job) use (&$count) { + $job = $job instanceof Closure ? CallQueuedClosure::create($job) : $job; + + if (is_array($job)) { + $count += count($job); + + return with($this->prepareBatchedChain($job), function ($chain) { + return $chain->first() + ->allOnQueue($this->options['queue'] ?? null) + ->allOnConnection($this->options['connection'] ?? null) + ->chain($chain->slice(1)->values()->all()); + }); + } else { + $job->withBatchId($this->id); + + $count++; + } + + return $job; + }); + + $this->repository->transaction(function () use ($jobs, $count) { + $this->repository->incrementTotalJobs($this->id, $count); + + $this->queue->connection($this->options['connection'] ?? null)->bulk( + $jobs->all(), + $data = '', + $this->options['queue'] ?? null + ); + }); + + return $this->fresh(); + } + + /** + * Prepare a chain that exists within the jobs being added. + * + * @param array $chain + * @return \Illuminate\Support\Collection + */ + protected function prepareBatchedChain(array $chain) + { + return collect($chain)->map(function ($job) { + $job = $job instanceof Closure ? CallQueuedClosure::create($job) : $job; + + return $job->withBatchId($this->id); + }); + } + + /** + * Get the total number of jobs that have been processed by the batch thus far. + * + * @return int + */ + public function processedJobs() + { + return $this->totalJobs - $this->pendingJobs; + } + + /** + * Get the percentage of jobs that have been processed (between 0-100). + * + * @return int + */ + public function progress() + { + return $this->totalJobs > 0 ? round(($this->processedJobs() / $this->totalJobs) * 100) : 0; + } + + /** + * Record that a job within the batch finished successfully, executing any callbacks if necessary. + * + * @param string $jobId + * @return void + */ + public function recordSuccessfulJob(string $jobId) + { + $counts = $this->decrementPendingJobs($jobId); + + if ($counts->pendingJobs === 0) { + $this->repository->markAsFinished($this->id); + } + + if ($counts->pendingJobs === 0 && $this->hasThenCallbacks()) { + $batch = $this->fresh(); + + collect($this->options['then'])->each(function ($handler) use ($batch) { + $this->invokeHandlerCallback($handler, $batch); + }); + } + + if ($counts->allJobsHaveRanExactlyOnce() && $this->hasFinallyCallbacks()) { + $batch = $this->fresh(); + + collect($this->options['finally'])->each(function ($handler) use ($batch) { + $this->invokeHandlerCallback($handler, $batch); + }); + } + } + + /** + * Decrement the pending jobs for the batch. + * + * @param string $jobId + * @return \Illuminate\Bus\UpdatedBatchJobCounts + */ + public function decrementPendingJobs(string $jobId) + { + return $this->repository->decrementPendingJobs($this->id, $jobId); + } + + /** + * Determine if the batch has finished executing. + * + * @return bool + */ + public function finished() + { + return ! is_null($this->finishedAt); + } + + /** + * Determine if the batch has "success" callbacks. + * + * @return bool + */ + public function hasThenCallbacks() + { + return isset($this->options['then']) && ! empty($this->options['then']); + } + + /** + * Determine if the batch allows jobs to fail without cancelling the batch. + * + * @return bool + */ + public function allowsFailures() + { + return Arr::get($this->options, 'allowFailures', false) === true; + } + + /** + * Determine if the batch has job failures. + * + * @return bool + */ + public function hasFailures() + { + return $this->failedJobs > 0; + } + + /** + * Record that a job within the batch failed to finish successfully, executing any callbacks if necessary. + * + * @param string $jobId + * @param \Throwable $e + * @return void + */ + public function recordFailedJob(string $jobId, $e) + { + $counts = $this->incrementFailedJobs($jobId); + + if ($counts->failedJobs === 1 && ! $this->allowsFailures()) { + $this->cancel(); + } + + if ($counts->failedJobs === 1 && $this->hasCatchCallbacks()) { + $batch = $this->fresh(); + + collect($this->options['catch'])->each(function ($handler) use ($batch, $e) { + $this->invokeHandlerCallback($handler, $batch, $e); + }); + } + + if ($counts->allJobsHaveRanExactlyOnce() && $this->hasFinallyCallbacks()) { + $batch = $this->fresh(); + + collect($this->options['finally'])->each(function ($handler) use ($batch, $e) { + $this->invokeHandlerCallback($handler, $batch, $e); + }); + } + } + + /** + * Increment the failed jobs for the batch. + * + * @param string $jobId + * @return \Illuminate\Bus\UpdatedBatchJobCounts + */ + public function incrementFailedJobs(string $jobId) + { + return $this->repository->incrementFailedJobs($this->id, $jobId); + } + + /** + * Determine if the batch has "catch" callbacks. + * + * @return bool + */ + public function hasCatchCallbacks() + { + return isset($this->options['catch']) && ! empty($this->options['catch']); + } + + /** + * Determine if the batch has "finally" callbacks. + * + * @return bool + */ + public function hasFinallyCallbacks() + { + return isset($this->options['finally']) && ! empty($this->options['finally']); + } + + /** + * Cancel the batch. + * + * @return void + */ + public function cancel() + { + $this->repository->cancel($this->id); + } + + /** + * Determine if the batch has been cancelled. + * + * @return bool + */ + public function canceled() + { + return $this->cancelled(); + } + + /** + * Determine if the batch has been cancelled. + * + * @return bool + */ + public function cancelled() + { + return ! is_null($this->cancelledAt); + } + + /** + * Delete the batch from storage. + * + * @return void + */ + public function delete() + { + $this->repository->delete($this->id); + } + + /** + * Invoke a batch callback handler. + * + * @param callable $handler + * @param \Illuminate\Bus\Batch $batch + * @param \Throwable|null $e + * @return void + */ + protected function invokeHandlerCallback($handler, Batch $batch, Throwable $e = null) + { + try { + return $handler($batch, $e); + } catch (Throwable $e) { + if (function_exists('report')) { + report($e); + } + } + } + + /** + * Convert the batch to an array. + * + * @return array + */ + public function toArray() + { + return [ + 'id' => $this->id, + 'name' => $this->name, + 'totalJobs' => $this->totalJobs, + 'pendingJobs' => $this->pendingJobs, + 'processedJobs' => $this->processedJobs(), + 'progress' => $this->progress(), + 'failedJobs' => $this->failedJobs, + 'options' => $this->options, + 'createdAt' => $this->createdAt, + 'cancelledAt' => $this->cancelledAt, + 'finishedAt' => $this->finishedAt, + ]; + } + + /** + * Get the JSON serializable representation of the object. + * + * @return array + */ + public function jsonSerialize(): array + { + return $this->toArray(); + } + + /** + * Dynamically access the batch's "options" via properties. + * + * @param string $key + * @return mixed + */ + public function __get($key) + { + return $this->options[$key] ?? null; + } +} diff --git a/vendor/illuminate/bus/BatchFactory.php b/vendor/illuminate/bus/BatchFactory.php new file mode 100644 index 0000000..2c3a4e9 --- /dev/null +++ b/vendor/illuminate/bus/BatchFactory.php @@ -0,0 +1,58 @@ +<?php + +namespace Illuminate\Bus; + +use Carbon\CarbonImmutable; +use Illuminate\Contracts\Queue\Factory as QueueFactory; + +class BatchFactory +{ + /** + * The queue factory implementation. + * + * @var \Illuminate\Contracts\Queue\Factory + */ + protected $queue; + + /** + * Create a new batch factory instance. + * + * @param \Illuminate\Contracts\Queue\Factory $queue + * @return void + */ + public function __construct(QueueFactory $queue) + { + $this->queue = $queue; + } + + /** + * Create a new batch instance. + * + * @param \Illuminate\Bus\BatchRepository $repository + * @param string $id + * @param string $name + * @param int $totalJobs + * @param int $pendingJobs + * @param int $failedJobs + * @param array $failedJobIds + * @param array $options + * @param \Carbon\CarbonImmutable $createdAt + * @param \Carbon\CarbonImmutable|null $cancelledAt + * @param \Carbon\CarbonImmutable|null $finishedAt + * @return \Illuminate\Bus\Batch + */ + public function make(BatchRepository $repository, + string $id, + string $name, + int $totalJobs, + int $pendingJobs, + int $failedJobs, + array $failedJobIds, + array $options, + CarbonImmutable $createdAt, + ?CarbonImmutable $cancelledAt, + ?CarbonImmutable $finishedAt) + { + return new Batch($this->queue, $repository, $id, $name, $totalJobs, $pendingJobs, $failedJobs, $failedJobIds, $options, $createdAt, $cancelledAt, $finishedAt); + } +} diff --git a/vendor/illuminate/bus/BatchRepository.php b/vendor/illuminate/bus/BatchRepository.php new file mode 100644 index 0000000..098ccef --- /dev/null +++ b/vendor/illuminate/bus/BatchRepository.php @@ -0,0 +1,92 @@ +<?php + +namespace Illuminate\Bus; + +use Closure; + +interface BatchRepository +{ + /** + * Retrieve a list of batches. + * + * @param int $limit + * @param mixed $before + * @return \Illuminate\Bus\Batch[] + */ + public function get($limit, $before); + + /** + * Retrieve information about an existing batch. + * + * @param string $batchId + * @return \Illuminate\Bus\Batch|null + */ + public function find(string $batchId); + + /** + * Store a new pending batch. + * + * @param \Illuminate\Bus\PendingBatch $batch + * @return \Illuminate\Bus\Batch + */ + public function store(PendingBatch $batch); + + /** + * Increment the total number of jobs within the batch. + * + * @param string $batchId + * @param int $amount + * @return void + */ + public function incrementTotalJobs(string $batchId, int $amount); + + /** + * Decrement the total number of pending jobs for the batch. + * + * @param string $batchId + * @param string $jobId + * @return \Illuminate\Bus\UpdatedBatchJobCounts + */ + public function decrementPendingJobs(string $batchId, string $jobId); + + /** + * Increment the total number of failed jobs for the batch. + * + * @param string $batchId + * @param string $jobId + * @return \Illuminate\Bus\UpdatedBatchJobCounts + */ + public function incrementFailedJobs(string $batchId, string $jobId); + + /** + * Mark the batch that has the given ID as finished. + * + * @param string $batchId + * @return void + */ + public function markAsFinished(string $batchId); + + /** + * Cancel the batch that has the given ID. + * + * @param string $batchId + * @return void + */ + public function cancel(string $batchId); + + /** + * Delete the batch that has the given ID. + * + * @param string $batchId + * @return void + */ + public function delete(string $batchId); + + /** + * Execute the given Closure within a storage specific transaction. + * + * @param \Closure $callback + * @return mixed + */ + public function transaction(Closure $callback); +} diff --git a/vendor/illuminate/bus/Batchable.php b/vendor/illuminate/bus/Batchable.php new file mode 100644 index 0000000..28f32cf --- /dev/null +++ b/vendor/illuminate/bus/Batchable.php @@ -0,0 +1,108 @@ +<?php + +namespace Illuminate\Bus; + +use Carbon\CarbonImmutable; +use Illuminate\Container\Container; +use Illuminate\Support\Str; +use Illuminate\Support\Testing\Fakes\BatchFake; + +trait Batchable +{ + /** + * The batch ID (if applicable). + * + * @var string + */ + public $batchId; + + /** + * The fake batch, if applicable. + * + * @var \Illuminate\Support\Testing\BatchFake + */ + private $fakeBatch; + + /** + * Get the batch instance for the job, if applicable. + * + * @return \Illuminate\Bus\Batch|null + */ + public function batch() + { + if ($this->fakeBatch) { + return $this->fakeBatch; + } + + if ($this->batchId) { + return Container::getInstance()->make(BatchRepository::class)->find($this->batchId); + } + } + + /** + * Determine if the batch is still active and processing. + * + * @return bool + */ + public function batching() + { + $batch = $this->batch(); + + return $batch && ! $batch->cancelled(); + } + + /** + * Set the batch ID on the job. + * + * @param string $batchId + * @return $this + */ + public function withBatchId(string $batchId) + { + $this->batchId = $batchId; + + return $this; + } + + /** + * Indicate that the job should use a fake batch. + * + * @param string $id + * @param string $name + * @param int $totalJobs + * @param int $pendingJobs + * @param int $failedJobs + * @param array $failedJobIds + * @param array $options + * @param \Carbon\CarbonImmutable $createdAt + * @param \Carbon\CarbonImmutable|null $cancelledAt + * @param \Carbon\CarbonImmutable|null $finishedAt + * @return array{0: $this, 1: \Illuminate\Support\Testing\BatchFake} + */ + public function withFakeBatch(string $id = '', + string $name = '', + int $totalJobs = 0, + int $pendingJobs = 0, + int $failedJobs = 0, + array $failedJobIds = [], + array $options = [], + CarbonImmutable $createdAt = null, + ?CarbonImmutable $cancelledAt = null, + ?CarbonImmutable $finishedAt = null) + { + $this->fakeBatch = new BatchFake( + empty($id) ? (string) Str::uuid() : $id, + $name, + $totalJobs, + $pendingJobs, + $failedJobs, + $failedJobIds, + $options, + $createdAt ?? CarbonImmutable::now(), + $cancelledAt, + $finishedAt, + ); + + return [$this, $this->fakeBatch]; + } +} diff --git a/vendor/illuminate/bus/BusServiceProvider.php b/vendor/illuminate/bus/BusServiceProvider.php new file mode 100644 index 0000000..bd6192d --- /dev/null +++ b/vendor/illuminate/bus/BusServiceProvider.php @@ -0,0 +1,70 @@ +<?php + +namespace Illuminate\Bus; + +use Illuminate\Contracts\Bus\Dispatcher as DispatcherContract; +use Illuminate\Contracts\Bus\QueueingDispatcher as QueueingDispatcherContract; +use Illuminate\Contracts\Queue\Factory as QueueFactoryContract; +use Illuminate\Contracts\Support\DeferrableProvider; +use Illuminate\Support\ServiceProvider; + +class BusServiceProvider extends ServiceProvider implements DeferrableProvider +{ + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + $this->app->singleton(Dispatcher::class, function ($app) { + return new Dispatcher($app, function ($connection = null) use ($app) { + return $app[QueueFactoryContract::class]->connection($connection); + }); + }); + + $this->registerBatchServices(); + + $this->app->alias( + Dispatcher::class, DispatcherContract::class + ); + + $this->app->alias( + Dispatcher::class, QueueingDispatcherContract::class + ); + } + + /** + * Register the batch handling services. + * + * @return void + */ + protected function registerBatchServices() + { + $this->app->singleton(BatchRepository::class, DatabaseBatchRepository::class); + + $this->app->singleton(DatabaseBatchRepository::class, function ($app) { + return new DatabaseBatchRepository( + $app->make(BatchFactory::class), + $app->make('db')->connection($app->config->get('queue.batching.database')), + $app->config->get('queue.batching.table', 'job_batches') + ); + }); + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() + { + return [ + Dispatcher::class, + DispatcherContract::class, + QueueingDispatcherContract::class, + BatchRepository::class, + DatabaseBatchRepository::class, + ]; + } +} diff --git a/vendor/illuminate/bus/DatabaseBatchRepository.php b/vendor/illuminate/bus/DatabaseBatchRepository.php new file mode 100644 index 0000000..624da19 --- /dev/null +++ b/vendor/illuminate/bus/DatabaseBatchRepository.php @@ -0,0 +1,388 @@ +<?php + +namespace Illuminate\Bus; + +use Carbon\CarbonImmutable; +use Closure; +use DateTimeInterface; +use Illuminate\Database\Connection; +use Illuminate\Database\PostgresConnection; +use Illuminate\Database\Query\Expression; +use Illuminate\Support\Str; + +class DatabaseBatchRepository implements PrunableBatchRepository +{ + /** + * The batch factory instance. + * + * @var \Illuminate\Bus\BatchFactory + */ + protected $factory; + + /** + * The database connection instance. + * + * @var \Illuminate\Database\Connection + */ + protected $connection; + + /** + * The database table to use to store batch information. + * + * @var string + */ + protected $table; + + /** + * Create a new batch repository instance. + * + * @param \Illuminate\Bus\BatchFactory $factory + * @param \Illuminate\Database\Connection $connection + * @param string $table + */ + public function __construct(BatchFactory $factory, Connection $connection, string $table) + { + $this->factory = $factory; + $this->connection = $connection; + $this->table = $table; + } + + /** + * Retrieve a list of batches. + * + * @param int $limit + * @param mixed $before + * @return \Illuminate\Bus\Batch[] + */ + public function get($limit = 50, $before = null) + { + return $this->connection->table($this->table) + ->orderByDesc('id') + ->take($limit) + ->when($before, fn ($q) => $q->where('id', '<', $before)) + ->get() + ->map(function ($batch) { + return $this->toBatch($batch); + }) + ->all(); + } + + /** + * Retrieve information about an existing batch. + * + * @param string $batchId + * @return \Illuminate\Bus\Batch|null + */ + public function find(string $batchId) + { + $batch = $this->connection->table($this->table) + ->useWritePdo() + ->where('id', $batchId) + ->first(); + + if ($batch) { + return $this->toBatch($batch); + } + } + + /** + * Store a new pending batch. + * + * @param \Illuminate\Bus\PendingBatch $batch + * @return \Illuminate\Bus\Batch + */ + public function store(PendingBatch $batch) + { + $id = (string) Str::orderedUuid(); + + $this->connection->table($this->table)->insert([ + 'id' => $id, + 'name' => $batch->name, + 'total_jobs' => 0, + 'pending_jobs' => 0, + 'failed_jobs' => 0, + 'failed_job_ids' => '[]', + 'options' => $this->serialize($batch->options), + 'created_at' => time(), + 'cancelled_at' => null, + 'finished_at' => null, + ]); + + return $this->find($id); + } + + /** + * Increment the total number of jobs within the batch. + * + * @param string $batchId + * @param int $amount + * @return void + */ + public function incrementTotalJobs(string $batchId, int $amount) + { + $this->connection->table($this->table)->where('id', $batchId)->update([ + 'total_jobs' => new Expression('total_jobs + '.$amount), + 'pending_jobs' => new Expression('pending_jobs + '.$amount), + 'finished_at' => null, + ]); + } + + /** + * Decrement the total number of pending jobs for the batch. + * + * @param string $batchId + * @param string $jobId + * @return \Illuminate\Bus\UpdatedBatchJobCounts + */ + public function decrementPendingJobs(string $batchId, string $jobId) + { + $values = $this->updateAtomicValues($batchId, function ($batch) use ($jobId) { + return [ + 'pending_jobs' => $batch->pending_jobs - 1, + 'failed_jobs' => $batch->failed_jobs, + 'failed_job_ids' => json_encode(array_values(array_diff(json_decode($batch->failed_job_ids, true), [$jobId]))), + ]; + }); + + return new UpdatedBatchJobCounts( + $values['pending_jobs'], + $values['failed_jobs'] + ); + } + + /** + * Increment the total number of failed jobs for the batch. + * + * @param string $batchId + * @param string $jobId + * @return \Illuminate\Bus\UpdatedBatchJobCounts + */ + public function incrementFailedJobs(string $batchId, string $jobId) + { + $values = $this->updateAtomicValues($batchId, function ($batch) use ($jobId) { + return [ + 'pending_jobs' => $batch->pending_jobs, + 'failed_jobs' => $batch->failed_jobs + 1, + 'failed_job_ids' => json_encode(array_values(array_unique(array_merge(json_decode($batch->failed_job_ids, true), [$jobId])))), + ]; + }); + + return new UpdatedBatchJobCounts( + $values['pending_jobs'], + $values['failed_jobs'] + ); + } + + /** + * Update an atomic value within the batch. + * + * @param string $batchId + * @param \Closure $callback + * @return int|null + */ + protected function updateAtomicValues(string $batchId, Closure $callback) + { + return $this->connection->transaction(function () use ($batchId, $callback) { + $batch = $this->connection->table($this->table)->where('id', $batchId) + ->lockForUpdate() + ->first(); + + return is_null($batch) ? [] : tap($callback($batch), function ($values) use ($batchId) { + $this->connection->table($this->table)->where('id', $batchId)->update($values); + }); + }); + } + + /** + * Mark the batch that has the given ID as finished. + * + * @param string $batchId + * @return void + */ + public function markAsFinished(string $batchId) + { + $this->connection->table($this->table)->where('id', $batchId)->update([ + 'finished_at' => time(), + ]); + } + + /** + * Cancel the batch that has the given ID. + * + * @param string $batchId + * @return void + */ + public function cancel(string $batchId) + { + $this->connection->table($this->table)->where('id', $batchId)->update([ + 'cancelled_at' => time(), + 'finished_at' => time(), + ]); + } + + /** + * Delete the batch that has the given ID. + * + * @param string $batchId + * @return void + */ + public function delete(string $batchId) + { + $this->connection->table($this->table)->where('id', $batchId)->delete(); + } + + /** + * Prune all of the entries older than the given date. + * + * @param \DateTimeInterface $before + * @return int + */ + public function prune(DateTimeInterface $before) + { + $query = $this->connection->table($this->table) + ->whereNotNull('finished_at') + ->where('finished_at', '<', $before->getTimestamp()); + + $totalDeleted = 0; + + do { + $deleted = $query->take(1000)->delete(); + + $totalDeleted += $deleted; + } while ($deleted !== 0); + + return $totalDeleted; + } + + /** + * Prune all of the unfinished entries older than the given date. + * + * @param \DateTimeInterface $before + * @return int + */ + public function pruneUnfinished(DateTimeInterface $before) + { + $query = $this->connection->table($this->table) + ->whereNull('finished_at') + ->where('created_at', '<', $before->getTimestamp()); + + $totalDeleted = 0; + + do { + $deleted = $query->take(1000)->delete(); + + $totalDeleted += $deleted; + } while ($deleted !== 0); + + return $totalDeleted; + } + + /** + * Prune all of the cancelled entries older than the given date. + * + * @param \DateTimeInterface $before + * @return int + */ + public function pruneCancelled(DateTimeInterface $before) + { + $query = $this->connection->table($this->table) + ->whereNotNull('cancelled_at') + ->where('created_at', '<', $before->getTimestamp()); + + $totalDeleted = 0; + + do { + $deleted = $query->take(1000)->delete(); + + $totalDeleted += $deleted; + } while ($deleted !== 0); + + return $totalDeleted; + } + + /** + * Execute the given Closure within a storage specific transaction. + * + * @param \Closure $callback + * @return mixed + */ + public function transaction(Closure $callback) + { + return $this->connection->transaction(fn () => $callback()); + } + + /** + * Serialize the given value. + * + * @param mixed $value + * @return string + */ + protected function serialize($value) + { + $serialized = serialize($value); + + return $this->connection instanceof PostgresConnection + ? base64_encode($serialized) + : $serialized; + } + + /** + * Unserialize the given value. + * + * @param string $serialized + * @return mixed + */ + protected function unserialize($serialized) + { + if ($this->connection instanceof PostgresConnection && + ! Str::contains($serialized, [':', ';'])) { + $serialized = base64_decode($serialized); + } + + return unserialize($serialized); + } + + /** + * Convert the given raw batch to a Batch object. + * + * @param object $batch + * @return \Illuminate\Bus\Batch + */ + protected function toBatch($batch) + { + return $this->factory->make( + $this, + $batch->id, + $batch->name, + (int) $batch->total_jobs, + (int) $batch->pending_jobs, + (int) $batch->failed_jobs, + json_decode($batch->failed_job_ids, true), + $this->unserialize($batch->options), + CarbonImmutable::createFromTimestamp($batch->created_at), + $batch->cancelled_at ? CarbonImmutable::createFromTimestamp($batch->cancelled_at) : $batch->cancelled_at, + $batch->finished_at ? CarbonImmutable::createFromTimestamp($batch->finished_at) : $batch->finished_at + ); + } + + /** + * Get the underlying database connection. + * + * @return \Illuminate\Database\Connection + */ + public function getConnection() + { + return $this->connection; + } + + /** + * Set the underlying database connection. + * + * @param \Illuminate\Database\Connection $connection + * @return void + */ + public function setConnection(Connection $connection) + { + $this->connection = $connection; + } +} diff --git a/vendor/illuminate/bus/Dispatcher.php b/vendor/illuminate/bus/Dispatcher.php new file mode 100644 index 0000000..4dc390e --- /dev/null +++ b/vendor/illuminate/bus/Dispatcher.php @@ -0,0 +1,295 @@ +<?php + +namespace Illuminate\Bus; + +use Closure; +use Illuminate\Contracts\Bus\QueueingDispatcher; +use Illuminate\Contracts\Container\Container; +use Illuminate\Contracts\Queue\Queue; +use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Foundation\Bus\PendingChain; +use Illuminate\Pipeline\Pipeline; +use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Queue\Jobs\SyncJob; +use Illuminate\Support\Collection; +use RuntimeException; + +class Dispatcher implements QueueingDispatcher +{ + /** + * The container implementation. + * + * @var \Illuminate\Contracts\Container\Container + */ + protected $container; + + /** + * The pipeline instance for the bus. + * + * @var \Illuminate\Pipeline\Pipeline + */ + protected $pipeline; + + /** + * The pipes to send commands through before dispatching. + * + * @var array + */ + protected $pipes = []; + + /** + * The command to handler mapping for non-self-handling events. + * + * @var array + */ + protected $handlers = []; + + /** + * The queue resolver callback. + * + * @var \Closure|null + */ + protected $queueResolver; + + /** + * Create a new command dispatcher instance. + * + * @param \Illuminate\Contracts\Container\Container $container + * @param \Closure|null $queueResolver + * @return void + */ + public function __construct(Container $container, Closure $queueResolver = null) + { + $this->container = $container; + $this->queueResolver = $queueResolver; + $this->pipeline = new Pipeline($container); + } + + /** + * Dispatch a command to its appropriate handler. + * + * @param mixed $command + * @return mixed + */ + public function dispatch($command) + { + return $this->queueResolver && $this->commandShouldBeQueued($command) + ? $this->dispatchToQueue($command) + : $this->dispatchNow($command); + } + + /** + * Dispatch a command to its appropriate handler in the current process. + * + * Queueable jobs will be dispatched to the "sync" queue. + * + * @param mixed $command + * @param mixed $handler + * @return mixed + */ + public function dispatchSync($command, $handler = null) + { + if ($this->queueResolver && + $this->commandShouldBeQueued($command) && + method_exists($command, 'onConnection')) { + return $this->dispatchToQueue($command->onConnection('sync')); + } + + return $this->dispatchNow($command, $handler); + } + + /** + * Dispatch a command to its appropriate handler in the current process without using the synchronous queue. + * + * @param mixed $command + * @param mixed $handler + * @return mixed + */ + public function dispatchNow($command, $handler = null) + { + $uses = class_uses_recursive($command); + + if (in_array(InteractsWithQueue::class, $uses) && + in_array(Queueable::class, $uses) && + ! $command->job) { + $command->setJob(new SyncJob($this->container, json_encode([]), 'sync', 'sync')); + } + + if ($handler || $handler = $this->getCommandHandler($command)) { + $callback = function ($command) use ($handler) { + $method = method_exists($handler, 'handle') ? 'handle' : '__invoke'; + + return $handler->{$method}($command); + }; + } else { + $callback = function ($command) { + $method = method_exists($command, 'handle') ? 'handle' : '__invoke'; + + return $this->container->call([$command, $method]); + }; + } + + return $this->pipeline->send($command)->through($this->pipes)->then($callback); + } + + /** + * Attempt to find the batch with the given ID. + * + * @param string $batchId + * @return \Illuminate\Bus\Batch|null + */ + public function findBatch(string $batchId) + { + return $this->container->make(BatchRepository::class)->find($batchId); + } + + /** + * Create a new batch of queueable jobs. + * + * @param \Illuminate\Support\Collection|array|mixed $jobs + * @return \Illuminate\Bus\PendingBatch + */ + public function batch($jobs) + { + return new PendingBatch($this->container, Collection::wrap($jobs)); + } + + /** + * Create a new chain of queueable jobs. + * + * @param \Illuminate\Support\Collection|array $jobs + * @return \Illuminate\Foundation\Bus\PendingChain + */ + public function chain($jobs) + { + $jobs = Collection::wrap($jobs); + + return new PendingChain($jobs->shift(), $jobs->toArray()); + } + + /** + * Determine if the given command has a handler. + * + * @param mixed $command + * @return bool + */ + public function hasCommandHandler($command) + { + return array_key_exists(get_class($command), $this->handlers); + } + + /** + * Retrieve the handler for a command. + * + * @param mixed $command + * @return bool|mixed + */ + public function getCommandHandler($command) + { + if ($this->hasCommandHandler($command)) { + return $this->container->make($this->handlers[get_class($command)]); + } + + return false; + } + + /** + * Determine if the given command should be queued. + * + * @param mixed $command + * @return bool + */ + protected function commandShouldBeQueued($command) + { + return $command instanceof ShouldQueue; + } + + /** + * Dispatch a command to its appropriate handler behind a queue. + * + * @param mixed $command + * @return mixed + * + * @throws \RuntimeException + */ + public function dispatchToQueue($command) + { + $connection = $command->connection ?? null; + + $queue = call_user_func($this->queueResolver, $connection); + + if (! $queue instanceof Queue) { + throw new RuntimeException('Queue resolver did not return a Queue implementation.'); + } + + if (method_exists($command, 'queue')) { + return $command->queue($queue, $command); + } + + return $this->pushCommandToQueue($queue, $command); + } + + /** + * Push the command onto the given queue instance. + * + * @param \Illuminate\Contracts\Queue\Queue $queue + * @param mixed $command + * @return mixed + */ + protected function pushCommandToQueue($queue, $command) + { + if (isset($command->queue, $command->delay)) { + return $queue->laterOn($command->queue, $command->delay, $command); + } + + if (isset($command->queue)) { + return $queue->pushOn($command->queue, $command); + } + + if (isset($command->delay)) { + return $queue->later($command->delay, $command); + } + + return $queue->push($command); + } + + /** + * Dispatch a command to its appropriate handler after the current process. + * + * @param mixed $command + * @param mixed $handler + * @return void + */ + public function dispatchAfterResponse($command, $handler = null) + { + $this->container->terminating(function () use ($command, $handler) { + $this->dispatchNow($command, $handler); + }); + } + + /** + * Set the pipes through which commands should be piped before dispatching. + * + * @param array $pipes + * @return $this + */ + public function pipeThrough(array $pipes) + { + $this->pipes = $pipes; + + return $this; + } + + /** + * Map a command to a handler. + * + * @param array $map + * @return $this + */ + public function map(array $map) + { + $this->handlers = array_merge($this->handlers, $map); + + return $this; + } +} diff --git a/vendor/illuminate/bus/Events/BatchDispatched.php b/vendor/illuminate/bus/Events/BatchDispatched.php new file mode 100644 index 0000000..b9a161a --- /dev/null +++ b/vendor/illuminate/bus/Events/BatchDispatched.php @@ -0,0 +1,26 @@ +<?php + +namespace Illuminate\Bus\Events; + +use Illuminate\Bus\Batch; + +class BatchDispatched +{ + /** + * The batch instance. + * + * @var \Illuminate\Bus\Batch + */ + public $batch; + + /** + * Create a new event instance. + * + * @param \Illuminate\Bus\Batch $batch + * @return void + */ + public function __construct(Batch $batch) + { + $this->batch = $batch; + } +} diff --git a/vendor/illuminate/bus/LICENSE.md b/vendor/illuminate/bus/LICENSE.md new file mode 100644 index 0000000..79810c8 --- /dev/null +++ b/vendor/illuminate/bus/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Taylor Otwell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/illuminate/bus/PendingBatch.php b/vendor/illuminate/bus/PendingBatch.php new file mode 100644 index 0000000..6cd5183 --- /dev/null +++ b/vendor/illuminate/bus/PendingBatch.php @@ -0,0 +1,319 @@ +<?php + +namespace Illuminate\Bus; + +use Closure; +use Illuminate\Bus\Events\BatchDispatched; +use Illuminate\Contracts\Container\Container; +use Illuminate\Contracts\Events\Dispatcher as EventDispatcher; +use Illuminate\Support\Arr; +use Illuminate\Support\Collection; +use Laravel\SerializableClosure\SerializableClosure; +use Throwable; + +class PendingBatch +{ + /** + * The IoC container instance. + * + * @var \Illuminate\Contracts\Container\Container + */ + protected $container; + + /** + * The batch name. + * + * @var string + */ + public $name = ''; + + /** + * The jobs that belong to the batch. + * + * @var \Illuminate\Support\Collection + */ + public $jobs; + + /** + * The batch options. + * + * @var array + */ + public $options = []; + + /** + * Create a new pending batch instance. + * + * @param \Illuminate\Contracts\Container\Container $container + * @param \Illuminate\Support\Collection $jobs + * @return void + */ + public function __construct(Container $container, Collection $jobs) + { + $this->container = $container; + $this->jobs = $jobs; + } + + /** + * Add jobs to the batch. + * + * @param iterable|object|array $jobs + * @return $this + */ + public function add($jobs) + { + $jobs = is_iterable($jobs) ? $jobs : Arr::wrap($jobs); + + foreach ($jobs as $job) { + $this->jobs->push($job); + } + + return $this; + } + + /** + * Add a callback to be executed after all jobs in the batch have executed successfully. + * + * @param callable $callback + * @return $this + */ + public function then($callback) + { + $this->options['then'][] = $callback instanceof Closure + ? new SerializableClosure($callback) + : $callback; + + return $this; + } + + /** + * Get the "then" callbacks that have been registered with the pending batch. + * + * @return array + */ + public function thenCallbacks() + { + return $this->options['then'] ?? []; + } + + /** + * Add a callback to be executed after the first failing job in the batch. + * + * @param callable $callback + * @return $this + */ + public function catch($callback) + { + $this->options['catch'][] = $callback instanceof Closure + ? new SerializableClosure($callback) + : $callback; + + return $this; + } + + /** + * Get the "catch" callbacks that have been registered with the pending batch. + * + * @return array + */ + public function catchCallbacks() + { + return $this->options['catch'] ?? []; + } + + /** + * Add a callback to be executed after the batch has finished executing. + * + * @param callable $callback + * @return $this + */ + public function finally($callback) + { + $this->options['finally'][] = $callback instanceof Closure + ? new SerializableClosure($callback) + : $callback; + + return $this; + } + + /** + * Get the "finally" callbacks that have been registered with the pending batch. + * + * @return array + */ + public function finallyCallbacks() + { + return $this->options['finally'] ?? []; + } + + /** + * Indicate that the batch should not be cancelled when a job within the batch fails. + * + * @param bool $allowFailures + * @return $this + */ + public function allowFailures($allowFailures = true) + { + $this->options['allowFailures'] = $allowFailures; + + return $this; + } + + /** + * Determine if the pending batch allows jobs to fail without cancelling the batch. + * + * @return bool + */ + public function allowsFailures() + { + return Arr::get($this->options, 'allowFailures', false) === true; + } + + /** + * Set the name for the batch. + * + * @param string $name + * @return $this + */ + public function name(string $name) + { + $this->name = $name; + + return $this; + } + + /** + * Specify the queue connection that the batched jobs should run on. + * + * @param string $connection + * @return $this + */ + public function onConnection(string $connection) + { + $this->options['connection'] = $connection; + + return $this; + } + + /** + * Get the connection used by the pending batch. + * + * @return string|null + */ + public function connection() + { + return $this->options['connection'] ?? null; + } + + /** + * Specify the queue that the batched jobs should run on. + * + * @param string $queue + * @return $this + */ + public function onQueue(string $queue) + { + $this->options['queue'] = $queue; + + return $this; + } + + /** + * Get the queue used by the pending batch. + * + * @return string|null + */ + public function queue() + { + return $this->options['queue'] ?? null; + } + + /** + * Add additional data into the batch's options array. + * + * @param string $key + * @param mixed $value + * @return $this + */ + public function withOption(string $key, $value) + { + $this->options[$key] = $value; + + return $this; + } + + /** + * Dispatch the batch. + * + * @return \Illuminate\Bus\Batch + * + * @throws \Throwable + */ + public function dispatch() + { + $repository = $this->container->make(BatchRepository::class); + + try { + $batch = $repository->store($this); + + $batch = $batch->add($this->jobs); + } catch (Throwable $e) { + if (isset($batch)) { + $repository->delete($batch->id); + } + + throw $e; + } + + $this->container->make(EventDispatcher::class)->dispatch( + new BatchDispatched($batch) + ); + + return $batch; + } + + /** + * Dispatch the batch after the response is sent to the browser. + * + * @return \Illuminate\Bus\Batch + */ + public function dispatchAfterResponse() + { + $repository = $this->container->make(BatchRepository::class); + + $batch = $repository->store($this); + + if ($batch) { + $this->container->terminating(function () use ($batch) { + $this->dispatchExistingBatch($batch); + }); + } + + return $batch; + } + + /** + * Dispatch an existing batch. + * + * @param \Illuminate\Bus\Batch $batch + * @return void + * + * @throws \Throwable + */ + protected function dispatchExistingBatch($batch) + { + try { + $batch = $batch->add($this->jobs); + } catch (Throwable $e) { + if (isset($batch)) { + $batch->delete(); + } + + throw $e; + } + + $this->container->make(EventDispatcher::class)->dispatch( + new BatchDispatched($batch) + ); + } +} diff --git a/vendor/illuminate/bus/PrunableBatchRepository.php b/vendor/illuminate/bus/PrunableBatchRepository.php new file mode 100644 index 0000000..3f97255 --- /dev/null +++ b/vendor/illuminate/bus/PrunableBatchRepository.php @@ -0,0 +1,16 @@ +<?php + +namespace Illuminate\Bus; + +use DateTimeInterface; + +interface PrunableBatchRepository extends BatchRepository +{ + /** + * Prune all of the entries older than the given date. + * + * @param \DateTimeInterface $before + * @return int + */ + public function prune(DateTimeInterface $before); +} diff --git a/vendor/illuminate/bus/Queueable.php b/vendor/illuminate/bus/Queueable.php new file mode 100644 index 0000000..3d3bbb9 --- /dev/null +++ b/vendor/illuminate/bus/Queueable.php @@ -0,0 +1,276 @@ +<?php + +namespace Illuminate\Bus; + +use Closure; +use Illuminate\Queue\CallQueuedClosure; +use Illuminate\Support\Arr; +use RuntimeException; + +trait Queueable +{ + /** + * The name of the connection the job should be sent to. + * + * @var string|null + */ + public $connection; + + /** + * The name of the queue the job should be sent to. + * + * @var string|null + */ + public $queue; + + /** + * The name of the connection the chain should be sent to. + * + * @var string|null + */ + public $chainConnection; + + /** + * The name of the queue the chain should be sent to. + * + * @var string|null + */ + public $chainQueue; + + /** + * The callbacks to be executed on chain failure. + * + * @var array|null + */ + public $chainCatchCallbacks; + + /** + * The number of seconds before the job should be made available. + * + * @var \DateTimeInterface|\DateInterval|array|int|null + */ + public $delay; + + /** + * Indicates whether the job should be dispatched after all database transactions have committed. + * + * @var bool|null + */ + public $afterCommit; + + /** + * The middleware the job should be dispatched through. + * + * @var array + */ + public $middleware = []; + + /** + * The jobs that should run if this job is successful. + * + * @var array + */ + public $chained = []; + + /** + * Set the desired connection for the job. + * + * @param string|null $connection + * @return $this + */ + public function onConnection($connection) + { + $this->connection = $connection; + + return $this; + } + + /** + * Set the desired queue for the job. + * + * @param string|null $queue + * @return $this + */ + public function onQueue($queue) + { + $this->queue = $queue; + + return $this; + } + + /** + * Set the desired connection for the chain. + * + * @param string|null $connection + * @return $this + */ + public function allOnConnection($connection) + { + $this->chainConnection = $connection; + $this->connection = $connection; + + return $this; + } + + /** + * Set the desired queue for the chain. + * + * @param string|null $queue + * @return $this + */ + public function allOnQueue($queue) + { + $this->chainQueue = $queue; + $this->queue = $queue; + + return $this; + } + + /** + * Set the desired delay in seconds for the job. + * + * @param \DateTimeInterface|\DateInterval|array|int|null $delay + * @return $this + */ + public function delay($delay) + { + $this->delay = $delay; + + return $this; + } + + /** + * Indicate that the job should be dispatched after all database transactions have committed. + * + * @return $this + */ + public function afterCommit() + { + $this->afterCommit = true; + + return $this; + } + + /** + * Indicate that the job should not wait until database transactions have been committed before dispatching. + * + * @return $this + */ + public function beforeCommit() + { + $this->afterCommit = false; + + return $this; + } + + /** + * Specify the middleware the job should be dispatched through. + * + * @param array|object $middleware + * @return $this + */ + public function through($middleware) + { + $this->middleware = Arr::wrap($middleware); + + return $this; + } + + /** + * Set the jobs that should run if this job is successful. + * + * @param array $chain + * @return $this + */ + public function chain($chain) + { + $this->chained = collect($chain)->map(function ($job) { + return $this->serializeJob($job); + })->all(); + + return $this; + } + + /** + * Prepend a job to the current chain so that it is run after the currently running job. + * + * @param mixed $job + * @return $this + */ + public function prependToChain($job) + { + $this->chained = Arr::prepend($this->chained, $this->serializeJob($job)); + + return $this; + } + + /** + * Append a job to the end of the current chain. + * + * @param mixed $job + * @return $this + */ + public function appendToChain($job) + { + $this->chained = array_merge($this->chained, [$this->serializeJob($job)]); + + return $this; + } + + /** + * Serialize a job for queuing. + * + * @param mixed $job + * @return string + * + * @throws \RuntimeException + */ + protected function serializeJob($job) + { + if ($job instanceof Closure) { + if (! class_exists(CallQueuedClosure::class)) { + throw new RuntimeException( + 'To enable support for closure jobs, please install the illuminate/queue package.' + ); + } + + $job = CallQueuedClosure::create($job); + } + + return serialize($job); + } + + /** + * Dispatch the next job on the chain. + * + * @return void + */ + public function dispatchNextJobInChain() + { + if (! empty($this->chained)) { + dispatch(tap(unserialize(array_shift($this->chained)), function ($next) { + $next->chained = $this->chained; + + $next->onConnection($next->connection ?: $this->chainConnection); + $next->onQueue($next->queue ?: $this->chainQueue); + + $next->chainConnection = $this->chainConnection; + $next->chainQueue = $this->chainQueue; + $next->chainCatchCallbacks = $this->chainCatchCallbacks; + })); + } + } + + /** + * Invoke all of the chain's failed job callbacks. + * + * @param \Throwable $e + * @return void + */ + public function invokeChainCatchCallbacks($e) + { + collect($this->chainCatchCallbacks)->each(function ($callback) use ($e) { + $callback($e); + }); + } +} diff --git a/vendor/illuminate/bus/UniqueLock.php b/vendor/illuminate/bus/UniqueLock.php new file mode 100644 index 0000000..a4066b7 --- /dev/null +++ b/vendor/illuminate/bus/UniqueLock.php @@ -0,0 +1,75 @@ +<?php + +namespace Illuminate\Bus; + +use Illuminate\Contracts\Cache\Repository as Cache; + +class UniqueLock +{ + /** + * The cache repository implementation. + * + * @var \Illuminate\Contracts\Cache\Repository + */ + protected $cache; + + /** + * Create a new unique lock manager instance. + * + * @param \Illuminate\Contracts\Cache\Repository $cache + * @return void + */ + public function __construct(Cache $cache) + { + $this->cache = $cache; + } + + /** + * Attempt to acquire a lock for the given job. + * + * @param mixed $job + * @return bool + */ + public function acquire($job) + { + $uniqueFor = method_exists($job, 'uniqueFor') + ? $job->uniqueFor() + : ($job->uniqueFor ?? 0); + + $cache = method_exists($job, 'uniqueVia') + ? $job->uniqueVia() + : $this->cache; + + return (bool) $cache->lock($this->getKey($job), $uniqueFor)->get(); + } + + /** + * Release the lock for the given job. + * + * @param mixed $job + * @return void + */ + public function release($job) + { + $cache = method_exists($job, 'uniqueVia') + ? $job->uniqueVia() + : $this->cache; + + $cache->lock($this->getKey($job))->forceRelease(); + } + + /** + * Generate the lock key for the given job. + * + * @param mixed $job + * @return string + */ + protected function getKey($job) + { + $uniqueId = method_exists($job, 'uniqueId') + ? $job->uniqueId() + : ($job->uniqueId ?? ''); + + return 'laravel_unique_job:'.get_class($job).$uniqueId; + } +} diff --git a/vendor/illuminate/bus/UpdatedBatchJobCounts.php b/vendor/illuminate/bus/UpdatedBatchJobCounts.php new file mode 100644 index 0000000..83d33a4 --- /dev/null +++ b/vendor/illuminate/bus/UpdatedBatchJobCounts.php @@ -0,0 +1,43 @@ +<?php + +namespace Illuminate\Bus; + +class UpdatedBatchJobCounts +{ + /** + * The number of pending jobs remaining for the batch. + * + * @var int + */ + public $pendingJobs; + + /** + * The number of failed jobs that belong to the batch. + * + * @var int + */ + public $failedJobs; + + /** + * Create a new batch job counts object. + * + * @param int $pendingJobs + * @param int $failedJobs + * @return void + */ + public function __construct(int $pendingJobs = 0, int $failedJobs = 0) + { + $this->pendingJobs = $pendingJobs; + $this->failedJobs = $failedJobs; + } + + /** + * Determine if all jobs have run exactly once. + * + * @return bool + */ + public function allJobsHaveRanExactlyOnce() + { + return ($this->pendingJobs - $this->failedJobs) === 0; + } +} diff --git a/vendor/illuminate/bus/composer.json b/vendor/illuminate/bus/composer.json new file mode 100644 index 0000000..44e795a --- /dev/null +++ b/vendor/illuminate/bus/composer.json @@ -0,0 +1,40 @@ +{ + "name": "illuminate/bus", + "description": "The Illuminate Bus package.", + "license": "MIT", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "require": { + "php": "^8.0.2", + "illuminate/collections": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/pipeline": "^9.0", + "illuminate/support": "^9.0" + }, + "autoload": { + "psr-4": { + "Illuminate\\Bus\\": "" + } + }, + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "suggest": { + "illuminate/queue": "Required to use closures when chaining jobs (^7.0)." + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev" +} diff --git a/vendor/illuminate/collections/Arr.php b/vendor/illuminate/collections/Arr.php new file mode 100644 index 0000000..afda8de --- /dev/null +++ b/vendor/illuminate/collections/Arr.php @@ -0,0 +1,825 @@ +<?php + +namespace Illuminate\Support; + +use ArgumentCountError; +use ArrayAccess; +use Illuminate\Support\Traits\Macroable; +use InvalidArgumentException; + +class Arr +{ + use Macroable; + + /** + * Determine whether the given value is array accessible. + * + * @param mixed $value + * @return bool + */ + public static function accessible($value) + { + return is_array($value) || $value instanceof ArrayAccess; + } + + /** + * Add an element to an array using "dot" notation if it doesn't exist. + * + * @param array $array + * @param string|int|float $key + * @param mixed $value + * @return array + */ + public static function add($array, $key, $value) + { + if (is_null(static::get($array, $key))) { + static::set($array, $key, $value); + } + + return $array; + } + + /** + * Collapse an array of arrays into a single array. + * + * @param iterable $array + * @return array + */ + public static function collapse($array) + { + $results = []; + + foreach ($array as $values) { + if ($values instanceof Collection) { + $values = $values->all(); + } elseif (! is_array($values)) { + continue; + } + + $results[] = $values; + } + + return array_merge([], ...$results); + } + + /** + * Cross join the given arrays, returning all possible permutations. + * + * @param iterable ...$arrays + * @return array + */ + public static function crossJoin(...$arrays) + { + $results = [[]]; + + foreach ($arrays as $index => $array) { + $append = []; + + foreach ($results as $product) { + foreach ($array as $item) { + $product[$index] = $item; + + $append[] = $product; + } + } + + $results = $append; + } + + return $results; + } + + /** + * Divide an array into two arrays. One with keys and the other with values. + * + * @param array $array + * @return array + */ + public static function divide($array) + { + return [array_keys($array), array_values($array)]; + } + + /** + * Flatten a multi-dimensional associative array with dots. + * + * @param iterable $array + * @param string $prepend + * @return array + */ + public static function dot($array, $prepend = '') + { + $results = []; + + foreach ($array as $key => $value) { + if (is_array($value) && ! empty($value)) { + $results = array_merge($results, static::dot($value, $prepend.$key.'.')); + } else { + $results[$prepend.$key] = $value; + } + } + + return $results; + } + + /** + * Convert a flatten "dot" notation array into an expanded array. + * + * @param iterable $array + * @return array + */ + public static function undot($array) + { + $results = []; + + foreach ($array as $key => $value) { + static::set($results, $key, $value); + } + + return $results; + } + + /** + * Get all of the given array except for a specified array of keys. + * + * @param array $array + * @param array|string|int|float $keys + * @return array + */ + public static function except($array, $keys) + { + static::forget($array, $keys); + + return $array; + } + + /** + * Determine if the given key exists in the provided array. + * + * @param \ArrayAccess|array $array + * @param string|int $key + * @return bool + */ + public static function exists($array, $key) + { + if ($array instanceof Enumerable) { + return $array->has($key); + } + + if ($array instanceof ArrayAccess) { + return $array->offsetExists($key); + } + + if (is_float($key)) { + $key = (string) $key; + } + + return array_key_exists($key, $array); + } + + /** + * Return the first element in an array passing a given truth test. + * + * @param iterable $array + * @param callable|null $callback + * @param mixed $default + * @return mixed + */ + public static function first($array, callable $callback = null, $default = null) + { + if (is_null($callback)) { + if (empty($array)) { + return value($default); + } + + foreach ($array as $item) { + return $item; + } + } + + foreach ($array as $key => $value) { + if ($callback($value, $key)) { + return $value; + } + } + + return value($default); + } + + /** + * Return the last element in an array passing a given truth test. + * + * @param array $array + * @param callable|null $callback + * @param mixed $default + * @return mixed + */ + public static function last($array, callable $callback = null, $default = null) + { + if (is_null($callback)) { + return empty($array) ? value($default) : end($array); + } + + return static::first(array_reverse($array, true), $callback, $default); + } + + /** + * Flatten a multi-dimensional array into a single level. + * + * @param iterable $array + * @param int $depth + * @return array + */ + public static function flatten($array, $depth = INF) + { + $result = []; + + foreach ($array as $item) { + $item = $item instanceof Collection ? $item->all() : $item; + + if (! is_array($item)) { + $result[] = $item; + } else { + $values = $depth === 1 + ? array_values($item) + : static::flatten($item, $depth - 1); + + foreach ($values as $value) { + $result[] = $value; + } + } + } + + return $result; + } + + /** + * Remove one or many array items from a given array using "dot" notation. + * + * @param array $array + * @param array|string|int|float $keys + * @return void + */ + public static function forget(&$array, $keys) + { + $original = &$array; + + $keys = (array) $keys; + + if (count($keys) === 0) { + return; + } + + foreach ($keys as $key) { + // if the exact key exists in the top-level, remove it + if (static::exists($array, $key)) { + unset($array[$key]); + + continue; + } + + $parts = explode('.', $key); + + // clean up before each pass + $array = &$original; + + while (count($parts) > 1) { + $part = array_shift($parts); + + if (isset($array[$part]) && static::accessible($array[$part])) { + $array = &$array[$part]; + } else { + continue 2; + } + } + + unset($array[array_shift($parts)]); + } + } + + /** + * Get an item from an array using "dot" notation. + * + * @param \ArrayAccess|array $array + * @param string|int|null $key + * @param mixed $default + * @return mixed + */ + public static function get($array, $key, $default = null) + { + if (! static::accessible($array)) { + return value($default); + } + + if (is_null($key)) { + return $array; + } + + if (static::exists($array, $key)) { + return $array[$key]; + } + + if (! str_contains($key, '.')) { + return $array[$key] ?? value($default); + } + + foreach (explode('.', $key) as $segment) { + if (static::accessible($array) && static::exists($array, $segment)) { + $array = $array[$segment]; + } else { + return value($default); + } + } + + return $array; + } + + /** + * Check if an item or items exist in an array using "dot" notation. + * + * @param \ArrayAccess|array $array + * @param string|array $keys + * @return bool + */ + public static function has($array, $keys) + { + $keys = (array) $keys; + + if (! $array || $keys === []) { + return false; + } + + foreach ($keys as $key) { + $subKeyArray = $array; + + if (static::exists($array, $key)) { + continue; + } + + foreach (explode('.', $key) as $segment) { + if (static::accessible($subKeyArray) && static::exists($subKeyArray, $segment)) { + $subKeyArray = $subKeyArray[$segment]; + } else { + return false; + } + } + } + + return true; + } + + /** + * Determine if any of the keys exist in an array using "dot" notation. + * + * @param \ArrayAccess|array $array + * @param string|array $keys + * @return bool + */ + public static function hasAny($array, $keys) + { + if (is_null($keys)) { + return false; + } + + $keys = (array) $keys; + + if (! $array) { + return false; + } + + if ($keys === []) { + return false; + } + + foreach ($keys as $key) { + if (static::has($array, $key)) { + return true; + } + } + + return false; + } + + /** + * Determines if an array is associative. + * + * An array is "associative" if it doesn't have sequential numerical keys beginning with zero. + * + * @param array $array + * @return bool + */ + public static function isAssoc(array $array) + { + $keys = array_keys($array); + + return array_keys($keys) !== $keys; + } + + /** + * Determines if an array is a list. + * + * An array is a "list" if all array keys are sequential integers starting from 0 with no gaps in between. + * + * @param array $array + * @return bool + */ + public static function isList($array) + { + return ! self::isAssoc($array); + } + + /** + * Join all items using a string. The final items can use a separate glue string. + * + * @param array $array + * @param string $glue + * @param string $finalGlue + * @return string + */ + public static function join($array, $glue, $finalGlue = '') + { + if ($finalGlue === '') { + return implode($glue, $array); + } + + if (count($array) === 0) { + return ''; + } + + if (count($array) === 1) { + return end($array); + } + + $finalItem = array_pop($array); + + return implode($glue, $array).$finalGlue.$finalItem; + } + + /** + * Key an associative array by a field or using a callback. + * + * @param array $array + * @param callable|array|string $keyBy + * @return array + */ + public static function keyBy($array, $keyBy) + { + return Collection::make($array)->keyBy($keyBy)->all(); + } + + /** + * Prepend the key names of an associative array. + * + * @param array $array + * @param string $prependWith + * @return array + */ + public static function prependKeysWith($array, $prependWith) + { + return Collection::make($array)->mapWithKeys(function ($item, $key) use ($prependWith) { + return [$prependWith.$key => $item]; + })->all(); + } + + /** + * Get a subset of the items from the given array. + * + * @param array $array + * @param array|string $keys + * @return array + */ + public static function only($array, $keys) + { + return array_intersect_key($array, array_flip((array) $keys)); + } + + /** + * Pluck an array of values from an array. + * + * @param iterable $array + * @param string|array|int|null $value + * @param string|array|null $key + * @return array + */ + public static function pluck($array, $value, $key = null) + { + $results = []; + + [$value, $key] = static::explodePluckParameters($value, $key); + + foreach ($array as $item) { + $itemValue = data_get($item, $value); + + // If the key is "null", we will just append the value to the array and keep + // looping. Otherwise we will key the array using the value of the key we + // received from the developer. Then we'll return the final array form. + if (is_null($key)) { + $results[] = $itemValue; + } else { + $itemKey = data_get($item, $key); + + if (is_object($itemKey) && method_exists($itemKey, '__toString')) { + $itemKey = (string) $itemKey; + } + + $results[$itemKey] = $itemValue; + } + } + + return $results; + } + + /** + * Explode the "value" and "key" arguments passed to "pluck". + * + * @param string|array $value + * @param string|array|null $key + * @return array + */ + protected static function explodePluckParameters($value, $key) + { + $value = is_string($value) ? explode('.', $value) : $value; + + $key = is_null($key) || is_array($key) ? $key : explode('.', $key); + + return [$value, $key]; + } + + /** + * Run a map over each of the items in the array. + * + * @param array $array + * @param callable $callback + * @return array + */ + public static function map(array $array, callable $callback) + { + $keys = array_keys($array); + + try { + $items = array_map($callback, $array, $keys); + } catch (ArgumentCountError) { + $items = array_map($callback, $array); + } + + return array_combine($keys, $items); + } + + /** + * Push an item onto the beginning of an array. + * + * @param array $array + * @param mixed $value + * @param mixed $key + * @return array + */ + public static function prepend($array, $value, $key = null) + { + if (func_num_args() == 2) { + array_unshift($array, $value); + } else { + $array = [$key => $value] + $array; + } + + return $array; + } + + /** + * Get a value from the array, and remove it. + * + * @param array $array + * @param string|int $key + * @param mixed $default + * @return mixed + */ + public static function pull(&$array, $key, $default = null) + { + $value = static::get($array, $key, $default); + + static::forget($array, $key); + + return $value; + } + + /** + * Convert the array into a query string. + * + * @param array $array + * @return string + */ + public static function query($array) + { + return http_build_query($array, '', '&', PHP_QUERY_RFC3986); + } + + /** + * Get one or a specified number of random values from an array. + * + * @param array $array + * @param int|null $number + * @param bool|false $preserveKeys + * @return mixed + * + * @throws \InvalidArgumentException + */ + public static function random($array, $number = null, $preserveKeys = false) + { + $requested = is_null($number) ? 1 : $number; + + $count = count($array); + + if ($requested > $count) { + throw new InvalidArgumentException( + "You requested {$requested} items, but there are only {$count} items available." + ); + } + + if (is_null($number)) { + return $array[array_rand($array)]; + } + + if ((int) $number === 0) { + return []; + } + + $keys = array_rand($array, $number); + + $results = []; + + if ($preserveKeys) { + foreach ((array) $keys as $key) { + $results[$key] = $array[$key]; + } + } else { + foreach ((array) $keys as $key) { + $results[] = $array[$key]; + } + } + + return $results; + } + + /** + * 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. + * + * @param array $array + * @param string|int|null $key + * @param mixed $value + * @return array + */ + public static function set(&$array, $key, $value) + { + if (is_null($key)) { + return $array = $value; + } + + $keys = explode('.', $key); + + foreach ($keys as $i => $key) { + if (count($keys) === 1) { + break; + } + + unset($keys[$i]); + + // 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 final + // values at the correct depth. Then we'll keep digging into the array. + if (! isset($array[$key]) || ! is_array($array[$key])) { + $array[$key] = []; + } + + $array = &$array[$key]; + } + + $array[array_shift($keys)] = $value; + + return $array; + } + + /** + * Shuffle the given array and return the result. + * + * @param array $array + * @param int|null $seed + * @return array + */ + public static function shuffle($array, $seed = null) + { + if (is_null($seed)) { + shuffle($array); + } else { + mt_srand($seed); + shuffle($array); + mt_srand(); + } + + return $array; + } + + /** + * Sort the array using the given callback or "dot" notation. + * + * @param array $array + * @param callable|array|string|null $callback + * @return array + */ + public static function sort($array, $callback = null) + { + return Collection::make($array)->sortBy($callback)->all(); + } + + /** + * Recursively sort an array by keys and values. + * + * @param array $array + * @param int $options + * @param bool $descending + * @return array + */ + public static function sortRecursive($array, $options = SORT_REGULAR, $descending = false) + { + foreach ($array as &$value) { + if (is_array($value)) { + $value = static::sortRecursive($value, $options, $descending); + } + } + + if (static::isAssoc($array)) { + $descending + ? krsort($array, $options) + : ksort($array, $options); + } else { + $descending + ? rsort($array, $options) + : sort($array, $options); + } + + return $array; + } + + /** + * Conditionally compile classes from an array into a CSS class list. + * + * @param array $array + * @return string + */ + public static function toCssClasses($array) + { + $classList = static::wrap($array); + + $classes = []; + + foreach ($classList as $class => $constraint) { + if (is_numeric($class)) { + $classes[] = $constraint; + } elseif ($constraint) { + $classes[] = $class; + } + } + + return implode(' ', $classes); + } + + /** + * Filter the array using the given callback. + * + * @param array $array + * @param callable $callback + * @return array + */ + public static function where($array, callable $callback) + { + return array_filter($array, $callback, ARRAY_FILTER_USE_BOTH); + } + + /** + * Filter items where the value is not null. + * + * @param array $array + * @return array + */ + public static function whereNotNull($array) + { + return static::where($array, function ($value) { + return ! is_null($value); + }); + } + + /** + * If the given value is not an array and not null, wrap it in one. + * + * @param mixed $value + * @return array + */ + public static function wrap($value) + { + if (is_null($value)) { + return []; + } + + return is_array($value) ? $value : [$value]; + } +} diff --git a/vendor/illuminate/collections/Collection.php b/vendor/illuminate/collections/Collection.php new file mode 100644 index 0000000..9c7f784 --- /dev/null +++ b/vendor/illuminate/collections/Collection.php @@ -0,0 +1,1728 @@ +<?php + +namespace Illuminate\Support; + +use ArrayAccess; +use ArrayIterator; +use Illuminate\Contracts\Support\CanBeEscapedWhenCastToString; +use Illuminate\Support\Traits\EnumeratesValues; +use Illuminate\Support\Traits\Macroable; +use stdClass; +use Traversable; + +/** + * @template TKey of array-key + * @template TValue + * + * @implements \ArrayAccess<TKey, TValue> + * @implements \Illuminate\Support\Enumerable<TKey, TValue> + */ +class Collection implements ArrayAccess, CanBeEscapedWhenCastToString, Enumerable +{ + /** + * @use \Illuminate\Support\Traits\EnumeratesValues<TKey, TValue> + */ + use EnumeratesValues, Macroable; + + /** + * The items contained in the collection. + * + * @var array<TKey, TValue> + */ + protected $items = []; + + /** + * Create a new collection. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue>|null $items + * @return void + */ + public function __construct($items = []) + { + $this->items = $this->getArrayableItems($items); + } + + /** + * Create a collection with the given range. + * + * @param int $from + * @param int $to + * @return static<int, int> + */ + public static function range($from, $to) + { + return new static(range($from, $to)); + } + + /** + * Get all of the items in the collection. + * + * @return array<TKey, TValue> + */ + public function all() + { + return $this->items; + } + + /** + * Get a lazy collection for the items in this collection. + * + * @return \Illuminate\Support\LazyCollection<TKey, TValue> + */ + public function lazy() + { + return new LazyCollection($this->items); + } + + /** + * Get the average value of a given key. + * + * @param (callable(TValue): float|int)|string|null $callback + * @return float|int|null + */ + public function avg($callback = null) + { + $callback = $this->valueRetriever($callback); + + $items = $this->map(function ($value) use ($callback) { + return $callback($value); + })->filter(function ($value) { + return ! is_null($value); + }); + + if ($count = $items->count()) { + return $items->sum() / $count; + } + } + + /** + * Get the median of a given key. + * + * @param string|array<array-key, string>|null $key + * @return float|int|null + */ + public function median($key = null) + { + $values = (isset($key) ? $this->pluck($key) : $this) + ->filter(fn ($item) => ! is_null($item)) + ->sort()->values(); + + $count = $values->count(); + + if ($count === 0) { + return; + } + + $middle = (int) ($count / 2); + + if ($count % 2) { + return $values->get($middle); + } + + return (new static([ + $values->get($middle - 1), $values->get($middle), + ]))->average(); + } + + /** + * Get the mode of a given key. + * + * @param string|array<array-key, string>|null $key + * @return array<int, float|int>|null + */ + public function mode($key = null) + { + if ($this->count() === 0) { + return; + } + + $collection = isset($key) ? $this->pluck($key) : $this; + + $counts = new static; + + $collection->each(fn ($value) => $counts[$value] = isset($counts[$value]) ? $counts[$value] + 1 : 1); + + $sorted = $counts->sort(); + + $highestValue = $sorted->last(); + + return $sorted->filter(fn ($value) => $value == $highestValue) + ->sort()->keys()->all(); + } + + /** + * Collapse the collection of items into a single array. + * + * @return static<int, mixed> + */ + public function collapse() + { + return new static(Arr::collapse($this->items)); + } + + /** + * Determine if an item exists in the collection. + * + * @param (callable(TValue, TKey): bool)|TValue|string $key + * @param mixed $operator + * @param mixed $value + * @return bool + */ + public function contains($key, $operator = null, $value = null) + { + if (func_num_args() === 1) { + if ($this->useAsCallable($key)) { + $placeholder = new stdClass; + + return $this->first($key, $placeholder) !== $placeholder; + } + + return in_array($key, $this->items); + } + + return $this->contains($this->operatorForWhere(...func_get_args())); + } + + /** + * Determine if an item exists, using strict comparison. + * + * @param (callable(TValue): bool)|TValue|array-key $key + * @param TValue|null $value + * @return bool + */ + public function containsStrict($key, $value = null) + { + if (func_num_args() === 2) { + return $this->contains(fn ($item) => data_get($item, $key) === $value); + } + + if ($this->useAsCallable($key)) { + return ! is_null($this->first($key)); + } + + return in_array($key, $this->items, true); + } + + /** + * Determine if an item is not contained in the collection. + * + * @param mixed $key + * @param mixed $operator + * @param mixed $value + * @return bool + */ + public function doesntContain($key, $operator = null, $value = null) + { + return ! $this->contains(...func_get_args()); + } + + /** + * Cross join with the given lists, returning all possible permutations. + * + * @template TCrossJoinKey + * @template TCrossJoinValue + * + * @param \Illuminate\Contracts\Support\Arrayable<TCrossJoinKey, TCrossJoinValue>|iterable<TCrossJoinKey, TCrossJoinValue> ...$lists + * @return static<int, array<int, TValue|TCrossJoinValue>> + */ + public function crossJoin(...$lists) + { + return new static(Arr::crossJoin( + $this->items, ...array_map([$this, 'getArrayableItems'], $lists) + )); + } + + /** + * Get the items in the collection that are not present in the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<array-key, TValue>|iterable<array-key, TValue> $items + * @return static + */ + public function diff($items) + { + return new static(array_diff($this->items, $this->getArrayableItems($items))); + } + + /** + * Get the items in the collection that are not present in the given items, using the callback. + * + * @param \Illuminate\Contracts\Support\Arrayable<array-key, TValue>|iterable<array-key, TValue> $items + * @param callable(TValue, TValue): int $callback + * @return static + */ + public function diffUsing($items, callable $callback) + { + return new static(array_udiff($this->items, $this->getArrayableItems($items), $callback)); + } + + /** + * Get the items in the collection whose keys and values are not present in the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function diffAssoc($items) + { + return new static(array_diff_assoc($this->items, $this->getArrayableItems($items))); + } + + /** + * Get the items in the collection whose keys and values are not present in the given items, using the callback. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @param callable(TKey, TKey): int $callback + * @return static + */ + public function diffAssocUsing($items, callable $callback) + { + return new static(array_diff_uassoc($this->items, $this->getArrayableItems($items), $callback)); + } + + /** + * Get the items in the collection whose keys are not present in the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function diffKeys($items) + { + return new static(array_diff_key($this->items, $this->getArrayableItems($items))); + } + + /** + * Get the items in the collection whose keys are not present in the given items, using the callback. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @param callable(TKey, TKey): int $callback + * @return static + */ + public function diffKeysUsing($items, callable $callback) + { + return new static(array_diff_ukey($this->items, $this->getArrayableItems($items), $callback)); + } + + /** + * Retrieve duplicate items from the collection. + * + * @param (callable(TValue): bool)|string|null $callback + * @param bool $strict + * @return static + */ + public function duplicates($callback = null, $strict = false) + { + $items = $this->map($this->valueRetriever($callback)); + + $uniqueItems = $items->unique(null, $strict); + + $compare = $this->duplicateComparator($strict); + + $duplicates = new static; + + foreach ($items as $key => $value) { + if ($uniqueItems->isNotEmpty() && $compare($value, $uniqueItems->first())) { + $uniqueItems->shift(); + } else { + $duplicates[$key] = $value; + } + } + + return $duplicates; + } + + /** + * Retrieve duplicate items from the collection using strict comparison. + * + * @param (callable(TValue): bool)|string|null $callback + * @return static + */ + public function duplicatesStrict($callback = null) + { + return $this->duplicates($callback, true); + } + + /** + * Get the comparison function to detect duplicates. + * + * @param bool $strict + * @return callable(TValue, TValue): bool + */ + protected function duplicateComparator($strict) + { + if ($strict) { + return function ($a, $b) { + return $a === $b; + }; + } + + return function ($a, $b) { + return $a == $b; + }; + } + + /** + * Get all items except for those with the specified keys. + * + * @param \Illuminate\Support\Enumerable<array-key, TKey>|array<array-key, TKey> $keys + * @return static + */ + public function except($keys) + { + if ($keys instanceof Enumerable) { + $keys = $keys->all(); + } elseif (! is_array($keys)) { + $keys = func_get_args(); + } + + return new static(Arr::except($this->items, $keys)); + } + + /** + * Run a filter over each of the items. + * + * @param (callable(TValue, TKey): bool)|null $callback + * @return static + */ + public function filter(callable $callback = null) + { + if ($callback) { + return new static(Arr::where($this->items, $callback)); + } + + return new static(array_filter($this->items)); + } + + /** + * Get the first item from the collection passing the given truth test. + * + * @template TFirstDefault + * + * @param (callable(TValue, TKey): bool)|null $callback + * @param TFirstDefault|(\Closure(): TFirstDefault) $default + * @return TValue|TFirstDefault + */ + public function first(callable $callback = null, $default = null) + { + return Arr::first($this->items, $callback, $default); + } + + /** + * Get a flattened array of the items in the collection. + * + * @param int $depth + * @return static<int, mixed> + */ + public function flatten($depth = INF) + { + return new static(Arr::flatten($this->items, $depth)); + } + + /** + * Flip the items in the collection. + * + * @return static<TValue, TKey> + */ + public function flip() + { + return new static(array_flip($this->items)); + } + + /** + * Remove an item from the collection by key. + * + * @param TKey|array<array-key, TKey> $keys + * @return $this + */ + public function forget($keys) + { + foreach ((array) $keys as $key) { + $this->offsetUnset($key); + } + + return $this; + } + + /** + * Get an item from the collection by key. + * + * @template TGetDefault + * + * @param TKey $key + * @param TGetDefault|(\Closure(): TGetDefault) $default + * @return TValue|TGetDefault + */ + public function get($key, $default = null) + { + if (array_key_exists($key, $this->items)) { + return $this->items[$key]; + } + + return value($default); + } + + /** + * Get an item from the collection by key or add it to collection if it does not exist. + * + * @param mixed $key + * @param mixed $value + * @return mixed + */ + public function getOrPut($key, $value) + { + if (array_key_exists($key, $this->items)) { + return $this->items[$key]; + } + + $this->offsetSet($key, $value = value($value)); + + return $value; + } + + /** + * Group an associative array by a field or using a callback. + * + * @param (callable(TValue, TKey): array-key)|array|string $groupBy + * @param bool $preserveKeys + * @return static<array-key, static<array-key, TValue>> + */ + public function groupBy($groupBy, $preserveKeys = false) + { + if (! $this->useAsCallable($groupBy) && is_array($groupBy)) { + $nextGroups = $groupBy; + + $groupBy = array_shift($nextGroups); + } + + $groupBy = $this->valueRetriever($groupBy); + + $results = []; + + foreach ($this->items as $key => $value) { + $groupKeys = $groupBy($value, $key); + + if (! is_array($groupKeys)) { + $groupKeys = [$groupKeys]; + } + + foreach ($groupKeys as $groupKey) { + $groupKey = match (true) { + is_bool($groupKey) => (int) $groupKey, + $groupKey instanceof \Stringable => (string) $groupKey, + default => $groupKey, + }; + + if (! array_key_exists($groupKey, $results)) { + $results[$groupKey] = new static; + } + + $results[$groupKey]->offsetSet($preserveKeys ? $key : null, $value); + } + } + + $result = new static($results); + + if (! empty($nextGroups)) { + return $result->map->groupBy($nextGroups, $preserveKeys); + } + + return $result; + } + + /** + * Key an associative array by a field or using a callback. + * + * @param (callable(TValue, TKey): array-key)|array|string $keyBy + * @return static<array-key, TValue> + */ + public function keyBy($keyBy) + { + $keyBy = $this->valueRetriever($keyBy); + + $results = []; + + foreach ($this->items as $key => $item) { + $resolvedKey = $keyBy($item, $key); + + if (is_object($resolvedKey)) { + $resolvedKey = (string) $resolvedKey; + } + + $results[$resolvedKey] = $item; + } + + return new static($results); + } + + /** + * Determine if an item exists in the collection by key. + * + * @param TKey|array<array-key, TKey> $key + * @return bool + */ + public function has($key) + { + $keys = is_array($key) ? $key : func_get_args(); + + foreach ($keys as $value) { + if (! array_key_exists($value, $this->items)) { + return false; + } + } + + return true; + } + + /** + * Determine if any of the keys exist in the collection. + * + * @param mixed $key + * @return bool + */ + public function hasAny($key) + { + if ($this->isEmpty()) { + return false; + } + + $keys = is_array($key) ? $key : func_get_args(); + + foreach ($keys as $value) { + if ($this->has($value)) { + return true; + } + } + + return false; + } + + /** + * Concatenate values of a given key as a string. + * + * @param callable|string $value + * @param string|null $glue + * @return string + */ + public function implode($value, $glue = null) + { + if ($this->useAsCallable($value)) { + return implode($glue ?? '', $this->map($value)->all()); + } + + $first = $this->first(); + + if (is_array($first) || (is_object($first) && ! $first instanceof Stringable)) { + return implode($glue ?? '', $this->pluck($value)->all()); + } + + return implode($value ?? '', $this->items); + } + + /** + * Intersect the collection with the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function intersect($items) + { + return new static(array_intersect($this->items, $this->getArrayableItems($items))); + } + + /** + * Intersect the collection with the given items by key. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function intersectByKeys($items) + { + return new static(array_intersect_key( + $this->items, $this->getArrayableItems($items) + )); + } + + /** + * Determine if the collection is empty or not. + * + * @return bool + */ + public function isEmpty() + { + return empty($this->items); + } + + /** + * Determine if the collection contains a single item. + * + * @return bool + */ + public function containsOneItem() + { + return $this->count() === 1; + } + + /** + * Join all items from the collection using a string. The final items can use a separate glue string. + * + * @param string $glue + * @param string $finalGlue + * @return string + */ + public function join($glue, $finalGlue = '') + { + if ($finalGlue === '') { + return $this->implode($glue); + } + + $count = $this->count(); + + if ($count === 0) { + return ''; + } + + if ($count === 1) { + return $this->last(); + } + + $collection = new static($this->items); + + $finalItem = $collection->pop(); + + return $collection->implode($glue).$finalGlue.$finalItem; + } + + /** + * Get the keys of the collection items. + * + * @return static<int, TKey> + */ + public function keys() + { + return new static(array_keys($this->items)); + } + + /** + * Get the last item from the collection. + * + * @template TLastDefault + * + * @param (callable(TValue, TKey): bool)|null $callback + * @param TLastDefault|(\Closure(): TLastDefault) $default + * @return TValue|TLastDefault + */ + public function last(callable $callback = null, $default = null) + { + return Arr::last($this->items, $callback, $default); + } + + /** + * Get the values of a given key. + * + * @param string|int|array<array-key, string> $value + * @param string|null $key + * @return static<int, mixed> + */ + public function pluck($value, $key = null) + { + return new static(Arr::pluck($this->items, $value, $key)); + } + + /** + * Run a map over each of the items. + * + * @template TMapValue + * + * @param callable(TValue, TKey): TMapValue $callback + * @return static<TKey, TMapValue> + */ + public function map(callable $callback) + { + return new static(Arr::map($this->items, $callback)); + } + + /** + * Run a dictionary map over the items. + * + * The callback should return an associative array with a single key/value pair. + * + * @template TMapToDictionaryKey of array-key + * @template TMapToDictionaryValue + * + * @param callable(TValue, TKey): array<TMapToDictionaryKey, TMapToDictionaryValue> $callback + * @return static<TMapToDictionaryKey, array<int, TMapToDictionaryValue>> + */ + public function mapToDictionary(callable $callback) + { + $dictionary = []; + + foreach ($this->items as $key => $item) { + $pair = $callback($item, $key); + + $key = key($pair); + + $value = reset($pair); + + if (! isset($dictionary[$key])) { + $dictionary[$key] = []; + } + + $dictionary[$key][] = $value; + } + + return new static($dictionary); + } + + /** + * Run an associative map over each of the items. + * + * The callback should return an associative array with a single key/value pair. + * + * @template TMapWithKeysKey of array-key + * @template TMapWithKeysValue + * + * @param callable(TValue, TKey): array<TMapWithKeysKey, TMapWithKeysValue> $callback + * @return static<TMapWithKeysKey, TMapWithKeysValue> + */ + public function mapWithKeys(callable $callback) + { + $result = []; + + foreach ($this->items as $key => $value) { + $assoc = $callback($value, $key); + + foreach ($assoc as $mapKey => $mapValue) { + $result[$mapKey] = $mapValue; + } + } + + return new static($result); + } + + /** + * Merge the collection with the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function merge($items) + { + return new static(array_merge($this->items, $this->getArrayableItems($items))); + } + + /** + * Recursively merge the collection with the given items. + * + * @template TMergeRecursiveValue + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TMergeRecursiveValue>|iterable<TKey, TMergeRecursiveValue> $items + * @return static<TKey, TValue|TMergeRecursiveValue> + */ + public function mergeRecursive($items) + { + return new static(array_merge_recursive($this->items, $this->getArrayableItems($items))); + } + + /** + * Create a collection by using this collection for keys and another for its values. + * + * @template TCombineValue + * + * @param \Illuminate\Contracts\Support\Arrayable<array-key, TCombineValue>|iterable<array-key, TCombineValue> $values + * @return static<TValue, TCombineValue> + */ + public function combine($values) + { + return new static(array_combine($this->all(), $this->getArrayableItems($values))); + } + + /** + * Union the collection with the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function union($items) + { + return new static($this->items + $this->getArrayableItems($items)); + } + + /** + * Create a new collection consisting of every n-th element. + * + * @param int $step + * @param int $offset + * @return static + */ + public function nth($step, $offset = 0) + { + $new = []; + + $position = 0; + + foreach ($this->slice($offset)->items as $item) { + if ($position % $step === 0) { + $new[] = $item; + } + + $position++; + } + + return new static($new); + } + + /** + * Get the items with the specified keys. + * + * @param \Illuminate\Support\Enumerable<array-key, TKey>|array<array-key, TKey>|string $keys + * @return static + */ + public function only($keys) + { + if (is_null($keys)) { + return new static($this->items); + } + + if ($keys instanceof Enumerable) { + $keys = $keys->all(); + } + + $keys = is_array($keys) ? $keys : func_get_args(); + + return new static(Arr::only($this->items, $keys)); + } + + /** + * Get and remove the last N items from the collection. + * + * @param int $count + * @return static<int, TValue>|TValue|null + */ + public function pop($count = 1) + { + if ($count === 1) { + return array_pop($this->items); + } + + if ($this->isEmpty()) { + return new static; + } + + $results = []; + + $collectionCount = $this->count(); + + foreach (range(1, min($count, $collectionCount)) as $item) { + array_push($results, array_pop($this->items)); + } + + return new static($results); + } + + /** + * Push an item onto the beginning of the collection. + * + * @param TValue $value + * @param TKey $key + * @return $this + */ + public function prepend($value, $key = null) + { + $this->items = Arr::prepend($this->items, ...func_get_args()); + + return $this; + } + + /** + * Push one or more items onto the end of the collection. + * + * @param TValue ...$values + * @return $this + */ + public function push(...$values) + { + foreach ($values as $value) { + $this->items[] = $value; + } + + return $this; + } + + /** + * Push all of the given items onto the collection. + * + * @param iterable<array-key, TValue> $source + * @return static + */ + public function concat($source) + { + $result = new static($this); + + foreach ($source as $item) { + $result->push($item); + } + + return $result; + } + + /** + * Get and remove an item from the collection. + * + * @template TPullDefault + * + * @param TKey $key + * @param TPullDefault|(\Closure(): TPullDefault) $default + * @return TValue|TPullDefault + */ + public function pull($key, $default = null) + { + return Arr::pull($this->items, $key, $default); + } + + /** + * Put an item in the collection by key. + * + * @param TKey $key + * @param TValue $value + * @return $this + */ + public function put($key, $value) + { + $this->offsetSet($key, $value); + + return $this; + } + + /** + * Get one or a specified number of items randomly from the collection. + * + * @param (callable(self<TKey, TValue>): int)|int|null $number + * @return static<int, TValue>|TValue + * + * @throws \InvalidArgumentException + */ + public function random($number = null) + { + if (is_null($number)) { + return Arr::random($this->items); + } + + if (is_callable($number)) { + return new static(Arr::random($this->items, $number($this))); + } + + return new static(Arr::random($this->items, $number)); + } + + /** + * Replace the collection items with the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function replace($items) + { + return new static(array_replace($this->items, $this->getArrayableItems($items))); + } + + /** + * Recursively replace the collection items with the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function replaceRecursive($items) + { + return new static(array_replace_recursive($this->items, $this->getArrayableItems($items))); + } + + /** + * Reverse items order. + * + * @return static + */ + public function reverse() + { + return new static(array_reverse($this->items, true)); + } + + /** + * Search the collection for a given value and return the corresponding key if successful. + * + * @param TValue|(callable(TValue,TKey): bool) $value + * @param bool $strict + * @return TKey|bool + */ + public function search($value, $strict = false) + { + if (! $this->useAsCallable($value)) { + return array_search($value, $this->items, $strict); + } + + foreach ($this->items as $key => $item) { + if ($value($item, $key)) { + return $key; + } + } + + return false; + } + + /** + * Get and remove the first N items from the collection. + * + * @param int $count + * @return static<int, TValue>|TValue|null + */ + public function shift($count = 1) + { + if ($count === 1) { + return array_shift($this->items); + } + + if ($this->isEmpty()) { + return new static; + } + + $results = []; + + $collectionCount = $this->count(); + + foreach (range(1, min($count, $collectionCount)) as $item) { + array_push($results, array_shift($this->items)); + } + + return new static($results); + } + + /** + * Shuffle the items in the collection. + * + * @param int|null $seed + * @return static + */ + public function shuffle($seed = null) + { + return new static(Arr::shuffle($this->items, $seed)); + } + + /** + * Create chunks representing a "sliding window" view of the items in the collection. + * + * @param int $size + * @param int $step + * @return static<int, static> + */ + public function sliding($size = 2, $step = 1) + { + $chunks = floor(($this->count() - $size) / $step) + 1; + + return static::times($chunks, function ($number) use ($size, $step) { + return $this->slice(($number - 1) * $step, $size); + }); + } + + /** + * Skip the first {$count} items. + * + * @param int $count + * @return static + */ + public function skip($count) + { + return $this->slice($count); + } + + /** + * Skip items in the collection until the given condition is met. + * + * @param TValue|callable(TValue,TKey): bool $value + * @return static + */ + public function skipUntil($value) + { + return new static($this->lazy()->skipUntil($value)->all()); + } + + /** + * Skip items in the collection while the given condition is met. + * + * @param TValue|callable(TValue,TKey): bool $value + * @return static + */ + public function skipWhile($value) + { + return new static($this->lazy()->skipWhile($value)->all()); + } + + /** + * Slice the underlying collection array. + * + * @param int $offset + * @param int|null $length + * @return static + */ + public function slice($offset, $length = null) + { + return new static(array_slice($this->items, $offset, $length, true)); + } + + /** + * Split a collection into a certain number of groups. + * + * @param int $numberOfGroups + * @return static<int, static> + */ + public function split($numberOfGroups) + { + if ($this->isEmpty()) { + return new static; + } + + $groups = new static; + + $groupSize = floor($this->count() / $numberOfGroups); + + $remain = $this->count() % $numberOfGroups; + + $start = 0; + + for ($i = 0; $i < $numberOfGroups; $i++) { + $size = $groupSize; + + if ($i < $remain) { + $size++; + } + + if ($size) { + $groups->push(new static(array_slice($this->items, $start, $size))); + + $start += $size; + } + } + + return $groups; + } + + /** + * Split a collection into a certain number of groups, and fill the first groups completely. + * + * @param int $numberOfGroups + * @return static<int, static> + */ + public function splitIn($numberOfGroups) + { + return $this->chunk(ceil($this->count() / $numberOfGroups)); + } + + /** + * Get the first item in the collection, but only if exactly one item exists. Otherwise, throw an exception. + * + * @param (callable(TValue, TKey): bool)|string $key + * @param mixed $operator + * @param mixed $value + * @return TValue + * + * @throws \Illuminate\Support\ItemNotFoundException + * @throws \Illuminate\Support\MultipleItemsFoundException + */ + public function sole($key = null, $operator = null, $value = null) + { + $filter = func_num_args() > 1 + ? $this->operatorForWhere(...func_get_args()) + : $key; + + $items = $this->unless($filter == null)->filter($filter); + + $count = $items->count(); + + if ($count === 0) { + throw new ItemNotFoundException; + } + + if ($count > 1) { + throw new MultipleItemsFoundException($count); + } + + return $items->first(); + } + + /** + * Get the first item in the collection but throw an exception if no matching items exist. + * + * @param (callable(TValue, TKey): bool)|string $key + * @param mixed $operator + * @param mixed $value + * @return TValue + * + * @throws \Illuminate\Support\ItemNotFoundException + */ + public function firstOrFail($key = null, $operator = null, $value = null) + { + $filter = func_num_args() > 1 + ? $this->operatorForWhere(...func_get_args()) + : $key; + + $placeholder = new stdClass(); + + $item = $this->first($filter, $placeholder); + + if ($item === $placeholder) { + throw new ItemNotFoundException; + } + + return $item; + } + + /** + * Chunk the collection into chunks of the given size. + * + * @param int $size + * @return static<int, static> + */ + public function chunk($size) + { + if ($size <= 0) { + return new static; + } + + $chunks = []; + + foreach (array_chunk($this->items, $size, true) as $chunk) { + $chunks[] = new static($chunk); + } + + return new static($chunks); + } + + /** + * Chunk the collection into chunks with a callback. + * + * @param callable(TValue, TKey, static<int, TValue>): bool $callback + * @return static<int, static<int, TValue>> + */ + public function chunkWhile(callable $callback) + { + return new static( + $this->lazy()->chunkWhile($callback)->mapInto(static::class) + ); + } + + /** + * Sort through each item with a callback. + * + * @param (callable(TValue, TValue): int)|null|int $callback + * @return static + */ + public function sort($callback = null) + { + $items = $this->items; + + $callback && is_callable($callback) + ? uasort($items, $callback) + : asort($items, $callback ?? SORT_REGULAR); + + return new static($items); + } + + /** + * Sort items in descending order. + * + * @param int $options + * @return static + */ + public function sortDesc($options = SORT_REGULAR) + { + $items = $this->items; + + arsort($items, $options); + + return new static($items); + } + + /** + * Sort the collection using the given callback. + * + * @param array<array-key, (callable(TValue, TValue): mixed)|(callable(TValue, TKey): mixed)|string|array{string, string}>|(callable(TValue, TKey): mixed)|string $callback + * @param int $options + * @param bool $descending + * @return static + */ + public function sortBy($callback, $options = SORT_REGULAR, $descending = false) + { + if (is_array($callback) && ! is_callable($callback)) { + return $this->sortByMany($callback); + } + + $results = []; + + $callback = $this->valueRetriever($callback); + + // First we will loop through the items and get the comparator from a callback + // function which we were given. Then, we will sort the returned values and + // grab all the corresponding values for the sorted keys from this array. + foreach ($this->items as $key => $value) { + $results[$key] = $callback($value, $key); + } + + $descending ? arsort($results, $options) + : asort($results, $options); + + // Once we have sorted all of the keys in the array, we will loop through them + // and grab the corresponding model so we can set the underlying items list + // to the sorted version. Then we'll just return the collection instance. + foreach (array_keys($results) as $key) { + $results[$key] = $this->items[$key]; + } + + return new static($results); + } + + /** + * Sort the collection using multiple comparisons. + * + * @param array<array-key, (callable(TValue, TValue): mixed)|(callable(TValue, TKey): mixed)|string|array{string, string}> $comparisons + * @return static + */ + protected function sortByMany(array $comparisons = []) + { + $items = $this->items; + + uasort($items, function ($a, $b) use ($comparisons) { + foreach ($comparisons as $comparison) { + $comparison = Arr::wrap($comparison); + + $prop = $comparison[0]; + + $ascending = Arr::get($comparison, 1, true) === true || + Arr::get($comparison, 1, true) === 'asc'; + + if (! is_string($prop) && is_callable($prop)) { + $result = $prop($a, $b); + } else { + $values = [data_get($a, $prop), data_get($b, $prop)]; + + if (! $ascending) { + $values = array_reverse($values); + } + + $result = $values[0] <=> $values[1]; + } + + if ($result === 0) { + continue; + } + + return $result; + } + }); + + return new static($items); + } + + /** + * Sort the collection in descending order using the given callback. + * + * @param array<array-key, (callable(TValue, TValue): mixed)|(callable(TValue, TKey): mixed)|string|array{string, string}>|(callable(TValue, TKey): mixed)|string $callback + * @param int $options + * @return static + */ + public function sortByDesc($callback, $options = SORT_REGULAR) + { + return $this->sortBy($callback, $options, true); + } + + /** + * Sort the collection keys. + * + * @param int $options + * @param bool $descending + * @return static + */ + public function sortKeys($options = SORT_REGULAR, $descending = false) + { + $items = $this->items; + + $descending ? krsort($items, $options) : ksort($items, $options); + + return new static($items); + } + + /** + * Sort the collection keys in descending order. + * + * @param int $options + * @return static + */ + public function sortKeysDesc($options = SORT_REGULAR) + { + return $this->sortKeys($options, true); + } + + /** + * Sort the collection keys using a callback. + * + * @param callable(TKey, TKey): int $callback + * @return static + */ + public function sortKeysUsing(callable $callback) + { + $items = $this->items; + + uksort($items, $callback); + + return new static($items); + } + + /** + * Splice a portion of the underlying collection array. + * + * @param int $offset + * @param int|null $length + * @param array<array-key, TValue> $replacement + * @return static + */ + public function splice($offset, $length = null, $replacement = []) + { + if (func_num_args() === 1) { + return new static(array_splice($this->items, $offset)); + } + + return new static(array_splice($this->items, $offset, $length, $this->getArrayableItems($replacement))); + } + + /** + * Take the first or last {$limit} items. + * + * @param int $limit + * @return static + */ + public function take($limit) + { + if ($limit < 0) { + return $this->slice($limit, abs($limit)); + } + + return $this->slice(0, $limit); + } + + /** + * Take items in the collection until the given condition is met. + * + * @param TValue|callable(TValue,TKey): bool $value + * @return static + */ + public function takeUntil($value) + { + return new static($this->lazy()->takeUntil($value)->all()); + } + + /** + * Take items in the collection while the given condition is met. + * + * @param TValue|callable(TValue,TKey): bool $value + * @return static + */ + public function takeWhile($value) + { + return new static($this->lazy()->takeWhile($value)->all()); + } + + /** + * Transform each item in the collection using a callback. + * + * @param callable(TValue, TKey): TValue $callback + * @return $this + */ + public function transform(callable $callback) + { + $this->items = $this->map($callback)->all(); + + return $this; + } + + /** + * Convert a flatten "dot" notation array into an expanded array. + * + * @return static + */ + public function undot() + { + return new static(Arr::undot($this->all())); + } + + /** + * Return only unique items from the collection array. + * + * @param (callable(TValue, TKey): mixed)|string|null $key + * @param bool $strict + * @return static + */ + public function unique($key = null, $strict = false) + { + if (is_null($key) && $strict === false) { + return new static(array_unique($this->items, SORT_REGULAR)); + } + + $callback = $this->valueRetriever($key); + + $exists = []; + + return $this->reject(function ($item, $key) use ($callback, $strict, &$exists) { + if (in_array($id = $callback($item, $key), $exists, $strict)) { + return true; + } + + $exists[] = $id; + }); + } + + /** + * Reset the keys on the underlying array. + * + * @return static<int, TValue> + */ + public function values() + { + return new static(array_values($this->items)); + } + + /** + * Zip the collection together with one or more arrays. + * + * e.g. new Collection([1, 2, 3])->zip([4, 5, 6]); + * => [[1, 4], [2, 5], [3, 6]] + * + * @template TZipValue + * + * @param \Illuminate\Contracts\Support\Arrayable<array-key, TZipValue>|iterable<array-key, TZipValue> ...$items + * @return static<int, static<int, TValue|TZipValue>> + */ + public function zip($items) + { + $arrayableItems = array_map(function ($items) { + return $this->getArrayableItems($items); + }, func_get_args()); + + $params = array_merge([function () { + return new static(func_get_args()); + }, $this->items], $arrayableItems); + + return new static(array_map(...$params)); + } + + /** + * Pad collection to the specified length with a value. + * + * @template TPadValue + * + * @param int $size + * @param TPadValue $value + * @return static<int, TValue|TPadValue> + */ + public function pad($size, $value) + { + return new static(array_pad($this->items, $size, $value)); + } + + /** + * Get an iterator for the items. + * + * @return \ArrayIterator<TKey, TValue> + */ + public function getIterator(): Traversable + { + return new ArrayIterator($this->items); + } + + /** + * Count the number of items in the collection. + * + * @return int + */ + public function count(): int + { + return count($this->items); + } + + /** + * Count the number of items in the collection by a field or using a callback. + * + * @param (callable(TValue, TKey): mixed)|string|null $countBy + * @return static<array-key, int> + */ + public function countBy($countBy = null) + { + return new static($this->lazy()->countBy($countBy)->all()); + } + + /** + * Add an item to the collection. + * + * @param TValue $item + * @return $this + */ + public function add($item) + { + $this->items[] = $item; + + return $this; + } + + /** + * Get a base Support collection instance from this collection. + * + * @return \Illuminate\Support\Collection<TKey, TValue> + */ + public function toBase() + { + return new self($this); + } + + /** + * Determine if an item exists at an offset. + * + * @param TKey $key + * @return bool + */ + public function offsetExists($key): bool + { + return isset($this->items[$key]); + } + + /** + * Get an item at a given offset. + * + * @param TKey $key + * @return TValue + */ + public function offsetGet($key): mixed + { + return $this->items[$key]; + } + + /** + * Set the item at a given offset. + * + * @param TKey|null $key + * @param TValue $value + * @return void + */ + public function offsetSet($key, $value): void + { + if (is_null($key)) { + $this->items[] = $value; + } else { + $this->items[$key] = $value; + } + } + + /** + * Unset the item at a given offset. + * + * @param TKey $key + * @return void + */ + public function offsetUnset($key): void + { + unset($this->items[$key]); + } +} diff --git a/vendor/illuminate/collections/Enumerable.php b/vendor/illuminate/collections/Enumerable.php new file mode 100644 index 0000000..c9d82ca --- /dev/null +++ b/vendor/illuminate/collections/Enumerable.php @@ -0,0 +1,1258 @@ +<?php + +namespace Illuminate\Support; + +use CachingIterator; +use Countable; +use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Contracts\Support\Jsonable; +use IteratorAggregate; +use JsonSerializable; +use Traversable; + +/** + * @template TKey of array-key + * @template TValue + * + * @extends \Illuminate\Contracts\Support\Arrayable<TKey, TValue> + * @extends \IteratorAggregate<TKey, TValue> + */ +interface Enumerable extends Arrayable, Countable, IteratorAggregate, Jsonable, JsonSerializable +{ + /** + * Create a new collection instance if the value isn't one already. + * + * @template TMakeKey of array-key + * @template TMakeValue + * + * @param \Illuminate\Contracts\Support\Arrayable<TMakeKey, TMakeValue>|iterable<TMakeKey, TMakeValue>|null $items + * @return static<TMakeKey, TMakeValue> + */ + public static function make($items = []); + + /** + * Create a new instance by invoking the callback a given amount of times. + * + * @param int $number + * @param callable|null $callback + * @return static + */ + public static function times($number, callable $callback = null); + + /** + * Create a collection with the given range. + * + * @param int $from + * @param int $to + * @return static + */ + public static function range($from, $to); + + /** + * Wrap the given value in a collection if applicable. + * + * @template TWrapKey of array-key + * @template TWrapValue + * + * @param iterable<TWrapKey, TWrapValue> $value + * @return static<TWrapKey, TWrapValue> + */ + public static function wrap($value); + + /** + * Get the underlying items from the given collection if applicable. + * + * @template TUnwrapKey of array-key + * @template TUnwrapValue + * + * @param array<TUnwrapKey, TUnwrapValue>|static<TUnwrapKey, TUnwrapValue> $value + * @return array<TUnwrapKey, TUnwrapValue> + */ + public static function unwrap($value); + + /** + * Create a new instance with no items. + * + * @return static + */ + public static function empty(); + + /** + * Get all items in the enumerable. + * + * @return array + */ + public function all(); + + /** + * Alias for the "avg" method. + * + * @param (callable(TValue): float|int)|string|null $callback + * @return float|int|null + */ + public function average($callback = null); + + /** + * Get the median of a given key. + * + * @param string|array<array-key, string>|null $key + * @return float|int|null + */ + public function median($key = null); + + /** + * Get the mode of a given key. + * + * @param string|array<array-key, string>|null $key + * @return array<int, float|int>|null + */ + public function mode($key = null); + + /** + * Collapse the items into a single enumerable. + * + * @return static<int, mixed> + */ + public function collapse(); + + /** + * Alias for the "contains" method. + * + * @param (callable(TValue, TKey): bool)|TValue|string $key + * @param mixed $operator + * @param mixed $value + * @return bool + */ + public function some($key, $operator = null, $value = null); + + /** + * Determine if an item exists, using strict comparison. + * + * @param (callable(TValue): bool)|TValue|array-key $key + * @param TValue|null $value + * @return bool + */ + public function containsStrict($key, $value = null); + + /** + * Get the average value of a given key. + * + * @param (callable(TValue): float|int)|string|null $callback + * @return float|int|null + */ + public function avg($callback = null); + + /** + * Determine if an item exists in the enumerable. + * + * @param (callable(TValue, TKey): bool)|TValue|string $key + * @param mixed $operator + * @param mixed $value + * @return bool + */ + public function contains($key, $operator = null, $value = null); + + /** + * Determine if an item is not contained in the collection. + * + * @param mixed $key + * @param mixed $operator + * @param mixed $value + * @return bool + */ + public function doesntContain($key, $operator = null, $value = null); + + /** + * Cross join with the given lists, returning all possible permutations. + * + * @template TCrossJoinKey + * @template TCrossJoinValue + * + * @param \Illuminate\Contracts\Support\Arrayable<TCrossJoinKey, TCrossJoinValue>|iterable<TCrossJoinKey, TCrossJoinValue> ...$lists + * @return static<int, array<int, TValue|TCrossJoinValue>> + */ + public function crossJoin(...$lists); + + /** + * Dump the collection and end the script. + * + * @param mixed ...$args + * @return never + */ + public function dd(...$args); + + /** + * Dump the collection. + * + * @return $this + */ + public function dump(); + + /** + * Get the items that are not present in the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<array-key, TValue>|iterable<array-key, TValue> $items + * @return static + */ + public function diff($items); + + /** + * Get the items that are not present in the given items, using the callback. + * + * @param \Illuminate\Contracts\Support\Arrayable<array-key, TValue>|iterable<array-key, TValue> $items + * @param callable(TValue, TValue): int $callback + * @return static + */ + public function diffUsing($items, callable $callback); + + /** + * Get the items whose keys and values are not present in the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function diffAssoc($items); + + /** + * Get the items whose keys and values are not present in the given items, using the callback. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @param callable(TKey, TKey): int $callback + * @return static + */ + public function diffAssocUsing($items, callable $callback); + + /** + * Get the items whose keys are not present in the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function diffKeys($items); + + /** + * Get the items whose keys are not present in the given items, using the callback. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @param callable(TKey, TKey): int $callback + * @return static + */ + public function diffKeysUsing($items, callable $callback); + + /** + * Retrieve duplicate items. + * + * @param (callable(TValue): bool)|string|null $callback + * @param bool $strict + * @return static + */ + public function duplicates($callback = null, $strict = false); + + /** + * Retrieve duplicate items using strict comparison. + * + * @param (callable(TValue): bool)|string|null $callback + * @return static + */ + public function duplicatesStrict($callback = null); + + /** + * Execute a callback over each item. + * + * @param callable(TValue, TKey): mixed $callback + * @return $this + */ + public function each(callable $callback); + + /** + * Execute a callback over each nested chunk of items. + * + * @param callable $callback + * @return static + */ + public function eachSpread(callable $callback); + + /** + * Determine if all items pass the given truth test. + * + * @param (callable(TValue, TKey): bool)|TValue|string $key + * @param mixed $operator + * @param mixed $value + * @return bool + */ + public function every($key, $operator = null, $value = null); + + /** + * Get all items except for those with the specified keys. + * + * @param \Illuminate\Support\Enumerable<array-key, TKey>|array<array-key, TKey> $keys + * @return static + */ + public function except($keys); + + /** + * Run a filter over each of the items. + * + * @param (callable(TValue): bool)|null $callback + * @return static + */ + public function filter(callable $callback = null); + + /** + * Apply the callback if the given "value" is (or resolves to) truthy. + * + * @template TWhenReturnType as null + * + * @param bool $value + * @param (callable($this): TWhenReturnType)|null $callback + * @param (callable($this): TWhenReturnType)|null $default + * @return $this|TWhenReturnType + */ + public function when($value, callable $callback = null, callable $default = null); + + /** + * Apply the callback if the collection is empty. + * + * @template TWhenEmptyReturnType + * + * @param (callable($this): TWhenEmptyReturnType) $callback + * @param (callable($this): TWhenEmptyReturnType)|null $default + * @return $this|TWhenEmptyReturnType + */ + public function whenEmpty(callable $callback, callable $default = null); + + /** + * Apply the callback if the collection is not empty. + * + * @template TWhenNotEmptyReturnType + * + * @param callable($this): TWhenNotEmptyReturnType $callback + * @param (callable($this): TWhenNotEmptyReturnType)|null $default + * @return $this|TWhenNotEmptyReturnType + */ + public function whenNotEmpty(callable $callback, callable $default = null); + + /** + * Apply the callback if the given "value" is (or resolves to) truthy. + * + * @template TUnlessReturnType + * + * @param bool $value + * @param (callable($this): TUnlessReturnType) $callback + * @param (callable($this): TUnlessReturnType)|null $default + * @return $this|TUnlessReturnType + */ + public function unless($value, callable $callback, callable $default = null); + + /** + * Apply the callback unless the collection is empty. + * + * @template TUnlessEmptyReturnType + * + * @param callable($this): TUnlessEmptyReturnType $callback + * @param (callable($this): TUnlessEmptyReturnType)|null $default + * @return $this|TUnlessEmptyReturnType + */ + public function unlessEmpty(callable $callback, callable $default = null); + + /** + * Apply the callback unless the collection is not empty. + * + * @template TUnlessNotEmptyReturnType + * + * @param callable($this): TUnlessNotEmptyReturnType $callback + * @param (callable($this): TUnlessNotEmptyReturnType)|null $default + * @return $this|TUnlessNotEmptyReturnType + */ + public function unlessNotEmpty(callable $callback, callable $default = null); + + /** + * Filter items by the given key value pair. + * + * @param string $key + * @param mixed $operator + * @param mixed $value + * @return static + */ + public function where($key, $operator = null, $value = null); + + /** + * Filter items where the value for the given key is null. + * + * @param string|null $key + * @return static + */ + public function whereNull($key = null); + + /** + * Filter items where the value for the given key is not null. + * + * @param string|null $key + * @return static + */ + public function whereNotNull($key = null); + + /** + * Filter items by the given key value pair using strict comparison. + * + * @param string $key + * @param mixed $value + * @return static + */ + public function whereStrict($key, $value); + + /** + * Filter items by the given key value pair. + * + * @param string $key + * @param \Illuminate\Contracts\Support\Arrayable|iterable $values + * @param bool $strict + * @return static + */ + public function whereIn($key, $values, $strict = false); + + /** + * Filter items by the given key value pair using strict comparison. + * + * @param string $key + * @param \Illuminate\Contracts\Support\Arrayable|iterable $values + * @return static + */ + public function whereInStrict($key, $values); + + /** + * Filter items such that the value of the given key is between the given values. + * + * @param string $key + * @param \Illuminate\Contracts\Support\Arrayable|iterable $values + * @return static + */ + public function whereBetween($key, $values); + + /** + * Filter items such that the value of the given key is not between the given values. + * + * @param string $key + * @param \Illuminate\Contracts\Support\Arrayable|iterable $values + * @return static + */ + public function whereNotBetween($key, $values); + + /** + * Filter items by the given key value pair. + * + * @param string $key + * @param \Illuminate\Contracts\Support\Arrayable|iterable $values + * @param bool $strict + * @return static + */ + public function whereNotIn($key, $values, $strict = false); + + /** + * Filter items by the given key value pair using strict comparison. + * + * @param string $key + * @param \Illuminate\Contracts\Support\Arrayable|iterable $values + * @return static + */ + public function whereNotInStrict($key, $values); + + /** + * Filter the items, removing any items that don't match the given type(s). + * + * @template TWhereInstanceOf + * + * @param class-string<TWhereInstanceOf>|array<array-key, class-string<TWhereInstanceOf>> $type + * @return static<TKey, TWhereInstanceOf> + */ + public function whereInstanceOf($type); + + /** + * Get the first item from the enumerable passing the given truth test. + * + * @template TFirstDefault + * + * @param (callable(TValue,TKey): bool)|null $callback + * @param TFirstDefault|(\Closure(): TFirstDefault) $default + * @return TValue|TFirstDefault + */ + public function first(callable $callback = null, $default = null); + + /** + * Get the first item by the given key value pair. + * + * @param string $key + * @param mixed $operator + * @param mixed $value + * @return TValue|null + */ + public function firstWhere($key, $operator = null, $value = null); + + /** + * Get a flattened array of the items in the collection. + * + * @param int $depth + * @return static + */ + public function flatten($depth = INF); + + /** + * Flip the values with their keys. + * + * @return static<TValue, TKey> + */ + public function flip(); + + /** + * Get an item from the collection by key. + * + * @template TGetDefault + * + * @param TKey $key + * @param TGetDefault|(\Closure(): TGetDefault) $default + * @return TValue|TGetDefault + */ + public function get($key, $default = null); + + /** + * Group an associative array by a field or using a callback. + * + * @param (callable(TValue, TKey): array-key)|array|string $groupBy + * @param bool $preserveKeys + * @return static<array-key, static<array-key, TValue>> + */ + public function groupBy($groupBy, $preserveKeys = false); + + /** + * Key an associative array by a field or using a callback. + * + * @param (callable(TValue, TKey): array-key)|array|string $keyBy + * @return static<array-key, TValue> + */ + public function keyBy($keyBy); + + /** + * Determine if an item exists in the collection by key. + * + * @param TKey|array<array-key, TKey> $key + * @return bool + */ + public function has($key); + + /** + * Determine if any of the keys exist in the collection. + * + * @param mixed $key + * @return bool + */ + public function hasAny($key); + + /** + * Concatenate values of a given key as a string. + * + * @param string $value + * @param string|null $glue + * @return string + */ + public function implode($value, $glue = null); + + /** + * Intersect the collection with the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function intersect($items); + + /** + * Intersect the collection with the given items by key. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function intersectByKeys($items); + + /** + * Determine if the collection is empty or not. + * + * @return bool + */ + public function isEmpty(); + + /** + * Determine if the collection is not empty. + * + * @return bool + */ + public function isNotEmpty(); + + /** + * Determine if the collection contains a single item. + * + * @return bool + */ + public function containsOneItem(); + + /** + * Join all items from the collection using a string. The final items can use a separate glue string. + * + * @param string $glue + * @param string $finalGlue + * @return string + */ + public function join($glue, $finalGlue = ''); + + /** + * Get the keys of the collection items. + * + * @return static<int, TKey> + */ + public function keys(); + + /** + * Get the last item from the collection. + * + * @template TLastDefault + * + * @param (callable(TValue, TKey): bool)|null $callback + * @param TLastDefault|(\Closure(): TLastDefault) $default + * @return TValue|TLastDefault + */ + public function last(callable $callback = null, $default = null); + + /** + * Run a map over each of the items. + * + * @template TMapValue + * + * @param callable(TValue, TKey): TMapValue $callback + * @return static<TKey, TMapValue> + */ + public function map(callable $callback); + + /** + * Run a map over each nested chunk of items. + * + * @param callable $callback + * @return static + */ + public function mapSpread(callable $callback); + + /** + * Run a dictionary map over the items. + * + * The callback should return an associative array with a single key/value pair. + * + * @template TMapToDictionaryKey of array-key + * @template TMapToDictionaryValue + * + * @param callable(TValue, TKey): array<TMapToDictionaryKey, TMapToDictionaryValue> $callback + * @return static<TMapToDictionaryKey, array<int, TMapToDictionaryValue>> + */ + public function mapToDictionary(callable $callback); + + /** + * Run a grouping map over the items. + * + * The callback should return an associative array with a single key/value pair. + * + * @template TMapToGroupsKey of array-key + * @template TMapToGroupsValue + * + * @param callable(TValue, TKey): array<TMapToGroupsKey, TMapToGroupsValue> $callback + * @return static<TMapToGroupsKey, static<int, TMapToGroupsValue>> + */ + public function mapToGroups(callable $callback); + + /** + * Run an associative map over each of the items. + * + * The callback should return an associative array with a single key/value pair. + * + * @template TMapWithKeysKey of array-key + * @template TMapWithKeysValue + * + * @param callable(TValue, TKey): array<TMapWithKeysKey, TMapWithKeysValue> $callback + * @return static<TMapWithKeysKey, TMapWithKeysValue> + */ + public function mapWithKeys(callable $callback); + + /** + * Map a collection and flatten the result by a single level. + * + * @template TFlatMapKey of array-key + * @template TFlatMapValue + * + * @param callable(TValue, TKey): (\Illuminate\Support\Collection<TFlatMapKey, TFlatMapValue>|array<TFlatMapKey, TFlatMapValue>) $callback + * @return static<TFlatMapKey, TFlatMapValue> + */ + public function flatMap(callable $callback); + + /** + * Map the values into a new class. + * + * @template TMapIntoValue + * + * @param class-string<TMapIntoValue> $class + * @return static<TKey, TMapIntoValue> + */ + public function mapInto($class); + + /** + * Merge the collection with the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function merge($items); + + /** + * Recursively merge the collection with the given items. + * + * @template TMergeRecursiveValue + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TMergeRecursiveValue>|iterable<TKey, TMergeRecursiveValue> $items + * @return static<TKey, TValue|TMergeRecursiveValue> + */ + public function mergeRecursive($items); + + /** + * Create a collection by using this collection for keys and another for its values. + * + * @template TCombineValue + * + * @param \Illuminate\Contracts\Support\Arrayable<array-key, TCombineValue>|iterable<array-key, TCombineValue> $values + * @return static<TValue, TCombineValue> + */ + public function combine($values); + + /** + * Union the collection with the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function union($items); + + /** + * Get the min value of a given key. + * + * @param (callable(TValue):mixed)|string|null $callback + * @return mixed + */ + public function min($callback = null); + + /** + * Get the max value of a given key. + * + * @param (callable(TValue):mixed)|string|null $callback + * @return mixed + */ + public function max($callback = null); + + /** + * Create a new collection consisting of every n-th element. + * + * @param int $step + * @param int $offset + * @return static + */ + public function nth($step, $offset = 0); + + /** + * Get the items with the specified keys. + * + * @param \Illuminate\Support\Enumerable<array-key, TKey>|array<array-key, TKey>|string $keys + * @return static + */ + public function only($keys); + + /** + * "Paginate" the collection by slicing it into a smaller collection. + * + * @param int $page + * @param int $perPage + * @return static + */ + public function forPage($page, $perPage); + + /** + * Partition the collection into two arrays using the given callback or key. + * + * @param (callable(TValue, TKey): bool)|TValue|string $key + * @param mixed $operator + * @param mixed $value + * @return static<int<0, 1>, static<TKey, TValue>> + */ + public function partition($key, $operator = null, $value = null); + + /** + * Push all of the given items onto the collection. + * + * @param iterable<array-key, TValue> $source + * @return static + */ + public function concat($source); + + /** + * Get one or a specified number of items randomly from the collection. + * + * @param int|null $number + * @return static<int, TValue>|TValue + * + * @throws \InvalidArgumentException + */ + public function random($number = null); + + /** + * Reduce the collection to a single value. + * + * @template TReduceInitial + * @template TReduceReturnType + * + * @param callable(TReduceInitial|TReduceReturnType, TValue, TKey): TReduceReturnType $callback + * @param TReduceInitial $initial + * @return TReduceReturnType + */ + public function reduce(callable $callback, $initial = null); + + /** + * Reduce the collection to multiple aggregate values. + * + * @param callable $callback + * @param mixed ...$initial + * @return array + * + * @throws \UnexpectedValueException + */ + public function reduceSpread(callable $callback, ...$initial); + + /** + * Replace the collection items with the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function replace($items); + + /** + * Recursively replace the collection items with the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function replaceRecursive($items); + + /** + * Reverse items order. + * + * @return static + */ + public function reverse(); + + /** + * Search the collection for a given value and return the corresponding key if successful. + * + * @param TValue|callable(TValue,TKey): bool $value + * @param bool $strict + * @return TKey|bool + */ + public function search($value, $strict = false); + + /** + * Shuffle the items in the collection. + * + * @param int|null $seed + * @return static + */ + public function shuffle($seed = null); + + /** + * Create chunks representing a "sliding window" view of the items in the collection. + * + * @param int $size + * @param int $step + * @return static<int, static> + */ + public function sliding($size = 2, $step = 1); + + /** + * Skip the first {$count} items. + * + * @param int $count + * @return static + */ + public function skip($count); + + /** + * Skip items in the collection until the given condition is met. + * + * @param TValue|callable(TValue,TKey): bool $value + * @return static + */ + public function skipUntil($value); + + /** + * Skip items in the collection while the given condition is met. + * + * @param TValue|callable(TValue,TKey): bool $value + * @return static + */ + public function skipWhile($value); + + /** + * Get a slice of items from the enumerable. + * + * @param int $offset + * @param int|null $length + * @return static + */ + public function slice($offset, $length = null); + + /** + * Split a collection into a certain number of groups. + * + * @param int $numberOfGroups + * @return static<int, static> + */ + public function split($numberOfGroups); + + /** + * Get the first item in the collection, but only if exactly one item exists. Otherwise, throw an exception. + * + * @param (callable(TValue, TKey): bool)|string $key + * @param mixed $operator + * @param mixed $value + * @return TValue + * + * @throws \Illuminate\Support\ItemNotFoundException + * @throws \Illuminate\Support\MultipleItemsFoundException + */ + public function sole($key = null, $operator = null, $value = null); + + /** + * Get the first item in the collection but throw an exception if no matching items exist. + * + * @param (callable(TValue, TKey): bool)|string $key + * @param mixed $operator + * @param mixed $value + * @return TValue + * + * @throws \Illuminate\Support\ItemNotFoundException + */ + public function firstOrFail($key = null, $operator = null, $value = null); + + /** + * Chunk the collection into chunks of the given size. + * + * @param int $size + * @return static<int, static> + */ + public function chunk($size); + + /** + * Chunk the collection into chunks with a callback. + * + * @param callable(TValue, TKey, static<int, TValue>): bool $callback + * @return static<int, static<int, TValue>> + */ + public function chunkWhile(callable $callback); + + /** + * Split a collection into a certain number of groups, and fill the first groups completely. + * + * @param int $numberOfGroups + * @return static<int, static> + */ + public function splitIn($numberOfGroups); + + /** + * Sort through each item with a callback. + * + * @param (callable(TValue, TValue): int)|null|int $callback + * @return static + */ + public function sort($callback = null); + + /** + * Sort items in descending order. + * + * @param int $options + * @return static + */ + public function sortDesc($options = SORT_REGULAR); + + /** + * Sort the collection using the given callback. + * + * @param array<array-key, (callable(TValue, TValue): mixed)|(callable(TValue, TKey): mixed)|string|array{string, string}>|(callable(TValue, TKey): mixed)|string $callback + * @param int $options + * @param bool $descending + * @return static + */ + public function sortBy($callback, $options = SORT_REGULAR, $descending = false); + + /** + * Sort the collection in descending order using the given callback. + * + * @param array<array-key, (callable(TValue, TValue): mixed)|(callable(TValue, TKey): mixed)|string|array{string, string}>|(callable(TValue, TKey): mixed)|string $callback + * @param int $options + * @return static + */ + public function sortByDesc($callback, $options = SORT_REGULAR); + + /** + * Sort the collection keys. + * + * @param int $options + * @param bool $descending + * @return static + */ + public function sortKeys($options = SORT_REGULAR, $descending = false); + + /** + * Sort the collection keys in descending order. + * + * @param int $options + * @return static + */ + public function sortKeysDesc($options = SORT_REGULAR); + + /** + * Sort the collection keys using a callback. + * + * @param callable(TKey, TKey): int $callback + * @return static + */ + public function sortKeysUsing(callable $callback); + + /** + * Get the sum of the given values. + * + * @param (callable(TValue): mixed)|string|null $callback + * @return mixed + */ + public function sum($callback = null); + + /** + * Take the first or last {$limit} items. + * + * @param int $limit + * @return static + */ + public function take($limit); + + /** + * Take items in the collection until the given condition is met. + * + * @param TValue|callable(TValue,TKey): bool $value + * @return static + */ + public function takeUntil($value); + + /** + * Take items in the collection while the given condition is met. + * + * @param TValue|callable(TValue,TKey): bool $value + * @return static + */ + public function takeWhile($value); + + /** + * Pass the collection to the given callback and then return it. + * + * @param callable(TValue): mixed $callback + * @return $this + */ + public function tap(callable $callback); + + /** + * Pass the enumerable to the given callback and return the result. + * + * @template TPipeReturnType + * + * @param callable($this): TPipeReturnType $callback + * @return TPipeReturnType + */ + public function pipe(callable $callback); + + /** + * Pass the collection into a new class. + * + * @param class-string $class + * @return mixed + */ + public function pipeInto($class); + + /** + * Pass the collection through a series of callable pipes and return the result. + * + * @param array<callable> $pipes + * @return mixed + */ + public function pipeThrough($pipes); + + /** + * Get the values of a given key. + * + * @param string|array<array-key, string> $value + * @param string|null $key + * @return static<int, mixed> + */ + public function pluck($value, $key = null); + + /** + * Create a collection of all elements that do not pass a given truth test. + * + * @param (callable(TValue, TKey): bool)|bool|TValue $callback + * @return static + */ + public function reject($callback = true); + + /** + * Convert a flatten "dot" notation array into an expanded array. + * + * @return static + */ + public function undot(); + + /** + * Return only unique items from the collection array. + * + * @param (callable(TValue, TKey): mixed)|string|null $key + * @param bool $strict + * @return static + */ + public function unique($key = null, $strict = false); + + /** + * Return only unique items from the collection array using strict comparison. + * + * @param (callable(TValue, TKey): mixed)|string|null $key + * @return static + */ + public function uniqueStrict($key = null); + + /** + * Reset the keys on the underlying array. + * + * @return static<int, TValue> + */ + public function values(); + + /** + * Pad collection to the specified length with a value. + * + * @template TPadValue + * + * @param int $size + * @param TPadValue $value + * @return static<int, TValue|TPadValue> + */ + public function pad($size, $value); + + /** + * Get the values iterator. + * + * @return \Traversable<TKey, TValue> + */ + public function getIterator(): Traversable; + + /** + * Count the number of items in the collection. + * + * @return int + */ + public function count(): int; + + /** + * Count the number of items in the collection by a field or using a callback. + * + * @param (callable(TValue, TKey): mixed)|string|null $countBy + * @return static<array-key, int> + */ + public function countBy($countBy = null); + + /** + * Zip the collection together with one or more arrays. + * + * e.g. new Collection([1, 2, 3])->zip([4, 5, 6]); + * => [[1, 4], [2, 5], [3, 6]] + * + * @template TZipValue + * + * @param \Illuminate\Contracts\Support\Arrayable<array-key, TZipValue>|iterable<array-key, TZipValue> ...$items + * @return static<int, static<int, TValue|TZipValue>> + */ + public function zip($items); + + /** + * Collect the values into a collection. + * + * @return \Illuminate\Support\Collection<TKey, TValue> + */ + public function collect(); + + /** + * Get the collection of items as a plain array. + * + * @return array<TKey, mixed> + */ + public function toArray(); + + /** + * Convert the object into something JSON serializable. + * + * @return mixed + */ + public function jsonSerialize(): mixed; + + /** + * Get the collection of items as JSON. + * + * @param int $options + * @return string + */ + public function toJson($options = 0); + + /** + * Get a CachingIterator instance. + * + * @param int $flags + * @return \CachingIterator + */ + public function getCachingIterator($flags = CachingIterator::CALL_TOSTRING); + + /** + * Convert the collection to its string representation. + * + * @return string + */ + public function __toString(); + + /** + * Indicate that the model's string representation should be escaped when __toString is invoked. + * + * @param bool $escape + * @return $this + */ + public function escapeWhenCastingToString($escape = true); + + /** + * Add a method to the list of proxied methods. + * + * @param string $method + * @return void + */ + public static function proxy($method); + + /** + * Dynamically access collection proxies. + * + * @param string $key + * @return mixed + * + * @throws \Exception + */ + public function __get($key); +} diff --git a/vendor/illuminate/collections/HigherOrderCollectionProxy.php b/vendor/illuminate/collections/HigherOrderCollectionProxy.php new file mode 100644 index 0000000..106356c --- /dev/null +++ b/vendor/illuminate/collections/HigherOrderCollectionProxy.php @@ -0,0 +1,63 @@ +<?php + +namespace Illuminate\Support; + +/** + * @mixin \Illuminate\Support\Enumerable + */ +class HigherOrderCollectionProxy +{ + /** + * The collection being operated on. + * + * @var \Illuminate\Support\Enumerable + */ + protected $collection; + + /** + * The method being proxied. + * + * @var string + */ + protected $method; + + /** + * Create a new proxy instance. + * + * @param \Illuminate\Support\Enumerable $collection + * @param string $method + * @return void + */ + public function __construct(Enumerable $collection, $method) + { + $this->method = $method; + $this->collection = $collection; + } + + /** + * Proxy accessing an attribute onto the collection items. + * + * @param string $key + * @return mixed + */ + public function __get($key) + { + return $this->collection->{$this->method}(function ($value) use ($key) { + return is_array($value) ? $value[$key] : $value->{$key}; + }); + } + + /** + * Proxy a method call onto the collection items. + * + * @param string $method + * @param array $parameters + * @return mixed + */ + public function __call($method, $parameters) + { + return $this->collection->{$this->method}(function ($value) use ($method, $parameters) { + return $value->{$method}(...$parameters); + }); + } +} diff --git a/vendor/illuminate/collections/ItemNotFoundException.php b/vendor/illuminate/collections/ItemNotFoundException.php new file mode 100644 index 0000000..05a51d9 --- /dev/null +++ b/vendor/illuminate/collections/ItemNotFoundException.php @@ -0,0 +1,9 @@ +<?php + +namespace Illuminate\Support; + +use RuntimeException; + +class ItemNotFoundException extends RuntimeException +{ +} diff --git a/vendor/illuminate/collections/LICENSE.md b/vendor/illuminate/collections/LICENSE.md new file mode 100644 index 0000000..79810c8 --- /dev/null +++ b/vendor/illuminate/collections/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Taylor Otwell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/illuminate/collections/LazyCollection.php b/vendor/illuminate/collections/LazyCollection.php new file mode 100644 index 0000000..2f30d5d --- /dev/null +++ b/vendor/illuminate/collections/LazyCollection.php @@ -0,0 +1,1681 @@ +<?php + +namespace Illuminate\Support; + +use ArrayIterator; +use Closure; +use DateTimeInterface; +use Generator; +use Illuminate\Contracts\Support\CanBeEscapedWhenCastToString; +use Illuminate\Support\Traits\EnumeratesValues; +use Illuminate\Support\Traits\Macroable; +use InvalidArgumentException; +use IteratorAggregate; +use stdClass; +use Traversable; + +/** + * @template TKey of array-key + * @template TValue + * + * @implements \Illuminate\Support\Enumerable<TKey, TValue> + */ +class LazyCollection implements CanBeEscapedWhenCastToString, Enumerable +{ + /** + * @use \Illuminate\Support\Traits\EnumeratesValues<TKey, TValue> + */ + use EnumeratesValues, Macroable; + + /** + * The source from which to generate items. + * + * @var (Closure(): \Generator<TKey, TValue, mixed, void>)|static|array<TKey, TValue> + */ + public $source; + + /** + * Create a new lazy collection instance. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue>|(Closure(): \Generator<TKey, TValue, mixed, void>)|self<TKey, TValue>|array<TKey, TValue>|null $source + * @return void + */ + public function __construct($source = null) + { + if ($source instanceof Closure || $source instanceof self) { + $this->source = $source; + } elseif (is_null($source)) { + $this->source = static::empty(); + } elseif ($source instanceof Generator) { + throw new InvalidArgumentException( + 'Generators should not be passed directly to LazyCollection. Instead, pass a generator function.' + ); + } else { + $this->source = $this->getArrayableItems($source); + } + } + + /** + * Create a new collection instance if the value isn't one already. + * + * @template TMakeKey of array-key + * @template TMakeValue + * + * @param \Illuminate\Contracts\Support\Arrayable<TMakeKey, TMakeValue>|iterable<TMakeKey, TMakeValue>|(Closure(): \Generator<TMakeKey, TMakeValue, mixed, void>)|self<TMakeKey, TMakeValue>|array<TMakeKey, TMakeValue>|null $items + * @return static<TMakeKey, TMakeValue> + */ + public static function make($items = []) + { + return new static($items); + } + + /** + * Create a collection with the given range. + * + * @param int $from + * @param int $to + * @return static<int, int> + */ + public static function range($from, $to) + { + return new static(function () use ($from, $to) { + if ($from <= $to) { + for (; $from <= $to; $from++) { + yield $from; + } + } else { + for (; $from >= $to; $from--) { + yield $from; + } + } + }); + } + + /** + * Get all items in the enumerable. + * + * @return array<TKey, TValue> + */ + public function all() + { + if (is_array($this->source)) { + return $this->source; + } + + return iterator_to_array($this->getIterator()); + } + + /** + * Eager load all items into a new lazy collection backed by an array. + * + * @return static + */ + public function eager() + { + return new static($this->all()); + } + + /** + * Cache values as they're enumerated. + * + * @return static + */ + public function remember() + { + $iterator = $this->getIterator(); + + $iteratorIndex = 0; + + $cache = []; + + return new static(function () use ($iterator, &$iteratorIndex, &$cache) { + for ($index = 0; true; $index++) { + if (array_key_exists($index, $cache)) { + yield $cache[$index][0] => $cache[$index][1]; + + continue; + } + + if ($iteratorIndex < $index) { + $iterator->next(); + + $iteratorIndex++; + } + + if (! $iterator->valid()) { + break; + } + + $cache[$index] = [$iterator->key(), $iterator->current()]; + + yield $cache[$index][0] => $cache[$index][1]; + } + }); + } + + /** + * Get the average value of a given key. + * + * @param (callable(TValue): float|int)|string|null $callback + * @return float|int|null + */ + public function avg($callback = null) + { + return $this->collect()->avg($callback); + } + + /** + * Get the median of a given key. + * + * @param string|array<array-key, string>|null $key + * @return float|int|null + */ + public function median($key = null) + { + return $this->collect()->median($key); + } + + /** + * Get the mode of a given key. + * + * @param string|array<string>|null $key + * @return array<int, float|int>|null + */ + public function mode($key = null) + { + return $this->collect()->mode($key); + } + + /** + * Collapse the collection of items into a single array. + * + * @return static<int, mixed> + */ + public function collapse() + { + return new static(function () { + foreach ($this as $values) { + if (is_array($values) || $values instanceof Enumerable) { + foreach ($values as $value) { + yield $value; + } + } + } + }); + } + + /** + * Determine if an item exists in the enumerable. + * + * @param (callable(TValue, TKey): bool)|TValue|string $key + * @param mixed $operator + * @param mixed $value + * @return bool + */ + public function contains($key, $operator = null, $value = null) + { + if (func_num_args() === 1 && $this->useAsCallable($key)) { + $placeholder = new stdClass; + + /** @var callable $key */ + return $this->first($key, $placeholder) !== $placeholder; + } + + if (func_num_args() === 1) { + $needle = $key; + + foreach ($this as $value) { + if ($value == $needle) { + return true; + } + } + + return false; + } + + return $this->contains($this->operatorForWhere(...func_get_args())); + } + + /** + * Determine if an item exists, using strict comparison. + * + * @param (callable(TValue): bool)|TValue|array-key $key + * @param TValue|null $value + * @return bool + */ + public function containsStrict($key, $value = null) + { + if (func_num_args() === 2) { + return $this->contains(fn ($item) => data_get($item, $key) === $value); + } + + if ($this->useAsCallable($key)) { + return ! is_null($this->first($key)); + } + + foreach ($this as $item) { + if ($item === $key) { + return true; + } + } + + return false; + } + + /** + * Determine if an item is not contained in the enumerable. + * + * @param mixed $key + * @param mixed $operator + * @param mixed $value + * @return bool + */ + public function doesntContain($key, $operator = null, $value = null) + { + return ! $this->contains(...func_get_args()); + } + + /** + * Cross join the given iterables, returning all possible permutations. + * + * @template TCrossJoinKey + * @template TCrossJoinValue + * + * @param \Illuminate\Contracts\Support\Arrayable<TCrossJoinKey, TCrossJoinValue>|iterable<TCrossJoinKey, TCrossJoinValue> ...$arrays + * @return static<int, array<int, TValue|TCrossJoinValue>> + */ + public function crossJoin(...$arrays) + { + return $this->passthru('crossJoin', func_get_args()); + } + + /** + * Count the number of items in the collection by a field or using a callback. + * + * @param (callable(TValue, TKey): mixed)|string|null $countBy + * @return static<array-key, int> + */ + public function countBy($countBy = null) + { + $countBy = is_null($countBy) + ? $this->identity() + : $this->valueRetriever($countBy); + + return new static(function () use ($countBy) { + $counts = []; + + foreach ($this as $key => $value) { + $group = $countBy($value, $key); + + if (empty($counts[$group])) { + $counts[$group] = 0; + } + + $counts[$group]++; + } + + yield from $counts; + }); + } + + /** + * Get the items that are not present in the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<array-key, TValue>|iterable<array-key, TValue> $items + * @return static + */ + public function diff($items) + { + return $this->passthru('diff', func_get_args()); + } + + /** + * Get the items that are not present in the given items, using the callback. + * + * @param \Illuminate\Contracts\Support\Arrayable<array-key, TValue>|iterable<array-key, TValue> $items + * @param callable(TValue, TValue): int $callback + * @return static + */ + public function diffUsing($items, callable $callback) + { + return $this->passthru('diffUsing', func_get_args()); + } + + /** + * Get the items whose keys and values are not present in the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function diffAssoc($items) + { + return $this->passthru('diffAssoc', func_get_args()); + } + + /** + * Get the items whose keys and values are not present in the given items, using the callback. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @param callable(TKey, TKey): int $callback + * @return static + */ + public function diffAssocUsing($items, callable $callback) + { + return $this->passthru('diffAssocUsing', func_get_args()); + } + + /** + * Get the items whose keys are not present in the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function diffKeys($items) + { + return $this->passthru('diffKeys', func_get_args()); + } + + /** + * Get the items whose keys are not present in the given items, using the callback. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @param callable(TKey, TKey): int $callback + * @return static + */ + public function diffKeysUsing($items, callable $callback) + { + return $this->passthru('diffKeysUsing', func_get_args()); + } + + /** + * Retrieve duplicate items. + * + * @param (callable(TValue): bool)|string|null $callback + * @param bool $strict + * @return static + */ + public function duplicates($callback = null, $strict = false) + { + return $this->passthru('duplicates', func_get_args()); + } + + /** + * Retrieve duplicate items using strict comparison. + * + * @param (callable(TValue): bool)|string|null $callback + * @return static + */ + public function duplicatesStrict($callback = null) + { + return $this->passthru('duplicatesStrict', func_get_args()); + } + + /** + * Get all items except for those with the specified keys. + * + * @param \Illuminate\Support\Enumerable<array-key, TKey>|array<array-key, TKey> $keys + * @return static + */ + public function except($keys) + { + return $this->passthru('except', func_get_args()); + } + + /** + * Run a filter over each of the items. + * + * @param (callable(TValue, TKey): bool)|null $callback + * @return static + */ + public function filter(callable $callback = null) + { + if (is_null($callback)) { + $callback = function ($value) { + return (bool) $value; + }; + } + + return new static(function () use ($callback) { + foreach ($this as $key => $value) { + if ($callback($value, $key)) { + yield $key => $value; + } + } + }); + } + + /** + * Get the first item from the enumerable passing the given truth test. + * + * @template TFirstDefault + * + * @param (callable(TValue): bool)|null $callback + * @param TFirstDefault|(\Closure(): TFirstDefault) $default + * @return TValue|TFirstDefault + */ + public function first(callable $callback = null, $default = null) + { + $iterator = $this->getIterator(); + + if (is_null($callback)) { + if (! $iterator->valid()) { + return value($default); + } + + return $iterator->current(); + } + + foreach ($iterator as $key => $value) { + if ($callback($value, $key)) { + return $value; + } + } + + return value($default); + } + + /** + * Get a flattened list of the items in the collection. + * + * @param int $depth + * @return static<int, mixed> + */ + public function flatten($depth = INF) + { + $instance = new static(function () use ($depth) { + foreach ($this as $item) { + if (! is_array($item) && ! $item instanceof Enumerable) { + yield $item; + } elseif ($depth === 1) { + yield from $item; + } else { + yield from (new static($item))->flatten($depth - 1); + } + } + }); + + return $instance->values(); + } + + /** + * Flip the items in the collection. + * + * @return static<TValue, TKey> + */ + public function flip() + { + return new static(function () { + foreach ($this as $key => $value) { + yield $value => $key; + } + }); + } + + /** + * Get an item by key. + * + * @template TGetDefault + * + * @param TKey|null $key + * @param TGetDefault|(\Closure(): TGetDefault) $default + * @return TValue|TGetDefault + */ + public function get($key, $default = null) + { + if (is_null($key)) { + return; + } + + foreach ($this as $outerKey => $outerValue) { + if ($outerKey == $key) { + return $outerValue; + } + } + + return value($default); + } + + /** + * Group an associative array by a field or using a callback. + * + * @param (callable(TValue, TKey): array-key)|array|string $groupBy + * @param bool $preserveKeys + * @return static<array-key, static<array-key, TValue>> + */ + public function groupBy($groupBy, $preserveKeys = false) + { + return $this->passthru('groupBy', func_get_args()); + } + + /** + * Key an associative array by a field or using a callback. + * + * @param (callable(TValue, TKey): array-key)|array|string $keyBy + * @return static<array-key, TValue> + */ + public function keyBy($keyBy) + { + return new static(function () use ($keyBy) { + $keyBy = $this->valueRetriever($keyBy); + + foreach ($this as $key => $item) { + $resolvedKey = $keyBy($item, $key); + + if (is_object($resolvedKey)) { + $resolvedKey = (string) $resolvedKey; + } + + yield $resolvedKey => $item; + } + }); + } + + /** + * Determine if an item exists in the collection by key. + * + * @param mixed $key + * @return bool + */ + public function has($key) + { + $keys = array_flip(is_array($key) ? $key : func_get_args()); + $count = count($keys); + + foreach ($this as $key => $value) { + if (array_key_exists($key, $keys) && --$count == 0) { + return true; + } + } + + return false; + } + + /** + * Determine if any of the keys exist in the collection. + * + * @param mixed $key + * @return bool + */ + public function hasAny($key) + { + $keys = array_flip(is_array($key) ? $key : func_get_args()); + + foreach ($this as $key => $value) { + if (array_key_exists($key, $keys)) { + return true; + } + } + + return false; + } + + /** + * Concatenate values of a given key as a string. + * + * @param callable|string $value + * @param string|null $glue + * @return string + */ + public function implode($value, $glue = null) + { + return $this->collect()->implode(...func_get_args()); + } + + /** + * Intersect the collection with the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function intersect($items) + { + return $this->passthru('intersect', func_get_args()); + } + + /** + * Intersect the collection with the given items by key. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function intersectByKeys($items) + { + return $this->passthru('intersectByKeys', func_get_args()); + } + + /** + * Determine if the items are empty or not. + * + * @return bool + */ + public function isEmpty() + { + return ! $this->getIterator()->valid(); + } + + /** + * Determine if the collection contains a single item. + * + * @return bool + */ + public function containsOneItem() + { + return $this->take(2)->count() === 1; + } + + /** + * Join all items from the collection using a string. The final items can use a separate glue string. + * + * @param string $glue + * @param string $finalGlue + * @return string + */ + public function join($glue, $finalGlue = '') + { + return $this->collect()->join(...func_get_args()); + } + + /** + * Get the keys of the collection items. + * + * @return static<int, TKey> + */ + public function keys() + { + return new static(function () { + foreach ($this as $key => $value) { + yield $key; + } + }); + } + + /** + * Get the last item from the collection. + * + * @template TLastDefault + * + * @param (callable(TValue, TKey): bool)|null $callback + * @param TLastDefault|(\Closure(): TLastDefault) $default + * @return TValue|TLastDefault + */ + public function last(callable $callback = null, $default = null) + { + $needle = $placeholder = new stdClass; + + foreach ($this as $key => $value) { + if (is_null($callback) || $callback($value, $key)) { + $needle = $value; + } + } + + return $needle === $placeholder ? value($default) : $needle; + } + + /** + * Get the values of a given key. + * + * @param string|array<array-key, string> $value + * @param string|null $key + * @return static<int, mixed> + */ + public function pluck($value, $key = null) + { + return new static(function () use ($value, $key) { + [$value, $key] = $this->explodePluckParameters($value, $key); + + foreach ($this as $item) { + $itemValue = data_get($item, $value); + + if (is_null($key)) { + yield $itemValue; + } else { + $itemKey = data_get($item, $key); + + if (is_object($itemKey) && method_exists($itemKey, '__toString')) { + $itemKey = (string) $itemKey; + } + + yield $itemKey => $itemValue; + } + } + }); + } + + /** + * Run a map over each of the items. + * + * @template TMapValue + * + * @param callable(TValue, TKey): TMapValue $callback + * @return static<TKey, TMapValue> + */ + public function map(callable $callback) + { + return new static(function () use ($callback) { + foreach ($this as $key => $value) { + yield $key => $callback($value, $key); + } + }); + } + + /** + * Run a dictionary map over the items. + * + * The callback should return an associative array with a single key/value pair. + * + * @template TMapToDictionaryKey of array-key + * @template TMapToDictionaryValue + * + * @param callable(TValue, TKey): array<TMapToDictionaryKey, TMapToDictionaryValue> $callback + * @return static<TMapToDictionaryKey, array<int, TMapToDictionaryValue>> + */ + public function mapToDictionary(callable $callback) + { + return $this->passthru('mapToDictionary', func_get_args()); + } + + /** + * Run an associative map over each of the items. + * + * The callback should return an associative array with a single key/value pair. + * + * @template TMapWithKeysKey of array-key + * @template TMapWithKeysValue + * + * @param callable(TValue, TKey): array<TMapWithKeysKey, TMapWithKeysValue> $callback + * @return static<TMapWithKeysKey, TMapWithKeysValue> + */ + public function mapWithKeys(callable $callback) + { + return new static(function () use ($callback) { + foreach ($this as $key => $value) { + yield from $callback($value, $key); + } + }); + } + + /** + * Merge the collection with the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function merge($items) + { + return $this->passthru('merge', func_get_args()); + } + + /** + * Recursively merge the collection with the given items. + * + * @template TMergeRecursiveValue + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TMergeRecursiveValue>|iterable<TKey, TMergeRecursiveValue> $items + * @return static<TKey, TValue|TMergeRecursiveValue> + */ + public function mergeRecursive($items) + { + return $this->passthru('mergeRecursive', func_get_args()); + } + + /** + * Create a collection by using this collection for keys and another for its values. + * + * @template TCombineValue + * + * @param \IteratorAggregate<array-key, TCombineValue>|array<array-key, TCombineValue>|(callable(): \Generator<array-key, TCombineValue>) $values + * @return static<TValue, TCombineValue> + */ + public function combine($values) + { + return new static(function () use ($values) { + $values = $this->makeIterator($values); + + $errorMessage = 'Both parameters should have an equal number of elements'; + + foreach ($this as $key) { + if (! $values->valid()) { + trigger_error($errorMessage, E_USER_WARNING); + + break; + } + + yield $key => $values->current(); + + $values->next(); + } + + if ($values->valid()) { + trigger_error($errorMessage, E_USER_WARNING); + } + }); + } + + /** + * Union the collection with the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function union($items) + { + return $this->passthru('union', func_get_args()); + } + + /** + * Create a new collection consisting of every n-th element. + * + * @param int $step + * @param int $offset + * @return static + */ + public function nth($step, $offset = 0) + { + return new static(function () use ($step, $offset) { + $position = 0; + + foreach ($this->slice($offset) as $item) { + if ($position % $step === 0) { + yield $item; + } + + $position++; + } + }); + } + + /** + * Get the items with the specified keys. + * + * @param \Illuminate\Support\Enumerable<array-key, TKey>|array<array-key, TKey>|string $keys + * @return static + */ + public function only($keys) + { + if ($keys instanceof Enumerable) { + $keys = $keys->all(); + } elseif (! is_null($keys)) { + $keys = is_array($keys) ? $keys : func_get_args(); + } + + return new static(function () use ($keys) { + if (is_null($keys)) { + yield from $this; + } else { + $keys = array_flip($keys); + + foreach ($this as $key => $value) { + if (array_key_exists($key, $keys)) { + yield $key => $value; + + unset($keys[$key]); + + if (empty($keys)) { + break; + } + } + } + } + }); + } + + /** + * Push all of the given items onto the collection. + * + * @param iterable<array-key, TValue> $source + * @return static + */ + public function concat($source) + { + return (new static(function () use ($source) { + yield from $this; + yield from $source; + }))->values(); + } + + /** + * Get one or a specified number of items randomly from the collection. + * + * @param int|null $number + * @return static<int, TValue>|TValue + * + * @throws \InvalidArgumentException + */ + public function random($number = null) + { + $result = $this->collect()->random(...func_get_args()); + + return is_null($number) ? $result : new static($result); + } + + /** + * Replace the collection items with the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function replace($items) + { + return new static(function () use ($items) { + $items = $this->getArrayableItems($items); + + foreach ($this as $key => $value) { + if (array_key_exists($key, $items)) { + yield $key => $items[$key]; + + unset($items[$key]); + } else { + yield $key => $value; + } + } + + foreach ($items as $key => $value) { + yield $key => $value; + } + }); + } + + /** + * Recursively replace the collection items with the given items. + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue> $items + * @return static + */ + public function replaceRecursive($items) + { + return $this->passthru('replaceRecursive', func_get_args()); + } + + /** + * Reverse items order. + * + * @return static + */ + public function reverse() + { + return $this->passthru('reverse', func_get_args()); + } + + /** + * Search the collection for a given value and return the corresponding key if successful. + * + * @param TValue|(callable(TValue,TKey): bool) $value + * @param bool $strict + * @return TKey|bool + */ + public function search($value, $strict = false) + { + /** @var (callable(TValue,TKey): bool) $predicate */ + $predicate = $this->useAsCallable($value) + ? $value + : function ($item) use ($value, $strict) { + return $strict ? $item === $value : $item == $value; + }; + + foreach ($this as $key => $item) { + if ($predicate($item, $key)) { + return $key; + } + } + + return false; + } + + /** + * Shuffle the items in the collection. + * + * @param int|null $seed + * @return static + */ + public function shuffle($seed = null) + { + return $this->passthru('shuffle', func_get_args()); + } + + /** + * Create chunks representing a "sliding window" view of the items in the collection. + * + * @param int $size + * @param int $step + * @return static<int, static> + */ + public function sliding($size = 2, $step = 1) + { + return new static(function () use ($size, $step) { + $iterator = $this->getIterator(); + + $chunk = []; + + while ($iterator->valid()) { + $chunk[$iterator->key()] = $iterator->current(); + + if (count($chunk) == $size) { + yield (new static($chunk))->tap(function () use (&$chunk, $step) { + $chunk = array_slice($chunk, $step, null, true); + }); + + // If the $step between chunks is bigger than each chunk's $size + // we will skip the extra items (which should never be in any + // chunk) before we continue to the next chunk in the loop. + if ($step > $size) { + $skip = $step - $size; + + for ($i = 0; $i < $skip && $iterator->valid(); $i++) { + $iterator->next(); + } + } + } + + $iterator->next(); + } + }); + } + + /** + * Skip the first {$count} items. + * + * @param int $count + * @return static + */ + public function skip($count) + { + return new static(function () use ($count) { + $iterator = $this->getIterator(); + + while ($iterator->valid() && $count--) { + $iterator->next(); + } + + while ($iterator->valid()) { + yield $iterator->key() => $iterator->current(); + + $iterator->next(); + } + }); + } + + /** + * Skip items in the collection until the given condition is met. + * + * @param TValue|callable(TValue,TKey): bool $value + * @return static + */ + public function skipUntil($value) + { + $callback = $this->useAsCallable($value) ? $value : $this->equality($value); + + return $this->skipWhile($this->negate($callback)); + } + + /** + * Skip items in the collection while the given condition is met. + * + * @param TValue|callable(TValue,TKey): bool $value + * @return static + */ + public function skipWhile($value) + { + $callback = $this->useAsCallable($value) ? $value : $this->equality($value); + + return new static(function () use ($callback) { + $iterator = $this->getIterator(); + + while ($iterator->valid() && $callback($iterator->current(), $iterator->key())) { + $iterator->next(); + } + + while ($iterator->valid()) { + yield $iterator->key() => $iterator->current(); + + $iterator->next(); + } + }); + } + + /** + * Get a slice of items from the enumerable. + * + * @param int $offset + * @param int|null $length + * @return static + */ + public function slice($offset, $length = null) + { + if ($offset < 0 || $length < 0) { + return $this->passthru('slice', func_get_args()); + } + + $instance = $this->skip($offset); + + return is_null($length) ? $instance : $instance->take($length); + } + + /** + * Split a collection into a certain number of groups. + * + * @param int $numberOfGroups + * @return static<int, static> + */ + public function split($numberOfGroups) + { + return $this->passthru('split', func_get_args()); + } + + /** + * Get the first item in the collection, but only if exactly one item exists. Otherwise, throw an exception. + * + * @param (callable(TValue, TKey): bool)|string $key + * @param mixed $operator + * @param mixed $value + * @return TValue + * + * @throws \Illuminate\Support\ItemNotFoundException + * @throws \Illuminate\Support\MultipleItemsFoundException + */ + public function sole($key = null, $operator = null, $value = null) + { + $filter = func_num_args() > 1 + ? $this->operatorForWhere(...func_get_args()) + : $key; + + return $this + ->unless($filter == null) + ->filter($filter) + ->take(2) + ->collect() + ->sole(); + } + + /** + * Get the first item in the collection but throw an exception if no matching items exist. + * + * @param (callable(TValue, TKey): bool)|string $key + * @param mixed $operator + * @param mixed $value + * @return TValue + * + * @throws \Illuminate\Support\ItemNotFoundException + */ + public function firstOrFail($key = null, $operator = null, $value = null) + { + $filter = func_num_args() > 1 + ? $this->operatorForWhere(...func_get_args()) + : $key; + + return $this + ->unless($filter == null) + ->filter($filter) + ->take(1) + ->collect() + ->firstOrFail(); + } + + /** + * Chunk the collection into chunks of the given size. + * + * @param int $size + * @return static<int, static> + */ + public function chunk($size) + { + if ($size <= 0) { + return static::empty(); + } + + return new static(function () use ($size) { + $iterator = $this->getIterator(); + + while ($iterator->valid()) { + $chunk = []; + + while (true) { + $chunk[$iterator->key()] = $iterator->current(); + + if (count($chunk) < $size) { + $iterator->next(); + + if (! $iterator->valid()) { + break; + } + } else { + break; + } + } + + yield new static($chunk); + + $iterator->next(); + } + }); + } + + /** + * Split a collection into a certain number of groups, and fill the first groups completely. + * + * @param int $numberOfGroups + * @return static<int, static> + */ + public function splitIn($numberOfGroups) + { + return $this->chunk(ceil($this->count() / $numberOfGroups)); + } + + /** + * Chunk the collection into chunks with a callback. + * + * @param callable(TValue, TKey, Collection<TKey, TValue>): bool $callback + * @return static<int, static<int, TValue>> + */ + public function chunkWhile(callable $callback) + { + return new static(function () use ($callback) { + $iterator = $this->getIterator(); + + $chunk = new Collection; + + if ($iterator->valid()) { + $chunk[$iterator->key()] = $iterator->current(); + + $iterator->next(); + } + + while ($iterator->valid()) { + if (! $callback($iterator->current(), $iterator->key(), $chunk)) { + yield new static($chunk); + + $chunk = new Collection; + } + + $chunk[$iterator->key()] = $iterator->current(); + + $iterator->next(); + } + + if ($chunk->isNotEmpty()) { + yield new static($chunk); + } + }); + } + + /** + * Sort through each item with a callback. + * + * @param (callable(TValue, TValue): int)|null|int $callback + * @return static + */ + public function sort($callback = null) + { + return $this->passthru('sort', func_get_args()); + } + + /** + * Sort items in descending order. + * + * @param int $options + * @return static + */ + public function sortDesc($options = SORT_REGULAR) + { + return $this->passthru('sortDesc', func_get_args()); + } + + /** + * Sort the collection using the given callback. + * + * @param array<array-key, (callable(TValue, TValue): mixed)|(callable(TValue, TKey): mixed)|string|array{string, string}>|(callable(TValue, TKey): mixed)|string $callback + * @param int $options + * @param bool $descending + * @return static + */ + public function sortBy($callback, $options = SORT_REGULAR, $descending = false) + { + return $this->passthru('sortBy', func_get_args()); + } + + /** + * Sort the collection in descending order using the given callback. + * + * @param array<array-key, (callable(TValue, TValue): mixed)|(callable(TValue, TKey): mixed)|string|array{string, string}>|(callable(TValue, TKey): mixed)|string $callback + * @param int $options + * @return static + */ + public function sortByDesc($callback, $options = SORT_REGULAR) + { + return $this->passthru('sortByDesc', func_get_args()); + } + + /** + * Sort the collection keys. + * + * @param int $options + * @param bool $descending + * @return static + */ + public function sortKeys($options = SORT_REGULAR, $descending = false) + { + return $this->passthru('sortKeys', func_get_args()); + } + + /** + * Sort the collection keys in descending order. + * + * @param int $options + * @return static + */ + public function sortKeysDesc($options = SORT_REGULAR) + { + return $this->passthru('sortKeysDesc', func_get_args()); + } + + /** + * Sort the collection keys using a callback. + * + * @param callable(TKey, TKey): int $callback + * @return static + */ + public function sortKeysUsing(callable $callback) + { + return $this->passthru('sortKeysUsing', func_get_args()); + } + + /** + * Take the first or last {$limit} items. + * + * @param int $limit + * @return static + */ + public function take($limit) + { + if ($limit < 0) { + return $this->passthru('take', func_get_args()); + } + + return new static(function () use ($limit) { + $iterator = $this->getIterator(); + + while ($limit--) { + if (! $iterator->valid()) { + break; + } + + yield $iterator->key() => $iterator->current(); + + if ($limit) { + $iterator->next(); + } + } + }); + } + + /** + * Take items in the collection until the given condition is met. + * + * @param TValue|callable(TValue,TKey): bool $value + * @return static + */ + public function takeUntil($value) + { + /** @var callable(TValue, TKey): bool $callback */ + $callback = $this->useAsCallable($value) ? $value : $this->equality($value); + + return new static(function () use ($callback) { + foreach ($this as $key => $item) { + if ($callback($item, $key)) { + break; + } + + yield $key => $item; + } + }); + } + + /** + * Take items in the collection until a given point in time. + * + * @param \DateTimeInterface $timeout + * @return static + */ + public function takeUntilTimeout(DateTimeInterface $timeout) + { + $timeout = $timeout->getTimestamp(); + + return new static(function () use ($timeout) { + if ($this->now() >= $timeout) { + return; + } + + foreach ($this as $key => $value) { + yield $key => $value; + + if ($this->now() >= $timeout) { + break; + } + } + }); + } + + /** + * Take items in the collection while the given condition is met. + * + * @param TValue|callable(TValue,TKey): bool $value + * @return static + */ + public function takeWhile($value) + { + /** @var callable(TValue, TKey): bool $callback */ + $callback = $this->useAsCallable($value) ? $value : $this->equality($value); + + return $this->takeUntil(function ($item, $key) use ($callback) { + return ! $callback($item, $key); + }); + } + + /** + * Pass each item in the collection to the given callback, lazily. + * + * @param callable(TValue, TKey): mixed $callback + * @return static + */ + public function tapEach(callable $callback) + { + return new static(function () use ($callback) { + foreach ($this as $key => $value) { + $callback($value, $key); + + yield $key => $value; + } + }); + } + + /** + * Convert a flatten "dot" notation array into an expanded array. + * + * @return static + */ + public function undot() + { + return $this->passthru('undot', []); + } + + /** + * Return only unique items from the collection array. + * + * @param (callable(TValue, TKey): mixed)|string|null $key + * @param bool $strict + * @return static + */ + public function unique($key = null, $strict = false) + { + $callback = $this->valueRetriever($key); + + return new static(function () use ($callback, $strict) { + $exists = []; + + foreach ($this as $key => $item) { + if (! in_array($id = $callback($item, $key), $exists, $strict)) { + yield $key => $item; + + $exists[] = $id; + } + } + }); + } + + /** + * Reset the keys on the underlying array. + * + * @return static<int, TValue> + */ + public function values() + { + return new static(function () { + foreach ($this as $item) { + yield $item; + } + }); + } + + /** + * Zip the collection together with one or more arrays. + * + * e.g. new LazyCollection([1, 2, 3])->zip([4, 5, 6]); + * => [[1, 4], [2, 5], [3, 6]] + * + * @template TZipValue + * + * @param \Illuminate\Contracts\Support\Arrayable<array-key, TZipValue>|iterable<array-key, TZipValue> ...$items + * @return static<int, static<int, TValue|TZipValue>> + */ + public function zip($items) + { + $iterables = func_get_args(); + + return new static(function () use ($iterables) { + $iterators = Collection::make($iterables)->map(function ($iterable) { + return $this->makeIterator($iterable); + })->prepend($this->getIterator()); + + while ($iterators->contains->valid()) { + yield new static($iterators->map->current()); + + $iterators->each->next(); + } + }); + } + + /** + * Pad collection to the specified length with a value. + * + * @template TPadValue + * + * @param int $size + * @param TPadValue $value + * @return static<int, TValue|TPadValue> + */ + public function pad($size, $value) + { + if ($size < 0) { + return $this->passthru('pad', func_get_args()); + } + + return new static(function () use ($size, $value) { + $yielded = 0; + + foreach ($this as $index => $item) { + yield $index => $item; + + $yielded++; + } + + while ($yielded++ < $size) { + yield $value; + } + }); + } + + /** + * Get the values iterator. + * + * @return \Traversable<TKey, TValue> + */ + public function getIterator(): Traversable + { + return $this->makeIterator($this->source); + } + + /** + * Count the number of items in the collection. + * + * @return int + */ + public function count(): int + { + if (is_array($this->source)) { + return count($this->source); + } + + return iterator_count($this->getIterator()); + } + + /** + * Make an iterator from the given source. + * + * @template TIteratorKey of array-key + * @template TIteratorValue + * + * @param \IteratorAggregate<TIteratorKey, TIteratorValue>|array<TIteratorKey, TIteratorValue>|(callable(): \Generator<TIteratorKey, TIteratorValue>) $source + * @return \Traversable<TIteratorKey, TIteratorValue> + */ + protected function makeIterator($source) + { + if ($source instanceof IteratorAggregate) { + return $source->getIterator(); + } + + if (is_array($source)) { + return new ArrayIterator($source); + } + + return $source(); + } + + /** + * Explode the "value" and "key" arguments passed to "pluck". + * + * @param string|string[] $value + * @param string|string[]|null $key + * @return array{string[],string[]|null} + */ + protected function explodePluckParameters($value, $key) + { + $value = is_string($value) ? explode('.', $value) : $value; + + $key = is_null($key) || is_array($key) ? $key : explode('.', $key); + + return [$value, $key]; + } + + /** + * Pass this lazy collection through a method on the collection class. + * + * @param string $method + * @param array<mixed> $params + * @return static + */ + protected function passthru($method, array $params) + { + return new static(function () use ($method, $params) { + yield from $this->collect()->$method(...$params); + }); + } + + /** + * Get the current time. + * + * @return int + */ + protected function now() + { + return time(); + } +} diff --git a/vendor/illuminate/collections/MultipleItemsFoundException.php b/vendor/illuminate/collections/MultipleItemsFoundException.php new file mode 100644 index 0000000..d90d835 --- /dev/null +++ b/vendor/illuminate/collections/MultipleItemsFoundException.php @@ -0,0 +1,40 @@ +<?php + +namespace Illuminate\Support; + +use RuntimeException; + +class MultipleItemsFoundException extends RuntimeException +{ + /** + * The number of items found. + * + * @var int + */ + public $count; + + /** + * Create a new exception instance. + * + * @param int $count + * @param int $code + * @param \Throwable|null $previous + * @return void + */ + public function __construct($count, $code = 0, $previous = null) + { + $this->count = $count; + + parent::__construct("$count items were found.", $code, $previous); + } + + /** + * Get the number of items found. + * + * @return int + */ + public function getCount() + { + return $this->count; + } +} diff --git a/vendor/illuminate/collections/Traits/EnumeratesValues.php b/vendor/illuminate/collections/Traits/EnumeratesValues.php new file mode 100644 index 0000000..c7803bf --- /dev/null +++ b/vendor/illuminate/collections/Traits/EnumeratesValues.php @@ -0,0 +1,1084 @@ +<?php + +namespace Illuminate\Support\Traits; + +use CachingIterator; +use Closure; +use Exception; +use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Contracts\Support\Jsonable; +use Illuminate\Support\Arr; +use Illuminate\Support\Collection; +use Illuminate\Support\Enumerable; +use Illuminate\Support\HigherOrderCollectionProxy; +use JsonSerializable; +use Symfony\Component\VarDumper\VarDumper; +use Traversable; +use UnexpectedValueException; +use UnitEnum; + +/** + * @template TKey of array-key + * @template TValue + * + * @property-read HigherOrderCollectionProxy $average + * @property-read HigherOrderCollectionProxy $avg + * @property-read HigherOrderCollectionProxy $contains + * @property-read HigherOrderCollectionProxy $doesntContain + * @property-read HigherOrderCollectionProxy $each + * @property-read HigherOrderCollectionProxy $every + * @property-read HigherOrderCollectionProxy $filter + * @property-read HigherOrderCollectionProxy $first + * @property-read HigherOrderCollectionProxy $flatMap + * @property-read HigherOrderCollectionProxy $groupBy + * @property-read HigherOrderCollectionProxy $keyBy + * @property-read HigherOrderCollectionProxy $map + * @property-read HigherOrderCollectionProxy $max + * @property-read HigherOrderCollectionProxy $min + * @property-read HigherOrderCollectionProxy $partition + * @property-read HigherOrderCollectionProxy $reject + * @property-read HigherOrderCollectionProxy $skipUntil + * @property-read HigherOrderCollectionProxy $skipWhile + * @property-read HigherOrderCollectionProxy $some + * @property-read HigherOrderCollectionProxy $sortBy + * @property-read HigherOrderCollectionProxy $sortByDesc + * @property-read HigherOrderCollectionProxy $sum + * @property-read HigherOrderCollectionProxy $takeUntil + * @property-read HigherOrderCollectionProxy $takeWhile + * @property-read HigherOrderCollectionProxy $unique + * @property-read HigherOrderCollectionProxy $unless + * @property-read HigherOrderCollectionProxy $until + * @property-read HigherOrderCollectionProxy $when + */ +trait EnumeratesValues +{ + use Conditionable; + + /** + * Indicates that the object's string representation should be escaped when __toString is invoked. + * + * @var bool + */ + protected $escapeWhenCastingToString = false; + + /** + * The methods that can be proxied. + * + * @var array<int, string> + */ + protected static $proxies = [ + 'average', + 'avg', + 'contains', + 'doesntContain', + 'each', + 'every', + 'filter', + 'first', + 'flatMap', + 'groupBy', + 'keyBy', + 'map', + 'max', + 'min', + 'partition', + 'reject', + 'skipUntil', + 'skipWhile', + 'some', + 'sortBy', + 'sortByDesc', + 'sum', + 'takeUntil', + 'takeWhile', + 'unique', + 'unless', + 'until', + 'when', + ]; + + /** + * Create a new collection instance if the value isn't one already. + * + * @template TMakeKey of array-key + * @template TMakeValue + * + * @param \Illuminate\Contracts\Support\Arrayable<TMakeKey, TMakeValue>|iterable<TMakeKey, TMakeValue>|null $items + * @return static<TMakeKey, TMakeValue> + */ + public static function make($items = []) + { + return new static($items); + } + + /** + * Wrap the given value in a collection if applicable. + * + * @template TWrapKey of array-key + * @template TWrapValue + * + * @param iterable<TWrapKey, TWrapValue> $value + * @return static<TWrapKey, TWrapValue> + */ + public static function wrap($value) + { + return $value instanceof Enumerable + ? new static($value) + : new static(Arr::wrap($value)); + } + + /** + * Get the underlying items from the given collection if applicable. + * + * @template TUnwrapKey of array-key + * @template TUnwrapValue + * + * @param array<TUnwrapKey, TUnwrapValue>|static<TUnwrapKey, TUnwrapValue> $value + * @return array<TUnwrapKey, TUnwrapValue> + */ + public static function unwrap($value) + { + return $value instanceof Enumerable ? $value->all() : $value; + } + + /** + * Create a new instance with no items. + * + * @return static + */ + public static function empty() + { + return new static([]); + } + + /** + * Create a new collection by invoking the callback a given amount of times. + * + * @template TTimesValue + * + * @param int $number + * @param (callable(int): TTimesValue)|null $callback + * @return static<int, TTimesValue> + */ + public static function times($number, callable $callback = null) + { + if ($number < 1) { + return new static; + } + + return static::range(1, $number) + ->unless($callback == null) + ->map($callback); + } + + /** + * Alias for the "avg" method. + * + * @param (callable(TValue): float|int)|string|null $callback + * @return float|int|null + */ + public function average($callback = null) + { + return $this->avg($callback); + } + + /** + * Alias for the "contains" method. + * + * @param (callable(TValue, TKey): bool)|TValue|string $key + * @param mixed $operator + * @param mixed $value + * @return bool + */ + public function some($key, $operator = null, $value = null) + { + return $this->contains(...func_get_args()); + } + + /** + * Dump the items and end the script. + * + * @param mixed ...$args + * @return never + */ + public function dd(...$args) + { + $this->dump(...$args); + + exit(1); + } + + /** + * Dump the items. + * + * @return $this + */ + public function dump() + { + (new Collection(func_get_args())) + ->push($this->all()) + ->each(function ($item) { + VarDumper::dump($item); + }); + + return $this; + } + + /** + * Execute a callback over each item. + * + * @param callable(TValue, TKey): mixed $callback + * @return $this + */ + public function each(callable $callback) + { + foreach ($this as $key => $item) { + if ($callback($item, $key) === false) { + break; + } + } + + return $this; + } + + /** + * Execute a callback over each nested chunk of items. + * + * @param callable(...mixed): mixed $callback + * @return static + */ + public function eachSpread(callable $callback) + { + return $this->each(function ($chunk, $key) use ($callback) { + $chunk[] = $key; + + return $callback(...$chunk); + }); + } + + /** + * Determine if all items pass the given truth test. + * + * @param (callable(TValue, TKey): bool)|TValue|string $key + * @param mixed $operator + * @param mixed $value + * @return bool + */ + public function every($key, $operator = null, $value = null) + { + if (func_num_args() === 1) { + $callback = $this->valueRetriever($key); + + foreach ($this as $k => $v) { + if (! $callback($v, $k)) { + return false; + } + } + + return true; + } + + return $this->every($this->operatorForWhere(...func_get_args())); + } + + /** + * Get the first item by the given key value pair. + * + * @param callable|string $key + * @param mixed $operator + * @param mixed $value + * @return TValue|null + */ + public function firstWhere($key, $operator = null, $value = null) + { + return $this->first($this->operatorForWhere(...func_get_args())); + } + + /** + * Get a single key's value from the first matching item in the collection. + * + * @param string $key + * @param mixed $default + * @return mixed + */ + public function value($key, $default = null) + { + if ($value = $this->firstWhere($key)) { + return data_get($value, $key, $default); + } + + return value($default); + } + + /** + * Determine if the collection is not empty. + * + * @return bool + */ + public function isNotEmpty() + { + return ! $this->isEmpty(); + } + + /** + * Run a map over each nested chunk of items. + * + * @template TMapSpreadValue + * + * @param callable(mixed): TMapSpreadValue $callback + * @return static<TKey, TMapSpreadValue> + */ + public function mapSpread(callable $callback) + { + return $this->map(function ($chunk, $key) use ($callback) { + $chunk[] = $key; + + return $callback(...$chunk); + }); + } + + /** + * Run a grouping map over the items. + * + * The callback should return an associative array with a single key/value pair. + * + * @template TMapToGroupsKey of array-key + * @template TMapToGroupsValue + * + * @param callable(TValue, TKey): array<TMapToGroupsKey, TMapToGroupsValue> $callback + * @return static<TMapToGroupsKey, static<int, TMapToGroupsValue>> + */ + public function mapToGroups(callable $callback) + { + $groups = $this->mapToDictionary($callback); + + return $groups->map([$this, 'make']); + } + + /** + * Map a collection and flatten the result by a single level. + * + * @template TFlatMapKey of array-key + * @template TFlatMapValue + * + * @param callable(TValue, TKey): (\Illuminate\Support\Collection<TFlatMapKey, TFlatMapValue>|array<TFlatMapKey, TFlatMapValue>) $callback + * @return static<TFlatMapKey, TFlatMapValue> + */ + public function flatMap(callable $callback) + { + return $this->map($callback)->collapse(); + } + + /** + * Map the values into a new class. + * + * @template TMapIntoValue + * + * @param class-string<TMapIntoValue> $class + * @return static<TKey, TMapIntoValue> + */ + public function mapInto($class) + { + return $this->map(fn ($value, $key) => new $class($value, $key)); + } + + /** + * Get the min value of a given key. + * + * @param (callable(TValue):mixed)|string|null $callback + * @return mixed + */ + public function min($callback = null) + { + $callback = $this->valueRetriever($callback); + + return $this->map(fn ($value) => $callback($value)) + ->filter(fn ($value) => ! is_null($value)) + ->reduce(fn ($result, $value) => is_null($result) || $value < $result ? $value : $result); + } + + /** + * Get the max value of a given key. + * + * @param (callable(TValue):mixed)|string|null $callback + * @return mixed + */ + public function max($callback = null) + { + $callback = $this->valueRetriever($callback); + + return $this->filter(fn ($value) => ! is_null($value))->reduce(function ($result, $item) use ($callback) { + $value = $callback($item); + + return is_null($result) || $value > $result ? $value : $result; + }); + } + + /** + * "Paginate" the collection by slicing it into a smaller collection. + * + * @param int $page + * @param int $perPage + * @return static + */ + public function forPage($page, $perPage) + { + $offset = max(0, ($page - 1) * $perPage); + + return $this->slice($offset, $perPage); + } + + /** + * Partition the collection into two arrays using the given callback or key. + * + * @param (callable(TValue, TKey): bool)|TValue|string $key + * @param TValue|string|null $operator + * @param TValue|null $value + * @return static<int<0, 1>, static<TKey, TValue>> + */ + public function partition($key, $operator = null, $value = null) + { + $passed = []; + $failed = []; + + $callback = func_num_args() === 1 + ? $this->valueRetriever($key) + : $this->operatorForWhere(...func_get_args()); + + foreach ($this as $key => $item) { + if ($callback($item, $key)) { + $passed[$key] = $item; + } else { + $failed[$key] = $item; + } + } + + return new static([new static($passed), new static($failed)]); + } + + /** + * Get the sum of the given values. + * + * @param (callable(TValue): mixed)|string|null $callback + * @return mixed + */ + public function sum($callback = null) + { + $callback = is_null($callback) + ? $this->identity() + : $this->valueRetriever($callback); + + return $this->reduce(fn ($result, $item) => $result + $callback($item), 0); + } + + /** + * Apply the callback if the collection is empty. + * + * @template TWhenEmptyReturnType + * + * @param (callable($this): TWhenEmptyReturnType) $callback + * @param (callable($this): TWhenEmptyReturnType)|null $default + * @return $this|TWhenEmptyReturnType + */ + public function whenEmpty(callable $callback, callable $default = null) + { + return $this->when($this->isEmpty(), $callback, $default); + } + + /** + * Apply the callback if the collection is not empty. + * + * @template TWhenNotEmptyReturnType + * + * @param callable($this): TWhenNotEmptyReturnType $callback + * @param (callable($this): TWhenNotEmptyReturnType)|null $default + * @return $this|TWhenNotEmptyReturnType + */ + public function whenNotEmpty(callable $callback, callable $default = null) + { + return $this->when($this->isNotEmpty(), $callback, $default); + } + + /** + * Apply the callback unless the collection is empty. + * + * @template TUnlessEmptyReturnType + * + * @param callable($this): TUnlessEmptyReturnType $callback + * @param (callable($this): TUnlessEmptyReturnType)|null $default + * @return $this|TUnlessEmptyReturnType + */ + public function unlessEmpty(callable $callback, callable $default = null) + { + return $this->whenNotEmpty($callback, $default); + } + + /** + * Apply the callback unless the collection is not empty. + * + * @template TUnlessNotEmptyReturnType + * + * @param callable($this): TUnlessNotEmptyReturnType $callback + * @param (callable($this): TUnlessNotEmptyReturnType)|null $default + * @return $this|TUnlessNotEmptyReturnType + */ + public function unlessNotEmpty(callable $callback, callable $default = null) + { + return $this->whenEmpty($callback, $default); + } + + /** + * Filter items by the given key value pair. + * + * @param callable|string $key + * @param mixed $operator + * @param mixed $value + * @return static + */ + public function where($key, $operator = null, $value = null) + { + return $this->filter($this->operatorForWhere(...func_get_args())); + } + + /** + * Filter items where the value for the given key is null. + * + * @param string|null $key + * @return static + */ + public function whereNull($key = null) + { + return $this->whereStrict($key, null); + } + + /** + * Filter items where the value for the given key is not null. + * + * @param string|null $key + * @return static + */ + public function whereNotNull($key = null) + { + return $this->where($key, '!==', null); + } + + /** + * Filter items by the given key value pair using strict comparison. + * + * @param string $key + * @param mixed $value + * @return static + */ + public function whereStrict($key, $value) + { + return $this->where($key, '===', $value); + } + + /** + * Filter items by the given key value pair. + * + * @param string $key + * @param \Illuminate\Contracts\Support\Arrayable|iterable $values + * @param bool $strict + * @return static + */ + public function whereIn($key, $values, $strict = false) + { + $values = $this->getArrayableItems($values); + + return $this->filter(fn ($item) => in_array(data_get($item, $key), $values, $strict)); + } + + /** + * Filter items by the given key value pair using strict comparison. + * + * @param string $key + * @param \Illuminate\Contracts\Support\Arrayable|iterable $values + * @return static + */ + public function whereInStrict($key, $values) + { + return $this->whereIn($key, $values, true); + } + + /** + * Filter items such that the value of the given key is between the given values. + * + * @param string $key + * @param \Illuminate\Contracts\Support\Arrayable|iterable $values + * @return static + */ + public function whereBetween($key, $values) + { + return $this->where($key, '>=', reset($values))->where($key, '<=', end($values)); + } + + /** + * Filter items such that the value of the given key is not between the given values. + * + * @param string $key + * @param \Illuminate\Contracts\Support\Arrayable|iterable $values + * @return static + */ + public function whereNotBetween($key, $values) + { + return $this->filter( + fn ($item) => data_get($item, $key) < reset($values) || data_get($item, $key) > end($values) + ); + } + + /** + * Filter items by the given key value pair. + * + * @param string $key + * @param \Illuminate\Contracts\Support\Arrayable|iterable $values + * @param bool $strict + * @return static + */ + public function whereNotIn($key, $values, $strict = false) + { + $values = $this->getArrayableItems($values); + + return $this->reject(fn ($item) => in_array(data_get($item, $key), $values, $strict)); + } + + /** + * Filter items by the given key value pair using strict comparison. + * + * @param string $key + * @param \Illuminate\Contracts\Support\Arrayable|iterable $values + * @return static + */ + public function whereNotInStrict($key, $values) + { + return $this->whereNotIn($key, $values, true); + } + + /** + * Filter the items, removing any items that don't match the given type(s). + * + * @template TWhereInstanceOf + * + * @param class-string<TWhereInstanceOf>|array<array-key, class-string<TWhereInstanceOf>> $type + * @return static<TKey, TWhereInstanceOf> + */ + public function whereInstanceOf($type) + { + return $this->filter(function ($value) use ($type) { + if (is_array($type)) { + foreach ($type as $classType) { + if ($value instanceof $classType) { + return true; + } + } + + return false; + } + + return $value instanceof $type; + }); + } + + /** + * Pass the collection to the given callback and return the result. + * + * @template TPipeReturnType + * + * @param callable($this): TPipeReturnType $callback + * @return TPipeReturnType + */ + public function pipe(callable $callback) + { + return $callback($this); + } + + /** + * Pass the collection into a new class. + * + * @param class-string $class + * @return mixed + */ + public function pipeInto($class) + { + return new $class($this); + } + + /** + * Pass the collection through a series of callable pipes and return the result. + * + * @param array<callable> $callbacks + * @return mixed + */ + public function pipeThrough($callbacks) + { + return Collection::make($callbacks)->reduce( + fn ($carry, $callback) => $callback($carry), + $this, + ); + } + + /** + * Reduce the collection to a single value. + * + * @template TReduceInitial + * @template TReduceReturnType + * + * @param callable(TReduceInitial|TReduceReturnType, TValue, TKey): TReduceReturnType $callback + * @param TReduceInitial $initial + * @return TReduceReturnType + */ + public function reduce(callable $callback, $initial = null) + { + $result = $initial; + + foreach ($this as $key => $value) { + $result = $callback($result, $value, $key); + } + + return $result; + } + + /** + * Reduce the collection to multiple aggregate values. + * + * @param callable $callback + * @param mixed ...$initial + * @return array + * + * @throws \UnexpectedValueException + */ + public function reduceSpread(callable $callback, ...$initial) + { + $result = $initial; + + foreach ($this as $key => $value) { + $result = call_user_func_array($callback, array_merge($result, [$value, $key])); + + if (! is_array($result)) { + throw new UnexpectedValueException(sprintf( + "%s::reduceSpread expects reducer to return an array, but got a '%s' instead.", + class_basename(static::class), gettype($result) + )); + } + } + + return $result; + } + + /** + * Create a collection of all elements that do not pass a given truth test. + * + * @param (callable(TValue, TKey): bool)|bool|TValue $callback + * @return static + */ + public function reject($callback = true) + { + $useAsCallable = $this->useAsCallable($callback); + + return $this->filter(function ($value, $key) use ($callback, $useAsCallable) { + return $useAsCallable + ? ! $callback($value, $key) + : $value != $callback; + }); + } + + /** + * Pass the collection to the given callback and then return it. + * + * @param callable($this): mixed $callback + * @return $this + */ + public function tap(callable $callback) + { + $callback($this); + + return $this; + } + + /** + * Return only unique items from the collection array. + * + * @param (callable(TValue, TKey): mixed)|string|null $key + * @param bool $strict + * @return static + */ + public function unique($key = null, $strict = false) + { + $callback = $this->valueRetriever($key); + + $exists = []; + + return $this->reject(function ($item, $key) use ($callback, $strict, &$exists) { + if (in_array($id = $callback($item, $key), $exists, $strict)) { + return true; + } + + $exists[] = $id; + }); + } + + /** + * Return only unique items from the collection array using strict comparison. + * + * @param (callable(TValue, TKey): mixed)|string|null $key + * @return static + */ + public function uniqueStrict($key = null) + { + return $this->unique($key, true); + } + + /** + * Collect the values into a collection. + * + * @return \Illuminate\Support\Collection<TKey, TValue> + */ + public function collect() + { + return new Collection($this->all()); + } + + /** + * Get the collection of items as a plain array. + * + * @return array<TKey, mixed> + */ + public function toArray() + { + return $this->map(fn ($value) => $value instanceof Arrayable ? $value->toArray() : $value)->all(); + } + + /** + * Convert the object into something JSON serializable. + * + * @return array<TKey, mixed> + */ + public function jsonSerialize(): array + { + return array_map(function ($value) { + if ($value instanceof JsonSerializable) { + return $value->jsonSerialize(); + } elseif ($value instanceof Jsonable) { + return json_decode($value->toJson(), true); + } elseif ($value instanceof Arrayable) { + return $value->toArray(); + } + + return $value; + }, $this->all()); + } + + /** + * Get the collection of items as JSON. + * + * @param int $options + * @return string + */ + public function toJson($options = 0) + { + return json_encode($this->jsonSerialize(), $options); + } + + /** + * Get a CachingIterator instance. + * + * @param int $flags + * @return \CachingIterator + */ + public function getCachingIterator($flags = CachingIterator::CALL_TOSTRING) + { + return new CachingIterator($this->getIterator(), $flags); + } + + /** + * Convert the collection to its string representation. + * + * @return string + */ + public function __toString() + { + return $this->escapeWhenCastingToString + ? e($this->toJson()) + : $this->toJson(); + } + + /** + * Indicate that the model's string representation should be escaped when __toString is invoked. + * + * @param bool $escape + * @return $this + */ + public function escapeWhenCastingToString($escape = true) + { + $this->escapeWhenCastingToString = $escape; + + return $this; + } + + /** + * Add a method to the list of proxied methods. + * + * @param string $method + * @return void + */ + public static function proxy($method) + { + static::$proxies[] = $method; + } + + /** + * Dynamically access collection proxies. + * + * @param string $key + * @return mixed + * + * @throws \Exception + */ + public function __get($key) + { + if (! in_array($key, static::$proxies)) { + throw new Exception("Property [{$key}] does not exist on this collection instance."); + } + + return new HigherOrderCollectionProxy($this, $key); + } + + /** + * Results array of items from Collection or Arrayable. + * + * @param mixed $items + * @return array<TKey, TValue> + */ + protected function getArrayableItems($items) + { + if (is_array($items)) { + return $items; + } elseif ($items instanceof Enumerable) { + return $items->all(); + } elseif ($items instanceof Arrayable) { + return $items->toArray(); + } elseif ($items instanceof Traversable) { + return iterator_to_array($items); + } elseif ($items instanceof Jsonable) { + return json_decode($items->toJson(), true); + } elseif ($items instanceof JsonSerializable) { + return (array) $items->jsonSerialize(); + } elseif ($items instanceof UnitEnum) { + return [$items]; + } + + return (array) $items; + } + + /** + * Get an operator checker callback. + * + * @param callable|string $key + * @param string|null $operator + * @param mixed $value + * @return \Closure + */ + protected function operatorForWhere($key, $operator = null, $value = null) + { + if ($this->useAsCallable($key)) { + return $key; + } + + if (func_num_args() === 1) { + $value = true; + + $operator = '='; + } + + if (func_num_args() === 2) { + $value = $operator; + + $operator = '='; + } + + return function ($item) use ($key, $operator, $value) { + $retrieved = data_get($item, $key); + + $strings = array_filter([$retrieved, $value], function ($value) { + return is_string($value) || (is_object($value) && method_exists($value, '__toString')); + }); + + if (count($strings) < 2 && count(array_filter([$retrieved, $value], 'is_object')) == 1) { + return in_array($operator, ['!=', '<>', '!==']); + } + + switch ($operator) { + default: + case '=': + case '==': return $retrieved == $value; + case '!=': + case '<>': return $retrieved != $value; + case '<': return $retrieved < $value; + case '>': return $retrieved > $value; + case '<=': return $retrieved <= $value; + case '>=': return $retrieved >= $value; + case '===': return $retrieved === $value; + case '!==': return $retrieved !== $value; + case '<=>': return $retrieved <=> $value; + } + }; + } + + /** + * Determine if the given value is callable, but not a string. + * + * @param mixed $value + * @return bool + */ + protected function useAsCallable($value) + { + return ! is_string($value) && is_callable($value); + } + + /** + * Get a value retrieving callback. + * + * @param callable|string|null $value + * @return callable + */ + protected function valueRetriever($value) + { + if ($this->useAsCallable($value)) { + return $value; + } + + return fn ($item) => data_get($item, $value); + } + + /** + * Make a function to check an item's equality. + * + * @param mixed $value + * @return \Closure(mixed): bool + */ + protected function equality($value) + { + return fn ($item) => $item === $value; + } + + /** + * Make a function using another function, by negating its result. + * + * @param \Closure $callback + * @return \Closure + */ + protected function negate(Closure $callback) + { + return fn (...$params) => ! $callback(...$params); + } + + /** + * Make a function that returns what's passed to it. + * + * @return \Closure(TValue): TValue + */ + protected function identity() + { + return fn ($value) => $value; + } +} diff --git a/vendor/illuminate/collections/composer.json b/vendor/illuminate/collections/composer.json new file mode 100644 index 0000000..cc9aad3 --- /dev/null +++ b/vendor/illuminate/collections/composer.json @@ -0,0 +1,42 @@ +{ + "name": "illuminate/collections", + "description": "The Illuminate Collections package.", + "license": "MIT", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "require": { + "php": "^8.0.2", + "illuminate/conditionable": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/macroable": "^9.0" + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + }, + "files": [ + "helpers.php" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump method (^6.0)." + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev" +} diff --git a/vendor/illuminate/collections/helpers.php b/vendor/illuminate/collections/helpers.php new file mode 100644 index 0000000..5776fea --- /dev/null +++ b/vendor/illuminate/collections/helpers.php @@ -0,0 +1,190 @@ +<?php + +use Illuminate\Support\Arr; +use Illuminate\Support\Collection; + +if (! function_exists('collect')) { + /** + * Create a collection from the given value. + * + * @template TKey of array-key + * @template TValue + * + * @param \Illuminate\Contracts\Support\Arrayable<TKey, TValue>|iterable<TKey, TValue>|null $value + * @return \Illuminate\Support\Collection<TKey, TValue> + */ + function collect($value = null) + { + return new Collection($value); + } +} + +if (! function_exists('data_fill')) { + /** + * Fill in data where it's missing. + * + * @param mixed $target + * @param string|array $key + * @param mixed $value + * @return mixed + */ + function data_fill(&$target, $key, $value) + { + return data_set($target, $key, $value, false); + } +} + +if (! function_exists('data_get')) { + /** + * Get an item from an array or object using "dot" notation. + * + * @param mixed $target + * @param string|array|int|null $key + * @param mixed $default + * @return mixed + */ + function data_get($target, $key, $default = null) + { + if (is_null($key)) { + return $target; + } + + $key = is_array($key) ? $key : explode('.', $key); + + foreach ($key as $i => $segment) { + unset($key[$i]); + + if (is_null($segment)) { + return $target; + } + + if ($segment === '*') { + if ($target instanceof Collection) { + $target = $target->all(); + } elseif (! is_iterable($target)) { + return value($default); + } + + $result = []; + + foreach ($target as $item) { + $result[] = data_get($item, $key); + } + + return in_array('*', $key) ? Arr::collapse($result) : $result; + } + + if (Arr::accessible($target) && Arr::exists($target, $segment)) { + $target = $target[$segment]; + } elseif (is_object($target) && isset($target->{$segment})) { + $target = $target->{$segment}; + } else { + return value($default); + } + } + + return $target; + } +} + +if (! function_exists('data_set')) { + /** + * Set an item on an array or object using dot notation. + * + * @param mixed $target + * @param string|array $key + * @param mixed $value + * @param bool $overwrite + * @return mixed + */ + function data_set(&$target, $key, $value, $overwrite = true) + { + $segments = is_array($key) ? $key : explode('.', $key); + + if (($segment = array_shift($segments)) === '*') { + if (! Arr::accessible($target)) { + $target = []; + } + + if ($segments) { + foreach ($target as &$inner) { + data_set($inner, $segments, $value, $overwrite); + } + } elseif ($overwrite) { + foreach ($target as &$inner) { + $inner = $value; + } + } + } elseif (Arr::accessible($target)) { + if ($segments) { + if (! Arr::exists($target, $segment)) { + $target[$segment] = []; + } + + data_set($target[$segment], $segments, $value, $overwrite); + } elseif ($overwrite || ! Arr::exists($target, $segment)) { + $target[$segment] = $value; + } + } elseif (is_object($target)) { + if ($segments) { + if (! isset($target->{$segment})) { + $target->{$segment} = []; + } + + data_set($target->{$segment}, $segments, $value, $overwrite); + } elseif ($overwrite || ! isset($target->{$segment})) { + $target->{$segment} = $value; + } + } else { + $target = []; + + if ($segments) { + data_set($target[$segment], $segments, $value, $overwrite); + } elseif ($overwrite) { + $target[$segment] = $value; + } + } + + return $target; + } +} + +if (! function_exists('head')) { + /** + * Get the first element of an array. Useful for method chaining. + * + * @param array $array + * @return mixed + */ + function head($array) + { + return reset($array); + } +} + +if (! function_exists('last')) { + /** + * Get the last element from an array. + * + * @param array $array + * @return mixed + */ + function last($array) + { + return end($array); + } +} + +if (! function_exists('value')) { + /** + * Return the default value of the given value. + * + * @param mixed $value + * @param mixed $args + * @return mixed + */ + function value($value, ...$args) + { + return $value instanceof Closure ? $value(...$args) : $value; + } +} diff --git a/vendor/illuminate/conditionable/HigherOrderWhenProxy.php b/vendor/illuminate/conditionable/HigherOrderWhenProxy.php new file mode 100644 index 0000000..579114c --- /dev/null +++ b/vendor/illuminate/conditionable/HigherOrderWhenProxy.php @@ -0,0 +1,109 @@ +<?php + +namespace Illuminate\Support; + +class HigherOrderWhenProxy +{ + /** + * The target being conditionally operated on. + * + * @var mixed + */ + protected $target; + + /** + * The condition for proxying. + * + * @var bool + */ + protected $condition; + + /** + * Indicates whether the proxy has a condition. + * + * @var bool + */ + protected $hasCondition = false; + + /** + * Determine whether the condition should be negated. + * + * @var bool + */ + protected $negateConditionOnCapture; + + /** + * Create a new proxy instance. + * + * @param mixed $target + * @return void + */ + public function __construct($target) + { + $this->target = $target; + } + + /** + * Set the condition on the proxy. + * + * @param bool $condition + * @return $this + */ + public function condition($condition) + { + [$this->condition, $this->hasCondition] = [$condition, true]; + + return $this; + } + + /** + * Indicate that the condition should be negated. + * + * @return $this + */ + public function negateConditionOnCapture() + { + $this->negateConditionOnCapture = true; + + return $this; + } + + /** + * Proxy accessing an attribute onto the target. + * + * @param string $key + * @return mixed + */ + public function __get($key) + { + if (! $this->hasCondition) { + $condition = $this->target->{$key}; + + return $this->condition($this->negateConditionOnCapture ? ! $condition : $condition); + } + + return $this->condition + ? $this->target->{$key} + : $this->target; + } + + /** + * Proxy a method call on the target. + * + * @param string $method + * @param array $parameters + * @return mixed + */ + public function __call($method, $parameters) + { + if (! $this->hasCondition) { + $condition = $this->target->{$method}(...$parameters); + + return $this->condition($this->negateConditionOnCapture ? ! $condition : $condition); + } + + return $this->condition + ? $this->target->{$method}(...$parameters) + : $this->target; + } +} diff --git a/vendor/illuminate/conditionable/LICENSE.md b/vendor/illuminate/conditionable/LICENSE.md new file mode 100644 index 0000000..79810c8 --- /dev/null +++ b/vendor/illuminate/conditionable/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Taylor Otwell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/illuminate/conditionable/Traits/Conditionable.php b/vendor/illuminate/conditionable/Traits/Conditionable.php new file mode 100644 index 0000000..dcd2546 --- /dev/null +++ b/vendor/illuminate/conditionable/Traits/Conditionable.php @@ -0,0 +1,73 @@ +<?php + +namespace Illuminate\Support\Traits; + +use Closure; +use Illuminate\Support\HigherOrderWhenProxy; + +trait Conditionable +{ + /** + * Apply the callback if the given "value" is (or resolves to) truthy. + * + * @template TWhenParameter + * @template TWhenReturnType + * + * @param (\Closure($this): TWhenParameter)|TWhenParameter|null $value + * @param (callable($this, TWhenParameter): TWhenReturnType)|null $callback + * @param (callable($this, TWhenParameter): TWhenReturnType)|null $default + * @return $this|TWhenReturnType + */ + public function when($value = null, callable $callback = null, callable $default = null) + { + $value = $value instanceof Closure ? $value($this) : $value; + + if (func_num_args() === 0) { + return new HigherOrderWhenProxy($this); + } + + if (func_num_args() === 1) { + return (new HigherOrderWhenProxy($this))->condition($value); + } + + if ($value) { + return $callback($this, $value) ?? $this; + } elseif ($default) { + return $default($this, $value) ?? $this; + } + + return $this; + } + + /** + * Apply the callback if the given "value" is (or resolves to) falsy. + * + * @template TUnlessParameter + * @template TUnlessReturnType + * + * @param (\Closure($this): TUnlessParameter)|TUnlessParameter|null $value + * @param (callable($this, TUnlessParameter): TUnlessReturnType)|null $callback + * @param (callable($this, TUnlessParameter): TUnlessReturnType)|null $default + * @return $this|TUnlessReturnType + */ + public function unless($value = null, callable $callback = null, callable $default = null) + { + $value = $value instanceof Closure ? $value($this) : $value; + + if (func_num_args() === 0) { + return (new HigherOrderWhenProxy($this))->negateConditionOnCapture(); + } + + if (func_num_args() === 1) { + return (new HigherOrderWhenProxy($this))->condition(! $value); + } + + if (! $value) { + return $callback($this, $value) ?? $this; + } elseif ($default) { + return $default($this, $value) ?? $this; + } + + return $this; + } +} diff --git a/vendor/illuminate/conditionable/composer.json b/vendor/illuminate/conditionable/composer.json new file mode 100644 index 0000000..a423aad --- /dev/null +++ b/vendor/illuminate/conditionable/composer.json @@ -0,0 +1,33 @@ +{ + "name": "illuminate/conditionable", + "description": "The Illuminate Conditionable package.", + "license": "MIT", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "require": { + "php": "^8.0.2" + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev" +} diff --git a/vendor/illuminate/container/BoundMethod.php b/vendor/illuminate/container/BoundMethod.php new file mode 100644 index 0000000..0bac7fa --- /dev/null +++ b/vendor/illuminate/container/BoundMethod.php @@ -0,0 +1,202 @@ +<?php + +namespace Illuminate\Container; + +use Closure; +use Illuminate\Contracts\Container\BindingResolutionException; +use InvalidArgumentException; +use ReflectionFunction; +use ReflectionMethod; + +class BoundMethod +{ + /** + * Call the given Closure / class@method and inject its dependencies. + * + * @param \Illuminate\Container\Container $container + * @param callable|string $callback + * @param array $parameters + * @param string|null $defaultMethod + * @return mixed + * + * @throws \ReflectionException + * @throws \InvalidArgumentException + */ + public static function call($container, $callback, array $parameters = [], $defaultMethod = null) + { + if (is_string($callback) && ! $defaultMethod && method_exists($callback, '__invoke')) { + $defaultMethod = '__invoke'; + } + + if (static::isCallableWithAtSign($callback) || $defaultMethod) { + return static::callClass($container, $callback, $parameters, $defaultMethod); + } + + return static::callBoundMethod($container, $callback, function () use ($container, $callback, $parameters) { + return $callback(...array_values(static::getMethodDependencies($container, $callback, $parameters))); + }); + } + + /** + * Call a string reference to a class using Class@method syntax. + * + * @param \Illuminate\Container\Container $container + * @param string $target + * @param array $parameters + * @param string|null $defaultMethod + * @return mixed + * + * @throws \InvalidArgumentException + */ + protected static function callClass($container, $target, array $parameters = [], $defaultMethod = null) + { + $segments = explode('@', $target); + + // We will assume an @ sign is used to delimit the class name from the method + // name. We will split on this @ sign and then build a callable array that + // we can pass right back into the "call" method for dependency binding. + $method = count($segments) === 2 + ? $segments[1] : $defaultMethod; + + if (is_null($method)) { + throw new InvalidArgumentException('Method not provided.'); + } + + return static::call( + $container, [$container->make($segments[0]), $method], $parameters + ); + } + + /** + * Call a method that has been bound to the container. + * + * @param \Illuminate\Container\Container $container + * @param callable $callback + * @param mixed $default + * @return mixed + */ + protected static function callBoundMethod($container, $callback, $default) + { + if (! is_array($callback)) { + return Util::unwrapIfClosure($default); + } + + // Here we need to turn the array callable into a Class@method string we can use to + // examine the container and see if there are any method bindings for this given + // method. If there are, we can call this method binding callback immediately. + $method = static::normalizeMethod($callback); + + if ($container->hasMethodBinding($method)) { + return $container->callMethodBinding($method, $callback[0]); + } + + return Util::unwrapIfClosure($default); + } + + /** + * Normalize the given callback into a Class@method string. + * + * @param callable $callback + * @return string + */ + protected static function normalizeMethod($callback) + { + $class = is_string($callback[0]) ? $callback[0] : get_class($callback[0]); + + return "{$class}@{$callback[1]}"; + } + + /** + * Get all dependencies for a given method. + * + * @param \Illuminate\Container\Container $container + * @param callable|string $callback + * @param array $parameters + * @return array + * + * @throws \ReflectionException + */ + protected static function getMethodDependencies($container, $callback, array $parameters = []) + { + $dependencies = []; + + foreach (static::getCallReflector($callback)->getParameters() as $parameter) { + static::addDependencyForCallParameter($container, $parameter, $parameters, $dependencies); + } + + return array_merge($dependencies, array_values($parameters)); + } + + /** + * Get the proper reflection instance for the given callback. + * + * @param callable|string $callback + * @return \ReflectionFunctionAbstract + * + * @throws \ReflectionException + */ + protected static function getCallReflector($callback) + { + if (is_string($callback) && str_contains($callback, '::')) { + $callback = explode('::', $callback); + } elseif (is_object($callback) && ! $callback instanceof Closure) { + $callback = [$callback, '__invoke']; + } + + return is_array($callback) + ? new ReflectionMethod($callback[0], $callback[1]) + : new ReflectionFunction($callback); + } + + /** + * Get the dependency for the given call parameter. + * + * @param \Illuminate\Container\Container $container + * @param \ReflectionParameter $parameter + * @param array $parameters + * @param array $dependencies + * @return void + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + protected static function addDependencyForCallParameter($container, $parameter, + array &$parameters, &$dependencies) + { + if (array_key_exists($paramName = $parameter->getName(), $parameters)) { + $dependencies[] = $parameters[$paramName]; + + unset($parameters[$paramName]); + } elseif (! is_null($className = Util::getParameterClassName($parameter))) { + if (array_key_exists($className, $parameters)) { + $dependencies[] = $parameters[$className]; + + unset($parameters[$className]); + } elseif ($parameter->isVariadic()) { + $variadicDependencies = $container->make($className); + + $dependencies = array_merge($dependencies, is_array($variadicDependencies) + ? $variadicDependencies + : [$variadicDependencies]); + } else { + $dependencies[] = $container->make($className); + } + } elseif ($parameter->isDefaultValueAvailable()) { + $dependencies[] = $parameter->getDefaultValue(); + } elseif (! $parameter->isOptional() && ! array_key_exists($paramName, $parameters)) { + $message = "Unable to resolve dependency [{$parameter}] in class {$parameter->getDeclaringClass()->getName()}"; + + throw new BindingResolutionException($message); + } + } + + /** + * Determine if the given string is in Class@method syntax. + * + * @param mixed $callback + * @return bool + */ + protected static function isCallableWithAtSign($callback) + { + return is_string($callback) && str_contains($callback, '@'); + } +} diff --git a/vendor/illuminate/container/Container.php b/vendor/illuminate/container/Container.php new file mode 100755 index 0000000..0f2f299 --- /dev/null +++ b/vendor/illuminate/container/Container.php @@ -0,0 +1,1469 @@ +<?php + +namespace Illuminate\Container; + +use ArrayAccess; +use Closure; +use Exception; +use Illuminate\Contracts\Container\BindingResolutionException; +use Illuminate\Contracts\Container\CircularDependencyException; +use Illuminate\Contracts\Container\Container as ContainerContract; +use LogicException; +use ReflectionClass; +use ReflectionException; +use ReflectionParameter; +use TypeError; + +class Container implements ArrayAccess, ContainerContract +{ + /** + * The current globally available container (if any). + * + * @var static + */ + protected static $instance; + + /** + * An array of the types that have been resolved. + * + * @var bool[] + */ + protected $resolved = []; + + /** + * The container's bindings. + * + * @var array[] + */ + protected $bindings = []; + + /** + * The container's method bindings. + * + * @var \Closure[] + */ + protected $methodBindings = []; + + /** + * The container's shared instances. + * + * @var object[] + */ + protected $instances = []; + + /** + * The container's scoped instances. + * + * @var array + */ + protected $scopedInstances = []; + + /** + * The registered type aliases. + * + * @var string[] + */ + protected $aliases = []; + + /** + * The registered aliases keyed by the abstract name. + * + * @var array[] + */ + protected $abstractAliases = []; + + /** + * The extension closures for services. + * + * @var array[] + */ + protected $extenders = []; + + /** + * All of the registered tags. + * + * @var array[] + */ + protected $tags = []; + + /** + * The stack of concretions currently being built. + * + * @var array[] + */ + protected $buildStack = []; + + /** + * The parameter override stack. + * + * @var array[] + */ + protected $with = []; + + /** + * The contextual binding map. + * + * @var array[] + */ + public $contextual = []; + + /** + * All of the registered rebound callbacks. + * + * @var array[] + */ + protected $reboundCallbacks = []; + + /** + * All of the global before resolving callbacks. + * + * @var \Closure[] + */ + protected $globalBeforeResolvingCallbacks = []; + + /** + * All of the global resolving callbacks. + * + * @var \Closure[] + */ + protected $globalResolvingCallbacks = []; + + /** + * All of the global after resolving callbacks. + * + * @var \Closure[] + */ + protected $globalAfterResolvingCallbacks = []; + + /** + * All of the before resolving callbacks by class type. + * + * @var array[] + */ + protected $beforeResolvingCallbacks = []; + + /** + * All of the resolving callbacks by class type. + * + * @var array[] + */ + protected $resolvingCallbacks = []; + + /** + * All of the after resolving callbacks by class type. + * + * @var array[] + */ + protected $afterResolvingCallbacks = []; + + /** + * Define a contextual binding. + * + * @param array|string $concrete + * @return \Illuminate\Contracts\Container\ContextualBindingBuilder + */ + public function when($concrete) + { + $aliases = []; + + foreach (Util::arrayWrap($concrete) as $c) { + $aliases[] = $this->getAlias($c); + } + + return new ContextualBindingBuilder($this, $aliases); + } + + /** + * Determine if the given abstract type has been bound. + * + * @param string $abstract + * @return bool + */ + public function bound($abstract) + { + return isset($this->bindings[$abstract]) || + isset($this->instances[$abstract]) || + $this->isAlias($abstract); + } + + /** + * {@inheritdoc} + * + * @return bool + */ + public function has(string $id): bool + { + return $this->bound($id); + } + + /** + * Determine if the given abstract type has been resolved. + * + * @param string $abstract + * @return bool + */ + public function resolved($abstract) + { + if ($this->isAlias($abstract)) { + $abstract = $this->getAlias($abstract); + } + + return isset($this->resolved[$abstract]) || + isset($this->instances[$abstract]); + } + + /** + * Determine if a given type is shared. + * + * @param string $abstract + * @return bool + */ + public function isShared($abstract) + { + return isset($this->instances[$abstract]) || + (isset($this->bindings[$abstract]['shared']) && + $this->bindings[$abstract]['shared'] === true); + } + + /** + * Determine if a given string is an alias. + * + * @param string $name + * @return bool + */ + public function isAlias($name) + { + return isset($this->aliases[$name]); + } + + /** + * Register a binding with the container. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @param bool $shared + * @return void + * + * @throws \TypeError + */ + public function bind($abstract, $concrete = null, $shared = false) + { + $this->dropStaleInstances($abstract); + + // If no concrete type was given, we will simply set the concrete type to the + // abstract type. After that, the concrete type to be registered as shared + // without being forced to state their classes in both of the parameters. + if (is_null($concrete)) { + $concrete = $abstract; + } + + // If the factory is not a Closure, it means it is just a class name which is + // bound into this container to the abstract type and we will just wrap it + // up inside its own Closure to give us more convenience when extending. + if (! $concrete instanceof Closure) { + if (! is_string($concrete)) { + throw new TypeError(self::class.'::bind(): Argument #2 ($concrete) must be of type Closure|string|null'); + } + + $concrete = $this->getClosure($abstract, $concrete); + } + + $this->bindings[$abstract] = compact('concrete', 'shared'); + + // If the abstract type was already resolved in this container we'll fire the + // rebound listener so that any objects which have already gotten resolved + // can have their copy of the object updated via the listener callbacks. + if ($this->resolved($abstract)) { + $this->rebound($abstract); + } + } + + /** + * Get the Closure to be used when building a type. + * + * @param string $abstract + * @param string $concrete + * @return \Closure + */ + protected function getClosure($abstract, $concrete) + { + return function ($container, $parameters = []) use ($abstract, $concrete) { + if ($abstract == $concrete) { + return $container->build($concrete); + } + + return $container->resolve( + $concrete, $parameters, $raiseEvents = false + ); + }; + } + + /** + * Determine if the container has a method binding. + * + * @param string $method + * @return bool + */ + public function hasMethodBinding($method) + { + return isset($this->methodBindings[$method]); + } + + /** + * Bind a callback to resolve with Container::call. + * + * @param array|string $method + * @param \Closure $callback + * @return void + */ + public function bindMethod($method, $callback) + { + $this->methodBindings[$this->parseBindMethod($method)] = $callback; + } + + /** + * Get the method to be bound in class@method format. + * + * @param array|string $method + * @return string + */ + protected function parseBindMethod($method) + { + if (is_array($method)) { + return $method[0].'@'.$method[1]; + } + + return $method; + } + + /** + * Get the method binding for the given method. + * + * @param string $method + * @param mixed $instance + * @return mixed + */ + public function callMethodBinding($method, $instance) + { + return call_user_func($this->methodBindings[$method], $instance, $this); + } + + /** + * Add a contextual binding to the container. + * + * @param string $concrete + * @param string $abstract + * @param \Closure|string $implementation + * @return void + */ + public function addContextualBinding($concrete, $abstract, $implementation) + { + $this->contextual[$concrete][$this->getAlias($abstract)] = $implementation; + } + + /** + * Register a binding if it hasn't already been registered. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @param bool $shared + * @return void + */ + public function bindIf($abstract, $concrete = null, $shared = false) + { + if (! $this->bound($abstract)) { + $this->bind($abstract, $concrete, $shared); + } + } + + /** + * Register a shared binding in the container. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @return void + */ + public function singleton($abstract, $concrete = null) + { + $this->bind($abstract, $concrete, true); + } + + /** + * Register a shared binding if it hasn't already been registered. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @return void + */ + public function singletonIf($abstract, $concrete = null) + { + if (! $this->bound($abstract)) { + $this->singleton($abstract, $concrete); + } + } + + /** + * Register a scoped binding in the container. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @return void + */ + public function scoped($abstract, $concrete = null) + { + $this->scopedInstances[] = $abstract; + + $this->singleton($abstract, $concrete); + } + + /** + * Register a scoped binding if it hasn't already been registered. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @return void + */ + public function scopedIf($abstract, $concrete = null) + { + if (! $this->bound($abstract)) { + $this->scoped($abstract, $concrete); + } + } + + /** + * "Extend" an abstract type in the container. + * + * @param string $abstract + * @param \Closure $closure + * @return void + * + * @throws \InvalidArgumentException + */ + public function extend($abstract, Closure $closure) + { + $abstract = $this->getAlias($abstract); + + if (isset($this->instances[$abstract])) { + $this->instances[$abstract] = $closure($this->instances[$abstract], $this); + + $this->rebound($abstract); + } else { + $this->extenders[$abstract][] = $closure; + + if ($this->resolved($abstract)) { + $this->rebound($abstract); + } + } + } + + /** + * Register an existing instance as shared in the container. + * + * @param string $abstract + * @param mixed $instance + * @return mixed + */ + public function instance($abstract, $instance) + { + $this->removeAbstractAlias($abstract); + + $isBound = $this->bound($abstract); + + unset($this->aliases[$abstract]); + + // We'll check to determine if this type has been bound before, and if it has + // we will fire the rebound callbacks registered with the container and it + // can be updated with consuming classes that have gotten resolved here. + $this->instances[$abstract] = $instance; + + if ($isBound) { + $this->rebound($abstract); + } + + return $instance; + } + + /** + * Remove an alias from the contextual binding alias cache. + * + * @param string $searched + * @return void + */ + protected function removeAbstractAlias($searched) + { + if (! isset($this->aliases[$searched])) { + return; + } + + foreach ($this->abstractAliases as $abstract => $aliases) { + foreach ($aliases as $index => $alias) { + if ($alias == $searched) { + unset($this->abstractAliases[$abstract][$index]); + } + } + } + } + + /** + * Assign a set of tags to a given binding. + * + * @param array|string $abstracts + * @param array|mixed ...$tags + * @return void + */ + public function tag($abstracts, $tags) + { + $tags = is_array($tags) ? $tags : array_slice(func_get_args(), 1); + + foreach ($tags as $tag) { + if (! isset($this->tags[$tag])) { + $this->tags[$tag] = []; + } + + foreach ((array) $abstracts as $abstract) { + $this->tags[$tag][] = $abstract; + } + } + } + + /** + * Resolve all of the bindings for a given tag. + * + * @param string $tag + * @return iterable + */ + public function tagged($tag) + { + if (! isset($this->tags[$tag])) { + return []; + } + + return new RewindableGenerator(function () use ($tag) { + foreach ($this->tags[$tag] as $abstract) { + yield $this->make($abstract); + } + }, count($this->tags[$tag])); + } + + /** + * Alias a type to a different name. + * + * @param string $abstract + * @param string $alias + * @return void + * + * @throws \LogicException + */ + public function alias($abstract, $alias) + { + if ($alias === $abstract) { + throw new LogicException("[{$abstract}] is aliased to itself."); + } + + $this->aliases[$alias] = $abstract; + + $this->abstractAliases[$abstract][] = $alias; + } + + /** + * Bind a new callback to an abstract's rebind event. + * + * @param string $abstract + * @param \Closure $callback + * @return mixed + */ + public function rebinding($abstract, Closure $callback) + { + $this->reboundCallbacks[$abstract = $this->getAlias($abstract)][] = $callback; + + if ($this->bound($abstract)) { + return $this->make($abstract); + } + } + + /** + * Refresh an instance on the given target and method. + * + * @param string $abstract + * @param mixed $target + * @param string $method + * @return mixed + */ + public function refresh($abstract, $target, $method) + { + return $this->rebinding($abstract, function ($app, $instance) use ($target, $method) { + $target->{$method}($instance); + }); + } + + /** + * Fire the "rebound" callbacks for the given abstract type. + * + * @param string $abstract + * @return void + */ + protected function rebound($abstract) + { + $instance = $this->make($abstract); + + foreach ($this->getReboundCallbacks($abstract) as $callback) { + $callback($this, $instance); + } + } + + /** + * Get the rebound callbacks for a given type. + * + * @param string $abstract + * @return array + */ + protected function getReboundCallbacks($abstract) + { + return $this->reboundCallbacks[$abstract] ?? []; + } + + /** + * Wrap the given closure such that its dependencies will be injected when executed. + * + * @param \Closure $callback + * @param array $parameters + * @return \Closure + */ + public function wrap(Closure $callback, array $parameters = []) + { + return function () use ($callback, $parameters) { + return $this->call($callback, $parameters); + }; + } + + /** + * Call the given Closure / class@method and inject its dependencies. + * + * @param callable|string $callback + * @param array<string, mixed> $parameters + * @param string|null $defaultMethod + * @return mixed + * + * @throws \InvalidArgumentException + */ + public function call($callback, array $parameters = [], $defaultMethod = null) + { + return BoundMethod::call($this, $callback, $parameters, $defaultMethod); + } + + /** + * Get a closure to resolve the given type from the container. + * + * @param string $abstract + * @return \Closure + */ + public function factory($abstract) + { + return function () use ($abstract) { + return $this->make($abstract); + }; + } + + /** + * An alias function name for make(). + * + * @param string|callable $abstract + * @param array $parameters + * @return mixed + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + public function makeWith($abstract, array $parameters = []) + { + return $this->make($abstract, $parameters); + } + + /** + * Resolve the given type from the container. + * + * @param string|callable $abstract + * @param array $parameters + * @return mixed + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + public function make($abstract, array $parameters = []) + { + return $this->resolve($abstract, $parameters); + } + + /** + * {@inheritdoc} + * + * @return mixed + */ + public function get(string $id) + { + try { + return $this->resolve($id); + } catch (Exception $e) { + if ($this->has($id) || $e instanceof CircularDependencyException) { + throw $e; + } + + throw new EntryNotFoundException($id, is_int($e->getCode()) ? $e->getCode() : 0, $e); + } + } + + /** + * Resolve the given type from the container. + * + * @param string|callable $abstract + * @param array $parameters + * @param bool $raiseEvents + * @return mixed + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + * @throws \Illuminate\Contracts\Container\CircularDependencyException + */ + protected function resolve($abstract, $parameters = [], $raiseEvents = true) + { + $abstract = $this->getAlias($abstract); + + // First we'll fire any event handlers which handle the "before" resolving of + // specific types. This gives some hooks the chance to add various extends + // calls to change the resolution of objects that they're interested in. + if ($raiseEvents) { + $this->fireBeforeResolvingCallbacks($abstract, $parameters); + } + + $concrete = $this->getContextualConcrete($abstract); + + $needsContextualBuild = ! empty($parameters) || ! is_null($concrete); + + // If an instance of the type is currently being managed as a singleton we'll + // just return an existing instance instead of instantiating new instances + // so the developer can keep using the same objects instance every time. + if (isset($this->instances[$abstract]) && ! $needsContextualBuild) { + return $this->instances[$abstract]; + } + + $this->with[] = $parameters; + + if (is_null($concrete)) { + $concrete = $this->getConcrete($abstract); + } + + // We're ready to instantiate an instance of the concrete type registered for + // the binding. This will instantiate the types, as well as resolve any of + // its "nested" dependencies recursively until all have gotten resolved. + if ($this->isBuildable($concrete, $abstract)) { + $object = $this->build($concrete); + } else { + $object = $this->make($concrete); + } + + // If we defined any extenders for this type, we'll need to spin through them + // and apply them to the object being built. This allows for the extension + // of services, such as changing configuration or decorating the object. + foreach ($this->getExtenders($abstract) as $extender) { + $object = $extender($object, $this); + } + + // If the requested type is registered as a singleton we'll want to cache off + // the instances in "memory" so we can return it later without creating an + // entirely new instance of an object on each subsequent request for it. + if ($this->isShared($abstract) && ! $needsContextualBuild) { + $this->instances[$abstract] = $object; + } + + if ($raiseEvents) { + $this->fireResolvingCallbacks($abstract, $object); + } + + // Before returning, we will also set the resolved flag to "true" and pop off + // the parameter overrides for this build. After those two things are done + // we will be ready to return back the fully constructed class instance. + $this->resolved[$abstract] = true; + + array_pop($this->with); + + return $object; + } + + /** + * Get the concrete type for a given abstract. + * + * @param string|callable $abstract + * @return mixed + */ + protected function getConcrete($abstract) + { + // If we don't have a registered resolver or concrete for the type, we'll just + // assume each type is a concrete name and will attempt to resolve it as is + // since the container should be able to resolve concretes automatically. + if (isset($this->bindings[$abstract])) { + return $this->bindings[$abstract]['concrete']; + } + + return $abstract; + } + + /** + * Get the contextual concrete binding for the given abstract. + * + * @param string|callable $abstract + * @return \Closure|string|array|null + */ + protected function getContextualConcrete($abstract) + { + if (! is_null($binding = $this->findInContextualBindings($abstract))) { + return $binding; + } + + // Next we need to see if a contextual binding might be bound under an alias of the + // given abstract type. So, we will need to check if any aliases exist with this + // type and then spin through them and check for contextual bindings on these. + if (empty($this->abstractAliases[$abstract])) { + return; + } + + foreach ($this->abstractAliases[$abstract] as $alias) { + if (! is_null($binding = $this->findInContextualBindings($alias))) { + return $binding; + } + } + } + + /** + * Find the concrete binding for the given abstract in the contextual binding array. + * + * @param string|callable $abstract + * @return \Closure|string|null + */ + protected function findInContextualBindings($abstract) + { + return $this->contextual[end($this->buildStack)][$abstract] ?? null; + } + + /** + * Determine if the given concrete is buildable. + * + * @param mixed $concrete + * @param string $abstract + * @return bool + */ + protected function isBuildable($concrete, $abstract) + { + return $concrete === $abstract || $concrete instanceof Closure; + } + + /** + * Instantiate a concrete instance of the given type. + * + * @param \Closure|string $concrete + * @return mixed + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + * @throws \Illuminate\Contracts\Container\CircularDependencyException + */ + public function build($concrete) + { + // If the concrete type is actually a Closure, we will just execute it and + // hand back the results of the functions, which allows functions to be + // used as resolvers for more fine-tuned resolution of these objects. + if ($concrete instanceof Closure) { + return $concrete($this, $this->getLastParameterOverride()); + } + + try { + $reflector = new ReflectionClass($concrete); + } catch (ReflectionException $e) { + throw new BindingResolutionException("Target class [$concrete] does not exist.", 0, $e); + } + + // If the type is not instantiable, the developer is attempting to resolve + // an abstract type such as an Interface or Abstract Class and there is + // no binding registered for the abstractions so we need to bail out. + if (! $reflector->isInstantiable()) { + return $this->notInstantiable($concrete); + } + + $this->buildStack[] = $concrete; + + $constructor = $reflector->getConstructor(); + + // If there are no constructors, that means there are no dependencies then + // we can just resolve the instances of the objects right away, without + // resolving any other types or dependencies out of these containers. + if (is_null($constructor)) { + array_pop($this->buildStack); + + return new $concrete; + } + + $dependencies = $constructor->getParameters(); + + // Once we have all the constructor's parameters we can create each of the + // dependency instances and then use the reflection instances to make a + // new instance of this class, injecting the created dependencies in. + try { + $instances = $this->resolveDependencies($dependencies); + } catch (BindingResolutionException $e) { + array_pop($this->buildStack); + + throw $e; + } + + array_pop($this->buildStack); + + return $reflector->newInstanceArgs($instances); + } + + /** + * Resolve all of the dependencies from the ReflectionParameters. + * + * @param \ReflectionParameter[] $dependencies + * @return array + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + protected function resolveDependencies(array $dependencies) + { + $results = []; + + foreach ($dependencies as $dependency) { + // If the dependency has an override for this particular build we will use + // that instead as the value. Otherwise, we will continue with this run + // of resolutions and let reflection attempt to determine the result. + if ($this->hasParameterOverride($dependency)) { + $results[] = $this->getParameterOverride($dependency); + + continue; + } + + // 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 will just bomb out with an error since we have no-where to go. + $result = is_null(Util::getParameterClassName($dependency)) + ? $this->resolvePrimitive($dependency) + : $this->resolveClass($dependency); + + if ($dependency->isVariadic()) { + $results = array_merge($results, $result); + } else { + $results[] = $result; + } + } + + return $results; + } + + /** + * Determine if the given dependency has a parameter override. + * + * @param \ReflectionParameter $dependency + * @return bool + */ + protected function hasParameterOverride($dependency) + { + return array_key_exists( + $dependency->name, $this->getLastParameterOverride() + ); + } + + /** + * Get a parameter override for a dependency. + * + * @param \ReflectionParameter $dependency + * @return mixed + */ + protected function getParameterOverride($dependency) + { + return $this->getLastParameterOverride()[$dependency->name]; + } + + /** + * Get the last parameter override. + * + * @return array + */ + protected function getLastParameterOverride() + { + return count($this->with) ? end($this->with) : []; + } + + /** + * Resolve a non-class hinted primitive dependency. + * + * @param \ReflectionParameter $parameter + * @return mixed + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + protected function resolvePrimitive(ReflectionParameter $parameter) + { + if (! is_null($concrete = $this->getContextualConcrete('$'.$parameter->getName()))) { + return Util::unwrapIfClosure($concrete, $this); + } + + if ($parameter->isDefaultValueAvailable()) { + return $parameter->getDefaultValue(); + } + + if ($parameter->isVariadic()) { + return []; + } + + $this->unresolvablePrimitive($parameter); + } + + /** + * Resolve a class based dependency from the container. + * + * @param \ReflectionParameter $parameter + * @return mixed + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + protected function resolveClass(ReflectionParameter $parameter) + { + try { + return $parameter->isVariadic() + ? $this->resolveVariadicClass($parameter) + : $this->make(Util::getParameterClassName($parameter)); + } + + // If we can not resolve the class instance, we will check to see if the value + // is optional, and if it is we will return the optional parameter value as + // the value of the dependency, similarly to how we do this with scalars. + catch (BindingResolutionException $e) { + if ($parameter->isDefaultValueAvailable()) { + array_pop($this->with); + + return $parameter->getDefaultValue(); + } + + if ($parameter->isVariadic()) { + array_pop($this->with); + + return []; + } + + throw $e; + } + } + + /** + * Resolve a class based variadic dependency from the container. + * + * @param \ReflectionParameter $parameter + * @return mixed + */ + protected function resolveVariadicClass(ReflectionParameter $parameter) + { + $className = Util::getParameterClassName($parameter); + + $abstract = $this->getAlias($className); + + if (! is_array($concrete = $this->getContextualConcrete($abstract))) { + return $this->make($className); + } + + return array_map(function ($abstract) { + return $this->resolve($abstract); + }, $concrete); + } + + /** + * Throw an exception that the concrete is not instantiable. + * + * @param string $concrete + * @return void + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + protected function notInstantiable($concrete) + { + if (! empty($this->buildStack)) { + $previous = implode(', ', $this->buildStack); + + $message = "Target [$concrete] is not instantiable while building [$previous]."; + } else { + $message = "Target [$concrete] is not instantiable."; + } + + throw new BindingResolutionException($message); + } + + /** + * Throw an exception for an unresolvable primitive. + * + * @param \ReflectionParameter $parameter + * @return void + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + protected function unresolvablePrimitive(ReflectionParameter $parameter) + { + $message = "Unresolvable dependency resolving [$parameter] in class {$parameter->getDeclaringClass()->getName()}"; + + throw new BindingResolutionException($message); + } + + /** + * Register a new before resolving callback for all types. + * + * @param \Closure|string $abstract + * @param \Closure|null $callback + * @return void + */ + public function beforeResolving($abstract, Closure $callback = null) + { + if (is_string($abstract)) { + $abstract = $this->getAlias($abstract); + } + + if ($abstract instanceof Closure && is_null($callback)) { + $this->globalBeforeResolvingCallbacks[] = $abstract; + } else { + $this->beforeResolvingCallbacks[$abstract][] = $callback; + } + } + + /** + * Register a new resolving callback. + * + * @param \Closure|string $abstract + * @param \Closure|null $callback + * @return void + */ + public function resolving($abstract, Closure $callback = null) + { + if (is_string($abstract)) { + $abstract = $this->getAlias($abstract); + } + + if (is_null($callback) && $abstract instanceof Closure) { + $this->globalResolvingCallbacks[] = $abstract; + } else { + $this->resolvingCallbacks[$abstract][] = $callback; + } + } + + /** + * Register a new after resolving callback for all types. + * + * @param \Closure|string $abstract + * @param \Closure|null $callback + * @return void + */ + public function afterResolving($abstract, Closure $callback = null) + { + if (is_string($abstract)) { + $abstract = $this->getAlias($abstract); + } + + if ($abstract instanceof Closure && is_null($callback)) { + $this->globalAfterResolvingCallbacks[] = $abstract; + } else { + $this->afterResolvingCallbacks[$abstract][] = $callback; + } + } + + /** + * Fire all of the before resolving callbacks. + * + * @param string $abstract + * @param array $parameters + * @return void + */ + protected function fireBeforeResolvingCallbacks($abstract, $parameters = []) + { + $this->fireBeforeCallbackArray($abstract, $parameters, $this->globalBeforeResolvingCallbacks); + + foreach ($this->beforeResolvingCallbacks as $type => $callbacks) { + if ($type === $abstract || is_subclass_of($abstract, $type)) { + $this->fireBeforeCallbackArray($abstract, $parameters, $callbacks); + } + } + } + + /** + * Fire an array of callbacks with an object. + * + * @param string $abstract + * @param array $parameters + * @param array $callbacks + * @return void + */ + protected function fireBeforeCallbackArray($abstract, $parameters, array $callbacks) + { + foreach ($callbacks as $callback) { + $callback($abstract, $parameters, $this); + } + } + + /** + * Fire all of the resolving callbacks. + * + * @param string $abstract + * @param mixed $object + * @return void + */ + protected function fireResolvingCallbacks($abstract, $object) + { + $this->fireCallbackArray($object, $this->globalResolvingCallbacks); + + $this->fireCallbackArray( + $object, $this->getCallbacksForType($abstract, $object, $this->resolvingCallbacks) + ); + + $this->fireAfterResolvingCallbacks($abstract, $object); + } + + /** + * Fire all of the after resolving callbacks. + * + * @param string $abstract + * @param mixed $object + * @return void + */ + protected function fireAfterResolvingCallbacks($abstract, $object) + { + $this->fireCallbackArray($object, $this->globalAfterResolvingCallbacks); + + $this->fireCallbackArray( + $object, $this->getCallbacksForType($abstract, $object, $this->afterResolvingCallbacks) + ); + } + + /** + * Get all callbacks for a given type. + * + * @param string $abstract + * @param object $object + * @param array $callbacksPerType + * @return array + */ + protected function getCallbacksForType($abstract, $object, array $callbacksPerType) + { + $results = []; + + foreach ($callbacksPerType as $type => $callbacks) { + if ($type === $abstract || $object instanceof $type) { + $results = array_merge($results, $callbacks); + } + } + + return $results; + } + + /** + * Fire an array of callbacks with an object. + * + * @param mixed $object + * @param array $callbacks + * @return void + */ + protected function fireCallbackArray($object, array $callbacks) + { + foreach ($callbacks as $callback) { + $callback($object, $this); + } + } + + /** + * Get the container's bindings. + * + * @return array + */ + public function getBindings() + { + return $this->bindings; + } + + /** + * Get the alias for an abstract if available. + * + * @param string $abstract + * @return string + */ + public function getAlias($abstract) + { + return isset($this->aliases[$abstract]) + ? $this->getAlias($this->aliases[$abstract]) + : $abstract; + } + + /** + * Get the extender callbacks for a given type. + * + * @param string $abstract + * @return array + */ + protected function getExtenders($abstract) + { + return $this->extenders[$this->getAlias($abstract)] ?? []; + } + + /** + * Remove all of the extender callbacks for a given type. + * + * @param string $abstract + * @return void + */ + public function forgetExtenders($abstract) + { + unset($this->extenders[$this->getAlias($abstract)]); + } + + /** + * Drop all of the stale instances and aliases. + * + * @param string $abstract + * @return void + */ + protected function dropStaleInstances($abstract) + { + unset($this->instances[$abstract], $this->aliases[$abstract]); + } + + /** + * Remove a resolved instance from the instance cache. + * + * @param string $abstract + * @return void + */ + public function forgetInstance($abstract) + { + unset($this->instances[$abstract]); + } + + /** + * Clear all of the instances from the container. + * + * @return void + */ + public function forgetInstances() + { + $this->instances = []; + } + + /** + * Clear all of the scoped instances from the container. + * + * @return void + */ + public function forgetScopedInstances() + { + foreach ($this->scopedInstances as $scoped) { + unset($this->instances[$scoped]); + } + } + + /** + * Flush the container of all bindings and resolved instances. + * + * @return void + */ + public function flush() + { + $this->aliases = []; + $this->resolved = []; + $this->bindings = []; + $this->instances = []; + $this->abstractAliases = []; + $this->scopedInstances = []; + } + + /** + * Get the globally available instance of the container. + * + * @return static + */ + public static function getInstance() + { + if (is_null(static::$instance)) { + static::$instance = new static; + } + + return static::$instance; + } + + /** + * Set the shared instance of the container. + * + * @param \Illuminate\Contracts\Container\Container|null $container + * @return \Illuminate\Contracts\Container\Container|static + */ + public static function setInstance(ContainerContract $container = null) + { + return static::$instance = $container; + } + + /** + * Determine if a given offset exists. + * + * @param string $key + * @return bool + */ + public function offsetExists($key): bool + { + return $this->bound($key); + } + + /** + * Get the value at a given offset. + * + * @param string $key + * @return mixed + */ + public function offsetGet($key): mixed + { + return $this->make($key); + } + + /** + * Set the value at a given offset. + * + * @param string $key + * @param mixed $value + * @return void + */ + public function offsetSet($key, $value): void + { + $this->bind($key, $value instanceof Closure ? $value : function () use ($value) { + return $value; + }); + } + + /** + * Unset the value at a given offset. + * + * @param string $key + * @return void + */ + public function offsetUnset($key): void + { + unset($this->bindings[$key], $this->instances[$key], $this->resolved[$key]); + } + + /** + * Dynamically access container services. + * + * @param string $key + * @return mixed + */ + public function __get($key) + { + return $this[$key]; + } + + /** + * Dynamically set container services. + * + * @param string $key + * @param mixed $value + * @return void + */ + public function __set($key, $value) + { + $this[$key] = $value; + } +} diff --git a/vendor/illuminate/container/ContextualBindingBuilder.php b/vendor/illuminate/container/ContextualBindingBuilder.php new file mode 100644 index 0000000..707b74c --- /dev/null +++ b/vendor/illuminate/container/ContextualBindingBuilder.php @@ -0,0 +1,96 @@ +<?php + +namespace Illuminate\Container; + +use Illuminate\Contracts\Container\Container; +use Illuminate\Contracts\Container\ContextualBindingBuilder as ContextualBindingBuilderContract; + +class ContextualBindingBuilder implements ContextualBindingBuilderContract +{ + /** + * The underlying container instance. + * + * @var \Illuminate\Contracts\Container\Container + */ + protected $container; + + /** + * The concrete instance. + * + * @var string|array + */ + protected $concrete; + + /** + * The abstract target. + * + * @var string + */ + protected $needs; + + /** + * Create a new contextual binding builder. + * + * @param \Illuminate\Contracts\Container\Container $container + * @param string|array $concrete + * @return void + */ + public function __construct(Container $container, $concrete) + { + $this->concrete = $concrete; + $this->container = $container; + } + + /** + * Define the abstract target that depends on the context. + * + * @param string $abstract + * @return $this + */ + public function needs($abstract) + { + $this->needs = $abstract; + + return $this; + } + + /** + * Define the implementation for the contextual binding. + * + * @param \Closure|string|array $implementation + * @return void + */ + public function give($implementation) + { + foreach (Util::arrayWrap($this->concrete) as $concrete) { + $this->container->addContextualBinding($concrete, $this->needs, $implementation); + } + } + + /** + * Define tagged services to be used as the implementation for the contextual binding. + * + * @param string $tag + * @return void + */ + public function giveTagged($tag) + { + $this->give(function ($container) use ($tag) { + $taggedServices = $container->tagged($tag); + + return is_array($taggedServices) ? $taggedServices : iterator_to_array($taggedServices); + }); + } + + /** + * Specify the configuration item to bind as a primitive. + * + * @param string $key + * @param mixed $default + * @return void + */ + public function giveConfig($key, $default = null) + { + $this->give(fn ($container) => $container->get('config')->get($key, $default)); + } +} diff --git a/vendor/illuminate/container/EntryNotFoundException.php b/vendor/illuminate/container/EntryNotFoundException.php new file mode 100644 index 0000000..4266921 --- /dev/null +++ b/vendor/illuminate/container/EntryNotFoundException.php @@ -0,0 +1,11 @@ +<?php + +namespace Illuminate\Container; + +use Exception; +use Psr\Container\NotFoundExceptionInterface; + +class EntryNotFoundException extends Exception implements NotFoundExceptionInterface +{ + // +} diff --git a/vendor/illuminate/container/LICENSE.md b/vendor/illuminate/container/LICENSE.md new file mode 100644 index 0000000..79810c8 --- /dev/null +++ b/vendor/illuminate/container/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Taylor Otwell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/illuminate/container/RewindableGenerator.php b/vendor/illuminate/container/RewindableGenerator.php new file mode 100644 index 0000000..14c0bd0 --- /dev/null +++ b/vendor/illuminate/container/RewindableGenerator.php @@ -0,0 +1,61 @@ +<?php + +namespace Illuminate\Container; + +use Countable; +use IteratorAggregate; +use Traversable; + +class RewindableGenerator implements Countable, IteratorAggregate +{ + /** + * The generator callback. + * + * @var callable + */ + protected $generator; + + /** + * The number of tagged services. + * + * @var callable|int + */ + protected $count; + + /** + * Create a new generator instance. + * + * @param callable $generator + * @param callable|int $count + * @return void + */ + public function __construct(callable $generator, $count) + { + $this->count = $count; + $this->generator = $generator; + } + + /** + * Get an iterator from the generator. + * + * @return \Traversable + */ + public function getIterator(): Traversable + { + return ($this->generator)(); + } + + /** + * Get the total number of tagged services. + * + * @return int + */ + public function count(): int + { + if (is_callable($count = $this->count)) { + $this->count = $count(); + } + + return $this->count; + } +} diff --git a/vendor/illuminate/container/Util.php b/vendor/illuminate/container/Util.php new file mode 100644 index 0000000..8d5023b --- /dev/null +++ b/vendor/illuminate/container/Util.php @@ -0,0 +1,74 @@ +<?php + +namespace Illuminate\Container; + +use Closure; +use ReflectionNamedType; + +/** + * @internal + */ +class Util +{ + /** + * If the given value is not an array and not null, wrap it in one. + * + * From Arr::wrap() in Illuminate\Support. + * + * @param mixed $value + * @return array + */ + public static function arrayWrap($value) + { + if (is_null($value)) { + return []; + } + + return is_array($value) ? $value : [$value]; + } + + /** + * Return the default value of the given value. + * + * From global value() helper in Illuminate\Support. + * + * @param mixed $value + * @param mixed ...$args + * @return mixed + */ + public static function unwrapIfClosure($value, ...$args) + { + return $value instanceof Closure ? $value(...$args) : $value; + } + + /** + * Get the class name of the given parameter's type, if possible. + * + * From Reflector::getParameterClassName() in Illuminate\Support. + * + * @param \ReflectionParameter $parameter + * @return string|null + */ + public static function getParameterClassName($parameter) + { + $type = $parameter->getType(); + + if (! $type instanceof ReflectionNamedType || $type->isBuiltin()) { + return null; + } + + $name = $type->getName(); + + if (! is_null($class = $parameter->getDeclaringClass())) { + if ($name === 'self') { + return $class->getName(); + } + + if ($name === 'parent' && $parent = $class->getParentClass()) { + return $parent->getName(); + } + } + + return $name; + } +} diff --git a/vendor/illuminate/container/composer.json b/vendor/illuminate/container/composer.json new file mode 100755 index 0000000..8944b5b --- /dev/null +++ b/vendor/illuminate/container/composer.json @@ -0,0 +1,38 @@ +{ + "name": "illuminate/container", + "description": "The Illuminate Container package.", + "license": "MIT", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "require": { + "php": "^8.0.2", + "illuminate/contracts": "^9.0", + "psr/container": "^1.1.1|^2.0.1" + }, + "provide": { + "psr/container-implementation": "1.1|2.0" + }, + "autoload": { + "psr-4": { + "Illuminate\\Container\\": "" + } + }, + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev" +} diff --git a/vendor/illuminate/contracts/Auth/Access/Authorizable.php b/vendor/illuminate/contracts/Auth/Access/Authorizable.php new file mode 100644 index 0000000..cedeb6e --- /dev/null +++ b/vendor/illuminate/contracts/Auth/Access/Authorizable.php @@ -0,0 +1,15 @@ +<?php + +namespace Illuminate\Contracts\Auth\Access; + +interface Authorizable +{ + /** + * Determine if the entity has a given ability. + * + * @param iterable|string $abilities + * @param array|mixed $arguments + * @return bool + */ + public function can($abilities, $arguments = []); +} diff --git a/vendor/illuminate/contracts/Auth/Access/Gate.php b/vendor/illuminate/contracts/Auth/Access/Gate.php new file mode 100644 index 0000000..b88ab17 --- /dev/null +++ b/vendor/illuminate/contracts/Auth/Access/Gate.php @@ -0,0 +1,150 @@ +<?php + +namespace Illuminate\Contracts\Auth\Access; + +interface Gate +{ + /** + * Determine if a given ability has been defined. + * + * @param string $ability + * @return bool + */ + public function has($ability); + + /** + * Define a new ability. + * + * @param string $ability + * @param callable|string $callback + * @return $this + */ + public function define($ability, $callback); + + /** + * Define abilities for a resource. + * + * @param string $name + * @param string $class + * @param array|null $abilities + * @return $this + */ + public function resource($name, $class, array $abilities = null); + + /** + * Define a policy class for a given class type. + * + * @param string $class + * @param string $policy + * @return $this + */ + public function policy($class, $policy); + + /** + * Register a callback to run before all Gate checks. + * + * @param callable $callback + * @return $this + */ + public function before(callable $callback); + + /** + * Register a callback to run after all Gate checks. + * + * @param callable $callback + * @return $this + */ + public function after(callable $callback); + + /** + * Determine if the given ability should be granted for the current user. + * + * @param string $ability + * @param array|mixed $arguments + * @return bool + */ + public function allows($ability, $arguments = []); + + /** + * Determine if the given ability should be denied for the current user. + * + * @param string $ability + * @param array|mixed $arguments + * @return bool + */ + public function denies($ability, $arguments = []); + + /** + * Determine if all of the given abilities should be granted for the current user. + * + * @param iterable|string $abilities + * @param array|mixed $arguments + * @return bool + */ + public function check($abilities, $arguments = []); + + /** + * Determine if any one of the given abilities should be granted for the current user. + * + * @param iterable|string $abilities + * @param array|mixed $arguments + * @return bool + */ + public function any($abilities, $arguments = []); + + /** + * Determine if the given ability should be granted for the current user. + * + * @param string $ability + * @param array|mixed $arguments + * @return \Illuminate\Auth\Access\Response + * + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function authorize($ability, $arguments = []); + + /** + * Inspect the user for the given ability. + * + * @param string $ability + * @param array|mixed $arguments + * @return \Illuminate\Auth\Access\Response + */ + public function inspect($ability, $arguments = []); + + /** + * Get the raw result from the authorization callback. + * + * @param string $ability + * @param array|mixed $arguments + * @return mixed + * + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function raw($ability, $arguments = []); + + /** + * Get a policy instance for a given class. + * + * @param object|string $class + * @return mixed + * + * @throws \InvalidArgumentException + */ + public function getPolicyFor($class); + + /** + * Get a guard instance for the given user. + * + * @param \Illuminate\Contracts\Auth\Authenticatable|mixed $user + * @return static + */ + public function forUser($user); + + /** + * Get all of the defined abilities. + * + * @return array + */ + public function abilities(); +} diff --git a/vendor/illuminate/contracts/Auth/Authenticatable.php b/vendor/illuminate/contracts/Auth/Authenticatable.php new file mode 100644 index 0000000..ac4ed88 --- /dev/null +++ b/vendor/illuminate/contracts/Auth/Authenticatable.php @@ -0,0 +1,49 @@ +<?php + +namespace Illuminate\Contracts\Auth; + +interface Authenticatable +{ + /** + * Get the name of the unique identifier for the user. + * + * @return string + */ + public function getAuthIdentifierName(); + + /** + * Get the unique identifier for the user. + * + * @return mixed + */ + public function getAuthIdentifier(); + + /** + * Get the password for the user. + * + * @return string + */ + public function getAuthPassword(); + + /** + * Get the token value for the "remember me" session. + * + * @return string + */ + public function getRememberToken(); + + /** + * Set the token value for the "remember me" session. + * + * @param string $value + * @return void + */ + public function setRememberToken($value); + + /** + * Get the column name for the "remember me" token. + * + * @return string + */ + public function getRememberTokenName(); +} diff --git a/vendor/illuminate/contracts/Auth/CanResetPassword.php b/vendor/illuminate/contracts/Auth/CanResetPassword.php new file mode 100644 index 0000000..3a67707 --- /dev/null +++ b/vendor/illuminate/contracts/Auth/CanResetPassword.php @@ -0,0 +1,21 @@ +<?php + +namespace Illuminate\Contracts\Auth; + +interface CanResetPassword +{ + /** + * Get the e-mail address where password reset links are sent. + * + * @return string + */ + public function getEmailForPasswordReset(); + + /** + * Send the password reset notification. + * + * @param string $token + * @return void + */ + public function sendPasswordResetNotification($token); +} diff --git a/vendor/illuminate/contracts/Auth/Factory.php b/vendor/illuminate/contracts/Auth/Factory.php new file mode 100644 index 0000000..d76ee76 --- /dev/null +++ b/vendor/illuminate/contracts/Auth/Factory.php @@ -0,0 +1,22 @@ +<?php + +namespace Illuminate\Contracts\Auth; + +interface Factory +{ + /** + * Get a guard instance by name. + * + * @param string|null $name + * @return \Illuminate\Contracts\Auth\Guard|\Illuminate\Contracts\Auth\StatefulGuard + */ + public function guard($name = null); + + /** + * Set the default guard the factory should serve. + * + * @param string $name + * @return void + */ + public function shouldUse($name); +} diff --git a/vendor/illuminate/contracts/Auth/Guard.php b/vendor/illuminate/contracts/Auth/Guard.php new file mode 100644 index 0000000..2796f1a --- /dev/null +++ b/vendor/illuminate/contracts/Auth/Guard.php @@ -0,0 +1,57 @@ +<?php + +namespace Illuminate\Contracts\Auth; + +interface Guard +{ + /** + * Determine if the current user is authenticated. + * + * @return bool + */ + public function check(); + + /** + * Determine if the current user is a guest. + * + * @return bool + */ + public function guest(); + + /** + * Get the currently authenticated user. + * + * @return \Illuminate\Contracts\Auth\Authenticatable|null + */ + public function user(); + + /** + * Get the ID for the currently authenticated user. + * + * @return int|string|null + */ + public function id(); + + /** + * Validate a user's credentials. + * + * @param array $credentials + * @return bool + */ + public function validate(array $credentials = []); + + /** + * Determine if the guard has a user instance. + * + * @return bool + */ + public function hasUser(); + + /** + * Set the current user. + * + * @param \Illuminate\Contracts\Auth\Authenticatable $user + * @return void + */ + public function setUser(Authenticatable $user); +} diff --git a/vendor/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php b/vendor/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php new file mode 100644 index 0000000..b782761 --- /dev/null +++ b/vendor/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php @@ -0,0 +1,8 @@ +<?php + +namespace Illuminate\Contracts\Auth\Middleware; + +interface AuthenticatesRequests +{ + // +} diff --git a/vendor/illuminate/contracts/Auth/MustVerifyEmail.php b/vendor/illuminate/contracts/Auth/MustVerifyEmail.php new file mode 100644 index 0000000..5b8b105 --- /dev/null +++ b/vendor/illuminate/contracts/Auth/MustVerifyEmail.php @@ -0,0 +1,34 @@ +<?php + +namespace Illuminate\Contracts\Auth; + +interface MustVerifyEmail +{ + /** + * Determine if the user has verified their email address. + * + * @return bool + */ + public function hasVerifiedEmail(); + + /** + * Mark the given user's email as verified. + * + * @return bool + */ + public function markEmailAsVerified(); + + /** + * Send the email verification notification. + * + * @return void + */ + public function sendEmailVerificationNotification(); + + /** + * Get the email address that should be used for verification. + * + * @return string + */ + public function getEmailForVerification(); +} diff --git a/vendor/illuminate/contracts/Auth/PasswordBroker.php b/vendor/illuminate/contracts/Auth/PasswordBroker.php new file mode 100644 index 0000000..bbbe9b5 --- /dev/null +++ b/vendor/illuminate/contracts/Auth/PasswordBroker.php @@ -0,0 +1,61 @@ +<?php + +namespace Illuminate\Contracts\Auth; + +use Closure; + +interface PasswordBroker +{ + /** + * Constant representing a successfully sent reminder. + * + * @var string + */ + const RESET_LINK_SENT = 'passwords.sent'; + + /** + * Constant representing a successfully reset password. + * + * @var string + */ + const PASSWORD_RESET = 'passwords.reset'; + + /** + * Constant representing the user not found response. + * + * @var string + */ + const INVALID_USER = 'passwords.user'; + + /** + * Constant representing an invalid token. + * + * @var string + */ + const INVALID_TOKEN = 'passwords.token'; + + /** + * Constant representing a throttled reset attempt. + * + * @var string + */ + const RESET_THROTTLED = 'passwords.throttled'; + + /** + * Send a password reset link to a user. + * + * @param array $credentials + * @param \Closure|null $callback + * @return string + */ + public function sendResetLink(array $credentials, Closure $callback = null); + + /** + * Reset the password for the given token. + * + * @param array $credentials + * @param \Closure $callback + * @return mixed + */ + public function reset(array $credentials, Closure $callback); +} diff --git a/vendor/illuminate/contracts/Auth/PasswordBrokerFactory.php b/vendor/illuminate/contracts/Auth/PasswordBrokerFactory.php new file mode 100644 index 0000000..683a903 --- /dev/null +++ b/vendor/illuminate/contracts/Auth/PasswordBrokerFactory.php @@ -0,0 +1,14 @@ +<?php + +namespace Illuminate\Contracts\Auth; + +interface PasswordBrokerFactory +{ + /** + * Get a password broker instance by name. + * + * @param string|null $name + * @return \Illuminate\Contracts\Auth\PasswordBroker + */ + public function broker($name = null); +} diff --git a/vendor/illuminate/contracts/Auth/StatefulGuard.php b/vendor/illuminate/contracts/Auth/StatefulGuard.php new file mode 100644 index 0000000..faf1497 --- /dev/null +++ b/vendor/illuminate/contracts/Auth/StatefulGuard.php @@ -0,0 +1,63 @@ +<?php + +namespace Illuminate\Contracts\Auth; + +interface StatefulGuard extends Guard +{ + /** + * Attempt to authenticate a user using the given credentials. + * + * @param array $credentials + * @param bool $remember + * @return bool + */ + public function attempt(array $credentials = [], $remember = false); + + /** + * Log a user into the application without sessions or cookies. + * + * @param array $credentials + * @return bool + */ + public function once(array $credentials = []); + + /** + * Log a user into the application. + * + * @param \Illuminate\Contracts\Auth\Authenticatable $user + * @param bool $remember + * @return void + */ + public function login(Authenticatable $user, $remember = false); + + /** + * Log the given user ID into the application. + * + * @param mixed $id + * @param bool $remember + * @return \Illuminate\Contracts\Auth\Authenticatable|bool + */ + public function loginUsingId($id, $remember = false); + + /** + * Log the given user ID into the application without sessions or cookies. + * + * @param mixed $id + * @return \Illuminate\Contracts\Auth\Authenticatable|bool + */ + public function onceUsingId($id); + + /** + * Determine if the user was authenticated via "remember me" cookie. + * + * @return bool + */ + public function viaRemember(); + + /** + * Log the user out of the application. + * + * @return void + */ + public function logout(); +} diff --git a/vendor/illuminate/contracts/Auth/SupportsBasicAuth.php b/vendor/illuminate/contracts/Auth/SupportsBasicAuth.php new file mode 100644 index 0000000..9c54591 --- /dev/null +++ b/vendor/illuminate/contracts/Auth/SupportsBasicAuth.php @@ -0,0 +1,24 @@ +<?php + +namespace Illuminate\Contracts\Auth; + +interface SupportsBasicAuth +{ + /** + * Attempt to authenticate using HTTP Basic Auth. + * + * @param string $field + * @param array $extraConditions + * @return \Symfony\Component\HttpFoundation\Response|null + */ + public function basic($field = 'email', $extraConditions = []); + + /** + * Perform a stateless HTTP Basic login attempt. + * + * @param string $field + * @param array $extraConditions + * @return \Symfony\Component\HttpFoundation\Response|null + */ + public function onceBasic($field = 'email', $extraConditions = []); +} diff --git a/vendor/illuminate/contracts/Auth/UserProvider.php b/vendor/illuminate/contracts/Auth/UserProvider.php new file mode 100644 index 0000000..a2ab122 --- /dev/null +++ b/vendor/illuminate/contracts/Auth/UserProvider.php @@ -0,0 +1,49 @@ +<?php + +namespace Illuminate\Contracts\Auth; + +interface UserProvider +{ + /** + * Retrieve a user by their unique identifier. + * + * @param mixed $identifier + * @return \Illuminate\Contracts\Auth\Authenticatable|null + */ + public function retrieveById($identifier); + + /** + * Retrieve a user by their unique identifier and "remember me" token. + * + * @param mixed $identifier + * @param string $token + * @return \Illuminate\Contracts\Auth\Authenticatable|null + */ + public function retrieveByToken($identifier, $token); + + /** + * Update the "remember me" token for the given user in storage. + * + * @param \Illuminate\Contracts\Auth\Authenticatable $user + * @param string $token + * @return void + */ + public function updateRememberToken(Authenticatable $user, $token); + + /** + * Retrieve a user by the given credentials. + * + * @param array $credentials + * @return \Illuminate\Contracts\Auth\Authenticatable|null + */ + public function retrieveByCredentials(array $credentials); + + /** + * Validate a user against the given credentials. + * + * @param \Illuminate\Contracts\Auth\Authenticatable $user + * @param array $credentials + * @return bool + */ + public function validateCredentials(Authenticatable $user, array $credentials); +} diff --git a/vendor/illuminate/contracts/Broadcasting/Broadcaster.php b/vendor/illuminate/contracts/Broadcasting/Broadcaster.php new file mode 100644 index 0000000..2d317d0 --- /dev/null +++ b/vendor/illuminate/contracts/Broadcasting/Broadcaster.php @@ -0,0 +1,35 @@ +<?php + +namespace Illuminate\Contracts\Broadcasting; + +interface Broadcaster +{ + /** + * Authenticate the incoming request for a given channel. + * + * @param \Illuminate\Http\Request $request + * @return mixed + */ + public function auth($request); + + /** + * Return the valid authentication response. + * + * @param \Illuminate\Http\Request $request + * @param mixed $result + * @return mixed + */ + public function validAuthenticationResponse($request, $result); + + /** + * Broadcast the given event. + * + * @param array $channels + * @param string $event + * @param array $payload + * @return void + * + * @throws \Illuminate\Broadcasting\BroadcastException + */ + public function broadcast(array $channels, $event, array $payload = []); +} diff --git a/vendor/illuminate/contracts/Broadcasting/Factory.php b/vendor/illuminate/contracts/Broadcasting/Factory.php new file mode 100644 index 0000000..1a4f48f --- /dev/null +++ b/vendor/illuminate/contracts/Broadcasting/Factory.php @@ -0,0 +1,14 @@ +<?php + +namespace Illuminate\Contracts\Broadcasting; + +interface Factory +{ + /** + * Get a broadcaster implementation by name. + * + * @param string|null $name + * @return \Illuminate\Contracts\Broadcasting\Broadcaster + */ + public function connection($name = null); +} diff --git a/vendor/illuminate/contracts/Broadcasting/HasBroadcastChannel.php b/vendor/illuminate/contracts/Broadcasting/HasBroadcastChannel.php new file mode 100644 index 0000000..3b2c401 --- /dev/null +++ b/vendor/illuminate/contracts/Broadcasting/HasBroadcastChannel.php @@ -0,0 +1,20 @@ +<?php + +namespace Illuminate\Contracts\Broadcasting; + +interface HasBroadcastChannel +{ + /** + * Get the broadcast channel route definition that is associated with the given entity. + * + * @return string + */ + public function broadcastChannelRoute(); + + /** + * Get the broadcast channel name that is associated with the given entity. + * + * @return string + */ + public function broadcastChannel(); +} diff --git a/vendor/illuminate/contracts/Broadcasting/ShouldBeUnique.php b/vendor/illuminate/contracts/Broadcasting/ShouldBeUnique.php new file mode 100644 index 0000000..c72b7a8 --- /dev/null +++ b/vendor/illuminate/contracts/Broadcasting/ShouldBeUnique.php @@ -0,0 +1,8 @@ +<?php + +namespace Illuminate\Contracts\Broadcasting; + +interface ShouldBeUnique +{ + // +} diff --git a/vendor/illuminate/contracts/Broadcasting/ShouldBroadcast.php b/vendor/illuminate/contracts/Broadcasting/ShouldBroadcast.php new file mode 100644 index 0000000..3dc4662 --- /dev/null +++ b/vendor/illuminate/contracts/Broadcasting/ShouldBroadcast.php @@ -0,0 +1,13 @@ +<?php + +namespace Illuminate\Contracts\Broadcasting; + +interface ShouldBroadcast +{ + /** + * Get the channels the event should broadcast on. + * + * @return \Illuminate\Broadcasting\Channel|\Illuminate\Broadcasting\Channel[]|string[]|string + */ + public function broadcastOn(); +} diff --git a/vendor/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php b/vendor/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php new file mode 100644 index 0000000..eba3584 --- /dev/null +++ b/vendor/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php @@ -0,0 +1,8 @@ +<?php + +namespace Illuminate\Contracts\Broadcasting; + +interface ShouldBroadcastNow extends ShouldBroadcast +{ + // +} diff --git a/vendor/illuminate/contracts/Bus/Dispatcher.php b/vendor/illuminate/contracts/Bus/Dispatcher.php new file mode 100644 index 0000000..5cbbd92 --- /dev/null +++ b/vendor/illuminate/contracts/Bus/Dispatcher.php @@ -0,0 +1,66 @@ +<?php + +namespace Illuminate\Contracts\Bus; + +interface Dispatcher +{ + /** + * Dispatch a command to its appropriate handler. + * + * @param mixed $command + * @return mixed + */ + public function dispatch($command); + + /** + * Dispatch a command to its appropriate handler in the current process. + * + * Queueable jobs will be dispatched to the "sync" queue. + * + * @param mixed $command + * @param mixed $handler + * @return mixed + */ + public function dispatchSync($command, $handler = null); + + /** + * Dispatch a command to its appropriate handler in the current process. + * + * @param mixed $command + * @param mixed $handler + * @return mixed + */ + public function dispatchNow($command, $handler = null); + + /** + * Determine if the given command has a handler. + * + * @param mixed $command + * @return bool + */ + public function hasCommandHandler($command); + + /** + * Retrieve the handler for a command. + * + * @param mixed $command + * @return bool|mixed + */ + public function getCommandHandler($command); + + /** + * Set the pipes commands should be piped through before dispatching. + * + * @param array $pipes + * @return $this + */ + public function pipeThrough(array $pipes); + + /** + * Map a command to a handler. + * + * @param array $map + * @return $this + */ + public function map(array $map); +} diff --git a/vendor/illuminate/contracts/Bus/QueueingDispatcher.php b/vendor/illuminate/contracts/Bus/QueueingDispatcher.php new file mode 100644 index 0000000..ff84e27 --- /dev/null +++ b/vendor/illuminate/contracts/Bus/QueueingDispatcher.php @@ -0,0 +1,30 @@ +<?php + +namespace Illuminate\Contracts\Bus; + +interface QueueingDispatcher extends Dispatcher +{ + /** + * Attempt to find the batch with the given ID. + * + * @param string $batchId + * @return \Illuminate\Bus\Batch|null + */ + public function findBatch(string $batchId); + + /** + * Create a new batch of queueable jobs. + * + * @param \Illuminate\Support\Collection|array $jobs + * @return \Illuminate\Bus\PendingBatch + */ + public function batch($jobs); + + /** + * Dispatch a command to its appropriate handler behind a queue. + * + * @param mixed $command + * @return mixed + */ + public function dispatchToQueue($command); +} diff --git a/vendor/illuminate/contracts/Cache/Factory.php b/vendor/illuminate/contracts/Cache/Factory.php new file mode 100644 index 0000000..3924662 --- /dev/null +++ b/vendor/illuminate/contracts/Cache/Factory.php @@ -0,0 +1,14 @@ +<?php + +namespace Illuminate\Contracts\Cache; + +interface Factory +{ + /** + * Get a cache store instance by name. + * + * @param string|null $name + * @return \Illuminate\Contracts\Cache\Repository + */ + public function store($name = null); +} diff --git a/vendor/illuminate/contracts/Cache/Lock.php b/vendor/illuminate/contracts/Cache/Lock.php new file mode 100644 index 0000000..03f633a --- /dev/null +++ b/vendor/illuminate/contracts/Cache/Lock.php @@ -0,0 +1,44 @@ +<?php + +namespace Illuminate\Contracts\Cache; + +interface Lock +{ + /** + * Attempt to acquire the lock. + * + * @param callable|null $callback + * @return mixed + */ + public function get($callback = null); + + /** + * Attempt to acquire the lock for the given number of seconds. + * + * @param int $seconds + * @param callable|null $callback + * @return mixed + */ + public function block($seconds, $callback = null); + + /** + * Release the lock. + * + * @return bool + */ + public function release(); + + /** + * Returns the current owner of the lock. + * + * @return string + */ + public function owner(); + + /** + * Releases this lock in disregard of ownership. + * + * @return void + */ + public function forceRelease(); +} diff --git a/vendor/illuminate/contracts/Cache/LockProvider.php b/vendor/illuminate/contracts/Cache/LockProvider.php new file mode 100644 index 0000000..37d4ef6 --- /dev/null +++ b/vendor/illuminate/contracts/Cache/LockProvider.php @@ -0,0 +1,25 @@ +<?php + +namespace Illuminate\Contracts\Cache; + +interface LockProvider +{ + /** + * Get a lock instance. + * + * @param string $name + * @param int $seconds + * @param string|null $owner + * @return \Illuminate\Contracts\Cache\Lock + */ + public function lock($name, $seconds = 0, $owner = null); + + /** + * Restore a lock instance using the owner identifier. + * + * @param string $name + * @param string $owner + * @return \Illuminate\Contracts\Cache\Lock + */ + public function restoreLock($name, $owner); +} diff --git a/vendor/illuminate/contracts/Cache/LockTimeoutException.php b/vendor/illuminate/contracts/Cache/LockTimeoutException.php new file mode 100644 index 0000000..53327e2 --- /dev/null +++ b/vendor/illuminate/contracts/Cache/LockTimeoutException.php @@ -0,0 +1,10 @@ +<?php + +namespace Illuminate\Contracts\Cache; + +use Exception; + +class LockTimeoutException extends Exception +{ + // +} diff --git a/vendor/illuminate/contracts/Cache/Repository.php b/vendor/illuminate/contracts/Cache/Repository.php new file mode 100644 index 0000000..5b78af5 --- /dev/null +++ b/vendor/illuminate/contracts/Cache/Repository.php @@ -0,0 +1,108 @@ +<?php + +namespace Illuminate\Contracts\Cache; + +use Closure; +use Psr\SimpleCache\CacheInterface; + +interface Repository extends CacheInterface +{ + /** + * Retrieve an item from the cache and delete it. + * + * @param string $key + * @param mixed $default + * @return mixed + */ + public function pull($key, $default = null); + + /** + * Store an item in the cache. + * + * @param string $key + * @param mixed $value + * @param \DateTimeInterface|\DateInterval|int|null $ttl + * @return bool + */ + public function put($key, $value, $ttl = null); + + /** + * Store an item in the cache if the key does not exist. + * + * @param string $key + * @param mixed $value + * @param \DateTimeInterface|\DateInterval|int|null $ttl + * @return bool + */ + public function add($key, $value, $ttl = null); + + /** + * Increment the value of an item in the cache. + * + * @param string $key + * @param mixed $value + * @return int|bool + */ + public function increment($key, $value = 1); + + /** + * Decrement the value of an item in the cache. + * + * @param string $key + * @param mixed $value + * @return int|bool + */ + public function decrement($key, $value = 1); + + /** + * Store an item in the cache indefinitely. + * + * @param string $key + * @param mixed $value + * @return bool + */ + public function forever($key, $value); + + /** + * Get an item from the cache, or execute the given Closure and store the result. + * + * @param string $key + * @param \DateTimeInterface|\DateInterval|int|null $ttl + * @param \Closure $callback + * @return mixed + */ + public function remember($key, $ttl, Closure $callback); + + /** + * Get an item from the cache, or execute the given Closure and store the result forever. + * + * @param string $key + * @param \Closure $callback + * @return mixed + */ + public function sear($key, Closure $callback); + + /** + * Get an item from the cache, or execute the given Closure and store the result forever. + * + * @param string $key + * @param \Closure $callback + * @return mixed + */ + public function rememberForever($key, Closure $callback); + + /** + * Remove an item from the cache. + * + * @param string $key + * @return bool + */ + public function forget($key); + + /** + * Get the cache store implementation. + * + * @return \Illuminate\Contracts\Cache\Store + */ + public function getStore(); +} diff --git a/vendor/illuminate/contracts/Cache/Store.php b/vendor/illuminate/contracts/Cache/Store.php new file mode 100644 index 0000000..133bc43 --- /dev/null +++ b/vendor/illuminate/contracts/Cache/Store.php @@ -0,0 +1,92 @@ +<?php + +namespace Illuminate\Contracts\Cache; + +interface Store +{ + /** + * Retrieve an item from the cache by key. + * + * @param string|array $key + * @return mixed + */ + public function get($key); + + /** + * Retrieve multiple items from the cache by key. + * + * Items not found in the cache will have a null value. + * + * @param array $keys + * @return array + */ + public function many(array $keys); + + /** + * Store an item in the cache for a given number of seconds. + * + * @param string $key + * @param mixed $value + * @param int $seconds + * @return bool + */ + public function put($key, $value, $seconds); + + /** + * Store multiple items in the cache for a given number of seconds. + * + * @param array $values + * @param int $seconds + * @return bool + */ + public function putMany(array $values, $seconds); + + /** + * Increment the value of an item in the cache. + * + * @param string $key + * @param mixed $value + * @return int|bool + */ + public function increment($key, $value = 1); + + /** + * Decrement the value of an item in the cache. + * + * @param string $key + * @param mixed $value + * @return int|bool + */ + public function decrement($key, $value = 1); + + /** + * Store an item in the cache indefinitely. + * + * @param string $key + * @param mixed $value + * @return bool + */ + public function forever($key, $value); + + /** + * Remove an item from the cache. + * + * @param string $key + * @return bool + */ + public function forget($key); + + /** + * Remove all items from the cache. + * + * @return bool + */ + public function flush(); + + /** + * Get the cache key prefix. + * + * @return string + */ + public function getPrefix(); +} diff --git a/vendor/illuminate/contracts/Config/Repository.php b/vendor/illuminate/contracts/Config/Repository.php new file mode 100644 index 0000000..a4f0ac8 --- /dev/null +++ b/vendor/illuminate/contracts/Config/Repository.php @@ -0,0 +1,57 @@ +<?php + +namespace Illuminate\Contracts\Config; + +interface Repository +{ + /** + * Determine if the given configuration value exists. + * + * @param string $key + * @return bool + */ + public function has($key); + + /** + * Get the specified configuration value. + * + * @param array|string $key + * @param mixed $default + * @return mixed + */ + public function get($key, $default = null); + + /** + * Get all of the configuration items for the application. + * + * @return array + */ + public function all(); + + /** + * Set a given configuration value. + * + * @param array|string $key + * @param mixed $value + * @return void + */ + public function set($key, $value = null); + + /** + * Prepend a value onto an array configuration value. + * + * @param string $key + * @param mixed $value + * @return void + */ + public function prepend($key, $value); + + /** + * Push a value onto an array configuration value. + * + * @param string $key + * @param mixed $value + * @return void + */ + public function push($key, $value); +} diff --git a/vendor/illuminate/contracts/Console/Application.php b/vendor/illuminate/contracts/Console/Application.php new file mode 100644 index 0000000..ba628c9 --- /dev/null +++ b/vendor/illuminate/contracts/Console/Application.php @@ -0,0 +1,23 @@ +<?php + +namespace Illuminate\Contracts\Console; + +interface Application +{ + /** + * Run an Artisan console command by name. + * + * @param string $command + * @param array $parameters + * @param \Symfony\Component\Console\Output\OutputInterface|null $outputBuffer + * @return int + */ + public function call($command, array $parameters = [], $outputBuffer = null); + + /** + * Get the output from the last command. + * + * @return string + */ + public function output(); +} diff --git a/vendor/illuminate/contracts/Console/Isolatable.php b/vendor/illuminate/contracts/Console/Isolatable.php new file mode 100644 index 0000000..d652be3 --- /dev/null +++ b/vendor/illuminate/contracts/Console/Isolatable.php @@ -0,0 +1,8 @@ +<?php + +namespace Illuminate\Contracts\Console; + +interface Isolatable +{ + // +} diff --git a/vendor/illuminate/contracts/Console/Kernel.php b/vendor/illuminate/contracts/Console/Kernel.php new file mode 100644 index 0000000..842f5a6 --- /dev/null +++ b/vendor/illuminate/contracts/Console/Kernel.php @@ -0,0 +1,64 @@ +<?php + +namespace Illuminate\Contracts\Console; + +interface Kernel +{ + /** + * Bootstrap the application for artisan commands. + * + * @return void + */ + public function bootstrap(); + + /** + * Handle an incoming console command. + * + * @param \Symfony\Component\Console\Input\InputInterface $input + * @param \Symfony\Component\Console\Output\OutputInterface|null $output + * @return int + */ + public function handle($input, $output = null); + + /** + * Run an Artisan console command by name. + * + * @param string $command + * @param array $parameters + * @param \Symfony\Component\Console\Output\OutputInterface|null $outputBuffer + * @return int + */ + public function call($command, array $parameters = [], $outputBuffer = null); + + /** + * Queue an Artisan console command by name. + * + * @param string $command + * @param array $parameters + * @return \Illuminate\Foundation\Bus\PendingDispatch + */ + public function queue($command, array $parameters = []); + + /** + * Get all of the commands registered with the console. + * + * @return array + */ + public function all(); + + /** + * Get the output for the last run command. + * + * @return string + */ + public function output(); + + /** + * Terminate the application. + * + * @param \Symfony\Component\Console\Input\InputInterface $input + * @param int $status + * @return void + */ + public function terminate($input, $status); +} diff --git a/vendor/illuminate/contracts/Container/BindingResolutionException.php b/vendor/illuminate/contracts/Container/BindingResolutionException.php new file mode 100644 index 0000000..a69c24c --- /dev/null +++ b/vendor/illuminate/contracts/Container/BindingResolutionException.php @@ -0,0 +1,11 @@ +<?php + +namespace Illuminate\Contracts\Container; + +use Exception; +use Psr\Container\ContainerExceptionInterface; + +class BindingResolutionException extends Exception implements ContainerExceptionInterface +{ + // +} diff --git a/vendor/illuminate/contracts/Container/CircularDependencyException.php b/vendor/illuminate/contracts/Container/CircularDependencyException.php new file mode 100644 index 0000000..6c90381 --- /dev/null +++ b/vendor/illuminate/contracts/Container/CircularDependencyException.php @@ -0,0 +1,11 @@ +<?php + +namespace Illuminate\Contracts\Container; + +use Exception; +use Psr\Container\ContainerExceptionInterface; + +class CircularDependencyException extends Exception implements ContainerExceptionInterface +{ + // +} diff --git a/vendor/illuminate/contracts/Container/Container.php b/vendor/illuminate/contracts/Container/Container.php new file mode 100644 index 0000000..7d7f2c9 --- /dev/null +++ b/vendor/illuminate/contracts/Container/Container.php @@ -0,0 +1,210 @@ +<?php + +namespace Illuminate\Contracts\Container; + +use Closure; +use Psr\Container\ContainerInterface; + +interface Container extends ContainerInterface +{ + /** + * Determine if the given abstract type has been bound. + * + * @param string $abstract + * @return bool + */ + public function bound($abstract); + + /** + * Alias a type to a different name. + * + * @param string $abstract + * @param string $alias + * @return void + * + * @throws \LogicException + */ + public function alias($abstract, $alias); + + /** + * Assign a set of tags to a given binding. + * + * @param array|string $abstracts + * @param array|mixed ...$tags + * @return void + */ + public function tag($abstracts, $tags); + + /** + * Resolve all of the bindings for a given tag. + * + * @param string $tag + * @return iterable + */ + public function tagged($tag); + + /** + * Register a binding with the container. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @param bool $shared + * @return void + */ + public function bind($abstract, $concrete = null, $shared = false); + + /** + * Register a binding if it hasn't already been registered. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @param bool $shared + * @return void + */ + public function bindIf($abstract, $concrete = null, $shared = false); + + /** + * Register a shared binding in the container. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @return void + */ + public function singleton($abstract, $concrete = null); + + /** + * Register a shared binding if it hasn't already been registered. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @return void + */ + public function singletonIf($abstract, $concrete = null); + + /** + * Register a scoped binding in the container. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @return void + */ + public function scoped($abstract, $concrete = null); + + /** + * Register a scoped binding if it hasn't already been registered. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @return void + */ + public function scopedIf($abstract, $concrete = null); + + /** + * "Extend" an abstract type in the container. + * + * @param string $abstract + * @param \Closure $closure + * @return void + * + * @throws \InvalidArgumentException + */ + public function extend($abstract, Closure $closure); + + /** + * Register an existing instance as shared in the container. + * + * @param string $abstract + * @param mixed $instance + * @return mixed + */ + public function instance($abstract, $instance); + + /** + * Add a contextual binding to the container. + * + * @param string $concrete + * @param string $abstract + * @param \Closure|string $implementation + * @return void + */ + public function addContextualBinding($concrete, $abstract, $implementation); + + /** + * Define a contextual binding. + * + * @param string|array $concrete + * @return \Illuminate\Contracts\Container\ContextualBindingBuilder + */ + public function when($concrete); + + /** + * Get a closure to resolve the given type from the container. + * + * @param string $abstract + * @return \Closure + */ + public function factory($abstract); + + /** + * Flush the container of all bindings and resolved instances. + * + * @return void + */ + public function flush(); + + /** + * Resolve the given type from the container. + * + * @param string $abstract + * @param array $parameters + * @return mixed + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + public function make($abstract, array $parameters = []); + + /** + * Call the given Closure / class@method and inject its dependencies. + * + * @param callable|string $callback + * @param array $parameters + * @param string|null $defaultMethod + * @return mixed + */ + public function call($callback, array $parameters = [], $defaultMethod = null); + + /** + * Determine if the given abstract type has been resolved. + * + * @param string $abstract + * @return bool + */ + public function resolved($abstract); + + /** + * Register a new before resolving callback. + * + * @param \Closure|string $abstract + * @param \Closure|null $callback + * @return void + */ + public function beforeResolving($abstract, Closure $callback = null); + + /** + * Register a new resolving callback. + * + * @param \Closure|string $abstract + * @param \Closure|null $callback + * @return void + */ + public function resolving($abstract, Closure $callback = null); + + /** + * Register a new after resolving callback. + * + * @param \Closure|string $abstract + * @param \Closure|null $callback + * @return void + */ + public function afterResolving($abstract, Closure $callback = null); +} diff --git a/vendor/illuminate/contracts/Container/ContextualBindingBuilder.php b/vendor/illuminate/contracts/Container/ContextualBindingBuilder.php new file mode 100644 index 0000000..1d84ef8 --- /dev/null +++ b/vendor/illuminate/contracts/Container/ContextualBindingBuilder.php @@ -0,0 +1,39 @@ +<?php + +namespace Illuminate\Contracts\Container; + +interface ContextualBindingBuilder +{ + /** + * Define the abstract target that depends on the context. + * + * @param string $abstract + * @return $this + */ + public function needs($abstract); + + /** + * Define the implementation for the contextual binding. + * + * @param \Closure|string|array $implementation + * @return void + */ + public function give($implementation); + + /** + * Define tagged services to be used as the implementation for the contextual binding. + * + * @param string $tag + * @return void + */ + public function giveTagged($tag); + + /** + * Specify the configuration item to bind as a primitive. + * + * @param string $key + * @param mixed $default + * @return void + */ + public function giveConfig($key, $default = null); +} diff --git a/vendor/illuminate/contracts/Cookie/Factory.php b/vendor/illuminate/contracts/Cookie/Factory.php new file mode 100644 index 0000000..6f95021 --- /dev/null +++ b/vendor/illuminate/contracts/Cookie/Factory.php @@ -0,0 +1,47 @@ +<?php + +namespace Illuminate\Contracts\Cookie; + +interface Factory +{ + /** + * Create a new cookie instance. + * + * @param string $name + * @param string $value + * @param int $minutes + * @param string|null $path + * @param string|null $domain + * @param bool|null $secure + * @param bool $httpOnly + * @param bool $raw + * @param string|null $sameSite + * @return \Symfony\Component\HttpFoundation\Cookie + */ + public function make($name, $value, $minutes = 0, $path = null, $domain = null, $secure = null, $httpOnly = true, $raw = false, $sameSite = null); + + /** + * Create a cookie that lasts "forever" (five years). + * + * @param string $name + * @param string $value + * @param string|null $path + * @param string|null $domain + * @param bool|null $secure + * @param bool $httpOnly + * @param bool $raw + * @param string|null $sameSite + * @return \Symfony\Component\HttpFoundation\Cookie + */ + public function forever($name, $value, $path = null, $domain = null, $secure = null, $httpOnly = true, $raw = false, $sameSite = null); + + /** + * Expire the given cookie. + * + * @param string $name + * @param string|null $path + * @param string|null $domain + * @return \Symfony\Component\HttpFoundation\Cookie + */ + public function forget($name, $path = null, $domain = null); +} diff --git a/vendor/illuminate/contracts/Cookie/QueueingFactory.php b/vendor/illuminate/contracts/Cookie/QueueingFactory.php new file mode 100644 index 0000000..d6c74b8 --- /dev/null +++ b/vendor/illuminate/contracts/Cookie/QueueingFactory.php @@ -0,0 +1,30 @@ +<?php + +namespace Illuminate\Contracts\Cookie; + +interface QueueingFactory extends Factory +{ + /** + * Queue a cookie to send with the next response. + * + * @param array $parameters + * @return void + */ + public function queue(...$parameters); + + /** + * Remove a cookie from the queue. + * + * @param string $name + * @param string|null $path + * @return void + */ + public function unqueue($name, $path = null); + + /** + * Get the cookies which have been queued for the next request. + * + * @return array + */ + public function getQueuedCookies(); +} diff --git a/vendor/illuminate/contracts/Database/Eloquent/Builder.php b/vendor/illuminate/contracts/Database/Eloquent/Builder.php new file mode 100644 index 0000000..6fdf405 --- /dev/null +++ b/vendor/illuminate/contracts/Database/Eloquent/Builder.php @@ -0,0 +1,14 @@ +<?php + +namespace Illuminate\Contracts\Database\Eloquent; + +use Illuminate\Contracts\Database\Query\Builder as BaseContract; + +/** + * This interface is intentionally empty and exists to improve IDE support. + * + * @mixin \Illuminate\Database\Eloquent\Builder + */ +interface Builder extends BaseContract +{ +} diff --git a/vendor/illuminate/contracts/Database/Eloquent/Castable.php b/vendor/illuminate/contracts/Database/Eloquent/Castable.php new file mode 100644 index 0000000..911b1cf --- /dev/null +++ b/vendor/illuminate/contracts/Database/Eloquent/Castable.php @@ -0,0 +1,15 @@ +<?php + +namespace Illuminate\Contracts\Database\Eloquent; + +interface Castable +{ + /** + * Get the name of the caster class to use when casting from / to this cast target. + * + * @param array $arguments + * @return string + * @return string|\Illuminate\Contracts\Database\Eloquent\CastsAttributes|\Illuminate\Contracts\Database\Eloquent\CastsInboundAttributes + */ + public static function castUsing(array $arguments); +} diff --git a/vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php b/vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php new file mode 100644 index 0000000..808d005 --- /dev/null +++ b/vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php @@ -0,0 +1,28 @@ +<?php + +namespace Illuminate\Contracts\Database\Eloquent; + +interface CastsAttributes +{ + /** + * Transform the attribute from the underlying model values. + * + * @param \Illuminate\Database\Eloquent\Model $model + * @param string $key + * @param mixed $value + * @param array $attributes + * @return mixed + */ + public function get($model, string $key, $value, array $attributes); + + /** + * Transform the attribute to its underlying model values. + * + * @param \Illuminate\Database\Eloquent\Model $model + * @param string $key + * @param mixed $value + * @param array $attributes + * @return mixed + */ + public function set($model, string $key, $value, array $attributes); +} diff --git a/vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php b/vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php new file mode 100644 index 0000000..4c7801b --- /dev/null +++ b/vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php @@ -0,0 +1,17 @@ +<?php + +namespace Illuminate\Contracts\Database\Eloquent; + +interface CastsInboundAttributes +{ + /** + * Transform the attribute to its underlying model values. + * + * @param \Illuminate\Database\Eloquent\Model $model + * @param string $key + * @param mixed $value + * @param array $attributes + * @return mixed + */ + public function set($model, string $key, $value, array $attributes); +} diff --git a/vendor/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php b/vendor/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php new file mode 100644 index 0000000..48ba73a --- /dev/null +++ b/vendor/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php @@ -0,0 +1,28 @@ +<?php + +namespace Illuminate\Contracts\Database\Eloquent; + +interface DeviatesCastableAttributes +{ + /** + * Increment the attribute. + * + * @param \Illuminate\Database\Eloquent\Model $model + * @param string $key + * @param mixed $value + * @param array $attributes + * @return mixed + */ + public function increment($model, string $key, $value, array $attributes); + + /** + * Decrement the attribute. + * + * @param \Illuminate\Database\Eloquent\Model $model + * @param string $key + * @param mixed $value + * @param array $attributes + * @return mixed + */ + public function decrement($model, string $key, $value, array $attributes); +} diff --git a/vendor/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php b/vendor/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php new file mode 100644 index 0000000..a89f910 --- /dev/null +++ b/vendor/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php @@ -0,0 +1,17 @@ +<?php + +namespace Illuminate\Contracts\Database\Eloquent; + +interface SerializesCastableAttributes +{ + /** + * Serialize the attribute when converting the model to an array. + * + * @param \Illuminate\Database\Eloquent\Model $model + * @param string $key + * @param mixed $value + * @param array $attributes + * @return mixed + */ + public function serialize($model, string $key, $value, array $attributes); +} diff --git a/vendor/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php b/vendor/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php new file mode 100644 index 0000000..c82125a --- /dev/null +++ b/vendor/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php @@ -0,0 +1,30 @@ +<?php + +namespace Illuminate\Contracts\Database\Eloquent; + +interface SupportsPartialRelations +{ + /** + * Indicate that the relation is a single result of a larger one-to-many relationship. + * + * @param string|null $column + * @param string|\Closure|null $aggregate + * @param string $relation + * @return $this + */ + public function ofMany($column = 'id', $aggregate = 'MAX', $relation = null); + + /** + * Determine whether the relationship is a one-of-many relationship. + * + * @return bool + */ + public function isOneOfMany(); + + /** + * Get the one of many inner join subselect query builder instance. + * + * @return \Illuminate\Database\Eloquent\Builder|void + */ + public function getOneOfManySubQuery(); +} diff --git a/vendor/illuminate/contracts/Database/Events/MigrationEvent.php b/vendor/illuminate/contracts/Database/Events/MigrationEvent.php new file mode 100644 index 0000000..2da155f --- /dev/null +++ b/vendor/illuminate/contracts/Database/Events/MigrationEvent.php @@ -0,0 +1,8 @@ +<?php + +namespace Illuminate\Contracts\Database\Events; + +interface MigrationEvent +{ + // +} diff --git a/vendor/illuminate/contracts/Database/ModelIdentifier.php b/vendor/illuminate/contracts/Database/ModelIdentifier.php new file mode 100644 index 0000000..aacd18c --- /dev/null +++ b/vendor/illuminate/contracts/Database/ModelIdentifier.php @@ -0,0 +1,73 @@ +<?php + +namespace Illuminate\Contracts\Database; + +class ModelIdentifier +{ + /** + * The class name of the model. + * + * @var string + */ + public $class; + + /** + * The unique identifier of the model. + * + * This may be either a single ID or an array of IDs. + * + * @var mixed + */ + public $id; + + /** + * The relationships loaded on the model. + * + * @var array + */ + public $relations; + + /** + * The connection name of the model. + * + * @var string|null + */ + public $connection; + + /** + * The class name of the model collection. + * + * @var string|null + */ + public $collectionClass; + + /** + * Create a new model identifier. + * + * @param string $class + * @param mixed $id + * @param array $relations + * @param mixed $connection + * @return void + */ + public function __construct($class, $id, array $relations, $connection) + { + $this->id = $id; + $this->class = $class; + $this->relations = $relations; + $this->connection = $connection; + } + + /** + * Specify the collection class that should be used when serializing / restoring collections. + * + * @param string|null $collectionClass + * @return $this + */ + public function useCollectionClass(?string $collectionClass) + { + $this->collectionClass = $collectionClass; + + return $this; + } +} diff --git a/vendor/illuminate/contracts/Database/Query/Builder.php b/vendor/illuminate/contracts/Database/Query/Builder.php new file mode 100644 index 0000000..e116ebf --- /dev/null +++ b/vendor/illuminate/contracts/Database/Query/Builder.php @@ -0,0 +1,12 @@ +<?php + +namespace Illuminate\Contracts\Database\Query; + +/** + * This interface is intentionally empty and exists to improve IDE support. + * + * @mixin \Illuminate\Database\Query\Builder + */ +interface Builder +{ +} diff --git a/vendor/illuminate/contracts/Debug/ExceptionHandler.php b/vendor/illuminate/contracts/Debug/ExceptionHandler.php new file mode 100644 index 0000000..3b6594a --- /dev/null +++ b/vendor/illuminate/contracts/Debug/ExceptionHandler.php @@ -0,0 +1,48 @@ +<?php + +namespace Illuminate\Contracts\Debug; + +use Throwable; + +interface ExceptionHandler +{ + /** + * Report or log an exception. + * + * @param \Throwable $e + * @return void + * + * @throws \Throwable + */ + public function report(Throwable $e); + + /** + * Determine if the exception should be reported. + * + * @param \Throwable $e + * @return bool + */ + public function shouldReport(Throwable $e); + + /** + * Render an exception into an HTTP response. + * + * @param \Illuminate\Http\Request $request + * @param \Throwable $e + * @return \Symfony\Component\HttpFoundation\Response + * + * @throws \Throwable + */ + public function render($request, Throwable $e); + + /** + * Render an exception to the console. + * + * @param \Symfony\Component\Console\Output\OutputInterface $output + * @param \Throwable $e + * @return void + * + * @internal This method is not meant to be used or overwritten outside the framework. + */ + public function renderForConsole($output, Throwable $e); +} diff --git a/vendor/illuminate/contracts/Encryption/DecryptException.php b/vendor/illuminate/contracts/Encryption/DecryptException.php new file mode 100644 index 0000000..7edebc9 --- /dev/null +++ b/vendor/illuminate/contracts/Encryption/DecryptException.php @@ -0,0 +1,10 @@ +<?php + +namespace Illuminate\Contracts\Encryption; + +use RuntimeException; + +class DecryptException extends RuntimeException +{ + // +} diff --git a/vendor/illuminate/contracts/Encryption/EncryptException.php b/vendor/illuminate/contracts/Encryption/EncryptException.php new file mode 100644 index 0000000..2146ee0 --- /dev/null +++ b/vendor/illuminate/contracts/Encryption/EncryptException.php @@ -0,0 +1,10 @@ +<?php + +namespace Illuminate\Contracts\Encryption; + +use RuntimeException; + +class EncryptException extends RuntimeException +{ + // +} diff --git a/vendor/illuminate/contracts/Encryption/Encrypter.php b/vendor/illuminate/contracts/Encryption/Encrypter.php new file mode 100644 index 0000000..5ac1102 --- /dev/null +++ b/vendor/illuminate/contracts/Encryption/Encrypter.php @@ -0,0 +1,35 @@ +<?php + +namespace Illuminate\Contracts\Encryption; + +interface Encrypter +{ + /** + * Encrypt the given value. + * + * @param mixed $value + * @param bool $serialize + * @return string + * + * @throws \Illuminate\Contracts\Encryption\EncryptException + */ + public function encrypt($value, $serialize = true); + + /** + * Decrypt the given value. + * + * @param string $payload + * @param bool $unserialize + * @return mixed + * + * @throws \Illuminate\Contracts\Encryption\DecryptException + */ + public function decrypt($payload, $unserialize = true); + + /** + * Get the encryption key that the encrypter is currently using. + * + * @return string + */ + public function getKey(); +} diff --git a/vendor/illuminate/contracts/Encryption/StringEncrypter.php b/vendor/illuminate/contracts/Encryption/StringEncrypter.php new file mode 100644 index 0000000..1e6938c --- /dev/null +++ b/vendor/illuminate/contracts/Encryption/StringEncrypter.php @@ -0,0 +1,26 @@ +<?php + +namespace Illuminate\Contracts\Encryption; + +interface StringEncrypter +{ + /** + * Encrypt a string without serialization. + * + * @param string $value + * @return string + * + * @throws \Illuminate\Contracts\Encryption\EncryptException + */ + public function encryptString($value); + + /** + * Decrypt the given string without unserialization. + * + * @param string $payload + * @return string + * + * @throws \Illuminate\Contracts\Encryption\DecryptException + */ + public function decryptString($payload); +} diff --git a/vendor/illuminate/contracts/Events/Dispatcher.php b/vendor/illuminate/contracts/Events/Dispatcher.php new file mode 100644 index 0000000..6386106 --- /dev/null +++ b/vendor/illuminate/contracts/Events/Dispatcher.php @@ -0,0 +1,82 @@ +<?php + +namespace Illuminate\Contracts\Events; + +interface Dispatcher +{ + /** + * Register an event listener with the dispatcher. + * + * @param \Closure|string|array $events + * @param \Closure|string|array|null $listener + * @return void + */ + public function listen($events, $listener = null); + + /** + * Determine if a given event has listeners. + * + * @param string $eventName + * @return bool + */ + public function hasListeners($eventName); + + /** + * Register an event subscriber with the dispatcher. + * + * @param object|string $subscriber + * @return void + */ + public function subscribe($subscriber); + + /** + * Dispatch an event until the first non-null response is returned. + * + * @param string|object $event + * @param mixed $payload + * @return array|null + */ + public function until($event, $payload = []); + + /** + * Dispatch an event and call the listeners. + * + * @param string|object $event + * @param mixed $payload + * @param bool $halt + * @return array|null + */ + public function dispatch($event, $payload = [], $halt = false); + + /** + * Register an event and payload to be fired later. + * + * @param string $event + * @param array $payload + * @return void + */ + public function push($event, $payload = []); + + /** + * Flush a set of pushed events. + * + * @param string $event + * @return void + */ + public function flush($event); + + /** + * Remove a set of listeners from the dispatcher. + * + * @param string $event + * @return void + */ + public function forget($event); + + /** + * Forget all of the queued listeners. + * + * @return void + */ + public function forgetPushed(); +} diff --git a/vendor/illuminate/contracts/Filesystem/Cloud.php b/vendor/illuminate/contracts/Filesystem/Cloud.php new file mode 100644 index 0000000..86bea26 --- /dev/null +++ b/vendor/illuminate/contracts/Filesystem/Cloud.php @@ -0,0 +1,14 @@ +<?php + +namespace Illuminate\Contracts\Filesystem; + +interface Cloud extends Filesystem +{ + /** + * Get the URL for the file at the given path. + * + * @param string $path + * @return string + */ + public function url($path); +} diff --git a/vendor/illuminate/contracts/Filesystem/Factory.php b/vendor/illuminate/contracts/Filesystem/Factory.php new file mode 100644 index 0000000..d0f9cd2 --- /dev/null +++ b/vendor/illuminate/contracts/Filesystem/Factory.php @@ -0,0 +1,14 @@ +<?php + +namespace Illuminate\Contracts\Filesystem; + +interface Factory +{ + /** + * Get a filesystem implementation. + * + * @param string|null $name + * @return \Illuminate\Contracts\Filesystem\Filesystem + */ + public function disk($name = null); +} diff --git a/vendor/illuminate/contracts/Filesystem/FileNotFoundException.php b/vendor/illuminate/contracts/Filesystem/FileNotFoundException.php new file mode 100644 index 0000000..37b7930 --- /dev/null +++ b/vendor/illuminate/contracts/Filesystem/FileNotFoundException.php @@ -0,0 +1,10 @@ +<?php + +namespace Illuminate\Contracts\Filesystem; + +use Exception; + +class FileNotFoundException extends Exception +{ + // +} diff --git a/vendor/illuminate/contracts/Filesystem/Filesystem.php b/vendor/illuminate/contracts/Filesystem/Filesystem.php new file mode 100644 index 0000000..6d2fd57 --- /dev/null +++ b/vendor/illuminate/contracts/Filesystem/Filesystem.php @@ -0,0 +1,191 @@ +<?php + +namespace Illuminate\Contracts\Filesystem; + +interface Filesystem +{ + /** + * The public visibility setting. + * + * @var string + */ + const VISIBILITY_PUBLIC = 'public'; + + /** + * The private visibility setting. + * + * @var string + */ + const VISIBILITY_PRIVATE = 'private'; + + /** + * Determine if a file exists. + * + * @param string $path + * @return bool + */ + public function exists($path); + + /** + * Get the contents of a file. + * + * @param string $path + * @return string|null + */ + public function get($path); + + /** + * Get a resource to read the file. + * + * @param string $path + * @return resource|null The path resource or null on failure. + */ + public function readStream($path); + + /** + * Write the contents of a file. + * + * @param string $path + * @param string|resource $contents + * @param mixed $options + * @return bool + */ + public function put($path, $contents, $options = []); + + /** + * Write a new file using a stream. + * + * @param string $path + * @param resource $resource + * @param array $options + * @return bool + */ + public function writeStream($path, $resource, array $options = []); + + /** + * Get the visibility for the given path. + * + * @param string $path + * @return string + */ + public function getVisibility($path); + + /** + * Set the visibility for the given path. + * + * @param string $path + * @param string $visibility + * @return bool + */ + public function setVisibility($path, $visibility); + + /** + * Prepend to a file. + * + * @param string $path + * @param string $data + * @return bool + */ + public function prepend($path, $data); + + /** + * Append to a file. + * + * @param string $path + * @param string $data + * @return bool + */ + public function append($path, $data); + + /** + * Delete the file at a given path. + * + * @param string|array $paths + * @return bool + */ + public function delete($paths); + + /** + * Copy a file to a new location. + * + * @param string $from + * @param string $to + * @return bool + */ + public function copy($from, $to); + + /** + * Move a file to a new location. + * + * @param string $from + * @param string $to + * @return bool + */ + public function move($from, $to); + + /** + * Get the file size of a given file. + * + * @param string $path + * @return int + */ + public function size($path); + + /** + * Get the file's last modification time. + * + * @param string $path + * @return int + */ + public function lastModified($path); + + /** + * Get an array of all files in a directory. + * + * @param string|null $directory + * @param bool $recursive + * @return array + */ + public function files($directory = null, $recursive = false); + + /** + * Get all of the files from the given directory (recursive). + * + * @param string|null $directory + * @return array + */ + public function allFiles($directory = null); + + /** + * Get all of the directories within a given directory. + * + * @param string|null $directory + * @param bool $recursive + * @return array + */ + public function directories($directory = null, $recursive = false); + + /** + * Get all (recursive) of the directories within a given directory. + * + * @param string|null $directory + * @return array + */ + public function allDirectories($directory = null); + + /** + * Create a directory. + * + * @param string $path + * @return bool + */ + public function makeDirectory($path); + + /** + * Recursively delete a directory. + * + * @param string $directory + * @return bool + */ + public function deleteDirectory($directory); +} diff --git a/vendor/illuminate/contracts/Filesystem/LockTimeoutException.php b/vendor/illuminate/contracts/Filesystem/LockTimeoutException.php new file mode 100644 index 0000000..f03f5c4 --- /dev/null +++ b/vendor/illuminate/contracts/Filesystem/LockTimeoutException.php @@ -0,0 +1,10 @@ +<?php + +namespace Illuminate\Contracts\Filesystem; + +use Exception; + +class LockTimeoutException extends Exception +{ + // +} diff --git a/vendor/illuminate/contracts/Foundation/Application.php b/vendor/illuminate/contracts/Foundation/Application.php new file mode 100644 index 0000000..b46c6de --- /dev/null +++ b/vendor/illuminate/contracts/Foundation/Application.php @@ -0,0 +1,231 @@ +<?php + +namespace Illuminate\Contracts\Foundation; + +use Illuminate\Contracts\Container\Container; + +interface Application extends Container +{ + /** + * Get the version number of the application. + * + * @return string + */ + public function version(); + + /** + * Get the base path of the Laravel installation. + * + * @param string $path + * @return string + */ + public function basePath($path = ''); + + /** + * Get the path to the bootstrap directory. + * + * @param string $path + * @return string + */ + public function bootstrapPath($path = ''); + + /** + * Get the path to the application configuration files. + * + * @param string $path + * @return string + */ + public function configPath($path = ''); + + /** + * Get the path to the database directory. + * + * @param string $path + * @return string + */ + public function databasePath($path = ''); + + /** + * Get the path to the resources directory. + * + * @param string $path + * @return string + */ + public function resourcePath($path = ''); + + /** + * Get the path to the storage directory. + * + * @param string $path + * @return string + */ + public function storagePath($path = ''); + + /** + * Get or check the current application environment. + * + * @param string|array $environments + * @return string|bool + */ + public function environment(...$environments); + + /** + * Determine if the application is running in the console. + * + * @return bool + */ + public function runningInConsole(); + + /** + * Determine if the application is running unit tests. + * + * @return bool + */ + public function runningUnitTests(); + + /** + * Get an instance of the maintenance mode manager implementation. + * + * @return \Illuminate\Contracts\Foundation\MaintenanceMode + */ + public function maintenanceMode(); + + /** + * Determine if the application is currently down for maintenance. + * + * @return bool + */ + public function isDownForMaintenance(); + + /** + * Register all of the configured providers. + * + * @return void + */ + public function registerConfiguredProviders(); + + /** + * Register a service provider with the application. + * + * @param \Illuminate\Support\ServiceProvider|string $provider + * @param bool $force + * @return \Illuminate\Support\ServiceProvider + */ + public function register($provider, $force = false); + + /** + * Register a deferred provider and service. + * + * @param string $provider + * @param string|null $service + * @return void + */ + public function registerDeferredProvider($provider, $service = null); + + /** + * Resolve a service provider instance from the class name. + * + * @param string $provider + * @return \Illuminate\Support\ServiceProvider + */ + public function resolveProvider($provider); + + /** + * Boot the application's service providers. + * + * @return void + */ + public function boot(); + + /** + * Register a new boot listener. + * + * @param callable $callback + * @return void + */ + public function booting($callback); + + /** + * Register a new "booted" listener. + * + * @param callable $callback + * @return void + */ + public function booted($callback); + + /** + * Run the given array of bootstrap classes. + * + * @param array $bootstrappers + * @return void + */ + public function bootstrapWith(array $bootstrappers); + + /** + * Get the current application locale. + * + * @return string + */ + public function getLocale(); + + /** + * Get the application namespace. + * + * @return string + * + * @throws \RuntimeException + */ + public function getNamespace(); + + /** + * Get the registered service provider instances if any exist. + * + * @param \Illuminate\Support\ServiceProvider|string $provider + * @return array + */ + public function getProviders($provider); + + /** + * Determine if the application has been bootstrapped before. + * + * @return bool + */ + public function hasBeenBootstrapped(); + + /** + * Load and boot all of the remaining deferred providers. + * + * @return void + */ + public function loadDeferredProviders(); + + /** + * Set the current application locale. + * + * @param string $locale + * @return void + */ + public function setLocale($locale); + + /** + * Determine if middleware has been disabled for the application. + * + * @return bool + */ + public function shouldSkipMiddleware(); + + /** + * Register a terminating callback with the application. + * + * @param callable|string $callback + * @return \Illuminate\Contracts\Foundation\Application + */ + public function terminating($callback); + + /** + * Terminate the application. + * + * @return void + */ + public function terminate(); +} diff --git a/vendor/illuminate/contracts/Foundation/CachesConfiguration.php b/vendor/illuminate/contracts/Foundation/CachesConfiguration.php new file mode 100644 index 0000000..08ebdaf --- /dev/null +++ b/vendor/illuminate/contracts/Foundation/CachesConfiguration.php @@ -0,0 +1,27 @@ +<?php + +namespace Illuminate\Contracts\Foundation; + +interface CachesConfiguration +{ + /** + * Determine if the application configuration is cached. + * + * @return bool + */ + public function configurationIsCached(); + + /** + * Get the path to the configuration cache file. + * + * @return string + */ + public function getCachedConfigPath(); + + /** + * Get the path to the cached services.php file. + * + * @return string + */ + public function getCachedServicesPath(); +} diff --git a/vendor/illuminate/contracts/Foundation/CachesRoutes.php b/vendor/illuminate/contracts/Foundation/CachesRoutes.php new file mode 100644 index 0000000..a5c3455 --- /dev/null +++ b/vendor/illuminate/contracts/Foundation/CachesRoutes.php @@ -0,0 +1,20 @@ +<?php + +namespace Illuminate\Contracts\Foundation; + +interface CachesRoutes +{ + /** + * Determine if the application routes are cached. + * + * @return bool + */ + public function routesAreCached(); + + /** + * Get the path to the routes cache file. + * + * @return string + */ + public function getCachedRoutesPath(); +} diff --git a/vendor/illuminate/contracts/Foundation/ExceptionRenderer.php b/vendor/illuminate/contracts/Foundation/ExceptionRenderer.php new file mode 100644 index 0000000..24f4e4b --- /dev/null +++ b/vendor/illuminate/contracts/Foundation/ExceptionRenderer.php @@ -0,0 +1,14 @@ +<?php + +namespace Illuminate\Contracts\Foundation; + +interface ExceptionRenderer +{ + /** + * Renders the given exception as HTML. + * + * @param \Throwable $throwable + * @return string + */ + public function render($throwable); +} diff --git a/vendor/illuminate/contracts/Foundation/MaintenanceMode.php b/vendor/illuminate/contracts/Foundation/MaintenanceMode.php new file mode 100644 index 0000000..4c948f7 --- /dev/null +++ b/vendor/illuminate/contracts/Foundation/MaintenanceMode.php @@ -0,0 +1,35 @@ +<?php + +namespace Illuminate\Contracts\Foundation; + +interface MaintenanceMode +{ + /** + * Take the application down for maintenance. + * + * @param array $payload + * @return void + */ + public function activate(array $payload): void; + + /** + * Take the application out of maintenance. + * + * @return void + */ + public function deactivate(): void; + + /** + * Determine if the application is currently down for maintenance. + * + * @return bool + */ + public function active(): bool; + + /** + * Get the data array which was provided when the application was placed into maintenance. + * + * @return array + */ + public function data(): array; +} diff --git a/vendor/illuminate/contracts/Hashing/Hasher.php b/vendor/illuminate/contracts/Hashing/Hasher.php new file mode 100644 index 0000000..b5e4d4c --- /dev/null +++ b/vendor/illuminate/contracts/Hashing/Hasher.php @@ -0,0 +1,42 @@ +<?php + +namespace Illuminate\Contracts\Hashing; + +interface Hasher +{ + /** + * Get information about the given hashed value. + * + * @param string $hashedValue + * @return array + */ + public function info($hashedValue); + + /** + * Hash the given value. + * + * @param string $value + * @param array $options + * @return string + */ + public function make($value, array $options = []); + + /** + * Check the given plain value against a hash. + * + * @param string $value + * @param string $hashedValue + * @param array $options + * @return bool + */ + public function check($value, $hashedValue, array $options = []); + + /** + * Check if the given hash has been hashed using the given options. + * + * @param string $hashedValue + * @param array $options + * @return bool + */ + public function needsRehash($hashedValue, array $options = []); +} diff --git a/vendor/illuminate/contracts/Http/Kernel.php b/vendor/illuminate/contracts/Http/Kernel.php new file mode 100644 index 0000000..6eab6e6 --- /dev/null +++ b/vendor/illuminate/contracts/Http/Kernel.php @@ -0,0 +1,37 @@ +<?php + +namespace Illuminate\Contracts\Http; + +interface Kernel +{ + /** + * Bootstrap the application for HTTP requests. + * + * @return void + */ + public function bootstrap(); + + /** + * Handle an incoming HTTP request. + * + * @param \Symfony\Component\HttpFoundation\Request $request + * @return \Symfony\Component\HttpFoundation\Response + */ + public function handle($request); + + /** + * Perform any final actions for the request lifecycle. + * + * @param \Symfony\Component\HttpFoundation\Request $request + * @param \Symfony\Component\HttpFoundation\Response $response + * @return void + */ + public function terminate($request, $response); + + /** + * Get the Laravel application instance. + * + * @return \Illuminate\Contracts\Foundation\Application + */ + public function getApplication(); +} diff --git a/vendor/illuminate/contracts/LICENSE.md b/vendor/illuminate/contracts/LICENSE.md new file mode 100644 index 0000000..79810c8 --- /dev/null +++ b/vendor/illuminate/contracts/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Taylor Otwell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/illuminate/contracts/Mail/Attachable.php b/vendor/illuminate/contracts/Mail/Attachable.php new file mode 100644 index 0000000..6804ec3 --- /dev/null +++ b/vendor/illuminate/contracts/Mail/Attachable.php @@ -0,0 +1,13 @@ +<?php + +namespace Illuminate\Contracts\Mail; + +interface Attachable +{ + /** + * Get an attachment instance for this entity. + * + * @return \Illuminate\Mail\Attachment + */ + public function toMailAttachment(); +} diff --git a/vendor/illuminate/contracts/Mail/Factory.php b/vendor/illuminate/contracts/Mail/Factory.php new file mode 100644 index 0000000..fe45a2f --- /dev/null +++ b/vendor/illuminate/contracts/Mail/Factory.php @@ -0,0 +1,14 @@ +<?php + +namespace Illuminate\Contracts\Mail; + +interface Factory +{ + /** + * Get a mailer instance by name. + * + * @param string|null $name + * @return \Illuminate\Contracts\Mail\Mailer + */ + public function mailer($name = null); +} diff --git a/vendor/illuminate/contracts/Mail/MailQueue.php b/vendor/illuminate/contracts/Mail/MailQueue.php new file mode 100644 index 0000000..d0d90b8 --- /dev/null +++ b/vendor/illuminate/contracts/Mail/MailQueue.php @@ -0,0 +1,25 @@ +<?php + +namespace Illuminate\Contracts\Mail; + +interface MailQueue +{ + /** + * Queue a new e-mail message for sending. + * + * @param \Illuminate\Contracts\Mail\Mailable|string|array $view + * @param string|null $queue + * @return mixed + */ + public function queue($view, $queue = null); + + /** + * Queue a new e-mail message for sending after (n) seconds. + * + * @param \DateTimeInterface|\DateInterval|int $delay + * @param \Illuminate\Contracts\Mail\Mailable|string|array $view + * @param string|null $queue + * @return mixed + */ + public function later($delay, $view, $queue = null); +} diff --git a/vendor/illuminate/contracts/Mail/Mailable.php b/vendor/illuminate/contracts/Mail/Mailable.php new file mode 100644 index 0000000..b7fdd42 --- /dev/null +++ b/vendor/illuminate/contracts/Mail/Mailable.php @@ -0,0 +1,76 @@ +<?php + +namespace Illuminate\Contracts\Mail; + +use Illuminate\Contracts\Queue\Factory as Queue; + +interface Mailable +{ + /** + * Send the message using the given mailer. + * + * @param \Illuminate\Contracts\Mail\Factory|\Illuminate\Contracts\Mail\Mailer $mailer + * @return \Illuminate\Mail\SentMessage|null + */ + public function send($mailer); + + /** + * Queue the given message. + * + * @param \Illuminate\Contracts\Queue\Factory $queue + * @return mixed + */ + public function queue(Queue $queue); + + /** + * Deliver the queued message after (n) seconds. + * + * @param \DateTimeInterface|\DateInterval|int $delay + * @param \Illuminate\Contracts\Queue\Factory $queue + * @return mixed + */ + public function later($delay, Queue $queue); + + /** + * Set the recipients of the message. + * + * @param object|array|string $address + * @param string|null $name + * @return self + */ + public function cc($address, $name = null); + + /** + * Set the recipients of the message. + * + * @param object|array|string $address + * @param string|null $name + * @return $this + */ + public function bcc($address, $name = null); + + /** + * Set the recipients of the message. + * + * @param object|array|string $address + * @param string|null $name + * @return $this + */ + public function to($address, $name = null); + + /** + * Set the locale of the message. + * + * @param string $locale + * @return $this + */ + public function locale($locale); + + /** + * Set the name of the mailer that should be used to send the message. + * + * @param string $mailer + * @return $this + */ + public function mailer($mailer); +} diff --git a/vendor/illuminate/contracts/Mail/Mailer.php b/vendor/illuminate/contracts/Mail/Mailer.php new file mode 100644 index 0000000..4d97f3e --- /dev/null +++ b/vendor/illuminate/contracts/Mail/Mailer.php @@ -0,0 +1,41 @@ +<?php + +namespace Illuminate\Contracts\Mail; + +interface Mailer +{ + /** + * Begin the process of mailing a mailable class instance. + * + * @param mixed $users + * @return \Illuminate\Mail\PendingMail + */ + public function to($users); + + /** + * Begin the process of mailing a mailable class instance. + * + * @param mixed $users + * @return \Illuminate\Mail\PendingMail + */ + public function bcc($users); + + /** + * Send a new message with only a raw text part. + * + * @param string $text + * @param mixed $callback + * @return \Illuminate\Mail\SentMessage|null + */ + public function raw($text, $callback); + + /** + * Send a new message using a view. + * + * @param \Illuminate\Contracts\Mail\Mailable|string|array $view + * @param array $data + * @param \Closure|string|null $callback + * @return \Illuminate\Mail\SentMessage|null + */ + public function send($view, array $data = [], $callback = null); +} diff --git a/vendor/illuminate/contracts/Notifications/Dispatcher.php b/vendor/illuminate/contracts/Notifications/Dispatcher.php new file mode 100644 index 0000000..a483ca2 --- /dev/null +++ b/vendor/illuminate/contracts/Notifications/Dispatcher.php @@ -0,0 +1,24 @@ +<?php + +namespace Illuminate\Contracts\Notifications; + +interface Dispatcher +{ + /** + * Send the given notification to the given notifiable entities. + * + * @param \Illuminate\Support\Collection|array|mixed $notifiables + * @param mixed $notification + * @return void + */ + public function send($notifiables, $notification); + + /** + * Send the given notification immediately. + * + * @param \Illuminate\Support\Collection|array|mixed $notifiables + * @param mixed $notification + * @return void + */ + public function sendNow($notifiables, $notification); +} diff --git a/vendor/illuminate/contracts/Notifications/Factory.php b/vendor/illuminate/contracts/Notifications/Factory.php new file mode 100644 index 0000000..7705678 --- /dev/null +++ b/vendor/illuminate/contracts/Notifications/Factory.php @@ -0,0 +1,32 @@ +<?php + +namespace Illuminate\Contracts\Notifications; + +interface Factory +{ + /** + * Get a channel instance by name. + * + * @param string|null $name + * @return mixed + */ + public function channel($name = null); + + /** + * Send the given notification to the given notifiable entities. + * + * @param \Illuminate\Support\Collection|array|mixed $notifiables + * @param mixed $notification + * @return void + */ + public function send($notifiables, $notification); + + /** + * Send the given notification immediately. + * + * @param \Illuminate\Support\Collection|array|mixed $notifiables + * @param mixed $notification + * @return void + */ + public function sendNow($notifiables, $notification); +} diff --git a/vendor/illuminate/contracts/Pagination/CursorPaginator.php b/vendor/illuminate/contracts/Pagination/CursorPaginator.php new file mode 100644 index 0000000..2d62d3a --- /dev/null +++ b/vendor/illuminate/contracts/Pagination/CursorPaginator.php @@ -0,0 +1,117 @@ +<?php + +namespace Illuminate\Contracts\Pagination; + +interface CursorPaginator +{ + /** + * Get the URL for a given cursor. + * + * @param \Illuminate\Pagination\Cursor|null $cursor + * @return string + */ + public function url($cursor); + + /** + * Add a set of query string values to the paginator. + * + * @param array|string|null $key + * @param string|null $value + * @return $this + */ + public function appends($key, $value = null); + + /** + * Get / set the URL fragment to be appended to URLs. + * + * @param string|null $fragment + * @return $this|string|null + */ + public function fragment($fragment = null); + + /** + * Get the URL for the previous page, or null. + * + * @return string|null + */ + public function previousPageUrl(); + + /** + * The URL for the next page, or null. + * + * @return string|null + */ + public function nextPageUrl(); + + /** + * Get all of the items being paginated. + * + * @return array + */ + public function items(); + + /** + * Get the "cursor" of the previous set of items. + * + * @return \Illuminate\Pagination\Cursor|null + */ + public function previousCursor(); + + /** + * Get the "cursor" of the next set of items. + * + * @return \Illuminate\Pagination\Cursor|null + */ + public function nextCursor(); + + /** + * Determine how many items are being shown per page. + * + * @return int + */ + public function perPage(); + + /** + * Get the current cursor being paginated. + * + * @return \Illuminate\Pagination\Cursor|null + */ + public function cursor(); + + /** + * Determine if there are enough items to split into multiple pages. + * + * @return bool + */ + public function hasPages(); + + /** + * Get the base path for paginator generated URLs. + * + * @return string|null + */ + public function path(); + + /** + * Determine if the list of items is empty or not. + * + * @return bool + */ + public function isEmpty(); + + /** + * Determine if the list of items is not empty. + * + * @return bool + */ + public function isNotEmpty(); + + /** + * Render the paginator using a given view. + * + * @param string|null $view + * @param array $data + * @return string + */ + public function render($view = null, $data = []); +} diff --git a/vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php b/vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php new file mode 100644 index 0000000..4e6ef71 --- /dev/null +++ b/vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php @@ -0,0 +1,29 @@ +<?php + +namespace Illuminate\Contracts\Pagination; + +interface LengthAwarePaginator extends Paginator +{ + /** + * Create a range of pagination URLs. + * + * @param int $start + * @param int $end + * @return array + */ + public function getUrlRange($start, $end); + + /** + * Determine the total number of items in the data store. + * + * @return int + */ + public function total(); + + /** + * Get the page number of the last available page. + * + * @return int + */ + public function lastPage(); +} diff --git a/vendor/illuminate/contracts/Pagination/Paginator.php b/vendor/illuminate/contracts/Pagination/Paginator.php new file mode 100644 index 0000000..09292f4 --- /dev/null +++ b/vendor/illuminate/contracts/Pagination/Paginator.php @@ -0,0 +1,124 @@ +<?php + +namespace Illuminate\Contracts\Pagination; + +interface Paginator +{ + /** + * Get the URL for a given page. + * + * @param int $page + * @return string + */ + public function url($page); + + /** + * Add a set of query string values to the paginator. + * + * @param array|string|null $key + * @param string|null $value + * @return $this + */ + public function appends($key, $value = null); + + /** + * Get / set the URL fragment to be appended to URLs. + * + * @param string|null $fragment + * @return $this|string|null + */ + public function fragment($fragment = null); + + /** + * The URL for the next page, or null. + * + * @return string|null + */ + public function nextPageUrl(); + + /** + * Get the URL for the previous page, or null. + * + * @return string|null + */ + public function previousPageUrl(); + + /** + * Get all of the items being paginated. + * + * @return array + */ + public function items(); + + /** + * Get the "index" of the first item being paginated. + * + * @return int + */ + public function firstItem(); + + /** + * Get the "index" of the last item being paginated. + * + * @return int + */ + public function lastItem(); + + /** + * Determine how many items are being shown per page. + * + * @return int + */ + public function perPage(); + + /** + * Determine the current page being paginated. + * + * @return int + */ + public function currentPage(); + + /** + * Determine if there are enough items to split into multiple pages. + * + * @return bool + */ + public function hasPages(); + + /** + * Determine if there are more items in the data store. + * + * @return bool + */ + public function hasMorePages(); + + /** + * Get the base path for paginator generated URLs. + * + * @return string|null + */ + public function path(); + + /** + * Determine if the list of items is empty or not. + * + * @return bool + */ + public function isEmpty(); + + /** + * Determine if the list of items is not empty. + * + * @return bool + */ + public function isNotEmpty(); + + /** + * Render the paginator using a given view. + * + * @param string|null $view + * @param array $data + * @return string + */ + public function render($view = null, $data = []); +} diff --git a/vendor/illuminate/contracts/Pipeline/Hub.php b/vendor/illuminate/contracts/Pipeline/Hub.php new file mode 100644 index 0000000..1ae675f --- /dev/null +++ b/vendor/illuminate/contracts/Pipeline/Hub.php @@ -0,0 +1,15 @@ +<?php + +namespace Illuminate\Contracts\Pipeline; + +interface Hub +{ + /** + * Send an object through one of the available pipelines. + * + * @param mixed $object + * @param string|null $pipeline + * @return mixed + */ + public function pipe($object, $pipeline = null); +} diff --git a/vendor/illuminate/contracts/Pipeline/Pipeline.php b/vendor/illuminate/contracts/Pipeline/Pipeline.php new file mode 100644 index 0000000..226081c --- /dev/null +++ b/vendor/illuminate/contracts/Pipeline/Pipeline.php @@ -0,0 +1,40 @@ +<?php + +namespace Illuminate\Contracts\Pipeline; + +use Closure; + +interface Pipeline +{ + /** + * Set the traveler object being sent on the pipeline. + * + * @param mixed $traveler + * @return $this + */ + public function send($traveler); + + /** + * Set the stops of the pipeline. + * + * @param dynamic|array $stops + * @return $this + */ + public function through($stops); + + /** + * Set the method to call on the stops. + * + * @param string $method + * @return $this + */ + public function via($method); + + /** + * Run the pipeline with a final destination callback. + * + * @param \Closure $destination + * @return mixed + */ + public function then(Closure $destination); +} diff --git a/vendor/illuminate/contracts/Queue/ClearableQueue.php b/vendor/illuminate/contracts/Queue/ClearableQueue.php new file mode 100644 index 0000000..427f61b --- /dev/null +++ b/vendor/illuminate/contracts/Queue/ClearableQueue.php @@ -0,0 +1,14 @@ +<?php + +namespace Illuminate\Contracts\Queue; + +interface ClearableQueue +{ + /** + * Delete all of the jobs from the queue. + * + * @param string $queue + * @return int + */ + public function clear($queue); +} diff --git a/vendor/illuminate/contracts/Queue/EntityNotFoundException.php b/vendor/illuminate/contracts/Queue/EntityNotFoundException.php new file mode 100644 index 0000000..079250d --- /dev/null +++ b/vendor/illuminate/contracts/Queue/EntityNotFoundException.php @@ -0,0 +1,22 @@ +<?php + +namespace Illuminate\Contracts\Queue; + +use InvalidArgumentException; + +class EntityNotFoundException extends InvalidArgumentException +{ + /** + * Create a new exception instance. + * + * @param string $type + * @param mixed $id + * @return void + */ + public function __construct($type, $id) + { + $id = (string) $id; + + parent::__construct("Queueable entity [{$type}] not found for ID [{$id}]."); + } +} diff --git a/vendor/illuminate/contracts/Queue/EntityResolver.php b/vendor/illuminate/contracts/Queue/EntityResolver.php new file mode 100644 index 0000000..aad97a1 --- /dev/null +++ b/vendor/illuminate/contracts/Queue/EntityResolver.php @@ -0,0 +1,15 @@ +<?php + +namespace Illuminate\Contracts\Queue; + +interface EntityResolver +{ + /** + * Resolve the entity for the given ID. + * + * @param string $type + * @param mixed $id + * @return mixed + */ + public function resolve($type, $id); +} diff --git a/vendor/illuminate/contracts/Queue/Factory.php b/vendor/illuminate/contracts/Queue/Factory.php new file mode 100644 index 0000000..9a0bdeb --- /dev/null +++ b/vendor/illuminate/contracts/Queue/Factory.php @@ -0,0 +1,14 @@ +<?php + +namespace Illuminate\Contracts\Queue; + +interface Factory +{ + /** + * Resolve a queue connection instance. + * + * @param string|null $name + * @return \Illuminate\Contracts\Queue\Queue + */ + public function connection($name = null); +} diff --git a/vendor/illuminate/contracts/Queue/Job.php b/vendor/illuminate/contracts/Queue/Job.php new file mode 100644 index 0000000..9efd17d --- /dev/null +++ b/vendor/illuminate/contracts/Queue/Job.php @@ -0,0 +1,164 @@ +<?php + +namespace Illuminate\Contracts\Queue; + +interface Job +{ + /** + * Get the UUID of the job. + * + * @return string|null + */ + public function uuid(); + + /** + * Get the job identifier. + * + * @return string + */ + public function getJobId(); + + /** + * Get the decoded body of the job. + * + * @return array + */ + public function payload(); + + /** + * Fire the job. + * + * @return void + */ + public function fire(); + + /** + * Release the job back into the queue after (n) seconds. + * + * @param int $delay + * @return void + */ + public function release($delay = 0); + + /** + * Determine if the job was released back into the queue. + * + * @return bool + */ + public function isReleased(); + + /** + * Delete the job from the queue. + * + * @return void + */ + public function delete(); + + /** + * Determine if the job has been deleted. + * + * @return bool + */ + public function isDeleted(); + + /** + * Determine if the job has been deleted or released. + * + * @return bool + */ + public function isDeletedOrReleased(); + + /** + * Get the number of times the job has been attempted. + * + * @return int + */ + public function attempts(); + + /** + * Determine if the job has been marked as a failure. + * + * @return bool + */ + public function hasFailed(); + + /** + * Mark the job as "failed". + * + * @return void + */ + public function markAsFailed(); + + /** + * Delete the job, call the "failed" method, and raise the failed job event. + * + * @param \Throwable|null $e + * @return void + */ + public function fail($e = null); + + /** + * Get the number of times to attempt a job. + * + * @return int|null + */ + public function maxTries(); + + /** + * Get the maximum number of exceptions allowed, regardless of attempts. + * + * @return int|null + */ + public function maxExceptions(); + + /** + * Get the number of seconds the job can run. + * + * @return int|null + */ + public function timeout(); + + /** + * Get the timestamp indicating when the job should timeout. + * + * @return int|null + */ + public function retryUntil(); + + /** + * Get the name of the queued job class. + * + * @return string + */ + public function getName(); + + /** + * Get the resolved name of the queued job class. + * + * Resolves the name of "wrapped" jobs such as class-based handlers. + * + * @return string + */ + public function resolveName(); + + /** + * Get the name of the connection the job belongs to. + * + * @return string + */ + public function getConnectionName(); + + /** + * Get the name of the queue the job belongs to. + * + * @return string + */ + public function getQueue(); + + /** + * Get the raw body string for the job. + * + * @return string + */ + public function getRawBody(); +} diff --git a/vendor/illuminate/contracts/Queue/Monitor.php b/vendor/illuminate/contracts/Queue/Monitor.php new file mode 100644 index 0000000..87677f0 --- /dev/null +++ b/vendor/illuminate/contracts/Queue/Monitor.php @@ -0,0 +1,30 @@ +<?php + +namespace Illuminate\Contracts\Queue; + +interface Monitor +{ + /** + * Register a callback to be executed on every iteration through the queue loop. + * + * @param mixed $callback + * @return void + */ + public function looping($callback); + + /** + * Register a callback to be executed when a job fails after the maximum number of retries. + * + * @param mixed $callback + * @return void + */ + public function failing($callback); + + /** + * Register a callback to be executed when a daemon queue is stopping. + * + * @param mixed $callback + * @return void + */ + public function stopping($callback); +} diff --git a/vendor/illuminate/contracts/Queue/Queue.php b/vendor/illuminate/contracts/Queue/Queue.php new file mode 100644 index 0000000..1994cdd --- /dev/null +++ b/vendor/illuminate/contracts/Queue/Queue.php @@ -0,0 +1,99 @@ +<?php + +namespace Illuminate\Contracts\Queue; + +interface Queue +{ + /** + * Get the size of the queue. + * + * @param string|null $queue + * @return int + */ + public function size($queue = null); + + /** + * Push a new job onto the queue. + * + * @param string|object $job + * @param mixed $data + * @param string|null $queue + * @return mixed + */ + public function push($job, $data = '', $queue = null); + + /** + * Push a new job onto the queue. + * + * @param string $queue + * @param string|object $job + * @param mixed $data + * @return mixed + */ + public function pushOn($queue, $job, $data = ''); + + /** + * Push a raw payload onto the queue. + * + * @param string $payload + * @param string|null $queue + * @param array $options + * @return mixed + */ + public function pushRaw($payload, $queue = null, array $options = []); + + /** + * Push a new job onto the queue after (n) seconds. + * + * @param \DateTimeInterface|\DateInterval|int $delay + * @param string|object $job + * @param mixed $data + * @param string|null $queue + * @return mixed + */ + public function later($delay, $job, $data = '', $queue = null); + + /** + * Push a new job onto a specific queue after (n) seconds. + * + * @param string $queue + * @param \DateTimeInterface|\DateInterval|int $delay + * @param string|object $job + * @param mixed $data + * @return mixed + */ + public function laterOn($queue, $delay, $job, $data = ''); + + /** + * Push an array of jobs onto the queue. + * + * @param array $jobs + * @param mixed $data + * @param string|null $queue + * @return mixed + */ + public function bulk($jobs, $data = '', $queue = null); + + /** + * Pop the next job off of the queue. + * + * @param string|null $queue + * @return \Illuminate\Contracts\Queue\Job|null + */ + public function pop($queue = null); + + /** + * Get the connection name for the queue. + * + * @return string + */ + public function getConnectionName(); + + /** + * Set the connection name for the queue. + * + * @param string $name + * @return $this + */ + public function setConnectionName($name); +} diff --git a/vendor/illuminate/contracts/Queue/QueueableCollection.php b/vendor/illuminate/contracts/Queue/QueueableCollection.php new file mode 100644 index 0000000..750d10d --- /dev/null +++ b/vendor/illuminate/contracts/Queue/QueueableCollection.php @@ -0,0 +1,34 @@ +<?php + +namespace Illuminate\Contracts\Queue; + +interface QueueableCollection +{ + /** + * Get the type of the entities being queued. + * + * @return string|null + */ + public function getQueueableClass(); + + /** + * Get the identifiers for all of the entities. + * + * @return array<int, mixed> + */ + public function getQueueableIds(); + + /** + * Get the relationships of the entities being queued. + * + * @return array<int, string> + */ + public function getQueueableRelations(); + + /** + * Get the connection of the entities being queued. + * + * @return string|null + */ + public function getQueueableConnection(); +} diff --git a/vendor/illuminate/contracts/Queue/QueueableEntity.php b/vendor/illuminate/contracts/Queue/QueueableEntity.php new file mode 100644 index 0000000..366f0c8 --- /dev/null +++ b/vendor/illuminate/contracts/Queue/QueueableEntity.php @@ -0,0 +1,27 @@ +<?php + +namespace Illuminate\Contracts\Queue; + +interface QueueableEntity +{ + /** + * Get the queueable identity for the entity. + * + * @return mixed + */ + public function getQueueableId(); + + /** + * Get the relationships for the entity. + * + * @return array + */ + public function getQueueableRelations(); + + /** + * Get the connection of the entity. + * + * @return string|null + */ + public function getQueueableConnection(); +} diff --git a/vendor/illuminate/contracts/Queue/ShouldBeEncrypted.php b/vendor/illuminate/contracts/Queue/ShouldBeEncrypted.php new file mode 100644 index 0000000..374df89 --- /dev/null +++ b/vendor/illuminate/contracts/Queue/ShouldBeEncrypted.php @@ -0,0 +1,8 @@ +<?php + +namespace Illuminate\Contracts\Queue; + +interface ShouldBeEncrypted +{ + // +} diff --git a/vendor/illuminate/contracts/Queue/ShouldBeUnique.php b/vendor/illuminate/contracts/Queue/ShouldBeUnique.php new file mode 100644 index 0000000..b216434 --- /dev/null +++ b/vendor/illuminate/contracts/Queue/ShouldBeUnique.php @@ -0,0 +1,8 @@ +<?php + +namespace Illuminate\Contracts\Queue; + +interface ShouldBeUnique +{ + // +} diff --git a/vendor/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php b/vendor/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php new file mode 100644 index 0000000..510cab9 --- /dev/null +++ b/vendor/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php @@ -0,0 +1,8 @@ +<?php + +namespace Illuminate\Contracts\Queue; + +interface ShouldBeUniqueUntilProcessing extends ShouldBeUnique +{ + // +} diff --git a/vendor/illuminate/contracts/Queue/ShouldQueue.php b/vendor/illuminate/contracts/Queue/ShouldQueue.php new file mode 100644 index 0000000..0e99652 --- /dev/null +++ b/vendor/illuminate/contracts/Queue/ShouldQueue.php @@ -0,0 +1,8 @@ +<?php + +namespace Illuminate\Contracts\Queue; + +interface ShouldQueue +{ + // +} diff --git a/vendor/illuminate/contracts/Redis/Connection.php b/vendor/illuminate/contracts/Redis/Connection.php new file mode 100644 index 0000000..74a8832 --- /dev/null +++ b/vendor/illuminate/contracts/Redis/Connection.php @@ -0,0 +1,35 @@ +<?php + +namespace Illuminate\Contracts\Redis; + +use Closure; + +interface Connection +{ + /** + * Subscribe to a set of given channels for messages. + * + * @param array|string $channels + * @param \Closure $callback + * @return void + */ + public function subscribe($channels, Closure $callback); + + /** + * Subscribe to a set of given channels with wildcards. + * + * @param array|string $channels + * @param \Closure $callback + * @return void + */ + public function psubscribe($channels, Closure $callback); + + /** + * Run a command against the Redis database. + * + * @param string $method + * @param array $parameters + * @return mixed + */ + public function command($method, array $parameters = []); +} diff --git a/vendor/illuminate/contracts/Redis/Connector.php b/vendor/illuminate/contracts/Redis/Connector.php new file mode 100644 index 0000000..e2669f7 --- /dev/null +++ b/vendor/illuminate/contracts/Redis/Connector.php @@ -0,0 +1,25 @@ +<?php + +namespace Illuminate\Contracts\Redis; + +interface Connector +{ + /** + * Create a connection to a Redis cluster. + * + * @param array $config + * @param array $options + * @return \Illuminate\Redis\Connections\Connection + */ + public function connect(array $config, array $options); + + /** + * Create a connection to a Redis instance. + * + * @param array $config + * @param array $clusterOptions + * @param array $options + * @return \Illuminate\Redis\Connections\Connection + */ + public function connectToCluster(array $config, array $clusterOptions, array $options); +} diff --git a/vendor/illuminate/contracts/Redis/Factory.php b/vendor/illuminate/contracts/Redis/Factory.php new file mode 100644 index 0000000..c2bfe81 --- /dev/null +++ b/vendor/illuminate/contracts/Redis/Factory.php @@ -0,0 +1,14 @@ +<?php + +namespace Illuminate\Contracts\Redis; + +interface Factory +{ + /** + * Get a Redis connection by name. + * + * @param string|null $name + * @return \Illuminate\Redis\Connections\Connection + */ + public function connection($name = null); +} diff --git a/vendor/illuminate/contracts/Redis/LimiterTimeoutException.php b/vendor/illuminate/contracts/Redis/LimiterTimeoutException.php new file mode 100644 index 0000000..651bf90 --- /dev/null +++ b/vendor/illuminate/contracts/Redis/LimiterTimeoutException.php @@ -0,0 +1,10 @@ +<?php + +namespace Illuminate\Contracts\Redis; + +use Exception; + +class LimiterTimeoutException extends Exception +{ + // +} diff --git a/vendor/illuminate/contracts/Routing/BindingRegistrar.php b/vendor/illuminate/contracts/Routing/BindingRegistrar.php new file mode 100644 index 0000000..6ed5079 --- /dev/null +++ b/vendor/illuminate/contracts/Routing/BindingRegistrar.php @@ -0,0 +1,23 @@ +<?php + +namespace Illuminate\Contracts\Routing; + +interface BindingRegistrar +{ + /** + * Add a new route parameter binder. + * + * @param string $key + * @param string|callable $binder + * @return void + */ + public function bind($key, $binder); + + /** + * Get the binding callback for a given binding. + * + * @param string $key + * @return \Closure + */ + public function getBindingCallback($key); +} diff --git a/vendor/illuminate/contracts/Routing/Registrar.php b/vendor/illuminate/contracts/Routing/Registrar.php new file mode 100644 index 0000000..57e3272 --- /dev/null +++ b/vendor/illuminate/contracts/Routing/Registrar.php @@ -0,0 +1,105 @@ +<?php + +namespace Illuminate\Contracts\Routing; + +interface Registrar +{ + /** + * Register a new GET route with the router. + * + * @param string $uri + * @param array|string|callable $action + * @return \Illuminate\Routing\Route + */ + public function get($uri, $action); + + /** + * Register a new POST route with the router. + * + * @param string $uri + * @param array|string|callable $action + * @return \Illuminate\Routing\Route + */ + public function post($uri, $action); + + /** + * Register a new PUT route with the router. + * + * @param string $uri + * @param array|string|callable $action + * @return \Illuminate\Routing\Route + */ + public function put($uri, $action); + + /** + * Register a new DELETE route with the router. + * + * @param string $uri + * @param array|string|callable $action + * @return \Illuminate\Routing\Route + */ + public function delete($uri, $action); + + /** + * Register a new PATCH route with the router. + * + * @param string $uri + * @param array|string|callable $action + * @return \Illuminate\Routing\Route + */ + public function patch($uri, $action); + + /** + * Register a new OPTIONS route with the router. + * + * @param string $uri + * @param array|string|callable $action + * @return \Illuminate\Routing\Route + */ + public function options($uri, $action); + + /** + * Register a new route with the given verbs. + * + * @param array|string $methods + * @param string $uri + * @param array|string|callable $action + * @return \Illuminate\Routing\Route + */ + public function match($methods, $uri, $action); + + /** + * Route a resource to a controller. + * + * @param string $name + * @param string $controller + * @param array $options + * @return \Illuminate\Routing\PendingResourceRegistration + */ + public function resource($name, $controller, array $options = []); + + /** + * Create a route group with shared attributes. + * + * @param array $attributes + * @param \Closure|string $routes + * @return void + */ + public function group(array $attributes, $routes); + + /** + * Substitute the route bindings onto the route. + * + * @param \Illuminate\Routing\Route $route + * @return \Illuminate\Routing\Route + */ + public function substituteBindings($route); + + /** + * Substitute the implicit Eloquent model bindings for the route. + * + * @param \Illuminate\Routing\Route $route + * @return void + */ + public function substituteImplicitBindings($route); +} diff --git a/vendor/illuminate/contracts/Routing/ResponseFactory.php b/vendor/illuminate/contracts/Routing/ResponseFactory.php new file mode 100644 index 0000000..86c16ca --- /dev/null +++ b/vendor/illuminate/contracts/Routing/ResponseFactory.php @@ -0,0 +1,155 @@ +<?php + +namespace Illuminate\Contracts\Routing; + +interface ResponseFactory +{ + /** + * Create a new response instance. + * + * @param array|string $content + * @param int $status + * @param array $headers + * @return \Illuminate\Http\Response + */ + public function make($content = '', $status = 200, array $headers = []); + + /** + * Create a new "no content" response. + * + * @param int $status + * @param array $headers + * @return \Illuminate\Http\Response + */ + public function noContent($status = 204, array $headers = []); + + /** + * Create a new response for a given view. + * + * @param string|array $view + * @param array $data + * @param int $status + * @param array $headers + * @return \Illuminate\Http\Response + */ + public function view($view, $data = [], $status = 200, array $headers = []); + + /** + * Create a new JSON response instance. + * + * @param mixed $data + * @param int $status + * @param array $headers + * @param int $options + * @return \Illuminate\Http\JsonResponse + */ + public function json($data = [], $status = 200, array $headers = [], $options = 0); + + /** + * Create a new JSONP response instance. + * + * @param string $callback + * @param mixed $data + * @param int $status + * @param array $headers + * @param int $options + * @return \Illuminate\Http\JsonResponse + */ + public function jsonp($callback, $data = [], $status = 200, array $headers = [], $options = 0); + + /** + * Create a new streamed response instance. + * + * @param \Closure $callback + * @param int $status + * @param array $headers + * @return \Symfony\Component\HttpFoundation\StreamedResponse + */ + public function stream($callback, $status = 200, array $headers = []); + + /** + * Create a new streamed response instance as a file download. + * + * @param \Closure $callback + * @param string|null $name + * @param array $headers + * @param string|null $disposition + * @return \Symfony\Component\HttpFoundation\StreamedResponse + */ + public function streamDownload($callback, $name = null, array $headers = [], $disposition = 'attachment'); + + /** + * Create a new file download response. + * + * @param \SplFileInfo|string $file + * @param string|null $name + * @param array $headers + * @param string|null $disposition + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse + */ + public function download($file, $name = null, array $headers = [], $disposition = 'attachment'); + + /** + * Return the raw contents of a binary file. + * + * @param \SplFileInfo|string $file + * @param array $headers + * @return \Symfony\Component\HttpFoundation\BinaryFileResponse + */ + public function file($file, array $headers = []); + + /** + * Create a new redirect response to the given path. + * + * @param string $path + * @param int $status + * @param array $headers + * @param bool|null $secure + * @return \Illuminate\Http\RedirectResponse + */ + public function redirectTo($path, $status = 302, $headers = [], $secure = null); + + /** + * Create a new redirect response to a named route. + * + * @param string $route + * @param mixed $parameters + * @param int $status + * @param array $headers + * @return \Illuminate\Http\RedirectResponse + */ + public function redirectToRoute($route, $parameters = [], $status = 302, $headers = []); + + /** + * Create a new redirect response to a controller action. + * + * @param string $action + * @param mixed $parameters + * @param int $status + * @param array $headers + * @return \Illuminate\Http\RedirectResponse + */ + public function redirectToAction($action, $parameters = [], $status = 302, $headers = []); + + /** + * Create a new redirect response, while putting the current URL in the session. + * + * @param string $path + * @param int $status + * @param array $headers + * @param bool|null $secure + * @return \Illuminate\Http\RedirectResponse + */ + public function redirectGuest($path, $status = 302, $headers = [], $secure = null); + + /** + * Create a new redirect response to the previously intended location. + * + * @param string $default + * @param int $status + * @param array $headers + * @param bool|null $secure + * @return \Illuminate\Http\RedirectResponse + */ + public function redirectToIntended($default = '/', $status = 302, $headers = [], $secure = null); +} diff --git a/vendor/illuminate/contracts/Routing/UrlGenerator.php b/vendor/illuminate/contracts/Routing/UrlGenerator.php new file mode 100644 index 0000000..cca221c --- /dev/null +++ b/vendor/illuminate/contracts/Routing/UrlGenerator.php @@ -0,0 +1,86 @@ +<?php + +namespace Illuminate\Contracts\Routing; + +interface UrlGenerator +{ + /** + * Get the current URL for the request. + * + * @return string + */ + public function current(); + + /** + * Get the URL for the previous request. + * + * @param mixed $fallback + * @return string + */ + public function previous($fallback = false); + + /** + * Generate an absolute URL to the given path. + * + * @param string $path + * @param mixed $extra + * @param bool|null $secure + * @return string + */ + public function to($path, $extra = [], $secure = null); + + /** + * Generate a secure, absolute URL to the given path. + * + * @param string $path + * @param array $parameters + * @return string + */ + public function secure($path, $parameters = []); + + /** + * Generate the URL to an application asset. + * + * @param string $path + * @param bool|null $secure + * @return string + */ + public function asset($path, $secure = null); + + /** + * Get the URL to a named route. + * + * @param string $name + * @param mixed $parameters + * @param bool $absolute + * @return string + * + * @throws \InvalidArgumentException + */ + public function route($name, $parameters = [], $absolute = true); + + /** + * Get the URL to a controller action. + * + * @param string|array $action + * @param mixed $parameters + * @param bool $absolute + * @return string + */ + public function action($action, $parameters = [], $absolute = true); + + /** + * Get the root controller namespace. + * + * @return string + */ + public function getRootControllerNamespace(); + + /** + * Set the root controller namespace. + * + * @param string $rootNamespace + * @return $this + */ + public function setRootControllerNamespace($rootNamespace); +} diff --git a/vendor/illuminate/contracts/Routing/UrlRoutable.php b/vendor/illuminate/contracts/Routing/UrlRoutable.php new file mode 100644 index 0000000..48c3d72 --- /dev/null +++ b/vendor/illuminate/contracts/Routing/UrlRoutable.php @@ -0,0 +1,39 @@ +<?php + +namespace Illuminate\Contracts\Routing; + +interface UrlRoutable +{ + /** + * Get the value of the model's route key. + * + * @return mixed + */ + public function getRouteKey(); + + /** + * Get the route key for the model. + * + * @return string + */ + public function getRouteKeyName(); + + /** + * Retrieve the model for a bound value. + * + * @param mixed $value + * @param string|null $field + * @return \Illuminate\Database\Eloquent\Model|null + */ + public function resolveRouteBinding($value, $field = null); + + /** + * Retrieve the child model for a bound value. + * + * @param string $childType + * @param mixed $value + * @param string|null $field + * @return \Illuminate\Database\Eloquent\Model|null + */ + public function resolveChildRouteBinding($childType, $value, $field); +} diff --git a/vendor/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php b/vendor/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php new file mode 100644 index 0000000..113f420 --- /dev/null +++ b/vendor/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php @@ -0,0 +1,8 @@ +<?php + +namespace Illuminate\Contracts\Session\Middleware; + +interface AuthenticatesSessions +{ + // +} diff --git a/vendor/illuminate/contracts/Session/Session.php b/vendor/illuminate/contracts/Session/Session.php new file mode 100644 index 0000000..1bf025a --- /dev/null +++ b/vendor/illuminate/contracts/Session/Session.php @@ -0,0 +1,204 @@ +<?php + +namespace Illuminate\Contracts\Session; + +interface Session +{ + /** + * Get the name of the session. + * + * @return string + */ + public function getName(); + + /** + * Set the name of the session. + * + * @param string $name + * @return void + */ + public function setName($name); + + /** + * Get the current session ID. + * + * @return string + */ + public function getId(); + + /** + * Set the session ID. + * + * @param string $id + * @return void + */ + public function setId($id); + + /** + * Start the session, reading the data from a handler. + * + * @return bool + */ + public function start(); + + /** + * Save the session data to storage. + * + * @return void + */ + public function save(); + + /** + * Get all of the session data. + * + * @return array + */ + public function all(); + + /** + * Checks if a key exists. + * + * @param string|array $key + * @return bool + */ + public function exists($key); + + /** + * Checks if a key is present and not null. + * + * @param string|array $key + * @return bool + */ + public function has($key); + + /** + * Get an item from the session. + * + * @param string $key + * @param mixed $default + * @return mixed + */ + public function get($key, $default = null); + + /** + * Get the value of a given key and then forget it. + * + * @param string $key + * @param mixed $default + * @return mixed + */ + public function pull($key, $default = null); + + /** + * Put a key / value pair or array of key / value pairs in the session. + * + * @param string|array $key + * @param mixed $value + * @return void + */ + public function put($key, $value = null); + + /** + * Get the CSRF token value. + * + * @return string + */ + public function token(); + + /** + * Regenerate the CSRF token value. + * + * @return void + */ + public function regenerateToken(); + + /** + * Remove an item from the session, returning its value. + * + * @param string $key + * @return mixed + */ + public function remove($key); + + /** + * Remove one or many items from the session. + * + * @param string|array $keys + * @return void + */ + public function forget($keys); + + /** + * Remove all of the items from the session. + * + * @return void + */ + public function flush(); + + /** + * Flush the session data and regenerate the ID. + * + * @return bool + */ + public function invalidate(); + + /** + * Generate a new session identifier. + * + * @param bool $destroy + * @return bool + */ + public function regenerate($destroy = false); + + /** + * Generate a new session ID for the session. + * + * @param bool $destroy + * @return bool + */ + public function migrate($destroy = false); + + /** + * Determine if the session has been started. + * + * @return bool + */ + public function isStarted(); + + /** + * Get the previous URL from the session. + * + * @return string|null + */ + public function previousUrl(); + + /** + * Set the "previous" URL in the session. + * + * @param string $url + * @return void + */ + public function setPreviousUrl($url); + + /** + * Get the session handler instance. + * + * @return \SessionHandlerInterface + */ + public function getHandler(); + + /** + * Determine if the session handler needs a request. + * + * @return bool + */ + public function handlerNeedsRequest(); + + /** + * Set the request on the handler instance. + * + * @param \Illuminate\Http\Request $request + * @return void + */ + public function setRequestOnHandler($request); +} diff --git a/vendor/illuminate/contracts/Support/Arrayable.php b/vendor/illuminate/contracts/Support/Arrayable.php new file mode 100755 index 0000000..3194bd1 --- /dev/null +++ b/vendor/illuminate/contracts/Support/Arrayable.php @@ -0,0 +1,17 @@ +<?php + +namespace Illuminate\Contracts\Support; + +/** + * @template TKey of array-key + * @template TValue + */ +interface Arrayable +{ + /** + * Get the instance as an array. + * + * @return array<TKey, TValue> + */ + public function toArray(); +} diff --git a/vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php b/vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php new file mode 100644 index 0000000..e1be6fe --- /dev/null +++ b/vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php @@ -0,0 +1,14 @@ +<?php + +namespace Illuminate\Contracts\Support; + +interface CanBeEscapedWhenCastToString +{ + /** + * Indicate that the object's string representation should be escaped when __toString is invoked. + * + * @param bool $escape + * @return $this + */ + public function escapeWhenCastingToString($escape = true); +} diff --git a/vendor/illuminate/contracts/Support/DeferrableProvider.php b/vendor/illuminate/contracts/Support/DeferrableProvider.php new file mode 100644 index 0000000..cfecf8b --- /dev/null +++ b/vendor/illuminate/contracts/Support/DeferrableProvider.php @@ -0,0 +1,13 @@ +<?php + +namespace Illuminate\Contracts\Support; + +interface DeferrableProvider +{ + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides(); +} diff --git a/vendor/illuminate/contracts/Support/DeferringDisplayableValue.php b/vendor/illuminate/contracts/Support/DeferringDisplayableValue.php new file mode 100644 index 0000000..ac21d7e --- /dev/null +++ b/vendor/illuminate/contracts/Support/DeferringDisplayableValue.php @@ -0,0 +1,13 @@ +<?php + +namespace Illuminate\Contracts\Support; + +interface DeferringDisplayableValue +{ + /** + * Resolve the displayable value that the class is deferring. + * + * @return \Illuminate\Contracts\Support\Htmlable|string + */ + public function resolveDisplayableValue(); +} diff --git a/vendor/illuminate/contracts/Support/Htmlable.php b/vendor/illuminate/contracts/Support/Htmlable.php new file mode 100644 index 0000000..32f643a --- /dev/null +++ b/vendor/illuminate/contracts/Support/Htmlable.php @@ -0,0 +1,13 @@ +<?php + +namespace Illuminate\Contracts\Support; + +interface Htmlable +{ + /** + * Get content as a string of HTML. + * + * @return string + */ + public function toHtml(); +} diff --git a/vendor/illuminate/contracts/Support/Jsonable.php b/vendor/illuminate/contracts/Support/Jsonable.php new file mode 100755 index 0000000..f5641c3 --- /dev/null +++ b/vendor/illuminate/contracts/Support/Jsonable.php @@ -0,0 +1,14 @@ +<?php + +namespace Illuminate\Contracts\Support; + +interface Jsonable +{ + /** + * Convert the object to its JSON representation. + * + * @param int $options + * @return string + */ + public function toJson($options = 0); +} diff --git a/vendor/illuminate/contracts/Support/MessageBag.php b/vendor/illuminate/contracts/Support/MessageBag.php new file mode 100644 index 0000000..7f708ac --- /dev/null +++ b/vendor/illuminate/contracts/Support/MessageBag.php @@ -0,0 +1,102 @@ +<?php + +namespace Illuminate\Contracts\Support; + +use Countable; + +interface MessageBag extends Arrayable, Countable +{ + /** + * Get the keys present in the message bag. + * + * @return array + */ + public function keys(); + + /** + * Add a message to the bag. + * + * @param string $key + * @param string $message + * @return $this + */ + public function add($key, $message); + + /** + * Merge a new array of messages into the bag. + * + * @param \Illuminate\Contracts\Support\MessageProvider|array $messages + * @return $this + */ + public function merge($messages); + + /** + * Determine if messages exist for a given key. + * + * @param string|array $key + * @return bool + */ + public function has($key); + + /** + * Get the first message from the bag for a given key. + * + * @param string|null $key + * @param string|null $format + * @return string + */ + public function first($key = null, $format = null); + + /** + * Get all of the messages from the bag for a given key. + * + * @param string $key + * @param string|null $format + * @return array + */ + public function get($key, $format = null); + + /** + * Get all of the messages for every key in the bag. + * + * @param string|null $format + * @return array + */ + public function all($format = null); + + /** + * Get the raw messages in the container. + * + * @return array + */ + public function getMessages(); + + /** + * Get the default message format. + * + * @return string + */ + public function getFormat(); + + /** + * Set the default message format. + * + * @param string $format + * @return $this + */ + public function setFormat($format = ':message'); + + /** + * Determine if the message bag has any messages. + * + * @return bool + */ + public function isEmpty(); + + /** + * Determine if the message bag has any messages. + * + * @return bool + */ + public function isNotEmpty(); +} diff --git a/vendor/illuminate/contracts/Support/MessageProvider.php b/vendor/illuminate/contracts/Support/MessageProvider.php new file mode 100755 index 0000000..f15ce73 --- /dev/null +++ b/vendor/illuminate/contracts/Support/MessageProvider.php @@ -0,0 +1,13 @@ +<?php + +namespace Illuminate\Contracts\Support; + +interface MessageProvider +{ + /** + * Get the messages for the instance. + * + * @return \Illuminate\Contracts\Support\MessageBag + */ + public function getMessageBag(); +} diff --git a/vendor/illuminate/contracts/Support/Renderable.php b/vendor/illuminate/contracts/Support/Renderable.php new file mode 100755 index 0000000..25c181e --- /dev/null +++ b/vendor/illuminate/contracts/Support/Renderable.php @@ -0,0 +1,13 @@ +<?php + +namespace Illuminate\Contracts\Support; + +interface Renderable +{ + /** + * Get the evaluated contents of the object. + * + * @return string + */ + public function render(); +} diff --git a/vendor/illuminate/contracts/Support/Responsable.php b/vendor/illuminate/contracts/Support/Responsable.php new file mode 100644 index 0000000..1738ec0 --- /dev/null +++ b/vendor/illuminate/contracts/Support/Responsable.php @@ -0,0 +1,14 @@ +<?php + +namespace Illuminate\Contracts\Support; + +interface Responsable +{ + /** + * Create an HTTP response that represents the object. + * + * @param \Illuminate\Http\Request $request + * @return \Symfony\Component\HttpFoundation\Response + */ + public function toResponse($request); +} diff --git a/vendor/illuminate/contracts/Support/ValidatedData.php b/vendor/illuminate/contracts/Support/ValidatedData.php new file mode 100644 index 0000000..8e7a520 --- /dev/null +++ b/vendor/illuminate/contracts/Support/ValidatedData.php @@ -0,0 +1,11 @@ +<?php + +namespace Illuminate\Contracts\Support; + +use ArrayAccess; +use IteratorAggregate; + +interface ValidatedData extends Arrayable, ArrayAccess, IteratorAggregate +{ + // +} diff --git a/vendor/illuminate/contracts/Translation/HasLocalePreference.php b/vendor/illuminate/contracts/Translation/HasLocalePreference.php new file mode 100644 index 0000000..1b1f16d --- /dev/null +++ b/vendor/illuminate/contracts/Translation/HasLocalePreference.php @@ -0,0 +1,13 @@ +<?php + +namespace Illuminate\Contracts\Translation; + +interface HasLocalePreference +{ + /** + * Get the preferred locale of the entity. + * + * @return string|null + */ + public function preferredLocale(); +} diff --git a/vendor/illuminate/contracts/Translation/Loader.php b/vendor/illuminate/contracts/Translation/Loader.php new file mode 100755 index 0000000..b08418d --- /dev/null +++ b/vendor/illuminate/contracts/Translation/Loader.php @@ -0,0 +1,40 @@ +<?php + +namespace Illuminate\Contracts\Translation; + +interface Loader +{ + /** + * Load the messages for the given locale. + * + * @param string $locale + * @param string $group + * @param string|null $namespace + * @return array + */ + public function load($locale, $group, $namespace = null); + + /** + * Add a new namespace to the loader. + * + * @param string $namespace + * @param string $hint + * @return void + */ + public function addNamespace($namespace, $hint); + + /** + * Add a new JSON path to the loader. + * + * @param string $path + * @return void + */ + public function addJsonPath($path); + + /** + * Get an array of all the registered namespaces. + * + * @return array + */ + public function namespaces(); +} diff --git a/vendor/illuminate/contracts/Translation/Translator.php b/vendor/illuminate/contracts/Translation/Translator.php new file mode 100644 index 0000000..6eae491 --- /dev/null +++ b/vendor/illuminate/contracts/Translation/Translator.php @@ -0,0 +1,42 @@ +<?php + +namespace Illuminate\Contracts\Translation; + +interface Translator +{ + /** + * Get the translation for a given key. + * + * @param string $key + * @param array $replace + * @param string|null $locale + * @return mixed + */ + public function get($key, array $replace = [], $locale = null); + + /** + * Get a translation according to an integer value. + * + * @param string $key + * @param \Countable|int|array $number + * @param array $replace + * @param string|null $locale + * @return string + */ + public function choice($key, $number, array $replace = [], $locale = null); + + /** + * Get the default locale being used. + * + * @return string + */ + public function getLocale(); + + /** + * Set the default locale. + * + * @param string $locale + * @return void + */ + public function setLocale($locale); +} diff --git a/vendor/illuminate/contracts/Validation/DataAwareRule.php b/vendor/illuminate/contracts/Validation/DataAwareRule.php new file mode 100644 index 0000000..7ec7ab5 --- /dev/null +++ b/vendor/illuminate/contracts/Validation/DataAwareRule.php @@ -0,0 +1,14 @@ +<?php + +namespace Illuminate\Contracts\Validation; + +interface DataAwareRule +{ + /** + * Set the data under validation. + * + * @param array $data + * @return $this + */ + public function setData($data); +} diff --git a/vendor/illuminate/contracts/Validation/Factory.php b/vendor/illuminate/contracts/Validation/Factory.php new file mode 100644 index 0000000..104675a --- /dev/null +++ b/vendor/illuminate/contracts/Validation/Factory.php @@ -0,0 +1,46 @@ +<?php + +namespace Illuminate\Contracts\Validation; + +interface Factory +{ + /** + * Create a new Validator instance. + * + * @param array $data + * @param array $rules + * @param array $messages + * @param array $customAttributes + * @return \Illuminate\Contracts\Validation\Validator + */ + public function make(array $data, array $rules, array $messages = [], array $customAttributes = []); + + /** + * Register a custom validator extension. + * + * @param string $rule + * @param \Closure|string $extension + * @param string|null $message + * @return void + */ + public function extend($rule, $extension, $message = null); + + /** + * Register a custom implicit validator extension. + * + * @param string $rule + * @param \Closure|string $extension + * @param string|null $message + * @return void + */ + public function extendImplicit($rule, $extension, $message = null); + + /** + * Register a custom implicit validator message replacer. + * + * @param string $rule + * @param \Closure|string $replacer + * @return void + */ + public function replacer($rule, $replacer); +} diff --git a/vendor/illuminate/contracts/Validation/ImplicitRule.php b/vendor/illuminate/contracts/Validation/ImplicitRule.php new file mode 100644 index 0000000..bbc64f4 --- /dev/null +++ b/vendor/illuminate/contracts/Validation/ImplicitRule.php @@ -0,0 +1,8 @@ +<?php + +namespace Illuminate\Contracts\Validation; + +interface ImplicitRule extends Rule +{ + // +} diff --git a/vendor/illuminate/contracts/Validation/InvokableRule.php b/vendor/illuminate/contracts/Validation/InvokableRule.php new file mode 100644 index 0000000..b703309 --- /dev/null +++ b/vendor/illuminate/contracts/Validation/InvokableRule.php @@ -0,0 +1,16 @@ +<?php + +namespace Illuminate\Contracts\Validation; + +interface InvokableRule +{ + /** + * Run the validation rule. + * + * @param string $attribute + * @param mixed $value + * @param \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString $fail + * @return void + */ + public function __invoke($attribute, $value, $fail); +} diff --git a/vendor/illuminate/contracts/Validation/Rule.php b/vendor/illuminate/contracts/Validation/Rule.php new file mode 100644 index 0000000..cc03777 --- /dev/null +++ b/vendor/illuminate/contracts/Validation/Rule.php @@ -0,0 +1,22 @@ +<?php + +namespace Illuminate\Contracts\Validation; + +interface Rule +{ + /** + * Determine if the validation rule passes. + * + * @param string $attribute + * @param mixed $value + * @return bool + */ + public function passes($attribute, $value); + + /** + * Get the validation error message. + * + * @return string|array + */ + public function message(); +} diff --git a/vendor/illuminate/contracts/Validation/UncompromisedVerifier.php b/vendor/illuminate/contracts/Validation/UncompromisedVerifier.php new file mode 100644 index 0000000..d4bd597 --- /dev/null +++ b/vendor/illuminate/contracts/Validation/UncompromisedVerifier.php @@ -0,0 +1,14 @@ +<?php + +namespace Illuminate\Contracts\Validation; + +interface UncompromisedVerifier +{ + /** + * Verify that the given data has not been compromised in data leaks. + * + * @param array $data + * @return bool + */ + public function verify($data); +} diff --git a/vendor/illuminate/contracts/Validation/ValidatesWhenResolved.php b/vendor/illuminate/contracts/Validation/ValidatesWhenResolved.php new file mode 100644 index 0000000..4e6b757 --- /dev/null +++ b/vendor/illuminate/contracts/Validation/ValidatesWhenResolved.php @@ -0,0 +1,13 @@ +<?php + +namespace Illuminate\Contracts\Validation; + +interface ValidatesWhenResolved +{ + /** + * Validate the given class instance. + * + * @return void + */ + public function validateResolved(); +} diff --git a/vendor/illuminate/contracts/Validation/Validator.php b/vendor/illuminate/contracts/Validation/Validator.php new file mode 100644 index 0000000..f68498d --- /dev/null +++ b/vendor/illuminate/contracts/Validation/Validator.php @@ -0,0 +1,65 @@ +<?php + +namespace Illuminate\Contracts\Validation; + +use Illuminate\Contracts\Support\MessageProvider; + +interface Validator extends MessageProvider +{ + /** + * Run the validator's rules against its data. + * + * @return array + * + * @throws \Illuminate\Validation\ValidationException + */ + public function validate(); + + /** + * Get the attributes and values that were validated. + * + * @return array + * + * @throws \Illuminate\Validation\ValidationException + */ + public function validated(); + + /** + * Determine if the data fails the validation rules. + * + * @return bool + */ + public function fails(); + + /** + * Get the failed validation rules. + * + * @return array + */ + public function failed(); + + /** + * Add conditions to a given field based on a Closure. + * + * @param string|array $attribute + * @param string|array $rules + * @param callable $callback + * @return $this + */ + public function sometimes($attribute, $rules, callable $callback); + + /** + * Add an after validation callback. + * + * @param callable|string $callback + * @return $this + */ + public function after($callback); + + /** + * Get all of the validation error messages. + * + * @return \Illuminate\Support\MessageBag + */ + public function errors(); +} diff --git a/vendor/illuminate/contracts/Validation/ValidatorAwareRule.php b/vendor/illuminate/contracts/Validation/ValidatorAwareRule.php new file mode 100644 index 0000000..053f4fa --- /dev/null +++ b/vendor/illuminate/contracts/Validation/ValidatorAwareRule.php @@ -0,0 +1,14 @@ +<?php + +namespace Illuminate\Contracts\Validation; + +interface ValidatorAwareRule +{ + /** + * Set the current validator. + * + * @param \Illuminate\Validation\Validator $validator + * @return $this + */ + public function setValidator($validator); +} diff --git a/vendor/illuminate/contracts/View/Engine.php b/vendor/illuminate/contracts/View/Engine.php new file mode 100755 index 0000000..be4795d --- /dev/null +++ b/vendor/illuminate/contracts/View/Engine.php @@ -0,0 +1,15 @@ +<?php + +namespace Illuminate\Contracts\View; + +interface Engine +{ + /** + * Get the evaluated contents of the view. + * + * @param string $path + * @param array $data + * @return string + */ + public function get($path, array $data = []); +} diff --git a/vendor/illuminate/contracts/View/Factory.php b/vendor/illuminate/contracts/View/Factory.php new file mode 100644 index 0000000..562ee79 --- /dev/null +++ b/vendor/illuminate/contracts/View/Factory.php @@ -0,0 +1,79 @@ +<?php + +namespace Illuminate\Contracts\View; + +interface Factory +{ + /** + * Determine if a given view exists. + * + * @param string $view + * @return bool + */ + public function exists($view); + + /** + * Get the evaluated view contents for the given path. + * + * @param string $path + * @param \Illuminate\Contracts\Support\Arrayable|array $data + * @param array $mergeData + * @return \Illuminate\Contracts\View\View + */ + public function file($path, $data = [], $mergeData = []); + + /** + * Get the evaluated view contents for the given view. + * + * @param string $view + * @param \Illuminate\Contracts\Support\Arrayable|array $data + * @param array $mergeData + * @return \Illuminate\Contracts\View\View + */ + public function make($view, $data = [], $mergeData = []); + + /** + * Add a piece of shared data to the environment. + * + * @param array|string $key + * @param mixed $value + * @return mixed + */ + public function share($key, $value = null); + + /** + * Register a view composer event. + * + * @param array|string $views + * @param \Closure|string $callback + * @return array + */ + public function composer($views, $callback); + + /** + * Register a view creator event. + * + * @param array|string $views + * @param \Closure|string $callback + * @return array + */ + public function creator($views, $callback); + + /** + * Add a new namespace to the loader. + * + * @param string $namespace + * @param string|array $hints + * @return $this + */ + public function addNamespace($namespace, $hints); + + /** + * Replace the namespace hints for the given namespace. + * + * @param string $namespace + * @param string|array $hints + * @return $this + */ + public function replaceNamespace($namespace, $hints); +} diff --git a/vendor/illuminate/contracts/View/View.php b/vendor/illuminate/contracts/View/View.php new file mode 100644 index 0000000..4b0b7f9 --- /dev/null +++ b/vendor/illuminate/contracts/View/View.php @@ -0,0 +1,31 @@ +<?php + +namespace Illuminate\Contracts\View; + +use Illuminate\Contracts\Support\Renderable; + +interface View extends Renderable +{ + /** + * Get the name of the view. + * + * @return string + */ + public function name(); + + /** + * Add a piece of data to the view. + * + * @param string|array $key + * @param mixed $value + * @return $this + */ + public function with($key, $value = null); + + /** + * Get the array of view data. + * + * @return array + */ + public function getData(); +} diff --git a/vendor/illuminate/contracts/View/ViewCompilationException.php b/vendor/illuminate/contracts/View/ViewCompilationException.php new file mode 100644 index 0000000..5c57619 --- /dev/null +++ b/vendor/illuminate/contracts/View/ViewCompilationException.php @@ -0,0 +1,10 @@ +<?php + +namespace Illuminate\Contracts\View; + +use Exception; + +class ViewCompilationException extends Exception +{ + // +} diff --git a/vendor/illuminate/contracts/composer.json b/vendor/illuminate/contracts/composer.json new file mode 100644 index 0000000..9296ba9 --- /dev/null +++ b/vendor/illuminate/contracts/composer.json @@ -0,0 +1,35 @@ +{ + "name": "illuminate/contracts", + "description": "The Illuminate Contracts package.", + "license": "MIT", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "require": { + "php": "^8.0.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/simple-cache": "^1.0|^2.0|^3.0" + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev" +} diff --git a/vendor/illuminate/events/CallQueuedListener.php b/vendor/illuminate/events/CallQueuedListener.php new file mode 100644 index 0000000..6a39008 --- /dev/null +++ b/vendor/illuminate/events/CallQueuedListener.php @@ -0,0 +1,180 @@ +<?php + +namespace Illuminate\Events; + +use Illuminate\Bus\Queueable; +use Illuminate\Container\Container; +use Illuminate\Contracts\Queue\Job; +use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Queue\InteractsWithQueue; + +class CallQueuedListener implements ShouldQueue +{ + use InteractsWithQueue, Queueable; + + /** + * The listener class name. + * + * @var string + */ + public $class; + + /** + * The listener method. + * + * @var string + */ + public $method; + + /** + * The data to be passed to the listener. + * + * @var array + */ + public $data; + + /** + * The number of times the job may be attempted. + * + * @var int + */ + public $tries; + + /** + * The maximum number of exceptions allowed, regardless of attempts. + * + * @var int + */ + public $maxExceptions; + + /** + * The number of seconds to wait before retrying a job that encountered an uncaught exception. + * + * @var int + */ + public $backoff; + + /** + * The timestamp indicating when the job should timeout. + * + * @var int + */ + public $retryUntil; + + /** + * The number of seconds the job can run before timing out. + * + * @var int + */ + public $timeout; + + /** + * Indicates if the job should be encrypted. + * + * @var bool + */ + public $shouldBeEncrypted = false; + + /** + * Create a new job instance. + * + * @param string $class + * @param string $method + * @param array $data + * @return void + */ + public function __construct($class, $method, $data) + { + $this->data = $data; + $this->class = $class; + $this->method = $method; + } + + /** + * Handle the queued job. + * + * @param \Illuminate\Container\Container $container + * @return void + */ + public function handle(Container $container) + { + $this->prepareData(); + + $handler = $this->setJobInstanceIfNecessary( + $this->job, $container->make($this->class) + ); + + $handler->{$this->method}(...array_values($this->data)); + } + + /** + * Set the job instance of the given class if necessary. + * + * @param \Illuminate\Contracts\Queue\Job $job + * @param object $instance + * @return object + */ + protected function setJobInstanceIfNecessary(Job $job, $instance) + { + if (in_array(InteractsWithQueue::class, class_uses_recursive($instance))) { + $instance->setJob($job); + } + + return $instance; + } + + /** + * Call the failed method on the job instance. + * + * The event instance and the exception will be passed. + * + * @param \Throwable $e + * @return void + */ + public function failed($e) + { + $this->prepareData(); + + $handler = Container::getInstance()->make($this->class); + + $parameters = array_merge(array_values($this->data), [$e]); + + if (method_exists($handler, 'failed')) { + $handler->failed(...$parameters); + } + } + + /** + * Unserialize the data if needed. + * + * @return void + */ + protected function prepareData() + { + if (is_string($this->data)) { + $this->data = unserialize($this->data); + } + } + + /** + * Get the display name for the queued job. + * + * @return string + */ + public function displayName() + { + return $this->class; + } + + /** + * Prepare the instance for cloning. + * + * @return void + */ + public function __clone() + { + $this->data = array_map(function ($data) { + return is_object($data) ? clone $data : $data; + }, $this->data); + } +} diff --git a/vendor/illuminate/events/Dispatcher.php b/vendor/illuminate/events/Dispatcher.php new file mode 100755 index 0000000..1876897 --- /dev/null +++ b/vendor/illuminate/events/Dispatcher.php @@ -0,0 +1,705 @@ +<?php + +namespace Illuminate\Events; + +use Closure; +use Exception; +use Illuminate\Container\Container; +use Illuminate\Contracts\Broadcasting\Factory as BroadcastFactory; +use Illuminate\Contracts\Broadcasting\ShouldBroadcast; +use Illuminate\Contracts\Container\Container as ContainerContract; +use Illuminate\Contracts\Events\Dispatcher as DispatcherContract; +use Illuminate\Contracts\Queue\ShouldBeEncrypted; +use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Support\Arr; +use Illuminate\Support\Str; +use Illuminate\Support\Traits\Macroable; +use Illuminate\Support\Traits\ReflectsClosures; +use ReflectionClass; + +class Dispatcher implements DispatcherContract +{ + use Macroable, ReflectsClosures; + + /** + * The IoC container instance. + * + * @var \Illuminate\Contracts\Container\Container + */ + protected $container; + + /** + * The registered event listeners. + * + * @var array + */ + protected $listeners = []; + + /** + * The wildcard listeners. + * + * @var array + */ + protected $wildcards = []; + + /** + * The cached wildcard listeners. + * + * @var array + */ + protected $wildcardsCache = []; + + /** + * The queue resolver instance. + * + * @var callable + */ + protected $queueResolver; + + /** + * Create a new event dispatcher instance. + * + * @param \Illuminate\Contracts\Container\Container|null $container + * @return void + */ + public function __construct(ContainerContract $container = null) + { + $this->container = $container ?: new Container; + } + + /** + * Register an event listener with the dispatcher. + * + * @param \Closure|string|array $events + * @param \Closure|string|array|null $listener + * @return void + */ + public function listen($events, $listener = null) + { + if ($events instanceof Closure) { + return collect($this->firstClosureParameterTypes($events)) + ->each(function ($event) use ($events) { + $this->listen($event, $events); + }); + } elseif ($events instanceof QueuedClosure) { + return collect($this->firstClosureParameterTypes($events->closure)) + ->each(function ($event) use ($events) { + $this->listen($event, $events->resolve()); + }); + } elseif ($listener instanceof QueuedClosure) { + $listener = $listener->resolve(); + } + + foreach ((array) $events as $event) { + if (str_contains($event, '*')) { + $this->setupWildcardListen($event, $listener); + } else { + $this->listeners[$event][] = $listener; + } + } + } + + /** + * Setup a wildcard listener callback. + * + * @param string $event + * @param \Closure|string $listener + * @return void + */ + protected function setupWildcardListen($event, $listener) + { + $this->wildcards[$event][] = $listener; + + $this->wildcardsCache = []; + } + + /** + * Determine if a given event has listeners. + * + * @param string $eventName + * @return bool + */ + public function hasListeners($eventName) + { + return isset($this->listeners[$eventName]) || + isset($this->wildcards[$eventName]) || + $this->hasWildcardListeners($eventName); + } + + /** + * Determine if the given event has any wildcard listeners. + * + * @param string $eventName + * @return bool + */ + public function hasWildcardListeners($eventName) + { + foreach ($this->wildcards as $key => $listeners) { + if (Str::is($key, $eventName)) { + return true; + } + } + + return false; + } + + /** + * Register an event and payload to be fired later. + * + * @param string $event + * @param object|array $payload + * @return void + */ + public function push($event, $payload = []) + { + $this->listen($event.'_pushed', function () use ($event, $payload) { + $this->dispatch($event, $payload); + }); + } + + /** + * Flush a set of pushed events. + * + * @param string $event + * @return void + */ + public function flush($event) + { + $this->dispatch($event.'_pushed'); + } + + /** + * Register an event subscriber with the dispatcher. + * + * @param object|string $subscriber + * @return void + */ + public function subscribe($subscriber) + { + $subscriber = $this->resolveSubscriber($subscriber); + + $events = $subscriber->subscribe($this); + + if (is_array($events)) { + foreach ($events as $event => $listeners) { + foreach (Arr::wrap($listeners) as $listener) { + if (is_string($listener) && method_exists($subscriber, $listener)) { + $this->listen($event, [get_class($subscriber), $listener]); + + continue; + } + + $this->listen($event, $listener); + } + } + } + } + + /** + * Resolve the subscriber instance. + * + * @param object|string $subscriber + * @return mixed + */ + protected function resolveSubscriber($subscriber) + { + if (is_string($subscriber)) { + return $this->container->make($subscriber); + } + + return $subscriber; + } + + /** + * Fire an event until the first non-null response is returned. + * + * @param string|object $event + * @param mixed $payload + * @return array|null + */ + public function until($event, $payload = []) + { + return $this->dispatch($event, $payload, true); + } + + /** + * Fire an event and call the listeners. + * + * @param string|object $event + * @param mixed $payload + * @param bool $halt + * @return array|null + */ + public function dispatch($event, $payload = [], $halt = false) + { + // When the given "event" is actually an object we will assume it is an event + // object and use the class as the event name and this event itself as the + // payload to the handler, which makes object based events quite simple. + [$event, $payload] = $this->parseEventAndPayload( + $event, $payload + ); + + if ($this->shouldBroadcast($payload)) { + $this->broadcastEvent($payload[0]); + } + + $responses = []; + + foreach ($this->getListeners($event) as $listener) { + $response = $listener($event, $payload); + + // If a response is returned from the listener and event halting is enabled + // we will just return this response, and not call the rest of the event + // listeners. Otherwise we will add the response on the response list. + if ($halt && ! is_null($response)) { + return $response; + } + + // If a boolean false is returned from a listener, we will stop propagating + // the event to any further listeners down in the chain, else we keep on + // looping through the listeners and firing every one in our sequence. + if ($response === false) { + break; + } + + $responses[] = $response; + } + + return $halt ? null : $responses; + } + + /** + * Parse the given event and payload and prepare them for dispatching. + * + * @param mixed $event + * @param mixed $payload + * @return array + */ + protected function parseEventAndPayload($event, $payload) + { + if (is_object($event)) { + [$payload, $event] = [[$event], get_class($event)]; + } + + return [$event, Arr::wrap($payload)]; + } + + /** + * Determine if the payload has a broadcastable event. + * + * @param array $payload + * @return bool + */ + protected function shouldBroadcast(array $payload) + { + return isset($payload[0]) && + $payload[0] instanceof ShouldBroadcast && + $this->broadcastWhen($payload[0]); + } + + /** + * Check if the event should be broadcasted by the condition. + * + * @param mixed $event + * @return bool + */ + protected function broadcastWhen($event) + { + return method_exists($event, 'broadcastWhen') + ? $event->broadcastWhen() : true; + } + + /** + * Broadcast the given event class. + * + * @param \Illuminate\Contracts\Broadcasting\ShouldBroadcast $event + * @return void + */ + protected function broadcastEvent($event) + { + $this->container->make(BroadcastFactory::class)->queue($event); + } + + /** + * Get all of the listeners for a given event name. + * + * @param string $eventName + * @return array + */ + public function getListeners($eventName) + { + $listeners = array_merge( + $this->prepareListeners($eventName), + $this->wildcardsCache[$eventName] ?? $this->getWildcardListeners($eventName) + ); + + return class_exists($eventName, false) + ? $this->addInterfaceListeners($eventName, $listeners) + : $listeners; + } + + /** + * Get the wildcard listeners for the event. + * + * @param string $eventName + * @return array + */ + protected function getWildcardListeners($eventName) + { + $wildcards = []; + + foreach ($this->wildcards as $key => $listeners) { + if (Str::is($key, $eventName)) { + foreach ($listeners as $listener) { + $wildcards[] = $this->makeListener($listener, true); + } + } + } + + return $this->wildcardsCache[$eventName] = $wildcards; + } + + /** + * Add the listeners for the event's interfaces to the given array. + * + * @param string $eventName + * @param array $listeners + * @return array + */ + protected function addInterfaceListeners($eventName, array $listeners = []) + { + foreach (class_implements($eventName) as $interface) { + if (isset($this->listeners[$interface])) { + foreach ($this->prepareListeners($interface) as $names) { + $listeners = array_merge($listeners, (array) $names); + } + } + } + + return $listeners; + } + + /** + * Prepare the listeners for a given event. + * + * @param string $eventName + * @return \Closure[] + */ + protected function prepareListeners(string $eventName) + { + $listeners = []; + + foreach ($this->listeners[$eventName] ?? [] as $listener) { + $listeners[] = $this->makeListener($listener); + } + + return $listeners; + } + + /** + * Register an event listener with the dispatcher. + * + * @param \Closure|string|array $listener + * @param bool $wildcard + * @return \Closure + */ + public function makeListener($listener, $wildcard = false) + { + if (is_string($listener)) { + return $this->createClassListener($listener, $wildcard); + } + + if (is_array($listener) && isset($listener[0]) && is_string($listener[0])) { + return $this->createClassListener($listener, $wildcard); + } + + return function ($event, $payload) use ($listener, $wildcard) { + if ($wildcard) { + return $listener($event, $payload); + } + + return $listener(...array_values($payload)); + }; + } + + /** + * Create a class based listener using the IoC container. + * + * @param string $listener + * @param bool $wildcard + * @return \Closure + */ + public function createClassListener($listener, $wildcard = false) + { + return function ($event, $payload) use ($listener, $wildcard) { + if ($wildcard) { + return call_user_func($this->createClassCallable($listener), $event, $payload); + } + + $callable = $this->createClassCallable($listener); + + return $callable(...array_values($payload)); + }; + } + + /** + * Create the class based event callable. + * + * @param array|string $listener + * @return callable + */ + protected function createClassCallable($listener) + { + [$class, $method] = is_array($listener) + ? $listener + : $this->parseClassCallable($listener); + + if (! method_exists($class, $method)) { + $method = '__invoke'; + } + + if ($this->handlerShouldBeQueued($class)) { + return $this->createQueuedHandlerCallable($class, $method); + } + + $listener = $this->container->make($class); + + return $this->handlerShouldBeDispatchedAfterDatabaseTransactions($listener) + ? $this->createCallbackForListenerRunningAfterCommits($listener, $method) + : [$listener, $method]; + } + + /** + * Parse the class listener into class and method. + * + * @param string $listener + * @return array + */ + protected function parseClassCallable($listener) + { + return Str::parseCallback($listener, 'handle'); + } + + /** + * Determine if the event handler class should be queued. + * + * @param string $class + * @return bool + */ + protected function handlerShouldBeQueued($class) + { + try { + return (new ReflectionClass($class))->implementsInterface( + ShouldQueue::class + ); + } catch (Exception $e) { + return false; + } + } + + /** + * Create a callable for putting an event handler on the queue. + * + * @param string $class + * @param string $method + * @return \Closure + */ + protected function createQueuedHandlerCallable($class, $method) + { + return function () use ($class, $method) { + $arguments = array_map(function ($a) { + return is_object($a) ? clone $a : $a; + }, func_get_args()); + + if ($this->handlerWantsToBeQueued($class, $arguments)) { + $this->queueHandler($class, $method, $arguments); + } + }; + } + + /** + * Determine if the given event handler should be dispatched after all database transactions have committed. + * + * @param object|mixed $listener + * @return bool + */ + protected function handlerShouldBeDispatchedAfterDatabaseTransactions($listener) + { + return ($listener->afterCommit ?? null) && $this->container->bound('db.transactions'); + } + + /** + * Create a callable for dispatching a listener after database transactions. + * + * @param mixed $listener + * @param string $method + * @return \Closure + */ + protected function createCallbackForListenerRunningAfterCommits($listener, $method) + { + return function () use ($method, $listener) { + $payload = func_get_args(); + + $this->container->make('db.transactions')->addCallback( + function () use ($listener, $method, $payload) { + $listener->$method(...$payload); + } + ); + }; + } + + /** + * Determine if the event handler wants to be queued. + * + * @param string $class + * @param array $arguments + * @return bool + */ + protected function handlerWantsToBeQueued($class, $arguments) + { + $instance = $this->container->make($class); + + if (method_exists($instance, 'shouldQueue')) { + return $instance->shouldQueue($arguments[0]); + } + + return true; + } + + /** + * Queue the handler class. + * + * @param string $class + * @param string $method + * @param array $arguments + * @return void + */ + protected function queueHandler($class, $method, $arguments) + { + [$listener, $job] = $this->createListenerAndJob($class, $method, $arguments); + + $connection = $this->resolveQueue()->connection(method_exists($listener, 'viaConnection') + ? (isset($arguments[0]) ? $listener->viaConnection($arguments[0]) : $listener->viaConnection()) + : $listener->connection ?? null); + + $queue = method_exists($listener, 'viaQueue') + ? (isset($arguments[0]) ? $listener->viaQueue($arguments[0]) : $listener->viaQueue()) + : $listener->queue ?? null; + + isset($listener->delay) + ? $connection->laterOn($queue, $listener->delay, $job) + : $connection->pushOn($queue, $job); + } + + /** + * Create the listener and job for a queued listener. + * + * @param string $class + * @param string $method + * @param array $arguments + * @return array + */ + protected function createListenerAndJob($class, $method, $arguments) + { + $listener = (new ReflectionClass($class))->newInstanceWithoutConstructor(); + + return [$listener, $this->propagateListenerOptions( + $listener, new CallQueuedListener($class, $method, $arguments) + )]; + } + + /** + * Propagate listener options to the job. + * + * @param mixed $listener + * @param \Illuminate\Events\CallQueuedListener $job + * @return mixed + */ + protected function propagateListenerOptions($listener, $job) + { + return tap($job, function ($job) use ($listener) { + $data = array_values($job->data); + + $job->afterCommit = property_exists($listener, 'afterCommit') ? $listener->afterCommit : null; + $job->backoff = method_exists($listener, 'backoff') ? $listener->backoff(...$data) : ($listener->backoff ?? null); + $job->maxExceptions = $listener->maxExceptions ?? null; + $job->retryUntil = method_exists($listener, 'retryUntil') ? $listener->retryUntil(...$data) : null; + $job->shouldBeEncrypted = $listener instanceof ShouldBeEncrypted; + $job->timeout = $listener->timeout ?? null; + $job->tries = $listener->tries ?? null; + + $job->through(array_merge( + method_exists($listener, 'middleware') ? $listener->middleware(...$data) : [], + $listener->middleware ?? [] + )); + }); + } + + /** + * Remove a set of listeners from the dispatcher. + * + * @param string $event + * @return void + */ + public function forget($event) + { + if (str_contains($event, '*')) { + unset($this->wildcards[$event]); + } else { + unset($this->listeners[$event]); + } + + foreach ($this->wildcardsCache as $key => $listeners) { + if (Str::is($event, $key)) { + unset($this->wildcardsCache[$key]); + } + } + } + + /** + * Forget all of the pushed listeners. + * + * @return void + */ + public function forgetPushed() + { + foreach ($this->listeners as $key => $value) { + if (str_ends_with($key, '_pushed')) { + $this->forget($key); + } + } + } + + /** + * Get the queue implementation from the resolver. + * + * @return \Illuminate\Contracts\Queue\Queue + */ + protected function resolveQueue() + { + return call_user_func($this->queueResolver); + } + + /** + * Set the queue resolver implementation. + * + * @param callable $resolver + * @return $this + */ + public function setQueueResolver(callable $resolver) + { + $this->queueResolver = $resolver; + + return $this; + } + + /** + * Gets the raw, unprepared listeners. + * + * @return array + */ + public function getRawListeners() + { + return $this->listeners; + } +} diff --git a/vendor/illuminate/events/EventServiceProvider.php b/vendor/illuminate/events/EventServiceProvider.php new file mode 100755 index 0000000..15fb60b --- /dev/null +++ b/vendor/illuminate/events/EventServiceProvider.php @@ -0,0 +1,23 @@ +<?php + +namespace Illuminate\Events; + +use Illuminate\Contracts\Queue\Factory as QueueFactoryContract; +use Illuminate\Support\ServiceProvider; + +class EventServiceProvider extends ServiceProvider +{ + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + $this->app->singleton('events', function ($app) { + return (new Dispatcher($app))->setQueueResolver(function () use ($app) { + return $app->make(QueueFactoryContract::class); + }); + }); + } +} diff --git a/vendor/illuminate/events/InvokeQueuedClosure.php b/vendor/illuminate/events/InvokeQueuedClosure.php new file mode 100644 index 0000000..bc68b19 --- /dev/null +++ b/vendor/illuminate/events/InvokeQueuedClosure.php @@ -0,0 +1,34 @@ +<?php + +namespace Illuminate\Events; + +class InvokeQueuedClosure +{ + /** + * Handle the event. + * + * @param \Laravel\SerializableClosure\SerializableClosure $closure + * @param array $arguments + * @return void + */ + public function handle($closure, array $arguments) + { + call_user_func($closure->getClosure(), ...$arguments); + } + + /** + * Handle a job failure. + * + * @param \Laravel\SerializableClosure\SerializableClosure $closure + * @param array $arguments + * @param array $catchCallbacks + * @param \Throwable $exception + * @return void + */ + public function failed($closure, array $arguments, array $catchCallbacks, $exception) + { + $arguments[] = $exception; + + collect($catchCallbacks)->each->__invoke(...$arguments); + } +} diff --git a/vendor/illuminate/events/LICENSE.md b/vendor/illuminate/events/LICENSE.md new file mode 100644 index 0000000..79810c8 --- /dev/null +++ b/vendor/illuminate/events/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Taylor Otwell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/illuminate/events/NullDispatcher.php b/vendor/illuminate/events/NullDispatcher.php new file mode 100644 index 0000000..3164fbb --- /dev/null +++ b/vendor/illuminate/events/NullDispatcher.php @@ -0,0 +1,144 @@ +<?php + +namespace Illuminate\Events; + +use Illuminate\Contracts\Events\Dispatcher as DispatcherContract; +use Illuminate\Support\Traits\ForwardsCalls; + +class NullDispatcher implements DispatcherContract +{ + use ForwardsCalls; + + /** + * The underlying event dispatcher instance. + * + * @var \Illuminate\Contracts\Events\Dispatcher + */ + protected $dispatcher; + + /** + * Create a new event dispatcher instance that does not fire. + * + * @param \Illuminate\Contracts\Events\Dispatcher $dispatcher + * @return void + */ + public function __construct(DispatcherContract $dispatcher) + { + $this->dispatcher = $dispatcher; + } + + /** + * Don't fire an event. + * + * @param string|object $event + * @param mixed $payload + * @param bool $halt + * @return void + */ + public function dispatch($event, $payload = [], $halt = false) + { + // + } + + /** + * Don't register an event and payload to be fired later. + * + * @param string $event + * @param array $payload + * @return void + */ + public function push($event, $payload = []) + { + // + } + + /** + * Don't dispatch an event. + * + * @param string|object $event + * @param mixed $payload + * @return array|null + */ + public function until($event, $payload = []) + { + // + } + + /** + * Register an event listener with the dispatcher. + * + * @param \Closure|string|array $events + * @param \Closure|string|array|null $listener + * @return void + */ + public function listen($events, $listener = null) + { + $this->dispatcher->listen($events, $listener); + } + + /** + * Determine if a given event has listeners. + * + * @param string $eventName + * @return bool + */ + public function hasListeners($eventName) + { + return $this->dispatcher->hasListeners($eventName); + } + + /** + * Register an event subscriber with the dispatcher. + * + * @param object|string $subscriber + * @return void + */ + public function subscribe($subscriber) + { + $this->dispatcher->subscribe($subscriber); + } + + /** + * Flush a set of pushed events. + * + * @param string $event + * @return void + */ + public function flush($event) + { + $this->dispatcher->flush($event); + } + + /** + * Remove a set of listeners from the dispatcher. + * + * @param string $event + * @return void + */ + public function forget($event) + { + $this->dispatcher->forget($event); + } + + /** + * Forget all of the queued listeners. + * + * @return void + */ + public function forgetPushed() + { + $this->dispatcher->forgetPushed(); + } + + /** + * Dynamically pass method calls to the underlying dispatcher. + * + * @param string $method + * @param array $parameters + * @return mixed + */ + public function __call($method, $parameters) + { + return $this->forwardDecoratedCallTo($this->dispatcher, $method, $parameters); + } +} diff --git a/vendor/illuminate/events/QueuedClosure.php b/vendor/illuminate/events/QueuedClosure.php new file mode 100644 index 0000000..31a462a --- /dev/null +++ b/vendor/illuminate/events/QueuedClosure.php @@ -0,0 +1,125 @@ +<?php + +namespace Illuminate\Events; + +use Closure; +use Laravel\SerializableClosure\SerializableClosure; + +class QueuedClosure +{ + /** + * The underlying Closure. + * + * @var \Closure + */ + public $closure; + + /** + * The name of the connection the job should be sent to. + * + * @var string|null + */ + public $connection; + + /** + * The name of the queue the job should be sent to. + * + * @var string|null + */ + public $queue; + + /** + * The number of seconds before the job should be made available. + * + * @var \DateTimeInterface|\DateInterval|int|null + */ + public $delay; + + /** + * All of the "catch" callbacks for the queued closure. + * + * @var array + */ + public $catchCallbacks = []; + + /** + * Create a new queued closure event listener resolver. + * + * @param \Closure $closure + * @return void + */ + public function __construct(Closure $closure) + { + $this->closure = $closure; + } + + /** + * Set the desired connection for the job. + * + * @param string|null $connection + * @return $this + */ + public function onConnection($connection) + { + $this->connection = $connection; + + return $this; + } + + /** + * Set the desired queue for the job. + * + * @param string|null $queue + * @return $this + */ + public function onQueue($queue) + { + $this->queue = $queue; + + return $this; + } + + /** + * Set the desired delay in seconds for the job. + * + * @param \DateTimeInterface|\DateInterval|int|null $delay + * @return $this + */ + public function delay($delay) + { + $this->delay = $delay; + + return $this; + } + + /** + * Specify a callback that should be invoked if the queued listener job fails. + * + * @param \Closure $closure + * @return $this + */ + public function catch(Closure $closure) + { + $this->catchCallbacks[] = $closure; + + return $this; + } + + /** + * Resolve the actual event listener callback. + * + * @return \Closure + */ + public function resolve() + { + return function (...$arguments) { + dispatch(new CallQueuedListener(InvokeQueuedClosure::class, 'handle', [ + 'closure' => new SerializableClosure($this->closure), + 'arguments' => $arguments, + 'catch' => collect($this->catchCallbacks)->map(function ($callback) { + return new SerializableClosure($callback); + })->all(), + ]))->onConnection($this->connection)->onQueue($this->queue)->delay($this->delay); + }; + } +} diff --git a/vendor/illuminate/events/composer.json b/vendor/illuminate/events/composer.json new file mode 100755 index 0000000..d074212 --- /dev/null +++ b/vendor/illuminate/events/composer.json @@ -0,0 +1,42 @@ +{ + "name": "illuminate/events", + "description": "The Illuminate Events package.", + "license": "MIT", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "require": { + "php": "^8.0.2", + "illuminate/bus": "^9.0", + "illuminate/collections": "^9.0", + "illuminate/container": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/macroable": "^9.0", + "illuminate/support": "^9.0" + }, + "autoload": { + "psr-4": { + "Illuminate\\Events\\": "" + }, + "files": [ + "functions.php" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev" +} diff --git a/vendor/illuminate/events/functions.php b/vendor/illuminate/events/functions.php new file mode 100644 index 0000000..df1b0fe --- /dev/null +++ b/vendor/illuminate/events/functions.php @@ -0,0 +1,18 @@ +<?php + +namespace Illuminate\Events; + +use Closure; + +if (! function_exists('Illuminate\Events\queueable')) { + /** + * Create a new queued Closure event listener. + * + * @param \Closure $closure + * @return \Illuminate\Events\QueuedClosure + */ + function queueable(Closure $closure) + { + return new QueuedClosure($closure); + } +} diff --git a/vendor/illuminate/macroable/LICENSE.md b/vendor/illuminate/macroable/LICENSE.md new file mode 100644 index 0000000..79810c8 --- /dev/null +++ b/vendor/illuminate/macroable/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Taylor Otwell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/illuminate/macroable/Traits/Macroable.php b/vendor/illuminate/macroable/Traits/Macroable.php new file mode 100644 index 0000000..2269142 --- /dev/null +++ b/vendor/illuminate/macroable/Traits/Macroable.php @@ -0,0 +1,126 @@ +<?php + +namespace Illuminate\Support\Traits; + +use BadMethodCallException; +use Closure; +use ReflectionClass; +use ReflectionMethod; + +trait Macroable +{ + /** + * The registered string macros. + * + * @var array + */ + protected static $macros = []; + + /** + * Register a custom macro. + * + * @param string $name + * @param object|callable $macro + * @return void + */ + public static function macro($name, $macro) + { + static::$macros[$name] = $macro; + } + + /** + * Mix another object into the class. + * + * @param object $mixin + * @param bool $replace + * @return void + * + * @throws \ReflectionException + */ + public static function mixin($mixin, $replace = true) + { + $methods = (new ReflectionClass($mixin))->getMethods( + ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED + ); + + foreach ($methods as $method) { + if ($replace || ! static::hasMacro($method->name)) { + $method->setAccessible(true); + static::macro($method->name, $method->invoke($mixin)); + } + } + } + + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + */ + public static function hasMacro($name) + { + return isset(static::$macros[$name]); + } + + /** + * Flush the existing macros. + * + * @return void + */ + public static function flushMacros() + { + static::$macros = []; + } + + /** + * Dynamically handle calls to the class. + * + * @param string $method + * @param array $parameters + * @return mixed + * + * @throws \BadMethodCallException + */ + public static function __callStatic($method, $parameters) + { + if (! static::hasMacro($method)) { + throw new BadMethodCallException(sprintf( + 'Method %s::%s does not exist.', static::class, $method + )); + } + + $macro = static::$macros[$method]; + + if ($macro instanceof Closure) { + $macro = $macro->bindTo(null, static::class); + } + + return $macro(...$parameters); + } + + /** + * Dynamically handle calls to the class. + * + * @param string $method + * @param array $parameters + * @return mixed + * + * @throws \BadMethodCallException + */ + public function __call($method, $parameters) + { + if (! static::hasMacro($method)) { + throw new BadMethodCallException(sprintf( + 'Method %s::%s does not exist.', static::class, $method + )); + } + + $macro = static::$macros[$method]; + + if ($macro instanceof Closure) { + $macro = $macro->bindTo($this, static::class); + } + + return $macro(...$parameters); + } +} diff --git a/vendor/illuminate/macroable/composer.json b/vendor/illuminate/macroable/composer.json new file mode 100644 index 0000000..0417dbe --- /dev/null +++ b/vendor/illuminate/macroable/composer.json @@ -0,0 +1,33 @@ +{ + "name": "illuminate/macroable", + "description": "The Illuminate Macroable package.", + "license": "MIT", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "require": { + "php": "^8.0.2" + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev" +} diff --git a/vendor/illuminate/pipeline/Hub.php b/vendor/illuminate/pipeline/Hub.php new file mode 100644 index 0000000..91e9b3f --- /dev/null +++ b/vendor/illuminate/pipeline/Hub.php @@ -0,0 +1,97 @@ +<?php + +namespace Illuminate\Pipeline; + +use Closure; +use Illuminate\Contracts\Container\Container; +use Illuminate\Contracts\Pipeline\Hub as HubContract; + +class Hub implements HubContract +{ + /** + * The container implementation. + * + * @var \Illuminate\Contracts\Container\Container|null + */ + protected $container; + + /** + * All of the available pipelines. + * + * @var array + */ + protected $pipelines = []; + + /** + * Create a new Hub instance. + * + * @param \Illuminate\Contracts\Container\Container|null $container + * @return void + */ + public function __construct(Container $container = null) + { + $this->container = $container; + } + + /** + * Define the default named pipeline. + * + * @param \Closure $callback + * @return void + */ + public function defaults(Closure $callback) + { + return $this->pipeline('default', $callback); + } + + /** + * Define a new named pipeline. + * + * @param string $name + * @param \Closure $callback + * @return void + */ + public function pipeline($name, Closure $callback) + { + $this->pipelines[$name] = $callback; + } + + /** + * Send an object through one of the available pipelines. + * + * @param mixed $object + * @param string|null $pipeline + * @return mixed + */ + public function pipe($object, $pipeline = null) + { + $pipeline = $pipeline ?: 'default'; + + return call_user_func( + $this->pipelines[$pipeline], new Pipeline($this->container), $object + ); + } + + /** + * Get the container instance used by the hub. + * + * @return \Illuminate\Contracts\Container\Container + */ + public function getContainer() + { + return $this->container; + } + + /** + * Set the container instance used by the hub. + * + * @param \Illuminate\Contracts\Container\Container $container + * @return $this + */ + public function setContainer(Container $container) + { + $this->container = $container; + + return $this; + } +} diff --git a/vendor/illuminate/pipeline/LICENSE.md b/vendor/illuminate/pipeline/LICENSE.md new file mode 100644 index 0000000..79810c8 --- /dev/null +++ b/vendor/illuminate/pipeline/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Taylor Otwell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/illuminate/pipeline/Pipeline.php b/vendor/illuminate/pipeline/Pipeline.php new file mode 100644 index 0000000..53b9fef --- /dev/null +++ b/vendor/illuminate/pipeline/Pipeline.php @@ -0,0 +1,271 @@ +<?php + +namespace Illuminate\Pipeline; + +use Closure; +use Illuminate\Contracts\Container\Container; +use Illuminate\Contracts\Pipeline\Pipeline as PipelineContract; +use RuntimeException; +use Throwable; + +class Pipeline implements PipelineContract +{ + /** + * The container implementation. + * + * @var \Illuminate\Contracts\Container\Container|null + */ + protected $container; + + /** + * The object being passed through the pipeline. + * + * @var mixed + */ + protected $passable; + + /** + * The array of class pipes. + * + * @var array + */ + protected $pipes = []; + + /** + * The method to call on each pipe. + * + * @var string + */ + protected $method = 'handle'; + + /** + * Create a new class instance. + * + * @param \Illuminate\Contracts\Container\Container|null $container + * @return void + */ + public function __construct(Container $container = null) + { + $this->container = $container; + } + + /** + * Set the object being sent through the pipeline. + * + * @param mixed $passable + * @return $this + */ + public function send($passable) + { + $this->passable = $passable; + + return $this; + } + + /** + * Set the array of pipes. + * + * @param array|mixed $pipes + * @return $this + */ + public function through($pipes) + { + $this->pipes = is_array($pipes) ? $pipes : func_get_args(); + + return $this; + } + + /** + * Push additional pipes onto the pipeline. + * + * @param array|mixed $pipes + * @return $this + */ + public function pipe($pipes) + { + array_push($this->pipes, ...(is_array($pipes) ? $pipes : func_get_args())); + + return $this; + } + + /** + * Set the method to call on the pipes. + * + * @param string $method + * @return $this + */ + public function via($method) + { + $this->method = $method; + + return $this; + } + + /** + * Run the pipeline with a final destination callback. + * + * @param \Closure $destination + * @return mixed + */ + public function then(Closure $destination) + { + $pipeline = array_reduce( + array_reverse($this->pipes()), $this->carry(), $this->prepareDestination($destination) + ); + + return $pipeline($this->passable); + } + + /** + * Run the pipeline and return the result. + * + * @return mixed + */ + public function thenReturn() + { + return $this->then(function ($passable) { + return $passable; + }); + } + + /** + * Get the final piece of the Closure onion. + * + * @param \Closure $destination + * @return \Closure + */ + protected function prepareDestination(Closure $destination) + { + return function ($passable) use ($destination) { + try { + return $destination($passable); + } catch (Throwable $e) { + return $this->handleException($passable, $e); + } + }; + } + + /** + * Get a Closure that represents a slice of the application onion. + * + * @return \Closure + */ + protected function carry() + { + return function ($stack, $pipe) { + return function ($passable) use ($stack, $pipe) { + try { + if (is_callable($pipe)) { + // If the pipe is a callable, then we will call it directly, but otherwise we + // will resolve the pipes out of the dependency container and call it with + // the appropriate method and arguments, returning the results back out. + return $pipe($passable, $stack); + } elseif (! is_object($pipe)) { + [$name, $parameters] = $this->parsePipeString($pipe); + + // If the pipe is a string we will parse the string and resolve the class out + // of the dependency injection container. We can then build a callable and + // execute the pipe function giving in the parameters that are required. + $pipe = $this->getContainer()->make($name); + + $parameters = array_merge([$passable, $stack], $parameters); + } else { + // If the pipe is already an object we'll just make a callable and pass it to + // the pipe as-is. There is no need to do any extra parsing and formatting + // since the object we're given was already a fully instantiated object. + $parameters = [$passable, $stack]; + } + + $carry = method_exists($pipe, $this->method) + ? $pipe->{$this->method}(...$parameters) + : $pipe(...$parameters); + + return $this->handleCarry($carry); + } catch (Throwable $e) { + return $this->handleException($passable, $e); + } + }; + }; + } + + /** + * Parse full pipe string to get name and parameters. + * + * @param string $pipe + * @return array + */ + protected function parsePipeString($pipe) + { + [$name, $parameters] = array_pad(explode(':', $pipe, 2), 2, []); + + if (is_string($parameters)) { + $parameters = explode(',', $parameters); + } + + return [$name, $parameters]; + } + + /** + * Get the array of configured pipes. + * + * @return array + */ + protected function pipes() + { + return $this->pipes; + } + + /** + * Get the container instance. + * + * @return \Illuminate\Contracts\Container\Container + * + * @throws \RuntimeException + */ + protected function getContainer() + { + if (! $this->container) { + throw new RuntimeException('A container instance has not been passed to the Pipeline.'); + } + + return $this->container; + } + + /** + * Set the container instance. + * + * @param \Illuminate\Contracts\Container\Container $container + * @return $this + */ + public function setContainer(Container $container) + { + $this->container = $container; + + return $this; + } + + /** + * Handle the value returned from each pipe before passing it to the next. + * + * @param mixed $carry + * @return mixed + */ + protected function handleCarry($carry) + { + return $carry; + } + + /** + * Handle the given exception. + * + * @param mixed $passable + * @param \Throwable $e + * @return mixed + * + * @throws \Throwable + */ + protected function handleException($passable, Throwable $e) + { + throw $e; + } +} diff --git a/vendor/illuminate/pipeline/PipelineServiceProvider.php b/vendor/illuminate/pipeline/PipelineServiceProvider.php new file mode 100644 index 0000000..982608b --- /dev/null +++ b/vendor/illuminate/pipeline/PipelineServiceProvider.php @@ -0,0 +1,34 @@ +<?php + +namespace Illuminate\Pipeline; + +use Illuminate\Contracts\Pipeline\Hub as PipelineHubContract; +use Illuminate\Contracts\Support\DeferrableProvider; +use Illuminate\Support\ServiceProvider; + +class PipelineServiceProvider extends ServiceProvider implements DeferrableProvider +{ + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + $this->app->singleton( + PipelineHubContract::class, Hub::class + ); + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() + { + return [ + PipelineHubContract::class, + ]; + } +} diff --git a/vendor/illuminate/pipeline/composer.json b/vendor/illuminate/pipeline/composer.json new file mode 100644 index 0000000..7e640af --- /dev/null +++ b/vendor/illuminate/pipeline/composer.json @@ -0,0 +1,35 @@ +{ + "name": "illuminate/pipeline", + "description": "The Illuminate Pipeline package.", + "license": "MIT", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "require": { + "php": "^8.0.2", + "illuminate/contracts": "^9.0", + "illuminate/support": "^9.0" + }, + "autoload": { + "psr-4": { + "Illuminate\\Pipeline\\": "" + } + }, + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev" +} diff --git a/vendor/illuminate/redis/Connections/Connection.php b/vendor/illuminate/redis/Connections/Connection.php new file mode 100644 index 0000000..e3e55e9 --- /dev/null +++ b/vendor/illuminate/redis/Connections/Connection.php @@ -0,0 +1,218 @@ +<?php + +namespace Illuminate\Redis\Connections; + +use Closure; +use Illuminate\Contracts\Events\Dispatcher; +use Illuminate\Redis\Events\CommandExecuted; +use Illuminate\Redis\Limiters\ConcurrencyLimiterBuilder; +use Illuminate\Redis\Limiters\DurationLimiterBuilder; +use Illuminate\Support\Traits\Macroable; + +abstract class Connection +{ + use Macroable { + __call as macroCall; + } + + /** + * The Redis client. + * + * @var \Redis + */ + protected $client; + + /** + * The Redis connection name. + * + * @var string|null + */ + protected $name; + + /** + * The event dispatcher instance. + * + * @var \Illuminate\Contracts\Events\Dispatcher + */ + protected $events; + + /** + * Subscribe to a set of given channels for messages. + * + * @param array|string $channels + * @param \Closure $callback + * @param string $method + * @return void + */ + abstract public function createSubscription($channels, Closure $callback, $method = 'subscribe'); + + /** + * Funnel a callback for a maximum number of simultaneous executions. + * + * @param string $name + * @return \Illuminate\Redis\Limiters\ConcurrencyLimiterBuilder + */ + public function funnel($name) + { + return new ConcurrencyLimiterBuilder($this, $name); + } + + /** + * Throttle a callback for a maximum number of executions over a given duration. + * + * @param string $name + * @return \Illuminate\Redis\Limiters\DurationLimiterBuilder + */ + public function throttle($name) + { + return new DurationLimiterBuilder($this, $name); + } + + /** + * Get the underlying Redis client. + * + * @return mixed + */ + public function client() + { + return $this->client; + } + + /** + * Subscribe to a set of given channels for messages. + * + * @param array|string $channels + * @param \Closure $callback + * @return void + */ + public function subscribe($channels, Closure $callback) + { + return $this->createSubscription($channels, $callback, __FUNCTION__); + } + + /** + * Subscribe to a set of given channels with wildcards. + * + * @param array|string $channels + * @param \Closure $callback + * @return void + */ + public function psubscribe($channels, Closure $callback) + { + return $this->createSubscription($channels, $callback, __FUNCTION__); + } + + /** + * Run a command against the Redis database. + * + * @param string $method + * @param array $parameters + * @return mixed + */ + public function command($method, array $parameters = []) + { + $start = microtime(true); + + $result = $this->client->{$method}(...$parameters); + + $time = round((microtime(true) - $start) * 1000, 2); + + if (isset($this->events)) { + $this->event(new CommandExecuted($method, $parameters, $time, $this)); + } + + return $result; + } + + /** + * Fire the given event if possible. + * + * @param mixed $event + * @return void + */ + protected function event($event) + { + $this->events?->dispatch($event); + } + + /** + * Register a Redis command listener with the connection. + * + * @param \Closure $callback + * @return void + */ + public function listen(Closure $callback) + { + $this->events?->listen(CommandExecuted::class, $callback); + } + + /** + * Get the connection name. + * + * @return string|null + */ + public function getName() + { + return $this->name; + } + + /** + * Set the connections name. + * + * @param string $name + * @return $this + */ + public function setName($name) + { + $this->name = $name; + + return $this; + } + + /** + * Get the event dispatcher used by the connection. + * + * @return \Illuminate\Contracts\Events\Dispatcher + */ + public function getEventDispatcher() + { + return $this->events; + } + + /** + * Set the event dispatcher instance on the connection. + * + * @param \Illuminate\Contracts\Events\Dispatcher $events + * @return void + */ + public function setEventDispatcher(Dispatcher $events) + { + $this->events = $events; + } + + /** + * Unset the event dispatcher instance on the connection. + * + * @return void + */ + public function unsetEventDispatcher() + { + $this->events = null; + } + + /** + * Pass other method calls down to the underlying client. + * + * @param string $method + * @param array $parameters + * @return mixed + */ + public function __call($method, $parameters) + { + if (static::hasMacro($method)) { + return $this->macroCall($method, $parameters); + } + + return $this->command($method, $parameters); + } +} diff --git a/vendor/illuminate/redis/Connections/PacksPhpRedisValues.php b/vendor/illuminate/redis/Connections/PacksPhpRedisValues.php new file mode 100644 index 0000000..4d27ff5 --- /dev/null +++ b/vendor/illuminate/redis/Connections/PacksPhpRedisValues.php @@ -0,0 +1,183 @@ +<?php + +namespace Illuminate\Redis\Connections; + +use Redis; +use RuntimeException; +use UnexpectedValueException; + +trait PacksPhpRedisValues +{ + /** + * Indicates if Redis supports packing. + * + * @var bool|null + */ + protected $supportsPacking; + + /** + * Indicates if Redis supports LZF compression. + * + * @var bool|null + */ + protected $supportsLzf; + + /** + * Indicates if Redis supports Zstd compression. + * + * @var bool|null + */ + protected $supportsZstd; + + /** + * Prepares the given values to be used with the `eval` command, including serialization and compression. + * + * @param array<int|string,string> $values + * @return array<int|string,string> + */ + public function pack(array $values): array + { + if (empty($values)) { + return $values; + } + + if ($this->supportsPacking()) { + return array_map([$this->client, '_pack'], $values); + } + + if ($this->compressed()) { + if ($this->supportsLzf() && $this->lzfCompressed()) { + if (! function_exists('lzf_compress')) { + throw new RuntimeException("'lzf' extension required to call 'lzf_compress'."); + } + + $processor = function ($value) { + return \lzf_compress($this->client->_serialize($value)); + }; + } elseif ($this->supportsZstd() && $this->zstdCompressed()) { + if (! function_exists('zstd_compress')) { + throw new RuntimeException("'zstd' extension required to call 'zstd_compress'."); + } + + $compressionLevel = $this->client->getOption(Redis::OPT_COMPRESSION_LEVEL); + + $processor = function ($value) use ($compressionLevel) { + return \zstd_compress( + $this->client->_serialize($value), + $compressionLevel === 0 ? Redis::COMPRESSION_ZSTD_DEFAULT : $compressionLevel + ); + }; + } else { + throw new UnexpectedValueException(sprintf( + 'Unsupported phpredis compression in use [%d].', + $this->client->getOption(Redis::OPT_COMPRESSION) + )); + } + } else { + $processor = function ($value) { + return $this->client->_serialize($value); + }; + } + + return array_map($processor, $values); + } + + /** + * Determine if compression is enabled. + * + * @return bool + */ + public function compressed(): bool + { + return defined('Redis::OPT_COMPRESSION') && + $this->client->getOption(Redis::OPT_COMPRESSION) !== Redis::COMPRESSION_NONE; + } + + /** + * Determine if LZF compression is enabled. + * + * @return bool + */ + public function lzfCompressed(): bool + { + return defined('Redis::COMPRESSION_LZF') && + $this->client->getOption(Redis::OPT_COMPRESSION) === Redis::COMPRESSION_LZF; + } + + /** + * Determine if ZSTD compression is enabled. + * + * @return bool + */ + public function zstdCompressed(): bool + { + return defined('Redis::COMPRESSION_ZSTD') && + $this->client->getOption(Redis::OPT_COMPRESSION) === Redis::COMPRESSION_ZSTD; + } + + /** + * Determine if LZ4 compression is enabled. + * + * @return bool + */ + public function lz4Compressed(): bool + { + return defined('Redis::COMPRESSION_LZ4') && + $this->client->getOption(Redis::OPT_COMPRESSION) === Redis::COMPRESSION_LZ4; + } + + /** + * Determine if the current PhpRedis extension version supports packing. + * + * @return bool + */ + protected function supportsPacking(): bool + { + if ($this->supportsPacking === null) { + $this->supportsPacking = $this->phpRedisVersionAtLeast('5.3.5'); + } + + return $this->supportsPacking; + } + + /** + * Determine if the current PhpRedis extension version supports LZF compression. + * + * @return bool + */ + protected function supportsLzf(): bool + { + if ($this->supportsLzf === null) { + $this->supportsLzf = $this->phpRedisVersionAtLeast('4.3.0'); + } + + return $this->supportsLzf; + } + + /** + * Determine if the current PhpRedis extension version supports Zstd compression. + * + * @return bool + */ + protected function supportsZstd(): bool + { + if ($this->supportsZstd === null) { + $this->supportsZstd = $this->phpRedisVersionAtLeast('5.1.0'); + } + + return $this->supportsZstd; + } + + /** + * Determine if the PhpRedis extension version is at least the given version. + * + * @param string $version + * @return bool + */ + protected function phpRedisVersionAtLeast(string $version): bool + { + $phpredisVersion = phpversion('redis'); + + return $phpredisVersion !== false && version_compare($phpredisVersion, $version, '>='); + } +} diff --git a/vendor/illuminate/redis/Connections/PhpRedisClusterConnection.php b/vendor/illuminate/redis/Connections/PhpRedisClusterConnection.php new file mode 100644 index 0000000..bf4816a --- /dev/null +++ b/vendor/illuminate/redis/Connections/PhpRedisClusterConnection.php @@ -0,0 +1,24 @@ +<?php + +namespace Illuminate\Redis\Connections; + +class PhpRedisClusterConnection extends PhpRedisConnection +{ + /** + * Flush the selected Redis database on all master nodes. + * + * @return mixed + */ + public function flushdb() + { + $arguments = func_get_args(); + + $async = strtoupper((string) ($arguments[0] ?? null)) === 'ASYNC'; + + foreach ($this->client->_masters() as $master) { + $async + ? $this->command('rawCommand', [$master, 'flushdb', 'async']) + : $this->command('flushdb', [$master]); + } + } +} diff --git a/vendor/illuminate/redis/Connections/PhpRedisConnection.php b/vendor/illuminate/redis/Connections/PhpRedisConnection.php new file mode 100644 index 0000000..d4c1f67 --- /dev/null +++ b/vendor/illuminate/redis/Connections/PhpRedisConnection.php @@ -0,0 +1,567 @@ +<?php + +namespace Illuminate\Redis\Connections; + +use Closure; +use Illuminate\Contracts\Redis\Connection as ConnectionContract; +use Illuminate\Support\Arr; +use Redis; +use RedisException; + +/** + * @mixin \Redis + */ +class PhpRedisConnection extends Connection implements ConnectionContract +{ + use PacksPhpRedisValues; + + /** + * The connection creation callback. + * + * @var callable + */ + protected $connector; + + /** + * The connection configuration array. + * + * @var array + */ + protected $config; + + /** + * Create a new PhpRedis connection. + * + * @param \Redis $client + * @param callable|null $connector + * @param array $config + * @return void + */ + public function __construct($client, callable $connector = null, array $config = []) + { + $this->client = $client; + $this->config = $config; + $this->connector = $connector; + } + + /** + * Returns the value of the given key. + * + * @param string $key + * @return string|null + */ + public function get($key) + { + $result = $this->command('get', [$key]); + + return $result !== false ? $result : null; + } + + /** + * Get the values of all the given keys. + * + * @param array $keys + * @return array + */ + public function mget(array $keys) + { + return array_map(function ($value) { + return $value !== false ? $value : null; + }, $this->command('mget', [$keys])); + } + + /** + * Set the string value in the argument as the value of the key. + * + * @param string $key + * @param mixed $value + * @param string|null $expireResolution + * @param int|null $expireTTL + * @param string|null $flag + * @return bool + */ + public function set($key, $value, $expireResolution = null, $expireTTL = null, $flag = null) + { + return $this->command('set', [ + $key, + $value, + $expireResolution ? [$flag, $expireResolution => $expireTTL] : null, + ]); + } + + /** + * Set the given key if it doesn't exist. + * + * @param string $key + * @param string $value + * @return int + */ + public function setnx($key, $value) + { + return (int) $this->command('setnx', [$key, $value]); + } + + /** + * Get the value of the given hash fields. + * + * @param string $key + * @param mixed $dictionary + * @return array + */ + public function hmget($key, ...$dictionary) + { + if (count($dictionary) === 1) { + $dictionary = $dictionary[0]; + } + + return array_values($this->command('hmget', [$key, $dictionary])); + } + + /** + * Set the given hash fields to their respective values. + * + * @param string $key + * @param mixed $dictionary + * @return int + */ + public function hmset($key, ...$dictionary) + { + if (count($dictionary) === 1) { + $dictionary = $dictionary[0]; + } else { + $input = collect($dictionary); + + $dictionary = $input->nth(2)->combine($input->nth(2, 1))->toArray(); + } + + return $this->command('hmset', [$key, $dictionary]); + } + + /** + * Set the given hash field if it doesn't exist. + * + * @param string $hash + * @param string $key + * @param string $value + * @return int + */ + public function hsetnx($hash, $key, $value) + { + return (int) $this->command('hsetnx', [$hash, $key, $value]); + } + + /** + * Removes the first count occurrences of the value element from the list. + * + * @param string $key + * @param int $count + * @param mixed $value + * @return int|false + */ + public function lrem($key, $count, $value) + { + return $this->command('lrem', [$key, $value, $count]); + } + + /** + * Removes and returns the first element of the list stored at key. + * + * @param mixed $arguments + * @return array|null + */ + public function blpop(...$arguments) + { + $result = $this->command('blpop', $arguments); + + return empty($result) ? null : $result; + } + + /** + * Removes and returns the last element of the list stored at key. + * + * @param mixed $arguments + * @return array|null + */ + public function brpop(...$arguments) + { + $result = $this->command('brpop', $arguments); + + return empty($result) ? null : $result; + } + + /** + * Removes and returns a random element from the set value at key. + * + * @param string $key + * @param int|null $count + * @return mixed|false + */ + public function spop($key, $count = 1) + { + return $this->command('spop', func_get_args()); + } + + /** + * Add one or more members to a sorted set or update its score if it already exists. + * + * @param string $key + * @param mixed $dictionary + * @return int + */ + public function zadd($key, ...$dictionary) + { + if (is_array(end($dictionary))) { + foreach (array_pop($dictionary) as $member => $score) { + $dictionary[] = $score; + $dictionary[] = $member; + } + } + + $options = []; + + foreach (array_slice($dictionary, 0, 3) as $i => $value) { + if (in_array($value, ['nx', 'xx', 'ch', 'incr', 'gt', 'lt', 'NX', 'XX', 'CH', 'INCR', 'GT', 'LT'], true)) { + $options[] = $value; + + unset($dictionary[$i]); + } + } + + return $this->command('zadd', array_merge([$key], [$options], array_values($dictionary))); + } + + /** + * Return elements with score between $min and $max. + * + * @param string $key + * @param mixed $min + * @param mixed $max + * @param array $options + * @return array + */ + public function zrangebyscore($key, $min, $max, $options = []) + { + if (isset($options['limit']) && Arr::isAssoc($options['limit'])) { + $options['limit'] = [ + $options['limit']['offset'], + $options['limit']['count'], + ]; + } + + return $this->command('zRangeByScore', [$key, $min, $max, $options]); + } + + /** + * Return elements with score between $min and $max. + * + * @param string $key + * @param mixed $min + * @param mixed $max + * @param array $options + * @return array + */ + public function zrevrangebyscore($key, $min, $max, $options = []) + { + if (isset($options['limit']) && Arr::isAssoc($options['limit'])) { + $options['limit'] = [ + $options['limit']['offset'], + $options['limit']['count'], + ]; + } + + return $this->command('zRevRangeByScore', [$key, $min, $max, $options]); + } + + /** + * Find the intersection between sets and store in a new set. + * + * @param string $output + * @param array $keys + * @param array $options + * @return int + */ + public function zinterstore($output, $keys, $options = []) + { + return $this->command('zinterstore', [$output, $keys, + $options['weights'] ?? null, + $options['aggregate'] ?? 'sum', + ]); + } + + /** + * Find the union between sets and store in a new set. + * + * @param string $output + * @param array $keys + * @param array $options + * @return int + */ + public function zunionstore($output, $keys, $options = []) + { + return $this->command('zunionstore', [$output, $keys, + $options['weights'] ?? null, + $options['aggregate'] ?? 'sum', + ]); + } + + /** + * Scans all keys based on options. + * + * @param mixed $cursor + * @param array $options + * @return mixed + */ + public function scan($cursor, $options = []) + { + $result = $this->client->scan($cursor, + $options['match'] ?? '*', + $options['count'] ?? 10 + ); + + if ($result === false) { + $result = []; + } + + return $cursor === 0 && empty($result) ? false : [$cursor, $result]; + } + + /** + * Scans the given set for all values based on options. + * + * @param string $key + * @param mixed $cursor + * @param array $options + * @return mixed + */ + public function zscan($key, $cursor, $options = []) + { + $result = $this->client->zscan($key, $cursor, + $options['match'] ?? '*', + $options['count'] ?? 10 + ); + + if ($result === false) { + $result = []; + } + + return $cursor === 0 && empty($result) ? false : [$cursor, $result]; + } + + /** + * Scans the given hash for all values based on options. + * + * @param string $key + * @param mixed $cursor + * @param array $options + * @return mixed + */ + public function hscan($key, $cursor, $options = []) + { + $result = $this->client->hscan($key, $cursor, + $options['match'] ?? '*', + $options['count'] ?? 10 + ); + + if ($result === false) { + $result = []; + } + + return $cursor === 0 && empty($result) ? false : [$cursor, $result]; + } + + /** + * Scans the given set for all values based on options. + * + * @param string $key + * @param mixed $cursor + * @param array $options + * @return mixed + */ + public function sscan($key, $cursor, $options = []) + { + $result = $this->client->sscan($key, $cursor, + $options['match'] ?? '*', + $options['count'] ?? 10 + ); + + if ($result === false) { + $result = []; + } + + return $cursor === 0 && empty($result) ? false : [$cursor, $result]; + } + + /** + * Execute commands in a pipeline. + * + * @param callable|null $callback + * @return \Redis|array + */ + public function pipeline(callable $callback = null) + { + $pipeline = $this->client()->pipeline(); + + return is_null($callback) + ? $pipeline + : tap($pipeline, $callback)->exec(); + } + + /** + * Execute commands in a transaction. + * + * @param callable|null $callback + * @return \Redis|array + */ + public function transaction(callable $callback = null) + { + $transaction = $this->client()->multi(); + + return is_null($callback) + ? $transaction + : tap($transaction, $callback)->exec(); + } + + /** + * Evaluate a LUA script serverside, from the SHA1 hash of the script instead of the script itself. + * + * @param string $script + * @param int $numkeys + * @param mixed $arguments + * @return mixed + */ + public function evalsha($script, $numkeys, ...$arguments) + { + return $this->command('evalsha', [ + $this->script('load', $script), $arguments, $numkeys, + ]); + } + + /** + * Evaluate a script and return its result. + * + * @param string $script + * @param int $numberOfKeys + * @param dynamic $arguments + * @return mixed + */ + public function eval($script, $numberOfKeys, ...$arguments) + { + return $this->command('eval', [$script, $arguments, $numberOfKeys]); + } + + /** + * Subscribe to a set of given channels for messages. + * + * @param array|string $channels + * @param \Closure $callback + * @return void + */ + public function subscribe($channels, Closure $callback) + { + $this->client->subscribe((array) $channels, function ($redis, $channel, $message) use ($callback) { + $callback($message, $channel); + }); + } + + /** + * Subscribe to a set of given channels with wildcards. + * + * @param array|string $channels + * @param \Closure $callback + * @return void + */ + public function psubscribe($channels, Closure $callback) + { + $this->client->psubscribe((array) $channels, function ($redis, $pattern, $channel, $message) use ($callback) { + $callback($message, $channel); + }); + } + + /** + * Subscribe to a set of given channels for messages. + * + * @param array|string $channels + * @param \Closure $callback + * @param string $method + * @return void + */ + public function createSubscription($channels, Closure $callback, $method = 'subscribe') + { + // + } + + /** + * Flush the selected Redis database. + * + * @return mixed + */ + public function flushdb() + { + $arguments = func_get_args(); + + if (strtoupper((string) ($arguments[0] ?? null)) === 'ASYNC') { + return $this->command('flushdb', [true]); + } + + return $this->command('flushdb'); + } + + /** + * Execute a raw command. + * + * @param array $parameters + * @return mixed + */ + public function executeRaw(array $parameters) + { + return $this->command('rawCommand', $parameters); + } + + /** + * Run a command against the Redis database. + * + * @param string $method + * @param array $parameters + * @return mixed + * + * @throws \RedisException + */ + public function command($method, array $parameters = []) + { + try { + return parent::command($method, $parameters); + } catch (RedisException $e) { + foreach (['went away', 'socket', 'read error on connection'] as $errorMessage) { + if (str_contains($e->getMessage(), $errorMessage)) { + $this->client = $this->connector ? call_user_func($this->connector) : $this->client; + + break; + } + } + + throw $e; + } + } + + /** + * Disconnects from the Redis instance. + * + * @return void + */ + public function disconnect() + { + $this->client->close(); + } + + /** + * Pass other method calls down to the underlying client. + * + * @param string $method + * @param array $parameters + * @return mixed + */ + public function __call($method, $parameters) + { + return parent::__call(strtolower($method), $parameters); + } +} diff --git a/vendor/illuminate/redis/Connections/PredisClusterConnection.php b/vendor/illuminate/redis/Connections/PredisClusterConnection.php new file mode 100644 index 0000000..6d07de1 --- /dev/null +++ b/vendor/illuminate/redis/Connections/PredisClusterConnection.php @@ -0,0 +1,20 @@ +<?php + +namespace Illuminate\Redis\Connections; + +use Predis\Command\ServerFlushDatabase; + +class PredisClusterConnection extends PredisConnection +{ + /** + * Flush the selected Redis database on all cluster nodes. + * + * @return void + */ + public function flushdb() + { + $this->client->executeCommandOnNodes( + tap(new ServerFlushDatabase)->setArguments(func_get_args()) + ); + } +} diff --git a/vendor/illuminate/redis/Connections/PredisConnection.php b/vendor/illuminate/redis/Connections/PredisConnection.php new file mode 100644 index 0000000..f642dd6 --- /dev/null +++ b/vendor/illuminate/redis/Connections/PredisConnection.php @@ -0,0 +1,53 @@ +<?php + +namespace Illuminate\Redis\Connections; + +use Closure; +use Illuminate\Contracts\Redis\Connection as ConnectionContract; + +/** + * @mixin \Predis\Client + */ +class PredisConnection extends Connection implements ConnectionContract +{ + /** + * The Predis client. + * + * @var \Predis\Client + */ + protected $client; + + /** + * Create a new Predis connection. + * + * @param \Predis\Client $client + * @return void + */ + public function __construct($client) + { + $this->client = $client; + } + + /** + * Subscribe to a set of given channels for messages. + * + * @param array|string $channels + * @param \Closure $callback + * @param string $method + * @return void + */ + public function createSubscription($channels, Closure $callback, $method = 'subscribe') + { + $loop = $this->pubSubLoop(); + + $loop->{$method}(...array_values((array) $channels)); + + foreach ($loop as $message) { + if ($message->kind === 'message' || $message->kind === 'pmessage') { + $callback($message->payload, $message->channel); + } + } + + unset($loop); + } +} diff --git a/vendor/illuminate/redis/Connectors/PhpRedisConnector.php b/vendor/illuminate/redis/Connectors/PhpRedisConnector.php new file mode 100644 index 0000000..8953c5f --- /dev/null +++ b/vendor/illuminate/redis/Connectors/PhpRedisConnector.php @@ -0,0 +1,234 @@ +<?php + +namespace Illuminate\Redis\Connectors; + +use Illuminate\Contracts\Redis\Connector; +use Illuminate\Redis\Connections\PhpRedisClusterConnection; +use Illuminate\Redis\Connections\PhpRedisConnection; +use Illuminate\Support\Arr; +use Illuminate\Support\Facades\Redis as RedisFacade; +use Illuminate\Support\Str; +use LogicException; +use Redis; +use RedisCluster; + +class PhpRedisConnector implements Connector +{ + /** + * Create a new clustered PhpRedis connection. + * + * @param array $config + * @param array $options + * @return \Illuminate\Redis\Connections\PhpRedisConnection + */ + public function connect(array $config, array $options) + { + $formattedOptions = Arr::pull($config, 'options', []); + + if (isset($config['prefix'])) { + $formattedOptions['prefix'] = $config['prefix']; + } + + $connector = function () use ($config, $options, $formattedOptions) { + return $this->createClient(array_merge( + $config, $options, $formattedOptions + )); + }; + + return new PhpRedisConnection($connector(), $connector, $config); + } + + /** + * Create a new clustered PhpRedis connection. + * + * @param array $config + * @param array $clusterOptions + * @param array $options + * @return \Illuminate\Redis\Connections\PhpRedisClusterConnection + */ + public function connectToCluster(array $config, array $clusterOptions, array $options) + { + $options = array_merge($options, $clusterOptions, Arr::pull($config, 'options', [])); + + return new PhpRedisClusterConnection($this->createRedisClusterInstance( + array_map([$this, 'buildClusterConnectionString'], $config), $options + )); + } + + /** + * Build a single cluster seed string from an array. + * + * @param array $server + * @return string + */ + protected function buildClusterConnectionString(array $server) + { + return $this->formatHost($server).':'.$server['port'].'?'.Arr::query(Arr::only($server, [ + 'database', 'password', 'prefix', 'read_timeout', + ])); + } + + /** + * Create the Redis client instance. + * + * @param array $config + * @return \Redis + * + * @throws \LogicException + */ + protected function createClient(array $config) + { + return tap(new Redis, function ($client) use ($config) { + if ($client instanceof RedisFacade) { + throw new LogicException( + extension_loaded('redis') + ? 'Please remove or rename the Redis facade alias in your "app" configuration file in order to avoid collision with the PHP Redis extension.' + : 'Please make sure the PHP Redis extension is installed and enabled.' + ); + } + + $this->establishConnection($client, $config); + + if (! empty($config['password'])) { + if (isset($config['username']) && $config['username'] !== '' && is_string($config['password'])) { + $client->auth([$config['username'], $config['password']]); + } else { + $client->auth($config['password']); + } + } + + if (isset($config['database'])) { + $client->select((int) $config['database']); + } + + if (! empty($config['prefix'])) { + $client->setOption(Redis::OPT_PREFIX, $config['prefix']); + } + + if (! empty($config['read_timeout'])) { + $client->setOption(Redis::OPT_READ_TIMEOUT, $config['read_timeout']); + } + + if (! empty($config['scan'])) { + $client->setOption(Redis::OPT_SCAN, $config['scan']); + } + + if (! empty($config['name'])) { + $client->client('SETNAME', $config['name']); + } + + if (array_key_exists('serializer', $config)) { + $client->setOption(Redis::OPT_SERIALIZER, $config['serializer']); + } + + if (array_key_exists('compression', $config)) { + $client->setOption(Redis::OPT_COMPRESSION, $config['compression']); + } + + if (array_key_exists('compression_level', $config)) { + $client->setOption(Redis::OPT_COMPRESSION_LEVEL, $config['compression_level']); + } + }); + } + + /** + * Establish a connection with the Redis host. + * + * @param \Redis $client + * @param array $config + * @return void + */ + protected function establishConnection($client, array $config) + { + $persistent = $config['persistent'] ?? false; + + $parameters = [ + $this->formatHost($config), + $config['port'], + Arr::get($config, 'timeout', 0.0), + $persistent ? Arr::get($config, 'persistent_id', null) : null, + Arr::get($config, 'retry_interval', 0), + ]; + + if (version_compare(phpversion('redis'), '3.1.3', '>=')) { + $parameters[] = Arr::get($config, 'read_timeout', 0.0); + } + + if (version_compare(phpversion('redis'), '5.3.0', '>=') && ! is_null($context = Arr::get($config, 'context'))) { + $parameters[] = $context; + } + + $client->{$persistent ? 'pconnect' : 'connect'}(...$parameters); + } + + /** + * Create a new redis cluster instance. + * + * @param array $servers + * @param array $options + * @return \RedisCluster + */ + protected function createRedisClusterInstance(array $servers, array $options) + { + $parameters = [ + null, + array_values($servers), + $options['timeout'] ?? 0, + $options['read_timeout'] ?? 0, + isset($options['persistent']) && $options['persistent'], + ]; + + if (version_compare(phpversion('redis'), '4.3.0', '>=')) { + $parameters[] = $options['password'] ?? null; + } + + if (version_compare(phpversion('redis'), '5.3.2', '>=') && ! is_null($context = Arr::get($options, 'context'))) { + $parameters[] = $context; + } + + return tap(new RedisCluster(...$parameters), function ($client) use ($options) { + if (! empty($options['prefix'])) { + $client->setOption(RedisCluster::OPT_PREFIX, $options['prefix']); + } + + if (! empty($options['scan'])) { + $client->setOption(RedisCluster::OPT_SCAN, $options['scan']); + } + + if (! empty($options['failover'])) { + $client->setOption(RedisCluster::OPT_SLAVE_FAILOVER, $options['failover']); + } + + if (! empty($options['name'])) { + $client->client('SETNAME', $options['name']); + } + + if (array_key_exists('serializer', $options)) { + $client->setOption(RedisCluster::OPT_SERIALIZER, $options['serializer']); + } + + if (array_key_exists('compression', $options)) { + $client->setOption(RedisCluster::OPT_COMPRESSION, $options['compression']); + } + + if (array_key_exists('compression_level', $options)) { + $client->setOption(RedisCluster::OPT_COMPRESSION_LEVEL, $options['compression_level']); + } + }); + } + + /** + * Format the host using the scheme if available. + * + * @param array $options + * @return string + */ + protected function formatHost(array $options) + { + if (isset($options['scheme'])) { + return Str::start($options['host'], "{$options['scheme']}://"); + } + + return $options['host']; + } +} diff --git a/vendor/illuminate/redis/Connectors/PredisConnector.php b/vendor/illuminate/redis/Connectors/PredisConnector.php new file mode 100644 index 0000000..6222a4b --- /dev/null +++ b/vendor/illuminate/redis/Connectors/PredisConnector.php @@ -0,0 +1,53 @@ +<?php + +namespace Illuminate\Redis\Connectors; + +use Illuminate\Contracts\Redis\Connector; +use Illuminate\Redis\Connections\PredisClusterConnection; +use Illuminate\Redis\Connections\PredisConnection; +use Illuminate\Support\Arr; +use Predis\Client; + +class PredisConnector implements Connector +{ + /** + * Create a new clustered Predis connection. + * + * @param array $config + * @param array $options + * @return \Illuminate\Redis\Connections\PredisConnection + */ + public function connect(array $config, array $options) + { + $formattedOptions = array_merge( + ['timeout' => 10.0], $options, Arr::pull($config, 'options', []) + ); + + if (isset($config['prefix'])) { + $formattedOptions['prefix'] = $config['prefix']; + } + + return new PredisConnection(new Client($config, $formattedOptions)); + } + + /** + * Create a new clustered Predis connection. + * + * @param array $config + * @param array $clusterOptions + * @param array $options + * @return \Illuminate\Redis\Connections\PredisClusterConnection + */ + public function connectToCluster(array $config, array $clusterOptions, array $options) + { + $clusterSpecificOptions = Arr::pull($config, 'options', []); + + if (isset($config['prefix'])) { + $clusterSpecificOptions['prefix'] = $config['prefix']; + } + + return new PredisClusterConnection(new Client(array_values($config), array_merge( + $options, $clusterOptions, $clusterSpecificOptions + ))); + } +} diff --git a/vendor/illuminate/redis/Events/CommandExecuted.php b/vendor/illuminate/redis/Events/CommandExecuted.php new file mode 100644 index 0000000..fa65719 --- /dev/null +++ b/vendor/illuminate/redis/Events/CommandExecuted.php @@ -0,0 +1,59 @@ +<?php + +namespace Illuminate\Redis\Events; + +class CommandExecuted +{ + /** + * The Redis command that was executed. + * + * @var string + */ + public $command; + + /** + * The array of command parameters. + * + * @var array + */ + public $parameters; + + /** + * The number of milliseconds it took to execute the command. + * + * @var float + */ + public $time; + + /** + * The Redis connection instance. + * + * @var \Illuminate\Redis\Connections\Connection + */ + public $connection; + + /** + * The Redis connection name. + * + * @var string + */ + public $connectionName; + + /** + * Create a new event instance. + * + * @param string $command + * @param array $parameters + * @param float|null $time + * @param \Illuminate\Redis\Connections\Connection $connection + * @return void + */ + public function __construct($command, $parameters, $time, $connection) + { + $this->time = $time; + $this->command = $command; + $this->parameters = $parameters; + $this->connection = $connection; + $this->connectionName = $connection->getName(); + } +} diff --git a/vendor/illuminate/redis/LICENSE.md b/vendor/illuminate/redis/LICENSE.md new file mode 100644 index 0000000..79810c8 --- /dev/null +++ b/vendor/illuminate/redis/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Taylor Otwell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/illuminate/redis/Limiters/ConcurrencyLimiter.php b/vendor/illuminate/redis/Limiters/ConcurrencyLimiter.php new file mode 100644 index 0000000..e249053 --- /dev/null +++ b/vendor/illuminate/redis/Limiters/ConcurrencyLimiter.php @@ -0,0 +1,167 @@ +<?php + +namespace Illuminate\Redis\Limiters; + +use Illuminate\Contracts\Redis\LimiterTimeoutException; +use Illuminate\Support\Str; +use Throwable; + +class ConcurrencyLimiter +{ + /** + * The Redis factory implementation. + * + * @var \Illuminate\Redis\Connections\Connection + */ + protected $redis; + + /** + * The name of the limiter. + * + * @var string + */ + protected $name; + + /** + * The allowed number of concurrent tasks. + * + * @var int + */ + protected $maxLocks; + + /** + * The number of seconds a slot should be maintained. + * + * @var int + */ + protected $releaseAfter; + + /** + * Create a new concurrency limiter instance. + * + * @param \Illuminate\Redis\Connections\Connection $redis + * @param string $name + * @param int $maxLocks + * @param int $releaseAfter + * @return void + */ + public function __construct($redis, $name, $maxLocks, $releaseAfter) + { + $this->name = $name; + $this->redis = $redis; + $this->maxLocks = $maxLocks; + $this->releaseAfter = $releaseAfter; + } + + /** + * Attempt to acquire the lock for the given number of seconds. + * + * @param int $timeout + * @param callable|null $callback + * @param int $sleep + * @return mixed + * + * @throws \Illuminate\Contracts\Redis\LimiterTimeoutException + * @throws \Throwable + */ + public function block($timeout, $callback = null, $sleep = 250) + { + $starting = time(); + + $id = Str::random(20); + + while (! $slot = $this->acquire($id)) { + if (time() - $timeout >= $starting) { + throw new LimiterTimeoutException; + } + + usleep($sleep * 1000); + } + + if (is_callable($callback)) { + try { + return tap($callback(), function () use ($slot, $id) { + $this->release($slot, $id); + }); + } catch (Throwable $exception) { + $this->release($slot, $id); + + throw $exception; + } + } + + return true; + } + + /** + * Attempt to acquire the lock. + * + * @param string $id A unique identifier for this lock + * @return mixed + */ + protected function acquire($id) + { + $slots = array_map(function ($i) { + return $this->name.$i; + }, range(1, $this->maxLocks)); + + return $this->redis->eval(...array_merge( + [$this->lockScript(), count($slots)], + array_merge($slots, [$this->name, $this->releaseAfter, $id]) + )); + } + + /** + * Get the Lua script for acquiring a lock. + * + * KEYS - The keys that represent available slots + * ARGV[1] - The limiter name + * ARGV[2] - The number of seconds the slot should be reserved + * ARGV[3] - The unique identifier for this lock + * + * @return string + */ + protected function lockScript() + { + return <<<'LUA' +for index, value in pairs(redis.call('mget', unpack(KEYS))) do + if not value then + redis.call('set', KEYS[index], ARGV[3], "EX", ARGV[2]) + return ARGV[1]..index + end +end +LUA; + } + + /** + * Release the lock. + * + * @param string $key + * @param string $id + * @return void + */ + protected function release($key, $id) + { + $this->redis->eval($this->releaseScript(), 1, $key, $id); + } + + /** + * Get the Lua script to atomically release a lock. + * + * KEYS[1] - The name of the lock + * ARGV[1] - The unique identifier for this lock + * + * @return string + */ + protected function releaseScript() + { + return <<<'LUA' +if redis.call('get', KEYS[1]) == ARGV[1] +then + return redis.call('del', KEYS[1]) +else + return 0 +end +LUA; + } +} diff --git a/vendor/illuminate/redis/Limiters/ConcurrencyLimiterBuilder.php b/vendor/illuminate/redis/Limiters/ConcurrencyLimiterBuilder.php new file mode 100644 index 0000000..fd2bf12 --- /dev/null +++ b/vendor/illuminate/redis/Limiters/ConcurrencyLimiterBuilder.php @@ -0,0 +1,142 @@ +<?php + +namespace Illuminate\Redis\Limiters; + +use Illuminate\Contracts\Redis\LimiterTimeoutException; +use Illuminate\Support\InteractsWithTime; + +class ConcurrencyLimiterBuilder +{ + use InteractsWithTime; + + /** + * The Redis connection. + * + * @var \Illuminate\Redis\Connections\Connection + */ + public $connection; + + /** + * The name of the lock. + * + * @var string + */ + public $name; + + /** + * The maximum number of entities that can hold the lock at the same time. + * + * @var int + */ + public $maxLocks; + + /** + * The number of seconds to maintain the lock until it is automatically released. + * + * @var int + */ + public $releaseAfter = 60; + + /** + * The amount of time to block until a lock is available. + * + * @var int + */ + public $timeout = 3; + + /** + * The number of milliseconds to wait between attempts to acquire the lock. + * + * @var int + */ + public $sleep = 250; + + /** + * Create a new builder instance. + * + * @param \Illuminate\Redis\Connections\Connection $connection + * @param string $name + * @return void + */ + public function __construct($connection, $name) + { + $this->name = $name; + $this->connection = $connection; + } + + /** + * Set the maximum number of locks that can be obtained per time window. + * + * @param int $maxLocks + * @return $this + */ + public function limit($maxLocks) + { + $this->maxLocks = $maxLocks; + + return $this; + } + + /** + * Set the number of seconds until the lock will be released. + * + * @param int $releaseAfter + * @return $this + */ + public function releaseAfter($releaseAfter) + { + $this->releaseAfter = $this->secondsUntil($releaseAfter); + + return $this; + } + + /** + * Set the amount of time to block until a lock is available. + * + * @param int $timeout + * @return $this + */ + public function block($timeout) + { + $this->timeout = $timeout; + + return $this; + } + + /** + * The number of milliseconds to wait between lock acquisition attempts. + * + * @param int $sleep + * @return $this + */ + public function sleep($sleep) + { + $this->sleep = $sleep; + + return $this; + } + + /** + * Execute the given callback if a lock is obtained, otherwise call the failure callback. + * + * @param callable $callback + * @param callable|null $failure + * @return mixed + * + * @throws \Illuminate\Contracts\Redis\LimiterTimeoutException + */ + public function then(callable $callback, callable $failure = null) + { + try { + return (new ConcurrencyLimiter( + $this->connection, $this->name, $this->maxLocks, $this->releaseAfter + ))->block($this->timeout, $callback, $this->sleep); + } catch (LimiterTimeoutException $e) { + if ($failure) { + return $failure($e); + } + + throw $e; + } + } +} diff --git a/vendor/illuminate/redis/Limiters/DurationLimiter.php b/vendor/illuminate/redis/Limiters/DurationLimiter.php new file mode 100644 index 0000000..65297ff --- /dev/null +++ b/vendor/illuminate/redis/Limiters/DurationLimiter.php @@ -0,0 +1,203 @@ +<?php + +namespace Illuminate\Redis\Limiters; + +use Illuminate\Contracts\Redis\LimiterTimeoutException; + +class DurationLimiter +{ + /** + * The Redis factory implementation. + * + * @var \Illuminate\Redis\Connections\Connection + */ + private $redis; + + /** + * The unique name of the lock. + * + * @var string + */ + private $name; + + /** + * The allowed number of concurrent tasks. + * + * @var int + */ + private $maxLocks; + + /** + * The number of seconds a slot should be maintained. + * + * @var int + */ + private $decay; + + /** + * The timestamp of the end of the current duration. + * + * @var int + */ + public $decaysAt; + + /** + * The number of remaining slots. + * + * @var int + */ + public $remaining; + + /** + * Create a new duration limiter instance. + * + * @param \Illuminate\Redis\Connections\Connection $redis + * @param string $name + * @param int $maxLocks + * @param int $decay + * @return void + */ + public function __construct($redis, $name, $maxLocks, $decay) + { + $this->name = $name; + $this->decay = $decay; + $this->redis = $redis; + $this->maxLocks = $maxLocks; + } + + /** + * Attempt to acquire the lock for the given number of seconds. + * + * @param int $timeout + * @param callable|null $callback + * @param int $sleep + * @return mixed + * + * @throws \Illuminate\Contracts\Redis\LimiterTimeoutException + */ + public function block($timeout, $callback = null, $sleep = 750) + { + $starting = time(); + + while (! $this->acquire()) { + if (time() - $timeout >= $starting) { + throw new LimiterTimeoutException; + } + + usleep($sleep * 1000); + } + + if (is_callable($callback)) { + return $callback(); + } + + return true; + } + + /** + * Attempt to acquire the lock. + * + * @return bool + */ + public function acquire() + { + $results = $this->redis->eval( + $this->luaScript(), 1, $this->name, microtime(true), time(), $this->decay, $this->maxLocks + ); + + $this->decaysAt = $results[1]; + + $this->remaining = max(0, $results[2]); + + return (bool) $results[0]; + } + + /** + * Determine if the key has been "accessed" too many times. + * + * @return bool + */ + public function tooManyAttempts() + { + [$this->decaysAt, $this->remaining] = $this->redis->eval( + $this->tooManyAttemptsLuaScript(), 1, $this->name, microtime(true), time(), $this->decay, $this->maxLocks + ); + + return $this->remaining <= 0; + } + + /** + * Clear the limiter. + * + * @return void + */ + public function clear() + { + $this->redis->del($this->name); + } + + /** + * Get the Lua script for acquiring a lock. + * + * KEYS[1] - The limiter name + * ARGV[1] - Current time in microseconds + * ARGV[2] - Current time in seconds + * ARGV[3] - Duration of the bucket + * ARGV[4] - Allowed number of tasks + * + * @return string + */ + protected function luaScript() + { + return <<<'LUA' +local function reset() + redis.call('HMSET', KEYS[1], 'start', ARGV[2], 'end', ARGV[2] + ARGV[3], 'count', 1) + return redis.call('EXPIRE', KEYS[1], ARGV[3] * 2) +end + +if redis.call('EXISTS', KEYS[1]) == 0 then + return {reset(), ARGV[2] + ARGV[3], ARGV[4] - 1} +end + +if ARGV[1] >= redis.call('HGET', KEYS[1], 'start') and ARGV[1] <= redis.call('HGET', KEYS[1], 'end') then + return { + tonumber(redis.call('HINCRBY', KEYS[1], 'count', 1)) <= tonumber(ARGV[4]), + redis.call('HGET', KEYS[1], 'end'), + ARGV[4] - redis.call('HGET', KEYS[1], 'count') + } +end + +return {reset(), ARGV[2] + ARGV[3], ARGV[4] - 1} +LUA; + } + + /** + * Get the Lua script to determine if the key has been "accessed" too many times. + * + * KEYS[1] - The limiter name + * ARGV[1] - Current time in microseconds + * ARGV[2] - Current time in seconds + * ARGV[3] - Duration of the bucket + * ARGV[4] - Allowed number of tasks + * + * @return string + */ + protected function tooManyAttemptsLuaScript() + { + return <<<'LUA' + +if redis.call('EXISTS', KEYS[1]) == 0 then + return {0, ARGV[2] + ARGV[3]} +end + +if ARGV[1] >= redis.call('HGET', KEYS[1], 'start') and ARGV[1] <= redis.call('HGET', KEYS[1], 'end') then + return { + redis.call('HGET', KEYS[1], 'end'), + ARGV[4] - redis.call('HGET', KEYS[1], 'count') + } +end + +return {0, ARGV[2] + ARGV[3]} +LUA; + } +} diff --git a/vendor/illuminate/redis/Limiters/DurationLimiterBuilder.php b/vendor/illuminate/redis/Limiters/DurationLimiterBuilder.php new file mode 100644 index 0000000..ddb3218 --- /dev/null +++ b/vendor/illuminate/redis/Limiters/DurationLimiterBuilder.php @@ -0,0 +1,142 @@ +<?php + +namespace Illuminate\Redis\Limiters; + +use Illuminate\Contracts\Redis\LimiterTimeoutException; +use Illuminate\Support\InteractsWithTime; + +class DurationLimiterBuilder +{ + use InteractsWithTime; + + /** + * The Redis connection. + * + * @var \Illuminate\Redis\Connections\Connection + */ + public $connection; + + /** + * The name of the lock. + * + * @var string + */ + public $name; + + /** + * The maximum number of locks that can be obtained per time window. + * + * @var int + */ + public $maxLocks; + + /** + * The amount of time the lock window is maintained. + * + * @var int + */ + public $decay; + + /** + * The amount of time to block until a lock is available. + * + * @var int + */ + public $timeout = 3; + + /** + * The number of milliseconds to wait between attempts to acquire the lock. + * + * @var int + */ + public $sleep = 750; + + /** + * Create a new builder instance. + * + * @param \Illuminate\Redis\Connections\Connection $connection + * @param string $name + * @return void + */ + public function __construct($connection, $name) + { + $this->name = $name; + $this->connection = $connection; + } + + /** + * Set the maximum number of locks that can be obtained per time window. + * + * @param int $maxLocks + * @return $this + */ + public function allow($maxLocks) + { + $this->maxLocks = $maxLocks; + + return $this; + } + + /** + * Set the amount of time the lock window is maintained. + * + * @param \DateTimeInterface|\DateInterval|int $decay + * @return $this + */ + public function every($decay) + { + $this->decay = $this->secondsUntil($decay); + + return $this; + } + + /** + * Set the amount of time to block until a lock is available. + * + * @param int $timeout + * @return $this + */ + public function block($timeout) + { + $this->timeout = $timeout; + + return $this; + } + + /** + * The number of milliseconds to wait between lock acquisition attempts. + * + * @param int $sleep + * @return $this + */ + public function sleep($sleep) + { + $this->sleep = $sleep; + + return $this; + } + + /** + * Execute the given callback if a lock is obtained, otherwise call the failure callback. + * + * @param callable $callback + * @param callable|null $failure + * @return mixed + * + * @throws \Illuminate\Contracts\Redis\LimiterTimeoutException + */ + public function then(callable $callback, callable $failure = null) + { + try { + return (new DurationLimiter( + $this->connection, $this->name, $this->maxLocks, $this->decay + ))->block($this->timeout, $callback, $this->sleep); + } catch (LimiterTimeoutException $e) { + if ($failure) { + return $failure($e); + } + + throw $e; + } + } +} diff --git a/vendor/illuminate/redis/RedisManager.php b/vendor/illuminate/redis/RedisManager.php new file mode 100644 index 0000000..e869741 --- /dev/null +++ b/vendor/illuminate/redis/RedisManager.php @@ -0,0 +1,278 @@ +<?php + +namespace Illuminate\Redis; + +use Closure; +use Illuminate\Contracts\Redis\Factory; +use Illuminate\Redis\Connections\Connection; +use Illuminate\Redis\Connectors\PhpRedisConnector; +use Illuminate\Redis\Connectors\PredisConnector; +use Illuminate\Support\Arr; +use Illuminate\Support\ConfigurationUrlParser; +use InvalidArgumentException; + +/** + * @mixin \Illuminate\Redis\Connections\Connection + */ +class RedisManager implements Factory +{ + /** + * The application instance. + * + * @var \Illuminate\Contracts\Foundation\Application + */ + protected $app; + + /** + * The name of the default driver. + * + * @var string + */ + protected $driver; + + /** + * The registered custom driver creators. + * + * @var array + */ + protected $customCreators = []; + + /** + * The Redis server configurations. + * + * @var array + */ + protected $config; + + /** + * The Redis connections. + * + * @var mixed + */ + protected $connections; + + /** + * Indicates whether event dispatcher is set on connections. + * + * @var bool + */ + protected $events = false; + + /** + * Create a new Redis manager instance. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @param string $driver + * @param array $config + * @return void + */ + public function __construct($app, $driver, array $config) + { + $this->app = $app; + $this->driver = $driver; + $this->config = $config; + } + + /** + * Get a Redis connection by name. + * + * @param string|null $name + * @return \Illuminate\Redis\Connections\Connection + */ + public function connection($name = null) + { + $name = $name ?: 'default'; + + if (isset($this->connections[$name])) { + return $this->connections[$name]; + } + + return $this->connections[$name] = $this->configure( + $this->resolve($name), $name + ); + } + + /** + * Resolve the given connection by name. + * + * @param string|null $name + * @return \Illuminate\Redis\Connections\Connection + * + * @throws \InvalidArgumentException + */ + public function resolve($name = null) + { + $name = $name ?: 'default'; + + $options = $this->config['options'] ?? []; + + if (isset($this->config[$name])) { + return $this->connector()->connect( + $this->parseConnectionConfiguration($this->config[$name]), + array_merge(Arr::except($options, 'parameters'), ['parameters' => Arr::get($options, 'parameters.'.$name, Arr::get($options, 'parameters', []))]) + ); + } + + if (isset($this->config['clusters'][$name])) { + return $this->resolveCluster($name); + } + + throw new InvalidArgumentException("Redis connection [{$name}] not configured."); + } + + /** + * Resolve the given cluster connection by name. + * + * @param string $name + * @return \Illuminate\Redis\Connections\Connection + */ + protected function resolveCluster($name) + { + return $this->connector()->connectToCluster( + array_map(function ($config) { + return $this->parseConnectionConfiguration($config); + }, $this->config['clusters'][$name]), + $this->config['clusters']['options'] ?? [], + $this->config['options'] ?? [] + ); + } + + /** + * Configure the given connection to prepare it for commands. + * + * @param \Illuminate\Redis\Connections\Connection $connection + * @param string $name + * @return \Illuminate\Redis\Connections\Connection + */ + protected function configure(Connection $connection, $name) + { + $connection->setName($name); + + if ($this->events && $this->app->bound('events')) { + $connection->setEventDispatcher($this->app->make('events')); + } + + return $connection; + } + + /** + * Get the connector instance for the current driver. + * + * @return \Illuminate\Contracts\Redis\Connector|null + */ + protected function connector() + { + $customCreator = $this->customCreators[$this->driver] ?? null; + + if ($customCreator) { + return $customCreator(); + } + + return match ($this->driver) { + 'predis' => new PredisConnector, + 'phpredis' => new PhpRedisConnector, + default => null, + }; + } + + /** + * Parse the Redis connection configuration. + * + * @param mixed $config + * @return array + */ + protected function parseConnectionConfiguration($config) + { + $parsed = (new ConfigurationUrlParser)->parseConfiguration($config); + + $driver = strtolower($parsed['driver'] ?? ''); + + if (in_array($driver, ['tcp', 'tls'])) { + $parsed['scheme'] = $driver; + } + + return array_filter($parsed, function ($key) { + return ! in_array($key, ['driver'], true); + }, ARRAY_FILTER_USE_KEY); + } + + /** + * Return all of the created connections. + * + * @return array + */ + public function connections() + { + return $this->connections; + } + + /** + * Enable the firing of Redis command events. + * + * @return void + */ + public function enableEvents() + { + $this->events = true; + } + + /** + * Disable the firing of Redis command events. + * + * @return void + */ + public function disableEvents() + { + $this->events = false; + } + + /** + * Set the default driver. + * + * @param string $driver + * @return void + */ + public function setDriver($driver) + { + $this->driver = $driver; + } + + /** + * Disconnect the given connection and remove from local cache. + * + * @param string|null $name + * @return void + */ + public function purge($name = null) + { + $name = $name ?: 'default'; + + unset($this->connections[$name]); + } + + /** + * Register a custom driver creator Closure. + * + * @param string $driver + * @param \Closure $callback + * @return $this + */ + public function extend($driver, Closure $callback) + { + $this->customCreators[$driver] = $callback->bindTo($this, $this); + + return $this; + } + + /** + * Pass methods onto the default Redis connection. + * + * @param string $method + * @param array $parameters + * @return mixed + */ + public function __call($method, $parameters) + { + return $this->connection()->{$method}(...$parameters); + } +} diff --git a/vendor/illuminate/redis/RedisServiceProvider.php b/vendor/illuminate/redis/RedisServiceProvider.php new file mode 100755 index 0000000..66282e5 --- /dev/null +++ b/vendor/illuminate/redis/RedisServiceProvider.php @@ -0,0 +1,38 @@ +<?php + +namespace Illuminate\Redis; + +use Illuminate\Contracts\Support\DeferrableProvider; +use Illuminate\Support\Arr; +use Illuminate\Support\ServiceProvider; + +class RedisServiceProvider extends ServiceProvider implements DeferrableProvider +{ + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + $this->app->singleton('redis', function ($app) { + $config = $app->make('config')->get('database.redis', []); + + return new RedisManager($app, Arr::pull($config, 'client', 'phpredis'), $config); + }); + + $this->app->bind('redis.connection', function ($app) { + return $app['redis']->connection(); + }); + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() + { + return ['redis', 'redis.connection']; + } +} diff --git a/vendor/illuminate/redis/composer.json b/vendor/illuminate/redis/composer.json new file mode 100755 index 0000000..93fe330 --- /dev/null +++ b/vendor/illuminate/redis/composer.json @@ -0,0 +1,41 @@ +{ + "name": "illuminate/redis", + "description": "The Illuminate Redis package.", + "license": "MIT", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "require": { + "php": "^8.0.2", + "illuminate/collections": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/macroable": "^9.0", + "illuminate/support": "^9.0" + }, + "autoload": { + "psr-4": { + "Illuminate\\Redis\\": "" + } + }, + "suggest": { + "ext-redis": "Required to use the phpredis connector (^4.0|^5.0).", + "predis/predis": "Required to use the predis connector (^1.1.9|^2.0.2)." + }, + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev" +} diff --git a/vendor/illuminate/support/AggregateServiceProvider.php b/vendor/illuminate/support/AggregateServiceProvider.php new file mode 100644 index 0000000..d7425c5 --- /dev/null +++ b/vendor/illuminate/support/AggregateServiceProvider.php @@ -0,0 +1,52 @@ +<?php + +namespace Illuminate\Support; + +class AggregateServiceProvider extends ServiceProvider +{ + /** + * The provider class names. + * + * @var array + */ + protected $providers = []; + + /** + * An array of the service provider instances. + * + * @var array + */ + protected $instances = []; + + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + $this->instances = []; + + foreach ($this->providers as $provider) { + $this->instances[] = $this->app->register($provider); + } + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() + { + $provides = []; + + foreach ($this->providers as $provider) { + $instance = $this->app->resolveProvider($provider); + + $provides = array_merge($provides, $instance->provides()); + } + + return $provides; + } +} diff --git a/vendor/illuminate/support/Benchmark.php b/vendor/illuminate/support/Benchmark.php new file mode 100644 index 0000000..3a09d59 --- /dev/null +++ b/vendor/illuminate/support/Benchmark.php @@ -0,0 +1,50 @@ +<?php + +namespace Illuminate\Support; + +use Closure; + +class Benchmark +{ + /** + * Measure a callable or array of callables over the given number of iterations. + * + * @param \Closure|array $benchmarkables + * @param int $iterations + * @return array|float + */ + public static function measure(Closure|array $benchmarkables, int $iterations = 1): array|float + { + return collect(Arr::wrap($benchmarkables))->map(function ($callback) use ($iterations) { + return collect(range(1, $iterations))->map(function () use ($callback) { + gc_collect_cycles(); + + $start = hrtime(true); + + $callback(); + + return (hrtime(true) - $start) / 1000000; + })->average(); + })->when( + $benchmarkables instanceof Closure, + fn ($c) => $c->first(), + fn ($c) => $c->all(), + ); + } + + /** + * Measure a callable or array of callables over the given number of iterations, then dump and die. + * + * @param \Closure|array $benchmarkables + * @param int $iterations + * @return never + */ + public static function dd(Closure|array $benchmarkables, int $iterations = 1): void + { + $result = collect(static::measure(Arr::wrap($benchmarkables), $iterations)) + ->map(fn ($average) => number_format($average, 3).'ms') + ->when($benchmarkables instanceof Closure, fn ($c) => $c->first(), fn ($c) => $c->all()); + + dd($result); + } +} diff --git a/vendor/illuminate/support/Carbon.php b/vendor/illuminate/support/Carbon.php new file mode 100644 index 0000000..972d7eb --- /dev/null +++ b/vendor/illuminate/support/Carbon.php @@ -0,0 +1,21 @@ +<?php + +namespace Illuminate\Support; + +use Carbon\Carbon as BaseCarbon; +use Carbon\CarbonImmutable as BaseCarbonImmutable; +use Illuminate\Support\Traits\Conditionable; + +class Carbon extends BaseCarbon +{ + use Conditionable; + + /** + * {@inheritdoc} + */ + public static function setTestNow($testNow = null) + { + BaseCarbon::setTestNow($testNow); + BaseCarbonImmutable::setTestNow($testNow); + } +} diff --git a/vendor/illuminate/support/Composer.php b/vendor/illuminate/support/Composer.php new file mode 100644 index 0000000..9933615 --- /dev/null +++ b/vendor/illuminate/support/Composer.php @@ -0,0 +1,132 @@ +<?php + +namespace Illuminate\Support; + +use Illuminate\Filesystem\Filesystem; +use Symfony\Component\Process\PhpExecutableFinder; +use Symfony\Component\Process\Process; + +class Composer +{ + /** + * The filesystem instance. + * + * @var \Illuminate\Filesystem\Filesystem + */ + protected $files; + + /** + * The working path to regenerate from. + * + * @var string|null + */ + protected $workingPath; + + /** + * Create a new Composer manager instance. + * + * @param \Illuminate\Filesystem\Filesystem $files + * @param string|null $workingPath + * @return void + */ + public function __construct(Filesystem $files, $workingPath = null) + { + $this->files = $files; + $this->workingPath = $workingPath; + } + + /** + * Regenerate the Composer autoloader files. + * + * @param string|array $extra + * @return int + */ + public function dumpAutoloads($extra = '') + { + $extra = $extra ? (array) $extra : []; + + $command = array_merge($this->findComposer(), ['dump-autoload'], $extra); + + return $this->getProcess($command)->run(); + } + + /** + * Regenerate the optimized Composer autoloader files. + * + * @return int + */ + public function dumpOptimized() + { + return $this->dumpAutoloads('--optimize'); + } + + /** + * Get the composer command for the environment. + * + * @return array + */ + public function findComposer() + { + if ($this->files->exists($this->workingPath.'/composer.phar')) { + return [$this->phpBinary(), 'composer.phar']; + } + + return ['composer']; + } + + /** + * Get the PHP binary. + * + * @return string + */ + protected function phpBinary() + { + return ProcessUtils::escapeArgument((new PhpExecutableFinder)->find(false)); + } + + /** + * Get a new Symfony process instance. + * + * @param array $command + * @return \Symfony\Component\Process\Process + */ + protected function getProcess(array $command) + { + return (new Process($command, $this->workingPath))->setTimeout(null); + } + + /** + * Set the working path used by the class. + * + * @param string $path + * @return $this + */ + public function setWorkingPath($path) + { + $this->workingPath = realpath($path); + + return $this; + } + + /** + * Get the version of Composer. + * + * @return string|null + */ + public function getVersion() + { + $command = array_merge($this->findComposer(), ['-V', '--no-ansi']); + + $process = $this->getProcess($command); + + $process->run(); + + $output = $process->getOutput(); + + if (preg_match('/(\d+(\.\d+){2})/', $output, $version)) { + return $version[1]; + } + + return explode(' ', $output)[2] ?? null; + } +} diff --git a/vendor/illuminate/support/ConfigurationUrlParser.php b/vendor/illuminate/support/ConfigurationUrlParser.php new file mode 100644 index 0000000..a1b9337 --- /dev/null +++ b/vendor/illuminate/support/ConfigurationUrlParser.php @@ -0,0 +1,191 @@ +<?php + +namespace Illuminate\Support; + +use InvalidArgumentException; + +class ConfigurationUrlParser +{ + /** + * The drivers aliases map. + * + * @var array + */ + protected static $driverAliases = [ + 'mssql' => 'sqlsrv', + 'mysql2' => 'mysql', // RDS + 'postgres' => 'pgsql', + 'postgresql' => 'pgsql', + 'sqlite3' => 'sqlite', + 'redis' => 'tcp', + 'rediss' => 'tls', + ]; + + /** + * Parse the database configuration, hydrating options using a database configuration URL if possible. + * + * @param array|string $config + * @return array + */ + public function parseConfiguration($config) + { + if (is_string($config)) { + $config = ['url' => $config]; + } + + $url = Arr::pull($config, 'url'); + + if (! $url) { + return $config; + } + + $rawComponents = $this->parseUrl($url); + + $decodedComponents = $this->parseStringsToNativeTypes( + array_map('rawurldecode', $rawComponents) + ); + + return array_merge( + $config, + $this->getPrimaryOptions($decodedComponents), + $this->getQueryOptions($rawComponents) + ); + } + + /** + * Get the primary database connection options. + * + * @param array $url + * @return array + */ + protected function getPrimaryOptions($url) + { + return array_filter([ + 'driver' => $this->getDriver($url), + 'database' => $this->getDatabase($url), + 'host' => $url['host'] ?? null, + 'port' => $url['port'] ?? null, + 'username' => $url['user'] ?? null, + 'password' => $url['pass'] ?? null, + ], fn ($value) => ! is_null($value)); + } + + /** + * Get the database driver from the URL. + * + * @param array $url + * @return string|null + */ + protected function getDriver($url) + { + $alias = $url['scheme'] ?? null; + + if (! $alias) { + return; + } + + return static::$driverAliases[$alias] ?? $alias; + } + + /** + * Get the database name from the URL. + * + * @param array $url + * @return string|null + */ + protected function getDatabase($url) + { + $path = $url['path'] ?? null; + + return $path && $path !== '/' ? substr($path, 1) : null; + } + + /** + * Get all of the additional database options from the query string. + * + * @param array $url + * @return array + */ + protected function getQueryOptions($url) + { + $queryString = $url['query'] ?? null; + + if (! $queryString) { + return []; + } + + $query = []; + + parse_str($queryString, $query); + + return $this->parseStringsToNativeTypes($query); + } + + /** + * Parse the string URL to an array of components. + * + * @param string $url + * @return array + * + * @throws \InvalidArgumentException + */ + protected function parseUrl($url) + { + $url = preg_replace('#^(sqlite3?):///#', '$1://null/', $url); + + $parsedUrl = parse_url($url); + + if ($parsedUrl === false) { + throw new InvalidArgumentException('The database configuration URL is malformed.'); + } + + return $parsedUrl; + } + + /** + * Convert string casted values to their native types. + * + * @param mixed $value + * @return mixed + */ + protected function parseStringsToNativeTypes($value) + { + if (is_array($value)) { + return array_map([$this, 'parseStringsToNativeTypes'], $value); + } + + if (! is_string($value)) { + return $value; + } + + $parsedValue = json_decode($value, true); + + if (json_last_error() === JSON_ERROR_NONE) { + return $parsedValue; + } + + return $value; + } + + /** + * Get all of the current drivers' aliases. + * + * @return array + */ + public static function getDriverAliases() + { + return static::$driverAliases; + } + + /** + * Add the given driver alias to the driver aliases array. + * + * @param string $alias + * @param string $driver + * @return void + */ + public static function addDriverAlias($alias, $driver) + { + static::$driverAliases[$alias] = $driver; + } +} diff --git a/vendor/illuminate/support/DateFactory.php b/vendor/illuminate/support/DateFactory.php new file mode 100644 index 0000000..22d79fc --- /dev/null +++ b/vendor/illuminate/support/DateFactory.php @@ -0,0 +1,231 @@ +<?php + +namespace Illuminate\Support; + +use Carbon\Factory; +use InvalidArgumentException; + +/** + * @see https://carbon.nesbot.com/docs/ + * @see https://github.com/briannesbitt/Carbon/blob/master/src/Carbon/Factory.php + * + * @method \Illuminate\Support\Carbon create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $tz = null) + * @method \Illuminate\Support\Carbon createFromDate($year = null, $month = null, $day = null, $tz = null) + * @method \Illuminate\Support\Carbon|false createFromFormat($format, $time, $tz = null) + * @method \Illuminate\Support\Carbon createFromTime($hour = 0, $minute = 0, $second = 0, $tz = null) + * @method \Illuminate\Support\Carbon createFromTimeString($time, $tz = null) + * @method \Illuminate\Support\Carbon createFromTimestamp($timestamp, $tz = null) + * @method \Illuminate\Support\Carbon createFromTimestampMs($timestamp, $tz = null) + * @method \Illuminate\Support\Carbon createFromTimestampUTC($timestamp) + * @method \Illuminate\Support\Carbon createMidnightDate($year = null, $month = null, $day = null, $tz = null) + * @method \Illuminate\Support\Carbon|false createSafe($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $tz = null) + * @method \Illuminate\Support\Carbon disableHumanDiffOption($humanDiffOption) + * @method \Illuminate\Support\Carbon enableHumanDiffOption($humanDiffOption) + * @method mixed executeWithLocale($locale, $func) + * @method \Illuminate\Support\Carbon fromSerialized($value) + * @method array getAvailableLocales() + * @method array getDays() + * @method int getHumanDiffOptions() + * @method array getIsoUnits() + * @method \Illuminate\Support\Carbon getLastErrors() + * @method string getLocale() + * @method int getMidDayAt() + * @method \Illuminate\Support\Carbon getTestNow() + * @method \Symfony\Component\Translation\TranslatorInterface getTranslator() + * @method int getWeekEndsAt() + * @method int getWeekStartsAt() + * @method array getWeekendDays() + * @method bool hasFormat($date, $format) + * @method bool hasMacro($name) + * @method bool hasRelativeKeywords($time) + * @method bool hasTestNow() + * @method \Illuminate\Support\Carbon instance($date) + * @method bool isImmutable() + * @method bool isModifiableUnit($unit) + * @method \Illuminate\Support\Carbon isMutable() + * @method bool isStrictModeEnabled() + * @method bool localeHasDiffOneDayWords($locale) + * @method bool localeHasDiffSyntax($locale) + * @method bool localeHasDiffTwoDayWords($locale) + * @method bool localeHasPeriodSyntax($locale) + * @method bool localeHasShortUnits($locale) + * @method void macro($name, $macro) + * @method \Illuminate\Support\Carbon|null make($var) + * @method \Illuminate\Support\Carbon maxValue() + * @method \Illuminate\Support\Carbon minValue() + * @method void mixin($mixin) + * @method \Illuminate\Support\Carbon now($tz = null) + * @method \Illuminate\Support\Carbon parse($time = null, $tz = null) + * @method string pluralUnit(string $unit) + * @method void resetMonthsOverflow() + * @method void resetToStringFormat() + * @method void resetYearsOverflow() + * @method void serializeUsing($callback) + * @method \Illuminate\Support\Carbon setHumanDiffOptions($humanDiffOptions) + * @method bool setLocale($locale) + * @method void setMidDayAt($hour) + * @method void setTestNow($testNow = null) + * @method void setToStringFormat($format) + * @method void setTranslator(\Symfony\Component\Translation\TranslatorInterface $translator) + * @method \Illuminate\Support\Carbon setUtf8($utf8) + * @method void setWeekEndsAt($day) + * @method void setWeekStartsAt($day) + * @method void setWeekendDays($days) + * @method bool shouldOverflowMonths() + * @method bool shouldOverflowYears() + * @method string singularUnit(string $unit) + * @method \Illuminate\Support\Carbon today($tz = null) + * @method \Illuminate\Support\Carbon tomorrow($tz = null) + * @method void useMonthsOverflow($monthsOverflow = true) + * @method \Illuminate\Support\Carbon useStrictMode($strictModeEnabled = true) + * @method void useYearsOverflow($yearsOverflow = true) + * @method \Illuminate\Support\Carbon yesterday($tz = null) + */ +class DateFactory +{ + /** + * The default class that will be used for all created dates. + * + * @var string + */ + const DEFAULT_CLASS_NAME = Carbon::class; + + /** + * The type (class) of dates that should be created. + * + * @var string + */ + protected static $dateClass; + + /** + * This callable may be used to intercept date creation. + * + * @var callable + */ + protected static $callable; + + /** + * The Carbon factory that should be used when creating dates. + * + * @var object + */ + protected static $factory; + + /** + * Use the given handler when generating dates (class name, callable, or factory). + * + * @param mixed $handler + * @return mixed + * + * @throws \InvalidArgumentException + */ + public static function use($handler) + { + if (is_callable($handler) && is_object($handler)) { + return static::useCallable($handler); + } elseif (is_string($handler)) { + return static::useClass($handler); + } elseif ($handler instanceof Factory) { + return static::useFactory($handler); + } + + throw new InvalidArgumentException('Invalid date creation handler. Please provide a class name, callable, or Carbon factory.'); + } + + /** + * Use the default date class when generating dates. + * + * @return void + */ + public static function useDefault() + { + static::$dateClass = null; + static::$callable = null; + static::$factory = null; + } + + /** + * Execute the given callable on each date creation. + * + * @param callable $callable + * @return void + */ + public static function useCallable(callable $callable) + { + static::$callable = $callable; + + static::$dateClass = null; + static::$factory = null; + } + + /** + * Use the given date type (class) when generating dates. + * + * @param string $dateClass + * @return void + */ + public static function useClass($dateClass) + { + static::$dateClass = $dateClass; + + static::$factory = null; + static::$callable = null; + } + + /** + * Use the given Carbon factory when generating dates. + * + * @param object $factory + * @return void + */ + public static function useFactory($factory) + { + static::$factory = $factory; + + static::$dateClass = null; + static::$callable = null; + } + + /** + * Handle dynamic calls to generate dates. + * + * @param string $method + * @param array $parameters + * @return mixed + * + * @throws \RuntimeException + */ + public function __call($method, $parameters) + { + $defaultClassName = static::DEFAULT_CLASS_NAME; + + // Using callable to generate dates... + if (static::$callable) { + return call_user_func(static::$callable, $defaultClassName::$method(...$parameters)); + } + + // Using Carbon factory to generate dates... + if (static::$factory) { + return static::$factory->$method(...$parameters); + } + + $dateClass = static::$dateClass ?: $defaultClassName; + + // Check if the date can be created using the public class method... + if (method_exists($dateClass, $method) || + method_exists($dateClass, 'hasMacro') && $dateClass::hasMacro($method)) { + return $dateClass::$method(...$parameters); + } + + // If that fails, create the date with the default class... + $date = $defaultClassName::$method(...$parameters); + + // If the configured class has an "instance" method, we'll try to pass our date into there... + if (method_exists($dateClass, 'instance')) { + return $dateClass::instance($date); + } + + // Otherwise, assume the configured class has a DateTime compatible constructor... + return new $dateClass($date->format('Y-m-d H:i:s.u'), $date->getTimezone()); + } +} diff --git a/vendor/illuminate/support/Env.php b/vendor/illuminate/support/Env.php new file mode 100644 index 0000000..4d5747a --- /dev/null +++ b/vendor/illuminate/support/Env.php @@ -0,0 +1,101 @@ +<?php + +namespace Illuminate\Support; + +use Dotenv\Repository\Adapter\PutenvAdapter; +use Dotenv\Repository\RepositoryBuilder; +use PhpOption\Option; + +class Env +{ + /** + * Indicates if the putenv adapter is enabled. + * + * @var bool + */ + protected static $putenv = true; + + /** + * The environment repository instance. + * + * @var \Dotenv\Repository\RepositoryInterface|null + */ + protected static $repository; + + /** + * Enable the putenv adapter. + * + * @return void + */ + public static function enablePutenv() + { + static::$putenv = true; + static::$repository = null; + } + + /** + * Disable the putenv adapter. + * + * @return void + */ + public static function disablePutenv() + { + static::$putenv = false; + static::$repository = null; + } + + /** + * Get the environment repository instance. + * + * @return \Dotenv\Repository\RepositoryInterface + */ + public static function getRepository() + { + if (static::$repository === null) { + $builder = RepositoryBuilder::createWithDefaultAdapters(); + + if (static::$putenv) { + $builder = $builder->addAdapter(PutenvAdapter::class); + } + + static::$repository = $builder->immutable()->make(); + } + + return static::$repository; + } + + /** + * Gets the value of an environment variable. + * + * @param string $key + * @param mixed $default + * @return mixed + */ + public static function get($key, $default = null) + { + return Option::fromValue(static::getRepository()->get($key)) + ->map(function ($value) { + switch (strtolower($value)) { + case 'true': + case '(true)': + return true; + case 'false': + case '(false)': + return false; + case 'empty': + case '(empty)': + return ''; + case 'null': + case '(null)': + return; + } + + if (preg_match('/\A([\'"])(.*)\1\z/', $value, $matches)) { + return $matches[2]; + } + + return $value; + }) + ->getOrCall(fn () => value($default)); + } +} diff --git a/vendor/illuminate/support/Facades/App.php b/vendor/illuminate/support/Facades/App.php new file mode 100755 index 0000000..9754f98 --- /dev/null +++ b/vendor/illuminate/support/Facades/App.php @@ -0,0 +1,141 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static string version() + * @method static void bootstrapWith(string[] $bootstrappers) + * @method static void afterLoadingEnvironment(\Closure $callback) + * @method static void beforeBootstrapping(string $bootstrapper, \Closure $callback) + * @method static void afterBootstrapping(string $bootstrapper, \Closure $callback) + * @method static bool hasBeenBootstrapped() + * @method static \Illuminate\Foundation\Application setBasePath(string $basePath) + * @method static string path(string $path = '') + * @method static \Illuminate\Foundation\Application useAppPath(string $path) + * @method static string basePath(string $path = '') + * @method static string bootstrapPath(string $path = '') + * @method static string configPath(string $path = '') + * @method static string databasePath(string $path = '') + * @method static \Illuminate\Foundation\Application useDatabasePath(string $path) + * @method static string langPath(string $path = '') + * @method static \Illuminate\Foundation\Application useLangPath(string $path) + * @method static string publicPath() + * @method static string storagePath(string $path = '') + * @method static \Illuminate\Foundation\Application useStoragePath(string $path) + * @method static string resourcePath(string $path = '') + * @method static string viewPath(string $path = '') + * @method static string environmentPath() + * @method static \Illuminate\Foundation\Application useEnvironmentPath(string $path) + * @method static \Illuminate\Foundation\Application loadEnvironmentFrom(string $file) + * @method static string environmentFile() + * @method static string environmentFilePath() + * @method static string|bool environment(string|array ...$environments) + * @method static bool isLocal() + * @method static bool isProduction() + * @method static string detectEnvironment(\Closure $callback) + * @method static bool runningInConsole() + * @method static bool runningUnitTests() + * @method static bool hasDebugModeEnabled() + * @method static void registerConfiguredProviders() + * @method static \Illuminate\Support\ServiceProvider register(\Illuminate\Support\ServiceProvider|string $provider, bool $force = false) + * @method static \Illuminate\Support\ServiceProvider|null getProvider(\Illuminate\Support\ServiceProvider|string $provider) + * @method static array getProviders(\Illuminate\Support\ServiceProvider|string $provider) + * @method static \Illuminate\Support\ServiceProvider resolveProvider(string $provider) + * @method static void loadDeferredProviders() + * @method static void loadDeferredProvider(string $service) + * @method static void registerDeferredProvider(string $provider, string|null $service = null) + * @method static mixed make(string $abstract, array $parameters = []) + * @method static bool bound(string $abstract) + * @method static bool isBooted() + * @method static void boot() + * @method static void booting(callable $callback) + * @method static void booted(callable $callback) + * @method static \Symfony\Component\HttpFoundation\Response handle(\Symfony\Component\HttpFoundation\Request $request, int $type = 1, bool $catch = true) + * @method static bool shouldSkipMiddleware() + * @method static string getCachedServicesPath() + * @method static string getCachedPackagesPath() + * @method static bool configurationIsCached() + * @method static string getCachedConfigPath() + * @method static bool routesAreCached() + * @method static string getCachedRoutesPath() + * @method static bool eventsAreCached() + * @method static string getCachedEventsPath() + * @method static \Illuminate\Foundation\Application addAbsoluteCachePathPrefix(string $prefix) + * @method static \Illuminate\Contracts\Foundation\MaintenanceMode maintenanceMode() + * @method static bool isDownForMaintenance() + * @method static never abort(int $code, string $message = '', array $headers = []) + * @method static \Illuminate\Foundation\Application terminating(callable|string $callback) + * @method static void terminate() + * @method static array getLoadedProviders() + * @method static bool providerIsLoaded(string $provider) + * @method static array getDeferredServices() + * @method static void setDeferredServices(array $services) + * @method static void addDeferredServices(array $services) + * @method static bool isDeferredService(string $service) + * @method static void provideFacades(string $namespace) + * @method static string getLocale() + * @method static string currentLocale() + * @method static string getFallbackLocale() + * @method static void setLocale(string $locale) + * @method static void setFallbackLocale(string $fallbackLocale) + * @method static bool isLocale(string $locale) + * @method static void registerCoreContainerAliases() + * @method static void flush() + * @method static string getNamespace() + * @method static \Illuminate\Contracts\Container\ContextualBindingBuilder when(array|string $concrete) + * @method static bool has(string $id) + * @method static bool isShared(string $abstract) + * @method static bool isAlias(string $name) + * @method static void bind(string $abstract, \Closure|string|null $concrete = null, bool $shared = false) + * @method static bool hasMethodBinding(string $method) + * @method static void bindMethod(array|string $method, \Closure $callback) + * @method static mixed callMethodBinding(string $method, mixed $instance) + * @method static void addContextualBinding(string $concrete, string $abstract, \Closure|string $implementation) + * @method static void bindIf(string $abstract, \Closure|string|null $concrete = null, bool $shared = false) + * @method static void singleton(string $abstract, \Closure|string|null $concrete = null) + * @method static void singletonIf(string $abstract, \Closure|string|null $concrete = null) + * @method static void scoped(string $abstract, \Closure|string|null $concrete = null) + * @method static void scopedIf(string $abstract, \Closure|string|null $concrete = null) + * @method static void extend(string $abstract, \Closure $closure) + * @method static mixed instance(string $abstract, mixed $instance) + * @method static void tag(array|string $abstracts, array|mixed $tags) + * @method static iterable tagged(string $tag) + * @method static void alias(string $abstract, string $alias) + * @method static mixed rebinding(string $abstract, \Closure $callback) + * @method static mixed refresh(string $abstract, mixed $target, string $method) + * @method static \Closure wrap(\Closure $callback, array $parameters = []) + * @method static mixed call(callable|string $callback, array<string, mixed> $parameters = [], string|null $defaultMethod = null) + * @method static \Closure factory(string $abstract) + * @method static mixed makeWith(string|callable $abstract, array $parameters = []) + * @method static mixed get(string $id) + * @method static mixed build(\Closure|string $concrete) + * @method static void beforeResolving(\Closure|string $abstract, \Closure|null $callback = null) + * @method static void resolving(\Closure|string $abstract, \Closure|null $callback = null) + * @method static void afterResolving(\Closure|string $abstract, \Closure|null $callback = null) + * @method static array getBindings() + * @method static string getAlias(string $abstract) + * @method static void forgetExtenders(string $abstract) + * @method static void forgetInstance(string $abstract) + * @method static void forgetInstances() + * @method static void forgetScopedInstances() + * @method static \Illuminate\Foundation\Application getInstance() + * @method static \Illuminate\Contracts\Container\Container|\Illuminate\Foundation\Application setInstance(\Illuminate\Contracts\Container\Container|null $container = null) + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * + * @see \Illuminate\Foundation\Application + */ +class App extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'app'; + } +} diff --git a/vendor/illuminate/support/Facades/Artisan.php b/vendor/illuminate/support/Facades/Artisan.php new file mode 100755 index 0000000..0efa850 --- /dev/null +++ b/vendor/illuminate/support/Facades/Artisan.php @@ -0,0 +1,35 @@ +<?php + +namespace Illuminate\Support\Facades; + +use Illuminate\Contracts\Console\Kernel as ConsoleKernelContract; + +/** + * @method static int handle(\Symfony\Component\Console\Input\InputInterface $input, \Symfony\Component\Console\Output\OutputInterface|null $output = null) + * @method static void terminate(\Symfony\Component\Console\Input\InputInterface $input, int $status) + * @method static void whenCommandLifecycleIsLongerThan(\DateTimeInterface|\Carbon\CarbonInterval|float|int $threshold, callable $handler) + * @method static \Illuminate\Support\Carbon|null commandStartedAt() + * @method static \Illuminate\Foundation\Console\ClosureCommand command(string $signature, \Closure $callback) + * @method static void registerCommand(\Symfony\Component\Console\Command\Command $command) + * @method static int call(string $command, array $parameters = [], \Symfony\Component\Console\Output\OutputInterface|null $outputBuffer = null) + * @method static \Illuminate\Foundation\Bus\PendingDispatch queue(string $command, array $parameters = []) + * @method static array all() + * @method static string output() + * @method static void bootstrap() + * @method static void bootstrapWithoutBootingProviders() + * @method static void setArtisan(\Illuminate\Console\Application $artisan) + * + * @see \Illuminate\Foundation\Console\Kernel + */ +class Artisan extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return ConsoleKernelContract::class; + } +} diff --git a/vendor/illuminate/support/Facades/Auth.php b/vendor/illuminate/support/Facades/Auth.php new file mode 100755 index 0000000..fd5ac51 --- /dev/null +++ b/vendor/illuminate/support/Facades/Auth.php @@ -0,0 +1,98 @@ +<?php + +namespace Illuminate\Support\Facades; + +use Laravel\Ui\UiServiceProvider; +use RuntimeException; + +/** + * @method static \Illuminate\Contracts\Auth\Guard|\Illuminate\Contracts\Auth\StatefulGuard guard(string|null $name = null) + * @method static \Illuminate\Auth\SessionGuard createSessionDriver(string $name, array $config) + * @method static \Illuminate\Auth\TokenGuard createTokenDriver(string $name, array $config) + * @method static string getDefaultDriver() + * @method static void shouldUse(string $name) + * @method static void setDefaultDriver(string $name) + * @method static \Illuminate\Auth\AuthManager viaRequest(string $driver, callable $callback) + * @method static \Closure userResolver() + * @method static \Illuminate\Auth\AuthManager resolveUsersUsing(\Closure $userResolver) + * @method static \Illuminate\Auth\AuthManager extend(string $driver, \Closure $callback) + * @method static \Illuminate\Auth\AuthManager provider(string $name, \Closure $callback) + * @method static bool hasResolvedGuards() + * @method static \Illuminate\Auth\AuthManager forgetGuards() + * @method static \Illuminate\Auth\AuthManager setApplication(\Illuminate\Contracts\Foundation\Application $app) + * @method static \Illuminate\Contracts\Auth\UserProvider|null createUserProvider(string|null $provider = null) + * @method static string getDefaultUserProvider() + * @method static bool check() + * @method static bool guest() + * @method static \Illuminate\Contracts\Auth\Authenticatable|null user() + * @method static int|string|null id() + * @method static bool validate(array $credentials = []) + * @method static bool hasUser() + * @method static void setUser(\Illuminate\Contracts\Auth\Authenticatable $user) + * @method static bool attempt(array $credentials = [], bool $remember = false) + * @method static bool once(array $credentials = []) + * @method static void login(\Illuminate\Contracts\Auth\Authenticatable $user, bool $remember = false) + * @method static \Illuminate\Contracts\Auth\Authenticatable|bool loginUsingId(mixed $id, bool $remember = false) + * @method static \Illuminate\Contracts\Auth\Authenticatable|bool onceUsingId(mixed $id) + * @method static bool viaRemember() + * @method static void logout() + * @method static \Symfony\Component\HttpFoundation\Response|null basic(string $field = 'email', array $extraConditions = []) + * @method static \Symfony\Component\HttpFoundation\Response|null onceBasic(string $field = 'email', array $extraConditions = []) + * @method static bool attemptWhen(array $credentials = [], array|callable|null $callbacks = null, bool $remember = false) + * @method static void logoutCurrentDevice() + * @method static \Illuminate\Contracts\Auth\Authenticatable|null logoutOtherDevices(string $password, string $attribute = 'password') + * @method static void attempting(mixed $callback) + * @method static \Illuminate\Contracts\Auth\Authenticatable getLastAttempted() + * @method static string getName() + * @method static string getRecallerName() + * @method static \Illuminate\Auth\SessionGuard setRememberDuration(int $minutes) + * @method static \Illuminate\Contracts\Cookie\QueueingFactory getCookieJar() + * @method static void setCookieJar(\Illuminate\Contracts\Cookie\QueueingFactory $cookie) + * @method static \Illuminate\Contracts\Events\Dispatcher getDispatcher() + * @method static void setDispatcher(\Illuminate\Contracts\Events\Dispatcher $events) + * @method static \Illuminate\Contracts\Session\Session getSession() + * @method static \Illuminate\Contracts\Auth\Authenticatable|null getUser() + * @method static \Symfony\Component\HttpFoundation\Request getRequest() + * @method static \Illuminate\Auth\SessionGuard setRequest(\Symfony\Component\HttpFoundation\Request $request) + * @method static \Illuminate\Support\Timebox getTimebox() + * @method static \Illuminate\Contracts\Auth\Authenticatable authenticate() + * @method static \Illuminate\Auth\SessionGuard forgetUser() + * @method static \Illuminate\Contracts\Auth\UserProvider getProvider() + * @method static void setProvider(\Illuminate\Contracts\Auth\UserProvider $provider) + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * + * @see \Illuminate\Auth\AuthManager + * @see \Illuminate\Auth\SessionGuard + */ +class Auth extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'auth'; + } + + /** + * Register the typical authentication routes for an application. + * + * @param array $options + * @return void + * + * @throws \RuntimeException + */ + public static function routes(array $options = []) + { + if (! static::$app->providerIsLoaded(UiServiceProvider::class)) { + throw new RuntimeException('In order to use the Auth::routes() method, please install the laravel/ui package.'); + } + + static::$app->make('router')->auth($options); + } +} diff --git a/vendor/illuminate/support/Facades/Blade.php b/vendor/illuminate/support/Facades/Blade.php new file mode 100755 index 0000000..a58b214 --- /dev/null +++ b/vendor/illuminate/support/Facades/Blade.php @@ -0,0 +1,60 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static void compile(string|null $path = null) + * @method static string getPath() + * @method static void setPath(string $path) + * @method static string compileString(string $value) + * @method static string render(string $string, array $data = [], bool $deleteCachedView = false) + * @method static string renderComponent(\Illuminate\View\Component $component) + * @method static string stripParentheses(string $expression) + * @method static void extend(callable $compiler) + * @method static array getExtensions() + * @method static void if(string $name, callable $callback) + * @method static bool check(string $name, array ...$parameters) + * @method static void component(string $class, string|null $alias = null, string $prefix = '') + * @method static void components(array $components, string $prefix = '') + * @method static array getClassComponentAliases() + * @method static void anonymousComponentPath(string $path, string|null $prefix = null) + * @method static void anonymousComponentNamespace(string $directory, string|null $prefix = null) + * @method static void componentNamespace(string $namespace, string $prefix) + * @method static array getAnonymousComponentPaths() + * @method static array getAnonymousComponentNamespaces() + * @method static array getClassComponentNamespaces() + * @method static void aliasComponent(string $path, string|null $alias = null) + * @method static void include(string $path, string|null $alias = null) + * @method static void aliasInclude(string $path, string|null $alias = null) + * @method static void directive(string $name, callable $handler) + * @method static array getCustomDirectives() + * @method static void precompiler(callable $precompiler) + * @method static void setEchoFormat(string $format) + * @method static void withDoubleEncoding() + * @method static void withoutDoubleEncoding() + * @method static void withoutComponentTags() + * @method static string getCompiledPath(string $path) + * @method static bool isExpired(string $path) + * @method static string newComponentHash(string $component) + * @method static string compileClassComponentOpening(string $component, string $alias, string $data, string $hash) + * @method static string compileEndComponentClass() + * @method static mixed sanitizeComponentAttribute(mixed $value) + * @method static string compileEndOnce() + * @method static void stringable(string|callable $class, callable|null $handler = null) + * @method static string compileEchos(string $value) + * @method static string applyEchoHandler(string $value) + * + * @see \Illuminate\View\Compilers\BladeCompiler + */ +class Blade extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'blade.compiler'; + } +} diff --git a/vendor/illuminate/support/Facades/Broadcast.php b/vendor/illuminate/support/Facades/Broadcast.php new file mode 100644 index 0000000..aca0eac --- /dev/null +++ b/vendor/illuminate/support/Facades/Broadcast.php @@ -0,0 +1,46 @@ +<?php + +namespace Illuminate\Support\Facades; + +use Illuminate\Contracts\Broadcasting\Factory as BroadcastingFactoryContract; + +/** + * @method static void routes(array|null $attributes = null) + * @method static void userRoutes(array|null $attributes = null) + * @method static void channelRoutes(array|null $attributes = null) + * @method static string|null socket(\Illuminate\Http\Request|null $request = null) + * @method static \Illuminate\Broadcasting\PendingBroadcast event(mixed|null $event = null) + * @method static void queue(mixed $event) + * @method static mixed connection(string|null $driver = null) + * @method static mixed driver(string|null $name = null) + * @method static \Pusher\Pusher pusher(array $config) + * @method static \Ably\AblyRest ably(array $config) + * @method static string getDefaultDriver() + * @method static void setDefaultDriver(string $name) + * @method static void purge(string|null $name = null) + * @method static \Illuminate\Broadcasting\BroadcastManager extend(string $driver, \Closure $callback) + * @method static \Illuminate\Contracts\Foundation\Application getApplication() + * @method static \Illuminate\Broadcasting\BroadcastManager setApplication(\Illuminate\Contracts\Foundation\Application $app) + * @method static \Illuminate\Broadcasting\BroadcastManager forgetDrivers() + * @method static mixed auth(\Illuminate\Http\Request $request) + * @method static mixed validAuthenticationResponse(\Illuminate\Http\Request $request, mixed $result) + * @method static void broadcast(array $channels, string $event, array $payload = []) + * @method static array|null resolveAuthenticatedUser(\Illuminate\Http\Request $request) + * @method static void resolveAuthenticatedUserUsing(\Closure $callback) + * @method static \Illuminate\Broadcasting\Broadcasters\Broadcaster channel(\Illuminate\Contracts\Broadcasting\HasBroadcastChannel|string $channel, callable|string $callback, array $options = []) + * + * @see \Illuminate\Broadcasting\BroadcastManager + * @see \Illuminate\Broadcasting\Broadcasters\Broadcaster + */ +class Broadcast extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return BroadcastingFactoryContract::class; + } +} diff --git a/vendor/illuminate/support/Facades/Bus.php b/vendor/illuminate/support/Facades/Bus.php new file mode 100644 index 0000000..986784c --- /dev/null +++ b/vendor/illuminate/support/Facades/Bus.php @@ -0,0 +1,91 @@ +<?php + +namespace Illuminate\Support\Facades; + +use Illuminate\Bus\BatchRepository; +use Illuminate\Contracts\Bus\Dispatcher as BusDispatcherContract; +use Illuminate\Foundation\Bus\PendingChain; +use Illuminate\Support\Testing\Fakes\BusFake; + +/** + * @method static mixed dispatch(mixed $command) + * @method static mixed dispatchSync(mixed $command, mixed $handler = null) + * @method static mixed dispatchNow(mixed $command, mixed $handler = null) + * @method static \Illuminate\Bus\Batch|null findBatch(string $batchId) + * @method static \Illuminate\Bus\PendingBatch batch(\Illuminate\Support\Collection|array|mixed $jobs) + * @method static \Illuminate\Foundation\Bus\PendingChain chain(\Illuminate\Support\Collection|array $jobs) + * @method static bool hasCommandHandler(mixed $command) + * @method static bool|mixed getCommandHandler(mixed $command) + * @method static mixed dispatchToQueue(mixed $command) + * @method static void dispatchAfterResponse(mixed $command, mixed $handler = null) + * @method static \Illuminate\Bus\Dispatcher pipeThrough(array $pipes) + * @method static \Illuminate\Bus\Dispatcher map(array $map) + * @method static void except(array|string $jobsToDispatch) + * @method static void assertDispatched(string|\Closure $command, callable|int|null $callback = null) + * @method static void assertDispatchedTimes(string $command, int $times = 1) + * @method static void assertNotDispatched(string|\Closure $command, callable|null $callback = null) + * @method static void assertNothingDispatched() + * @method static void assertDispatchedSync(string|\Closure $command, callable|int|null $callback = null) + * @method static void assertDispatchedSyncTimes(string $command, int $times = 1) + * @method static void assertNotDispatchedSync(string|\Closure $command, callable|null $callback = null) + * @method static void assertDispatchedAfterResponse(string|\Closure $command, callable|int|null $callback = null) + * @method static void assertDispatchedAfterResponseTimes(string $command, int $times = 1) + * @method static void assertNotDispatchedAfterResponse(string|\Closure $command, callable|null $callback = null) + * @method static void assertChained(array $expectedChain) + * @method static void assertDispatchedWithoutChain(string|\Closure $command, callable|null $callback = null) + * @method static void assertBatched(callable $callback) + * @method static void assertBatchCount(int $count) + * @method static void assertNothingBatched() + * @method static \Illuminate\Support\Collection dispatched(string $command, callable|null $callback = null) + * @method static \Illuminate\Support\Collection dispatchedSync(string $command, callable|null $callback = null) + * @method static \Illuminate\Support\Collection dispatchedAfterResponse(string $command, callable|null $callback = null) + * @method static \Illuminate\Support\Collection batched(callable $callback) + * @method static bool hasDispatched(string $command) + * @method static bool hasDispatchedSync(string $command) + * @method static bool hasDispatchedAfterResponse(string $command) + * @method static \Illuminate\Bus\Batch dispatchFakeBatch(string $name = '') + * @method static \Illuminate\Bus\Batch recordPendingBatch(\Illuminate\Bus\PendingBatch $pendingBatch) + * + * @see \Illuminate\Bus\Dispatcher + * @see \Illuminate\Support\Testing\Fakes\BusFake + */ +class Bus extends Facade +{ + /** + * Replace the bound instance with a fake. + * + * @param array|string $jobsToFake + * @param \Illuminate\Bus\BatchRepository|null $batchRepository + * @return \Illuminate\Support\Testing\Fakes\BusFake + */ + public static function fake($jobsToFake = [], BatchRepository $batchRepository = null) + { + static::swap($fake = new BusFake(static::getFacadeRoot(), $jobsToFake, $batchRepository)); + + return $fake; + } + + /** + * Dispatch the given chain of jobs. + * + * @param array|mixed $jobs + * @return \Illuminate\Foundation\Bus\PendingDispatch + */ + public static function dispatchChain($jobs) + { + $jobs = is_array($jobs) ? $jobs : func_get_args(); + + return (new PendingChain(array_shift($jobs), $jobs)) + ->dispatch(); + } + + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return BusDispatcherContract::class; + } +} diff --git a/vendor/illuminate/support/Facades/Cache.php b/vendor/illuminate/support/Facades/Cache.php new file mode 100755 index 0000000..4bb149b --- /dev/null +++ b/vendor/illuminate/support/Facades/Cache.php @@ -0,0 +1,66 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static \Illuminate\Contracts\Cache\Repository store(string|null $name = null) + * @method static \Illuminate\Contracts\Cache\Repository driver(string|null $driver = null) + * @method static \Illuminate\Cache\Repository repository(\Illuminate\Contracts\Cache\Store $store) + * @method static void refreshEventDispatcher() + * @method static string getDefaultDriver() + * @method static void setDefaultDriver(string $name) + * @method static \Illuminate\Cache\CacheManager forgetDriver(array|string|null $name = null) + * @method static void purge(string|null $name = null) + * @method static \Illuminate\Cache\CacheManager extend(string $driver, \Closure $callback) + * @method static bool has(string $key) + * @method static bool missing(string $key) + * @method static mixed get(array|string $key, mixed $default = null) + * @method static array many(array $keys) + * @method static iterable getMultiple(iterable<string> $keys, mixed $default = null) + * @method static mixed pull(string $key, mixed $default = null) + * @method static bool put(array|string $key, mixed $value, \DateTimeInterface|\DateInterval|int|null $ttl = null) + * @method static bool set(string $key, mixed $value, null|int|\DateInterval $ttl = null) + * @method static bool putMany(array $values, \DateTimeInterface|\DateInterval|int|null $ttl = null) + * @method static bool setMultiple(iterable $values, null|int|\DateInterval $ttl = null) + * @method static bool add(string $key, mixed $value, \DateTimeInterface|\DateInterval|int|null $ttl = null) + * @method static int|bool increment(string $key, mixed $value = 1) + * @method static int|bool decrement(string $key, mixed $value = 1) + * @method static bool forever(string $key, mixed $value) + * @method static mixed remember(string $key, \Closure|\DateTimeInterface|\DateInterval|int|null $ttl, \Closure $callback) + * @method static mixed sear(string $key, \Closure $callback) + * @method static mixed rememberForever(string $key, \Closure $callback) + * @method static bool forget(string $key) + * @method static bool delete(string $key) + * @method static bool deleteMultiple(iterable<string> $keys) + * @method static bool clear() + * @method static \Illuminate\Cache\TaggedCache tags(array|mixed $names) + * @method static bool supportsTags() + * @method static int|null getDefaultCacheTime() + * @method static \Illuminate\Cache\Repository setDefaultCacheTime(int|null $seconds) + * @method static \Illuminate\Contracts\Cache\Store getStore() + * @method static \Illuminate\Contracts\Events\Dispatcher getEventDispatcher() + * @method static void setEventDispatcher(\Illuminate\Contracts\Events\Dispatcher $events) + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * @method static mixed macroCall(string $method, array $parameters) + * @method static bool flush() + * @method static string getPrefix() + * @method static \Illuminate\Contracts\Cache\Lock lock(string $name, int $seconds = 0, string|null $owner = null) + * @method static \Illuminate\Contracts\Cache\Lock restoreLock(string $name, string $owner) + * + * @see \Illuminate\Cache\CacheManager + */ +class Cache extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'cache'; + } +} diff --git a/vendor/illuminate/support/Facades/Config.php b/vendor/illuminate/support/Facades/Config.php new file mode 100755 index 0000000..e4d6a62 --- /dev/null +++ b/vendor/illuminate/support/Facades/Config.php @@ -0,0 +1,31 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static bool has(string $key) + * @method static mixed get(array|string $key, mixed $default = null) + * @method static array getMany(array $keys) + * @method static void set(array|string $key, mixed $value = null) + * @method static void prepend(string $key, mixed $value) + * @method static void push(string $key, mixed $value) + * @method static array all() + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * + * @see \Illuminate\Config\Repository + */ +class Config extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'config'; + } +} diff --git a/vendor/illuminate/support/Facades/Cookie.php b/vendor/illuminate/support/Facades/Cookie.php new file mode 100755 index 0000000..e524736 --- /dev/null +++ b/vendor/illuminate/support/Facades/Cookie.php @@ -0,0 +1,58 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static \Symfony\Component\HttpFoundation\Cookie make(string $name, string $value, int $minutes = 0, string|null $path = null, string|null $domain = null, bool|null $secure = null, bool $httpOnly = true, bool $raw = false, string|null $sameSite = null) + * @method static \Symfony\Component\HttpFoundation\Cookie forever(string $name, string $value, string|null $path = null, string|null $domain = null, bool|null $secure = null, bool $httpOnly = true, bool $raw = false, string|null $sameSite = null) + * @method static \Symfony\Component\HttpFoundation\Cookie forget(string $name, string|null $path = null, string|null $domain = null) + * @method static bool hasQueued(string $key, string|null $path = null) + * @method static \Symfony\Component\HttpFoundation\Cookie|null queued(string $key, mixed $default = null, string|null $path = null) + * @method static void queue(array ...$parameters) + * @method static void expire(string $name, string|null $path = null, string|null $domain = null) + * @method static void unqueue(string $name, string|null $path = null) + * @method static \Illuminate\Cookie\CookieJar setDefaultPathAndDomain(string $path, string $domain, bool $secure = false, string|null $sameSite = null) + * @method static \Symfony\Component\HttpFoundation\Cookie[] getQueuedCookies() + * @method static \Illuminate\Cookie\CookieJar flushQueuedCookies() + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * + * @see \Illuminate\Cookie\CookieJar + */ +class Cookie extends Facade +{ + /** + * Determine if a cookie exists on the request. + * + * @param string $key + * @return bool + */ + public static function has($key) + { + return ! is_null(static::$app['request']->cookie($key, null)); + } + + /** + * Retrieve a cookie from the request. + * + * @param string|null $key + * @param mixed $default + * @return string|array|null + */ + public static function get($key = null, $default = null) + { + return static::$app['request']->cookie($key, $default); + } + + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'cookie'; + } +} diff --git a/vendor/illuminate/support/Facades/Crypt.php b/vendor/illuminate/support/Facades/Crypt.php new file mode 100755 index 0000000..20f269d --- /dev/null +++ b/vendor/illuminate/support/Facades/Crypt.php @@ -0,0 +1,27 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static bool supported(string $key, string $cipher) + * @method static string generateKey(string $cipher) + * @method static string encrypt(mixed $value, bool $serialize = true) + * @method static string encryptString(string $value) + * @method static mixed decrypt(string $payload, bool $unserialize = true) + * @method static string decryptString(string $payload) + * @method static string getKey() + * + * @see \Illuminate\Encryption\Encrypter + */ +class Crypt extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'encrypter'; + } +} diff --git a/vendor/illuminate/support/Facades/DB.php b/vendor/illuminate/support/Facades/DB.php new file mode 100755 index 0000000..9c27ab0 --- /dev/null +++ b/vendor/illuminate/support/Facades/DB.php @@ -0,0 +1,119 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static \Illuminate\Database\Connection connection(string|null $name = null) + * @method static void registerDoctrineType(string $class, string $name, string $type) + * @method static void purge(string|null $name = null) + * @method static void disconnect(string|null $name = null) + * @method static \Illuminate\Database\Connection reconnect(string|null $name = null) + * @method static mixed usingConnection(string $name, callable $callback) + * @method static string getDefaultConnection() + * @method static void setDefaultConnection(string $name) + * @method static string[] supportedDrivers() + * @method static string[] availableDrivers() + * @method static void extend(string $name, callable $resolver) + * @method static void forgetExtension(string $name) + * @method static array<string, \Illuminate\Database\Connection> getConnections() + * @method static void setReconnector(callable $reconnector) + * @method static \Illuminate\Database\DatabaseManager setApplication(\Illuminate\Contracts\Foundation\Application $app) + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * @method static mixed macroCall(string $method, array $parameters) + * @method static void useDefaultQueryGrammar() + * @method static void useDefaultSchemaGrammar() + * @method static void useDefaultPostProcessor() + * @method static \Illuminate\Database\Schema\Builder getSchemaBuilder() + * @method static \Illuminate\Database\Query\Builder table(\Closure|\Illuminate\Database\Query\Builder|string $table, string|null $as = null) + * @method static \Illuminate\Database\Query\Builder query() + * @method static mixed selectOne(string $query, array $bindings = [], bool $useReadPdo = true) + * @method static mixed scalar(string $query, array $bindings = [], bool $useReadPdo = true) + * @method static array selectFromWriteConnection(string $query, array $bindings = []) + * @method static array select(string $query, array $bindings = [], bool $useReadPdo = true) + * @method static \Generator cursor(string $query, array $bindings = [], bool $useReadPdo = true) + * @method static bool insert(string $query, array $bindings = []) + * @method static int update(string $query, array $bindings = []) + * @method static int delete(string $query, array $bindings = []) + * @method static bool statement(string $query, array $bindings = []) + * @method static int affectingStatement(string $query, array $bindings = []) + * @method static bool unprepared(string $query) + * @method static array pretend(\Closure $callback) + * @method static void bindValues(\PDOStatement $statement, array $bindings) + * @method static array prepareBindings(array $bindings) + * @method static void logQuery(string $query, array $bindings, float|null $time = null) + * @method static void whenQueryingForLongerThan(\DateTimeInterface|\Carbon\CarbonInterval|float|int $threshold, callable $handler) + * @method static void allowQueryDurationHandlersToRunAgain() + * @method static float totalQueryDuration() + * @method static void resetTotalQueryDuration() + * @method static \Illuminate\Database\Connection beforeExecuting(\Closure $callback) + * @method static void listen(\Closure $callback) + * @method static \Illuminate\Database\Query\Expression raw(mixed $value) + * @method static bool hasModifiedRecords() + * @method static void recordsHaveBeenModified(bool $value = true) + * @method static \Illuminate\Database\Connection setRecordModificationState(bool $value) + * @method static void forgetRecordModificationState() + * @method static \Illuminate\Database\Connection useWriteConnectionWhenReading(bool $value = true) + * @method static bool isDoctrineAvailable() + * @method static bool usingNativeSchemaOperations() + * @method static \Doctrine\DBAL\Schema\Column getDoctrineColumn(string $table, string $column) + * @method static \Doctrine\DBAL\Schema\AbstractSchemaManager getDoctrineSchemaManager() + * @method static \Doctrine\DBAL\Connection getDoctrineConnection() + * @method static \PDO getPdo() + * @method static \PDO|\Closure|null getRawPdo() + * @method static \PDO getReadPdo() + * @method static \PDO|\Closure|null getRawReadPdo() + * @method static \Illuminate\Database\Connection setPdo(\PDO|\Closure|null $pdo) + * @method static \Illuminate\Database\Connection setReadPdo(\PDO|\Closure|null $pdo) + * @method static string|null getName() + * @method static string|null getNameWithReadWriteType() + * @method static mixed getConfig(string|null $option = null) + * @method static string getDriverName() + * @method static \Illuminate\Database\Query\Grammars\Grammar getQueryGrammar() + * @method static \Illuminate\Database\Connection setQueryGrammar(\Illuminate\Database\Query\Grammars\Grammar $grammar) + * @method static \Illuminate\Database\Schema\Grammars\Grammar getSchemaGrammar() + * @method static \Illuminate\Database\Connection setSchemaGrammar(\Illuminate\Database\Schema\Grammars\Grammar $grammar) + * @method static \Illuminate\Database\Query\Processors\Processor getPostProcessor() + * @method static \Illuminate\Database\Connection setPostProcessor(\Illuminate\Database\Query\Processors\Processor $processor) + * @method static \Illuminate\Contracts\Events\Dispatcher getEventDispatcher() + * @method static \Illuminate\Database\Connection setEventDispatcher(\Illuminate\Contracts\Events\Dispatcher $events) + * @method static void unsetEventDispatcher() + * @method static \Illuminate\Database\Connection setTransactionManager(\Illuminate\Database\DatabaseTransactionsManager $manager) + * @method static void unsetTransactionManager() + * @method static bool pretending() + * @method static array getQueryLog() + * @method static void flushQueryLog() + * @method static void enableQueryLog() + * @method static void disableQueryLog() + * @method static bool logging() + * @method static string getDatabaseName() + * @method static \Illuminate\Database\Connection setDatabaseName(string $database) + * @method static \Illuminate\Database\Connection setReadWriteType(string|null $readWriteType) + * @method static string getTablePrefix() + * @method static \Illuminate\Database\Connection setTablePrefix(string $prefix) + * @method static \Illuminate\Database\Grammar withTablePrefix(\Illuminate\Database\Grammar $grammar) + * @method static void resolverFor(string $driver, \Closure $callback) + * @method static mixed getResolver(string $driver) + * @method static mixed transaction(\Closure $callback, int $attempts = 1) + * @method static void beginTransaction() + * @method static void commit() + * @method static void rollBack(int|null $toLevel = null) + * @method static int transactionLevel() + * @method static void afterCommit(callable $callback) + * + * @see \Illuminate\Database\DatabaseManager + */ +class DB extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'db'; + } +} diff --git a/vendor/illuminate/support/Facades/Date.php b/vendor/illuminate/support/Facades/Date.php new file mode 100644 index 0000000..40bc3ed --- /dev/null +++ b/vendor/illuminate/support/Facades/Date.php @@ -0,0 +1,122 @@ +<?php + +namespace Illuminate\Support\Facades; + +use Illuminate\Support\DateFactory; + +/** + * @see https://carbon.nesbot.com/docs/ + * @see https://github.com/briannesbitt/Carbon/blob/master/src/Carbon/Factory.php + * + * @method static mixed use(mixed $handler) + * @method static void useDefault() + * @method static void useCallable(callable $callable) + * @method static void useClass(string $dateClass) + * @method static void useFactory(object $factory) + * @method static \Illuminate\Support\Carbon create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $tz = null) + * @method static \Illuminate\Support\Carbon createFromDate($year = null, $month = null, $day = null, $tz = null) + * @method static \Illuminate\Support\Carbon|false createFromFormat($format, $time, $tz = null) + * @method static \Illuminate\Support\Carbon createFromTime($hour = 0, $minute = 0, $second = 0, $tz = null) + * @method static \Illuminate\Support\Carbon createFromTimeString($time, $tz = null) + * @method static \Illuminate\Support\Carbon createFromTimestamp($timestamp, $tz = null) + * @method static \Illuminate\Support\Carbon createFromTimestampMs($timestamp, $tz = null) + * @method static \Illuminate\Support\Carbon createFromTimestampUTC($timestamp) + * @method static \Illuminate\Support\Carbon createMidnightDate($year = null, $month = null, $day = null, $tz = null) + * @method static \Illuminate\Support\Carbon|false createSafe($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $tz = null) + * @method static \Illuminate\Support\Carbon disableHumanDiffOption($humanDiffOption) + * @method static \Illuminate\Support\Carbon enableHumanDiffOption($humanDiffOption) + * @method static mixed executeWithLocale($locale, $func) + * @method static \Illuminate\Support\Carbon fromSerialized($value) + * @method static array getAvailableLocales() + * @method static array getDays() + * @method static int getHumanDiffOptions() + * @method static array getIsoUnits() + * @method static \Illuminate\Support\Carbon getLastErrors() + * @method static string getLocale() + * @method static int getMidDayAt() + * @method static \Illuminate\Support\Carbon getTestNow() + * @method static \Symfony\Component\Translation\TranslatorInterface getTranslator() + * @method static int getWeekEndsAt() + * @method static int getWeekStartsAt() + * @method static array getWeekendDays() + * @method static bool hasFormat($date, $format) + * @method static bool hasMacro($name) + * @method static bool hasRelativeKeywords($time) + * @method static bool hasTestNow() + * @method static \Illuminate\Support\Carbon instance($date) + * @method static bool isImmutable() + * @method static bool isModifiableUnit($unit) + * @method static \Illuminate\Support\Carbon isMutable() + * @method static bool isStrictModeEnabled() + * @method static bool localeHasDiffOneDayWords($locale) + * @method static bool localeHasDiffSyntax($locale) + * @method static bool localeHasDiffTwoDayWords($locale) + * @method static bool localeHasPeriodSyntax($locale) + * @method static bool localeHasShortUnits($locale) + * @method static void macro($name, $macro) + * @method static \Illuminate\Support\Carbon|null make($var) + * @method static \Illuminate\Support\Carbon maxValue() + * @method static \Illuminate\Support\Carbon minValue() + * @method static void mixin($mixin) + * @method static \Illuminate\Support\Carbon now($tz = null) + * @method static \Illuminate\Support\Carbon parse($time = null, $tz = null) + * @method static string pluralUnit(string $unit) + * @method static void resetMonthsOverflow() + * @method static void resetToStringFormat() + * @method static void resetYearsOverflow() + * @method static void serializeUsing($callback) + * @method static \Illuminate\Support\Carbon setHumanDiffOptions($humanDiffOptions) + * @method static bool setLocale($locale) + * @method static void setMidDayAt($hour) + * @method static void setTestNow($testNow = null) + * @method static void setToStringFormat($format) + * @method static void setTranslator(\Symfony\Component\Translation\TranslatorInterface $translator) + * @method static \Illuminate\Support\Carbon setUtf8($utf8) + * @method static void setWeekEndsAt($day) + * @method static void setWeekStartsAt($day) + * @method static void setWeekendDays($days) + * @method static bool shouldOverflowMonths() + * @method static bool shouldOverflowYears() + * @method static string singularUnit(string $unit) + * @method static \Illuminate\Support\Carbon today($tz = null) + * @method static \Illuminate\Support\Carbon tomorrow($tz = null) + * @method static void useMonthsOverflow($monthsOverflow = true) + * @method static \Illuminate\Support\Carbon useStrictMode($strictModeEnabled = true) + * @method static void useYearsOverflow($yearsOverflow = true) + * @method static \Illuminate\Support\Carbon yesterday($tz = null) + * + * @see \Illuminate\Support\DateFactory + */ +class Date extends Facade +{ + const DEFAULT_FACADE = DateFactory::class; + + /** + * Get the registered name of the component. + * + * @return string + * + * @throws \RuntimeException + */ + protected static function getFacadeAccessor() + { + return 'date'; + } + + /** + * Resolve the facade root instance from the container. + * + * @param string $name + * @return mixed + */ + protected static function resolveFacadeInstance($name) + { + if (! isset(static::$resolvedInstance[$name]) && ! isset(static::$app, static::$app[$name])) { + $class = static::DEFAULT_FACADE; + + static::swap(new $class); + } + + return parent::resolveFacadeInstance($name); + } +} diff --git a/vendor/illuminate/support/Facades/Event.php b/vendor/illuminate/support/Facades/Event.php new file mode 100755 index 0000000..382bc86 --- /dev/null +++ b/vendor/illuminate/support/Facades/Event.php @@ -0,0 +1,124 @@ +<?php + +namespace Illuminate\Support\Facades; + +use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Testing\Fakes\EventFake; + +/** + * @method static void listen(\Closure|string|array $events, \Closure|string|array|null $listener = null) + * @method static bool hasListeners(string $eventName) + * @method static bool hasWildcardListeners(string $eventName) + * @method static void push(string $event, object|array $payload = []) + * @method static void flush(string $event) + * @method static void subscribe(object|string $subscriber) + * @method static array|null until(string|object $event, mixed $payload = []) + * @method static array|null dispatch(string|object $event, mixed $payload = [], bool $halt = false) + * @method static array getListeners(string $eventName) + * @method static \Closure makeListener(\Closure|string|array $listener, bool $wildcard = false) + * @method static \Closure createClassListener(string $listener, bool $wildcard = false) + * @method static void forget(string $event) + * @method static void forgetPushed() + * @method static \Illuminate\Events\Dispatcher setQueueResolver(callable $resolver) + * @method static array getRawListeners() + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * @method static \Illuminate\Support\Testing\Fakes\EventFake except(array|string $eventsToDispatch) + * @method static void assertListening(string $expectedEvent, string|array $expectedListener) + * @method static void assertDispatched(string|\Closure $event, callable|int|null $callback = null) + * @method static void assertDispatchedTimes(string $event, int $times = 1) + * @method static void assertNotDispatched(string|\Closure $event, callable|null $callback = null) + * @method static void assertNothingDispatched() + * @method static \Illuminate\Support\Collection dispatched(string $event, callable|null $callback = null) + * @method static bool hasDispatched(string $event) + * + * @see \Illuminate\Events\Dispatcher + * @see \Illuminate\Support\Testing\Fakes\EventFake + */ +class Event extends Facade +{ + /** + * Replace the bound instance with a fake. + * + * @param array|string $eventsToFake + * @return \Illuminate\Support\Testing\Fakes\EventFake + */ + public static function fake($eventsToFake = []) + { + static::swap($fake = new EventFake(static::getFacadeRoot(), $eventsToFake)); + + Model::setEventDispatcher($fake); + Cache::refreshEventDispatcher(); + + return $fake; + } + + /** + * Replace the bound instance with a fake that fakes all events except the given events. + * + * @param string[]|string $eventsToAllow + * @return \Illuminate\Support\Testing\Fakes\EventFake + */ + public static function fakeExcept($eventsToAllow) + { + return static::fake([ + function ($eventName) use ($eventsToAllow) { + return ! in_array($eventName, (array) $eventsToAllow); + }, + ]); + } + + /** + * Replace the bound instance with a fake during the given callable's execution. + * + * @param callable $callable + * @param array $eventsToFake + * @return mixed + */ + public static function fakeFor(callable $callable, array $eventsToFake = []) + { + $originalDispatcher = static::getFacadeRoot(); + + static::fake($eventsToFake); + + return tap($callable(), function () use ($originalDispatcher) { + static::swap($originalDispatcher); + + Model::setEventDispatcher($originalDispatcher); + Cache::refreshEventDispatcher(); + }); + } + + /** + * Replace the bound instance with a fake during the given callable's execution. + * + * @param callable $callable + * @param array $eventsToAllow + * @return mixed + */ + public static function fakeExceptFor(callable $callable, array $eventsToAllow = []) + { + $originalDispatcher = static::getFacadeRoot(); + + static::fakeExcept($eventsToAllow); + + return tap($callable(), function () use ($originalDispatcher) { + static::swap($originalDispatcher); + + Model::setEventDispatcher($originalDispatcher); + Cache::refreshEventDispatcher(); + }); + } + + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'events'; + } +} diff --git a/vendor/illuminate/support/Facades/Facade.php b/vendor/illuminate/support/Facades/Facade.php new file mode 100755 index 0000000..219e599 --- /dev/null +++ b/vendor/illuminate/support/Facades/Facade.php @@ -0,0 +1,340 @@ +<?php + +namespace Illuminate\Support\Facades; + +use Closure; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Arr; +use Illuminate\Support\Js; +use Illuminate\Support\Str; +use Mockery; +use Mockery\LegacyMockInterface; +use RuntimeException; + +abstract class Facade +{ + /** + * The application instance being facaded. + * + * @var \Illuminate\Contracts\Foundation\Application + */ + protected static $app; + + /** + * The resolved object instances. + * + * @var array + */ + protected static $resolvedInstance; + + /** + * Indicates if the resolved instance should be cached. + * + * @var bool + */ + protected static $cached = true; + + /** + * Run a Closure when the facade has been resolved. + * + * @param \Closure $callback + * @return void + */ + public static function resolved(Closure $callback) + { + $accessor = static::getFacadeAccessor(); + + if (static::$app->resolved($accessor) === true) { + $callback(static::getFacadeRoot()); + } + + static::$app->afterResolving($accessor, function ($service) use ($callback) { + $callback($service); + }); + } + + /** + * Convert the facade into a Mockery spy. + * + * @return \Mockery\MockInterface + */ + public static function spy() + { + if (! static::isMock()) { + $class = static::getMockableClass(); + + return tap($class ? Mockery::spy($class) : Mockery::spy(), function ($spy) { + static::swap($spy); + }); + } + } + + /** + * Initiate a partial mock on the facade. + * + * @return \Mockery\MockInterface + */ + public static function partialMock() + { + $name = static::getFacadeAccessor(); + + $mock = static::isMock() + ? static::$resolvedInstance[$name] + : static::createFreshMockInstance(); + + return $mock->makePartial(); + } + + /** + * Initiate a mock expectation on the facade. + * + * @return \Mockery\Expectation + */ + public static function shouldReceive() + { + $name = static::getFacadeAccessor(); + + $mock = static::isMock() + ? static::$resolvedInstance[$name] + : static::createFreshMockInstance(); + + return $mock->shouldReceive(...func_get_args()); + } + + /** + * Initiate a mock expectation on the facade. + * + * @return \Mockery\Expectation + */ + public static function expects() + { + $name = static::getFacadeAccessor(); + + $mock = static::isMock() + ? static::$resolvedInstance[$name] + : static::createFreshMockInstance(); + + return $mock->expects(...func_get_args()); + } + + /** + * Create a fresh mock instance for the given class. + * + * @return \Mockery\MockInterface + */ + protected static function createFreshMockInstance() + { + return tap(static::createMock(), function ($mock) { + static::swap($mock); + + $mock->shouldAllowMockingProtectedMethods(); + }); + } + + /** + * Create a fresh mock instance for the given class. + * + * @return \Mockery\MockInterface + */ + protected static function createMock() + { + $class = static::getMockableClass(); + + return $class ? Mockery::mock($class) : Mockery::mock(); + } + + /** + * Determines whether a mock is set as the instance of the facade. + * + * @return bool + */ + protected static function isMock() + { + $name = static::getFacadeAccessor(); + + return isset(static::$resolvedInstance[$name]) && + static::$resolvedInstance[$name] instanceof LegacyMockInterface; + } + + /** + * Get the mockable class for the bound instance. + * + * @return string|null + */ + protected static function getMockableClass() + { + if ($root = static::getFacadeRoot()) { + return get_class($root); + } + } + + /** + * Hotswap the underlying instance behind the facade. + * + * @param mixed $instance + * @return void + */ + public static function swap($instance) + { + static::$resolvedInstance[static::getFacadeAccessor()] = $instance; + + if (isset(static::$app)) { + static::$app->instance(static::getFacadeAccessor(), $instance); + } + } + + /** + * Get the root object behind the facade. + * + * @return mixed + */ + public static function getFacadeRoot() + { + return static::resolveFacadeInstance(static::getFacadeAccessor()); + } + + /** + * Get the registered name of the component. + * + * @return string + * + * @throws \RuntimeException + */ + protected static function getFacadeAccessor() + { + throw new RuntimeException('Facade does not implement getFacadeAccessor method.'); + } + + /** + * Resolve the facade root instance from the container. + * + * @param string $name + * @return mixed + */ + protected static function resolveFacadeInstance($name) + { + if (isset(static::$resolvedInstance[$name])) { + return static::$resolvedInstance[$name]; + } + + if (static::$app) { + if (static::$cached) { + return static::$resolvedInstance[$name] = static::$app[$name]; + } + + return static::$app[$name]; + } + } + + /** + * Clear a resolved facade instance. + * + * @param string $name + * @return void + */ + public static function clearResolvedInstance($name) + { + unset(static::$resolvedInstance[$name]); + } + + /** + * Clear all of the resolved instances. + * + * @return void + */ + public static function clearResolvedInstances() + { + static::$resolvedInstance = []; + } + + /** + * Get the application default aliases. + * + * @return \Illuminate\Support\Collection + */ + public static function defaultAliases() + { + return collect([ + 'App' => App::class, + 'Arr' => Arr::class, + 'Artisan' => Artisan::class, + 'Auth' => Auth::class, + 'Blade' => Blade::class, + 'Broadcast' => Broadcast::class, + 'Bus' => Bus::class, + 'Cache' => Cache::class, + 'Config' => Config::class, + 'Cookie' => Cookie::class, + 'Crypt' => Crypt::class, + 'Date' => Date::class, + 'DB' => DB::class, + 'Eloquent' => Model::class, + 'Event' => Event::class, + 'File' => File::class, + 'Gate' => Gate::class, + 'Hash' => Hash::class, + 'Http' => Http::class, + 'Js' => Js::class, + 'Lang' => Lang::class, + 'Log' => Log::class, + 'Mail' => Mail::class, + 'Notification' => Notification::class, + 'Password' => Password::class, + 'Queue' => Queue::class, + 'RateLimiter' => RateLimiter::class, + 'Redirect' => Redirect::class, + 'Request' => Request::class, + 'Response' => Response::class, + 'Route' => Route::class, + 'Schema' => Schema::class, + 'Session' => Session::class, + 'Storage' => Storage::class, + 'Str' => Str::class, + 'URL' => URL::class, + 'Validator' => Validator::class, + 'View' => View::class, + 'Vite' => Vite::class, + ]); + } + + /** + * Get the application instance behind the facade. + * + * @return \Illuminate\Contracts\Foundation\Application + */ + public static function getFacadeApplication() + { + return static::$app; + } + + /** + * Set the application instance. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return void + */ + public static function setFacadeApplication($app) + { + static::$app = $app; + } + + /** + * Handle dynamic, static calls to the object. + * + * @param string $method + * @param array $args + * @return mixed + * + * @throws \RuntimeException + */ + public static function __callStatic($method, $args) + { + $instance = static::getFacadeRoot(); + + if (! $instance) { + throw new RuntimeException('A facade root has not been set.'); + } + + return $instance->$method(...$args); + } +} diff --git a/vendor/illuminate/support/Facades/File.php b/vendor/illuminate/support/Facades/File.php new file mode 100755 index 0000000..7dcb132 --- /dev/null +++ b/vendor/illuminate/support/Facades/File.php @@ -0,0 +1,71 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static bool exists(string $path) + * @method static bool missing(string $path) + * @method static string get(string $path, bool $lock = false) + * @method static string sharedGet(string $path) + * @method static mixed getRequire(string $path, array $data = []) + * @method static mixed requireOnce(string $path, array $data = []) + * @method static \Illuminate\Support\LazyCollection lines(string $path) + * @method static string hash(string $path, string $algorithm = 'md5') + * @method static int|bool put(string $path, string $contents, bool $lock = false) + * @method static void replace(string $path, string $content) + * @method static void replaceInFile(array|string $search, array|string $replace, string $path) + * @method static int prepend(string $path, string $data) + * @method static int append(string $path, string $data) + * @method static mixed chmod(string $path, int|null $mode = null) + * @method static bool delete(string|array $paths) + * @method static bool move(string $path, string $target) + * @method static bool copy(string $path, string $target) + * @method static void link(string $target, string $link) + * @method static void relativeLink(string $target, string $link) + * @method static string name(string $path) + * @method static string basename(string $path) + * @method static string dirname(string $path) + * @method static string extension(string $path) + * @method static string|null guessExtension(string $path) + * @method static string type(string $path) + * @method static string|false mimeType(string $path) + * @method static int size(string $path) + * @method static int lastModified(string $path) + * @method static bool isDirectory(string $directory) + * @method static bool isEmptyDirectory(string $directory, bool $ignoreDotFiles = false) + * @method static bool isReadable(string $path) + * @method static bool isWritable(string $path) + * @method static bool hasSameHash(string $firstFile, string $secondFile) + * @method static bool isFile(string $file) + * @method static array glob(string $pattern, int $flags = 0) + * @method static \Symfony\Component\Finder\SplFileInfo[] files(string $directory, bool $hidden = false) + * @method static \Symfony\Component\Finder\SplFileInfo[] allFiles(string $directory, bool $hidden = false) + * @method static array directories(string $directory) + * @method static void ensureDirectoryExists(string $path, int $mode = 0755, bool $recursive = true) + * @method static bool makeDirectory(string $path, int $mode = 0755, bool $recursive = false, bool $force = false) + * @method static bool moveDirectory(string $from, string $to, bool $overwrite = false) + * @method static bool copyDirectory(string $directory, string $destination, int|null $options = null) + * @method static bool deleteDirectory(string $directory, bool $preserve = false) + * @method static bool deleteDirectories(string $directory) + * @method static bool cleanDirectory(string $directory) + * @method static \Illuminate\Filesystem\Filesystem|mixed when((\Closure(\Illuminate\Filesystem\Filesystem): mixed)|mixed $value = null, (callable(\Illuminate\Filesystem\Filesystem, mixed): mixed)|null $callback = null, (callable(\Illuminate\Filesystem\Filesystem, mixed): mixed)|null $default = null) + * @method static \Illuminate\Filesystem\Filesystem|mixed unless((\Closure(\Illuminate\Filesystem\Filesystem): mixed)|mixed $value = null, (callable(\Illuminate\Filesystem\Filesystem, mixed): mixed)|null $callback = null, (callable(\Illuminate\Filesystem\Filesystem, mixed): mixed)|null $default = null) + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * + * @see \Illuminate\Filesystem\Filesystem + */ +class File extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'files'; + } +} diff --git a/vendor/illuminate/support/Facades/Gate.php b/vendor/illuminate/support/Facades/Gate.php new file mode 100644 index 0000000..f4fba39 --- /dev/null +++ b/vendor/illuminate/support/Facades/Gate.php @@ -0,0 +1,47 @@ +<?php + +namespace Illuminate\Support\Facades; + +use Illuminate\Contracts\Auth\Access\Gate as GateContract; + +/** + * @method static bool has(string|array $ability) + * @method static \Illuminate\Auth\Access\Response allowIf(\Illuminate\Auth\Access\Response|\Closure|bool $condition, string|null $message = null, string|null $code = null) + * @method static \Illuminate\Auth\Access\Response denyIf(\Illuminate\Auth\Access\Response|\Closure|bool $condition, string|null $message = null, string|null $code = null) + * @method static \Illuminate\Auth\Access\Gate define(string $ability, callable|array|string $callback) + * @method static \Illuminate\Auth\Access\Gate resource(string $name, string $class, array|null $abilities = null) + * @method static \Illuminate\Auth\Access\Gate policy(string $class, string $policy) + * @method static \Illuminate\Auth\Access\Gate before(callable $callback) + * @method static \Illuminate\Auth\Access\Gate after(callable $callback) + * @method static bool allows(string $ability, array|mixed $arguments = []) + * @method static bool denies(string $ability, array|mixed $arguments = []) + * @method static bool check(iterable|string $abilities, array|mixed $arguments = []) + * @method static bool any(iterable|string $abilities, array|mixed $arguments = []) + * @method static bool none(iterable|string $abilities, array|mixed $arguments = []) + * @method static \Illuminate\Auth\Access\Response authorize(string $ability, array|mixed $arguments = []) + * @method static \Illuminate\Auth\Access\Response inspect(string $ability, array|mixed $arguments = []) + * @method static mixed raw(string $ability, array|mixed $arguments = []) + * @method static mixed getPolicyFor(object|string $class) + * @method static \Illuminate\Auth\Access\Gate guessPolicyNamesUsing(callable $callback) + * @method static mixed resolvePolicy(object|string $class) + * @method static \Illuminate\Auth\Access\Gate forUser(\Illuminate\Contracts\Auth\Authenticatable|mixed $user) + * @method static array abilities() + * @method static array policies() + * @method static \Illuminate\Auth\Access\Gate setContainer(\Illuminate\Contracts\Container\Container $container) + * @method static \Illuminate\Auth\Access\Response denyWithStatus(int $status, ?string $message = null, ?int $code = null) + * @method static \Illuminate\Auth\Access\Response denyAsNotFound(?string $message = null, ?int $code = null) + * + * @see \Illuminate\Auth\Access\Gate + */ +class Gate extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return GateContract::class; + } +} diff --git a/vendor/illuminate/support/Facades/Hash.php b/vendor/illuminate/support/Facades/Hash.php new file mode 100755 index 0000000..1cfe561 --- /dev/null +++ b/vendor/illuminate/support/Facades/Hash.php @@ -0,0 +1,35 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static \Illuminate\Hashing\BcryptHasher createBcryptDriver() + * @method static \Illuminate\Hashing\ArgonHasher createArgonDriver() + * @method static \Illuminate\Hashing\Argon2IdHasher createArgon2idDriver() + * @method static array info(string $hashedValue) + * @method static string make(string $value, array $options = []) + * @method static bool check(string $value, string $hashedValue, array $options = []) + * @method static bool needsRehash(string $hashedValue, array $options = []) + * @method static string getDefaultDriver() + * @method static mixed driver(string|null $driver = null) + * @method static \Illuminate\Hashing\HashManager extend(string $driver, \Closure $callback) + * @method static array getDrivers() + * @method static \Illuminate\Contracts\Container\Container getContainer() + * @method static \Illuminate\Hashing\HashManager setContainer(\Illuminate\Contracts\Container\Container $container) + * @method static \Illuminate\Hashing\HashManager forgetDrivers() + * + * @see \Illuminate\Hashing\HashManager + * @see \Illuminate\Hashing\AbstractHasher + */ +class Hash extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'hash'; + } +} diff --git a/vendor/illuminate/support/Facades/Http.php b/vendor/illuminate/support/Facades/Http.php new file mode 100644 index 0000000..cbae7ab --- /dev/null +++ b/vendor/illuminate/support/Facades/Http.php @@ -0,0 +1,149 @@ +<?php + +namespace Illuminate\Support\Facades; + +use Illuminate\Http\Client\Factory; + +/** + * @method static \GuzzleHttp\Promise\PromiseInterface response(array|string|null $body = null, int $status = 200, array $headers = []) + * @method static \Illuminate\Http\Client\ResponseSequence sequence(array $responses = []) + * @method static \Illuminate\Http\Client\Factory allowStrayRequests() + * @method static void recordRequestResponsePair(\Illuminate\Http\Client\Request $request, \Illuminate\Http\Client\Response $response) + * @method static void assertSent(callable $callback) + * @method static void assertSentInOrder(array $callbacks) + * @method static void assertNotSent(callable $callback) + * @method static void assertNothingSent() + * @method static void assertSentCount(int $count) + * @method static void assertSequencesAreEmpty() + * @method static \Illuminate\Support\Collection recorded(callable $callback = null) + * @method static \Illuminate\Contracts\Events\Dispatcher|null getDispatcher() + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * @method static mixed macroCall(string $method, array $parameters) + * @method static \Illuminate\Http\Client\PendingRequest baseUrl(string $url) + * @method static \Illuminate\Http\Client\PendingRequest withBody(string $content, string $contentType) + * @method static \Illuminate\Http\Client\PendingRequest asJson() + * @method static \Illuminate\Http\Client\PendingRequest asForm() + * @method static \Illuminate\Http\Client\PendingRequest attach(string|array $name, string|resource $contents = '', string|null $filename = null, array $headers = []) + * @method static \Illuminate\Http\Client\PendingRequest asMultipart() + * @method static \Illuminate\Http\Client\PendingRequest bodyFormat(string $format) + * @method static \Illuminate\Http\Client\PendingRequest contentType(string $contentType) + * @method static \Illuminate\Http\Client\PendingRequest acceptJson() + * @method static \Illuminate\Http\Client\PendingRequest accept(string $contentType) + * @method static \Illuminate\Http\Client\PendingRequest withHeaders(array $headers) + * @method static \Illuminate\Http\Client\PendingRequest withBasicAuth(string $username, string $password) + * @method static \Illuminate\Http\Client\PendingRequest withDigestAuth(string $username, string $password) + * @method static \Illuminate\Http\Client\PendingRequest withToken(string $token, string $type = 'Bearer') + * @method static \Illuminate\Http\Client\PendingRequest withUserAgent(string $userAgent) + * @method static \Illuminate\Http\Client\PendingRequest withCookies(array $cookies, string $domain) + * @method static \Illuminate\Http\Client\PendingRequest maxRedirects(int $max) + * @method static \Illuminate\Http\Client\PendingRequest withoutRedirecting() + * @method static \Illuminate\Http\Client\PendingRequest withoutVerifying() + * @method static \Illuminate\Http\Client\PendingRequest sink(string|resource $to) + * @method static \Illuminate\Http\Client\PendingRequest timeout(int $seconds) + * @method static \Illuminate\Http\Client\PendingRequest connectTimeout(int $seconds) + * @method static \Illuminate\Http\Client\PendingRequest retry(int $times, int $sleepMilliseconds = 0, callable|null $when = null, bool $throw = true) + * @method static \Illuminate\Http\Client\PendingRequest withOptions(array $options) + * @method static \Illuminate\Http\Client\PendingRequest withMiddleware(callable $middleware) + * @method static \Illuminate\Http\Client\PendingRequest beforeSending(callable $callback) + * @method static \Illuminate\Http\Client\PendingRequest throw(callable|null $callback = null) + * @method static \Illuminate\Http\Client\PendingRequest throwIf(callable|bool $condition, callable|null $throwCallback = null) + * @method static \Illuminate\Http\Client\PendingRequest throwUnless(bool $condition) + * @method static \Illuminate\Http\Client\PendingRequest dump() + * @method static \Illuminate\Http\Client\PendingRequest dd() + * @method static \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface get(string $url, array|string|null $query = null) + * @method static \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface head(string $url, array|string|null $query = null) + * @method static \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface post(string $url, array $data = []) + * @method static \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface patch(string $url, array $data = []) + * @method static \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface put(string $url, array $data = []) + * @method static \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface delete(string $url, array $data = []) + * @method static array pool(callable $callback) + * @method static \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface send(string $method, string $url, array $options = []) + * @method static \GuzzleHttp\Client buildClient() + * @method static \GuzzleHttp\Client createClient(\GuzzleHttp\HandlerStack $handlerStack) + * @method static \GuzzleHttp\HandlerStack buildHandlerStack() + * @method static \GuzzleHttp\HandlerStack pushHandlers(\GuzzleHttp\HandlerStack $handlerStack) + * @method static \Closure buildBeforeSendingHandler() + * @method static \Closure buildRecorderHandler() + * @method static \Closure buildStubHandler() + * @method static \GuzzleHttp\Psr7\RequestInterface runBeforeSendingCallbacks(\GuzzleHttp\Psr7\RequestInterface $request, array $options) + * @method static array mergeOptions(array ...$options) + * @method static \Illuminate\Http\Client\PendingRequest stub(callable $callback) + * @method static \Illuminate\Http\Client\PendingRequest async(bool $async = true) + * @method static \GuzzleHttp\Promise\PromiseInterface|null getPromise() + * @method static \Illuminate\Http\Client\PendingRequest setClient(\GuzzleHttp\Client $client) + * @method static \Illuminate\Http\Client\PendingRequest setHandler(callable $handler) + * @method static array getOptions() + * @method static \Illuminate\Http\Client\PendingRequest|mixed when((\Closure(\Illuminate\Http\Client\PendingRequest): mixed)|mixed $value = null, (callable(\Illuminate\Http\Client\PendingRequest, mixed): mixed)|null $callback = null, (callable(\Illuminate\Http\Client\PendingRequest, mixed): mixed)|null $default = null) + * @method static \Illuminate\Http\Client\PendingRequest|mixed unless((\Closure(\Illuminate\Http\Client\PendingRequest): mixed)|mixed $value = null, (callable(\Illuminate\Http\Client\PendingRequest, mixed): mixed)|null $callback = null, (callable(\Illuminate\Http\Client\PendingRequest, mixed): mixed)|null $default = null) + * + * @see \Illuminate\Http\Client\Factory + */ +class Http extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return Factory::class; + } + + /** + * Register a stub callable that will intercept requests and be able to return stub responses. + * + * @param \Closure|array $callback + * @return \Illuminate\Http\Client\Factory + */ + public static function fake($callback = null) + { + return tap(static::getFacadeRoot(), function ($fake) use ($callback) { + static::swap($fake->fake($callback)); + }); + } + + /** + * Register a response sequence for the given URL pattern. + * + * @param string $urlPattern + * @return \Illuminate\Http\Client\ResponseSequence + */ + public static function fakeSequence(string $urlPattern = '*') + { + $fake = tap(static::getFacadeRoot(), function ($fake) { + static::swap($fake); + }); + + return $fake->fakeSequence($urlPattern); + } + + /** + * Indicate that an exception should be thrown if any request is not faked. + * + * @return \Illuminate\Http\Client\Factory + */ + public static function preventStrayRequests() + { + return tap(static::getFacadeRoot(), function ($fake) { + static::swap($fake->preventStrayRequests()); + }); + } + + /** + * Stub the given URL using the given callback. + * + * @param string $url + * @param \Illuminate\Http\Client\Response|\GuzzleHttp\Promise\PromiseInterface|callable $callback + * @return \Illuminate\Http\Client\Factory + */ + public static function stubUrl($url, $callback) + { + return tap(static::getFacadeRoot(), function ($fake) use ($url, $callback) { + static::swap($fake->stubUrl($url, $callback)); + }); + } +} diff --git a/vendor/illuminate/support/Facades/Lang.php b/vendor/illuminate/support/Facades/Lang.php new file mode 100755 index 0000000..a87088a --- /dev/null +++ b/vendor/illuminate/support/Facades/Lang.php @@ -0,0 +1,45 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static bool hasForLocale(string $key, string|null $locale = null) + * @method static bool has(string $key, string|null $locale = null, bool $fallback = true) + * @method static string|array get(string $key, array $replace = [], string|null $locale = null, bool $fallback = true) + * @method static string choice(string $key, \Countable|int|array $number, array $replace = [], string|null $locale = null) + * @method static void addLines(array $lines, string $locale, string $namespace = '*') + * @method static void load(string $namespace, string $group, string $locale) + * @method static void addNamespace(string $namespace, string $hint) + * @method static void addJsonPath(string $path) + * @method static array parseKey(string $key) + * @method static void determineLocalesUsing(callable $callback) + * @method static \Illuminate\Translation\MessageSelector getSelector() + * @method static void setSelector(\Illuminate\Translation\MessageSelector $selector) + * @method static \Illuminate\Contracts\Translation\Loader getLoader() + * @method static string locale() + * @method static string getLocale() + * @method static void setLocale(string $locale) + * @method static string getFallback() + * @method static void setFallback(string $fallback) + * @method static void setLoaded(array $loaded) + * @method static void setParsedKey(string $key, array $parsed) + * @method static void flushParsedKeys() + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * + * @see \Illuminate\Translation\Translator + */ +class Lang extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'translator'; + } +} diff --git a/vendor/illuminate/support/Facades/Log.php b/vendor/illuminate/support/Facades/Log.php new file mode 100755 index 0000000..c00fac3 --- /dev/null +++ b/vendor/illuminate/support/Facades/Log.php @@ -0,0 +1,48 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static \Psr\Log\LoggerInterface build(array $config) + * @method static \Psr\Log\LoggerInterface stack(array $channels, string|null $channel = null) + * @method static \Psr\Log\LoggerInterface channel(string|null $channel = null) + * @method static \Psr\Log\LoggerInterface driver(string|null $driver = null) + * @method static \Illuminate\Log\LogManager shareContext(array $context) + * @method static array sharedContext() + * @method static \Illuminate\Log\LogManager flushSharedContext() + * @method static string|null getDefaultDriver() + * @method static void setDefaultDriver(string $name) + * @method static \Illuminate\Log\LogManager extend(string $driver, \Closure $callback) + * @method static \Illuminate\Log\LogManager forgetChannel(string|null $driver = null) + * @method static array getChannels() + * @method static void emergency(string $message, array $context = []) + * @method static void alert(string $message, array $context = []) + * @method static void critical(string $message, array $context = []) + * @method static void error(string $message, array $context = []) + * @method static void warning(string $message, array $context = []) + * @method static void notice(string $message, array $context = []) + * @method static void info(string $message, array $context = []) + * @method static void debug(string $message, array $context = []) + * @method static void log(mixed $level, string $message, array $context = []) + * @method static void write(string $level, \Illuminate\Contracts\Support\Arrayable|\Illuminate\Contracts\Support\Jsonable|\Illuminate\Support\Stringable|array|string $message, array $context = []) + * @method static \Illuminate\Log\Logger withContext(array $context = []) + * @method static \Illuminate\Log\Logger withoutContext() + * @method static void listen(\Closure $callback) + * @method static \Psr\Log\LoggerInterface getLogger() + * @method static \Illuminate\Contracts\Events\Dispatcher getEventDispatcher() + * @method static void setEventDispatcher(\Illuminate\Contracts\Events\Dispatcher $dispatcher) + * + * @see \Illuminate\Log\LogManager + */ +class Log extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'log'; + } +} diff --git a/vendor/illuminate/support/Facades/Mail.php b/vendor/illuminate/support/Facades/Mail.php new file mode 100755 index 0000000..a6544a3 --- /dev/null +++ b/vendor/illuminate/support/Facades/Mail.php @@ -0,0 +1,83 @@ +<?php + +namespace Illuminate\Support\Facades; + +use Illuminate\Support\Testing\Fakes\MailFake; + +/** + * @method static \Illuminate\Contracts\Mail\Mailer mailer(string|null $name = null) + * @method static \Illuminate\Mail\Mailer driver(string|null $driver = null) + * @method static \Symfony\Component\Mailer\Transport\TransportInterface createSymfonyTransport(array $config) + * @method static string getDefaultDriver() + * @method static void setDefaultDriver(string $name) + * @method static void purge(string|null $name = null) + * @method static \Illuminate\Mail\MailManager extend(string $driver, \Closure $callback) + * @method static \Illuminate\Contracts\Foundation\Application getApplication() + * @method static \Illuminate\Mail\MailManager setApplication(\Illuminate\Contracts\Foundation\Application $app) + * @method static \Illuminate\Mail\MailManager forgetMailers() + * @method static void alwaysFrom(string $address, string|null $name = null) + * @method static void alwaysReplyTo(string $address, string|null $name = null) + * @method static void alwaysReturnPath(string $address) + * @method static void alwaysTo(string $address, string|null $name = null) + * @method static \Illuminate\Mail\PendingMail to(mixed $users) + * @method static \Illuminate\Mail\PendingMail cc(mixed $users) + * @method static \Illuminate\Mail\PendingMail bcc(mixed $users) + * @method static \Illuminate\Mail\SentMessage|null html(string $html, mixed $callback) + * @method static \Illuminate\Mail\SentMessage|null raw(string $text, mixed $callback) + * @method static \Illuminate\Mail\SentMessage|null plain(string $view, array $data, mixed $callback) + * @method static string render(string|array $view, array $data = []) + * @method static \Illuminate\Mail\SentMessage|null send(\Illuminate\Contracts\Mail\Mailable|string|array $view, array $data = [], \Closure|string|null $callback = null) + * @method static mixed queue(\Illuminate\Contracts\Mail\Mailable|string|array $view, string|null $queue = null) + * @method static mixed onQueue(string $queue, \Illuminate\Contracts\Mail\Mailable $view) + * @method static mixed queueOn(string $queue, \Illuminate\Contracts\Mail\Mailable $view) + * @method static mixed later(\DateTimeInterface|\DateInterval|int $delay, \Illuminate\Contracts\Mail\Mailable $view, string|null $queue = null) + * @method static mixed laterOn(string $queue, \DateTimeInterface|\DateInterval|int $delay, \Illuminate\Contracts\Mail\Mailable $view) + * @method static \Symfony\Component\Mailer\Transport\TransportInterface getSymfonyTransport() + * @method static \Illuminate\Contracts\View\Factory getViewFactory() + * @method static void setSymfonyTransport(\Symfony\Component\Mailer\Transport\TransportInterface $transport) + * @method static \Illuminate\Mail\Mailer setQueue(\Illuminate\Contracts\Queue\Factory $queue) + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * @method static void assertSent(string|\Closure $mailable, callable|int|null $callback = null) + * @method static void assertNotOutgoing(string|\Closure $mailable, callable|null $callback = null) + * @method static void assertNotSent(string|\Closure $mailable, callable|null $callback = null) + * @method static void assertNothingOutgoing() + * @method static void assertNothingSent() + * @method static void assertQueued(string|\Closure $mailable, callable|int|null $callback = null) + * @method static void assertNotQueued(string|\Closure $mailable, callable|null $callback = null) + * @method static void assertNothingQueued() + * @method static \Illuminate\Support\Collection sent(string|\Closure $mailable, callable|null $callback = null) + * @method static bool hasSent(string $mailable) + * @method static \Illuminate\Support\Collection queued(string|\Closure $mailable, callable|null $callback = null) + * @method static bool hasQueued(string $mailable) + * @method static array failures() + * + * @see \Illuminate\Mail\MailManager + * @see \Illuminate\Support\Testing\Fakes\MailFake + */ +class Mail extends Facade +{ + /** + * Replace the bound instance with a fake. + * + * @return \Illuminate\Support\Testing\Fakes\MailFake + */ + public static function fake() + { + static::swap($fake = new MailFake); + + return $fake; + } + + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'mail.manager'; + } +} diff --git a/vendor/illuminate/support/Facades/Notification.php b/vendor/illuminate/support/Facades/Notification.php new file mode 100644 index 0000000..74d5647 --- /dev/null +++ b/vendor/illuminate/support/Facades/Notification.php @@ -0,0 +1,78 @@ +<?php + +namespace Illuminate\Support\Facades; + +use Illuminate\Notifications\AnonymousNotifiable; +use Illuminate\Notifications\ChannelManager; +use Illuminate\Support\Testing\Fakes\NotificationFake; + +/** + * @method static void send(\Illuminate\Support\Collection|array|mixed $notifiables, mixed $notification) + * @method static void sendNow(\Illuminate\Support\Collection|array|mixed $notifiables, mixed $notification, array|null $channels = null) + * @method static mixed channel(string|null $name = null) + * @method static string getDefaultDriver() + * @method static string deliversVia() + * @method static void deliverVia(string $channel) + * @method static \Illuminate\Notifications\ChannelManager locale(string $locale) + * @method static mixed driver(string|null $driver = null) + * @method static \Illuminate\Notifications\ChannelManager extend(string $driver, \Closure $callback) + * @method static array getDrivers() + * @method static \Illuminate\Contracts\Container\Container getContainer() + * @method static \Illuminate\Notifications\ChannelManager setContainer(\Illuminate\Contracts\Container\Container $container) + * @method static \Illuminate\Notifications\ChannelManager forgetDrivers() + * @method static void assertSentOnDemand(string|\Closure $notification, callable|null $callback = null) + * @method static void assertSentTo(mixed $notifiable, string|\Closure $notification, callable|null $callback = null) + * @method static void assertSentOnDemandTimes(string $notification, int $times = 1) + * @method static void assertSentToTimes(mixed $notifiable, string $notification, int $times = 1) + * @method static void assertNotSentTo(mixed $notifiable, string|\Closure $notification, callable|null $callback = null) + * @method static void assertNothingSent() + * @method static void assertNothingSentTo(mixed $notifiable) + * @method static void assertSentTimes(string $notification, int $expectedCount) + * @method static void assertCount(int $expectedCount) + * @method static \Illuminate\Support\Collection sent(mixed $notifiable, string $notification, callable|null $callback = null) + * @method static bool hasSent(mixed $notifiable, string $notification) + * @method static array sentNotifications() + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * + * @see \Illuminate\Notifications\ChannelManager + * @see \Illuminate\Support\Testing\Fakes\NotificationFake + */ +class Notification extends Facade +{ + /** + * Replace the bound instance with a fake. + * + * @return \Illuminate\Support\Testing\Fakes\NotificationFake + */ + public static function fake() + { + static::swap($fake = new NotificationFake); + + return $fake; + } + + /** + * Begin sending a notification to an anonymous notifiable. + * + * @param string $channel + * @param mixed $route + * @return \Illuminate\Notifications\AnonymousNotifiable + */ + public static function route($channel, $route) + { + return (new AnonymousNotifiable)->route($channel, $route); + } + + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return ChannelManager::class; + } +} diff --git a/vendor/illuminate/support/Facades/ParallelTesting.php b/vendor/illuminate/support/Facades/ParallelTesting.php new file mode 100644 index 0000000..d91558c --- /dev/null +++ b/vendor/illuminate/support/Facades/ParallelTesting.php @@ -0,0 +1,34 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static void resolveOptionsUsing(\Closure|null $resolver) + * @method static void resolveTokenUsing(\Closure|null $resolver) + * @method static void setUpProcess(callable $callback) + * @method static void setUpTestCase(callable $callback) + * @method static void setUpTestDatabase(callable $callback) + * @method static void tearDownProcess(callable $callback) + * @method static void tearDownTestCase(callable $callback) + * @method static void callSetUpProcessCallbacks() + * @method static void callSetUpTestCaseCallbacks(\Illuminate\Foundation\Testing\TestCase $testCase) + * @method static void callSetUpTestDatabaseCallbacks(string $database) + * @method static void callTearDownProcessCallbacks() + * @method static void callTearDownTestCaseCallbacks(\Illuminate\Foundation\Testing\TestCase $testCase) + * @method static mixed option(string $option) + * @method static string|false token() + * + * @see \Illuminate\Testing\ParallelTesting + */ +class ParallelTesting extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return \Illuminate\Testing\ParallelTesting::class; + } +} diff --git a/vendor/illuminate/support/Facades/Password.php b/vendor/illuminate/support/Facades/Password.php new file mode 100755 index 0000000..87d9daf --- /dev/null +++ b/vendor/illuminate/support/Facades/Password.php @@ -0,0 +1,68 @@ +<?php + +namespace Illuminate\Support\Facades; + +use Illuminate\Contracts\Auth\PasswordBroker; + +/** + * @method static \Illuminate\Contracts\Auth\PasswordBroker broker(string|null $name = null) + * @method static string getDefaultDriver() + * @method static void setDefaultDriver(string $name) + * @method static string sendResetLink(array $credentials, \Closure|null $callback = null) + * @method static mixed reset(array $credentials, \Closure $callback) + * @method static \Illuminate\Contracts\Auth\CanResetPassword|null getUser(array $credentials) + * @method static string createToken(\Illuminate\Contracts\Auth\CanResetPassword $user) + * @method static void deleteToken(\Illuminate\Contracts\Auth\CanResetPassword $user) + * @method static bool tokenExists(\Illuminate\Contracts\Auth\CanResetPassword $user, string $token) + * @method static \Illuminate\Auth\Passwords\TokenRepositoryInterface getRepository() + * + * @see \Illuminate\Auth\Passwords\PasswordBrokerManager + * @see \Illuminate\Auth\Passwords\PasswordBroker + */ +class Password extends Facade +{ + /** + * Constant representing a successfully sent reminder. + * + * @var string + */ + const RESET_LINK_SENT = PasswordBroker::RESET_LINK_SENT; + + /** + * Constant representing a successfully reset password. + * + * @var string + */ + const PASSWORD_RESET = PasswordBroker::PASSWORD_RESET; + + /** + * Constant representing the user not found response. + * + * @var string + */ + const INVALID_USER = PasswordBroker::INVALID_USER; + + /** + * Constant representing an invalid token. + * + * @var string + */ + const INVALID_TOKEN = PasswordBroker::INVALID_TOKEN; + + /** + * Constant representing a throttled reset attempt. + * + * @var string + */ + const RESET_THROTTLED = PasswordBroker::RESET_THROTTLED; + + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'auth.password'; + } +} diff --git a/vendor/illuminate/support/Facades/Queue.php b/vendor/illuminate/support/Facades/Queue.php new file mode 100755 index 0000000..60fc5fe --- /dev/null +++ b/vendor/illuminate/support/Facades/Queue.php @@ -0,0 +1,91 @@ +<?php + +namespace Illuminate\Support\Facades; + +use Illuminate\Queue\Worker; +use Illuminate\Support\Testing\Fakes\QueueFake; + +/** + * @method static void before(mixed $callback) + * @method static void after(mixed $callback) + * @method static void exceptionOccurred(mixed $callback) + * @method static void looping(mixed $callback) + * @method static void failing(mixed $callback) + * @method static void stopping(mixed $callback) + * @method static bool connected(string|null $name = null) + * @method static \Illuminate\Contracts\Queue\Queue connection(string|null $name = null) + * @method static void extend(string $driver, \Closure $resolver) + * @method static void addConnector(string $driver, \Closure $resolver) + * @method static string getDefaultDriver() + * @method static void setDefaultDriver(string $name) + * @method static string getName(string|null $connection = null) + * @method static \Illuminate\Contracts\Foundation\Application getApplication() + * @method static \Illuminate\Queue\QueueManager setApplication(\Illuminate\Contracts\Foundation\Application $app) + * @method static int size(string|null $queue = null) + * @method static mixed push(string|object $job, mixed $data = '', string|null $queue = null) + * @method static mixed pushOn(string $queue, string|object $job, mixed $data = '') + * @method static mixed pushRaw(string $payload, string|null $queue = null, array $options = []) + * @method static mixed later(\DateTimeInterface|\DateInterval|int $delay, string|object $job, mixed $data = '', string|null $queue = null) + * @method static mixed laterOn(string $queue, \DateTimeInterface|\DateInterval|int $delay, string|object $job, mixed $data = '') + * @method static mixed bulk(array $jobs, mixed $data = '', string|null $queue = null) + * @method static \Illuminate\Contracts\Queue\Job|null pop(string|null $queue = null) + * @method static string getConnectionName() + * @method static \Illuminate\Contracts\Queue\Queue setConnectionName(string $name) + * @method static mixed getJobBackoff(mixed $job) + * @method static mixed getJobExpiration(mixed $job) + * @method static void createPayloadUsing(callable|null $callback) + * @method static \Illuminate\Container\Container getContainer() + * @method static void setContainer(\Illuminate\Container\Container $container) + * @method static \Illuminate\Support\Testing\Fakes\QueueFake except(array|string $jobsToBeQueued) + * @method static void assertPushed(string|\Closure $job, callable|int|null $callback = null) + * @method static void assertPushedOn(string $queue, string|\Closure $job, callable|null $callback = null) + * @method static void assertPushedWithChain(string $job, array $expectedChain = [], callable|null $callback = null) + * @method static void assertPushedWithoutChain(string $job, callable|null $callback = null) + * @method static void assertNotPushed(string|\Closure $job, callable|null $callback = null) + * @method static void assertNothingPushed() + * @method static \Illuminate\Support\Collection pushed(string $job, callable|null $callback = null) + * @method static bool hasPushed(string $job) + * @method static bool shouldFakeJob(object $job) + * @method static array pushedJobs() + * + * @see \Illuminate\Queue\QueueManager + * @see \Illuminate\Queue\Queue + * @see \Illuminate\Support\Testing\Fakes\QueueFake + */ +class Queue extends Facade +{ + /** + * Register a callback to be executed to pick jobs. + * + * @param string $workerName + * @param callable $callback + * @return void + */ + public static function popUsing($workerName, $callback) + { + return Worker::popUsing($workerName, $callback); + } + + /** + * Replace the bound instance with a fake. + * + * @param array|string $jobsToFake + * @return \Illuminate\Support\Testing\Fakes\QueueFake + */ + public static function fake($jobsToFake = []) + { + static::swap($fake = new QueueFake(static::getFacadeApplication(), $jobsToFake, static::getFacadeRoot())); + + return $fake; + } + + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'queue'; + } +} diff --git a/vendor/illuminate/support/Facades/RateLimiter.php b/vendor/illuminate/support/Facades/RateLimiter.php new file mode 100644 index 0000000..1a7f082 --- /dev/null +++ b/vendor/illuminate/support/Facades/RateLimiter.php @@ -0,0 +1,32 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static \Illuminate\Cache\RateLimiter for(string $name, \Closure $callback) + * @method static \Closure limiter(string $name) + * @method static mixed attempt(string $key, int $maxAttempts, \Closure $callback, int $decaySeconds = 60) + * @method static bool tooManyAttempts(string $key, int $maxAttempts) + * @method static int hit(string $key, int $decaySeconds = 60) + * @method static mixed attempts(string $key) + * @method static mixed resetAttempts(string $key) + * @method static int remaining(string $key, int $maxAttempts) + * @method static int retriesLeft(string $key, int $maxAttempts) + * @method static void clear(string $key) + * @method static int availableIn(string $key) + * @method static string cleanRateLimiterKey(string $key) + * + * @see \Illuminate\Cache\RateLimiter + */ +class RateLimiter extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return \Illuminate\Cache\RateLimiter::class; + } +} diff --git a/vendor/illuminate/support/Facades/Redirect.php b/vendor/illuminate/support/Facades/Redirect.php new file mode 100755 index 0000000..ce96f7e --- /dev/null +++ b/vendor/illuminate/support/Facades/Redirect.php @@ -0,0 +1,39 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static \Illuminate\Http\RedirectResponse back(int $status = 302, array $headers = [], mixed $fallback = false) + * @method static \Illuminate\Http\RedirectResponse refresh(int $status = 302, array $headers = []) + * @method static \Illuminate\Http\RedirectResponse guest(string $path, int $status = 302, array $headers = [], bool|null $secure = null) + * @method static \Illuminate\Http\RedirectResponse intended(mixed $default = '/', int $status = 302, array $headers = [], bool|null $secure = null) + * @method static \Illuminate\Http\RedirectResponse to(string $path, int $status = 302, array $headers = [], bool|null $secure = null) + * @method static \Illuminate\Http\RedirectResponse away(string $path, int $status = 302, array $headers = []) + * @method static \Illuminate\Http\RedirectResponse secure(string $path, int $status = 302, array $headers = []) + * @method static \Illuminate\Http\RedirectResponse route(string $route, mixed $parameters = [], int $status = 302, array $headers = []) + * @method static \Illuminate\Http\RedirectResponse signedRoute(string $route, mixed $parameters = [], \DateTimeInterface|\DateInterval|int|null $expiration = null, int $status = 302, array $headers = []) + * @method static \Illuminate\Http\RedirectResponse temporarySignedRoute(string $route, \DateTimeInterface|\DateInterval|int|null $expiration, mixed $parameters = [], int $status = 302, array $headers = []) + * @method static \Illuminate\Http\RedirectResponse action(string|array $action, mixed $parameters = [], int $status = 302, array $headers = []) + * @method static \Illuminate\Routing\UrlGenerator getUrlGenerator() + * @method static void setSession(\Illuminate\Session\Store $session) + * @method static string|null getIntendedUrl() + * @method static \Illuminate\Routing\Redirector setIntendedUrl(string $url) + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * + * @see \Illuminate\Routing\Redirector + */ +class Redirect extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'redirect'; + } +} diff --git a/vendor/illuminate/support/Facades/Redis.php b/vendor/illuminate/support/Facades/Redis.php new file mode 100755 index 0000000..b796ad0 --- /dev/null +++ b/vendor/illuminate/support/Facades/Redis.php @@ -0,0 +1,46 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static \Illuminate\Redis\Connections\Connection connection(string|null $name = null) + * @method static \Illuminate\Redis\Connections\Connection resolve(string|null $name = null) + * @method static array connections() + * @method static void enableEvents() + * @method static void disableEvents() + * @method static void setDriver(string $driver) + * @method static void purge(string|null $name = null) + * @method static \Illuminate\Redis\RedisManager extend(string $driver, \Closure $callback) + * @method static void createSubscription(array|string $channels, \Closure $callback, string $method = 'subscribe') + * @method static \Illuminate\Redis\Limiters\ConcurrencyLimiterBuilder funnel(string $name) + * @method static \Illuminate\Redis\Limiters\DurationLimiterBuilder throttle(string $name) + * @method static mixed client() + * @method static void subscribe(array|string $channels, \Closure $callback) + * @method static void psubscribe(array|string $channels, \Closure $callback) + * @method static mixed command(string $method, array $parameters = []) + * @method static void listen(\Closure $callback) + * @method static string|null getName() + * @method static \Illuminate\Redis\Connections\Connection setName(string $name) + * @method static \Illuminate\Contracts\Events\Dispatcher getEventDispatcher() + * @method static void setEventDispatcher(\Illuminate\Contracts\Events\Dispatcher $events) + * @method static void unsetEventDispatcher() + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * @method static mixed macroCall(string $method, array $parameters) + * + * @see \Illuminate\Redis\RedisManager + */ +class Redis extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'redis'; + } +} diff --git a/vendor/illuminate/support/Facades/Request.php b/vendor/illuminate/support/Facades/Request.php new file mode 100755 index 0000000..7922b01 --- /dev/null +++ b/vendor/illuminate/support/Facades/Request.php @@ -0,0 +1,195 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static \Illuminate\Http\Request capture() + * @method static \Illuminate\Http\Request instance() + * @method static string method() + * @method static string root() + * @method static string url() + * @method static string fullUrl() + * @method static string fullUrlWithQuery(array $query) + * @method static string fullUrlWithoutQuery(array|string $keys) + * @method static string path() + * @method static string decodedPath() + * @method static string|null segment(int $index, string|null $default = null) + * @method static array segments() + * @method static bool is(mixed ...$patterns) + * @method static bool routeIs(mixed ...$patterns) + * @method static bool fullUrlIs(mixed ...$patterns) + * @method static string host() + * @method static string httpHost() + * @method static string schemeAndHttpHost() + * @method static bool ajax() + * @method static bool pjax() + * @method static bool prefetch() + * @method static bool secure() + * @method static string|null ip() + * @method static array ips() + * @method static string|null userAgent() + * @method static \Illuminate\Http\Request merge(array $input) + * @method static \Illuminate\Http\Request mergeIfMissing(array $input) + * @method static \Illuminate\Http\Request replace(array $input) + * @method static mixed get(string $key, mixed $default = null) + * @method static \Symfony\Component\HttpFoundation\ParameterBag|mixed json(string|null $key = null, mixed $default = null) + * @method static \Illuminate\Http\Request createFrom(\Illuminate\Http\Request $from, \Illuminate\Http\Request|null $to = null) + * @method static \Illuminate\Http\Request createFromBase(\Symfony\Component\HttpFoundation\Request $request) + * @method static \Illuminate\Http\Request duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null) + * @method static bool hasSession(bool $skipIfUninitialized = false) + * @method static \Symfony\Component\HttpFoundation\Session\SessionInterface getSession() + * @method static \Illuminate\Contracts\Session\Session session() + * @method static void setLaravelSession(\Illuminate\Contracts\Session\Session $session) + * @method static void setRequestLocale(string $locale) + * @method static void setDefaultRequestLocale(string $locale) + * @method static mixed user(string|null $guard = null) + * @method static \Illuminate\Routing\Route|object|string|null route(string|null $param = null, mixed $default = null) + * @method static string fingerprint() + * @method static \Illuminate\Http\Request setJson(\Symfony\Component\HttpFoundation\ParameterBag $json) + * @method static \Closure getUserResolver() + * @method static \Illuminate\Http\Request setUserResolver(\Closure $callback) + * @method static \Closure getRouteResolver() + * @method static \Illuminate\Http\Request setRouteResolver(\Closure $callback) + * @method static array toArray() + * @method static void initialize(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], string|resource|null $content = null) + * @method static \static createFromGlobals() + * @method static \static create(string $uri, string $method = 'GET', array $parameters = [], array $cookies = [], array $files = [], array $server = [], string|resource|null $content = null) + * @method static void setFactory(callable|null $callable) + * @method static void overrideGlobals() + * @method static void setTrustedProxies(array $proxies, int $trustedHeaderSet) + * @method static string[] getTrustedProxies() + * @method static int getTrustedHeaderSet() + * @method static void setTrustedHosts(array $hostPatterns) + * @method static string[] getTrustedHosts() + * @method static string normalizeQueryString(string|null $qs) + * @method static void enableHttpMethodParameterOverride() + * @method static bool getHttpMethodParameterOverride() + * @method static bool hasPreviousSession() + * @method static void setSession(\Symfony\Component\HttpFoundation\Session\SessionInterface $session) + * @method static array getClientIps() + * @method static string|null getClientIp() + * @method static string getScriptName() + * @method static string getPathInfo() + * @method static string getBasePath() + * @method static string getBaseUrl() + * @method static string getScheme() + * @method static int|string|null getPort() + * @method static string|null getUser() + * @method static string|null getPassword() + * @method static string|null getUserInfo() + * @method static string getHttpHost() + * @method static string getRequestUri() + * @method static string getSchemeAndHttpHost() + * @method static string getUri() + * @method static string getUriForPath(string $path) + * @method static string getRelativeUriForPath(string $path) + * @method static string|null getQueryString() + * @method static bool isSecure() + * @method static string getHost() + * @method static void setMethod(string $method) + * @method static string getMethod() + * @method static string getRealMethod() + * @method static string|null getMimeType(string $format) + * @method static string[] getMimeTypes(string $format) + * @method static string|null getFormat(string|null $mimeType) + * @method static void setFormat(string|null $format, string|string[] $mimeTypes) + * @method static string|null getRequestFormat(string|null $default = 'html') + * @method static void setRequestFormat(string|null $format) + * @method static string|null getContentTypeFormat() + * @method static void setDefaultLocale(string $locale) + * @method static string getDefaultLocale() + * @method static void setLocale(string $locale) + * @method static string getLocale() + * @method static bool isMethod(string $method) + * @method static bool isMethodSafe() + * @method static bool isMethodIdempotent() + * @method static bool isMethodCacheable() + * @method static string|null getProtocolVersion() + * @method static string|resource getContent(bool $asResource = false) + * @method static array getETags() + * @method static bool isNoCache() + * @method static string|null getPreferredFormat(string|null $default = 'html') + * @method static string|null getPreferredLanguage(string[] $locales = null) + * @method static string[] getLanguages() + * @method static string[] getCharsets() + * @method static string[] getEncodings() + * @method static string[] getAcceptableContentTypes() + * @method static bool isXmlHttpRequest() + * @method static bool preferSafeContent() + * @method static bool isFromTrustedProxy() + * @method static array filterPrecognitiveRules(array $rules) + * @method static bool isAttemptingPrecognition() + * @method static bool isPrecognitive() + * @method static bool isJson() + * @method static bool expectsJson() + * @method static bool wantsJson() + * @method static bool accepts(string|array $contentTypes) + * @method static string|null prefers(string|array $contentTypes) + * @method static bool acceptsAnyContentType() + * @method static bool acceptsJson() + * @method static bool acceptsHtml() + * @method static bool matchesType(string $actual, string $type) + * @method static string format(string $default = 'html') + * @method static string|array|null old(string|null $key = null, \Illuminate\Database\Eloquent\Model|string|array|null $default = null) + * @method static void flash() + * @method static void flashOnly(array|mixed $keys) + * @method static void flashExcept(array|mixed $keys) + * @method static void flush() + * @method static string|array|null server(string|null $key = null, string|array|null $default = null) + * @method static bool hasHeader(string $key) + * @method static string|array|null header(string|null $key = null, string|array|null $default = null) + * @method static string|null bearerToken() + * @method static bool exists(string|array $key) + * @method static bool has(string|array $key) + * @method static bool hasAny(string|array $keys) + * @method static \Illuminate\Http\Request|mixed whenHas(string $key, callable $callback, callable|null $default = null) + * @method static bool filled(string|array $key) + * @method static bool isNotFilled(string|array $key) + * @method static bool anyFilled(string|array $keys) + * @method static \Illuminate\Http\Request|mixed whenFilled(string $key, callable $callback, callable|null $default = null) + * @method static bool missing(string|array $key) + * @method static \Illuminate\Http\Request|mixed whenMissing(string $key, callable $callback, callable|null $default = null) + * @method static array keys() + * @method static array all(array|mixed|null $keys = null) + * @method static mixed input(string|null $key = null, mixed $default = null) + * @method static \Illuminate\Support\Stringable str(string $key, mixed $default = null) + * @method static \Illuminate\Support\Stringable string(string $key, mixed $default = null) + * @method static bool boolean(string|null $key = null, bool $default = false) + * @method static int integer(string $key, int $default = 0) + * @method static float float(string $key, float $default = 0) + * @method static \Illuminate\Support\Carbon|null date(string $key, string|null $format = null, string|null $tz = null) + * @method static object|null enum(string $key, class-string<object> $enumClass) + * @method static \Illuminate\Support\Collection collect(array|string|null $key = null) + * @method static array only(array|mixed $keys) + * @method static array except(array|mixed $keys) + * @method static string|array|null query(string|null $key = null, string|array|null $default = null) + * @method static string|array|null post(string|null $key = null, string|array|null $default = null) + * @method static bool hasCookie(string $key) + * @method static string|array|null cookie(string|null $key = null, string|array|null $default = null) + * @method static array allFiles() + * @method static bool hasFile(string $key) + * @method static \Illuminate\Http\UploadedFile|\Illuminate\Http\UploadedFile[]|array|null file(string|null $key = null, mixed $default = null) + * @method static never dd(mixed ...$keys) + * @method static \Illuminate\Http\Request dump(mixed $keys = []) + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * @method static array validate(array $rules, ...$params) + * @method static array validateWithBag(string $errorBag, array $rules, ...$params) + * @method static bool hasValidSignature(bool $absolute = true) + * + * @see \Illuminate\Http\Request + */ +class Request extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'request'; + } +} diff --git a/vendor/illuminate/support/Facades/Response.php b/vendor/illuminate/support/Facades/Response.php new file mode 100755 index 0000000..3215ca0 --- /dev/null +++ b/vendor/illuminate/support/Facades/Response.php @@ -0,0 +1,40 @@ +<?php + +namespace Illuminate\Support\Facades; + +use Illuminate\Contracts\Routing\ResponseFactory as ResponseFactoryContract; + +/** + * @method static \Illuminate\Http\Response make(mixed $content = '', int $status = 200, array $headers = []) + * @method static \Illuminate\Http\Response noContent(int $status = 204, array $headers = []) + * @method static \Illuminate\Http\Response view(string|array $view, array $data = [], int $status = 200, array $headers = []) + * @method static \Illuminate\Http\JsonResponse json(mixed $data = [], int $status = 200, array $headers = [], int $options = 0) + * @method static \Illuminate\Http\JsonResponse jsonp(string $callback, mixed $data = [], int $status = 200, array $headers = [], int $options = 0) + * @method static \Symfony\Component\HttpFoundation\StreamedResponse stream(\Closure $callback, int $status = 200, array $headers = []) + * @method static \Symfony\Component\HttpFoundation\StreamedResponse streamDownload(\Closure $callback, string|null $name = null, array $headers = [], string|null $disposition = 'attachment') + * @method static \Symfony\Component\HttpFoundation\BinaryFileResponse download(\SplFileInfo|string $file, string|null $name = null, array $headers = [], string|null $disposition = 'attachment') + * @method static \Symfony\Component\HttpFoundation\BinaryFileResponse file(\SplFileInfo|string $file, array $headers = []) + * @method static \Illuminate\Http\RedirectResponse redirectTo(string $path, int $status = 302, array $headers = [], bool|null $secure = null) + * @method static \Illuminate\Http\RedirectResponse redirectToRoute(string $route, mixed $parameters = [], int $status = 302, array $headers = []) + * @method static \Illuminate\Http\RedirectResponse redirectToAction(string $action, mixed $parameters = [], int $status = 302, array $headers = []) + * @method static \Illuminate\Http\RedirectResponse redirectGuest(string $path, int $status = 302, array $headers = [], bool|null $secure = null) + * @method static \Illuminate\Http\RedirectResponse redirectToIntended(string $default = '/', int $status = 302, array $headers = [], bool|null $secure = null) + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * + * @see \Illuminate\Routing\ResponseFactory + */ +class Response extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return ResponseFactoryContract::class; + } +} diff --git a/vendor/illuminate/support/Facades/Route.php b/vendor/illuminate/support/Facades/Route.php new file mode 100755 index 0000000..6fdaf6e --- /dev/null +++ b/vendor/illuminate/support/Facades/Route.php @@ -0,0 +1,114 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static \Illuminate\Routing\Route get(string $uri, array|string|callable|null $action = null) + * @method static \Illuminate\Routing\Route post(string $uri, array|string|callable|null $action = null) + * @method static \Illuminate\Routing\Route put(string $uri, array|string|callable|null $action = null) + * @method static \Illuminate\Routing\Route patch(string $uri, array|string|callable|null $action = null) + * @method static \Illuminate\Routing\Route delete(string $uri, array|string|callable|null $action = null) + * @method static \Illuminate\Routing\Route options(string $uri, array|string|callable|null $action = null) + * @method static \Illuminate\Routing\Route any(string $uri, array|string|callable|null $action = null) + * @method static \Illuminate\Routing\Route fallback(array|string|callable|null $action) + * @method static \Illuminate\Routing\Route redirect(string $uri, string $destination, int $status = 302) + * @method static \Illuminate\Routing\Route permanentRedirect(string $uri, string $destination) + * @method static \Illuminate\Routing\Route view(string $uri, string $view, array $data = [], int|array $status = 200, array $headers = []) + * @method static \Illuminate\Routing\Route match(array|string $methods, string $uri, array|string|callable|null $action = null) + * @method static void resources(array $resources, array $options = []) + * @method static \Illuminate\Routing\PendingResourceRegistration resource(string $name, string $controller, array $options = []) + * @method static void apiResources(array $resources, array $options = []) + * @method static \Illuminate\Routing\PendingResourceRegistration apiResource(string $name, string $controller, array $options = []) + * @method static void singletons(array $singletons, array $options = []) + * @method static \Illuminate\Routing\PendingSingletonResourceRegistration singleton(string $name, string $controller, array $options = []) + * @method static void apiSingletons(array $singletons, array $options = []) + * @method static \Illuminate\Routing\PendingSingletonResourceRegistration apiSingleton(string $name, string $controller, array $options = []) + * @method static \Illuminate\Routing\Router group(array $attributes, \Closure|array|string $routes) + * @method static array mergeWithLastGroup(array $new, bool $prependExistingPrefix = true) + * @method static string getLastGroupPrefix() + * @method static \Illuminate\Routing\Route addRoute(array|string $methods, string $uri, array|string|callable|null $action) + * @method static \Illuminate\Routing\Route newRoute(array|string $methods, string $uri, mixed $action) + * @method static \Symfony\Component\HttpFoundation\Response respondWithRoute(string $name) + * @method static \Symfony\Component\HttpFoundation\Response dispatch(\Illuminate\Http\Request $request) + * @method static \Symfony\Component\HttpFoundation\Response dispatchToRoute(\Illuminate\Http\Request $request) + * @method static array gatherRouteMiddleware(\Illuminate\Routing\Route $route) + * @method static array resolveMiddleware(array $middleware, array $excluded = []) + * @method static \Symfony\Component\HttpFoundation\Response prepareResponse(\Symfony\Component\HttpFoundation\Request $request, mixed $response) + * @method static \Symfony\Component\HttpFoundation\Response toResponse(\Symfony\Component\HttpFoundation\Request $request, mixed $response) + * @method static \Illuminate\Routing\Route substituteBindings(\Illuminate\Routing\Route $route) + * @method static void substituteImplicitBindings(\Illuminate\Routing\Route $route) + * @method static void matched(string|callable $callback) + * @method static array getMiddleware() + * @method static \Illuminate\Routing\Router aliasMiddleware(string $name, string $class) + * @method static bool hasMiddlewareGroup(string $name) + * @method static array getMiddlewareGroups() + * @method static \Illuminate\Routing\Router middlewareGroup(string $name, array $middleware) + * @method static \Illuminate\Routing\Router prependMiddlewareToGroup(string $group, string $middleware) + * @method static \Illuminate\Routing\Router pushMiddlewareToGroup(string $group, string $middleware) + * @method static \Illuminate\Routing\Router removeMiddlewareFromGroup(string $group, string $middleware) + * @method static \Illuminate\Routing\Router flushMiddlewareGroups() + * @method static void bind(string $key, string|callable $binder) + * @method static void model(string $key, string $class, \Closure|null $callback = null) + * @method static \Closure|null getBindingCallback(string $key) + * @method static array getPatterns() + * @method static void pattern(string $key, string $pattern) + * @method static void patterns(array $patterns) + * @method static bool hasGroupStack() + * @method static array getGroupStack() + * @method static mixed input(string $key, string|null $default = null) + * @method static \Illuminate\Http\Request getCurrentRequest() + * @method static \Illuminate\Routing\Route|null getCurrentRoute() + * @method static \Illuminate\Routing\Route|null current() + * @method static bool has(string|array $name) + * @method static string|null currentRouteName() + * @method static bool is(mixed ...$patterns) + * @method static bool currentRouteNamed(mixed ...$patterns) + * @method static string|null currentRouteAction() + * @method static bool uses(array ...$patterns) + * @method static bool currentRouteUses(string $action) + * @method static void singularResourceParameters(bool $singular = true) + * @method static void resourceParameters(array $parameters = []) + * @method static array|null resourceVerbs(array $verbs = []) + * @method static \Illuminate\Routing\RouteCollectionInterface getRoutes() + * @method static void setRoutes(\Illuminate\Routing\RouteCollection $routes) + * @method static void setCompiledRoutes(array $routes) + * @method static array uniqueMiddleware(array $middleware) + * @method static \Illuminate\Routing\Router setContainer(\Illuminate\Container\Container $container) + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * @method static mixed macroCall(string $method, array $parameters) + * @method static \Illuminate\Routing\RouteRegistrar attribute(string $key, mixed $value) + * @method static \Illuminate\Routing\RouteRegistrar whereAlpha(array|string $parameters) + * @method static \Illuminate\Routing\RouteRegistrar whereAlphaNumeric(array|string $parameters) + * @method static \Illuminate\Routing\RouteRegistrar whereNumber(array|string $parameters) + * @method static \Illuminate\Routing\RouteRegistrar whereUlid(array|string $parameters) + * @method static \Illuminate\Routing\RouteRegistrar whereUuid(array|string $parameters) + * @method static \Illuminate\Routing\RouteRegistrar whereIn(array|string $parameters, array $values) + * @method static \Illuminate\Routing\RouteRegistrar as(string $value) + * @method static \Illuminate\Routing\RouteRegistrar controller(string $controller) + * @method static \Illuminate\Routing\RouteRegistrar domain(string $value) + * @method static \Illuminate\Routing\RouteRegistrar middleware(array|string|null $middleware) + * @method static \Illuminate\Routing\RouteRegistrar name(string $value) + * @method static \Illuminate\Routing\RouteRegistrar namespace(string|null $value) + * @method static \Illuminate\Routing\RouteRegistrar prefix(string $prefix) + * @method static \Illuminate\Routing\RouteRegistrar scopeBindings() + * @method static \Illuminate\Routing\RouteRegistrar where(array $where) + * @method static \Illuminate\Routing\RouteRegistrar withoutMiddleware(array|string $middleware) + * @method static \Illuminate\Routing\RouteRegistrar withoutScopedBindings() + * + * @see \Illuminate\Routing\Router + */ +class Route extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'router'; + } +} diff --git a/vendor/illuminate/support/Facades/Schema.php b/vendor/illuminate/support/Facades/Schema.php new file mode 100755 index 0000000..b1a89a4 --- /dev/null +++ b/vendor/illuminate/support/Facades/Schema.php @@ -0,0 +1,67 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static void defaultStringLength(int $length) + * @method static void defaultMorphKeyType(string $type) + * @method static void morphUsingUuids() + * @method static void morphUsingUlids() + * @method static void useNativeSchemaOperationsIfPossible(bool $value = true) + * @method static bool createDatabase(string $name) + * @method static bool dropDatabaseIfExists(string $name) + * @method static bool hasTable(string $table) + * @method static bool hasColumn(string $table, string $column) + * @method static bool hasColumns(string $table, array $columns) + * @method static void whenTableHasColumn(string $table, string $column, \Closure $callback) + * @method static void whenTableDoesntHaveColumn(string $table, string $column, \Closure $callback) + * @method static string getColumnType(string $table, string $column) + * @method static array getColumnListing(string $table) + * @method static void table(string $table, \Closure $callback) + * @method static void create(string $table, \Closure $callback) + * @method static void drop(string $table) + * @method static void dropIfExists(string $table) + * @method static void dropColumns(string $table, string|array $columns) + * @method static void dropAllTables() + * @method static void dropAllViews() + * @method static void dropAllTypes() + * @method static void getAllTables() + * @method static void rename(string $from, string $to) + * @method static bool enableForeignKeyConstraints() + * @method static bool disableForeignKeyConstraints() + * @method static \Illuminate\Database\Connection getConnection() + * @method static \Illuminate\Database\Schema\Builder setConnection(\Illuminate\Database\Connection $connection) + * @method static void blueprintResolver(\Closure $resolver) + * + * @see \Illuminate\Database\Schema\Builder + */ +class Schema extends Facade +{ + /** + * Indicates if the resolved facade should be cached. + * + * @var bool + */ + protected static $cached = false; + + /** + * Get a schema builder instance for a connection. + * + * @param string|null $name + * @return \Illuminate\Database\Schema\Builder + */ + public static function connection($name) + { + return static::$app['db']->connection($name)->getSchemaBuilder(); + } + + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'db.schema'; + } +} diff --git a/vendor/illuminate/support/Facades/Session.php b/vendor/illuminate/support/Facades/Session.php new file mode 100755 index 0000000..a36f613 --- /dev/null +++ b/vendor/illuminate/support/Facades/Session.php @@ -0,0 +1,80 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static bool shouldBlock() + * @method static string|null blockDriver() + * @method static array getSessionConfig() + * @method static string getDefaultDriver() + * @method static void setDefaultDriver(string $name) + * @method static mixed driver(string|null $driver = null) + * @method static \Illuminate\Session\SessionManager extend(string $driver, \Closure $callback) + * @method static array getDrivers() + * @method static \Illuminate\Contracts\Container\Container getContainer() + * @method static \Illuminate\Session\SessionManager setContainer(\Illuminate\Contracts\Container\Container $container) + * @method static \Illuminate\Session\SessionManager forgetDrivers() + * @method static bool start() + * @method static void save() + * @method static void ageFlashData() + * @method static array all() + * @method static array only(array $keys) + * @method static bool exists(string|array $key) + * @method static bool missing(string|array $key) + * @method static bool has(string|array $key) + * @method static mixed get(string $key, mixed $default = null) + * @method static mixed pull(string $key, mixed $default = null) + * @method static bool hasOldInput(string|null $key = null) + * @method static mixed getOldInput(string|null $key = null, mixed $default = null) + * @method static void replace(array $attributes) + * @method static void put(string|array $key, mixed $value = null) + * @method static mixed remember(string $key, \Closure $callback) + * @method static void push(string $key, mixed $value) + * @method static mixed increment(string $key, int $amount = 1) + * @method static int decrement(string $key, int $amount = 1) + * @method static void flash(string $key, mixed $value = true) + * @method static void now(string $key, mixed $value) + * @method static void reflash() + * @method static void keep(array|mixed $keys = null) + * @method static void flashInput(array $value) + * @method static mixed remove(string $key) + * @method static void forget(string|array $keys) + * @method static void flush() + * @method static bool invalidate() + * @method static bool regenerate(bool $destroy = false) + * @method static bool migrate(bool $destroy = false) + * @method static bool isStarted() + * @method static string getName() + * @method static void setName(string $name) + * @method static string getId() + * @method static void setId(string $id) + * @method static bool isValidId(string $id) + * @method static void setExists(bool $value) + * @method static string token() + * @method static void regenerateToken() + * @method static string|null previousUrl() + * @method static void setPreviousUrl(string $url) + * @method static void passwordConfirmed() + * @method static \SessionHandlerInterface getHandler() + * @method static void setHandler(\SessionHandlerInterface $handler) + * @method static bool handlerNeedsRequest() + * @method static void setRequestOnHandler(\Illuminate\Http\Request $request) + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * + * @see \Illuminate\Session\SessionManager + */ +class Session extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'session'; + } +} diff --git a/vendor/illuminate/support/Facades/Storage.php b/vendor/illuminate/support/Facades/Storage.php new file mode 100644 index 0000000..6b340c1 --- /dev/null +++ b/vendor/illuminate/support/Facades/Storage.php @@ -0,0 +1,104 @@ +<?php + +namespace Illuminate\Support\Facades; + +use Illuminate\Filesystem\Filesystem; + +/** + * @method static \Illuminate\Contracts\Filesystem\Filesystem drive(string|null $name = null) + * @method static \Illuminate\Contracts\Filesystem\Filesystem disk(string|null $name = null) + * @method static \Illuminate\Contracts\Filesystem\Filesystem cloud() + * @method static \Illuminate\Contracts\Filesystem\Filesystem build(string|array $config) + * @method static \Illuminate\Contracts\Filesystem\Filesystem createLocalDriver(array $config) + * @method static \Illuminate\Contracts\Filesystem\Filesystem createFtpDriver(array $config) + * @method static \Illuminate\Contracts\Filesystem\Filesystem createSftpDriver(array $config) + * @method static \Illuminate\Contracts\Filesystem\Cloud createS3Driver(array $config) + * @method static \Illuminate\Contracts\Filesystem\Filesystem createScopedDriver(array $config) + * @method static \Illuminate\Filesystem\FilesystemManager set(string $name, mixed $disk) + * @method static string getDefaultDriver() + * @method static string getDefaultCloudDriver() + * @method static \Illuminate\Filesystem\FilesystemManager forgetDisk(array|string $disk) + * @method static void purge(string|null $name = null) + * @method static \Illuminate\Filesystem\FilesystemManager extend(string $driver, \Closure $callback) + * @method static \Illuminate\Filesystem\FilesystemManager setApplication(\Illuminate\Contracts\Foundation\Application $app) + * @method static bool exists(string $path) + * @method static string|null get(string $path) + * @method static resource|null readStream(string $path) + * @method static bool put(string $path, string|resource $contents, mixed $options = []) + * @method static bool writeStream(string $path, resource $resource, array $options = []) + * @method static string getVisibility(string $path) + * @method static bool setVisibility(string $path, string $visibility) + * @method static bool prepend(string $path, string $data) + * @method static bool append(string $path, string $data) + * @method static bool delete(string|array $paths) + * @method static bool copy(string $from, string $to) + * @method static bool move(string $from, string $to) + * @method static int size(string $path) + * @method static int lastModified(string $path) + * @method static array files(string|null $directory = null, bool $recursive = false) + * @method static array allFiles(string|null $directory = null) + * @method static array directories(string|null $directory = null, bool $recursive = false) + * @method static array allDirectories(string|null $directory = null) + * @method static bool makeDirectory(string $path) + * @method static bool deleteDirectory(string $directory) + * + * @see \Illuminate\Filesystem\FilesystemManager + */ +class Storage extends Facade +{ + /** + * Replace the given disk with a local testing disk. + * + * @param string|null $disk + * @param array $config + * @return \Illuminate\Contracts\Filesystem\Filesystem + */ + public static function fake($disk = null, array $config = []) + { + $disk = $disk ?: static::$app['config']->get('filesystems.default'); + + $root = storage_path('framework/testing/disks/'.$disk); + + if ($token = ParallelTesting::token()) { + $root = "{$root}_test_{$token}"; + } + + (new Filesystem)->cleanDirectory($root); + + static::set($disk, $fake = static::createLocalDriver(array_merge($config, [ + 'root' => $root, + ]))); + + return tap($fake)->buildTemporaryUrlsUsing(function ($path, $expiration) { + return URL::to($path.'?expiration='.$expiration->getTimestamp()); + }); + } + + /** + * Replace the given disk with a persistent local testing disk. + * + * @param string|null $disk + * @param array $config + * @return \Illuminate\Contracts\Filesystem\Filesystem + */ + public static function persistentFake($disk = null, array $config = []) + { + $disk = $disk ?: static::$app['config']->get('filesystems.default'); + + static::set($disk, $fake = static::createLocalDriver(array_merge($config, [ + 'root' => storage_path('framework/testing/disks/'.$disk), + ]))); + + return $fake; + } + + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'filesystem'; + } +} diff --git a/vendor/illuminate/support/Facades/URL.php b/vendor/illuminate/support/Facades/URL.php new file mode 100755 index 0000000..8da96f4 --- /dev/null +++ b/vendor/illuminate/support/Facades/URL.php @@ -0,0 +1,62 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static string full() + * @method static string current() + * @method static string previous(mixed $fallback = false) + * @method static string previousPath(mixed $fallback = false) + * @method static string to(string $path, mixed $extra = [], bool|null $secure = null) + * @method static string secure(string $path, array $parameters = []) + * @method static string asset(string $path, bool|null $secure = null) + * @method static string secureAsset(string $path) + * @method static string assetFrom(string $root, string $path, bool|null $secure = null) + * @method static string formatScheme(bool|null $secure = null) + * @method static string signedRoute(string $name, mixed $parameters = [], \DateTimeInterface|\DateInterval|int|null $expiration = null, bool $absolute = true) + * @method static string temporarySignedRoute(string $name, \DateTimeInterface|\DateInterval|int $expiration, array $parameters = [], bool $absolute = true) + * @method static bool hasValidSignature(\Illuminate\Http\Request $request, bool $absolute = true, array $ignoreQuery = []) + * @method static bool hasValidRelativeSignature(\Illuminate\Http\Request $request, array $ignoreQuery = []) + * @method static bool hasCorrectSignature(\Illuminate\Http\Request $request, bool $absolute = true, array $ignoreQuery = []) + * @method static bool signatureHasNotExpired(\Illuminate\Http\Request $request) + * @method static string route(string $name, mixed $parameters = [], bool $absolute = true) + * @method static string toRoute(\Illuminate\Routing\Route $route, mixed $parameters, bool $absolute) + * @method static string action(string|array $action, mixed $parameters = [], bool $absolute = true) + * @method static array formatParameters(mixed|array $parameters) + * @method static string formatRoot(string $scheme, string|null $root = null) + * @method static string format(string $root, string $path, \Illuminate\Routing\Route|null $route = null) + * @method static bool isValidUrl(string $path) + * @method static void defaults(array $defaults) + * @method static array getDefaultParameters() + * @method static void forceScheme(string|null $scheme) + * @method static void forceRootUrl(string|null $root) + * @method static \Illuminate\Routing\UrlGenerator formatHostUsing(\Closure $callback) + * @method static \Illuminate\Routing\UrlGenerator formatPathUsing(\Closure $callback) + * @method static \Closure pathFormatter() + * @method static \Illuminate\Http\Request getRequest() + * @method static void setRequest(\Illuminate\Http\Request $request) + * @method static \Illuminate\Routing\UrlGenerator setRoutes(\Illuminate\Routing\RouteCollectionInterface $routes) + * @method static \Illuminate\Routing\UrlGenerator setSessionResolver(callable $sessionResolver) + * @method static \Illuminate\Routing\UrlGenerator setKeyResolver(callable $keyResolver) + * @method static \Illuminate\Routing\UrlGenerator withKeyResolver(callable $keyResolver) + * @method static string getRootControllerNamespace() + * @method static \Illuminate\Routing\UrlGenerator setRootControllerNamespace(string $rootNamespace) + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * + * @see \Illuminate\Routing\UrlGenerator + */ +class URL extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'url'; + } +} diff --git a/vendor/illuminate/support/Facades/Validator.php b/vendor/illuminate/support/Facades/Validator.php new file mode 100755 index 0000000..4d7002b --- /dev/null +++ b/vendor/illuminate/support/Facades/Validator.php @@ -0,0 +1,34 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static \Illuminate\Validation\Validator make(array $data, array $rules, array $messages = [], array $customAttributes = []) + * @method static array validate(array $data, array $rules, array $messages = [], array $customAttributes = []) + * @method static void extend(string $rule, \Closure|string $extension, string|null $message = null) + * @method static void extendImplicit(string $rule, \Closure|string $extension, string|null $message = null) + * @method static void extendDependent(string $rule, \Closure|string $extension, string|null $message = null) + * @method static void replacer(string $rule, \Closure|string $replacer) + * @method static void includeUnvalidatedArrayKeys() + * @method static void excludeUnvalidatedArrayKeys() + * @method static void resolver(\Closure $resolver) + * @method static \Illuminate\Contracts\Translation\Translator getTranslator() + * @method static \Illuminate\Validation\PresenceVerifierInterface getPresenceVerifier() + * @method static void setPresenceVerifier(\Illuminate\Validation\PresenceVerifierInterface $presenceVerifier) + * @method static \Illuminate\Contracts\Container\Container|null getContainer() + * @method static \Illuminate\Validation\Factory setContainer(\Illuminate\Contracts\Container\Container $container) + * + * @see \Illuminate\Validation\Factory + */ +class Validator extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'validator'; + } +} diff --git a/vendor/illuminate/support/Facades/View.php b/vendor/illuminate/support/Facades/View.php new file mode 100755 index 0000000..10eaa64 --- /dev/null +++ b/vendor/illuminate/support/Facades/View.php @@ -0,0 +1,97 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static \Illuminate\Contracts\View\View file(string $path, \Illuminate\Contracts\Support\Arrayable|array $data = [], array $mergeData = []) + * @method static \Illuminate\Contracts\View\View make(string $view, \Illuminate\Contracts\Support\Arrayable|array $data = [], array $mergeData = []) + * @method static \Illuminate\Contracts\View\View first(array $views, \Illuminate\Contracts\Support\Arrayable|array $data = [], array $mergeData = []) + * @method static string renderWhen(bool $condition, string $view, \Illuminate\Contracts\Support\Arrayable|array $data = [], array $mergeData = []) + * @method static string renderUnless(bool $condition, string $view, \Illuminate\Contracts\Support\Arrayable|array $data = [], array $mergeData = []) + * @method static string renderEach(string $view, array $data, string $iterator, string $empty = 'raw|') + * @method static bool exists(string $view) + * @method static \Illuminate\Contracts\View\Engine getEngineFromPath(string $path) + * @method static mixed share(array|string $key, mixed|null $value = null) + * @method static void incrementRender() + * @method static void decrementRender() + * @method static bool doneRendering() + * @method static bool hasRenderedOnce(string $id) + * @method static void markAsRenderedOnce(string $id) + * @method static void addLocation(string $location) + * @method static \Illuminate\View\Factory addNamespace(string $namespace, string|array $hints) + * @method static \Illuminate\View\Factory prependNamespace(string $namespace, string|array $hints) + * @method static \Illuminate\View\Factory replaceNamespace(string $namespace, string|array $hints) + * @method static void addExtension(string $extension, string $engine, \Closure|null $resolver = null) + * @method static void flushState() + * @method static void flushStateIfDoneRendering() + * @method static array getExtensions() + * @method static \Illuminate\View\Engines\EngineResolver getEngineResolver() + * @method static \Illuminate\View\ViewFinderInterface getFinder() + * @method static void setFinder(\Illuminate\View\ViewFinderInterface $finder) + * @method static void flushFinderCache() + * @method static \Illuminate\Contracts\Events\Dispatcher getDispatcher() + * @method static void setDispatcher(\Illuminate\Contracts\Events\Dispatcher $events) + * @method static \Illuminate\Contracts\Container\Container getContainer() + * @method static void setContainer(\Illuminate\Contracts\Container\Container $container) + * @method static mixed shared(string $key, mixed $default = null) + * @method static array getShared() + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * @method static void startComponent(\Illuminate\Contracts\View\View|\Illuminate\Contracts\Support\Htmlable|\Closure|string $view, array $data = []) + * @method static void startComponentFirst(array $names, array $data = []) + * @method static string renderComponent() + * @method static mixed|null getConsumableComponentData(string $key, mixed $default = null) + * @method static void slot(string $name, string|null $content = null, array $attributes = []) + * @method static void endSlot() + * @method static array creator(array|string $views, \Closure|string $callback) + * @method static array composers(array $composers) + * @method static array composer(array|string $views, \Closure|string $callback) + * @method static void callComposer(\Illuminate\Contracts\View\View $view) + * @method static void callCreator(\Illuminate\Contracts\View\View $view) + * @method static void startFragment(string $fragment) + * @method static string stopFragment() + * @method static mixed getFragment(string $name, string|null $default = null) + * @method static array getFragments() + * @method static void flushFragments() + * @method static void startSection(string $section, string|null $content = null) + * @method static void inject(string $section, string $content) + * @method static string yieldSection() + * @method static string stopSection(bool $overwrite = false) + * @method static string appendSection() + * @method static string yieldContent(string $section, string $default = '') + * @method static string parentPlaceholder(string $section = '') + * @method static bool hasSection(string $name) + * @method static bool sectionMissing(string $name) + * @method static mixed getSection(string $name, string|null $default = null) + * @method static array getSections() + * @method static void flushSections() + * @method static void addLoop(\Countable|array $data) + * @method static void incrementLoopIndices() + * @method static void popLoop() + * @method static \stdClass|null getLastLoop() + * @method static array getLoopStack() + * @method static void startPush(string $section, string $content = '') + * @method static string stopPush() + * @method static void startPrepend(string $section, string $content = '') + * @method static string stopPrepend() + * @method static string yieldPushContent(string $section, string $default = '') + * @method static void flushStacks() + * @method static void startTranslation(array $replacements = []) + * @method static string renderTranslation() + * + * @see \Illuminate\View\Factory + */ +class View extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return 'view'; + } +} diff --git a/vendor/illuminate/support/Facades/Vite.php b/vendor/illuminate/support/Facades/Vite.php new file mode 100644 index 0000000..3a28907 --- /dev/null +++ b/vendor/illuminate/support/Facades/Vite.php @@ -0,0 +1,41 @@ +<?php + +namespace Illuminate\Support\Facades; + +/** + * @method static array preloadedAssets() + * @method static string|null cspNonce() + * @method static string useCspNonce(?string $nonce = null) + * @method static \Illuminate\Foundation\Vite useIntegrityKey(string|false $key) + * @method static \Illuminate\Foundation\Vite withEntryPoints(array $entryPoints) + * @method static \Illuminate\Foundation\Vite useManifestFilename(string $filename) + * @method static string hotFile() + * @method static \Illuminate\Foundation\Vite useHotFile(string $path) + * @method static \Illuminate\Foundation\Vite useBuildDirectory(string $path) + * @method static \Illuminate\Foundation\Vite useScriptTagAttributes((callable(string, string, ?array, ?array): array)|array $attributes) + * @method static \Illuminate\Foundation\Vite useStyleTagAttributes((callable(string, string, ?array, ?array): array)|array $attributes) + * @method static \Illuminate\Foundation\Vite usePreloadTagAttributes((callable(string, string, ?array, ?array): array|false)|array|false $attributes) + * @method static \Illuminate\Support\HtmlString|void reactRefresh() + * @method static string asset(string $asset, string|null $buildDirectory = null) + * @method static string|null manifestHash(string|null $buildDirectory = null) + * @method static bool isRunningHot() + * @method static string toHtml() + * @method static void macro(string $name, object|callable $macro) + * @method static void mixin(object $mixin, bool $replace = true) + * @method static bool hasMacro(string $name) + * @method static void flushMacros() + * + * @see \Illuminate\Foundation\Vite + */ +class Vite extends Facade +{ + /** + * Get the registered name of the component. + * + * @return string + */ + protected static function getFacadeAccessor() + { + return \Illuminate\Foundation\Vite::class; + } +} diff --git a/vendor/illuminate/support/Fluent.php b/vendor/illuminate/support/Fluent.php new file mode 100755 index 0000000..109ce17 --- /dev/null +++ b/vendor/illuminate/support/Fluent.php @@ -0,0 +1,201 @@ +<?php + +namespace Illuminate\Support; + +use ArrayAccess; +use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Contracts\Support\Jsonable; +use JsonSerializable; + +/** + * @template TKey of array-key + * @template TValue + * + * @implements \Illuminate\Contracts\Support\Arrayable<TKey, TValue> + * @implements \ArrayAccess<TKey, TValue> + */ +class Fluent implements Arrayable, ArrayAccess, Jsonable, JsonSerializable +{ + /** + * All of the attributes set on the fluent instance. + * + * @var array<TKey, TValue> + */ + protected $attributes = []; + + /** + * Create a new fluent instance. + * + * @param iterable<TKey, TValue> $attributes + * @return void + */ + public function __construct($attributes = []) + { + foreach ($attributes as $key => $value) { + $this->attributes[$key] = $value; + } + } + + /** + * Get an attribute from the fluent instance. + * + * @template TGetDefault + * + * @param TKey $key + * @param TGetDefault|(\Closure(): TGetDefault) $default + * @return TValue|TGetDefault + */ + public function get($key, $default = null) + { + if (array_key_exists($key, $this->attributes)) { + return $this->attributes[$key]; + } + + return value($default); + } + + /** + * Get the attributes from the fluent instance. + * + * @return array<TKey, TValue> + */ + public function getAttributes() + { + return $this->attributes; + } + + /** + * Convert the fluent instance to an array. + * + * @return array<TKey, TValue> + */ + public function toArray() + { + return $this->attributes; + } + + /** + * Convert the object into something JSON serializable. + * + * @return array<TKey, TValue> + */ + public function jsonSerialize(): array + { + return $this->toArray(); + } + + /** + * Convert the fluent instance to JSON. + * + * @param int $options + * @return string + */ + public function toJson($options = 0) + { + return json_encode($this->jsonSerialize(), $options); + } + + /** + * Determine if the given offset exists. + * + * @param TKey $offset + * @return bool + */ + public function offsetExists($offset): bool + { + return isset($this->attributes[$offset]); + } + + /** + * Get the value for a given offset. + * + * @param TKey $offset + * @return TValue|null + */ + public function offsetGet($offset): mixed + { + return $this->get($offset); + } + + /** + * Set the value at the given offset. + * + * @param TKey $offset + * @param TValue $value + * @return void + */ + public function offsetSet($offset, $value): void + { + $this->attributes[$offset] = $value; + } + + /** + * Unset the value at the given offset. + * + * @param TKey $offset + * @return void + */ + public function offsetUnset($offset): void + { + unset($this->attributes[$offset]); + } + + /** + * Handle dynamic calls to the fluent instance to set attributes. + * + * @param TKey $method + * @param array{0: ?TValue} $parameters + * @return $this + */ + public function __call($method, $parameters) + { + $this->attributes[$method] = count($parameters) > 0 ? reset($parameters) : true; + + return $this; + } + + /** + * Dynamically retrieve the value of an attribute. + * + * @param TKey $key + * @return TValue|null + */ + public function __get($key) + { + return $this->get($key); + } + + /** + * Dynamically set the value of an attribute. + * + * @param TKey $key + * @param TValue $value + * @return void + */ + public function __set($key, $value) + { + $this->offsetSet($key, $value); + } + + /** + * Dynamically check if an attribute is set. + * + * @param TKey $key + * @return bool + */ + public function __isset($key) + { + return $this->offsetExists($key); + } + + /** + * Dynamically unset an attribute. + * + * @param TKey $key + * @return void + */ + public function __unset($key) + { + $this->offsetUnset($key); + } +} diff --git a/vendor/illuminate/support/HigherOrderTapProxy.php b/vendor/illuminate/support/HigherOrderTapProxy.php new file mode 100644 index 0000000..bbf9b2e --- /dev/null +++ b/vendor/illuminate/support/HigherOrderTapProxy.php @@ -0,0 +1,38 @@ +<?php + +namespace Illuminate\Support; + +class HigherOrderTapProxy +{ + /** + * The target being tapped. + * + * @var mixed + */ + public $target; + + /** + * Create a new tap proxy instance. + * + * @param mixed $target + * @return void + */ + public function __construct($target) + { + $this->target = $target; + } + + /** + * Dynamically pass method calls to the target. + * + * @param string $method + * @param array $parameters + * @return mixed + */ + public function __call($method, $parameters) + { + $this->target->{$method}(...$parameters); + + return $this->target; + } +} diff --git a/vendor/illuminate/support/HtmlString.php b/vendor/illuminate/support/HtmlString.php new file mode 100644 index 0000000..d6b71d4 --- /dev/null +++ b/vendor/illuminate/support/HtmlString.php @@ -0,0 +1,66 @@ +<?php + +namespace Illuminate\Support; + +use Illuminate\Contracts\Support\Htmlable; + +class HtmlString implements Htmlable +{ + /** + * The HTML string. + * + * @var string + */ + protected $html; + + /** + * Create a new HTML string instance. + * + * @param string $html + * @return void + */ + public function __construct($html = '') + { + $this->html = $html; + } + + /** + * Get the HTML string. + * + * @return string + */ + public function toHtml() + { + return $this->html; + } + + /** + * Determine if the given HTML string is empty. + * + * @return bool + */ + public function isEmpty() + { + return $this->html === ''; + } + + /** + * Determine if the given HTML string is not empty. + * + * @return bool + */ + public function isNotEmpty() + { + return ! $this->isEmpty(); + } + + /** + * Get the HTML string. + * + * @return string + */ + public function __toString() + { + return $this->toHtml(); + } +} diff --git a/vendor/illuminate/support/InteractsWithTime.php b/vendor/illuminate/support/InteractsWithTime.php new file mode 100644 index 0000000..2b617c3 --- /dev/null +++ b/vendor/illuminate/support/InteractsWithTime.php @@ -0,0 +1,64 @@ +<?php + +namespace Illuminate\Support; + +use DateInterval; +use DateTimeInterface; + +trait InteractsWithTime +{ + /** + * Get the number of seconds until the given DateTime. + * + * @param \DateTimeInterface|\DateInterval|int $delay + * @return int + */ + protected function secondsUntil($delay) + { + $delay = $this->parseDateInterval($delay); + + return $delay instanceof DateTimeInterface + ? max(0, $delay->getTimestamp() - $this->currentTime()) + : (int) $delay; + } + + /** + * Get the "available at" UNIX timestamp. + * + * @param \DateTimeInterface|\DateInterval|int $delay + * @return int + */ + protected function availableAt($delay = 0) + { + $delay = $this->parseDateInterval($delay); + + return $delay instanceof DateTimeInterface + ? $delay->getTimestamp() + : Carbon::now()->addRealSeconds($delay)->getTimestamp(); + } + + /** + * If the given value is an interval, convert it to a DateTime instance. + * + * @param \DateTimeInterface|\DateInterval|int $delay + * @return \DateTimeInterface|int + */ + protected function parseDateInterval($delay) + { + if ($delay instanceof DateInterval) { + $delay = Carbon::now()->add($delay); + } + + return $delay; + } + + /** + * Get the current system time as a UNIX timestamp. + * + * @return int + */ + protected function currentTime() + { + return Carbon::now()->getTimestamp(); + } +} diff --git a/vendor/illuminate/support/Js.php b/vendor/illuminate/support/Js.php new file mode 100644 index 0000000..5a1d23a --- /dev/null +++ b/vendor/illuminate/support/Js.php @@ -0,0 +1,145 @@ +<?php + +namespace Illuminate\Support; + +use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Contracts\Support\Htmlable; +use Illuminate\Contracts\Support\Jsonable; +use JsonSerializable; + +class Js implements Htmlable +{ + /** + * The JavaScript string. + * + * @var string + */ + protected $js; + + /** + * Flags that should be used when encoding to JSON. + * + * @var int + */ + protected const REQUIRED_FLAGS = JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT | JSON_THROW_ON_ERROR; + + /** + * Create a new class instance. + * + * @param mixed $data + * @param int|null $flags + * @param int $depth + * @return void + * + * @throws \JsonException + */ + public function __construct($data, $flags = 0, $depth = 512) + { + $this->js = $this->convertDataToJavaScriptExpression($data, $flags, $depth); + } + + /** + * Create a new JavaScript string from the given data. + * + * @param mixed $data + * @param int $flags + * @param int $depth + * @return static + * + * @throws \JsonException + */ + public static function from($data, $flags = 0, $depth = 512) + { + return new static($data, $flags, $depth); + } + + /** + * Convert the given data to a JavaScript expression. + * + * @param mixed $data + * @param int $flags + * @param int $depth + * @return string + * + * @throws \JsonException + */ + protected function convertDataToJavaScriptExpression($data, $flags = 0, $depth = 512) + { + if ($data instanceof self) { + return $data->toHtml(); + } + + $json = $this->jsonEncode($data, $flags, $depth); + + if (is_string($data)) { + return "'".substr($json, 1, -1)."'"; + } + + return $this->convertJsonToJavaScriptExpression($json, $flags); + } + + /** + * Encode the given data as JSON. + * + * @param mixed $data + * @param int $flags + * @param int $depth + * @return string + * + * @throws \JsonException + */ + protected function jsonEncode($data, $flags = 0, $depth = 512) + { + if ($data instanceof Jsonable) { + return $data->toJson($flags | static::REQUIRED_FLAGS); + } + + if ($data instanceof Arrayable && ! ($data instanceof JsonSerializable)) { + $data = $data->toArray(); + } + + return json_encode($data, $flags | static::REQUIRED_FLAGS, $depth); + } + + /** + * Convert the given JSON to a JavaScript expression. + * + * @param string $json + * @param int $flags + * @return string + * + * @throws \JsonException + */ + protected function convertJsonToJavaScriptExpression($json, $flags = 0) + { + if ($json === '[]' || $json === '{}') { + return $json; + } + + if (Str::startsWith($json, ['"', '{', '['])) { + return "JSON.parse('".substr(json_encode($json, $flags | static::REQUIRED_FLAGS), 1, -1)."')"; + } + + return $json; + } + + /** + * Get the string representation of the data for use in HTML. + * + * @return string + */ + public function toHtml() + { + return $this->js; + } + + /** + * Get the string representation of the data for use in HTML. + * + * @return string + */ + public function __toString() + { + return $this->toHtml(); + } +} diff --git a/vendor/illuminate/support/LICENSE.md b/vendor/illuminate/support/LICENSE.md new file mode 100644 index 0000000..79810c8 --- /dev/null +++ b/vendor/illuminate/support/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Taylor Otwell + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/illuminate/support/Lottery.php b/vendor/illuminate/support/Lottery.php new file mode 100644 index 0000000..5fe1f3e --- /dev/null +++ b/vendor/illuminate/support/Lottery.php @@ -0,0 +1,270 @@ +<?php + +namespace Illuminate\Support; + +use RuntimeException; + +class Lottery +{ + /** + * The number of expected wins. + * + * @var int|float + */ + protected $chances; + + /** + * The number of potential opportunities to win. + * + * @var int|null + */ + protected $outOf; + + /** + * The winning callback. + * + * @var null|callable + */ + protected $winner; + + /** + * The losing callback. + * + * @var null|callable + */ + protected $loser; + + /** + * The factory that should be used to generate results. + * + * @var callable|null + */ + protected static $resultFactory; + + /** + * Create a new Lottery instance. + * + * @param int|float $chances + * @param ?int $outOf + */ + public function __construct($chances, $outOf = null) + { + if ($outOf === null && is_float($chances) && $chances > 1) { + throw new RuntimeException('Float must not be greater than 1.'); + } + + $this->chances = $chances; + + $this->outOf = $outOf; + } + + /** + * Create a new Lottery instance. + * + * @param int|float $chances + * @param ?int $outOf + * @return static + */ + public static function odds($chances, $outOf = null) + { + return new static($chances, $outOf); + } + + /** + * Set the winner callback. + * + * @param callable $callback + * @return $this + */ + public function winner($callback) + { + $this->winner = $callback; + + return $this; + } + + /** + * Set the loser callback. + * + * @param callable $callback + * @return $this + */ + public function loser($callback) + { + $this->loser = $callback; + + return $this; + } + + /** + * Run the lottery. + * + * @param mixed ...$args + * @return mixed + */ + public function __invoke(...$args) + { + return $this->runCallback(...$args); + } + + /** + * Run the lottery. + * + * @param null|int $times + * @return mixed + */ + public function choose($times = null) + { + if ($times === null) { + return $this->runCallback(); + } + + $results = []; + + for ($i = 0; $i < $times; $i++) { + $results[] = $this->runCallback(); + } + + return $results; + } + + /** + * Run the winner or loser callback, randomly. + * + * @param mixed ...$args + * @return callable + */ + protected function runCallback(...$args) + { + return $this->wins() + ? ($this->winner ?? fn () => true)(...$args) + : ($this->loser ?? fn () => false)(...$args); + } + + /** + * Determine if the lottery "wins" or "loses". + * + * @return bool + */ + protected function wins() + { + return static::resultFactory()($this->chances, $this->outOf); + } + + /** + * The factory that determines the lottery result. + * + * @return callable + */ + protected static function resultFactory() + { + return static::$resultFactory ?? fn ($chances, $outOf) => $outOf === null + ? random_int(0, PHP_INT_MAX) / PHP_INT_MAX <= $chances + : random_int(1, $outOf) <= $chances; + } + + /** + * Force the lottery to always result in a win. + * + * @param callable|null $callback + * @return void + */ + public static function alwaysWin($callback = null) + { + self::setResultFactory(fn () => true); + + if ($callback === null) { + return; + } + + $callback(); + + static::determineResultNormally(); + } + + /** + * Force the lottery to always result in a lose. + * + * @param callable|null $callback + * @return void + */ + public static function alwaysLose($callback = null) + { + self::setResultFactory(fn () => false); + + if ($callback === null) { + return; + } + + $callback(); + + static::determineResultNormally(); + } + + /** + * Set the sequence that will be used to determine lottery results. + * + * @param array $sequence + * @param callable|null $whenMissing + * @return void + */ + public static function fix($sequence, $whenMissing = null) + { + return static::forceResultWithSequence($sequence, $whenMissing); + } + + /** + * Set the sequence that will be used to determine lottery results. + * + * @param array $sequence + * @param callable|null $whenMissing + * @return void + */ + public static function forceResultWithSequence($sequence, $whenMissing = null) + { + $next = 0; + + $whenMissing ??= function ($chances, $outOf) use (&$next) { + $factoryCache = static::$resultFactory; + + static::$resultFactory = null; + + $result = static::resultFactory()($chances, $outOf); + + static::$resultFactory = $factoryCache; + + $next++; + + return $result; + }; + + static::setResultFactory(function ($chances, $outOf) use (&$next, $sequence, $whenMissing) { + if (array_key_exists($next, $sequence)) { + return $sequence[$next++]; + } + + return $whenMissing($chances, $outOf); + }); + } + + /** + * Indicate that the lottery results should be determined normally. + * + * @return void + */ + public static function determineResultNormally() + { + static::$resultFactory = null; + } + + /** + * Set the factory that should be used to deterine the lottery results. + * + * @param callable $factory + * @return void + */ + public static function setResultFactory($factory) + { + self::$resultFactory = $factory; + } +} diff --git a/vendor/illuminate/support/Manager.php b/vendor/illuminate/support/Manager.php new file mode 100755 index 0000000..f8ae072 --- /dev/null +++ b/vendor/illuminate/support/Manager.php @@ -0,0 +1,193 @@ +<?php + +namespace Illuminate\Support; + +use Closure; +use Illuminate\Contracts\Container\Container; +use InvalidArgumentException; + +abstract class Manager +{ + /** + * The container instance. + * + * @var \Illuminate\Contracts\Container\Container + */ + protected $container; + + /** + * The configuration repository instance. + * + * @var \Illuminate\Contracts\Config\Repository + */ + protected $config; + + /** + * The registered custom driver creators. + * + * @var array + */ + protected $customCreators = []; + + /** + * The array of created "drivers". + * + * @var array + */ + protected $drivers = []; + + /** + * Create a new manager instance. + * + * @param \Illuminate\Contracts\Container\Container $container + * @return void + */ + public function __construct(Container $container) + { + $this->container = $container; + $this->config = $container->make('config'); + } + + /** + * Get the default driver name. + * + * @return string + */ + abstract public function getDefaultDriver(); + + /** + * Get a driver instance. + * + * @param string|null $driver + * @return mixed + * + * @throws \InvalidArgumentException + */ + public function driver($driver = null) + { + $driver = $driver ?: $this->getDefaultDriver(); + + if (is_null($driver)) { + throw new InvalidArgumentException(sprintf( + 'Unable to resolve NULL driver for [%s].', static::class + )); + } + + // If the given driver has not been created before, we will create the instances + // here and cache it so we can return it next time very quickly. If there is + // already a driver created by this name, we'll just return that instance. + if (! isset($this->drivers[$driver])) { + $this->drivers[$driver] = $this->createDriver($driver); + } + + return $this->drivers[$driver]; + } + + /** + * Create a new driver instance. + * + * @param string $driver + * @return mixed + * + * @throws \InvalidArgumentException + */ + protected function createDriver($driver) + { + // First, we will determine if a custom driver creator exists for the given driver and + // if it does not we will check for a creator method for the driver. Custom creator + // callbacks allow developers to build their own "drivers" easily using Closures. + if (isset($this->customCreators[$driver])) { + return $this->callCustomCreator($driver); + } else { + $method = 'create'.Str::studly($driver).'Driver'; + + if (method_exists($this, $method)) { + return $this->$method(); + } + } + + throw new InvalidArgumentException("Driver [$driver] not supported."); + } + + /** + * Call a custom driver creator. + * + * @param string $driver + * @return mixed + */ + protected function callCustomCreator($driver) + { + return $this->customCreators[$driver]($this->container); + } + + /** + * Register a custom driver creator Closure. + * + * @param string $driver + * @param \Closure $callback + * @return $this + */ + public function extend($driver, Closure $callback) + { + $this->customCreators[$driver] = $callback; + + return $this; + } + + /** + * Get all of the created "drivers". + * + * @return array + */ + public function getDrivers() + { + return $this->drivers; + } + + /** + * Get the container instance used by the manager. + * + * @return \Illuminate\Contracts\Container\Container + */ + public function getContainer() + { + return $this->container; + } + + /** + * Set the container instance used by the manager. + * + * @param \Illuminate\Contracts\Container\Container $container + * @return $this + */ + public function setContainer(Container $container) + { + $this->container = $container; + + return $this; + } + + /** + * Forget all of the resolved driver instances. + * + * @return $this + */ + public function forgetDrivers() + { + $this->drivers = []; + + return $this; + } + + /** + * Dynamically call the default driver instance. + * + * @param string $method + * @param array $parameters + * @return mixed + */ + public function __call($method, $parameters) + { + return $this->driver()->$method(...$parameters); + } +} diff --git a/vendor/illuminate/support/MessageBag.php b/vendor/illuminate/support/MessageBag.php new file mode 100755 index 0000000..88ebfb0 --- /dev/null +++ b/vendor/illuminate/support/MessageBag.php @@ -0,0 +1,420 @@ +<?php + +namespace Illuminate\Support; + +use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Contracts\Support\Jsonable; +use Illuminate\Contracts\Support\MessageBag as MessageBagContract; +use Illuminate\Contracts\Support\MessageProvider; +use JsonSerializable; + +class MessageBag implements Jsonable, JsonSerializable, MessageBagContract, MessageProvider +{ + /** + * All of the registered messages. + * + * @var array + */ + protected $messages = []; + + /** + * Default format for message output. + * + * @var string + */ + protected $format = ':message'; + + /** + * Create a new message bag instance. + * + * @param array $messages + * @return void + */ + public function __construct(array $messages = []) + { + foreach ($messages as $key => $value) { + $value = $value instanceof Arrayable ? $value->toArray() : (array) $value; + + $this->messages[$key] = array_unique($value); + } + } + + /** + * Get the keys present in the message bag. + * + * @return array + */ + public function keys() + { + return array_keys($this->messages); + } + + /** + * Add a message to the message bag. + * + * @param string $key + * @param string $message + * @return $this + */ + public function add($key, $message) + { + if ($this->isUnique($key, $message)) { + $this->messages[$key][] = $message; + } + + return $this; + } + + /** + * Add a message to the message bag if the given conditional is "true". + * + * @param bool $boolean + * @param string $key + * @param string $message + * @return $this + */ + public function addIf($boolean, $key, $message) + { + return $boolean ? $this->add($key, $message) : $this; + } + + /** + * Determine if a key and message combination already exists. + * + * @param string $key + * @param string $message + * @return bool + */ + protected function isUnique($key, $message) + { + $messages = (array) $this->messages; + + return ! isset($messages[$key]) || ! in_array($message, $messages[$key]); + } + + /** + * Merge a new array of messages into the message bag. + * + * @param \Illuminate\Contracts\Support\MessageProvider|array $messages + * @return $this + */ + public function merge($messages) + { + if ($messages instanceof MessageProvider) { + $messages = $messages->getMessageBag()->getMessages(); + } + + $this->messages = array_merge_recursive($this->messages, $messages); + + return $this; + } + + /** + * Determine if messages exist for all of the given keys. + * + * @param array|string|null $key + * @return bool + */ + public function has($key) + { + if ($this->isEmpty()) { + return false; + } + + if (is_null($key)) { + return $this->any(); + } + + $keys = is_array($key) ? $key : func_get_args(); + + foreach ($keys as $key) { + if ($this->first($key) === '') { + return false; + } + } + + return true; + } + + /** + * Determine if messages exist for any of the given keys. + * + * @param array|string|null $keys + * @return bool + */ + public function hasAny($keys = []) + { + if ($this->isEmpty()) { + return false; + } + + $keys = is_array($keys) ? $keys : func_get_args(); + + foreach ($keys as $key) { + if ($this->has($key)) { + return true; + } + } + + return false; + } + + /** + * Get the first message from the message bag for a given key. + * + * @param string|null $key + * @param string|null $format + * @return string + */ + public function first($key = null, $format = null) + { + $messages = is_null($key) ? $this->all($format) : $this->get($key, $format); + + $firstMessage = Arr::first($messages, null, ''); + + return is_array($firstMessage) ? Arr::first($firstMessage) : $firstMessage; + } + + /** + * Get all of the messages from the message bag for a given key. + * + * @param string $key + * @param string|null $format + * @return array + */ + public function get($key, $format = null) + { + // If the message exists in the message bag, we will transform it and return + // the message. Otherwise, we will check if the key is implicit & collect + // all the messages that match the given key and output it as an array. + if (array_key_exists($key, $this->messages)) { + return $this->transform( + $this->messages[$key], $this->checkFormat($format), $key + ); + } + + if (str_contains($key, '*')) { + return $this->getMessagesForWildcardKey($key, $format); + } + + return []; + } + + /** + * Get the messages for a wildcard key. + * + * @param string $key + * @param string|null $format + * @return array + */ + protected function getMessagesForWildcardKey($key, $format) + { + return collect($this->messages) + ->filter(function ($messages, $messageKey) use ($key) { + return Str::is($key, $messageKey); + }) + ->map(function ($messages, $messageKey) use ($format) { + return $this->transform( + $messages, $this->checkFormat($format), $messageKey + ); + })->all(); + } + + /** + * Get all of the messages for every key in the message bag. + * + * @param string|null $format + * @return array + */ + public function all($format = null) + { + $format = $this->checkFormat($format); + + $all = []; + + foreach ($this->messages as $key => $messages) { + $all = array_merge($all, $this->transform($messages, $format, $key)); + } + + return $all; + } + + /** + * Get all of the unique messages for every key in the message bag. + * + * @param string|null $format + * @return array + */ + public function unique($format = null) + { + return array_unique($this->all($format)); + } + + /** + * Format an array of messages. + * + * @param array $messages + * @param string $format + * @param string $messageKey + * @return array + */ + protected function transform($messages, $format, $messageKey) + { + if ($format == ':message') { + return (array) $messages; + } + + return collect((array) $messages) + ->map(function ($message) use ($format, $messageKey) { + // We will simply spin through the given messages and transform each one + // replacing the :message place holder with the real message allowing + // the messages to be easily formatted to each developer's desires. + return str_replace([':message', ':key'], [$message, $messageKey], $format); + })->all(); + } + + /** + * Get the appropriate format based on the given format. + * + * @param string $format + * @return string + */ + protected function checkFormat($format) + { + return $format ?: $this->format; + } + + /** + * Get the raw messages in the message bag. + * + * @return array + */ + public function messages() + { + return $this->messages; + } + + /** + * Get the raw messages in the message bag. + * + * @return array + */ + public function getMessages() + { + return $this->messages(); + } + + /** + * Get the messages for the instance. + * + * @return \Illuminate\Support\MessageBag + */ + public function getMessageBag() + { + return $this; + } + + /** + * Get the default message format. + * + * @return string + */ + public function getFormat() + { + return $this->format; + } + + /** + * Set the default message format. + * + * @param string $format + * @return \Illuminate\Support\MessageBag + */ + public function setFormat($format = ':message') + { + $this->format = $format; + + return $this; + } + + /** + * Determine if the message bag has any messages. + * + * @return bool + */ + public function isEmpty() + { + return ! $this->any(); + } + + /** + * Determine if the message bag has any messages. + * + * @return bool + */ + public function isNotEmpty() + { + return $this->any(); + } + + /** + * Determine if the message bag has any messages. + * + * @return bool + */ + public function any() + { + return $this->count() > 0; + } + + /** + * Get the number of messages in the message bag. + * + * @return int + */ + public function count(): int + { + return count($this->messages, COUNT_RECURSIVE) - count($this->messages); + } + + /** + * Get the instance as an array. + * + * @return array + */ + public function toArray() + { + return $this->getMessages(); + } + + /** + * Convert the object into something JSON serializable. + * + * @return array + */ + public function jsonSerialize(): array + { + return $this->toArray(); + } + + /** + * Convert the object to its JSON representation. + * + * @param int $options + * @return string + */ + public function toJson($options = 0) + { + return json_encode($this->jsonSerialize(), $options); + } + + /** + * Convert the message bag to its string representation. + * + * @return string + */ + public function __toString() + { + return $this->toJson(); + } +} diff --git a/vendor/illuminate/support/MultipleInstanceManager.php b/vendor/illuminate/support/MultipleInstanceManager.php new file mode 100644 index 0000000..8544bdf --- /dev/null +++ b/vendor/illuminate/support/MultipleInstanceManager.php @@ -0,0 +1,191 @@ +<?php + +namespace Illuminate\Support; + +use Closure; +use InvalidArgumentException; +use RuntimeException; + +abstract class MultipleInstanceManager +{ + /** + * The application instance. + * + * @var \Illuminate\Contracts\Foundation\Application + */ + protected $app; + + /** + * The array of resolved instances. + * + * @var array + */ + protected $instances = []; + + /** + * The registered custom instance creators. + * + * @var array + */ + protected $customCreators = []; + + /** + * Create a new manager instance. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return void + */ + public function __construct($app) + { + $this->app = $app; + } + + /** + * Get the default instance name. + * + * @return string + */ + abstract public function getDefaultInstance(); + + /** + * Set the default instance name. + * + * @param string $name + * @return void + */ + abstract public function setDefaultInstance($name); + + /** + * Get the instance specific configuration. + * + * @param string $name + * @return array + */ + abstract public function getInstanceConfig($name); + + /** + * Get an instance instance by name. + * + * @param string|null $name + * @return mixed + */ + public function instance($name = null) + { + $name = $name ?: $this->getDefaultInstance(); + + return $this->instances[$name] = $this->get($name); + } + + /** + * Attempt to get an instance from the local cache. + * + * @param string $name + * @return mixed + */ + protected function get($name) + { + return $this->instances[$name] ?? $this->resolve($name); + } + + /** + * Resolve the given instance. + * + * @param string $name + * @return mixed + * + * @throws \InvalidArgumentException + */ + protected function resolve($name) + { + $config = $this->getInstanceConfig($name); + + if (is_null($config)) { + throw new InvalidArgumentException("Instance [{$name}] is not defined."); + } + + if (! array_key_exists('driver', $config)) { + throw new RuntimeException("Instance [{$name}] does not specify a driver."); + } + + if (isset($this->customCreators[$config['driver']])) { + return $this->callCustomCreator($config); + } else { + $driverMethod = 'create'.ucfirst($config['driver']).'Driver'; + + if (method_exists($this, $driverMethod)) { + return $this->{$driverMethod}($config); + } else { + throw new InvalidArgumentException("Instance driver [{$config['driver']}] is not supported."); + } + } + } + + /** + * Call a custom instance creator. + * + * @param array $config + * @return mixed + */ + protected function callCustomCreator(array $config) + { + return $this->customCreators[$config['driver']]($this->app, $config); + } + + /** + * Unset the given instances. + * + * @param array|string|null $name + * @return $this + */ + public function forgetInstance($name = null) + { + $name ??= $this->getDefaultInstance(); + + foreach ((array) $name as $instanceName) { + if (isset($this->instances[$instanceName])) { + unset($this->instances[$instanceName]); + } + } + + return $this; + } + + /** + * Disconnect the given instance and remove from local cache. + * + * @param string|null $name + * @return void + */ + public function purge($name = null) + { + $name ??= $this->getDefaultInstance(); + + unset($this->instances[$name]); + } + + /** + * Register a custom instance creator Closure. + * + * @param string $name + * @param \Closure $callback + * @return $this + */ + public function extend($name, Closure $callback) + { + $this->customCreators[$name] = $callback->bindTo($this, $this); + + return $this; + } + + /** + * Dynamically call the default instance. + * + * @param string $method + * @param array $parameters + * @return mixed + */ + public function __call($method, $parameters) + { + return $this->instance()->$method(...$parameters); + } +} diff --git a/vendor/illuminate/support/NamespacedItemResolver.php b/vendor/illuminate/support/NamespacedItemResolver.php new file mode 100755 index 0000000..a059c6d --- /dev/null +++ b/vendor/illuminate/support/NamespacedItemResolver.php @@ -0,0 +1,112 @@ +<?php + +namespace Illuminate\Support; + +class NamespacedItemResolver +{ + /** + * A cache of the parsed items. + * + * @var array + */ + protected $parsed = []; + + /** + * Parse a key into namespace, group, and item. + * + * @param string $key + * @return array + */ + public function parseKey($key) + { + // If we've already parsed the given key, we'll return the cached version we + // already have, as this will save us some processing. We cache off every + // key we parse so we can quickly return it on all subsequent requests. + if (isset($this->parsed[$key])) { + return $this->parsed[$key]; + } + + // If the key does not contain a double colon, it means the key is not in a + // namespace, and is just a regular configuration item. Namespaces are a + // tool for organizing configuration items for things such as modules. + if (! str_contains($key, '::')) { + $segments = explode('.', $key); + + $parsed = $this->parseBasicSegments($segments); + } else { + $parsed = $this->parseNamespacedSegments($key); + } + + // Once we have the parsed array of this key's elements, such as its groups + // and namespace, we will cache each array inside a simple list that has + // the key and the parsed array for quick look-ups for later requests. + return $this->parsed[$key] = $parsed; + } + + /** + * Parse an array of basic segments. + * + * @param array $segments + * @return array + */ + protected function parseBasicSegments(array $segments) + { + // The first segment in a basic array will always be the group, so we can go + // ahead and grab that segment. If there is only one total segment we are + // just pulling an entire group out of the array and not a single item. + $group = $segments[0]; + + // If there is more than one segment in this group, it means we are pulling + // a specific item out of a group and will need to return this item name + // as well as the group so we know which item to pull from the arrays. + $item = count($segments) === 1 + ? null + : implode('.', array_slice($segments, 1)); + + return [null, $group, $item]; + } + + /** + * Parse an array of namespaced segments. + * + * @param string $key + * @return array + */ + protected function parseNamespacedSegments($key) + { + [$namespace, $item] = explode('::', $key); + + // First we'll just explode the first segment to get the namespace and group + // since the item should be in the remaining segments. Once we have these + // two pieces of data we can proceed with parsing out the item's value. + $itemSegments = explode('.', $item); + + $groupAndItem = array_slice( + $this->parseBasicSegments($itemSegments), 1 + ); + + return array_merge([$namespace], $groupAndItem); + } + + /** + * Set the parsed value of a key. + * + * @param string $key + * @param array $parsed + * @return void + */ + public function setParsedKey($key, $parsed) + { + $this->parsed[$key] = $parsed; + } + + /** + * Flush the cache of parsed keys. + * + * @return void + */ + public function flushParsedKeys() + { + $this->parsed = []; + } +} diff --git a/vendor/illuminate/support/Optional.php b/vendor/illuminate/support/Optional.php new file mode 100644 index 0000000..ba84a2c --- /dev/null +++ b/vendor/illuminate/support/Optional.php @@ -0,0 +1,131 @@ +<?php + +namespace Illuminate\Support; + +use ArrayAccess; +use ArrayObject; +use Illuminate\Support\Traits\Macroable; + +class Optional implements ArrayAccess +{ + use Macroable { + __call as macroCall; + } + + /** + * The underlying object. + * + * @var mixed + */ + protected $value; + + /** + * Create a new optional instance. + * + * @param mixed $value + * @return void + */ + public function __construct($value) + { + $this->value = $value; + } + + /** + * Dynamically access a property on the underlying object. + * + * @param string $key + * @return mixed + */ + public function __get($key) + { + if (is_object($this->value)) { + return $this->value->{$key} ?? null; + } + } + + /** + * Dynamically check a property exists on the underlying object. + * + * @param mixed $name + * @return bool + */ + public function __isset($name) + { + if (is_object($this->value)) { + return isset($this->value->{$name}); + } + + if (is_array($this->value) || $this->value instanceof ArrayObject) { + return isset($this->value[$name]); + } + + return false; + } + + /** + * Determine if an item exists at an offset. + * + * @param mixed $key + * @return bool + */ + public function offsetExists($key): bool + { + return Arr::accessible($this->value) && Arr::exists($this->value, $key); + } + + /** + * Get an item at a given offset. + * + * @param mixed $key + * @return mixed + */ + public function offsetGet($key): mixed + { + return Arr::get($this->value, $key); + } + + /** + * Set the item at a given offset. + * + * @param mixed $key + * @param mixed $value + * @return void + */ + public function offsetSet($key, $value): void + { + if (Arr::accessible($this->value)) { + $this->value[$key] = $value; + } + } + + /** + * Unset the item at a given offset. + * + * @param string $key + * @return void + */ + public function offsetUnset($key): void + { + if (Arr::accessible($this->value)) { + unset($this->value[$key]); + } + } + + /** + * Dynamically pass a method to the underlying object. + * + * @param string $method + * @param array $parameters + * @return mixed + */ + public function __call($method, $parameters) + { + if (static::hasMacro($method)) { + return $this->macroCall($method, $parameters); + } + + if (is_object($this->value)) { + return $this->value->{$method}(...$parameters); + } + } +} diff --git a/vendor/illuminate/support/Pluralizer.php b/vendor/illuminate/support/Pluralizer.php new file mode 100755 index 0000000..9a9228c --- /dev/null +++ b/vendor/illuminate/support/Pluralizer.php @@ -0,0 +1,129 @@ +<?php + +namespace Illuminate\Support; + +use Doctrine\Inflector\InflectorFactory; + +class Pluralizer +{ + /** + * The cached inflector instance. + * + * @var static + */ + protected static $inflector; + + /** + * The language that should be used by the inflector. + * + * @var string + */ + protected static $language = 'english'; + + /** + * Uncountable non-nouns word forms. + * + * Contains words supported by Doctrine/Inflector/Rules/English/Uninflected.php + * + * @var string[] + */ + public static $uncountable = [ + 'cattle', + 'kin', + 'recommended', + 'related', + ]; + + /** + * Get the plural form of an English word. + * + * @param string $value + * @param int|array|\Countable $count + * @return string + */ + public static function plural($value, $count = 2) + { + if (is_countable($count)) { + $count = count($count); + } + + if ((int) abs($count) === 1 || static::uncountable($value) || preg_match('/^(.*)[A-Za-z0-9\x{0080}-\x{FFFF}]$/u', $value) == 0) { + return $value; + } + + $plural = static::inflector()->pluralize($value); + + return static::matchCase($plural, $value); + } + + /** + * Get the singular form of an English word. + * + * @param string $value + * @return string + */ + public static function singular($value) + { + $singular = static::inflector()->singularize($value); + + return static::matchCase($singular, $value); + } + + /** + * Determine if the given value is uncountable. + * + * @param string $value + * @return bool + */ + protected static function uncountable($value) + { + return in_array(strtolower($value), static::$uncountable); + } + + /** + * Attempt to match the case on two strings. + * + * @param string $value + * @param string $comparison + * @return string + */ + protected static function matchCase($value, $comparison) + { + $functions = ['mb_strtolower', 'mb_strtoupper', 'ucfirst', 'ucwords']; + + foreach ($functions as $function) { + if ($function($comparison) === $comparison) { + return $function($value); + } + } + + return $value; + } + + /** + * Get the inflector instance. + * + * @return \Doctrine\Inflector\Inflector + */ + public static function inflector() + { + if (is_null(static::$inflector)) { + static::$inflector = InflectorFactory::createForLanguage(static::$language)->build(); + } + + return static::$inflector; + } + + /** + * Specify the language that should be used by the inflector. + * + * @param string $language + * @return void + */ + public static function useLanguage(string $language) + { + static::$language = $language; + + static::$inflector = null; + } +} diff --git a/vendor/illuminate/support/ProcessUtils.php b/vendor/illuminate/support/ProcessUtils.php new file mode 100644 index 0000000..165e751 --- /dev/null +++ b/vendor/illuminate/support/ProcessUtils.php @@ -0,0 +1,69 @@ +<?php + +namespace Illuminate\Support; + +/** + * ProcessUtils is a bunch of utility methods. + * + * This class was originally copied from Symfony 3. + */ +class ProcessUtils +{ + /** + * Escapes a string to be used as a shell argument. + * + * @param string $argument + * @return string + */ + public static function escapeArgument($argument) + { + // Fix for PHP bug #43784 escapeshellarg removes % from given string + // Fix for PHP bug #49446 escapeshellarg doesn't work on Windows + // @see https://bugs.php.net/bug.php?id=43784 + // @see https://bugs.php.net/bug.php?id=49446 + if ('\\' === DIRECTORY_SEPARATOR) { + if ($argument === '') { + return '""'; + } + + $escapedArgument = ''; + $quote = false; + + foreach (preg_split('/(")/', $argument, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE) as $part) { + if ($part === '"') { + $escapedArgument .= '\\"'; + } elseif (self::isSurroundedBy($part, '%')) { + // Avoid environment variable expansion + $escapedArgument .= '^%"'.substr($part, 1, -1).'"^%'; + } else { + // escape trailing backslash + if (str_ends_with($part, '\\')) { + $part .= '\\'; + } + $quote = true; + $escapedArgument .= $part; + } + } + + if ($quote) { + $escapedArgument = '"'.$escapedArgument.'"'; + } + + return $escapedArgument; + } + + return "'".str_replace("'", "'\\''", $argument)."'"; + } + + /** + * Is the given string surrounded by the given character? + * + * @param string $arg + * @param string $char + * @return bool + */ + protected static function isSurroundedBy($arg, $char) + { + return strlen($arg) > 2 && $char === $arg[0] && $char === $arg[strlen($arg) - 1]; + } +} diff --git a/vendor/illuminate/support/Reflector.php b/vendor/illuminate/support/Reflector.php new file mode 100644 index 0000000..1390c9d --- /dev/null +++ b/vendor/illuminate/support/Reflector.php @@ -0,0 +1,162 @@ +<?php + +namespace Illuminate\Support; + +use ReflectionClass; +use ReflectionEnum; +use ReflectionMethod; +use ReflectionNamedType; +use ReflectionUnionType; + +class Reflector +{ + /** + * This is a PHP 7.4 compatible implementation of is_callable. + * + * @param mixed $var + * @param bool $syntaxOnly + * @return bool + */ + public static function isCallable($var, $syntaxOnly = false) + { + if (! is_array($var)) { + return is_callable($var, $syntaxOnly); + } + + if (! isset($var[0], $var[1]) || ! is_string($var[1] ?? null)) { + return false; + } + + if ($syntaxOnly && + (is_string($var[0]) || is_object($var[0])) && + is_string($var[1])) { + return true; + } + + $class = is_object($var[0]) ? get_class($var[0]) : $var[0]; + + $method = $var[1]; + + if (! class_exists($class)) { + return false; + } + + if (method_exists($class, $method)) { + return (new ReflectionMethod($class, $method))->isPublic(); + } + + if (is_object($var[0]) && method_exists($class, '__call')) { + return (new ReflectionMethod($class, '__call'))->isPublic(); + } + + if (! is_object($var[0]) && method_exists($class, '__callStatic')) { + return (new ReflectionMethod($class, '__callStatic'))->isPublic(); + } + + return false; + } + + /** + * Get the class name of the given parameter's type, if possible. + * + * @param \ReflectionParameter $parameter + * @return string|null + */ + public static function getParameterClassName($parameter) + { + $type = $parameter->getType(); + + if (! $type instanceof ReflectionNamedType || $type->isBuiltin()) { + return; + } + + return static::getTypeName($parameter, $type); + } + + /** + * Get the class names of the given parameter's type, including union types. + * + * @param \ReflectionParameter $parameter + * @return array + */ + public static function getParameterClassNames($parameter) + { + $type = $parameter->getType(); + + if (! $type instanceof ReflectionUnionType) { + return array_filter([static::getParameterClassName($parameter)]); + } + + $unionTypes = []; + + foreach ($type->getTypes() as $listedType) { + if (! $listedType instanceof ReflectionNamedType || $listedType->isBuiltin()) { + continue; + } + + $unionTypes[] = static::getTypeName($parameter, $listedType); + } + + return array_filter($unionTypes); + } + + /** + * Get the given type's class name. + * + * @param \ReflectionParameter $parameter + * @param \ReflectionNamedType $type + * @return string + */ + protected static function getTypeName($parameter, $type) + { + $name = $type->getName(); + + if (! is_null($class = $parameter->getDeclaringClass())) { + if ($name === 'self') { + return $class->getName(); + } + + if ($name === 'parent' && $parent = $class->getParentClass()) { + return $parent->getName(); + } + } + + return $name; + } + + /** + * Determine if the parameter's type is a subclass of the given type. + * + * @param \ReflectionParameter $parameter + * @param string $className + * @return bool + */ + public static function isParameterSubclassOf($parameter, $className) + { + $paramClassName = static::getParameterClassName($parameter); + + return $paramClassName + && (class_exists($paramClassName) || interface_exists($paramClassName)) + && (new ReflectionClass($paramClassName))->isSubclassOf($className); + } + + /** + * Determine if the parameter's type is a Backed Enum with a string backing type. + * + * @param \ReflectionParameter $parameter + * @return bool + */ + public static function isParameterBackedEnumWithStringBackingType($parameter) + { + $backedEnumClass = (string) $parameter->getType(); + + if (function_exists('enum_exists') && enum_exists($backedEnumClass)) { + $reflectionBackedEnum = new ReflectionEnum($backedEnumClass); + + return $reflectionBackedEnum->isBacked() + && $reflectionBackedEnum->getBackingType()->getName() == 'string'; + } + + return false; + } +} diff --git a/vendor/illuminate/support/ServiceProvider.php b/vendor/illuminate/support/ServiceProvider.php new file mode 100755 index 0000000..6c530c1 --- /dev/null +++ b/vendor/illuminate/support/ServiceProvider.php @@ -0,0 +1,437 @@ +<?php + +namespace Illuminate\Support; + +use Closure; +use Illuminate\Console\Application as Artisan; +use Illuminate\Contracts\Foundation\CachesConfiguration; +use Illuminate\Contracts\Foundation\CachesRoutes; +use Illuminate\Contracts\Support\DeferrableProvider; +use Illuminate\Database\Eloquent\Factory as ModelFactory; +use Illuminate\View\Compilers\BladeCompiler; + +abstract class ServiceProvider +{ + /** + * The application instance. + * + * @var \Illuminate\Contracts\Foundation\Application + */ + protected $app; + + /** + * All of the registered booting callbacks. + * + * @var array + */ + protected $bootingCallbacks = []; + + /** + * All of the registered booted callbacks. + * + * @var array + */ + protected $bootedCallbacks = []; + + /** + * The paths that should be published. + * + * @var array + */ + public static $publishes = []; + + /** + * The paths that should be published by group. + * + * @var array + */ + public static $publishGroups = []; + + /** + * Create a new service provider instance. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @return void + */ + public function __construct($app) + { + $this->app = $app; + } + + /** + * Register any application services. + * + * @return void + */ + public function register() + { + // + } + + /** + * Register a booting callback to be run before the "boot" method is called. + * + * @param \Closure $callback + * @return void + */ + public function booting(Closure $callback) + { + $this->bootingCallbacks[] = $callback; + } + + /** + * Register a booted callback to be run after the "boot" method is called. + * + * @param \Closure $callback + * @return void + */ + public function booted(Closure $callback) + { + $this->bootedCallbacks[] = $callback; + } + + /** + * Call the registered booting callbacks. + * + * @return void + */ + public function callBootingCallbacks() + { + $index = 0; + + while ($index < count($this->bootingCallbacks)) { + $this->app->call($this->bootingCallbacks[$index]); + + $index++; + } + } + + /** + * Call the registered booted callbacks. + * + * @return void + */ + public function callBootedCallbacks() + { + $index = 0; + + while ($index < count($this->bootedCallbacks)) { + $this->app->call($this->bootedCallbacks[$index]); + + $index++; + } + } + + /** + * Merge the given configuration with the existing configuration. + * + * @param string $path + * @param string $key + * @return void + */ + protected function mergeConfigFrom($path, $key) + { + if (! ($this->app instanceof CachesConfiguration && $this->app->configurationIsCached())) { + $config = $this->app->make('config'); + + $config->set($key, array_merge( + require $path, $config->get($key, []) + )); + } + } + + /** + * Load the given routes file if routes are not already cached. + * + * @param string $path + * @return void + */ + protected function loadRoutesFrom($path) + { + if (! ($this->app instanceof CachesRoutes && $this->app->routesAreCached())) { + require $path; + } + } + + /** + * Register a view file namespace. + * + * @param string|array $path + * @param string $namespace + * @return void + */ + protected function loadViewsFrom($path, $namespace) + { + $this->callAfterResolving('view', function ($view) use ($path, $namespace) { + if (isset($this->app->config['view']['paths']) && + is_array($this->app->config['view']['paths'])) { + foreach ($this->app->config['view']['paths'] as $viewPath) { + if (is_dir($appPath = $viewPath.'/vendor/'.$namespace)) { + $view->addNamespace($namespace, $appPath); + } + } + } + + $view->addNamespace($namespace, $path); + }); + } + + /** + * Register the given view components with a custom prefix. + * + * @param string $prefix + * @param array $components + * @return void + */ + protected function loadViewComponentsAs($prefix, array $components) + { + $this->callAfterResolving(BladeCompiler::class, function ($blade) use ($prefix, $components) { + foreach ($components as $alias => $component) { + $blade->component($component, is_string($alias) ? $alias : null, $prefix); + } + }); + } + + /** + * Register a translation file namespace. + * + * @param string $path + * @param string $namespace + * @return void + */ + protected function loadTranslationsFrom($path, $namespace) + { + $this->callAfterResolving('translator', function ($translator) use ($path, $namespace) { + $translator->addNamespace($namespace, $path); + }); + } + + /** + * Register a JSON translation file path. + * + * @param string $path + * @return void + */ + protected function loadJsonTranslationsFrom($path) + { + $this->callAfterResolving('translator', function ($translator) use ($path) { + $translator->addJsonPath($path); + }); + } + + /** + * Register database migration paths. + * + * @param array|string $paths + * @return void + */ + protected function loadMigrationsFrom($paths) + { + $this->callAfterResolving('migrator', function ($migrator) use ($paths) { + foreach ((array) $paths as $path) { + $migrator->path($path); + } + }); + } + + /** + * Register Eloquent model factory paths. + * + * @deprecated Will be removed in a future Laravel version. + * + * @param array|string $paths + * @return void + */ + protected function loadFactoriesFrom($paths) + { + $this->callAfterResolving(ModelFactory::class, function ($factory) use ($paths) { + foreach ((array) $paths as $path) { + $factory->load($path); + } + }); + } + + /** + * Setup an after resolving listener, or fire immediately if already resolved. + * + * @param string $name + * @param callable $callback + * @return void + */ + protected function callAfterResolving($name, $callback) + { + $this->app->afterResolving($name, $callback); + + if ($this->app->resolved($name)) { + $callback($this->app->make($name), $this->app); + } + } + + /** + * Register paths to be published by the publish command. + * + * @param array $paths + * @param mixed $groups + * @return void + */ + protected function publishes(array $paths, $groups = null) + { + $this->ensurePublishArrayInitialized($class = static::class); + + static::$publishes[$class] = array_merge(static::$publishes[$class], $paths); + + foreach ((array) $groups as $group) { + $this->addPublishGroup($group, $paths); + } + } + + /** + * Ensure the publish array for the service provider is initialized. + * + * @param string $class + * @return void + */ + protected function ensurePublishArrayInitialized($class) + { + if (! array_key_exists($class, static::$publishes)) { + static::$publishes[$class] = []; + } + } + + /** + * Add a publish group / tag to the service provider. + * + * @param string $group + * @param array $paths + * @return void + */ + protected function addPublishGroup($group, $paths) + { + if (! array_key_exists($group, static::$publishGroups)) { + static::$publishGroups[$group] = []; + } + + static::$publishGroups[$group] = array_merge( + static::$publishGroups[$group], $paths + ); + } + + /** + * Get the paths to publish. + * + * @param string|null $provider + * @param string|null $group + * @return array + */ + public static function pathsToPublish($provider = null, $group = null) + { + if (! is_null($paths = static::pathsForProviderOrGroup($provider, $group))) { + return $paths; + } + + return collect(static::$publishes)->reduce(function ($paths, $p) { + return array_merge($paths, $p); + }, []); + } + + /** + * Get the paths for the provider or group (or both). + * + * @param string|null $provider + * @param string|null $group + * @return array + */ + protected static function pathsForProviderOrGroup($provider, $group) + { + if ($provider && $group) { + return static::pathsForProviderAndGroup($provider, $group); + } elseif ($group && array_key_exists($group, static::$publishGroups)) { + return static::$publishGroups[$group]; + } elseif ($provider && array_key_exists($provider, static::$publishes)) { + return static::$publishes[$provider]; + } elseif ($group || $provider) { + return []; + } + } + + /** + * Get the paths for the provider and group. + * + * @param string $provider + * @param string $group + * @return array + */ + protected static function pathsForProviderAndGroup($provider, $group) + { + if (! empty(static::$publishes[$provider]) && ! empty(static::$publishGroups[$group])) { + return array_intersect_key(static::$publishes[$provider], static::$publishGroups[$group]); + } + + return []; + } + + /** + * Get the service providers available for publishing. + * + * @return array + */ + public static function publishableProviders() + { + return array_keys(static::$publishes); + } + + /** + * Get the groups available for publishing. + * + * @return array + */ + public static function publishableGroups() + { + return array_keys(static::$publishGroups); + } + + /** + * Register the package's custom Artisan commands. + * + * @param array|mixed $commands + * @return void + */ + public function commands($commands) + { + $commands = is_array($commands) ? $commands : func_get_args(); + + Artisan::starting(function ($artisan) use ($commands) { + $artisan->resolveCommands($commands); + }); + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() + { + return []; + } + + /** + * Get the events that trigger this service provider to register. + * + * @return array + */ + public function when() + { + return []; + } + + /** + * Determine if the provider is deferred. + * + * @return bool + */ + public function isDeferred() + { + return $this instanceof DeferrableProvider; + } +} diff --git a/vendor/illuminate/support/Str.php b/vendor/illuminate/support/Str.php new file mode 100644 index 0000000..8b23bfa --- /dev/null +++ b/vendor/illuminate/support/Str.php @@ -0,0 +1,1365 @@ +<?php + +namespace Illuminate\Support; + +use Closure; +use Illuminate\Support\Traits\Macroable; +use JsonException; +use League\CommonMark\Environment\Environment; +use League\CommonMark\Extension\GithubFlavoredMarkdownExtension; +use League\CommonMark\Extension\InlinesOnly\InlinesOnlyExtension; +use League\CommonMark\GithubFlavoredMarkdownConverter; +use League\CommonMark\MarkdownConverter; +use Ramsey\Uuid\Codec\TimestampFirstCombCodec; +use Ramsey\Uuid\Generator\CombGenerator; +use Ramsey\Uuid\Uuid; +use Ramsey\Uuid\UuidFactory; +use Symfony\Component\Uid\Ulid; +use Traversable; +use voku\helper\ASCII; + +class Str +{ + use Macroable; + + /** + * The cache of snake-cased words. + * + * @var array + */ + protected static $snakeCache = []; + + /** + * The cache of camel-cased words. + * + * @var array + */ + protected static $camelCache = []; + + /** + * The cache of studly-cased words. + * + * @var array + */ + protected static $studlyCache = []; + + /** + * The callback that should be used to generate UUIDs. + * + * @var callable|null + */ + protected static $uuidFactory; + + /** + * The callback that should be used to generate random strings. + * + * @var callable|null + */ + protected static $randomStringFactory; + + /** + * Get a new stringable object from the given string. + * + * @param string $string + * @return \Illuminate\Support\Stringable + */ + public static function of($string) + { + return new Stringable($string); + } + + /** + * Return the remainder of a string after the first occurrence of a given value. + * + * @param string $subject + * @param string $search + * @return string + */ + public static function after($subject, $search) + { + return $search === '' ? $subject : array_reverse(explode($search, $subject, 2))[0]; + } + + /** + * Return the remainder of a string after the last occurrence of a given value. + * + * @param string $subject + * @param string $search + * @return string + */ + public static function afterLast($subject, $search) + { + if ($search === '') { + return $subject; + } + + $position = strrpos($subject, (string) $search); + + if ($position === false) { + return $subject; + } + + return substr($subject, $position + strlen($search)); + } + + /** + * Transliterate a UTF-8 value to ASCII. + * + * @param string $value + * @param string $language + * @return string + */ + public static function ascii($value, $language = 'en') + { + return ASCII::to_ascii((string) $value, $language); + } + + /** + * Transliterate a string to its closest ASCII representation. + * + * @param string $string + * @param string|null $unknown + * @param bool|null $strict + * @return string + */ + public static function transliterate($string, $unknown = '?', $strict = false) + { + return ASCII::to_transliterate($string, $unknown, $strict); + } + + /** + * Get the portion of a string before the first occurrence of a given value. + * + * @param string $subject + * @param string $search + * @return string + */ + public static function before($subject, $search) + { + if ($search === '') { + return $subject; + } + + $result = strstr($subject, (string) $search, true); + + return $result === false ? $subject : $result; + } + + /** + * Get the portion of a string before the last occurrence of a given value. + * + * @param string $subject + * @param string $search + * @return string + */ + public static function beforeLast($subject, $search) + { + if ($search === '') { + return $subject; + } + + $pos = mb_strrpos($subject, $search); + + if ($pos === false) { + return $subject; + } + + return static::substr($subject, 0, $pos); + } + + /** + * Get the portion of a string between two given values. + * + * @param string $subject + * @param string $from + * @param string $to + * @return string + */ + public static function between($subject, $from, $to) + { + if ($from === '' || $to === '') { + return $subject; + } + + return static::beforeLast(static::after($subject, $from), $to); + } + + /** + * Get the smallest possible portion of a string between two given values. + * + * @param string $subject + * @param string $from + * @param string $to + * @return string + */ + public static function betweenFirst($subject, $from, $to) + { + if ($from === '' || $to === '') { + return $subject; + } + + return static::before(static::after($subject, $from), $to); + } + + /** + * Convert a value to camel case. + * + * @param string $value + * @return string + */ + public static function camel($value) + { + if (isset(static::$camelCache[$value])) { + return static::$camelCache[$value]; + } + + return static::$camelCache[$value] = lcfirst(static::studly($value)); + } + + /** + * Determine if a given string contains a given substring. + * + * @param string $haystack + * @param string|iterable<string> $needles + * @param bool $ignoreCase + * @return bool + */ + public static function contains($haystack, $needles, $ignoreCase = false) + { + if ($ignoreCase) { + $haystack = mb_strtolower($haystack); + } + + if (! is_iterable($needles)) { + $needles = (array) $needles; + } + + foreach ($needles as $needle) { + if ($ignoreCase) { + $needle = mb_strtolower($needle); + } + + if ($needle !== '' && str_contains($haystack, $needle)) { + return true; + } + } + + return false; + } + + /** + * Determine if a given string contains all array values. + * + * @param string $haystack + * @param iterable<string> $needles + * @param bool $ignoreCase + * @return bool + */ + public static function containsAll($haystack, $needles, $ignoreCase = false) + { + foreach ($needles as $needle) { + if (! static::contains($haystack, $needle, $ignoreCase)) { + return false; + } + } + + return true; + } + + /** + * Determine if a given string ends with a given substring. + * + * @param string $haystack + * @param string|iterable<string> $needles + * @return bool + */ + public static function endsWith($haystack, $needles) + { + if (! is_iterable($needles)) { + $needles = (array) $needles; + } + + foreach ($needles as $needle) { + if ((string) $needle !== '' && str_ends_with($haystack, $needle)) { + return true; + } + } + + return false; + } + + /** + * Extracts an excerpt from text that matches the first instance of a phrase. + * + * @param string $text + * @param string $phrase + * @param array $options + * @return string|null + */ + public static function excerpt($text, $phrase = '', $options = []) + { + $radius = $options['radius'] ?? 100; + $omission = $options['omission'] ?? '...'; + + preg_match('/^(.*?)('.preg_quote((string) $phrase).')(.*)$/iu', (string) $text, $matches); + + if (empty($matches)) { + return null; + } + + $start = ltrim($matches[1]); + + $start = str(mb_substr($start, max(mb_strlen($start, 'UTF-8') - $radius, 0), $radius, 'UTF-8'))->ltrim()->unless( + fn ($startWithRadius) => $startWithRadius->exactly($start), + fn ($startWithRadius) => $startWithRadius->prepend($omission), + ); + + $end = rtrim($matches[3]); + + $end = str(mb_substr($end, 0, $radius, 'UTF-8'))->rtrim()->unless( + fn ($endWithRadius) => $endWithRadius->exactly($end), + fn ($endWithRadius) => $endWithRadius->append($omission), + ); + + return $start->append($matches[2], $end)->toString(); + } + + /** + * Cap a string with a single instance of a given value. + * + * @param string $value + * @param string $cap + * @return string + */ + public static function finish($value, $cap) + { + $quoted = preg_quote($cap, '/'); + + return preg_replace('/(?:'.$quoted.')+$/u', '', $value).$cap; + } + + /** + * Wrap the string with the given strings. + * + * @param string $value + * @param string $before + * @param string|null $after + * @return string + */ + public static function wrap($value, $before, $after = null) + { + return $before.$value.($after ??= $before); + } + + /** + * Determine if a given string matches a given pattern. + * + * @param string|iterable<string> $pattern + * @param string $value + * @return bool + */ + public static function is($pattern, $value) + { + $value = (string) $value; + + if (! is_iterable($pattern)) { + $pattern = [$pattern]; + } + + foreach ($pattern as $pattern) { + $pattern = (string) $pattern; + + // If the given value is an exact match we can of course return true right + // from the beginning. Otherwise, we will translate asterisks and do an + // actual pattern match against the two strings to see if they match. + if ($pattern === $value) { + return true; + } + + $pattern = preg_quote($pattern, '#'); + + // Asterisks are translated into zero-or-more regular expression wildcards + // to make it convenient to check if the strings starts with the given + // pattern such as "library/*", making any string check convenient. + $pattern = str_replace('\*', '.*', $pattern); + + if (preg_match('#^'.$pattern.'\z#u', $value) === 1) { + return true; + } + } + + return false; + } + + /** + * Determine if a given string is 7 bit ASCII. + * + * @param string $value + * @return bool + */ + public static function isAscii($value) + { + return ASCII::is_ascii((string) $value); + } + + /** + * Determine if a given string is valid JSON. + * + * @param string $value + * @return bool + */ + public static function isJson($value) + { + if (! is_string($value)) { + return false; + } + + try { + json_decode($value, true, 512, JSON_THROW_ON_ERROR); + } catch (JsonException) { + return false; + } + + return true; + } + + /** + * Determine if a given string is a valid UUID. + * + * @param string $value + * @return bool + */ + public static function isUuid($value) + { + if (! is_string($value)) { + return false; + } + + return preg_match('/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/iD', $value) > 0; + } + + /** + * Determine if a given string is a valid ULID. + * + * @param string $value + * @return bool + */ + public static function isUlid($value) + { + if (! is_string($value)) { + return false; + } + + return Ulid::isValid($value); + } + + /** + * Convert a string to kebab case. + * + * @param string $value + * @return string + */ + public static function kebab($value) + { + return static::snake($value, '-'); + } + + /** + * Return the length of the given string. + * + * @param string $value + * @param string|null $encoding + * @return int + */ + public static function length($value, $encoding = null) + { + if ($encoding) { + return mb_strlen($value, $encoding); + } + + return mb_strlen($value); + } + + /** + * Limit the number of characters in a string. + * + * @param string $value + * @param int $limit + * @param string $end + * @return string + */ + public static function limit($value, $limit = 100, $end = '...') + { + if (mb_strwidth($value, 'UTF-8') <= $limit) { + return $value; + } + + return rtrim(mb_strimwidth($value, 0, $limit, '', 'UTF-8')).$end; + } + + /** + * Convert the given string to lower-case. + * + * @param string $value + * @return string + */ + public static function lower($value) + { + return mb_strtolower($value, 'UTF-8'); + } + + /** + * Limit the number of words in a string. + * + * @param string $value + * @param int $words + * @param string $end + * @return string + */ + public static function words($value, $words = 100, $end = '...') + { + preg_match('/^\s*+(?:\S++\s*+){1,'.$words.'}/u', $value, $matches); + + if (! isset($matches[0]) || static::length($value) === static::length($matches[0])) { + return $value; + } + + return rtrim($matches[0]).$end; + } + + /** + * Converts GitHub flavored Markdown into HTML. + * + * @param string $string + * @param array $options + * @return string + */ + public static function markdown($string, array $options = []) + { + $converter = new GithubFlavoredMarkdownConverter($options); + + return (string) $converter->convert($string); + } + + /** + * Converts inline Markdown into HTML. + * + * @param string $string + * @param array $options + * @return string + */ + public static function inlineMarkdown($string, array $options = []) + { + $environment = new Environment($options); + + $environment->addExtension(new GithubFlavoredMarkdownExtension()); + $environment->addExtension(new InlinesOnlyExtension()); + + $converter = new MarkdownConverter($environment); + + return (string) $converter->convert($string); + } + + /** + * Masks a portion of a string with a repeated character. + * + * @param string $string + * @param string $character + * @param int $index + * @param int|null $length + * @param string $encoding + * @return string + */ + public static function mask($string, $character, $index, $length = null, $encoding = 'UTF-8') + { + if ($character === '') { + return $string; + } + + $segment = mb_substr($string, $index, $length, $encoding); + + if ($segment === '') { + return $string; + } + + $strlen = mb_strlen($string, $encoding); + $startIndex = $index; + + if ($index < 0) { + $startIndex = $index < -$strlen ? 0 : $strlen + $index; + } + + $start = mb_substr($string, 0, $startIndex, $encoding); + $segmentLen = mb_strlen($segment, $encoding); + $end = mb_substr($string, $startIndex + $segmentLen); + + return $start.str_repeat(mb_substr($character, 0, 1, $encoding), $segmentLen).$end; + } + + /** + * Get the string matching the given pattern. + * + * @param string $pattern + * @param string $subject + * @return string + */ + public static function match($pattern, $subject) + { + preg_match($pattern, $subject, $matches); + + if (! $matches) { + return ''; + } + + return $matches[1] ?? $matches[0]; + } + + /** + * Get the string matching the given pattern. + * + * @param string $pattern + * @param string $subject + * @return \Illuminate\Support\Collection + */ + public static function matchAll($pattern, $subject) + { + preg_match_all($pattern, $subject, $matches); + + if (empty($matches[0])) { + return collect(); + } + + return collect($matches[1] ?? $matches[0]); + } + + /** + * Pad both sides of a string with another. + * + * @param string $value + * @param int $length + * @param string $pad + * @return string + */ + public static function padBoth($value, $length, $pad = ' ') + { + $short = max(0, $length - mb_strlen($value)); + $shortLeft = floor($short / 2); + $shortRight = ceil($short / 2); + + return mb_substr(str_repeat($pad, $shortLeft), 0, $shortLeft). + $value. + mb_substr(str_repeat($pad, $shortRight), 0, $shortRight); + } + + /** + * Pad the left side of a string with another. + * + * @param string $value + * @param int $length + * @param string $pad + * @return string + */ + public static function padLeft($value, $length, $pad = ' ') + { + $short = max(0, $length - mb_strlen($value)); + + return mb_substr(str_repeat($pad, $short), 0, $short).$value; + } + + /** + * Pad the right side of a string with another. + * + * @param string $value + * @param int $length + * @param string $pad + * @return string + */ + public static function padRight($value, $length, $pad = ' ') + { + $short = max(0, $length - mb_strlen($value)); + + return $value.mb_substr(str_repeat($pad, $short), 0, $short); + } + + /** + * Parse a Class[@]method style callback into class and method. + * + * @param string $callback + * @param string|null $default + * @return array<int, string|null> + */ + public static function parseCallback($callback, $default = null) + { + return static::contains($callback, '@') ? explode('@', $callback, 2) : [$callback, $default]; + } + + /** + * Get the plural form of an English word. + * + * @param string $value + * @param int|array|\Countable $count + * @return string + */ + public static function plural($value, $count = 2) + { + return Pluralizer::plural($value, $count); + } + + /** + * Pluralize the last word of an English, studly caps case string. + * + * @param string $value + * @param int|array|\Countable $count + * @return string + */ + public static function pluralStudly($value, $count = 2) + { + $parts = preg_split('/(.)(?=[A-Z])/u', $value, -1, PREG_SPLIT_DELIM_CAPTURE); + + $lastWord = array_pop($parts); + + return implode('', $parts).self::plural($lastWord, $count); + } + + /** + * Generate a more truly "random" alpha-numeric string. + * + * @param int $length + * @return string + */ + public static function random($length = 16) + { + return (static::$randomStringFactory ?? function ($length) { + $string = ''; + + while (($len = strlen($string)) < $length) { + $size = $length - $len; + + $bytes = random_bytes($size); + + $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size); + } + + return $string; + })($length); + } + + /** + * Set the callable that will be used to generate random strings. + * + * @param callable|null $factory + * @return void + */ + public static function createRandomStringsUsing(callable $factory = null) + { + static::$randomStringFactory = $factory; + } + + /** + * Set the sequence that will be used to generate random strings. + * + * @param array $sequence + * @param callable|null $whenMissing + * @return void + */ + public static function createRandomStringsUsingSequence(array $sequence, $whenMissing = null) + { + $next = 0; + + $whenMissing ??= function ($length) use (&$next) { + $factoryCache = static::$randomStringFactory; + + static::$randomStringFactory = null; + + $randomString = static::random($length); + + static::$randomStringFactory = $factoryCache; + + $next++; + + return $randomString; + }; + + static::createRandomStringsUsing(function ($length) use (&$next, $sequence, $whenMissing) { + if (array_key_exists($next, $sequence)) { + return $sequence[$next++]; + } + + return $whenMissing($length); + }); + } + + /** + * Indicate that random strings should be created normally and not using a custom factory. + * + * @return void + */ + public static function createRandomStringsNormally() + { + static::$randomStringFactory = null; + } + + /** + * Repeat the given string. + * + * @param string $string + * @param int $times + * @return string + */ + public static function repeat(string $string, int $times) + { + return str_repeat($string, $times); + } + + /** + * Replace a given value in the string sequentially with an array. + * + * @param string $search + * @param iterable<string> $replace + * @param string $subject + * @return string + */ + public static function replaceArray($search, $replace, $subject) + { + if ($replace instanceof Traversable) { + $replace = collect($replace)->all(); + } + + $segments = explode($search, $subject); + + $result = array_shift($segments); + + foreach ($segments as $segment) { + $result .= (array_shift($replace) ?? $search).$segment; + } + + return $result; + } + + /** + * Replace the given value in the given string. + * + * @param string|iterable<string> $search + * @param string|iterable<string> $replace + * @param string|iterable<string> $subject + * @return string + */ + public static function replace($search, $replace, $subject) + { + if ($search instanceof Traversable) { + $search = collect($search)->all(); + } + + if ($replace instanceof Traversable) { + $replace = collect($replace)->all(); + } + + if ($subject instanceof Traversable) { + $subject = collect($subject)->all(); + } + + return str_replace($search, $replace, $subject); + } + + /** + * Replace the first occurrence of a given value in the string. + * + * @param string $search + * @param string $replace + * @param string $subject + * @return string + */ + public static function replaceFirst($search, $replace, $subject) + { + $search = (string) $search; + + if ($search === '') { + return $subject; + } + + $position = strpos($subject, $search); + + if ($position !== false) { + return substr_replace($subject, $replace, $position, strlen($search)); + } + + return $subject; + } + + /** + * Replace the last occurrence of a given value in the string. + * + * @param string $search + * @param string $replace + * @param string $subject + * @return string + */ + public static function replaceLast($search, $replace, $subject) + { + if ($search === '') { + return $subject; + } + + $position = strrpos($subject, $search); + + if ($position !== false) { + return substr_replace($subject, $replace, $position, strlen($search)); + } + + return $subject; + } + + /** + * Remove any occurrence of the given string in the subject. + * + * @param string|iterable<string> $search + * @param string $subject + * @param bool $caseSensitive + * @return string + */ + public static function remove($search, $subject, $caseSensitive = true) + { + if ($search instanceof Traversable) { + $search = collect($search)->all(); + } + + $subject = $caseSensitive + ? str_replace($search, '', $subject) + : str_ireplace($search, '', $subject); + + return $subject; + } + + /** + * Reverse the given string. + * + * @param string $value + * @return string + */ + public static function reverse(string $value) + { + return implode(array_reverse(mb_str_split($value))); + } + + /** + * Begin a string with a single instance of a given value. + * + * @param string $value + * @param string $prefix + * @return string + */ + public static function start($value, $prefix) + { + $quoted = preg_quote($prefix, '/'); + + return $prefix.preg_replace('/^(?:'.$quoted.')+/u', '', $value); + } + + /** + * Convert the given string to upper-case. + * + * @param string $value + * @return string + */ + public static function upper($value) + { + return mb_strtoupper($value, 'UTF-8'); + } + + /** + * Convert the given string to title case. + * + * @param string $value + * @return string + */ + public static function title($value) + { + return mb_convert_case($value, MB_CASE_TITLE, 'UTF-8'); + } + + /** + * Convert the given string to title case for each word. + * + * @param string $value + * @return string + */ + public static function headline($value) + { + $parts = explode(' ', $value); + + $parts = count($parts) > 1 + ? array_map([static::class, 'title'], $parts) + : array_map([static::class, 'title'], static::ucsplit(implode('_', $parts))); + + $collapsed = static::replace(['-', '_', ' '], '_', implode('_', $parts)); + + return implode(' ', array_filter(explode('_', $collapsed))); + } + + /** + * Get the singular form of an English word. + * + * @param string $value + * @return string + */ + public static function singular($value) + { + return Pluralizer::singular($value); + } + + /** + * Generate a URL friendly "slug" from a given string. + * + * @param string $title + * @param string $separator + * @param string|null $language + * @param array<string, string> $dictionary + * @return string + */ + public static function slug($title, $separator = '-', $language = 'en', $dictionary = ['@' => 'at']) + { + $title = $language ? static::ascii($title, $language) : $title; + + // Convert all dashes/underscores into separator + $flip = $separator === '-' ? '_' : '-'; + + $title = preg_replace('!['.preg_quote($flip).']+!u', $separator, $title); + + // Replace dictionary words + foreach ($dictionary as $key => $value) { + $dictionary[$key] = $separator.$value.$separator; + } + + $title = str_replace(array_keys($dictionary), array_values($dictionary), $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 snake case. + * + * @param string $value + * @param string $delimiter + * @return string + */ + public static function snake($value, $delimiter = '_') + { + $key = $value; + + if (isset(static::$snakeCache[$key][$delimiter])) { + return static::$snakeCache[$key][$delimiter]; + } + + if (! ctype_lower($value)) { + $value = preg_replace('/\s+/u', '', ucwords($value)); + + $value = static::lower(preg_replace('/(.)(?=[A-Z])/u', '$1'.$delimiter, $value)); + } + + return static::$snakeCache[$key][$delimiter] = $value; + } + + /** + * Remove all "extra" blank space from the given string. + * + * @param string $value + * @return string + */ + public static function squish($value) + { + return preg_replace('~(\s|\x{3164})+~u', ' ', preg_replace('~^[\s]+|[\s]+$~u', '', $value)); + } + + /** + * Determine if a given string starts with a given substring. + * + * @param string $haystack + * @param string|iterable<string> $needles + * @return bool + */ + public static function startsWith($haystack, $needles) + { + if (! is_iterable($needles)) { + $needles = [$needles]; + } + + foreach ($needles as $needle) { + if ((string) $needle !== '' && str_starts_with($haystack, $needle)) { + return true; + } + } + + return false; + } + + /** + * Convert a value to studly caps case. + * + * @param string $value + * @return string + */ + public static function studly($value) + { + $key = $value; + + if (isset(static::$studlyCache[$key])) { + return static::$studlyCache[$key]; + } + + $words = explode(' ', static::replace(['-', '_'], ' ', $value)); + + $studlyWords = array_map(fn ($word) => static::ucfirst($word), $words); + + return static::$studlyCache[$key] = implode($studlyWords); + } + + /** + * Returns the portion of the string specified by the start and length parameters. + * + * @param string $string + * @param int $start + * @param int|null $length + * @param string $encoding + * @return string + */ + public static function substr($string, $start, $length = null, $encoding = 'UTF-8') + { + return mb_substr($string, $start, $length, $encoding); + } + + /** + * Returns the number of substring occurrences. + * + * @param string $haystack + * @param string $needle + * @param int $offset + * @param int|null $length + * @return int + */ + public static function substrCount($haystack, $needle, $offset = 0, $length = null) + { + if (! is_null($length)) { + return substr_count($haystack, $needle, $offset, $length); + } + + return substr_count($haystack, $needle, $offset); + } + + /** + * Replace text within a portion of a string. + * + * @param string|string[] $string + * @param string|string[] $replace + * @param int|int[] $offset + * @param int|int[]|null $length + * @return string|string[] + */ + public static function substrReplace($string, $replace, $offset = 0, $length = null) + { + if ($length === null) { + $length = strlen($string); + } + + return substr_replace($string, $replace, $offset, $length); + } + + /** + * Swap multiple keywords in a string with other keywords. + * + * @param array $map + * @param string $subject + * @return string + */ + public static function swap(array $map, $subject) + { + return strtr($subject, $map); + } + + /** + * Make a string's first character lowercase. + * + * @param string $string + * @return string + */ + public static function lcfirst($string) + { + return static::lower(static::substr($string, 0, 1)).static::substr($string, 1); + } + + /** + * Make a string's first character uppercase. + * + * @param string $string + * @return string + */ + public static function ucfirst($string) + { + return static::upper(static::substr($string, 0, 1)).static::substr($string, 1); + } + + /** + * Split a string into pieces by uppercase characters. + * + * @param string $string + * @return string[] + */ + public static function ucsplit($string) + { + return preg_split('/(?=\p{Lu})/u', $string, -1, PREG_SPLIT_NO_EMPTY); + } + + /** + * Get the number of words a string contains. + * + * @param string $string + * @param string|null $characters + * @return int + */ + public static function wordCount($string, $characters = null) + { + return str_word_count($string, 0, $characters); + } + + /** + * Generate a UUID (version 4). + * + * @return \Ramsey\Uuid\UuidInterface + */ + public static function uuid() + { + return static::$uuidFactory + ? call_user_func(static::$uuidFactory) + : Uuid::uuid4(); + } + + /** + * Generate a time-ordered UUID (version 4). + * + * @return \Ramsey\Uuid\UuidInterface + */ + public static function orderedUuid() + { + if (static::$uuidFactory) { + return call_user_func(static::$uuidFactory); + } + + $factory = new UuidFactory; + + $factory->setRandomGenerator(new CombGenerator( + $factory->getRandomGenerator(), + $factory->getNumberConverter() + )); + + $factory->setCodec(new TimestampFirstCombCodec( + $factory->getUuidBuilder() + )); + + return $factory->uuid4(); + } + + /** + * Set the callable that will be used to generate UUIDs. + * + * @param callable|null $factory + * @return void + */ + public static function createUuidsUsing(callable $factory = null) + { + static::$uuidFactory = $factory; + } + + /** + * Set the sequence that will be used to generate UUIDs. + * + * @param array $sequence + * @param callable|null $whenMissing + * @return void + */ + public static function createUuidsUsingSequence(array $sequence, $whenMissing = null) + { + $next = 0; + + $whenMissing ??= function () use (&$next) { + $factoryCache = static::$uuidFactory; + + static::$uuidFactory = null; + + $uuid = static::uuid(); + + static::$uuidFactory = $factoryCache; + + $next++; + + return $uuid; + }; + + static::createUuidsUsing(function () use (&$next, $sequence, $whenMissing) { + if (array_key_exists($next, $sequence)) { + return $sequence[$next++]; + } + + return $whenMissing(); + }); + } + + /** + * Always return the same UUID when generating new UUIDs. + * + * @param \Closure|null $callback + * @return \Ramsey\Uuid\UuidInterface + */ + public static function freezeUuids(Closure $callback = null) + { + $uuid = Str::uuid(); + + Str::createUuidsUsing(fn () => $uuid); + + if ($callback !== null) { + try { + $callback($uuid); + } finally { + Str::createUuidsNormally(); + } + } + + return $uuid; + } + + /** + * Indicate that UUIDs should be created normally and not using a custom factory. + * + * @return void + */ + public static function createUuidsNormally() + { + static::$uuidFactory = null; + } + + /** + * Generate a ULID. + * + * @return \Symfony\Component\Uid\Ulid + */ + public static function ulid() + { + return new Ulid(); + } + + /** + * Remove all strings from the casing caches. + * + * @return void + */ + public static function flushCache() + { + static::$snakeCache = []; + static::$camelCache = []; + static::$studlyCache = []; + } +} diff --git a/vendor/illuminate/support/Stringable.php b/vendor/illuminate/support/Stringable.php new file mode 100644 index 0000000..0fc5db2 --- /dev/null +++ b/vendor/illuminate/support/Stringable.php @@ -0,0 +1,1228 @@ +<?php + +namespace Illuminate\Support; + +use Closure; +use Illuminate\Support\Facades\Date; +use Illuminate\Support\Traits\Conditionable; +use Illuminate\Support\Traits\Macroable; +use Illuminate\Support\Traits\Tappable; +use JsonSerializable; +use Symfony\Component\VarDumper\VarDumper; + +class Stringable implements JsonSerializable +{ + use Conditionable, Macroable, Tappable; + + /** + * The underlying string value. + * + * @var string + */ + protected $value; + + /** + * Create a new instance of the class. + * + * @param string $value + * @return void + */ + public function __construct($value = '') + { + $this->value = (string) $value; + } + + /** + * Return the remainder of a string after the first occurrence of a given value. + * + * @param string $search + * @return static + */ + public function after($search) + { + return new static(Str::after($this->value, $search)); + } + + /** + * Return the remainder of a string after the last occurrence of a given value. + * + * @param string $search + * @return static + */ + public function afterLast($search) + { + return new static(Str::afterLast($this->value, $search)); + } + + /** + * Append the given values to the string. + * + * @param array $values + * @return static + */ + public function append(...$values) + { + return new static($this->value.implode('', $values)); + } + + /** + * Append a new line to the string. + * + * @param int $count + * @return $this + */ + public function newLine($count = 1) + { + return $this->append(str_repeat(PHP_EOL, $count)); + } + + /** + * Transliterate a UTF-8 value to ASCII. + * + * @param string $language + * @return static + */ + public function ascii($language = 'en') + { + return new static(Str::ascii($this->value, $language)); + } + + /** + * Get the trailing name component of the path. + * + * @param string $suffix + * @return static + */ + public function basename($suffix = '') + { + return new static(basename($this->value, $suffix)); + } + + /** + * Get the basename of the class path. + * + * @return static + */ + public function classBasename() + { + return new static(class_basename($this->value)); + } + + /** + * Get the portion of a string before the first occurrence of a given value. + * + * @param string $search + * @return static + */ + public function before($search) + { + return new static(Str::before($this->value, $search)); + } + + /** + * Get the portion of a string before the last occurrence of a given value. + * + * @param string $search + * @return static + */ + public function beforeLast($search) + { + return new static(Str::beforeLast($this->value, $search)); + } + + /** + * Get the portion of a string between two given values. + * + * @param string $from + * @param string $to + * @return static + */ + public function between($from, $to) + { + return new static(Str::between($this->value, $from, $to)); + } + + /** + * Get the smallest possible portion of a string between two given values. + * + * @param string $from + * @param string $to + * @return static + */ + public function betweenFirst($from, $to) + { + return new static(Str::betweenFirst($this->value, $from, $to)); + } + + /** + * Convert a value to camel case. + * + * @return static + */ + public function camel() + { + return new static(Str::camel($this->value)); + } + + /** + * Determine if a given string contains a given substring. + * + * @param string|iterable<string> $needles + * @param bool $ignoreCase + * @return bool + */ + public function contains($needles, $ignoreCase = false) + { + return Str::contains($this->value, $needles, $ignoreCase); + } + + /** + * Determine if a given string contains all array values. + * + * @param iterable<string> $needles + * @param bool $ignoreCase + * @return bool + */ + public function containsAll($needles, $ignoreCase = false) + { + return Str::containsAll($this->value, $needles, $ignoreCase); + } + + /** + * Get the parent directory's path. + * + * @param int $levels + * @return static + */ + public function dirname($levels = 1) + { + return new static(dirname($this->value, $levels)); + } + + /** + * Determine if a given string ends with a given substring. + * + * @param string|iterable<string> $needles + * @return bool + */ + public function endsWith($needles) + { + return Str::endsWith($this->value, $needles); + } + + /** + * Determine if the string is an exact match with the given value. + * + * @param \Illuminate\Support\Stringable|string $value + * @return bool + */ + public function exactly($value) + { + if ($value instanceof Stringable) { + $value = $value->toString(); + } + + return $this->value === $value; + } + + /** + * Extracts an excerpt from text that matches the first instance of a phrase. + * + * @param string $phrase + * @param array $options + * @return string|null + */ + public function excerpt($phrase = '', $options = []) + { + return Str::excerpt($this->value, $phrase, $options); + } + + /** + * Explode the string into an array. + * + * @param string $delimiter + * @param int $limit + * @return \Illuminate\Support\Collection + */ + public function explode($delimiter, $limit = PHP_INT_MAX) + { + return collect(explode($delimiter, $this->value, $limit)); + } + + /** + * Split a string using a regular expression or by length. + * + * @param string|int $pattern + * @param int $limit + * @param int $flags + * @return \Illuminate\Support\Collection + */ + public function split($pattern, $limit = -1, $flags = 0) + { + if (filter_var($pattern, FILTER_VALIDATE_INT) !== false) { + return collect(mb_str_split($this->value, $pattern)); + } + + $segments = preg_split($pattern, $this->value, $limit, $flags); + + return ! empty($segments) ? collect($segments) : collect(); + } + + /** + * Cap a string with a single instance of a given value. + * + * @param string $cap + * @return static + */ + public function finish($cap) + { + return new static(Str::finish($this->value, $cap)); + } + + /** + * Determine if a given string matches a given pattern. + * + * @param string|iterable<string> $pattern + * @return bool + */ + public function is($pattern) + { + return Str::is($pattern, $this->value); + } + + /** + * Determine if a given string is 7 bit ASCII. + * + * @return bool + */ + public function isAscii() + { + return Str::isAscii($this->value); + } + + /** + * Determine if a given string is valid JSON. + * + * @return bool + */ + public function isJson() + { + return Str::isJson($this->value); + } + + /** + * Determine if a given string is a valid UUID. + * + * @return bool + */ + public function isUuid() + { + return Str::isUuid($this->value); + } + + /** + * Determine if a given string is a valid ULID. + * + * @return bool + */ + public function isUlid() + { + return Str::isUlid($this->value); + } + + /** + * Determine if the given string is empty. + * + * @return bool + */ + public function isEmpty() + { + return $this->value === ''; + } + + /** + * Determine if the given string is not empty. + * + * @return bool + */ + public function isNotEmpty() + { + return ! $this->isEmpty(); + } + + /** + * Convert a string to kebab case. + * + * @return static + */ + public function kebab() + { + return new static(Str::kebab($this->value)); + } + + /** + * Return the length of the given string. + * + * @param string|null $encoding + * @return int + */ + public function length($encoding = null) + { + return Str::length($this->value, $encoding); + } + + /** + * Limit the number of characters in a string. + * + * @param int $limit + * @param string $end + * @return static + */ + public function limit($limit = 100, $end = '...') + { + return new static(Str::limit($this->value, $limit, $end)); + } + + /** + * Convert the given string to lower-case. + * + * @return static + */ + public function lower() + { + return new static(Str::lower($this->value)); + } + + /** + * Convert GitHub flavored Markdown into HTML. + * + * @param array $options + * @return static + */ + public function markdown(array $options = []) + { + return new static(Str::markdown($this->value, $options)); + } + + /** + * Convert inline Markdown into HTML. + * + * @param array $options + * @return static + */ + public function inlineMarkdown(array $options = []) + { + return new static(Str::inlineMarkdown($this->value, $options)); + } + + /** + * Masks a portion of a string with a repeated character. + * + * @param string $character + * @param int $index + * @param int|null $length + * @param string $encoding + * @return static + */ + public function mask($character, $index, $length = null, $encoding = 'UTF-8') + { + return new static(Str::mask($this->value, $character, $index, $length, $encoding)); + } + + /** + * Get the string matching the given pattern. + * + * @param string $pattern + * @return static + */ + public function match($pattern) + { + return new static(Str::match($pattern, $this->value)); + } + + /** + * Get the string matching the given pattern. + * + * @param string $pattern + * @return \Illuminate\Support\Collection + */ + public function matchAll($pattern) + { + return Str::matchAll($pattern, $this->value); + } + + /** + * Determine if the string matches the given pattern. + * + * @param string $pattern + * @return bool + */ + public function test($pattern) + { + return $this->match($pattern)->isNotEmpty(); + } + + /** + * Pad both sides of the string with another. + * + * @param int $length + * @param string $pad + * @return static + */ + public function padBoth($length, $pad = ' ') + { + return new static(Str::padBoth($this->value, $length, $pad)); + } + + /** + * Pad the left side of the string with another. + * + * @param int $length + * @param string $pad + * @return static + */ + public function padLeft($length, $pad = ' ') + { + return new static(Str::padLeft($this->value, $length, $pad)); + } + + /** + * Pad the right side of the string with another. + * + * @param int $length + * @param string $pad + * @return static + */ + public function padRight($length, $pad = ' ') + { + return new static(Str::padRight($this->value, $length, $pad)); + } + + /** + * Parse a Class@method style callback into class and method. + * + * @param string|null $default + * @return array<int, string|null> + */ + public function parseCallback($default = null) + { + return Str::parseCallback($this->value, $default); + } + + /** + * Call the given callback and return a new string. + * + * @param callable $callback + * @return static + */ + public function pipe(callable $callback) + { + return new static($callback($this)); + } + + /** + * Get the plural form of an English word. + * + * @param int|array|\Countable $count + * @return static + */ + public function plural($count = 2) + { + return new static(Str::plural($this->value, $count)); + } + + /** + * Pluralize the last word of an English, studly caps case string. + * + * @param int|array|\Countable $count + * @return static + */ + public function pluralStudly($count = 2) + { + return new static(Str::pluralStudly($this->value, $count)); + } + + /** + * Prepend the given values to the string. + * + * @param array $values + * @return static + */ + public function prepend(...$values) + { + return new static(implode('', $values).$this->value); + } + + /** + * Remove any occurrence of the given string in the subject. + * + * @param string|iterable<string> $search + * @param bool $caseSensitive + * @return static + */ + public function remove($search, $caseSensitive = true) + { + return new static(Str::remove($search, $this->value, $caseSensitive)); + } + + /** + * Reverse the string. + * + * @return static + */ + public function reverse() + { + return new static(Str::reverse($this->value)); + } + + /** + * Repeat the string. + * + * @param int $times + * @return static + */ + public function repeat(int $times) + { + return new static(str_repeat($this->value, $times)); + } + + /** + * Replace the given value in the given string. + * + * @param string|iterable<string> $search + * @param string|iterable<string> $replace + * @return static + */ + public function replace($search, $replace) + { + return new static(Str::replace($search, $replace, $this->value)); + } + + /** + * Replace a given value in the string sequentially with an array. + * + * @param string $search + * @param iterable<string> $replace + * @return static + */ + public function replaceArray($search, $replace) + { + return new static(Str::replaceArray($search, $replace, $this->value)); + } + + /** + * Replace the first occurrence of a given value in the string. + * + * @param string $search + * @param string $replace + * @return static + */ + public function replaceFirst($search, $replace) + { + return new static(Str::replaceFirst($search, $replace, $this->value)); + } + + /** + * Replace the last occurrence of a given value in the string. + * + * @param string $search + * @param string $replace + * @return static + */ + public function replaceLast($search, $replace) + { + return new static(Str::replaceLast($search, $replace, $this->value)); + } + + /** + * Replace the patterns matching the given regular expression. + * + * @param string $pattern + * @param \Closure|string $replace + * @param int $limit + * @return static + */ + public function replaceMatches($pattern, $replace, $limit = -1) + { + if ($replace instanceof Closure) { + return new static(preg_replace_callback($pattern, $replace, $this->value, $limit)); + } + + return new static(preg_replace($pattern, $replace, $this->value, $limit)); + } + + /** + * Parse input from a string to a collection, according to a format. + * + * @param string $format + * @return \Illuminate\Support\Collection + */ + public function scan($format) + { + return collect(sscanf($this->value, $format)); + } + + /** + * Remove all "extra" blank space from the given string. + * + * @return static + */ + public function squish() + { + return new static(Str::squish($this->value)); + } + + /** + * Begin a string with a single instance of a given value. + * + * @param string $prefix + * @return static + */ + public function start($prefix) + { + return new static(Str::start($this->value, $prefix)); + } + + /** + * Strip HTML and PHP tags from the given string. + * + * @param string $allowedTags + * @return static + */ + public function stripTags($allowedTags = null) + { + return new static(strip_tags($this->value, $allowedTags)); + } + + /** + * Convert the given string to upper-case. + * + * @return static + */ + public function upper() + { + return new static(Str::upper($this->value)); + } + + /** + * Convert the given string to title case. + * + * @return static + */ + public function title() + { + return new static(Str::title($this->value)); + } + + /** + * Convert the given string to title case for each word. + * + * @return static + */ + public function headline() + { + return new static(Str::headline($this->value)); + } + + /** + * Get the singular form of an English word. + * + * @return static + */ + public function singular() + { + return new static(Str::singular($this->value)); + } + + /** + * Generate a URL friendly "slug" from a given string. + * + * @param string $separator + * @param string|null $language + * @param array<string, string> $dictionary + * @return static + */ + public function slug($separator = '-', $language = 'en', $dictionary = ['@' => 'at']) + { + return new static(Str::slug($this->value, $separator, $language, $dictionary)); + } + + /** + * Convert a string to snake case. + * + * @param string $delimiter + * @return static + */ + public function snake($delimiter = '_') + { + return new static(Str::snake($this->value, $delimiter)); + } + + /** + * Determine if a given string starts with a given substring. + * + * @param string|iterable<string> $needles + * @return bool + */ + public function startsWith($needles) + { + return Str::startsWith($this->value, $needles); + } + + /** + * Convert a value to studly caps case. + * + * @return static + */ + public function studly() + { + return new static(Str::studly($this->value)); + } + + /** + * Returns the portion of the string specified by the start and length parameters. + * + * @param int $start + * @param int|null $length + * @param string $encoding + * @return static + */ + public function substr($start, $length = null, $encoding = 'UTF-8') + { + return new static(Str::substr($this->value, $start, $length, $encoding)); + } + + /** + * Returns the number of substring occurrences. + * + * @param string $needle + * @param int $offset + * @param int|null $length + * @return int + */ + public function substrCount($needle, $offset = 0, $length = null) + { + return Str::substrCount($this->value, $needle, $offset, $length); + } + + /** + * Replace text within a portion of a string. + * + * @param string|string[] $replace + * @param int|int[] $offset + * @param int|int[]|null $length + * @return static + */ + public function substrReplace($replace, $offset = 0, $length = null) + { + return new static(Str::substrReplace($this->value, $replace, $offset, $length)); + } + + /** + * Swap multiple keywords in a string with other keywords. + * + * @param array $map + * @return static + */ + public function swap(array $map) + { + return new static(strtr($this->value, $map)); + } + + /** + * Trim the string of the given characters. + * + * @param string $characters + * @return static + */ + public function trim($characters = null) + { + return new static(trim(...array_merge([$this->value], func_get_args()))); + } + + /** + * Left trim the string of the given characters. + * + * @param string $characters + * @return static + */ + public function ltrim($characters = null) + { + return new static(ltrim(...array_merge([$this->value], func_get_args()))); + } + + /** + * Right trim the string of the given characters. + * + * @param string $characters + * @return static + */ + public function rtrim($characters = null) + { + return new static(rtrim(...array_merge([$this->value], func_get_args()))); + } + + /** + * Make a string's first character lowercase. + * + * @return static + */ + public function lcfirst() + { + return new static(Str::lcfirst($this->value)); + } + + /** + * Make a string's first character uppercase. + * + * @return static + */ + public function ucfirst() + { + return new static(Str::ucfirst($this->value)); + } + + /** + * Split a string by uppercase characters. + * + * @return \Illuminate\Support\Collection + */ + public function ucsplit() + { + return collect(Str::ucsplit($this->value)); + } + + /** + * Execute the given callback if the string contains a given substring. + * + * @param string|iterable<string> $needles + * @param callable $callback + * @param callable|null $default + * @return static + */ + public function whenContains($needles, $callback, $default = null) + { + return $this->when($this->contains($needles), $callback, $default); + } + + /** + * Execute the given callback if the string contains all array values. + * + * @param iterable<string> $needles + * @param callable $callback + * @param callable|null $default + * @return static + */ + public function whenContainsAll(array $needles, $callback, $default = null) + { + return $this->when($this->containsAll($needles), $callback, $default); + } + + /** + * Execute the given callback if the string is empty. + * + * @param callable $callback + * @param callable|null $default + * @return static + */ + public function whenEmpty($callback, $default = null) + { + return $this->when($this->isEmpty(), $callback, $default); + } + + /** + * Execute the given callback if the string is not empty. + * + * @param callable $callback + * @param callable|null $default + * @return static + */ + public function whenNotEmpty($callback, $default = null) + { + return $this->when($this->isNotEmpty(), $callback, $default); + } + + /** + * Execute the given callback if the string ends with a given substring. + * + * @param string|iterable<string> $needles + * @param callable $callback + * @param callable|null $default + * @return static + */ + public function whenEndsWith($needles, $callback, $default = null) + { + return $this->when($this->endsWith($needles), $callback, $default); + } + + /** + * Execute the given callback if the string is an exact match with the given value. + * + * @param string $value + * @param callable $callback + * @param callable|null $default + * @return static + */ + public function whenExactly($value, $callback, $default = null) + { + return $this->when($this->exactly($value), $callback, $default); + } + + /** + * Execute the given callback if the string is not an exact match with the given value. + * + * @param string $value + * @param callable $callback + * @param callable|null $default + * @return static + */ + public function whenNotExactly($value, $callback, $default = null) + { + return $this->when(! $this->exactly($value), $callback, $default); + } + + /** + * Execute the given callback if the string matches a given pattern. + * + * @param string|iterable<string> $pattern + * @param callable $callback + * @param callable|null $default + * @return static + */ + public function whenIs($pattern, $callback, $default = null) + { + return $this->when($this->is($pattern), $callback, $default); + } + + /** + * Execute the given callback if the string is 7 bit ASCII. + * + * @param callable $callback + * @param callable|null $default + * @return static + */ + public function whenIsAscii($callback, $default = null) + { + return $this->when($this->isAscii(), $callback, $default); + } + + /** + * Execute the given callback if the string is a valid UUID. + * + * @param callable $callback + * @param callable|null $default + * @return static + */ + public function whenIsUuid($callback, $default = null) + { + return $this->when($this->isUuid(), $callback, $default); + } + + /** + * Execute the given callback if the string is a valid ULID. + * + * @param callable $callback + * @param callable|null $default + * @return static + */ + public function whenIsUlid($callback, $default = null) + { + return $this->when($this->isUlid(), $callback, $default); + } + + /** + * Execute the given callback if the string starts with a given substring. + * + * @param string|iterable<string> $needles + * @param callable $callback + * @param callable|null $default + * @return static + */ + public function whenStartsWith($needles, $callback, $default = null) + { + return $this->when($this->startsWith($needles), $callback, $default); + } + + /** + * Execute the given callback if the string matches the given pattern. + * + * @param string $pattern + * @param callable $callback + * @param callable|null $default + * @return static + */ + public function whenTest($pattern, $callback, $default = null) + { + return $this->when($this->test($pattern), $callback, $default); + } + + /** + * Limit the number of words in a string. + * + * @param int $words + * @param string $end + * @return static + */ + public function words($words = 100, $end = '...') + { + return new static(Str::words($this->value, $words, $end)); + } + + /** + * Get the number of words a string contains. + * + * @param string|null $characters + * @return int + */ + public function wordCount($characters = null) + { + return Str::wordCount($this->value, $characters); + } + + /** + * Wrap the string with the given strings. + * + * @param string $before + * @param string|null $after + * @return static + */ + public function wrap($before, $after = null) + { + return new static(Str::wrap($this->value, $before, $after)); + } + + /** + * Convert the string into a `HtmlString` instance. + * + * @return \Illuminate\Support\HtmlString + */ + public function toHtmlString() + { + return new HtmlString($this->value); + } + + /** + * Dump the string. + * + * @return $this + */ + public function dump() + { + VarDumper::dump($this->value); + + return $this; + } + + /** + * Dump the string and end the script. + * + * @return never + */ + public function dd() + { + $this->dump(); + + exit(1); + } + + /** + * Get the underlying string value. + * + * @return string + */ + public function value() + { + return $this->toString(); + } + + /** + * Get the underlying string value. + * + * @return string + */ + public function toString() + { + return $this->value; + } + + /** + * Get the underlying string value as an integer. + * + * @return int + */ + public function toInteger() + { + return intval($this->value); + } + + /** + * Get the underlying string value as a float. + * + * @return float + */ + public function toFloat() + { + return floatval($this->value); + } + + /** + * Get the underlying string value as a boolean. + * + * Returns true when value is "1", "true", "on", and "yes". Otherwise, returns false. + * + * @return bool + */ + public function toBoolean() + { + return filter_var($this->value, FILTER_VALIDATE_BOOLEAN); + } + + /** + * Get the underlying string value as a Carbon instance. + * + * @param string|null $format + * @param string|null $tz + * @return \Illuminate\Support\Carbon + * + * @throws \Carbon\Exceptions\InvalidFormatException + */ + public function toDate($format = null, $tz = null) + { + if (is_null($format)) { + return Date::parse($this->value, $tz); + } + + return Date::createFromFormat($format, $this->value, $tz); + } + + /** + * Convert the object to a string when JSON encoded. + * + * @return string + */ + public function jsonSerialize(): string + { + return $this->__toString(); + } + + /** + * Proxy dynamic properties onto methods. + * + * @param string $key + * @return mixed + */ + public function __get($key) + { + return $this->{$key}(); + } + + /** + * Get the raw string value. + * + * @return string + */ + public function __toString() + { + return (string) $this->value; + } +} diff --git a/vendor/illuminate/support/Testing/Fakes/BatchFake.php b/vendor/illuminate/support/Testing/Fakes/BatchFake.php new file mode 100644 index 0000000..f6b08cb --- /dev/null +++ b/vendor/illuminate/support/Testing/Fakes/BatchFake.php @@ -0,0 +1,161 @@ +<?php + +namespace Illuminate\Support\Testing\Fakes; + +use Carbon\CarbonImmutable; +use Illuminate\Bus\Batch; +use Illuminate\Bus\UpdatedBatchJobCounts; +use Illuminate\Support\Carbon; + +class BatchFake extends Batch +{ + /** + * The jobs that have been added to the batch. + * + * @var array + */ + public $added = []; + + /** + * Indicates if the batch has been deleted. + * + * @var bool + */ + public $deleted = false; + + /** + * Create a new batch instance. + * + * @param string $id + * @param string $name + * @param int $totalJobs + * @param int $pendingJobs + * @param int $failedJobs + * @param array $failedJobIds + * @param array $options + * @param \Carbon\CarbonImmutable $createdAt + * @param \Carbon\CarbonImmutable|null $cancelledAt + * @param \Carbon\CarbonImmutable|null $finishedAt + * @return void + */ + public function __construct(string $id, + string $name, + int $totalJobs, + int $pendingJobs, + int $failedJobs, + array $failedJobIds, + array $options, + CarbonImmutable $createdAt, + ?CarbonImmutable $cancelledAt = null, + ?CarbonImmutable $finishedAt = null) + { + $this->id = $id; + $this->name = $name; + $this->totalJobs = $totalJobs; + $this->pendingJobs = $pendingJobs; + $this->failedJobs = $failedJobs; + $this->failedJobIds = $failedJobIds; + $this->options = $options; + $this->createdAt = $createdAt; + $this->cancelledAt = $cancelledAt; + $this->finishedAt = $finishedAt; + } + + /** + * Get a fresh instance of the batch represented by this ID. + * + * @return self + */ + public function fresh() + { + return $this; + } + + /** + * Add additional jobs to the batch. + * + * @param \Illuminate\Support\Enumerable|object|array $jobs + * @return self + */ + public function add($jobs) + { + $this->added[] = array_merge($this->added, $jobs); + + return $this; + } + + /** + * Record that a job within the batch finished successfully, executing any callbacks if necessary. + * + * @param string $jobId + * @return void + */ + public function recordSuccessfulJob(string $jobId) + { + // + } + + /** + * Decrement the pending jobs for the batch. + * + * @param string $jobId + * @return \Illuminate\Bus\UpdatedBatchJobCounts + */ + public function decrementPendingJobs(string $jobId) + { + // + } + + /** + * Record that a job within the batch failed to finish successfully, executing any callbacks if necessary. + * + * @param string $jobId + * @param \Throwable $e + * @return void + */ + public function recordFailedJob(string $jobId, $e) + { + // + } + + /** + * Increment the failed jobs for the batch. + * + * @param string $jobId + * @return \Illuminate\Bus\UpdatedBatchJobCounts + */ + public function incrementFailedJobs(string $jobId) + { + return new UpdatedBatchJobCounts; + } + + /** + * Cancel the batch. + * + * @return void + */ + public function cancel() + { + $this->cancelledAt = Carbon::now(); + } + + /** + * Delete the batch from storage. + * + * @return void + */ + public function delete() + { + $this->deleted = true; + } + + /** + * Determine if the batch has been deleted. + * + * @return bool + */ + public function deleted() + { + return $this->deleted; + } +} diff --git a/vendor/illuminate/support/Testing/Fakes/BatchRepositoryFake.php b/vendor/illuminate/support/Testing/Fakes/BatchRepositoryFake.php new file mode 100644 index 0000000..021c73f --- /dev/null +++ b/vendor/illuminate/support/Testing/Fakes/BatchRepositoryFake.php @@ -0,0 +1,153 @@ +<?php + +namespace Illuminate\Support\Testing\Fakes; + +use Carbon\CarbonImmutable; +use Closure; +use Illuminate\Bus\BatchRepository; +use Illuminate\Bus\PendingBatch; +use Illuminate\Bus\UpdatedBatchJobCounts; +use Illuminate\Support\Str; + +class BatchRepositoryFake implements BatchRepository +{ + /** + * The batches stored in the repository. + * + * @var \Illuminate\Bus\Batch[] + */ + protected $batches = []; + + /** + * Retrieve a list of batches. + * + * @param int $limit + * @param mixed $before + * @return \Illuminate\Bus\Batch[] + */ + public function get($limit, $before) + { + return $this->batches; + } + + /** + * Retrieve information about an existing batch. + * + * @param string $batchId + * @return \Illuminate\Bus\Batch|null + */ + public function find(string $batchId) + { + return $this->batches[$batchId] ?? null; + } + + /** + * Store a new pending batch. + * + * @param \Illuminate\Bus\PendingBatch $batch + * @return \Illuminate\Bus\Batch + */ + public function store(PendingBatch $batch) + { + $id = (string) Str::orderedUuid(); + + $this->batches[$id] = new BatchFake( + $id, + $batch->name, + count($batch->jobs), + count($batch->jobs), + 0, + [], + $batch->options, + CarbonImmutable::now(), + null, + null + ); + + return $this->batches[$id]; + } + + /** + * Increment the total number of jobs within the batch. + * + * @param string $batchId + * @param int $amount + * @return void + */ + public function incrementTotalJobs(string $batchId, int $amount) + { + // + } + + /** + * Decrement the total number of pending jobs for the batch. + * + * @param string $batchId + * @param string $jobId + * @return \Illuminate\Bus\UpdatedBatchJobCounts + */ + public function decrementPendingJobs(string $batchId, string $jobId) + { + return new UpdatedBatchJobCounts; + } + + /** + * Increment the total number of failed jobs for the batch. + * + * @param string $batchId + * @param string $jobId + * @return \Illuminate\Bus\UpdatedBatchJobCounts + */ + public function incrementFailedJobs(string $batchId, string $jobId) + { + return new UpdatedBatchJobCounts; + } + + /** + * Mark the batch that has the given ID as finished. + * + * @param string $batchId + * @return void + */ + public function markAsFinished(string $batchId) + { + if (isset($this->batches[$batchId])) { + $this->batches[$batchId]->finishedAt = now(); + } + } + + /** + * Cancel the batch that has the given ID. + * + * @param string $batchId + * @return void + */ + public function cancel(string $batchId) + { + if (isset($this->batches[$batchId])) { + $this->batches[$batchId]->cancel(); + } + } + + /** + * Delete the batch that has the given ID. + * + * @param string $batchId + * @return void + */ + public function delete(string $batchId) + { + unset($this->batches[$batchId]); + } + + /** + * Execute the given Closure within a storage specific transaction. + * + * @param \Closure $callback + * @return mixed + */ + public function transaction(Closure $callback) + { + return $callback(); + } +} diff --git a/vendor/illuminate/support/Testing/Fakes/BusFake.php b/vendor/illuminate/support/Testing/Fakes/BusFake.php new file mode 100644 index 0000000..21bd822 --- /dev/null +++ b/vendor/illuminate/support/Testing/Fakes/BusFake.php @@ -0,0 +1,791 @@ +<?php + +namespace Illuminate\Support\Testing\Fakes; + +use Closure; +use Illuminate\Bus\BatchRepository; +use Illuminate\Bus\PendingBatch; +use Illuminate\Contracts\Bus\QueueingDispatcher; +use Illuminate\Support\Arr; +use Illuminate\Support\Collection; +use Illuminate\Support\Traits\ReflectsClosures; +use PHPUnit\Framework\Assert as PHPUnit; + +class BusFake implements QueueingDispatcher +{ + use ReflectsClosures; + + /** + * The original Bus dispatcher implementation. + * + * @var \Illuminate\Contracts\Bus\QueueingDispatcher + */ + protected $dispatcher; + + /** + * The job types that should be intercepted instead of dispatched. + * + * @var array + */ + protected $jobsToFake = []; + + /** + * The job types that should be dispatched instead of faked. + * + * @var array + */ + protected $jobsToDispatch = []; + + /** + * The fake repository to track batched jobs. + * + * @var \Illuminate\Bus\BatchRepository + */ + protected $batchRepository; + + /** + * The commands that have been dispatched. + * + * @var array + */ + protected $commands = []; + + /** + * The commands that have been dispatched synchronously. + * + * @var array + */ + protected $commandsSync = []; + + /** + * The commands that have been dispatched after the response has been sent. + * + * @var array + */ + protected $commandsAfterResponse = []; + + /** + * The batches that have been dispatched. + * + * @var array + */ + protected $batches = []; + + /** + * Create a new bus fake instance. + * + * @param \Illuminate\Contracts\Bus\QueueingDispatcher $dispatcher + * @param array|string $jobsToFake + * @param \Illuminate\Bus\BatchRepository|null $batchRepository + * @return void + */ + public function __construct(QueueingDispatcher $dispatcher, $jobsToFake = [], BatchRepository $batchRepository = null) + { + $this->dispatcher = $dispatcher; + $this->jobsToFake = Arr::wrap($jobsToFake); + $this->batchRepository = $batchRepository ?: new BatchRepositoryFake; + } + + /** + * Specify the jobs that should be dispatched instead of faked. + * + * @param array|string $jobsToDispatch + * @return void + */ + public function except($jobsToDispatch) + { + $this->jobsToDispatch = array_merge($this->jobsToDispatch, Arr::wrap($jobsToDispatch)); + + return $this; + } + + /** + * Assert if a job was dispatched based on a truth-test callback. + * + * @param string|\Closure $command + * @param callable|int|null $callback + * @return void + */ + public function assertDispatched($command, $callback = null) + { + if ($command instanceof Closure) { + [$command, $callback] = [$this->firstClosureParameterType($command), $command]; + } + + if (is_numeric($callback)) { + return $this->assertDispatchedTimes($command, $callback); + } + + PHPUnit::assertTrue( + $this->dispatched($command, $callback)->count() > 0 || + $this->dispatchedAfterResponse($command, $callback)->count() > 0 || + $this->dispatchedSync($command, $callback)->count() > 0, + "The expected [{$command}] job was not dispatched." + ); + } + + /** + * Assert if a job was pushed a number of times. + * + * @param string $command + * @param int $times + * @return void + */ + public function assertDispatchedTimes($command, $times = 1) + { + $count = $this->dispatched($command)->count() + + $this->dispatchedAfterResponse($command)->count() + + $this->dispatchedSync($command)->count(); + + PHPUnit::assertSame( + $times, $count, + "The expected [{$command}] job was pushed {$count} times instead of {$times} times." + ); + } + + /** + * Determine if a job was dispatched based on a truth-test callback. + * + * @param string|\Closure $command + * @param callable|null $callback + * @return void + */ + public function assertNotDispatched($command, $callback = null) + { + if ($command instanceof Closure) { + [$command, $callback] = [$this->firstClosureParameterType($command), $command]; + } + + PHPUnit::assertTrue( + $this->dispatched($command, $callback)->count() === 0 && + $this->dispatchedAfterResponse($command, $callback)->count() === 0 && + $this->dispatchedSync($command, $callback)->count() === 0, + "The unexpected [{$command}] job was dispatched." + ); + } + + /** + * Assert that no jobs were dispatched. + * + * @return void + */ + public function assertNothingDispatched() + { + PHPUnit::assertEmpty($this->commands, 'Jobs were dispatched unexpectedly.'); + } + + /** + * Assert if a job was explicitly dispatched synchronously based on a truth-test callback. + * + * @param string|\Closure $command + * @param callable|int|null $callback + * @return void + */ + public function assertDispatchedSync($command, $callback = null) + { + if ($command instanceof Closure) { + [$command, $callback] = [$this->firstClosureParameterType($command), $command]; + } + + if (is_numeric($callback)) { + return $this->assertDispatchedSyncTimes($command, $callback); + } + + PHPUnit::assertTrue( + $this->dispatchedSync($command, $callback)->count() > 0, + "The expected [{$command}] job was not dispatched synchronously." + ); + } + + /** + * Assert if a job was pushed synchronously a number of times. + * + * @param string $command + * @param int $times + * @return void + */ + public function assertDispatchedSyncTimes($command, $times = 1) + { + $count = $this->dispatchedSync($command)->count(); + + PHPUnit::assertSame( + $times, $count, + "The expected [{$command}] job was synchronously pushed {$count} times instead of {$times} times." + ); + } + + /** + * Determine if a job was dispatched based on a truth-test callback. + * + * @param string|\Closure $command + * @param callable|null $callback + * @return void + */ + public function assertNotDispatchedSync($command, $callback = null) + { + if ($command instanceof Closure) { + [$command, $callback] = [$this->firstClosureParameterType($command), $command]; + } + + PHPUnit::assertCount( + 0, $this->dispatchedSync($command, $callback), + "The unexpected [{$command}] job was dispatched synchronously." + ); + } + + /** + * Assert if a job was dispatched after the response was sent based on a truth-test callback. + * + * @param string|\Closure $command + * @param callable|int|null $callback + * @return void + */ + public function assertDispatchedAfterResponse($command, $callback = null) + { + if ($command instanceof Closure) { + [$command, $callback] = [$this->firstClosureParameterType($command), $command]; + } + + if (is_numeric($callback)) { + return $this->assertDispatchedAfterResponseTimes($command, $callback); + } + + PHPUnit::assertTrue( + $this->dispatchedAfterResponse($command, $callback)->count() > 0, + "The expected [{$command}] job was not dispatched after sending the response." + ); + } + + /** + * Assert if a job was pushed after the response was sent a number of times. + * + * @param string $command + * @param int $times + * @return void + */ + public function assertDispatchedAfterResponseTimes($command, $times = 1) + { + $count = $this->dispatchedAfterResponse($command)->count(); + + PHPUnit::assertSame( + $times, $count, + "The expected [{$command}] job was pushed {$count} times instead of {$times} times." + ); + } + + /** + * Determine if a job was dispatched based on a truth-test callback. + * + * @param string|\Closure $command + * @param callable|null $callback + * @return void + */ + public function assertNotDispatchedAfterResponse($command, $callback = null) + { + if ($command instanceof Closure) { + [$command, $callback] = [$this->firstClosureParameterType($command), $command]; + } + + PHPUnit::assertCount( + 0, $this->dispatchedAfterResponse($command, $callback), + "The unexpected [{$command}] job was dispatched after sending the response." + ); + } + + /** + * Assert if a chain of jobs was dispatched. + * + * @param array $expectedChain + * @return void + */ + public function assertChained(array $expectedChain) + { + $command = $expectedChain[0]; + + $expectedChain = array_slice($expectedChain, 1); + + $callback = null; + + if ($command instanceof Closure) { + [$command, $callback] = [$this->firstClosureParameterType($command), $command]; + } elseif (! is_string($command)) { + $instance = $command; + + $command = get_class($instance); + + $callback = function ($job) use ($instance) { + return serialize($this->resetChainPropertiesToDefaults($job)) === serialize($instance); + }; + } + + PHPUnit::assertTrue( + $this->dispatched($command, $callback)->isNotEmpty(), + "The expected [{$command}] job was not dispatched." + ); + + PHPUnit::assertTrue( + collect($expectedChain)->isNotEmpty(), + 'The expected chain can not be empty.' + ); + + $this->isChainOfObjects($expectedChain) + ? $this->assertDispatchedWithChainOfObjects($command, $expectedChain, $callback) + : $this->assertDispatchedWithChainOfClasses($command, $expectedChain, $callback); + } + + /** + * Reset the chain properties to their default values on the job. + * + * @param mixed $job + * @return mixed + */ + protected function resetChainPropertiesToDefaults($job) + { + return tap(clone $job, function ($job) { + $job->chainConnection = null; + $job->chainQueue = null; + $job->chainCatchCallbacks = null; + $job->chained = []; + }); + } + + /** + * Assert if a job was dispatched with an empty chain based on a truth-test callback. + * + * @param string|\Closure $command + * @param callable|null $callback + * @return void + */ + public function assertDispatchedWithoutChain($command, $callback = null) + { + if ($command instanceof Closure) { + [$command, $callback] = [$this->firstClosureParameterType($command), $command]; + } + + PHPUnit::assertTrue( + $this->dispatched($command, $callback)->isNotEmpty(), + "The expected [{$command}] job was not dispatched." + ); + + $this->assertDispatchedWithChainOfClasses($command, [], $callback); + } + + /** + * Assert if a job was dispatched with chained jobs based on a truth-test callback. + * + * @param string $command + * @param array $expectedChain + * @param callable|null $callback + * @return void + */ + protected function assertDispatchedWithChainOfObjects($command, $expectedChain, $callback) + { + $chain = collect($expectedChain)->map(fn ($job) => serialize($job))->all(); + + PHPUnit::assertTrue( + $this->dispatched($command, $callback)->filter( + fn ($job) => $job->chained == $chain + )->isNotEmpty(), + 'The expected chain was not dispatched.' + ); + } + + /** + * Assert if a job was dispatched with chained jobs based on a truth-test callback. + * + * @param string $command + * @param array $expectedChain + * @param callable|null $callback + * @return void + */ + protected function assertDispatchedWithChainOfClasses($command, $expectedChain, $callback) + { + $matching = $this->dispatched($command, $callback)->map->chained->map(function ($chain) { + return collect($chain)->map( + fn ($job) => get_class(unserialize($job)) + ); + })->filter( + fn ($chain) => $chain->all() === $expectedChain + ); + + PHPUnit::assertTrue( + $matching->isNotEmpty(), 'The expected chain was not dispatched.' + ); + } + + /** + * Determine if the given chain is entirely composed of objects. + * + * @param array $chain + * @return bool + */ + protected function isChainOfObjects($chain) + { + return ! collect($chain)->contains(fn ($job) => ! is_object($job)); + } + + /** + * Assert if a batch was dispatched based on a truth-test callback. + * + * @param callable $callback + * @return void + */ + public function assertBatched(callable $callback) + { + PHPUnit::assertTrue( + $this->batched($callback)->count() > 0, + 'The expected batch was not dispatched.' + ); + } + + /** + * Assert the number of batches that have been dispatched. + * + * @param int $count + * @return void + */ + public function assertBatchCount($count) + { + PHPUnit::assertCount( + $count, $this->batches, + ); + } + + /** + * Assert that no batched jobs were dispatched. + * + * @return void + */ + public function assertNothingBatched() + { + PHPUnit::assertEmpty($this->batches, 'Batched jobs were dispatched unexpectedly.'); + } + + /** + * Get all of the jobs matching a truth-test callback. + * + * @param string $command + * @param callable|null $callback + * @return \Illuminate\Support\Collection + */ + public function dispatched($command, $callback = null) + { + if (! $this->hasDispatched($command)) { + return collect(); + } + + $callback = $callback ?: fn () => true; + + return collect($this->commands[$command])->filter(fn ($command) => $callback($command)); + } + + /** + * Get all of the jobs dispatched synchronously matching a truth-test callback. + * + * @param string $command + * @param callable|null $callback + * @return \Illuminate\Support\Collection + */ + public function dispatchedSync(string $command, $callback = null) + { + if (! $this->hasDispatchedSync($command)) { + return collect(); + } + + $callback = $callback ?: fn () => true; + + return collect($this->commandsSync[$command])->filter(fn ($command) => $callback($command)); + } + + /** + * Get all of the jobs dispatched after the response was sent matching a truth-test callback. + * + * @param string $command + * @param callable|null $callback + * @return \Illuminate\Support\Collection + */ + public function dispatchedAfterResponse(string $command, $callback = null) + { + if (! $this->hasDispatchedAfterResponse($command)) { + return collect(); + } + + $callback = $callback ?: fn () => true; + + return collect($this->commandsAfterResponse[$command])->filter(fn ($command) => $callback($command)); + } + + /** + * Get all of the pending batches matching a truth-test callback. + * + * @param callable $callback + * @return \Illuminate\Support\Collection + */ + public function batched(callable $callback) + { + if (empty($this->batches)) { + return collect(); + } + + return collect($this->batches)->filter(fn ($batch) => $callback($batch)); + } + + /** + * Determine if there are any stored commands for a given class. + * + * @param string $command + * @return bool + */ + public function hasDispatched($command) + { + return isset($this->commands[$command]) && ! empty($this->commands[$command]); + } + + /** + * Determine if there are any stored commands for a given class. + * + * @param string $command + * @return bool + */ + public function hasDispatchedSync($command) + { + return isset($this->commandsSync[$command]) && ! empty($this->commandsSync[$command]); + } + + /** + * Determine if there are any stored commands for a given class. + * + * @param string $command + * @return bool + */ + public function hasDispatchedAfterResponse($command) + { + return isset($this->commandsAfterResponse[$command]) && ! empty($this->commandsAfterResponse[$command]); + } + + /** + * Dispatch a command to its appropriate handler. + * + * @param mixed $command + * @return mixed + */ + public function dispatch($command) + { + if ($this->shouldFakeJob($command)) { + $this->commands[get_class($command)][] = $command; + } else { + return $this->dispatcher->dispatch($command); + } + } + + /** + * Dispatch a command to its appropriate handler in the current process. + * + * Queueable jobs will be dispatched to the "sync" queue. + * + * @param mixed $command + * @param mixed $handler + * @return mixed + */ + public function dispatchSync($command, $handler = null) + { + if ($this->shouldFakeJob($command)) { + $this->commandsSync[get_class($command)][] = $command; + } else { + return $this->dispatcher->dispatchSync($command, $handler); + } + } + + /** + * Dispatch a command to its appropriate handler in the current process. + * + * @param mixed $command + * @param mixed $handler + * @return mixed + */ + public function dispatchNow($command, $handler = null) + { + if ($this->shouldFakeJob($command)) { + $this->commands[get_class($command)][] = $command; + } else { + return $this->dispatcher->dispatchNow($command, $handler); + } + } + + /** + * Dispatch a command to its appropriate handler behind a queue. + * + * @param mixed $command + * @return mixed + */ + public function dispatchToQueue($command) + { + if ($this->shouldFakeJob($command)) { + $this->commands[get_class($command)][] = $command; + } else { + return $this->dispatcher->dispatchToQueue($command); + } + } + + /** + * Dispatch a command to its appropriate handler. + * + * @param mixed $command + * @return mixed + */ + public function dispatchAfterResponse($command) + { + if ($this->shouldFakeJob($command)) { + $this->commandsAfterResponse[get_class($command)][] = $command; + } else { + return $this->dispatcher->dispatch($command); + } + } + + /** + * Create a new chain of queueable jobs. + * + * @param \Illuminate\Support\Collection|array $jobs + * @return \Illuminate\Foundation\Bus\PendingChain + */ + public function chain($jobs) + { + $jobs = Collection::wrap($jobs); + + return new PendingChainFake($this, $jobs->shift(), $jobs->toArray()); + } + + /** + * Attempt to find the batch with the given ID. + * + * @param string $batchId + * @return \Illuminate\Bus\Batch|null + */ + public function findBatch(string $batchId) + { + return $this->batchRepository->find($batchId); + } + + /** + * Create a new batch of queueable jobs. + * + * @param \Illuminate\Support\Collection|array $jobs + * @return \Illuminate\Bus\PendingBatch + */ + public function batch($jobs) + { + return new PendingBatchFake($this, Collection::wrap($jobs)); + } + + /** + * Dispatch an empty job batch for testing. + * + * @param string $name + * @return \Illuminate\Bus\Batch + */ + public function dispatchFakeBatch($name = '') + { + return $this->batch([])->name($name)->dispatch(); + } + + /** + * Record the fake pending batch dispatch. + * + * @param \Illuminate\Bus\PendingBatch $pendingBatch + * @return \Illuminate\Bus\Batch + */ + public function recordPendingBatch(PendingBatch $pendingBatch) + { + $this->batches[] = $pendingBatch; + + return $this->batchRepository->store($pendingBatch); + } + + /** + * Determine if a command should be faked or actually dispatched. + * + * @param mixed $command + * @return bool + */ + protected function shouldFakeJob($command) + { + if ($this->shouldDispatchCommand($command)) { + return false; + } + + if (empty($this->jobsToFake)) { + return true; + } + + return collect($this->jobsToFake) + ->filter(function ($job) use ($command) { + return $job instanceof Closure + ? $job($command) + : $job === get_class($command); + })->isNotEmpty(); + } + + /** + * Determine if a command should be dispatched or not. + * + * @param mixed $command + * @return bool + */ + protected function shouldDispatchCommand($command) + { + return collect($this->jobsToDispatch) + ->filter(function ($job) use ($command) { + return $job instanceof Closure + ? $job($command) + : $job === get_class($command); + })->isNotEmpty(); + } + + /** + * Set the pipes commands should be piped through before dispatching. + * + * @param array $pipes + * @return $this + */ + public function pipeThrough(array $pipes) + { + $this->dispatcher->pipeThrough($pipes); + + return $this; + } + + /** + * Determine if the given command has a handler. + * + * @param mixed $command + * @return bool + */ + public function hasCommandHandler($command) + { + return $this->dispatcher->hasCommandHandler($command); + } + + /** + * Retrieve the handler for a command. + * + * @param mixed $command + * @return mixed + */ + public function getCommandHandler($command) + { + return $this->dispatcher->getCommandHandler($command); + } + + /** + * Map a command to a handler. + * + * @param array $map + * @return $this + */ + public function map(array $map) + { + $this->dispatcher->map($map); + + return $this; + } +} diff --git a/vendor/illuminate/support/Testing/Fakes/EventFake.php b/vendor/illuminate/support/Testing/Fakes/EventFake.php new file mode 100644 index 0000000..2a102af --- /dev/null +++ b/vendor/illuminate/support/Testing/Fakes/EventFake.php @@ -0,0 +1,380 @@ +<?php + +namespace Illuminate\Support\Testing\Fakes; + +use Closure; +use Illuminate\Contracts\Events\Dispatcher; +use Illuminate\Support\Arr; +use Illuminate\Support\Str; +use Illuminate\Support\Traits\ReflectsClosures; +use PHPUnit\Framework\Assert as PHPUnit; +use ReflectionFunction; + +class EventFake implements Dispatcher +{ + use ReflectsClosures; + + /** + * The original event dispatcher. + * + * @var \Illuminate\Contracts\Events\Dispatcher + */ + protected $dispatcher; + + /** + * The event types that should be intercepted instead of dispatched. + * + * @var array + */ + protected $eventsToFake = []; + + /** + * The event types that should be dispatched instead of intercepted. + * + * @var array + */ + protected $eventsToDispatch = []; + + /** + * All of the events that have been intercepted keyed by type. + * + * @var array + */ + protected $events = []; + + /** + * Create a new event fake instance. + * + * @param \Illuminate\Contracts\Events\Dispatcher $dispatcher + * @param array|string $eventsToFake + * @return void + */ + public function __construct(Dispatcher $dispatcher, $eventsToFake = []) + { + $this->dispatcher = $dispatcher; + + $this->eventsToFake = Arr::wrap($eventsToFake); + } + + /** + * Specify the events that should be dispatched instead of faked. + * + * @param array|string $eventsToDispatch + * @return $this + */ + public function except($eventsToDispatch) + { + $this->eventsToDispatch = array_merge( + $this->eventsToDispatch, + Arr::wrap($eventsToDispatch) + ); + + return $this; + } + + /** + * Assert if an event has a listener attached to it. + * + * @param string $expectedEvent + * @param string|array $expectedListener + * @return void + */ + public function assertListening($expectedEvent, $expectedListener) + { + foreach ($this->dispatcher->getListeners($expectedEvent) as $listenerClosure) { + $actualListener = (new ReflectionFunction($listenerClosure)) + ->getStaticVariables()['listener']; + + if (is_string($actualListener) && Str::contains($actualListener, '@')) { + $actualListener = Str::parseCallback($actualListener); + + if (is_string($expectedListener)) { + if (Str::contains($expectedListener, '@')) { + $expectedListener = Str::parseCallback($expectedListener); + } else { + $expectedListener = [$expectedListener, 'handle']; + } + } + } + + if ($actualListener === $expectedListener || + ($actualListener instanceof Closure && + $expectedListener === Closure::class)) { + PHPUnit::assertTrue(true); + + return; + } + } + + PHPUnit::assertTrue( + false, + sprintf( + 'Event [%s] does not have the [%s] listener attached to it', + $expectedEvent, + print_r($expectedListener, true) + ) + ); + } + + /** + * Assert if an event was dispatched based on a truth-test callback. + * + * @param string|\Closure $event + * @param callable|int|null $callback + * @return void + */ + public function assertDispatched($event, $callback = null) + { + if ($event instanceof Closure) { + [$event, $callback] = [$this->firstClosureParameterType($event), $event]; + } + + if (is_int($callback)) { + return $this->assertDispatchedTimes($event, $callback); + } + + PHPUnit::assertTrue( + $this->dispatched($event, $callback)->count() > 0, + "The expected [{$event}] event was not dispatched." + ); + } + + /** + * Assert if an event was dispatched a number of times. + * + * @param string $event + * @param int $times + * @return void + */ + public function assertDispatchedTimes($event, $times = 1) + { + $count = $this->dispatched($event)->count(); + + PHPUnit::assertSame( + $times, $count, + "The expected [{$event}] event was dispatched {$count} times instead of {$times} times." + ); + } + + /** + * Determine if an event was dispatched based on a truth-test callback. + * + * @param string|\Closure $event + * @param callable|null $callback + * @return void + */ + public function assertNotDispatched($event, $callback = null) + { + if ($event instanceof Closure) { + [$event, $callback] = [$this->firstClosureParameterType($event), $event]; + } + + PHPUnit::assertCount( + 0, $this->dispatched($event, $callback), + "The unexpected [{$event}] event was dispatched." + ); + } + + /** + * Assert that no events were dispatched. + * + * @return void + */ + public function assertNothingDispatched() + { + $count = count(Arr::flatten($this->events)); + + PHPUnit::assertSame( + 0, $count, + "{$count} unexpected events were dispatched." + ); + } + + /** + * Get all of the events matching a truth-test callback. + * + * @param string $event + * @param callable|null $callback + * @return \Illuminate\Support\Collection + */ + public function dispatched($event, $callback = null) + { + if (! $this->hasDispatched($event)) { + return collect(); + } + + $callback = $callback ?: fn () => true; + + return collect($this->events[$event])->filter( + fn ($arguments) => $callback(...$arguments) + ); + } + + /** + * Determine if the given event has been dispatched. + * + * @param string $event + * @return bool + */ + public function hasDispatched($event) + { + return isset($this->events[$event]) && ! empty($this->events[$event]); + } + + /** + * Register an event listener with the dispatcher. + * + * @param \Closure|string|array $events + * @param mixed $listener + * @return void + */ + public function listen($events, $listener = null) + { + $this->dispatcher->listen($events, $listener); + } + + /** + * Determine if a given event has listeners. + * + * @param string $eventName + * @return bool + */ + public function hasListeners($eventName) + { + return $this->dispatcher->hasListeners($eventName); + } + + /** + * Register an event and payload to be dispatched later. + * + * @param string $event + * @param array $payload + * @return void + */ + public function push($event, $payload = []) + { + // + } + + /** + * Register an event subscriber with the dispatcher. + * + * @param object|string $subscriber + * @return void + */ + public function subscribe($subscriber) + { + $this->dispatcher->subscribe($subscriber); + } + + /** + * Flush a set of pushed events. + * + * @param string $event + * @return void + */ + public function flush($event) + { + // + } + + /** + * Fire an event and call the listeners. + * + * @param string|object $event + * @param mixed $payload + * @param bool $halt + * @return array|null + */ + public function dispatch($event, $payload = [], $halt = false) + { + $name = is_object($event) ? get_class($event) : (string) $event; + + if ($this->shouldFakeEvent($name, $payload)) { + $this->events[$name][] = func_get_args(); + } else { + return $this->dispatcher->dispatch($event, $payload, $halt); + } + } + + /** + * Determine if an event should be faked or actually dispatched. + * + * @param string $eventName + * @param mixed $payload + * @return bool + */ + protected function shouldFakeEvent($eventName, $payload) + { + if ($this->shouldDispatchEvent($eventName, $payload)) { + return false; + } + + if (empty($this->eventsToFake)) { + return true; + } + + return collect($this->eventsToFake) + ->filter(function ($event) use ($eventName, $payload) { + return $event instanceof Closure + ? $event($eventName, $payload) + : $event === $eventName; + }) + ->isNotEmpty(); + } + + /** + * Determine whether an event should be dispatched or not. + * + * @param string $eventName + * @param mixed $payload + * @return bool + */ + protected function shouldDispatchEvent($eventName, $payload) + { + if (empty($this->eventsToDispatch)) { + return false; + } + + return collect($this->eventsToDispatch) + ->filter(function ($event) use ($eventName, $payload) { + return $event instanceof Closure + ? $event($eventName, $payload) + : $event === $eventName; + }) + ->isNotEmpty(); + } + + /** + * Remove a set of listeners from the dispatcher. + * + * @param string $event + * @return void + */ + public function forget($event) + { + // + } + + /** + * Forget all of the queued listeners. + * + * @return void + */ + public function forgetPushed() + { + // + } + + /** + * Dispatch an event and call the listeners. + * + * @param string|object $event + * @param mixed $payload + * @return array|null + */ + public function until($event, $payload = []) + { + return $this->dispatch($event, $payload, true); + } +} diff --git a/vendor/illuminate/support/Testing/Fakes/MailFake.php b/vendor/illuminate/support/Testing/Fakes/MailFake.php new file mode 100644 index 0000000..c95c15a --- /dev/null +++ b/vendor/illuminate/support/Testing/Fakes/MailFake.php @@ -0,0 +1,444 @@ +<?php + +namespace Illuminate\Support\Testing\Fakes; + +use Closure; +use Illuminate\Contracts\Mail\Factory; +use Illuminate\Contracts\Mail\Mailable; +use Illuminate\Contracts\Mail\Mailer; +use Illuminate\Contracts\Mail\MailQueue; +use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Support\Traits\ReflectsClosures; +use PHPUnit\Framework\Assert as PHPUnit; + +class MailFake implements Factory, Mailer, MailQueue +{ + use ReflectsClosures; + + /** + * The mailer currently being used to send a message. + * + * @var string + */ + protected $currentMailer; + + /** + * All of the mailables that have been sent. + * + * @var array + */ + protected $mailables = []; + + /** + * All of the mailables that have been queued. + * + * @var array + */ + protected $queuedMailables = []; + + /** + * Assert if a mailable was sent based on a truth-test callback. + * + * @param string|\Closure $mailable + * @param callable|int|null $callback + * @return void + */ + public function assertSent($mailable, $callback = null) + { + [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); + + if (is_numeric($callback)) { + return $this->assertSentTimes($mailable, $callback); + } + + $message = "The expected [{$mailable}] mailable was not sent."; + + if (count($this->queuedMailables) > 0) { + $message .= ' Did you mean to use assertQueued() instead?'; + } + + PHPUnit::assertTrue( + $this->sent($mailable, $callback)->count() > 0, + $message + ); + } + + /** + * Assert if a mailable was sent a number of times. + * + * @param string $mailable + * @param int $times + * @return void + */ + protected function assertSentTimes($mailable, $times = 1) + { + $count = $this->sent($mailable)->count(); + + PHPUnit::assertSame( + $times, $count, + "The expected [{$mailable}] mailable was sent {$count} times instead of {$times} times." + ); + } + + /** + * Determine if a mailable was not sent or queued to be sent based on a truth-test callback. + * + * @param string|\Closure $mailable + * @param callable|null $callback + * @return void + */ + public function assertNotOutgoing($mailable, $callback = null) + { + $this->assertNotSent($mailable, $callback); + $this->assertNotQueued($mailable, $callback); + } + + /** + * Determine if a mailable was not sent based on a truth-test callback. + * + * @param string|\Closure $mailable + * @param callable|null $callback + * @return void + */ + public function assertNotSent($mailable, $callback = null) + { + [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); + + PHPUnit::assertCount( + 0, $this->sent($mailable, $callback), + "The unexpected [{$mailable}] mailable was sent." + ); + } + + /** + * Assert that no mailables were sent or queued to be sent. + * + * @return void + */ + public function assertNothingOutgoing() + { + $this->assertNothingSent(); + $this->assertNothingQueued(); + } + + /** + * Assert that no mailables were sent. + * + * @return void + */ + public function assertNothingSent() + { + $mailableNames = collect($this->mailables)->map( + fn ($mailable) => get_class($mailable) + )->join(', '); + + PHPUnit::assertEmpty($this->mailables, 'The following mailables were sent unexpectedly: '.$mailableNames); + } + + /** + * Assert if a mailable was queued based on a truth-test callback. + * + * @param string|\Closure $mailable + * @param callable|int|null $callback + * @return void + */ + public function assertQueued($mailable, $callback = null) + { + [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); + + if (is_numeric($callback)) { + return $this->assertQueuedTimes($mailable, $callback); + } + + PHPUnit::assertTrue( + $this->queued($mailable, $callback)->count() > 0, + "The expected [{$mailable}] mailable was not queued." + ); + } + + /** + * Assert if a mailable was queued a number of times. + * + * @param string $mailable + * @param int $times + * @return void + */ + protected function assertQueuedTimes($mailable, $times = 1) + { + $count = $this->queued($mailable)->count(); + + PHPUnit::assertSame( + $times, $count, + "The expected [{$mailable}] mailable was queued {$count} times instead of {$times} times." + ); + } + + /** + * Determine if a mailable was not queued based on a truth-test callback. + * + * @param string|\Closure $mailable + * @param callable|null $callback + * @return void + */ + public function assertNotQueued($mailable, $callback = null) + { + [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); + + PHPUnit::assertCount( + 0, $this->queued($mailable, $callback), + "The unexpected [{$mailable}] mailable was queued." + ); + } + + /** + * Assert that no mailables were queued. + * + * @return void + */ + public function assertNothingQueued() + { + $mailableNames = collect($this->queuedMailables)->map( + fn ($mailable) => get_class($mailable) + )->join(', '); + + PHPUnit::assertEmpty($this->queuedMailables, 'The following mailables were queued unexpectedly: '.$mailableNames); + } + + /** + * Get all of the mailables matching a truth-test callback. + * + * @param string|\Closure $mailable + * @param callable|null $callback + * @return \Illuminate\Support\Collection + */ + public function sent($mailable, $callback = null) + { + [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); + + if (! $this->hasSent($mailable)) { + return collect(); + } + + $callback = $callback ?: fn () => true; + + return $this->mailablesOf($mailable)->filter(fn ($mailable) => $callback($mailable)); + } + + /** + * Determine if the given mailable has been sent. + * + * @param string $mailable + * @return bool + */ + public function hasSent($mailable) + { + return $this->mailablesOf($mailable)->count() > 0; + } + + /** + * Get all of the queued mailables matching a truth-test callback. + * + * @param string|\Closure $mailable + * @param callable|null $callback + * @return \Illuminate\Support\Collection + */ + public function queued($mailable, $callback = null) + { + [$mailable, $callback] = $this->prepareMailableAndCallback($mailable, $callback); + + if (! $this->hasQueued($mailable)) { + return collect(); + } + + $callback = $callback ?: fn () => true; + + return $this->queuedMailablesOf($mailable)->filter(fn ($mailable) => $callback($mailable)); + } + + /** + * Determine if the given mailable has been queued. + * + * @param string $mailable + * @return bool + */ + public function hasQueued($mailable) + { + return $this->queuedMailablesOf($mailable)->count() > 0; + } + + /** + * Get all of the mailed mailables for a given type. + * + * @param string $type + * @return \Illuminate\Support\Collection + */ + protected function mailablesOf($type) + { + return collect($this->mailables)->filter(fn ($mailable) => $mailable instanceof $type); + } + + /** + * Get all of the mailed mailables for a given type. + * + * @param string $type + * @return \Illuminate\Support\Collection + */ + protected function queuedMailablesOf($type) + { + return collect($this->queuedMailables)->filter(fn ($mailable) => $mailable instanceof $type); + } + + /** + * Get a mailer instance by name. + * + * @param string|null $name + * @return \Illuminate\Contracts\Mail\Mailer + */ + public function mailer($name = null) + { + $this->currentMailer = $name; + + return $this; + } + + /** + * Begin the process of mailing a mailable class instance. + * + * @param mixed $users + * @return \Illuminate\Mail\PendingMail + */ + public function to($users) + { + return (new PendingMailFake($this))->to($users); + } + + /** + * Begin the process of mailing a mailable class instance. + * + * @param mixed $users + * @return \Illuminate\Mail\PendingMail + */ + public function cc($users) + { + return (new PendingMailFake($this))->cc($users); + } + + /** + * Begin the process of mailing a mailable class instance. + * + * @param mixed $users + * @return \Illuminate\Mail\PendingMail + */ + public function bcc($users) + { + return (new PendingMailFake($this))->bcc($users); + } + + /** + * Send a new message with only a raw text part. + * + * @param string $text + * @param \Closure|string $callback + * @return void + */ + public function raw($text, $callback) + { + // + } + + /** + * Send a new message using a view. + * + * @param \Illuminate\Contracts\Mail\Mailable|string|array $view + * @param array $data + * @param \Closure|string|null $callback + * @return void + */ + public function send($view, array $data = [], $callback = null) + { + if (! $view instanceof Mailable) { + return; + } + + $view->mailer($this->currentMailer); + + if ($view instanceof ShouldQueue) { + return $this->queue($view, $data); + } + + $this->currentMailer = null; + + $this->mailables[] = $view; + } + + /** + * Queue a new e-mail message for sending. + * + * @param \Illuminate\Contracts\Mail\Mailable|string|array $view + * @param string|null $queue + * @return mixed + */ + public function queue($view, $queue = null) + { + if (! $view instanceof Mailable) { + return; + } + + $view->mailer($this->currentMailer); + + $this->currentMailer = null; + + $this->queuedMailables[] = $view; + } + + /** + * Queue a new e-mail message for sending after (n) seconds. + * + * @param \DateTimeInterface|\DateInterval|int $delay + * @param \Illuminate\Contracts\Mail\Mailable|string|array $view + * @param string|null $queue + * @return mixed + */ + public function later($delay, $view, $queue = null) + { + $this->queue($view, $queue); + } + + /** + * Get the array of failed recipients. + * + * @return array + */ + public function failures() + { + return []; + } + + /** + * Infer mailable class using reflection if a typehinted closure is passed to assertion. + * + * @param string|\Closure $mailable + * @param callable|null $callback + * @return array + */ + protected function prepareMailableAndCallback($mailable, $callback) + { + if ($mailable instanceof Closure) { + return [$this->firstClosureParameterType($mailable), $mailable]; + } + + return [$mailable, $callback]; + } + + /** + * Forget all of the resolved mailer instances. + * + * @return $this + */ + public function forgetMailers() + { + $this->currentMailer = null; + + return $this; + } +} diff --git a/vendor/illuminate/support/Testing/Fakes/NotificationFake.php b/vendor/illuminate/support/Testing/Fakes/NotificationFake.php new file mode 100644 index 0000000..5991420 --- /dev/null +++ b/vendor/illuminate/support/Testing/Fakes/NotificationFake.php @@ -0,0 +1,375 @@ +<?php + +namespace Illuminate\Support\Testing\Fakes; + +use Closure; +use Exception; +use Illuminate\Contracts\Notifications\Dispatcher as NotificationDispatcher; +use Illuminate\Contracts\Notifications\Factory as NotificationFactory; +use Illuminate\Contracts\Translation\HasLocalePreference; +use Illuminate\Notifications\AnonymousNotifiable; +use Illuminate\Support\Collection; +use Illuminate\Support\Str; +use Illuminate\Support\Traits\Macroable; +use Illuminate\Support\Traits\ReflectsClosures; +use PHPUnit\Framework\Assert as PHPUnit; + +class NotificationFake implements NotificationDispatcher, NotificationFactory +{ + use Macroable, ReflectsClosures; + + /** + * All of the notifications that have been sent. + * + * @var array + */ + protected $notifications = []; + + /** + * Locale used when sending notifications. + * + * @var string|null + */ + public $locale; + + /** + * Assert if a notification was sent on-demand based on a truth-test callback. + * + * @param string|\Closure $notification + * @param callable|null $callback + * @return void + * + * @throws \Exception + */ + public function assertSentOnDemand($notification, $callback = null) + { + $this->assertSentTo(new AnonymousNotifiable, $notification, $callback); + } + + /** + * Assert if a notification was sent based on a truth-test callback. + * + * @param mixed $notifiable + * @param string|\Closure $notification + * @param callable|null $callback + * @return void + * + * @throws \Exception + */ + public function assertSentTo($notifiable, $notification, $callback = null) + { + if (is_array($notifiable) || $notifiable instanceof Collection) { + if (count($notifiable) === 0) { + throw new Exception('No notifiable given.'); + } + + foreach ($notifiable as $singleNotifiable) { + $this->assertSentTo($singleNotifiable, $notification, $callback); + } + + return; + } + + if ($notification instanceof Closure) { + [$notification, $callback] = [$this->firstClosureParameterType($notification), $notification]; + } + + if (is_numeric($callback)) { + return $this->assertSentToTimes($notifiable, $notification, $callback); + } + + PHPUnit::assertTrue( + $this->sent($notifiable, $notification, $callback)->count() > 0, + "The expected [{$notification}] notification was not sent." + ); + } + + /** + * Assert if a notification was sent on-demand a number of times. + * + * @param string $notification + * @param int $times + * @return void + */ + public function assertSentOnDemandTimes($notification, $times = 1) + { + return $this->assertSentToTimes(new AnonymousNotifiable, $notification, $times); + } + + /** + * Assert if a notification was sent a number of times. + * + * @param mixed $notifiable + * @param string $notification + * @param int $times + * @return void + */ + public function assertSentToTimes($notifiable, $notification, $times = 1) + { + $count = $this->sent($notifiable, $notification)->count(); + + PHPUnit::assertSame( + $times, $count, + "Expected [{$notification}] to be sent {$times} times, but was sent {$count} times." + ); + } + + /** + * Determine if a notification was sent based on a truth-test callback. + * + * @param mixed $notifiable + * @param string|\Closure $notification + * @param callable|null $callback + * @return void + * + * @throws \Exception + */ + public function assertNotSentTo($notifiable, $notification, $callback = null) + { + if (is_array($notifiable) || $notifiable instanceof Collection) { + if (count($notifiable) === 0) { + throw new Exception('No notifiable given.'); + } + + foreach ($notifiable as $singleNotifiable) { + $this->assertNotSentTo($singleNotifiable, $notification, $callback); + } + + return; + } + + if ($notification instanceof Closure) { + [$notification, $callback] = [$this->firstClosureParameterType($notification), $notification]; + } + + PHPUnit::assertCount( + 0, $this->sent($notifiable, $notification, $callback), + "The unexpected [{$notification}] notification was sent." + ); + } + + /** + * Assert that no notifications were sent. + * + * @return void + */ + public function assertNothingSent() + { + PHPUnit::assertEmpty($this->notifications, 'Notifications were sent unexpectedly.'); + } + + /** + * Assert that no notifications were sent to the given notifiable. + * + * @param mixed $notifiable + * @return void + * + * @throws \Exception + */ + public function assertNothingSentTo($notifiable) + { + if (is_array($notifiable) || $notifiable instanceof Collection) { + if (count($notifiable) === 0) { + throw new Exception('No notifiable given.'); + } + + foreach ($notifiable as $singleNotifiable) { + $this->assertNothingSentTo($singleNotifiable); + } + + return; + } + + PHPUnit::assertEmpty( + $this->notifications[get_class($notifiable)][$notifiable->getKey()] ?? [], + 'Notifications were sent unexpectedly.', + ); + } + + /** + * Assert the total amount of times a notification was sent. + * + * @param string $notification + * @param int $expectedCount + * @return void + */ + public function assertSentTimes($notification, $expectedCount) + { + $actualCount = collect($this->notifications) + ->flatten(1) + ->reduce(fn ($count, $sent) => $count + count($sent[$notification] ?? []), 0); + + PHPUnit::assertSame( + $expectedCount, $actualCount, + "Expected [{$notification}] to be sent {$expectedCount} times, but was sent {$actualCount} times." + ); + } + + /** + * Assert the total count of notification that were sent. + * + * @param int $expectedCount + * @return void + */ + public function assertCount($expectedCount) + { + $actualCount = collect($this->notifications)->flatten(3)->count(); + + PHPUnit::assertSame( + $expectedCount, $actualCount, + "Expected {$expectedCount} notifications to be sent, but {$actualCount} were sent." + ); + } + + /** + * Assert the total amount of times a notification was sent. + * + * @param int $expectedCount + * @param string $notification + * @return void + * + * @deprecated Use the assertSentTimes method instead + */ + public function assertTimesSent($expectedCount, $notification) + { + $this->assertSentTimes($notification, $expectedCount); + } + + /** + * Get all of the notifications matching a truth-test callback. + * + * @param mixed $notifiable + * @param string $notification + * @param callable|null $callback + * @return \Illuminate\Support\Collection + */ + public function sent($notifiable, $notification, $callback = null) + { + if (! $this->hasSent($notifiable, $notification)) { + return collect(); + } + + $callback = $callback ?: fn () => true; + + $notifications = collect($this->notificationsFor($notifiable, $notification)); + + return $notifications->filter( + fn ($arguments) => $callback(...array_values($arguments)) + )->pluck('notification'); + } + + /** + * Determine if there are more notifications left to inspect. + * + * @param mixed $notifiable + * @param string $notification + * @return bool + */ + public function hasSent($notifiable, $notification) + { + return ! empty($this->notificationsFor($notifiable, $notification)); + } + + /** + * Get all of the notifications for a notifiable entity by type. + * + * @param mixed $notifiable + * @param string $notification + * @return array + */ + protected function notificationsFor($notifiable, $notification) + { + return $this->notifications[get_class($notifiable)][$notifiable->getKey()][$notification] ?? []; + } + + /** + * Send the given notification to the given notifiable entities. + * + * @param \Illuminate\Support\Collection|array|mixed $notifiables + * @param mixed $notification + * @return void + */ + public function send($notifiables, $notification) + { + $this->sendNow($notifiables, $notification); + } + + /** + * Send the given notification immediately. + * + * @param \Illuminate\Support\Collection|array|mixed $notifiables + * @param mixed $notification + * @param array|null $channels + * @return void + */ + public function sendNow($notifiables, $notification, array $channels = null) + { + if (! $notifiables instanceof Collection && ! is_array($notifiables)) { + $notifiables = [$notifiables]; + } + + foreach ($notifiables as $notifiable) { + if (! $notification->id) { + $notification->id = Str::uuid()->toString(); + } + + $notifiableChannels = $channels ?: $notification->via($notifiable); + + if (method_exists($notification, 'shouldSend')) { + $notifiableChannels = array_filter( + $notifiableChannels, + fn ($channel) => $notification->shouldSend($notifiable, $channel) !== false + ); + + if (empty($notifiableChannels)) { + continue; + } + } + + $this->notifications[get_class($notifiable)][$notifiable->getKey()][get_class($notification)][] = [ + 'notification' => $notification, + 'channels' => $notifiableChannels, + 'notifiable' => $notifiable, + 'locale' => $notification->locale ?? $this->locale ?? value(function () use ($notifiable) { + if ($notifiable instanceof HasLocalePreference) { + return $notifiable->preferredLocale(); + } + }), + ]; + } + } + + /** + * Get a channel instance by name. + * + * @param string|null $name + * @return mixed + */ + public function channel($name = null) + { + // + } + + /** + * Set the locale of notifications. + * + * @param string $locale + * @return $this + */ + public function locale($locale) + { + $this->locale = $locale; + + return $this; + } + + /** + * Get the notifications that have been sent. + * + * @return array + */ + public function sentNotifications() + { + return $this->notifications; + } +} diff --git a/vendor/illuminate/support/Testing/Fakes/PendingBatchFake.php b/vendor/illuminate/support/Testing/Fakes/PendingBatchFake.php new file mode 100644 index 0000000..3d0f499 --- /dev/null +++ b/vendor/illuminate/support/Testing/Fakes/PendingBatchFake.php @@ -0,0 +1,49 @@ +<?php + +namespace Illuminate\Support\Testing\Fakes; + +use Illuminate\Bus\PendingBatch; +use Illuminate\Support\Collection; + +class PendingBatchFake extends PendingBatch +{ + /** + * The fake bus instance. + * + * @var \Illuminate\Support\Testing\Fakes\BusFake + */ + protected $bus; + + /** + * Create a new pending batch instance. + * + * @param \Illuminate\Support\Testing\Fakes\BusFake $bus + * @param \Illuminate\Support\Collection $jobs + * @return void + */ + public function __construct(BusFake $bus, Collection $jobs) + { + $this->bus = $bus; + $this->jobs = $jobs; + } + + /** + * Dispatch the batch. + * + * @return \Illuminate\Bus\Batch + */ + public function dispatch() + { + return $this->bus->recordPendingBatch($this); + } + + /** + * Dispatch the batch after the response is sent to the browser. + * + * @return \Illuminate\Bus\Batch + */ + public function dispatchAfterResponse() + { + return $this->bus->recordPendingBatch($this); + } +} diff --git a/vendor/illuminate/support/Testing/Fakes/PendingChainFake.php b/vendor/illuminate/support/Testing/Fakes/PendingChainFake.php new file mode 100644 index 0000000..533c649 --- /dev/null +++ b/vendor/illuminate/support/Testing/Fakes/PendingChainFake.php @@ -0,0 +1,56 @@ +<?php + +namespace Illuminate\Support\Testing\Fakes; + +use Closure; +use Illuminate\Foundation\Bus\PendingChain; +use Illuminate\Queue\CallQueuedClosure; + +class PendingChainFake extends PendingChain +{ + /** + * The fake bus instance. + * + * @var \Illuminate\Support\Testing\Fakes\BusFake + */ + protected $bus; + + /** + * Create a new pending chain instance. + * + * @param \Illuminate\Support\Testing\Fakes\BusFake $bus + * @param mixed $job + * @param array $chain + * @return void + */ + public function __construct(BusFake $bus, $job, $chain) + { + $this->bus = $bus; + $this->job = $job; + $this->chain = $chain; + } + + /** + * Dispatch the job with the given arguments. + * + * @return \Illuminate\Foundation\Bus\PendingDispatch + */ + public function dispatch() + { + if (is_string($this->job)) { + $firstJob = new $this->job(...func_get_args()); + } elseif ($this->job instanceof Closure) { + $firstJob = CallQueuedClosure::create($this->job); + } else { + $firstJob = $this->job; + } + + $firstJob->allOnConnection($this->connection); + $firstJob->allOnQueue($this->queue); + $firstJob->chain($this->chain); + $firstJob->delay($this->delay); + $firstJob->chainCatchCallbacks = $this->catchCallbacks(); + + return $this->bus->dispatch($firstJob); + } +} diff --git a/vendor/illuminate/support/Testing/Fakes/PendingMailFake.php b/vendor/illuminate/support/Testing/Fakes/PendingMailFake.php new file mode 100644 index 0000000..5225130 --- /dev/null +++ b/vendor/illuminate/support/Testing/Fakes/PendingMailFake.php @@ -0,0 +1,42 @@ +<?php + +namespace Illuminate\Support\Testing\Fakes; + +use Illuminate\Contracts\Mail\Mailable; +use Illuminate\Mail\PendingMail; + +class PendingMailFake extends PendingMail +{ + /** + * Create a new instance. + * + * @param \Illuminate\Support\Testing\Fakes\MailFake $mailer + * @return void + */ + public function __construct($mailer) + { + $this->mailer = $mailer; + } + + /** + * Send a new mailable message instance. + * + * @param \Illuminate\Contracts\Mail\Mailable $mailable + * @return void + */ + public function send(Mailable $mailable) + { + $this->mailer->send($this->fill($mailable)); + } + + /** + * Push the given mailable onto the queue. + * + * @param \Illuminate\Contracts\Mail\Mailable $mailable + * @return mixed + */ + public function queue(Mailable $mailable) + { + return $this->mailer->queue($this->fill($mailable)); + } +} diff --git a/vendor/illuminate/support/Testing/Fakes/QueueFake.php b/vendor/illuminate/support/Testing/Fakes/QueueFake.php new file mode 100644 index 0000000..f2caa76 --- /dev/null +++ b/vendor/illuminate/support/Testing/Fakes/QueueFake.php @@ -0,0 +1,503 @@ +<?php + +namespace Illuminate\Support\Testing\Fakes; + +use BadMethodCallException; +use Closure; +use Illuminate\Contracts\Queue\Queue; +use Illuminate\Queue\QueueManager; +use Illuminate\Support\Collection; +use Illuminate\Support\Traits\ReflectsClosures; +use PHPUnit\Framework\Assert as PHPUnit; + +class QueueFake extends QueueManager implements Queue +{ + use ReflectsClosures; + + /** + * The original queue manager. + * + * @var \Illuminate\Contracts\Queue\Queue + */ + protected $queue; + + /** + * The job types that should be intercepted instead of pushed to the queue. + * + * @var \Illuminate\Support\Collection + */ + protected $jobsToFake; + + /** + * The job types that should be pushed to the queue and not intercepted. + * + * @var \Illuminate\Support\Collection + */ + protected $jobsToBeQueued; + + /** + * All of the jobs that have been pushed. + * + * @var array + */ + protected $jobs = []; + + /** + * Create a new fake queue instance. + * + * @param \Illuminate\Contracts\Foundation\Application $app + * @param array $jobsToFake + * @param \Illuminate\Queue\QueueManager|null $queue + * @return void + */ + public function __construct($app, $jobsToFake = [], $queue = null) + { + parent::__construct($app); + + $this->jobsToFake = Collection::wrap($jobsToFake); + $this->jobsToBeQueued = Collection::make(); + $this->queue = $queue; + } + + /** + * Specify the jobs that should be queued instead of faked. + * + * @param array|string $jobsToBeQueued + * @return $this + */ + public function except($jobsToBeQueued) + { + $this->jobsToBeQueued = Collection::wrap($jobsToBeQueued)->merge($this->jobsToBeQueued); + + return $this; + } + + /** + * Assert if a job was pushed based on a truth-test callback. + * + * @param string|\Closure $job + * @param callable|int|null $callback + * @return void + */ + public function assertPushed($job, $callback = null) + { + if ($job instanceof Closure) { + [$job, $callback] = [$this->firstClosureParameterType($job), $job]; + } + + if (is_numeric($callback)) { + return $this->assertPushedTimes($job, $callback); + } + + PHPUnit::assertTrue( + $this->pushed($job, $callback)->count() > 0, + "The expected [{$job}] job was not pushed." + ); + } + + /** + * Assert if a job was pushed a number of times. + * + * @param string $job + * @param int $times + * @return void + */ + protected function assertPushedTimes($job, $times = 1) + { + $count = $this->pushed($job)->count(); + + PHPUnit::assertSame( + $times, $count, + "The expected [{$job}] job was pushed {$count} times instead of {$times} times." + ); + } + + /** + * Assert if a job was pushed based on a truth-test callback. + * + * @param string $queue + * @param string|\Closure $job + * @param callable|null $callback + * @return void + */ + public function assertPushedOn($queue, $job, $callback = null) + { + if ($job instanceof Closure) { + [$job, $callback] = [$this->firstClosureParameterType($job), $job]; + } + + $this->assertPushed($job, function ($job, $pushedQueue) use ($callback, $queue) { + if ($pushedQueue !== $queue) { + return false; + } + + return $callback ? $callback(...func_get_args()) : true; + }); + } + + /** + * Assert if a job was pushed with chained jobs based on a truth-test callback. + * + * @param string $job + * @param array $expectedChain + * @param callable|null $callback + * @return void + */ + public function assertPushedWithChain($job, $expectedChain = [], $callback = null) + { + PHPUnit::assertTrue( + $this->pushed($job, $callback)->isNotEmpty(), + "The expected [{$job}] job was not pushed." + ); + + PHPUnit::assertTrue( + collect($expectedChain)->isNotEmpty(), + 'The expected chain can not be empty.' + ); + + $this->isChainOfObjects($expectedChain) + ? $this->assertPushedWithChainOfObjects($job, $expectedChain, $callback) + : $this->assertPushedWithChainOfClasses($job, $expectedChain, $callback); + } + + /** + * Assert if a job was pushed with an empty chain based on a truth-test callback. + * + * @param string $job + * @param callable|null $callback + * @return void + */ + public function assertPushedWithoutChain($job, $callback = null) + { + PHPUnit::assertTrue( + $this->pushed($job, $callback)->isNotEmpty(), + "The expected [{$job}] job was not pushed." + ); + + $this->assertPushedWithChainOfClasses($job, [], $callback); + } + + /** + * Assert if a job was pushed with chained jobs based on a truth-test callback. + * + * @param string $job + * @param array $expectedChain + * @param callable|null $callback + * @return void + */ + protected function assertPushedWithChainOfObjects($job, $expectedChain, $callback) + { + $chain = collect($expectedChain)->map(fn ($job) => serialize($job))->all(); + + PHPUnit::assertTrue( + $this->pushed($job, $callback)->filter(fn ($job) => $job->chained == $chain)->isNotEmpty(), + 'The expected chain was not pushed.' + ); + } + + /** + * Assert if a job was pushed with chained jobs based on a truth-test callback. + * + * @param string $job + * @param array $expectedChain + * @param callable|null $callback + * @return void + */ + protected function assertPushedWithChainOfClasses($job, $expectedChain, $callback) + { + $matching = $this->pushed($job, $callback)->map->chained->map(function ($chain) { + return collect($chain)->map(function ($job) { + return get_class(unserialize($job)); + }); + })->filter(function ($chain) use ($expectedChain) { + return $chain->all() === $expectedChain; + }); + + PHPUnit::assertTrue( + $matching->isNotEmpty(), 'The expected chain was not pushed.' + ); + } + + /** + * Determine if the given chain is entirely composed of objects. + * + * @param array $chain + * @return bool + */ + protected function isChainOfObjects($chain) + { + return ! collect($chain)->contains(fn ($job) => ! is_object($job)); + } + + /** + * Determine if a job was pushed based on a truth-test callback. + * + * @param string|\Closure $job + * @param callable|null $callback + * @return void + */ + public function assertNotPushed($job, $callback = null) + { + if ($job instanceof Closure) { + [$job, $callback] = [$this->firstClosureParameterType($job), $job]; + } + + PHPUnit::assertCount( + 0, $this->pushed($job, $callback), + "The unexpected [{$job}] job was pushed." + ); + } + + /** + * Assert that no jobs were pushed. + * + * @return void + */ + public function assertNothingPushed() + { + PHPUnit::assertEmpty($this->jobs, 'Jobs were pushed unexpectedly.'); + } + + /** + * Get all of the jobs matching a truth-test callback. + * + * @param string $job + * @param callable|null $callback + * @return \Illuminate\Support\Collection + */ + public function pushed($job, $callback = null) + { + if (! $this->hasPushed($job)) { + return collect(); + } + + $callback = $callback ?: fn () => true; + + return collect($this->jobs[$job])->filter( + fn ($data) => $callback($data['job'], $data['queue'], $data['data']) + )->pluck('job'); + } + + /** + * Determine if there are any stored jobs for a given class. + * + * @param string $job + * @return bool + */ + public function hasPushed($job) + { + return isset($this->jobs[$job]) && ! empty($this->jobs[$job]); + } + + /** + * Resolve a queue connection instance. + * + * @param mixed $value + * @return \Illuminate\Contracts\Queue\Queue + */ + public function connection($value = null) + { + return $this; + } + + /** + * Get the size of the queue. + * + * @param string|null $queue + * @return int + */ + public function size($queue = null) + { + return collect($this->jobs)->flatten(1)->filter( + fn ($job) => $job['queue'] === $queue + )->count(); + } + + /** + * Push a new job onto the queue. + * + * @param string|object $job + * @param mixed $data + * @param string|null $queue + * @return mixed + */ + public function push($job, $data = '', $queue = null) + { + if ($this->shouldFakeJob($job)) { + $this->jobs[is_object($job) ? get_class($job) : $job][] = [ + 'job' => $job, + 'queue' => $queue, + 'data' => $data, + ]; + } else { + is_object($job) && isset($job->connection) + ? $this->queue->connection($job->connection)->push($job, $data, $queue) + : $this->queue->push($job, $data, $queue); + } + } + + /** + * Determine if a job should be faked or actually dispatched. + * + * @param object $job + * @return bool + */ + public function shouldFakeJob($job) + { + if ($this->shouldDispatchJob($job)) { + return false; + } + + if ($this->jobsToFake->isEmpty()) { + return true; + } + + return $this->jobsToFake->contains( + fn ($jobToFake) => $job instanceof ((string) $jobToFake) + ); + } + + /** + * Determine if a job should be pushed to the queue instead of faked. + * + * @param object $job + * @return bool + */ + protected function shouldDispatchJob($job) + { + if ($this->jobsToBeQueued->isEmpty()) { + return false; + } + + return $this->jobsToBeQueued->contains( + fn ($jobToQueue) => $job instanceof ((string) $jobToQueue) + ); + } + + /** + * Push a raw payload onto the queue. + * + * @param string $payload + * @param string|null $queue + * @param array $options + * @return mixed + */ + public function pushRaw($payload, $queue = null, array $options = []) + { + // + } + + /** + * Push a new job onto the queue after (n) seconds. + * + * @param \DateTimeInterface|\DateInterval|int $delay + * @param string|object $job + * @param mixed $data + * @param string|null $queue + * @return mixed + */ + public function later($delay, $job, $data = '', $queue = null) + { + return $this->push($job, $data, $queue); + } + + /** + * Push a new job onto the queue. + * + * @param string $queue + * @param string|object $job + * @param mixed $data + * @return mixed + */ + public function pushOn($queue, $job, $data = '') + { + return $this->push($job, $data, $queue); + } + + /** + * Push a new job onto a specific queue after (n) seconds. + * + * @param string $queue + * @param \DateTimeInterface|\DateInterval|int $delay + * @param string|object $job + * @param mixed $data + * @return mixed + */ + public function laterOn($queue, $delay, $job, $data = '') + { + return $this->push($job, $data, $queue); + } + + /** + * Pop the next job off of the queue. + * + * @param string|null $queue + * @return \Illuminate\Contracts\Queue\Job|null + */ + public function pop($queue = null) + { + // + } + + /** + * Push an array of jobs onto the queue. + * + * @param array $jobs + * @param mixed $data + * @param string|null $queue + * @return mixed + */ + public function bulk($jobs, $data = '', $queue = null) + { + foreach ($jobs as $job) { + $this->push($job, $data, $queue); + } + } + + /** + * Get the jobs that have been pushed. + * + * @return array + */ + public function pushedJobs() + { + return $this->jobs; + } + + /** + * Get the connection name for the queue. + * + * @return string + */ + public function getConnectionName() + { + // + } + + /** + * Set the connection name for the queue. + * + * @param string $name + * @return $this + */ + public function setConnectionName($name) + { + return $this; + } + + /** + * Override the QueueManager to prevent circular dependency. + * + * @param string $method + * @param array $parameters + * @return mixed + * + * @throws \BadMethodCallException + */ + public function __call($method, $parameters) + { + throw new BadMethodCallException(sprintf( + 'Call to undefined method %s::%s()', static::class, $method + )); + } +} diff --git a/vendor/illuminate/support/Timebox.php b/vendor/illuminate/support/Timebox.php new file mode 100644 index 0000000..6e9361a --- /dev/null +++ b/vendor/illuminate/support/Timebox.php @@ -0,0 +1,70 @@ +<?php + +namespace Illuminate\Support; + +class Timebox +{ + /** + * Indicates if the timebox is allowed to return early. + * + * @var bool + */ + public $earlyReturn = false; + + /** + * Invoke the given callback within the specified timebox minimum. + * + * @param callable $callback + * @param int $microseconds + * @return mixed + */ + public function call(callable $callback, int $microseconds) + { + $start = microtime(true); + + $result = $callback($this); + + $remainder = intval($microseconds - ((microtime(true) - $start) * 1000000)); + + if (! $this->earlyReturn && $remainder > 0) { + $this->usleep($remainder); + } + + return $result; + } + + /** + * Indicate that the timebox can return early. + * + * @return $this + */ + public function returnEarly() + { + $this->earlyReturn = true; + + return $this; + } + + /** + * Indicate that the timebox cannot return early. + * + * @return $this + */ + public function dontReturnEarly() + { + $this->earlyReturn = false; + + return $this; + } + + /** + * Sleep for the specified number of microseconds. + * + * @param int $microseconds + * @return void + */ + protected function usleep(int $microseconds) + { + usleep($microseconds); + } +} diff --git a/vendor/illuminate/support/Traits/CapsuleManagerTrait.php b/vendor/illuminate/support/Traits/CapsuleManagerTrait.php new file mode 100644 index 0000000..0532755 --- /dev/null +++ b/vendor/illuminate/support/Traits/CapsuleManagerTrait.php @@ -0,0 +1,69 @@ +<?php + +namespace Illuminate\Support\Traits; + +use Illuminate\Contracts\Container\Container; +use Illuminate\Support\Fluent; + +trait CapsuleManagerTrait +{ + /** + * The current globally used instance. + * + * @var object + */ + protected static $instance; + + /** + * The container instance. + * + * @var \Illuminate\Contracts\Container\Container + */ + protected $container; + + /** + * Setup the IoC container instance. + * + * @param \Illuminate\Contracts\Container\Container $container + * @return void + */ + protected function setupContainer(Container $container) + { + $this->container = $container; + + if (! $this->container->bound('config')) { + $this->container->instance('config', new Fluent); + } + } + + /** + * Make this capsule instance available globally. + * + * @return void + */ + public function setAsGlobal() + { + static::$instance = $this; + } + + /** + * Get the IoC container instance. + * + * @return \Illuminate\Contracts\Container\Container + */ + public function getContainer() + { + return $this->container; + } + + /** + * Set the IoC container instance. + * + * @param \Illuminate\Contracts\Container\Container $container + * @return void + */ + public function setContainer(Container $container) + { + $this->container = $container; + } +} diff --git a/vendor/illuminate/support/Traits/ForwardsCalls.php b/vendor/illuminate/support/Traits/ForwardsCalls.php new file mode 100644 index 0000000..e718180 --- /dev/null +++ b/vendor/illuminate/support/Traits/ForwardsCalls.php @@ -0,0 +1,75 @@ +<?php + +namespace Illuminate\Support\Traits; + +use BadMethodCallException; +use Error; + +trait ForwardsCalls +{ + /** + * Forward a method call to the given object. + * + * @param mixed $object + * @param string $method + * @param array $parameters + * @return mixed + * + * @throws \BadMethodCallException + */ + protected function forwardCallTo($object, $method, $parameters) + { + try { + return $object->{$method}(...$parameters); + } catch (Error|BadMethodCallException $e) { + $pattern = '~^Call to undefined method (?P<class>[^:]+)::(?P<method>[^\(]+)\(\)$~'; + + if (! preg_match($pattern, $e->getMessage(), $matches)) { + throw $e; + } + + if ($matches['class'] != get_class($object) || + $matches['method'] != $method) { + throw $e; + } + + static::throwBadMethodCallException($method); + } + } + + /** + * Forward a method call to the given object, returning $this if the forwarded call returned itself. + * + * @param mixed $object + * @param string $method + * @param array $parameters + * @return mixed + * + * @throws \BadMethodCallException + */ + protected function forwardDecoratedCallTo($object, $method, $parameters) + { + $result = $this->forwardCallTo($object, $method, $parameters); + + if ($result === $object) { + return $this; + } + + return $result; + } + + /** + * Throw a bad method call exception for the given method. + * + * @param string $method + * @return void + * + * @throws \BadMethodCallException + */ + protected static function throwBadMethodCallException($method) + { + throw new BadMethodCallException(sprintf( + 'Call to undefined method %s::%s()', static::class, $method + )); + } +} diff --git a/vendor/illuminate/support/Traits/Localizable.php b/vendor/illuminate/support/Traits/Localizable.php new file mode 100644 index 0000000..1e9fa58 --- /dev/null +++ b/vendor/illuminate/support/Traits/Localizable.php @@ -0,0 +1,34 @@ +<?php + +namespace Illuminate\Support\Traits; + +use Illuminate\Container\Container; + +trait Localizable +{ + /** + * Run the callback with the given locale. + * + * @param string $locale + * @param \Closure $callback + * @return mixed + */ + public function withLocale($locale, $callback) + { + if (! $locale) { + return $callback(); + } + + $app = Container::getInstance(); + + $original = $app->getLocale(); + + try { + $app->setLocale($locale); + + return $callback(); + } finally { + $app->setLocale($original); + } + } +} diff --git a/vendor/illuminate/support/Traits/ReflectsClosures.php b/vendor/illuminate/support/Traits/ReflectsClosures.php new file mode 100644 index 0000000..bf47d7e --- /dev/null +++ b/vendor/illuminate/support/Traits/ReflectsClosures.php @@ -0,0 +1,88 @@ +<?php + +namespace Illuminate\Support\Traits; + +use Closure; +use Illuminate\Support\Reflector; +use ReflectionFunction; +use RuntimeException; + +trait ReflectsClosures +{ + /** + * Get the class name of the first parameter of the given Closure. + * + * @param \Closure $closure + * @return string + * + * @throws \ReflectionException + * @throws \RuntimeException + */ + protected function firstClosureParameterType(Closure $closure) + { + $types = array_values($this->closureParameterTypes($closure)); + + if (! $types) { + throw new RuntimeException('The given Closure has no parameters.'); + } + + if ($types[0] === null) { + throw new RuntimeException('The first parameter of the given Closure is missing a type hint.'); + } + + return $types[0]; + } + + /** + * Get the class names of the first parameter of the given Closure, including union types. + * + * @param \Closure $closure + * @return array + * + * @throws \ReflectionException + * @throws \RuntimeException + */ + protected function firstClosureParameterTypes(Closure $closure) + { + $reflection = new ReflectionFunction($closure); + + $types = collect($reflection->getParameters())->mapWithKeys(function ($parameter) { + if ($parameter->isVariadic()) { + return [$parameter->getName() => null]; + } + + return [$parameter->getName() => Reflector::getParameterClassNames($parameter)]; + })->filter()->values()->all(); + + if (empty($types)) { + throw new RuntimeException('The given Closure has no parameters.'); + } + + if (isset($types[0]) && empty($types[0])) { + throw new RuntimeException('The first parameter of the given Closure is missing a type hint.'); + } + + return $types[0]; + } + + /** + * Get the class names / types of the parameters of the given Closure. + * + * @param \Closure $closure + * @return array + * + * @throws \ReflectionException + */ + protected function closureParameterTypes(Closure $closure) + { + $reflection = new ReflectionFunction($closure); + + return collect($reflection->getParameters())->mapWithKeys(function ($parameter) { + if ($parameter->isVariadic()) { + return [$parameter->getName() => null]; + } + + return [$parameter->getName() => Reflector::getParameterClassName($parameter)]; + })->all(); + } +} diff --git a/vendor/illuminate/support/Traits/Tappable.php b/vendor/illuminate/support/Traits/Tappable.php new file mode 100644 index 0000000..9353451 --- /dev/null +++ b/vendor/illuminate/support/Traits/Tappable.php @@ -0,0 +1,17 @@ +<?php + +namespace Illuminate\Support\Traits; + +trait Tappable +{ + /** + * Call the given Closure with this instance then return the instance. + * + * @param callable|null $callback + * @return $this|\Illuminate\Support\HigherOrderTapProxy + */ + public function tap($callback = null) + { + return tap($this, $callback); + } +} diff --git a/vendor/illuminate/support/ValidatedInput.php b/vendor/illuminate/support/ValidatedInput.php new file mode 100644 index 0000000..87e47b5 --- /dev/null +++ b/vendor/illuminate/support/ValidatedInput.php @@ -0,0 +1,245 @@ +<?php + +namespace Illuminate\Support; + +use ArrayIterator; +use Illuminate\Contracts\Support\ValidatedData; +use stdClass; +use Traversable; + +class ValidatedInput implements ValidatedData +{ + /** + * The underlying input. + * + * @var array + */ + protected $input; + + /** + * Create a new validated input container. + * + * @param array $input + * @return void + */ + public function __construct(array $input) + { + $this->input = $input; + } + + /** + * Determine if the validated input has one or more keys. + * + * @param mixed $keys + * @return bool + */ + public function has($keys) + { + $keys = is_array($keys) ? $keys : func_get_args(); + + foreach ($keys as $key) { + if (! Arr::has($this->input, $key)) { + return false; + } + } + + return true; + } + + /** + * Determine if the validated input is missing one or more keys. + * + * @param mixed $keys + * @return bool + */ + public function missing($keys) + { + return ! $this->has($keys); + } + + /** + * Get a subset containing the provided keys with values from the input data. + * + * @param mixed $keys + * @return array + */ + public function only($keys) + { + $results = []; + + $input = $this->input; + + $placeholder = new stdClass; + + foreach (is_array($keys) ? $keys : func_get_args() as $key) { + $value = data_get($input, $key, $placeholder); + + if ($value !== $placeholder) { + Arr::set($results, $key, $value); + } + } + + return $results; + } + + /** + * Get all of the input except for a specified array of items. + * + * @param mixed $keys + * @return array + */ + public function except($keys) + { + $keys = is_array($keys) ? $keys : func_get_args(); + + $results = $this->input; + + Arr::forget($results, $keys); + + return $results; + } + + /** + * Merge the validated input with the given array of additional data. + * + * @param array $items + * @return static + */ + public function merge(array $items) + { + return new static(array_merge($this->input, $items)); + } + + /** + * Get the input as a collection. + * + * @return \Illuminate\Support\Collection + */ + public function collect() + { + return new Collection($this->input); + } + + /** + * Get the raw, underlying input array. + * + * @return array + */ + public function all() + { + return $this->input; + } + + /** + * Get the instance as an array. + * + * @return array + */ + public function toArray() + { + return $this->all(); + } + + /** + * Dynamically access input data. + * + * @param string $name + * @return mixed + */ + public function __get($name) + { + return $this->input[$name]; + } + + /** + * Dynamically set input data. + * + * @param string $name + * @param mixed $value + * @return mixed + */ + public function __set($name, $value) + { + $this->input[$name] = $value; + } + + /** + * Determine if an input key is set. + * + * @return bool + */ + public function __isset($name) + { + return isset($this->input[$name]); + } + + /** + * Remove an input key. + * + * @param string $name + * @return void + */ + public function __unset($name) + { + unset($this->input[$name]); + } + + /** + * Determine if an item exists at an offset. + * + * @param mixed $key + * @return bool + */ + public function offsetExists($key): bool + { + return isset($this->input[$key]); + } + + /** + * Get an item at a given offset. + * + * @param mixed $key + * @return mixed + */ + public function offsetGet($key): mixed + { + return $this->input[$key]; + } + + /** + * Set the item at a given offset. + * + * @param mixed $key + * @param mixed $value + * @return void + */ + public function offsetSet($key, $value): void + { + if (is_null($key)) { + $this->input[] = $value; + } else { + $this->input[$key] = $value; + } + } + + /** + * Unset the item at a given offset. + * + * @param string $key + * @return void + */ + public function offsetUnset($key): void + { + unset($this->input[$key]); + } + + /** + * Get an iterator for the input. + * + * @return \ArrayIterator + */ + public function getIterator(): Traversable + { + return new ArrayIterator($this->input); + } +} diff --git a/vendor/illuminate/support/ViewErrorBag.php b/vendor/illuminate/support/ViewErrorBag.php new file mode 100644 index 0000000..ff9da4f --- /dev/null +++ b/vendor/illuminate/support/ViewErrorBag.php @@ -0,0 +1,130 @@ +<?php + +namespace Illuminate\Support; + +use Countable; +use Illuminate\Contracts\Support\MessageBag as MessageBagContract; + +/** + * @mixin \Illuminate\Contracts\Support\MessageBag + */ +class ViewErrorBag implements Countable +{ + /** + * The array of the view error bags. + * + * @var array + */ + protected $bags = []; + + /** + * Checks if a named MessageBag exists in the bags. + * + * @param string $key + * @return bool + */ + public function hasBag($key = 'default') + { + return isset($this->bags[$key]); + } + + /** + * Get a MessageBag instance from the bags. + * + * @param string $key + * @return \Illuminate\Contracts\Support\MessageBag + */ + public function getBag($key) + { + return Arr::get($this->bags, $key) ?: new MessageBag; + } + + /** + * Get all the bags. + * + * @return array + */ + public function getBags() + { + return $this->bags; + } + + /** + * Add a new MessageBag instance to the bags. + * + * @param string $key + * @param \Illuminate\Contracts\Support\MessageBag $bag + * @return $this + */ + public function put($key, MessageBagContract $bag) + { + $this->bags[$key] = $bag; + + return $this; + } + + /** + * Determine if the default message bag has any messages. + * + * @return bool + */ + public function any() + { + return $this->count() > 0; + } + + /** + * Get the number of messages in the default bag. + * + * @return int + */ + public function count(): int + { + return $this->getBag('default')->count(); + } + + /** + * Dynamically call methods on the default bag. + * + * @param string $method + * @param array $parameters + * @return mixed + */ + public function __call($method, $parameters) + { + return $this->getBag('default')->$method(...$parameters); + } + + /** + * Dynamically access a view error bag. + * + * @param string $key + * @return \Illuminate\Contracts\Support\MessageBag + */ + public function __get($key) + { + return $this->getBag($key); + } + + /** + * Dynamically set a view error bag. + * + * @param string $key + * @param \Illuminate\Contracts\Support\MessageBag $value + * @return void + */ + public function __set($key, $value) + { + $this->put($key, $value); + } + + /** + * Convert the default bag to its string representation. + * + * @return string + */ + public function __toString() + { + return (string) $this->getBag('default'); + } +} diff --git a/vendor/illuminate/support/composer.json b/vendor/illuminate/support/composer.json new file mode 100644 index 0000000..cc86a27 --- /dev/null +++ b/vendor/illuminate/support/composer.json @@ -0,0 +1,57 @@ +{ + "name": "illuminate/support", + "description": "The Illuminate Support package.", + "license": "MIT", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "require": { + "php": "^8.0.2", + "ext-json": "*", + "ext-mbstring": "*", + "doctrine/inflector": "^2.0", + "illuminate/collections": "^9.0", + "illuminate/conditionable": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/macroable": "^9.0", + "nesbot/carbon": "^2.62.1", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + }, + "files": [ + "helpers.php" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "suggest": { + "illuminate/filesystem": "Required to use the composer class (^9.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.0.2).", + "ramsey/uuid": "Required to use Str::uuid() (^4.7).", + "symfony/process": "Required to use the composer class (^6.0).", + "symfony/uid": "Required to use Str::ulid() (^6.0).", + "symfony/var-dumper": "Required to use the dd function (^6.0).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.4.1)." + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev" +} diff --git a/vendor/illuminate/support/helpers.php b/vendor/illuminate/support/helpers.php new file mode 100755 index 0000000..2e62e14 --- /dev/null +++ b/vendor/illuminate/support/helpers.php @@ -0,0 +1,424 @@ +<?php + +use Illuminate\Contracts\Support\DeferringDisplayableValue; +use Illuminate\Contracts\Support\Htmlable; +use Illuminate\Support\Arr; +use Illuminate\Support\Env; +use Illuminate\Support\HigherOrderTapProxy; +use Illuminate\Support\Optional; +use Illuminate\Support\Str; + +if (! function_exists('append_config')) { + /** + * Assign high numeric IDs to a config item to force appending. + * + * @param array $array + * @return array + */ + function append_config(array $array) + { + $start = 9999; + + foreach ($array as $key => $value) { + if (is_numeric($key)) { + $start++; + + $array[$start] = Arr::pull($array, $key); + } + } + + return $array; + } +} + +if (! function_exists('blank')) { + /** + * Determine if the given value is "blank". + * + * @param mixed $value + * @return bool + */ + function blank($value) + { + if (is_null($value)) { + return true; + } + + if (is_string($value)) { + return trim($value) === ''; + } + + if (is_numeric($value) || is_bool($value)) { + return false; + } + + if ($value instanceof Countable) { + return count($value) === 0; + } + + return empty($value); + } +} + +if (! function_exists('class_basename')) { + /** + * Get the class "basename" of the given object / class. + * + * @param string|object $class + * @return string + */ + function class_basename($class) + { + $class = is_object($class) ? get_class($class) : $class; + + return basename(str_replace('\\', '/', $class)); + } +} + +if (! function_exists('class_uses_recursive')) { + /** + * Returns all traits used by a class, its parent classes and trait of their traits. + * + * @param object|string $class + * @return array + */ + function class_uses_recursive($class) + { + if (is_object($class)) { + $class = get_class($class); + } + + $results = []; + + foreach (array_reverse(class_parents($class)) + [$class => $class] as $class) { + $results += trait_uses_recursive($class); + } + + return array_unique($results); + } +} + +if (! function_exists('e')) { + /** + * Encode HTML special characters in a string. + * + * @param \Illuminate\Contracts\Support\DeferringDisplayableValue|\Illuminate\Contracts\Support\Htmlable|\BackedEnum|string|null $value + * @param bool $doubleEncode + * @return string + */ + function e($value, $doubleEncode = true) + { + if ($value instanceof DeferringDisplayableValue) { + $value = $value->resolveDisplayableValue(); + } + + if ($value instanceof Htmlable) { + return $value->toHtml(); + } + + if ($value instanceof BackedEnum) { + $value = $value->value; + } + + return htmlspecialchars($value ?? '', ENT_QUOTES, 'UTF-8', $doubleEncode); + } +} + +if (! function_exists('env')) { + /** + * Gets the value of an environment variable. + * + * @param string $key + * @param mixed $default + * @return mixed + */ + function env($key, $default = null) + { + return Env::get($key, $default); + } +} + +if (! function_exists('filled')) { + /** + * Determine if a value is "filled". + * + * @param mixed $value + * @return bool + */ + function filled($value) + { + return ! blank($value); + } +} + +if (! function_exists('object_get')) { + /** + * Get an item from an object using "dot" notation. + * + * @param object $object + * @param string|null $key + * @param mixed $default + * @return mixed + */ + function object_get($object, $key, $default = null) + { + if (is_null($key) || trim($key) === '') { + return $object; + } + + foreach (explode('.', $key) as $segment) { + if (! is_object($object) || ! isset($object->{$segment})) { + return value($default); + } + + $object = $object->{$segment}; + } + + return $object; + } +} + +if (! function_exists('optional')) { + /** + * Provide access to optional objects. + * + * @param mixed $value + * @param callable|null $callback + * @return mixed + */ + function optional($value = null, callable $callback = null) + { + if (is_null($callback)) { + return new Optional($value); + } elseif (! is_null($value)) { + return $callback($value); + } + } +} + +if (! function_exists('preg_replace_array')) { + /** + * Replace a given pattern with each value in the array in sequentially. + * + * @param string $pattern + * @param array $replacements + * @param string $subject + * @return string + */ + function preg_replace_array($pattern, array $replacements, $subject) + { + return preg_replace_callback($pattern, function () use (&$replacements) { + foreach ($replacements as $value) { + return array_shift($replacements); + } + }, $subject); + } +} + +if (! function_exists('retry')) { + /** + * Retry an operation a given number of times. + * + * @param int|array $times + * @param callable $callback + * @param int|\Closure $sleepMilliseconds + * @param callable|null $when + * @return mixed + * + * @throws \Exception + */ + function retry($times, callable $callback, $sleepMilliseconds = 0, $when = null) + { + $attempts = 0; + + $backoff = []; + + if (is_array($times)) { + $backoff = $times; + + $times = count($times) + 1; + } + + beginning: + $attempts++; + $times--; + + try { + return $callback($attempts); + } catch (Exception $e) { + if ($times < 1 || ($when && ! $when($e))) { + throw $e; + } + + $sleepMilliseconds = $backoff[$attempts - 1] ?? $sleepMilliseconds; + + if ($sleepMilliseconds) { + usleep(value($sleepMilliseconds, $attempts, $e) * 1000); + } + + goto beginning; + } + } +} + +if (! function_exists('str')) { + /** + * Get a new stringable object from the given string. + * + * @param string|null $string + * @return \Illuminate\Support\Stringable|mixed + */ + function str($string = null) + { + if (func_num_args() === 0) { + return new class + { + public function __call($method, $parameters) + { + return Str::$method(...$parameters); + } + + public function __toString() + { + return ''; + } + }; + } + + return Str::of($string); + } +} + +if (! function_exists('tap')) { + /** + * Call the given Closure with the given value then return the value. + * + * @param mixed $value + * @param callable|null $callback + * @return mixed + */ + function tap($value, $callback = null) + { + if (is_null($callback)) { + return new HigherOrderTapProxy($value); + } + + $callback($value); + + return $value; + } +} + +if (! function_exists('throw_if')) { + /** + * Throw the given exception if the given condition is true. + * + * @param mixed $condition + * @param \Throwable|string $exception + * @param mixed ...$parameters + * @return mixed + * + * @throws \Throwable + */ + function throw_if($condition, $exception = 'RuntimeException', ...$parameters) + { + if ($condition) { + if (is_string($exception) && class_exists($exception)) { + $exception = new $exception(...$parameters); + } + + throw is_string($exception) ? new RuntimeException($exception) : $exception; + } + + return $condition; + } +} + +if (! function_exists('throw_unless')) { + /** + * Throw the given exception unless the given condition is true. + * + * @param mixed $condition + * @param \Throwable|string $exception + * @param mixed ...$parameters + * @return mixed + * + * @throws \Throwable + */ + function throw_unless($condition, $exception = 'RuntimeException', ...$parameters) + { + throw_if(! $condition, $exception, ...$parameters); + + return $condition; + } +} + +if (! function_exists('trait_uses_recursive')) { + /** + * Returns all traits used by a trait and its traits. + * + * @param string $trait + * @return array + */ + function trait_uses_recursive($trait) + { + $traits = class_uses($trait) ?: []; + + foreach ($traits as $trait) { + $traits += trait_uses_recursive($trait); + } + + return $traits; + } +} + +if (! function_exists('transform')) { + /** + * Transform the given value if it is present. + * + * @param mixed $value + * @param callable $callback + * @param mixed $default + * @return mixed|null + */ + function transform($value, callable $callback, $default = null) + { + if (filled($value)) { + return $callback($value); + } + + if (is_callable($default)) { + return $default($value); + } + + return $default; + } +} + +if (! function_exists('windows_os')) { + /** + * Determine whether the current environment is Windows based. + * + * @return bool + */ + function windows_os() + { + return PHP_OS_FAMILY === 'Windows'; + } +} + +if (! function_exists('with')) { + /** + * Return the given value, optionally passed through the given callback. + * + * @template TValue + * + * @param TValue $value + * @param (callable(TValue): TValue)|null $callback + * @return TValue + */ + function with($value, callable $callback = null) + { + return is_null($callback) ? $value : $callback($value); + } +} diff --git a/vendor/monolog/monolog/CHANGELOG.md b/vendor/monolog/monolog/CHANGELOG.md new file mode 100644 index 0000000..7f9db2b --- /dev/null +++ b/vendor/monolog/monolog/CHANGELOG.md @@ -0,0 +1,608 @@ +### 2.8.0 (2022-07-24) + + * Deprecated `CubeHandler` and `PHPConsoleHandler` as both projects are abandoned and those should not be used anymore (#1734) + * Added RFC 5424 level (`7` to `0`) support to `Logger::log` and `Logger::addRecord` to increase interoperability (#1723) + * Added support for `__toString` for objects which are not json serializable in `JsonFormatter` (#1733) + * Added `GoogleCloudLoggingFormatter` (#1719) + * Added support for Predis 2.x (#1732) + * Added `AmqpHandler->setExtraAttributes` to allow configuring attributes when using an AMQPExchange (#1724) + * Fixed serialization/unserialization of handlers to make sure private properties are included (#1727) + * Fixed allowInlineLineBreaks in LineFormatter causing issues with windows paths containing `\n` or `\r` sequences (#1720) + * Fixed max normalization depth not being taken into account when formatting exceptions with a deep chain of previous exceptions (#1726) + * Fixed PHP 8.2 deprecation warnings (#1722) + * Fixed rare race condition or filesystem issue where StreamHandler is unable to create the directory the log should go into yet it exists already (#1678) + +### 2.7.0 (2022-06-09) + + * Added `$datetime` parameter to `Logger::addRecord` as low level API to allow logging into the past or future (#1682) + * Added `Logger::useLoggingLoopDetection` to allow disabling cyclic logging detection in concurrent frameworks (#1681) + * Fixed handling of fatal errors if callPrevious is disabled in ErrorHandler (#1670) + * Marked the reusable `Monolog\Test\TestCase` class as `@internal` to make sure PHPStorm does not show it above PHPUnit, you may still use it to test your own handlers/etc though (#1677) + * Fixed RotatingFileHandler issue when the date format contained slashes (#1671) + +### 2.6.0 (2022-05-10) + + * Deprecated `SwiftMailerHandler`, use `SymfonyMailerHandler` instead + * Added `SymfonyMailerHandler` (#1663) + * Added ElasticSearch 8.x support to the ElasticsearchHandler (#1662) + * Added a way to filter/modify stack traces in LineFormatter (#1665) + * Fixed UdpSocket not being able to reopen/reconnect after close() + * Fixed infinite loops if a Handler is triggering logging while handling log records + +### 2.5.0 (2022-04-08) + + * Added `callType` to IntrospectionProcessor (#1612) + * Fixed AsMonologProcessor syntax to be compatible with PHP 7.2 (#1651) + +### 2.4.0 (2022-03-14) + + * Added [`Monolog\LogRecord`](src/Monolog/LogRecord.php) interface that can be used to type-hint records like `array|\Monolog\LogRecord $record` to be forward compatible with the upcoming Monolog 3 changes + * Added `includeStacktraces` constructor params to LineFormatter & JsonFormatter (#1603) + * Added `persistent`, `timeout`, `writingTimeout`, `connectionTimeout`, `chunkSize` constructor params to SocketHandler and derivatives (#1600) + * Added `AsMonologProcessor` PHP attribute which can help autowiring / autoconfiguration of processors if frameworks / integrations decide to make use of it. This is useless when used purely with Monolog (#1637) + * Added support for keeping native BSON types as is in MongoDBFormatter (#1620) + * Added support for a `user_agent` key in WebProcessor, disabled by default but you can use it by configuring the $extraFields you want (#1613) + * Added support for username/userIcon in SlackWebhookHandler (#1617) + * Added extension points to BrowserConsoleHandler (#1593) + * Added record message/context/extra info to exceptions thrown when a StreamHandler cannot open its stream to avoid completely losing the data logged (#1630) + * Fixed error handler signature to accept a null $context which happens with internal PHP errors (#1614) + * Fixed a few setter methods not returning `self` (#1609) + * Fixed handling of records going over the max Telegram message length (#1616) + +### 2.3.5 (2021-10-01) + + * Fixed regression in StreamHandler since 2.3.3 on systems with the memory_limit set to >=20GB (#1592) + +### 2.3.4 (2021-09-15) + + * Fixed support for psr/log 3.x (#1589) + +### 2.3.3 (2021-09-14) + + * Fixed memory usage when using StreamHandler and calling stream_get_contents on the resource you passed to it (#1578, #1577) + * Fixed support for psr/log 2.x (#1587) + * Fixed some type annotations + +### 2.3.2 (2021-07-23) + + * Fixed compatibility with PHP 7.2 - 7.4 when experiencing PCRE errors (#1568) + +### 2.3.1 (2021-07-14) + + * Fixed Utils::getClass handling of anonymous classes not being fully compatible with PHP 8 (#1563) + * Fixed some `@inheritDoc` annotations having the wrong case + +### 2.3.0 (2021-07-05) + + * Added a ton of PHPStan type annotations as well as type aliases on Monolog\Logger for Record, Level and LevelName that you can import (#1557) + * Added ability to customize date format when using JsonFormatter (#1561) + * Fixed FilterHandler not calling reset on its internal handler when reset() is called on it (#1531) + * Fixed SyslogUdpHandler not setting the timezone correctly on DateTimeImmutable instances (#1540) + * Fixed StreamHandler thread safety - chunk size set to 2GB now to avoid interlacing when doing concurrent writes (#1553) + +### 2.2.0 (2020-12-14) + + * Added JSON_PARTIAL_OUTPUT_ON_ERROR to default json encoding flags, to avoid dropping entire context data or even records due to an invalid subset of it somewhere + * Added setDateFormat to NormalizerFormatter (and Line/Json formatters by extension) to allow changing this after object creation + * Added RedisPubSubHandler to log records to a Redis channel using PUBLISH + * Added support for Elastica 7, and deprecated the $type argument of ElasticaFormatter which is not in use anymore as of Elastica 7 + * Added support for millisecond write timeouts in SocketHandler, you can now pass floats to setWritingTimeout, e.g. 0.2 is 200ms + * Added support for unix sockets in SyslogUdpHandler (set $port to 0 to make the $host a unix socket) + * Added handleBatch support for TelegramBotHandler + * Added RFC5424e extended date format including milliseconds to SyslogUdpHandler + * Added support for configuring handlers with numeric level values in strings (coming from e.g. env vars) + * Fixed Wildfire/FirePHP/ChromePHP handling of unicode characters + * Fixed PHP 8 issues in SyslogUdpHandler + * Fixed internal type error when mbstring is missing + +### 2.1.1 (2020-07-23) + + * Fixed removing of json encoding options + * Fixed type hint of $level not accepting strings in SendGridHandler and OverflowHandler + * Fixed SwiftMailerHandler not accepting email templates with an empty subject + * Fixed array access on null in RavenHandler + * Fixed unique_id in WebProcessor not being disableable + +### 2.1.0 (2020-05-22) + + * Added `JSON_INVALID_UTF8_SUBSTITUTE` to default json flags, so that invalid UTF8 characters now get converted to [�](https://en.wikipedia.org/wiki/Specials_(Unicode_block)#Replacement_character) instead of being converted from ISO-8859-15 to UTF8 as it was before, which was hardly a comprehensive solution + * Added `$ignoreEmptyContextAndExtra` option to JsonFormatter to skip empty context/extra entirely from the output + * Added `$parseMode`, `$disableWebPagePreview` and `$disableNotification` options to TelegramBotHandler + * Added tentative support for PHP 8 + * NormalizerFormatter::addJsonEncodeOption and removeJsonEncodeOption are now public to allow modifying default json flags + * Fixed GitProcessor type error when there is no git repo present + * Fixed normalization of SoapFault objects containing deeply nested objects as "detail" + * Fixed support for relative paths in RotatingFileHandler + +### 2.0.2 (2019-12-20) + + * Fixed ElasticsearchHandler swallowing exceptions details when failing to index log records + * Fixed normalization of SoapFault objects containing non-strings as "detail" in LineFormatter + * Fixed formatting of resources in JsonFormatter + * Fixed RedisHandler failing to use MULTI properly when passed a proxied Redis instance (e.g. in Symfony with lazy services) + * Fixed FilterHandler triggering a notice when handleBatch was filtering all records passed to it + * Fixed Turkish locale messing up the conversion of level names to their constant values + +### 2.0.1 (2019-11-13) + + * Fixed normalization of Traversables to avoid traversing them as not all of them are rewindable + * Fixed setFormatter/getFormatter to forward to the nested handler in FilterHandler, FingersCrossedHandler, BufferHandler, OverflowHandler and SamplingHandler + * Fixed BrowserConsoleHandler formatting when using multiple styles + * Fixed normalization of exception codes to be always integers even for PDOException which have them as numeric strings + * Fixed normalization of SoapFault objects containing non-strings as "detail" + * Fixed json encoding across all handlers to always attempt recovery of non-UTF-8 strings instead of failing the whole encoding + * Fixed ChromePHPHandler to avoid sending more data than latest Chrome versions allow in headers (4KB down from 256KB). + * Fixed type error in BrowserConsoleHandler when the context array of log records was not associative. + +### 2.0.0 (2019-08-30) + + * BC Break: This is a major release, see [UPGRADE.md](UPGRADE.md) for details if you are coming from a 1.x release + * BC Break: Logger methods log/debug/info/notice/warning/error/critical/alert/emergency now have explicit void return types + * Added FallbackGroupHandler which works like the WhatFailureGroupHandler but stops dispatching log records as soon as one handler accepted it + * Fixed support for UTF-8 when cutting strings to avoid cutting a multibyte-character in half + * Fixed normalizers handling of exception backtraces to avoid serializing arguments in some cases + * Fixed date timezone handling in SyslogUdpHandler + +### 2.0.0-beta2 (2019-07-06) + + * BC Break: This is a major release, see [UPGRADE.md](UPGRADE.md) for details if you are coming from a 1.x release + * BC Break: PHP 7.2 is now the minimum required PHP version. + * BC Break: Removed SlackbotHandler, RavenHandler and HipChatHandler, see [UPGRADE.md](UPGRADE.md) for details + * Added OverflowHandler which will only flush log records to its nested handler when reaching a certain amount of logs (i.e. only pass through when things go really bad) + * Added TelegramBotHandler to log records to a [Telegram](https://core.telegram.org/bots/api) bot account + * Added support for JsonSerializable when normalizing exceptions + * Added support for RFC3164 (outdated BSD syslog protocol) to SyslogUdpHandler + * Added SoapFault details to formatted exceptions + * Fixed DeduplicationHandler silently failing to start when file could not be opened + * Fixed issue in GroupHandler and WhatFailureGroupHandler where setting multiple processors would duplicate records + * Fixed GelfFormatter losing some data when one attachment was too long + * Fixed issue in SignalHandler restarting syscalls functionality + * Improved performance of LogglyHandler when sending multiple logs in a single request + +### 2.0.0-beta1 (2018-12-08) + + * BC Break: This is a major release, see [UPGRADE.md](UPGRADE.md) for details if you are coming from a 1.x release + * BC Break: PHP 7.1 is now the minimum required PHP version. + * BC Break: Quite a few interface changes, only relevant if you implemented your own handlers/processors/formatters + * BC Break: Removed non-PSR-3 methods to add records, all the `add*` (e.g. `addWarning`) methods as well as `emerg`, `crit`, `err` and `warn` + * BC Break: The record timezone is now set per Logger instance and not statically anymore + * BC Break: There is no more default handler configured on empty Logger instances + * BC Break: ElasticSearchHandler renamed to ElasticaHandler + * BC Break: Various handler-specific breaks, see [UPGRADE.md](UPGRADE.md) for details + * Added scalar type hints and return hints in all the places it was possible. Switched strict_types on for more reliability. + * Added DateTimeImmutable support, all record datetime are now immutable, and will toString/json serialize with the correct date format, including microseconds (unless disabled) + * Added timezone and microseconds to the default date format + * Added SendGridHandler to use the SendGrid API to send emails + * Added LogmaticHandler to use the Logmatic.io API to store log records + * Added SqsHandler to send log records to an AWS SQS queue + * Added ElasticsearchHandler to send records via the official ES library. Elastica users should now use ElasticaHandler instead of ElasticSearchHandler + * Added NoopHandler which is similar to the NullHandle but does not prevent the bubbling of log records to handlers further down the configuration, useful for temporarily disabling a handler in configuration files + * Added ProcessHandler to write log output to the STDIN of a given process + * Added HostnameProcessor that adds the machine's hostname to log records + * Added a `$dateFormat` option to the PsrLogMessageProcessor which lets you format DateTime instances nicely + * Added support for the PHP 7.x `mongodb` extension in the MongoDBHandler + * Fixed many minor issues in various handlers, and probably added a few regressions too + +### 1.26.1 (2021-05-28) + + * Fixed PHP 8.1 deprecation warning + +### 1.26.0 (2020-12-14) + + * Added $dateFormat and $removeUsedContextFields arguments to PsrLogMessageProcessor (backport from 2.x) + +### 1.25.5 (2020-07-23) + + * Fixed array access on null in RavenHandler + * Fixed unique_id in WebProcessor not being disableable + +### 1.25.4 (2020-05-22) + + * Fixed GitProcessor type error when there is no git repo present + * Fixed normalization of SoapFault objects containing deeply nested objects as "detail" + * Fixed support for relative paths in RotatingFileHandler + +### 1.25.3 (2019-12-20) + + * Fixed formatting of resources in JsonFormatter + * Fixed RedisHandler failing to use MULTI properly when passed a proxied Redis instance (e.g. in Symfony with lazy services) + * Fixed FilterHandler triggering a notice when handleBatch was filtering all records passed to it + * Fixed Turkish locale messing up the conversion of level names to their constant values + +### 1.25.2 (2019-11-13) + + * Fixed normalization of Traversables to avoid traversing them as not all of them are rewindable + * Fixed setFormatter/getFormatter to forward to the nested handler in FilterHandler, FingersCrossedHandler, BufferHandler and SamplingHandler + * Fixed BrowserConsoleHandler formatting when using multiple styles + * Fixed normalization of exception codes to be always integers even for PDOException which have them as numeric strings + * Fixed normalization of SoapFault objects containing non-strings as "detail" + * Fixed json encoding across all handlers to always attempt recovery of non-UTF-8 strings instead of failing the whole encoding + +### 1.25.1 (2019-09-06) + + * Fixed forward-compatible interfaces to be compatible with Monolog 1.x too. + +### 1.25.0 (2019-09-06) + + * Deprecated SlackbotHandler, use SlackWebhookHandler or SlackHandler instead + * Deprecated RavenHandler, use sentry/sentry 2.x and their Sentry\Monolog\Handler instead + * Deprecated HipChatHandler, migrate to Slack and use SlackWebhookHandler or SlackHandler instead + * Added forward-compatible interfaces and traits FormattableHandlerInterface, FormattableHandlerTrait, ProcessableHandlerInterface, ProcessableHandlerTrait. If you use modern PHP and want to make code compatible with Monolog 1 and 2 this can help. You will have to require at least Monolog 1.25 though. + * Added support for RFC3164 (outdated BSD syslog protocol) to SyslogUdpHandler + * Fixed issue in GroupHandler and WhatFailureGroupHandler where setting multiple processors would duplicate records + * Fixed issue in SignalHandler restarting syscalls functionality + * Fixed normalizers handling of exception backtraces to avoid serializing arguments in some cases + * Fixed ZendMonitorHandler to work with the latest Zend Server versions + * Fixed ChromePHPHandler to avoid sending more data than latest Chrome versions allow in headers (4KB down from 256KB). + +### 1.24.0 (2018-11-05) + + * BC Notice: If you are extending any of the Monolog's Formatters' `normalize` method, make sure you add the new `$depth = 0` argument to your function signature to avoid strict PHP warnings. + * Added a `ResettableInterface` in order to reset/reset/clear/flush handlers and processors + * Added a `ProcessorInterface` as an optional way to label a class as being a processor (mostly useful for autowiring dependency containers) + * Added a way to log signals being received using Monolog\SignalHandler + * Added ability to customize error handling at the Logger level using Logger::setExceptionHandler + * Added InsightOpsHandler to migrate users of the LogEntriesHandler + * Added protection to NormalizerFormatter against circular and very deep structures, it now stops normalizing at a depth of 9 + * Added capture of stack traces to ErrorHandler when logging PHP errors + * Added RavenHandler support for a `contexts` context or extra key to forward that to Sentry's contexts + * Added forwarding of context info to FluentdFormatter + * Added SocketHandler::setChunkSize to override the default chunk size in case you must send large log lines to rsyslog for example + * Added ability to extend/override BrowserConsoleHandler + * Added SlackWebhookHandler::getWebhookUrl and SlackHandler::getToken to enable class extensibility + * Added SwiftMailerHandler::getSubjectFormatter to enable class extensibility + * Dropped official support for HHVM in test builds + * Fixed normalization of exception traces when call_user_func is used to avoid serializing objects and the data they contain + * Fixed naming of fields in Slack handler, all field names are now capitalized in all cases + * Fixed HipChatHandler bug where slack dropped messages randomly + * Fixed normalization of objects in Slack handlers + * Fixed support for PHP7's Throwable in NewRelicHandler + * Fixed race bug when StreamHandler sometimes incorrectly reported it failed to create a directory + * Fixed table row styling issues in HtmlFormatter + * Fixed RavenHandler dropping the message when logging exception + * Fixed WhatFailureGroupHandler skipping processors when using handleBatch + and implement it where possible + * Fixed display of anonymous class names + +### 1.23.0 (2017-06-19) + + * Improved SyslogUdpHandler's support for RFC5424 and added optional `$ident` argument + * Fixed GelfHandler truncation to be per field and not per message + * Fixed compatibility issue with PHP <5.3.6 + * Fixed support for headless Chrome in ChromePHPHandler + * Fixed support for latest Aws SDK in DynamoDbHandler + * Fixed support for SwiftMailer 6.0+ in SwiftMailerHandler + +### 1.22.1 (2017-03-13) + + * Fixed lots of minor issues in the new Slack integrations + * Fixed support for allowInlineLineBreaks in LineFormatter when formatting exception backtraces + +### 1.22.0 (2016-11-26) + + * Added SlackbotHandler and SlackWebhookHandler to set up Slack integration more easily + * Added MercurialProcessor to add mercurial revision and branch names to log records + * Added support for AWS SDK v3 in DynamoDbHandler + * Fixed fatal errors occurring when normalizing generators that have been fully consumed + * Fixed RollbarHandler to include a level (rollbar level), monolog_level (original name), channel and datetime (unix) + * Fixed RollbarHandler not flushing records automatically, calling close() explicitly is not necessary anymore + * Fixed SyslogUdpHandler to avoid sending empty frames + * Fixed a few PHP 7.0 and 7.1 compatibility issues + +### 1.21.0 (2016-07-29) + + * Break: Reverted the addition of $context when the ErrorHandler handles regular php errors from 1.20.0 as it was causing issues + * Added support for more formats in RotatingFileHandler::setFilenameFormat as long as they have Y, m and d in order + * Added ability to format the main line of text the SlackHandler sends by explicitly setting a formatter on the handler + * Added information about SoapFault instances in NormalizerFormatter + * Added $handleOnlyReportedErrors option on ErrorHandler::registerErrorHandler (default true) to allow logging of all errors no matter the error_reporting level + +### 1.20.0 (2016-07-02) + + * Added FingersCrossedHandler::activate() to manually trigger the handler regardless of the activation policy + * Added StreamHandler::getUrl to retrieve the stream's URL + * Added ability to override addRow/addTitle in HtmlFormatter + * Added the $context to context information when the ErrorHandler handles a regular php error + * Deprecated RotatingFileHandler::setFilenameFormat to only support 3 formats: Y, Y-m and Y-m-d + * Fixed WhatFailureGroupHandler to work with PHP7 throwables + * Fixed a few minor bugs + +### 1.19.0 (2016-04-12) + + * Break: StreamHandler will not close streams automatically that it does not own. If you pass in a stream (not a path/url), then it will not close it for you. You can retrieve those using getStream() if needed + * Added DeduplicationHandler to remove duplicate records from notifications across multiple requests, useful for email or other notifications on errors + * Added ability to use `%message%` and other LineFormatter replacements in the subject line of emails sent with NativeMailHandler and SwiftMailerHandler + * Fixed HipChatHandler handling of long messages + +### 1.18.2 (2016-04-02) + + * Fixed ElasticaFormatter to use more precise dates + * Fixed GelfMessageFormatter sending too long messages + +### 1.18.1 (2016-03-13) + + * Fixed SlackHandler bug where slack dropped messages randomly + * Fixed RedisHandler issue when using with the PHPRedis extension + * Fixed AmqpHandler content-type being incorrectly set when using with the AMQP extension + * Fixed BrowserConsoleHandler regression + +### 1.18.0 (2016-03-01) + + * Added optional reduction of timestamp precision via `Logger->useMicrosecondTimestamps(false)`, disabling it gets you a bit of performance boost but reduces the precision to the second instead of microsecond + * Added possibility to skip some extra stack frames in IntrospectionProcessor if you have some library wrapping Monolog that is always adding frames + * Added `Logger->withName` to clone a logger (keeping all handlers) with a new name + * Added FluentdFormatter for the Fluentd unix socket protocol + * Added HandlerWrapper base class to ease the creation of handler wrappers, just extend it and override as needed + * Added support for replacing context sub-keys using `%context.*%` in LineFormatter + * Added support for `payload` context value in RollbarHandler + * Added setRelease to RavenHandler to describe the application version, sent with every log + * Added support for `fingerprint` context value in RavenHandler + * Fixed JSON encoding errors that would gobble up the whole log record, we now handle those more gracefully by dropping chars as needed + * Fixed write timeouts in SocketHandler and derivatives, set to 10sec by default, lower it with `setWritingTimeout()` + * Fixed PHP7 compatibility with regard to Exception/Throwable handling in a few places + +### 1.17.2 (2015-10-14) + + * Fixed ErrorHandler compatibility with non-Monolog PSR-3 loggers + * Fixed SlackHandler handling to use slack functionalities better + * Fixed SwiftMailerHandler bug when sending multiple emails they all had the same id + * Fixed 5.3 compatibility regression + +### 1.17.1 (2015-08-31) + + * Fixed RollbarHandler triggering PHP notices + +### 1.17.0 (2015-08-30) + + * Added support for `checksum` and `release` context/extra values in RavenHandler + * Added better support for exceptions in RollbarHandler + * Added UidProcessor::getUid + * Added support for showing the resource type in NormalizedFormatter + * Fixed IntrospectionProcessor triggering PHP notices + +### 1.16.0 (2015-08-09) + + * Added IFTTTHandler to notify ifttt.com triggers + * Added Logger::setHandlers() to allow setting/replacing all handlers + * Added $capSize in RedisHandler to cap the log size + * Fixed StreamHandler creation of directory to only trigger when the first log write happens + * Fixed bug in the handling of curl failures + * Fixed duplicate logging of fatal errors when both error and fatal error handlers are registered in monolog's ErrorHandler + * Fixed missing fatal errors records with handlers that need to be closed to flush log records + * Fixed TagProcessor::addTags support for associative arrays + +### 1.15.0 (2015-07-12) + + * Added addTags and setTags methods to change a TagProcessor + * Added automatic creation of directories if they are missing for a StreamHandler to open a log file + * Added retry functionality to Loggly, Cube and Mandrill handlers so they retry up to 5 times in case of network failure + * Fixed process exit code being incorrectly reset to 0 if ErrorHandler::registerExceptionHandler was used + * Fixed HTML/JS escaping in BrowserConsoleHandler + * Fixed JSON encoding errors being silently suppressed (PHP 5.5+ only) + +### 1.14.0 (2015-06-19) + + * Added PHPConsoleHandler to send record to Chrome's PHP Console extension and library + * Added support for objects implementing __toString in the NormalizerFormatter + * Added support for HipChat's v2 API in HipChatHandler + * Added Logger::setTimezone() to initialize the timezone monolog should use in case date.timezone isn't correct for your app + * Added an option to send formatted message instead of the raw record on PushoverHandler via ->useFormattedMessage(true) + * Fixed curl errors being silently suppressed + +### 1.13.1 (2015-03-09) + + * Fixed regression in HipChat requiring a new token to be created + +### 1.13.0 (2015-03-05) + + * Added Registry::hasLogger to check for the presence of a logger instance + * Added context.user support to RavenHandler + * Added HipChat API v2 support in the HipChatHandler + * Added NativeMailerHandler::addParameter to pass params to the mail() process + * Added context data to SlackHandler when $includeContextAndExtra is true + * Added ability to customize the Swift_Message per-email in SwiftMailerHandler + * Fixed SwiftMailerHandler to lazily create message instances if a callback is provided + * Fixed serialization of INF and NaN values in Normalizer and LineFormatter + +### 1.12.0 (2014-12-29) + + * Break: HandlerInterface::isHandling now receives a partial record containing only a level key. This was always the intent and does not break any Monolog handler but is strictly speaking a BC break and you should check if you relied on any other field in your own handlers. + * Added PsrHandler to forward records to another PSR-3 logger + * Added SamplingHandler to wrap around a handler and include only every Nth record + * Added MongoDBFormatter to support better storage with MongoDBHandler (it must be enabled manually for now) + * Added exception codes in the output of most formatters + * Added LineFormatter::includeStacktraces to enable exception stack traces in logs (uses more than one line) + * Added $useShortAttachment to SlackHandler to minify attachment size and $includeExtra to append extra data + * Added $host to HipChatHandler for users of private instances + * Added $transactionName to NewRelicHandler and support for a transaction_name context value + * Fixed MandrillHandler to avoid outputting API call responses + * Fixed some non-standard behaviors in SyslogUdpHandler + +### 1.11.0 (2014-09-30) + + * Break: The NewRelicHandler extra and context data are now prefixed with extra_ and context_ to avoid clashes. Watch out if you have scripts reading those from the API and rely on names + * Added WhatFailureGroupHandler to suppress any exception coming from the wrapped handlers and avoid chain failures if a logging service fails + * Added MandrillHandler to send emails via the Mandrillapp.com API + * Added SlackHandler to log records to a Slack.com account + * Added FleepHookHandler to log records to a Fleep.io account + * Added LogglyHandler::addTag to allow adding tags to an existing handler + * Added $ignoreEmptyContextAndExtra to LineFormatter to avoid empty [] at the end + * Added $useLocking to StreamHandler and RotatingFileHandler to enable flock() while writing + * Added support for PhpAmqpLib in the AmqpHandler + * Added FingersCrossedHandler::clear and BufferHandler::clear to reset them between batches in long running jobs + * Added support for adding extra fields from $_SERVER in the WebProcessor + * Fixed support for non-string values in PrsLogMessageProcessor + * Fixed SwiftMailer messages being sent with the wrong date in long running scripts + * Fixed minor PHP 5.6 compatibility issues + * Fixed BufferHandler::close being called twice + +### 1.10.0 (2014-06-04) + + * Added Logger::getHandlers() and Logger::getProcessors() methods + * Added $passthruLevel argument to FingersCrossedHandler to let it always pass some records through even if the trigger level is not reached + * Added support for extra data in NewRelicHandler + * Added $expandNewlines flag to the ErrorLogHandler to create multiple log entries when a message has multiple lines + +### 1.9.1 (2014-04-24) + + * Fixed regression in RotatingFileHandler file permissions + * Fixed initialization of the BufferHandler to make sure it gets flushed after receiving records + * Fixed ChromePHPHandler and FirePHPHandler's activation strategies to be more conservative + +### 1.9.0 (2014-04-20) + + * Added LogEntriesHandler to send logs to a LogEntries account + * Added $filePermissions to tweak file mode on StreamHandler and RotatingFileHandler + * Added $useFormatting flag to MemoryProcessor to make it send raw data in bytes + * Added support for table formatting in FirePHPHandler via the table context key + * Added a TagProcessor to add tags to records, and support for tags in RavenHandler + * Added $appendNewline flag to the JsonFormatter to enable using it when logging to files + * Added sound support to the PushoverHandler + * Fixed multi-threading support in StreamHandler + * Fixed empty headers issue when ChromePHPHandler received no records + * Fixed default format of the ErrorLogHandler + +### 1.8.0 (2014-03-23) + + * Break: the LineFormatter now strips newlines by default because this was a bug, set $allowInlineLineBreaks to true if you need them + * Added BrowserConsoleHandler to send logs to any browser's console via console.log() injection in the output + * Added FilterHandler to filter records and only allow those of a given list of levels through to the wrapped handler + * Added FlowdockHandler to send logs to a Flowdock account + * Added RollbarHandler to send logs to a Rollbar account + * Added HtmlFormatter to send prettier log emails with colors for each log level + * Added GitProcessor to add the current branch/commit to extra record data + * Added a Monolog\Registry class to allow easier global access to pre-configured loggers + * Added support for the new official graylog2/gelf-php lib for GelfHandler, upgrade if you can by replacing the mlehner/gelf-php requirement + * Added support for HHVM + * Added support for Loggly batch uploads + * Added support for tweaking the content type and encoding in NativeMailerHandler + * Added $skipClassesPartials to tweak the ignored classes in the IntrospectionProcessor + * Fixed batch request support in GelfHandler + +### 1.7.0 (2013-11-14) + + * Added ElasticSearchHandler to send logs to an Elastic Search server + * Added DynamoDbHandler and ScalarFormatter to send logs to Amazon's Dynamo DB + * Added SyslogUdpHandler to send logs to a remote syslogd server + * Added LogglyHandler to send logs to a Loggly account + * Added $level to IntrospectionProcessor so it only adds backtraces when needed + * Added $version to LogstashFormatter to allow using the new v1 Logstash format + * Added $appName to NewRelicHandler + * Added configuration of Pushover notification retries/expiry + * Added $maxColumnWidth to NativeMailerHandler to change the 70 chars default + * Added chainability to most setters for all handlers + * Fixed RavenHandler batch processing so it takes the message from the record with highest priority + * Fixed HipChatHandler batch processing so it sends all messages at once + * Fixed issues with eAccelerator + * Fixed and improved many small things + +### 1.6.0 (2013-07-29) + + * Added HipChatHandler to send logs to a HipChat chat room + * Added ErrorLogHandler to send logs to PHP's error_log function + * Added NewRelicHandler to send logs to NewRelic's service + * Added Monolog\ErrorHandler helper class to register a Logger as exception/error/fatal handler + * Added ChannelLevelActivationStrategy for the FingersCrossedHandler to customize levels by channel + * Added stack traces output when normalizing exceptions (json output & co) + * Added Monolog\Logger::API constant (currently 1) + * Added support for ChromePHP's v4.0 extension + * Added support for message priorities in PushoverHandler, see $highPriorityLevel and $emergencyLevel + * Added support for sending messages to multiple users at once with the PushoverHandler + * Fixed RavenHandler's support for batch sending of messages (when behind a Buffer or FingersCrossedHandler) + * Fixed normalization of Traversables with very large data sets, only the first 1000 items are shown now + * Fixed issue in RotatingFileHandler when an open_basedir restriction is active + * Fixed minor issues in RavenHandler and bumped the API to Raven 0.5.0 + * Fixed SyslogHandler issue when many were used concurrently with different facilities + +### 1.5.0 (2013-04-23) + + * Added ProcessIdProcessor to inject the PID in log records + * Added UidProcessor to inject a unique identifier to all log records of one request/run + * Added support for previous exceptions in the LineFormatter exception serialization + * Added Monolog\Logger::getLevels() to get all available levels + * Fixed ChromePHPHandler so it avoids sending headers larger than Chrome can handle + +### 1.4.1 (2013-04-01) + + * Fixed exception formatting in the LineFormatter to be more minimalistic + * Fixed RavenHandler's handling of context/extra data, requires Raven client >0.1.0 + * Fixed log rotation in RotatingFileHandler to work with long running scripts spanning multiple days + * Fixed WebProcessor array access so it checks for data presence + * Fixed Buffer, Group and FingersCrossed handlers to make use of their processors + +### 1.4.0 (2013-02-13) + + * Added RedisHandler to log to Redis via the Predis library or the phpredis extension + * Added ZendMonitorHandler to log to the Zend Server monitor + * Added the possibility to pass arrays of handlers and processors directly in the Logger constructor + * Added `$useSSL` option to the PushoverHandler which is enabled by default + * Fixed ChromePHPHandler and FirePHPHandler issue when multiple instances are used simultaneously + * Fixed header injection capability in the NativeMailHandler + +### 1.3.1 (2013-01-11) + + * Fixed LogstashFormatter to be usable with stream handlers + * Fixed GelfMessageFormatter levels on Windows + +### 1.3.0 (2013-01-08) + + * Added PSR-3 compliance, the `Monolog\Logger` class is now an instance of `Psr\Log\LoggerInterface` + * Added PsrLogMessageProcessor that you can selectively enable for full PSR-3 compliance + * Added LogstashFormatter (combine with SocketHandler or StreamHandler to send logs to Logstash) + * Added PushoverHandler to send mobile notifications + * Added CouchDBHandler and DoctrineCouchDBHandler + * Added RavenHandler to send data to Sentry servers + * Added support for the new MongoClient class in MongoDBHandler + * Added microsecond precision to log records' timestamps + * Added `$flushOnOverflow` param to BufferHandler to flush by batches instead of losing + the oldest entries + * Fixed normalization of objects with cyclic references + +### 1.2.1 (2012-08-29) + + * Added new $logopts arg to SyslogHandler to provide custom openlog options + * Fixed fatal error in SyslogHandler + +### 1.2.0 (2012-08-18) + + * Added AmqpHandler (for use with AMQP servers) + * Added CubeHandler + * Added NativeMailerHandler::addHeader() to send custom headers in mails + * Added the possibility to specify more than one recipient in NativeMailerHandler + * Added the possibility to specify float timeouts in SocketHandler + * Added NOTICE and EMERGENCY levels to conform with RFC 5424 + * Fixed the log records to use the php default timezone instead of UTC + * Fixed BufferHandler not being flushed properly on PHP fatal errors + * Fixed normalization of exotic resource types + * Fixed the default format of the SyslogHandler to avoid duplicating datetimes in syslog + +### 1.1.0 (2012-04-23) + + * Added Monolog\Logger::isHandling() to check if a handler will + handle the given log level + * Added ChromePHPHandler + * Added MongoDBHandler + * Added GelfHandler (for use with Graylog2 servers) + * Added SocketHandler (for use with syslog-ng for example) + * Added NormalizerFormatter + * Added the possibility to change the activation strategy of the FingersCrossedHandler + * Added possibility to show microseconds in logs + * Added `server` and `referer` to WebProcessor output + +### 1.0.2 (2011-10-24) + + * Fixed bug in IE with large response headers and FirePHPHandler + +### 1.0.1 (2011-08-25) + + * Added MemoryPeakUsageProcessor and MemoryUsageProcessor + * Added Monolog\Logger::getName() to get a logger's channel name + +### 1.0.0 (2011-07-06) + + * Added IntrospectionProcessor to get info from where the logger was called + * Fixed WebProcessor in CLI + +### 1.0.0-RC1 (2011-07-01) + + * Initial release diff --git a/vendor/monolog/monolog/LICENSE b/vendor/monolog/monolog/LICENSE new file mode 100644 index 0000000..aa2a042 --- /dev/null +++ b/vendor/monolog/monolog/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011-2020 Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/monolog/monolog/README.md b/vendor/monolog/monolog/README.md new file mode 100644 index 0000000..bfcae0c --- /dev/null +++ b/vendor/monolog/monolog/README.md @@ -0,0 +1,112 @@ +# Monolog - Logging for PHP [![Continuous Integration](https://github.com/Seldaek/monolog/workflows/Continuous%20Integration/badge.svg?branch=main)](https://github.com/Seldaek/monolog/actions) + +[![Total Downloads](https://img.shields.io/packagist/dt/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog) +[![Latest Stable Version](https://img.shields.io/packagist/v/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog) + + +Monolog sends your logs to files, sockets, inboxes, databases and various +web services. See the complete list of handlers below. Special handlers +allow you to build advanced logging strategies. + +This library implements the [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) +interface that you can type-hint against in your own libraries to keep +a maximum of interoperability. You can also use it in your applications to +make sure you can always use another compatible logger at a later time. +As of 1.11.0 Monolog public APIs will also accept PSR-3 log levels. +Internally Monolog still uses its own level scheme since it predates PSR-3. + +## Installation + +Install the latest version with + +```bash +$ composer require monolog/monolog +``` + +## Basic Usage + +```php +<?php + +use Monolog\Logger; +use Monolog\Handler\StreamHandler; + +// create a log channel +$log = new Logger('name'); +$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING)); + +// add records to the log +$log->warning('Foo'); +$log->error('Bar'); +``` + +## Documentation + +- [Usage Instructions](doc/01-usage.md) +- [Handlers, Formatters and Processors](doc/02-handlers-formatters-processors.md) +- [Utility Classes](doc/03-utilities.md) +- [Extending Monolog](doc/04-extending.md) +- [Log Record Structure](doc/message-structure.md) + +## Support Monolog Financially + +Get supported Monolog and help fund the project with the [Tidelift Subscription](https://tidelift.com/subscription/pkg/packagist-monolog-monolog?utm_source=packagist-monolog-monolog&utm_medium=referral&utm_campaign=enterprise) or via [GitHub sponsorship](https://github.com/sponsors/Seldaek). + +Tidelift delivers commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. + +## Third Party Packages + +Third party handlers, formatters and processors are +[listed in the wiki](https://github.com/Seldaek/monolog/wiki/Third-Party-Packages). You +can also add your own there if you publish one. + +## About + +### Requirements + +- Monolog `^2.0` works with PHP 7.2 or above, use Monolog `^1.25` for PHP 5.3+ support. + +### Support + +Monolog 1.x support is somewhat limited at this point and only important fixes will be done. You should migrate to Monolog 2 where possible to benefit from all the latest features and fixes. + +### Submitting bugs and feature requests + +Bugs and feature request are tracked on [GitHub](https://github.com/Seldaek/monolog/issues) + +### Framework Integrations + +- Frameworks and libraries using [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) + can be used very easily with Monolog since it implements the interface. +- [Symfony](http://symfony.com) comes out of the box with Monolog. +- [Laravel](http://laravel.com/) comes out of the box with Monolog. +- [Lumen](http://lumen.laravel.com/) comes out of the box with Monolog. +- [PPI](https://github.com/ppi/framework) comes out of the box with Monolog. +- [CakePHP](http://cakephp.org/) is usable with Monolog via the [cakephp-monolog](https://github.com/jadb/cakephp-monolog) plugin. +- [Slim](http://www.slimframework.com/) is usable with Monolog via the [Slim-Monolog](https://github.com/Flynsarmy/Slim-Monolog) log writer. +- [XOOPS 2.6](http://xoops.org/) comes out of the box with Monolog. +- [Aura.Web_Project](https://github.com/auraphp/Aura.Web_Project) comes out of the box with Monolog. +- [Nette Framework](http://nette.org/en/) is usable with Monolog via the [contributte/monolog](https://github.com/contributte/monolog) or [orisai/nette-monolog](https://github.com/orisai/nette-monolog) extensions. +- [Proton Micro Framework](https://github.com/alexbilbie/Proton) comes out of the box with Monolog. +- [FuelPHP](http://fuelphp.com/) comes out of the box with Monolog. +- [Equip Framework](https://github.com/equip/framework) comes out of the box with Monolog. +- [Yii 2](http://www.yiiframework.com/) is usable with Monolog via the [yii2-monolog](https://github.com/merorafael/yii2-monolog) or [yii2-psr-log-target](https://github.com/samdark/yii2-psr-log-target) plugins. +- [Hawkbit Micro Framework](https://github.com/HawkBitPhp/hawkbit) comes out of the box with Monolog. +- [SilverStripe 4](https://www.silverstripe.org/) comes out of the box with Monolog. +- [Drupal](https://www.drupal.org/) is usable with Monolog via the [monolog](https://www.drupal.org/project/monolog) module. +- [Aimeos ecommerce framework](https://aimeos.org/) is usable with Monolog via the [ai-monolog](https://github.com/aimeos/ai-monolog) extension. +- [Magento](https://magento.com/) comes out of the box with Monolog. + +### Author + +Jordi Boggiano - <j.boggiano@seld.be> - <http://twitter.com/seldaek><br /> +See also the list of [contributors](https://github.com/Seldaek/monolog/contributors) who participated in this project. + +### License + +Monolog is licensed under the MIT License - see the [LICENSE](LICENSE) file for details + +### Acknowledgements + +This library is heavily inspired by Python's [Logbook](https://logbook.readthedocs.io/en/stable/) +library, although most concepts have been adjusted to fit to the PHP world. diff --git a/vendor/monolog/monolog/UPGRADE.md b/vendor/monolog/monolog/UPGRADE.md new file mode 100644 index 0000000..84e15e6 --- /dev/null +++ b/vendor/monolog/monolog/UPGRADE.md @@ -0,0 +1,72 @@ +### 2.0.0 + +- `Monolog\Logger::API` can be used to distinguish between a Monolog `1` and `2` + install of Monolog when writing integration code. + +- Removed non-PSR-3 methods to add records, all the `add*` (e.g. `addWarning`) + methods as well as `emerg`, `crit`, `err` and `warn`. + +- DateTime are now formatted with a timezone and microseconds (unless disabled). + Various formatters and log output might be affected, which may mess with log parsing + in some cases. + +- The `datetime` in every record array is now a DateTimeImmutable, not that you + should have been modifying these anyway. + +- The timezone is now set per Logger instance and not statically, either + via ->setTimezone or passed in the constructor. Calls to Logger::setTimezone + should be converted. + +- `HandlerInterface` has been split off and two new interfaces now exist for + more granular controls: `ProcessableHandlerInterface` and + `FormattableHandlerInterface`. Handlers not extending `AbstractHandler` + should make sure to implement the relevant interfaces. + +- `HandlerInterface` now requires the `close` method to be implemented. This + only impacts you if you implement the interface yourself, but you can extend + the new `Monolog\Handler\Handler` base class too. + +- There is no more default handler configured on empty Logger instances, if + you were relying on that you will not get any output anymore, make sure to + configure the handler you need. + +#### LogglyFormatter + +- The records' `datetime` is not sent anymore. Only `timestamp` is sent to Loggly. + +#### AmqpHandler + +- Log levels are not shortened to 4 characters anymore. e.g. a warning record + will be sent using the `warning.channel` routing key instead of `warn.channel` + as in 1.x. +- The exchange name does not default to 'log' anymore, and it is completely ignored + now for the AMQP extension users. Only PHPAmqpLib uses it if provided. + +#### RotatingFileHandler + +- The file name format must now contain `{date}` and the date format must be set + to one of the predefined FILE_PER_* constants to avoid issues with file rotation. + See `setFilenameFormat`. + +#### LogstashFormatter + +- Removed Logstash V0 support +- Context/extra prefix has been removed in favor of letting users configure the exact key being sent +- Context/extra data are now sent as an object instead of single keys + +#### HipChatHandler + +- Removed deprecated HipChat handler, migrate to Slack and use SlackWebhookHandler or SlackHandler instead + +#### SlackbotHandler + +- Removed deprecated SlackbotHandler handler, use SlackWebhookHandler or SlackHandler instead + +#### RavenHandler + +- Removed deprecated RavenHandler handler, use sentry/sentry 2.x and their Sentry\Monolog\Handler instead + +#### ElasticSearchHandler + +- As support for the official Elasticsearch library was added, the former ElasticSearchHandler has been + renamed to ElasticaHandler and the new one added as ElasticsearchHandler. diff --git a/vendor/monolog/monolog/composer.json b/vendor/monolog/monolog/composer.json new file mode 100644 index 0000000..ab775ad --- /dev/null +++ b/vendor/monolog/monolog/composer.json @@ -0,0 +1,81 @@ +{ + "name": "monolog/monolog", + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "keywords": ["log", "logging", "psr-3"], + "homepage": "https://github.com/Seldaek/monolog", + "type": "library", + "license": "MIT", + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "ext-json": "*", + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "graylog2/gelf-php": "^1.4.2", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5.14", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-openssl": "Required to send log messages using SSL" + }, + "autoload": { + "psr-4": {"Monolog\\": "src/Monolog"} + }, + "autoload-dev": { + "psr-4": {"Monolog\\": "tests/Monolog"} + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "scripts": { + "test": "@php vendor/bin/phpunit", + "phpstan": "@php vendor/bin/phpstan analyse" + }, + "config": { + "lock": false, + "sort-packages": true, + "platform-check": false, + "allow-plugins": { + "composer/package-versions-deprecated": true + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php b/vendor/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php new file mode 100644 index 0000000..188bbb0 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php @@ -0,0 +1,46 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Attribute; + +/** + * A reusable attribute to help configure a class or a method as a processor. + * + * Using it offers no guarantee: it needs to be leveraged by a Monolog third-party consumer. + * + * Using it with the Monolog library only has no effect at all: processors should still be turned into a callable if + * needed and manually pushed to the loggers and to the processable handlers. + */ +#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)] +class AsMonologProcessor +{ + /** @var string|null */ + public $channel = null; + /** @var string|null */ + public $handler = null; + /** @var string|null */ + public $method = null; + + /** + * @param string|null $channel The logging channel the processor should be pushed to. + * @param string|null $handler The handler the processor should be pushed to. + * @param string|null $method The method that processes the records (if the attribute is used at the class level). + */ + public function __construct( + ?string $channel = null, + ?string $handler = null, + ?string $method = null + ) { + $this->channel = $channel; + $this->handler = $handler; + $this->method = $method; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/DateTimeImmutable.php b/vendor/monolog/monolog/src/Monolog/DateTimeImmutable.php new file mode 100644 index 0000000..6a1ba9b --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/DateTimeImmutable.php @@ -0,0 +1,49 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use DateTimeZone; + +/** + * Overrides default json encoding of date time objects + * + * @author Menno Holtkamp + * @author Jordi Boggiano <j.boggiano@seld.be> + */ +class DateTimeImmutable extends \DateTimeImmutable implements \JsonSerializable +{ + /** + * @var bool + */ + private $useMicroseconds; + + public function __construct(bool $useMicroseconds, ?DateTimeZone $timezone = null) + { + $this->useMicroseconds = $useMicroseconds; + + parent::__construct('now', $timezone); + } + + public function jsonSerialize(): string + { + if ($this->useMicroseconds) { + return $this->format('Y-m-d\TH:i:s.uP'); + } + + return $this->format('Y-m-d\TH:i:sP'); + } + + public function __toString(): string + { + return $this->jsonSerialize(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/ErrorHandler.php b/vendor/monolog/monolog/src/Monolog/ErrorHandler.php new file mode 100644 index 0000000..576f171 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/ErrorHandler.php @@ -0,0 +1,307 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use Psr\Log\LoggerInterface; +use Psr\Log\LogLevel; + +/** + * Monolog error handler + * + * A facility to enable logging of runtime errors, exceptions and fatal errors. + * + * Quick setup: <code>ErrorHandler::register($logger);</code> + * + * @author Jordi Boggiano <j.boggiano@seld.be> + */ +class ErrorHandler +{ + /** @var LoggerInterface */ + private $logger; + + /** @var ?callable */ + private $previousExceptionHandler = null; + /** @var array<class-string, LogLevel::*> an array of class name to LogLevel::* constant mapping */ + private $uncaughtExceptionLevelMap = []; + + /** @var callable|true|null */ + private $previousErrorHandler = null; + /** @var array<int, LogLevel::*> an array of E_* constant to LogLevel::* constant mapping */ + private $errorLevelMap = []; + /** @var bool */ + private $handleOnlyReportedErrors = true; + + /** @var bool */ + private $hasFatalErrorHandler = false; + /** @var LogLevel::* */ + private $fatalLevel = LogLevel::ALERT; + /** @var ?string */ + private $reservedMemory = null; + /** @var ?array{type: int, message: string, file: string, line: int, trace: mixed} */ + private $lastFatalData = null; + /** @var int[] */ + private static $fatalErrors = [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR]; + + public function __construct(LoggerInterface $logger) + { + $this->logger = $logger; + } + + /** + * Registers a new ErrorHandler for a given Logger + * + * By default it will handle errors, exceptions and fatal errors + * + * @param LoggerInterface $logger + * @param array<int, LogLevel::*>|false $errorLevelMap an array of E_* constant to LogLevel::* constant mapping, or false to disable error handling + * @param array<class-string, LogLevel::*>|false $exceptionLevelMap an array of class name to LogLevel::* constant mapping, or false to disable exception handling + * @param LogLevel::*|null|false $fatalLevel a LogLevel::* constant, null to use the default LogLevel::ALERT or false to disable fatal error handling + * @return ErrorHandler + */ + public static function register(LoggerInterface $logger, $errorLevelMap = [], $exceptionLevelMap = [], $fatalLevel = null): self + { + /** @phpstan-ignore-next-line */ + $handler = new static($logger); + if ($errorLevelMap !== false) { + $handler->registerErrorHandler($errorLevelMap); + } + if ($exceptionLevelMap !== false) { + $handler->registerExceptionHandler($exceptionLevelMap); + } + if ($fatalLevel !== false) { + $handler->registerFatalHandler($fatalLevel); + } + + return $handler; + } + + /** + * @param array<class-string, LogLevel::*> $levelMap an array of class name to LogLevel::* constant mapping + * @return $this + */ + public function registerExceptionHandler(array $levelMap = [], bool $callPrevious = true): self + { + $prev = set_exception_handler(function (\Throwable $e): void { + $this->handleException($e); + }); + $this->uncaughtExceptionLevelMap = $levelMap; + foreach ($this->defaultExceptionLevelMap() as $class => $level) { + if (!isset($this->uncaughtExceptionLevelMap[$class])) { + $this->uncaughtExceptionLevelMap[$class] = $level; + } + } + if ($callPrevious && $prev) { + $this->previousExceptionHandler = $prev; + } + + return $this; + } + + /** + * @param array<int, LogLevel::*> $levelMap an array of E_* constant to LogLevel::* constant mapping + * @return $this + */ + public function registerErrorHandler(array $levelMap = [], bool $callPrevious = true, int $errorTypes = -1, bool $handleOnlyReportedErrors = true): self + { + $prev = set_error_handler([$this, 'handleError'], $errorTypes); + $this->errorLevelMap = array_replace($this->defaultErrorLevelMap(), $levelMap); + if ($callPrevious) { + $this->previousErrorHandler = $prev ?: true; + } else { + $this->previousErrorHandler = null; + } + + $this->handleOnlyReportedErrors = $handleOnlyReportedErrors; + + return $this; + } + + /** + * @param LogLevel::*|null $level a LogLevel::* constant, null to use the default LogLevel::ALERT + * @param int $reservedMemorySize Amount of KBs to reserve in memory so that it can be freed when handling fatal errors giving Monolog some room in memory to get its job done + */ + public function registerFatalHandler($level = null, int $reservedMemorySize = 20): self + { + register_shutdown_function([$this, 'handleFatalError']); + + $this->reservedMemory = str_repeat(' ', 1024 * $reservedMemorySize); + $this->fatalLevel = null === $level ? LogLevel::ALERT : $level; + $this->hasFatalErrorHandler = true; + + return $this; + } + + /** + * @return array<class-string, LogLevel::*> + */ + protected function defaultExceptionLevelMap(): array + { + return [ + 'ParseError' => LogLevel::CRITICAL, + 'Throwable' => LogLevel::ERROR, + ]; + } + + /** + * @return array<int, LogLevel::*> + */ + protected function defaultErrorLevelMap(): array + { + return [ + E_ERROR => LogLevel::CRITICAL, + E_WARNING => LogLevel::WARNING, + E_PARSE => LogLevel::ALERT, + E_NOTICE => LogLevel::NOTICE, + E_CORE_ERROR => LogLevel::CRITICAL, + E_CORE_WARNING => LogLevel::WARNING, + E_COMPILE_ERROR => LogLevel::ALERT, + E_COMPILE_WARNING => LogLevel::WARNING, + E_USER_ERROR => LogLevel::ERROR, + E_USER_WARNING => LogLevel::WARNING, + E_USER_NOTICE => LogLevel::NOTICE, + E_STRICT => LogLevel::NOTICE, + E_RECOVERABLE_ERROR => LogLevel::ERROR, + E_DEPRECATED => LogLevel::NOTICE, + E_USER_DEPRECATED => LogLevel::NOTICE, + ]; + } + + /** + * @phpstan-return never + */ + private function handleException(\Throwable $e): void + { + $level = LogLevel::ERROR; + foreach ($this->uncaughtExceptionLevelMap as $class => $candidate) { + if ($e instanceof $class) { + $level = $candidate; + break; + } + } + + $this->logger->log( + $level, + sprintf('Uncaught Exception %s: "%s" at %s line %s', Utils::getClass($e), $e->getMessage(), $e->getFile(), $e->getLine()), + ['exception' => $e] + ); + + if ($this->previousExceptionHandler) { + ($this->previousExceptionHandler)($e); + } + + if (!headers_sent() && !ini_get('display_errors')) { + http_response_code(500); + } + + exit(255); + } + + /** + * @private + * + * @param mixed[] $context + */ + public function handleError(int $code, string $message, string $file = '', int $line = 0, ?array $context = []): bool + { + if ($this->handleOnlyReportedErrors && !(error_reporting() & $code)) { + return false; + } + + // fatal error codes are ignored if a fatal error handler is present as well to avoid duplicate log entries + if (!$this->hasFatalErrorHandler || !in_array($code, self::$fatalErrors, true)) { + $level = $this->errorLevelMap[$code] ?? LogLevel::CRITICAL; + $this->logger->log($level, self::codeToString($code).': '.$message, ['code' => $code, 'message' => $message, 'file' => $file, 'line' => $line]); + } else { + $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + array_shift($trace); // Exclude handleError from trace + $this->lastFatalData = ['type' => $code, 'message' => $message, 'file' => $file, 'line' => $line, 'trace' => $trace]; + } + + if ($this->previousErrorHandler === true) { + return false; + } elseif ($this->previousErrorHandler) { + return (bool) ($this->previousErrorHandler)($code, $message, $file, $line, $context); + } + + return true; + } + + /** + * @private + */ + public function handleFatalError(): void + { + $this->reservedMemory = ''; + + if (is_array($this->lastFatalData)) { + $lastError = $this->lastFatalData; + } else { + $lastError = error_get_last(); + } + + if ($lastError && in_array($lastError['type'], self::$fatalErrors, true)) { + $trace = $lastError['trace'] ?? null; + $this->logger->log( + $this->fatalLevel, + 'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'], + ['code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'], 'trace' => $trace] + ); + + if ($this->logger instanceof Logger) { + foreach ($this->logger->getHandlers() as $handler) { + $handler->close(); + } + } + } + } + + /** + * @param int $code + */ + private static function codeToString($code): string + { + switch ($code) { + case E_ERROR: + return 'E_ERROR'; + case E_WARNING: + return 'E_WARNING'; + case E_PARSE: + return 'E_PARSE'; + case E_NOTICE: + return 'E_NOTICE'; + case E_CORE_ERROR: + return 'E_CORE_ERROR'; + case E_CORE_WARNING: + return 'E_CORE_WARNING'; + case E_COMPILE_ERROR: + return 'E_COMPILE_ERROR'; + case E_COMPILE_WARNING: + return 'E_COMPILE_WARNING'; + case E_USER_ERROR: + return 'E_USER_ERROR'; + case E_USER_WARNING: + return 'E_USER_WARNING'; + case E_USER_NOTICE: + return 'E_USER_NOTICE'; + case E_STRICT: + return 'E_STRICT'; + case E_RECOVERABLE_ERROR: + return 'E_RECOVERABLE_ERROR'; + case E_DEPRECATED: + return 'E_DEPRECATED'; + case E_USER_DEPRECATED: + return 'E_USER_DEPRECATED'; + } + + return 'Unknown PHP error'; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php new file mode 100644 index 0000000..aa1884b --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php @@ -0,0 +1,83 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Logger; + +/** + * Formats a log message according to the ChromePHP array format + * + * @author Christophe Coevoet <stof@notk.org> + */ +class ChromePHPFormatter implements FormatterInterface +{ + /** + * Translates Monolog log levels to Wildfire levels. + * + * @var array<int, 'log'|'info'|'warn'|'error'> + */ + private $logLevels = [ + Logger::DEBUG => 'log', + Logger::INFO => 'info', + Logger::NOTICE => 'info', + Logger::WARNING => 'warn', + Logger::ERROR => 'error', + Logger::CRITICAL => 'error', + Logger::ALERT => 'error', + Logger::EMERGENCY => 'error', + ]; + + /** + * {@inheritDoc} + */ + public function format(array $record) + { + // Retrieve the line and file if set and remove them from the formatted extra + $backtrace = 'unknown'; + if (isset($record['extra']['file'], $record['extra']['line'])) { + $backtrace = $record['extra']['file'].' : '.$record['extra']['line']; + unset($record['extra']['file'], $record['extra']['line']); + } + + $message = ['message' => $record['message']]; + if ($record['context']) { + $message['context'] = $record['context']; + } + if ($record['extra']) { + $message['extra'] = $record['extra']; + } + if (count($message) === 1) { + $message = reset($message); + } + + return [ + $record['channel'], + $message, + $backtrace, + $this->logLevels[$record['level']], + ]; + } + + /** + * {@inheritDoc} + */ + public function formatBatch(array $records) + { + $formatted = []; + + foreach ($records as $record) { + $formatted[] = $this->format($record); + } + + return $formatted; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php new file mode 100644 index 0000000..6c8a9ab --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php @@ -0,0 +1,89 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Elastica\Document; + +/** + * Format a log message into an Elastica Document + * + * @author Jelle Vink <jelle.vink@gmail.com> + * + * @phpstan-import-type Record from \Monolog\Logger + */ +class ElasticaFormatter extends NormalizerFormatter +{ + /** + * @var string Elastic search index name + */ + protected $index; + + /** + * @var ?string Elastic search document type + */ + protected $type; + + /** + * @param string $index Elastic Search index name + * @param ?string $type Elastic Search document type, deprecated as of Elastica 7 + */ + public function __construct(string $index, ?string $type) + { + // elasticsearch requires a ISO 8601 format date with optional millisecond precision. + parent::__construct('Y-m-d\TH:i:s.uP'); + + $this->index = $index; + $this->type = $type; + } + + /** + * {@inheritDoc} + */ + public function format(array $record) + { + $record = parent::format($record); + + return $this->getDocument($record); + } + + public function getIndex(): string + { + return $this->index; + } + + /** + * @deprecated since Elastica 7 type has no effect + */ + public function getType(): string + { + /** @phpstan-ignore-next-line */ + return $this->type; + } + + /** + * Convert a log message into an Elastica Document + * + * @phpstan-param Record $record + */ + protected function getDocument(array $record): Document + { + $document = new Document(); + $document->setData($record); + if (method_exists($document, 'setType')) { + /** @phpstan-ignore-next-line */ + $document->setType($this->type); + } + $document->setIndex($this->index); + + return $document; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php new file mode 100644 index 0000000..b792b81 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/ElasticsearchFormatter.php @@ -0,0 +1,89 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use DateTimeInterface; + +/** + * Format a log message into an Elasticsearch record + * + * @author Avtandil Kikabidze <akalongman@gmail.com> + */ +class ElasticsearchFormatter extends NormalizerFormatter +{ + /** + * @var string Elasticsearch index name + */ + protected $index; + + /** + * @var string Elasticsearch record type + */ + protected $type; + + /** + * @param string $index Elasticsearch index name + * @param string $type Elasticsearch record type + */ + public function __construct(string $index, string $type) + { + // Elasticsearch requires an ISO 8601 format date with optional millisecond precision. + parent::__construct(DateTimeInterface::ISO8601); + + $this->index = $index; + $this->type = $type; + } + + /** + * {@inheritDoc} + */ + public function format(array $record) + { + $record = parent::format($record); + + return $this->getDocument($record); + } + + /** + * Getter index + * + * @return string + */ + public function getIndex(): string + { + return $this->index; + } + + /** + * Getter type + * + * @return string + */ + public function getType(): string + { + return $this->type; + } + + /** + * Convert a log message into an Elasticsearch record + * + * @param mixed[] $record Log message + * @return mixed[] + */ + protected function getDocument(array $record): array + { + $record['_index'] = $this->index; + $record['_type'] = $this->type; + + return $record; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php new file mode 100644 index 0000000..41b56b3 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php @@ -0,0 +1,111 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * formats the record to be used in the FlowdockHandler + * + * @author Dominik Liebler <liebler.dominik@gmail.com> + */ +class FlowdockFormatter implements FormatterInterface +{ + /** + * @var string + */ + private $source; + + /** + * @var string + */ + private $sourceEmail; + + public function __construct(string $source, string $sourceEmail) + { + $this->source = $source; + $this->sourceEmail = $sourceEmail; + } + + /** + * {@inheritDoc} + * + * @return mixed[] + */ + public function format(array $record): array + { + $tags = [ + '#logs', + '#' . strtolower($record['level_name']), + '#' . $record['channel'], + ]; + + foreach ($record['extra'] as $value) { + $tags[] = '#' . $value; + } + + $subject = sprintf( + 'in %s: %s - %s', + $this->source, + $record['level_name'], + $this->getShortMessage($record['message']) + ); + + $record['flowdock'] = [ + 'source' => $this->source, + 'from_address' => $this->sourceEmail, + 'subject' => $subject, + 'content' => $record['message'], + 'tags' => $tags, + 'project' => $this->source, + ]; + + return $record; + } + + /** + * {@inheritDoc} + * + * @return mixed[][] + */ + public function formatBatch(array $records): array + { + $formatted = []; + + foreach ($records as $record) { + $formatted[] = $this->format($record); + } + + return $formatted; + } + + public function getShortMessage(string $message): string + { + static $hasMbString; + + if (null === $hasMbString) { + $hasMbString = function_exists('mb_strlen'); + } + + $maxLength = 45; + + if ($hasMbString) { + if (mb_strlen($message, 'UTF-8') > $maxLength) { + $message = mb_substr($message, 0, $maxLength - 4, 'UTF-8') . ' ...'; + } + } else { + if (strlen($message) > $maxLength) { + $message = substr($message, 0, $maxLength - 4) . ' ...'; + } + } + + return $message; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php new file mode 100644 index 0000000..29b14d3 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php @@ -0,0 +1,88 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Utils; + +/** + * Class FluentdFormatter + * + * Serializes a log message to Fluentd unix socket protocol + * + * Fluentd config: + * + * <source> + * type unix + * path /var/run/td-agent/td-agent.sock + * </source> + * + * Monolog setup: + * + * $logger = new Monolog\Logger('fluent.tag'); + * $fluentHandler = new Monolog\Handler\SocketHandler('unix:///var/run/td-agent/td-agent.sock'); + * $fluentHandler->setFormatter(new Monolog\Formatter\FluentdFormatter()); + * $logger->pushHandler($fluentHandler); + * + * @author Andrius Putna <fordnox@gmail.com> + */ +class FluentdFormatter implements FormatterInterface +{ + /** + * @var bool $levelTag should message level be a part of the fluentd tag + */ + protected $levelTag = false; + + public function __construct(bool $levelTag = false) + { + if (!function_exists('json_encode')) { + throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s FluentdUnixFormatter'); + } + + $this->levelTag = $levelTag; + } + + public function isUsingLevelsInTag(): bool + { + return $this->levelTag; + } + + public function format(array $record): string + { + $tag = $record['channel']; + if ($this->levelTag) { + $tag .= '.' . strtolower($record['level_name']); + } + + $message = [ + 'message' => $record['message'], + 'context' => $record['context'], + 'extra' => $record['extra'], + ]; + + if (!$this->levelTag) { + $message['level'] = $record['level']; + $message['level_name'] = $record['level_name']; + } + + return Utils::jsonEncode([$tag, $record['datetime']->getTimestamp(), $message]); + } + + public function formatBatch(array $records): string + { + $message = ''; + foreach ($records as $record) { + $message .= $this->format($record); + } + + return $message; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php b/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php new file mode 100644 index 0000000..19617ec --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php @@ -0,0 +1,42 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * Interface for formatters + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * + * @phpstan-import-type Record from \Monolog\Logger + */ +interface FormatterInterface +{ + /** + * Formats a log record. + * + * @param array $record A record to format + * @return mixed The formatted record + * + * @phpstan-param Record $record + */ + public function format(array $record); + + /** + * Formats a set of log records. + * + * @param array $records A set of records to format + * @return mixed The formatted set of records + * + * @phpstan-param Record[] $records + */ + public function formatBatch(array $records); +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php new file mode 100644 index 0000000..a1a7937 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php @@ -0,0 +1,160 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Logger; +use Gelf\Message; +use Monolog\Utils; + +/** + * Serializes a log message to GELF + * @see http://docs.graylog.org/en/latest/pages/gelf.html + * + * @author Matt Lehner <mlehner@gmail.com> + * + * @phpstan-import-type Level from \Monolog\Logger + */ +class GelfMessageFormatter extends NormalizerFormatter +{ + protected const DEFAULT_MAX_LENGTH = 32766; + + /** + * @var string the name of the system for the Gelf log message + */ + protected $systemName; + + /** + * @var string a prefix for 'extra' fields from the Monolog record (optional) + */ + protected $extraPrefix; + + /** + * @var string a prefix for 'context' fields from the Monolog record (optional) + */ + protected $contextPrefix; + + /** + * @var int max length per field + */ + protected $maxLength; + + /** + * Translates Monolog log levels to Graylog2 log priorities. + * + * @var array<int, int> + * + * @phpstan-var array<Level, int> + */ + private $logLevels = [ + Logger::DEBUG => 7, + Logger::INFO => 6, + Logger::NOTICE => 5, + Logger::WARNING => 4, + Logger::ERROR => 3, + Logger::CRITICAL => 2, + Logger::ALERT => 1, + Logger::EMERGENCY => 0, + ]; + + public function __construct(?string $systemName = null, ?string $extraPrefix = null, string $contextPrefix = 'ctxt_', ?int $maxLength = null) + { + if (!class_exists(Message::class)) { + throw new \RuntimeException('Composer package graylog2/gelf-php is required to use Monolog\'s GelfMessageFormatter'); + } + + parent::__construct('U.u'); + + $this->systemName = (is_null($systemName) || $systemName === '') ? (string) gethostname() : $systemName; + + $this->extraPrefix = is_null($extraPrefix) ? '' : $extraPrefix; + $this->contextPrefix = $contextPrefix; + $this->maxLength = is_null($maxLength) ? self::DEFAULT_MAX_LENGTH : $maxLength; + } + + /** + * {@inheritDoc} + */ + public function format(array $record): Message + { + $context = $extra = []; + if (isset($record['context'])) { + /** @var mixed[] $context */ + $context = parent::normalize($record['context']); + } + if (isset($record['extra'])) { + /** @var mixed[] $extra */ + $extra = parent::normalize($record['extra']); + } + + if (!isset($record['datetime'], $record['message'], $record['level'])) { + throw new \InvalidArgumentException('The record should at least contain datetime, message and level keys, '.var_export($record, true).' given'); + } + + $message = new Message(); + $message + ->setTimestamp($record['datetime']) + ->setShortMessage((string) $record['message']) + ->setHost($this->systemName) + ->setLevel($this->logLevels[$record['level']]); + + // message length + system name length + 200 for padding / metadata + $len = 200 + strlen((string) $record['message']) + strlen($this->systemName); + + if ($len > $this->maxLength) { + $message->setShortMessage(Utils::substr($record['message'], 0, $this->maxLength)); + } + + if (isset($record['channel'])) { + $message->setFacility($record['channel']); + } + if (isset($extra['line'])) { + $message->setLine($extra['line']); + unset($extra['line']); + } + if (isset($extra['file'])) { + $message->setFile($extra['file']); + unset($extra['file']); + } + + foreach ($extra as $key => $val) { + $val = is_scalar($val) || null === $val ? $val : $this->toJson($val); + $len = strlen($this->extraPrefix . $key . $val); + if ($len > $this->maxLength) { + $message->setAdditional($this->extraPrefix . $key, Utils::substr((string) $val, 0, $this->maxLength)); + + continue; + } + $message->setAdditional($this->extraPrefix . $key, $val); + } + + foreach ($context as $key => $val) { + $val = is_scalar($val) || null === $val ? $val : $this->toJson($val); + $len = strlen($this->contextPrefix . $key . $val); + if ($len > $this->maxLength) { + $message->setAdditional($this->contextPrefix . $key, Utils::substr((string) $val, 0, $this->maxLength)); + + continue; + } + $message->setAdditional($this->contextPrefix . $key, $val); + } + + /** @phpstan-ignore-next-line */ + if (null === $message->getFile() && isset($context['exception']['file'])) { + if (preg_match("/^(.+):([0-9]+)$/", $context['exception']['file'], $matches)) { + $message->setFile($matches[1]); + $message->setLine($matches[2]); + } + } + + return $message; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/GoogleCloudLoggingFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/GoogleCloudLoggingFormatter.php new file mode 100644 index 0000000..0cd287f --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/GoogleCloudLoggingFormatter.php @@ -0,0 +1,39 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use DateTimeInterface; +use Monolog\LogRecord; + +/** + * Encodes message information into JSON in a format compatible with Cloud logging. + * + * @see https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry + * + * @author Luís Cobucci <lcobucci@gmail.com> + */ +final class GoogleCloudLoggingFormatter extends JsonFormatter +{ + /** {@inheritdoc} **/ + public function format(array $record): string + { + // Re-key level for GCP logging + $record['severity'] = $record['level_name']; + $record['timestamp'] = $record['datetime']->format(DateTimeInterface::RFC3339_EXTENDED); + + // Remove keys that are not used by GCP + unset($record['level'], $record['level_name'], $record['datetime']); + + return parent::format($record); + } +} + diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php new file mode 100644 index 0000000..10a4311 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php @@ -0,0 +1,142 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Logger; +use Monolog\Utils; + +/** + * Formats incoming records into an HTML table + * + * This is especially useful for html email logging + * + * @author Tiago Brito <tlfbrito@gmail.com> + */ +class HtmlFormatter extends NormalizerFormatter +{ + /** + * Translates Monolog log levels to html color priorities. + * + * @var array<int, string> + */ + protected $logLevels = [ + Logger::DEBUG => '#CCCCCC', + Logger::INFO => '#28A745', + Logger::NOTICE => '#17A2B8', + Logger::WARNING => '#FFC107', + Logger::ERROR => '#FD7E14', + Logger::CRITICAL => '#DC3545', + Logger::ALERT => '#821722', + Logger::EMERGENCY => '#000000', + ]; + + /** + * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format + */ + public function __construct(?string $dateFormat = null) + { + parent::__construct($dateFormat); + } + + /** + * Creates an HTML table row + * + * @param string $th Row header content + * @param string $td Row standard cell content + * @param bool $escapeTd false if td content must not be html escaped + */ + protected function addRow(string $th, string $td = ' ', bool $escapeTd = true): string + { + $th = htmlspecialchars($th, ENT_NOQUOTES, 'UTF-8'); + if ($escapeTd) { + $td = '<pre>'.htmlspecialchars($td, ENT_NOQUOTES, 'UTF-8').'</pre>'; + } + + return "<tr style=\"padding: 4px;text-align: left;\">\n<th style=\"vertical-align: top;background: #ccc;color: #000\" width=\"100\">$th:</th>\n<td style=\"padding: 4px;text-align: left;vertical-align: top;background: #eee;color: #000\">".$td."</td>\n</tr>"; + } + + /** + * Create a HTML h1 tag + * + * @param string $title Text to be in the h1 + * @param int $level Error level + * @return string + */ + protected function addTitle(string $title, int $level): string + { + $title = htmlspecialchars($title, ENT_NOQUOTES, 'UTF-8'); + + return '<h1 style="background: '.$this->logLevels[$level].';color: #ffffff;padding: 5px;" class="monolog-output">'.$title.'</h1>'; + } + + /** + * Formats a log record. + * + * @return string The formatted record + */ + public function format(array $record): string + { + $output = $this->addTitle($record['level_name'], $record['level']); + $output .= '<table cellspacing="1" width="100%" class="monolog-output">'; + + $output .= $this->addRow('Message', (string) $record['message']); + $output .= $this->addRow('Time', $this->formatDate($record['datetime'])); + $output .= $this->addRow('Channel', $record['channel']); + if ($record['context']) { + $embeddedTable = '<table cellspacing="1" width="100%">'; + foreach ($record['context'] as $key => $value) { + $embeddedTable .= $this->addRow((string) $key, $this->convertToString($value)); + } + $embeddedTable .= '</table>'; + $output .= $this->addRow('Context', $embeddedTable, false); + } + if ($record['extra']) { + $embeddedTable = '<table cellspacing="1" width="100%">'; + foreach ($record['extra'] as $key => $value) { + $embeddedTable .= $this->addRow((string) $key, $this->convertToString($value)); + } + $embeddedTable .= '</table>'; + $output .= $this->addRow('Extra', $embeddedTable, false); + } + + return $output.'</table>'; + } + + /** + * Formats a set of log records. + * + * @return string The formatted set of records + */ + public function formatBatch(array $records): string + { + $message = ''; + foreach ($records as $record) { + $message .= $this->format($record); + } + + return $message; + } + + /** + * @param mixed $data + */ + protected function convertToString($data): string + { + if (null === $data || is_scalar($data)) { + return (string) $data; + } + + $data = $this->normalize($data); + + return Utils::jsonEncode($data, JSON_PRETTY_PRINT | Utils::DEFAULT_JSON_FLAGS, true); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php new file mode 100644 index 0000000..b737d82 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php @@ -0,0 +1,224 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Throwable; + +/** + * Encodes whatever record data is passed to it as json + * + * This can be useful to log to databases or remote APIs + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * + * @phpstan-import-type Record from \Monolog\Logger + */ +class JsonFormatter extends NormalizerFormatter +{ + public const BATCH_MODE_JSON = 1; + public const BATCH_MODE_NEWLINES = 2; + + /** @var self::BATCH_MODE_* */ + protected $batchMode; + /** @var bool */ + protected $appendNewline; + /** @var bool */ + protected $ignoreEmptyContextAndExtra; + /** @var bool */ + protected $includeStacktraces = false; + + /** + * @param self::BATCH_MODE_* $batchMode + */ + public function __construct(int $batchMode = self::BATCH_MODE_JSON, bool $appendNewline = true, bool $ignoreEmptyContextAndExtra = false, bool $includeStacktraces = false) + { + $this->batchMode = $batchMode; + $this->appendNewline = $appendNewline; + $this->ignoreEmptyContextAndExtra = $ignoreEmptyContextAndExtra; + $this->includeStacktraces = $includeStacktraces; + + parent::__construct(); + } + + /** + * The batch mode option configures the formatting style for + * multiple records. By default, multiple records will be + * formatted as a JSON-encoded array. However, for + * compatibility with some API endpoints, alternative styles + * are available. + */ + public function getBatchMode(): int + { + return $this->batchMode; + } + + /** + * True if newlines are appended to every formatted record + */ + public function isAppendingNewlines(): bool + { + return $this->appendNewline; + } + + /** + * {@inheritDoc} + */ + public function format(array $record): string + { + $normalized = $this->normalize($record); + + if (isset($normalized['context']) && $normalized['context'] === []) { + if ($this->ignoreEmptyContextAndExtra) { + unset($normalized['context']); + } else { + $normalized['context'] = new \stdClass; + } + } + if (isset($normalized['extra']) && $normalized['extra'] === []) { + if ($this->ignoreEmptyContextAndExtra) { + unset($normalized['extra']); + } else { + $normalized['extra'] = new \stdClass; + } + } + + return $this->toJson($normalized, true) . ($this->appendNewline ? "\n" : ''); + } + + /** + * {@inheritDoc} + */ + public function formatBatch(array $records): string + { + switch ($this->batchMode) { + case static::BATCH_MODE_NEWLINES: + return $this->formatBatchNewlines($records); + + case static::BATCH_MODE_JSON: + default: + return $this->formatBatchJson($records); + } + } + + /** + * @return self + */ + public function includeStacktraces(bool $include = true): self + { + $this->includeStacktraces = $include; + + return $this; + } + + /** + * Return a JSON-encoded array of records. + * + * @phpstan-param Record[] $records + */ + protected function formatBatchJson(array $records): string + { + return $this->toJson($this->normalize($records), true); + } + + /** + * Use new lines to separate records instead of a + * JSON-encoded array. + * + * @phpstan-param Record[] $records + */ + protected function formatBatchNewlines(array $records): string + { + $instance = $this; + + $oldNewline = $this->appendNewline; + $this->appendNewline = false; + array_walk($records, function (&$value, $key) use ($instance) { + $value = $instance->format($value); + }); + $this->appendNewline = $oldNewline; + + return implode("\n", $records); + } + + /** + * Normalizes given $data. + * + * @param mixed $data + * + * @return mixed + */ + protected function normalize($data, int $depth = 0) + { + if ($depth > $this->maxNormalizeDepth) { + return 'Over '.$this->maxNormalizeDepth.' levels deep, aborting normalization'; + } + + if (is_array($data)) { + $normalized = []; + + $count = 1; + foreach ($data as $key => $value) { + if ($count++ > $this->maxNormalizeItemCount) { + $normalized['...'] = 'Over '.$this->maxNormalizeItemCount.' items ('.count($data).' total), aborting normalization'; + break; + } + + $normalized[$key] = $this->normalize($value, $depth + 1); + } + + return $normalized; + } + + if (is_object($data)) { + if ($data instanceof \DateTimeInterface) { + return $this->formatDate($data); + } + + if ($data instanceof Throwable) { + return $this->normalizeException($data, $depth); + } + + // if the object has specific json serializability we want to make sure we skip the __toString treatment below + if ($data instanceof \JsonSerializable) { + return $data; + } + + if (method_exists($data, '__toString')) { + return $data->__toString(); + } + + return $data; + } + + if (is_resource($data)) { + return parent::normalize($data); + } + + return $data; + } + + /** + * Normalizes given exception with or without its own stack trace based on + * `includeStacktraces` property. + * + * {@inheritDoc} + */ + protected function normalizeException(Throwable $e, int $depth = 0): array + { + $data = parent::normalizeException($e, $depth); + if (!$this->includeStacktraces) { + unset($data['trace']); + } + + return $data; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php new file mode 100644 index 0000000..b31b297 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php @@ -0,0 +1,246 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Utils; + +/** + * Formats incoming records into a one-line string + * + * This is especially useful for logging to files + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * @author Christophe Coevoet <stof@notk.org> + */ +class LineFormatter extends NormalizerFormatter +{ + public const SIMPLE_FORMAT = "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n"; + + /** @var string */ + protected $format; + /** @var bool */ + protected $allowInlineLineBreaks; + /** @var bool */ + protected $ignoreEmptyContextAndExtra; + /** @var bool */ + protected $includeStacktraces; + /** @var ?callable */ + protected $stacktracesParser; + + /** + * @param string|null $format The format of the message + * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format + * @param bool $allowInlineLineBreaks Whether to allow inline line breaks in log entries + * @param bool $ignoreEmptyContextAndExtra + */ + public function __construct(?string $format = null, ?string $dateFormat = null, bool $allowInlineLineBreaks = false, bool $ignoreEmptyContextAndExtra = false, bool $includeStacktraces = false) + { + $this->format = $format === null ? static::SIMPLE_FORMAT : $format; + $this->allowInlineLineBreaks = $allowInlineLineBreaks; + $this->ignoreEmptyContextAndExtra = $ignoreEmptyContextAndExtra; + $this->includeStacktraces($includeStacktraces); + parent::__construct($dateFormat); + } + + public function includeStacktraces(bool $include = true, ?callable $parser = null): self + { + $this->includeStacktraces = $include; + if ($this->includeStacktraces) { + $this->allowInlineLineBreaks = true; + $this->stacktracesParser = $parser; + } + + return $this; + } + + public function allowInlineLineBreaks(bool $allow = true): self + { + $this->allowInlineLineBreaks = $allow; + + return $this; + } + + public function ignoreEmptyContextAndExtra(bool $ignore = true): self + { + $this->ignoreEmptyContextAndExtra = $ignore; + + return $this; + } + + /** + * {@inheritDoc} + */ + public function format(array $record): string + { + $vars = parent::format($record); + + $output = $this->format; + + foreach ($vars['extra'] as $var => $val) { + if (false !== strpos($output, '%extra.'.$var.'%')) { + $output = str_replace('%extra.'.$var.'%', $this->stringify($val), $output); + unset($vars['extra'][$var]); + } + } + + foreach ($vars['context'] as $var => $val) { + if (false !== strpos($output, '%context.'.$var.'%')) { + $output = str_replace('%context.'.$var.'%', $this->stringify($val), $output); + unset($vars['context'][$var]); + } + } + + if ($this->ignoreEmptyContextAndExtra) { + if (empty($vars['context'])) { + unset($vars['context']); + $output = str_replace('%context%', '', $output); + } + + if (empty($vars['extra'])) { + unset($vars['extra']); + $output = str_replace('%extra%', '', $output); + } + } + + foreach ($vars as $var => $val) { + if (false !== strpos($output, '%'.$var.'%')) { + $output = str_replace('%'.$var.'%', $this->stringify($val), $output); + } + } + + // remove leftover %extra.xxx% and %context.xxx% if any + if (false !== strpos($output, '%')) { + $output = preg_replace('/%(?:extra|context)\..+?%/', '', $output); + if (null === $output) { + $pcreErrorCode = preg_last_error(); + throw new \RuntimeException('Failed to run preg_replace: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode)); + } + } + + return $output; + } + + public function formatBatch(array $records): string + { + $message = ''; + foreach ($records as $record) { + $message .= $this->format($record); + } + + return $message; + } + + /** + * @param mixed $value + */ + public function stringify($value): string + { + return $this->replaceNewlines($this->convertToString($value)); + } + + protected function normalizeException(\Throwable $e, int $depth = 0): string + { + $str = $this->formatException($e); + + if ($previous = $e->getPrevious()) { + do { + $depth++; + if ($depth > $this->maxNormalizeDepth) { + $str .= '\n[previous exception] Over ' . $this->maxNormalizeDepth . ' levels deep, aborting normalization'; + break; + } + + $str .= "\n[previous exception] " . $this->formatException($previous); + } while ($previous = $previous->getPrevious()); + } + + return $str; + } + + /** + * @param mixed $data + */ + protected function convertToString($data): string + { + if (null === $data || is_bool($data)) { + return var_export($data, true); + } + + if (is_scalar($data)) { + return (string) $data; + } + + return $this->toJson($data, true); + } + + protected function replaceNewlines(string $str): string + { + if ($this->allowInlineLineBreaks) { + if (0 === strpos($str, '{')) { + $str = preg_replace('/(?<!\\\\)\\\\[rn]/', "\n", $str); + if (null === $str) { + $pcreErrorCode = preg_last_error(); + throw new \RuntimeException('Failed to run preg_replace: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode)); + } + } + + return $str; + } + + return str_replace(["\r\n", "\r", "\n"], ' ', $str); + } + + private function formatException(\Throwable $e): string + { + $str = '[object] (' . Utils::getClass($e) . '(code: ' . $e->getCode(); + if ($e instanceof \SoapFault) { + if (isset($e->faultcode)) { + $str .= ' faultcode: ' . $e->faultcode; + } + + if (isset($e->faultactor)) { + $str .= ' faultactor: ' . $e->faultactor; + } + + if (isset($e->detail)) { + if (is_string($e->detail)) { + $str .= ' detail: ' . $e->detail; + } elseif (is_object($e->detail) || is_array($e->detail)) { + $str .= ' detail: ' . $this->toJson($e->detail, true); + } + } + } + $str .= '): ' . $e->getMessage() . ' at ' . $e->getFile() . ':' . $e->getLine() . ')'; + + if ($this->includeStacktraces) { + $str .= $this->stacktracesParser($e); + } + + return $str; + } + + private function stacktracesParser(\Throwable $e): string + { + $trace = $e->getTraceAsString(); + + if ($this->stacktracesParser) { + $trace = $this->stacktracesParserCustom($trace); + } + + return "\n[stacktrace]\n" . $trace . "\n"; + } + + private function stacktracesParserCustom(string $trace): string + { + return implode("\n", array_filter(array_map($this->stacktracesParser, explode("\n", $trace)))); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php new file mode 100644 index 0000000..29841aa --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php @@ -0,0 +1,45 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * Encodes message information into JSON in a format compatible with Loggly. + * + * @author Adam Pancutt <adam@pancutt.com> + */ +class LogglyFormatter extends JsonFormatter +{ + /** + * Overrides the default batch mode to new lines for compatibility with the + * Loggly bulk API. + */ + public function __construct(int $batchMode = self::BATCH_MODE_NEWLINES, bool $appendNewline = false) + { + parent::__construct($batchMode, $appendNewline); + } + + /** + * Appends the 'timestamp' parameter for indexing by Loggly. + * + * @see https://www.loggly.com/docs/automated-parsing/#json + * @see \Monolog\Formatter\JsonFormatter::format() + */ + public function format(array $record): string + { + if (isset($record["datetime"]) && ($record["datetime"] instanceof \DateTimeInterface)) { + $record["timestamp"] = $record["datetime"]->format("Y-m-d\TH:i:s.uO"); + unset($record["datetime"]); + } + + return parent::format($record); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php new file mode 100644 index 0000000..b0451ab --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/LogmaticFormatter.php @@ -0,0 +1,66 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * Encodes message information into JSON in a format compatible with Logmatic. + * + * @author Julien Breux <julien.breux@gmail.com> + */ +class LogmaticFormatter extends JsonFormatter +{ + protected const MARKERS = ["sourcecode", "php"]; + + /** + * @var string + */ + protected $hostname = ''; + + /** + * @var string + */ + protected $appname = ''; + + public function setHostname(string $hostname): self + { + $this->hostname = $hostname; + + return $this; + } + + public function setAppname(string $appname): self + { + $this->appname = $appname; + + return $this; + } + + /** + * Appends the 'hostname' and 'appname' parameter for indexing by Logmatic. + * + * @see http://doc.logmatic.io/docs/basics-to-send-data + * @see \Monolog\Formatter\JsonFormatter::format() + */ + public function format(array $record): string + { + if (!empty($this->hostname)) { + $record["hostname"] = $this->hostname; + } + if (!empty($this->appname)) { + $record["appname"] = $this->appname; + } + + $record["@marker"] = static::MARKERS; + + return parent::format($record); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php new file mode 100644 index 0000000..f8de0d3 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php @@ -0,0 +1,101 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * Serializes a log message to Logstash Event Format + * + * @see https://www.elastic.co/products/logstash + * @see https://github.com/elastic/logstash/blob/master/logstash-core/src/main/java/org/logstash/Event.java + * + * @author Tim Mower <timothy.mower@gmail.com> + */ +class LogstashFormatter extends NormalizerFormatter +{ + /** + * @var string the name of the system for the Logstash log message, used to fill the @source field + */ + protected $systemName; + + /** + * @var string an application name for the Logstash log message, used to fill the @type field + */ + protected $applicationName; + + /** + * @var string the key for 'extra' fields from the Monolog record + */ + protected $extraKey; + + /** + * @var string the key for 'context' fields from the Monolog record + */ + protected $contextKey; + + /** + * @param string $applicationName The application that sends the data, used as the "type" field of logstash + * @param string|null $systemName The system/machine name, used as the "source" field of logstash, defaults to the hostname of the machine + * @param string $extraKey The key for extra keys inside logstash "fields", defaults to extra + * @param string $contextKey The key for context keys inside logstash "fields", defaults to context + */ + public function __construct(string $applicationName, ?string $systemName = null, string $extraKey = 'extra', string $contextKey = 'context') + { + // logstash requires a ISO 8601 format date with optional millisecond precision. + parent::__construct('Y-m-d\TH:i:s.uP'); + + $this->systemName = $systemName === null ? (string) gethostname() : $systemName; + $this->applicationName = $applicationName; + $this->extraKey = $extraKey; + $this->contextKey = $contextKey; + } + + /** + * {@inheritDoc} + */ + public function format(array $record): string + { + $record = parent::format($record); + + if (empty($record['datetime'])) { + $record['datetime'] = gmdate('c'); + } + $message = [ + '@timestamp' => $record['datetime'], + '@version' => 1, + 'host' => $this->systemName, + ]; + if (isset($record['message'])) { + $message['message'] = $record['message']; + } + if (isset($record['channel'])) { + $message['type'] = $record['channel']; + $message['channel'] = $record['channel']; + } + if (isset($record['level_name'])) { + $message['level'] = $record['level_name']; + } + if (isset($record['level'])) { + $message['monolog_level'] = $record['level']; + } + if ($this->applicationName) { + $message['type'] = $this->applicationName; + } + if (!empty($record['extra'])) { + $message[$this->extraKey] = $record['extra']; + } + if (!empty($record['context'])) { + $message[$this->contextKey] = $record['context']; + } + + return $this->toJson($message) . "\n"; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php new file mode 100644 index 0000000..fca69a8 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php @@ -0,0 +1,162 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use MongoDB\BSON\Type; +use MongoDB\BSON\UTCDateTime; +use Monolog\Utils; + +/** + * Formats a record for use with the MongoDBHandler. + * + * @author Florian Plattner <me@florianplattner.de> + */ +class MongoDBFormatter implements FormatterInterface +{ + /** @var bool */ + private $exceptionTraceAsString; + /** @var int */ + private $maxNestingLevel; + /** @var bool */ + private $isLegacyMongoExt; + + /** + * @param int $maxNestingLevel 0 means infinite nesting, the $record itself is level 1, $record['context'] is 2 + * @param bool $exceptionTraceAsString set to false to log exception traces as a sub documents instead of strings + */ + public function __construct(int $maxNestingLevel = 3, bool $exceptionTraceAsString = true) + { + $this->maxNestingLevel = max($maxNestingLevel, 0); + $this->exceptionTraceAsString = $exceptionTraceAsString; + + $this->isLegacyMongoExt = extension_loaded('mongodb') && version_compare((string) phpversion('mongodb'), '1.1.9', '<='); + } + + /** + * {@inheritDoc} + * + * @return mixed[] + */ + public function format(array $record): array + { + /** @var mixed[] $res */ + $res = $this->formatArray($record); + + return $res; + } + + /** + * {@inheritDoc} + * + * @return array<mixed[]> + */ + public function formatBatch(array $records): array + { + $formatted = []; + foreach ($records as $key => $record) { + $formatted[$key] = $this->format($record); + } + + return $formatted; + } + + /** + * @param mixed[] $array + * @return mixed[]|string Array except when max nesting level is reached then a string "[...]" + */ + protected function formatArray(array $array, int $nestingLevel = 0) + { + if ($this->maxNestingLevel > 0 && $nestingLevel > $this->maxNestingLevel) { + return '[...]'; + } + + foreach ($array as $name => $value) { + if ($value instanceof \DateTimeInterface) { + $array[$name] = $this->formatDate($value, $nestingLevel + 1); + } elseif ($value instanceof \Throwable) { + $array[$name] = $this->formatException($value, $nestingLevel + 1); + } elseif (is_array($value)) { + $array[$name] = $this->formatArray($value, $nestingLevel + 1); + } elseif (is_object($value) && !$value instanceof Type) { + $array[$name] = $this->formatObject($value, $nestingLevel + 1); + } + } + + return $array; + } + + /** + * @param mixed $value + * @return mixed[]|string + */ + protected function formatObject($value, int $nestingLevel) + { + $objectVars = get_object_vars($value); + $objectVars['class'] = Utils::getClass($value); + + return $this->formatArray($objectVars, $nestingLevel); + } + + /** + * @return mixed[]|string + */ + protected function formatException(\Throwable $exception, int $nestingLevel) + { + $formattedException = [ + 'class' => Utils::getClass($exception), + 'message' => $exception->getMessage(), + 'code' => (int) $exception->getCode(), + 'file' => $exception->getFile() . ':' . $exception->getLine(), + ]; + + if ($this->exceptionTraceAsString === true) { + $formattedException['trace'] = $exception->getTraceAsString(); + } else { + $formattedException['trace'] = $exception->getTrace(); + } + + return $this->formatArray($formattedException, $nestingLevel); + } + + protected function formatDate(\DateTimeInterface $value, int $nestingLevel): UTCDateTime + { + if ($this->isLegacyMongoExt) { + return $this->legacyGetMongoDbDateTime($value); + } + + return $this->getMongoDbDateTime($value); + } + + private function getMongoDbDateTime(\DateTimeInterface $value): UTCDateTime + { + return new UTCDateTime((int) floor(((float) $value->format('U.u')) * 1000)); + } + + /** + * This is needed to support MongoDB Driver v1.19 and below + * + * See https://github.com/mongodb/mongo-php-driver/issues/426 + * + * It can probably be removed in 2.1 or later once MongoDB's 1.2 is released and widely adopted + */ + private function legacyGetMongoDbDateTime(\DateTimeInterface $value): UTCDateTime + { + $milliseconds = floor(((float) $value->format('U.u')) * 1000); + + $milliseconds = (PHP_INT_SIZE == 8) //64-bit OS? + ? (int) $milliseconds + : (string) $milliseconds; + + // @phpstan-ignore-next-line + return new UTCDateTime($milliseconds); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php new file mode 100644 index 0000000..5441bc0 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php @@ -0,0 +1,287 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\DateTimeImmutable; +use Monolog\Utils; +use Throwable; + +/** + * Normalizes incoming records to remove objects/resources so it's easier to dump to various targets + * + * @author Jordi Boggiano <j.boggiano@seld.be> + */ +class NormalizerFormatter implements FormatterInterface +{ + public const SIMPLE_DATE = "Y-m-d\TH:i:sP"; + + /** @var string */ + protected $dateFormat; + /** @var int */ + protected $maxNormalizeDepth = 9; + /** @var int */ + protected $maxNormalizeItemCount = 1000; + + /** @var int */ + private $jsonEncodeOptions = Utils::DEFAULT_JSON_FLAGS; + + /** + * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format + */ + public function __construct(?string $dateFormat = null) + { + $this->dateFormat = null === $dateFormat ? static::SIMPLE_DATE : $dateFormat; + if (!function_exists('json_encode')) { + throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s NormalizerFormatter'); + } + } + + /** + * {@inheritDoc} + * + * @param mixed[] $record + */ + public function format(array $record) + { + return $this->normalize($record); + } + + /** + * {@inheritDoc} + */ + public function formatBatch(array $records) + { + foreach ($records as $key => $record) { + $records[$key] = $this->format($record); + } + + return $records; + } + + public function getDateFormat(): string + { + return $this->dateFormat; + } + + public function setDateFormat(string $dateFormat): self + { + $this->dateFormat = $dateFormat; + + return $this; + } + + /** + * The maximum number of normalization levels to go through + */ + public function getMaxNormalizeDepth(): int + { + return $this->maxNormalizeDepth; + } + + public function setMaxNormalizeDepth(int $maxNormalizeDepth): self + { + $this->maxNormalizeDepth = $maxNormalizeDepth; + + return $this; + } + + /** + * The maximum number of items to normalize per level + */ + public function getMaxNormalizeItemCount(): int + { + return $this->maxNormalizeItemCount; + } + + public function setMaxNormalizeItemCount(int $maxNormalizeItemCount): self + { + $this->maxNormalizeItemCount = $maxNormalizeItemCount; + + return $this; + } + + /** + * Enables `json_encode` pretty print. + */ + public function setJsonPrettyPrint(bool $enable): self + { + if ($enable) { + $this->jsonEncodeOptions |= JSON_PRETTY_PRINT; + } else { + $this->jsonEncodeOptions &= ~JSON_PRETTY_PRINT; + } + + return $this; + } + + /** + * @param mixed $data + * @return null|scalar|array<array|scalar|null> + */ + protected function normalize($data, int $depth = 0) + { + if ($depth > $this->maxNormalizeDepth) { + return 'Over ' . $this->maxNormalizeDepth . ' levels deep, aborting normalization'; + } + + if (null === $data || is_scalar($data)) { + if (is_float($data)) { + if (is_infinite($data)) { + return ($data > 0 ? '' : '-') . 'INF'; + } + if (is_nan($data)) { + return 'NaN'; + } + } + + return $data; + } + + if (is_array($data)) { + $normalized = []; + + $count = 1; + foreach ($data as $key => $value) { + if ($count++ > $this->maxNormalizeItemCount) { + $normalized['...'] = 'Over ' . $this->maxNormalizeItemCount . ' items ('.count($data).' total), aborting normalization'; + break; + } + + $normalized[$key] = $this->normalize($value, $depth + 1); + } + + return $normalized; + } + + if ($data instanceof \DateTimeInterface) { + return $this->formatDate($data); + } + + if (is_object($data)) { + if ($data instanceof Throwable) { + return $this->normalizeException($data, $depth); + } + + if ($data instanceof \JsonSerializable) { + /** @var null|scalar|array<array|scalar|null> $value */ + $value = $data->jsonSerialize(); + } elseif (method_exists($data, '__toString')) { + /** @var string $value */ + $value = $data->__toString(); + } else { + // the rest is normalized by json encoding and decoding it + /** @var null|scalar|array<array|scalar|null> $value */ + $value = json_decode($this->toJson($data, true), true); + } + + return [Utils::getClass($data) => $value]; + } + + if (is_resource($data)) { + return sprintf('[resource(%s)]', get_resource_type($data)); + } + + return '[unknown('.gettype($data).')]'; + } + + /** + * @return mixed[] + */ + protected function normalizeException(Throwable $e, int $depth = 0) + { + if ($depth > $this->maxNormalizeDepth) { + return ['Over ' . $this->maxNormalizeDepth . ' levels deep, aborting normalization']; + } + + if ($e instanceof \JsonSerializable) { + return (array) $e->jsonSerialize(); + } + + $data = [ + 'class' => Utils::getClass($e), + 'message' => $e->getMessage(), + 'code' => (int) $e->getCode(), + 'file' => $e->getFile().':'.$e->getLine(), + ]; + + if ($e instanceof \SoapFault) { + if (isset($e->faultcode)) { + $data['faultcode'] = $e->faultcode; + } + + if (isset($e->faultactor)) { + $data['faultactor'] = $e->faultactor; + } + + if (isset($e->detail)) { + if (is_string($e->detail)) { + $data['detail'] = $e->detail; + } elseif (is_object($e->detail) || is_array($e->detail)) { + $data['detail'] = $this->toJson($e->detail, true); + } + } + } + + $trace = $e->getTrace(); + foreach ($trace as $frame) { + if (isset($frame['file'])) { + $data['trace'][] = $frame['file'].':'.$frame['line']; + } + } + + if ($previous = $e->getPrevious()) { + $data['previous'] = $this->normalizeException($previous, $depth + 1); + } + + return $data; + } + + /** + * Return the JSON representation of a value + * + * @param mixed $data + * @throws \RuntimeException if encoding fails and errors are not ignored + * @return string if encoding fails and ignoreErrors is true 'null' is returned + */ + protected function toJson($data, bool $ignoreErrors = false): string + { + return Utils::jsonEncode($data, $this->jsonEncodeOptions, $ignoreErrors); + } + + /** + * @return string + */ + protected function formatDate(\DateTimeInterface $date) + { + // in case the date format isn't custom then we defer to the custom DateTimeImmutable + // formatting logic, which will pick the right format based on whether useMicroseconds is on + if ($this->dateFormat === self::SIMPLE_DATE && $date instanceof DateTimeImmutable) { + return (string) $date; + } + + return $date->format($this->dateFormat); + } + + public function addJsonEncodeOption(int $option): self + { + $this->jsonEncodeOptions |= $option; + + return $this; + } + + public function removeJsonEncodeOption(int $option): self + { + $this->jsonEncodeOptions &= ~$option; + + return $this; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php new file mode 100644 index 0000000..187bc55 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php @@ -0,0 +1,51 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +/** + * Formats data into an associative array of scalar values. + * Objects and arrays will be JSON encoded. + * + * @author Andrew Lawson <adlawson@gmail.com> + */ +class ScalarFormatter extends NormalizerFormatter +{ + /** + * {@inheritDoc} + * + * @phpstan-return array<string, scalar|null> $record + */ + public function format(array $record): array + { + $result = []; + foreach ($record as $key => $value) { + $result[$key] = $this->normalizeValue($value); + } + + return $result; + } + + /** + * @param mixed $value + * @return scalar|null + */ + protected function normalizeValue($value) + { + $normalized = $this->normalize($value); + + if (is_array($normalized)) { + return $this->toJson($normalized, true); + } + + return $normalized; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php new file mode 100644 index 0000000..6539b34 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php @@ -0,0 +1,139 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Formatter; + +use Monolog\Logger; + +/** + * Serializes a log message according to Wildfire's header requirements + * + * @author Eric Clemmons (@ericclemmons) <eric@uxdriven.com> + * @author Christophe Coevoet <stof@notk.org> + * @author Kirill chEbba Chebunin <iam@chebba.org> + * + * @phpstan-import-type Level from \Monolog\Logger + */ +class WildfireFormatter extends NormalizerFormatter +{ + /** + * Translates Monolog log levels to Wildfire levels. + * + * @var array<Level, string> + */ + private $logLevels = [ + Logger::DEBUG => 'LOG', + Logger::INFO => 'INFO', + Logger::NOTICE => 'INFO', + Logger::WARNING => 'WARN', + Logger::ERROR => 'ERROR', + Logger::CRITICAL => 'ERROR', + Logger::ALERT => 'ERROR', + Logger::EMERGENCY => 'ERROR', + ]; + + /** + * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format + */ + public function __construct(?string $dateFormat = null) + { + parent::__construct($dateFormat); + + // http headers do not like non-ISO-8559-1 characters + $this->removeJsonEncodeOption(JSON_UNESCAPED_UNICODE); + } + + /** + * {@inheritDoc} + * + * @return string + */ + public function format(array $record): string + { + // Retrieve the line and file if set and remove them from the formatted extra + $file = $line = ''; + if (isset($record['extra']['file'])) { + $file = $record['extra']['file']; + unset($record['extra']['file']); + } + if (isset($record['extra']['line'])) { + $line = $record['extra']['line']; + unset($record['extra']['line']); + } + + /** @var mixed[] $record */ + $record = $this->normalize($record); + $message = ['message' => $record['message']]; + $handleError = false; + if ($record['context']) { + $message['context'] = $record['context']; + $handleError = true; + } + if ($record['extra']) { + $message['extra'] = $record['extra']; + $handleError = true; + } + if (count($message) === 1) { + $message = reset($message); + } + + if (isset($record['context']['table'])) { + $type = 'TABLE'; + $label = $record['channel'] .': '. $record['message']; + $message = $record['context']['table']; + } else { + $type = $this->logLevels[$record['level']]; + $label = $record['channel']; + } + + // Create JSON object describing the appearance of the message in the console + $json = $this->toJson([ + [ + 'Type' => $type, + 'File' => $file, + 'Line' => $line, + 'Label' => $label, + ], + $message, + ], $handleError); + + // The message itself is a serialization of the above JSON object + it's length + return sprintf( + '%d|%s|', + strlen($json), + $json + ); + } + + /** + * {@inheritDoc} + * + * @phpstan-return never + */ + public function formatBatch(array $records) + { + throw new \BadMethodCallException('Batch formatting does not make sense for the WildfireFormatter'); + } + + /** + * {@inheritDoc} + * + * @return null|scalar|array<array|scalar|null>|object + */ + protected function normalize($data, int $depth = 0) + { + if (is_object($data) && !$data instanceof \DateTimeInterface) { + return $data; + } + + return parent::normalize($data, $depth); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php new file mode 100644 index 0000000..a5cdaa7 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php @@ -0,0 +1,112 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\ResettableInterface; +use Psr\Log\LogLevel; + +/** + * Base Handler class providing basic level/bubble support + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +abstract class AbstractHandler extends Handler implements ResettableInterface +{ + /** + * @var int + * @phpstan-var Level + */ + protected $level = Logger::DEBUG; + /** @var bool */ + protected $bubble = true; + + /** + * @param int|string $level The minimum logging level at which this handler will be triggered + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function __construct($level = Logger::DEBUG, bool $bubble = true) + { + $this->setLevel($level); + $this->bubble = $bubble; + } + + /** + * {@inheritDoc} + */ + public function isHandling(array $record): bool + { + return $record['level'] >= $this->level; + } + + /** + * Sets minimum logging level at which this handler will be triggered. + * + * @param Level|LevelName|LogLevel::* $level Level or level name + * @return self + */ + public function setLevel($level): self + { + $this->level = Logger::toMonologLevel($level); + + return $this; + } + + /** + * Gets minimum logging level at which this handler will be triggered. + * + * @return int + * + * @phpstan-return Level + */ + public function getLevel(): int + { + return $this->level; + } + + /** + * Sets the bubbling behavior. + * + * @param bool $bubble true means that this handler allows bubbling. + * false means that bubbling is not permitted. + * @return self + */ + public function setBubble(bool $bubble): self + { + $this->bubble = $bubble; + + return $this; + } + + /** + * Gets the bubbling behavior. + * + * @return bool true means that this handler allows bubbling. + * false means that bubbling is not permitted. + */ + public function getBubble(): bool + { + return $this->bubble; + } + + /** + * {@inheritDoc} + */ + public function reset() + { + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php new file mode 100644 index 0000000..77e533f --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php @@ -0,0 +1,69 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Base Handler class providing the Handler structure, including processors and formatters + * + * Classes extending it should (in most cases) only implement write($record) + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * @author Christophe Coevoet <stof@notk.org> + * + * @phpstan-import-type LevelName from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-type FormattedRecord array{message: string, context: mixed[], level: Level, level_name: LevelName, channel: string, datetime: \DateTimeImmutable, extra: mixed[], formatted: mixed} + */ +abstract class AbstractProcessingHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface +{ + use ProcessableHandlerTrait; + use FormattableHandlerTrait; + + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + if (!$this->isHandling($record)) { + return false; + } + + if ($this->processors) { + /** @var Record $record */ + $record = $this->processRecord($record); + } + + $record['formatted'] = $this->getFormatter()->format($record); + + $this->write($record); + + return false === $this->bubble; + } + + /** + * Writes the record down to the log of the implementing handler + * + * @phpstan-param FormattedRecord $record + */ + abstract protected function write(array $record): void; + + /** + * @return void + */ + public function reset() + { + parent::reset(); + + $this->resetProcessors(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php new file mode 100644 index 0000000..5e5ad1c --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php @@ -0,0 +1,106 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; + +/** + * Common syslog functionality + * + * @phpstan-import-type Level from \Monolog\Logger + */ +abstract class AbstractSyslogHandler extends AbstractProcessingHandler +{ + /** @var int */ + protected $facility; + + /** + * Translates Monolog log levels to syslog log priorities. + * @var array + * @phpstan-var array<Level, int> + */ + protected $logLevels = [ + Logger::DEBUG => LOG_DEBUG, + Logger::INFO => LOG_INFO, + Logger::NOTICE => LOG_NOTICE, + Logger::WARNING => LOG_WARNING, + Logger::ERROR => LOG_ERR, + Logger::CRITICAL => LOG_CRIT, + Logger::ALERT => LOG_ALERT, + Logger::EMERGENCY => LOG_EMERG, + ]; + + /** + * List of valid log facility names. + * @var array<string, int> + */ + protected $facilities = [ + 'auth' => LOG_AUTH, + 'authpriv' => LOG_AUTHPRIV, + 'cron' => LOG_CRON, + 'daemon' => LOG_DAEMON, + 'kern' => LOG_KERN, + 'lpr' => LOG_LPR, + 'mail' => LOG_MAIL, + 'news' => LOG_NEWS, + 'syslog' => LOG_SYSLOG, + 'user' => LOG_USER, + 'uucp' => LOG_UUCP, + ]; + + /** + * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant + */ + public function __construct($facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true) + { + parent::__construct($level, $bubble); + + if (!defined('PHP_WINDOWS_VERSION_BUILD')) { + $this->facilities['local0'] = LOG_LOCAL0; + $this->facilities['local1'] = LOG_LOCAL1; + $this->facilities['local2'] = LOG_LOCAL2; + $this->facilities['local3'] = LOG_LOCAL3; + $this->facilities['local4'] = LOG_LOCAL4; + $this->facilities['local5'] = LOG_LOCAL5; + $this->facilities['local6'] = LOG_LOCAL6; + $this->facilities['local7'] = LOG_LOCAL7; + } else { + $this->facilities['local0'] = 128; // LOG_LOCAL0 + $this->facilities['local1'] = 136; // LOG_LOCAL1 + $this->facilities['local2'] = 144; // LOG_LOCAL2 + $this->facilities['local3'] = 152; // LOG_LOCAL3 + $this->facilities['local4'] = 160; // LOG_LOCAL4 + $this->facilities['local5'] = 168; // LOG_LOCAL5 + $this->facilities['local6'] = 176; // LOG_LOCAL6 + $this->facilities['local7'] = 184; // LOG_LOCAL7 + } + + // convert textual description of facility to syslog constant + if (is_string($facility) && array_key_exists(strtolower($facility), $this->facilities)) { + $facility = $this->facilities[strtolower($facility)]; + } elseif (!in_array($facility, array_values($this->facilities), true)) { + throw new \UnexpectedValueException('Unknown facility value "'.$facility.'" given'); + } + + $this->facility = $facility; + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new LineFormatter('%channel%.%level_name%: %message% %context% %extra%'); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php new file mode 100644 index 0000000..c499748 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php @@ -0,0 +1,170 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\JsonFormatter; +use PhpAmqpLib\Message\AMQPMessage; +use PhpAmqpLib\Channel\AMQPChannel; +use AMQPExchange; + +/** + * @phpstan-import-type Record from \Monolog\Logger + */ +class AmqpHandler extends AbstractProcessingHandler +{ + /** + * @var AMQPExchange|AMQPChannel $exchange + */ + protected $exchange; + /** @var array<string, mixed> */ + private $extraAttributes = []; + + /** + * @return array<string, mixed> + */ + public function getExtraAttributes(): array + { + return $this->extraAttributes; + } + + /** + * Configure extra attributes to pass to the AMQPExchange (if you are using the amqp extension) + * + * @param array<string, mixed> $extraAttributes One of content_type, content_encoding, + * message_id, user_id, app_id, delivery_mode, + * priority, timestamp, expiration, type + * or reply_to, headers. + * @return AmqpHandler + */ + public function setExtraAttributes(array $extraAttributes): self + { + $this->extraAttributes = $extraAttributes; + return $this; + } + + /** + * @var string + */ + protected $exchangeName; + + /** + * @param AMQPExchange|AMQPChannel $exchange AMQPExchange (php AMQP ext) or PHP AMQP lib channel, ready for use + * @param string|null $exchangeName Optional exchange name, for AMQPChannel (PhpAmqpLib) only + */ + public function __construct($exchange, ?string $exchangeName = null, $level = Logger::DEBUG, bool $bubble = true) + { + if ($exchange instanceof AMQPChannel) { + $this->exchangeName = (string) $exchangeName; + } elseif (!$exchange instanceof AMQPExchange) { + throw new \InvalidArgumentException('PhpAmqpLib\Channel\AMQPChannel or AMQPExchange instance required'); + } elseif ($exchangeName) { + @trigger_error('The $exchangeName parameter can only be passed when using PhpAmqpLib, if using an AMQPExchange instance configure it beforehand', E_USER_DEPRECATED); + } + $this->exchange = $exchange; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $data = $record["formatted"]; + $routingKey = $this->getRoutingKey($record); + + if ($this->exchange instanceof AMQPExchange) { + $attributes = [ + 'delivery_mode' => 2, + 'content_type' => 'application/json', + ]; + if ($this->extraAttributes) { + $attributes = array_merge($attributes, $this->extraAttributes); + } + $this->exchange->publish( + $data, + $routingKey, + 0, + $attributes + ); + } else { + $this->exchange->basic_publish( + $this->createAmqpMessage($data), + $this->exchangeName, + $routingKey + ); + } + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + if ($this->exchange instanceof AMQPExchange) { + parent::handleBatch($records); + + return; + } + + foreach ($records as $record) { + if (!$this->isHandling($record)) { + continue; + } + + /** @var Record $record */ + $record = $this->processRecord($record); + $data = $this->getFormatter()->format($record); + + $this->exchange->batch_basic_publish( + $this->createAmqpMessage($data), + $this->exchangeName, + $this->getRoutingKey($record) + ); + } + + $this->exchange->publish_batch(); + } + + /** + * Gets the routing key for the AMQP exchange + * + * @phpstan-param Record $record + */ + protected function getRoutingKey(array $record): string + { + $routingKey = sprintf('%s.%s', $record['level_name'], $record['channel']); + + return strtolower($routingKey); + } + + private function createAmqpMessage(string $data): AMQPMessage + { + return new AMQPMessage( + $data, + [ + 'delivery_mode' => 2, + 'content_type' => 'application/json', + ] + ); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php new file mode 100644 index 0000000..fa383f1 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php @@ -0,0 +1,293 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; +use Monolog\Utils; + +use function count; +use function headers_list; +use function stripos; +use function trigger_error; + +use const E_USER_DEPRECATED; + +/** + * Handler sending logs to browser's javascript console with no browser extension required + * + * @author Olivier Poitrey <rs@dailymotion.com> + * + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + */ +class BrowserConsoleHandler extends AbstractProcessingHandler +{ + /** @var bool */ + protected static $initialized = false; + /** @var FormattedRecord[] */ + protected static $records = []; + + protected const FORMAT_HTML = 'html'; + protected const FORMAT_JS = 'js'; + protected const FORMAT_UNKNOWN = 'unknown'; + + /** + * {@inheritDoc} + * + * Formatted output may contain some formatting markers to be transferred to `console.log` using the %c format. + * + * Example of formatted string: + * + * You can do [[blue text]]{color: blue} or [[green background]]{background-color: green; color: white} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new LineFormatter('[[%channel%]]{macro: autolabel} [[%level_name%]]{font-weight: bold} %message%'); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + // Accumulate records + static::$records[] = $record; + + // Register shutdown handler if not already done + if (!static::$initialized) { + static::$initialized = true; + $this->registerShutdownFunction(); + } + } + + /** + * Convert records to javascript console commands and send it to the browser. + * This method is automatically called on PHP shutdown if output is HTML or Javascript. + */ + public static function send(): void + { + $format = static::getResponseFormat(); + if ($format === self::FORMAT_UNKNOWN) { + return; + } + + if (count(static::$records)) { + if ($format === self::FORMAT_HTML) { + static::writeOutput('<script>' . static::generateScript() . '</script>'); + } elseif ($format === self::FORMAT_JS) { + static::writeOutput(static::generateScript()); + } + static::resetStatic(); + } + } + + public function close(): void + { + self::resetStatic(); + } + + public function reset() + { + parent::reset(); + + self::resetStatic(); + } + + /** + * Forget all logged records + */ + public static function resetStatic(): void + { + static::$records = []; + } + + /** + * Wrapper for register_shutdown_function to allow overriding + */ + protected function registerShutdownFunction(): void + { + if (PHP_SAPI !== 'cli') { + register_shutdown_function(['Monolog\Handler\BrowserConsoleHandler', 'send']); + } + } + + /** + * Wrapper for echo to allow overriding + */ + protected static function writeOutput(string $str): void + { + echo $str; + } + + /** + * Checks the format of the response + * + * If Content-Type is set to application/javascript or text/javascript -> js + * If Content-Type is set to text/html, or is unset -> html + * If Content-Type is anything else -> unknown + * + * @return string One of 'js', 'html' or 'unknown' + * @phpstan-return self::FORMAT_* + */ + protected static function getResponseFormat(): string + { + // Check content type + foreach (headers_list() as $header) { + if (stripos($header, 'content-type:') === 0) { + return static::getResponseFormatFromContentType($header); + } + } + + return self::FORMAT_HTML; + } + + /** + * @return string One of 'js', 'html' or 'unknown' + * @phpstan-return self::FORMAT_* + */ + protected static function getResponseFormatFromContentType(string $contentType): string + { + // This handler only works with HTML and javascript outputs + // text/javascript is obsolete in favour of application/javascript, but still used + if (stripos($contentType, 'application/javascript') !== false || stripos($contentType, 'text/javascript') !== false) { + return self::FORMAT_JS; + } + + if (stripos($contentType, 'text/html') !== false) { + return self::FORMAT_HTML; + } + + return self::FORMAT_UNKNOWN; + } + + private static function generateScript(): string + { + $script = []; + foreach (static::$records as $record) { + $context = static::dump('Context', $record['context']); + $extra = static::dump('Extra', $record['extra']); + + if (empty($context) && empty($extra)) { + $script[] = static::call_array('log', static::handleStyles($record['formatted'])); + } else { + $script = array_merge( + $script, + [static::call_array('groupCollapsed', static::handleStyles($record['formatted']))], + $context, + $extra, + [static::call('groupEnd')] + ); + } + } + + return "(function (c) {if (c && c.groupCollapsed) {\n" . implode("\n", $script) . "\n}})(console);"; + } + + /** + * @return string[] + */ + private static function handleStyles(string $formatted): array + { + $args = []; + $format = '%c' . $formatted; + preg_match_all('/\[\[(.*?)\]\]\{([^}]*)\}/s', $format, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); + + foreach (array_reverse($matches) as $match) { + $args[] = '"font-weight: normal"'; + $args[] = static::quote(static::handleCustomStyles($match[2][0], $match[1][0])); + + $pos = $match[0][1]; + $format = Utils::substr($format, 0, $pos) . '%c' . $match[1][0] . '%c' . Utils::substr($format, $pos + strlen($match[0][0])); + } + + $args[] = static::quote('font-weight: normal'); + $args[] = static::quote($format); + + return array_reverse($args); + } + + private static function handleCustomStyles(string $style, string $string): string + { + static $colors = ['blue', 'green', 'red', 'magenta', 'orange', 'black', 'grey']; + static $labels = []; + + $style = preg_replace_callback('/macro\s*:(.*?)(?:;|$)/', function (array $m) use ($string, &$colors, &$labels) { + if (trim($m[1]) === 'autolabel') { + // Format the string as a label with consistent auto assigned background color + if (!isset($labels[$string])) { + $labels[$string] = $colors[count($labels) % count($colors)]; + } + $color = $labels[$string]; + + return "background-color: $color; color: white; border-radius: 3px; padding: 0 2px 0 2px"; + } + + return $m[1]; + }, $style); + + if (null === $style) { + $pcreErrorCode = preg_last_error(); + throw new \RuntimeException('Failed to run preg_replace_callback: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode)); + } + + return $style; + } + + /** + * @param mixed[] $dict + * @return mixed[] + */ + private static function dump(string $title, array $dict): array + { + $script = []; + $dict = array_filter($dict); + if (empty($dict)) { + return $script; + } + $script[] = static::call('log', static::quote('%c%s'), static::quote('font-weight: bold'), static::quote($title)); + foreach ($dict as $key => $value) { + $value = json_encode($value); + if (empty($value)) { + $value = static::quote(''); + } + $script[] = static::call('log', static::quote('%s: %o'), static::quote((string) $key), $value); + } + + return $script; + } + + private static function quote(string $arg): string + { + return '"' . addcslashes($arg, "\"\n\\") . '"'; + } + + /** + * @param mixed $args + */ + private static function call(...$args): string + { + $method = array_shift($args); + if (!is_string($method)) { + throw new \UnexpectedValueException('Expected the first arg to be a string, got: '.var_export($method, true)); + } + + return static::call_array($method, $args); + } + + /** + * @param mixed[] $args + */ + private static function call_array(string $method, array $args): string + { + return 'c.' . $method . '(' . implode(', ', $args) . ');'; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php new file mode 100644 index 0000000..fcce5d6 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php @@ -0,0 +1,167 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\ResettableInterface; +use Monolog\Formatter\FormatterInterface; + +/** + * Buffers all records until closing the handler and then pass them as batch. + * + * This is useful for a MailHandler to send only one mail per request instead of + * sending one per log message. + * + * @author Christophe Coevoet <stof@notk.org> + * + * @phpstan-import-type Record from \Monolog\Logger + */ +class BufferHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface +{ + use ProcessableHandlerTrait; + + /** @var HandlerInterface */ + protected $handler; + /** @var int */ + protected $bufferSize = 0; + /** @var int */ + protected $bufferLimit; + /** @var bool */ + protected $flushOnOverflow; + /** @var Record[] */ + protected $buffer = []; + /** @var bool */ + protected $initialized = false; + + /** + * @param HandlerInterface $handler Handler. + * @param int $bufferLimit How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. + * @param bool $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded + */ + public function __construct(HandlerInterface $handler, int $bufferLimit = 0, $level = Logger::DEBUG, bool $bubble = true, bool $flushOnOverflow = false) + { + parent::__construct($level, $bubble); + $this->handler = $handler; + $this->bufferLimit = $bufferLimit; + $this->flushOnOverflow = $flushOnOverflow; + } + + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + if ($record['level'] < $this->level) { + return false; + } + + if (!$this->initialized) { + // __destructor() doesn't get called on Fatal errors + register_shutdown_function([$this, 'close']); + $this->initialized = true; + } + + if ($this->bufferLimit > 0 && $this->bufferSize === $this->bufferLimit) { + if ($this->flushOnOverflow) { + $this->flush(); + } else { + array_shift($this->buffer); + $this->bufferSize--; + } + } + + if ($this->processors) { + /** @var Record $record */ + $record = $this->processRecord($record); + } + + $this->buffer[] = $record; + $this->bufferSize++; + + return false === $this->bubble; + } + + public function flush(): void + { + if ($this->bufferSize === 0) { + return; + } + + $this->handler->handleBatch($this->buffer); + $this->clear(); + } + + public function __destruct() + { + // suppress the parent behavior since we already have register_shutdown_function() + // to call close(), and the reference contained there will prevent this from being + // GC'd until the end of the request + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + $this->flush(); + + $this->handler->close(); + } + + /** + * Clears the buffer without flushing any messages down to the wrapped handler. + */ + public function clear(): void + { + $this->bufferSize = 0; + $this->buffer = []; + } + + public function reset() + { + $this->flush(); + + parent::reset(); + + $this->resetProcessors(); + + if ($this->handler instanceof ResettableInterface) { + $this->handler->reset(); + } + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + if ($this->handler instanceof FormattableHandlerInterface) { + $this->handler->setFormatter($formatter); + + return $this; + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); + } + + /** + * {@inheritDoc} + */ + public function getFormatter(): FormatterInterface + { + if ($this->handler instanceof FormattableHandlerInterface) { + return $this->handler->getFormatter(); + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php new file mode 100644 index 0000000..234ecf6 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php @@ -0,0 +1,196 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\ChromePHPFormatter; +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; +use Monolog\Utils; + +/** + * Handler sending logs to the ChromePHP extension (http://www.chromephp.com/) + * + * This also works out of the box with Firefox 43+ + * + * @author Christophe Coevoet <stof@notk.org> + * + * @phpstan-import-type Record from \Monolog\Logger + */ +class ChromePHPHandler extends AbstractProcessingHandler +{ + use WebRequestRecognizerTrait; + + /** + * Version of the extension + */ + protected const VERSION = '4.0'; + + /** + * Header name + */ + protected const HEADER_NAME = 'X-ChromeLogger-Data'; + + /** + * Regular expression to detect supported browsers (matches any Chrome, or Firefox 43+) + */ + protected const USER_AGENT_REGEX = '{\b(?:Chrome/\d+(?:\.\d+)*|HeadlessChrome|Firefox/(?:4[3-9]|[5-9]\d|\d{3,})(?:\.\d)*)\b}'; + + /** @var bool */ + protected static $initialized = false; + + /** + * Tracks whether we sent too much data + * + * Chrome limits the headers to 4KB, so when we sent 3KB we stop sending + * + * @var bool + */ + protected static $overflowed = false; + + /** @var mixed[] */ + protected static $json = [ + 'version' => self::VERSION, + 'columns' => ['label', 'log', 'backtrace', 'type'], + 'rows' => [], + ]; + + /** @var bool */ + protected static $sendHeaders = true; + + public function __construct($level = Logger::DEBUG, bool $bubble = true) + { + parent::__construct($level, $bubble); + if (!function_exists('json_encode')) { + throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s ChromePHPHandler'); + } + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + if (!$this->isWebRequest()) { + return; + } + + $messages = []; + + foreach ($records as $record) { + if ($record['level'] < $this->level) { + continue; + } + /** @var Record $message */ + $message = $this->processRecord($record); + $messages[] = $message; + } + + if (!empty($messages)) { + $messages = $this->getFormatter()->formatBatch($messages); + self::$json['rows'] = array_merge(self::$json['rows'], $messages); + $this->send(); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new ChromePHPFormatter(); + } + + /** + * Creates & sends header for a record + * + * @see sendHeader() + * @see send() + */ + protected function write(array $record): void + { + if (!$this->isWebRequest()) { + return; + } + + self::$json['rows'][] = $record['formatted']; + + $this->send(); + } + + /** + * Sends the log header + * + * @see sendHeader() + */ + protected function send(): void + { + if (self::$overflowed || !self::$sendHeaders) { + return; + } + + if (!self::$initialized) { + self::$initialized = true; + + self::$sendHeaders = $this->headersAccepted(); + if (!self::$sendHeaders) { + return; + } + + self::$json['request_uri'] = $_SERVER['REQUEST_URI'] ?? ''; + } + + $json = Utils::jsonEncode(self::$json, Utils::DEFAULT_JSON_FLAGS & ~JSON_UNESCAPED_UNICODE, true); + $data = base64_encode($json); + if (strlen($data) > 3 * 1024) { + self::$overflowed = true; + + $record = [ + 'message' => 'Incomplete logs, chrome header size limit reached', + 'context' => [], + 'level' => Logger::WARNING, + 'level_name' => Logger::getLevelName(Logger::WARNING), + 'channel' => 'monolog', + 'datetime' => new \DateTimeImmutable(), + 'extra' => [], + ]; + self::$json['rows'][count(self::$json['rows']) - 1] = $this->getFormatter()->format($record); + $json = Utils::jsonEncode(self::$json, Utils::DEFAULT_JSON_FLAGS & ~JSON_UNESCAPED_UNICODE, true); + $data = base64_encode($json); + } + + if (trim($data) !== '') { + $this->sendHeader(static::HEADER_NAME, $data); + } + } + + /** + * Send header string to the client + */ + protected function sendHeader(string $header, string $content): void + { + if (!headers_sent() && self::$sendHeaders) { + header(sprintf('%s: %s', $header, $content)); + } + } + + /** + * Verifies if the headers are accepted by the current user agent + */ + protected function headersAccepted(): bool + { + if (empty($_SERVER['HTTP_USER_AGENT'])) { + return false; + } + + return preg_match(static::USER_AGENT_REGEX, $_SERVER['HTTP_USER_AGENT']) === 1; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php new file mode 100644 index 0000000..5265761 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php @@ -0,0 +1,77 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\JsonFormatter; +use Monolog\Logger; + +/** + * CouchDB handler + * + * @author Markus Bachmann <markus.bachmann@bachi.biz> + */ +class CouchDBHandler extends AbstractProcessingHandler +{ + /** @var mixed[] */ + private $options; + + /** + * @param mixed[] $options + */ + public function __construct(array $options = [], $level = Logger::DEBUG, bool $bubble = true) + { + $this->options = array_merge([ + 'host' => 'localhost', + 'port' => 5984, + 'dbname' => 'logger', + 'username' => null, + 'password' => null, + ], $options); + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $basicAuth = null; + if ($this->options['username']) { + $basicAuth = sprintf('%s:%s@', $this->options['username'], $this->options['password']); + } + + $url = 'http://'.$basicAuth.$this->options['host'].':'.$this->options['port'].'/'.$this->options['dbname']; + $context = stream_context_create([ + 'http' => [ + 'method' => 'POST', + 'content' => $record['formatted'], + 'ignore_errors' => true, + 'max_redirects' => 0, + 'header' => 'Content-type: application/json', + ], + ]); + + if (false === @file_get_contents($url, false, $context)) { + throw new \RuntimeException(sprintf('Could not connect to %s', $url)); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, false); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php new file mode 100644 index 0000000..3535a4f --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php @@ -0,0 +1,167 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; + +/** + * Logs to Cube. + * + * @link https://github.com/square/cube/wiki + * @author Wan Chen <kami@kamisama.me> + * @deprecated Since 2.8.0 and 3.2.0, Cube appears abandoned and thus we will drop this handler in Monolog 4 + */ +class CubeHandler extends AbstractProcessingHandler +{ + /** @var resource|\Socket|null */ + private $udpConnection = null; + /** @var resource|\CurlHandle|null */ + private $httpConnection = null; + /** @var string */ + private $scheme; + /** @var string */ + private $host; + /** @var int */ + private $port; + /** @var string[] */ + private $acceptedSchemes = ['http', 'udp']; + + /** + * Create a Cube handler + * + * @throws \UnexpectedValueException when given url is not a valid url. + * A valid url must consist of three parts : protocol://host:port + * Only valid protocols used by Cube are http and udp + */ + public function __construct(string $url, $level = Logger::DEBUG, bool $bubble = true) + { + $urlInfo = parse_url($url); + + if ($urlInfo === false || !isset($urlInfo['scheme'], $urlInfo['host'], $urlInfo['port'])) { + throw new \UnexpectedValueException('URL "'.$url.'" is not valid'); + } + + if (!in_array($urlInfo['scheme'], $this->acceptedSchemes)) { + throw new \UnexpectedValueException( + 'Invalid protocol (' . $urlInfo['scheme'] . ').' + . ' Valid options are ' . implode(', ', $this->acceptedSchemes) + ); + } + + $this->scheme = $urlInfo['scheme']; + $this->host = $urlInfo['host']; + $this->port = (int) $urlInfo['port']; + + parent::__construct($level, $bubble); + } + + /** + * Establish a connection to an UDP socket + * + * @throws \LogicException when unable to connect to the socket + * @throws MissingExtensionException when there is no socket extension + */ + protected function connectUdp(): void + { + if (!extension_loaded('sockets')) { + throw new MissingExtensionException('The sockets extension is required to use udp URLs with the CubeHandler'); + } + + $udpConnection = socket_create(AF_INET, SOCK_DGRAM, 0); + if (false === $udpConnection) { + throw new \LogicException('Unable to create a socket'); + } + + $this->udpConnection = $udpConnection; + if (!socket_connect($this->udpConnection, $this->host, $this->port)) { + throw new \LogicException('Unable to connect to the socket at ' . $this->host . ':' . $this->port); + } + } + + /** + * Establish a connection to an http server + * + * @throws \LogicException when unable to connect to the socket + * @throws MissingExtensionException when no curl extension + */ + protected function connectHttp(): void + { + if (!extension_loaded('curl')) { + throw new MissingExtensionException('The curl extension is required to use http URLs with the CubeHandler'); + } + + $httpConnection = curl_init('http://'.$this->host.':'.$this->port.'/1.0/event/put'); + if (false === $httpConnection) { + throw new \LogicException('Unable to connect to ' . $this->host . ':' . $this->port); + } + + $this->httpConnection = $httpConnection; + curl_setopt($this->httpConnection, CURLOPT_CUSTOMREQUEST, "POST"); + curl_setopt($this->httpConnection, CURLOPT_RETURNTRANSFER, true); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $date = $record['datetime']; + + $data = ['time' => $date->format('Y-m-d\TH:i:s.uO')]; + unset($record['datetime']); + + if (isset($record['context']['type'])) { + $data['type'] = $record['context']['type']; + unset($record['context']['type']); + } else { + $data['type'] = $record['channel']; + } + + $data['data'] = $record['context']; + $data['data']['level'] = $record['level']; + + if ($this->scheme === 'http') { + $this->writeHttp(Utils::jsonEncode($data)); + } else { + $this->writeUdp(Utils::jsonEncode($data)); + } + } + + private function writeUdp(string $data): void + { + if (!$this->udpConnection) { + $this->connectUdp(); + } + + socket_send($this->udpConnection, $data, strlen($data), 0); + } + + private function writeHttp(string $data): void + { + if (!$this->httpConnection) { + $this->connectHttp(); + } + + if (null === $this->httpConnection) { + throw new \LogicException('No connection could be established'); + } + + curl_setopt($this->httpConnection, CURLOPT_POSTFIELDS, '['.$data.']'); + curl_setopt($this->httpConnection, CURLOPT_HTTPHEADER, [ + 'Content-Type: application/json', + 'Content-Length: ' . strlen('['.$data.']'), + ]); + + Curl\Util::execute($this->httpConnection, 5, false); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php b/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php new file mode 100644 index 0000000..7213e8e --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/Curl/Util.php @@ -0,0 +1,71 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\Curl; + +use CurlHandle; + +/** + * This class is marked as internal and it is not under the BC promise of the package. + * + * @internal + */ +final class Util +{ + /** @var array<int> */ + private static $retriableErrorCodes = [ + CURLE_COULDNT_RESOLVE_HOST, + CURLE_COULDNT_CONNECT, + CURLE_HTTP_NOT_FOUND, + CURLE_READ_ERROR, + CURLE_OPERATION_TIMEOUTED, + CURLE_HTTP_POST_ERROR, + CURLE_SSL_CONNECT_ERROR, + ]; + + /** + * Executes a CURL request with optional retries and exception on failure + * + * @param resource|CurlHandle $ch curl handler + * @param int $retries + * @param bool $closeAfterDone + * @return bool|string @see curl_exec + */ + public static function execute($ch, int $retries = 5, bool $closeAfterDone = true) + { + while ($retries--) { + $curlResponse = curl_exec($ch); + if ($curlResponse === false) { + $curlErrno = curl_errno($ch); + + if (false === in_array($curlErrno, self::$retriableErrorCodes, true) || !$retries) { + $curlError = curl_error($ch); + + if ($closeAfterDone) { + curl_close($ch); + } + + throw new \RuntimeException(sprintf('Curl error (code %d): %s', $curlErrno, $curlError)); + } + + continue; + } + + if ($closeAfterDone) { + curl_close($ch); + } + + return $curlResponse; + } + + return false; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php new file mode 100644 index 0000000..9b85ae7 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php @@ -0,0 +1,186 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Psr\Log\LogLevel; + +/** + * Simple handler wrapper that deduplicates log records across multiple requests + * + * It also includes the BufferHandler functionality and will buffer + * all messages until the end of the request or flush() is called. + * + * This works by storing all log records' messages above $deduplicationLevel + * to the file specified by $deduplicationStore. When further logs come in at the end of the + * request (or when flush() is called), all those above $deduplicationLevel are checked + * against the existing stored logs. If they match and the timestamps in the stored log is + * not older than $time seconds, the new log record is discarded. If no log record is new, the + * whole data set is discarded. + * + * This is mainly useful in combination with Mail handlers or things like Slack or HipChat handlers + * that send messages to people, to avoid spamming with the same message over and over in case of + * a major component failure like a database server being down which makes all requests fail in the + * same way. + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + */ +class DeduplicationHandler extends BufferHandler +{ + /** + * @var string + */ + protected $deduplicationStore; + + /** + * @var Level + */ + protected $deduplicationLevel; + + /** + * @var int + */ + protected $time; + + /** + * @var bool + */ + private $gc = false; + + /** + * @param HandlerInterface $handler Handler. + * @param string $deduplicationStore The file/path where the deduplication log should be kept + * @param string|int $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes + * @param int $time The period (in seconds) during which duplicate entries should be suppressed after a given log is sent through + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * + * @phpstan-param Level|LevelName|LogLevel::* $deduplicationLevel + */ + public function __construct(HandlerInterface $handler, ?string $deduplicationStore = null, $deduplicationLevel = Logger::ERROR, int $time = 60, bool $bubble = true) + { + parent::__construct($handler, 0, Logger::DEBUG, $bubble, false); + + $this->deduplicationStore = $deduplicationStore === null ? sys_get_temp_dir() . '/monolog-dedup-' . substr(md5(__FILE__), 0, 20) .'.log' : $deduplicationStore; + $this->deduplicationLevel = Logger::toMonologLevel($deduplicationLevel); + $this->time = $time; + } + + public function flush(): void + { + if ($this->bufferSize === 0) { + return; + } + + $passthru = null; + + foreach ($this->buffer as $record) { + if ($record['level'] >= $this->deduplicationLevel) { + $passthru = $passthru || !$this->isDuplicate($record); + if ($passthru) { + $this->appendRecord($record); + } + } + } + + // default of null is valid as well as if no record matches duplicationLevel we just pass through + if ($passthru === true || $passthru === null) { + $this->handler->handleBatch($this->buffer); + } + + $this->clear(); + + if ($this->gc) { + $this->collectLogs(); + } + } + + /** + * @phpstan-param Record $record + */ + private function isDuplicate(array $record): bool + { + if (!file_exists($this->deduplicationStore)) { + return false; + } + + $store = file($this->deduplicationStore, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + if (!is_array($store)) { + return false; + } + + $yesterday = time() - 86400; + $timestampValidity = $record['datetime']->getTimestamp() - $this->time; + $expectedMessage = preg_replace('{[\r\n].*}', '', $record['message']); + + for ($i = count($store) - 1; $i >= 0; $i--) { + list($timestamp, $level, $message) = explode(':', $store[$i], 3); + + if ($level === $record['level_name'] && $message === $expectedMessage && $timestamp > $timestampValidity) { + return true; + } + + if ($timestamp < $yesterday) { + $this->gc = true; + } + } + + return false; + } + + private function collectLogs(): void + { + if (!file_exists($this->deduplicationStore)) { + return; + } + + $handle = fopen($this->deduplicationStore, 'rw+'); + + if (!$handle) { + throw new \RuntimeException('Failed to open file for reading and writing: ' . $this->deduplicationStore); + } + + flock($handle, LOCK_EX); + $validLogs = []; + + $timestampValidity = time() - $this->time; + + while (!feof($handle)) { + $log = fgets($handle); + if ($log && substr($log, 0, 10) >= $timestampValidity) { + $validLogs[] = $log; + } + } + + ftruncate($handle, 0); + rewind($handle); + foreach ($validLogs as $log) { + fwrite($handle, $log); + } + + flock($handle, LOCK_UN); + fclose($handle); + + $this->gc = false; + } + + /** + * @phpstan-param Record $record + */ + private function appendRecord(array $record): void + { + file_put_contents($this->deduplicationStore, $record['datetime']->getTimestamp() . ':' . $record['level_name'] . ':' . preg_replace('{[\r\n].*}', '', $record['message']) . "\n", FILE_APPEND); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php new file mode 100644 index 0000000..ebd52c3 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php @@ -0,0 +1,47 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\NormalizerFormatter; +use Monolog\Formatter\FormatterInterface; +use Doctrine\CouchDB\CouchDBClient; + +/** + * CouchDB handler for Doctrine CouchDB ODM + * + * @author Markus Bachmann <markus.bachmann@bachi.biz> + */ +class DoctrineCouchDBHandler extends AbstractProcessingHandler +{ + /** @var CouchDBClient */ + private $client; + + public function __construct(CouchDBClient $client, $level = Logger::DEBUG, bool $bubble = true) + { + $this->client = $client; + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $this->client->postDocument($record['formatted']); + } + + protected function getDefaultFormatter(): FormatterInterface + { + return new NormalizerFormatter; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php new file mode 100644 index 0000000..21840bf --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php @@ -0,0 +1,104 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Aws\Sdk; +use Aws\DynamoDb\DynamoDbClient; +use Monolog\Formatter\FormatterInterface; +use Aws\DynamoDb\Marshaler; +use Monolog\Formatter\ScalarFormatter; +use Monolog\Logger; + +/** + * Amazon DynamoDB handler (http://aws.amazon.com/dynamodb/) + * + * @link https://github.com/aws/aws-sdk-php/ + * @author Andrew Lawson <adlawson@gmail.com> + */ +class DynamoDbHandler extends AbstractProcessingHandler +{ + public const DATE_FORMAT = 'Y-m-d\TH:i:s.uO'; + + /** + * @var DynamoDbClient + */ + protected $client; + + /** + * @var string + */ + protected $table; + + /** + * @var int + */ + protected $version; + + /** + * @var Marshaler + */ + protected $marshaler; + + public function __construct(DynamoDbClient $client, string $table, $level = Logger::DEBUG, bool $bubble = true) + { + /** @phpstan-ignore-next-line */ + if (defined('Aws\Sdk::VERSION') && version_compare(Sdk::VERSION, '3.0', '>=')) { + $this->version = 3; + $this->marshaler = new Marshaler; + } else { + $this->version = 2; + } + + $this->client = $client; + $this->table = $table; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $filtered = $this->filterEmptyFields($record['formatted']); + if ($this->version === 3) { + $formatted = $this->marshaler->marshalItem($filtered); + } else { + /** @phpstan-ignore-next-line */ + $formatted = $this->client->formatAttributes($filtered); + } + + $this->client->putItem([ + 'TableName' => $this->table, + 'Item' => $formatted, + ]); + } + + /** + * @param mixed[] $record + * @return mixed[] + */ + protected function filterEmptyFields(array $record): array + { + return array_filter($record, function ($value) { + return !empty($value) || false === $value || 0 === $value; + }); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new ScalarFormatter(self::DATE_FORMAT); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php new file mode 100644 index 0000000..fc92ca4 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php @@ -0,0 +1,129 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Elastica\Document; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\ElasticaFormatter; +use Monolog\Logger; +use Elastica\Client; +use Elastica\Exception\ExceptionInterface; + +/** + * Elastic Search handler + * + * Usage example: + * + * $client = new \Elastica\Client(); + * $options = array( + * 'index' => 'elastic_index_name', + * 'type' => 'elastic_doc_type', Types have been removed in Elastica 7 + * ); + * $handler = new ElasticaHandler($client, $options); + * $log = new Logger('application'); + * $log->pushHandler($handler); + * + * @author Jelle Vink <jelle.vink@gmail.com> + */ +class ElasticaHandler extends AbstractProcessingHandler +{ + /** + * @var Client + */ + protected $client; + + /** + * @var mixed[] Handler config options + */ + protected $options = []; + + /** + * @param Client $client Elastica Client object + * @param mixed[] $options Handler configuration + */ + public function __construct(Client $client, array $options = [], $level = Logger::DEBUG, bool $bubble = true) + { + parent::__construct($level, $bubble); + $this->client = $client; + $this->options = array_merge( + [ + 'index' => 'monolog', // Elastic index name + 'type' => 'record', // Elastic document type + 'ignore_error' => false, // Suppress Elastica exceptions + ], + $options + ); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $this->bulkSend([$record['formatted']]); + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + if ($formatter instanceof ElasticaFormatter) { + return parent::setFormatter($formatter); + } + + throw new \InvalidArgumentException('ElasticaHandler is only compatible with ElasticaFormatter'); + } + + /** + * @return mixed[] + */ + public function getOptions(): array + { + return $this->options; + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new ElasticaFormatter($this->options['index'], $this->options['type']); + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + $documents = $this->getFormatter()->formatBatch($records); + $this->bulkSend($documents); + } + + /** + * Use Elasticsearch bulk API to send list of documents + * + * @param Document[] $documents + * + * @throws \RuntimeException + */ + protected function bulkSend(array $documents): void + { + try { + $this->client->addDocuments($documents); + } catch (ExceptionInterface $e) { + if (!$this->options['ignore_error']) { + throw new \RuntimeException("Error sending messages to Elasticsearch", 0, $e); + } + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php new file mode 100644 index 0000000..e88375c --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php @@ -0,0 +1,218 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Elastic\Elasticsearch\Response\Elasticsearch; +use Throwable; +use RuntimeException; +use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\ElasticsearchFormatter; +use InvalidArgumentException; +use Elasticsearch\Common\Exceptions\RuntimeException as ElasticsearchRuntimeException; +use Elasticsearch\Client; +use Elastic\Elasticsearch\Exception\InvalidArgumentException as ElasticInvalidArgumentException; +use Elastic\Elasticsearch\Client as Client8; + +/** + * Elasticsearch handler + * + * @link https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/index.html + * + * Simple usage example: + * + * $client = \Elasticsearch\ClientBuilder::create() + * ->setHosts($hosts) + * ->build(); + * + * $options = array( + * 'index' => 'elastic_index_name', + * 'type' => 'elastic_doc_type', + * ); + * $handler = new ElasticsearchHandler($client, $options); + * $log = new Logger('application'); + * $log->pushHandler($handler); + * + * @author Avtandil Kikabidze <akalongman@gmail.com> + */ +class ElasticsearchHandler extends AbstractProcessingHandler +{ + /** + * @var Client|Client8 + */ + protected $client; + + /** + * @var mixed[] Handler config options + */ + protected $options = []; + + /** + * @var bool + */ + private $needsType; + + /** + * @param Client|Client8 $client Elasticsearch Client object + * @param mixed[] $options Handler configuration + */ + public function __construct($client, array $options = [], $level = Logger::DEBUG, bool $bubble = true) + { + if (!$client instanceof Client && !$client instanceof Client8) { + throw new \TypeError('Elasticsearch\Client or Elastic\Elasticsearch\Client instance required'); + } + + parent::__construct($level, $bubble); + $this->client = $client; + $this->options = array_merge( + [ + 'index' => 'monolog', // Elastic index name + 'type' => '_doc', // Elastic document type + 'ignore_error' => false, // Suppress Elasticsearch exceptions + ], + $options + ); + + if ($client instanceof Client8 || $client::VERSION[0] === '7') { + $this->needsType = false; + // force the type to _doc for ES8/ES7 + $this->options['type'] = '_doc'; + } else { + $this->needsType = true; + } + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $this->bulkSend([$record['formatted']]); + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + if ($formatter instanceof ElasticsearchFormatter) { + return parent::setFormatter($formatter); + } + + throw new InvalidArgumentException('ElasticsearchHandler is only compatible with ElasticsearchFormatter'); + } + + /** + * Getter options + * + * @return mixed[] + */ + public function getOptions(): array + { + return $this->options; + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new ElasticsearchFormatter($this->options['index'], $this->options['type']); + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + $documents = $this->getFormatter()->formatBatch($records); + $this->bulkSend($documents); + } + + /** + * Use Elasticsearch bulk API to send list of documents + * + * @param array[] $records Records + _index/_type keys + * @throws \RuntimeException + */ + protected function bulkSend(array $records): void + { + try { + $params = [ + 'body' => [], + ]; + + foreach ($records as $record) { + $params['body'][] = [ + 'index' => $this->needsType ? [ + '_index' => $record['_index'], + '_type' => $record['_type'], + ] : [ + '_index' => $record['_index'], + ], + ]; + unset($record['_index'], $record['_type']); + + $params['body'][] = $record; + } + + /** @var Elasticsearch */ + $responses = $this->client->bulk($params); + + if ($responses['errors'] === true) { + throw $this->createExceptionFromResponses($responses); + } + } catch (Throwable $e) { + if (! $this->options['ignore_error']) { + throw new RuntimeException('Error sending messages to Elasticsearch', 0, $e); + } + } + } + + /** + * Creates elasticsearch exception from responses array + * + * Only the first error is converted into an exception. + * + * @param mixed[]|Elasticsearch $responses returned by $this->client->bulk() + */ + protected function createExceptionFromResponses($responses): Throwable + { + foreach ($responses['items'] ?? [] as $item) { + if (isset($item['index']['error'])) { + return $this->createExceptionFromError($item['index']['error']); + } + } + + if (class_exists(ElasticInvalidArgumentException::class)) { + return new ElasticInvalidArgumentException('Elasticsearch failed to index one or more records.'); + } + + return new ElasticsearchRuntimeException('Elasticsearch failed to index one or more records.'); + } + + /** + * Creates elasticsearch exception from error array + * + * @param mixed[] $error + */ + protected function createExceptionFromError(array $error): Throwable + { + $previous = isset($error['caused_by']) ? $this->createExceptionFromError($error['caused_by']) : null; + + if (class_exists(ElasticInvalidArgumentException::class)) { + return new ElasticInvalidArgumentException($error['type'] . ': ' . $error['reason'], 0, $previous); + } + + return new ElasticsearchRuntimeException($error['type'] . ': ' . $error['reason'], 0, $previous); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php new file mode 100644 index 0000000..f2e2203 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php @@ -0,0 +1,91 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; +use Monolog\Utils; + +/** + * Stores to PHP error_log() handler. + * + * @author Elan Ruusamäe <glen@delfi.ee> + */ +class ErrorLogHandler extends AbstractProcessingHandler +{ + public const OPERATING_SYSTEM = 0; + public const SAPI = 4; + + /** @var int */ + protected $messageType; + /** @var bool */ + protected $expandNewlines; + + /** + * @param int $messageType Says where the error should go. + * @param bool $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries + */ + public function __construct(int $messageType = self::OPERATING_SYSTEM, $level = Logger::DEBUG, bool $bubble = true, bool $expandNewlines = false) + { + parent::__construct($level, $bubble); + + if (false === in_array($messageType, self::getAvailableTypes(), true)) { + $message = sprintf('The given message type "%s" is not supported', print_r($messageType, true)); + + throw new \InvalidArgumentException($message); + } + + $this->messageType = $messageType; + $this->expandNewlines = $expandNewlines; + } + + /** + * @return int[] With all available types + */ + public static function getAvailableTypes(): array + { + return [ + self::OPERATING_SYSTEM, + self::SAPI, + ]; + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new LineFormatter('[%datetime%] %channel%.%level_name%: %message% %context% %extra%'); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + if (!$this->expandNewlines) { + error_log((string) $record['formatted'], $this->messageType); + + return; + } + + $lines = preg_split('{[\r\n]+}', (string) $record['formatted']); + if ($lines === false) { + $pcreErrorCode = preg_last_error(); + throw new \RuntimeException('Failed to preg_split formatted string: ' . $pcreErrorCode . ' / '. Utils::pcreLastErrorMessage($pcreErrorCode)); + } + foreach ($lines as $line) { + error_log($line, $this->messageType); + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php new file mode 100644 index 0000000..d4e234c --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php @@ -0,0 +1,71 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Throwable; + +/** + * Forwards records to at most one handler + * + * If a handler fails, the exception is suppressed and the record is forwarded to the next handler. + * + * As soon as one handler handles a record successfully, the handling stops there. + * + * @phpstan-import-type Record from \Monolog\Logger + */ +class FallbackGroupHandler extends GroupHandler +{ + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + if ($this->processors) { + /** @var Record $record */ + $record = $this->processRecord($record); + } + foreach ($this->handlers as $handler) { + try { + $handler->handle($record); + break; + } catch (Throwable $e) { + // What throwable? + } + } + + return false === $this->bubble; + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + if ($this->processors) { + $processed = []; + foreach ($records as $record) { + $processed[] = $this->processRecord($record); + } + /** @var Record[] $records */ + $records = $processed; + } + + foreach ($this->handlers as $handler) { + try { + $handler->handleBatch($records); + break; + } catch (Throwable $e) { + // What throwable? + } + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php new file mode 100644 index 0000000..718f17e --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php @@ -0,0 +1,212 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\ResettableInterface; +use Monolog\Formatter\FormatterInterface; +use Psr\Log\LogLevel; + +/** + * Simple handler wrapper that filters records based on a list of levels + * + * It can be configured with an exact list of levels to allow, or a min/max level. + * + * @author Hennadiy Verkh + * @author Jordi Boggiano <j.boggiano@seld.be> + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class FilterHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface, FormattableHandlerInterface +{ + use ProcessableHandlerTrait; + + /** + * Handler or factory callable($record, $this) + * + * @var callable|HandlerInterface + * @phpstan-var callable(?Record, HandlerInterface): HandlerInterface|HandlerInterface + */ + protected $handler; + + /** + * Minimum level for logs that are passed to handler + * + * @var int[] + * @phpstan-var array<Level, int> + */ + protected $acceptedLevels; + + /** + * Whether the messages that are handled can bubble up the stack or not + * + * @var bool + */ + protected $bubble; + + /** + * @psalm-param HandlerInterface|callable(?Record, HandlerInterface): HandlerInterface $handler + * + * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $filterHandler). + * @param int|array $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided + * @param int|string $maxLevel Maximum level to accept, only used if $minLevelOrList is not an array + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * + * @phpstan-param Level|LevelName|LogLevel::*|array<Level|LevelName|LogLevel::*> $minLevelOrList + * @phpstan-param Level|LevelName|LogLevel::* $maxLevel + */ + public function __construct($handler, $minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY, bool $bubble = true) + { + $this->handler = $handler; + $this->bubble = $bubble; + $this->setAcceptedLevels($minLevelOrList, $maxLevel); + + if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { + throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); + } + } + + /** + * @phpstan-return array<int, Level> + */ + public function getAcceptedLevels(): array + { + return array_flip($this->acceptedLevels); + } + + /** + * @param int|string|array $minLevelOrList A list of levels to accept or a minimum level or level name if maxLevel is provided + * @param int|string $maxLevel Maximum level or level name to accept, only used if $minLevelOrList is not an array + * + * @phpstan-param Level|LevelName|LogLevel::*|array<Level|LevelName|LogLevel::*> $minLevelOrList + * @phpstan-param Level|LevelName|LogLevel::* $maxLevel + */ + public function setAcceptedLevels($minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY): self + { + if (is_array($minLevelOrList)) { + $acceptedLevels = array_map('Monolog\Logger::toMonologLevel', $minLevelOrList); + } else { + $minLevelOrList = Logger::toMonologLevel($minLevelOrList); + $maxLevel = Logger::toMonologLevel($maxLevel); + $acceptedLevels = array_values(array_filter(Logger::getLevels(), function ($level) use ($minLevelOrList, $maxLevel) { + return $level >= $minLevelOrList && $level <= $maxLevel; + })); + } + $this->acceptedLevels = array_flip($acceptedLevels); + + return $this; + } + + /** + * {@inheritDoc} + */ + public function isHandling(array $record): bool + { + return isset($this->acceptedLevels[$record['level']]); + } + + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + if (!$this->isHandling($record)) { + return false; + } + + if ($this->processors) { + /** @var Record $record */ + $record = $this->processRecord($record); + } + + $this->getHandler($record)->handle($record); + + return false === $this->bubble; + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + $filtered = []; + foreach ($records as $record) { + if ($this->isHandling($record)) { + $filtered[] = $record; + } + } + + if (count($filtered) > 0) { + $this->getHandler($filtered[count($filtered) - 1])->handleBatch($filtered); + } + } + + /** + * Return the nested handler + * + * If the handler was provided as a factory callable, this will trigger the handler's instantiation. + * + * @return HandlerInterface + * + * @phpstan-param Record $record + */ + public function getHandler(array $record = null) + { + if (!$this->handler instanceof HandlerInterface) { + $this->handler = ($this->handler)($record, $this); + if (!$this->handler instanceof HandlerInterface) { + throw new \RuntimeException("The factory callable should return a HandlerInterface"); + } + } + + return $this->handler; + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + $handler = $this->getHandler(); + if ($handler instanceof FormattableHandlerInterface) { + $handler->setFormatter($formatter); + + return $this; + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); + } + + /** + * {@inheritDoc} + */ + public function getFormatter(): FormatterInterface + { + $handler = $this->getHandler(); + if ($handler instanceof FormattableHandlerInterface) { + return $handler->getFormatter(); + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); + } + + public function reset() + { + $this->resetProcessors(); + + if ($this->getHandler() instanceof ResettableInterface) { + $this->getHandler()->reset(); + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php new file mode 100644 index 0000000..0aa5607 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php @@ -0,0 +1,29 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\FingersCrossed; + +/** + * Interface for activation strategies for the FingersCrossedHandler. + * + * @author Johannes M. Schmitt <schmittjoh@gmail.com> + * + * @phpstan-import-type Record from \Monolog\Logger + */ +interface ActivationStrategyInterface +{ + /** + * Returns whether the given record activates the handler. + * + * @phpstan-param Record $record + */ + public function isHandlerActivated(array $record): bool; +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php new file mode 100644 index 0000000..7b9abb5 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php @@ -0,0 +1,77 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\FingersCrossed; + +use Monolog\Logger; +use Psr\Log\LogLevel; + +/** + * Channel and Error level based monolog activation strategy. Allows to trigger activation + * based on level per channel. e.g. trigger activation on level 'ERROR' by default, except + * for records of the 'sql' channel; those should trigger activation on level 'WARN'. + * + * Example: + * + * <code> + * $activationStrategy = new ChannelLevelActivationStrategy( + * Logger::CRITICAL, + * array( + * 'request' => Logger::ALERT, + * 'sensitive' => Logger::ERROR, + * ) + * ); + * $handler = new FingersCrossedHandler(new StreamHandler('php://stderr'), $activationStrategy); + * </code> + * + * @author Mike Meessen <netmikey@gmail.com> + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class ChannelLevelActivationStrategy implements ActivationStrategyInterface +{ + /** + * @var Level + */ + private $defaultActionLevel; + + /** + * @var array<string, Level> + */ + private $channelToActionLevel; + + /** + * @param int|string $defaultActionLevel The default action level to be used if the record's category doesn't match any + * @param array<string, int> $channelToActionLevel An array that maps channel names to action levels. + * + * @phpstan-param array<string, Level> $channelToActionLevel + * @phpstan-param Level|LevelName|LogLevel::* $defaultActionLevel + */ + public function __construct($defaultActionLevel, array $channelToActionLevel = []) + { + $this->defaultActionLevel = Logger::toMonologLevel($defaultActionLevel); + $this->channelToActionLevel = array_map('Monolog\Logger::toMonologLevel', $channelToActionLevel); + } + + /** + * @phpstan-param Record $record + */ + public function isHandlerActivated(array $record): bool + { + if (isset($this->channelToActionLevel[$record['channel']])) { + return $record['level'] >= $this->channelToActionLevel[$record['channel']]; + } + + return $record['level'] >= $this->defaultActionLevel; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php new file mode 100644 index 0000000..5ec88ea --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php @@ -0,0 +1,46 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\FingersCrossed; + +use Monolog\Logger; +use Psr\Log\LogLevel; + +/** + * Error level based activation strategy. + * + * @author Johannes M. Schmitt <schmittjoh@gmail.com> + * + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class ErrorLevelActivationStrategy implements ActivationStrategyInterface +{ + /** + * @var Level + */ + private $actionLevel; + + /** + * @param int|string $actionLevel Level or name or value + * + * @phpstan-param Level|LevelName|LogLevel::* $actionLevel + */ + public function __construct($actionLevel) + { + $this->actionLevel = Logger::toMonologLevel($actionLevel); + } + + public function isHandlerActivated(array $record): bool + { + return $record['level'] >= $this->actionLevel; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php new file mode 100644 index 0000000..0627b44 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php @@ -0,0 +1,252 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy; +use Monolog\Handler\FingersCrossed\ActivationStrategyInterface; +use Monolog\Logger; +use Monolog\ResettableInterface; +use Monolog\Formatter\FormatterInterface; +use Psr\Log\LogLevel; + +/** + * Buffers all records until a certain level is reached + * + * The advantage of this approach is that you don't get any clutter in your log files. + * Only requests which actually trigger an error (or whatever your actionLevel is) will be + * in the logs, but they will contain all records, not only those above the level threshold. + * + * You can then have a passthruLevel as well which means that at the end of the request, + * even if it did not get activated, it will still send through log records of e.g. at least a + * warning level. + * + * You can find the various activation strategies in the + * Monolog\Handler\FingersCrossed\ namespace. + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class FingersCrossedHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface, FormattableHandlerInterface +{ + use ProcessableHandlerTrait; + + /** + * @var callable|HandlerInterface + * @phpstan-var callable(?Record, HandlerInterface): HandlerInterface|HandlerInterface + */ + protected $handler; + /** @var ActivationStrategyInterface */ + protected $activationStrategy; + /** @var bool */ + protected $buffering = true; + /** @var int */ + protected $bufferSize; + /** @var Record[] */ + protected $buffer = []; + /** @var bool */ + protected $stopBuffering; + /** + * @var ?int + * @phpstan-var ?Level + */ + protected $passthruLevel; + /** @var bool */ + protected $bubble; + + /** + * @psalm-param HandlerInterface|callable(?Record, HandlerInterface): HandlerInterface $handler + * + * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $fingersCrossedHandler). + * @param int|string|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action, or a level name/value at which the handler is activated + * @param int $bufferSize How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param bool $stopBuffering Whether the handler should stop buffering after being triggered (default true) + * @param int|string $passthruLevel Minimum level to always flush to handler on close, even if strategy not triggered + * + * @phpstan-param Level|LevelName|LogLevel::* $passthruLevel + * @phpstan-param Level|LevelName|LogLevel::*|ActivationStrategyInterface $activationStrategy + */ + public function __construct($handler, $activationStrategy = null, int $bufferSize = 0, bool $bubble = true, bool $stopBuffering = true, $passthruLevel = null) + { + if (null === $activationStrategy) { + $activationStrategy = new ErrorLevelActivationStrategy(Logger::WARNING); + } + + // convert simple int activationStrategy to an object + if (!$activationStrategy instanceof ActivationStrategyInterface) { + $activationStrategy = new ErrorLevelActivationStrategy($activationStrategy); + } + + $this->handler = $handler; + $this->activationStrategy = $activationStrategy; + $this->bufferSize = $bufferSize; + $this->bubble = $bubble; + $this->stopBuffering = $stopBuffering; + + if ($passthruLevel !== null) { + $this->passthruLevel = Logger::toMonologLevel($passthruLevel); + } + + if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { + throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); + } + } + + /** + * {@inheritDoc} + */ + public function isHandling(array $record): bool + { + return true; + } + + /** + * Manually activate this logger regardless of the activation strategy + */ + public function activate(): void + { + if ($this->stopBuffering) { + $this->buffering = false; + } + + $this->getHandler(end($this->buffer) ?: null)->handleBatch($this->buffer); + $this->buffer = []; + } + + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + if ($this->processors) { + /** @var Record $record */ + $record = $this->processRecord($record); + } + + if ($this->buffering) { + $this->buffer[] = $record; + if ($this->bufferSize > 0 && count($this->buffer) > $this->bufferSize) { + array_shift($this->buffer); + } + if ($this->activationStrategy->isHandlerActivated($record)) { + $this->activate(); + } + } else { + $this->getHandler($record)->handle($record); + } + + return false === $this->bubble; + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + $this->flushBuffer(); + + $this->getHandler()->close(); + } + + public function reset() + { + $this->flushBuffer(); + + $this->resetProcessors(); + + if ($this->getHandler() instanceof ResettableInterface) { + $this->getHandler()->reset(); + } + } + + /** + * Clears the buffer without flushing any messages down to the wrapped handler. + * + * It also resets the handler to its initial buffering state. + */ + public function clear(): void + { + $this->buffer = []; + $this->reset(); + } + + /** + * Resets the state of the handler. Stops forwarding records to the wrapped handler. + */ + private function flushBuffer(): void + { + if (null !== $this->passthruLevel) { + $level = $this->passthruLevel; + $this->buffer = array_filter($this->buffer, function ($record) use ($level) { + return $record['level'] >= $level; + }); + if (count($this->buffer) > 0) { + $this->getHandler(end($this->buffer))->handleBatch($this->buffer); + } + } + + $this->buffer = []; + $this->buffering = true; + } + + /** + * Return the nested handler + * + * If the handler was provided as a factory callable, this will trigger the handler's instantiation. + * + * @return HandlerInterface + * + * @phpstan-param Record $record + */ + public function getHandler(array $record = null) + { + if (!$this->handler instanceof HandlerInterface) { + $this->handler = ($this->handler)($record, $this); + if (!$this->handler instanceof HandlerInterface) { + throw new \RuntimeException("The factory callable should return a HandlerInterface"); + } + } + + return $this->handler; + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + $handler = $this->getHandler(); + if ($handler instanceof FormattableHandlerInterface) { + $handler->setFormatter($formatter); + + return $this; + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); + } + + /** + * {@inheritDoc} + */ + public function getFormatter(): FormatterInterface + { + $handler = $this->getHandler(); + if ($handler instanceof FormattableHandlerInterface) { + return $handler->getFormatter(); + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php new file mode 100644 index 0000000..72718de --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php @@ -0,0 +1,180 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\WildfireFormatter; +use Monolog\Formatter\FormatterInterface; + +/** + * Simple FirePHP Handler (http://www.firephp.org/), which uses the Wildfire protocol. + * + * @author Eric Clemmons (@ericclemmons) <eric@uxdriven.com> + * + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + */ +class FirePHPHandler extends AbstractProcessingHandler +{ + use WebRequestRecognizerTrait; + + /** + * WildFire JSON header message format + */ + protected const PROTOCOL_URI = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2'; + + /** + * FirePHP structure for parsing messages & their presentation + */ + protected const STRUCTURE_URI = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; + + /** + * Must reference a "known" plugin, otherwise headers won't display in FirePHP + */ + protected const PLUGIN_URI = 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3'; + + /** + * Header prefix for Wildfire to recognize & parse headers + */ + protected const HEADER_PREFIX = 'X-Wf'; + + /** + * Whether or not Wildfire vendor-specific headers have been generated & sent yet + * @var bool + */ + protected static $initialized = false; + + /** + * Shared static message index between potentially multiple handlers + * @var int + */ + protected static $messageIndex = 1; + + /** @var bool */ + protected static $sendHeaders = true; + + /** + * Base header creation function used by init headers & record headers + * + * @param array<int|string> $meta Wildfire Plugin, Protocol & Structure Indexes + * @param string $message Log message + * + * @return array<string, string> Complete header string ready for the client as key and message as value + * + * @phpstan-return non-empty-array<string, string> + */ + protected function createHeader(array $meta, string $message): array + { + $header = sprintf('%s-%s', static::HEADER_PREFIX, join('-', $meta)); + + return [$header => $message]; + } + + /** + * Creates message header from record + * + * @return array<string, string> + * + * @phpstan-return non-empty-array<string, string> + * + * @see createHeader() + * + * @phpstan-param FormattedRecord $record + */ + protected function createRecordHeader(array $record): array + { + // Wildfire is extensible to support multiple protocols & plugins in a single request, + // but we're not taking advantage of that (yet), so we're using "1" for simplicity's sake. + return $this->createHeader( + [1, 1, 1, self::$messageIndex++], + $record['formatted'] + ); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new WildfireFormatter(); + } + + /** + * Wildfire initialization headers to enable message parsing + * + * @see createHeader() + * @see sendHeader() + * + * @return array<string, string> + */ + protected function getInitHeaders(): array + { + // Initial payload consists of required headers for Wildfire + return array_merge( + $this->createHeader(['Protocol', 1], static::PROTOCOL_URI), + $this->createHeader([1, 'Structure', 1], static::STRUCTURE_URI), + $this->createHeader([1, 'Plugin', 1], static::PLUGIN_URI) + ); + } + + /** + * Send header string to the client + */ + protected function sendHeader(string $header, string $content): void + { + if (!headers_sent() && self::$sendHeaders) { + header(sprintf('%s: %s', $header, $content)); + } + } + + /** + * Creates & sends header for a record, ensuring init headers have been sent prior + * + * @see sendHeader() + * @see sendInitHeaders() + */ + protected function write(array $record): void + { + if (!self::$sendHeaders || !$this->isWebRequest()) { + return; + } + + // WildFire-specific headers must be sent prior to any messages + if (!self::$initialized) { + self::$initialized = true; + + self::$sendHeaders = $this->headersAccepted(); + if (!self::$sendHeaders) { + return; + } + + foreach ($this->getInitHeaders() as $header => $content) { + $this->sendHeader($header, $content); + } + } + + $header = $this->createRecordHeader($record); + if (trim(current($header)) !== '') { + $this->sendHeader(key($header), current($header)); + } + } + + /** + * Verifies if the headers are accepted by the current user agent + */ + protected function headersAccepted(): bool + { + if (!empty($_SERVER['HTTP_USER_AGENT']) && preg_match('{\bFirePHP/\d+\.\d+\b}', $_SERVER['HTTP_USER_AGENT'])) { + return true; + } + + return isset($_SERVER['HTTP_X_FIREPHP_VERSION']); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php new file mode 100644 index 0000000..85c95b9 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php @@ -0,0 +1,135 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; +use Monolog\Logger; + +/** + * Sends logs to Fleep.io using Webhook integrations + * + * You'll need a Fleep.io account to use this handler. + * + * @see https://fleep.io/integrations/webhooks/ Fleep Webhooks Documentation + * @author Ando Roots <ando@sqroot.eu> + * + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + */ +class FleepHookHandler extends SocketHandler +{ + protected const FLEEP_HOST = 'fleep.io'; + + protected const FLEEP_HOOK_URI = '/hook/'; + + /** + * @var string Webhook token (specifies the conversation where logs are sent) + */ + protected $token; + + /** + * Construct a new Fleep.io Handler. + * + * For instructions on how to create a new web hook in your conversations + * see https://fleep.io/integrations/webhooks/ + * + * @param string $token Webhook token + * @throws MissingExtensionException + */ + public function __construct( + string $token, + $level = Logger::DEBUG, + bool $bubble = true, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { + if (!extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FleepHookHandler'); + } + + $this->token = $token; + + $connectionString = 'ssl://' . static::FLEEP_HOST . ':443'; + parent::__construct( + $connectionString, + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); + } + + /** + * Returns the default formatter to use with this handler + * + * Overloaded to remove empty context and extra arrays from the end of the log message. + * + * @return LineFormatter + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new LineFormatter(null, null, true, true); + } + + /** + * Handles a log record + */ + public function write(array $record): void + { + parent::write($record); + $this->closeSocket(); + } + + /** + * {@inheritDoc} + */ + protected function generateDataStream(array $record): string + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + /** + * Builds the header of the API Call + */ + private function buildHeader(string $content): string + { + $header = "POST " . static::FLEEP_HOOK_URI . $this->token . " HTTP/1.1\r\n"; + $header .= "Host: " . static::FLEEP_HOST . "\r\n"; + $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } + + /** + * Builds the body of API call + * + * @phpstan-param FormattedRecord $record + */ + private function buildContent(array $record): string + { + $dataArray = [ + 'message' => $record['formatted'], + ]; + + return http_build_query($dataArray); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php new file mode 100644 index 0000000..b837bdb --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php @@ -0,0 +1,132 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Formatter\FlowdockFormatter; +use Monolog\Formatter\FormatterInterface; + +/** + * Sends notifications through the Flowdock push API + * + * This must be configured with a FlowdockFormatter instance via setFormatter() + * + * Notes: + * API token - Flowdock API token + * + * @author Dominik Liebler <liebler.dominik@gmail.com> + * @see https://www.flowdock.com/api/push + * + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + */ +class FlowdockHandler extends SocketHandler +{ + /** + * @var string + */ + protected $apiToken; + + /** + * @throws MissingExtensionException if OpenSSL is missing + */ + public function __construct( + string $apiToken, + $level = Logger::DEBUG, + bool $bubble = true, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { + if (!extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FlowdockHandler'); + } + + parent::__construct( + 'ssl://api.flowdock.com:443', + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); + $this->apiToken = $apiToken; + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + if (!$formatter instanceof FlowdockFormatter) { + throw new \InvalidArgumentException('The FlowdockHandler requires an instance of Monolog\Formatter\FlowdockFormatter to function correctly'); + } + + return parent::setFormatter($formatter); + } + + /** + * Gets the default formatter. + */ + protected function getDefaultFormatter(): FormatterInterface + { + throw new \InvalidArgumentException('The FlowdockHandler must be configured (via setFormatter) with an instance of Monolog\Formatter\FlowdockFormatter to function correctly'); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + parent::write($record); + + $this->closeSocket(); + } + + /** + * {@inheritDoc} + */ + protected function generateDataStream(array $record): string + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + /** + * Builds the body of API call + * + * @phpstan-param FormattedRecord $record + */ + private function buildContent(array $record): string + { + return Utils::jsonEncode($record['formatted']['flowdock']); + } + + /** + * Builds the header of the API Call + */ + private function buildHeader(string $content): string + { + $header = "POST /v1/messages/team_inbox/" . $this->apiToken . " HTTP/1.1\r\n"; + $header .= "Host: api.flowdock.com\r\n"; + $header .= "Content-Type: application/json\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php b/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php new file mode 100644 index 0000000..fc1693c --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php @@ -0,0 +1,37 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; + +/** + * Interface to describe loggers that have a formatter + * + * @author Jordi Boggiano <j.boggiano@seld.be> + */ +interface FormattableHandlerInterface +{ + /** + * Sets the formatter. + * + * @param FormatterInterface $formatter + * @return HandlerInterface self + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface; + + /** + * Gets the formatter. + * + * @return FormatterInterface + */ + public function getFormatter(): FormatterInterface; +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php b/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php new file mode 100644 index 0000000..b60bdce --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php @@ -0,0 +1,60 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; + +/** + * Helper trait for implementing FormattableInterface + * + * @author Jordi Boggiano <j.boggiano@seld.be> + */ +trait FormattableHandlerTrait +{ + /** + * @var ?FormatterInterface + */ + protected $formatter; + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + $this->formatter = $formatter; + + return $this; + } + + /** + * {@inheritDoc} + */ + public function getFormatter(): FormatterInterface + { + if (!$this->formatter) { + $this->formatter = $this->getDefaultFormatter(); + } + + return $this->formatter; + } + + /** + * Gets the default formatter. + * + * Overwrite this if the LineFormatter is not a good default for your handler. + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new LineFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php new file mode 100644 index 0000000..4ff26c4 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php @@ -0,0 +1,57 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Gelf\PublisherInterface; +use Monolog\Logger; +use Monolog\Formatter\GelfMessageFormatter; +use Monolog\Formatter\FormatterInterface; + +/** + * Handler to send messages to a Graylog2 (http://www.graylog2.org) server + * + * @author Matt Lehner <mlehner@gmail.com> + * @author Benjamin Zikarsky <benjamin@zikarsky.de> + */ +class GelfHandler extends AbstractProcessingHandler +{ + /** + * @var PublisherInterface the publisher object that sends the message to the server + */ + protected $publisher; + + /** + * @param PublisherInterface $publisher a gelf publisher object + */ + public function __construct(PublisherInterface $publisher, $level = Logger::DEBUG, bool $bubble = true) + { + parent::__construct($level, $bubble); + + $this->publisher = $publisher; + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $this->publisher->publish($record['formatted']); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new GelfMessageFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php new file mode 100644 index 0000000..3c9dc4b --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php @@ -0,0 +1,132 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\ResettableInterface; + +/** + * Forwards records to multiple handlers + * + * @author Lenar Lõhmus <lenar@city.ee> + * + * @phpstan-import-type Record from \Monolog\Logger + */ +class GroupHandler extends Handler implements ProcessableHandlerInterface, ResettableInterface +{ + use ProcessableHandlerTrait; + + /** @var HandlerInterface[] */ + protected $handlers; + /** @var bool */ + protected $bubble; + + /** + * @param HandlerInterface[] $handlers Array of Handlers. + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct(array $handlers, bool $bubble = true) + { + foreach ($handlers as $handler) { + if (!$handler instanceof HandlerInterface) { + throw new \InvalidArgumentException('The first argument of the GroupHandler must be an array of HandlerInterface instances.'); + } + } + + $this->handlers = $handlers; + $this->bubble = $bubble; + } + + /** + * {@inheritDoc} + */ + public function isHandling(array $record): bool + { + foreach ($this->handlers as $handler) { + if ($handler->isHandling($record)) { + return true; + } + } + + return false; + } + + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + if ($this->processors) { + /** @var Record $record */ + $record = $this->processRecord($record); + } + + foreach ($this->handlers as $handler) { + $handler->handle($record); + } + + return false === $this->bubble; + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + if ($this->processors) { + $processed = []; + foreach ($records as $record) { + $processed[] = $this->processRecord($record); + } + /** @var Record[] $records */ + $records = $processed; + } + + foreach ($this->handlers as $handler) { + $handler->handleBatch($records); + } + } + + public function reset() + { + $this->resetProcessors(); + + foreach ($this->handlers as $handler) { + if ($handler instanceof ResettableInterface) { + $handler->reset(); + } + } + } + + public function close(): void + { + parent::close(); + + foreach ($this->handlers as $handler) { + $handler->close(); + } + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + foreach ($this->handlers as $handler) { + if ($handler instanceof FormattableHandlerInterface) { + $handler->setFormatter($formatter); + } + } + + return $this; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/Handler.php b/vendor/monolog/monolog/src/Monolog/Handler/Handler.php new file mode 100644 index 0000000..34b4935 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/Handler.php @@ -0,0 +1,62 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Base Handler class providing basic close() support as well as handleBatch + * + * @author Jordi Boggiano <j.boggiano@seld.be> + */ +abstract class Handler implements HandlerInterface +{ + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + foreach ($records as $record) { + $this->handle($record); + } + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + } + + public function __destruct() + { + try { + $this->close(); + } catch (\Throwable $e) { + // do nothing + } + } + + public function __sleep() + { + $this->close(); + + $reflClass = new \ReflectionClass($this); + + $keys = []; + foreach ($reflClass->getProperties() as $reflProp) { + if (!$reflProp->isStatic()) { + $keys[] = $reflProp->getName(); + } + } + + return $keys; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php b/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php new file mode 100644 index 0000000..affcc51 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php @@ -0,0 +1,85 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Interface that all Monolog Handlers must implement + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + */ +interface HandlerInterface +{ + /** + * Checks whether the given record will be handled by this handler. + * + * This is mostly done for performance reasons, to avoid calling processors for nothing. + * + * Handlers should still check the record levels within handle(), returning false in isHandling() + * is no guarantee that handle() will not be called, and isHandling() might not be called + * for a given record. + * + * @param array $record Partial log record containing only a level key + * + * @return bool + * + * @phpstan-param array{level: Level} $record + */ + public function isHandling(array $record): bool; + + /** + * Handles a record. + * + * All records may be passed to this method, and the handler should discard + * those that it does not want to handle. + * + * The return value of this function controls the bubbling process of the handler stack. + * Unless the bubbling is interrupted (by returning true), the Logger class will keep on + * calling further handlers in the stack with a given log record. + * + * @param array $record The record to handle + * @return bool true means that this handler handled the record, and that bubbling is not permitted. + * false means the record was either not processed or that this handler allows bubbling. + * + * @phpstan-param Record $record + */ + public function handle(array $record): bool; + + /** + * Handles a set of records at once. + * + * @param array $records The records to handle (an array of record arrays) + * + * @phpstan-param Record[] $records + */ + public function handleBatch(array $records): void; + + /** + * Closes the handler. + * + * Ends a log cycle and frees all resources used by the handler. + * + * Closing a Handler means flushing all buffers and freeing any open resources/handles. + * + * Implementations have to be idempotent (i.e. it should be possible to call close several times without breakage) + * and ideally handlers should be able to reopen themselves on handle() after they have been closed. + * + * This is useful at the end of a request and will be called automatically when the object + * is destroyed if you extend Monolog\Handler\Handler. + * + * If you are thinking of calling this method yourself, most likely you should be + * calling ResettableInterface::reset instead. Have a look. + */ + public function close(): void; +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php b/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php new file mode 100644 index 0000000..d4351b9 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php @@ -0,0 +1,136 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\ResettableInterface; +use Monolog\Formatter\FormatterInterface; + +/** + * This simple wrapper class can be used to extend handlers functionality. + * + * Example: A custom filtering that can be applied to any handler. + * + * Inherit from this class and override handle() like this: + * + * public function handle(array $record) + * { + * if ($record meets certain conditions) { + * return false; + * } + * return $this->handler->handle($record); + * } + * + * @author Alexey Karapetov <alexey@karapetov.com> + */ +class HandlerWrapper implements HandlerInterface, ProcessableHandlerInterface, FormattableHandlerInterface, ResettableInterface +{ + /** + * @var HandlerInterface + */ + protected $handler; + + public function __construct(HandlerInterface $handler) + { + $this->handler = $handler; + } + + /** + * {@inheritDoc} + */ + public function isHandling(array $record): bool + { + return $this->handler->isHandling($record); + } + + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + return $this->handler->handle($record); + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + $this->handler->handleBatch($records); + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + $this->handler->close(); + } + + /** + * {@inheritDoc} + */ + public function pushProcessor(callable $callback): HandlerInterface + { + if ($this->handler instanceof ProcessableHandlerInterface) { + $this->handler->pushProcessor($callback); + + return $this; + } + + throw new \LogicException('The wrapped handler does not implement ' . ProcessableHandlerInterface::class); + } + + /** + * {@inheritDoc} + */ + public function popProcessor(): callable + { + if ($this->handler instanceof ProcessableHandlerInterface) { + return $this->handler->popProcessor(); + } + + throw new \LogicException('The wrapped handler does not implement ' . ProcessableHandlerInterface::class); + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + if ($this->handler instanceof FormattableHandlerInterface) { + $this->handler->setFormatter($formatter); + + return $this; + } + + throw new \LogicException('The wrapped handler does not implement ' . FormattableHandlerInterface::class); + } + + /** + * {@inheritDoc} + */ + public function getFormatter(): FormatterInterface + { + if ($this->handler instanceof FormattableHandlerInterface) { + return $this->handler->getFormatter(); + } + + throw new \LogicException('The wrapped handler does not implement ' . FormattableHandlerInterface::class); + } + + public function reset() + { + if ($this->handler instanceof ResettableInterface) { + $this->handler->reset(); + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php new file mode 100644 index 0000000..000ccea --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php @@ -0,0 +1,74 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; + +/** + * IFTTTHandler uses cURL to trigger IFTTT Maker actions + * + * Register a secret key and trigger/event name at https://ifttt.com/maker + * + * value1 will be the channel from monolog's Logger constructor, + * value2 will be the level name (ERROR, WARNING, ..) + * value3 will be the log record's message + * + * @author Nehal Patel <nehal@nehalpatel.me> + */ +class IFTTTHandler extends AbstractProcessingHandler +{ + /** @var string */ + private $eventName; + /** @var string */ + private $secretKey; + + /** + * @param string $eventName The name of the IFTTT Maker event that should be triggered + * @param string $secretKey A valid IFTTT secret key + */ + public function __construct(string $eventName, string $secretKey, $level = Logger::ERROR, bool $bubble = true) + { + if (!extension_loaded('curl')) { + throw new MissingExtensionException('The curl extension is needed to use the IFTTTHandler'); + } + + $this->eventName = $eventName; + $this->secretKey = $secretKey; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + public function write(array $record): void + { + $postData = [ + "value1" => $record["channel"], + "value2" => $record["level_name"], + "value3" => $record["message"], + ]; + $postString = Utils::jsonEncode($postData); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, "https://maker.ifttt.com/trigger/" . $this->eventName . "/with/key/" . $this->secretKey); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $postString); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + "Content-Type: application/json", + ]); + + Curl\Util::execute($ch); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php new file mode 100644 index 0000000..71f64a2 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php @@ -0,0 +1,76 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Inspired on LogEntriesHandler. + * + * @author Robert Kaufmann III <rok3@rok3.me> + * @author Gabriel Machado <gabriel.ms1@hotmail.com> + */ +class InsightOpsHandler extends SocketHandler +{ + /** + * @var string + */ + protected $logToken; + + /** + * @param string $token Log token supplied by InsightOps + * @param string $region Region where InsightOps account is hosted. Could be 'us' or 'eu'. + * @param bool $useSSL Whether or not SSL encryption should be used + * + * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing + */ + public function __construct( + string $token, + string $region = 'us', + bool $useSSL = true, + $level = Logger::DEBUG, + bool $bubble = true, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { + if ($useSSL && !extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for InsightOpsHandler'); + } + + $endpoint = $useSSL + ? 'ssl://' . $region . '.data.logs.insight.rapid7.com:443' + : $region . '.data.logs.insight.rapid7.com:80'; + + parent::__construct( + $endpoint, + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); + $this->logToken = $token; + } + + /** + * {@inheritDoc} + */ + protected function generateDataStream(array $record): string + { + return $this->logToken . ' ' . $record['formatted']; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php new file mode 100644 index 0000000..25fcd15 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php @@ -0,0 +1,70 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * @author Robert Kaufmann III <rok3@rok3.me> + */ +class LogEntriesHandler extends SocketHandler +{ + /** + * @var string + */ + protected $logToken; + + /** + * @param string $token Log token supplied by LogEntries + * @param bool $useSSL Whether or not SSL encryption should be used. + * @param string $host Custom hostname to send the data to if needed + * + * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing + */ + public function __construct( + string $token, + bool $useSSL = true, + $level = Logger::DEBUG, + bool $bubble = true, + string $host = 'data.logentries.com', + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { + if ($useSSL && !extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler'); + } + + $endpoint = $useSSL ? 'ssl://' . $host . ':443' : $host . ':80'; + parent::__construct( + $endpoint, + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); + $this->logToken = $token; + } + + /** + * {@inheritDoc} + */ + protected function generateDataStream(array $record): string + { + return $this->logToken . ' ' . $record['formatted']; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php new file mode 100644 index 0000000..6d13db3 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php @@ -0,0 +1,160 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LogglyFormatter; +use function array_key_exists; +use CurlHandle; + +/** + * Sends errors to Loggly. + * + * @author Przemek Sobstel <przemek@sobstel.org> + * @author Adam Pancutt <adam@pancutt.com> + * @author Gregory Barchard <gregory@barchard.net> + */ +class LogglyHandler extends AbstractProcessingHandler +{ + protected const HOST = 'logs-01.loggly.com'; + protected const ENDPOINT_SINGLE = 'inputs'; + protected const ENDPOINT_BATCH = 'bulk'; + + /** + * Caches the curl handlers for every given endpoint. + * + * @var resource[]|CurlHandle[] + */ + protected $curlHandlers = []; + + /** @var string */ + protected $token; + + /** @var string[] */ + protected $tag = []; + + /** + * @param string $token API token supplied by Loggly + * + * @throws MissingExtensionException If the curl extension is missing + */ + public function __construct(string $token, $level = Logger::DEBUG, bool $bubble = true) + { + if (!extension_loaded('curl')) { + throw new MissingExtensionException('The curl extension is needed to use the LogglyHandler'); + } + + $this->token = $token; + + parent::__construct($level, $bubble); + } + + /** + * Loads and returns the shared curl handler for the given endpoint. + * + * @param string $endpoint + * + * @return resource|CurlHandle + */ + protected function getCurlHandler(string $endpoint) + { + if (!array_key_exists($endpoint, $this->curlHandlers)) { + $this->curlHandlers[$endpoint] = $this->loadCurlHandle($endpoint); + } + + return $this->curlHandlers[$endpoint]; + } + + /** + * Starts a fresh curl session for the given endpoint and returns its handler. + * + * @param string $endpoint + * + * @return resource|CurlHandle + */ + private function loadCurlHandle(string $endpoint) + { + $url = sprintf("https://%s/%s/%s/", static::HOST, $endpoint, $this->token); + + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + + return $ch; + } + + /** + * @param string[]|string $tag + */ + public function setTag($tag): self + { + $tag = !empty($tag) ? $tag : []; + $this->tag = is_array($tag) ? $tag : [$tag]; + + return $this; + } + + /** + * @param string[]|string $tag + */ + public function addTag($tag): self + { + if (!empty($tag)) { + $tag = is_array($tag) ? $tag : [$tag]; + $this->tag = array_unique(array_merge($this->tag, $tag)); + } + + return $this; + } + + protected function write(array $record): void + { + $this->send($record["formatted"], static::ENDPOINT_SINGLE); + } + + public function handleBatch(array $records): void + { + $level = $this->level; + + $records = array_filter($records, function ($record) use ($level) { + return ($record['level'] >= $level); + }); + + if ($records) { + $this->send($this->getFormatter()->formatBatch($records), static::ENDPOINT_BATCH); + } + } + + protected function send(string $data, string $endpoint): void + { + $ch = $this->getCurlHandler($endpoint); + + $headers = ['Content-Type: application/json']; + + if (!empty($this->tag)) { + $headers[] = 'X-LOGGLY-TAG: '.implode(',', $this->tag); + } + + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + + Curl\Util::execute($ch, 5, false); + } + + protected function getDefaultFormatter(): FormatterInterface + { + return new LogglyFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php new file mode 100644 index 0000000..859a469 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php @@ -0,0 +1,106 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LogmaticFormatter; + +/** + * @author Julien Breux <julien.breux@gmail.com> + */ +class LogmaticHandler extends SocketHandler +{ + /** + * @var string + */ + private $logToken; + + /** + * @var string + */ + private $hostname; + + /** + * @var string + */ + private $appname; + + /** + * @param string $token Log token supplied by Logmatic. + * @param string $hostname Host name supplied by Logmatic. + * @param string $appname Application name supplied by Logmatic. + * @param bool $useSSL Whether or not SSL encryption should be used. + * + * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing + */ + public function __construct( + string $token, + string $hostname = '', + string $appname = '', + bool $useSSL = true, + $level = Logger::DEBUG, + bool $bubble = true, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { + if ($useSSL && !extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP extension is required to use SSL encrypted connection for LogmaticHandler'); + } + + $endpoint = $useSSL ? 'ssl://api.logmatic.io:10515' : 'api.logmatic.io:10514'; + $endpoint .= '/v1/'; + + parent::__construct( + $endpoint, + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); + + $this->logToken = $token; + $this->hostname = $hostname; + $this->appname = $appname; + } + + /** + * {@inheritDoc} + */ + protected function generateDataStream(array $record): string + { + return $this->logToken . ' ' . $record['formatted']; + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + $formatter = new LogmaticFormatter(); + + if (!empty($this->hostname)) { + $formatter->setHostname($this->hostname); + } + if (!empty($this->appname)) { + $formatter->setAppname($this->appname); + } + + return $formatter; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php new file mode 100644 index 0000000..97f3432 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/MailHandler.php @@ -0,0 +1,95 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\HtmlFormatter; + +/** + * Base class for all mail handlers + * + * @author Gyula Sallai + * + * @phpstan-import-type Record from \Monolog\Logger + */ +abstract class MailHandler extends AbstractProcessingHandler +{ + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + $messages = []; + + foreach ($records as $record) { + if ($record['level'] < $this->level) { + continue; + } + /** @var Record $message */ + $message = $this->processRecord($record); + $messages[] = $message; + } + + if (!empty($messages)) { + $this->send((string) $this->getFormatter()->formatBatch($messages), $messages); + } + } + + /** + * Send a mail with the given content + * + * @param string $content formatted email body to be sent + * @param array $records the array of log records that formed this content + * + * @phpstan-param Record[] $records + */ + abstract protected function send(string $content, array $records): void; + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $this->send((string) $record['formatted'], [$record]); + } + + /** + * @phpstan-param non-empty-array<Record> $records + * @phpstan-return Record + */ + protected function getHighestRecord(array $records): array + { + $highestRecord = null; + foreach ($records as $record) { + if ($highestRecord === null || $highestRecord['level'] < $record['level']) { + $highestRecord = $record; + } + } + + return $highestRecord; + } + + protected function isHtmlBody(string $body): bool + { + return ($body[0] ?? null) === '<'; + } + + /** + * Gets the default formatter. + * + * @return FormatterInterface + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new HtmlFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php new file mode 100644 index 0000000..3003500 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php @@ -0,0 +1,83 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Swift; +use Swift_Message; + +/** + * MandrillHandler uses cURL to send the emails to the Mandrill API + * + * @author Adam Nicholson <adamnicholson10@gmail.com> + */ +class MandrillHandler extends MailHandler +{ + /** @var Swift_Message */ + protected $message; + /** @var string */ + protected $apiKey; + + /** + * @psalm-param Swift_Message|callable(): Swift_Message $message + * + * @param string $apiKey A valid Mandrill API key + * @param callable|Swift_Message $message An example message for real messages, only the body will be replaced + */ + public function __construct(string $apiKey, $message, $level = Logger::ERROR, bool $bubble = true) + { + parent::__construct($level, $bubble); + + if (!$message instanceof Swift_Message && is_callable($message)) { + $message = $message(); + } + if (!$message instanceof Swift_Message) { + throw new \InvalidArgumentException('You must provide either a Swift_Message instance or a callable returning it'); + } + $this->message = $message; + $this->apiKey = $apiKey; + } + + /** + * {@inheritDoc} + */ + protected function send(string $content, array $records): void + { + $mime = 'text/plain'; + if ($this->isHtmlBody($content)) { + $mime = 'text/html'; + } + + $message = clone $this->message; + $message->setBody($content, $mime); + /** @phpstan-ignore-next-line */ + if (version_compare(Swift::VERSION, '6.0.0', '>=')) { + $message->setDate(new \DateTimeImmutable()); + } else { + /** @phpstan-ignore-next-line */ + $message->setDate(time()); + } + + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_URL, 'https://mandrillapp.com/api/1.0/messages/send-raw.json'); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ + 'key' => $this->apiKey, + 'raw_message' => (string) $message, + 'async' => false, + ])); + + Curl\Util::execute($ch); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php b/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php new file mode 100644 index 0000000..3965aee --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php @@ -0,0 +1,21 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Exception can be thrown if an extension for a handler is missing + * + * @author Christian Bergau <cbergau86@gmail.com> + */ +class MissingExtensionException extends \Exception +{ +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php new file mode 100644 index 0000000..3063091 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php @@ -0,0 +1,86 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use MongoDB\Driver\BulkWrite; +use MongoDB\Driver\Manager; +use MongoDB\Client; +use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\MongoDBFormatter; + +/** + * Logs to a MongoDB database. + * + * Usage example: + * + * $log = new \Monolog\Logger('application'); + * $client = new \MongoDB\Client('mongodb://localhost:27017'); + * $mongodb = new \Monolog\Handler\MongoDBHandler($client, 'logs', 'prod'); + * $log->pushHandler($mongodb); + * + * The above examples uses the MongoDB PHP library's client class; however, the + * MongoDB\Driver\Manager class from ext-mongodb is also supported. + */ +class MongoDBHandler extends AbstractProcessingHandler +{ + /** @var \MongoDB\Collection */ + private $collection; + /** @var Client|Manager */ + private $manager; + /** @var string */ + private $namespace; + + /** + * Constructor. + * + * @param Client|Manager $mongodb MongoDB library or driver client + * @param string $database Database name + * @param string $collection Collection name + */ + public function __construct($mongodb, string $database, string $collection, $level = Logger::DEBUG, bool $bubble = true) + { + if (!($mongodb instanceof Client || $mongodb instanceof Manager)) { + throw new \InvalidArgumentException('MongoDB\Client or MongoDB\Driver\Manager instance required'); + } + + if ($mongodb instanceof Client) { + $this->collection = $mongodb->selectCollection($database, $collection); + } else { + $this->manager = $mongodb; + $this->namespace = $database . '.' . $collection; + } + + parent::__construct($level, $bubble); + } + + protected function write(array $record): void + { + if (isset($this->collection)) { + $this->collection->insertOne($record['formatted']); + } + + if (isset($this->manager, $this->namespace)) { + $bulk = new BulkWrite; + $bulk->insert($record["formatted"]); + $this->manager->executeBulkWrite($this->namespace, $bulk); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new MongoDBFormatter; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php new file mode 100644 index 0000000..0c0a3bd --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php @@ -0,0 +1,174 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\LineFormatter; + +/** + * NativeMailerHandler uses the mail() function to send the emails + * + * @author Christophe Coevoet <stof@notk.org> + * @author Mark Garrett <mark@moderndeveloperllc.com> + */ +class NativeMailerHandler extends MailHandler +{ + /** + * The email addresses to which the message will be sent + * @var string[] + */ + protected $to; + + /** + * The subject of the email + * @var string + */ + protected $subject; + + /** + * Optional headers for the message + * @var string[] + */ + protected $headers = []; + + /** + * Optional parameters for the message + * @var string[] + */ + protected $parameters = []; + + /** + * The wordwrap length for the message + * @var int + */ + protected $maxColumnWidth; + + /** + * The Content-type for the message + * @var string|null + */ + protected $contentType; + + /** + * The encoding for the message + * @var string + */ + protected $encoding = 'utf-8'; + + /** + * @param string|string[] $to The receiver of the mail + * @param string $subject The subject of the mail + * @param string $from The sender of the mail + * @param int $maxColumnWidth The maximum column width that the message lines will have + */ + public function __construct($to, string $subject, string $from, $level = Logger::ERROR, bool $bubble = true, int $maxColumnWidth = 70) + { + parent::__construct($level, $bubble); + $this->to = (array) $to; + $this->subject = $subject; + $this->addHeader(sprintf('From: %s', $from)); + $this->maxColumnWidth = $maxColumnWidth; + } + + /** + * Add headers to the message + * + * @param string|string[] $headers Custom added headers + */ + public function addHeader($headers): self + { + foreach ((array) $headers as $header) { + if (strpos($header, "\n") !== false || strpos($header, "\r") !== false) { + throw new \InvalidArgumentException('Headers can not contain newline characters for security reasons'); + } + $this->headers[] = $header; + } + + return $this; + } + + /** + * Add parameters to the message + * + * @param string|string[] $parameters Custom added parameters + */ + public function addParameter($parameters): self + { + $this->parameters = array_merge($this->parameters, (array) $parameters); + + return $this; + } + + /** + * {@inheritDoc} + */ + protected function send(string $content, array $records): void + { + $contentType = $this->getContentType() ?: ($this->isHtmlBody($content) ? 'text/html' : 'text/plain'); + + if ($contentType !== 'text/html') { + $content = wordwrap($content, $this->maxColumnWidth); + } + + $headers = ltrim(implode("\r\n", $this->headers) . "\r\n", "\r\n"); + $headers .= 'Content-type: ' . $contentType . '; charset=' . $this->getEncoding() . "\r\n"; + if ($contentType === 'text/html' && false === strpos($headers, 'MIME-Version:')) { + $headers .= 'MIME-Version: 1.0' . "\r\n"; + } + + $subject = $this->subject; + if ($records) { + $subjectFormatter = new LineFormatter($this->subject); + $subject = $subjectFormatter->format($this->getHighestRecord($records)); + } + + $parameters = implode(' ', $this->parameters); + foreach ($this->to as $to) { + mail($to, $subject, $content, $headers, $parameters); + } + } + + public function getContentType(): ?string + { + return $this->contentType; + } + + public function getEncoding(): string + { + return $this->encoding; + } + + /** + * @param string $contentType The content type of the email - Defaults to text/plain. Use text/html for HTML messages. + */ + public function setContentType(string $contentType): self + { + if (strpos($contentType, "\n") !== false || strpos($contentType, "\r") !== false) { + throw new \InvalidArgumentException('The content type can not contain newline characters to prevent email header injection'); + } + + $this->contentType = $contentType; + + return $this; + } + + public function setEncoding(string $encoding): self + { + if (strpos($encoding, "\n") !== false || strpos($encoding, "\r") !== false) { + throw new \InvalidArgumentException('The encoding can not contain newline characters to prevent email header injection'); + } + + $this->encoding = $encoding; + + return $this; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php new file mode 100644 index 0000000..114d749 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php @@ -0,0 +1,199 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Formatter\NormalizerFormatter; +use Monolog\Formatter\FormatterInterface; + +/** + * Class to record a log on a NewRelic application. + * Enabling New Relic High Security mode may prevent capture of useful information. + * + * This handler requires a NormalizerFormatter to function and expects an array in $record['formatted'] + * + * @see https://docs.newrelic.com/docs/agents/php-agent + * @see https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security + */ +class NewRelicHandler extends AbstractProcessingHandler +{ + /** + * Name of the New Relic application that will receive logs from this handler. + * + * @var ?string + */ + protected $appName; + + /** + * Name of the current transaction + * + * @var ?string + */ + protected $transactionName; + + /** + * Some context and extra data is passed into the handler as arrays of values. Do we send them as is + * (useful if we are using the API), or explode them for display on the NewRelic RPM website? + * + * @var bool + */ + protected $explodeArrays; + + /** + * {@inheritDoc} + * + * @param string|null $appName + * @param bool $explodeArrays + * @param string|null $transactionName + */ + public function __construct( + $level = Logger::ERROR, + bool $bubble = true, + ?string $appName = null, + bool $explodeArrays = false, + ?string $transactionName = null + ) { + parent::__construct($level, $bubble); + + $this->appName = $appName; + $this->explodeArrays = $explodeArrays; + $this->transactionName = $transactionName; + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + if (!$this->isNewRelicEnabled()) { + throw new MissingExtensionException('The newrelic PHP extension is required to use the NewRelicHandler'); + } + + if ($appName = $this->getAppName($record['context'])) { + $this->setNewRelicAppName($appName); + } + + if ($transactionName = $this->getTransactionName($record['context'])) { + $this->setNewRelicTransactionName($transactionName); + unset($record['formatted']['context']['transaction_name']); + } + + if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Throwable) { + newrelic_notice_error($record['message'], $record['context']['exception']); + unset($record['formatted']['context']['exception']); + } else { + newrelic_notice_error($record['message']); + } + + if (isset($record['formatted']['context']) && is_array($record['formatted']['context'])) { + foreach ($record['formatted']['context'] as $key => $parameter) { + if (is_array($parameter) && $this->explodeArrays) { + foreach ($parameter as $paramKey => $paramValue) { + $this->setNewRelicParameter('context_' . $key . '_' . $paramKey, $paramValue); + } + } else { + $this->setNewRelicParameter('context_' . $key, $parameter); + } + } + } + + if (isset($record['formatted']['extra']) && is_array($record['formatted']['extra'])) { + foreach ($record['formatted']['extra'] as $key => $parameter) { + if (is_array($parameter) && $this->explodeArrays) { + foreach ($parameter as $paramKey => $paramValue) { + $this->setNewRelicParameter('extra_' . $key . '_' . $paramKey, $paramValue); + } + } else { + $this->setNewRelicParameter('extra_' . $key, $parameter); + } + } + } + } + + /** + * Checks whether the NewRelic extension is enabled in the system. + * + * @return bool + */ + protected function isNewRelicEnabled(): bool + { + return extension_loaded('newrelic'); + } + + /** + * Returns the appname where this log should be sent. Each log can override the default appname, set in this + * handler's constructor, by providing the appname in it's context. + * + * @param mixed[] $context + */ + protected function getAppName(array $context): ?string + { + if (isset($context['appname'])) { + return $context['appname']; + } + + return $this->appName; + } + + /** + * Returns the name of the current transaction. Each log can override the default transaction name, set in this + * handler's constructor, by providing the transaction_name in it's context + * + * @param mixed[] $context + */ + protected function getTransactionName(array $context): ?string + { + if (isset($context['transaction_name'])) { + return $context['transaction_name']; + } + + return $this->transactionName; + } + + /** + * Sets the NewRelic application that should receive this log. + */ + protected function setNewRelicAppName(string $appName): void + { + newrelic_set_appname($appName); + } + + /** + * Overwrites the name of the current transaction + */ + protected function setNewRelicTransactionName(string $transactionName): void + { + newrelic_name_transaction($transactionName); + } + + /** + * @param string $key + * @param mixed $value + */ + protected function setNewRelicParameter(string $key, $value): void + { + if (null === $value || is_scalar($value)) { + newrelic_add_custom_parameter($key, $value); + } else { + newrelic_add_custom_parameter($key, Utils::jsonEncode($value, null, true)); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new NormalizerFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/NoopHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/NoopHandler.php new file mode 100644 index 0000000..1ddf0be --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/NoopHandler.php @@ -0,0 +1,40 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * No-op + * + * This handler handles anything, but does nothing, and does not stop bubbling to the rest of the stack. + * This can be used for testing, or to disable a handler when overriding a configuration without + * influencing the rest of the stack. + * + * @author Roel Harbers <roelharbers@gmail.com> + */ +class NoopHandler extends Handler +{ + /** + * {@inheritDoc} + */ + public function isHandling(array $record): bool + { + return true; + } + + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + return false; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php new file mode 100644 index 0000000..e75ee0c --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/NullHandler.php @@ -0,0 +1,60 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Psr\Log\LogLevel; + +/** + * Blackhole + * + * Any record it can handle will be thrown away. This can be used + * to put on top of an existing stack to override it temporarily. + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class NullHandler extends Handler +{ + /** + * @var int + */ + private $level; + + /** + * @param string|int $level The minimum logging level at which this handler will be triggered + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function __construct($level = Logger::DEBUG) + { + $this->level = Logger::toMonologLevel($level); + } + + /** + * {@inheritDoc} + */ + public function isHandling(array $record): bool + { + return $record['level'] >= $this->level; + } + + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + return $record['level'] >= $this->level; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/OverflowHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/OverflowHandler.php new file mode 100644 index 0000000..22068c9 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/OverflowHandler.php @@ -0,0 +1,149 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; + +/** + * Handler to only pass log messages when a certain threshold of number of messages is reached. + * + * This can be useful in cases of processing a batch of data, but you're for example only interested + * in case it fails catastrophically instead of a warning for 1 or 2 events. Worse things can happen, right? + * + * Usage example: + * + * ``` + * $log = new Logger('application'); + * $handler = new SomeHandler(...) + * + * // Pass all warnings to the handler when more than 10 & all error messages when more then 5 + * $overflow = new OverflowHandler($handler, [Logger::WARNING => 10, Logger::ERROR => 5]); + * + * $log->pushHandler($overflow); + *``` + * + * @author Kris Buist <krisbuist@gmail.com> + */ +class OverflowHandler extends AbstractHandler implements FormattableHandlerInterface +{ + /** @var HandlerInterface */ + private $handler; + + /** @var int[] */ + private $thresholdMap = [ + Logger::DEBUG => 0, + Logger::INFO => 0, + Logger::NOTICE => 0, + Logger::WARNING => 0, + Logger::ERROR => 0, + Logger::CRITICAL => 0, + Logger::ALERT => 0, + Logger::EMERGENCY => 0, + ]; + + /** + * Buffer of all messages passed to the handler before the threshold was reached + * + * @var mixed[][] + */ + private $buffer = []; + + /** + * @param HandlerInterface $handler + * @param int[] $thresholdMap Dictionary of logger level => threshold + */ + public function __construct( + HandlerInterface $handler, + array $thresholdMap = [], + $level = Logger::DEBUG, + bool $bubble = true + ) { + $this->handler = $handler; + foreach ($thresholdMap as $thresholdLevel => $threshold) { + $this->thresholdMap[$thresholdLevel] = $threshold; + } + parent::__construct($level, $bubble); + } + + /** + * Handles a record. + * + * All records may be passed to this method, and the handler should discard + * those that it does not want to handle. + * + * The return value of this function controls the bubbling process of the handler stack. + * Unless the bubbling is interrupted (by returning true), the Logger class will keep on + * calling further handlers in the stack with a given log record. + * + * {@inheritDoc} + */ + public function handle(array $record): bool + { + if ($record['level'] < $this->level) { + return false; + } + + $level = $record['level']; + + if (!isset($this->thresholdMap[$level])) { + $this->thresholdMap[$level] = 0; + } + + if ($this->thresholdMap[$level] > 0) { + // The overflow threshold is not yet reached, so we're buffering the record and lowering the threshold by 1 + $this->thresholdMap[$level]--; + $this->buffer[$level][] = $record; + + return false === $this->bubble; + } + + if ($this->thresholdMap[$level] == 0) { + // This current message is breaking the threshold. Flush the buffer and continue handling the current record + foreach ($this->buffer[$level] ?? [] as $buffered) { + $this->handler->handle($buffered); + } + $this->thresholdMap[$level]--; + unset($this->buffer[$level]); + } + + $this->handler->handle($record); + + return false === $this->bubble; + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + if ($this->handler instanceof FormattableHandlerInterface) { + $this->handler->setFormatter($formatter); + + return $this; + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); + } + + /** + * {@inheritDoc} + */ + public function getFormatter(): FormatterInterface + { + if ($this->handler instanceof FormattableHandlerInterface) { + return $this->handler->getFormatter(); + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($this->handler).' does not support formatters.'); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php new file mode 100644 index 0000000..23a1d11 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php @@ -0,0 +1,263 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; +use Monolog\Utils; +use PhpConsole\Connector; +use PhpConsole\Handler as VendorPhpConsoleHandler; +use PhpConsole\Helper; + +/** + * Monolog handler for Google Chrome extension "PHP Console" + * + * Display PHP error/debug log messages in Google Chrome console and notification popups, executes PHP code remotely + * + * Usage: + * 1. Install Google Chrome extension [now dead and removed from the chrome store] + * 2. See overview https://github.com/barbushin/php-console#overview + * 3. Install PHP Console library https://github.com/barbushin/php-console#installation + * 4. Example (result will looks like http://i.hizliresim.com/vg3Pz4.png) + * + * $logger = new \Monolog\Logger('all', array(new \Monolog\Handler\PHPConsoleHandler())); + * \Monolog\ErrorHandler::register($logger); + * echo $undefinedVar; + * $logger->debug('SELECT * FROM users', array('db', 'time' => 0.012)); + * PC::debug($_SERVER); // PHP Console debugger for any type of vars + * + * @author Sergey Barbushin https://www.linkedin.com/in/barbushin + * + * @phpstan-import-type Record from \Monolog\Logger + * @deprecated Since 2.8.0 and 3.2.0, PHPConsole is abandoned and thus we will drop this handler in Monolog 4 + */ +class PHPConsoleHandler extends AbstractProcessingHandler +{ + /** @var array<string, mixed> */ + private $options = [ + 'enabled' => true, // bool Is PHP Console server enabled + 'classesPartialsTraceIgnore' => ['Monolog\\'], // array Hide calls of classes started with... + 'debugTagsKeysInContext' => [0, 'tag'], // bool Is PHP Console server enabled + 'useOwnErrorsHandler' => false, // bool Enable errors handling + 'useOwnExceptionsHandler' => false, // bool Enable exceptions handling + 'sourcesBasePath' => null, // string Base path of all project sources to strip in errors source paths + 'registerHelper' => true, // bool Register PhpConsole\Helper that allows short debug calls like PC::debug($var, 'ta.g.s') + 'serverEncoding' => null, // string|null Server internal encoding + 'headersLimit' => null, // int|null Set headers size limit for your web-server + 'password' => null, // string|null Protect PHP Console connection by password + 'enableSslOnlyMode' => false, // bool Force connection by SSL for clients with PHP Console installed + 'ipMasks' => [], // array Set IP masks of clients that will be allowed to connect to PHP Console: array('192.168.*.*', '127.0.0.1') + 'enableEvalListener' => false, // bool Enable eval request to be handled by eval dispatcher(if enabled, 'password' option is also required) + 'dumperDetectCallbacks' => false, // bool Convert callback items in dumper vars to (callback SomeClass::someMethod) strings + 'dumperLevelLimit' => 5, // int Maximum dumped vars array or object nested dump level + 'dumperItemsCountLimit' => 100, // int Maximum dumped var same level array items or object properties number + 'dumperItemSizeLimit' => 5000, // int Maximum length of any string or dumped array item + 'dumperDumpSizeLimit' => 500000, // int Maximum approximate size of dumped vars result formatted in JSON + 'detectDumpTraceAndSource' => false, // bool Autodetect and append trace data to debug + 'dataStorage' => null, // \PhpConsole\Storage|null Fixes problem with custom $_SESSION handler(see http://goo.gl/Ne8juJ) + ]; + + /** @var Connector */ + private $connector; + + /** + * @param array<string, mixed> $options See \Monolog\Handler\PHPConsoleHandler::$options for more details + * @param Connector|null $connector Instance of \PhpConsole\Connector class (optional) + * @throws \RuntimeException + */ + public function __construct(array $options = [], ?Connector $connector = null, $level = Logger::DEBUG, bool $bubble = true) + { + if (!class_exists('PhpConsole\Connector')) { + throw new \RuntimeException('PHP Console library not found. See https://github.com/barbushin/php-console#installation'); + } + parent::__construct($level, $bubble); + $this->options = $this->initOptions($options); + $this->connector = $this->initConnector($connector); + } + + /** + * @param array<string, mixed> $options + * + * @return array<string, mixed> + */ + private function initOptions(array $options): array + { + $wrongOptions = array_diff(array_keys($options), array_keys($this->options)); + if ($wrongOptions) { + throw new \RuntimeException('Unknown options: ' . implode(', ', $wrongOptions)); + } + + return array_replace($this->options, $options); + } + + private function initConnector(?Connector $connector = null): Connector + { + if (!$connector) { + if ($this->options['dataStorage']) { + Connector::setPostponeStorage($this->options['dataStorage']); + } + $connector = Connector::getInstance(); + } + + if ($this->options['registerHelper'] && !Helper::isRegistered()) { + Helper::register(); + } + + if ($this->options['enabled'] && $connector->isActiveClient()) { + if ($this->options['useOwnErrorsHandler'] || $this->options['useOwnExceptionsHandler']) { + $handler = VendorPhpConsoleHandler::getInstance(); + $handler->setHandleErrors($this->options['useOwnErrorsHandler']); + $handler->setHandleExceptions($this->options['useOwnExceptionsHandler']); + $handler->start(); + } + if ($this->options['sourcesBasePath']) { + $connector->setSourcesBasePath($this->options['sourcesBasePath']); + } + if ($this->options['serverEncoding']) { + $connector->setServerEncoding($this->options['serverEncoding']); + } + if ($this->options['password']) { + $connector->setPassword($this->options['password']); + } + if ($this->options['enableSslOnlyMode']) { + $connector->enableSslOnlyMode(); + } + if ($this->options['ipMasks']) { + $connector->setAllowedIpMasks($this->options['ipMasks']); + } + if ($this->options['headersLimit']) { + $connector->setHeadersLimit($this->options['headersLimit']); + } + if ($this->options['detectDumpTraceAndSource']) { + $connector->getDebugDispatcher()->detectTraceAndSource = true; + } + $dumper = $connector->getDumper(); + $dumper->levelLimit = $this->options['dumperLevelLimit']; + $dumper->itemsCountLimit = $this->options['dumperItemsCountLimit']; + $dumper->itemSizeLimit = $this->options['dumperItemSizeLimit']; + $dumper->dumpSizeLimit = $this->options['dumperDumpSizeLimit']; + $dumper->detectCallbacks = $this->options['dumperDetectCallbacks']; + if ($this->options['enableEvalListener']) { + $connector->startEvalRequestsListener(); + } + } + + return $connector; + } + + public function getConnector(): Connector + { + return $this->connector; + } + + /** + * @return array<string, mixed> + */ + public function getOptions(): array + { + return $this->options; + } + + public function handle(array $record): bool + { + if ($this->options['enabled'] && $this->connector->isActiveClient()) { + return parent::handle($record); + } + + return !$this->bubble; + } + + /** + * Writes the record down to the log of the implementing handler + */ + protected function write(array $record): void + { + if ($record['level'] < Logger::NOTICE) { + $this->handleDebugRecord($record); + } elseif (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Throwable) { + $this->handleExceptionRecord($record); + } else { + $this->handleErrorRecord($record); + } + } + + /** + * @phpstan-param Record $record + */ + private function handleDebugRecord(array $record): void + { + $tags = $this->getRecordTags($record); + $message = $record['message']; + if ($record['context']) { + $message .= ' ' . Utils::jsonEncode($this->connector->getDumper()->dump(array_filter($record['context'])), null, true); + } + $this->connector->getDebugDispatcher()->dispatchDebug($message, $tags, $this->options['classesPartialsTraceIgnore']); + } + + /** + * @phpstan-param Record $record + */ + private function handleExceptionRecord(array $record): void + { + $this->connector->getErrorsDispatcher()->dispatchException($record['context']['exception']); + } + + /** + * @phpstan-param Record $record + */ + private function handleErrorRecord(array $record): void + { + $context = $record['context']; + + $this->connector->getErrorsDispatcher()->dispatchError( + $context['code'] ?? null, + $context['message'] ?? $record['message'], + $context['file'] ?? null, + $context['line'] ?? null, + $this->options['classesPartialsTraceIgnore'] + ); + } + + /** + * @phpstan-param Record $record + * @return string + */ + private function getRecordTags(array &$record) + { + $tags = null; + if (!empty($record['context'])) { + $context = & $record['context']; + foreach ($this->options['debugTagsKeysInContext'] as $key) { + if (!empty($context[$key])) { + $tags = $context[$key]; + if ($key === 0) { + array_shift($context); + } else { + unset($context[$key]); + } + break; + } + } + } + + return $tags ?: strtolower($record['level_name']); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new LineFormatter('%message%'); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ProcessHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ProcessHandler.php new file mode 100644 index 0000000..8a8cf1b --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/ProcessHandler.php @@ -0,0 +1,191 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Stores to STDIN of any process, specified by a command. + * + * Usage example: + * <pre> + * $log = new Logger('myLogger'); + * $log->pushHandler(new ProcessHandler('/usr/bin/php /var/www/monolog/someScript.php')); + * </pre> + * + * @author Kolja Zuelsdorf <koljaz@web.de> + */ +class ProcessHandler extends AbstractProcessingHandler +{ + /** + * Holds the process to receive data on its STDIN. + * + * @var resource|bool|null + */ + private $process; + + /** + * @var string + */ + private $command; + + /** + * @var string|null + */ + private $cwd; + + /** + * @var resource[] + */ + private $pipes = []; + + /** + * @var array<int, string[]> + */ + protected const DESCRIPTOR_SPEC = [ + 0 => ['pipe', 'r'], // STDIN is a pipe that the child will read from + 1 => ['pipe', 'w'], // STDOUT is a pipe that the child will write to + 2 => ['pipe', 'w'], // STDERR is a pipe to catch the any errors + ]; + + /** + * @param string $command Command for the process to start. Absolute paths are recommended, + * especially if you do not use the $cwd parameter. + * @param string|null $cwd "Current working directory" (CWD) for the process to be executed in. + * @throws \InvalidArgumentException + */ + public function __construct(string $command, $level = Logger::DEBUG, bool $bubble = true, ?string $cwd = null) + { + if ($command === '') { + throw new \InvalidArgumentException('The command argument must be a non-empty string.'); + } + if ($cwd === '') { + throw new \InvalidArgumentException('The optional CWD argument must be a non-empty string or null.'); + } + + parent::__construct($level, $bubble); + + $this->command = $command; + $this->cwd = $cwd; + } + + /** + * Writes the record down to the log of the implementing handler + * + * @throws \UnexpectedValueException + */ + protected function write(array $record): void + { + $this->ensureProcessIsStarted(); + + $this->writeProcessInput($record['formatted']); + + $errors = $this->readProcessErrors(); + if (empty($errors) === false) { + throw new \UnexpectedValueException(sprintf('Errors while writing to process: %s', $errors)); + } + } + + /** + * Makes sure that the process is actually started, and if not, starts it, + * assigns the stream pipes, and handles startup errors, if any. + */ + private function ensureProcessIsStarted(): void + { + if (is_resource($this->process) === false) { + $this->startProcess(); + + $this->handleStartupErrors(); + } + } + + /** + * Starts the actual process and sets all streams to non-blocking. + */ + private function startProcess(): void + { + $this->process = proc_open($this->command, static::DESCRIPTOR_SPEC, $this->pipes, $this->cwd); + + foreach ($this->pipes as $pipe) { + stream_set_blocking($pipe, false); + } + } + + /** + * Selects the STDERR stream, handles upcoming startup errors, and throws an exception, if any. + * + * @throws \UnexpectedValueException + */ + private function handleStartupErrors(): void + { + $selected = $this->selectErrorStream(); + if (false === $selected) { + throw new \UnexpectedValueException('Something went wrong while selecting a stream.'); + } + + $errors = $this->readProcessErrors(); + + if (is_resource($this->process) === false || empty($errors) === false) { + throw new \UnexpectedValueException( + sprintf('The process "%s" could not be opened: ' . $errors, $this->command) + ); + } + } + + /** + * Selects the STDERR stream. + * + * @return int|bool + */ + protected function selectErrorStream() + { + $empty = []; + $errorPipes = [$this->pipes[2]]; + + return stream_select($errorPipes, $empty, $empty, 1); + } + + /** + * Reads the errors of the process, if there are any. + * + * @codeCoverageIgnore + * @return string Empty string if there are no errors. + */ + protected function readProcessErrors(): string + { + return (string) stream_get_contents($this->pipes[2]); + } + + /** + * Writes to the input stream of the opened process. + * + * @codeCoverageIgnore + */ + protected function writeProcessInput(string $string): void + { + fwrite($this->pipes[0], $string); + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + if (is_resource($this->process)) { + foreach ($this->pipes as $pipe) { + fclose($pipe); + } + proc_close($this->process); + $this->process = null; + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php b/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php new file mode 100644 index 0000000..3adec7a --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php @@ -0,0 +1,44 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Processor\ProcessorInterface; + +/** + * Interface to describe loggers that have processors + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * + * @phpstan-import-type Record from \Monolog\Logger + */ +interface ProcessableHandlerInterface +{ + /** + * Adds a processor in the stack. + * + * @psalm-param ProcessorInterface|callable(Record): Record $callback + * + * @param ProcessorInterface|callable $callback + * @return HandlerInterface self + */ + public function pushProcessor(callable $callback): HandlerInterface; + + /** + * Removes the processor on top of the stack and returns it. + * + * @psalm-return ProcessorInterface|callable(Record): Record $callback + * + * @throws \LogicException In case the processor stack is empty + * @return callable|ProcessorInterface + */ + public function popProcessor(): callable; +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php b/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php new file mode 100644 index 0000000..9ef6e30 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php @@ -0,0 +1,77 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\ResettableInterface; +use Monolog\Processor\ProcessorInterface; + +/** + * Helper trait for implementing ProcessableInterface + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * + * @phpstan-import-type Record from \Monolog\Logger + */ +trait ProcessableHandlerTrait +{ + /** + * @var callable[] + * @phpstan-var array<ProcessorInterface|callable(Record): Record> + */ + protected $processors = []; + + /** + * {@inheritDoc} + */ + public function pushProcessor(callable $callback): HandlerInterface + { + array_unshift($this->processors, $callback); + + return $this; + } + + /** + * {@inheritDoc} + */ + public function popProcessor(): callable + { + if (!$this->processors) { + throw new \LogicException('You tried to pop from an empty processor stack.'); + } + + return array_shift($this->processors); + } + + /** + * Processes a record. + * + * @phpstan-param Record $record + * @phpstan-return Record + */ + protected function processRecord(array $record): array + { + foreach ($this->processors as $processor) { + $record = $processor($record); + } + + return $record; + } + + protected function resetProcessors(): void + { + foreach ($this->processors as $processor) { + if ($processor instanceof ResettableInterface) { + $processor->reset(); + } + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php new file mode 100644 index 0000000..36e19cc --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php @@ -0,0 +1,95 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Psr\Log\LoggerInterface; +use Monolog\Formatter\FormatterInterface; + +/** + * Proxies log messages to an existing PSR-3 compliant logger. + * + * If a formatter is configured, the formatter's output MUST be a string and the + * formatted message will be fed to the wrapped PSR logger instead of the original + * log record's message. + * + * @author Michael Moussa <michael.moussa@gmail.com> + */ +class PsrHandler extends AbstractHandler implements FormattableHandlerInterface +{ + /** + * PSR-3 compliant logger + * + * @var LoggerInterface + */ + protected $logger; + + /** + * @var FormatterInterface|null + */ + protected $formatter; + + /** + * @param LoggerInterface $logger The underlying PSR-3 compliant logger to which messages will be proxied + */ + public function __construct(LoggerInterface $logger, $level = Logger::DEBUG, bool $bubble = true) + { + parent::__construct($level, $bubble); + + $this->logger = $logger; + } + + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + if (!$this->isHandling($record)) { + return false; + } + + if ($this->formatter) { + $formatted = $this->formatter->format($record); + $this->logger->log(strtolower($record['level_name']), (string) $formatted, $record['context']); + } else { + $this->logger->log(strtolower($record['level_name']), $record['message'], $record['context']); + } + + return false === $this->bubble; + } + + /** + * Sets the formatter. + * + * @param FormatterInterface $formatter + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + $this->formatter = $formatter; + + return $this; + } + + /** + * Gets the formatter. + * + * @return FormatterInterface + */ + public function getFormatter(): FormatterInterface + { + if (!$this->formatter) { + throw new \LogicException('No formatter has been set and this handler does not have a default formatter'); + } + + return $this->formatter; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php new file mode 100644 index 0000000..fed2303 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php @@ -0,0 +1,246 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; +use Psr\Log\LogLevel; + +/** + * Sends notifications through the pushover api to mobile phones + * + * @author Sebastian Göttschkes <sebastian.goettschkes@googlemail.com> + * @see https://www.pushover.net/api + * + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class PushoverHandler extends SocketHandler +{ + /** @var string */ + private $token; + /** @var array<int|string> */ + private $users; + /** @var string */ + private $title; + /** @var string|int|null */ + private $user = null; + /** @var int */ + private $retry; + /** @var int */ + private $expire; + + /** @var int */ + private $highPriorityLevel; + /** @var int */ + private $emergencyLevel; + /** @var bool */ + private $useFormattedMessage = false; + + /** + * All parameters that can be sent to Pushover + * @see https://pushover.net/api + * @var array<string, bool> + */ + private $parameterNames = [ + 'token' => true, + 'user' => true, + 'message' => true, + 'device' => true, + 'title' => true, + 'url' => true, + 'url_title' => true, + 'priority' => true, + 'timestamp' => true, + 'sound' => true, + 'retry' => true, + 'expire' => true, + 'callback' => true, + ]; + + /** + * Sounds the api supports by default + * @see https://pushover.net/api#sounds + * @var string[] + */ + private $sounds = [ + 'pushover', 'bike', 'bugle', 'cashregister', 'classical', 'cosmic', 'falling', 'gamelan', 'incoming', + 'intermission', 'magic', 'mechanical', 'pianobar', 'siren', 'spacealarm', 'tugboat', 'alien', 'climb', + 'persistent', 'echo', 'updown', 'none', + ]; + + /** + * @param string $token Pushover api token + * @param string|array $users Pushover user id or array of ids the message will be sent to + * @param string|null $title Title sent to the Pushover API + * @param bool $useSSL Whether to connect via SSL. Required when pushing messages to users that are not + * the pushover.net app owner. OpenSSL is required for this option. + * @param string|int $highPriorityLevel The minimum logging level at which this handler will start + * sending "high priority" requests to the Pushover API + * @param string|int $emergencyLevel The minimum logging level at which this handler will start + * sending "emergency" requests to the Pushover API + * @param int $retry The retry parameter specifies how often (in seconds) the Pushover servers will + * send the same notification to the user. + * @param int $expire The expire parameter specifies how many seconds your notification will continue + * to be retried for (every retry seconds). + * + * @phpstan-param string|array<int|string> $users + * @phpstan-param Level|LevelName|LogLevel::* $highPriorityLevel + * @phpstan-param Level|LevelName|LogLevel::* $emergencyLevel + */ + public function __construct( + string $token, + $users, + ?string $title = null, + $level = Logger::CRITICAL, + bool $bubble = true, + bool $useSSL = true, + $highPriorityLevel = Logger::CRITICAL, + $emergencyLevel = Logger::EMERGENCY, + int $retry = 30, + int $expire = 25200, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { + $connectionString = $useSSL ? 'ssl://api.pushover.net:443' : 'api.pushover.net:80'; + parent::__construct( + $connectionString, + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); + + $this->token = $token; + $this->users = (array) $users; + $this->title = $title ?: (string) gethostname(); + $this->highPriorityLevel = Logger::toMonologLevel($highPriorityLevel); + $this->emergencyLevel = Logger::toMonologLevel($emergencyLevel); + $this->retry = $retry; + $this->expire = $expire; + } + + protected function generateDataStream(array $record): string + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + /** + * @phpstan-param FormattedRecord $record + */ + private function buildContent(array $record): string + { + // Pushover has a limit of 512 characters on title and message combined. + $maxMessageLength = 512 - strlen($this->title); + + $message = ($this->useFormattedMessage) ? $record['formatted'] : $record['message']; + $message = Utils::substr($message, 0, $maxMessageLength); + + $timestamp = $record['datetime']->getTimestamp(); + + $dataArray = [ + 'token' => $this->token, + 'user' => $this->user, + 'message' => $message, + 'title' => $this->title, + 'timestamp' => $timestamp, + ]; + + if (isset($record['level']) && $record['level'] >= $this->emergencyLevel) { + $dataArray['priority'] = 2; + $dataArray['retry'] = $this->retry; + $dataArray['expire'] = $this->expire; + } elseif (isset($record['level']) && $record['level'] >= $this->highPriorityLevel) { + $dataArray['priority'] = 1; + } + + // First determine the available parameters + $context = array_intersect_key($record['context'], $this->parameterNames); + $extra = array_intersect_key($record['extra'], $this->parameterNames); + + // Least important info should be merged with subsequent info + $dataArray = array_merge($extra, $context, $dataArray); + + // Only pass sounds that are supported by the API + if (isset($dataArray['sound']) && !in_array($dataArray['sound'], $this->sounds)) { + unset($dataArray['sound']); + } + + return http_build_query($dataArray); + } + + private function buildHeader(string $content): string + { + $header = "POST /1/messages.json HTTP/1.1\r\n"; + $header .= "Host: api.pushover.net\r\n"; + $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } + + protected function write(array $record): void + { + foreach ($this->users as $user) { + $this->user = $user; + + parent::write($record); + $this->closeSocket(); + } + + $this->user = null; + } + + /** + * @param int|string $value + * + * @phpstan-param Level|LevelName|LogLevel::* $value + */ + public function setHighPriorityLevel($value): self + { + $this->highPriorityLevel = Logger::toMonologLevel($value); + + return $this; + } + + /** + * @param int|string $value + * + * @phpstan-param Level|LevelName|LogLevel::* $value + */ + public function setEmergencyLevel($value): self + { + $this->emergencyLevel = Logger::toMonologLevel($value); + + return $this; + } + + /** + * Use the formatted message? + */ + public function useFormattedMessage(bool $value): self + { + $this->useFormattedMessage = $value; + + return $this; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php new file mode 100644 index 0000000..91d16ea --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php @@ -0,0 +1,101 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; + +/** + * Logs to a Redis key using rpush + * + * usage example: + * + * $log = new Logger('application'); + * $redis = new RedisHandler(new Predis\Client("tcp://localhost:6379"), "logs", "prod"); + * $log->pushHandler($redis); + * + * @author Thomas Tourlourat <thomas@tourlourat.com> + * + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + */ +class RedisHandler extends AbstractProcessingHandler +{ + /** @var \Predis\Client<\Predis\Client>|\Redis */ + private $redisClient; + /** @var string */ + private $redisKey; + /** @var int */ + protected $capSize; + + /** + * @param \Predis\Client<\Predis\Client>|\Redis $redis The redis instance + * @param string $key The key name to push records to + * @param int $capSize Number of entries to limit list size to, 0 = unlimited + */ + public function __construct($redis, string $key, $level = Logger::DEBUG, bool $bubble = true, int $capSize = 0) + { + if (!(($redis instanceof \Predis\Client) || ($redis instanceof \Redis))) { + throw new \InvalidArgumentException('Predis\Client or Redis instance required'); + } + + $this->redisClient = $redis; + $this->redisKey = $key; + $this->capSize = $capSize; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + if ($this->capSize) { + $this->writeCapped($record); + } else { + $this->redisClient->rpush($this->redisKey, $record["formatted"]); + } + } + + /** + * Write and cap the collection + * Writes the record to the redis list and caps its + * + * @phpstan-param FormattedRecord $record + */ + protected function writeCapped(array $record): void + { + if ($this->redisClient instanceof \Redis) { + $mode = defined('\Redis::MULTI') ? \Redis::MULTI : 1; + $this->redisClient->multi($mode) + ->rpush($this->redisKey, $record["formatted"]) + ->ltrim($this->redisKey, -$this->capSize, -1) + ->exec(); + } else { + $redisKey = $this->redisKey; + $capSize = $this->capSize; + $this->redisClient->transaction(function ($tx) use ($record, $redisKey, $capSize) { + $tx->rpush($redisKey, $record["formatted"]); + $tx->ltrim($redisKey, -$capSize, -1); + }); + } + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new LineFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php new file mode 100644 index 0000000..7789309 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php @@ -0,0 +1,67 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\LineFormatter; +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; + +/** + * Sends the message to a Redis Pub/Sub channel using PUBLISH + * + * usage example: + * + * $log = new Logger('application'); + * $redis = new RedisPubSubHandler(new Predis\Client("tcp://localhost:6379"), "logs", Logger::WARNING); + * $log->pushHandler($redis); + * + * @author Gaëtan Faugère <gaetan@fauge.re> + */ +class RedisPubSubHandler extends AbstractProcessingHandler +{ + /** @var \Predis\Client<\Predis\Client>|\Redis */ + private $redisClient; + /** @var string */ + private $channelKey; + + /** + * @param \Predis\Client<\Predis\Client>|\Redis $redis The redis instance + * @param string $key The channel key to publish records to + */ + public function __construct($redis, string $key, $level = Logger::DEBUG, bool $bubble = true) + { + if (!(($redis instanceof \Predis\Client) || ($redis instanceof \Redis))) { + throw new \InvalidArgumentException('Predis\Client or Redis instance required'); + } + + $this->redisClient = $redis; + $this->channelKey = $key; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $this->redisClient->publish($this->channelKey, $record["formatted"]); + } + + /** + * {@inheritDoc} + */ + protected function getDefaultFormatter(): FormatterInterface + { + return new LineFormatter(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php new file mode 100644 index 0000000..adcc939 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php @@ -0,0 +1,131 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Rollbar\RollbarLogger; +use Throwable; +use Monolog\Logger; + +/** + * Sends errors to Rollbar + * + * If the context data contains a `payload` key, that is used as an array + * of payload options to RollbarLogger's log method. + * + * Rollbar's context info will contain the context + extra keys from the log record + * merged, and then on top of that a few keys: + * + * - level (rollbar level name) + * - monolog_level (monolog level name, raw level, as rollbar only has 5 but monolog 8) + * - channel + * - datetime (unix timestamp) + * + * @author Paul Statezny <paulstatezny@gmail.com> + */ +class RollbarHandler extends AbstractProcessingHandler +{ + /** + * @var RollbarLogger + */ + protected $rollbarLogger; + + /** @var string[] */ + protected $levelMap = [ + Logger::DEBUG => 'debug', + Logger::INFO => 'info', + Logger::NOTICE => 'info', + Logger::WARNING => 'warning', + Logger::ERROR => 'error', + Logger::CRITICAL => 'critical', + Logger::ALERT => 'critical', + Logger::EMERGENCY => 'critical', + ]; + + /** + * Records whether any log records have been added since the last flush of the rollbar notifier + * + * @var bool + */ + private $hasRecords = false; + + /** @var bool */ + protected $initialized = false; + + /** + * @param RollbarLogger $rollbarLogger RollbarLogger object constructed with valid token + */ + public function __construct(RollbarLogger $rollbarLogger, $level = Logger::ERROR, bool $bubble = true) + { + $this->rollbarLogger = $rollbarLogger; + + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + if (!$this->initialized) { + // __destructor() doesn't get called on Fatal errors + register_shutdown_function(array($this, 'close')); + $this->initialized = true; + } + + $context = $record['context']; + $context = array_merge($context, $record['extra'], [ + 'level' => $this->levelMap[$record['level']], + 'monolog_level' => $record['level_name'], + 'channel' => $record['channel'], + 'datetime' => $record['datetime']->format('U'), + ]); + + if (isset($context['exception']) && $context['exception'] instanceof Throwable) { + $exception = $context['exception']; + unset($context['exception']); + $toLog = $exception; + } else { + $toLog = $record['message']; + } + + // @phpstan-ignore-next-line + $this->rollbarLogger->log($context['level'], $toLog, $context); + + $this->hasRecords = true; + } + + public function flush(): void + { + if ($this->hasRecords) { + $this->rollbarLogger->flush(); + $this->hasRecords = false; + } + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + $this->flush(); + } + + /** + * {@inheritDoc} + */ + public function reset() + { + $this->flush(); + + parent::reset(); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php new file mode 100644 index 0000000..17745d2 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php @@ -0,0 +1,207 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use InvalidArgumentException; +use Monolog\Logger; +use Monolog\Utils; + +/** + * Stores logs to files that are rotated every day and a limited number of files are kept. + * + * This rotation is only intended to be used as a workaround. Using logrotate to + * handle the rotation is strongly encouraged when you can use it. + * + * @author Christophe Coevoet <stof@notk.org> + * @author Jordi Boggiano <j.boggiano@seld.be> + */ +class RotatingFileHandler extends StreamHandler +{ + public const FILE_PER_DAY = 'Y-m-d'; + public const FILE_PER_MONTH = 'Y-m'; + public const FILE_PER_YEAR = 'Y'; + + /** @var string */ + protected $filename; + /** @var int */ + protected $maxFiles; + /** @var bool */ + protected $mustRotate; + /** @var \DateTimeImmutable */ + protected $nextRotation; + /** @var string */ + protected $filenameFormat; + /** @var string */ + protected $dateFormat; + + /** + * @param string $filename + * @param int $maxFiles The maximal amount of files to keep (0 means unlimited) + * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) + * @param bool $useLocking Try to lock log file before doing any writes + */ + public function __construct(string $filename, int $maxFiles = 0, $level = Logger::DEBUG, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false) + { + $this->filename = Utils::canonicalizePath($filename); + $this->maxFiles = $maxFiles; + $this->nextRotation = new \DateTimeImmutable('tomorrow'); + $this->filenameFormat = '{filename}-{date}'; + $this->dateFormat = static::FILE_PER_DAY; + + parent::__construct($this->getTimedFilename(), $level, $bubble, $filePermission, $useLocking); + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + parent::close(); + + if (true === $this->mustRotate) { + $this->rotate(); + } + } + + /** + * {@inheritDoc} + */ + public function reset() + { + parent::reset(); + + if (true === $this->mustRotate) { + $this->rotate(); + } + } + + public function setFilenameFormat(string $filenameFormat, string $dateFormat): self + { + if (!preg_match('{^[Yy](([/_.-]?m)([/_.-]?d)?)?$}', $dateFormat)) { + throw new InvalidArgumentException( + 'Invalid date format - format must be one of '. + 'RotatingFileHandler::FILE_PER_DAY ("Y-m-d"), RotatingFileHandler::FILE_PER_MONTH ("Y-m") '. + 'or RotatingFileHandler::FILE_PER_YEAR ("Y"), or you can set one of the '. + 'date formats using slashes, underscores and/or dots instead of dashes.' + ); + } + if (substr_count($filenameFormat, '{date}') === 0) { + throw new InvalidArgumentException( + 'Invalid filename format - format must contain at least `{date}`, because otherwise rotating is impossible.' + ); + } + $this->filenameFormat = $filenameFormat; + $this->dateFormat = $dateFormat; + $this->url = $this->getTimedFilename(); + $this->close(); + + return $this; + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + // on the first record written, if the log is new, we should rotate (once per day) + if (null === $this->mustRotate) { + $this->mustRotate = null === $this->url || !file_exists($this->url); + } + + if ($this->nextRotation <= $record['datetime']) { + $this->mustRotate = true; + $this->close(); + } + + parent::write($record); + } + + /** + * Rotates the files. + */ + protected function rotate(): void + { + // update filename + $this->url = $this->getTimedFilename(); + $this->nextRotation = new \DateTimeImmutable('tomorrow'); + + // skip GC of old logs if files are unlimited + if (0 === $this->maxFiles) { + return; + } + + $logFiles = glob($this->getGlobPattern()); + if (false === $logFiles) { + // failed to glob + return; + } + + if ($this->maxFiles >= count($logFiles)) { + // no files to remove + return; + } + + // Sorting the files by name to remove the older ones + usort($logFiles, function ($a, $b) { + return strcmp($b, $a); + }); + + foreach (array_slice($logFiles, $this->maxFiles) as $file) { + if (is_writable($file)) { + // suppress errors here as unlink() might fail if two processes + // are cleaning up/rotating at the same time + set_error_handler(function (int $errno, string $errstr, string $errfile, int $errline): bool { + return false; + }); + unlink($file); + restore_error_handler(); + } + } + + $this->mustRotate = false; + } + + protected function getTimedFilename(): string + { + $fileInfo = pathinfo($this->filename); + $timedFilename = str_replace( + ['{filename}', '{date}'], + [$fileInfo['filename'], date($this->dateFormat)], + $fileInfo['dirname'] . '/' . $this->filenameFormat + ); + + if (isset($fileInfo['extension'])) { + $timedFilename .= '.'.$fileInfo['extension']; + } + + return $timedFilename; + } + + protected function getGlobPattern(): string + { + $fileInfo = pathinfo($this->filename); + $glob = str_replace( + ['{filename}', '{date}'], + [$fileInfo['filename'], str_replace( + ['Y', 'y', 'm', 'd'], + ['[0-9][0-9][0-9][0-9]', '[0-9][0-9]', '[0-9][0-9]', '[0-9][0-9]'], + $this->dateFormat) + ], + $fileInfo['dirname'] . '/' . $this->filenameFormat + ); + if (isset($fileInfo['extension'])) { + $glob .= '.'.$fileInfo['extension']; + } + + return $glob; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php new file mode 100644 index 0000000..c128a32 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SamplingHandler.php @@ -0,0 +1,132 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; + +/** + * Sampling handler + * + * A sampled event stream can be useful for logging high frequency events in + * a production environment where you only need an idea of what is happening + * and are not concerned with capturing every occurrence. Since the decision to + * handle or not handle a particular event is determined randomly, the + * resulting sampled log is not guaranteed to contain 1/N of the events that + * occurred in the application, but based on the Law of large numbers, it will + * tend to be close to this ratio with a large number of attempts. + * + * @author Bryan Davis <bd808@wikimedia.org> + * @author Kunal Mehta <legoktm@gmail.com> + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + */ +class SamplingHandler extends AbstractHandler implements ProcessableHandlerInterface, FormattableHandlerInterface +{ + use ProcessableHandlerTrait; + + /** + * @var HandlerInterface|callable + * @phpstan-var HandlerInterface|callable(Record|array{level: Level}|null, HandlerInterface): HandlerInterface + */ + protected $handler; + + /** + * @var int $factor + */ + protected $factor; + + /** + * @psalm-param HandlerInterface|callable(Record|array{level: Level}|null, HandlerInterface): HandlerInterface $handler + * + * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $samplingHandler). + * @param int $factor Sample factor (e.g. 10 means every ~10th record is sampled) + */ + public function __construct($handler, int $factor) + { + parent::__construct(); + $this->handler = $handler; + $this->factor = $factor; + + if (!$this->handler instanceof HandlerInterface && !is_callable($this->handler)) { + throw new \RuntimeException("The given handler (".json_encode($this->handler).") is not a callable nor a Monolog\Handler\HandlerInterface object"); + } + } + + public function isHandling(array $record): bool + { + return $this->getHandler($record)->isHandling($record); + } + + public function handle(array $record): bool + { + if ($this->isHandling($record) && mt_rand(1, $this->factor) === 1) { + if ($this->processors) { + /** @var Record $record */ + $record = $this->processRecord($record); + } + + $this->getHandler($record)->handle($record); + } + + return false === $this->bubble; + } + + /** + * Return the nested handler + * + * If the handler was provided as a factory callable, this will trigger the handler's instantiation. + * + * @phpstan-param Record|array{level: Level}|null $record + * + * @return HandlerInterface + */ + public function getHandler(array $record = null) + { + if (!$this->handler instanceof HandlerInterface) { + $this->handler = ($this->handler)($record, $this); + if (!$this->handler instanceof HandlerInterface) { + throw new \RuntimeException("The factory callable should return a HandlerInterface"); + } + } + + return $this->handler; + } + + /** + * {@inheritDoc} + */ + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + $handler = $this->getHandler(); + if ($handler instanceof FormattableHandlerInterface) { + $handler->setFormatter($formatter); + + return $this; + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); + } + + /** + * {@inheritDoc} + */ + public function getFormatter(): FormatterInterface + { + $handler = $this->getHandler(); + if ($handler instanceof FormattableHandlerInterface) { + return $handler->getFormatter(); + } + + throw new \UnexpectedValueException('The nested handler of type '.get_class($handler).' does not support formatters.'); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SendGridHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SendGridHandler.php new file mode 100644 index 0000000..1280ee7 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SendGridHandler.php @@ -0,0 +1,102 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * SendGridrHandler uses the SendGrid API v2 function to send Log emails, more information in https://sendgrid.com/docs/API_Reference/Web_API/mail.html + * + * @author Ricardo Fontanelli <ricardo.fontanelli@hotmail.com> + */ +class SendGridHandler extends MailHandler +{ + /** + * The SendGrid API User + * @var string + */ + protected $apiUser; + + /** + * The SendGrid API Key + * @var string + */ + protected $apiKey; + + /** + * The email addresses to which the message will be sent + * @var string + */ + protected $from; + + /** + * The email addresses to which the message will be sent + * @var string[] + */ + protected $to; + + /** + * The subject of the email + * @var string + */ + protected $subject; + + /** + * @param string $apiUser The SendGrid API User + * @param string $apiKey The SendGrid API Key + * @param string $from The sender of the email + * @param string|string[] $to The recipients of the email + * @param string $subject The subject of the mail + */ + public function __construct(string $apiUser, string $apiKey, string $from, $to, string $subject, $level = Logger::ERROR, bool $bubble = true) + { + if (!extension_loaded('curl')) { + throw new MissingExtensionException('The curl extension is needed to use the SendGridHandler'); + } + + parent::__construct($level, $bubble); + $this->apiUser = $apiUser; + $this->apiKey = $apiKey; + $this->from = $from; + $this->to = (array) $to; + $this->subject = $subject; + } + + /** + * {@inheritDoc} + */ + protected function send(string $content, array $records): void + { + $message = []; + $message['api_user'] = $this->apiUser; + $message['api_key'] = $this->apiKey; + $message['from'] = $this->from; + foreach ($this->to as $recipient) { + $message['to[]'] = $recipient; + } + $message['subject'] = $this->subject; + $message['date'] = date('r'); + + if ($this->isHtmlBody($content)) { + $message['html'] = $content; + } else { + $message['text'] = $content; + } + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, 'https://api.sendgrid.com/api/mail.send.json'); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($message)); + Curl\Util::execute($ch, 2); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php b/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php new file mode 100644 index 0000000..71a4109 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php @@ -0,0 +1,387 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\Slack; + +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Formatter\NormalizerFormatter; +use Monolog\Formatter\FormatterInterface; + +/** + * Slack record utility helping to log to Slack webhooks or API. + * + * @author Greg Kedzierski <greg@gregkedzierski.com> + * @author Haralan Dobrev <hkdobrev@gmail.com> + * @see https://api.slack.com/incoming-webhooks + * @see https://api.slack.com/docs/message-attachments + * + * @phpstan-import-type FormattedRecord from \Monolog\Handler\AbstractProcessingHandler + * @phpstan-import-type Record from \Monolog\Logger + */ +class SlackRecord +{ + public const COLOR_DANGER = 'danger'; + + public const COLOR_WARNING = 'warning'; + + public const COLOR_GOOD = 'good'; + + public const COLOR_DEFAULT = '#e3e4e6'; + + /** + * Slack channel (encoded ID or name) + * @var string|null + */ + private $channel; + + /** + * Name of a bot + * @var string|null + */ + private $username; + + /** + * User icon e.g. 'ghost', 'http://example.com/user.png' + * @var string|null + */ + private $userIcon; + + /** + * Whether the message should be added to Slack as attachment (plain text otherwise) + * @var bool + */ + private $useAttachment; + + /** + * Whether the the context/extra messages added to Slack as attachments are in a short style + * @var bool + */ + private $useShortAttachment; + + /** + * Whether the attachment should include context and extra data + * @var bool + */ + private $includeContextAndExtra; + + /** + * Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] + * @var string[] + */ + private $excludeFields; + + /** + * @var ?FormatterInterface + */ + private $formatter; + + /** + * @var NormalizerFormatter + */ + private $normalizerFormatter; + + /** + * @param string[] $excludeFields + */ + public function __construct( + ?string $channel = null, + ?string $username = null, + bool $useAttachment = true, + ?string $userIcon = null, + bool $useShortAttachment = false, + bool $includeContextAndExtra = false, + array $excludeFields = array(), + FormatterInterface $formatter = null + ) { + $this + ->setChannel($channel) + ->setUsername($username) + ->useAttachment($useAttachment) + ->setUserIcon($userIcon) + ->useShortAttachment($useShortAttachment) + ->includeContextAndExtra($includeContextAndExtra) + ->excludeFields($excludeFields) + ->setFormatter($formatter); + + if ($this->includeContextAndExtra) { + $this->normalizerFormatter = new NormalizerFormatter(); + } + } + + /** + * Returns required data in format that Slack + * is expecting. + * + * @phpstan-param FormattedRecord $record + * @phpstan-return mixed[] + */ + public function getSlackData(array $record): array + { + $dataArray = array(); + $record = $this->removeExcludedFields($record); + + if ($this->username) { + $dataArray['username'] = $this->username; + } + + if ($this->channel) { + $dataArray['channel'] = $this->channel; + } + + if ($this->formatter && !$this->useAttachment) { + /** @phpstan-ignore-next-line */ + $message = $this->formatter->format($record); + } else { + $message = $record['message']; + } + + if ($this->useAttachment) { + $attachment = array( + 'fallback' => $message, + 'text' => $message, + 'color' => $this->getAttachmentColor($record['level']), + 'fields' => array(), + 'mrkdwn_in' => array('fields'), + 'ts' => $record['datetime']->getTimestamp(), + 'footer' => $this->username, + 'footer_icon' => $this->userIcon, + ); + + if ($this->useShortAttachment) { + $attachment['title'] = $record['level_name']; + } else { + $attachment['title'] = 'Message'; + $attachment['fields'][] = $this->generateAttachmentField('Level', $record['level_name']); + } + + if ($this->includeContextAndExtra) { + foreach (array('extra', 'context') as $key) { + if (empty($record[$key])) { + continue; + } + + if ($this->useShortAttachment) { + $attachment['fields'][] = $this->generateAttachmentField( + (string) $key, + $record[$key] + ); + } else { + // Add all extra fields as individual fields in attachment + $attachment['fields'] = array_merge( + $attachment['fields'], + $this->generateAttachmentFields($record[$key]) + ); + } + } + } + + $dataArray['attachments'] = array($attachment); + } else { + $dataArray['text'] = $message; + } + + if ($this->userIcon) { + if (filter_var($this->userIcon, FILTER_VALIDATE_URL)) { + $dataArray['icon_url'] = $this->userIcon; + } else { + $dataArray['icon_emoji'] = ":{$this->userIcon}:"; + } + } + + return $dataArray; + } + + /** + * Returns a Slack message attachment color associated with + * provided level. + */ + public function getAttachmentColor(int $level): string + { + switch (true) { + case $level >= Logger::ERROR: + return static::COLOR_DANGER; + case $level >= Logger::WARNING: + return static::COLOR_WARNING; + case $level >= Logger::INFO: + return static::COLOR_GOOD; + default: + return static::COLOR_DEFAULT; + } + } + + /** + * Stringifies an array of key/value pairs to be used in attachment fields + * + * @param mixed[] $fields + */ + public function stringify(array $fields): string + { + /** @var Record $fields */ + $normalized = $this->normalizerFormatter->format($fields); + + $hasSecondDimension = count(array_filter($normalized, 'is_array')); + $hasNonNumericKeys = !count(array_filter(array_keys($normalized), 'is_numeric')); + + return $hasSecondDimension || $hasNonNumericKeys + ? Utils::jsonEncode($normalized, JSON_PRETTY_PRINT|Utils::DEFAULT_JSON_FLAGS) + : Utils::jsonEncode($normalized, Utils::DEFAULT_JSON_FLAGS); + } + + /** + * Channel used by the bot when posting + * + * @param ?string $channel + * + * @return static + */ + public function setChannel(?string $channel = null): self + { + $this->channel = $channel; + + return $this; + } + + /** + * Username used by the bot when posting + * + * @param ?string $username + * + * @return static + */ + public function setUsername(?string $username = null): self + { + $this->username = $username; + + return $this; + } + + public function useAttachment(bool $useAttachment = true): self + { + $this->useAttachment = $useAttachment; + + return $this; + } + + public function setUserIcon(?string $userIcon = null): self + { + $this->userIcon = $userIcon; + + if (\is_string($userIcon)) { + $this->userIcon = trim($userIcon, ':'); + } + + return $this; + } + + public function useShortAttachment(bool $useShortAttachment = false): self + { + $this->useShortAttachment = $useShortAttachment; + + return $this; + } + + public function includeContextAndExtra(bool $includeContextAndExtra = false): self + { + $this->includeContextAndExtra = $includeContextAndExtra; + + if ($this->includeContextAndExtra) { + $this->normalizerFormatter = new NormalizerFormatter(); + } + + return $this; + } + + /** + * @param string[] $excludeFields + */ + public function excludeFields(array $excludeFields = []): self + { + $this->excludeFields = $excludeFields; + + return $this; + } + + public function setFormatter(?FormatterInterface $formatter = null): self + { + $this->formatter = $formatter; + + return $this; + } + + /** + * Generates attachment field + * + * @param string|mixed[] $value + * + * @return array{title: string, value: string, short: false} + */ + private function generateAttachmentField(string $title, $value): array + { + $value = is_array($value) + ? sprintf('```%s```', substr($this->stringify($value), 0, 1990)) + : $value; + + return array( + 'title' => ucfirst($title), + 'value' => $value, + 'short' => false, + ); + } + + /** + * Generates a collection of attachment fields from array + * + * @param mixed[] $data + * + * @return array<array{title: string, value: string, short: false}> + */ + private function generateAttachmentFields(array $data): array + { + /** @var Record $data */ + $normalized = $this->normalizerFormatter->format($data); + + $fields = array(); + foreach ($normalized as $key => $value) { + $fields[] = $this->generateAttachmentField((string) $key, $value); + } + + return $fields; + } + + /** + * Get a copy of record with fields excluded according to $this->excludeFields + * + * @phpstan-param FormattedRecord $record + * + * @return mixed[] + */ + private function removeExcludedFields(array $record): array + { + foreach ($this->excludeFields as $field) { + $keys = explode('.', $field); + $node = &$record; + $lastKey = end($keys); + foreach ($keys as $key) { + if (!isset($node[$key])) { + break; + } + if ($lastKey === $key) { + unset($node[$key]); + break; + } + $node = &$node[$key]; + } + } + + return $record; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php new file mode 100644 index 0000000..a648513 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php @@ -0,0 +1,256 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Handler\Slack\SlackRecord; + +/** + * Sends notifications through Slack API + * + * @author Greg Kedzierski <greg@gregkedzierski.com> + * @see https://api.slack.com/ + * + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + */ +class SlackHandler extends SocketHandler +{ + /** + * Slack API token + * @var string + */ + private $token; + + /** + * Instance of the SlackRecord util class preparing data for Slack API. + * @var SlackRecord + */ + private $slackRecord; + + /** + * @param string $token Slack API token + * @param string $channel Slack channel (encoded ID or name) + * @param string|null $username Name of a bot + * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise) + * @param string|null $iconEmoji The emoji name to use (or null) + * @param bool $useShortAttachment Whether the context/extra messages added to Slack as attachments are in a short style + * @param bool $includeContextAndExtra Whether the attachment should include context and extra data + * @param string[] $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] + * @throws MissingExtensionException If no OpenSSL PHP extension configured + */ + public function __construct( + string $token, + string $channel, + ?string $username = null, + bool $useAttachment = true, + ?string $iconEmoji = null, + $level = Logger::CRITICAL, + bool $bubble = true, + bool $useShortAttachment = false, + bool $includeContextAndExtra = false, + array $excludeFields = array(), + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { + if (!extension_loaded('openssl')) { + throw new MissingExtensionException('The OpenSSL PHP extension is required to use the SlackHandler'); + } + + parent::__construct( + 'ssl://slack.com:443', + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); + + $this->slackRecord = new SlackRecord( + $channel, + $username, + $useAttachment, + $iconEmoji, + $useShortAttachment, + $includeContextAndExtra, + $excludeFields + ); + + $this->token = $token; + } + + public function getSlackRecord(): SlackRecord + { + return $this->slackRecord; + } + + public function getToken(): string + { + return $this->token; + } + + /** + * {@inheritDoc} + */ + protected function generateDataStream(array $record): string + { + $content = $this->buildContent($record); + + return $this->buildHeader($content) . $content; + } + + /** + * Builds the body of API call + * + * @phpstan-param FormattedRecord $record + */ + private function buildContent(array $record): string + { + $dataArray = $this->prepareContentData($record); + + return http_build_query($dataArray); + } + + /** + * @phpstan-param FormattedRecord $record + * @return string[] + */ + protected function prepareContentData(array $record): array + { + $dataArray = $this->slackRecord->getSlackData($record); + $dataArray['token'] = $this->token; + + if (!empty($dataArray['attachments'])) { + $dataArray['attachments'] = Utils::jsonEncode($dataArray['attachments']); + } + + return $dataArray; + } + + /** + * Builds the header of the API Call + */ + private function buildHeader(string $content): string + { + $header = "POST /api/chat.postMessage HTTP/1.1\r\n"; + $header .= "Host: slack.com\r\n"; + $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; + $header .= "Content-Length: " . strlen($content) . "\r\n"; + $header .= "\r\n"; + + return $header; + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + parent::write($record); + $this->finalizeWrite(); + } + + /** + * Finalizes the request by reading some bytes and then closing the socket + * + * If we do not read some but close the socket too early, slack sometimes + * drops the request entirely. + */ + protected function finalizeWrite(): void + { + $res = $this->getResource(); + if (is_resource($res)) { + @fread($res, 2048); + } + $this->closeSocket(); + } + + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + parent::setFormatter($formatter); + $this->slackRecord->setFormatter($formatter); + + return $this; + } + + public function getFormatter(): FormatterInterface + { + $formatter = parent::getFormatter(); + $this->slackRecord->setFormatter($formatter); + + return $formatter; + } + + /** + * Channel used by the bot when posting + */ + public function setChannel(string $channel): self + { + $this->slackRecord->setChannel($channel); + + return $this; + } + + /** + * Username used by the bot when posting + */ + public function setUsername(string $username): self + { + $this->slackRecord->setUsername($username); + + return $this; + } + + public function useAttachment(bool $useAttachment): self + { + $this->slackRecord->useAttachment($useAttachment); + + return $this; + } + + public function setIconEmoji(string $iconEmoji): self + { + $this->slackRecord->setUserIcon($iconEmoji); + + return $this; + } + + public function useShortAttachment(bool $useShortAttachment): self + { + $this->slackRecord->useShortAttachment($useShortAttachment); + + return $this; + } + + public function includeContextAndExtra(bool $includeContextAndExtra): self + { + $this->slackRecord->includeContextAndExtra($includeContextAndExtra); + + return $this; + } + + /** + * @param string[] $excludeFields + */ + public function excludeFields(array $excludeFields): self + { + $this->slackRecord->excludeFields($excludeFields); + + return $this; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php new file mode 100644 index 0000000..8ae3c78 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php @@ -0,0 +1,130 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Handler\Slack\SlackRecord; + +/** + * Sends notifications through Slack Webhooks + * + * @author Haralan Dobrev <hkdobrev@gmail.com> + * @see https://api.slack.com/incoming-webhooks + */ +class SlackWebhookHandler extends AbstractProcessingHandler +{ + /** + * Slack Webhook token + * @var string + */ + private $webhookUrl; + + /** + * Instance of the SlackRecord util class preparing data for Slack API. + * @var SlackRecord + */ + private $slackRecord; + + /** + * @param string $webhookUrl Slack Webhook URL + * @param string|null $channel Slack channel (encoded ID or name) + * @param string|null $username Name of a bot + * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise) + * @param string|null $iconEmoji The emoji name to use (or null) + * @param bool $useShortAttachment Whether the the context/extra messages added to Slack as attachments are in a short style + * @param bool $includeContextAndExtra Whether the attachment should include context and extra data + * @param string[] $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] + */ + public function __construct( + string $webhookUrl, + ?string $channel = null, + ?string $username = null, + bool $useAttachment = true, + ?string $iconEmoji = null, + bool $useShortAttachment = false, + bool $includeContextAndExtra = false, + $level = Logger::CRITICAL, + bool $bubble = true, + array $excludeFields = array() + ) { + if (!extension_loaded('curl')) { + throw new MissingExtensionException('The curl extension is needed to use the SlackWebhookHandler'); + } + + parent::__construct($level, $bubble); + + $this->webhookUrl = $webhookUrl; + + $this->slackRecord = new SlackRecord( + $channel, + $username, + $useAttachment, + $iconEmoji, + $useShortAttachment, + $includeContextAndExtra, + $excludeFields + ); + } + + public function getSlackRecord(): SlackRecord + { + return $this->slackRecord; + } + + public function getWebhookUrl(): string + { + return $this->webhookUrl; + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $postData = $this->slackRecord->getSlackData($record); + $postString = Utils::jsonEncode($postData); + + $ch = curl_init(); + $options = array( + CURLOPT_URL => $this->webhookUrl, + CURLOPT_POST => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTPHEADER => array('Content-type: application/json'), + CURLOPT_POSTFIELDS => $postString, + ); + if (defined('CURLOPT_SAFE_UPLOAD')) { + $options[CURLOPT_SAFE_UPLOAD] = true; + } + + curl_setopt_array($ch, $options); + + Curl\Util::execute($ch); + } + + public function setFormatter(FormatterInterface $formatter): HandlerInterface + { + parent::setFormatter($formatter); + $this->slackRecord->setFormatter($formatter); + + return $this; + } + + public function getFormatter(): FormatterInterface + { + $formatter = parent::getFormatter(); + $this->slackRecord->setFormatter($formatter); + + return $formatter; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php new file mode 100644 index 0000000..21701af --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php @@ -0,0 +1,448 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * Stores to any socket - uses fsockopen() or pfsockopen(). + * + * @author Pablo de Leon Belloc <pablolb@gmail.com> + * @see http://php.net/manual/en/function.fsockopen.php + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + */ +class SocketHandler extends AbstractProcessingHandler +{ + /** @var string */ + private $connectionString; + /** @var float */ + private $connectionTimeout; + /** @var resource|null */ + private $resource; + /** @var float */ + private $timeout; + /** @var float */ + private $writingTimeout; + /** @var ?int */ + private $lastSentBytes = null; + /** @var ?int */ + private $chunkSize; + /** @var bool */ + private $persistent; + /** @var ?int */ + private $errno = null; + /** @var ?string */ + private $errstr = null; + /** @var ?float */ + private $lastWritingAt = null; + + /** + * @param string $connectionString Socket connection string + * @param bool $persistent Flag to enable/disable persistent connections + * @param float $timeout Socket timeout to wait until the request is being aborted + * @param float $writingTimeout Socket timeout to wait until the request should've been sent/written + * @param float|null $connectionTimeout Socket connect timeout to wait until the connection should've been + * established + * @param int|null $chunkSize Sets the chunk size. Only has effect during connection in the writing cycle + * + * @throws \InvalidArgumentException If an invalid timeout value (less than 0) is passed. + */ + public function __construct( + string $connectionString, + $level = Logger::DEBUG, + bool $bubble = true, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { + parent::__construct($level, $bubble); + $this->connectionString = $connectionString; + + if ($connectionTimeout !== null) { + $this->validateTimeout($connectionTimeout); + } + + $this->connectionTimeout = $connectionTimeout ?? (float) ini_get('default_socket_timeout'); + $this->persistent = $persistent; + $this->validateTimeout($timeout); + $this->timeout = $timeout; + $this->validateTimeout($writingTimeout); + $this->writingTimeout = $writingTimeout; + $this->chunkSize = $chunkSize; + } + + /** + * Connect (if necessary) and write to the socket + * + * {@inheritDoc} + * + * @throws \UnexpectedValueException + * @throws \RuntimeException + */ + protected function write(array $record): void + { + $this->connectIfNotConnected(); + $data = $this->generateDataStream($record); + $this->writeToSocket($data); + } + + /** + * We will not close a PersistentSocket instance so it can be reused in other requests. + */ + public function close(): void + { + if (!$this->isPersistent()) { + $this->closeSocket(); + } + } + + /** + * Close socket, if open + */ + public function closeSocket(): void + { + if (is_resource($this->resource)) { + fclose($this->resource); + $this->resource = null; + } + } + + /** + * Set socket connection to be persistent. It only has effect before the connection is initiated. + */ + public function setPersistent(bool $persistent): self + { + $this->persistent = $persistent; + + return $this; + } + + /** + * Set connection timeout. Only has effect before we connect. + * + * @see http://php.net/manual/en/function.fsockopen.php + */ + public function setConnectionTimeout(float $seconds): self + { + $this->validateTimeout($seconds); + $this->connectionTimeout = $seconds; + + return $this; + } + + /** + * Set write timeout. Only has effect before we connect. + * + * @see http://php.net/manual/en/function.stream-set-timeout.php + */ + public function setTimeout(float $seconds): self + { + $this->validateTimeout($seconds); + $this->timeout = $seconds; + + return $this; + } + + /** + * Set writing timeout. Only has effect during connection in the writing cycle. + * + * @param float $seconds 0 for no timeout + */ + public function setWritingTimeout(float $seconds): self + { + $this->validateTimeout($seconds); + $this->writingTimeout = $seconds; + + return $this; + } + + /** + * Set chunk size. Only has effect during connection in the writing cycle. + */ + public function setChunkSize(int $bytes): self + { + $this->chunkSize = $bytes; + + return $this; + } + + /** + * Get current connection string + */ + public function getConnectionString(): string + { + return $this->connectionString; + } + + /** + * Get persistent setting + */ + public function isPersistent(): bool + { + return $this->persistent; + } + + /** + * Get current connection timeout setting + */ + public function getConnectionTimeout(): float + { + return $this->connectionTimeout; + } + + /** + * Get current in-transfer timeout + */ + public function getTimeout(): float + { + return $this->timeout; + } + + /** + * Get current local writing timeout + * + * @return float + */ + public function getWritingTimeout(): float + { + return $this->writingTimeout; + } + + /** + * Get current chunk size + */ + public function getChunkSize(): ?int + { + return $this->chunkSize; + } + + /** + * Check to see if the socket is currently available. + * + * UDP might appear to be connected but might fail when writing. See http://php.net/fsockopen for details. + */ + public function isConnected(): bool + { + return is_resource($this->resource) + && !feof($this->resource); // on TCP - other party can close connection. + } + + /** + * Wrapper to allow mocking + * + * @return resource|false + */ + protected function pfsockopen() + { + return @pfsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); + } + + /** + * Wrapper to allow mocking + * + * @return resource|false + */ + protected function fsockopen() + { + return @fsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); + } + + /** + * Wrapper to allow mocking + * + * @see http://php.net/manual/en/function.stream-set-timeout.php + * + * @return bool + */ + protected function streamSetTimeout() + { + $seconds = floor($this->timeout); + $microseconds = round(($this->timeout - $seconds) * 1e6); + + if (!is_resource($this->resource)) { + throw new \LogicException('streamSetTimeout called but $this->resource is not a resource'); + } + + return stream_set_timeout($this->resource, (int) $seconds, (int) $microseconds); + } + + /** + * Wrapper to allow mocking + * + * @see http://php.net/manual/en/function.stream-set-chunk-size.php + * + * @return int|bool + */ + protected function streamSetChunkSize() + { + if (!is_resource($this->resource)) { + throw new \LogicException('streamSetChunkSize called but $this->resource is not a resource'); + } + + if (null === $this->chunkSize) { + throw new \LogicException('streamSetChunkSize called but $this->chunkSize is not set'); + } + + return stream_set_chunk_size($this->resource, $this->chunkSize); + } + + /** + * Wrapper to allow mocking + * + * @return int|bool + */ + protected function fwrite(string $data) + { + if (!is_resource($this->resource)) { + throw new \LogicException('fwrite called but $this->resource is not a resource'); + } + + return @fwrite($this->resource, $data); + } + + /** + * Wrapper to allow mocking + * + * @return mixed[]|bool + */ + protected function streamGetMetadata() + { + if (!is_resource($this->resource)) { + throw new \LogicException('streamGetMetadata called but $this->resource is not a resource'); + } + + return stream_get_meta_data($this->resource); + } + + private function validateTimeout(float $value): void + { + if ($value < 0) { + throw new \InvalidArgumentException("Timeout must be 0 or a positive float (got $value)"); + } + } + + private function connectIfNotConnected(): void + { + if ($this->isConnected()) { + return; + } + $this->connect(); + } + + /** + * @phpstan-param FormattedRecord $record + */ + protected function generateDataStream(array $record): string + { + return (string) $record['formatted']; + } + + /** + * @return resource|null + */ + protected function getResource() + { + return $this->resource; + } + + private function connect(): void + { + $this->createSocketResource(); + $this->setSocketTimeout(); + $this->setStreamChunkSize(); + } + + private function createSocketResource(): void + { + if ($this->isPersistent()) { + $resource = $this->pfsockopen(); + } else { + $resource = $this->fsockopen(); + } + if (is_bool($resource)) { + throw new \UnexpectedValueException("Failed connecting to $this->connectionString ($this->errno: $this->errstr)"); + } + $this->resource = $resource; + } + + private function setSocketTimeout(): void + { + if (!$this->streamSetTimeout()) { + throw new \UnexpectedValueException("Failed setting timeout with stream_set_timeout()"); + } + } + + private function setStreamChunkSize(): void + { + if ($this->chunkSize && !$this->streamSetChunkSize()) { + throw new \UnexpectedValueException("Failed setting chunk size with stream_set_chunk_size()"); + } + } + + private function writeToSocket(string $data): void + { + $length = strlen($data); + $sent = 0; + $this->lastSentBytes = $sent; + while ($this->isConnected() && $sent < $length) { + if (0 == $sent) { + $chunk = $this->fwrite($data); + } else { + $chunk = $this->fwrite(substr($data, $sent)); + } + if ($chunk === false) { + throw new \RuntimeException("Could not write to socket"); + } + $sent += $chunk; + $socketInfo = $this->streamGetMetadata(); + if (is_array($socketInfo) && $socketInfo['timed_out']) { + throw new \RuntimeException("Write timed-out"); + } + + if ($this->writingIsTimedOut($sent)) { + throw new \RuntimeException("Write timed-out, no data sent for `{$this->writingTimeout}` seconds, probably we got disconnected (sent $sent of $length)"); + } + } + if (!$this->isConnected() && $sent < $length) { + throw new \RuntimeException("End-of-file reached, probably we got disconnected (sent $sent of $length)"); + } + } + + private function writingIsTimedOut(int $sent): bool + { + // convert to ms + if (0.0 == $this->writingTimeout) { + return false; + } + + if ($sent !== $this->lastSentBytes) { + $this->lastWritingAt = microtime(true); + $this->lastSentBytes = $sent; + + return false; + } else { + usleep(100); + } + + if ((microtime(true) - $this->lastWritingAt) >= $this->writingTimeout) { + $this->closeSocket(); + + return true; + } + + return false; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php new file mode 100644 index 0000000..dcf282b --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php @@ -0,0 +1,62 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Aws\Sqs\SqsClient; +use Monolog\Logger; +use Monolog\Utils; + +/** + * Writes to any sqs queue. + * + * @author Martijn van Calker <git@amvc.nl> + */ +class SqsHandler extends AbstractProcessingHandler +{ + /** 256 KB in bytes - maximum message size in SQS */ + protected const MAX_MESSAGE_SIZE = 262144; + /** 100 KB in bytes - head message size for new error log */ + protected const HEAD_MESSAGE_SIZE = 102400; + + /** @var SqsClient */ + private $client; + /** @var string */ + private $queueUrl; + + public function __construct(SqsClient $sqsClient, string $queueUrl, $level = Logger::DEBUG, bool $bubble = true) + { + parent::__construct($level, $bubble); + + $this->client = $sqsClient; + $this->queueUrl = $queueUrl; + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + if (!isset($record['formatted']) || 'string' !== gettype($record['formatted'])) { + throw new \InvalidArgumentException('SqsHandler accepts only formatted records as a string' . Utils::getRecordMessageForException($record)); + } + + $messageBody = $record['formatted']; + if (strlen($messageBody) >= static::MAX_MESSAGE_SIZE) { + $messageBody = Utils::substr($messageBody, 0, static::HEAD_MESSAGE_SIZE); + } + + $this->client->sendMessage([ + 'QueueUrl' => $this->queueUrl, + 'MessageBody' => $messageBody, + ]); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php new file mode 100644 index 0000000..6518351 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php @@ -0,0 +1,221 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; + +/** + * Stores to any stream resource + * + * Can be used to store into php://stderr, remote and local files, etc. + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + */ +class StreamHandler extends AbstractProcessingHandler +{ + /** @const int */ + protected const MAX_CHUNK_SIZE = 2147483647; + /** @const int 10MB */ + protected const DEFAULT_CHUNK_SIZE = 10 * 1024 * 1024; + /** @var int */ + protected $streamChunkSize; + /** @var resource|null */ + protected $stream; + /** @var ?string */ + protected $url = null; + /** @var ?string */ + private $errorMessage = null; + /** @var ?int */ + protected $filePermission; + /** @var bool */ + protected $useLocking; + /** @var true|null */ + private $dirCreated = null; + + /** + * @param resource|string $stream If a missing path can't be created, an UnexpectedValueException will be thrown on first write + * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) + * @param bool $useLocking Try to lock log file before doing any writes + * + * @throws \InvalidArgumentException If stream is not a resource or string + */ + public function __construct($stream, $level = Logger::DEBUG, bool $bubble = true, ?int $filePermission = null, bool $useLocking = false) + { + parent::__construct($level, $bubble); + + if (($phpMemoryLimit = Utils::expandIniShorthandBytes(ini_get('memory_limit'))) !== false) { + if ($phpMemoryLimit > 0) { + // use max 10% of allowed memory for the chunk size, and at least 100KB + $this->streamChunkSize = min(static::MAX_CHUNK_SIZE, max((int) ($phpMemoryLimit / 10), 100 * 1024)); + } else { + // memory is unlimited, set to the default 10MB + $this->streamChunkSize = static::DEFAULT_CHUNK_SIZE; + } + } else { + // no memory limit information, set to the default 10MB + $this->streamChunkSize = static::DEFAULT_CHUNK_SIZE; + } + + if (is_resource($stream)) { + $this->stream = $stream; + + stream_set_chunk_size($this->stream, $this->streamChunkSize); + } elseif (is_string($stream)) { + $this->url = Utils::canonicalizePath($stream); + } else { + throw new \InvalidArgumentException('A stream must either be a resource or a string.'); + } + + $this->filePermission = $filePermission; + $this->useLocking = $useLocking; + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + if ($this->url && is_resource($this->stream)) { + fclose($this->stream); + } + $this->stream = null; + $this->dirCreated = null; + } + + /** + * Return the currently active stream if it is open + * + * @return resource|null + */ + public function getStream() + { + return $this->stream; + } + + /** + * Return the stream URL if it was configured with a URL and not an active resource + * + * @return string|null + */ + public function getUrl(): ?string + { + return $this->url; + } + + /** + * @return int + */ + public function getStreamChunkSize(): int + { + return $this->streamChunkSize; + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + if (!is_resource($this->stream)) { + $url = $this->url; + if (null === $url || '' === $url) { + throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().' . Utils::getRecordMessageForException($record)); + } + $this->createDir($url); + $this->errorMessage = null; + set_error_handler([$this, 'customErrorHandler']); + $stream = fopen($url, 'a'); + if ($this->filePermission !== null) { + @chmod($url, $this->filePermission); + } + restore_error_handler(); + if (!is_resource($stream)) { + $this->stream = null; + + throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened in append mode: '.$this->errorMessage, $url) . Utils::getRecordMessageForException($record)); + } + stream_set_chunk_size($stream, $this->streamChunkSize); + $this->stream = $stream; + } + + $stream = $this->stream; + if (!is_resource($stream)) { + throw new \LogicException('No stream was opened yet' . Utils::getRecordMessageForException($record)); + } + + if ($this->useLocking) { + // ignoring errors here, there's not much we can do about them + flock($stream, LOCK_EX); + } + + $this->streamWrite($stream, $record); + + if ($this->useLocking) { + flock($stream, LOCK_UN); + } + } + + /** + * Write to stream + * @param resource $stream + * @param array $record + * + * @phpstan-param FormattedRecord $record + */ + protected function streamWrite($stream, array $record): void + { + fwrite($stream, (string) $record['formatted']); + } + + private function customErrorHandler(int $code, string $msg): bool + { + $this->errorMessage = preg_replace('{^(fopen|mkdir)\(.*?\): }', '', $msg); + + return true; + } + + private function getDirFromStream(string $stream): ?string + { + $pos = strpos($stream, '://'); + if ($pos === false) { + return dirname($stream); + } + + if ('file://' === substr($stream, 0, 7)) { + return dirname(substr($stream, 7)); + } + + return null; + } + + private function createDir(string $url): void + { + // Do not try to create dir if it has already been tried. + if ($this->dirCreated) { + return; + } + + $dir = $this->getDirFromStream($url); + if (null !== $dir && !is_dir($dir)) { + $this->errorMessage = null; + set_error_handler([$this, 'customErrorHandler']); + $status = mkdir($dir, 0777, true); + restore_error_handler(); + if (false === $status && !is_dir($dir) && strpos((string) $this->errorMessage, 'File exists') === false) { + throw new \UnexpectedValueException(sprintf('There is no existing directory at "%s" and it could not be created: '.$this->errorMessage, $dir)); + } + } + $this->dirCreated = true; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php new file mode 100644 index 0000000..fae9251 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php @@ -0,0 +1,115 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; +use Swift_Message; +use Swift; + +/** + * SwiftMailerHandler uses Swift_Mailer to send the emails + * + * @author Gyula Sallai + * + * @phpstan-import-type Record from \Monolog\Logger + * @deprecated Since Monolog 2.6. Use SymfonyMailerHandler instead. + */ +class SwiftMailerHandler extends MailHandler +{ + /** @var \Swift_Mailer */ + protected $mailer; + /** @var Swift_Message|callable(string, Record[]): Swift_Message */ + private $messageTemplate; + + /** + * @psalm-param Swift_Message|callable(string, Record[]): Swift_Message $message + * + * @param \Swift_Mailer $mailer The mailer to use + * @param callable|Swift_Message $message An example message for real messages, only the body will be replaced + */ + public function __construct(\Swift_Mailer $mailer, $message, $level = Logger::ERROR, bool $bubble = true) + { + parent::__construct($level, $bubble); + + @trigger_error('The SwiftMailerHandler is deprecated since Monolog 2.6. Use SymfonyMailerHandler instead.', E_USER_DEPRECATED); + + $this->mailer = $mailer; + $this->messageTemplate = $message; + } + + /** + * {@inheritDoc} + */ + protected function send(string $content, array $records): void + { + $this->mailer->send($this->buildMessage($content, $records)); + } + + /** + * Gets the formatter for the Swift_Message subject. + * + * @param string|null $format The format of the subject + */ + protected function getSubjectFormatter(?string $format): FormatterInterface + { + return new LineFormatter($format); + } + + /** + * Creates instance of Swift_Message to be sent + * + * @param string $content formatted email body to be sent + * @param array $records Log records that formed the content + * @return Swift_Message + * + * @phpstan-param Record[] $records + */ + protected function buildMessage(string $content, array $records): Swift_Message + { + $message = null; + if ($this->messageTemplate instanceof Swift_Message) { + $message = clone $this->messageTemplate; + $message->generateId(); + } elseif (is_callable($this->messageTemplate)) { + $message = ($this->messageTemplate)($content, $records); + } + + if (!$message instanceof Swift_Message) { + $record = reset($records); + throw new \InvalidArgumentException('Could not resolve message as instance of Swift_Message or a callable returning it' . ($record ? Utils::getRecordMessageForException($record) : '')); + } + + if ($records) { + $subjectFormatter = $this->getSubjectFormatter($message->getSubject()); + $message->setSubject($subjectFormatter->format($this->getHighestRecord($records))); + } + + $mime = 'text/plain'; + if ($this->isHtmlBody($content)) { + $mime = 'text/html'; + } + + $message->setBody($content, $mime); + /** @phpstan-ignore-next-line */ + if (version_compare(Swift::VERSION, '6.0.0', '>=')) { + $message->setDate(new \DateTimeImmutable()); + } else { + /** @phpstan-ignore-next-line */ + $message->setDate(time()); + } + + return $message; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php new file mode 100644 index 0000000..130e6f1 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php @@ -0,0 +1,111 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; +use Symfony\Component\Mailer\MailerInterface; +use Symfony\Component\Mailer\Transport\TransportInterface; +use Symfony\Component\Mime\Email; + +/** + * SymfonyMailerHandler uses Symfony's Mailer component to send the emails + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * + * @phpstan-import-type Record from \Monolog\Logger + */ +class SymfonyMailerHandler extends MailHandler +{ + /** @var MailerInterface|TransportInterface */ + protected $mailer; + /** @var Email|callable(string, Record[]): Email */ + private $emailTemplate; + + /** + * @psalm-param Email|callable(string, Record[]): Email $email + * + * @param MailerInterface|TransportInterface $mailer The mailer to use + * @param callable|Email $email An email template, the subject/body will be replaced + */ + public function __construct($mailer, $email, $level = Logger::ERROR, bool $bubble = true) + { + parent::__construct($level, $bubble); + + $this->mailer = $mailer; + $this->emailTemplate = $email; + } + + /** + * {@inheritDoc} + */ + protected function send(string $content, array $records): void + { + $this->mailer->send($this->buildMessage($content, $records)); + } + + /** + * Gets the formatter for the Swift_Message subject. + * + * @param string|null $format The format of the subject + */ + protected function getSubjectFormatter(?string $format): FormatterInterface + { + return new LineFormatter($format); + } + + /** + * Creates instance of Email to be sent + * + * @param string $content formatted email body to be sent + * @param array $records Log records that formed the content + * + * @phpstan-param Record[] $records + */ + protected function buildMessage(string $content, array $records): Email + { + $message = null; + if ($this->emailTemplate instanceof Email) { + $message = clone $this->emailTemplate; + } elseif (is_callable($this->emailTemplate)) { + $message = ($this->emailTemplate)($content, $records); + } + + if (!$message instanceof Email) { + $record = reset($records); + throw new \InvalidArgumentException('Could not resolve message as instance of Email or a callable returning it' . ($record ? Utils::getRecordMessageForException($record) : '')); + } + + if ($records) { + $subjectFormatter = $this->getSubjectFormatter($message->getSubject()); + $message->subject($subjectFormatter->format($this->getHighestRecord($records))); + } + + if ($this->isHtmlBody($content)) { + if (null !== ($charset = $message->getHtmlCharset())) { + $message->html($content, $charset); + } else { + $message->html($content); + } + } else { + if (null !== ($charset = $message->getTextCharset())) { + $message->text($content, $charset); + } else { + $message->text($content); + } + } + + return $message->date(new \DateTimeImmutable()); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php new file mode 100644 index 0000000..1d543b7 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php @@ -0,0 +1,68 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; + +/** + * Logs to syslog service. + * + * usage example: + * + * $log = new Logger('application'); + * $syslog = new SyslogHandler('myfacility', 'local6'); + * $formatter = new LineFormatter("%channel%.%level_name%: %message% %extra%"); + * $syslog->setFormatter($formatter); + * $log->pushHandler($syslog); + * + * @author Sven Paulus <sven@karlsruhe.org> + */ +class SyslogHandler extends AbstractSyslogHandler +{ + /** @var string */ + protected $ident; + /** @var int */ + protected $logopts; + + /** + * @param string $ident + * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant + * @param int $logopts Option flags for the openlog() call, defaults to LOG_PID + */ + public function __construct(string $ident, $facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true, int $logopts = LOG_PID) + { + parent::__construct($facility, $level, $bubble); + + $this->ident = $ident; + $this->logopts = $logopts; + } + + /** + * {@inheritDoc} + */ + public function close(): void + { + closelog(); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + if (!openlog($this->ident, $this->logopts, $this->facility)) { + throw new \LogicException('Can\'t open syslog for ident "'.$this->ident.'" and facility "'.$this->facility.'"' . Utils::getRecordMessageForException($record)); + } + syslog($this->logLevels[$record['level']], (string) $record['formatted']); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php new file mode 100644 index 0000000..dbd8ef6 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php @@ -0,0 +1,88 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler\SyslogUdp; + +use Monolog\Utils; +use Socket; + +class UdpSocket +{ + protected const DATAGRAM_MAX_LENGTH = 65023; + + /** @var string */ + protected $ip; + /** @var int */ + protected $port; + /** @var resource|Socket|null */ + protected $socket = null; + + public function __construct(string $ip, int $port = 514) + { + $this->ip = $ip; + $this->port = $port; + } + + /** + * @param string $line + * @param string $header + * @return void + */ + public function write($line, $header = "") + { + $this->send($this->assembleMessage($line, $header)); + } + + public function close(): void + { + if (is_resource($this->socket) || $this->socket instanceof Socket) { + socket_close($this->socket); + $this->socket = null; + } + } + + /** + * @return resource|Socket + */ + protected function getSocket() + { + if (null !== $this->socket) { + return $this->socket; + } + + $domain = AF_INET; + $protocol = SOL_UDP; + // Check if we are using unix sockets. + if ($this->port === 0) { + $domain = AF_UNIX; + $protocol = IPPROTO_IP; + } + + $this->socket = socket_create($domain, SOCK_DGRAM, $protocol) ?: null; + if (null === $this->socket) { + throw new \RuntimeException('The UdpSocket to '.$this->ip.':'.$this->port.' could not be opened via socket_create'); + } + + return $this->socket; + } + + protected function send(string $chunk): void + { + socket_sendto($this->getSocket(), $chunk, strlen($chunk), $flags = 0, $this->ip, $this->port); + } + + protected function assembleMessage(string $line, string $header): string + { + $chunkSize = static::DATAGRAM_MAX_LENGTH - strlen($header); + + return $header . Utils::substr($line, 0, $chunkSize); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php new file mode 100644 index 0000000..deaa19f --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php @@ -0,0 +1,150 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use DateTimeInterface; +use Monolog\Logger; +use Monolog\Handler\SyslogUdp\UdpSocket; +use Monolog\Utils; + +/** + * A Handler for logging to a remote syslogd server. + * + * @author Jesper Skovgaard Nielsen <nulpunkt@gmail.com> + * @author Dominik Kukacka <dominik.kukacka@gmail.com> + */ +class SyslogUdpHandler extends AbstractSyslogHandler +{ + const RFC3164 = 0; + const RFC5424 = 1; + const RFC5424e = 2; + + /** @var array<self::RFC*, string> */ + private $dateFormats = array( + self::RFC3164 => 'M d H:i:s', + self::RFC5424 => \DateTime::RFC3339, + self::RFC5424e => \DateTime::RFC3339_EXTENDED, + ); + + /** @var UdpSocket */ + protected $socket; + /** @var string */ + protected $ident; + /** @var self::RFC* */ + protected $rfc; + + /** + * @param string $host Either IP/hostname or a path to a unix socket (port must be 0 then) + * @param int $port Port number, or 0 if $host is a unix socket + * @param string|int $facility Either one of the names of the keys in $this->facilities, or a LOG_* facility constant + * @param bool $bubble Whether the messages that are handled can bubble up the stack or not + * @param string $ident Program name or tag for each log message. + * @param int $rfc RFC to format the message for. + * @throws MissingExtensionException + * + * @phpstan-param self::RFC* $rfc + */ + public function __construct(string $host, int $port = 514, $facility = LOG_USER, $level = Logger::DEBUG, bool $bubble = true, string $ident = 'php', int $rfc = self::RFC5424) + { + if (!extension_loaded('sockets')) { + throw new MissingExtensionException('The sockets extension is required to use the SyslogUdpHandler'); + } + + parent::__construct($facility, $level, $bubble); + + $this->ident = $ident; + $this->rfc = $rfc; + + $this->socket = new UdpSocket($host, $port); + } + + protected function write(array $record): void + { + $lines = $this->splitMessageIntoLines($record['formatted']); + + $header = $this->makeCommonSyslogHeader($this->logLevels[$record['level']], $record['datetime']); + + foreach ($lines as $line) { + $this->socket->write($line, $header); + } + } + + public function close(): void + { + $this->socket->close(); + } + + /** + * @param string|string[] $message + * @return string[] + */ + private function splitMessageIntoLines($message): array + { + if (is_array($message)) { + $message = implode("\n", $message); + } + + $lines = preg_split('/$\R?^/m', (string) $message, -1, PREG_SPLIT_NO_EMPTY); + if (false === $lines) { + $pcreErrorCode = preg_last_error(); + throw new \RuntimeException('Could not preg_split: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode)); + } + + return $lines; + } + + /** + * Make common syslog header (see rfc5424 or rfc3164) + */ + protected function makeCommonSyslogHeader(int $severity, DateTimeInterface $datetime): string + { + $priority = $severity + $this->facility; + + if (!$pid = getmypid()) { + $pid = '-'; + } + + if (!$hostname = gethostname()) { + $hostname = '-'; + } + + if ($this->rfc === self::RFC3164) { + // see https://github.com/phpstan/phpstan/issues/5348 + // @phpstan-ignore-next-line + $dateNew = $datetime->setTimezone(new \DateTimeZone('UTC')); + $date = $dateNew->format($this->dateFormats[$this->rfc]); + + return "<$priority>" . + $date . " " . + $hostname . " " . + $this->ident . "[" . $pid . "]: "; + } + + $date = $datetime->format($this->dateFormats[$this->rfc]); + + return "<$priority>1 " . + $date . " " . + $hostname . " " . + $this->ident . " " . + $pid . " - - "; + } + + /** + * Inject your own socket, mainly used for testing + */ + public function setSocket(UdpSocket $socket): self + { + $this->socket = $socket; + + return $this; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php new file mode 100644 index 0000000..8912eba --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php @@ -0,0 +1,274 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use RuntimeException; +use Monolog\Logger; +use Monolog\Utils; + +/** + * Handler send logs to Telegram using Telegram Bot API. + * + * How to use: + * 1) Create telegram bot with https://telegram.me/BotFather + * 2) Create a telegram channel where logs will be recorded. + * 3) Add created bot from step 1 to the created channel from step 2. + * + * Use telegram bot API key from step 1 and channel name with '@' prefix from step 2 to create instance of TelegramBotHandler + * + * @link https://core.telegram.org/bots/api + * + * @author Mazur Alexandr <alexandrmazur96@gmail.com> + * + * @phpstan-import-type Record from \Monolog\Logger + */ +class TelegramBotHandler extends AbstractProcessingHandler +{ + private const BOT_API = 'https://api.telegram.org/bot'; + + /** + * The available values of parseMode according to the Telegram api documentation + */ + private const AVAILABLE_PARSE_MODES = [ + 'HTML', + 'MarkdownV2', + 'Markdown', // legacy mode without underline and strikethrough, use MarkdownV2 instead + ]; + + /** + * The maximum number of characters allowed in a message according to the Telegram api documentation + */ + private const MAX_MESSAGE_LENGTH = 4096; + + /** + * Telegram bot access token provided by BotFather. + * Create telegram bot with https://telegram.me/BotFather and use access token from it. + * @var string + */ + private $apiKey; + + /** + * Telegram channel name. + * Since to start with '@' symbol as prefix. + * @var string + */ + private $channel; + + /** + * The kind of formatting that is used for the message. + * See available options at https://core.telegram.org/bots/api#formatting-options + * or in AVAILABLE_PARSE_MODES + * @var ?string + */ + private $parseMode; + + /** + * Disables link previews for links in the message. + * @var ?bool + */ + private $disableWebPagePreview; + + /** + * Sends the message silently. Users will receive a notification with no sound. + * @var ?bool + */ + private $disableNotification; + + /** + * True - split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages. + * False - truncates a message that is too long. + * @var bool + */ + private $splitLongMessages; + + /** + * Adds 1-second delay between sending a split message (according to Telegram API to avoid 429 Too Many Requests). + * @var bool + */ + private $delayBetweenMessages; + + /** + * @param string $apiKey Telegram bot access token provided by BotFather + * @param string $channel Telegram channel name + * @param bool $splitLongMessages Split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages + * @param bool $delayBetweenMessages Adds delay between sending a split message according to Telegram API + * @throws MissingExtensionException + */ + public function __construct( + string $apiKey, + string $channel, + $level = Logger::DEBUG, + bool $bubble = true, + string $parseMode = null, + bool $disableWebPagePreview = null, + bool $disableNotification = null, + bool $splitLongMessages = false, + bool $delayBetweenMessages = false + ) + { + if (!extension_loaded('curl')) { + throw new MissingExtensionException('The curl extension is needed to use the TelegramBotHandler'); + } + + parent::__construct($level, $bubble); + + $this->apiKey = $apiKey; + $this->channel = $channel; + $this->setParseMode($parseMode); + $this->disableWebPagePreview($disableWebPagePreview); + $this->disableNotification($disableNotification); + $this->splitLongMessages($splitLongMessages); + $this->delayBetweenMessages($delayBetweenMessages); + } + + public function setParseMode(string $parseMode = null): self + { + if ($parseMode !== null && !in_array($parseMode, self::AVAILABLE_PARSE_MODES)) { + throw new \InvalidArgumentException('Unknown parseMode, use one of these: ' . implode(', ', self::AVAILABLE_PARSE_MODES) . '.'); + } + + $this->parseMode = $parseMode; + + return $this; + } + + public function disableWebPagePreview(bool $disableWebPagePreview = null): self + { + $this->disableWebPagePreview = $disableWebPagePreview; + + return $this; + } + + public function disableNotification(bool $disableNotification = null): self + { + $this->disableNotification = $disableNotification; + + return $this; + } + + /** + * True - split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages. + * False - truncates a message that is too long. + * @param bool $splitLongMessages + * @return $this + */ + public function splitLongMessages(bool $splitLongMessages = false): self + { + $this->splitLongMessages = $splitLongMessages; + + return $this; + } + + /** + * Adds 1-second delay between sending a split message (according to Telegram API to avoid 429 Too Many Requests). + * @param bool $delayBetweenMessages + * @return $this + */ + public function delayBetweenMessages(bool $delayBetweenMessages = false): self + { + $this->delayBetweenMessages = $delayBetweenMessages; + + return $this; + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + /** @var Record[] $messages */ + $messages = []; + + foreach ($records as $record) { + if (!$this->isHandling($record)) { + continue; + } + + if ($this->processors) { + /** @var Record $record */ + $record = $this->processRecord($record); + } + + $messages[] = $record; + } + + if (!empty($messages)) { + $this->send((string)$this->getFormatter()->formatBatch($messages)); + } + } + + /** + * @inheritDoc + */ + protected function write(array $record): void + { + $this->send($record['formatted']); + } + + /** + * Send request to @link https://api.telegram.org/bot on SendMessage action. + * @param string $message + */ + protected function send(string $message): void + { + $messages = $this->handleMessageLength($message); + + foreach ($messages as $key => $msg) { + if ($this->delayBetweenMessages && $key > 0) { + sleep(1); + } + + $this->sendCurl($msg); + } + } + + protected function sendCurl(string $message): void + { + $ch = curl_init(); + $url = self::BOT_API . $this->apiKey . '/SendMessage'; + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ + 'text' => $message, + 'chat_id' => $this->channel, + 'parse_mode' => $this->parseMode, + 'disable_web_page_preview' => $this->disableWebPagePreview, + 'disable_notification' => $this->disableNotification, + ])); + + $result = Curl\Util::execute($ch); + if (!is_string($result)) { + throw new RuntimeException('Telegram API error. Description: No response'); + } + $result = json_decode($result, true); + + if ($result['ok'] === false) { + throw new RuntimeException('Telegram API error. Description: ' . $result['description']); + } + } + + /** + * Handle a message that is too long: truncates or splits into several + * @param string $message + * @return string[] + */ + private function handleMessageLength(string $message): array + { + $truncatedMarker = ' (...truncated)'; + if (!$this->splitLongMessages && strlen($message) > self::MAX_MESSAGE_LENGTH) { + return [Utils::substr($message, 0, self::MAX_MESSAGE_LENGTH - strlen($truncatedMarker)) . $truncatedMarker]; + } + + return str_split($message, self::MAX_MESSAGE_LENGTH); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php new file mode 100644 index 0000000..0986da2 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php @@ -0,0 +1,231 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Psr\Log\LogLevel; + +/** + * Used for testing purposes. + * + * It records all records and gives you access to them for verification. + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * + * @method bool hasEmergency($record) + * @method bool hasAlert($record) + * @method bool hasCritical($record) + * @method bool hasError($record) + * @method bool hasWarning($record) + * @method bool hasNotice($record) + * @method bool hasInfo($record) + * @method bool hasDebug($record) + * + * @method bool hasEmergencyRecords() + * @method bool hasAlertRecords() + * @method bool hasCriticalRecords() + * @method bool hasErrorRecords() + * @method bool hasWarningRecords() + * @method bool hasNoticeRecords() + * @method bool hasInfoRecords() + * @method bool hasDebugRecords() + * + * @method bool hasEmergencyThatContains($message) + * @method bool hasAlertThatContains($message) + * @method bool hasCriticalThatContains($message) + * @method bool hasErrorThatContains($message) + * @method bool hasWarningThatContains($message) + * @method bool hasNoticeThatContains($message) + * @method bool hasInfoThatContains($message) + * @method bool hasDebugThatContains($message) + * + * @method bool hasEmergencyThatMatches($message) + * @method bool hasAlertThatMatches($message) + * @method bool hasCriticalThatMatches($message) + * @method bool hasErrorThatMatches($message) + * @method bool hasWarningThatMatches($message) + * @method bool hasNoticeThatMatches($message) + * @method bool hasInfoThatMatches($message) + * @method bool hasDebugThatMatches($message) + * + * @method bool hasEmergencyThatPasses($message) + * @method bool hasAlertThatPasses($message) + * @method bool hasCriticalThatPasses($message) + * @method bool hasErrorThatPasses($message) + * @method bool hasWarningThatPasses($message) + * @method bool hasNoticeThatPasses($message) + * @method bool hasInfoThatPasses($message) + * @method bool hasDebugThatPasses($message) + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class TestHandler extends AbstractProcessingHandler +{ + /** @var Record[] */ + protected $records = []; + /** @var array<Level, Record[]> */ + protected $recordsByLevel = []; + /** @var bool */ + private $skipReset = false; + + /** + * @return array + * + * @phpstan-return Record[] + */ + public function getRecords() + { + return $this->records; + } + + /** + * @return void + */ + public function clear() + { + $this->records = []; + $this->recordsByLevel = []; + } + + /** + * @return void + */ + public function reset() + { + if (!$this->skipReset) { + $this->clear(); + } + } + + /** + * @return void + */ + public function setSkipReset(bool $skipReset) + { + $this->skipReset = $skipReset; + } + + /** + * @param string|int $level Logging level value or name + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function hasRecords($level): bool + { + return isset($this->recordsByLevel[Logger::toMonologLevel($level)]); + } + + /** + * @param string|array $record Either a message string or an array containing message and optionally context keys that will be checked against all records + * @param string|int $level Logging level value or name + * + * @phpstan-param array{message: string, context?: mixed[]}|string $record + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function hasRecord($record, $level): bool + { + if (is_string($record)) { + $record = array('message' => $record); + } + + return $this->hasRecordThatPasses(function ($rec) use ($record) { + if ($rec['message'] !== $record['message']) { + return false; + } + if (isset($record['context']) && $rec['context'] !== $record['context']) { + return false; + } + + return true; + }, $level); + } + + /** + * @param string|int $level Logging level value or name + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function hasRecordThatContains(string $message, $level): bool + { + return $this->hasRecordThatPasses(function ($rec) use ($message) { + return strpos($rec['message'], $message) !== false; + }, $level); + } + + /** + * @param string|int $level Logging level value or name + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function hasRecordThatMatches(string $regex, $level): bool + { + return $this->hasRecordThatPasses(function (array $rec) use ($regex): bool { + return preg_match($regex, $rec['message']) > 0; + }, $level); + } + + /** + * @param string|int $level Logging level value or name + * @return bool + * + * @psalm-param callable(Record, int): mixed $predicate + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function hasRecordThatPasses(callable $predicate, $level) + { + $level = Logger::toMonologLevel($level); + + if (!isset($this->recordsByLevel[$level])) { + return false; + } + + foreach ($this->recordsByLevel[$level] as $i => $rec) { + if ($predicate($rec, $i)) { + return true; + } + } + + return false; + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $this->recordsByLevel[$record['level']][] = $record; + $this->records[] = $record; + } + + /** + * @param string $method + * @param mixed[] $args + * @return bool + */ + public function __call($method, $args) + { + if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { + $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; + $level = constant('Monolog\Logger::' . strtoupper($matches[2])); + $callback = [$this, $genericMethod]; + if (is_callable($callback)) { + $args[] = $level; + + return call_user_func_array($callback, $args); + } + } + + throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()'); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php b/vendor/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php new file mode 100644 index 0000000..c818352 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php @@ -0,0 +1,24 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +trait WebRequestRecognizerTrait +{ + /** + * Checks if PHP's serving a web request + * @return bool + */ + protected function isWebRequest(): bool + { + return 'cli' !== \PHP_SAPI && 'phpdbg' !== \PHP_SAPI; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php new file mode 100644 index 0000000..2dd1367 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php @@ -0,0 +1,67 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Forwards records to multiple handlers suppressing failures of each handler + * and continuing through to give every handler a chance to succeed. + * + * @author Craig D'Amelio <craig@damelio.ca> + * + * @phpstan-import-type Record from \Monolog\Logger + */ +class WhatFailureGroupHandler extends GroupHandler +{ + /** + * {@inheritDoc} + */ + public function handle(array $record): bool + { + if ($this->processors) { + /** @var Record $record */ + $record = $this->processRecord($record); + } + + foreach ($this->handlers as $handler) { + try { + $handler->handle($record); + } catch (\Throwable $e) { + // What failure? + } + } + + return false === $this->bubble; + } + + /** + * {@inheritDoc} + */ + public function handleBatch(array $records): void + { + if ($this->processors) { + $processed = array(); + foreach ($records as $record) { + $processed[] = $this->processRecord($record); + } + /** @var Record[] $records */ + $records = $processed; + } + + foreach ($this->handlers as $handler) { + try { + $handler->handleBatch($records); + } catch (\Throwable $e) { + // What failure? + } + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php new file mode 100644 index 0000000..ddd46d8 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php @@ -0,0 +1,101 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\NormalizerFormatter; +use Monolog\Logger; + +/** + * Handler sending logs to Zend Monitor + * + * @author Christian Bergau <cbergau86@gmail.com> + * @author Jason Davis <happydude@jasondavis.net> + * + * @phpstan-import-type FormattedRecord from AbstractProcessingHandler + */ +class ZendMonitorHandler extends AbstractProcessingHandler +{ + /** + * Monolog level / ZendMonitor Custom Event priority map + * + * @var array<int, int> + */ + protected $levelMap = []; + + /** + * @throws MissingExtensionException + */ + public function __construct($level = Logger::DEBUG, bool $bubble = true) + { + if (!function_exists('zend_monitor_custom_event')) { + throw new MissingExtensionException( + 'You must have Zend Server installed with Zend Monitor enabled in order to use this handler' + ); + } + //zend monitor constants are not defined if zend monitor is not enabled. + $this->levelMap = [ + Logger::DEBUG => \ZEND_MONITOR_EVENT_SEVERITY_INFO, + Logger::INFO => \ZEND_MONITOR_EVENT_SEVERITY_INFO, + Logger::NOTICE => \ZEND_MONITOR_EVENT_SEVERITY_INFO, + Logger::WARNING => \ZEND_MONITOR_EVENT_SEVERITY_WARNING, + Logger::ERROR => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + Logger::CRITICAL => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + Logger::ALERT => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + Logger::EMERGENCY => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, + ]; + parent::__construct($level, $bubble); + } + + /** + * {@inheritDoc} + */ + protected function write(array $record): void + { + $this->writeZendMonitorCustomEvent( + Logger::getLevelName($record['level']), + $record['message'], + $record['formatted'], + $this->levelMap[$record['level']] + ); + } + + /** + * Write to Zend Monitor Events + * @param string $type Text displayed in "Class Name (custom)" field + * @param string $message Text displayed in "Error String" + * @param array $formatted Displayed in Custom Variables tab + * @param int $severity Set the event severity level (-1,0,1) + * + * @phpstan-param FormattedRecord $formatted + */ + protected function writeZendMonitorCustomEvent(string $type, string $message, array $formatted, int $severity): void + { + zend_monitor_custom_event($type, $message, $formatted, $severity); + } + + /** + * {@inheritDoc} + */ + public function getDefaultFormatter(): FormatterInterface + { + return new NormalizerFormatter(); + } + + /** + * @return array<int, int> + */ + public function getLevelMap(): array + { + return $this->levelMap; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/LogRecord.php b/vendor/monolog/monolog/src/Monolog/LogRecord.php new file mode 100644 index 0000000..702807d --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/LogRecord.php @@ -0,0 +1,34 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use ArrayAccess; + +/** + * Monolog log record interface for forward compatibility with Monolog 3.0 + * + * This is just present in Monolog 2.4+ to allow interoperable code to be written against + * both versions by type-hinting arguments as `array|\Monolog\LogRecord $record` + * + * Do not rely on this interface for other purposes, and do not implement it. + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * @template-extends \ArrayAccess<'message'|'level'|'context'|'level_name'|'channel'|'datetime'|'extra'|'formatted', mixed> + * @phpstan-import-type Record from Logger + */ +interface LogRecord extends \ArrayAccess +{ + /** + * @phpstan-return Record + */ + public function toArray(): array; +} diff --git a/vendor/monolog/monolog/src/Monolog/Logger.php b/vendor/monolog/monolog/src/Monolog/Logger.php new file mode 100644 index 0000000..1ab75b9 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Logger.php @@ -0,0 +1,701 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use DateTimeZone; +use Monolog\Handler\HandlerInterface; +use Psr\Log\LoggerInterface; +use Psr\Log\InvalidArgumentException; +use Psr\Log\LogLevel; +use Throwable; +use Stringable; + +/** + * Monolog log channel + * + * It contains a stack of Handlers and a stack of Processors, + * and uses them to store records that are added to it. + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * + * @phpstan-type Level Logger::DEBUG|Logger::INFO|Logger::NOTICE|Logger::WARNING|Logger::ERROR|Logger::CRITICAL|Logger::ALERT|Logger::EMERGENCY + * @phpstan-type LevelName 'DEBUG'|'INFO'|'NOTICE'|'WARNING'|'ERROR'|'CRITICAL'|'ALERT'|'EMERGENCY' + * @phpstan-type Record array{message: string, context: mixed[], level: Level, level_name: LevelName, channel: string, datetime: \DateTimeImmutable, extra: mixed[]} + */ +class Logger implements LoggerInterface, ResettableInterface +{ + /** + * Detailed debug information + */ + public const DEBUG = 100; + + /** + * Interesting events + * + * Examples: User logs in, SQL logs. + */ + public const INFO = 200; + + /** + * Uncommon events + */ + public const NOTICE = 250; + + /** + * Exceptional occurrences that are not errors + * + * Examples: Use of deprecated APIs, poor use of an API, + * undesirable things that are not necessarily wrong. + */ + public const WARNING = 300; + + /** + * Runtime errors + */ + public const ERROR = 400; + + /** + * Critical conditions + * + * Example: Application component unavailable, unexpected exception. + */ + public const CRITICAL = 500; + + /** + * Action must be taken immediately + * + * Example: Entire website down, database unavailable, etc. + * This should trigger the SMS alerts and wake you up. + */ + public const ALERT = 550; + + /** + * Urgent alert. + */ + public const EMERGENCY = 600; + + /** + * Monolog API version + * + * This is only bumped when API breaks are done and should + * follow the major version of the library + * + * @var int + */ + public const API = 2; + + /** + * This is a static variable and not a constant to serve as an extension point for custom levels + * + * @var array<int, string> $levels Logging levels with the levels as key + * + * @phpstan-var array<Level, LevelName> $levels Logging levels with the levels as key + */ + protected static $levels = [ + self::DEBUG => 'DEBUG', + self::INFO => 'INFO', + self::NOTICE => 'NOTICE', + self::WARNING => 'WARNING', + self::ERROR => 'ERROR', + self::CRITICAL => 'CRITICAL', + self::ALERT => 'ALERT', + self::EMERGENCY => 'EMERGENCY', + ]; + + /** + * Mapping between levels numbers defined in RFC 5424 and Monolog ones + * + * @phpstan-var array<int, Level> $rfc_5424_levels + */ + private const RFC_5424_LEVELS = [ + 7 => self::DEBUG, + 6 => self::INFO, + 5 => self::NOTICE, + 4 => self::WARNING, + 3 => self::ERROR, + 2 => self::CRITICAL, + 1 => self::ALERT, + 0 => self::EMERGENCY, + ]; + + /** + * @var string + */ + protected $name; + + /** + * The handler stack + * + * @var HandlerInterface[] + */ + protected $handlers; + + /** + * Processors that will process all log records + * + * To process records of a single handler instead, add the processor on that specific handler + * + * @var callable[] + */ + protected $processors; + + /** + * @var bool + */ + protected $microsecondTimestamps = true; + + /** + * @var DateTimeZone + */ + protected $timezone; + + /** + * @var callable|null + */ + protected $exceptionHandler; + + /** + * @var int Keeps track of depth to prevent infinite logging loops + */ + private $logDepth = 0; + + /** + * @var bool Whether to detect infinite logging loops + * + * This can be disabled via {@see useLoggingLoopDetection} if you have async handlers that do not play well with this + */ + private $detectCycles = true; + + /** + * @psalm-param array<callable(array): array> $processors + * + * @param string $name The logging channel, a simple descriptive name that is attached to all log records + * @param HandlerInterface[] $handlers Optional stack of handlers, the first one in the array is called first, etc. + * @param callable[] $processors Optional array of processors + * @param DateTimeZone|null $timezone Optional timezone, if not provided date_default_timezone_get() will be used + */ + public function __construct(string $name, array $handlers = [], array $processors = [], ?DateTimeZone $timezone = null) + { + $this->name = $name; + $this->setHandlers($handlers); + $this->processors = $processors; + $this->timezone = $timezone ?: new DateTimeZone(date_default_timezone_get() ?: 'UTC'); + } + + public function getName(): string + { + return $this->name; + } + + /** + * Return a new cloned instance with the name changed + */ + public function withName(string $name): self + { + $new = clone $this; + $new->name = $name; + + return $new; + } + + /** + * Pushes a handler on to the stack. + */ + public function pushHandler(HandlerInterface $handler): self + { + array_unshift($this->handlers, $handler); + + return $this; + } + + /** + * Pops a handler from the stack + * + * @throws \LogicException If empty handler stack + */ + public function popHandler(): HandlerInterface + { + if (!$this->handlers) { + throw new \LogicException('You tried to pop from an empty handler stack.'); + } + + return array_shift($this->handlers); + } + + /** + * Set handlers, replacing all existing ones. + * + * If a map is passed, keys will be ignored. + * + * @param HandlerInterface[] $handlers + */ + public function setHandlers(array $handlers): self + { + $this->handlers = []; + foreach (array_reverse($handlers) as $handler) { + $this->pushHandler($handler); + } + + return $this; + } + + /** + * @return HandlerInterface[] + */ + public function getHandlers(): array + { + return $this->handlers; + } + + /** + * Adds a processor on to the stack. + */ + public function pushProcessor(callable $callback): self + { + array_unshift($this->processors, $callback); + + return $this; + } + + /** + * Removes the processor on top of the stack and returns it. + * + * @throws \LogicException If empty processor stack + * @return callable + */ + public function popProcessor(): callable + { + if (!$this->processors) { + throw new \LogicException('You tried to pop from an empty processor stack.'); + } + + return array_shift($this->processors); + } + + /** + * @return callable[] + */ + public function getProcessors(): array + { + return $this->processors; + } + + /** + * Control the use of microsecond resolution timestamps in the 'datetime' + * member of new records. + * + * As of PHP7.1 microseconds are always included by the engine, so + * there is no performance penalty and Monolog 2 enabled microseconds + * by default. This function lets you disable them though in case you want + * to suppress microseconds from the output. + * + * @param bool $micro True to use microtime() to create timestamps + */ + public function useMicrosecondTimestamps(bool $micro): self + { + $this->microsecondTimestamps = $micro; + + return $this; + } + + public function useLoggingLoopDetection(bool $detectCycles): self + { + $this->detectCycles = $detectCycles; + + return $this; + } + + /** + * Adds a log record. + * + * @param int $level The logging level (a Monolog or RFC 5424 level) + * @param string $message The log message + * @param mixed[] $context The log context + * @param DateTimeImmutable $datetime Optional log date to log into the past or future + * @return bool Whether the record has been processed + * + * @phpstan-param Level $level + */ + public function addRecord(int $level, string $message, array $context = [], DateTimeImmutable $datetime = null): bool + { + if (isset(self::RFC_5424_LEVELS[$level])) { + $level = self::RFC_5424_LEVELS[$level]; + } + + if ($this->detectCycles) { + $this->logDepth += 1; + } + if ($this->logDepth === 3) { + $this->warning('A possible infinite logging loop was detected and aborted. It appears some of your handler code is triggering logging, see the previous log record for a hint as to what may be the cause.'); + return false; + } elseif ($this->logDepth >= 5) { // log depth 4 is let through so we can log the warning above + return false; + } + + try { + $record = null; + + foreach ($this->handlers as $handler) { + if (null === $record) { + // skip creating the record as long as no handler is going to handle it + if (!$handler->isHandling(['level' => $level])) { + continue; + } + + $levelName = static::getLevelName($level); + + $record = [ + 'message' => $message, + 'context' => $context, + 'level' => $level, + 'level_name' => $levelName, + 'channel' => $this->name, + 'datetime' => $datetime ?? new DateTimeImmutable($this->microsecondTimestamps, $this->timezone), + 'extra' => [], + ]; + + try { + foreach ($this->processors as $processor) { + $record = $processor($record); + } + } catch (Throwable $e) { + $this->handleException($e, $record); + + return true; + } + } + + // once the record exists, send it to all handlers as long as the bubbling chain is not interrupted + try { + if (true === $handler->handle($record)) { + break; + } + } catch (Throwable $e) { + $this->handleException($e, $record); + + return true; + } + } + } finally { + if ($this->detectCycles) { + $this->logDepth--; + } + } + + return null !== $record; + } + + /** + * Ends a log cycle and frees all resources used by handlers. + * + * Closing a Handler means flushing all buffers and freeing any open resources/handles. + * Handlers that have been closed should be able to accept log records again and re-open + * themselves on demand, but this may not always be possible depending on implementation. + * + * This is useful at the end of a request and will be called automatically on every handler + * when they get destructed. + */ + public function close(): void + { + foreach ($this->handlers as $handler) { + $handler->close(); + } + } + + /** + * Ends a log cycle and resets all handlers and processors to their initial state. + * + * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal + * state, and getting it back to a state in which it can receive log records again. + * + * This is useful in case you want to avoid logs leaking between two requests or jobs when you + * have a long running process like a worker or an application server serving multiple requests + * in one process. + */ + public function reset(): void + { + foreach ($this->handlers as $handler) { + if ($handler instanceof ResettableInterface) { + $handler->reset(); + } + } + + foreach ($this->processors as $processor) { + if ($processor instanceof ResettableInterface) { + $processor->reset(); + } + } + } + + /** + * Gets all supported logging levels. + * + * @return array<string, int> Assoc array with human-readable level names => level codes. + * @phpstan-return array<LevelName, Level> + */ + public static function getLevels(): array + { + return array_flip(static::$levels); + } + + /** + * Gets the name of the logging level. + * + * @throws \Psr\Log\InvalidArgumentException If level is not defined + * + * @phpstan-param Level $level + * @phpstan-return LevelName + */ + public static function getLevelName(int $level): string + { + if (!isset(static::$levels[$level])) { + throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels))); + } + + return static::$levels[$level]; + } + + /** + * Converts PSR-3 levels to Monolog ones if necessary + * + * @param string|int $level Level number (monolog) or name (PSR-3) + * @throws \Psr\Log\InvalidArgumentException If level is not defined + * + * @phpstan-param Level|LevelName|LogLevel::* $level + * @phpstan-return Level + */ + public static function toMonologLevel($level): int + { + if (is_string($level)) { + if (is_numeric($level)) { + /** @phpstan-ignore-next-line */ + return intval($level); + } + + // Contains chars of all log levels and avoids using strtoupper() which may have + // strange results depending on locale (for example, "i" will become "İ" in Turkish locale) + $upper = strtr($level, 'abcdefgilmnortuwy', 'ABCDEFGILMNORTUWY'); + if (defined(__CLASS__.'::'.$upper)) { + return constant(__CLASS__ . '::' . $upper); + } + + throw new InvalidArgumentException('Level "'.$level.'" is not defined, use one of: '.implode(', ', array_keys(static::$levels) + static::$levels)); + } + + if (!is_int($level)) { + throw new InvalidArgumentException('Level "'.var_export($level, true).'" is not defined, use one of: '.implode(', ', array_keys(static::$levels) + static::$levels)); + } + + return $level; + } + + /** + * Checks whether the Logger has a handler that listens on the given level + * + * @phpstan-param Level $level + */ + public function isHandling(int $level): bool + { + $record = [ + 'level' => $level, + ]; + + foreach ($this->handlers as $handler) { + if ($handler->isHandling($record)) { + return true; + } + } + + return false; + } + + /** + * Set a custom exception handler that will be called if adding a new record fails + * + * The callable will receive an exception object and the record that failed to be logged + */ + public function setExceptionHandler(?callable $callback): self + { + $this->exceptionHandler = $callback; + + return $this; + } + + public function getExceptionHandler(): ?callable + { + return $this->exceptionHandler; + } + + /** + * Adds a log record at an arbitrary level. + * + * This method allows for compatibility with common interfaces. + * + * @param mixed $level The log level (a Monolog, PSR-3 or RFC 5424 level) + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function log($level, $message, array $context = []): void + { + if (!is_int($level) && !is_string($level)) { + throw new \InvalidArgumentException('$level is expected to be a string or int'); + } + + if (isset(self::RFC_5424_LEVELS[$level])) { + $level = self::RFC_5424_LEVELS[$level]; + } + + $level = static::toMonologLevel($level); + + $this->addRecord($level, (string) $message, $context); + } + + /** + * Adds a log record at the DEBUG level. + * + * This method allows for compatibility with common interfaces. + * + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + */ + public function debug($message, array $context = []): void + { + $this->addRecord(static::DEBUG, (string) $message, $context); + } + + /** + * Adds a log record at the INFO level. + * + * This method allows for compatibility with common interfaces. + * + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + */ + public function info($message, array $context = []): void + { + $this->addRecord(static::INFO, (string) $message, $context); + } + + /** + * Adds a log record at the NOTICE level. + * + * This method allows for compatibility with common interfaces. + * + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + */ + public function notice($message, array $context = []): void + { + $this->addRecord(static::NOTICE, (string) $message, $context); + } + + /** + * Adds a log record at the WARNING level. + * + * This method allows for compatibility with common interfaces. + * + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + */ + public function warning($message, array $context = []): void + { + $this->addRecord(static::WARNING, (string) $message, $context); + } + + /** + * Adds a log record at the ERROR level. + * + * This method allows for compatibility with common interfaces. + * + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + */ + public function error($message, array $context = []): void + { + $this->addRecord(static::ERROR, (string) $message, $context); + } + + /** + * Adds a log record at the CRITICAL level. + * + * This method allows for compatibility with common interfaces. + * + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + */ + public function critical($message, array $context = []): void + { + $this->addRecord(static::CRITICAL, (string) $message, $context); + } + + /** + * Adds a log record at the ALERT level. + * + * This method allows for compatibility with common interfaces. + * + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + */ + public function alert($message, array $context = []): void + { + $this->addRecord(static::ALERT, (string) $message, $context); + } + + /** + * Adds a log record at the EMERGENCY level. + * + * This method allows for compatibility with common interfaces. + * + * @param string|Stringable $message The log message + * @param mixed[] $context The log context + */ + public function emergency($message, array $context = []): void + { + $this->addRecord(static::EMERGENCY, (string) $message, $context); + } + + /** + * Sets the timezone to be used for the timestamp of log records. + */ + public function setTimezone(DateTimeZone $tz): self + { + $this->timezone = $tz; + + return $this; + } + + /** + * Returns the timezone to be used for the timestamp of log records. + */ + public function getTimezone(): DateTimeZone + { + return $this->timezone; + } + + /** + * Delegates exception management to the custom exception handler, + * or throws the exception if no custom handler is set. + * + * @param array $record + * @phpstan-param Record $record + */ + protected function handleException(Throwable $e, array $record): void + { + if (!$this->exceptionHandler) { + throw $e; + } + + ($this->exceptionHandler)($e, $record); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php new file mode 100644 index 0000000..8166bdc --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php @@ -0,0 +1,77 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\Logger; +use Psr\Log\LogLevel; + +/** + * Injects Git branch and Git commit SHA in all records + * + * @author Nick Otter + * @author Jordi Boggiano <j.boggiano@seld.be> + * + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class GitProcessor implements ProcessorInterface +{ + /** @var int */ + private $level; + /** @var array{branch: string, commit: string}|array<never>|null */ + private static $cache = null; + + /** + * @param string|int $level The minimum logging level at which this Processor will be triggered + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function __construct($level = Logger::DEBUG) + { + $this->level = Logger::toMonologLevel($level); + } + + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + // return if the level is not high enough + if ($record['level'] < $this->level) { + return $record; + } + + $record['extra']['git'] = self::getGitInfo(); + + return $record; + } + + /** + * @return array{branch: string, commit: string}|array<never> + */ + private static function getGitInfo(): array + { + if (self::$cache) { + return self::$cache; + } + + $branches = `git branch -v --no-abbrev`; + if ($branches && preg_match('{^\* (.+?)\s+([a-f0-9]{40})(?:\s|$)}m', $branches, $matches)) { + return self::$cache = [ + 'branch' => $matches[1], + 'commit' => $matches[2], + ]; + } + + return self::$cache = []; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php new file mode 100644 index 0000000..91fda7d --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php @@ -0,0 +1,36 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Injects value of gethostname in all records + */ +class HostnameProcessor implements ProcessorInterface +{ + /** @var string */ + private static $host; + + public function __construct() + { + self::$host = (string) gethostname(); + } + + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + $record['extra']['hostname'] = self::$host; + + return $record; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php new file mode 100644 index 0000000..a32e76b --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php @@ -0,0 +1,123 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\Logger; +use Psr\Log\LogLevel; + +/** + * Injects line/file:class/function where the log message came from + * + * Warning: This only works if the handler processes the logs directly. + * If you put the processor on a handler that is behind a FingersCrossedHandler + * for example, the processor will only be called once the trigger level is reached, + * and all the log records will have the same file/line/.. data from the call that + * triggered the FingersCrossedHandler. + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class IntrospectionProcessor implements ProcessorInterface +{ + /** @var int */ + private $level; + /** @var string[] */ + private $skipClassesPartials; + /** @var int */ + private $skipStackFramesCount; + /** @var string[] */ + private $skipFunctions = [ + 'call_user_func', + 'call_user_func_array', + ]; + + /** + * @param string|int $level The minimum logging level at which this Processor will be triggered + * @param string[] $skipClassesPartials + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function __construct($level = Logger::DEBUG, array $skipClassesPartials = [], int $skipStackFramesCount = 0) + { + $this->level = Logger::toMonologLevel($level); + $this->skipClassesPartials = array_merge(['Monolog\\'], $skipClassesPartials); + $this->skipStackFramesCount = $skipStackFramesCount; + } + + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + // return if the level is not high enough + if ($record['level'] < $this->level) { + return $record; + } + + $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + + // skip first since it's always the current method + array_shift($trace); + // the call_user_func call is also skipped + array_shift($trace); + + $i = 0; + + while ($this->isTraceClassOrSkippedFunction($trace, $i)) { + if (isset($trace[$i]['class'])) { + foreach ($this->skipClassesPartials as $part) { + if (strpos($trace[$i]['class'], $part) !== false) { + $i++; + + continue 2; + } + } + } elseif (in_array($trace[$i]['function'], $this->skipFunctions)) { + $i++; + + continue; + } + + break; + } + + $i += $this->skipStackFramesCount; + + // we should have the call source now + $record['extra'] = array_merge( + $record['extra'], + [ + 'file' => isset($trace[$i - 1]['file']) ? $trace[$i - 1]['file'] : null, + 'line' => isset($trace[$i - 1]['line']) ? $trace[$i - 1]['line'] : null, + 'class' => isset($trace[$i]['class']) ? $trace[$i]['class'] : null, + 'callType' => isset($trace[$i]['type']) ? $trace[$i]['type'] : null, + 'function' => isset($trace[$i]['function']) ? $trace[$i]['function'] : null, + ] + ); + + return $record; + } + + /** + * @param array[] $trace + */ + private function isTraceClassOrSkippedFunction(array $trace, int $index): bool + { + if (!isset($trace[$index])) { + return false; + } + + return isset($trace[$index]['class']) || in_array($trace[$index]['function'], $this->skipFunctions); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php new file mode 100644 index 0000000..37c756f --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php @@ -0,0 +1,37 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Injects memory_get_peak_usage in all records + * + * @see Monolog\Processor\MemoryProcessor::__construct() for options + * @author Rob Jensen + */ +class MemoryPeakUsageProcessor extends MemoryProcessor +{ + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + $usage = memory_get_peak_usage($this->realUsage); + + if ($this->useFormatting) { + $usage = $this->formatBytes($usage); + } + + $record['extra']['memory_peak_usage'] = $usage; + + return $record; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php new file mode 100644 index 0000000..227deb7 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php @@ -0,0 +1,61 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Some methods that are common for all memory processors + * + * @author Rob Jensen + */ +abstract class MemoryProcessor implements ProcessorInterface +{ + /** + * @var bool If true, get the real size of memory allocated from system. Else, only the memory used by emalloc() is reported. + */ + protected $realUsage; + + /** + * @var bool If true, then format memory size to human readable string (MB, KB, B depending on size) + */ + protected $useFormatting; + + /** + * @param bool $realUsage Set this to true to get the real size of memory allocated from system. + * @param bool $useFormatting If true, then format memory size to human readable string (MB, KB, B depending on size) + */ + public function __construct(bool $realUsage = true, bool $useFormatting = true) + { + $this->realUsage = $realUsage; + $this->useFormatting = $useFormatting; + } + + /** + * Formats bytes into a human readable string if $this->useFormatting is true, otherwise return $bytes as is + * + * @param int $bytes + * @return string|int Formatted string if $this->useFormatting is true, otherwise return $bytes as int + */ + protected function formatBytes(int $bytes) + { + if (!$this->useFormatting) { + return $bytes; + } + + if ($bytes > 1024 * 1024) { + return round($bytes / 1024 / 1024, 2).' MB'; + } elseif ($bytes > 1024) { + return round($bytes / 1024, 2).' KB'; + } + + return $bytes . ' B'; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php new file mode 100644 index 0000000..e141921 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php @@ -0,0 +1,37 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Injects memory_get_usage in all records + * + * @see Monolog\Processor\MemoryProcessor::__construct() for options + * @author Rob Jensen + */ +class MemoryUsageProcessor extends MemoryProcessor +{ + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + $usage = memory_get_usage($this->realUsage); + + if ($this->useFormatting) { + $usage = $this->formatBytes($usage); + } + + $record['extra']['memory_usage'] = $usage; + + return $record; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php new file mode 100644 index 0000000..d4a628f --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php @@ -0,0 +1,77 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\Logger; +use Psr\Log\LogLevel; + +/** + * Injects Hg branch and Hg revision number in all records + * + * @author Jonathan A. Schweder <jonathanschweder@gmail.com> + * + * @phpstan-import-type LevelName from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + */ +class MercurialProcessor implements ProcessorInterface +{ + /** @var Level */ + private $level; + /** @var array{branch: string, revision: string}|array<never>|null */ + private static $cache = null; + + /** + * @param int|string $level The minimum logging level at which this Processor will be triggered + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function __construct($level = Logger::DEBUG) + { + $this->level = Logger::toMonologLevel($level); + } + + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + // return if the level is not high enough + if ($record['level'] < $this->level) { + return $record; + } + + $record['extra']['hg'] = self::getMercurialInfo(); + + return $record; + } + + /** + * @return array{branch: string, revision: string}|array<never> + */ + private static function getMercurialInfo(): array + { + if (self::$cache) { + return self::$cache; + } + + $result = explode(' ', trim(`hg id -nb`)); + + if (count($result) >= 3) { + return self::$cache = [ + 'branch' => $result[1], + 'revision' => $result[2], + ]; + } + + return self::$cache = []; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php new file mode 100644 index 0000000..3b939a9 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php @@ -0,0 +1,30 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Adds value of getmypid into records + * + * @author Andreas Hörnicke + */ +class ProcessIdProcessor implements ProcessorInterface +{ + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + $record['extra']['process_id'] = getmypid(); + + return $record; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php b/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php new file mode 100644 index 0000000..5defb7e --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php @@ -0,0 +1,30 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * An optional interface to allow labelling Monolog processors. + * + * @author Nicolas Grekas <p@tchwork.com> + * + * @phpstan-import-type Record from \Monolog\Logger + */ +interface ProcessorInterface +{ + /** + * @return array The processed record + * + * @phpstan-param Record $record + * @phpstan-return Record + */ + public function __invoke(array $record); +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php new file mode 100644 index 0000000..2c2a00e --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php @@ -0,0 +1,86 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\Utils; + +/** + * Processes a record's message according to PSR-3 rules + * + * It replaces {foo} with the value from $context['foo'] + * + * @author Jordi Boggiano <j.boggiano@seld.be> + */ +class PsrLogMessageProcessor implements ProcessorInterface +{ + public const SIMPLE_DATE = "Y-m-d\TH:i:s.uP"; + + /** @var string|null */ + private $dateFormat; + + /** @var bool */ + private $removeUsedContextFields; + + /** + * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format + * @param bool $removeUsedContextFields If set to true the fields interpolated into message gets unset + */ + public function __construct(?string $dateFormat = null, bool $removeUsedContextFields = false) + { + $this->dateFormat = $dateFormat; + $this->removeUsedContextFields = $removeUsedContextFields; + } + + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + if (false === strpos($record['message'], '{')) { + return $record; + } + + $replacements = []; + foreach ($record['context'] as $key => $val) { + $placeholder = '{' . $key . '}'; + if (strpos($record['message'], $placeholder) === false) { + continue; + } + + if (is_null($val) || is_scalar($val) || (is_object($val) && method_exists($val, "__toString"))) { + $replacements[$placeholder] = $val; + } elseif ($val instanceof \DateTimeInterface) { + if (!$this->dateFormat && $val instanceof \Monolog\DateTimeImmutable) { + // handle monolog dates using __toString if no specific dateFormat was asked for + // so that it follows the useMicroseconds flag + $replacements[$placeholder] = (string) $val; + } else { + $replacements[$placeholder] = $val->format($this->dateFormat ?: static::SIMPLE_DATE); + } + } elseif (is_object($val)) { + $replacements[$placeholder] = '[object '.Utils::getClass($val).']'; + } elseif (is_array($val)) { + $replacements[$placeholder] = 'array'.Utils::jsonEncode($val, null, true); + } else { + $replacements[$placeholder] = '['.gettype($val).']'; + } + + if ($this->removeUsedContextFields) { + unset($record['context'][$key]); + } + } + + $record['message'] = strtr($record['message'], $replacements); + + return $record; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php new file mode 100644 index 0000000..80f1874 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php @@ -0,0 +1,61 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Adds a tags array into record + * + * @author Martijn Riemers + */ +class TagProcessor implements ProcessorInterface +{ + /** @var string[] */ + private $tags; + + /** + * @param string[] $tags + */ + public function __construct(array $tags = []) + { + $this->setTags($tags); + } + + /** + * @param string[] $tags + */ + public function addTags(array $tags = []): self + { + $this->tags = array_merge($this->tags, $tags); + + return $this; + } + + /** + * @param string[] $tags + */ + public function setTags(array $tags = []): self + { + $this->tags = $tags; + + return $this; + } + + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + $record['extra']['tags'] = $this->tags; + + return $record; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php new file mode 100644 index 0000000..a27b74d --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php @@ -0,0 +1,59 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +use Monolog\ResettableInterface; + +/** + * Adds a unique identifier into records + * + * @author Simon Mönch <sm@webfactory.de> + */ +class UidProcessor implements ProcessorInterface, ResettableInterface +{ + /** @var string */ + private $uid; + + public function __construct(int $length = 7) + { + if ($length > 32 || $length < 1) { + throw new \InvalidArgumentException('The uid length must be an integer between 1 and 32'); + } + + $this->uid = $this->generateUid($length); + } + + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + $record['extra']['uid'] = $this->uid; + + return $record; + } + + public function getUid(): string + { + return $this->uid; + } + + public function reset() + { + $this->uid = $this->generateUid(strlen($this->uid)); + } + + private function generateUid(int $length): string + { + return substr(bin2hex(random_bytes((int) ceil($length / 2))), 0, $length); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php new file mode 100644 index 0000000..51850e1 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php @@ -0,0 +1,111 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Processor; + +/** + * Injects url/method and remote IP of the current web request in all records + * + * @author Jordi Boggiano <j.boggiano@seld.be> + */ +class WebProcessor implements ProcessorInterface +{ + /** + * @var array<string, mixed>|\ArrayAccess<string, mixed> + */ + protected $serverData; + + /** + * Default fields + * + * Array is structured as [key in record.extra => key in $serverData] + * + * @var array<string, string> + */ + protected $extraFields = [ + 'url' => 'REQUEST_URI', + 'ip' => 'REMOTE_ADDR', + 'http_method' => 'REQUEST_METHOD', + 'server' => 'SERVER_NAME', + 'referrer' => 'HTTP_REFERER', + 'user_agent' => 'HTTP_USER_AGENT', + ]; + + /** + * @param array<string, mixed>|\ArrayAccess<string, mixed>|null $serverData Array or object w/ ArrayAccess that provides access to the $_SERVER data + * @param array<string, string>|array<string>|null $extraFields Field names and the related key inside $serverData to be added (or just a list of field names to use the default configured $serverData mapping). If not provided it defaults to: [url, ip, http_method, server, referrer] + unique_id if present in server data + */ + public function __construct($serverData = null, array $extraFields = null) + { + if (null === $serverData) { + $this->serverData = &$_SERVER; + } elseif (is_array($serverData) || $serverData instanceof \ArrayAccess) { + $this->serverData = $serverData; + } else { + throw new \UnexpectedValueException('$serverData must be an array or object implementing ArrayAccess.'); + } + + $defaultEnabled = ['url', 'ip', 'http_method', 'server', 'referrer']; + if (isset($this->serverData['UNIQUE_ID'])) { + $this->extraFields['unique_id'] = 'UNIQUE_ID'; + $defaultEnabled[] = 'unique_id'; + } + + if (null === $extraFields) { + $extraFields = $defaultEnabled; + } + if (isset($extraFields[0])) { + foreach (array_keys($this->extraFields) as $fieldName) { + if (!in_array($fieldName, $extraFields)) { + unset($this->extraFields[$fieldName]); + } + } + } else { + $this->extraFields = $extraFields; + } + } + + /** + * {@inheritDoc} + */ + public function __invoke(array $record): array + { + // skip processing if for some reason request data + // is not present (CLI or wonky SAPIs) + if (!isset($this->serverData['REQUEST_URI'])) { + return $record; + } + + $record['extra'] = $this->appendExtraFields($record['extra']); + + return $record; + } + + public function addExtraField(string $extraName, string $serverName): self + { + $this->extraFields[$extraName] = $serverName; + + return $this; + } + + /** + * @param mixed[] $extra + * @return mixed[] + */ + private function appendExtraFields(array $extra): array + { + foreach ($this->extraFields as $extraName => $serverName) { + $extra[$extraName] = $this->serverData[$serverName] ?? null; + } + + return $extra; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Registry.php b/vendor/monolog/monolog/src/Monolog/Registry.php new file mode 100644 index 0000000..ae94ae6 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Registry.php @@ -0,0 +1,134 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use InvalidArgumentException; + +/** + * Monolog log registry + * + * Allows to get `Logger` instances in the global scope + * via static method calls on this class. + * + * <code> + * $application = new Monolog\Logger('application'); + * $api = new Monolog\Logger('api'); + * + * Monolog\Registry::addLogger($application); + * Monolog\Registry::addLogger($api); + * + * function testLogger() + * { + * Monolog\Registry::api()->error('Sent to $api Logger instance'); + * Monolog\Registry::application()->error('Sent to $application Logger instance'); + * } + * </code> + * + * @author Tomas Tatarko <tomas@tatarko.sk> + */ +class Registry +{ + /** + * List of all loggers in the registry (by named indexes) + * + * @var Logger[] + */ + private static $loggers = []; + + /** + * Adds new logging channel to the registry + * + * @param Logger $logger Instance of the logging channel + * @param string|null $name Name of the logging channel ($logger->getName() by default) + * @param bool $overwrite Overwrite instance in the registry if the given name already exists? + * @throws \InvalidArgumentException If $overwrite set to false and named Logger instance already exists + * @return void + */ + public static function addLogger(Logger $logger, ?string $name = null, bool $overwrite = false) + { + $name = $name ?: $logger->getName(); + + if (isset(self::$loggers[$name]) && !$overwrite) { + throw new InvalidArgumentException('Logger with the given name already exists'); + } + + self::$loggers[$name] = $logger; + } + + /** + * Checks if such logging channel exists by name or instance + * + * @param string|Logger $logger Name or logger instance + */ + public static function hasLogger($logger): bool + { + if ($logger instanceof Logger) { + $index = array_search($logger, self::$loggers, true); + + return false !== $index; + } + + return isset(self::$loggers[$logger]); + } + + /** + * Removes instance from registry by name or instance + * + * @param string|Logger $logger Name or logger instance + */ + public static function removeLogger($logger): void + { + if ($logger instanceof Logger) { + if (false !== ($idx = array_search($logger, self::$loggers, true))) { + unset(self::$loggers[$idx]); + } + } else { + unset(self::$loggers[$logger]); + } + } + + /** + * Clears the registry + */ + public static function clear(): void + { + self::$loggers = []; + } + + /** + * Gets Logger instance from the registry + * + * @param string $name Name of the requested Logger instance + * @throws \InvalidArgumentException If named Logger instance is not in the registry + */ + public static function getInstance($name): Logger + { + if (!isset(self::$loggers[$name])) { + throw new InvalidArgumentException(sprintf('Requested "%s" logger instance is not in the registry', $name)); + } + + return self::$loggers[$name]; + } + + /** + * Gets Logger instance from the registry via static method call + * + * @param string $name Name of the requested Logger instance + * @param mixed[] $arguments Arguments passed to static method call + * @throws \InvalidArgumentException If named Logger instance is not in the registry + * @return Logger Requested instance of Logger + */ + public static function __callStatic($name, $arguments) + { + return self::getInstance($name); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/ResettableInterface.php b/vendor/monolog/monolog/src/Monolog/ResettableInterface.php new file mode 100644 index 0000000..2c5fd78 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/ResettableInterface.php @@ -0,0 +1,34 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +/** + * Handler or Processor implementing this interface will be reset when Logger::reset() is called. + * + * Resetting ends a log cycle gets them back to their initial state. + * + * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal + * state, and getting it back to a state in which it can receive log records again. + * + * This is useful in case you want to avoid logs leaking between two requests or jobs when you + * have a long running process like a worker or an application server serving multiple requests + * in one process. + * + * @author Grégoire Pineau <lyrixx@lyrixx.info> + */ +interface ResettableInterface +{ + /** + * @return void + */ + public function reset(); +} diff --git a/vendor/monolog/monolog/src/Monolog/SignalHandler.php b/vendor/monolog/monolog/src/Monolog/SignalHandler.php new file mode 100644 index 0000000..d730eea --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/SignalHandler.php @@ -0,0 +1,120 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use Psr\Log\LoggerInterface; +use Psr\Log\LogLevel; +use ReflectionExtension; + +/** + * Monolog POSIX signal handler + * + * @author Robert Gust-Bardon <robert@gust-bardon.org> + * + * @phpstan-import-type Level from \Monolog\Logger + * @phpstan-import-type LevelName from \Monolog\Logger + */ +class SignalHandler +{ + /** @var LoggerInterface */ + private $logger; + + /** @var array<int, callable|string|int> SIG_DFL, SIG_IGN or previous callable */ + private $previousSignalHandler = []; + /** @var array<int, int> */ + private $signalLevelMap = []; + /** @var array<int, bool> */ + private $signalRestartSyscalls = []; + + public function __construct(LoggerInterface $logger) + { + $this->logger = $logger; + } + + /** + * @param int|string $level Level or level name + * @param bool $callPrevious + * @param bool $restartSyscalls + * @param bool|null $async + * @return $this + * + * @phpstan-param Level|LevelName|LogLevel::* $level + */ + public function registerSignalHandler(int $signo, $level = LogLevel::CRITICAL, bool $callPrevious = true, bool $restartSyscalls = true, ?bool $async = true): self + { + if (!extension_loaded('pcntl') || !function_exists('pcntl_signal')) { + return $this; + } + + $level = Logger::toMonologLevel($level); + + if ($callPrevious) { + $handler = pcntl_signal_get_handler($signo); + $this->previousSignalHandler[$signo] = $handler; + } else { + unset($this->previousSignalHandler[$signo]); + } + $this->signalLevelMap[$signo] = $level; + $this->signalRestartSyscalls[$signo] = $restartSyscalls; + + if ($async !== null) { + pcntl_async_signals($async); + } + + pcntl_signal($signo, [$this, 'handleSignal'], $restartSyscalls); + + return $this; + } + + /** + * @param mixed $siginfo + */ + public function handleSignal(int $signo, $siginfo = null): void + { + static $signals = []; + + if (!$signals && extension_loaded('pcntl')) { + $pcntl = new ReflectionExtension('pcntl'); + // HHVM 3.24.2 returns an empty array. + foreach ($pcntl->getConstants() ?: get_defined_constants(true)['Core'] as $name => $value) { + if (substr($name, 0, 3) === 'SIG' && $name[3] !== '_' && is_int($value)) { + $signals[$value] = $name; + } + } + } + + $level = $this->signalLevelMap[$signo] ?? LogLevel::CRITICAL; + $signal = $signals[$signo] ?? $signo; + $context = $siginfo ?? []; + $this->logger->log($level, sprintf('Program received signal %s', $signal), $context); + + if (!isset($this->previousSignalHandler[$signo])) { + return; + } + + if ($this->previousSignalHandler[$signo] === SIG_DFL) { + if (extension_loaded('pcntl') && function_exists('pcntl_signal') && function_exists('pcntl_sigprocmask') && function_exists('pcntl_signal_dispatch') + && extension_loaded('posix') && function_exists('posix_getpid') && function_exists('posix_kill') + ) { + $restartSyscalls = $this->signalRestartSyscalls[$signo] ?? true; + pcntl_signal($signo, SIG_DFL, $restartSyscalls); + pcntl_sigprocmask(SIG_UNBLOCK, [$signo], $oldset); + posix_kill(posix_getpid(), $signo); + pcntl_signal_dispatch(); + pcntl_sigprocmask(SIG_SETMASK, $oldset); + pcntl_signal($signo, [$this, 'handleSignal'], $restartSyscalls); + } + } elseif (is_callable($this->previousSignalHandler[$signo])) { + $this->previousSignalHandler[$signo]($signo, $siginfo); + } + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Test/TestCase.php b/vendor/monolog/monolog/src/Monolog/Test/TestCase.php new file mode 100644 index 0000000..bc0b425 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Test/TestCase.php @@ -0,0 +1,85 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Test; + +use Monolog\Logger; +use Monolog\DateTimeImmutable; +use Monolog\Formatter\FormatterInterface; + +/** + * Lets you easily generate log records and a dummy formatter for testing purposes + * + * @author Jordi Boggiano <j.boggiano@seld.be> + * + * @phpstan-import-type Record from \Monolog\Logger + * @phpstan-import-type Level from \Monolog\Logger + * + * @internal feel free to reuse this to test your own handlers, this is marked internal to avoid issues with PHPStorm https://github.com/Seldaek/monolog/issues/1677 + */ +class TestCase extends \PHPUnit\Framework\TestCase +{ + public function tearDown(): void + { + parent::tearDown(); + + if (isset($this->handler)) { + unset($this->handler); + } + } + + /** + * @param mixed[] $context + * + * @return array Record + * + * @phpstan-param Level $level + * @phpstan-return Record + */ + protected function getRecord(int $level = Logger::WARNING, string $message = 'test', array $context = []): array + { + return [ + 'message' => (string) $message, + 'context' => $context, + 'level' => $level, + 'level_name' => Logger::getLevelName($level), + 'channel' => 'test', + 'datetime' => new DateTimeImmutable(true), + 'extra' => [], + ]; + } + + /** + * @phpstan-return Record[] + */ + protected function getMultipleRecords(): array + { + return [ + $this->getRecord(Logger::DEBUG, 'debug message 1'), + $this->getRecord(Logger::DEBUG, 'debug message 2'), + $this->getRecord(Logger::INFO, 'information'), + $this->getRecord(Logger::WARNING, 'warning'), + $this->getRecord(Logger::ERROR, 'error'), + ]; + } + + protected function getIdentityFormatter(): FormatterInterface + { + $formatter = $this->createMock(FormatterInterface::class); + $formatter->expects($this->any()) + ->method('format') + ->will($this->returnCallback(function ($record) { + return $record['message']; + })); + + return $formatter; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Utils.php b/vendor/monolog/monolog/src/Monolog/Utils.php new file mode 100644 index 0000000..360c421 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Utils.php @@ -0,0 +1,284 @@ +<?php declare(strict_types=1); + +/* + * This file is part of the Monolog package. + * + * (c) Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +final class Utils +{ + const DEFAULT_JSON_FLAGS = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRESERVE_ZERO_FRACTION | JSON_INVALID_UTF8_SUBSTITUTE | JSON_PARTIAL_OUTPUT_ON_ERROR; + + public static function getClass(object $object): string + { + $class = \get_class($object); + + if (false === ($pos = \strpos($class, "@anonymous\0"))) { + return $class; + } + + if (false === ($parent = \get_parent_class($class))) { + return \substr($class, 0, $pos + 10); + } + + return $parent . '@anonymous'; + } + + public static function substr(string $string, int $start, ?int $length = null): string + { + if (extension_loaded('mbstring')) { + return mb_strcut($string, $start, $length); + } + + return substr($string, $start, (null === $length) ? strlen($string) : $length); + } + + /** + * Makes sure if a relative path is passed in it is turned into an absolute path + * + * @param string $streamUrl stream URL or path without protocol + */ + public static function canonicalizePath(string $streamUrl): string + { + $prefix = ''; + if ('file://' === substr($streamUrl, 0, 7)) { + $streamUrl = substr($streamUrl, 7); + $prefix = 'file://'; + } + + // other type of stream, not supported + if (false !== strpos($streamUrl, '://')) { + return $streamUrl; + } + + // already absolute + if (substr($streamUrl, 0, 1) === '/' || substr($streamUrl, 1, 1) === ':' || substr($streamUrl, 0, 2) === '\\\\') { + return $prefix.$streamUrl; + } + + $streamUrl = getcwd() . '/' . $streamUrl; + + return $prefix.$streamUrl; + } + + /** + * Return the JSON representation of a value + * + * @param mixed $data + * @param int $encodeFlags flags to pass to json encode, defaults to DEFAULT_JSON_FLAGS + * @param bool $ignoreErrors whether to ignore encoding errors or to throw on error, when ignored and the encoding fails, "null" is returned which is valid json for null + * @throws \RuntimeException if encoding fails and errors are not ignored + * @return string when errors are ignored and the encoding fails, "null" is returned which is valid json for null + */ + public static function jsonEncode($data, ?int $encodeFlags = null, bool $ignoreErrors = false): string + { + if (null === $encodeFlags) { + $encodeFlags = self::DEFAULT_JSON_FLAGS; + } + + if ($ignoreErrors) { + $json = @json_encode($data, $encodeFlags); + if (false === $json) { + return 'null'; + } + + return $json; + } + + $json = json_encode($data, $encodeFlags); + if (false === $json) { + $json = self::handleJsonError(json_last_error(), $data); + } + + return $json; + } + + /** + * Handle a json_encode failure. + * + * If the failure is due to invalid string encoding, try to clean the + * input and encode again. If the second encoding attempt fails, the + * initial error is not encoding related or the input can't be cleaned then + * raise a descriptive exception. + * + * @param int $code return code of json_last_error function + * @param mixed $data data that was meant to be encoded + * @param int $encodeFlags flags to pass to json encode, defaults to JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRESERVE_ZERO_FRACTION + * @throws \RuntimeException if failure can't be corrected + * @return string JSON encoded data after error correction + */ + public static function handleJsonError(int $code, $data, ?int $encodeFlags = null): string + { + if ($code !== JSON_ERROR_UTF8) { + self::throwEncodeError($code, $data); + } + + if (is_string($data)) { + self::detectAndCleanUtf8($data); + } elseif (is_array($data)) { + array_walk_recursive($data, array('Monolog\Utils', 'detectAndCleanUtf8')); + } else { + self::throwEncodeError($code, $data); + } + + if (null === $encodeFlags) { + $encodeFlags = self::DEFAULT_JSON_FLAGS; + } + + $json = json_encode($data, $encodeFlags); + + if ($json === false) { + self::throwEncodeError(json_last_error(), $data); + } + + return $json; + } + + /** + * @internal + */ + public static function pcreLastErrorMessage(int $code): string + { + if (PHP_VERSION_ID >= 80000) { + return preg_last_error_msg(); + } + + $constants = (get_defined_constants(true))['pcre']; + $constants = array_filter($constants, function ($key) { + return substr($key, -6) == '_ERROR'; + }, ARRAY_FILTER_USE_KEY); + + $constants = array_flip($constants); + + return $constants[$code] ?? 'UNDEFINED_ERROR'; + } + + /** + * Throws an exception according to a given code with a customized message + * + * @param int $code return code of json_last_error function + * @param mixed $data data that was meant to be encoded + * @throws \RuntimeException + * + * @return never + */ + private static function throwEncodeError(int $code, $data): void + { + switch ($code) { + case JSON_ERROR_DEPTH: + $msg = 'Maximum stack depth exceeded'; + break; + case JSON_ERROR_STATE_MISMATCH: + $msg = 'Underflow or the modes mismatch'; + break; + case JSON_ERROR_CTRL_CHAR: + $msg = 'Unexpected control character found'; + break; + case JSON_ERROR_UTF8: + $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded'; + break; + default: + $msg = 'Unknown error'; + } + + throw new \RuntimeException('JSON encoding failed: '.$msg.'. Encoding: '.var_export($data, true)); + } + + /** + * Detect invalid UTF-8 string characters and convert to valid UTF-8. + * + * Valid UTF-8 input will be left unmodified, but strings containing + * invalid UTF-8 codepoints will be reencoded as UTF-8 with an assumed + * original encoding of ISO-8859-15. This conversion may result in + * incorrect output if the actual encoding was not ISO-8859-15, but it + * will be clean UTF-8 output and will not rely on expensive and fragile + * detection algorithms. + * + * Function converts the input in place in the passed variable so that it + * can be used as a callback for array_walk_recursive. + * + * @param mixed $data Input to check and convert if needed, passed by ref + */ + private static function detectAndCleanUtf8(&$data): void + { + if (is_string($data) && !preg_match('//u', $data)) { + $data = preg_replace_callback( + '/[\x80-\xFF]+/', + function ($m) { + return function_exists('mb_convert_encoding') ? mb_convert_encoding($m[0], 'UTF-8', 'ISO-8859-1') : utf8_encode($m[0]); + }, + $data + ); + if (!is_string($data)) { + $pcreErrorCode = preg_last_error(); + throw new \RuntimeException('Failed to preg_replace_callback: ' . $pcreErrorCode . ' / ' . self::pcreLastErrorMessage($pcreErrorCode)); + } + $data = str_replace( + ['¤', '¦', '¨', '´', '¸', '¼', '½', '¾'], + ['€', 'Š', 'š', 'Ž', 'ž', 'Œ', 'œ', 'Ÿ'], + $data + ); + } + } + + /** + * Converts a string with a valid 'memory_limit' format, to bytes. + * + * @param string|false $val + * @return int|false Returns an integer representing bytes. Returns FALSE in case of error. + */ + public static function expandIniShorthandBytes($val) + { + if (!is_string($val)) { + return false; + } + + // support -1 + if ((int) $val < 0) { + return (int) $val; + } + + if (!preg_match('/^\s*(?<val>\d+)(?:\.\d+)?\s*(?<unit>[gmk]?)\s*$/i', $val, $match)) { + return false; + } + + $val = (int) $match['val']; + switch (strtolower($match['unit'] ?? '')) { + case 'g': + $val *= 1024; + case 'm': + $val *= 1024; + case 'k': + $val *= 1024; + } + + return $val; + } + + /** + * @param array<mixed> $record + */ + public static function getRecordMessageForException(array $record): string + { + $context = ''; + $extra = ''; + try { + if ($record['context']) { + $context = "\nContext: " . json_encode($record['context']); + } + if ($record['extra']) { + $extra = "\nExtra: " . json_encode($record['extra']); + } + } catch (\Throwable $e) { + // noop + } + + return "\nThe exception occurred while attempting to log: " . $record['message'] . $context . $extra; + } +} diff --git a/vendor/nesbot/carbon/LICENSE b/vendor/nesbot/carbon/LICENSE new file mode 100644 index 0000000..6de45eb --- /dev/null +++ b/vendor/nesbot/carbon/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) Brian Nesbitt + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/nesbot/carbon/bin/carbon b/vendor/nesbot/carbon/bin/carbon new file mode 100755 index 0000000..b53ab73 --- /dev/null +++ b/vendor/nesbot/carbon/bin/carbon @@ -0,0 +1,23 @@ +#!/usr/bin/env php +<?php + +use Carbon\Cli\Invoker; + +$dir = __DIR__.'/..'; + +if (!file_exists($dir.'/autoload.php')) { + $dir = __DIR__.'/../vendor'; +} + +if (!file_exists($dir.'/autoload.php')) { + $dir = __DIR__.'/../../..'; +} + +if (!file_exists($dir.'/autoload.php')) { + echo 'Autoload not found.'; + exit(1); +} + +require $dir.'/autoload.php'; + +exit((new Invoker())(...$argv) ? 0 : 1); diff --git a/vendor/nesbot/carbon/bin/carbon.bat b/vendor/nesbot/carbon/bin/carbon.bat new file mode 100644 index 0000000..84599d3 --- /dev/null +++ b/vendor/nesbot/carbon/bin/carbon.bat @@ -0,0 +1,4 @@ +@ECHO OFF +setlocal DISABLEDELAYEDEXPANSION +SET BIN_TARGET=%~dp0/carbon +php "%BIN_TARGET%" %* diff --git a/vendor/nesbot/carbon/composer.json b/vendor/nesbot/carbon/composer.json new file mode 100644 index 0000000..c7ca2de --- /dev/null +++ b/vendor/nesbot/carbon/composer.json @@ -0,0 +1,120 @@ +{ + "name": "nesbot/carbon", + "description": "An API extension for DateTime that supports 281 different languages.", + "license": "MIT", + "type": "library", + "keywords": [ + "date", + "time", + "DateTime" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "homepage": "https://carbon.nesbot.com", + "support": { + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon", + "docs": "https://carbon.nesbot.com/docs" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + } + ], + "require": { + "php": "^7.1.8 || ^8.0", + "ext-json": "*", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "minimum-stability": "dev", + "prefer-stable": true, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + }, + "files": [ + "tests/Laravel/ServiceProvider.php" + ] + }, + "bin": [ + "bin/carbon" + ], + "config": { + "allow-plugins": { + "phpstan/extension-installer": true, + "composer/package-versions-deprecated": true + }, + "process-timeout": 0, + "sort-packages": true + }, + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "scripts": { + "phpcs": "php-cs-fixer fix -v --diff --dry-run", + "phpdoc": "php phpdoc.php", + "phpmd": "phpmd src text /phpmd.xml", + "phpstan": "phpstan analyse --configuration phpstan.neon", + "phpunit": "phpunit --verbose", + "style-check": [ + "@phpcs", + "@phpstan", + "@phpmd" + ], + "test": [ + "@phpunit", + "@style-check" + ] + } +} diff --git a/vendor/nesbot/carbon/extension.neon b/vendor/nesbot/carbon/extension.neon new file mode 100644 index 0000000..33bf794 --- /dev/null +++ b/vendor/nesbot/carbon/extension.neon @@ -0,0 +1,5 @@ +services: + - + class: Carbon\PHPStan\MacroExtension + tags: + - phpstan.broker.methodsClassReflectionExtension diff --git a/vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroBuiltin.php b/vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroBuiltin.php new file mode 100644 index 0000000..ba7cf63 --- /dev/null +++ b/vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroBuiltin.php @@ -0,0 +1,36 @@ +<?php + +declare(strict_types=1); + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\PHPStan; + +use PHPStan\BetterReflection\Reflection; +use ReflectionMethod; + +if (!class_exists(AbstractReflectionMacro::class, false)) { + abstract class AbstractReflectionMacro extends AbstractMacro + { + /** + * {@inheritdoc} + */ + public function getReflection(): ?ReflectionMethod + { + if ($this->reflectionFunction instanceof Reflection\ReflectionMethod) { + return new Reflection\Adapter\ReflectionMethod($this->reflectionFunction); + } + + return $this->reflectionFunction instanceof ReflectionMethod + ? $this->reflectionFunction + : null; + } + } +} diff --git a/vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroStatic.php b/vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroStatic.php new file mode 100644 index 0000000..bd4c8e8 --- /dev/null +++ b/vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroStatic.php @@ -0,0 +1,45 @@ +<?php + +declare(strict_types=1); + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\PHPStan; + +use PHPStan\BetterReflection\Reflection; +use ReflectionMethod; + +if (!class_exists(AbstractReflectionMacro::class, false)) { + abstract class AbstractReflectionMacro extends AbstractMacro + { + /** + * {@inheritdoc} + */ + public function getReflection(): ?Reflection\Adapter\ReflectionMethod + { + if ($this->reflectionFunction instanceof Reflection\Adapter\ReflectionMethod) { + return $this->reflectionFunction; + } + + if ($this->reflectionFunction instanceof Reflection\ReflectionMethod) { + return new Reflection\Adapter\ReflectionMethod($this->reflectionFunction); + } + + return $this->reflectionFunction instanceof ReflectionMethod + ? new Reflection\Adapter\ReflectionMethod( + Reflection\ReflectionMethod::createFromName( + $this->reflectionFunction->getDeclaringClass()->getName(), + $this->reflectionFunction->getName() + ) + ) + : null; + } + } +} diff --git a/vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroStrongType.php b/vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroStrongType.php new file mode 100644 index 0000000..f615b3a --- /dev/null +++ b/vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroStrongType.php @@ -0,0 +1,45 @@ +<?php + +declare(strict_types=1); + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\PHPStan; + +if (!class_exists(LazyMacro::class, false)) { + abstract class LazyMacro extends AbstractReflectionMacro + { + /** + * {@inheritdoc} + */ + public function getFileName(): ?string + { + $file = $this->reflectionFunction->getFileName(); + + return (($file ? realpath($file) : null) ?: $file) ?: null; + } + + /** + * {@inheritdoc} + */ + public function getStartLine(): ?int + { + return $this->reflectionFunction->getStartLine(); + } + + /** + * {@inheritdoc} + */ + public function getEndLine(): ?int + { + return $this->reflectionFunction->getEndLine(); + } + } +} diff --git a/vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroWeakType.php b/vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroWeakType.php new file mode 100644 index 0000000..bf64c1d --- /dev/null +++ b/vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroWeakType.php @@ -0,0 +1,51 @@ +<?php + +declare(strict_types=1); + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\PHPStan; + +if (!class_exists(LazyMacro::class, false)) { + abstract class LazyMacro extends AbstractReflectionMacro + { + /** + * {@inheritdoc} + * + * @return string|false + */ + public function getFileName() + { + $file = $this->reflectionFunction->getFileName(); + + return (($file ? realpath($file) : null) ?: $file) ?: null; + } + + /** + * {@inheritdoc} + * + * @return int|false + */ + public function getStartLine() + { + return $this->reflectionFunction->getStartLine(); + } + + /** + * {@inheritdoc} + * + * @return int|false + */ + public function getEndLine() + { + return $this->reflectionFunction->getEndLine(); + } + } +} diff --git a/vendor/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php b/vendor/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php new file mode 100644 index 0000000..d35308a --- /dev/null +++ b/vendor/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php @@ -0,0 +1,52 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon; + +use Symfony\Component\Translation\MessageCatalogueInterface; + +if (!class_exists(LazyTranslator::class, false)) { + class LazyTranslator extends AbstractTranslator implements TranslatorStrongTypeInterface + { + public function trans(?string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string + { + return $this->translate($id, $parameters, $domain, $locale); + } + + public function getFromCatalogue(MessageCatalogueInterface $catalogue, string $id, string $domain = 'messages') + { + $messages = $this->getPrivateProperty($catalogue, 'messages'); + + if (isset($messages[$domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX][$id])) { + return $messages[$domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX][$id]; + } + + if (isset($messages[$domain][$id])) { + return $messages[$domain][$id]; + } + + $fallbackCatalogue = $this->getPrivateProperty($catalogue, 'fallbackCatalogue'); + + if ($fallbackCatalogue !== null) { + return $this->getFromCatalogue($fallbackCatalogue, $id, $domain); + } + + return $id; + } + + private function getPrivateProperty($instance, string $field) + { + return (function (string $field) { + return $this->$field; + })->call($instance, $field); + } + } +} diff --git a/vendor/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php b/vendor/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php new file mode 100644 index 0000000..94dbdc3 --- /dev/null +++ b/vendor/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php @@ -0,0 +1,32 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon; + +if (!class_exists(LazyTranslator::class, false)) { + class LazyTranslator extends AbstractTranslator + { + /** + * Returns the translation. + * + * @param string|null $id + * @param array $parameters + * @param string|null $domain + * @param string|null $locale + * + * @return string + */ + public function trans($id, array $parameters = [], $domain = null, $locale = null) + { + return $this->translate($id, $parameters, $domain, $locale); + } + } +} diff --git a/vendor/nesbot/carbon/readme.md b/vendor/nesbot/carbon/readme.md new file mode 100644 index 0000000..c04a0e9 --- /dev/null +++ b/vendor/nesbot/carbon/readme.md @@ -0,0 +1,153 @@ +# Carbon + +[![Latest Stable Version](https://img.shields.io/packagist/v/nesbot/carbon.svg?style=flat-square)](https://packagist.org/packages/nesbot/carbon) +[![Total Downloads](https://img.shields.io/packagist/dt/nesbot/carbon.svg?style=flat-square)](https://packagist.org/packages/nesbot/carbon) +[![GitHub Actions](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2Fbriannesbitt%2FCarbon%2Fbadge&style=flat-square&label=Build&logo=none)](https://actions-badge.atrox.dev/briannesbitt/Carbon/goto) +[![codecov.io](https://img.shields.io/codecov/c/github/briannesbitt/Carbon.svg?style=flat-square)](https://codecov.io/github/briannesbitt/Carbon?branch=master) +[![Tidelift](https://tidelift.com/badges/github/briannesbitt/Carbon)](https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme) + +An international PHP extension for DateTime. [https://carbon.nesbot.com](https://carbon.nesbot.com) + +```php +<?php + +use Carbon\Carbon; + +printf("Right now is %s", Carbon::now()->toDateTimeString()); +printf("Right now in Vancouver is %s", Carbon::now('America/Vancouver')); //implicit __toString() +$tomorrow = Carbon::now()->addDay(); +$lastWeek = Carbon::now()->subWeek(); +$nextSummerOlympics = Carbon::createFromDate(2016)->addYears(4); + +$officialDate = Carbon::now()->toRfc2822String(); + +$howOldAmI = Carbon::createFromDate(1975, 5, 21)->age; + +$noonTodayLondonTime = Carbon::createFromTime(12, 0, 0, 'Europe/London'); + +$internetWillBlowUpOn = Carbon::create(2038, 01, 19, 3, 14, 7, 'GMT'); + +// Don't really want this to happen so mock now +Carbon::setTestNow(Carbon::createFromDate(2000, 1, 1)); + +// comparisons are always done in UTC +if (Carbon::now()->gte($internetWillBlowUpOn)) { + die(); +} + +// Phew! Return to normal behaviour +Carbon::setTestNow(); + +if (Carbon::now()->isWeekend()) { + echo 'Party!'; +} +// Over 200 languages (and over 500 regional variants) supported: +echo Carbon::now()->subMinutes(2)->diffForHumans(); // '2 minutes ago' +echo Carbon::now()->subMinutes(2)->locale('zh_CN')->diffForHumans(); // '2分钟前' +echo Carbon::parse('2019-07-23 14:51')->isoFormat('LLLL'); // 'Tuesday, July 23, 2019 2:51 PM' +echo Carbon::parse('2019-07-23 14:51')->locale('fr_FR')->isoFormat('LLLL'); // 'mardi 23 juillet 2019 14:51' + +// ... but also does 'from now', 'after' and 'before' +// rolling up to seconds, minutes, hours, days, months, years + +$daysSinceEpoch = Carbon::createFromTimestamp(0)->diffInDays(); +``` + +[Get supported nesbot/carbon with the Tidelift Subscription](https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme) + +## Installation + +### With Composer + +``` +$ composer require nesbot/carbon +``` + +```json +{ + "require": { + "nesbot/carbon": "^2.16" + } +} +``` + +```php +<?php +require 'vendor/autoload.php'; + +use Carbon\Carbon; + +printf("Now: %s", Carbon::now()); +``` + +### Without Composer + +Why are you not using [composer](https://getcomposer.org/)? Download the Carbon [latest release](https://github.com/briannesbitt/Carbon/releases) and put the contents of the ZIP archive into a directory in your project. Then require the file `autoload.php` to get all classes and dependencies loaded on need. + +```php +<?php +require 'path-to-Carbon-directory/autoload.php'; + +use Carbon\Carbon; + +printf("Now: %s", Carbon::now()); +``` + +## Docs + +[https://carbon.nesbot.com/docs](https://carbon.nesbot.com/docs) + +## Security contact information + +To report a security vulnerability, please use the +[Tidelift security contact](https://tidelift.com/security). +Tidelift will coordinate the fix and disclosure. + +## Credits + +### Contributors + +This project exists thanks to all the people who contribute. + +<a href="https://github.com/briannesbitt/Carbon/graphs/contributors" target="_blank"><img src="https://opencollective.com/Carbon/contributors.svg?width=890&button=false" /></a> + +### Translators + +[Thanks to people helping us to translate Carbon in so many languages](https://carbon.nesbot.com/contribute/translators/) + +### Sponsors + +Support this project by becoming a sponsor. Your logo will show up here with a link to your website. + +<a href="https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme" target="_blank"><img src="https://carbon.nesbot.com/tidelift-brand.png" width="256" height="64"></a> +<a href="https://casinohex.org/canada/?utm_source=opencollective&utm_medium=github&utm_campaign=Carbon" target="_blank"><img src="https://images.opencollective.com/hexcasinoca/2da3af2/logo/256.png" width="85" height="64"></a> + +<a href="https://github.com/taylorotwell" target="_blank"><img src="https://avatars.githubusercontent.com/u/463230?s=128&v=4" width="64" height="64"></a> +<a href="https://github.com/usefathom" target="_blank"><img src="https://avatars.githubusercontent.com/u/38684088?s=128&v=4" width="64" height="64"></a> +<a href="https://github.com/tobischulz" target="_blank"><img src="https://avatars.githubusercontent.com/u/576014?s=128&v=4" width="64" height="64"></a> + +<a href="https://opencollective.com/Carbon/sponsor/0/website" target="_blank"><img src="https://opencollective.com/Carbon/sponsor/0/avatar.svg"></a> +<a href="https://opencollective.com/Carbon/sponsor/1/website" target="_blank"><img src="https://opencollective.com/Carbon/sponsor/1/avatar.svg"></a> +<a href="https://opencollective.com/Carbon/sponsor/2/website" target="_blank"><img src="https://opencollective.com/Carbon/sponsor/2/avatar.svg"></a> +<a href="https://opencollective.com/Carbon/sponsor/3/website" target="_blank"><img src="https://opencollective.com/Carbon/sponsor/3/avatar.svg"></a> +<a href="https://opencollective.com/Carbon/sponsor/4/website" target="_blank"><img src="https://opencollective.com/Carbon/sponsor/4/avatar.svg"></a> +<a href="https://opencollective.com/Carbon/sponsor/5/website" target="_blank"><img src="https://opencollective.com/Carbon/sponsor/5/avatar.svg"></a> +<a href="https://opencollective.com/Carbon/sponsor/6/website" target="_blank"><img src="https://opencollective.com/Carbon/sponsor/6/avatar.svg"></a> +<a href="https://opencollective.com/Carbon/sponsor/7/website" target="_blank"><img src="https://opencollective.com/Carbon/sponsor/7/avatar.svg"></a> +<a href="https://opencollective.com/Carbon/sponsor/8/website" target="_blank"><img src="https://opencollective.com/Carbon/sponsor/8/avatar.svg"></a> + +[[Become a sponsor](https://opencollective.com/Carbon#sponsor)] + +### Backers + +Thank you to all our backers! 🙏 + +<a href="https://opencollective.com/Carbon#backers" target="_blank"><img src="https://opencollective.com/Carbon/backers.svg?width=890"></a> + +[[Become a backer](https://opencollective.com/Carbon#backer)] + +## Carbon for enterprise + +Available as part of the Tidelift Subscription. + +The maintainers of ``Carbon`` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php b/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php new file mode 100644 index 0000000..949e159 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php @@ -0,0 +1,397 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon; + +use Closure; +use ReflectionException; +use ReflectionFunction; +use Symfony\Component\Translation; +use Symfony\Component\Translation\Formatter\MessageFormatterInterface; +use Symfony\Component\Translation\Loader\ArrayLoader; + +abstract class AbstractTranslator extends Translation\Translator +{ + /** + * Translator singletons for each language. + * + * @var array + */ + protected static $singletons = []; + + /** + * List of custom localized messages. + * + * @var array + */ + protected $messages = []; + + /** + * List of custom directories that contain translation files. + * + * @var string[] + */ + protected $directories = []; + + /** + * Set to true while constructing. + * + * @var bool + */ + protected $initializing = false; + + /** + * List of locales aliases. + * + * @var string[] + */ + protected $aliases = [ + 'me' => 'sr_Latn_ME', + 'scr' => 'sh', + ]; + + /** + * Return a singleton instance of Translator. + * + * @param string|null $locale optional initial locale ("en" - english by default) + * + * @return static + */ + public static function get($locale = null) + { + $locale = $locale ?: 'en'; + $key = static::class === Translator::class ? $locale : static::class.'|'.$locale; + + if (!isset(static::$singletons[$key])) { + static::$singletons[$key] = new static($locale); + } + + return static::$singletons[$key]; + } + + public function __construct($locale, MessageFormatterInterface $formatter = null, $cacheDir = null, $debug = false) + { + parent::setLocale($locale); + $this->initializing = true; + $this->directories = [__DIR__.'/Lang']; + $this->addLoader('array', new ArrayLoader()); + parent::__construct($locale, $formatter, $cacheDir, $debug); + $this->initializing = false; + } + + /** + * Returns the list of directories translation files are searched in. + * + * @return array + */ + public function getDirectories(): array + { + return $this->directories; + } + + /** + * Set list of directories translation files are searched in. + * + * @param array $directories new directories list + * + * @return $this + */ + public function setDirectories(array $directories) + { + $this->directories = $directories; + + return $this; + } + + /** + * Add a directory to the list translation files are searched in. + * + * @param string $directory new directory + * + * @return $this + */ + public function addDirectory(string $directory) + { + $this->directories[] = $directory; + + return $this; + } + + /** + * Remove a directory from the list translation files are searched in. + * + * @param string $directory directory path + * + * @return $this + */ + public function removeDirectory(string $directory) + { + $search = rtrim(strtr($directory, '\\', '/'), '/'); + + return $this->setDirectories(array_filter($this->getDirectories(), function ($item) use ($search) { + return rtrim(strtr($item, '\\', '/'), '/') !== $search; + })); + } + + /** + * Reset messages of a locale (all locale if no locale passed). + * Remove custom messages and reload initial messages from matching + * file in Lang directory. + * + * @param string|null $locale + * + * @return bool + */ + public function resetMessages($locale = null) + { + if ($locale === null) { + $this->messages = []; + + return true; + } + + foreach ($this->getDirectories() as $directory) { + $data = @include sprintf('%s/%s.php', rtrim($directory, '\\/'), $locale); + + if ($data !== false) { + $this->messages[$locale] = $data; + $this->addResource('array', $this->messages[$locale], $locale); + + return true; + } + } + + return false; + } + + /** + * Returns the list of files matching a given locale prefix (or all if empty). + * + * @param string $prefix prefix required to filter result + * + * @return array + */ + public function getLocalesFiles($prefix = '') + { + $files = []; + + foreach ($this->getDirectories() as $directory) { + $directory = rtrim($directory, '\\/'); + + foreach (glob("$directory/$prefix*.php") as $file) { + $files[] = $file; + } + } + + return array_unique($files); + } + + /** + * Returns the list of internally available locales and already loaded custom locales. + * (It will ignore custom translator dynamic loading.) + * + * @param string $prefix prefix required to filter result + * + * @return array + */ + public function getAvailableLocales($prefix = '') + { + $locales = []; + foreach ($this->getLocalesFiles($prefix) as $file) { + $locales[] = substr($file, strrpos($file, '/') + 1, -4); + } + + return array_unique(array_merge($locales, array_keys($this->messages))); + } + + protected function translate(?string $id, array $parameters = [], ?string $domain = null, ?string $locale = null): string + { + if ($domain === null) { + $domain = 'messages'; + } + + $catalogue = $this->getCatalogue($locale); + $format = $this instanceof TranslatorStrongTypeInterface + ? $this->getFromCatalogue($catalogue, (string) $id, $domain) + : $this->getCatalogue($locale)->get((string) $id, $domain); // @codeCoverageIgnore + + if ($format instanceof Closure) { + // @codeCoverageIgnoreStart + try { + $count = (new ReflectionFunction($format))->getNumberOfRequiredParameters(); + } catch (ReflectionException $exception) { + $count = 0; + } + // @codeCoverageIgnoreEnd + + return $format( + ...array_values($parameters), + ...array_fill(0, max(0, $count - \count($parameters)), null) + ); + } + + return parent::trans($id, $parameters, $domain, $locale); + } + + /** + * Init messages language from matching file in Lang directory. + * + * @param string $locale + * + * @return bool + */ + protected function loadMessagesFromFile($locale) + { + return isset($this->messages[$locale]) || $this->resetMessages($locale); + } + + /** + * Set messages of a locale and take file first if present. + * + * @param string $locale + * @param array $messages + * + * @return $this + */ + public function setMessages($locale, $messages) + { + $this->loadMessagesFromFile($locale); + $this->addResource('array', $messages, $locale); + $this->messages[$locale] = array_merge( + $this->messages[$locale] ?? [], + $messages + ); + + return $this; + } + + /** + * Set messages of the current locale and take file first if present. + * + * @param array $messages + * + * @return $this + */ + public function setTranslations($messages) + { + return $this->setMessages($this->getLocale(), $messages); + } + + /** + * Get messages of a locale, if none given, return all the + * languages. + * + * @param string|null $locale + * + * @return array + */ + public function getMessages($locale = null) + { + return $locale === null ? $this->messages : $this->messages[$locale]; + } + + /** + * Set the current translator locale and indicate if the source locale file exists + * + * @param string $locale locale ex. en + * + * @return bool + */ + public function setLocale($locale) + { + $locale = preg_replace_callback('/[-_]([a-z]{2,}|\d{2,})/', function ($matches) { + // _2-letters or YUE is a region, _3+-letters is a variant + $upper = strtoupper($matches[1]); + + if ($upper === 'YUE' || $upper === 'ISO' || \strlen($upper) < 3) { + return "_$upper"; + } + + return '_'.ucfirst($matches[1]); + }, strtolower($locale)); + + $previousLocale = $this->getLocale(); + + if ($previousLocale === $locale && isset($this->messages[$locale])) { + return true; + } + + unset(static::$singletons[$previousLocale]); + + if ($locale === 'auto') { + $completeLocale = setlocale(LC_TIME, '0'); + $locale = preg_replace('/^([^_.-]+).*$/', '$1', $completeLocale); + $locales = $this->getAvailableLocales($locale); + + $completeLocaleChunks = preg_split('/[_.-]+/', $completeLocale); + + $getScore = function ($language) use ($completeLocaleChunks) { + return self::compareChunkLists($completeLocaleChunks, preg_split('/[_.-]+/', $language)); + }; + + usort($locales, function ($first, $second) use ($getScore) { + return $getScore($second) <=> $getScore($first); + }); + + $locale = $locales[0]; + } + + if (isset($this->aliases[$locale])) { + $locale = $this->aliases[$locale]; + } + + // If subtag (ex: en_CA) first load the macro (ex: en) to have a fallback + if (str_contains($locale, '_') && + $this->loadMessagesFromFile($macroLocale = preg_replace('/^([^_]+).*$/', '$1', $locale)) + ) { + parent::setLocale($macroLocale); + } + + if (!$this->loadMessagesFromFile($locale) && !$this->initializing) { + return false; + } + + parent::setLocale($locale); + + return true; + } + + /** + * Show locale on var_dump(). + * + * @return array + */ + public function __debugInfo() + { + return [ + 'locale' => $this->getLocale(), + ]; + } + + private static function compareChunkLists($referenceChunks, $chunks) + { + $score = 0; + + foreach ($referenceChunks as $index => $chunk) { + if (!isset($chunks[$index])) { + $score++; + + continue; + } + + if (strtolower($chunks[$index]) === strtolower($chunk)) { + $score += 10; + } + } + + return $score; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Carbon.php b/vendor/nesbot/carbon/src/Carbon/Carbon.php new file mode 100644 index 0000000..e327590 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Carbon.php @@ -0,0 +1,523 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon; + +use Carbon\Traits\Date; +use Carbon\Traits\DeprecatedProperties; +use DateTime; +use DateTimeInterface; +use DateTimeZone; + +/** + * A simple API extension for DateTime. + * + * @mixin DeprecatedProperties + * + * <autodoc generated by `composer phpdoc`> + * + * @property int $year + * @property int $yearIso + * @property int $month + * @property int $day + * @property int $hour + * @property int $minute + * @property int $second + * @property int $micro + * @property int $microsecond + * @property int|float|string $timestamp seconds since the Unix Epoch + * @property string $englishDayOfWeek the day of week in English + * @property string $shortEnglishDayOfWeek the abbreviated day of week in English + * @property string $englishMonth the month in English + * @property string $shortEnglishMonth the abbreviated month in English + * @property int $milliseconds + * @property int $millisecond + * @property int $milli + * @property int $week 1 through 53 + * @property int $isoWeek 1 through 53 + * @property int $weekYear year according to week format + * @property int $isoWeekYear year according to ISO week format + * @property int $dayOfYear 1 through 366 + * @property int $age does a diffInYears() with default parameters + * @property int $offset the timezone offset in seconds from UTC + * @property int $offsetMinutes the timezone offset in minutes from UTC + * @property int $offsetHours the timezone offset in hours from UTC + * @property CarbonTimeZone $timezone the current timezone + * @property CarbonTimeZone $tz alias of $timezone + * @property-read int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) + * @property-read int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) + * @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday + * @property-read int $daysInMonth number of days in the given month + * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) + * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) + * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name + * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName + * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read int $noZeroHour current hour from 1 to 24 + * @property-read int $weeksInYear 51 through 53 + * @property-read int $isoWeeksInYear 51 through 53 + * @property-read int $weekOfMonth 1 through 5 + * @property-read int $weekNumberInMonth 1 through 5 + * @property-read int $firstWeekDay 0 through 6 + * @property-read int $lastWeekDay 0 through 6 + * @property-read int $daysInYear 365 or 366 + * @property-read int $quarter the quarter of this instance, 1 - 4 + * @property-read int $decade the decade of this instance + * @property-read int $century the century of this instance + * @property-read int $millennium the millennium of this instance + * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise + * @property-read bool $local checks if the timezone is local, true if local, false otherwise + * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise + * @property-read string $timezoneName the current timezone name + * @property-read string $tzName alias of $timezoneName + * @property-read string $locale locale of the current instance + * + * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) + * @method bool isLocal() Check if the current instance has non-UTC timezone. + * @method bool isValid() Check if the current instance is a valid date. + * @method bool isDST() Check if the current instance is in a daylight saving time. + * @method bool isSunday() Checks if the instance day is sunday. + * @method bool isMonday() Checks if the instance day is monday. + * @method bool isTuesday() Checks if the instance day is tuesday. + * @method bool isWednesday() Checks if the instance day is wednesday. + * @method bool isThursday() Checks if the instance day is thursday. + * @method bool isFriday() Checks if the instance day is friday. + * @method bool isSaturday() Checks if the instance day is saturday. + * @method bool isSameYear(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. + * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. + * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. + * @method bool isSameWeek(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. + * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. + * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. + * @method bool isSameDay(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. + * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. + * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. + * @method bool isSameHour(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. + * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. + * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. + * @method bool isSameMinute(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. + * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. + * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. + * @method bool isSameSecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. + * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. + * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. + * @method bool isSameMicro(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isSameMicrosecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. + * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. + * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. + * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. + * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. + * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. + * @method bool isSameDecade(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. + * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. + * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. + * @method bool isSameCentury(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. + * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. + * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. + * @method bool isSameMillennium(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. + * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. + * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. + * @method $this years(int $value) Set current instance year to the given value. + * @method $this year(int $value) Set current instance year to the given value. + * @method $this setYears(int $value) Set current instance year to the given value. + * @method $this setYear(int $value) Set current instance year to the given value. + * @method $this months(int $value) Set current instance month to the given value. + * @method $this month(int $value) Set current instance month to the given value. + * @method $this setMonths(int $value) Set current instance month to the given value. + * @method $this setMonth(int $value) Set current instance month to the given value. + * @method $this days(int $value) Set current instance day to the given value. + * @method $this day(int $value) Set current instance day to the given value. + * @method $this setDays(int $value) Set current instance day to the given value. + * @method $this setDay(int $value) Set current instance day to the given value. + * @method $this hours(int $value) Set current instance hour to the given value. + * @method $this hour(int $value) Set current instance hour to the given value. + * @method $this setHours(int $value) Set current instance hour to the given value. + * @method $this setHour(int $value) Set current instance hour to the given value. + * @method $this minutes(int $value) Set current instance minute to the given value. + * @method $this minute(int $value) Set current instance minute to the given value. + * @method $this setMinutes(int $value) Set current instance minute to the given value. + * @method $this setMinute(int $value) Set current instance minute to the given value. + * @method $this seconds(int $value) Set current instance second to the given value. + * @method $this second(int $value) Set current instance second to the given value. + * @method $this setSeconds(int $value) Set current instance second to the given value. + * @method $this setSecond(int $value) Set current instance second to the given value. + * @method $this millis(int $value) Set current instance millisecond to the given value. + * @method $this milli(int $value) Set current instance millisecond to the given value. + * @method $this setMillis(int $value) Set current instance millisecond to the given value. + * @method $this setMilli(int $value) Set current instance millisecond to the given value. + * @method $this milliseconds(int $value) Set current instance millisecond to the given value. + * @method $this millisecond(int $value) Set current instance millisecond to the given value. + * @method $this setMilliseconds(int $value) Set current instance millisecond to the given value. + * @method $this setMillisecond(int $value) Set current instance millisecond to the given value. + * @method $this micros(int $value) Set current instance microsecond to the given value. + * @method $this micro(int $value) Set current instance microsecond to the given value. + * @method $this setMicros(int $value) Set current instance microsecond to the given value. + * @method $this setMicro(int $value) Set current instance microsecond to the given value. + * @method $this microseconds(int $value) Set current instance microsecond to the given value. + * @method $this microsecond(int $value) Set current instance microsecond to the given value. + * @method $this setMicroseconds(int $value) Set current instance microsecond to the given value. + * @method $this setMicrosecond(int $value) Set current instance microsecond to the given value. + * @method $this addYears(int $value = 1) Add years (the $value count passed in) to the instance (using date interval). + * @method $this addYear() Add one year to the instance (using date interval). + * @method $this subYears(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval). + * @method $this subYear() Sub one year to the instance (using date interval). + * @method $this addYearsWithOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. + * @method $this subYearsWithOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. + * @method $this addYearsWithoutOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearsWithoutOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addYearsWithNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearsWithNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addYearsNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearsNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonths(int $value = 1) Add months (the $value count passed in) to the instance (using date interval). + * @method $this addMonth() Add one month to the instance (using date interval). + * @method $this subMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval). + * @method $this subMonth() Sub one month to the instance (using date interval). + * @method $this addMonthsWithOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. + * @method $this subMonthsWithOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. + * @method $this addMonthsWithoutOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthsWithoutOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonthsWithNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthsWithNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonthsNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthsNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDays(int $value = 1) Add days (the $value count passed in) to the instance (using date interval). + * @method $this addDay() Add one day to the instance (using date interval). + * @method $this subDays(int $value = 1) Sub days (the $value count passed in) to the instance (using date interval). + * @method $this subDay() Sub one day to the instance (using date interval). + * @method $this addHours(int $value = 1) Add hours (the $value count passed in) to the instance (using date interval). + * @method $this addHour() Add one hour to the instance (using date interval). + * @method $this subHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). + * @method $this subHour() Sub one hour to the instance (using date interval). + * @method $this addMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). + * @method $this addMinute() Add one minute to the instance (using date interval). + * @method $this subMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). + * @method $this subMinute() Sub one minute to the instance (using date interval). + * @method $this addSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). + * @method $this addSecond() Add one second to the instance (using date interval). + * @method $this subSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). + * @method $this subSecond() Sub one second to the instance (using date interval). + * @method $this addMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method $this addMilli() Add one millisecond to the instance (using date interval). + * @method $this subMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method $this subMilli() Sub one millisecond to the instance (using date interval). + * @method $this addMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method $this addMillisecond() Add one millisecond to the instance (using date interval). + * @method $this subMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method $this subMillisecond() Sub one millisecond to the instance (using date interval). + * @method $this addMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method $this addMicro() Add one microsecond to the instance (using date interval). + * @method $this subMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method $this subMicro() Sub one microsecond to the instance (using date interval). + * @method $this addMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method $this addMicrosecond() Add one microsecond to the instance (using date interval). + * @method $this subMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method $this subMicrosecond() Sub one microsecond to the instance (using date interval). + * @method $this addMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). + * @method $this addMillennium() Add one millennium to the instance (using date interval). + * @method $this subMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). + * @method $this subMillennium() Sub one millennium to the instance (using date interval). + * @method $this addMillenniaWithOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method $this subMillenniaWithOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method $this addMillenniaWithoutOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniaWithoutOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMillenniaWithNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniaWithNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMillenniaNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniaNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). + * @method $this addCentury() Add one century to the instance (using date interval). + * @method $this subCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). + * @method $this subCentury() Sub one century to the instance (using date interval). + * @method $this addCenturiesWithOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. + * @method $this subCenturiesWithOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. + * @method $this addCenturiesWithoutOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturiesWithoutOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturiesWithNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturiesWithNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturiesNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturiesNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval). + * @method $this addDecade() Add one decade to the instance (using date interval). + * @method $this subDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). + * @method $this subDecade() Sub one decade to the instance (using date interval). + * @method $this addDecadesWithOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. + * @method $this subDecadesWithOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. + * @method $this addDecadesWithoutOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadesWithoutOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecadesWithNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadesWithNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecadesNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadesNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). + * @method $this addQuarter() Add one quarter to the instance (using date interval). + * @method $this subQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). + * @method $this subQuarter() Sub one quarter to the instance (using date interval). + * @method $this addQuartersWithOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method $this subQuartersWithOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method $this subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method $this addQuartersWithoutOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuartersWithoutOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuartersWithNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuartersWithNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuartersNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuartersNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method $this subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method $this addWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). + * @method $this addWeek() Add one week to the instance (using date interval). + * @method $this subWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). + * @method $this subWeek() Sub one week to the instance (using date interval). + * @method $this addWeekdays(int $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). + * @method $this addWeekday() Add one weekday to the instance (using date interval). + * @method $this subWeekdays(int $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). + * @method $this subWeekday() Sub one weekday to the instance (using date interval). + * @method $this addRealMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method $this addRealMicro() Add one microsecond to the instance (using timestamp). + * @method $this subRealMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method $this subRealMicro() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method $this addRealMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method $this addRealMicrosecond() Add one microsecond to the instance (using timestamp). + * @method $this subRealMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method $this subRealMicrosecond() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method $this addRealMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method $this addRealMilli() Add one millisecond to the instance (using timestamp). + * @method $this subRealMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method $this subRealMilli() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method $this addRealMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method $this addRealMillisecond() Add one millisecond to the instance (using timestamp). + * @method $this subRealMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method $this subRealMillisecond() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method $this addRealSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). + * @method $this addRealSecond() Add one second to the instance (using timestamp). + * @method $this subRealSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). + * @method $this subRealSecond() Sub one second to the instance (using timestamp). + * @method CarbonPeriod secondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. + * @method $this addRealMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). + * @method $this addRealMinute() Add one minute to the instance (using timestamp). + * @method $this subRealMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). + * @method $this subRealMinute() Sub one minute to the instance (using timestamp). + * @method CarbonPeriod minutesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. + * @method $this addRealHours(int $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). + * @method $this addRealHour() Add one hour to the instance (using timestamp). + * @method $this subRealHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). + * @method $this subRealHour() Sub one hour to the instance (using timestamp). + * @method CarbonPeriod hoursUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. + * @method $this addRealDays(int $value = 1) Add days (the $value count passed in) to the instance (using timestamp). + * @method $this addRealDay() Add one day to the instance (using timestamp). + * @method $this subRealDays(int $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). + * @method $this subRealDay() Sub one day to the instance (using timestamp). + * @method CarbonPeriod daysUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. + * @method $this addRealWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). + * @method $this addRealWeek() Add one week to the instance (using timestamp). + * @method $this subRealWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). + * @method $this subRealWeek() Sub one week to the instance (using timestamp). + * @method CarbonPeriod weeksUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. + * @method $this addRealMonths(int $value = 1) Add months (the $value count passed in) to the instance (using timestamp). + * @method $this addRealMonth() Add one month to the instance (using timestamp). + * @method $this subRealMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). + * @method $this subRealMonth() Sub one month to the instance (using timestamp). + * @method CarbonPeriod monthsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. + * @method $this addRealQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). + * @method $this addRealQuarter() Add one quarter to the instance (using timestamp). + * @method $this subRealQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). + * @method $this subRealQuarter() Sub one quarter to the instance (using timestamp). + * @method CarbonPeriod quartersUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. + * @method $this addRealYears(int $value = 1) Add years (the $value count passed in) to the instance (using timestamp). + * @method $this addRealYear() Add one year to the instance (using timestamp). + * @method $this subRealYears(int $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). + * @method $this subRealYear() Sub one year to the instance (using timestamp). + * @method CarbonPeriod yearsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. + * @method $this addRealDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). + * @method $this addRealDecade() Add one decade to the instance (using timestamp). + * @method $this subRealDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). + * @method $this subRealDecade() Sub one decade to the instance (using timestamp). + * @method CarbonPeriod decadesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. + * @method $this addRealCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). + * @method $this addRealCentury() Add one century to the instance (using timestamp). + * @method $this subRealCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). + * @method $this subRealCentury() Sub one century to the instance (using timestamp). + * @method CarbonPeriod centuriesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. + * @method $this addRealMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). + * @method $this addRealMillennium() Add one millennium to the instance (using timestamp). + * @method $this subRealMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). + * @method $this subRealMillennium() Sub one millennium to the instance (using timestamp). + * @method CarbonPeriod millenniaUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. + * @method $this roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method $this roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method $this floorYear(float $precision = 1) Truncate the current instance year with given precision. + * @method $this floorYears(float $precision = 1) Truncate the current instance year with given precision. + * @method $this ceilYear(float $precision = 1) Ceil the current instance year with given precision. + * @method $this ceilYears(float $precision = 1) Ceil the current instance year with given precision. + * @method $this roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method $this roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method $this floorMonth(float $precision = 1) Truncate the current instance month with given precision. + * @method $this floorMonths(float $precision = 1) Truncate the current instance month with given precision. + * @method $this ceilMonth(float $precision = 1) Ceil the current instance month with given precision. + * @method $this ceilMonths(float $precision = 1) Ceil the current instance month with given precision. + * @method $this roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method $this roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method $this floorDay(float $precision = 1) Truncate the current instance day with given precision. + * @method $this floorDays(float $precision = 1) Truncate the current instance day with given precision. + * @method $this ceilDay(float $precision = 1) Ceil the current instance day with given precision. + * @method $this ceilDays(float $precision = 1) Ceil the current instance day with given precision. + * @method $this roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method $this roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method $this floorHour(float $precision = 1) Truncate the current instance hour with given precision. + * @method $this floorHours(float $precision = 1) Truncate the current instance hour with given precision. + * @method $this ceilHour(float $precision = 1) Ceil the current instance hour with given precision. + * @method $this ceilHours(float $precision = 1) Ceil the current instance hour with given precision. + * @method $this roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method $this roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method $this floorMinute(float $precision = 1) Truncate the current instance minute with given precision. + * @method $this floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. + * @method $this ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. + * @method $this ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. + * @method $this roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method $this roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method $this floorSecond(float $precision = 1) Truncate the current instance second with given precision. + * @method $this floorSeconds(float $precision = 1) Truncate the current instance second with given precision. + * @method $this ceilSecond(float $precision = 1) Ceil the current instance second with given precision. + * @method $this ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. + * @method $this roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method $this roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method $this floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. + * @method $this floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. + * @method $this ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. + * @method $this ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. + * @method $this roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method $this roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method $this floorCentury(float $precision = 1) Truncate the current instance century with given precision. + * @method $this floorCenturies(float $precision = 1) Truncate the current instance century with given precision. + * @method $this ceilCentury(float $precision = 1) Ceil the current instance century with given precision. + * @method $this ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. + * @method $this roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method $this roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method $this floorDecade(float $precision = 1) Truncate the current instance decade with given precision. + * @method $this floorDecades(float $precision = 1) Truncate the current instance decade with given precision. + * @method $this ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. + * @method $this ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. + * @method $this roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method $this roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method $this floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. + * @method $this floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. + * @method $this ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. + * @method $this ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. + * @method $this roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method $this roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method $this floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method $this floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method $this ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method $this ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method $this roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method $this roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method $this floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method $this floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method $this ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method $this ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method static Carbon|false createFromFormat(string $format, string $time, string|DateTimeZone $timezone = null) Parse a string into a new Carbon object according to the specified format. + * @method static Carbon __set_state(array $array) https://php.net/manual/en/datetime.set-state.php + * + * </autodoc> + */ +class Carbon extends DateTime implements CarbonInterface +{ + use Date; + + /** + * Returns true if the current class/instance is mutable. + * + * @return bool + */ + public static function isMutable() + { + return true; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/CarbonConverterInterface.php b/vendor/nesbot/carbon/src/Carbon/CarbonConverterInterface.php new file mode 100644 index 0000000..1ce967b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/CarbonConverterInterface.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon; + +use DateTimeInterface; + +interface CarbonConverterInterface +{ + public function convertDate(DateTimeInterface $dateTime, bool $negated = false): CarbonInterface; +} diff --git a/vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php b/vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php new file mode 100644 index 0000000..6d1194e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php @@ -0,0 +1,582 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon; + +use Carbon\Traits\Date; +use Carbon\Traits\DeprecatedProperties; +use DateTimeImmutable; +use DateTimeInterface; +use DateTimeZone; + +/** + * A simple API extension for DateTimeImmutable. + * + * @mixin DeprecatedProperties + * + * <autodoc generated by `composer phpdoc`> + * + * @property int $year + * @property int $yearIso + * @property int $month + * @property int $day + * @property int $hour + * @property int $minute + * @property int $second + * @property int $micro + * @property int $microsecond + * @property int|float|string $timestamp seconds since the Unix Epoch + * @property string $englishDayOfWeek the day of week in English + * @property string $shortEnglishDayOfWeek the abbreviated day of week in English + * @property string $englishMonth the month in English + * @property string $shortEnglishMonth the abbreviated month in English + * @property int $milliseconds + * @property int $millisecond + * @property int $milli + * @property int $week 1 through 53 + * @property int $isoWeek 1 through 53 + * @property int $weekYear year according to week format + * @property int $isoWeekYear year according to ISO week format + * @property int $dayOfYear 1 through 366 + * @property int $age does a diffInYears() with default parameters + * @property int $offset the timezone offset in seconds from UTC + * @property int $offsetMinutes the timezone offset in minutes from UTC + * @property int $offsetHours the timezone offset in hours from UTC + * @property CarbonTimeZone $timezone the current timezone + * @property CarbonTimeZone $tz alias of $timezone + * @property-read int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) + * @property-read int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) + * @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday + * @property-read int $daysInMonth number of days in the given month + * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) + * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) + * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name + * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName + * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read int $noZeroHour current hour from 1 to 24 + * @property-read int $weeksInYear 51 through 53 + * @property-read int $isoWeeksInYear 51 through 53 + * @property-read int $weekOfMonth 1 through 5 + * @property-read int $weekNumberInMonth 1 through 5 + * @property-read int $firstWeekDay 0 through 6 + * @property-read int $lastWeekDay 0 through 6 + * @property-read int $daysInYear 365 or 366 + * @property-read int $quarter the quarter of this instance, 1 - 4 + * @property-read int $decade the decade of this instance + * @property-read int $century the century of this instance + * @property-read int $millennium the millennium of this instance + * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise + * @property-read bool $local checks if the timezone is local, true if local, false otherwise + * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise + * @property-read string $timezoneName the current timezone name + * @property-read string $tzName alias of $timezoneName + * @property-read string $locale locale of the current instance + * + * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) + * @method bool isLocal() Check if the current instance has non-UTC timezone. + * @method bool isValid() Check if the current instance is a valid date. + * @method bool isDST() Check if the current instance is in a daylight saving time. + * @method bool isSunday() Checks if the instance day is sunday. + * @method bool isMonday() Checks if the instance day is monday. + * @method bool isTuesday() Checks if the instance day is tuesday. + * @method bool isWednesday() Checks if the instance day is wednesday. + * @method bool isThursday() Checks if the instance day is thursday. + * @method bool isFriday() Checks if the instance day is friday. + * @method bool isSaturday() Checks if the instance day is saturday. + * @method bool isSameYear(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. + * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. + * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. + * @method bool isSameWeek(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. + * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. + * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. + * @method bool isSameDay(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. + * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. + * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. + * @method bool isSameHour(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. + * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. + * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. + * @method bool isSameMinute(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. + * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. + * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. + * @method bool isSameSecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. + * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. + * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. + * @method bool isSameMicro(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isSameMicrosecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. + * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. + * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. + * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. + * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. + * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. + * @method bool isSameDecade(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. + * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. + * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. + * @method bool isSameCentury(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. + * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. + * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. + * @method bool isSameMillennium(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. + * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. + * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. + * @method CarbonImmutable years(int $value) Set current instance year to the given value. + * @method CarbonImmutable year(int $value) Set current instance year to the given value. + * @method CarbonImmutable setYears(int $value) Set current instance year to the given value. + * @method CarbonImmutable setYear(int $value) Set current instance year to the given value. + * @method CarbonImmutable months(int $value) Set current instance month to the given value. + * @method CarbonImmutable month(int $value) Set current instance month to the given value. + * @method CarbonImmutable setMonths(int $value) Set current instance month to the given value. + * @method CarbonImmutable setMonth(int $value) Set current instance month to the given value. + * @method CarbonImmutable days(int $value) Set current instance day to the given value. + * @method CarbonImmutable day(int $value) Set current instance day to the given value. + * @method CarbonImmutable setDays(int $value) Set current instance day to the given value. + * @method CarbonImmutable setDay(int $value) Set current instance day to the given value. + * @method CarbonImmutable hours(int $value) Set current instance hour to the given value. + * @method CarbonImmutable hour(int $value) Set current instance hour to the given value. + * @method CarbonImmutable setHours(int $value) Set current instance hour to the given value. + * @method CarbonImmutable setHour(int $value) Set current instance hour to the given value. + * @method CarbonImmutable minutes(int $value) Set current instance minute to the given value. + * @method CarbonImmutable minute(int $value) Set current instance minute to the given value. + * @method CarbonImmutable setMinutes(int $value) Set current instance minute to the given value. + * @method CarbonImmutable setMinute(int $value) Set current instance minute to the given value. + * @method CarbonImmutable seconds(int $value) Set current instance second to the given value. + * @method CarbonImmutable second(int $value) Set current instance second to the given value. + * @method CarbonImmutable setSeconds(int $value) Set current instance second to the given value. + * @method CarbonImmutable setSecond(int $value) Set current instance second to the given value. + * @method CarbonImmutable millis(int $value) Set current instance millisecond to the given value. + * @method CarbonImmutable milli(int $value) Set current instance millisecond to the given value. + * @method CarbonImmutable setMillis(int $value) Set current instance millisecond to the given value. + * @method CarbonImmutable setMilli(int $value) Set current instance millisecond to the given value. + * @method CarbonImmutable milliseconds(int $value) Set current instance millisecond to the given value. + * @method CarbonImmutable millisecond(int $value) Set current instance millisecond to the given value. + * @method CarbonImmutable setMilliseconds(int $value) Set current instance millisecond to the given value. + * @method CarbonImmutable setMillisecond(int $value) Set current instance millisecond to the given value. + * @method CarbonImmutable micros(int $value) Set current instance microsecond to the given value. + * @method CarbonImmutable micro(int $value) Set current instance microsecond to the given value. + * @method CarbonImmutable setMicros(int $value) Set current instance microsecond to the given value. + * @method CarbonImmutable setMicro(int $value) Set current instance microsecond to the given value. + * @method CarbonImmutable microseconds(int $value) Set current instance microsecond to the given value. + * @method CarbonImmutable microsecond(int $value) Set current instance microsecond to the given value. + * @method CarbonImmutable setMicroseconds(int $value) Set current instance microsecond to the given value. + * @method CarbonImmutable setMicrosecond(int $value) Set current instance microsecond to the given value. + * @method CarbonImmutable addYears(int $value = 1) Add years (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addYear() Add one year to the instance (using date interval). + * @method CarbonImmutable subYears(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subYear() Sub one year to the instance (using date interval). + * @method CarbonImmutable addYearsWithOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subYearsWithOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addYearsWithoutOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subYearsWithoutOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addYearsWithNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subYearsWithNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addYearsNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subYearsNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMonths(int $value = 1) Add months (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addMonth() Add one month to the instance (using date interval). + * @method CarbonImmutable subMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subMonth() Sub one month to the instance (using date interval). + * @method CarbonImmutable addMonthsWithOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subMonthsWithOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addMonthsWithoutOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMonthsWithoutOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMonthsWithNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMonthsWithNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMonthsNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMonthsNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addDays(int $value = 1) Add days (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addDay() Add one day to the instance (using date interval). + * @method CarbonImmutable subDays(int $value = 1) Sub days (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subDay() Sub one day to the instance (using date interval). + * @method CarbonImmutable addHours(int $value = 1) Add hours (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addHour() Add one hour to the instance (using date interval). + * @method CarbonImmutable subHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subHour() Sub one hour to the instance (using date interval). + * @method CarbonImmutable addMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addMinute() Add one minute to the instance (using date interval). + * @method CarbonImmutable subMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subMinute() Sub one minute to the instance (using date interval). + * @method CarbonImmutable addSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addSecond() Add one second to the instance (using date interval). + * @method CarbonImmutable subSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subSecond() Sub one second to the instance (using date interval). + * @method CarbonImmutable addMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addMilli() Add one millisecond to the instance (using date interval). + * @method CarbonImmutable subMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subMilli() Sub one millisecond to the instance (using date interval). + * @method CarbonImmutable addMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addMillisecond() Add one millisecond to the instance (using date interval). + * @method CarbonImmutable subMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subMillisecond() Sub one millisecond to the instance (using date interval). + * @method CarbonImmutable addMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addMicro() Add one microsecond to the instance (using date interval). + * @method CarbonImmutable subMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subMicro() Sub one microsecond to the instance (using date interval). + * @method CarbonImmutable addMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addMicrosecond() Add one microsecond to the instance (using date interval). + * @method CarbonImmutable subMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subMicrosecond() Sub one microsecond to the instance (using date interval). + * @method CarbonImmutable addMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addMillennium() Add one millennium to the instance (using date interval). + * @method CarbonImmutable subMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subMillennium() Sub one millennium to the instance (using date interval). + * @method CarbonImmutable addMillenniaWithOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subMillenniaWithOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addMillenniaWithoutOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMillenniaWithoutOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMillenniaWithNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMillenniaWithNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMillenniaNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMillenniaNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addCentury() Add one century to the instance (using date interval). + * @method CarbonImmutable subCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subCentury() Sub one century to the instance (using date interval). + * @method CarbonImmutable addCenturiesWithOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subCenturiesWithOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addCenturiesWithoutOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subCenturiesWithoutOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addCenturiesWithNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subCenturiesWithNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addCenturiesNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subCenturiesNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addDecade() Add one decade to the instance (using date interval). + * @method CarbonImmutable subDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subDecade() Sub one decade to the instance (using date interval). + * @method CarbonImmutable addDecadesWithOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subDecadesWithOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addDecadesWithoutOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subDecadesWithoutOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addDecadesWithNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subDecadesWithNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addDecadesNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subDecadesNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addQuarter() Add one quarter to the instance (using date interval). + * @method CarbonImmutable subQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subQuarter() Sub one quarter to the instance (using date interval). + * @method CarbonImmutable addQuartersWithOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subQuartersWithOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonImmutable addQuartersWithoutOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subQuartersWithoutOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addQuartersWithNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subQuartersWithNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addQuartersNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subQuartersNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonImmutable addWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addWeek() Add one week to the instance (using date interval). + * @method CarbonImmutable subWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subWeek() Sub one week to the instance (using date interval). + * @method CarbonImmutable addWeekdays(int $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable addWeekday() Add one weekday to the instance (using date interval). + * @method CarbonImmutable subWeekdays(int $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). + * @method CarbonImmutable subWeekday() Sub one weekday to the instance (using date interval). + * @method CarbonImmutable addRealMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addRealMicro() Add one microsecond to the instance (using timestamp). + * @method CarbonImmutable subRealMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subRealMicro() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method CarbonImmutable addRealMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addRealMicrosecond() Add one microsecond to the instance (using timestamp). + * @method CarbonImmutable subRealMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subRealMicrosecond() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method CarbonImmutable addRealMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addRealMilli() Add one millisecond to the instance (using timestamp). + * @method CarbonImmutable subRealMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subRealMilli() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method CarbonImmutable addRealMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addRealMillisecond() Add one millisecond to the instance (using timestamp). + * @method CarbonImmutable subRealMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subRealMillisecond() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method CarbonImmutable addRealSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addRealSecond() Add one second to the instance (using timestamp). + * @method CarbonImmutable subRealSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subRealSecond() Sub one second to the instance (using timestamp). + * @method CarbonPeriod secondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. + * @method CarbonImmutable addRealMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addRealMinute() Add one minute to the instance (using timestamp). + * @method CarbonImmutable subRealMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subRealMinute() Sub one minute to the instance (using timestamp). + * @method CarbonPeriod minutesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. + * @method CarbonImmutable addRealHours(int $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addRealHour() Add one hour to the instance (using timestamp). + * @method CarbonImmutable subRealHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subRealHour() Sub one hour to the instance (using timestamp). + * @method CarbonPeriod hoursUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. + * @method CarbonImmutable addRealDays(int $value = 1) Add days (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addRealDay() Add one day to the instance (using timestamp). + * @method CarbonImmutable subRealDays(int $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subRealDay() Sub one day to the instance (using timestamp). + * @method CarbonPeriod daysUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. + * @method CarbonImmutable addRealWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addRealWeek() Add one week to the instance (using timestamp). + * @method CarbonImmutable subRealWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subRealWeek() Sub one week to the instance (using timestamp). + * @method CarbonPeriod weeksUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. + * @method CarbonImmutable addRealMonths(int $value = 1) Add months (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addRealMonth() Add one month to the instance (using timestamp). + * @method CarbonImmutable subRealMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subRealMonth() Sub one month to the instance (using timestamp). + * @method CarbonPeriod monthsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. + * @method CarbonImmutable addRealQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addRealQuarter() Add one quarter to the instance (using timestamp). + * @method CarbonImmutable subRealQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subRealQuarter() Sub one quarter to the instance (using timestamp). + * @method CarbonPeriod quartersUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. + * @method CarbonImmutable addRealYears(int $value = 1) Add years (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addRealYear() Add one year to the instance (using timestamp). + * @method CarbonImmutable subRealYears(int $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subRealYear() Sub one year to the instance (using timestamp). + * @method CarbonPeriod yearsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. + * @method CarbonImmutable addRealDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addRealDecade() Add one decade to the instance (using timestamp). + * @method CarbonImmutable subRealDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subRealDecade() Sub one decade to the instance (using timestamp). + * @method CarbonPeriod decadesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. + * @method CarbonImmutable addRealCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addRealCentury() Add one century to the instance (using timestamp). + * @method CarbonImmutable subRealCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subRealCentury() Sub one century to the instance (using timestamp). + * @method CarbonPeriod centuriesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. + * @method CarbonImmutable addRealMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable addRealMillennium() Add one millennium to the instance (using timestamp). + * @method CarbonImmutable subRealMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). + * @method CarbonImmutable subRealMillennium() Sub one millennium to the instance (using timestamp). + * @method CarbonPeriod millenniaUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. + * @method CarbonImmutable roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method CarbonImmutable roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method CarbonImmutable floorYear(float $precision = 1) Truncate the current instance year with given precision. + * @method CarbonImmutable floorYears(float $precision = 1) Truncate the current instance year with given precision. + * @method CarbonImmutable ceilYear(float $precision = 1) Ceil the current instance year with given precision. + * @method CarbonImmutable ceilYears(float $precision = 1) Ceil the current instance year with given precision. + * @method CarbonImmutable roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method CarbonImmutable roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method CarbonImmutable floorMonth(float $precision = 1) Truncate the current instance month with given precision. + * @method CarbonImmutable floorMonths(float $precision = 1) Truncate the current instance month with given precision. + * @method CarbonImmutable ceilMonth(float $precision = 1) Ceil the current instance month with given precision. + * @method CarbonImmutable ceilMonths(float $precision = 1) Ceil the current instance month with given precision. + * @method CarbonImmutable roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method CarbonImmutable roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method CarbonImmutable floorDay(float $precision = 1) Truncate the current instance day with given precision. + * @method CarbonImmutable floorDays(float $precision = 1) Truncate the current instance day with given precision. + * @method CarbonImmutable ceilDay(float $precision = 1) Ceil the current instance day with given precision. + * @method CarbonImmutable ceilDays(float $precision = 1) Ceil the current instance day with given precision. + * @method CarbonImmutable roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method CarbonImmutable roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method CarbonImmutable floorHour(float $precision = 1) Truncate the current instance hour with given precision. + * @method CarbonImmutable floorHours(float $precision = 1) Truncate the current instance hour with given precision. + * @method CarbonImmutable ceilHour(float $precision = 1) Ceil the current instance hour with given precision. + * @method CarbonImmutable ceilHours(float $precision = 1) Ceil the current instance hour with given precision. + * @method CarbonImmutable roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method CarbonImmutable roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method CarbonImmutable floorMinute(float $precision = 1) Truncate the current instance minute with given precision. + * @method CarbonImmutable floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. + * @method CarbonImmutable ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. + * @method CarbonImmutable ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. + * @method CarbonImmutable roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method CarbonImmutable roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method CarbonImmutable floorSecond(float $precision = 1) Truncate the current instance second with given precision. + * @method CarbonImmutable floorSeconds(float $precision = 1) Truncate the current instance second with given precision. + * @method CarbonImmutable ceilSecond(float $precision = 1) Ceil the current instance second with given precision. + * @method CarbonImmutable ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. + * @method CarbonImmutable roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method CarbonImmutable roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method CarbonImmutable floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. + * @method CarbonImmutable floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. + * @method CarbonImmutable ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. + * @method CarbonImmutable ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. + * @method CarbonImmutable roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method CarbonImmutable roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method CarbonImmutable floorCentury(float $precision = 1) Truncate the current instance century with given precision. + * @method CarbonImmutable floorCenturies(float $precision = 1) Truncate the current instance century with given precision. + * @method CarbonImmutable ceilCentury(float $precision = 1) Ceil the current instance century with given precision. + * @method CarbonImmutable ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. + * @method CarbonImmutable roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method CarbonImmutable roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method CarbonImmutable floorDecade(float $precision = 1) Truncate the current instance decade with given precision. + * @method CarbonImmutable floorDecades(float $precision = 1) Truncate the current instance decade with given precision. + * @method CarbonImmutable ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. + * @method CarbonImmutable ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. + * @method CarbonImmutable roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method CarbonImmutable roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method CarbonImmutable floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. + * @method CarbonImmutable floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. + * @method CarbonImmutable ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. + * @method CarbonImmutable ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. + * @method CarbonImmutable roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method CarbonImmutable roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method CarbonImmutable floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method CarbonImmutable floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method CarbonImmutable ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method CarbonImmutable ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method CarbonImmutable roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method CarbonImmutable roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method CarbonImmutable floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method CarbonImmutable floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method CarbonImmutable ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method CarbonImmutable ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method static CarbonImmutable|false createFromFormat(string $format, string $time, string|DateTimeZone $timezone = null) Parse a string into a new CarbonImmutable object according to the specified format. + * @method static CarbonImmutable __set_state(array $array) https://php.net/manual/en/datetime.set-state.php + * + * </autodoc> + */ +class CarbonImmutable extends DateTimeImmutable implements CarbonInterface +{ + use Date { + __clone as dateTraitClone; + } + + public function __clone() + { + $this->dateTraitClone(); + $this->endOfTime = false; + $this->startOfTime = false; + } + + /** + * Create a very old date representing start of time. + * + * @return static + */ + public static function startOfTime(): self + { + $date = static::parse('0001-01-01')->years(self::getStartOfTimeYear()); + $date->startOfTime = true; + + return $date; + } + + /** + * Create a very far date representing end of time. + * + * @return static + */ + public static function endOfTime(): self + { + $date = static::parse('9999-12-31 23:59:59.999999')->years(self::getEndOfTimeYear()); + $date->endOfTime = true; + + return $date; + } + + /** + * @codeCoverageIgnore + */ + private static function getEndOfTimeYear(): int + { + if (version_compare(PHP_VERSION, '7.3.0-dev', '<')) { + return 145261681241552; + } + + // Remove if https://bugs.php.net/bug.php?id=81107 is fixed + if (version_compare(PHP_VERSION, '8.1.0-dev', '>=')) { + return 1118290769066902787; + } + + return PHP_INT_MAX; + } + + /** + * @codeCoverageIgnore + */ + private static function getStartOfTimeYear(): int + { + if (version_compare(PHP_VERSION, '7.3.0-dev', '<')) { + return -135908816449551; + } + + // Remove if https://bugs.php.net/bug.php?id=81107 is fixed + if (version_compare(PHP_VERSION, '8.1.0-dev', '>=')) { + return -1118290769066898816; + } + + return max(PHP_INT_MIN, -9223372036854773760); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php b/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php new file mode 100644 index 0000000..c3db850 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php @@ -0,0 +1,5078 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon; + +use BadMethodCallException; +use Carbon\Exceptions\BadComparisonUnitException; +use Carbon\Exceptions\ImmutableException; +use Carbon\Exceptions\InvalidDateException; +use Carbon\Exceptions\InvalidFormatException; +use Carbon\Exceptions\UnknownGetterException; +use Carbon\Exceptions\UnknownMethodException; +use Carbon\Exceptions\UnknownSetterException; +use Closure; +use DateInterval; +use DateTime; +use DateTimeImmutable; +use DateTimeInterface; +use DateTimeZone; +use JsonSerializable; +use ReflectionException; +use ReturnTypeWillChange; +use Symfony\Component\Translation\TranslatorInterface; +use Throwable; + +/** + * Common interface for Carbon and CarbonImmutable. + * + * <autodoc generated by `composer phpdoc`> + * + * @property int $year + * @property int $yearIso + * @property int $month + * @property int $day + * @property int $hour + * @property int $minute + * @property int $second + * @property int $micro + * @property int $microsecond + * @property int|float|string $timestamp seconds since the Unix Epoch + * @property string $englishDayOfWeek the day of week in English + * @property string $shortEnglishDayOfWeek the abbreviated day of week in English + * @property string $englishMonth the month in English + * @property string $shortEnglishMonth the abbreviated month in English + * @property int $milliseconds + * @property int $millisecond + * @property int $milli + * @property int $week 1 through 53 + * @property int $isoWeek 1 through 53 + * @property int $weekYear year according to week format + * @property int $isoWeekYear year according to ISO week format + * @property int $dayOfYear 1 through 366 + * @property int $age does a diffInYears() with default parameters + * @property int $offset the timezone offset in seconds from UTC + * @property int $offsetMinutes the timezone offset in minutes from UTC + * @property int $offsetHours the timezone offset in hours from UTC + * @property CarbonTimeZone $timezone the current timezone + * @property CarbonTimeZone $tz alias of $timezone + * @property-read int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) + * @property-read int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) + * @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday + * @property-read int $daysInMonth number of days in the given month + * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) + * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) + * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name + * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName + * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read int $noZeroHour current hour from 1 to 24 + * @property-read int $weeksInYear 51 through 53 + * @property-read int $isoWeeksInYear 51 through 53 + * @property-read int $weekOfMonth 1 through 5 + * @property-read int $weekNumberInMonth 1 through 5 + * @property-read int $firstWeekDay 0 through 6 + * @property-read int $lastWeekDay 0 through 6 + * @property-read int $daysInYear 365 or 366 + * @property-read int $quarter the quarter of this instance, 1 - 4 + * @property-read int $decade the decade of this instance + * @property-read int $century the century of this instance + * @property-read int $millennium the millennium of this instance + * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise + * @property-read bool $local checks if the timezone is local, true if local, false otherwise + * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise + * @property-read string $timezoneName the current timezone name + * @property-read string $tzName alias of $timezoneName + * @property-read string $locale locale of the current instance + * + * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) + * @method bool isLocal() Check if the current instance has non-UTC timezone. + * @method bool isValid() Check if the current instance is a valid date. + * @method bool isDST() Check if the current instance is in a daylight saving time. + * @method bool isSunday() Checks if the instance day is sunday. + * @method bool isMonday() Checks if the instance day is monday. + * @method bool isTuesday() Checks if the instance day is tuesday. + * @method bool isWednesday() Checks if the instance day is wednesday. + * @method bool isThursday() Checks if the instance day is thursday. + * @method bool isFriday() Checks if the instance day is friday. + * @method bool isSaturday() Checks if the instance day is saturday. + * @method bool isSameYear(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. + * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. + * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. + * @method bool isSameWeek(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. + * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. + * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. + * @method bool isSameDay(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. + * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. + * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. + * @method bool isSameHour(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. + * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. + * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. + * @method bool isSameMinute(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. + * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. + * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. + * @method bool isSameSecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. + * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. + * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. + * @method bool isSameMicro(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isSameMicrosecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. + * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. + * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. + * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. + * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. + * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. + * @method bool isSameDecade(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. + * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. + * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. + * @method bool isSameCentury(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. + * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. + * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. + * @method bool isSameMillennium(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. + * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. + * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. + * @method CarbonInterface years(int $value) Set current instance year to the given value. + * @method CarbonInterface year(int $value) Set current instance year to the given value. + * @method CarbonInterface setYears(int $value) Set current instance year to the given value. + * @method CarbonInterface setYear(int $value) Set current instance year to the given value. + * @method CarbonInterface months(int $value) Set current instance month to the given value. + * @method CarbonInterface month(int $value) Set current instance month to the given value. + * @method CarbonInterface setMonths(int $value) Set current instance month to the given value. + * @method CarbonInterface setMonth(int $value) Set current instance month to the given value. + * @method CarbonInterface days(int $value) Set current instance day to the given value. + * @method CarbonInterface day(int $value) Set current instance day to the given value. + * @method CarbonInterface setDays(int $value) Set current instance day to the given value. + * @method CarbonInterface setDay(int $value) Set current instance day to the given value. + * @method CarbonInterface hours(int $value) Set current instance hour to the given value. + * @method CarbonInterface hour(int $value) Set current instance hour to the given value. + * @method CarbonInterface setHours(int $value) Set current instance hour to the given value. + * @method CarbonInterface setHour(int $value) Set current instance hour to the given value. + * @method CarbonInterface minutes(int $value) Set current instance minute to the given value. + * @method CarbonInterface minute(int $value) Set current instance minute to the given value. + * @method CarbonInterface setMinutes(int $value) Set current instance minute to the given value. + * @method CarbonInterface setMinute(int $value) Set current instance minute to the given value. + * @method CarbonInterface seconds(int $value) Set current instance second to the given value. + * @method CarbonInterface second(int $value) Set current instance second to the given value. + * @method CarbonInterface setSeconds(int $value) Set current instance second to the given value. + * @method CarbonInterface setSecond(int $value) Set current instance second to the given value. + * @method CarbonInterface millis(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface milli(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface setMillis(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface setMilli(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface milliseconds(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface millisecond(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface setMilliseconds(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface setMillisecond(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface micros(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface micro(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface setMicros(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface setMicro(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface microseconds(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface microsecond(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface setMicroseconds(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface setMicrosecond(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface addYears(int $value = 1) Add years (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addYear() Add one year to the instance (using date interval). + * @method CarbonInterface subYears(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subYear() Sub one year to the instance (using date interval). + * @method CarbonInterface addYearsWithOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subYearsWithOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addYearsWithoutOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearsWithoutOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearsWithNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearsWithNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearsNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearsNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonths(int $value = 1) Add months (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMonth() Add one month to the instance (using date interval). + * @method CarbonInterface subMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMonth() Sub one month to the instance (using date interval). + * @method CarbonInterface addMonthsWithOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subMonthsWithOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addMonthsWithoutOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthsWithoutOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthsWithNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthsWithNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthsNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthsNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDays(int $value = 1) Add days (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addDay() Add one day to the instance (using date interval). + * @method CarbonInterface subDays(int $value = 1) Sub days (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subDay() Sub one day to the instance (using date interval). + * @method CarbonInterface addHours(int $value = 1) Add hours (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addHour() Add one hour to the instance (using date interval). + * @method CarbonInterface subHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subHour() Sub one hour to the instance (using date interval). + * @method CarbonInterface addMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMinute() Add one minute to the instance (using date interval). + * @method CarbonInterface subMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMinute() Sub one minute to the instance (using date interval). + * @method CarbonInterface addSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addSecond() Add one second to the instance (using date interval). + * @method CarbonInterface subSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subSecond() Sub one second to the instance (using date interval). + * @method CarbonInterface addMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMilli() Add one millisecond to the instance (using date interval). + * @method CarbonInterface subMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMilli() Sub one millisecond to the instance (using date interval). + * @method CarbonInterface addMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMillisecond() Add one millisecond to the instance (using date interval). + * @method CarbonInterface subMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMillisecond() Sub one millisecond to the instance (using date interval). + * @method CarbonInterface addMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMicro() Add one microsecond to the instance (using date interval). + * @method CarbonInterface subMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMicro() Sub one microsecond to the instance (using date interval). + * @method CarbonInterface addMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMicrosecond() Add one microsecond to the instance (using date interval). + * @method CarbonInterface subMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMicrosecond() Sub one microsecond to the instance (using date interval). + * @method CarbonInterface addMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMillennium() Add one millennium to the instance (using date interval). + * @method CarbonInterface subMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMillennium() Sub one millennium to the instance (using date interval). + * @method CarbonInterface addMillenniaWithOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subMillenniaWithOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addMillenniaWithoutOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniaWithoutOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniaWithNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniaWithNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniaNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniaNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addCentury() Add one century to the instance (using date interval). + * @method CarbonInterface subCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subCentury() Sub one century to the instance (using date interval). + * @method CarbonInterface addCenturiesWithOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subCenturiesWithOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addCenturiesWithoutOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturiesWithoutOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturiesWithNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturiesWithNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturiesNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturiesNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addDecade() Add one decade to the instance (using date interval). + * @method CarbonInterface subDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subDecade() Sub one decade to the instance (using date interval). + * @method CarbonInterface addDecadesWithOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subDecadesWithOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addDecadesWithoutOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadesWithoutOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadesWithNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadesWithNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadesNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadesNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addQuarter() Add one quarter to the instance (using date interval). + * @method CarbonInterface subQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subQuarter() Sub one quarter to the instance (using date interval). + * @method CarbonInterface addQuartersWithOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subQuartersWithOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addQuartersWithoutOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuartersWithoutOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuartersWithNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuartersWithNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuartersNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuartersNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addWeek() Add one week to the instance (using date interval). + * @method CarbonInterface subWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subWeek() Sub one week to the instance (using date interval). + * @method CarbonInterface addWeekdays(int $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addWeekday() Add one weekday to the instance (using date interval). + * @method CarbonInterface subWeekdays(int $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subWeekday() Sub one weekday to the instance (using date interval). + * @method CarbonInterface addRealMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealMicro() Add one microsecond to the instance (using timestamp). + * @method CarbonInterface subRealMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealMicro() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method CarbonInterface addRealMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealMicrosecond() Add one microsecond to the instance (using timestamp). + * @method CarbonInterface subRealMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealMicrosecond() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method CarbonInterface addRealMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealMilli() Add one millisecond to the instance (using timestamp). + * @method CarbonInterface subRealMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealMilli() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method CarbonInterface addRealMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealMillisecond() Add one millisecond to the instance (using timestamp). + * @method CarbonInterface subRealMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealMillisecond() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method CarbonInterface addRealSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealSecond() Add one second to the instance (using timestamp). + * @method CarbonInterface subRealSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealSecond() Sub one second to the instance (using timestamp). + * @method CarbonPeriod secondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. + * @method CarbonInterface addRealMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealMinute() Add one minute to the instance (using timestamp). + * @method CarbonInterface subRealMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealMinute() Sub one minute to the instance (using timestamp). + * @method CarbonPeriod minutesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. + * @method CarbonInterface addRealHours(int $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealHour() Add one hour to the instance (using timestamp). + * @method CarbonInterface subRealHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealHour() Sub one hour to the instance (using timestamp). + * @method CarbonPeriod hoursUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. + * @method CarbonInterface addRealDays(int $value = 1) Add days (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealDay() Add one day to the instance (using timestamp). + * @method CarbonInterface subRealDays(int $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealDay() Sub one day to the instance (using timestamp). + * @method CarbonPeriod daysUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. + * @method CarbonInterface addRealWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealWeek() Add one week to the instance (using timestamp). + * @method CarbonInterface subRealWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealWeek() Sub one week to the instance (using timestamp). + * @method CarbonPeriod weeksUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. + * @method CarbonInterface addRealMonths(int $value = 1) Add months (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealMonth() Add one month to the instance (using timestamp). + * @method CarbonInterface subRealMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealMonth() Sub one month to the instance (using timestamp). + * @method CarbonPeriod monthsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. + * @method CarbonInterface addRealQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealQuarter() Add one quarter to the instance (using timestamp). + * @method CarbonInterface subRealQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealQuarter() Sub one quarter to the instance (using timestamp). + * @method CarbonPeriod quartersUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. + * @method CarbonInterface addRealYears(int $value = 1) Add years (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealYear() Add one year to the instance (using timestamp). + * @method CarbonInterface subRealYears(int $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealYear() Sub one year to the instance (using timestamp). + * @method CarbonPeriod yearsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. + * @method CarbonInterface addRealDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealDecade() Add one decade to the instance (using timestamp). + * @method CarbonInterface subRealDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealDecade() Sub one decade to the instance (using timestamp). + * @method CarbonPeriod decadesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. + * @method CarbonInterface addRealCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealCentury() Add one century to the instance (using timestamp). + * @method CarbonInterface subRealCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealCentury() Sub one century to the instance (using timestamp). + * @method CarbonPeriod centuriesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. + * @method CarbonInterface addRealMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealMillennium() Add one millennium to the instance (using timestamp). + * @method CarbonInterface subRealMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealMillennium() Sub one millennium to the instance (using timestamp). + * @method CarbonPeriod millenniaUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. + * @method CarbonInterface roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method CarbonInterface roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method CarbonInterface floorYear(float $precision = 1) Truncate the current instance year with given precision. + * @method CarbonInterface floorYears(float $precision = 1) Truncate the current instance year with given precision. + * @method CarbonInterface ceilYear(float $precision = 1) Ceil the current instance year with given precision. + * @method CarbonInterface ceilYears(float $precision = 1) Ceil the current instance year with given precision. + * @method CarbonInterface roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method CarbonInterface roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method CarbonInterface floorMonth(float $precision = 1) Truncate the current instance month with given precision. + * @method CarbonInterface floorMonths(float $precision = 1) Truncate the current instance month with given precision. + * @method CarbonInterface ceilMonth(float $precision = 1) Ceil the current instance month with given precision. + * @method CarbonInterface ceilMonths(float $precision = 1) Ceil the current instance month with given precision. + * @method CarbonInterface roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method CarbonInterface roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method CarbonInterface floorDay(float $precision = 1) Truncate the current instance day with given precision. + * @method CarbonInterface floorDays(float $precision = 1) Truncate the current instance day with given precision. + * @method CarbonInterface ceilDay(float $precision = 1) Ceil the current instance day with given precision. + * @method CarbonInterface ceilDays(float $precision = 1) Ceil the current instance day with given precision. + * @method CarbonInterface roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method CarbonInterface roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method CarbonInterface floorHour(float $precision = 1) Truncate the current instance hour with given precision. + * @method CarbonInterface floorHours(float $precision = 1) Truncate the current instance hour with given precision. + * @method CarbonInterface ceilHour(float $precision = 1) Ceil the current instance hour with given precision. + * @method CarbonInterface ceilHours(float $precision = 1) Ceil the current instance hour with given precision. + * @method CarbonInterface roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method CarbonInterface roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method CarbonInterface floorMinute(float $precision = 1) Truncate the current instance minute with given precision. + * @method CarbonInterface floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. + * @method CarbonInterface ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. + * @method CarbonInterface ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. + * @method CarbonInterface roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method CarbonInterface roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method CarbonInterface floorSecond(float $precision = 1) Truncate the current instance second with given precision. + * @method CarbonInterface floorSeconds(float $precision = 1) Truncate the current instance second with given precision. + * @method CarbonInterface ceilSecond(float $precision = 1) Ceil the current instance second with given precision. + * @method CarbonInterface ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. + * @method CarbonInterface roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method CarbonInterface roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method CarbonInterface floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. + * @method CarbonInterface floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. + * @method CarbonInterface ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. + * @method CarbonInterface ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. + * @method CarbonInterface roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method CarbonInterface roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method CarbonInterface floorCentury(float $precision = 1) Truncate the current instance century with given precision. + * @method CarbonInterface floorCenturies(float $precision = 1) Truncate the current instance century with given precision. + * @method CarbonInterface ceilCentury(float $precision = 1) Ceil the current instance century with given precision. + * @method CarbonInterface ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. + * @method CarbonInterface roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method CarbonInterface roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method CarbonInterface floorDecade(float $precision = 1) Truncate the current instance decade with given precision. + * @method CarbonInterface floorDecades(float $precision = 1) Truncate the current instance decade with given precision. + * @method CarbonInterface ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. + * @method CarbonInterface ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. + * @method CarbonInterface roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method CarbonInterface roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method CarbonInterface floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. + * @method CarbonInterface floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. + * @method CarbonInterface ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. + * @method CarbonInterface ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. + * @method CarbonInterface roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method CarbonInterface roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method CarbonInterface floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method CarbonInterface floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method CarbonInterface ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method CarbonInterface ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method CarbonInterface roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method CarbonInterface roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method CarbonInterface floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method CarbonInterface floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method CarbonInterface ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method CarbonInterface ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * + * </autodoc> + */ +interface CarbonInterface extends DateTimeInterface, JsonSerializable +{ + /** + * Diff wording options(expressed in octal). + */ + public const NO_ZERO_DIFF = 01; + public const JUST_NOW = 02; + public const ONE_DAY_WORDS = 04; + public const TWO_DAY_WORDS = 010; + public const SEQUENTIAL_PARTS_ONLY = 020; + public const ROUND = 040; + public const FLOOR = 0100; + public const CEIL = 0200; + + /** + * Diff syntax options. + */ + public const DIFF_ABSOLUTE = 1; // backward compatibility with true + public const DIFF_RELATIVE_AUTO = 0; // backward compatibility with false + public const DIFF_RELATIVE_TO_NOW = 2; + public const DIFF_RELATIVE_TO_OTHER = 3; + + /** + * Translate string options. + */ + public const TRANSLATE_MONTHS = 1; + public const TRANSLATE_DAYS = 2; + public const TRANSLATE_UNITS = 4; + public const TRANSLATE_MERIDIEM = 8; + public const TRANSLATE_DIFF = 0x10; + public const TRANSLATE_ALL = self::TRANSLATE_MONTHS | self::TRANSLATE_DAYS | self::TRANSLATE_UNITS | self::TRANSLATE_MERIDIEM | self::TRANSLATE_DIFF; + + /** + * The day constants. + */ + public const SUNDAY = 0; + public const MONDAY = 1; + public const TUESDAY = 2; + public const WEDNESDAY = 3; + public const THURSDAY = 4; + public const FRIDAY = 5; + public const SATURDAY = 6; + + /** + * The month constants. + * These aren't used by Carbon itself but exist for + * convenience sake alone. + */ + public const JANUARY = 1; + public const FEBRUARY = 2; + public const MARCH = 3; + public const APRIL = 4; + public const MAY = 5; + public const JUNE = 6; + public const JULY = 7; + public const AUGUST = 8; + public const SEPTEMBER = 9; + public const OCTOBER = 10; + public const NOVEMBER = 11; + public const DECEMBER = 12; + + /** + * Number of X in Y. + */ + public const YEARS_PER_MILLENNIUM = 1000; + public const YEARS_PER_CENTURY = 100; + public const YEARS_PER_DECADE = 10; + public const MONTHS_PER_YEAR = 12; + public const MONTHS_PER_QUARTER = 3; + public const QUARTERS_PER_YEAR = 4; + public const WEEKS_PER_YEAR = 52; + public const WEEKS_PER_MONTH = 4; + public const DAYS_PER_YEAR = 365; + public const DAYS_PER_WEEK = 7; + public const HOURS_PER_DAY = 24; + public const MINUTES_PER_HOUR = 60; + public const SECONDS_PER_MINUTE = 60; + public const MILLISECONDS_PER_SECOND = 1000; + public const MICROSECONDS_PER_MILLISECOND = 1000; + public const MICROSECONDS_PER_SECOND = 1000000; + + /** + * Special settings to get the start of week from current locale culture. + */ + public const WEEK_DAY_AUTO = 'auto'; + + /** + * RFC7231 DateTime format. + * + * @var string + */ + public const RFC7231_FORMAT = 'D, d M Y H:i:s \G\M\T'; + + /** + * Default format to use for __toString method when type juggling occurs. + * + * @var string + */ + public const DEFAULT_TO_STRING_FORMAT = 'Y-m-d H:i:s'; + + /** + * Format for converting mocked time, includes microseconds. + * + * @var string + */ + public const MOCK_DATETIME_FORMAT = 'Y-m-d H:i:s.u'; + + /** + * Pattern detection for ->isoFormat and ::createFromIsoFormat. + * + * @var string + */ + public const ISO_FORMAT_REGEXP = '(O[YMDHhms]|[Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY?|g{1,5}|G{1,5}|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?)'; + + // <methods> + + /** + * Dynamically handle calls to the class. + * + * @param string $method magic method name called + * @param array $parameters parameters list + * + * @throws UnknownMethodException|BadMethodCallException|ReflectionException|Throwable + * + * @return mixed + */ + public function __call($method, $parameters); + + /** + * Dynamically handle calls to the class. + * + * @param string $method magic method name called + * @param array $parameters parameters list + * + * @throws BadMethodCallException + * + * @return mixed + */ + public static function __callStatic($method, $parameters); + + /** + * Update constructedObjectId on cloned. + */ + public function __clone(); + + /** + * Create a new Carbon instance. + * + * Please see the testing aids section (specifically static::setTestNow()) + * for more on the possibility of this constructor returning a test instance. + * + * @param DateTimeInterface|string|null $time + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + */ + public function __construct($time = null, $tz = null); + + /** + * Show truthy properties on var_dump(). + * + * @return array + */ + public function __debugInfo(); + + /** + * Get a part of the Carbon object + * + * @param string $name + * + * @throws UnknownGetterException + * + * @return string|int|bool|DateTimeZone|null + */ + public function __get($name); + + /** + * Check if an attribute exists on the object + * + * @param string $name + * + * @return bool + */ + public function __isset($name); + + /** + * Set a part of the Carbon object + * + * @param string $name + * @param string|int|DateTimeZone $value + * + * @throws UnknownSetterException|ReflectionException + * + * @return void + */ + public function __set($name, $value); + + /** + * The __set_state handler. + * + * @param string|array $dump + * + * @return static + */ + #[ReturnTypeWillChange] + public static function __set_state($dump); + + /** + * Returns the list of properties to dump on serialize() called on. + * + * @return array + */ + public function __sleep(); + + /** + * Format the instance as a string using the set format + * + * @example + * ``` + * echo Carbon::now(); // Carbon instances can be casted to string + * ``` + * + * @return string + */ + public function __toString(); + + /** + * Add given units or interval to the current instance. + * + * @example $date->add('hour', 3) + * @example $date->add(15, 'days') + * @example $date->add(CarbonInterval::days(4)) + * + * @param string|DateInterval|Closure|CarbonConverterInterface $unit + * @param int $value + * @param bool|null $overflow + * + * @return static + */ + #[ReturnTypeWillChange] + public function add($unit, $value = 1, $overflow = null); + + /** + * Add seconds to the instance using timestamp. Positive $value travels + * forward while negative $value travels into the past. + * + * @param string $unit + * @param int $value + * + * @return static + */ + public function addRealUnit($unit, $value = 1); + + /** + * Add given units to the current instance. + * + * @param string $unit + * @param int $value + * @param bool|null $overflow + * + * @return static + */ + public function addUnit($unit, $value = 1, $overflow = null); + + /** + * Add any unit to a new value without overflowing current other unit given. + * + * @param string $valueUnit unit name to modify + * @param int $value amount to add to the input unit + * @param string $overflowUnit unit name to not overflow + * + * @return static + */ + public function addUnitNoOverflow($valueUnit, $value, $overflowUnit); + + /** + * Get the difference in a human readable format in the current locale from an other + * instance given to now + * + * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: + * - 'syntax' entry (see below) + * - 'short' entry (see below) + * - 'parts' entry (see below) + * - 'options' entry (see below) + * - 'join' entry determines how to join multiple parts of the string + * ` - if $join is a string, it's used as a joiner glue + * ` - if $join is a callable/closure, it get the list of string and should return a string + * ` - if $join is an array, the first item will be the default glue, and the second item + * ` will be used instead of the glue for the last item + * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) + * ` - if $join is missing, a space will be used as glue + * if int passed, it add modifiers: + * Possible values: + * - CarbonInterface::DIFF_ABSOLUTE no modifiers + * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier + * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier + * Default value: CarbonInterface::DIFF_ABSOLUTE + * @param bool $short displays short format of time units + * @param int $parts maximum number of parts to display (default value: 1: single part) + * @param int $options human diff options + * + * @return string + */ + public function ago($syntax = null, $short = false, $parts = 1, $options = null); + + /** + * Modify the current instance to the average of a given instance (default now) and the current instance + * (second-precision). + * + * @param \Carbon\Carbon|\DateTimeInterface|null $date + * + * @return static + */ + public function average($date = null); + + /** + * Clone the current instance if it's mutable. + * + * This method is convenient to ensure you don't mutate the initial object + * but avoid to make a useless copy of it if it's already immutable. + * + * @return static + */ + public function avoidMutation(); + + /** + * Determines if the instance is between two others. + * + * The third argument allow you to specify if bounds are included or not (true by default) + * but for when you including/excluding bounds may produce different results in your application, + * we recommend to use the explicit methods ->betweenIncluded() or ->betweenExcluded() instead. + * + * @example + * ``` + * Carbon::parse('2018-07-25')->between('2018-07-14', '2018-08-01'); // true + * Carbon::parse('2018-07-25')->between('2018-08-01', '2018-08-20'); // false + * Carbon::parse('2018-07-25')->between('2018-07-25', '2018-08-01'); // true + * Carbon::parse('2018-07-25')->between('2018-07-25', '2018-08-01', false); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 + * @param bool $equal Indicates if an equal to comparison should be done + * + * @return bool + */ + public function between($date1, $date2, $equal = true): bool; + + /** + * Determines if the instance is between two others, bounds excluded. + * + * @example + * ``` + * Carbon::parse('2018-07-25')->betweenExcluded('2018-07-14', '2018-08-01'); // true + * Carbon::parse('2018-07-25')->betweenExcluded('2018-08-01', '2018-08-20'); // false + * Carbon::parse('2018-07-25')->betweenExcluded('2018-07-25', '2018-08-01'); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 + * + * @return bool + */ + public function betweenExcluded($date1, $date2): bool; + + /** + * Determines if the instance is between two others, bounds included. + * + * @example + * ``` + * Carbon::parse('2018-07-25')->betweenIncluded('2018-07-14', '2018-08-01'); // true + * Carbon::parse('2018-07-25')->betweenIncluded('2018-08-01', '2018-08-20'); // false + * Carbon::parse('2018-07-25')->betweenIncluded('2018-07-25', '2018-08-01'); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 + * + * @return bool + */ + public function betweenIncluded($date1, $date2): bool; + + /** + * Returns either day of week + time (e.g. "Last Friday at 3:30 PM") if reference time is within 7 days, + * or a calendar date (e.g. "10/29/2017") otherwise. + * + * Language, date and time formats will change according to the current locale. + * + * @param Carbon|\DateTimeInterface|string|null $referenceTime + * @param array $formats + * + * @return string + */ + public function calendar($referenceTime = null, array $formats = []); + + /** + * Checks if the (date)time string is in a given format and valid to create a + * new instance. + * + * @example + * ``` + * Carbon::canBeCreatedFromFormat('11:12:45', 'h:i:s'); // true + * Carbon::canBeCreatedFromFormat('13:12:45', 'h:i:s'); // false + * ``` + * + * @param string $date + * @param string $format + * + * @return bool + */ + public static function canBeCreatedFromFormat($date, $format); + + /** + * Return the Carbon instance passed through, a now instance in the same timezone + * if null given or parse the input if string given. + * + * @param Carbon|\Carbon\CarbonPeriod|\Carbon\CarbonInterval|\DateInterval|\DatePeriod|DateTimeInterface|string|null $date + * + * @return static + */ + public function carbonize($date = null); + + /** + * Cast the current instance into the given class. + * + * @param string $className The $className::instance() method will be called to cast the current object. + * + * @return DateTimeInterface + */ + public function cast(string $className); + + /** + * Ceil the current instance second with given precision if specified. + * + * @param float|int|string|\DateInterval|null $precision + * + * @return CarbonInterface + */ + public function ceil($precision = 1); + + /** + * Ceil the current instance at the given unit with given precision if specified. + * + * @param string $unit + * @param float|int $precision + * + * @return CarbonInterface + */ + public function ceilUnit($unit, $precision = 1); + + /** + * Ceil the current instance week. + * + * @param int $weekStartsAt optional start allow you to specify the day of week to use to start the week + * + * @return CarbonInterface + */ + public function ceilWeek($weekStartsAt = null); + + /** + * Similar to native modify() method of DateTime but can handle more grammars. + * + * @example + * ``` + * echo Carbon::now()->change('next 2pm'); + * ``` + * + * @link https://php.net/manual/en/datetime.modify.php + * + * @param string $modifier + * + * @return static + */ + public function change($modifier); + + /** + * Cleanup properties attached to the public scope of DateTime when a dump of the date is requested. + * foreach ($date as $_) {} + * serializer($date) + * var_export($date) + * get_object_vars($date) + */ + public function cleanupDumpProperties(); + + /** + * @alias copy + * + * Get a copy of the instance. + * + * @return static + */ + public function clone(); + + /** + * Get the closest date from the instance (second-precision). + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 + * + * @return static + */ + public function closest($date1, $date2); + + /** + * Get a copy of the instance. + * + * @return static + */ + public function copy(); + + /** + * Create a new Carbon instance from a specific date and time. + * + * If any of $year, $month or $day are set to null their now() values will + * be used. + * + * If $hour is null it will be set to its now() value and the default + * values for $minute and $second will be their now() values. + * + * If $hour is not null then the default values for $minute and $second + * will be 0. + * + * @param int|null $year + * @param int|null $month + * @param int|null $day + * @param int|null $hour + * @param int|null $minute + * @param int|null $second + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + * + * @return static|false + */ + public static function create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $tz = null); + + /** + * Create a Carbon instance from just a date. The time portion is set to now. + * + * @param int|null $year + * @param int|null $month + * @param int|null $day + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + * + * @return static + */ + public static function createFromDate($year = null, $month = null, $day = null, $tz = null); + + /** + * Create a Carbon instance from a specific format. + * + * @param string $format Datetime format + * @param string $time + * @param DateTimeZone|string|false|null $tz + * + * @throws InvalidFormatException + * + * @return static|false + */ + #[ReturnTypeWillChange] + public static function createFromFormat($format, $time, $tz = null); + + /** + * Create a Carbon instance from a specific ISO format (same replacements as ->isoFormat()). + * + * @param string $format Datetime format + * @param string $time + * @param DateTimeZone|string|false|null $tz optional timezone + * @param string|null $locale locale to be used for LTS, LT, LL, LLL, etc. macro-formats (en by fault, unneeded if no such macro-format in use) + * @param \Symfony\Component\Translation\TranslatorInterface $translator optional custom translator to use for macro-formats + * + * @throws InvalidFormatException + * + * @return static|false + */ + public static function createFromIsoFormat($format, $time, $tz = null, $locale = 'en', $translator = null); + + /** + * Create a Carbon instance from a specific format and a string in a given language. + * + * @param string $format Datetime format + * @param string $locale + * @param string $time + * @param DateTimeZone|string|false|null $tz + * + * @throws InvalidFormatException + * + * @return static|false + */ + public static function createFromLocaleFormat($format, $locale, $time, $tz = null); + + /** + * Create a Carbon instance from a specific ISO format and a string in a given language. + * + * @param string $format Datetime ISO format + * @param string $locale + * @param string $time + * @param DateTimeZone|string|false|null $tz + * + * @throws InvalidFormatException + * + * @return static|false + */ + public static function createFromLocaleIsoFormat($format, $locale, $time, $tz = null); + + /** + * Create a Carbon instance from just a time. The date portion is set to today. + * + * @param int|null $hour + * @param int|null $minute + * @param int|null $second + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + * + * @return static + */ + public static function createFromTime($hour = 0, $minute = 0, $second = 0, $tz = null); + + /** + * Create a Carbon instance from a time string. The date portion is set to today. + * + * @param string $time + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + * + * @return static + */ + public static function createFromTimeString($time, $tz = null); + + /** + * Create a Carbon instance from a timestamp and set the timezone (use default one if not specified). + * + * Timestamp input can be given as int, float or a string containing one or more numbers. + * + * @param float|int|string $timestamp + * @param \DateTimeZone|string|null $tz + * + * @return static + */ + public static function createFromTimestamp($timestamp, $tz = null); + + /** + * Create a Carbon instance from a timestamp in milliseconds. + * + * Timestamp input can be given as int, float or a string containing one or more numbers. + * + * @param float|int|string $timestamp + * @param \DateTimeZone|string|null $tz + * + * @return static + */ + public static function createFromTimestampMs($timestamp, $tz = null); + + /** + * Create a Carbon instance from a timestamp in milliseconds. + * + * Timestamp input can be given as int, float or a string containing one or more numbers. + * + * @param float|int|string $timestamp + * + * @return static + */ + public static function createFromTimestampMsUTC($timestamp); + + /** + * Create a Carbon instance from an timestamp keeping the timezone to UTC. + * + * Timestamp input can be given as int, float or a string containing one or more numbers. + * + * @param float|int|string $timestamp + * + * @return static + */ + public static function createFromTimestampUTC($timestamp); + + /** + * Create a Carbon instance from just a date. The time portion is set to midnight. + * + * @param int|null $year + * @param int|null $month + * @param int|null $day + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + * + * @return static + */ + public static function createMidnightDate($year = null, $month = null, $day = null, $tz = null); + + /** + * Create a new safe Carbon instance from a specific date and time. + * + * If any of $year, $month or $day are set to null their now() values will + * be used. + * + * If $hour is null it will be set to its now() value and the default + * values for $minute and $second will be their now() values. + * + * If $hour is not null then the default values for $minute and $second + * will be 0. + * + * If one of the set values is not valid, an InvalidDateException + * will be thrown. + * + * @param int|null $year + * @param int|null $month + * @param int|null $day + * @param int|null $hour + * @param int|null $minute + * @param int|null $second + * @param DateTimeZone|string|null $tz + * + * @throws InvalidDateException + * + * @return static|false + */ + public static function createSafe($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $tz = null); + + /** + * Create a new Carbon instance from a specific date and time using strict validation. + * + * @see create() + * + * @param int|null $year + * @param int|null $month + * @param int|null $day + * @param int|null $hour + * @param int|null $minute + * @param int|null $second + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + * + * @return static + */ + public static function createStrict(?int $year = 0, ?int $month = 1, ?int $day = 1, ?int $hour = 0, ?int $minute = 0, ?int $second = 0, $tz = null); + + /** + * Get/set the day of year. + * + * @param int|null $value new value for day of year if using as setter. + * + * @return static|int + */ + public function dayOfYear($value = null); + + /** + * Get the difference as a CarbonInterval instance. + * Return relative interval (negative if $absolute flag is not set to true and the given date is before + * current one). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return CarbonInterval + */ + public function diffAsCarbonInterval($date = null, $absolute = true); + + /** + * Get the difference by the given interval using a filter closure. + * + * @param CarbonInterval $ci An interval to traverse by + * @param Closure $callback + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffFiltered(CarbonInterval $ci, Closure $callback, $date = null, $absolute = true); + + /** + * Get the difference in a human readable format in the current locale from current instance to an other + * instance given (or now if null given). + * + * @example + * ``` + * echo Carbon::tomorrow()->diffForHumans() . "\n"; + * echo Carbon::tomorrow()->diffForHumans(['parts' => 2]) . "\n"; + * echo Carbon::tomorrow()->diffForHumans(['parts' => 3, 'join' => true]) . "\n"; + * echo Carbon::tomorrow()->diffForHumans(Carbon::yesterday()) . "\n"; + * echo Carbon::tomorrow()->diffForHumans(Carbon::yesterday(), ['short' => true]) . "\n"; + * ``` + * + * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; + * if null passed, now will be used as comparison reference; + * if any other type, it will be converted to date and used as reference. + * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: + * - 'syntax' entry (see below) + * - 'short' entry (see below) + * - 'parts' entry (see below) + * - 'options' entry (see below) + * - 'skip' entry, list of units to skip (array of strings or a single string, + * ` it can be the unit name (singular or plural) or its shortcut + * ` (y, m, w, d, h, min, s, ms, µs). + * - 'aUnit' entry, prefer "an hour" over "1 hour" if true + * - 'join' entry determines how to join multiple parts of the string + * ` - if $join is a string, it's used as a joiner glue + * ` - if $join is a callable/closure, it get the list of string and should return a string + * ` - if $join is an array, the first item will be the default glue, and the second item + * ` will be used instead of the glue for the last item + * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) + * ` - if $join is missing, a space will be used as glue + * - 'other' entry (see above) + * - 'minimumUnit' entry determines the smallest unit of time to display can be long or + * ` short form of the units, e.g. 'hour' or 'h' (default value: s) + * if int passed, it add modifiers: + * Possible values: + * - CarbonInterface::DIFF_ABSOLUTE no modifiers + * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier + * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier + * Default value: CarbonInterface::DIFF_ABSOLUTE + * @param bool $short displays short format of time units + * @param int $parts maximum number of parts to display (default value: 1: single unit) + * @param int $options human diff options + * + * @return string + */ + public function diffForHumans($other = null, $syntax = null, $short = false, $parts = 1, $options = null); + + /** + * Get the difference in days rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInDays($date = null, $absolute = true); + + /** + * Get the difference in days using a filter closure rounded down. + * + * @param Closure $callback + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInDaysFiltered(Closure $callback, $date = null, $absolute = true); + + /** + * Get the difference in hours rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInHours($date = null, $absolute = true); + + /** + * Get the difference in hours using a filter closure rounded down. + * + * @param Closure $callback + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInHoursFiltered(Closure $callback, $date = null, $absolute = true); + + /** + * Get the difference in microseconds. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInMicroseconds($date = null, $absolute = true); + + /** + * Get the difference in milliseconds rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInMilliseconds($date = null, $absolute = true); + + /** + * Get the difference in minutes rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInMinutes($date = null, $absolute = true); + + /** + * Get the difference in months rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInMonths($date = null, $absolute = true); + + /** + * Get the difference in quarters rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInQuarters($date = null, $absolute = true); + + /** + * Get the difference in hours rounded down using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInRealHours($date = null, $absolute = true); + + /** + * Get the difference in microseconds using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInRealMicroseconds($date = null, $absolute = true); + + /** + * Get the difference in milliseconds rounded down using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInRealMilliseconds($date = null, $absolute = true); + + /** + * Get the difference in minutes rounded down using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInRealMinutes($date = null, $absolute = true); + + /** + * Get the difference in seconds using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInRealSeconds($date = null, $absolute = true); + + /** + * Get the difference in seconds rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInSeconds($date = null, $absolute = true); + + /** + * Get the difference in weekdays rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInWeekdays($date = null, $absolute = true); + + /** + * Get the difference in weekend days using a filter rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInWeekendDays($date = null, $absolute = true); + + /** + * Get the difference in weeks rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInWeeks($date = null, $absolute = true); + + /** + * Get the difference in years + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInYears($date = null, $absolute = true); + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * @see settings + * + * @param int $humanDiffOption + */ + public static function disableHumanDiffOption($humanDiffOption); + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * @see settings + * + * @param int $humanDiffOption + */ + public static function enableHumanDiffOption($humanDiffOption); + + /** + * Modify to end of current given unit. + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16.334455') + * ->startOf('month') + * ->endOf('week', Carbon::FRIDAY); + * ``` + * + * @param string $unit + * @param array<int, mixed> $params + * + * @return static + */ + public function endOf($unit, ...$params); + + /** + * Resets the date to end of the century and time to 23:59:59.999999 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfCentury(); + * ``` + * + * @return static + */ + public function endOfCentury(); + + /** + * Resets the time to 23:59:59.999999 end of day + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfDay(); + * ``` + * + * @return static + */ + public function endOfDay(); + + /** + * Resets the date to end of the decade and time to 23:59:59.999999 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfDecade(); + * ``` + * + * @return static + */ + public function endOfDecade(); + + /** + * Modify to end of current hour, minutes and seconds become 59 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfHour(); + * ``` + * + * @return static + */ + public function endOfHour(); + + /** + * Resets the date to end of the millennium and time to 23:59:59.999999 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfMillennium(); + * ``` + * + * @return static + */ + public function endOfMillennium(); + + /** + * Modify to end of current minute, seconds become 59 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfMinute(); + * ``` + * + * @return static + */ + public function endOfMinute(); + + /** + * Resets the date to end of the month and time to 23:59:59.999999 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfMonth(); + * ``` + * + * @return static + */ + public function endOfMonth(); + + /** + * Resets the date to end of the quarter and time to 23:59:59.999999 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfQuarter(); + * ``` + * + * @return static + */ + public function endOfQuarter(); + + /** + * Modify to end of current second, microseconds become 999999 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16.334455') + * ->endOfSecond() + * ->format('H:i:s.u'); + * ``` + * + * @return static + */ + public function endOfSecond(); + + /** + * Resets the date to end of week (defined in $weekEndsAt) and time to 23:59:59.999999 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfWeek() . "\n"; + * echo Carbon::parse('2018-07-25 12:45:16')->locale('ar')->endOfWeek() . "\n"; + * echo Carbon::parse('2018-07-25 12:45:16')->endOfWeek(Carbon::SATURDAY) . "\n"; + * ``` + * + * @param int $weekEndsAt optional start allow you to specify the day of week to use to end the week + * + * @return static + */ + public function endOfWeek($weekEndsAt = null); + + /** + * Resets the date to end of the year and time to 23:59:59.999999 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfYear(); + * ``` + * + * @return static + */ + public function endOfYear(); + + /** + * Determines if the instance is equal to another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->eq('2018-07-25 12:45:16'); // true + * Carbon::parse('2018-07-25 12:45:16')->eq(Carbon::parse('2018-07-25 12:45:16')); // true + * Carbon::parse('2018-07-25 12:45:16')->eq('2018-07-25 12:45:17'); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see equalTo() + * + * @return bool + */ + public function eq($date): bool; + + /** + * Determines if the instance is equal to another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->equalTo('2018-07-25 12:45:16'); // true + * Carbon::parse('2018-07-25 12:45:16')->equalTo(Carbon::parse('2018-07-25 12:45:16')); // true + * Carbon::parse('2018-07-25 12:45:16')->equalTo('2018-07-25 12:45:17'); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @return bool + */ + public function equalTo($date): bool; + + /** + * Set the current locale to the given, execute the passed function, reset the locale to previous one, + * then return the result of the closure (or null if the closure was void). + * + * @param string $locale locale ex. en + * @param callable $func + * + * @return mixed + */ + public static function executeWithLocale($locale, $func); + + /** + * Get the farthest date from the instance (second-precision). + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 + * + * @return static + */ + public function farthest($date1, $date2); + + /** + * Modify to the first occurrence of a given day of the week + * in the current month. If no dayOfWeek is provided, modify to the + * first day of the current month. Use the supplied constants + * to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int|null $dayOfWeek + * + * @return static + */ + public function firstOfMonth($dayOfWeek = null); + + /** + * Modify to the first occurrence of a given day of the week + * in the current quarter. If no dayOfWeek is provided, modify to the + * first day of the current quarter. Use the supplied constants + * to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int|null $dayOfWeek day of the week default null + * + * @return static + */ + public function firstOfQuarter($dayOfWeek = null); + + /** + * Modify to the first occurrence of a given day of the week + * in the current year. If no dayOfWeek is provided, modify to the + * first day of the current year. Use the supplied constants + * to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int|null $dayOfWeek day of the week default null + * + * @return static + */ + public function firstOfYear($dayOfWeek = null); + + /** + * Get the difference in days as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInDays($date = null, $absolute = true); + + /** + * Get the difference in hours as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInHours($date = null, $absolute = true); + + /** + * Get the difference in minutes as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInMinutes($date = null, $absolute = true); + + /** + * Get the difference in months as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInMonths($date = null, $absolute = true); + + /** + * Get the difference in days as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInRealDays($date = null, $absolute = true); + + /** + * Get the difference in hours as float (microsecond-precision) using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInRealHours($date = null, $absolute = true); + + /** + * Get the difference in minutes as float (microsecond-precision) using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInRealMinutes($date = null, $absolute = true); + + /** + * Get the difference in months as float (microsecond-precision) using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInRealMonths($date = null, $absolute = true); + + /** + * Get the difference in seconds as float (microsecond-precision) using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInRealSeconds($date = null, $absolute = true); + + /** + * Get the difference in weeks as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInRealWeeks($date = null, $absolute = true); + + /** + * Get the difference in year as float (microsecond-precision) using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInRealYears($date = null, $absolute = true); + + /** + * Get the difference in seconds as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInSeconds($date = null, $absolute = true); + + /** + * Get the difference in weeks as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInWeeks($date = null, $absolute = true); + + /** + * Get the difference in year as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInYears($date = null, $absolute = true); + + /** + * Round the current instance second with given precision if specified. + * + * @param float|int|string|\DateInterval|null $precision + * + * @return CarbonInterface + */ + public function floor($precision = 1); + + /** + * Truncate the current instance at the given unit with given precision if specified. + * + * @param string $unit + * @param float|int $precision + * + * @return CarbonInterface + */ + public function floorUnit($unit, $precision = 1); + + /** + * Truncate the current instance week. + * + * @param int $weekStartsAt optional start allow you to specify the day of week to use to start the week + * + * @return CarbonInterface + */ + public function floorWeek($weekStartsAt = null); + + /** + * Format the instance with the current locale. You can set the current + * locale using setlocale() https://php.net/setlocale. + * + * @deprecated It uses OS language package and strftime() which is deprecated since PHP 8.1. + * Use ->isoFormat() instead. + * Deprecated since 2.55.0 + * + * @param string $format + * + * @return string + */ + public function formatLocalized($format); + + /** + * @alias diffForHumans + * + * Get the difference in a human readable format in the current locale from current instance to an other + * instance given (or now if null given). + * + * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; + * if null passed, now will be used as comparison reference; + * if any other type, it will be converted to date and used as reference. + * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: + * - 'syntax' entry (see below) + * - 'short' entry (see below) + * - 'parts' entry (see below) + * - 'options' entry (see below) + * - 'join' entry determines how to join multiple parts of the string + * ` - if $join is a string, it's used as a joiner glue + * ` - if $join is a callable/closure, it get the list of string and should return a string + * ` - if $join is an array, the first item will be the default glue, and the second item + * ` will be used instead of the glue for the last item + * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) + * ` - if $join is missing, a space will be used as glue + * - 'other' entry (see above) + * if int passed, it add modifiers: + * Possible values: + * - CarbonInterface::DIFF_ABSOLUTE no modifiers + * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier + * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier + * Default value: CarbonInterface::DIFF_ABSOLUTE + * @param bool $short displays short format of time units + * @param int $parts maximum number of parts to display (default value: 1: single unit) + * @param int $options human diff options + * + * @return string + */ + public function from($other = null, $syntax = null, $short = false, $parts = 1, $options = null); + + /** + * Get the difference in a human readable format in the current locale from current + * instance to now. + * + * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: + * - 'syntax' entry (see below) + * - 'short' entry (see below) + * - 'parts' entry (see below) + * - 'options' entry (see below) + * - 'join' entry determines how to join multiple parts of the string + * ` - if $join is a string, it's used as a joiner glue + * ` - if $join is a callable/closure, it get the list of string and should return a string + * ` - if $join is an array, the first item will be the default glue, and the second item + * ` will be used instead of the glue for the last item + * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) + * ` - if $join is missing, a space will be used as glue + * if int passed, it add modifiers: + * Possible values: + * - CarbonInterface::DIFF_ABSOLUTE no modifiers + * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier + * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier + * Default value: CarbonInterface::DIFF_ABSOLUTE + * @param bool $short displays short format of time units + * @param int $parts maximum number of parts to display (default value: 1: single unit) + * @param int $options human diff options + * + * @return string + */ + public function fromNow($syntax = null, $short = false, $parts = 1, $options = null); + + /** + * Create an instance from a serialized string. + * + * @param string $value + * + * @throws InvalidFormatException + * + * @return static + */ + public static function fromSerialized($value); + + /** + * Register a custom macro. + * + * @param object|callable $macro + * @param int $priority marco with higher priority is tried first + * + * @return void + */ + public static function genericMacro($macro, $priority = 0); + + /** + * Get a part of the Carbon object + * + * @param string $name + * + * @throws UnknownGetterException + * + * @return string|int|bool|DateTimeZone|null + */ + public function get($name); + + /** + * Returns the alternative number for a given date property if available in the current locale. + * + * @param string $key date property + * + * @return string + */ + public function getAltNumber(string $key): string; + + /** + * Returns the list of internally available locales and already loaded custom locales. + * (It will ignore custom translator dynamic loading.) + * + * @return array + */ + public static function getAvailableLocales(); + + /** + * Returns list of Language object for each available locale. This object allow you to get the ISO name, native + * name, region and variant of the locale. + * + * @return Language[] + */ + public static function getAvailableLocalesInfo(); + + /** + * Returns list of calendar formats for ISO formatting. + * + * @param string|null $locale current locale used if null + * + * @return array + */ + public function getCalendarFormats($locale = null); + + /** + * Get the days of the week + * + * @return array + */ + public static function getDays(); + + /** + * Get the fallback locale. + * + * @see https://symfony.com/doc/current/components/translation.html#fallback-locales + * + * @return string|null + */ + public static function getFallbackLocale(); + + /** + * List of replacements from date() format to isoFormat(). + * + * @return array + */ + public static function getFormatsToIsoReplacements(); + + /** + * Return default humanDiff() options (merged flags as integer). + * + * @return int + */ + public static function getHumanDiffOptions(); + + /** + * Returns list of locale formats for ISO formatting. + * + * @param string|null $locale current locale used if null + * + * @return array + */ + public function getIsoFormats($locale = null); + + /** + * Returns list of locale units for ISO formatting. + * + * @return array + */ + public static function getIsoUnits(); + + /** + * {@inheritdoc} + * + * @return array + */ + #[ReturnTypeWillChange] + public static function getLastErrors(); + + /** + * Get the raw callable macro registered globally or locally for a given name. + * + * @param string $name + * + * @return callable|null + */ + public function getLocalMacro($name); + + /** + * Get the translator of the current instance or the default if none set. + * + * @return \Symfony\Component\Translation\TranslatorInterface + */ + public function getLocalTranslator(); + + /** + * Get the current translator locale. + * + * @return string + */ + public static function getLocale(); + + /** + * Get the raw callable macro registered globally for a given name. + * + * @param string $name + * + * @return callable|null + */ + public static function getMacro($name); + + /** + * get midday/noon hour + * + * @return int + */ + public static function getMidDayAt(); + + /** + * Returns the offset hour and minute formatted with +/- and a given separator (":" by default). + * For example, if the time zone is 9 hours 30 minutes, you'll get "+09:30", with "@@" as first + * argument, "+09@@30", with "" as first argument, "+0930". Negative offset will return something + * like "-12:00". + * + * @param string $separator string to place between hours and minutes (":" by default) + * + * @return string + */ + public function getOffsetString($separator = ':'); + + /** + * Returns a unit of the instance padded with 0 by default or any other string if specified. + * + * @param string $unit Carbon unit name + * @param int $length Length of the output (2 by default) + * @param string $padString String to use for padding ("0" by default) + * @param int $padType Side(s) to pad (STR_PAD_LEFT by default) + * + * @return string + */ + public function getPaddedUnit($unit, $length = 2, $padString = '0', $padType = 0); + + /** + * Returns a timestamp rounded with the given precision (6 by default). + * + * @example getPreciseTimestamp() 1532087464437474 (microsecond maximum precision) + * @example getPreciseTimestamp(6) 1532087464437474 + * @example getPreciseTimestamp(5) 153208746443747 (1/100000 second precision) + * @example getPreciseTimestamp(4) 15320874644375 (1/10000 second precision) + * @example getPreciseTimestamp(3) 1532087464437 (millisecond precision) + * @example getPreciseTimestamp(2) 153208746444 (1/100 second precision) + * @example getPreciseTimestamp(1) 15320874644 (1/10 second precision) + * @example getPreciseTimestamp(0) 1532087464 (second precision) + * @example getPreciseTimestamp(-1) 153208746 (10 second precision) + * @example getPreciseTimestamp(-2) 15320875 (100 second precision) + * + * @param int $precision + * + * @return float + */ + public function getPreciseTimestamp($precision = 6); + + /** + * Returns current local settings. + * + * @return array + */ + public function getSettings(); + + /** + * Get the Carbon instance (real or mock) to be returned when a "now" + * instance is created. + * + * @return Closure|static the current instance used for testing + */ + public static function getTestNow(); + + /** + * Return a format from H:i to H:i:s.u according to given unit precision. + * + * @param string $unitPrecision "minute", "second", "millisecond" or "microsecond" + * + * @return string + */ + public static function getTimeFormatByPrecision($unitPrecision); + + /** + * Returns the timestamp with millisecond precision. + * + * @return int + */ + public function getTimestampMs(); + + /** + * Get the translation of the current week day name (with context for languages with multiple forms). + * + * @param string|null $context whole format string + * @param string $keySuffix "", "_short" or "_min" + * @param string|null $defaultValue default value if translation missing + * + * @return string + */ + public function getTranslatedDayName($context = null, $keySuffix = '', $defaultValue = null); + + /** + * Get the translation of the current abbreviated week day name (with context for languages with multiple forms). + * + * @param string|null $context whole format string + * + * @return string + */ + public function getTranslatedMinDayName($context = null); + + /** + * Get the translation of the current month day name (with context for languages with multiple forms). + * + * @param string|null $context whole format string + * @param string $keySuffix "" or "_short" + * @param string|null $defaultValue default value if translation missing + * + * @return string + */ + public function getTranslatedMonthName($context = null, $keySuffix = '', $defaultValue = null); + + /** + * Get the translation of the current short week day name (with context for languages with multiple forms). + * + * @param string|null $context whole format string + * + * @return string + */ + public function getTranslatedShortDayName($context = null); + + /** + * Get the translation of the current short month day name (with context for languages with multiple forms). + * + * @param string|null $context whole format string + * + * @return string + */ + public function getTranslatedShortMonthName($context = null); + + /** + * Returns raw translation message for a given key. + * + * @param string $key key to find + * @param string|null $locale current locale used if null + * @param string|null $default default value if translation returns the key + * @param \Symfony\Component\Translation\TranslatorInterface $translator an optional translator to use + * + * @return string + */ + public function getTranslationMessage(string $key, ?string $locale = null, ?string $default = null, $translator = null); + + /** + * Returns raw translation message for a given key. + * + * @param \Symfony\Component\Translation\TranslatorInterface $translator the translator to use + * @param string $key key to find + * @param string|null $locale current locale used if null + * @param string|null $default default value if translation returns the key + * + * @return string + */ + public static function getTranslationMessageWith($translator, string $key, ?string $locale = null, ?string $default = null); + + /** + * Get the default translator instance in use. + * + * @return \Symfony\Component\Translation\TranslatorInterface + */ + public static function getTranslator(); + + /** + * Get the last day of week + * + * @return int + */ + public static function getWeekEndsAt(); + + /** + * Get the first day of week + * + * @return int + */ + public static function getWeekStartsAt(); + + /** + * Get weekend days + * + * @return array + */ + public static function getWeekendDays(); + + /** + * Determines if the instance is greater (after) than another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:15'); // true + * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:16'); // false + * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:17'); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @return bool + */ + public function greaterThan($date): bool; + + /** + * Determines if the instance is greater (after) than or equal to another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:15'); // true + * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:16'); // true + * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:17'); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @return bool + */ + public function greaterThanOrEqualTo($date): bool; + + /** + * Determines if the instance is greater (after) than another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:15'); // true + * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:16'); // false + * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:17'); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see greaterThan() + * + * @return bool + */ + public function gt($date): bool; + + /** + * Determines if the instance is greater (after) than or equal to another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:15'); // true + * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:16'); // true + * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:17'); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see greaterThanOrEqualTo() + * + * @return bool + */ + public function gte($date): bool; + + /** + * Checks if the (date)time string is in a given format. + * + * @example + * ``` + * Carbon::hasFormat('11:12:45', 'h:i:s'); // true + * Carbon::hasFormat('13:12:45', 'h:i:s'); // false + * ``` + * + * @param string $date + * @param string $format + * + * @return bool + */ + public static function hasFormat($date, $format); + + /** + * Checks if the (date)time string is in a given format. + * + * @example + * ``` + * Carbon::hasFormatWithModifiers('31/08/2015', 'd#m#Y'); // true + * Carbon::hasFormatWithModifiers('31/08/2015', 'm#d#Y'); // false + * ``` + * + * @param string $date + * @param string $format + * + * @return bool + */ + public static function hasFormatWithModifiers($date, $format): bool; + + /** + * Checks if macro is registered globally or locally. + * + * @param string $name + * + * @return bool + */ + public function hasLocalMacro($name); + + /** + * Return true if the current instance has its own translator. + * + * @return bool + */ + public function hasLocalTranslator(); + + /** + * Checks if macro is registered globally. + * + * @param string $name + * + * @return bool + */ + public static function hasMacro($name); + + /** + * Determine if a time string will produce a relative date. + * + * @param string $time + * + * @return bool true if time match a relative date, false if absolute or invalid time string + */ + public static function hasRelativeKeywords($time); + + /** + * Determine if there is a valid test instance set. A valid test instance + * is anything that is not null. + * + * @return bool true if there is a test instance, otherwise false + */ + public static function hasTestNow(); + + /** + * Create a Carbon instance from a DateTime one. + * + * @param DateTimeInterface $date + * + * @return static + */ + public static function instance($date); + + /** + * Returns true if the current date matches the given string. + * + * @example + * ``` + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019')); // true + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2018')); // false + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019-06')); // true + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('06-02')); // true + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019-06-02')); // true + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('Sunday')); // true + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('June')); // true + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23')); // true + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23:45')); // true + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23:00')); // false + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12h')); // true + * var_dump(Carbon::parse('2019-06-02 15:23:45')->is('3pm')); // true + * var_dump(Carbon::parse('2019-06-02 15:23:45')->is('3am')); // false + * ``` + * + * @param string $tester day name, month name, hour, date, etc. as string + * + * @return bool + */ + public function is(string $tester); + + /** + * Determines if the instance is greater (after) than another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:15'); // true + * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:16'); // false + * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:17'); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see greaterThan() + * + * @return bool + */ + public function isAfter($date): bool; + + /** + * Determines if the instance is less (before) than another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:15'); // false + * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:16'); // false + * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:17'); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see lessThan() + * + * @return bool + */ + public function isBefore($date): bool; + + /** + * Determines if the instance is between two others + * + * @example + * ``` + * Carbon::parse('2018-07-25')->isBetween('2018-07-14', '2018-08-01'); // true + * Carbon::parse('2018-07-25')->isBetween('2018-08-01', '2018-08-20'); // false + * Carbon::parse('2018-07-25')->isBetween('2018-07-25', '2018-08-01'); // true + * Carbon::parse('2018-07-25')->isBetween('2018-07-25', '2018-08-01', false); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 + * @param bool $equal Indicates if an equal to comparison should be done + * + * @return bool + */ + public function isBetween($date1, $date2, $equal = true): bool; + + /** + * Check if its the birthday. Compares the date/month values of the two dates. + * + * @example + * ``` + * Carbon::now()->subYears(5)->isBirthday(); // true + * Carbon::now()->subYears(5)->subDay()->isBirthday(); // false + * Carbon::parse('2019-06-05')->isBirthday(Carbon::parse('2001-06-05')); // true + * Carbon::parse('2019-06-05')->isBirthday(Carbon::parse('2001-06-06')); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|null $date The instance to compare with or null to use current day. + * + * @return bool + */ + public function isBirthday($date = null); + + /** + * Determines if the instance is in the current unit given. + * + * @example + * ``` + * Carbon::now()->isCurrentUnit('hour'); // true + * Carbon::now()->subHours(2)->isCurrentUnit('hour'); // false + * ``` + * + * @param string $unit The unit to test. + * + * @throws BadMethodCallException + * + * @return bool + */ + public function isCurrentUnit($unit); + + /** + * Checks if this day is a specific day of the week. + * + * @example + * ``` + * Carbon::parse('2019-07-17')->isDayOfWeek(Carbon::WEDNESDAY); // true + * Carbon::parse('2019-07-17')->isDayOfWeek(Carbon::FRIDAY); // false + * Carbon::parse('2019-07-17')->isDayOfWeek('Wednesday'); // true + * Carbon::parse('2019-07-17')->isDayOfWeek('Friday'); // false + * ``` + * + * @param int $dayOfWeek + * + * @return bool + */ + public function isDayOfWeek($dayOfWeek); + + /** + * Check if the instance is end of day. + * + * @example + * ``` + * Carbon::parse('2019-02-28 23:59:59.999999')->isEndOfDay(); // true + * Carbon::parse('2019-02-28 23:59:59.123456')->isEndOfDay(); // true + * Carbon::parse('2019-02-28 23:59:59')->isEndOfDay(); // true + * Carbon::parse('2019-02-28 23:59:58.999999')->isEndOfDay(); // false + * Carbon::parse('2019-02-28 23:59:59.999999')->isEndOfDay(true); // true + * Carbon::parse('2019-02-28 23:59:59.123456')->isEndOfDay(true); // false + * Carbon::parse('2019-02-28 23:59:59')->isEndOfDay(true); // false + * ``` + * + * @param bool $checkMicroseconds check time at microseconds precision + * + * @return bool + */ + public function isEndOfDay($checkMicroseconds = false); + + /** + * Returns true if the date was created using CarbonImmutable::endOfTime() + * + * @return bool + */ + public function isEndOfTime(): bool; + + /** + * Determines if the instance is in the future, ie. greater (after) than now. + * + * @example + * ``` + * Carbon::now()->addHours(5)->isFuture(); // true + * Carbon::now()->subHours(5)->isFuture(); // false + * ``` + * + * @return bool + */ + public function isFuture(); + + /** + * Returns true if the current class/instance is immutable. + * + * @return bool + */ + public static function isImmutable(); + + /** + * Check if today is the last day of the Month + * + * @example + * ``` + * Carbon::parse('2019-02-28')->isLastOfMonth(); // true + * Carbon::parse('2019-03-28')->isLastOfMonth(); // false + * Carbon::parse('2019-03-30')->isLastOfMonth(); // false + * Carbon::parse('2019-03-31')->isLastOfMonth(); // true + * Carbon::parse('2019-04-30')->isLastOfMonth(); // true + * ``` + * + * @return bool + */ + public function isLastOfMonth(); + + /** + * Determines if the instance is a leap year. + * + * @example + * ``` + * Carbon::parse('2020-01-01')->isLeapYear(); // true + * Carbon::parse('2019-01-01')->isLeapYear(); // false + * ``` + * + * @return bool + */ + public function isLeapYear(); + + /** + * Determines if the instance is a long year + * + * @example + * ``` + * Carbon::parse('2015-01-01')->isLongYear(); // true + * Carbon::parse('2016-01-01')->isLongYear(); // false + * ``` + * + * @see https://en.wikipedia.org/wiki/ISO_8601#Week_dates + * + * @return bool + */ + public function isLongYear(); + + /** + * Check if the instance is midday. + * + * @example + * ``` + * Carbon::parse('2019-02-28 11:59:59.999999')->isMidday(); // false + * Carbon::parse('2019-02-28 12:00:00')->isMidday(); // true + * Carbon::parse('2019-02-28 12:00:00.999999')->isMidday(); // true + * Carbon::parse('2019-02-28 12:00:01')->isMidday(); // false + * ``` + * + * @return bool + */ + public function isMidday(); + + /** + * Check if the instance is start of day / midnight. + * + * @example + * ``` + * Carbon::parse('2019-02-28 00:00:00')->isMidnight(); // true + * Carbon::parse('2019-02-28 00:00:00.999999')->isMidnight(); // true + * Carbon::parse('2019-02-28 00:00:01')->isMidnight(); // false + * ``` + * + * @return bool + */ + public function isMidnight(); + + /** + * Returns true if a property can be changed via setter. + * + * @param string $unit + * + * @return bool + */ + public static function isModifiableUnit($unit); + + /** + * Returns true if the current class/instance is mutable. + * + * @return bool + */ + public static function isMutable(); + + /** + * Determines if the instance is in the past, ie. less (before) than now. + * + * @example + * ``` + * Carbon::now()->subHours(5)->isPast(); // true + * Carbon::now()->addHours(5)->isPast(); // false + * ``` + * + * @return bool + */ + public function isPast(); + + /** + * Compares the formatted values of the two dates. + * + * @example + * ``` + * Carbon::parse('2019-06-13')->isSameAs('Y-d', Carbon::parse('2019-12-13')); // true + * Carbon::parse('2019-06-13')->isSameAs('Y-d', Carbon::parse('2019-06-14')); // false + * ``` + * + * @param string $format date formats to compare. + * @param \Carbon\Carbon|\DateTimeInterface|string|null $date instance to compare with or null to use current day. + * + * @return bool + */ + public function isSameAs($format, $date = null); + + /** + * Checks if the passed in date is in the same month as the instance´s month. + * + * @example + * ``` + * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2019-01-01')); // true + * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2019-02-01')); // false + * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2018-01-01')); // false + * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2018-01-01'), false); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|null $date The instance to compare with or null to use the current date. + * @param bool $ofSameYear Check if it is the same month in the same year. + * + * @return bool + */ + public function isSameMonth($date = null, $ofSameYear = true); + + /** + * Checks if the passed in date is in the same quarter as the instance quarter (and year if needed). + * + * @example + * ``` + * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2019-03-01')); // true + * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2019-04-01')); // false + * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2018-03-01')); // false + * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2018-03-01'), false); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|string|null $date The instance to compare with or null to use current day. + * @param bool $ofSameYear Check if it is the same month in the same year. + * + * @return bool + */ + public function isSameQuarter($date = null, $ofSameYear = true); + + /** + * Determines if the instance is in the current unit given. + * + * @example + * ``` + * Carbon::parse('2019-01-13')->isSameUnit('year', Carbon::parse('2019-12-25')); // true + * Carbon::parse('2018-12-13')->isSameUnit('year', Carbon::parse('2019-12-25')); // false + * ``` + * + * @param string $unit singular unit string + * @param \Carbon\Carbon|\DateTimeInterface|null $date instance to compare with or null to use current day. + * + * @throws BadComparisonUnitException + * + * @return bool + */ + public function isSameUnit($unit, $date = null); + + /** + * Check if the instance is start of day / midnight. + * + * @example + * ``` + * Carbon::parse('2019-02-28 00:00:00')->isStartOfDay(); // true + * Carbon::parse('2019-02-28 00:00:00.999999')->isStartOfDay(); // true + * Carbon::parse('2019-02-28 00:00:01')->isStartOfDay(); // false + * Carbon::parse('2019-02-28 00:00:00.000000')->isStartOfDay(true); // true + * Carbon::parse('2019-02-28 00:00:00.000012')->isStartOfDay(true); // false + * ``` + * + * @param bool $checkMicroseconds check time at microseconds precision + * + * @return bool + */ + public function isStartOfDay($checkMicroseconds = false); + + /** + * Returns true if the date was created using CarbonImmutable::startOfTime() + * + * @return bool + */ + public function isStartOfTime(): bool; + + /** + * Returns true if the strict mode is globally in use, false else. + * (It can be overridden in specific instances.) + * + * @return bool + */ + public static function isStrictModeEnabled(); + + /** + * Determines if the instance is today. + * + * @example + * ``` + * Carbon::today()->isToday(); // true + * Carbon::tomorrow()->isToday(); // false + * ``` + * + * @return bool + */ + public function isToday(); + + /** + * Determines if the instance is tomorrow. + * + * @example + * ``` + * Carbon::tomorrow()->isTomorrow(); // true + * Carbon::yesterday()->isTomorrow(); // false + * ``` + * + * @return bool + */ + public function isTomorrow(); + + /** + * Determines if the instance is a weekday. + * + * @example + * ``` + * Carbon::parse('2019-07-14')->isWeekday(); // false + * Carbon::parse('2019-07-15')->isWeekday(); // true + * ``` + * + * @return bool + */ + public function isWeekday(); + + /** + * Determines if the instance is a weekend day. + * + * @example + * ``` + * Carbon::parse('2019-07-14')->isWeekend(); // true + * Carbon::parse('2019-07-15')->isWeekend(); // false + * ``` + * + * @return bool + */ + public function isWeekend(); + + /** + * Determines if the instance is yesterday. + * + * @example + * ``` + * Carbon::yesterday()->isYesterday(); // true + * Carbon::tomorrow()->isYesterday(); // false + * ``` + * + * @return bool + */ + public function isYesterday(); + + /** + * Format in the current language using ISO replacement patterns. + * + * @param string $format + * @param string|null $originalFormat provide context if a chunk has been passed alone + * + * @return string + */ + public function isoFormat(string $format, ?string $originalFormat = null): string; + + /** + * Get/set the week number using given first day of week and first + * day of year included in the first week. Or use ISO format if no settings + * given. + * + * @param int|null $week + * @param int|null $dayOfWeek + * @param int|null $dayOfYear + * + * @return int|static + */ + public function isoWeek($week = null, $dayOfWeek = null, $dayOfYear = null); + + /** + * Set/get the week number of year using given first day of week and first + * day of year included in the first week. Or use ISO format if no settings + * given. + * + * @param int|null $year if null, act as a getter, if not null, set the year and return current instance. + * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) + * @param int|null $dayOfYear first day of year included in the week #1 + * + * @return int|static + */ + public function isoWeekYear($year = null, $dayOfWeek = null, $dayOfYear = null); + + /** + * Get/set the ISO weekday from 1 (Monday) to 7 (Sunday). + * + * @param int|null $value new value for weekday if using as setter. + * + * @return static|int + */ + public function isoWeekday($value = null); + + /** + * Get the number of weeks of the current week-year using given first day of week and first + * day of year included in the first week. Or use ISO format if no settings + * given. + * + * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) + * @param int|null $dayOfYear first day of year included in the week #1 + * + * @return int + */ + public function isoWeeksInYear($dayOfWeek = null, $dayOfYear = null); + + /** + * Prepare the object for JSON serialization. + * + * @return array|string + */ + #[ReturnTypeWillChange] + public function jsonSerialize(); + + /** + * Modify to the last occurrence of a given day of the week + * in the current month. If no dayOfWeek is provided, modify to the + * last day of the current month. Use the supplied constants + * to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int|null $dayOfWeek + * + * @return static + */ + public function lastOfMonth($dayOfWeek = null); + + /** + * Modify to the last occurrence of a given day of the week + * in the current quarter. If no dayOfWeek is provided, modify to the + * last day of the current quarter. Use the supplied constants + * to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int|null $dayOfWeek day of the week default null + * + * @return static + */ + public function lastOfQuarter($dayOfWeek = null); + + /** + * Modify to the last occurrence of a given day of the week + * in the current year. If no dayOfWeek is provided, modify to the + * last day of the current year. Use the supplied constants + * to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int|null $dayOfWeek day of the week default null + * + * @return static + */ + public function lastOfYear($dayOfWeek = null); + + /** + * Determines if the instance is less (before) than another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:15'); // false + * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:16'); // false + * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:17'); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @return bool + */ + public function lessThan($date): bool; + + /** + * Determines if the instance is less (before) or equal to another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:15'); // false + * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:16'); // true + * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:17'); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @return bool + */ + public function lessThanOrEqualTo($date): bool; + + /** + * Get/set the locale for the current instance. + * + * @param string|null $locale + * @param string ...$fallbackLocales + * + * @return $this|string + */ + public function locale(?string $locale = null, ...$fallbackLocales); + + /** + * Returns true if the given locale is internally supported and has words for 1-day diff (just now, yesterday, tomorrow). + * Support is considered enabled if the 3 words are translated in the given locale. + * + * @param string $locale locale ex. en + * + * @return bool + */ + public static function localeHasDiffOneDayWords($locale); + + /** + * Returns true if the given locale is internally supported and has diff syntax support (ago, from now, before, after). + * Support is considered enabled if the 4 sentences are translated in the given locale. + * + * @param string $locale locale ex. en + * + * @return bool + */ + public static function localeHasDiffSyntax($locale); + + /** + * Returns true if the given locale is internally supported and has words for 2-days diff (before yesterday, after tomorrow). + * Support is considered enabled if the 2 words are translated in the given locale. + * + * @param string $locale locale ex. en + * + * @return bool + */ + public static function localeHasDiffTwoDayWords($locale); + + /** + * Returns true if the given locale is internally supported and has period syntax support (X times, every X, from X, to X). + * Support is considered enabled if the 4 sentences are translated in the given locale. + * + * @param string $locale locale ex. en + * + * @return bool + */ + public static function localeHasPeriodSyntax($locale); + + /** + * Returns true if the given locale is internally supported and has short-units support. + * Support is considered enabled if either year, day or hour has a short variant translated. + * + * @param string $locale locale ex. en + * + * @return bool + */ + public static function localeHasShortUnits($locale); + + /** + * Determines if the instance is less (before) than another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:15'); // false + * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:16'); // false + * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:17'); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see lessThan() + * + * @return bool + */ + public function lt($date): bool; + + /** + * Determines if the instance is less (before) or equal to another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:15'); // false + * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:16'); // true + * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:17'); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see lessThanOrEqualTo() + * + * @return bool + */ + public function lte($date): bool; + + /** + * Register a custom macro. + * + * @example + * ``` + * $userSettings = [ + * 'locale' => 'pt', + * 'timezone' => 'America/Sao_Paulo', + * ]; + * Carbon::macro('userFormat', function () use ($userSettings) { + * return $this->copy()->locale($userSettings['locale'])->tz($userSettings['timezone'])->calendar(); + * }); + * echo Carbon::yesterday()->hours(11)->userFormat(); + * ``` + * + * @param string $name + * @param object|callable $macro + * + * @return void + */ + public static function macro($name, $macro); + + /** + * Make a Carbon instance from given variable if possible. + * + * Always return a new instance. Parse only strings and only these likely to be dates (skip intervals + * and recurrences). Throw an exception for invalid format, but otherwise return null. + * + * @param mixed $var + * + * @throws InvalidFormatException + * + * @return static|null + */ + public static function make($var); + + /** + * Get the maximum instance between a given instance (default now) and the current instance. + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @return static + */ + public function max($date = null); + + /** + * Create a Carbon instance for the greatest supported date. + * + * @return static + */ + public static function maxValue(); + + /** + * Get the maximum instance between a given instance (default now) and the current instance. + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see max() + * + * @return static + */ + public function maximum($date = null); + + /** + * Return the meridiem of the current time in the current locale. + * + * @param bool $isLower if true, returns lowercase variant if available in the current locale. + * + * @return string + */ + public function meridiem(bool $isLower = false): string; + + /** + * Modify to midday, default to self::$midDayAt + * + * @return static + */ + public function midDay(); + + /** + * Get the minimum instance between a given instance (default now) and the current instance. + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @return static + */ + public function min($date = null); + + /** + * Create a Carbon instance for the lowest supported date. + * + * @return static + */ + public static function minValue(); + + /** + * Get the minimum instance between a given instance (default now) and the current instance. + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see min() + * + * @return static + */ + public function minimum($date = null); + + /** + * Mix another object into the class. + * + * @example + * ``` + * Carbon::mixin(new class { + * public function addMoon() { + * return function () { + * return $this->addDays(30); + * }; + * } + * public function subMoon() { + * return function () { + * return $this->subDays(30); + * }; + * } + * }); + * $fullMoon = Carbon::create('2018-12-22'); + * $nextFullMoon = $fullMoon->addMoon(); + * $blackMoon = Carbon::create('2019-01-06'); + * $previousBlackMoon = $blackMoon->subMoon(); + * echo "$nextFullMoon\n"; + * echo "$previousBlackMoon\n"; + * ``` + * + * @param object|string $mixin + * + * @throws ReflectionException + * + * @return void + */ + public static function mixin($mixin); + + /** + * Calls \DateTime::modify if mutable or \DateTimeImmutable::modify else. + * + * @see https://php.net/manual/en/datetime.modify.php + * + * @return static|false + */ + #[ReturnTypeWillChange] + public function modify($modify); + + /** + * Determines if the instance is not equal to another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->ne('2018-07-25 12:45:16'); // false + * Carbon::parse('2018-07-25 12:45:16')->ne(Carbon::parse('2018-07-25 12:45:16')); // false + * Carbon::parse('2018-07-25 12:45:16')->ne('2018-07-25 12:45:17'); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see notEqualTo() + * + * @return bool + */ + public function ne($date): bool; + + /** + * Modify to the next occurrence of a given modifier such as a day of + * the week. If no modifier is provided, modify to the next occurrence + * of the current day of the week. Use the supplied constants + * to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param string|int|null $modifier + * + * @return static + */ + public function next($modifier = null); + + /** + * Go forward to the next weekday. + * + * @return static + */ + public function nextWeekday(); + + /** + * Go forward to the next weekend day. + * + * @return static + */ + public function nextWeekendDay(); + + /** + * Determines if the instance is not equal to another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->notEqualTo('2018-07-25 12:45:16'); // false + * Carbon::parse('2018-07-25 12:45:16')->notEqualTo(Carbon::parse('2018-07-25 12:45:16')); // false + * Carbon::parse('2018-07-25 12:45:16')->notEqualTo('2018-07-25 12:45:17'); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @return bool + */ + public function notEqualTo($date): bool; + + /** + * Get a Carbon instance for the current date and time. + * + * @param DateTimeZone|string|null $tz + * + * @return static + */ + public static function now($tz = null); + + /** + * Returns a present instance in the same timezone. + * + * @return static + */ + public function nowWithSameTz(); + + /** + * Modify to the given occurrence of a given day of the week + * in the current month. If the calculated occurrence is outside the scope + * of the current month, then return false and no modifications are made. + * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int $nth + * @param int $dayOfWeek + * + * @return mixed + */ + public function nthOfMonth($nth, $dayOfWeek); + + /** + * Modify to the given occurrence of a given day of the week + * in the current quarter. If the calculated occurrence is outside the scope + * of the current quarter, then return false and no modifications are made. + * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int $nth + * @param int $dayOfWeek + * + * @return mixed + */ + public function nthOfQuarter($nth, $dayOfWeek); + + /** + * Modify to the given occurrence of a given day of the week + * in the current year. If the calculated occurrence is outside the scope + * of the current year, then return false and no modifications are made. + * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int $nth + * @param int $dayOfWeek + * + * @return mixed + */ + public function nthOfYear($nth, $dayOfWeek); + + /** + * Return a property with its ordinal. + * + * @param string $key + * @param string|null $period + * + * @return string + */ + public function ordinal(string $key, ?string $period = null): string; + + /** + * Create a carbon instance from a string. + * + * This is an alias for the constructor that allows better fluent syntax + * as it allows you to do Carbon::parse('Monday next week')->fn() rather + * than (new Carbon('Monday next week'))->fn(). + * + * @param string|DateTimeInterface|null $time + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + * + * @return static + */ + public static function parse($time = null, $tz = null); + + /** + * Create a carbon instance from a localized string (in French, Japanese, Arabic, etc.). + * + * @param string $time date/time string in the given language (may also contain English). + * @param string|null $locale if locale is null or not specified, current global locale will be + * used instead. + * @param DateTimeZone|string|null $tz optional timezone for the new instance. + * + * @throws InvalidFormatException + * + * @return static + */ + public static function parseFromLocale($time, $locale = null, $tz = null); + + /** + * Returns standardized plural of a given singular/plural unit name (in English). + * + * @param string $unit + * + * @return string + */ + public static function pluralUnit(string $unit): string; + + /** + * Modify to the previous occurrence of a given modifier such as a day of + * the week. If no dayOfWeek is provided, modify to the previous occurrence + * of the current day of the week. Use the supplied constants + * to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param string|int|null $modifier + * + * @return static + */ + public function previous($modifier = null); + + /** + * Go backward to the previous weekday. + * + * @return static + */ + public function previousWeekday(); + + /** + * Go backward to the previous weekend day. + * + * @return static + */ + public function previousWeekendDay(); + + /** + * Create a iterable CarbonPeriod object from current date to a given end date (and optional interval). + * + * @param \DateTimeInterface|Carbon|CarbonImmutable|null $end period end date + * @param int|\DateInterval|string|null $interval period default interval or number of the given $unit + * @param string|null $unit if specified, $interval must be an integer + * + * @return CarbonPeriod + */ + public function range($end = null, $interval = null, $unit = null); + + /** + * Call native PHP DateTime/DateTimeImmutable add() method. + * + * @param DateInterval $interval + * + * @return static + */ + public function rawAdd(DateInterval $interval); + + /** + * Create a Carbon instance from a specific format. + * + * @param string $format Datetime format + * @param string $time + * @param DateTimeZone|string|false|null $tz + * + * @throws InvalidFormatException + * + * @return static|false + */ + public static function rawCreateFromFormat($format, $time, $tz = null); + + /** + * @see https://php.net/manual/en/datetime.format.php + * + * @param string $format + * + * @return string + */ + public function rawFormat($format); + + /** + * Create a carbon instance from a string. + * + * This is an alias for the constructor that allows better fluent syntax + * as it allows you to do Carbon::parse('Monday next week')->fn() rather + * than (new Carbon('Monday next week'))->fn(). + * + * @param string|DateTimeInterface|null $time + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + * + * @return static + */ + public static function rawParse($time = null, $tz = null); + + /** + * Call native PHP DateTime/DateTimeImmutable sub() method. + * + * @param DateInterval $interval + * + * @return static + */ + public function rawSub(DateInterval $interval); + + /** + * Remove all macros and generic macros. + */ + public static function resetMacros(); + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants + * are available for quarters, years, decade, centuries, millennia (singular and plural forms). + * @see settings + * + * Reset the month overflow behavior. + * + * @return void + */ + public static function resetMonthsOverflow(); + + /** + * Reset the format used to the default when type juggling a Carbon instance to a string + * + * @return void + */ + public static function resetToStringFormat(); + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants + * are available for quarters, years, decade, centuries, millennia (singular and plural forms). + * @see settings + * + * Reset the month overflow behavior. + * + * @return void + */ + public static function resetYearsOverflow(); + + /** + * Round the current instance second with given precision if specified. + * + * @param float|int|string|\DateInterval|null $precision + * @param string $function + * + * @return CarbonInterface + */ + public function round($precision = 1, $function = 'round'); + + /** + * Round the current instance at the given unit with given precision if specified and the given function. + * + * @param string $unit + * @param float|int $precision + * @param string $function + * + * @return CarbonInterface + */ + public function roundUnit($unit, $precision = 1, $function = 'round'); + + /** + * Round the current instance week. + * + * @param int $weekStartsAt optional start allow you to specify the day of week to use to start the week + * + * @return CarbonInterface + */ + public function roundWeek($weekStartsAt = null); + + /** + * The number of seconds since midnight. + * + * @return int + */ + public function secondsSinceMidnight(); + + /** + * The number of seconds until 23:59:59. + * + * @return int + */ + public function secondsUntilEndOfDay(); + + /** + * Return a serialized string of the instance. + * + * @return string + */ + public function serialize(); + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather transform Carbon object before the serialization. + * + * JSON serialize all Carbon instances using the given callback. + * + * @param callable $callback + * + * @return void + */ + public static function serializeUsing($callback); + + /** + * Set a part of the Carbon object + * + * @param string|array $name + * @param string|int|DateTimeZone $value + * + * @throws ImmutableException|UnknownSetterException + * + * @return $this + */ + public function set($name, $value = null); + + /** + * Set the date with gregorian year, month and day numbers. + * + * @see https://php.net/manual/en/datetime.setdate.php + * + * @param int $year + * @param int $month + * @param int $day + * + * @return static + */ + #[ReturnTypeWillChange] + public function setDate($year, $month, $day); + + /** + * Set the year, month, and date for this instance to that of the passed instance. + * + * @param Carbon|DateTimeInterface $date now if null + * + * @return static + */ + public function setDateFrom($date = null); + + /** + * Set the date and time all together. + * + * @param int $year + * @param int $month + * @param int $day + * @param int $hour + * @param int $minute + * @param int $second + * @param int $microseconds + * + * @return static + */ + public function setDateTime($year, $month, $day, $hour, $minute, $second = 0, $microseconds = 0); + + /** + * Set the date and time for this instance to that of the passed instance. + * + * @param Carbon|DateTimeInterface $date + * + * @return static + */ + public function setDateTimeFrom($date = null); + + /** + * Set the fallback locale. + * + * @see https://symfony.com/doc/current/components/translation.html#fallback-locales + * + * @param string $locale + */ + public static function setFallbackLocale($locale); + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * @see settings + * + * @param int $humanDiffOptions + */ + public static function setHumanDiffOptions($humanDiffOptions); + + /** + * Set a date according to the ISO 8601 standard - using weeks and day offsets rather than specific dates. + * + * @see https://php.net/manual/en/datetime.setisodate.php + * + * @param int $year + * @param int $week + * @param int $day + * + * @return static + */ + #[ReturnTypeWillChange] + public function setISODate($year, $week, $day = 1); + + /** + * Set the translator for the current instance. + * + * @param \Symfony\Component\Translation\TranslatorInterface $translator + * + * @return $this + */ + public function setLocalTranslator(TranslatorInterface $translator); + + /** + * Set the current translator locale and indicate if the source locale file exists. + * Pass 'auto' as locale to use closest language from the current LC_TIME locale. + * + * @param string $locale locale ex. en + * + * @return bool + */ + public static function setLocale($locale); + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather consider mid-day is always 12pm, then if you need to test if it's an other + * hour, test it explicitly: + * $date->format('G') == 13 + * or to set explicitly to a given hour: + * $date->setTime(13, 0, 0, 0) + * + * Set midday/noon hour + * + * @param int $hour midday hour + * + * @return void + */ + public static function setMidDayAt($hour); + + /** + * Set a Carbon instance (real or mock) to be returned when a "now" + * instance is created. The provided instance will be returned + * specifically under the following conditions: + * - A call to the static now() method, ex. Carbon::now() + * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) + * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') + * - When a string containing the desired time is passed to Carbon::parse(). + * + * Note the timezone parameter was left out of the examples above and + * has no affect as the mock value will be returned regardless of its value. + * + * Only the moment is mocked with setTestNow(), the timezone will still be the one passed + * as parameter of date_default_timezone_get() as a fallback (see setTestNowAndTimezone()). + * + * To clear the test instance call this method using the default + * parameter of null. + * + * /!\ Use this method for unit tests only. + * + * @param Closure|static|string|false|null $testNow real or mock Carbon instance + */ + public static function setTestNow($testNow = null); + + /** + * Set a Carbon instance (real or mock) to be returned when a "now" + * instance is created. The provided instance will be returned + * specifically under the following conditions: + * - A call to the static now() method, ex. Carbon::now() + * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) + * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') + * - When a string containing the desired time is passed to Carbon::parse(). + * + * It will also align default timezone (e.g. call date_default_timezone_set()) with + * the second argument or if null, with the timezone of the given date object. + * + * To clear the test instance call this method using the default + * parameter of null. + * + * /!\ Use this method for unit tests only. + * + * @param Closure|static|string|false|null $testNow real or mock Carbon instance + */ + public static function setTestNowAndTimezone($testNow = null, $tz = null); + + /** + * Resets the current time of the DateTime object to a different time. + * + * @see https://php.net/manual/en/datetime.settime.php + * + * @param int $hour + * @param int $minute + * @param int $second + * @param int $microseconds + * + * @return static + */ + #[ReturnTypeWillChange] + public function setTime($hour, $minute, $second = 0, $microseconds = 0); + + /** + * Set the hour, minute, second and microseconds for this instance to that of the passed instance. + * + * @param Carbon|DateTimeInterface $date now if null + * + * @return static + */ + public function setTimeFrom($date = null); + + /** + * Set the time by time string. + * + * @param string $time + * + * @return static + */ + public function setTimeFromTimeString($time); + + /** + * Set the instance's timestamp. + * + * Timestamp input can be given as int, float or a string containing one or more numbers. + * + * @param float|int|string $unixTimestamp + * + * @return static + */ + #[ReturnTypeWillChange] + public function setTimestamp($unixTimestamp); + + /** + * Set the instance's timezone from a string or object. + * + * @param DateTimeZone|string $value + * + * @return static + */ + #[ReturnTypeWillChange] + public function setTimezone($value); + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather let Carbon object being casted to string with DEFAULT_TO_STRING_FORMAT, and + * use other method or custom format passed to format() method if you need to dump an other string + * format. + * + * Set the default format used when type juggling a Carbon instance to a string + * + * @param string|Closure|null $format + * + * @return void + */ + public static function setToStringFormat($format); + + /** + * Set the default translator instance to use. + * + * @param \Symfony\Component\Translation\TranslatorInterface $translator + * + * @return void + */ + public static function setTranslator(TranslatorInterface $translator); + + /** + * Set specified unit to new given value. + * + * @param string $unit year, month, day, hour, minute, second or microsecond + * @param int $value new value for given unit + * + * @return static + */ + public function setUnit($unit, $value = null); + + /** + * Set any unit to a new value without overflowing current other unit given. + * + * @param string $valueUnit unit name to modify + * @param int $value new value for the input unit + * @param string $overflowUnit unit name to not overflow + * + * @return static + */ + public function setUnitNoOverflow($valueUnit, $value, $overflowUnit); + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use UTF-8 language packages on every machine. + * + * Set if UTF8 will be used for localized date/time. + * + * @param bool $utf8 + */ + public static function setUtf8($utf8); + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * Use $weekStartsAt optional parameter instead when using startOfWeek, floorWeek, ceilWeek + * or roundWeek method. You can also use the 'first_day_of_week' locale setting to change the + * start of week according to current locale selected and implicitly the end of week. + * + * Set the last day of week + * + * @param int|string $day week end day (or 'auto' to get the day before the first day of week + * from Carbon::getLocale() culture). + * + * @return void + */ + public static function setWeekEndsAt($day); + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * Use $weekEndsAt optional parameter instead when using endOfWeek method. You can also use the + * 'first_day_of_week' locale setting to change the start of week according to current locale + * selected and implicitly the end of week. + * + * Set the first day of week + * + * @param int|string $day week start day (or 'auto' to get the first day of week from Carbon::getLocale() culture). + * + * @return void + */ + public static function setWeekStartsAt($day); + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather consider week-end is always saturday and sunday, and if you have some custom + * week-end days to handle, give to those days an other name and create a macro for them: + * + * ``` + * Carbon::macro('isDayOff', function ($date) { + * return $date->isSunday() || $date->isMonday(); + * }); + * Carbon::macro('isNotDayOff', function ($date) { + * return !$date->isDayOff(); + * }); + * if ($someDate->isDayOff()) ... + * if ($someDate->isNotDayOff()) ... + * // Add 5 not-off days + * $count = 5; + * while ($someDate->isDayOff() || ($count-- > 0)) { + * $someDate->addDay(); + * } + * ``` + * + * Set weekend days + * + * @param array $days + * + * @return void + */ + public static function setWeekendDays($days); + + /** + * Set specific options. + * - strictMode: true|false|null + * - monthOverflow: true|false|null + * - yearOverflow: true|false|null + * - humanDiffOptions: int|null + * - toStringFormat: string|Closure|null + * - toJsonFormat: string|Closure|null + * - locale: string|null + * - timezone: \DateTimeZone|string|int|null + * - macros: array|null + * - genericMacros: array|null + * + * @param array $settings + * + * @return $this|static + */ + public function settings(array $settings); + + /** + * Set the instance's timezone from a string or object and add/subtract the offset difference. + * + * @param DateTimeZone|string $value + * + * @return static + */ + public function shiftTimezone($value); + + /** + * Get the month overflow global behavior (can be overridden in specific instances). + * + * @return bool + */ + public static function shouldOverflowMonths(); + + /** + * Get the month overflow global behavior (can be overridden in specific instances). + * + * @return bool + */ + public static function shouldOverflowYears(); + + /** + * @alias diffForHumans + * + * Get the difference in a human readable format in the current locale from current instance to an other + * instance given (or now if null given). + */ + public function since($other = null, $syntax = null, $short = false, $parts = 1, $options = null); + + /** + * Returns standardized singular of a given singular/plural unit name (in English). + * + * @param string $unit + * + * @return string + */ + public static function singularUnit(string $unit): string; + + /** + * Modify to start of current given unit. + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16.334455') + * ->startOf('month') + * ->endOf('week', Carbon::FRIDAY); + * ``` + * + * @param string $unit + * @param array<int, mixed> $params + * + * @return static + */ + public function startOf($unit, ...$params); + + /** + * Resets the date to the first day of the century and the time to 00:00:00 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfCentury(); + * ``` + * + * @return static + */ + public function startOfCentury(); + + /** + * Resets the time to 00:00:00 start of day + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfDay(); + * ``` + * + * @return static + */ + public function startOfDay(); + + /** + * Resets the date to the first day of the decade and the time to 00:00:00 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfDecade(); + * ``` + * + * @return static + */ + public function startOfDecade(); + + /** + * Modify to start of current hour, minutes and seconds become 0 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfHour(); + * ``` + * + * @return static + */ + public function startOfHour(); + + /** + * Resets the date to the first day of the millennium and the time to 00:00:00 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfMillennium(); + * ``` + * + * @return static + */ + public function startOfMillennium(); + + /** + * Modify to start of current minute, seconds become 0 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfMinute(); + * ``` + * + * @return static + */ + public function startOfMinute(); + + /** + * Resets the date to the first day of the month and the time to 00:00:00 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfMonth(); + * ``` + * + * @return static + */ + public function startOfMonth(); + + /** + * Resets the date to the first day of the quarter and the time to 00:00:00 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfQuarter(); + * ``` + * + * @return static + */ + public function startOfQuarter(); + + /** + * Modify to start of current second, microseconds become 0 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16.334455') + * ->startOfSecond() + * ->format('H:i:s.u'); + * ``` + * + * @return static + */ + public function startOfSecond(); + + /** + * Resets the date to the first day of week (defined in $weekStartsAt) and the time to 00:00:00 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfWeek() . "\n"; + * echo Carbon::parse('2018-07-25 12:45:16')->locale('ar')->startOfWeek() . "\n"; + * echo Carbon::parse('2018-07-25 12:45:16')->startOfWeek(Carbon::SUNDAY) . "\n"; + * ``` + * + * @param int $weekStartsAt optional start allow you to specify the day of week to use to start the week + * + * @return static + */ + public function startOfWeek($weekStartsAt = null); + + /** + * Resets the date to the first day of the year and the time to 00:00:00 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfYear(); + * ``` + * + * @return static + */ + public function startOfYear(); + + /** + * Subtract given units or interval to the current instance. + * + * @example $date->sub('hour', 3) + * @example $date->sub(15, 'days') + * @example $date->sub(CarbonInterval::days(4)) + * + * @param string|DateInterval|Closure|CarbonConverterInterface $unit + * @param int $value + * @param bool|null $overflow + * + * @return static + */ + #[ReturnTypeWillChange] + public function sub($unit, $value = 1, $overflow = null); + + public function subRealUnit($unit, $value = 1); + + /** + * Subtract given units to the current instance. + * + * @param string $unit + * @param int $value + * @param bool|null $overflow + * + * @return static + */ + public function subUnit($unit, $value = 1, $overflow = null); + + /** + * Subtract any unit to a new value without overflowing current other unit given. + * + * @param string $valueUnit unit name to modify + * @param int $value amount to subtract to the input unit + * @param string $overflowUnit unit name to not overflow + * + * @return static + */ + public function subUnitNoOverflow($valueUnit, $value, $overflowUnit); + + /** + * Subtract given units or interval to the current instance. + * + * @see sub() + * + * @param string|DateInterval $unit + * @param int $value + * @param bool|null $overflow + * + * @return static + */ + public function subtract($unit, $value = 1, $overflow = null); + + /** + * Get the difference in a human readable format in the current locale from current instance to an other + * instance given (or now if null given). + * + * @return string + */ + public function timespan($other = null, $timezone = null); + + /** + * Set the instance's timestamp. + * + * Timestamp input can be given as int, float or a string containing one or more numbers. + * + * @param float|int|string $unixTimestamp + * + * @return static + */ + public function timestamp($unixTimestamp); + + /** + * @alias setTimezone + * + * @param DateTimeZone|string $value + * + * @return static + */ + public function timezone($value); + + /** + * Get the difference in a human readable format in the current locale from an other + * instance given (or now if null given) to current instance. + * + * When comparing a value in the past to default now: + * 1 hour from now + * 5 months from now + * + * When comparing a value in the future to default now: + * 1 hour ago + * 5 months ago + * + * When comparing a value in the past to another value: + * 1 hour after + * 5 months after + * + * When comparing a value in the future to another value: + * 1 hour before + * 5 months before + * + * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; + * if null passed, now will be used as comparison reference; + * if any other type, it will be converted to date and used as reference. + * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: + * - 'syntax' entry (see below) + * - 'short' entry (see below) + * - 'parts' entry (see below) + * - 'options' entry (see below) + * - 'join' entry determines how to join multiple parts of the string + * ` - if $join is a string, it's used as a joiner glue + * ` - if $join is a callable/closure, it get the list of string and should return a string + * ` - if $join is an array, the first item will be the default glue, and the second item + * ` will be used instead of the glue for the last item + * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) + * ` - if $join is missing, a space will be used as glue + * - 'other' entry (see above) + * if int passed, it add modifiers: + * Possible values: + * - CarbonInterface::DIFF_ABSOLUTE no modifiers + * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier + * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier + * Default value: CarbonInterface::DIFF_ABSOLUTE + * @param bool $short displays short format of time units + * @param int $parts maximum number of parts to display (default value: 1: single unit) + * @param int $options human diff options + * + * @return string + */ + public function to($other = null, $syntax = null, $short = false, $parts = 1, $options = null); + + /** + * Get default array representation. + * + * @example + * ``` + * var_dump(Carbon::now()->toArray()); + * ``` + * + * @return array + */ + public function toArray(); + + /** + * Format the instance as ATOM + * + * @example + * ``` + * echo Carbon::now()->toAtomString(); + * ``` + * + * @return string + */ + public function toAtomString(); + + /** + * Format the instance as COOKIE + * + * @example + * ``` + * echo Carbon::now()->toCookieString(); + * ``` + * + * @return string + */ + public function toCookieString(); + + /** + * @alias toDateTime + * + * Return native DateTime PHP object matching the current instance. + * + * @example + * ``` + * var_dump(Carbon::now()->toDate()); + * ``` + * + * @return DateTime + */ + public function toDate(); + + /** + * Format the instance as date + * + * @example + * ``` + * echo Carbon::now()->toDateString(); + * ``` + * + * @return string + */ + public function toDateString(); + + /** + * Return native DateTime PHP object matching the current instance. + * + * @example + * ``` + * var_dump(Carbon::now()->toDateTime()); + * ``` + * + * @return DateTime + */ + public function toDateTime(); + + /** + * Return native toDateTimeImmutable PHP object matching the current instance. + * + * @example + * ``` + * var_dump(Carbon::now()->toDateTimeImmutable()); + * ``` + * + * @return DateTimeImmutable + */ + public function toDateTimeImmutable(); + + /** + * Format the instance as date and time T-separated with no timezone + * + * @example + * ``` + * echo Carbon::now()->toDateTimeLocalString(); + * echo "\n"; + * echo Carbon::now()->toDateTimeLocalString('minute'); // You can specify precision among: minute, second, millisecond and microsecond + * ``` + * + * @param string $unitPrecision + * + * @return string + */ + public function toDateTimeLocalString($unitPrecision = 'second'); + + /** + * Format the instance as date and time + * + * @example + * ``` + * echo Carbon::now()->toDateTimeString(); + * ``` + * + * @param string $unitPrecision + * + * @return string + */ + public function toDateTimeString($unitPrecision = 'second'); + + /** + * Format the instance with day, date and time + * + * @example + * ``` + * echo Carbon::now()->toDayDateTimeString(); + * ``` + * + * @return string + */ + public function toDayDateTimeString(); + + /** + * Format the instance as a readable date + * + * @example + * ``` + * echo Carbon::now()->toFormattedDateString(); + * ``` + * + * @return string + */ + public function toFormattedDateString(); + + /** + * Return the ISO-8601 string (ex: 1977-04-22T06:00:00Z, if $keepOffset truthy, offset will be kept: + * 1977-04-22T01:00:00-05:00). + * + * @example + * ``` + * echo Carbon::now('America/Toronto')->toISOString() . "\n"; + * echo Carbon::now('America/Toronto')->toISOString(true) . "\n"; + * ``` + * + * @param bool $keepOffset Pass true to keep the date offset. Else forced to UTC. + * + * @return null|string + */ + public function toISOString($keepOffset = false); + + /** + * Return a immutable copy of the instance. + * + * @return CarbonImmutable + */ + public function toImmutable(); + + /** + * Format the instance as ISO8601 + * + * @example + * ``` + * echo Carbon::now()->toIso8601String(); + * ``` + * + * @return string + */ + public function toIso8601String(); + + /** + * Convert the instance to UTC and return as Zulu ISO8601 + * + * @example + * ``` + * echo Carbon::now()->toIso8601ZuluString(); + * ``` + * + * @param string $unitPrecision + * + * @return string + */ + public function toIso8601ZuluString($unitPrecision = 'second'); + + /** + * Return the ISO-8601 string (ex: 1977-04-22T06:00:00Z) with UTC timezone. + * + * @example + * ``` + * echo Carbon::now('America/Toronto')->toJSON(); + * ``` + * + * @return null|string + */ + public function toJSON(); + + /** + * Return a mutable copy of the instance. + * + * @return Carbon + */ + public function toMutable(); + + /** + * Get the difference in a human readable format in the current locale from an other + * instance given to now + * + * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: + * - 'syntax' entry (see below) + * - 'short' entry (see below) + * - 'parts' entry (see below) + * - 'options' entry (see below) + * - 'join' entry determines how to join multiple parts of the string + * ` - if $join is a string, it's used as a joiner glue + * ` - if $join is a callable/closure, it get the list of string and should return a string + * ` - if $join is an array, the first item will be the default glue, and the second item + * ` will be used instead of the glue for the last item + * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) + * ` - if $join is missing, a space will be used as glue + * if int passed, it add modifiers: + * Possible values: + * - CarbonInterface::DIFF_ABSOLUTE no modifiers + * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier + * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier + * Default value: CarbonInterface::DIFF_ABSOLUTE + * @param bool $short displays short format of time units + * @param int $parts maximum number of parts to display (default value: 1: single part) + * @param int $options human diff options + * + * @return string + */ + public function toNow($syntax = null, $short = false, $parts = 1, $options = null); + + /** + * Get default object representation. + * + * @example + * ``` + * var_dump(Carbon::now()->toObject()); + * ``` + * + * @return object + */ + public function toObject(); + + /** + * Create a iterable CarbonPeriod object from current date to a given end date (and optional interval). + * + * @param \DateTimeInterface|Carbon|CarbonImmutable|int|null $end period end date or recurrences count if int + * @param int|\DateInterval|string|null $interval period default interval or number of the given $unit + * @param string|null $unit if specified, $interval must be an integer + * + * @return CarbonPeriod + */ + public function toPeriod($end = null, $interval = null, $unit = null); + + /** + * Format the instance as RFC1036 + * + * @example + * ``` + * echo Carbon::now()->toRfc1036String(); + * ``` + * + * @return string + */ + public function toRfc1036String(); + + /** + * Format the instance as RFC1123 + * + * @example + * ``` + * echo Carbon::now()->toRfc1123String(); + * ``` + * + * @return string + */ + public function toRfc1123String(); + + /** + * Format the instance as RFC2822 + * + * @example + * ``` + * echo Carbon::now()->toRfc2822String(); + * ``` + * + * @return string + */ + public function toRfc2822String(); + + /** + * Format the instance as RFC3339 + * + * @param bool $extended + * + * @example + * ``` + * echo Carbon::now()->toRfc3339String() . "\n"; + * echo Carbon::now()->toRfc3339String(true) . "\n"; + * ``` + * + * @return string + */ + public function toRfc3339String($extended = false); + + /** + * Format the instance as RFC7231 + * + * @example + * ``` + * echo Carbon::now()->toRfc7231String(); + * ``` + * + * @return string + */ + public function toRfc7231String(); + + /** + * Format the instance as RFC822 + * + * @example + * ``` + * echo Carbon::now()->toRfc822String(); + * ``` + * + * @return string + */ + public function toRfc822String(); + + /** + * Format the instance as RFC850 + * + * @example + * ``` + * echo Carbon::now()->toRfc850String(); + * ``` + * + * @return string + */ + public function toRfc850String(); + + /** + * Format the instance as RSS + * + * @example + * ``` + * echo Carbon::now()->toRssString(); + * ``` + * + * @return string + */ + public function toRssString(); + + /** + * Returns english human readable complete date string. + * + * @example + * ``` + * echo Carbon::now()->toString(); + * ``` + * + * @return string + */ + public function toString(); + + /** + * Format the instance as time + * + * @example + * ``` + * echo Carbon::now()->toTimeString(); + * ``` + * + * @param string $unitPrecision + * + * @return string + */ + public function toTimeString($unitPrecision = 'second'); + + /** + * Format the instance as W3C + * + * @example + * ``` + * echo Carbon::now()->toW3cString(); + * ``` + * + * @return string + */ + public function toW3cString(); + + /** + * Create a Carbon instance for today. + * + * @param DateTimeZone|string|null $tz + * + * @return static + */ + public static function today($tz = null); + + /** + * Create a Carbon instance for tomorrow. + * + * @param DateTimeZone|string|null $tz + * + * @return static + */ + public static function tomorrow($tz = null); + + /** + * Translate using translation string or callback available. + * + * @param string $key + * @param array $parameters + * @param string|int|float|null $number + * @param \Symfony\Component\Translation\TranslatorInterface|null $translator + * @param bool $altNumbers + * + * @return string + */ + public function translate(string $key, array $parameters = [], $number = null, ?TranslatorInterface $translator = null, bool $altNumbers = false): string; + + /** + * Returns the alternative number for a given integer if available in the current locale. + * + * @param int $number + * + * @return string + */ + public function translateNumber(int $number): string; + + /** + * Translate a time string from a locale to an other. + * + * @param string $timeString date/time/duration string to translate (may also contain English) + * @param string|null $from input locale of the $timeString parameter (`Carbon::getLocale()` by default) + * @param string|null $to output locale of the result returned (`"en"` by default) + * @param int $mode specify what to translate with options: + * - self::TRANSLATE_ALL (default) + * - CarbonInterface::TRANSLATE_MONTHS + * - CarbonInterface::TRANSLATE_DAYS + * - CarbonInterface::TRANSLATE_UNITS + * - CarbonInterface::TRANSLATE_MERIDIEM + * You can use pipe to group: CarbonInterface::TRANSLATE_MONTHS | CarbonInterface::TRANSLATE_DAYS + * + * @return string + */ + public static function translateTimeString($timeString, $from = null, $to = null, $mode = self::TRANSLATE_ALL); + + /** + * Translate a time string from the current locale (`$date->locale()`) to an other. + * + * @param string $timeString time string to translate + * @param string|null $to output locale of the result returned ("en" by default) + * + * @return string + */ + public function translateTimeStringTo($timeString, $to = null); + + /** + * Translate using translation string or callback available. + * + * @param \Symfony\Component\Translation\TranslatorInterface $translator + * @param string $key + * @param array $parameters + * @param null $number + * + * @return string + */ + public static function translateWith(TranslatorInterface $translator, string $key, array $parameters = [], $number = null): string; + + /** + * Format as ->format() do (using date replacements patterns from https://php.net/manual/en/function.date.php) + * but translate words whenever possible (months, day names, etc.) using the current locale. + * + * @param string $format + * + * @return string + */ + public function translatedFormat(string $format): string; + + /** + * Set the timezone or returns the timezone name if no arguments passed. + * + * @param DateTimeZone|string $value + * + * @return static|string + */ + public function tz($value = null); + + /** + * @alias getTimestamp + * + * Returns the UNIX timestamp for the current date. + * + * @return int + */ + public function unix(); + + /** + * @alias to + * + * Get the difference in a human readable format in the current locale from an other + * instance given (or now if null given) to current instance. + * + * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; + * if null passed, now will be used as comparison reference; + * if any other type, it will be converted to date and used as reference. + * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: + * - 'syntax' entry (see below) + * - 'short' entry (see below) + * - 'parts' entry (see below) + * - 'options' entry (see below) + * - 'join' entry determines how to join multiple parts of the string + * ` - if $join is a string, it's used as a joiner glue + * ` - if $join is a callable/closure, it get the list of string and should return a string + * ` - if $join is an array, the first item will be the default glue, and the second item + * ` will be used instead of the glue for the last item + * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) + * ` - if $join is missing, a space will be used as glue + * - 'other' entry (see above) + * if int passed, it add modifiers: + * Possible values: + * - CarbonInterface::DIFF_ABSOLUTE no modifiers + * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier + * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier + * Default value: CarbonInterface::DIFF_ABSOLUTE + * @param bool $short displays short format of time units + * @param int $parts maximum number of parts to display (default value: 1: single unit) + * @param int $options human diff options + * + * @return string + */ + public function until($other = null, $syntax = null, $short = false, $parts = 1, $options = null); + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants + * are available for quarters, years, decade, centuries, millennia (singular and plural forms). + * @see settings + * + * Indicates if months should be calculated with overflow. + * + * @param bool $monthsOverflow + * + * @return void + */ + public static function useMonthsOverflow($monthsOverflow = true); + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * @see settings + * + * Enable the strict mode (or disable with passing false). + * + * @param bool $strictModeEnabled + */ + public static function useStrictMode($strictModeEnabled = true); + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants + * are available for quarters, years, decade, centuries, millennia (singular and plural forms). + * @see settings + * + * Indicates if years should be calculated with overflow. + * + * @param bool $yearsOverflow + * + * @return void + */ + public static function useYearsOverflow($yearsOverflow = true); + + /** + * Set the instance's timezone to UTC. + * + * @return static + */ + public function utc(); + + /** + * Returns the minutes offset to UTC if no arguments passed, else set the timezone with given minutes shift passed. + * + * @param int|null $minuteOffset + * + * @return int|static + */ + public function utcOffset(?int $minuteOffset = null); + + /** + * Returns the milliseconds timestamps used amongst other by Date javascript objects. + * + * @return float + */ + public function valueOf(); + + /** + * Get/set the week number using given first day of week and first + * day of year included in the first week. Or use US format if no settings + * given (Sunday / Jan 6). + * + * @param int|null $week + * @param int|null $dayOfWeek + * @param int|null $dayOfYear + * + * @return int|static + */ + public function week($week = null, $dayOfWeek = null, $dayOfYear = null); + + /** + * Set/get the week number of year using given first day of week and first + * day of year included in the first week. Or use US format if no settings + * given (Sunday / Jan 6). + * + * @param int|null $year if null, act as a getter, if not null, set the year and return current instance. + * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) + * @param int|null $dayOfYear first day of year included in the week #1 + * + * @return int|static + */ + public function weekYear($year = null, $dayOfWeek = null, $dayOfYear = null); + + /** + * Get/set the weekday from 0 (Sunday) to 6 (Saturday). + * + * @param int|null $value new value for weekday if using as setter. + * + * @return static|int + */ + public function weekday($value = null); + + /** + * Get the number of weeks of the current week-year using given first day of week and first + * day of year included in the first week. Or use US format if no settings + * given (Sunday / Jan 6). + * + * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) + * @param int|null $dayOfYear first day of year included in the week #1 + * + * @return int + */ + public function weeksInYear($dayOfWeek = null, $dayOfYear = null); + + /** + * Temporarily sets a static date to be used within the callback. + * Using setTestNow to set the date, executing the callback, then + * clearing the test instance. + * + * /!\ Use this method for unit tests only. + * + * @param Closure|static|string|false|null $testNow real or mock Carbon instance + * @param Closure|null $callback + * + * @return mixed + */ + public static function withTestNow($testNow = null, $callback = null); + + /** + * Create a Carbon instance for yesterday. + * + * @param DateTimeZone|string|null $tz + * + * @return static + */ + public static function yesterday($tz = null); + + // </methods> +} diff --git a/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php b/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php new file mode 100644 index 0000000..566b4f9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php @@ -0,0 +1,2823 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon; + +use Carbon\Exceptions\BadFluentConstructorException; +use Carbon\Exceptions\BadFluentSetterException; +use Carbon\Exceptions\InvalidCastException; +use Carbon\Exceptions\InvalidIntervalException; +use Carbon\Exceptions\ParseErrorException; +use Carbon\Exceptions\UnitNotConfiguredException; +use Carbon\Exceptions\UnknownGetterException; +use Carbon\Exceptions\UnknownSetterException; +use Carbon\Exceptions\UnknownUnitException; +use Carbon\Traits\IntervalRounding; +use Carbon\Traits\IntervalStep; +use Carbon\Traits\MagicParameter; +use Carbon\Traits\Mixin; +use Carbon\Traits\Options; +use Carbon\Traits\ToStringFormat; +use Closure; +use DateInterval; +use DateTimeInterface; +use DateTimeZone; +use Exception; +use ReflectionException; +use ReturnTypeWillChange; +use Throwable; + +/** + * A simple API extension for DateInterval. + * The implementation provides helpers to handle weeks but only days are saved. + * Weeks are calculated based on the total days of the current instance. + * + * @property int $years Total years of the current interval. + * @property int $months Total months of the current interval. + * @property int $weeks Total weeks of the current interval calculated from the days. + * @property int $dayz Total days of the current interval (weeks * 7 + days). + * @property int $hours Total hours of the current interval. + * @property int $minutes Total minutes of the current interval. + * @property int $seconds Total seconds of the current interval. + * @property int $microseconds Total microseconds of the current interval. + * @property int $milliseconds Total microseconds of the current interval. + * @property int $microExcludeMilli Remaining microseconds without the milliseconds. + * @property int $dayzExcludeWeeks Total days remaining in the final week of the current instance (days % 7). + * @property int $daysExcludeWeeks alias of dayzExcludeWeeks + * @property-read float $totalYears Number of years equivalent to the interval. + * @property-read float $totalMonths Number of months equivalent to the interval. + * @property-read float $totalWeeks Number of weeks equivalent to the interval. + * @property-read float $totalDays Number of days equivalent to the interval. + * @property-read float $totalDayz Alias for totalDays. + * @property-read float $totalHours Number of hours equivalent to the interval. + * @property-read float $totalMinutes Number of minutes equivalent to the interval. + * @property-read float $totalSeconds Number of seconds equivalent to the interval. + * @property-read float $totalMilliseconds Number of milliseconds equivalent to the interval. + * @property-read float $totalMicroseconds Number of microseconds equivalent to the interval. + * @property-read string $locale locale of the current instance + * + * @method static CarbonInterval years($years = 1) Create instance specifying a number of years or modify the number of years if called on an instance. + * @method static CarbonInterval year($years = 1) Alias for years() + * @method static CarbonInterval months($months = 1) Create instance specifying a number of months or modify the number of months if called on an instance. + * @method static CarbonInterval month($months = 1) Alias for months() + * @method static CarbonInterval weeks($weeks = 1) Create instance specifying a number of weeks or modify the number of weeks if called on an instance. + * @method static CarbonInterval week($weeks = 1) Alias for weeks() + * @method static CarbonInterval days($days = 1) Create instance specifying a number of days or modify the number of days if called on an instance. + * @method static CarbonInterval dayz($days = 1) Alias for days() + * @method static CarbonInterval daysExcludeWeeks($days = 1) Create instance specifying a number of days or modify the number of days (keeping the current number of weeks) if called on an instance. + * @method static CarbonInterval dayzExcludeWeeks($days = 1) Alias for daysExcludeWeeks() + * @method static CarbonInterval day($days = 1) Alias for days() + * @method static CarbonInterval hours($hours = 1) Create instance specifying a number of hours or modify the number of hours if called on an instance. + * @method static CarbonInterval hour($hours = 1) Alias for hours() + * @method static CarbonInterval minutes($minutes = 1) Create instance specifying a number of minutes or modify the number of minutes if called on an instance. + * @method static CarbonInterval minute($minutes = 1) Alias for minutes() + * @method static CarbonInterval seconds($seconds = 1) Create instance specifying a number of seconds or modify the number of seconds if called on an instance. + * @method static CarbonInterval second($seconds = 1) Alias for seconds() + * @method static CarbonInterval milliseconds($milliseconds = 1) Create instance specifying a number of milliseconds or modify the number of milliseconds if called on an instance. + * @method static CarbonInterval millisecond($milliseconds = 1) Alias for milliseconds() + * @method static CarbonInterval microseconds($microseconds = 1) Create instance specifying a number of microseconds or modify the number of microseconds if called on an instance. + * @method static CarbonInterval microsecond($microseconds = 1) Alias for microseconds() + * @method $this addYears(int $years) Add given number of years to the current interval + * @method $this subYears(int $years) Subtract given number of years to the current interval + * @method $this addMonths(int $months) Add given number of months to the current interval + * @method $this subMonths(int $months) Subtract given number of months to the current interval + * @method $this addWeeks(int|float $weeks) Add given number of weeks to the current interval + * @method $this subWeeks(int|float $weeks) Subtract given number of weeks to the current interval + * @method $this addDays(int|float $days) Add given number of days to the current interval + * @method $this subDays(int|float $days) Subtract given number of days to the current interval + * @method $this addHours(int|float $hours) Add given number of hours to the current interval + * @method $this subHours(int|float $hours) Subtract given number of hours to the current interval + * @method $this addMinutes(int|float $minutes) Add given number of minutes to the current interval + * @method $this subMinutes(int|float $minutes) Subtract given number of minutes to the current interval + * @method $this addSeconds(int|float $seconds) Add given number of seconds to the current interval + * @method $this subSeconds(int|float $seconds) Subtract given number of seconds to the current interval + * @method $this addMilliseconds(int|float $milliseconds) Add given number of milliseconds to the current interval + * @method $this subMilliseconds(int|float $milliseconds) Subtract given number of milliseconds to the current interval + * @method $this addMicroseconds(int|float $microseconds) Add given number of microseconds to the current interval + * @method $this subMicroseconds(int|float $microseconds) Subtract given number of microseconds to the current interval + * @method $this roundYear(int|float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method $this roundYears(int|float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method $this floorYear(int|float $precision = 1) Truncate the current instance year with given precision. + * @method $this floorYears(int|float $precision = 1) Truncate the current instance year with given precision. + * @method $this ceilYear(int|float $precision = 1) Ceil the current instance year with given precision. + * @method $this ceilYears(int|float $precision = 1) Ceil the current instance year with given precision. + * @method $this roundMonth(int|float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method $this roundMonths(int|float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method $this floorMonth(int|float $precision = 1) Truncate the current instance month with given precision. + * @method $this floorMonths(int|float $precision = 1) Truncate the current instance month with given precision. + * @method $this ceilMonth(int|float $precision = 1) Ceil the current instance month with given precision. + * @method $this ceilMonths(int|float $precision = 1) Ceil the current instance month with given precision. + * @method $this roundWeek(int|float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method $this roundWeeks(int|float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method $this floorWeek(int|float $precision = 1) Truncate the current instance day with given precision. + * @method $this floorWeeks(int|float $precision = 1) Truncate the current instance day with given precision. + * @method $this ceilWeek(int|float $precision = 1) Ceil the current instance day with given precision. + * @method $this ceilWeeks(int|float $precision = 1) Ceil the current instance day with given precision. + * @method $this roundDay(int|float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method $this roundDays(int|float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method $this floorDay(int|float $precision = 1) Truncate the current instance day with given precision. + * @method $this floorDays(int|float $precision = 1) Truncate the current instance day with given precision. + * @method $this ceilDay(int|float $precision = 1) Ceil the current instance day with given precision. + * @method $this ceilDays(int|float $precision = 1) Ceil the current instance day with given precision. + * @method $this roundHour(int|float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method $this roundHours(int|float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method $this floorHour(int|float $precision = 1) Truncate the current instance hour with given precision. + * @method $this floorHours(int|float $precision = 1) Truncate the current instance hour with given precision. + * @method $this ceilHour(int|float $precision = 1) Ceil the current instance hour with given precision. + * @method $this ceilHours(int|float $precision = 1) Ceil the current instance hour with given precision. + * @method $this roundMinute(int|float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method $this roundMinutes(int|float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method $this floorMinute(int|float $precision = 1) Truncate the current instance minute with given precision. + * @method $this floorMinutes(int|float $precision = 1) Truncate the current instance minute with given precision. + * @method $this ceilMinute(int|float $precision = 1) Ceil the current instance minute with given precision. + * @method $this ceilMinutes(int|float $precision = 1) Ceil the current instance minute with given precision. + * @method $this roundSecond(int|float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method $this roundSeconds(int|float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method $this floorSecond(int|float $precision = 1) Truncate the current instance second with given precision. + * @method $this floorSeconds(int|float $precision = 1) Truncate the current instance second with given precision. + * @method $this ceilSecond(int|float $precision = 1) Ceil the current instance second with given precision. + * @method $this ceilSeconds(int|float $precision = 1) Ceil the current instance second with given precision. + * @method $this roundMillennium(int|float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method $this roundMillennia(int|float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method $this floorMillennium(int|float $precision = 1) Truncate the current instance millennium with given precision. + * @method $this floorMillennia(int|float $precision = 1) Truncate the current instance millennium with given precision. + * @method $this ceilMillennium(int|float $precision = 1) Ceil the current instance millennium with given precision. + * @method $this ceilMillennia(int|float $precision = 1) Ceil the current instance millennium with given precision. + * @method $this roundCentury(int|float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method $this roundCenturies(int|float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method $this floorCentury(int|float $precision = 1) Truncate the current instance century with given precision. + * @method $this floorCenturies(int|float $precision = 1) Truncate the current instance century with given precision. + * @method $this ceilCentury(int|float $precision = 1) Ceil the current instance century with given precision. + * @method $this ceilCenturies(int|float $precision = 1) Ceil the current instance century with given precision. + * @method $this roundDecade(int|float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method $this roundDecades(int|float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method $this floorDecade(int|float $precision = 1) Truncate the current instance decade with given precision. + * @method $this floorDecades(int|float $precision = 1) Truncate the current instance decade with given precision. + * @method $this ceilDecade(int|float $precision = 1) Ceil the current instance decade with given precision. + * @method $this ceilDecades(int|float $precision = 1) Ceil the current instance decade with given precision. + * @method $this roundQuarter(int|float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method $this roundQuarters(int|float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method $this floorQuarter(int|float $precision = 1) Truncate the current instance quarter with given precision. + * @method $this floorQuarters(int|float $precision = 1) Truncate the current instance quarter with given precision. + * @method $this ceilQuarter(int|float $precision = 1) Ceil the current instance quarter with given precision. + * @method $this ceilQuarters(int|float $precision = 1) Ceil the current instance quarter with given precision. + * @method $this roundMillisecond(int|float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method $this roundMilliseconds(int|float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method $this floorMillisecond(int|float $precision = 1) Truncate the current instance millisecond with given precision. + * @method $this floorMilliseconds(int|float $precision = 1) Truncate the current instance millisecond with given precision. + * @method $this ceilMillisecond(int|float $precision = 1) Ceil the current instance millisecond with given precision. + * @method $this ceilMilliseconds(int|float $precision = 1) Ceil the current instance millisecond with given precision. + * @method $this roundMicrosecond(int|float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method $this roundMicroseconds(int|float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method $this floorMicrosecond(int|float $precision = 1) Truncate the current instance microsecond with given precision. + * @method $this floorMicroseconds(int|float $precision = 1) Truncate the current instance microsecond with given precision. + * @method $this ceilMicrosecond(int|float $precision = 1) Ceil the current instance microsecond with given precision. + * @method $this ceilMicroseconds(int|float $precision = 1) Ceil the current instance microsecond with given precision. + */ +class CarbonInterval extends DateInterval implements CarbonConverterInterface +{ + use IntervalRounding; + use IntervalStep; + use MagicParameter; + use Mixin { + Mixin::mixin as baseMixin; + } + use Options; + use ToStringFormat; + + /** + * Interval spec period designators + */ + public const PERIOD_PREFIX = 'P'; + public const PERIOD_YEARS = 'Y'; + public const PERIOD_MONTHS = 'M'; + public const PERIOD_DAYS = 'D'; + public const PERIOD_TIME_PREFIX = 'T'; + public const PERIOD_HOURS = 'H'; + public const PERIOD_MINUTES = 'M'; + public const PERIOD_SECONDS = 'S'; + + /** + * A translator to ... er ... translate stuff + * + * @var \Symfony\Component\Translation\TranslatorInterface + */ + protected static $translator; + + /** + * @var array|null + */ + protected static $cascadeFactors; + + /** + * @var array + */ + protected static $formats = [ + 'y' => 'y', + 'Y' => 'y', + 'o' => 'y', + 'm' => 'm', + 'n' => 'm', + 'W' => 'weeks', + 'd' => 'd', + 'j' => 'd', + 'z' => 'd', + 'h' => 'h', + 'g' => 'h', + 'H' => 'h', + 'G' => 'h', + 'i' => 'i', + 's' => 's', + 'u' => 'micro', + 'v' => 'milli', + ]; + + /** + * @var array|null + */ + private static $flipCascadeFactors; + + /** + * The registered macros. + * + * @var array + */ + protected static $macros = []; + + /** + * Timezone handler for settings() method. + * + * @var mixed + */ + protected $tzName; + + /** + * Set the instance's timezone from a string or object. + * + * @param \DateTimeZone|string $tzName + * + * @return static + */ + public function setTimezone($tzName) + { + $this->tzName = $tzName; + + return $this; + } + + /** + * @internal + * + * Set the instance's timezone from a string or object and add/subtract the offset difference. + * + * @param \DateTimeZone|string $tzName + * + * @return static + */ + public function shiftTimezone($tzName) + { + $this->tzName = $tzName; + + return $this; + } + + /** + * Mapping of units and factors for cascading. + * + * Should only be modified by changing the factors or referenced constants. + * + * @return array + */ + public static function getCascadeFactors() + { + return static::$cascadeFactors ?: [ + 'milliseconds' => [Carbon::MICROSECONDS_PER_MILLISECOND, 'microseconds'], + 'seconds' => [Carbon::MILLISECONDS_PER_SECOND, 'milliseconds'], + 'minutes' => [Carbon::SECONDS_PER_MINUTE, 'seconds'], + 'hours' => [Carbon::MINUTES_PER_HOUR, 'minutes'], + 'dayz' => [Carbon::HOURS_PER_DAY, 'hours'], + 'weeks' => [Carbon::DAYS_PER_WEEK, 'dayz'], + 'months' => [Carbon::WEEKS_PER_MONTH, 'weeks'], + 'years' => [Carbon::MONTHS_PER_YEAR, 'months'], + ]; + } + + private static function standardizeUnit($unit) + { + $unit = rtrim($unit, 'sz').'s'; + + return $unit === 'days' ? 'dayz' : $unit; + } + + private static function getFlipCascadeFactors() + { + if (!self::$flipCascadeFactors) { + self::$flipCascadeFactors = []; + + foreach (static::getCascadeFactors() as $to => [$factor, $from]) { + self::$flipCascadeFactors[self::standardizeUnit($from)] = [self::standardizeUnit($to), $factor]; + } + } + + return self::$flipCascadeFactors; + } + + /** + * Set default cascading factors for ->cascade() method. + * + * @param array $cascadeFactors + */ + public static function setCascadeFactors(array $cascadeFactors) + { + self::$flipCascadeFactors = null; + static::$cascadeFactors = $cascadeFactors; + } + + /////////////////////////////////////////////////////////////////// + //////////////////////////// CONSTRUCTORS ///////////////////////// + /////////////////////////////////////////////////////////////////// + + /** + * Create a new CarbonInterval instance. + * + * @param Closure|DateInterval|string|int|null $years + * @param int|null $months + * @param int|null $weeks + * @param int|null $days + * @param int|null $hours + * @param int|null $minutes + * @param int|null $seconds + * @param int|null $microseconds + * + * @throws Exception when the interval_spec (passed as $years) cannot be parsed as an interval. + */ + public function __construct($years = 1, $months = null, $weeks = null, $days = null, $hours = null, $minutes = null, $seconds = null, $microseconds = null) + { + if ($years instanceof Closure) { + $this->step = $years; + $years = null; + } + + if ($years instanceof DateInterval) { + parent::__construct(static::getDateIntervalSpec($years)); + $this->f = $years->f; + self::copyNegativeUnits($years, $this); + + return; + } + + $spec = $years; + + if (!\is_string($spec) || (float) $years || preg_match('/^[\d.]/', $years)) { + $spec = static::PERIOD_PREFIX; + + $spec .= $years > 0 ? $years.static::PERIOD_YEARS : ''; + $spec .= $months > 0 ? $months.static::PERIOD_MONTHS : ''; + + $specDays = 0; + $specDays += $weeks > 0 ? $weeks * static::getDaysPerWeek() : 0; + $specDays += $days > 0 ? $days : 0; + + $spec .= $specDays > 0 ? $specDays.static::PERIOD_DAYS : ''; + + if ($hours > 0 || $minutes > 0 || $seconds > 0) { + $spec .= static::PERIOD_TIME_PREFIX; + $spec .= $hours > 0 ? $hours.static::PERIOD_HOURS : ''; + $spec .= $minutes > 0 ? $minutes.static::PERIOD_MINUTES : ''; + $spec .= $seconds > 0 ? $seconds.static::PERIOD_SECONDS : ''; + } + + if ($spec === static::PERIOD_PREFIX) { + // Allow the zero interval. + $spec .= '0'.static::PERIOD_YEARS; + } + } + + parent::__construct($spec); + + if ($microseconds !== null) { + $this->f = $microseconds / Carbon::MICROSECONDS_PER_SECOND; + } + } + + /** + * Returns the factor for a given source-to-target couple. + * + * @param string $source + * @param string $target + * + * @return int|float|null + */ + public static function getFactor($source, $target) + { + $source = self::standardizeUnit($source); + $target = self::standardizeUnit($target); + $factors = self::getFlipCascadeFactors(); + + if (isset($factors[$source])) { + [$to, $factor] = $factors[$source]; + + if ($to === $target) { + return $factor; + } + + return $factor * static::getFactor($to, $target); + } + + return null; + } + + /** + * Returns the factor for a given source-to-target couple if set, + * else try to find the appropriate constant as the factor, such as Carbon::DAYS_PER_WEEK. + * + * @param string $source + * @param string $target + * + * @return int|float|null + */ + public static function getFactorWithDefault($source, $target) + { + $factor = self::getFactor($source, $target); + + if ($factor) { + return $factor; + } + + static $defaults = [ + 'month' => ['year' => Carbon::MONTHS_PER_YEAR], + 'week' => ['month' => Carbon::WEEKS_PER_MONTH], + 'day' => ['week' => Carbon::DAYS_PER_WEEK], + 'hour' => ['day' => Carbon::HOURS_PER_DAY], + 'minute' => ['hour' => Carbon::MINUTES_PER_HOUR], + 'second' => ['minute' => Carbon::SECONDS_PER_MINUTE], + 'millisecond' => ['second' => Carbon::MILLISECONDS_PER_SECOND], + 'microsecond' => ['millisecond' => Carbon::MICROSECONDS_PER_MILLISECOND], + ]; + + return $defaults[$source][$target] ?? null; + } + + /** + * Returns current config for days per week. + * + * @return int|float + */ + public static function getDaysPerWeek() + { + return static::getFactor('dayz', 'weeks') ?: Carbon::DAYS_PER_WEEK; + } + + /** + * Returns current config for hours per day. + * + * @return int|float + */ + public static function getHoursPerDay() + { + return static::getFactor('hours', 'dayz') ?: Carbon::HOURS_PER_DAY; + } + + /** + * Returns current config for minutes per hour. + * + * @return int|float + */ + public static function getMinutesPerHour() + { + return static::getFactor('minutes', 'hours') ?: Carbon::MINUTES_PER_HOUR; + } + + /** + * Returns current config for seconds per minute. + * + * @return int|float + */ + public static function getSecondsPerMinute() + { + return static::getFactor('seconds', 'minutes') ?: Carbon::SECONDS_PER_MINUTE; + } + + /** + * Returns current config for microseconds per second. + * + * @return int|float + */ + public static function getMillisecondsPerSecond() + { + return static::getFactor('milliseconds', 'seconds') ?: Carbon::MILLISECONDS_PER_SECOND; + } + + /** + * Returns current config for microseconds per second. + * + * @return int|float + */ + public static function getMicrosecondsPerMillisecond() + { + return static::getFactor('microseconds', 'milliseconds') ?: Carbon::MICROSECONDS_PER_MILLISECOND; + } + + /** + * Create a new CarbonInterval instance from specific values. + * This is an alias for the constructor that allows better fluent + * syntax as it allows you to do CarbonInterval::create(1)->fn() rather than + * (new CarbonInterval(1))->fn(). + * + * @param int $years + * @param int $months + * @param int $weeks + * @param int $days + * @param int $hours + * @param int $minutes + * @param int $seconds + * @param int $microseconds + * + * @throws Exception when the interval_spec (passed as $years) cannot be parsed as an interval. + * + * @return static + */ + public static function create($years = 1, $months = null, $weeks = null, $days = null, $hours = null, $minutes = null, $seconds = null, $microseconds = null) + { + return new static($years, $months, $weeks, $days, $hours, $minutes, $seconds, $microseconds); + } + + /** + * Parse a string into a new CarbonInterval object according to the specified format. + * + * @example + * ``` + * echo Carboninterval::createFromFormat('H:i', '1:30'); + * ``` + * + * @param string $format Format of the $interval input string + * @param string|null $interval Input string to convert into an interval + * + * @throws \Carbon\Exceptions\ParseErrorException when the $interval cannot be parsed as an interval. + * + * @return static + */ + public static function createFromFormat(string $format, ?string $interval) + { + $instance = new static(0); + $length = mb_strlen($format); + + if (preg_match('/s([,.])([uv])$/', $format, $match)) { + $interval = explode($match[1], $interval); + $index = \count($interval) - 1; + $interval[$index] = str_pad($interval[$index], $match[2] === 'v' ? 3 : 6, '0'); + $interval = implode($match[1], $interval); + } + + $interval = $interval ?? ''; + + for ($index = 0; $index < $length; $index++) { + $expected = mb_substr($format, $index, 1); + $nextCharacter = mb_substr($interval, 0, 1); + $unit = static::$formats[$expected] ?? null; + + if ($unit) { + if (!preg_match('/^-?\d+/', $interval, $match)) { + throw new ParseErrorException('number', $nextCharacter); + } + + $interval = mb_substr($interval, mb_strlen($match[0])); + $instance->$unit += (int) ($match[0]); + + continue; + } + + if ($nextCharacter !== $expected) { + throw new ParseErrorException( + "'$expected'", + $nextCharacter, + 'Allowed substitutes for interval formats are '.implode(', ', array_keys(static::$formats))."\n". + 'See https://php.net/manual/en/function.date.php for their meaning' + ); + } + + $interval = mb_substr($interval, 1); + } + + if ($interval !== '') { + throw new ParseErrorException( + 'end of string', + $interval + ); + } + + return $instance; + } + + /** + * Get a copy of the instance. + * + * @return static + */ + public function copy() + { + $date = new static(0); + $date->copyProperties($this); + $date->step = $this->step; + + return $date; + } + + /** + * Get a copy of the instance. + * + * @return static + */ + public function clone() + { + return $this->copy(); + } + + /** + * Provide static helpers to create instances. Allows CarbonInterval::years(3). + * + * Note: This is done using the magic method to allow static and instance methods to + * have the same names. + * + * @param string $method magic method name called + * @param array $parameters parameters list + * + * @return static|null + */ + public static function __callStatic($method, $parameters) + { + try { + $interval = new static(0); + $localStrictModeEnabled = $interval->localStrictModeEnabled; + $interval->localStrictModeEnabled = true; + + $result = static::hasMacro($method) + ? static::bindMacroContext(null, function () use (&$method, &$parameters, &$interval) { + return $interval->callMacro($method, $parameters); + }) + : $interval->$method(...$parameters); + + $interval->localStrictModeEnabled = $localStrictModeEnabled; + + return $result; + } catch (BadFluentSetterException $exception) { + if (Carbon::isStrictModeEnabled()) { + throw new BadFluentConstructorException($method, 0, $exception); + } + + return null; + } + } + + /** + * Return the current context from inside a macro callee or a new one if static. + * + * @return static + */ + protected static function this() + { + return end(static::$macroContextStack) ?: new static(0); + } + + /** + * Creates a CarbonInterval from string. + * + * Format: + * + * Suffix | Unit | Example | DateInterval expression + * -------|---------|---------|------------------------ + * y | years | 1y | P1Y + * mo | months | 3mo | P3M + * w | weeks | 2w | P2W + * d | days | 28d | P28D + * h | hours | 4h | PT4H + * m | minutes | 12m | PT12M + * s | seconds | 59s | PT59S + * + * e. g. `1w 3d 4h 32m 23s` is converted to 10 days 4 hours 32 minutes and 23 seconds. + * + * Special cases: + * - An empty string will return a zero interval + * - Fractions are allowed for weeks, days, hours and minutes and will be converted + * and rounded to the next smaller value (caution: 0.5w = 4d) + * + * @param string $intervalDefinition + * + * @return static + */ + public static function fromString($intervalDefinition) + { + if (empty($intervalDefinition)) { + return new static(0); + } + + $years = 0; + $months = 0; + $weeks = 0; + $days = 0; + $hours = 0; + $minutes = 0; + $seconds = 0; + $milliseconds = 0; + $microseconds = 0; + + $pattern = '/(\d+(?:\.\d+)?)\h*([^\d\h]*)/i'; + preg_match_all($pattern, $intervalDefinition, $parts, PREG_SET_ORDER); + + while ([$part, $value, $unit] = array_shift($parts)) { + $intValue = (int) $value; + $fraction = (float) $value - $intValue; + + // Fix calculation precision + switch (round($fraction, 6)) { + case 1: + $fraction = 0; + $intValue++; + + break; + case 0: + $fraction = 0; + + break; + } + + switch ($unit === 'µs' ? 'µs' : strtolower($unit)) { + case 'millennia': + case 'millennium': + $years += $intValue * CarbonInterface::YEARS_PER_MILLENNIUM; + + break; + + case 'century': + case 'centuries': + $years += $intValue * CarbonInterface::YEARS_PER_CENTURY; + + break; + + case 'decade': + case 'decades': + $years += $intValue * CarbonInterface::YEARS_PER_DECADE; + + break; + + case 'year': + case 'years': + case 'y': + case 'yr': + case 'yrs': + $years += $intValue; + + break; + + case 'quarter': + case 'quarters': + $months += $intValue * CarbonInterface::MONTHS_PER_QUARTER; + + break; + + case 'month': + case 'months': + case 'mo': + case 'mos': + $months += $intValue; + + break; + + case 'week': + case 'weeks': + case 'w': + $weeks += $intValue; + + if ($fraction) { + $parts[] = [null, $fraction * static::getDaysPerWeek(), 'd']; + } + + break; + + case 'day': + case 'days': + case 'd': + $days += $intValue; + + if ($fraction) { + $parts[] = [null, $fraction * static::getHoursPerDay(), 'h']; + } + + break; + + case 'hour': + case 'hours': + case 'h': + $hours += $intValue; + + if ($fraction) { + $parts[] = [null, $fraction * static::getMinutesPerHour(), 'm']; + } + + break; + + case 'minute': + case 'minutes': + case 'm': + $minutes += $intValue; + + if ($fraction) { + $parts[] = [null, $fraction * static::getSecondsPerMinute(), 's']; + } + + break; + + case 'second': + case 'seconds': + case 's': + $seconds += $intValue; + + if ($fraction) { + $parts[] = [null, $fraction * static::getMillisecondsPerSecond(), 'ms']; + } + + break; + + case 'millisecond': + case 'milliseconds': + case 'milli': + case 'ms': + $milliseconds += $intValue; + + if ($fraction) { + $microseconds += round($fraction * static::getMicrosecondsPerMillisecond()); + } + + break; + + case 'microsecond': + case 'microseconds': + case 'micro': + case 'µs': + $microseconds += $intValue; + + break; + + default: + throw new InvalidIntervalException( + sprintf('Invalid part %s in definition %s', $part, $intervalDefinition) + ); + } + } + + return new static($years, $months, $weeks, $days, $hours, $minutes, $seconds, $milliseconds * Carbon::MICROSECONDS_PER_MILLISECOND + $microseconds); + } + + /** + * Creates a CarbonInterval from string using a different locale. + * + * @param string $interval interval string in the given language (may also contain English). + * @param string|null $locale if locale is null or not specified, current global locale will be used instead. + * + * @return static + */ + public static function parseFromLocale($interval, $locale = null) + { + return static::fromString(Carbon::translateTimeString($interval, $locale ?: static::getLocale(), 'en')); + } + + private static function castIntervalToClass(DateInterval $interval, string $className, array $skip = []) + { + $mainClass = DateInterval::class; + + if (!is_a($className, $mainClass, true)) { + throw new InvalidCastException("$className is not a sub-class of $mainClass."); + } + + $microseconds = $interval->f; + $instance = new $className(static::getDateIntervalSpec($interval, false, $skip)); + + if ($microseconds) { + $instance->f = $microseconds; + } + + if ($interval instanceof self && is_a($className, self::class, true)) { + self::copyStep($interval, $instance); + } + + self::copyNegativeUnits($interval, $instance); + + return $instance; + } + + private static function copyNegativeUnits(DateInterval $from, DateInterval $to): void + { + $to->invert = $from->invert; + + foreach (['y', 'm', 'd', 'h', 'i', 's'] as $unit) { + if ($from->$unit < 0) { + $to->$unit *= -1; + } + } + } + + private static function copyStep(self $from, self $to): void + { + $to->setStep($from->getStep()); + } + + /** + * Cast the current instance into the given class. + * + * @param string $className The $className::instance() method will be called to cast the current object. + * + * @return DateInterval + */ + public function cast(string $className) + { + return self::castIntervalToClass($this, $className); + } + + /** + * Create a CarbonInterval instance from a DateInterval one. Can not instance + * DateInterval objects created from DateTime::diff() as you can't externally + * set the $days field. + * + * @param DateInterval $interval + * + * @return static + */ + public static function instance(DateInterval $interval, array $skip = []) + { + return self::castIntervalToClass($interval, static::class, $skip); + } + + /** + * Make a CarbonInterval instance from given variable if possible. + * + * Always return a new instance. Parse only strings and only these likely to be intervals (skip dates + * and recurrences). Throw an exception for invalid format, but otherwise return null. + * + * @param mixed|int|DateInterval|string|Closure|null $interval interval or number of the given $unit + * @param string|null $unit if specified, $interval must be an integer + * + * @return static|null + */ + public static function make($interval, $unit = null) + { + if ($unit) { + $interval = "$interval ".Carbon::pluralUnit($unit); + } + + if ($interval instanceof DateInterval) { + return static::instance($interval); + } + + if ($interval instanceof Closure) { + return new static($interval); + } + + if (!\is_string($interval)) { + return null; + } + + return static::makeFromString($interval); + } + + protected static function makeFromString(string $interval) + { + $interval = preg_replace('/\s+/', ' ', trim($interval)); + + if (preg_match('/^P[T\d]/', $interval)) { + return new static($interval); + } + + if (preg_match('/^(?:\h*\d+(?:\.\d+)?\h*[a-z]+)+$/i', $interval)) { + return static::fromString($interval); + } + + /** @var static $interval */ + $interval = static::createFromDateString($interval); + + return !$interval || $interval->isEmpty() ? null : $interval; + } + + protected function resolveInterval($interval) + { + if (!($interval instanceof self)) { + return self::make($interval); + } + + return $interval; + } + + /** + * Sets up a DateInterval from the relative parts of the string. + * + * @param string $time + * + * @return static + * + * @link https://php.net/manual/en/dateinterval.createfromdatestring.php + */ + #[ReturnTypeWillChange] + public static function createFromDateString($time) + { + $interval = @parent::createFromDateString(strtr($time, [ + ',' => ' ', + ' and ' => ' ', + ])); + + if ($interval instanceof DateInterval) { + $interval = static::instance($interval); + } + + return $interval; + } + + /////////////////////////////////////////////////////////////////// + ///////////////////////// GETTERS AND SETTERS ///////////////////// + /////////////////////////////////////////////////////////////////// + + /** + * Get a part of the CarbonInterval object. + * + * @param string $name + * + * @throws UnknownGetterException + * + * @return int|float|string + */ + public function get($name) + { + if (str_starts_with($name, 'total')) { + return $this->total(substr($name, 5)); + } + + switch ($name) { + case 'years': + return $this->y; + + case 'months': + return $this->m; + + case 'dayz': + return $this->d; + + case 'hours': + return $this->h; + + case 'minutes': + return $this->i; + + case 'seconds': + return $this->s; + + case 'milli': + case 'milliseconds': + return (int) (round($this->f * Carbon::MICROSECONDS_PER_SECOND) / Carbon::MICROSECONDS_PER_MILLISECOND); + + case 'micro': + case 'microseconds': + return (int) round($this->f * Carbon::MICROSECONDS_PER_SECOND); + + case 'microExcludeMilli': + return (int) round($this->f * Carbon::MICROSECONDS_PER_SECOND) % Carbon::MICROSECONDS_PER_MILLISECOND; + + case 'weeks': + return (int) ($this->d / (int) static::getDaysPerWeek()); + + case 'daysExcludeWeeks': + case 'dayzExcludeWeeks': + return $this->d % (int) static::getDaysPerWeek(); + + case 'locale': + return $this->getTranslatorLocale(); + + default: + throw new UnknownGetterException($name); + } + } + + /** + * Get a part of the CarbonInterval object. + * + * @param string $name + * + * @throws UnknownGetterException + * + * @return int|float|string + */ + public function __get($name) + { + return $this->get($name); + } + + /** + * Set a part of the CarbonInterval object. + * + * @param string|array $name + * @param int $value + * + * @throws UnknownSetterException + * + * @return $this + */ + public function set($name, $value = null) + { + $properties = \is_array($name) ? $name : [$name => $value]; + + foreach ($properties as $key => $value) { + switch (Carbon::singularUnit(rtrim($key, 'z'))) { + case 'year': + $this->y = $value; + + break; + + case 'month': + $this->m = $value; + + break; + + case 'week': + $this->d = $value * (int) static::getDaysPerWeek(); + + break; + + case 'day': + $this->d = $value; + + break; + + case 'daysexcludeweek': + case 'dayzexcludeweek': + $this->d = $this->weeks * (int) static::getDaysPerWeek() + $value; + + break; + + case 'hour': + $this->h = $value; + + break; + + case 'minute': + $this->i = $value; + + break; + + case 'second': + $this->s = $value; + + break; + + case 'milli': + case 'millisecond': + $this->microseconds = $value * Carbon::MICROSECONDS_PER_MILLISECOND + $this->microseconds % Carbon::MICROSECONDS_PER_MILLISECOND; + + break; + + case 'micro': + case 'microsecond': + $this->f = $value / Carbon::MICROSECONDS_PER_SECOND; + + break; + + default: + if ($this->localStrictModeEnabled ?? Carbon::isStrictModeEnabled()) { + throw new UnknownSetterException($key); + } + + $this->$key = $value; + } + } + + return $this; + } + + /** + * Set a part of the CarbonInterval object. + * + * @param string $name + * @param int $value + * + * @throws UnknownSetterException + */ + public function __set($name, $value) + { + $this->set($name, $value); + } + + /** + * Allow setting of weeks and days to be cumulative. + * + * @param int $weeks Number of weeks to set + * @param int $days Number of days to set + * + * @return static + */ + public function weeksAndDays($weeks, $days) + { + $this->dayz = ($weeks * static::getDaysPerWeek()) + $days; + + return $this; + } + + /** + * Returns true if the interval is empty for each unit. + * + * @return bool + */ + public function isEmpty() + { + return $this->years === 0 && + $this->months === 0 && + $this->dayz === 0 && + !$this->days && + $this->hours === 0 && + $this->minutes === 0 && + $this->seconds === 0 && + $this->microseconds === 0; + } + + /** + * Register a custom macro. + * + * @example + * ``` + * CarbonInterval::macro('twice', function () { + * return $this->times(2); + * }); + * echo CarbonInterval::hours(2)->twice(); + * ``` + * + * @param string $name + * @param object|callable $macro + * + * @return void + */ + public static function macro($name, $macro) + { + static::$macros[$name] = $macro; + } + + /** + * Register macros from a mixin object. + * + * @example + * ``` + * CarbonInterval::mixin(new class { + * public function daysToHours() { + * return function () { + * $this->hours += $this->days; + * $this->days = 0; + * + * return $this; + * }; + * } + * public function hoursToDays() { + * return function () { + * $this->days += $this->hours; + * $this->hours = 0; + * + * return $this; + * }; + * } + * }); + * echo CarbonInterval::hours(5)->hoursToDays() . "\n"; + * echo CarbonInterval::days(5)->daysToHours() . "\n"; + * ``` + * + * @param object|string $mixin + * + * @throws ReflectionException + * + * @return void + */ + public static function mixin($mixin) + { + static::baseMixin($mixin); + } + + /** + * Check if macro is registered. + * + * @param string $name + * + * @return bool + */ + public static function hasMacro($name) + { + return isset(static::$macros[$name]); + } + + /** + * Call given macro. + * + * @param string $name + * @param array $parameters + * + * @return mixed + */ + protected function callMacro($name, $parameters) + { + $macro = static::$macros[$name]; + + if ($macro instanceof Closure) { + $boundMacro = @$macro->bindTo($this, static::class) ?: @$macro->bindTo(null, static::class); + + return ($boundMacro ?: $macro)(...$parameters); + } + + return $macro(...$parameters); + } + + /** + * Allow fluent calls on the setters... CarbonInterval::years(3)->months(5)->day(). + * + * Note: This is done using the magic method to allow static and instance methods to + * have the same names. + * + * @param string $method magic method name called + * @param array $parameters parameters list + * + * @throws BadFluentSetterException|Throwable + * + * @return static + */ + public function __call($method, $parameters) + { + if (static::hasMacro($method)) { + return static::bindMacroContext($this, function () use (&$method, &$parameters) { + return $this->callMacro($method, $parameters); + }); + } + + $roundedValue = $this->callRoundMethod($method, $parameters); + + if ($roundedValue !== null) { + return $roundedValue; + } + + if (preg_match('/^(?<method>add|sub)(?<unit>[A-Z].*)$/', $method, $match)) { + $value = $this->getMagicParameter($parameters, 0, Carbon::pluralUnit($match['unit']), 0); + + return $this->{$match['method']}($value, $match['unit']); + } + + $value = $this->getMagicParameter($parameters, 0, Carbon::pluralUnit($method), 1); + + try { + $this->set($method, $value); + } catch (UnknownSetterException $exception) { + if ($this->localStrictModeEnabled ?? Carbon::isStrictModeEnabled()) { + throw new BadFluentSetterException($method, 0, $exception); + } + } + + return $this; + } + + protected function getForHumansInitialVariables($syntax, $short) + { + if (\is_array($syntax)) { + return $syntax; + } + + if (\is_int($short)) { + return [ + 'parts' => $short, + 'short' => false, + ]; + } + + if (\is_bool($syntax)) { + return [ + 'short' => $syntax, + 'syntax' => CarbonInterface::DIFF_ABSOLUTE, + ]; + } + + return []; + } + + /** + * @param mixed $syntax + * @param mixed $short + * @param mixed $parts + * @param mixed $options + * + * @return array + */ + protected function getForHumansParameters($syntax = null, $short = false, $parts = -1, $options = null) + { + $optionalSpace = ' '; + $default = $this->getTranslationMessage('list.0') ?? $this->getTranslationMessage('list') ?? ' '; + $join = $default === '' ? '' : ' '; + $altNumbers = false; + $aUnit = false; + $minimumUnit = 's'; + $skip = []; + extract($this->getForHumansInitialVariables($syntax, $short)); + $skip = array_map('strtolower', array_filter((array) $skip, static function ($value) { + return \is_string($value) && $value !== ''; + })); + + if ($syntax === null) { + $syntax = CarbonInterface::DIFF_ABSOLUTE; + } + + if ($parts === -1) { + $parts = INF; + } + + if ($options === null) { + $options = static::getHumanDiffOptions(); + } + + if ($join === false) { + $join = ' '; + } elseif ($join === true) { + $join = [ + $default, + $this->getTranslationMessage('list.1') ?? $default, + ]; + } + + if ($altNumbers && $altNumbers !== true) { + $language = new Language($this->locale); + $altNumbers = \in_array($language->getCode(), (array) $altNumbers, true); + } + + if (\is_array($join)) { + [$default, $last] = $join; + + if ($default !== ' ') { + $optionalSpace = ''; + } + + $join = function ($list) use ($default, $last) { + if (\count($list) < 2) { + return implode('', $list); + } + + $end = array_pop($list); + + return implode($default, $list).$last.$end; + }; + } + + if (\is_string($join)) { + if ($join !== ' ') { + $optionalSpace = ''; + } + + $glue = $join; + $join = function ($list) use ($glue) { + return implode($glue, $list); + }; + } + + $interpolations = [ + ':optional-space' => $optionalSpace, + ]; + + return [$syntax, $short, $parts, $options, $join, $aUnit, $altNumbers, $interpolations, $minimumUnit, $skip]; + } + + protected static function getRoundingMethodFromOptions(int $options): ?string + { + if ($options & CarbonInterface::ROUND) { + return 'round'; + } + + if ($options & CarbonInterface::CEIL) { + return 'ceil'; + } + + if ($options & CarbonInterface::FLOOR) { + return 'floor'; + } + + return null; + } + + /** + * Returns interval values as an array where key are the unit names and values the counts. + * + * @return int[] + */ + public function toArray() + { + return [ + 'years' => $this->years, + 'months' => $this->months, + 'weeks' => $this->weeks, + 'days' => $this->daysExcludeWeeks, + 'hours' => $this->hours, + 'minutes' => $this->minutes, + 'seconds' => $this->seconds, + 'microseconds' => $this->microseconds, + ]; + } + + /** + * Returns interval non-zero values as an array where key are the unit names and values the counts. + * + * @return int[] + */ + public function getNonZeroValues() + { + return array_filter($this->toArray(), 'intval'); + } + + /** + * Returns interval values as an array where key are the unit names and values the counts + * from the biggest non-zero one the the smallest non-zero one. + * + * @return int[] + */ + public function getValuesSequence() + { + $nonZeroValues = $this->getNonZeroValues(); + + if ($nonZeroValues === []) { + return []; + } + + $keys = array_keys($nonZeroValues); + $firstKey = $keys[0]; + $lastKey = $keys[\count($keys) - 1]; + $values = []; + $record = false; + + foreach ($this->toArray() as $unit => $count) { + if ($unit === $firstKey) { + $record = true; + } + + if ($record) { + $values[$unit] = $count; + } + + if ($unit === $lastKey) { + $record = false; + } + } + + return $values; + } + + /** + * Get the current interval in a human readable format in the current locale. + * + * @example + * ``` + * echo CarbonInterval::fromString('4d 3h 40m')->forHumans() . "\n"; + * echo CarbonInterval::fromString('4d 3h 40m')->forHumans(['parts' => 2]) . "\n"; + * echo CarbonInterval::fromString('4d 3h 40m')->forHumans(['parts' => 3, 'join' => true]) . "\n"; + * echo CarbonInterval::fromString('4d 3h 40m')->forHumans(['short' => true]) . "\n"; + * echo CarbonInterval::fromString('1d 24h')->forHumans(['join' => ' or ']) . "\n"; + * echo CarbonInterval::fromString('1d 24h')->forHumans(['minimumUnit' => 'hour']) . "\n"; + * ``` + * + * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: + * - 'syntax' entry (see below) + * - 'short' entry (see below) + * - 'parts' entry (see below) + * - 'options' entry (see below) + * - 'skip' entry, list of units to skip (array of strings or a single string, + * ` it can be the unit name (singular or plural) or its shortcut + * ` (y, m, w, d, h, min, s, ms, µs). + * - 'aUnit' entry, prefer "an hour" over "1 hour" if true + * - 'join' entry determines how to join multiple parts of the string + * ` - if $join is a string, it's used as a joiner glue + * ` - if $join is a callable/closure, it get the list of string and should return a string + * ` - if $join is an array, the first item will be the default glue, and the second item + * ` will be used instead of the glue for the last item + * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) + * ` - if $join is missing, a space will be used as glue + * - 'minimumUnit' entry determines the smallest unit of time to display can be long or + * ` short form of the units, e.g. 'hour' or 'h' (default value: s) + * if int passed, it add modifiers: + * Possible values: + * - CarbonInterface::DIFF_ABSOLUTE no modifiers + * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier + * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier + * Default value: CarbonInterface::DIFF_ABSOLUTE + * @param bool $short displays short format of time units + * @param int $parts maximum number of parts to display (default value: -1: no limits) + * @param int $options human diff options + * + * @throws Exception + * + * @return string + */ + public function forHumans($syntax = null, $short = false, $parts = -1, $options = null) + { + [$syntax, $short, $parts, $options, $join, $aUnit, $altNumbers, $interpolations, $minimumUnit, $skip] = $this + ->getForHumansParameters($syntax, $short, $parts, $options); + + $interval = []; + + $syntax = (int) ($syntax ?? CarbonInterface::DIFF_ABSOLUTE); + $absolute = $syntax === CarbonInterface::DIFF_ABSOLUTE; + $relativeToNow = $syntax === CarbonInterface::DIFF_RELATIVE_TO_NOW; + $count = 1; + $unit = $short ? 's' : 'second'; + $isFuture = $this->invert === 1; + $transId = $relativeToNow ? ($isFuture ? 'from_now' : 'ago') : ($isFuture ? 'after' : 'before'); + $declensionMode = null; + + /** @var \Symfony\Component\Translation\Translator $translator */ + $translator = $this->getLocalTranslator(); + + $handleDeclensions = function ($unit, $count, $index = 0, $parts = 1) use ($interpolations, $transId, $translator, $altNumbers, $absolute, &$declensionMode) { + if (!$absolute) { + $declensionMode = $declensionMode ?? $this->translate($transId.'_mode'); + + if ($this->needsDeclension($declensionMode, $index, $parts)) { + // Some languages have special pluralization for past and future tense. + $key = $unit.'_'.$transId; + $result = $this->translate($key, $interpolations, $count, $translator, $altNumbers); + + if ($result !== $key) { + return $result; + } + } + } + + $result = $this->translate($unit, $interpolations, $count, $translator, $altNumbers); + + if ($result !== $unit) { + return $result; + } + + return null; + }; + + $intervalValues = $this; + $method = static::getRoundingMethodFromOptions($options); + + if ($method) { + $previousCount = INF; + + while ( + \count($intervalValues->getNonZeroValues()) > $parts && + ($count = \count($keys = array_keys($intervalValues->getValuesSequence()))) > 1 + ) { + $index = min($count, $previousCount - 1) - 2; + + if ($index < 0) { + break; + } + + $intervalValues = $this->copy()->roundUnit( + $keys[$index], + 1, + $method + ); + $previousCount = $count; + } + } + + $diffIntervalArray = [ + ['value' => $intervalValues->years, 'unit' => 'year', 'unitShort' => 'y'], + ['value' => $intervalValues->months, 'unit' => 'month', 'unitShort' => 'm'], + ['value' => $intervalValues->weeks, 'unit' => 'week', 'unitShort' => 'w'], + ['value' => $intervalValues->daysExcludeWeeks, 'unit' => 'day', 'unitShort' => 'd'], + ['value' => $intervalValues->hours, 'unit' => 'hour', 'unitShort' => 'h'], + ['value' => $intervalValues->minutes, 'unit' => 'minute', 'unitShort' => 'min'], + ['value' => $intervalValues->seconds, 'unit' => 'second', 'unitShort' => 's'], + ['value' => $intervalValues->milliseconds, 'unit' => 'millisecond', 'unitShort' => 'ms'], + ['value' => $intervalValues->microExcludeMilli, 'unit' => 'microsecond', 'unitShort' => 'µs'], + ]; + + if (!empty($skip)) { + foreach ($diffIntervalArray as $index => &$unitData) { + $nextIndex = $index + 1; + + if ($unitData['value'] && + isset($diffIntervalArray[$nextIndex]) && + \count(array_intersect([$unitData['unit'], $unitData['unit'].'s', $unitData['unitShort']], $skip)) + ) { + $diffIntervalArray[$nextIndex]['value'] += $unitData['value'] * + self::getFactorWithDefault($diffIntervalArray[$nextIndex]['unit'], $unitData['unit']); + $unitData['value'] = 0; + } + } + } + + $transChoice = function ($short, $unitData, $index, $parts) use ($absolute, $handleDeclensions, $translator, $aUnit, $altNumbers, $interpolations) { + $count = $unitData['value']; + + if ($short) { + $result = $handleDeclensions($unitData['unitShort'], $count, $index, $parts); + + if ($result !== null) { + return $result; + } + } elseif ($aUnit) { + $result = $handleDeclensions('a_'.$unitData['unit'], $count, $index, $parts); + + if ($result !== null) { + return $result; + } + } + + if (!$absolute) { + return $handleDeclensions($unitData['unit'], $count, $index, $parts); + } + + return $this->translate($unitData['unit'], $interpolations, $count, $translator, $altNumbers); + }; + + $fallbackUnit = ['second', 's']; + + foreach ($diffIntervalArray as $diffIntervalData) { + if ($diffIntervalData['value'] > 0) { + $unit = $short ? $diffIntervalData['unitShort'] : $diffIntervalData['unit']; + $count = $diffIntervalData['value']; + $interval[] = [$short, $diffIntervalData]; + } elseif ($options & CarbonInterface::SEQUENTIAL_PARTS_ONLY && \count($interval) > 0) { + break; + } + + // break the loop after we get the required number of parts in array + if (\count($interval) >= $parts) { + break; + } + + // break the loop after we have reached the minimum unit + if (\in_array($minimumUnit, [$diffIntervalData['unit'], $diffIntervalData['unitShort']], true)) { + $fallbackUnit = [$diffIntervalData['unit'], $diffIntervalData['unitShort']]; + + break; + } + } + + $actualParts = \count($interval); + + foreach ($interval as $index => &$item) { + $item = $transChoice($item[0], $item[1], $index, $actualParts); + } + + if (\count($interval) === 0) { + if ($relativeToNow && $options & CarbonInterface::JUST_NOW) { + $key = 'diff_now'; + $translation = $this->translate($key, $interpolations, null, $translator); + + if ($translation !== $key) { + return $translation; + } + } + + $count = $options & CarbonInterface::NO_ZERO_DIFF ? 1 : 0; + $unit = $fallbackUnit[$short ? 1 : 0]; + $interval[] = $this->translate($unit, $interpolations, $count, $translator, $altNumbers); + } + + // join the interval parts by a space + $time = $join($interval); + + unset($diffIntervalArray, $interval); + + if ($absolute) { + return $time; + } + + $isFuture = $this->invert === 1; + + $transId = $relativeToNow ? ($isFuture ? 'from_now' : 'ago') : ($isFuture ? 'after' : 'before'); + + if ($parts === 1) { + if ($relativeToNow && $unit === 'day') { + if ($count === 1 && $options & CarbonInterface::ONE_DAY_WORDS) { + $key = $isFuture ? 'diff_tomorrow' : 'diff_yesterday'; + $translation = $this->translate($key, $interpolations, null, $translator); + + if ($translation !== $key) { + return $translation; + } + } + + if ($count === 2 && $options & CarbonInterface::TWO_DAY_WORDS) { + $key = $isFuture ? 'diff_after_tomorrow' : 'diff_before_yesterday'; + $translation = $this->translate($key, $interpolations, null, $translator); + + if ($translation !== $key) { + return $translation; + } + } + } + + $aTime = $aUnit ? $handleDeclensions('a_'.$unit, $count) : null; + + $time = $aTime ?: $handleDeclensions($unit, $count) ?: $time; + } + + $time = [':time' => $time]; + + return $this->translate($transId, array_merge($time, $interpolations, $time), null, $translator); + } + + /** + * Format the instance as a string using the forHumans() function. + * + * @throws Exception + * + * @return string + */ + public function __toString() + { + $format = $this->localToStringFormat ?? static::$toStringFormat; + + if (!$format) { + return $this->forHumans(); + } + + if ($format instanceof Closure) { + return $format($this); + } + + return $this->format($format); + } + + /** + * Return native DateInterval PHP object matching the current instance. + * + * @example + * ``` + * var_dump(CarbonInterval::hours(2)->toDateInterval()); + * ``` + * + * @return DateInterval + */ + public function toDateInterval() + { + return self::castIntervalToClass($this, DateInterval::class); + } + + /** + * Convert the interval to a CarbonPeriod. + * + * @param DateTimeInterface|string|int ...$params Start date, [end date or recurrences] and optional settings. + * + * @return CarbonPeriod + */ + public function toPeriod(...$params) + { + if ($this->tzName) { + $tz = \is_string($this->tzName) ? new DateTimeZone($this->tzName) : $this->tzName; + + if ($tz instanceof DateTimeZone) { + array_unshift($params, $tz); + } + } + + return CarbonPeriod::create($this, ...$params); + } + + /** + * Invert the interval. + * + * @param bool|int $inverted if a parameter is passed, the passed value casted as 1 or 0 is used + * as the new value of the ->invert property. + * + * @return $this + */ + public function invert($inverted = null) + { + $this->invert = (\func_num_args() === 0 ? !$this->invert : $inverted) ? 1 : 0; + + return $this; + } + + protected function solveNegativeInterval() + { + if (!$this->isEmpty() && $this->years <= 0 && $this->months <= 0 && $this->dayz <= 0 && $this->hours <= 0 && $this->minutes <= 0 && $this->seconds <= 0 && $this->microseconds <= 0) { + $this->years *= -1; + $this->months *= -1; + $this->dayz *= -1; + $this->hours *= -1; + $this->minutes *= -1; + $this->seconds *= -1; + $this->microseconds *= -1; + $this->invert(); + } + + return $this; + } + + /** + * Add the passed interval to the current instance. + * + * @param string|DateInterval $unit + * @param int|float $value + * + * @return $this + */ + public function add($unit, $value = 1) + { + if (is_numeric($unit)) { + [$value, $unit] = [$unit, $value]; + } + + if (\is_string($unit) && !preg_match('/^\s*\d/', $unit)) { + $unit = "$value $unit"; + $value = 1; + } + + $interval = static::make($unit); + + if (!$interval) { + throw new InvalidIntervalException('This type of data cannot be added/subtracted.'); + } + + if ($value !== 1) { + $interval->times($value); + } + + $sign = ($this->invert === 1) !== ($interval->invert === 1) ? -1 : 1; + $this->years += $interval->y * $sign; + $this->months += $interval->m * $sign; + $this->dayz += ($interval->days === false ? $interval->d : $interval->days) * $sign; + $this->hours += $interval->h * $sign; + $this->minutes += $interval->i * $sign; + $this->seconds += $interval->s * $sign; + $this->microseconds += $interval->microseconds * $sign; + + $this->solveNegativeInterval(); + + return $this; + } + + /** + * Subtract the passed interval to the current instance. + * + * @param string|DateInterval $unit + * @param int|float $value + * + * @return $this + */ + public function sub($unit, $value = 1) + { + if (is_numeric($unit)) { + [$value, $unit] = [$unit, $value]; + } + + return $this->add($unit, -(float) $value); + } + + /** + * Subtract the passed interval to the current instance. + * + * @param string|DateInterval $unit + * @param int|float $value + * + * @return $this + */ + public function subtract($unit, $value = 1) + { + return $this->sub($unit, $value); + } + + /** + * Add given parameters to the current interval. + * + * @param int $years + * @param int $months + * @param int|float $weeks + * @param int|float $days + * @param int|float $hours + * @param int|float $minutes + * @param int|float $seconds + * @param int|float $microseconds + * + * @return $this + */ + public function plus( + $years = 0, + $months = 0, + $weeks = 0, + $days = 0, + $hours = 0, + $minutes = 0, + $seconds = 0, + $microseconds = 0 + ): self { + return $this->add(" + $years years $months months $weeks weeks $days days + $hours hours $minutes minutes $seconds seconds $microseconds microseconds + "); + } + + /** + * Add given parameters to the current interval. + * + * @param int $years + * @param int $months + * @param int|float $weeks + * @param int|float $days + * @param int|float $hours + * @param int|float $minutes + * @param int|float $seconds + * @param int|float $microseconds + * + * @return $this + */ + public function minus( + $years = 0, + $months = 0, + $weeks = 0, + $days = 0, + $hours = 0, + $minutes = 0, + $seconds = 0, + $microseconds = 0 + ): self { + return $this->sub(" + $years years $months months $weeks weeks $days days + $hours hours $minutes minutes $seconds seconds $microseconds microseconds + "); + } + + /** + * Multiply current instance given number of times. times() is naive, it multiplies each unit + * (so day can be greater than 31, hour can be greater than 23, etc.) and the result is rounded + * separately for each unit. + * + * Use times() when you want a fast and approximated calculation that does not cascade units. + * + * For a precise and cascaded calculation, + * + * @see multiply() + * + * @param float|int $factor + * + * @return $this + */ + public function times($factor) + { + if ($factor < 0) { + $this->invert = $this->invert ? 0 : 1; + $factor = -$factor; + } + + $this->years = (int) round($this->years * $factor); + $this->months = (int) round($this->months * $factor); + $this->dayz = (int) round($this->dayz * $factor); + $this->hours = (int) round($this->hours * $factor); + $this->minutes = (int) round($this->minutes * $factor); + $this->seconds = (int) round($this->seconds * $factor); + $this->microseconds = (int) round($this->microseconds * $factor); + + return $this; + } + + /** + * Divide current instance by a given divider. shares() is naive, it divides each unit separately + * and the result is rounded for each unit. So 5 hours and 20 minutes shared by 3 becomes 2 hours + * and 7 minutes. + * + * Use shares() when you want a fast and approximated calculation that does not cascade units. + * + * For a precise and cascaded calculation, + * + * @see divide() + * + * @param float|int $divider + * + * @return $this + */ + public function shares($divider) + { + return $this->times(1 / $divider); + } + + protected function copyProperties(self $interval, $ignoreSign = false) + { + $this->years = $interval->years; + $this->months = $interval->months; + $this->dayz = $interval->dayz; + $this->hours = $interval->hours; + $this->minutes = $interval->minutes; + $this->seconds = $interval->seconds; + $this->microseconds = $interval->microseconds; + + if (!$ignoreSign) { + $this->invert = $interval->invert; + } + + return $this; + } + + /** + * Multiply and cascade current instance by a given factor. + * + * @param float|int $factor + * + * @return $this + */ + public function multiply($factor) + { + if ($factor < 0) { + $this->invert = $this->invert ? 0 : 1; + $factor = -$factor; + } + + $yearPart = (int) floor($this->years * $factor); // Split calculation to prevent imprecision + + if ($yearPart) { + $this->years -= $yearPart / $factor; + } + + return $this->copyProperties( + static::create($yearPart) + ->microseconds(abs($this->totalMicroseconds) * $factor) + ->cascade(), + true + ); + } + + /** + * Divide and cascade current instance by a given divider. + * + * @param float|int $divider + * + * @return $this + */ + public function divide($divider) + { + return $this->multiply(1 / $divider); + } + + /** + * Get the interval_spec string of a date interval. + * + * @param DateInterval $interval + * + * @return string + */ + public static function getDateIntervalSpec(DateInterval $interval, bool $microseconds = false, array $skip = []) + { + $date = array_filter([ + static::PERIOD_YEARS => abs($interval->y), + static::PERIOD_MONTHS => abs($interval->m), + static::PERIOD_DAYS => abs($interval->d), + ]); + + if ( + $interval->days >= CarbonInterface::DAYS_PER_WEEK * CarbonInterface::WEEKS_PER_MONTH && + (!isset($date[static::PERIOD_YEARS]) || \count(array_intersect(['y', 'year', 'years'], $skip))) && + (!isset($date[static::PERIOD_MONTHS]) || \count(array_intersect(['m', 'month', 'months'], $skip))) + ) { + $date = [ + static::PERIOD_DAYS => abs($interval->days), + ]; + } + + $seconds = abs($interval->s); + if ($microseconds && $interval->f > 0) { + $seconds = sprintf('%d.%06d', $seconds, abs($interval->f) * 1000000); + } + + $time = array_filter([ + static::PERIOD_HOURS => abs($interval->h), + static::PERIOD_MINUTES => abs($interval->i), + static::PERIOD_SECONDS => $seconds, + ]); + + $specString = static::PERIOD_PREFIX; + + foreach ($date as $key => $value) { + $specString .= $value.$key; + } + + if (\count($time) > 0) { + $specString .= static::PERIOD_TIME_PREFIX; + foreach ($time as $key => $value) { + $specString .= $value.$key; + } + } + + return $specString === static::PERIOD_PREFIX ? 'PT0S' : $specString; + } + + /** + * Get the interval_spec string. + * + * @return string + */ + public function spec(bool $microseconds = false) + { + return static::getDateIntervalSpec($this, $microseconds); + } + + /** + * Comparing 2 date intervals. + * + * @param DateInterval $first + * @param DateInterval $second + * + * @return int + */ + public static function compareDateIntervals(DateInterval $first, DateInterval $second) + { + $current = Carbon::now(); + $passed = $current->avoidMutation()->add($second); + $current->add($first); + + if ($current < $passed) { + return -1; + } + if ($current > $passed) { + return 1; + } + + return 0; + } + + /** + * Comparing with passed interval. + * + * @param DateInterval $interval + * + * @return int + */ + public function compare(DateInterval $interval) + { + return static::compareDateIntervals($this, $interval); + } + + private function invertCascade(array $values) + { + return $this->set(array_map(function ($value) { + return -$value; + }, $values))->doCascade(true)->invert(); + } + + private function doCascade(bool $deep) + { + $originalData = $this->toArray(); + $originalData['milliseconds'] = (int) ($originalData['microseconds'] / static::getMicrosecondsPerMillisecond()); + $originalData['microseconds'] = $originalData['microseconds'] % static::getMicrosecondsPerMillisecond(); + $originalData['weeks'] = (int) ($this->d / static::getDaysPerWeek()); + $originalData['daysExcludeWeeks'] = fmod($this->d, static::getDaysPerWeek()); + unset($originalData['days']); + $newData = $originalData; + $previous = []; + + foreach (self::getFlipCascadeFactors() as $source => [$target, $factor]) { + foreach (['source', 'target'] as $key) { + if ($$key === 'dayz') { + $$key = 'daysExcludeWeeks'; + } + } + + $value = $newData[$source]; + $modulo = fmod($factor + fmod($value, $factor), $factor); + $newData[$source] = $modulo; + $newData[$target] += ($value - $modulo) / $factor; + + $decimalPart = fmod($newData[$source], 1); + + if ($decimalPart !== 0.0) { + $unit = $source; + + foreach ($previous as [$subUnit, $subFactor]) { + $newData[$unit] -= $decimalPart; + $newData[$subUnit] += $decimalPart * $subFactor; + $decimalPart = fmod($newData[$subUnit], 1); + + if ($decimalPart === 0.0) { + break; + } + + $unit = $subUnit; + } + } + + array_unshift($previous, [$source, $factor]); + } + + $positive = null; + + if (!$deep) { + foreach ($newData as $value) { + if ($value) { + if ($positive === null) { + $positive = ($value > 0); + + continue; + } + + if (($value > 0) !== $positive) { + return $this->invertCascade($originalData) + ->solveNegativeInterval(); + } + } + } + } + + return $this->set($newData) + ->solveNegativeInterval(); + } + + /** + * Convert overflowed values into bigger units. + * + * @return $this + */ + public function cascade() + { + return $this->doCascade(false); + } + + public function hasNegativeValues(): bool + { + foreach ($this->toArray() as $value) { + if ($value < 0) { + return true; + } + } + + return false; + } + + public function hasPositiveValues(): bool + { + foreach ($this->toArray() as $value) { + if ($value > 0) { + return true; + } + } + + return false; + } + + /** + * Get amount of given unit equivalent to the interval. + * + * @param string $unit + * + * @throws UnknownUnitException|UnitNotConfiguredException + * + * @return float + */ + public function total($unit) + { + $realUnit = $unit = strtolower($unit); + + if (\in_array($unit, ['days', 'weeks'])) { + $realUnit = 'dayz'; + } elseif (!\in_array($unit, ['microseconds', 'milliseconds', 'seconds', 'minutes', 'hours', 'dayz', 'months', 'years'])) { + throw new UnknownUnitException($unit); + } + + $result = 0; + $cumulativeFactor = 0; + $unitFound = false; + $factors = self::getFlipCascadeFactors(); + $daysPerWeek = (int) static::getDaysPerWeek(); + + $values = [ + 'years' => $this->years, + 'months' => $this->months, + 'weeks' => (int) ($this->d / $daysPerWeek), + 'dayz' => fmod($this->d, $daysPerWeek), + 'hours' => $this->hours, + 'minutes' => $this->minutes, + 'seconds' => $this->seconds, + 'milliseconds' => (int) ($this->microseconds / Carbon::MICROSECONDS_PER_MILLISECOND), + 'microseconds' => $this->microseconds % Carbon::MICROSECONDS_PER_MILLISECOND, + ]; + + if (isset($factors['dayz']) && $factors['dayz'][0] !== 'weeks') { + $values['dayz'] += $values['weeks'] * $daysPerWeek; + $values['weeks'] = 0; + } + + foreach ($factors as $source => [$target, $factor]) { + if ($source === $realUnit) { + $unitFound = true; + $value = $values[$source]; + $result += $value; + $cumulativeFactor = 1; + } + + if ($factor === false) { + if ($unitFound) { + break; + } + + $result = 0; + $cumulativeFactor = 0; + + continue; + } + + if ($target === $realUnit) { + $unitFound = true; + } + + if ($cumulativeFactor) { + $cumulativeFactor *= $factor; + $result += $values[$target] * $cumulativeFactor; + + continue; + } + + $value = $values[$source]; + + $result = ($result + $value) / $factor; + } + + if (isset($target) && !$cumulativeFactor) { + $result += $values[$target]; + } + + if (!$unitFound) { + throw new UnitNotConfiguredException($unit); + } + + if ($this->invert) { + $result *= -1; + } + + if ($unit === 'weeks') { + $result /= $daysPerWeek; + } + + // Cast as int numbers with no decimal part + return fmod($result, 1) === 0.0 ? (int) $result : $result; + } + + /** + * Determines if the instance is equal to another + * + * @param CarbonInterval|DateInterval|mixed $interval + * + * @see equalTo() + * + * @return bool + */ + public function eq($interval): bool + { + return $this->equalTo($interval); + } + + /** + * Determines if the instance is equal to another + * + * @param CarbonInterval|DateInterval|mixed $interval + * + * @return bool + */ + public function equalTo($interval): bool + { + $interval = $this->resolveInterval($interval); + + return $interval !== null && $this->totalMicroseconds === $interval->totalMicroseconds; + } + + /** + * Determines if the instance is not equal to another + * + * @param CarbonInterval|DateInterval|mixed $interval + * + * @see notEqualTo() + * + * @return bool + */ + public function ne($interval): bool + { + return $this->notEqualTo($interval); + } + + /** + * Determines if the instance is not equal to another + * + * @param CarbonInterval|DateInterval|mixed $interval + * + * @return bool + */ + public function notEqualTo($interval): bool + { + return !$this->eq($interval); + } + + /** + * Determines if the instance is greater (longer) than another + * + * @param CarbonInterval|DateInterval|mixed $interval + * + * @see greaterThan() + * + * @return bool + */ + public function gt($interval): bool + { + return $this->greaterThan($interval); + } + + /** + * Determines if the instance is greater (longer) than another + * + * @param CarbonInterval|DateInterval|mixed $interval + * + * @return bool + */ + public function greaterThan($interval): bool + { + $interval = $this->resolveInterval($interval); + + return $interval === null || $this->totalMicroseconds > $interval->totalMicroseconds; + } + + /** + * Determines if the instance is greater (longer) than or equal to another + * + * @param CarbonInterval|DateInterval|mixed $interval + * + * @see greaterThanOrEqualTo() + * + * @return bool + */ + public function gte($interval): bool + { + return $this->greaterThanOrEqualTo($interval); + } + + /** + * Determines if the instance is greater (longer) than or equal to another + * + * @param CarbonInterval|DateInterval|mixed $interval + * + * @return bool + */ + public function greaterThanOrEqualTo($interval): bool + { + return $this->greaterThan($interval) || $this->equalTo($interval); + } + + /** + * Determines if the instance is less (shorter) than another + * + * @param CarbonInterval|DateInterval|mixed $interval + * + * @see lessThan() + * + * @return bool + */ + public function lt($interval): bool + { + return $this->lessThan($interval); + } + + /** + * Determines if the instance is less (shorter) than another + * + * @param CarbonInterval|DateInterval|mixed $interval + * + * @return bool + */ + public function lessThan($interval): bool + { + $interval = $this->resolveInterval($interval); + + return $interval !== null && $this->totalMicroseconds < $interval->totalMicroseconds; + } + + /** + * Determines if the instance is less (shorter) than or equal to another + * + * @param CarbonInterval|DateInterval|mixed $interval + * + * @see lessThanOrEqualTo() + * + * @return bool + */ + public function lte($interval): bool + { + return $this->lessThanOrEqualTo($interval); + } + + /** + * Determines if the instance is less (shorter) than or equal to another + * + * @param CarbonInterval|DateInterval|mixed $interval + * + * @return bool + */ + public function lessThanOrEqualTo($interval): bool + { + return $this->lessThan($interval) || $this->equalTo($interval); + } + + /** + * Determines if the instance is between two others. + * + * The third argument allow you to specify if bounds are included or not (true by default) + * but for when you including/excluding bounds may produce different results in your application, + * we recommend to use the explicit methods ->betweenIncluded() or ->betweenExcluded() instead. + * + * @example + * ``` + * CarbonInterval::hours(48)->between(CarbonInterval::day(), CarbonInterval::days(3)); // true + * CarbonInterval::hours(48)->between(CarbonInterval::day(), CarbonInterval::hours(36)); // false + * CarbonInterval::hours(48)->between(CarbonInterval::day(), CarbonInterval::days(2)); // true + * CarbonInterval::hours(48)->between(CarbonInterval::day(), CarbonInterval::days(2), false); // false + * ``` + * + * @param CarbonInterval|DateInterval|mixed $interval1 + * @param CarbonInterval|DateInterval|mixed $interval2 + * @param bool $equal Indicates if an equal to comparison should be done + * + * @return bool + */ + public function between($interval1, $interval2, $equal = true): bool + { + return $equal + ? $this->greaterThanOrEqualTo($interval1) && $this->lessThanOrEqualTo($interval2) + : $this->greaterThan($interval1) && $this->lessThan($interval2); + } + + /** + * Determines if the instance is between two others, bounds excluded. + * + * @example + * ``` + * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::days(3)); // true + * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::hours(36)); // false + * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::days(2)); // true + * ``` + * + * @param CarbonInterval|DateInterval|mixed $interval1 + * @param CarbonInterval|DateInterval|mixed $interval2 + * + * @return bool + */ + public function betweenIncluded($interval1, $interval2): bool + { + return $this->between($interval1, $interval2, true); + } + + /** + * Determines if the instance is between two others, bounds excluded. + * + * @example + * ``` + * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::days(3)); // true + * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::hours(36)); // false + * CarbonInterval::hours(48)->betweenExcluded(CarbonInterval::day(), CarbonInterval::days(2)); // false + * ``` + * + * @param CarbonInterval|DateInterval|mixed $interval1 + * @param CarbonInterval|DateInterval|mixed $interval2 + * + * @return bool + */ + public function betweenExcluded($interval1, $interval2): bool + { + return $this->between($interval1, $interval2, false); + } + + /** + * Determines if the instance is between two others + * + * @example + * ``` + * CarbonInterval::hours(48)->isBetween(CarbonInterval::day(), CarbonInterval::days(3)); // true + * CarbonInterval::hours(48)->isBetween(CarbonInterval::day(), CarbonInterval::hours(36)); // false + * CarbonInterval::hours(48)->isBetween(CarbonInterval::day(), CarbonInterval::days(2)); // true + * CarbonInterval::hours(48)->isBetween(CarbonInterval::day(), CarbonInterval::days(2), false); // false + * ``` + * + * @param CarbonInterval|DateInterval|mixed $interval1 + * @param CarbonInterval|DateInterval|mixed $interval2 + * @param bool $equal Indicates if an equal to comparison should be done + * + * @return bool + */ + public function isBetween($interval1, $interval2, $equal = true): bool + { + return $this->between($interval1, $interval2, $equal); + } + + /** + * Round the current instance at the given unit with given precision if specified and the given function. + * + * @param string $unit + * @param float|int|string|DateInterval|null $precision + * @param string $function + * + * @throws Exception + * + * @return $this + */ + public function roundUnit($unit, $precision = 1, $function = 'round') + { + $base = CarbonImmutable::parse('2000-01-01 00:00:00', 'UTC') + ->roundUnit($unit, $precision, $function); + $next = $base->add($this); + $inverted = $next < $base; + + if ($inverted) { + $next = $base->sub($this); + } + + $this->copyProperties( + $next + ->roundUnit($unit, $precision, $function) + ->diffAsCarbonInterval($base) + ); + + return $this->invert($inverted); + } + + /** + * Truncate the current instance at the given unit with given precision if specified. + * + * @param string $unit + * @param float|int|string|DateInterval|null $precision + * + * @throws Exception + * + * @return $this + */ + public function floorUnit($unit, $precision = 1) + { + return $this->roundUnit($unit, $precision, 'floor'); + } + + /** + * Ceil the current instance at the given unit with given precision if specified. + * + * @param string $unit + * @param float|int|string|DateInterval|null $precision + * + * @throws Exception + * + * @return $this + */ + public function ceilUnit($unit, $precision = 1) + { + return $this->roundUnit($unit, $precision, 'ceil'); + } + + /** + * Round the current instance second with given precision if specified. + * + * @param float|int|string|DateInterval|null $precision + * @param string $function + * + * @throws Exception + * + * @return $this + */ + public function round($precision = 1, $function = 'round') + { + return $this->roundWith($precision, $function); + } + + /** + * Round the current instance second with given precision if specified. + * + * @param float|int|string|DateInterval|null $precision + * + * @throws Exception + * + * @return $this + */ + public function floor($precision = 1) + { + return $this->round($precision, 'floor'); + } + + /** + * Ceil the current instance second with given precision if specified. + * + * @param float|int|string|DateInterval|null $precision + * + * @throws Exception + * + * @return $this + */ + public function ceil($precision = 1) + { + return $this->round($precision, 'ceil'); + } + + private function needsDeclension(string $mode, int $index, int $parts): bool + { + switch ($mode) { + case 'last': + return $index === $parts - 1; + default: + return true; + } + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php b/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php new file mode 100644 index 0000000..36f04bf --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php @@ -0,0 +1,2686 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon; + +use Carbon\Exceptions\EndLessPeriodException; +use Carbon\Exceptions\InvalidCastException; +use Carbon\Exceptions\InvalidIntervalException; +use Carbon\Exceptions\InvalidPeriodDateException; +use Carbon\Exceptions\InvalidPeriodParameterException; +use Carbon\Exceptions\NotACarbonClassException; +use Carbon\Exceptions\NotAPeriodException; +use Carbon\Exceptions\UnknownGetterException; +use Carbon\Exceptions\UnknownMethodException; +use Carbon\Exceptions\UnreachableException; +use Carbon\Traits\IntervalRounding; +use Carbon\Traits\Mixin; +use Carbon\Traits\Options; +use Carbon\Traits\ToStringFormat; +use Closure; +use Countable; +use DateInterval; +use DatePeriod; +use DateTime; +use DateTimeImmutable; +use DateTimeInterface; +use DateTimeZone; +use InvalidArgumentException; +use Iterator; +use JsonSerializable; +use ReflectionException; +use ReturnTypeWillChange; +use RuntimeException; + +/** + * Substitution of DatePeriod with some modifications and many more features. + * + * @property-read int|float $recurrences number of recurrences (if end not set). + * @property-read bool $include_start_date rather the start date is included in the iteration. + * @property-read bool $include_end_date rather the end date is included in the iteration (if recurrences not set). + * @property-read CarbonInterface $start Period start date. + * @property-read CarbonInterface $current Current date from the iteration. + * @property-read CarbonInterface $end Period end date. + * @property-read CarbonInterval $interval Underlying date interval instance. Always present, one day by default. + * + * @method static CarbonPeriod start($date, $inclusive = null) Create instance specifying start date or modify the start date if called on an instance. + * @method static CarbonPeriod since($date, $inclusive = null) Alias for start(). + * @method static CarbonPeriod sinceNow($inclusive = null) Create instance with start date set to now or set the start date to now if called on an instance. + * @method static CarbonPeriod end($date = null, $inclusive = null) Create instance specifying end date or modify the end date if called on an instance. + * @method static CarbonPeriod until($date = null, $inclusive = null) Alias for end(). + * @method static CarbonPeriod untilNow($inclusive = null) Create instance with end date set to now or set the end date to now if called on an instance. + * @method static CarbonPeriod dates($start, $end = null) Create instance with start and end dates or modify the start and end dates if called on an instance. + * @method static CarbonPeriod between($start, $end = null) Create instance with start and end dates or modify the start and end dates if called on an instance. + * @method static CarbonPeriod recurrences($recurrences = null) Create instance with maximum number of recurrences or modify the number of recurrences if called on an instance. + * @method static CarbonPeriod times($recurrences = null) Alias for recurrences(). + * @method static CarbonPeriod options($options = null) Create instance with options or modify the options if called on an instance. + * @method static CarbonPeriod toggle($options, $state = null) Create instance with options toggled on or off, or toggle options if called on an instance. + * @method static CarbonPeriod filter($callback, $name = null) Create instance with filter added to the stack or append a filter if called on an instance. + * @method static CarbonPeriod push($callback, $name = null) Alias for filter(). + * @method static CarbonPeriod prepend($callback, $name = null) Create instance with filter prepended to the stack or prepend a filter if called on an instance. + * @method static CarbonPeriod filters(array $filters = []) Create instance with filters stack or replace the whole filters stack if called on an instance. + * @method static CarbonPeriod interval($interval) Create instance with given date interval or modify the interval if called on an instance. + * @method static CarbonPeriod each($interval) Create instance with given date interval or modify the interval if called on an instance. + * @method static CarbonPeriod every($interval) Create instance with given date interval or modify the interval if called on an instance. + * @method static CarbonPeriod step($interval) Create instance with given date interval or modify the interval if called on an instance. + * @method static CarbonPeriod stepBy($interval) Create instance with given date interval or modify the interval if called on an instance. + * @method static CarbonPeriod invert() Create instance with inverted date interval or invert the interval if called on an instance. + * @method static CarbonPeriod years($years = 1) Create instance specifying a number of years for date interval or replace the interval by the given a number of years if called on an instance. + * @method static CarbonPeriod year($years = 1) Alias for years(). + * @method static CarbonPeriod months($months = 1) Create instance specifying a number of months for date interval or replace the interval by the given a number of months if called on an instance. + * @method static CarbonPeriod month($months = 1) Alias for months(). + * @method static CarbonPeriod weeks($weeks = 1) Create instance specifying a number of weeks for date interval or replace the interval by the given a number of weeks if called on an instance. + * @method static CarbonPeriod week($weeks = 1) Alias for weeks(). + * @method static CarbonPeriod days($days = 1) Create instance specifying a number of days for date interval or replace the interval by the given a number of days if called on an instance. + * @method static CarbonPeriod dayz($days = 1) Alias for days(). + * @method static CarbonPeriod day($days = 1) Alias for days(). + * @method static CarbonPeriod hours($hours = 1) Create instance specifying a number of hours for date interval or replace the interval by the given a number of hours if called on an instance. + * @method static CarbonPeriod hour($hours = 1) Alias for hours(). + * @method static CarbonPeriod minutes($minutes = 1) Create instance specifying a number of minutes for date interval or replace the interval by the given a number of minutes if called on an instance. + * @method static CarbonPeriod minute($minutes = 1) Alias for minutes(). + * @method static CarbonPeriod seconds($seconds = 1) Create instance specifying a number of seconds for date interval or replace the interval by the given a number of seconds if called on an instance. + * @method static CarbonPeriod second($seconds = 1) Alias for seconds(). + * @method $this roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method $this roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method $this floorYear(float $precision = 1) Truncate the current instance year with given precision. + * @method $this floorYears(float $precision = 1) Truncate the current instance year with given precision. + * @method $this ceilYear(float $precision = 1) Ceil the current instance year with given precision. + * @method $this ceilYears(float $precision = 1) Ceil the current instance year with given precision. + * @method $this roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method $this roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method $this floorMonth(float $precision = 1) Truncate the current instance month with given precision. + * @method $this floorMonths(float $precision = 1) Truncate the current instance month with given precision. + * @method $this ceilMonth(float $precision = 1) Ceil the current instance month with given precision. + * @method $this ceilMonths(float $precision = 1) Ceil the current instance month with given precision. + * @method $this roundWeek(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method $this roundWeeks(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method $this floorWeek(float $precision = 1) Truncate the current instance day with given precision. + * @method $this floorWeeks(float $precision = 1) Truncate the current instance day with given precision. + * @method $this ceilWeek(float $precision = 1) Ceil the current instance day with given precision. + * @method $this ceilWeeks(float $precision = 1) Ceil the current instance day with given precision. + * @method $this roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method $this roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method $this floorDay(float $precision = 1) Truncate the current instance day with given precision. + * @method $this floorDays(float $precision = 1) Truncate the current instance day with given precision. + * @method $this ceilDay(float $precision = 1) Ceil the current instance day with given precision. + * @method $this ceilDays(float $precision = 1) Ceil the current instance day with given precision. + * @method $this roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method $this roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method $this floorHour(float $precision = 1) Truncate the current instance hour with given precision. + * @method $this floorHours(float $precision = 1) Truncate the current instance hour with given precision. + * @method $this ceilHour(float $precision = 1) Ceil the current instance hour with given precision. + * @method $this ceilHours(float $precision = 1) Ceil the current instance hour with given precision. + * @method $this roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method $this roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method $this floorMinute(float $precision = 1) Truncate the current instance minute with given precision. + * @method $this floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. + * @method $this ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. + * @method $this ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. + * @method $this roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method $this roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method $this floorSecond(float $precision = 1) Truncate the current instance second with given precision. + * @method $this floorSeconds(float $precision = 1) Truncate the current instance second with given precision. + * @method $this ceilSecond(float $precision = 1) Ceil the current instance second with given precision. + * @method $this ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. + * @method $this roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method $this roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method $this floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. + * @method $this floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. + * @method $this ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. + * @method $this ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. + * @method $this roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method $this roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method $this floorCentury(float $precision = 1) Truncate the current instance century with given precision. + * @method $this floorCenturies(float $precision = 1) Truncate the current instance century with given precision. + * @method $this ceilCentury(float $precision = 1) Ceil the current instance century with given precision. + * @method $this ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. + * @method $this roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method $this roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method $this floorDecade(float $precision = 1) Truncate the current instance decade with given precision. + * @method $this floorDecades(float $precision = 1) Truncate the current instance decade with given precision. + * @method $this ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. + * @method $this ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. + * @method $this roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method $this roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method $this floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. + * @method $this floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. + * @method $this ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. + * @method $this ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. + * @method $this roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method $this roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method $this floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method $this floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method $this ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method $this ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method $this roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method $this roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method $this floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method $this floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method $this ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method $this ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ +class CarbonPeriod implements Iterator, Countable, JsonSerializable +{ + use IntervalRounding; + use Mixin { + Mixin::mixin as baseMixin; + } + use Options; + use ToStringFormat; + + /** + * Built-in filter for limit by recurrences. + * + * @var callable + */ + public const RECURRENCES_FILTER = [self::class, 'filterRecurrences']; + + /** + * Built-in filter for limit to an end. + * + * @var callable + */ + public const END_DATE_FILTER = [self::class, 'filterEndDate']; + + /** + * Special value which can be returned by filters to end iteration. Also a filter. + * + * @var callable + */ + public const END_ITERATION = [self::class, 'endIteration']; + + /** + * Exclude start date from iteration. + * + * @var int + */ + public const EXCLUDE_START_DATE = 1; + + /** + * Exclude end date from iteration. + * + * @var int + */ + public const EXCLUDE_END_DATE = 2; + + /** + * Yield CarbonImmutable instances. + * + * @var int + */ + public const IMMUTABLE = 4; + + /** + * Number of maximum attempts before giving up on finding next valid date. + * + * @var int + */ + public const NEXT_MAX_ATTEMPTS = 1000; + + /** + * Number of maximum attempts before giving up on finding end date. + * + * @var int + */ + public const END_MAX_ATTEMPTS = 10000; + + /** + * The registered macros. + * + * @var array + */ + protected static $macros = []; + + /** + * Date class of iteration items. + * + * @var string + */ + protected $dateClass = Carbon::class; + + /** + * Underlying date interval instance. Always present, one day by default. + * + * @var CarbonInterval + */ + protected $dateInterval; + + /** + * Whether current date interval was set by default. + * + * @var bool + */ + protected $isDefaultInterval; + + /** + * The filters stack. + * + * @var array + */ + protected $filters = []; + + /** + * Period start date. Applied on rewind. Always present, now by default. + * + * @var CarbonInterface + */ + protected $startDate; + + /** + * Period end date. For inverted interval should be before the start date. Applied via a filter. + * + * @var CarbonInterface|null + */ + protected $endDate; + + /** + * Limit for number of recurrences. Applied via a filter. + * + * @var int|null + */ + protected $recurrences; + + /** + * Iteration options. + * + * @var int + */ + protected $options; + + /** + * Index of current date. Always sequential, even if some dates are skipped by filters. + * Equal to null only before the first iteration. + * + * @var int + */ + protected $key; + + /** + * Current date. May temporarily hold unaccepted value when looking for a next valid date. + * Equal to null only before the first iteration. + * + * @var CarbonInterface + */ + protected $current; + + /** + * Timezone of current date. Taken from the start date. + * + * @var \DateTimeZone|null + */ + protected $timezone; + + /** + * The cached validation result for current date. + * + * @var bool|string|null + */ + protected $validationResult; + + /** + * Timezone handler for settings() method. + * + * @var mixed + */ + protected $tzName; + + /** + * Make a CarbonPeriod instance from given variable if possible. + * + * @param mixed $var + * + * @return static|null + */ + public static function make($var) + { + try { + return static::instance($var); + } catch (NotAPeriodException $e) { + return static::create($var); + } + } + + /** + * Create a new instance from a DatePeriod or CarbonPeriod object. + * + * @param CarbonPeriod|DatePeriod $period + * + * @return static + */ + public static function instance($period) + { + if ($period instanceof static) { + return $period->copy(); + } + + if ($period instanceof self) { + return new static( + $period->getStartDate(), + $period->getEndDate() ?: $period->getRecurrences(), + $period->getDateInterval(), + $period->getOptions() + ); + } + + if ($period instanceof DatePeriod) { + return new static( + $period->start, + $period->end ?: ($period->recurrences - 1), + $period->interval, + $period->include_start_date ? 0 : static::EXCLUDE_START_DATE + ); + } + + $class = static::class; + $type = \gettype($period); + + throw new NotAPeriodException( + 'Argument 1 passed to '.$class.'::'.__METHOD__.'() '. + 'must be an instance of DatePeriod or '.$class.', '. + ($type === 'object' ? 'instance of '.\get_class($period) : $type).' given.' + ); + } + + /** + * Create a new instance. + * + * @return static + */ + public static function create(...$params) + { + return static::createFromArray($params); + } + + /** + * Create a new instance from an array of parameters. + * + * @param array $params + * + * @return static + */ + public static function createFromArray(array $params) + { + return new static(...$params); + } + + /** + * Create CarbonPeriod from ISO 8601 string. + * + * @param string $iso + * @param int|null $options + * + * @return static + */ + public static function createFromIso($iso, $options = null) + { + $params = static::parseIso8601($iso); + + $instance = static::createFromArray($params); + + if ($options !== null) { + $instance->setOptions($options); + } + + return $instance; + } + + /** + * Return whether given interval contains non zero value of any time unit. + * + * @param \DateInterval $interval + * + * @return bool + */ + protected static function intervalHasTime(DateInterval $interval) + { + return $interval->h || $interval->i || $interval->s || $interval->f; + } + + /** + * Return whether given variable is an ISO 8601 specification. + * + * Note: Check is very basic, as actual validation will be done later when parsing. + * We just want to ensure that variable is not any other type of a valid parameter. + * + * @param mixed $var + * + * @return bool + */ + protected static function isIso8601($var) + { + if (!\is_string($var)) { + return false; + } + + // Match slash but not within a timezone name. + $part = '[a-z]+(?:[_-][a-z]+)*'; + + preg_match("#\b$part/$part\b|(/)#i", $var, $match); + + return isset($match[1]); + } + + /** + * Parse given ISO 8601 string into an array of arguments. + * + * @SuppressWarnings(PHPMD.ElseExpression) + * + * @param string $iso + * + * @return array + */ + protected static function parseIso8601($iso) + { + $result = []; + + $interval = null; + $start = null; + $end = null; + + foreach (explode('/', $iso) as $key => $part) { + if ($key === 0 && preg_match('/^R(\d*|INF)$/', $part, $match)) { + $parsed = \strlen($match[1]) ? (($match[1] !== 'INF') ? (int) $match[1] : INF) : null; + } elseif ($interval === null && $parsed = CarbonInterval::make($part)) { + $interval = $part; + } elseif ($start === null && $parsed = Carbon::make($part)) { + $start = $part; + } elseif ($end === null && $parsed = Carbon::make(static::addMissingParts($start ?? '', $part))) { + $end = $part; + } else { + throw new InvalidPeriodParameterException("Invalid ISO 8601 specification: $iso."); + } + + $result[] = $parsed; + } + + return $result; + } + + /** + * Add missing parts of the target date from the soure date. + * + * @param string $source + * @param string $target + * + * @return string + */ + protected static function addMissingParts($source, $target) + { + $pattern = '/'.preg_replace('/\d+/', '[0-9]+', preg_quote($target, '/')).'$/'; + + $result = preg_replace($pattern, $target, $source, 1, $count); + + return $count ? $result : $target; + } + + /** + * Register a custom macro. + * + * @example + * ``` + * CarbonPeriod::macro('middle', function () { + * return $this->getStartDate()->average($this->getEndDate()); + * }); + * echo CarbonPeriod::since('2011-05-12')->until('2011-06-03')->middle(); + * ``` + * + * @param string $name + * @param object|callable $macro + * + * @return void + */ + public static function macro($name, $macro) + { + static::$macros[$name] = $macro; + } + + /** + * Register macros from a mixin object. + * + * @example + * ``` + * CarbonPeriod::mixin(new class { + * public function addDays() { + * return function ($count = 1) { + * return $this->setStartDate( + * $this->getStartDate()->addDays($count) + * )->setEndDate( + * $this->getEndDate()->addDays($count) + * ); + * }; + * } + * public function subDays() { + * return function ($count = 1) { + * return $this->setStartDate( + * $this->getStartDate()->subDays($count) + * )->setEndDate( + * $this->getEndDate()->subDays($count) + * ); + * }; + * } + * }); + * echo CarbonPeriod::create('2000-01-01', '2000-02-01')->addDays(5)->subDays(3); + * ``` + * + * @param object|string $mixin + * + * @throws ReflectionException + * + * @return void + */ + public static function mixin($mixin) + { + static::baseMixin($mixin); + } + + /** + * Check if macro is registered. + * + * @param string $name + * + * @return bool + */ + public static function hasMacro($name) + { + return isset(static::$macros[$name]); + } + + /** + * Provide static proxy for instance aliases. + * + * @param string $method + * @param array $parameters + * + * @return mixed + */ + public static function __callStatic($method, $parameters) + { + $date = new static(); + + if (static::hasMacro($method)) { + return static::bindMacroContext(null, function () use (&$method, &$parameters, &$date) { + return $date->callMacro($method, $parameters); + }); + } + + return $date->$method(...$parameters); + } + + /** + * CarbonPeriod constructor. + * + * @SuppressWarnings(PHPMD.ElseExpression) + * + * @throws InvalidArgumentException + */ + public function __construct(...$arguments) + { + // Parse and assign arguments one by one. First argument may be an ISO 8601 spec, + // which will be first parsed into parts and then processed the same way. + + $argumentsCount = \count($arguments); + + if ($argumentsCount && static::isIso8601($iso = $arguments[0])) { + array_splice($arguments, 0, 1, static::parseIso8601($iso)); + } + + if ($argumentsCount === 1) { + if ($arguments[0] instanceof DatePeriod) { + $arguments = [ + $arguments[0]->start, + $arguments[0]->end ?: ($arguments[0]->recurrences - 1), + $arguments[0]->interval, + $arguments[0]->include_start_date ? 0 : static::EXCLUDE_START_DATE, + ]; + } elseif ($arguments[0] instanceof self) { + $arguments = [ + $arguments[0]->getStartDate(), + $arguments[0]->getEndDate() ?: $arguments[0]->getRecurrences(), + $arguments[0]->getDateInterval(), + $arguments[0]->getOptions(), + ]; + } + } + + foreach ($arguments as $argument) { + $parsedDate = null; + + if ($argument instanceof DateTimeZone) { + $this->setTimezone($argument); + } elseif ($this->dateInterval === null && + ( + (\is_string($argument) && preg_match( + '/^(-?\d(\d(?![\/-])|[^\d\/-]([\/-])?)*|P[T\d].*|(?:\h*\d+(?:\.\d+)?\h*[a-z]+)+)$/i', + $argument + )) || + $argument instanceof DateInterval || + $argument instanceof Closure + ) && + $parsedInterval = @CarbonInterval::make($argument) + ) { + $this->setDateInterval($parsedInterval); + } elseif ($this->startDate === null && $parsedDate = $this->makeDateTime($argument)) { + $this->setStartDate($parsedDate); + } elseif ($this->endDate === null && ($parsedDate = $parsedDate ?? $this->makeDateTime($argument))) { + $this->setEndDate($parsedDate); + } elseif ($this->recurrences === null && $this->endDate === null && is_numeric($argument)) { + $this->setRecurrences($argument); + } elseif ($this->options === null && (\is_int($argument) || $argument === null)) { + $this->setOptions($argument); + } else { + throw new InvalidPeriodParameterException('Invalid constructor parameters.'); + } + } + + if ($this->startDate === null) { + $this->setStartDate(Carbon::now()); + } + + if ($this->dateInterval === null) { + $this->setDateInterval(CarbonInterval::day()); + + $this->isDefaultInterval = true; + } + + if ($this->options === null) { + $this->setOptions(0); + } + } + + /** + * Get a copy of the instance. + * + * @return static + */ + public function copy() + { + return clone $this; + } + + /** + * Get the getter for a property allowing both `DatePeriod` snakeCase and camelCase names. + * + * @param string $name + * + * @return callable|null + */ + protected function getGetter(string $name) + { + switch (strtolower(preg_replace('/[A-Z]/', '_$0', $name))) { + case 'start': + case 'start_date': + return [$this, 'getStartDate']; + case 'end': + case 'end_date': + return [$this, 'getEndDate']; + case 'interval': + case 'date_interval': + return [$this, 'getDateInterval']; + case 'recurrences': + return [$this, 'getRecurrences']; + case 'include_start_date': + return [$this, 'isStartIncluded']; + case 'include_end_date': + return [$this, 'isEndIncluded']; + case 'current': + return [$this, 'current']; + default: + return null; + } + } + + /** + * Get a property allowing both `DatePeriod` snakeCase and camelCase names. + * + * @param string $name + * + * @return bool|CarbonInterface|CarbonInterval|int|null + */ + public function get(string $name) + { + $getter = $this->getGetter($name); + + if ($getter) { + return $getter(); + } + + throw new UnknownGetterException($name); + } + + /** + * Get a property allowing both `DatePeriod` snakeCase and camelCase names. + * + * @param string $name + * + * @return bool|CarbonInterface|CarbonInterval|int|null + */ + public function __get(string $name) + { + return $this->get($name); + } + + /** + * Check if an attribute exists on the object + * + * @param string $name + * + * @return bool + */ + public function __isset(string $name): bool + { + return $this->getGetter($name) !== null; + } + + /** + * @alias copy + * + * Get a copy of the instance. + * + * @return static + */ + public function clone() + { + return clone $this; + } + + /** + * Set the iteration item class. + * + * @param string $dateClass + * + * @return $this + */ + public function setDateClass(string $dateClass) + { + if (!is_a($dateClass, CarbonInterface::class, true)) { + throw new NotACarbonClassException($dateClass); + } + + $this->dateClass = $dateClass; + + if (is_a($dateClass, Carbon::class, true)) { + $this->toggleOptions(static::IMMUTABLE, false); + } elseif (is_a($dateClass, CarbonImmutable::class, true)) { + $this->toggleOptions(static::IMMUTABLE, true); + } + + return $this; + } + + /** + * Returns iteration item date class. + * + * @return string + */ + public function getDateClass(): string + { + return $this->dateClass; + } + + /** + * Change the period date interval. + * + * @param DateInterval|string $interval + * + * @throws InvalidIntervalException + * + * @return $this + */ + public function setDateInterval($interval) + { + if (!$interval = CarbonInterval::make($interval)) { + throw new InvalidIntervalException('Invalid interval.'); + } + + if ($interval->spec() === 'PT0S' && !$interval->f && !$interval->getStep()) { + throw new InvalidIntervalException('Empty interval is not accepted.'); + } + + $this->dateInterval = $interval; + + $this->isDefaultInterval = false; + + $this->handleChangedParameters(); + + return $this; + } + + /** + * Invert the period date interval. + * + * @return $this + */ + public function invertDateInterval() + { + $interval = $this->dateInterval->invert(); + + return $this->setDateInterval($interval); + } + + /** + * Set start and end date. + * + * @param DateTime|DateTimeInterface|string $start + * @param DateTime|DateTimeInterface|string|null $end + * + * @return $this + */ + public function setDates($start, $end) + { + $this->setStartDate($start); + $this->setEndDate($end); + + return $this; + } + + /** + * Change the period options. + * + * @param int|null $options + * + * @throws InvalidArgumentException + * + * @return $this + */ + public function setOptions($options) + { + if (!\is_int($options) && $options !== null) { + throw new InvalidPeriodParameterException('Invalid options.'); + } + + $this->options = $options ?: 0; + + $this->handleChangedParameters(); + + return $this; + } + + /** + * Get the period options. + * + * @return int + */ + public function getOptions() + { + return $this->options; + } + + /** + * Toggle given options on or off. + * + * @param int $options + * @param bool|null $state + * + * @throws \InvalidArgumentException + * + * @return $this + */ + public function toggleOptions($options, $state = null) + { + if ($state === null) { + $state = ($this->options & $options) !== $options; + } + + return $this->setOptions( + $state ? + $this->options | $options : + $this->options & ~$options + ); + } + + /** + * Toggle EXCLUDE_START_DATE option. + * + * @param bool $state + * + * @return $this + */ + public function excludeStartDate($state = true) + { + return $this->toggleOptions(static::EXCLUDE_START_DATE, $state); + } + + /** + * Toggle EXCLUDE_END_DATE option. + * + * @param bool $state + * + * @return $this + */ + public function excludeEndDate($state = true) + { + return $this->toggleOptions(static::EXCLUDE_END_DATE, $state); + } + + /** + * Get the underlying date interval. + * + * @return CarbonInterval + */ + public function getDateInterval() + { + return $this->dateInterval->copy(); + } + + /** + * Get start date of the period. + * + * @param string|null $rounding Optional rounding 'floor', 'ceil', 'round' using the period interval. + * + * @return CarbonInterface + */ + public function getStartDate(string $rounding = null) + { + $date = $this->startDate->avoidMutation(); + + return $rounding ? $date->round($this->getDateInterval(), $rounding) : $date; + } + + /** + * Get end date of the period. + * + * @param string|null $rounding Optional rounding 'floor', 'ceil', 'round' using the period interval. + * + * @return CarbonInterface|null + */ + public function getEndDate(string $rounding = null) + { + if (!$this->endDate) { + return null; + } + + $date = $this->endDate->avoidMutation(); + + return $rounding ? $date->round($this->getDateInterval(), $rounding) : $date; + } + + /** + * Get number of recurrences. + * + * @return int|float|null + */ + public function getRecurrences() + { + return $this->recurrences; + } + + /** + * Returns true if the start date should be excluded. + * + * @return bool + */ + public function isStartExcluded() + { + return ($this->options & static::EXCLUDE_START_DATE) !== 0; + } + + /** + * Returns true if the end date should be excluded. + * + * @return bool + */ + public function isEndExcluded() + { + return ($this->options & static::EXCLUDE_END_DATE) !== 0; + } + + /** + * Returns true if the start date should be included. + * + * @return bool + */ + public function isStartIncluded() + { + return !$this->isStartExcluded(); + } + + /** + * Returns true if the end date should be included. + * + * @return bool + */ + public function isEndIncluded() + { + return !$this->isEndExcluded(); + } + + /** + * Return the start if it's included by option, else return the start + 1 period interval. + * + * @return CarbonInterface + */ + public function getIncludedStartDate() + { + $start = $this->getStartDate(); + + if ($this->isStartExcluded()) { + return $start->add($this->getDateInterval()); + } + + return $start; + } + + /** + * Return the end if it's included by option, else return the end - 1 period interval. + * Warning: if the period has no fixed end, this method will iterate the period to calculate it. + * + * @return CarbonInterface + */ + public function getIncludedEndDate() + { + $end = $this->getEndDate(); + + if (!$end) { + return $this->calculateEnd(); + } + + if ($this->isEndExcluded()) { + return $end->sub($this->getDateInterval()); + } + + return $end; + } + + /** + * Add a filter to the stack. + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * + * @param callable $callback + * @param string $name + * + * @return $this + */ + public function addFilter($callback, $name = null) + { + $tuple = $this->createFilterTuple(\func_get_args()); + + $this->filters[] = $tuple; + + $this->handleChangedParameters(); + + return $this; + } + + /** + * Prepend a filter to the stack. + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * + * @param callable $callback + * @param string $name + * + * @return $this + */ + public function prependFilter($callback, $name = null) + { + $tuple = $this->createFilterTuple(\func_get_args()); + + array_unshift($this->filters, $tuple); + + $this->handleChangedParameters(); + + return $this; + } + + /** + * Remove a filter by instance or name. + * + * @param callable|string $filter + * + * @return $this + */ + public function removeFilter($filter) + { + $key = \is_callable($filter) ? 0 : 1; + + $this->filters = array_values(array_filter( + $this->filters, + function ($tuple) use ($key, $filter) { + return $tuple[$key] !== $filter; + } + )); + + $this->updateInternalState(); + + $this->handleChangedParameters(); + + return $this; + } + + /** + * Return whether given instance or name is in the filter stack. + * + * @param callable|string $filter + * + * @return bool + */ + public function hasFilter($filter) + { + $key = \is_callable($filter) ? 0 : 1; + + foreach ($this->filters as $tuple) { + if ($tuple[$key] === $filter) { + return true; + } + } + + return false; + } + + /** + * Get filters stack. + * + * @return array + */ + public function getFilters() + { + return $this->filters; + } + + /** + * Set filters stack. + * + * @param array $filters + * + * @return $this + */ + public function setFilters(array $filters) + { + $this->filters = $filters; + + $this->updateInternalState(); + + $this->handleChangedParameters(); + + return $this; + } + + /** + * Reset filters stack. + * + * @return $this + */ + public function resetFilters() + { + $this->filters = []; + + if ($this->endDate !== null) { + $this->filters[] = [static::END_DATE_FILTER, null]; + } + + if ($this->recurrences !== null) { + $this->filters[] = [static::RECURRENCES_FILTER, null]; + } + + $this->handleChangedParameters(); + + return $this; + } + + /** + * Add a recurrences filter (set maximum number of recurrences). + * + * @param int|float|null $recurrences + * + * @throws InvalidArgumentException + * + * @return $this + */ + public function setRecurrences($recurrences) + { + if ((!is_numeric($recurrences) && $recurrences !== null) || $recurrences < 0) { + throw new InvalidPeriodParameterException('Invalid number of recurrences.'); + } + + if ($recurrences === null) { + return $this->removeFilter(static::RECURRENCES_FILTER); + } + + $this->recurrences = $recurrences === INF ? INF : (int) $recurrences; + + if (!$this->hasFilter(static::RECURRENCES_FILTER)) { + return $this->addFilter(static::RECURRENCES_FILTER); + } + + $this->handleChangedParameters(); + + return $this; + } + + /** + * Change the period start date. + * + * @param DateTime|DateTimeInterface|string $date + * @param bool|null $inclusive + * + * @throws InvalidPeriodDateException + * + * @return $this + */ + public function setStartDate($date, $inclusive = null) + { + if (!$this->isInfiniteDate($date) && !($date = ([$this->dateClass, 'make'])($date))) { + throw new InvalidPeriodDateException('Invalid start date.'); + } + + $this->startDate = $date; + + if ($inclusive !== null) { + $this->toggleOptions(static::EXCLUDE_START_DATE, !$inclusive); + } + + return $this; + } + + /** + * Change the period end date. + * + * @param DateTime|DateTimeInterface|string|null $date + * @param bool|null $inclusive + * + * @throws \InvalidArgumentException + * + * @return $this + */ + public function setEndDate($date, $inclusive = null) + { + if ($date !== null && !$this->isInfiniteDate($date) && !$date = ([$this->dateClass, 'make'])($date)) { + throw new InvalidPeriodDateException('Invalid end date.'); + } + + if (!$date) { + return $this->removeFilter(static::END_DATE_FILTER); + } + + $this->endDate = $date; + + if ($inclusive !== null) { + $this->toggleOptions(static::EXCLUDE_END_DATE, !$inclusive); + } + + if (!$this->hasFilter(static::END_DATE_FILTER)) { + return $this->addFilter(static::END_DATE_FILTER); + } + + $this->handleChangedParameters(); + + return $this; + } + + /** + * Check if the current position is valid. + * + * @return bool + */ + #[ReturnTypeWillChange] + public function valid() + { + return $this->validateCurrentDate() === true; + } + + /** + * Return the current key. + * + * @return int|null + */ + #[ReturnTypeWillChange] + public function key() + { + return $this->valid() + ? $this->key + : null; + } + + /** + * Return the current date. + * + * @return CarbonInterface|null + */ + #[ReturnTypeWillChange] + public function current() + { + return $this->valid() + ? $this->prepareForReturn($this->current) + : null; + } + + /** + * Move forward to the next date. + * + * @throws RuntimeException + * + * @return void + */ + #[ReturnTypeWillChange] + public function next() + { + if ($this->current === null) { + $this->rewind(); + } + + if ($this->validationResult !== static::END_ITERATION) { + $this->key++; + + $this->incrementCurrentDateUntilValid(); + } + } + + /** + * Rewind to the start date. + * + * Iterating over a date in the UTC timezone avoids bug during backward DST change. + * + * @see https://bugs.php.net/bug.php?id=72255 + * @see https://bugs.php.net/bug.php?id=74274 + * @see https://wiki.php.net/rfc/datetime_and_daylight_saving_time + * + * @throws RuntimeException + * + * @return void + */ + #[ReturnTypeWillChange] + public function rewind() + { + $this->key = 0; + $this->current = ([$this->dateClass, 'make'])($this->startDate); + $settings = $this->getSettings(); + + if ($this->hasLocalTranslator()) { + $settings['locale'] = $this->getTranslatorLocale(); + } + + $this->current->settings($settings); + $this->timezone = static::intervalHasTime($this->dateInterval) ? $this->current->getTimezone() : null; + + if ($this->timezone) { + $this->current = $this->current->utc(); + } + + $this->validationResult = null; + + if ($this->isStartExcluded() || $this->validateCurrentDate() === false) { + $this->incrementCurrentDateUntilValid(); + } + } + + /** + * Skip iterations and returns iteration state (false if ended, true if still valid). + * + * @param int $count steps number to skip (1 by default) + * + * @return bool + */ + public function skip($count = 1) + { + for ($i = $count; $this->valid() && $i > 0; $i--) { + $this->next(); + } + + return $this->valid(); + } + + /** + * Format the date period as ISO 8601. + * + * @return string + */ + public function toIso8601String() + { + $parts = []; + + if ($this->recurrences !== null) { + $parts[] = 'R'.$this->recurrences; + } + + $parts[] = $this->startDate->toIso8601String(); + + $parts[] = $this->dateInterval->spec(); + + if ($this->endDate !== null) { + $parts[] = $this->endDate->toIso8601String(); + } + + return implode('/', $parts); + } + + /** + * Convert the date period into a string. + * + * @return string + */ + public function toString() + { + $format = $this->localToStringFormat ?? static::$toStringFormat; + + if ($format instanceof Closure) { + return $format($this); + } + + $translator = ([$this->dateClass, 'getTranslator'])(); + + $parts = []; + + $format = $format ?? ( + !$this->startDate->isStartOfDay() || ($this->endDate && !$this->endDate->isStartOfDay()) + ? 'Y-m-d H:i:s' + : 'Y-m-d' + ); + + if ($this->recurrences !== null) { + $parts[] = $this->translate('period_recurrences', [], $this->recurrences, $translator); + } + + $parts[] = $this->translate('period_interval', [':interval' => $this->dateInterval->forHumans([ + 'join' => true, + ])], null, $translator); + + $parts[] = $this->translate('period_start_date', [':date' => $this->startDate->rawFormat($format)], null, $translator); + + if ($this->endDate !== null) { + $parts[] = $this->translate('period_end_date', [':date' => $this->endDate->rawFormat($format)], null, $translator); + } + + $result = implode(' ', $parts); + + return mb_strtoupper(mb_substr($result, 0, 1)).mb_substr($result, 1); + } + + /** + * Format the date period as ISO 8601. + * + * @return string + */ + public function spec() + { + return $this->toIso8601String(); + } + + /** + * Cast the current instance into the given class. + * + * @param string $className The $className::instance() method will be called to cast the current object. + * + * @return DatePeriod + */ + public function cast(string $className) + { + if (!method_exists($className, 'instance')) { + if (is_a($className, DatePeriod::class, true)) { + return new $className( + $this->rawDate($this->getStartDate()), + $this->getDateInterval(), + $this->getEndDate() ? $this->rawDate($this->getIncludedEndDate()) : $this->getRecurrences(), + $this->isStartExcluded() ? DatePeriod::EXCLUDE_START_DATE : 0 + ); + } + + throw new InvalidCastException("$className has not the instance() method needed to cast the date."); + } + + return $className::instance($this); + } + + /** + * Return native DatePeriod PHP object matching the current instance. + * + * @example + * ``` + * var_dump(CarbonPeriod::create('2021-01-05', '2021-02-15')->toDatePeriod()); + * ``` + * + * @return DatePeriod + */ + public function toDatePeriod() + { + return $this->cast(DatePeriod::class); + } + + /** + * Return `true` if the period has no custom filter and is guaranteed to be endless. + * + * Note that we can't check if a period is endless as soon as it has custom filters + * because filters can emit `CarbonPeriod::END_ITERATION` to stop the iteration in + * a way we can't predict without actually iterating the period. + */ + public function isUnfilteredAndEndLess(): bool + { + foreach ($this->filters as $filter) { + switch ($filter) { + case [static::RECURRENCES_FILTER, null]: + if ($this->recurrences !== null && is_finite($this->recurrences)) { + return false; + } + + break; + + case [static::END_DATE_FILTER, null]: + if ($this->endDate !== null && !$this->endDate->isEndOfTime()) { + return false; + } + + break; + + default: + return false; + } + } + + return true; + } + + /** + * Convert the date period into an array without changing current iteration state. + * + * @return CarbonInterface[] + */ + public function toArray() + { + if ($this->isUnfilteredAndEndLess()) { + throw new EndLessPeriodException("Endless period can't be converted to array nor counted."); + } + + $state = [ + $this->key, + $this->current ? $this->current->avoidMutation() : null, + $this->validationResult, + ]; + + $result = iterator_to_array($this); + + [$this->key, $this->current, $this->validationResult] = $state; + + return $result; + } + + /** + * Count dates in the date period. + * + * @return int + */ + #[ReturnTypeWillChange] + public function count() + { + return \count($this->toArray()); + } + + /** + * Return the first date in the date period. + * + * @return CarbonInterface|null + */ + public function first() + { + if ($this->isUnfilteredAndEndLess()) { + foreach ($this as $date) { + $this->rewind(); + + return $date; + } + + return null; + } + + return ($this->toArray() ?: [])[0] ?? null; + } + + /** + * Return the last date in the date period. + * + * @return CarbonInterface|null + */ + public function last() + { + $array = $this->toArray(); + + return $array ? $array[\count($array) - 1] : null; + } + + /** + * Convert the date period into a string. + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } + + /** + * Add aliases for setters. + * + * CarbonPeriod::days(3)->hours(5)->invert() + * ->sinceNow()->until('2010-01-10') + * ->filter(...) + * ->count() + * + * Note: We use magic method to let static and instance aliases with the same names. + * + * @param string $method + * @param array $parameters + * + * @return mixed + */ + public function __call($method, $parameters) + { + if (static::hasMacro($method)) { + return static::bindMacroContext($this, function () use (&$method, &$parameters) { + return $this->callMacro($method, $parameters); + }); + } + + $roundedValue = $this->callRoundMethod($method, $parameters); + + if ($roundedValue !== null) { + return $roundedValue; + } + + switch ($method) { + case 'start': + case 'since': + self::setDefaultParameters($parameters, [ + [0, 'date', null], + ]); + + return $this->setStartDate(...$parameters); + + case 'sinceNow': + return $this->setStartDate(new Carbon(), ...$parameters); + + case 'end': + case 'until': + self::setDefaultParameters($parameters, [ + [0, 'date', null], + ]); + + return $this->setEndDate(...$parameters); + + case 'untilNow': + return $this->setEndDate(new Carbon(), ...$parameters); + + case 'dates': + case 'between': + self::setDefaultParameters($parameters, [ + [0, 'start', null], + [1, 'end', null], + ]); + + return $this->setDates(...$parameters); + + case 'recurrences': + case 'times': + self::setDefaultParameters($parameters, [ + [0, 'recurrences', null], + ]); + + return $this->setRecurrences(...$parameters); + + case 'options': + self::setDefaultParameters($parameters, [ + [0, 'options', null], + ]); + + return $this->setOptions(...$parameters); + + case 'toggle': + self::setDefaultParameters($parameters, [ + [0, 'options', null], + ]); + + return $this->toggleOptions(...$parameters); + + case 'filter': + case 'push': + return $this->addFilter(...$parameters); + + case 'prepend': + return $this->prependFilter(...$parameters); + + case 'filters': + self::setDefaultParameters($parameters, [ + [0, 'filters', []], + ]); + + return $this->setFilters(...$parameters); + + case 'interval': + case 'each': + case 'every': + case 'step': + case 'stepBy': + return $this->setDateInterval(...$parameters); + + case 'invert': + return $this->invertDateInterval(); + + case 'years': + case 'year': + case 'months': + case 'month': + case 'weeks': + case 'week': + case 'days': + case 'dayz': + case 'day': + case 'hours': + case 'hour': + case 'minutes': + case 'minute': + case 'seconds': + case 'second': + return $this->setDateInterval(( + // Override default P1D when instantiating via fluent setters. + [$this->isDefaultInterval ? new CarbonInterval('PT0S') : $this->dateInterval, $method] + )(...$parameters)); + } + + if ($this->localStrictModeEnabled ?? Carbon::isStrictModeEnabled()) { + throw new UnknownMethodException($method); + } + + return $this; + } + + /** + * Set the instance's timezone from a string or object and apply it to start/end. + * + * @param \DateTimeZone|string $timezone + * + * @return static + */ + public function setTimezone($timezone) + { + $this->tzName = $timezone; + $this->timezone = $timezone; + + if ($this->startDate) { + $this->setStartDate($this->startDate->setTimezone($timezone)); + } + + if ($this->endDate) { + $this->setEndDate($this->endDate->setTimezone($timezone)); + } + + return $this; + } + + /** + * Set the instance's timezone from a string or object and add/subtract the offset difference to start/end. + * + * @param \DateTimeZone|string $timezone + * + * @return static + */ + public function shiftTimezone($timezone) + { + $this->tzName = $timezone; + $this->timezone = $timezone; + + if ($this->startDate) { + $this->setStartDate($this->startDate->shiftTimezone($timezone)); + } + + if ($this->endDate) { + $this->setEndDate($this->endDate->shiftTimezone($timezone)); + } + + return $this; + } + + /** + * Returns the end is set, else calculated from start an recurrences. + * + * @param string|null $rounding Optional rounding 'floor', 'ceil', 'round' using the period interval. + * + * @return CarbonInterface + */ + public function calculateEnd(string $rounding = null) + { + if ($end = $this->getEndDate($rounding)) { + return $end; + } + + if ($this->dateInterval->isEmpty()) { + return $this->getStartDate($rounding); + } + + $date = $this->getEndFromRecurrences() ?? $this->iterateUntilEnd(); + + if ($date && $rounding) { + $date = $date->avoidMutation()->round($this->getDateInterval(), $rounding); + } + + return $date; + } + + /** + * @return CarbonInterface|null + */ + private function getEndFromRecurrences() + { + if ($this->recurrences === null) { + throw new UnreachableException( + "Could not calculate period end without either explicit end or recurrences.\n". + "If you're looking for a forever-period, use ->setRecurrences(INF)." + ); + } + + if ($this->recurrences === INF) { + $start = $this->getStartDate(); + + return $start < $start->avoidMutation()->add($this->getDateInterval()) + ? CarbonImmutable::endOfTime() + : CarbonImmutable::startOfTime(); + } + + if ($this->filters === [[static::RECURRENCES_FILTER, null]]) { + return $this->getStartDate()->avoidMutation()->add( + $this->getDateInterval()->times( + $this->recurrences - ($this->isStartExcluded() ? 0 : 1) + ) + ); + } + + return null; + } + + /** + * @return CarbonInterface|null + */ + private function iterateUntilEnd() + { + $attempts = 0; + $date = null; + + foreach ($this as $date) { + if (++$attempts > static::END_MAX_ATTEMPTS) { + throw new UnreachableException( + 'Could not calculate period end after iterating '.static::END_MAX_ATTEMPTS.' times.' + ); + } + } + + return $date; + } + + /** + * Returns true if the current period overlaps the given one (if 1 parameter passed) + * or the period between 2 dates (if 2 parameters passed). + * + * @param CarbonPeriod|\DateTimeInterface|Carbon|CarbonImmutable|string $rangeOrRangeStart + * @param \DateTimeInterface|Carbon|CarbonImmutable|string|null $rangeEnd + * + * @return bool + */ + public function overlaps($rangeOrRangeStart, $rangeEnd = null) + { + $range = $rangeEnd ? static::create($rangeOrRangeStart, $rangeEnd) : $rangeOrRangeStart; + + if (!($range instanceof self)) { + $range = static::create($range); + } + + [$start, $end] = $this->orderCouple($this->getStartDate(), $this->calculateEnd()); + [$rangeStart, $rangeEnd] = $this->orderCouple($range->getStartDate(), $range->calculateEnd()); + + return $end > $rangeStart && $rangeEnd > $start; + } + + /** + * Execute a given function on each date of the period. + * + * @example + * ``` + * Carbon::create('2020-11-29')->daysUntil('2020-12-24')->forEach(function (Carbon $date) { + * echo $date->diffInDays('2020-12-25')." days before Christmas!\n"; + * }); + * ``` + * + * @param callable $callback + */ + public function forEach(callable $callback) + { + foreach ($this as $date) { + $callback($date); + } + } + + /** + * Execute a given function on each date of the period and yield the result of this function. + * + * @example + * ``` + * $period = Carbon::create('2020-11-29')->daysUntil('2020-12-24'); + * echo implode("\n", iterator_to_array($period->map(function (Carbon $date) { + * return $date->diffInDays('2020-12-25').' days before Christmas!'; + * }))); + * ``` + * + * @param callable $callback + * + * @return \Generator + */ + public function map(callable $callback) + { + foreach ($this as $date) { + yield $callback($date); + } + } + + /** + * Determines if the instance is equal to another. + * Warning: if options differ, instances wil never be equal. + * + * @param mixed $period + * + * @see equalTo() + * + * @return bool + */ + public function eq($period): bool + { + return $this->equalTo($period); + } + + /** + * Determines if the instance is equal to another. + * Warning: if options differ, instances wil never be equal. + * + * @param mixed $period + * + * @return bool + */ + public function equalTo($period): bool + { + if (!($period instanceof self)) { + $period = self::make($period); + } + + $end = $this->getEndDate(); + + return $period !== null + && $this->getDateInterval()->eq($period->getDateInterval()) + && $this->getStartDate()->eq($period->getStartDate()) + && ($end ? $end->eq($period->getEndDate()) : $this->getRecurrences() === $period->getRecurrences()) + && ($this->getOptions() & (~static::IMMUTABLE)) === ($period->getOptions() & (~static::IMMUTABLE)); + } + + /** + * Determines if the instance is not equal to another. + * Warning: if options differ, instances wil never be equal. + * + * @param mixed $period + * + * @see notEqualTo() + * + * @return bool + */ + public function ne($period): bool + { + return $this->notEqualTo($period); + } + + /** + * Determines if the instance is not equal to another. + * Warning: if options differ, instances wil never be equal. + * + * @param mixed $period + * + * @return bool + */ + public function notEqualTo($period): bool + { + return !$this->eq($period); + } + + /** + * Determines if the start date is before an other given date. + * (Rather start/end are included by options is ignored.) + * + * @param mixed $date + * + * @return bool + */ + public function startsBefore($date = null): bool + { + return $this->getStartDate()->lessThan($this->resolveCarbon($date)); + } + + /** + * Determines if the start date is before or the same as a given date. + * (Rather start/end are included by options is ignored.) + * + * @param mixed $date + * + * @return bool + */ + public function startsBeforeOrAt($date = null): bool + { + return $this->getStartDate()->lessThanOrEqualTo($this->resolveCarbon($date)); + } + + /** + * Determines if the start date is after an other given date. + * (Rather start/end are included by options is ignored.) + * + * @param mixed $date + * + * @return bool + */ + public function startsAfter($date = null): bool + { + return $this->getStartDate()->greaterThan($this->resolveCarbon($date)); + } + + /** + * Determines if the start date is after or the same as a given date. + * (Rather start/end are included by options is ignored.) + * + * @param mixed $date + * + * @return bool + */ + public function startsAfterOrAt($date = null): bool + { + return $this->getStartDate()->greaterThanOrEqualTo($this->resolveCarbon($date)); + } + + /** + * Determines if the start date is the same as a given date. + * (Rather start/end are included by options is ignored.) + * + * @param mixed $date + * + * @return bool + */ + public function startsAt($date = null): bool + { + return $this->getStartDate()->equalTo($this->resolveCarbon($date)); + } + + /** + * Determines if the end date is before an other given date. + * (Rather start/end are included by options is ignored.) + * + * @param mixed $date + * + * @return bool + */ + public function endsBefore($date = null): bool + { + return $this->calculateEnd()->lessThan($this->resolveCarbon($date)); + } + + /** + * Determines if the end date is before or the same as a given date. + * (Rather start/end are included by options is ignored.) + * + * @param mixed $date + * + * @return bool + */ + public function endsBeforeOrAt($date = null): bool + { + return $this->calculateEnd()->lessThanOrEqualTo($this->resolveCarbon($date)); + } + + /** + * Determines if the end date is after an other given date. + * (Rather start/end are included by options is ignored.) + * + * @param mixed $date + * + * @return bool + */ + public function endsAfter($date = null): bool + { + return $this->calculateEnd()->greaterThan($this->resolveCarbon($date)); + } + + /** + * Determines if the end date is after or the same as a given date. + * (Rather start/end are included by options is ignored.) + * + * @param mixed $date + * + * @return bool + */ + public function endsAfterOrAt($date = null): bool + { + return $this->calculateEnd()->greaterThanOrEqualTo($this->resolveCarbon($date)); + } + + /** + * Determines if the end date is the same as a given date. + * (Rather start/end are included by options is ignored.) + * + * @param mixed $date + * + * @return bool + */ + public function endsAt($date = null): bool + { + return $this->calculateEnd()->equalTo($this->resolveCarbon($date)); + } + + /** + * Return true if start date is now or later. + * (Rather start/end are included by options is ignored.) + * + * @return bool + */ + public function isStarted(): bool + { + return $this->startsBeforeOrAt(); + } + + /** + * Return true if end date is now or later. + * (Rather start/end are included by options is ignored.) + * + * @return bool + */ + public function isEnded(): bool + { + return $this->endsBeforeOrAt(); + } + + /** + * Return true if now is between start date (included) and end date (excluded). + * (Rather start/end are included by options is ignored.) + * + * @return bool + */ + public function isInProgress(): bool + { + return $this->isStarted() && !$this->isEnded(); + } + + /** + * Round the current instance at the given unit with given precision if specified and the given function. + * + * @param string $unit + * @param float|int|string|\DateInterval|null $precision + * @param string $function + * + * @return $this + */ + public function roundUnit($unit, $precision = 1, $function = 'round') + { + $this->setStartDate($this->getStartDate()->roundUnit($unit, $precision, $function)); + + if ($this->endDate) { + $this->setEndDate($this->getEndDate()->roundUnit($unit, $precision, $function)); + } + + $this->setDateInterval($this->getDateInterval()->roundUnit($unit, $precision, $function)); + + return $this; + } + + /** + * Truncate the current instance at the given unit with given precision if specified. + * + * @param string $unit + * @param float|int|string|\DateInterval|null $precision + * + * @return $this + */ + public function floorUnit($unit, $precision = 1) + { + return $this->roundUnit($unit, $precision, 'floor'); + } + + /** + * Ceil the current instance at the given unit with given precision if specified. + * + * @param string $unit + * @param float|int|string|\DateInterval|null $precision + * + * @return $this + */ + public function ceilUnit($unit, $precision = 1) + { + return $this->roundUnit($unit, $precision, 'ceil'); + } + + /** + * Round the current instance second with given precision if specified (else period interval is used). + * + * @param float|int|string|\DateInterval|null $precision + * @param string $function + * + * @return $this + */ + public function round($precision = null, $function = 'round') + { + return $this->roundWith( + $precision ?? $this->getDateInterval()->setLocalTranslator(TranslatorImmutable::get('en'))->forHumans(), + $function + ); + } + + /** + * Round the current instance second with given precision if specified (else period interval is used). + * + * @param float|int|string|\DateInterval|null $precision + * + * @return $this + */ + public function floor($precision = null) + { + return $this->round($precision, 'floor'); + } + + /** + * Ceil the current instance second with given precision if specified (else period interval is used). + * + * @param float|int|string|\DateInterval|null $precision + * + * @return $this + */ + public function ceil($precision = null) + { + return $this->round($precision, 'ceil'); + } + + /** + * Specify data which should be serialized to JSON. + * + * @link https://php.net/manual/en/jsonserializable.jsonserialize.php + * + * @return CarbonInterface[] + */ + #[ReturnTypeWillChange] + public function jsonSerialize() + { + return $this->toArray(); + } + + /** + * Return true if the given date is between start and end. + * + * @param \Carbon\Carbon|\Carbon\CarbonPeriod|\Carbon\CarbonInterval|\DateInterval|\DatePeriod|\DateTimeInterface|string|null $date + * + * @return bool + */ + public function contains($date = null): bool + { + $startMethod = 'startsBefore'.($this->isStartIncluded() ? 'OrAt' : ''); + $endMethod = 'endsAfter'.($this->isEndIncluded() ? 'OrAt' : ''); + + return $this->$startMethod($date) && $this->$endMethod($date); + } + + /** + * Return true if the current period follows a given other period (with no overlap). + * For instance, [2019-08-01 -> 2019-08-12] follows [2019-07-29 -> 2019-07-31] + * Note than in this example, follows() would be false if 2019-08-01 or 2019-07-31 was excluded by options. + * + * @param \Carbon\CarbonPeriod|\DatePeriod|string $period + * + * @return bool + */ + public function follows($period, ...$arguments): bool + { + $period = $this->resolveCarbonPeriod($period, ...$arguments); + + return $this->getIncludedStartDate()->equalTo($period->getIncludedEndDate()->add($period->getDateInterval())); + } + + /** + * Return true if the given other period follows the current one (with no overlap). + * For instance, [2019-07-29 -> 2019-07-31] is followed by [2019-08-01 -> 2019-08-12] + * Note than in this example, isFollowedBy() would be false if 2019-08-01 or 2019-07-31 was excluded by options. + * + * @param \Carbon\CarbonPeriod|\DatePeriod|string $period + * + * @return bool + */ + public function isFollowedBy($period, ...$arguments): bool + { + $period = $this->resolveCarbonPeriod($period, ...$arguments); + + return $period->follows($this); + } + + /** + * Return true if the given period either follows or is followed by the current one. + * + * @see follows() + * @see isFollowedBy() + * + * @param \Carbon\CarbonPeriod|\DatePeriod|string $period + * + * @return bool + */ + public function isConsecutiveWith($period, ...$arguments): bool + { + return $this->follows($period, ...$arguments) || $this->isFollowedBy($period, ...$arguments); + } + + /** + * Update properties after removing built-in filters. + * + * @return void + */ + protected function updateInternalState() + { + if (!$this->hasFilter(static::END_DATE_FILTER)) { + $this->endDate = null; + } + + if (!$this->hasFilter(static::RECURRENCES_FILTER)) { + $this->recurrences = null; + } + } + + /** + * Create a filter tuple from raw parameters. + * + * Will create an automatic filter callback for one of Carbon's is* methods. + * + * @param array $parameters + * + * @return array + */ + protected function createFilterTuple(array $parameters) + { + $method = array_shift($parameters); + + if (!$this->isCarbonPredicateMethod($method)) { + return [$method, array_shift($parameters)]; + } + + return [function ($date) use ($method, $parameters) { + return ([$date, $method])(...$parameters); + }, $method]; + } + + /** + * Return whether given callable is a string pointing to one of Carbon's is* methods + * and should be automatically converted to a filter callback. + * + * @param callable $callable + * + * @return bool + */ + protected function isCarbonPredicateMethod($callable) + { + return \is_string($callable) && str_starts_with($callable, 'is') && + (method_exists($this->dateClass, $callable) || ([$this->dateClass, 'hasMacro'])($callable)); + } + + /** + * Recurrences filter callback (limits number of recurrences). + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * + * @param \Carbon\Carbon $current + * @param int $key + * + * @return bool|string + */ + protected function filterRecurrences($current, $key) + { + if ($key < $this->recurrences) { + return true; + } + + return static::END_ITERATION; + } + + /** + * End date filter callback. + * + * @param \Carbon\Carbon $current + * + * @return bool|string + */ + protected function filterEndDate($current) + { + if (!$this->isEndExcluded() && $current == $this->endDate) { + return true; + } + + if ($this->dateInterval->invert ? $current > $this->endDate : $current < $this->endDate) { + return true; + } + + return static::END_ITERATION; + } + + /** + * End iteration filter callback. + * + * @return string + */ + protected function endIteration() + { + return static::END_ITERATION; + } + + /** + * Handle change of the parameters. + */ + protected function handleChangedParameters() + { + if (($this->getOptions() & static::IMMUTABLE) && $this->dateClass === Carbon::class) { + $this->setDateClass(CarbonImmutable::class); + } elseif (!($this->getOptions() & static::IMMUTABLE) && $this->dateClass === CarbonImmutable::class) { + $this->setDateClass(Carbon::class); + } + + $this->validationResult = null; + } + + /** + * Validate current date and stop iteration when necessary. + * + * Returns true when current date is valid, false if it is not, or static::END_ITERATION + * when iteration should be stopped. + * + * @return bool|string + */ + protected function validateCurrentDate() + { + if ($this->current === null) { + $this->rewind(); + } + + // Check after the first rewind to avoid repeating the initial validation. + return $this->validationResult ?? ($this->validationResult = $this->checkFilters()); + } + + /** + * Check whether current value and key pass all the filters. + * + * @return bool|string + */ + protected function checkFilters() + { + $current = $this->prepareForReturn($this->current); + + foreach ($this->filters as $tuple) { + $result = \call_user_func( + $tuple[0], + $current->avoidMutation(), + $this->key, + $this + ); + + if ($result === static::END_ITERATION) { + return static::END_ITERATION; + } + + if (!$result) { + return false; + } + } + + return true; + } + + /** + * Prepare given date to be returned to the external logic. + * + * @param CarbonInterface $date + * + * @return CarbonInterface + */ + protected function prepareForReturn(CarbonInterface $date) + { + $date = ([$this->dateClass, 'make'])($date); + + if ($this->timezone) { + $date = $date->setTimezone($this->timezone); + } + + return $date; + } + + /** + * Keep incrementing the current date until a valid date is found or the iteration is ended. + * + * @throws RuntimeException + * + * @return void + */ + protected function incrementCurrentDateUntilValid() + { + $attempts = 0; + + do { + $this->current = $this->current->add($this->dateInterval); + + $this->validationResult = null; + + if (++$attempts > static::NEXT_MAX_ATTEMPTS) { + throw new UnreachableException('Could not find next valid date.'); + } + } while ($this->validateCurrentDate() === false); + } + + /** + * Call given macro. + * + * @param string $name + * @param array $parameters + * + * @return mixed + */ + protected function callMacro($name, $parameters) + { + $macro = static::$macros[$name]; + + if ($macro instanceof Closure) { + $boundMacro = @$macro->bindTo($this, static::class) ?: @$macro->bindTo(null, static::class); + + return ($boundMacro ?: $macro)(...$parameters); + } + + return $macro(...$parameters); + } + + /** + * Return the Carbon instance passed through, a now instance in the same timezone + * if null given or parse the input if string given. + * + * @param \Carbon\Carbon|\Carbon\CarbonPeriod|\Carbon\CarbonInterval|\DateInterval|\DatePeriod|\DateTimeInterface|string|null $date + * + * @return \Carbon\CarbonInterface + */ + protected function resolveCarbon($date = null) + { + return $this->getStartDate()->nowWithSameTz()->carbonize($date); + } + + /** + * Resolve passed arguments or DatePeriod to a CarbonPeriod object. + * + * @param mixed $period + * @param mixed ...$arguments + * + * @return static + */ + protected function resolveCarbonPeriod($period, ...$arguments) + { + if ($period instanceof self) { + return $period; + } + + return $period instanceof DatePeriod + ? static::instance($period) + : static::create($period, ...$arguments); + } + + private function orderCouple($first, $second): array + { + return $first > $second ? [$second, $first] : [$first, $second]; + } + + private function makeDateTime($value): ?DateTimeInterface + { + if ($value instanceof DateTimeInterface) { + return $value; + } + + if (\is_string($value)) { + $value = trim($value); + + if (!preg_match('/^P[\dT]/', $value) && + !preg_match('/^R\d/', $value) && + preg_match('/[a-z\d]/i', $value) + ) { + return Carbon::parse($value, $this->tzName); + } + } + + return null; + } + + private function isInfiniteDate($date): bool + { + return $date instanceof CarbonInterface && ($date->isEndOfTime() || $date->isStartOfTime()); + } + + private function rawDate($date): ?DateTimeInterface + { + if ($date === false || $date === null) { + return null; + } + + if ($date instanceof CarbonInterface) { + return $date->isMutable() + ? $date->toDateTime() + : $date->toDateTimeImmutable(); + } + + if (\in_array(\get_class($date), [DateTime::class, DateTimeImmutable::class], true)) { + return $date; + } + + $class = $date instanceof DateTime ? DateTime::class : DateTimeImmutable::class; + + return new $class($date->format('Y-m-d H:i:s.u'), $date->getTimezone()); + } + + private static function setDefaultParameters(array &$parameters, array $defaults): void + { + foreach ($defaults as [$index, $name, $value]) { + if (!\array_key_exists($index, $parameters) && !\array_key_exists($name, $parameters)) { + $parameters[$index] = $value; + } + } + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php b/vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php new file mode 100644 index 0000000..c81899f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php @@ -0,0 +1,320 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon; + +use Carbon\Exceptions\InvalidCastException; +use Carbon\Exceptions\InvalidTimeZoneException; +use DateTimeInterface; +use DateTimeZone; +use Throwable; + +class CarbonTimeZone extends DateTimeZone +{ + public function __construct($timezone = null) + { + parent::__construct(static::getDateTimeZoneNameFromMixed($timezone)); + } + + protected static function parseNumericTimezone($timezone) + { + if ($timezone <= -100 || $timezone >= 100) { + throw new InvalidTimeZoneException('Absolute timezone offset cannot be greater than 100.'); + } + + return ($timezone >= 0 ? '+' : '').ltrim($timezone, '+').':00'; + } + + protected static function getDateTimeZoneNameFromMixed($timezone) + { + if ($timezone === null) { + return date_default_timezone_get(); + } + + if (\is_string($timezone)) { + $timezone = preg_replace('/^\s*([+-]\d+)(\d{2})\s*$/', '$1:$2', $timezone); + } + + if (is_numeric($timezone)) { + return static::parseNumericTimezone($timezone); + } + + return $timezone; + } + + protected static function getDateTimeZoneFromName(&$name) + { + return @timezone_open($name = (string) static::getDateTimeZoneNameFromMixed($name)); + } + + /** + * Cast the current instance into the given class. + * + * @param string $className The $className::instance() method will be called to cast the current object. + * + * @return DateTimeZone + */ + public function cast(string $className) + { + if (!method_exists($className, 'instance')) { + if (is_a($className, DateTimeZone::class, true)) { + return new $className($this->getName()); + } + + throw new InvalidCastException("$className has not the instance() method needed to cast the date."); + } + + return $className::instance($this); + } + + /** + * Create a CarbonTimeZone from mixed input. + * + * @param DateTimeZone|string|int|null $object original value to get CarbonTimeZone from it. + * @param DateTimeZone|string|int|null $objectDump dump of the object for error messages. + * + * @throws InvalidTimeZoneException + * + * @return false|static + */ + public static function instance($object = null, $objectDump = null) + { + $tz = $object; + + if ($tz instanceof static) { + return $tz; + } + + if ($tz === null) { + return new static(); + } + + if (!$tz instanceof DateTimeZone) { + $tz = static::getDateTimeZoneFromName($object); + } + + if ($tz !== false) { + return new static($tz->getName()); + } + + if (Carbon::isStrictModeEnabled()) { + throw new InvalidTimeZoneException('Unknown or bad timezone ('.($objectDump ?: $object).')'); + } + + return false; + } + + /** + * Returns abbreviated name of the current timezone according to DST setting. + * + * @param bool $dst + * + * @return string + */ + public function getAbbreviatedName($dst = false) + { + $name = $this->getName(); + + foreach ($this->listAbbreviations() as $abbreviation => $zones) { + foreach ($zones as $zone) { + if ($zone['timezone_id'] === $name && $zone['dst'] == $dst) { + return $abbreviation; + } + } + } + + return 'unknown'; + } + + /** + * @alias getAbbreviatedName + * + * Returns abbreviated name of the current timezone according to DST setting. + * + * @param bool $dst + * + * @return string + */ + public function getAbbr($dst = false) + { + return $this->getAbbreviatedName($dst); + } + + /** + * Get the offset as string "sHH:MM" (such as "+00:00" or "-12:30"). + * + * @param DateTimeInterface|null $date + * + * @return string + */ + public function toOffsetName(DateTimeInterface $date = null) + { + return static::getOffsetNameFromMinuteOffset( + $this->getOffset($date ?: Carbon::now($this)) / 60 + ); + } + + /** + * Returns a new CarbonTimeZone object using the offset string instead of region string. + * + * @param DateTimeInterface|null $date + * + * @return CarbonTimeZone + */ + public function toOffsetTimeZone(DateTimeInterface $date = null) + { + return new static($this->toOffsetName($date)); + } + + /** + * Returns the first region string (such as "America/Toronto") that matches the current timezone or + * false if no match is found. + * + * @see timezone_name_from_abbr native PHP function. + * + * @param DateTimeInterface|null $date + * @param int $isDst + * + * @return string|false + */ + public function toRegionName(DateTimeInterface $date = null, $isDst = 1) + { + $name = $this->getName(); + $firstChar = substr($name, 0, 1); + + if ($firstChar !== '+' && $firstChar !== '-') { + return $name; + } + + $date = $date ?: Carbon::now($this); + + // Integer construction no longer supported since PHP 8 + // @codeCoverageIgnoreStart + try { + $offset = @$this->getOffset($date) ?: 0; + } catch (Throwable $e) { + $offset = 0; + } + // @codeCoverageIgnoreEnd + + $name = @timezone_name_from_abbr('', $offset, $isDst); + + if ($name) { + return $name; + } + + foreach (timezone_identifiers_list() as $timezone) { + if (Carbon::instance($date)->tz($timezone)->getOffset() === $offset) { + return $timezone; + } + } + + return false; + } + + /** + * Returns a new CarbonTimeZone object using the region string instead of offset string. + * + * @param DateTimeInterface|null $date + * + * @return CarbonTimeZone|false + */ + public function toRegionTimeZone(DateTimeInterface $date = null) + { + $tz = $this->toRegionName($date); + + if ($tz !== false) { + return new static($tz); + } + + if (Carbon::isStrictModeEnabled()) { + throw new InvalidTimeZoneException('Unknown timezone for offset '.$this->getOffset($date ?: Carbon::now($this)).' seconds.'); + } + + return false; + } + + /** + * Cast to string (get timezone name). + * + * @return string + */ + public function __toString() + { + return $this->getName(); + } + + /** + * Return the type number: + * + * Type 1; A UTC offset, such as -0300 + * Type 2; A timezone abbreviation, such as GMT + * Type 3: A timezone identifier, such as Europe/London + */ + public function getType(): int + { + return preg_match('/"timezone_type";i:(\d)/', serialize($this), $match) ? (int) $match[1] : 3; + } + + /** + * Create a CarbonTimeZone from mixed input. + * + * @param DateTimeZone|string|int|null $object + * + * @return false|static + */ + public static function create($object = null) + { + return static::instance($object); + } + + /** + * Create a CarbonTimeZone from int/float hour offset. + * + * @param float $hourOffset number of hour of the timezone shift (can be decimal). + * + * @return false|static + */ + public static function createFromHourOffset(float $hourOffset) + { + return static::createFromMinuteOffset($hourOffset * Carbon::MINUTES_PER_HOUR); + } + + /** + * Create a CarbonTimeZone from int/float minute offset. + * + * @param float $minuteOffset number of total minutes of the timezone shift. + * + * @return false|static + */ + public static function createFromMinuteOffset(float $minuteOffset) + { + return static::instance(static::getOffsetNameFromMinuteOffset($minuteOffset)); + } + + /** + * Convert a total minutes offset into a standardized timezone offset string. + * + * @param float $minutes number of total minutes of the timezone shift. + * + * @return string + */ + public static function getOffsetNameFromMinuteOffset(float $minutes): string + { + $minutes = round($minutes); + $unsignedMinutes = abs($minutes); + + return ($minutes < 0 ? '-' : '+'). + str_pad((string) floor($unsignedMinutes / 60), 2, '0', STR_PAD_LEFT). + ':'. + str_pad((string) ($unsignedMinutes % 60), 2, '0', STR_PAD_LEFT); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Cli/Invoker.php b/vendor/nesbot/carbon/src/Carbon/Cli/Invoker.php new file mode 100644 index 0000000..4f35d6c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Cli/Invoker.php @@ -0,0 +1,38 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Cli; + +class Invoker +{ + public const CLI_CLASS_NAME = 'Carbon\\Cli'; + + protected function runWithCli(string $className, array $parameters): bool + { + $cli = new $className(); + + return $cli(...$parameters); + } + + public function __invoke(...$parameters): bool + { + if (class_exists(self::CLI_CLASS_NAME)) { + return $this->runWithCli(self::CLI_CLASS_NAME, $parameters); + } + + $function = (($parameters[1] ?? '') === 'install' ? ($parameters[2] ?? null) : null) ?: 'shell_exec'; + $function('composer require carbon-cli/carbon-cli --no-interaction'); + + echo 'Installation succeeded.'; + + return true; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonDoctrineType.php b/vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonDoctrineType.php new file mode 100644 index 0000000..ccc457f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonDoctrineType.php @@ -0,0 +1,23 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Doctrine; + +use Doctrine\DBAL\Platforms\AbstractPlatform; + +interface CarbonDoctrineType +{ + public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform); + + public function convertToPHPValue($value, AbstractPlatform $platform); + + public function convertToDatabaseValue($value, AbstractPlatform $platform); +} diff --git a/vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonImmutableType.php b/vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonImmutableType.php new file mode 100644 index 0000000..bf476a7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonImmutableType.php @@ -0,0 +1,37 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Doctrine; + +use Doctrine\DBAL\Platforms\AbstractPlatform; + +class CarbonImmutableType extends DateTimeImmutableType implements CarbonDoctrineType +{ + /** + * {@inheritdoc} + * + * @return string + */ + public function getName() + { + return 'carbon_immutable'; + } + + /** + * {@inheritdoc} + * + * @return bool + */ + public function requiresSQLCommentHint(AbstractPlatform $platform) + { + return true; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonType.php b/vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonType.php new file mode 100644 index 0000000..9289d84 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonType.php @@ -0,0 +1,37 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Doctrine; + +use Doctrine\DBAL\Platforms\AbstractPlatform; + +class CarbonType extends DateTimeType implements CarbonDoctrineType +{ + /** + * {@inheritdoc} + * + * @return string + */ + public function getName() + { + return 'carbon'; + } + + /** + * {@inheritdoc} + * + * @return bool + */ + public function requiresSQLCommentHint(AbstractPlatform $platform) + { + return true; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonTypeConverter.php b/vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonTypeConverter.php new file mode 100644 index 0000000..ecfe17e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Doctrine/CarbonTypeConverter.php @@ -0,0 +1,123 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Doctrine; + +use Carbon\Carbon; +use Carbon\CarbonInterface; +use DateTimeInterface; +use Doctrine\DBAL\Platforms\AbstractPlatform; +use Doctrine\DBAL\Types\ConversionException; +use Exception; + +/** + * @template T of CarbonInterface + */ +trait CarbonTypeConverter +{ + /** + * @return class-string<T> + */ + protected function getCarbonClassName(): string + { + return Carbon::class; + } + + /** + * @return string + */ + public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) + { + $precision = $fieldDeclaration['precision'] ?: 10; + + if ($fieldDeclaration['secondPrecision'] ?? false) { + $precision = 0; + } + + if ($precision === 10) { + $precision = DateTimeDefaultPrecision::get(); + } + + $type = parent::getSQLDeclaration($fieldDeclaration, $platform); + + if (!$precision) { + return $type; + } + + if (str_contains($type, '(')) { + return preg_replace('/\(\d+\)/', "($precision)", $type); + } + + [$before, $after] = explode(' ', "$type "); + + return trim("$before($precision) $after"); + } + + /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * + * @return T|null + */ + public function convertToPHPValue($value, AbstractPlatform $platform) + { + $class = $this->getCarbonClassName(); + + if ($value === null || is_a($value, $class)) { + return $value; + } + + if ($value instanceof DateTimeInterface) { + return $class::instance($value); + } + + $date = null; + $error = null; + + try { + $date = $class::parse($value); + } catch (Exception $exception) { + $error = $exception; + } + + if (!$date) { + throw ConversionException::conversionFailedFormat( + $value, + $this->getName(), + 'Y-m-d H:i:s.u or any format supported by '.$class.'::parse()', + $error + ); + } + + return $date; + } + + /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * + * @return string|null + */ + public function convertToDatabaseValue($value, AbstractPlatform $platform) + { + if ($value === null) { + return $value; + } + + if ($value instanceof DateTimeInterface) { + return $value->format('Y-m-d H:i:s.u'); + } + + throw ConversionException::conversionFailedInvalidType( + $value, + $this->getName(), + ['null', 'DateTime', 'Carbon'] + ); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeDefaultPrecision.php b/vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeDefaultPrecision.php new file mode 100644 index 0000000..642fd41 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeDefaultPrecision.php @@ -0,0 +1,37 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Doctrine; + +class DateTimeDefaultPrecision +{ + private static $precision = 6; + + /** + * Change the default Doctrine datetime and datetime_immutable precision. + * + * @param int $precision + */ + public static function set(int $precision): void + { + self::$precision = $precision; + } + + /** + * Get the default Doctrine datetime and datetime_immutable precision. + * + * @return int + */ + public static function get(): int + { + return self::$precision; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeImmutableType.php b/vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeImmutableType.php new file mode 100644 index 0000000..4992710 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeImmutableType.php @@ -0,0 +1,24 @@ +<?php + +/** + * Thanks to https://github.com/flaushi for his suggestion: + * https://github.com/doctrine/dbal/issues/2873#issuecomment-534956358 + */ +namespace Carbon\Doctrine; + +use Carbon\CarbonImmutable; +use Doctrine\DBAL\Types\VarDateTimeImmutableType; + +class DateTimeImmutableType extends VarDateTimeImmutableType implements CarbonDoctrineType +{ + /** @use CarbonTypeConverter<CarbonImmutable> */ + use CarbonTypeConverter; + + /** + * @return class-string<CarbonImmutable> + */ + protected function getCarbonClassName(): string + { + return CarbonImmutable::class; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeType.php b/vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeType.php new file mode 100644 index 0000000..29b0bb9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Doctrine/DateTimeType.php @@ -0,0 +1,16 @@ +<?php + +/** + * Thanks to https://github.com/flaushi for his suggestion: + * https://github.com/doctrine/dbal/issues/2873#issuecomment-534956358 + */ +namespace Carbon\Doctrine; + +use Carbon\Carbon; +use Doctrine\DBAL\Types\VarDateTimeType; + +class DateTimeType extends VarDateTimeType implements CarbonDoctrineType +{ + /** @use CarbonTypeConverter<Carbon> */ + use CarbonTypeConverter; +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php new file mode 100644 index 0000000..3ca8837 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php @@ -0,0 +1,48 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use Throwable; + +class BadComparisonUnitException extends UnitException +{ + /** + * The unit. + * + * @var string + */ + protected $unit; + + /** + * Constructor. + * + * @param string $unit + * @param int $code + * @param Throwable|null $previous + */ + public function __construct($unit, $code = 0, Throwable $previous = null) + { + $this->unit = $unit; + + parent::__construct("Bad comparison unit: '$unit'", $code, $previous); + } + + /** + * Get the unit. + * + * @return string + */ + public function getUnit(): string + { + return $this->unit; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php new file mode 100644 index 0000000..2e222e5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php @@ -0,0 +1,49 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use BadMethodCallException as BaseBadMethodCallException; +use Throwable; + +class BadFluentConstructorException extends BaseBadMethodCallException implements BadMethodCallException +{ + /** + * The method. + * + * @var string + */ + protected $method; + + /** + * Constructor. + * + * @param string $method + * @param int $code + * @param Throwable|null $previous + */ + public function __construct($method, $code = 0, Throwable $previous = null) + { + $this->method = $method; + + parent::__construct(sprintf("Unknown fluent constructor '%s'.", $method), $code, $previous); + } + + /** + * Get the method. + * + * @return string + */ + public function getMethod(): string + { + return $this->method; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php new file mode 100644 index 0000000..4ceaa2e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php @@ -0,0 +1,49 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use BadMethodCallException as BaseBadMethodCallException; +use Throwable; + +class BadFluentSetterException extends BaseBadMethodCallException implements BadMethodCallException +{ + /** + * The setter. + * + * @var string + */ + protected $setter; + + /** + * Constructor. + * + * @param string $setter + * @param int $code + * @param Throwable|null $previous + */ + public function __construct($setter, $code = 0, Throwable $previous = null) + { + $this->setter = $setter; + + parent::__construct(sprintf("Unknown fluent setter '%s'", $setter), $code, $previous); + } + + /** + * Get the setter. + * + * @return string + */ + public function getSetter(): string + { + return $this->setter; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php new file mode 100644 index 0000000..108206d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php @@ -0,0 +1,17 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +interface BadMethodCallException extends Exception +{ + // +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php new file mode 100644 index 0000000..e104926 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use RuntimeException as BaseRuntimeException; + +final class EndLessPeriodException extends BaseRuntimeException implements RuntimeException +{ + // +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php new file mode 100644 index 0000000..8ad747e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php @@ -0,0 +1,17 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +interface Exception +{ + // +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php new file mode 100644 index 0000000..db334c6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php @@ -0,0 +1,48 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use RuntimeException as BaseRuntimeException; +use Throwable; + +class ImmutableException extends BaseRuntimeException implements RuntimeException +{ + /** + * The value. + * + * @var string + */ + protected $value; + + /** + * Constructor. + * + * @param string $value the immutable type/value + * @param int $code + * @param Throwable|null $previous + */ + public function __construct($value, $code = 0, Throwable $previous = null) + { + $this->value = $value; + parent::__construct("$value is immutable.", $code, $previous); + } + + /** + * Get the value. + * + * @return string + */ + public function getValue(): string + { + return $this->value; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php new file mode 100644 index 0000000..5b013cd --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php @@ -0,0 +1,17 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +interface InvalidArgumentException extends Exception +{ + // +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php new file mode 100644 index 0000000..a421401 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use InvalidArgumentException as BaseInvalidArgumentException; + +class InvalidCastException extends BaseInvalidArgumentException implements InvalidArgumentException +{ + // +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php new file mode 100644 index 0000000..c9ecb6b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php @@ -0,0 +1,67 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use InvalidArgumentException as BaseInvalidArgumentException; +use Throwable; + +class InvalidDateException extends BaseInvalidArgumentException implements InvalidArgumentException +{ + /** + * The invalid field. + * + * @var string + */ + private $field; + + /** + * The invalid value. + * + * @var mixed + */ + private $value; + + /** + * Constructor. + * + * @param string $field + * @param mixed $value + * @param int $code + * @param Throwable|null $previous + */ + public function __construct($field, $value, $code = 0, Throwable $previous = null) + { + $this->field = $field; + $this->value = $value; + parent::__construct($field.' : '.$value.' is not a valid value.', $code, $previous); + } + + /** + * Get the invalid field. + * + * @return string + */ + public function getField() + { + return $this->field; + } + + /** + * Get the invalid value. + * + * @return mixed + */ + public function getValue() + { + return $this->value; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php new file mode 100644 index 0000000..92d55fe --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use InvalidArgumentException as BaseInvalidArgumentException; + +class InvalidFormatException extends BaseInvalidArgumentException implements InvalidArgumentException +{ + // +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php new file mode 100644 index 0000000..69cf412 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use InvalidArgumentException as BaseInvalidArgumentException; + +class InvalidIntervalException extends BaseInvalidArgumentException implements InvalidArgumentException +{ + // +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php new file mode 100644 index 0000000..9bd84a9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use InvalidArgumentException as BaseInvalidArgumentException; + +class InvalidPeriodDateException extends BaseInvalidArgumentException implements InvalidArgumentException +{ + // +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php new file mode 100644 index 0000000..cf2c902 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use InvalidArgumentException as BaseInvalidArgumentException; + +class InvalidPeriodParameterException extends BaseInvalidArgumentException implements InvalidArgumentException +{ + // +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php new file mode 100644 index 0000000..f725955 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use InvalidArgumentException as BaseInvalidArgumentException; + +class InvalidTimeZoneException extends BaseInvalidArgumentException implements InvalidArgumentException +{ + // +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php new file mode 100644 index 0000000..2c8ec9b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use InvalidArgumentException as BaseInvalidArgumentException; + +class InvalidTypeException extends BaseInvalidArgumentException implements InvalidArgumentException +{ + // +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php new file mode 100644 index 0000000..7a87632 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php @@ -0,0 +1,50 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use Carbon\CarbonInterface; +use InvalidArgumentException as BaseInvalidArgumentException; +use Throwable; + +class NotACarbonClassException extends BaseInvalidArgumentException implements InvalidArgumentException +{ + /** + * The className. + * + * @var string + */ + protected $className; + + /** + * Constructor. + * + * @param string $className + * @param int $code + * @param Throwable|null $previous + */ + public function __construct($className, $code = 0, Throwable $previous = null) + { + $this->className = $className; + + parent::__construct(sprintf('Given class does not implement %s: %s', CarbonInterface::class, $className), $code, $previous); + } + + /** + * Get the className. + * + * @return string + */ + public function getClassName(): string + { + return $this->className; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php new file mode 100644 index 0000000..4edd7a4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use InvalidArgumentException as BaseInvalidArgumentException; + +class NotAPeriodException extends BaseInvalidArgumentException implements InvalidArgumentException +{ + // +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php new file mode 100644 index 0000000..f2c5468 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php @@ -0,0 +1,32 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use InvalidArgumentException as BaseInvalidArgumentException; +use Throwable; + +class NotLocaleAwareException extends BaseInvalidArgumentException implements InvalidArgumentException +{ + /** + * Constructor. + * + * @param mixed $object + * @param int $code + * @param Throwable|null $previous + */ + public function __construct($object, $code = 0, Throwable $previous = null) + { + $dump = \is_object($object) ? \get_class($object) : \gettype($object); + + parent::__construct("$dump does neither implements Symfony\Contracts\Translation\LocaleAwareInterface nor getLocale() method.", $code, $previous); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php new file mode 100644 index 0000000..2c586d0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php @@ -0,0 +1,101 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use InvalidArgumentException as BaseInvalidArgumentException; +use Throwable; + +// This will extends OutOfRangeException instead of InvalidArgumentException since 3.0.0 +// use OutOfRangeException as BaseOutOfRangeException; + +class OutOfRangeException extends BaseInvalidArgumentException implements InvalidArgumentException +{ + /** + * The unit or name of the value. + * + * @var string + */ + private $unit; + + /** + * The range minimum. + * + * @var mixed + */ + private $min; + + /** + * The range maximum. + * + * @var mixed + */ + private $max; + + /** + * The invalid value. + * + * @var mixed + */ + private $value; + + /** + * Constructor. + * + * @param string $unit + * @param mixed $min + * @param mixed $max + * @param mixed $value + * @param int $code + * @param Throwable|null $previous + */ + public function __construct($unit, $min, $max, $value, $code = 0, Throwable $previous = null) + { + $this->unit = $unit; + $this->min = $min; + $this->max = $max; + $this->value = $value; + + parent::__construct("$unit must be between $min and $max, $value given", $code, $previous); + } + + /** + * @return mixed + */ + public function getMax() + { + return $this->max; + } + + /** + * @return mixed + */ + public function getMin() + { + return $this->min; + } + + /** + * @return mixed + */ + public function getUnit() + { + return $this->unit; + } + + /** + * @return mixed + */ + public function getValue() + { + return $this->value; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php new file mode 100644 index 0000000..5416fd1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php @@ -0,0 +1,88 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use InvalidArgumentException as BaseInvalidArgumentException; +use Throwable; + +class ParseErrorException extends BaseInvalidArgumentException implements InvalidArgumentException +{ + /** + * The expected. + * + * @var string + */ + protected $expected; + + /** + * The actual. + * + * @var string + */ + protected $actual; + + /** + * The help message. + * + * @var string + */ + protected $help; + + /** + * Constructor. + * + * @param string $expected + * @param string $actual + * @param int $code + * @param Throwable|null $previous + */ + public function __construct($expected, $actual, $help = '', $code = 0, Throwable $previous = null) + { + $this->expected = $expected; + $this->actual = $actual; + $this->help = $help; + + $actual = $actual === '' ? 'data is missing' : "get '$actual'"; + + parent::__construct(trim("Format expected $expected but $actual\n$help"), $code, $previous); + } + + /** + * Get the expected. + * + * @return string + */ + public function getExpected(): string + { + return $this->expected; + } + + /** + * Get the actual. + * + * @return string + */ + public function getActual(): string + { + return $this->actual; + } + + /** + * Get the help message. + * + * @return string + */ + public function getHelp(): string + { + return $this->help; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php new file mode 100644 index 0000000..ad196f7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php @@ -0,0 +1,17 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +interface RuntimeException extends Exception +{ + // +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php new file mode 100644 index 0000000..ee99953 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use InvalidArgumentException as BaseInvalidArgumentException; + +class UnitException extends BaseInvalidArgumentException implements InvalidArgumentException +{ + // +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php new file mode 100644 index 0000000..0e72305 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php @@ -0,0 +1,48 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use Throwable; + +class UnitNotConfiguredException extends UnitException +{ + /** + * The unit. + * + * @var string + */ + protected $unit; + + /** + * Constructor. + * + * @param string $unit + * @param int $code + * @param Throwable|null $previous + */ + public function __construct($unit, $code = 0, Throwable $previous = null) + { + $this->unit = $unit; + + parent::__construct("Unit $unit have no configuration to get total from other units.", $code, $previous); + } + + /** + * Get the unit. + * + * @return string + */ + public function getUnit(): string + { + return $this->unit; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php new file mode 100644 index 0000000..5c50497 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php @@ -0,0 +1,49 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use InvalidArgumentException as BaseInvalidArgumentException; +use Throwable; + +class UnknownGetterException extends BaseInvalidArgumentException implements InvalidArgumentException +{ + /** + * The getter. + * + * @var string + */ + protected $getter; + + /** + * Constructor. + * + * @param string $getter getter name + * @param int $code + * @param Throwable|null $previous + */ + public function __construct($getter, $code = 0, Throwable $previous = null) + { + $this->getter = $getter; + + parent::__construct("Unknown getter '$getter'", $code, $previous); + } + + /** + * Get the getter. + * + * @return string + */ + public function getGetter(): string + { + return $this->getter; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php new file mode 100644 index 0000000..75273a7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php @@ -0,0 +1,49 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use BadMethodCallException as BaseBadMethodCallException; +use Throwable; + +class UnknownMethodException extends BaseBadMethodCallException implements BadMethodCallException +{ + /** + * The method. + * + * @var string + */ + protected $method; + + /** + * Constructor. + * + * @param string $method + * @param int $code + * @param Throwable|null $previous + */ + public function __construct($method, $code = 0, Throwable $previous = null) + { + $this->method = $method; + + parent::__construct("Method $method does not exist.", $code, $previous); + } + + /** + * Get the method. + * + * @return string + */ + public function getMethod(): string + { + return $this->method; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php new file mode 100644 index 0000000..a795f5d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php @@ -0,0 +1,49 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use InvalidArgumentException as BaseInvalidArgumentException; +use Throwable; + +class UnknownSetterException extends BaseInvalidArgumentException implements BadMethodCallException +{ + /** + * The setter. + * + * @var string + */ + protected $setter; + + /** + * Constructor. + * + * @param string $setter setter name + * @param int $code + * @param Throwable|null $previous + */ + public function __construct($setter, $code = 0, Throwable $previous = null) + { + $this->setter = $setter; + + parent::__construct("Unknown setter '$setter'", $code, $previous); + } + + /** + * Get the setter. + * + * @return string + */ + public function getSetter(): string + { + return $this->setter; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php new file mode 100644 index 0000000..ecd7f7a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php @@ -0,0 +1,48 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use Throwable; + +class UnknownUnitException extends UnitException +{ + /** + * The unit. + * + * @var string + */ + protected $unit; + + /** + * Constructor. + * + * @param string $unit + * @param int $code + * @param Throwable|null $previous + */ + public function __construct($unit, $code = 0, Throwable $previous = null) + { + $this->unit = $unit; + + parent::__construct("Unknown unit '$unit'.", $code, $previous); + } + + /** + * Get the unit. + * + * @return string + */ + public function getUnit(): string + { + return $this->unit; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php new file mode 100644 index 0000000..1654ab1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use RuntimeException as BaseRuntimeException; + +class UnreachableException extends BaseRuntimeException implements RuntimeException +{ + // +} diff --git a/vendor/nesbot/carbon/src/Carbon/Factory.php b/vendor/nesbot/carbon/src/Carbon/Factory.php new file mode 100644 index 0000000..f8c7289 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Factory.php @@ -0,0 +1,326 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon; + +use Closure; +use DateTimeInterface; +use ReflectionMethod; + +/** + * A factory to generate Carbon instances with common settings. + * + * <autodoc generated by `composer phpdoc`> + * + * @method bool canBeCreatedFromFormat($date, $format) Checks if the (date)time string is in a given format and valid to create a + * new instance. + * @method Carbon|false create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $tz = null) Create a new Carbon instance from a specific date and time. + * If any of $year, $month or $day are set to null their now() values will + * be used. + * If $hour is null it will be set to its now() value and the default + * values for $minute and $second will be their now() values. + * If $hour is not null then the default values for $minute and $second + * will be 0. + * @method Carbon createFromDate($year = null, $month = null, $day = null, $tz = null) Create a Carbon instance from just a date. The time portion is set to now. + * @method Carbon|false createFromFormat($format, $time, $tz = null) Create a Carbon instance from a specific format. + * @method Carbon|false createFromIsoFormat($format, $time, $tz = null, $locale = 'en', $translator = null) Create a Carbon instance from a specific ISO format (same replacements as ->isoFormat()). + * @method Carbon|false createFromLocaleFormat($format, $locale, $time, $tz = null) Create a Carbon instance from a specific format and a string in a given language. + * @method Carbon|false createFromLocaleIsoFormat($format, $locale, $time, $tz = null) Create a Carbon instance from a specific ISO format and a string in a given language. + * @method Carbon createFromTime($hour = 0, $minute = 0, $second = 0, $tz = null) Create a Carbon instance from just a time. The date portion is set to today. + * @method Carbon createFromTimeString($time, $tz = null) Create a Carbon instance from a time string. The date portion is set to today. + * @method Carbon createFromTimestamp($timestamp, $tz = null) Create a Carbon instance from a timestamp and set the timezone (use default one if not specified). + * Timestamp input can be given as int, float or a string containing one or more numbers. + * @method Carbon createFromTimestampMs($timestamp, $tz = null) Create a Carbon instance from a timestamp in milliseconds. + * Timestamp input can be given as int, float or a string containing one or more numbers. + * @method Carbon createFromTimestampMsUTC($timestamp) Create a Carbon instance from a timestamp in milliseconds. + * Timestamp input can be given as int, float or a string containing one or more numbers. + * @method Carbon createFromTimestampUTC($timestamp) Create a Carbon instance from an timestamp keeping the timezone to UTC. + * Timestamp input can be given as int, float or a string containing one or more numbers. + * @method Carbon createMidnightDate($year = null, $month = null, $day = null, $tz = null) Create a Carbon instance from just a date. The time portion is set to midnight. + * @method Carbon|false createSafe($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $tz = null) Create a new safe Carbon instance from a specific date and time. + * If any of $year, $month or $day are set to null their now() values will + * be used. + * If $hour is null it will be set to its now() value and the default + * values for $minute and $second will be their now() values. + * If $hour is not null then the default values for $minute and $second + * will be 0. + * If one of the set values is not valid, an InvalidDateException + * will be thrown. + * @method CarbonInterface createStrict(?int $year = 0, ?int $month = 1, ?int $day = 1, ?int $hour = 0, ?int $minute = 0, ?int $second = 0, $tz = null) Create a new Carbon instance from a specific date and time using strict validation. + * @method Carbon disableHumanDiffOption($humanDiffOption) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * @method Carbon enableHumanDiffOption($humanDiffOption) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * @method mixed executeWithLocale($locale, $func) Set the current locale to the given, execute the passed function, reset the locale to previous one, + * then return the result of the closure (or null if the closure was void). + * @method Carbon fromSerialized($value) Create an instance from a serialized string. + * @method void genericMacro($macro, $priority = 0) Register a custom macro. + * @method array getAvailableLocales() Returns the list of internally available locales and already loaded custom locales. + * (It will ignore custom translator dynamic loading.) + * @method Language[] getAvailableLocalesInfo() Returns list of Language object for each available locale. This object allow you to get the ISO name, native + * name, region and variant of the locale. + * @method array getDays() Get the days of the week + * @method string|null getFallbackLocale() Get the fallback locale. + * @method array getFormatsToIsoReplacements() List of replacements from date() format to isoFormat(). + * @method int getHumanDiffOptions() Return default humanDiff() options (merged flags as integer). + * @method array getIsoUnits() Returns list of locale units for ISO formatting. + * @method array getLastErrors() {@inheritdoc} + * @method string getLocale() Get the current translator locale. + * @method callable|null getMacro($name) Get the raw callable macro registered globally for a given name. + * @method int getMidDayAt() get midday/noon hour + * @method Closure|Carbon getTestNow() Get the Carbon instance (real or mock) to be returned when a "now" + * instance is created. + * @method string getTimeFormatByPrecision($unitPrecision) Return a format from H:i to H:i:s.u according to given unit precision. + * @method string getTranslationMessageWith($translator, string $key, ?string $locale = null, ?string $default = null) Returns raw translation message for a given key. + * @method \Symfony\Component\Translation\TranslatorInterface getTranslator() Get the default translator instance in use. + * @method int getWeekEndsAt() Get the last day of week + * @method int getWeekStartsAt() Get the first day of week + * @method array getWeekendDays() Get weekend days + * @method bool hasFormat($date, $format) Checks if the (date)time string is in a given format. + * @method bool hasFormatWithModifiers($date, $format) Checks if the (date)time string is in a given format. + * @method bool hasMacro($name) Checks if macro is registered globally. + * @method bool hasRelativeKeywords($time) Determine if a time string will produce a relative date. + * @method bool hasTestNow() Determine if there is a valid test instance set. A valid test instance + * is anything that is not null. + * @method Carbon instance($date) Create a Carbon instance from a DateTime one. + * @method bool isImmutable() Returns true if the current class/instance is immutable. + * @method bool isModifiableUnit($unit) Returns true if a property can be changed via setter. + * @method bool isMutable() Returns true if the current class/instance is mutable. + * @method bool isStrictModeEnabled() Returns true if the strict mode is globally in use, false else. + * (It can be overridden in specific instances.) + * @method bool localeHasDiffOneDayWords($locale) Returns true if the given locale is internally supported and has words for 1-day diff (just now, yesterday, tomorrow). + * Support is considered enabled if the 3 words are translated in the given locale. + * @method bool localeHasDiffSyntax($locale) Returns true if the given locale is internally supported and has diff syntax support (ago, from now, before, after). + * Support is considered enabled if the 4 sentences are translated in the given locale. + * @method bool localeHasDiffTwoDayWords($locale) Returns true if the given locale is internally supported and has words for 2-days diff (before yesterday, after tomorrow). + * Support is considered enabled if the 2 words are translated in the given locale. + * @method bool localeHasPeriodSyntax($locale) Returns true if the given locale is internally supported and has period syntax support (X times, every X, from X, to X). + * Support is considered enabled if the 4 sentences are translated in the given locale. + * @method bool localeHasShortUnits($locale) Returns true if the given locale is internally supported and has short-units support. + * Support is considered enabled if either year, day or hour has a short variant translated. + * @method void macro($name, $macro) Register a custom macro. + * @method Carbon|null make($var) Make a Carbon instance from given variable if possible. + * Always return a new instance. Parse only strings and only these likely to be dates (skip intervals + * and recurrences). Throw an exception for invalid format, but otherwise return null. + * @method Carbon maxValue() Create a Carbon instance for the greatest supported date. + * @method Carbon minValue() Create a Carbon instance for the lowest supported date. + * @method void mixin($mixin) Mix another object into the class. + * @method Carbon now($tz = null) Get a Carbon instance for the current date and time. + * @method Carbon parse($time = null, $tz = null) Create a carbon instance from a string. + * This is an alias for the constructor that allows better fluent syntax + * as it allows you to do Carbon::parse('Monday next week')->fn() rather + * than (new Carbon('Monday next week'))->fn(). + * @method Carbon parseFromLocale($time, $locale = null, $tz = null) Create a carbon instance from a localized string (in French, Japanese, Arabic, etc.). + * @method string pluralUnit(string $unit) Returns standardized plural of a given singular/plural unit name (in English). + * @method Carbon|false rawCreateFromFormat($format, $time, $tz = null) Create a Carbon instance from a specific format. + * @method Carbon rawParse($time = null, $tz = null) Create a carbon instance from a string. + * This is an alias for the constructor that allows better fluent syntax + * as it allows you to do Carbon::parse('Monday next week')->fn() rather + * than (new Carbon('Monday next week'))->fn(). + * @method Carbon resetMacros() Remove all macros and generic macros. + * @method void resetMonthsOverflow() @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants + * are available for quarters, years, decade, centuries, millennia (singular and plural forms). + * @method void resetToStringFormat() Reset the format used to the default when type juggling a Carbon instance to a string + * @method void resetYearsOverflow() @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants + * are available for quarters, years, decade, centuries, millennia (singular and plural forms). + * @method void serializeUsing($callback) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather transform Carbon object before the serialization. + * JSON serialize all Carbon instances using the given callback. + * @method Carbon setFallbackLocale($locale) Set the fallback locale. + * @method Carbon setHumanDiffOptions($humanDiffOptions) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * @method bool setLocale($locale) Set the current translator locale and indicate if the source locale file exists. + * Pass 'auto' as locale to use closest language from the current LC_TIME locale. + * @method void setMidDayAt($hour) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather consider mid-day is always 12pm, then if you need to test if it's an other + * hour, test it explicitly: + * $date->format('G') == 13 + * or to set explicitly to a given hour: + * $date->setTime(13, 0, 0, 0) + * Set midday/noon hour + * @method Carbon setTestNow($testNow = null) Set a Carbon instance (real or mock) to be returned when a "now" + * instance is created. The provided instance will be returned + * specifically under the following conditions: + * - A call to the static now() method, ex. Carbon::now() + * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) + * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') + * - When a string containing the desired time is passed to Carbon::parse(). + * Note the timezone parameter was left out of the examples above and + * has no affect as the mock value will be returned regardless of its value. + * Only the moment is mocked with setTestNow(), the timezone will still be the one passed + * as parameter of date_default_timezone_get() as a fallback (see setTestNowAndTimezone()). + * To clear the test instance call this method using the default + * parameter of null. + * /!\ Use this method for unit tests only. + * @method Carbon setTestNowAndTimezone($testNow = null, $tz = null) Set a Carbon instance (real or mock) to be returned when a "now" + * instance is created. The provided instance will be returned + * specifically under the following conditions: + * - A call to the static now() method, ex. Carbon::now() + * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) + * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') + * - When a string containing the desired time is passed to Carbon::parse(). + * It will also align default timezone (e.g. call date_default_timezone_set()) with + * the second argument or if null, with the timezone of the given date object. + * To clear the test instance call this method using the default + * parameter of null. + * /!\ Use this method for unit tests only. + * @method void setToStringFormat($format) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather let Carbon object being casted to string with DEFAULT_TO_STRING_FORMAT, and + * use other method or custom format passed to format() method if you need to dump an other string + * format. + * Set the default format used when type juggling a Carbon instance to a string + * @method void setTranslator(TranslatorInterface $translator) Set the default translator instance to use. + * @method Carbon setUtf8($utf8) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use UTF-8 language packages on every machine. + * Set if UTF8 will be used for localized date/time. + * @method void setWeekEndsAt($day) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * Use $weekStartsAt optional parameter instead when using startOfWeek, floorWeek, ceilWeek + * or roundWeek method. You can also use the 'first_day_of_week' locale setting to change the + * start of week according to current locale selected and implicitly the end of week. + * Set the last day of week + * @method void setWeekStartsAt($day) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * Use $weekEndsAt optional parameter instead when using endOfWeek method. You can also use the + * 'first_day_of_week' locale setting to change the start of week according to current locale + * selected and implicitly the end of week. + * Set the first day of week + * @method void setWeekendDays($days) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather consider week-end is always saturday and sunday, and if you have some custom + * week-end days to handle, give to those days an other name and create a macro for them: + * ``` + * Carbon::macro('isDayOff', function ($date) { + * return $date->isSunday() || $date->isMonday(); + * }); + * Carbon::macro('isNotDayOff', function ($date) { + * return !$date->isDayOff(); + * }); + * if ($someDate->isDayOff()) ... + * if ($someDate->isNotDayOff()) ... + * // Add 5 not-off days + * $count = 5; + * while ($someDate->isDayOff() || ($count-- > 0)) { + * $someDate->addDay(); + * } + * ``` + * Set weekend days + * @method bool shouldOverflowMonths() Get the month overflow global behavior (can be overridden in specific instances). + * @method bool shouldOverflowYears() Get the month overflow global behavior (can be overridden in specific instances). + * @method string singularUnit(string $unit) Returns standardized singular of a given singular/plural unit name (in English). + * @method Carbon today($tz = null) Create a Carbon instance for today. + * @method Carbon tomorrow($tz = null) Create a Carbon instance for tomorrow. + * @method string translateTimeString($timeString, $from = null, $to = null, $mode = CarbonInterface::TRANSLATE_ALL) Translate a time string from a locale to an other. + * @method string translateWith(TranslatorInterface $translator, string $key, array $parameters = [], $number = null) Translate using translation string or callback available. + * @method void useMonthsOverflow($monthsOverflow = true) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants + * are available for quarters, years, decade, centuries, millennia (singular and plural forms). + * @method Carbon useStrictMode($strictModeEnabled = true) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * @method void useYearsOverflow($yearsOverflow = true) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants + * are available for quarters, years, decade, centuries, millennia (singular and plural forms). + * @method mixed withTestNow($testNow = null, $callback = null) Temporarily sets a static date to be used within the callback. + * Using setTestNow to set the date, executing the callback, then + * clearing the test instance. + * /!\ Use this method for unit tests only. + * @method Carbon yesterday($tz = null) Create a Carbon instance for yesterday. + * + * </autodoc> + */ +class Factory +{ + protected $className = Carbon::class; + + protected $settings = []; + + public function __construct(array $settings = [], ?string $className = null) + { + if ($className) { + $this->className = $className; + } + + $this->settings = $settings; + } + + public function getClassName() + { + return $this->className; + } + + public function setClassName(string $className) + { + $this->className = $className; + + return $this; + } + + public function className(string $className = null) + { + return $className === null ? $this->getClassName() : $this->setClassName($className); + } + + public function getSettings() + { + return $this->settings; + } + + public function setSettings(array $settings) + { + $this->settings = $settings; + + return $this; + } + + public function settings(array $settings = null) + { + return $settings === null ? $this->getSettings() : $this->setSettings($settings); + } + + public function mergeSettings(array $settings) + { + $this->settings = array_merge($this->settings, $settings); + + return $this; + } + + public function __call($name, $arguments) + { + $method = new ReflectionMethod($this->className, $name); + $settings = $this->settings; + + if ($settings && isset($settings['timezone'])) { + $tzParameters = array_filter($method->getParameters(), function ($parameter) { + return \in_array($parameter->getName(), ['tz', 'timezone'], true); + }); + + if (isset($arguments[0]) && \in_array($name, ['instance', 'make', 'create', 'parse'], true)) { + if ($arguments[0] instanceof DateTimeInterface) { + $settings['innerTimezone'] = $settings['timezone']; + } elseif (\is_string($arguments[0]) && date_parse($arguments[0])['is_localtime']) { + unset($settings['timezone'], $settings['innerTimezone']); + } + } elseif (\count($tzParameters)) { + array_splice($arguments, key($tzParameters), 0, [$settings['timezone']]); + unset($settings['timezone']); + } + } + + $result = $this->className::$name(...$arguments); + + return $result instanceof CarbonInterface && !empty($settings) + ? $result->settings($settings) + : $result; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php b/vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php new file mode 100644 index 0000000..596ee80 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php @@ -0,0 +1,243 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon; + +use Closure; + +/** + * A factory to generate CarbonImmutable instances with common settings. + * + * <autodoc generated by `composer phpdoc`> + * + * @method bool canBeCreatedFromFormat($date, $format) Checks if the (date)time string is in a given format and valid to create a + * new instance. + * @method CarbonImmutable|false create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $tz = null) Create a new Carbon instance from a specific date and time. + * If any of $year, $month or $day are set to null their now() values will + * be used. + * If $hour is null it will be set to its now() value and the default + * values for $minute and $second will be their now() values. + * If $hour is not null then the default values for $minute and $second + * will be 0. + * @method CarbonImmutable createFromDate($year = null, $month = null, $day = null, $tz = null) Create a Carbon instance from just a date. The time portion is set to now. + * @method CarbonImmutable|false createFromFormat($format, $time, $tz = null) Create a Carbon instance from a specific format. + * @method CarbonImmutable|false createFromIsoFormat($format, $time, $tz = null, $locale = 'en', $translator = null) Create a Carbon instance from a specific ISO format (same replacements as ->isoFormat()). + * @method CarbonImmutable|false createFromLocaleFormat($format, $locale, $time, $tz = null) Create a Carbon instance from a specific format and a string in a given language. + * @method CarbonImmutable|false createFromLocaleIsoFormat($format, $locale, $time, $tz = null) Create a Carbon instance from a specific ISO format and a string in a given language. + * @method CarbonImmutable createFromTime($hour = 0, $minute = 0, $second = 0, $tz = null) Create a Carbon instance from just a time. The date portion is set to today. + * @method CarbonImmutable createFromTimeString($time, $tz = null) Create a Carbon instance from a time string. The date portion is set to today. + * @method CarbonImmutable createFromTimestamp($timestamp, $tz = null) Create a Carbon instance from a timestamp and set the timezone (use default one if not specified). + * Timestamp input can be given as int, float or a string containing one or more numbers. + * @method CarbonImmutable createFromTimestampMs($timestamp, $tz = null) Create a Carbon instance from a timestamp in milliseconds. + * Timestamp input can be given as int, float or a string containing one or more numbers. + * @method CarbonImmutable createFromTimestampMsUTC($timestamp) Create a Carbon instance from a timestamp in milliseconds. + * Timestamp input can be given as int, float or a string containing one or more numbers. + * @method CarbonImmutable createFromTimestampUTC($timestamp) Create a Carbon instance from an timestamp keeping the timezone to UTC. + * Timestamp input can be given as int, float or a string containing one or more numbers. + * @method CarbonImmutable createMidnightDate($year = null, $month = null, $day = null, $tz = null) Create a Carbon instance from just a date. The time portion is set to midnight. + * @method CarbonImmutable|false createSafe($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $tz = null) Create a new safe Carbon instance from a specific date and time. + * If any of $year, $month or $day are set to null their now() values will + * be used. + * If $hour is null it will be set to its now() value and the default + * values for $minute and $second will be their now() values. + * If $hour is not null then the default values for $minute and $second + * will be 0. + * If one of the set values is not valid, an InvalidDateException + * will be thrown. + * @method CarbonInterface createStrict(?int $year = 0, ?int $month = 1, ?int $day = 1, ?int $hour = 0, ?int $minute = 0, ?int $second = 0, $tz = null) Create a new Carbon instance from a specific date and time using strict validation. + * @method CarbonImmutable disableHumanDiffOption($humanDiffOption) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * @method CarbonImmutable enableHumanDiffOption($humanDiffOption) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * @method mixed executeWithLocale($locale, $func) Set the current locale to the given, execute the passed function, reset the locale to previous one, + * then return the result of the closure (or null if the closure was void). + * @method CarbonImmutable fromSerialized($value) Create an instance from a serialized string. + * @method void genericMacro($macro, $priority = 0) Register a custom macro. + * @method array getAvailableLocales() Returns the list of internally available locales and already loaded custom locales. + * (It will ignore custom translator dynamic loading.) + * @method Language[] getAvailableLocalesInfo() Returns list of Language object for each available locale. This object allow you to get the ISO name, native + * name, region and variant of the locale. + * @method array getDays() Get the days of the week + * @method string|null getFallbackLocale() Get the fallback locale. + * @method array getFormatsToIsoReplacements() List of replacements from date() format to isoFormat(). + * @method int getHumanDiffOptions() Return default humanDiff() options (merged flags as integer). + * @method array getIsoUnits() Returns list of locale units for ISO formatting. + * @method array getLastErrors() {@inheritdoc} + * @method string getLocale() Get the current translator locale. + * @method callable|null getMacro($name) Get the raw callable macro registered globally for a given name. + * @method int getMidDayAt() get midday/noon hour + * @method Closure|CarbonImmutable getTestNow() Get the Carbon instance (real or mock) to be returned when a "now" + * instance is created. + * @method string getTimeFormatByPrecision($unitPrecision) Return a format from H:i to H:i:s.u according to given unit precision. + * @method string getTranslationMessageWith($translator, string $key, ?string $locale = null, ?string $default = null) Returns raw translation message for a given key. + * @method \Symfony\Component\Translation\TranslatorInterface getTranslator() Get the default translator instance in use. + * @method int getWeekEndsAt() Get the last day of week + * @method int getWeekStartsAt() Get the first day of week + * @method array getWeekendDays() Get weekend days + * @method bool hasFormat($date, $format) Checks if the (date)time string is in a given format. + * @method bool hasFormatWithModifiers($date, $format) Checks if the (date)time string is in a given format. + * @method bool hasMacro($name) Checks if macro is registered globally. + * @method bool hasRelativeKeywords($time) Determine if a time string will produce a relative date. + * @method bool hasTestNow() Determine if there is a valid test instance set. A valid test instance + * is anything that is not null. + * @method CarbonImmutable instance($date) Create a Carbon instance from a DateTime one. + * @method bool isImmutable() Returns true if the current class/instance is immutable. + * @method bool isModifiableUnit($unit) Returns true if a property can be changed via setter. + * @method bool isMutable() Returns true if the current class/instance is mutable. + * @method bool isStrictModeEnabled() Returns true if the strict mode is globally in use, false else. + * (It can be overridden in specific instances.) + * @method bool localeHasDiffOneDayWords($locale) Returns true if the given locale is internally supported and has words for 1-day diff (just now, yesterday, tomorrow). + * Support is considered enabled if the 3 words are translated in the given locale. + * @method bool localeHasDiffSyntax($locale) Returns true if the given locale is internally supported and has diff syntax support (ago, from now, before, after). + * Support is considered enabled if the 4 sentences are translated in the given locale. + * @method bool localeHasDiffTwoDayWords($locale) Returns true if the given locale is internally supported and has words for 2-days diff (before yesterday, after tomorrow). + * Support is considered enabled if the 2 words are translated in the given locale. + * @method bool localeHasPeriodSyntax($locale) Returns true if the given locale is internally supported and has period syntax support (X times, every X, from X, to X). + * Support is considered enabled if the 4 sentences are translated in the given locale. + * @method bool localeHasShortUnits($locale) Returns true if the given locale is internally supported and has short-units support. + * Support is considered enabled if either year, day or hour has a short variant translated. + * @method void macro($name, $macro) Register a custom macro. + * @method CarbonImmutable|null make($var) Make a Carbon instance from given variable if possible. + * Always return a new instance. Parse only strings and only these likely to be dates (skip intervals + * and recurrences). Throw an exception for invalid format, but otherwise return null. + * @method CarbonImmutable maxValue() Create a Carbon instance for the greatest supported date. + * @method CarbonImmutable minValue() Create a Carbon instance for the lowest supported date. + * @method void mixin($mixin) Mix another object into the class. + * @method CarbonImmutable now($tz = null) Get a Carbon instance for the current date and time. + * @method CarbonImmutable parse($time = null, $tz = null) Create a carbon instance from a string. + * This is an alias for the constructor that allows better fluent syntax + * as it allows you to do Carbon::parse('Monday next week')->fn() rather + * than (new Carbon('Monday next week'))->fn(). + * @method CarbonImmutable parseFromLocale($time, $locale = null, $tz = null) Create a carbon instance from a localized string (in French, Japanese, Arabic, etc.). + * @method string pluralUnit(string $unit) Returns standardized plural of a given singular/plural unit name (in English). + * @method CarbonImmutable|false rawCreateFromFormat($format, $time, $tz = null) Create a Carbon instance from a specific format. + * @method CarbonImmutable rawParse($time = null, $tz = null) Create a carbon instance from a string. + * This is an alias for the constructor that allows better fluent syntax + * as it allows you to do Carbon::parse('Monday next week')->fn() rather + * than (new Carbon('Monday next week'))->fn(). + * @method CarbonImmutable resetMacros() Remove all macros and generic macros. + * @method void resetMonthsOverflow() @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants + * are available for quarters, years, decade, centuries, millennia (singular and plural forms). + * @method void resetToStringFormat() Reset the format used to the default when type juggling a Carbon instance to a string + * @method void resetYearsOverflow() @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants + * are available for quarters, years, decade, centuries, millennia (singular and plural forms). + * @method void serializeUsing($callback) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather transform Carbon object before the serialization. + * JSON serialize all Carbon instances using the given callback. + * @method CarbonImmutable setFallbackLocale($locale) Set the fallback locale. + * @method CarbonImmutable setHumanDiffOptions($humanDiffOptions) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * @method bool setLocale($locale) Set the current translator locale and indicate if the source locale file exists. + * Pass 'auto' as locale to use closest language from the current LC_TIME locale. + * @method void setMidDayAt($hour) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather consider mid-day is always 12pm, then if you need to test if it's an other + * hour, test it explicitly: + * $date->format('G') == 13 + * or to set explicitly to a given hour: + * $date->setTime(13, 0, 0, 0) + * Set midday/noon hour + * @method CarbonImmutable setTestNow($testNow = null) Set a Carbon instance (real or mock) to be returned when a "now" + * instance is created. The provided instance will be returned + * specifically under the following conditions: + * - A call to the static now() method, ex. Carbon::now() + * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) + * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') + * - When a string containing the desired time is passed to Carbon::parse(). + * Note the timezone parameter was left out of the examples above and + * has no affect as the mock value will be returned regardless of its value. + * Only the moment is mocked with setTestNow(), the timezone will still be the one passed + * as parameter of date_default_timezone_get() as a fallback (see setTestNowAndTimezone()). + * To clear the test instance call this method using the default + * parameter of null. + * /!\ Use this method for unit tests only. + * @method CarbonImmutable setTestNowAndTimezone($testNow = null, $tz = null) Set a Carbon instance (real or mock) to be returned when a "now" + * instance is created. The provided instance will be returned + * specifically under the following conditions: + * - A call to the static now() method, ex. Carbon::now() + * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) + * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') + * - When a string containing the desired time is passed to Carbon::parse(). + * It will also align default timezone (e.g. call date_default_timezone_set()) with + * the second argument or if null, with the timezone of the given date object. + * To clear the test instance call this method using the default + * parameter of null. + * /!\ Use this method for unit tests only. + * @method void setToStringFormat($format) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather let Carbon object being casted to string with DEFAULT_TO_STRING_FORMAT, and + * use other method or custom format passed to format() method if you need to dump an other string + * format. + * Set the default format used when type juggling a Carbon instance to a string + * @method void setTranslator(TranslatorInterface $translator) Set the default translator instance to use. + * @method CarbonImmutable setUtf8($utf8) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use UTF-8 language packages on every machine. + * Set if UTF8 will be used for localized date/time. + * @method void setWeekEndsAt($day) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * Use $weekStartsAt optional parameter instead when using startOfWeek, floorWeek, ceilWeek + * or roundWeek method. You can also use the 'first_day_of_week' locale setting to change the + * start of week according to current locale selected and implicitly the end of week. + * Set the last day of week + * @method void setWeekStartsAt($day) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * Use $weekEndsAt optional parameter instead when using endOfWeek method. You can also use the + * 'first_day_of_week' locale setting to change the start of week according to current locale + * selected and implicitly the end of week. + * Set the first day of week + * @method void setWeekendDays($days) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather consider week-end is always saturday and sunday, and if you have some custom + * week-end days to handle, give to those days an other name and create a macro for them: + * ``` + * Carbon::macro('isDayOff', function ($date) { + * return $date->isSunday() || $date->isMonday(); + * }); + * Carbon::macro('isNotDayOff', function ($date) { + * return !$date->isDayOff(); + * }); + * if ($someDate->isDayOff()) ... + * if ($someDate->isNotDayOff()) ... + * // Add 5 not-off days + * $count = 5; + * while ($someDate->isDayOff() || ($count-- > 0)) { + * $someDate->addDay(); + * } + * ``` + * Set weekend days + * @method bool shouldOverflowMonths() Get the month overflow global behavior (can be overridden in specific instances). + * @method bool shouldOverflowYears() Get the month overflow global behavior (can be overridden in specific instances). + * @method string singularUnit(string $unit) Returns standardized singular of a given singular/plural unit name (in English). + * @method CarbonImmutable today($tz = null) Create a Carbon instance for today. + * @method CarbonImmutable tomorrow($tz = null) Create a Carbon instance for tomorrow. + * @method string translateTimeString($timeString, $from = null, $to = null, $mode = CarbonInterface::TRANSLATE_ALL) Translate a time string from a locale to an other. + * @method string translateWith(TranslatorInterface $translator, string $key, array $parameters = [], $number = null) Translate using translation string or callback available. + * @method void useMonthsOverflow($monthsOverflow = true) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants + * are available for quarters, years, decade, centuries, millennia (singular and plural forms). + * @method CarbonImmutable useStrictMode($strictModeEnabled = true) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * @method void useYearsOverflow($yearsOverflow = true) @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants + * are available for quarters, years, decade, centuries, millennia (singular and plural forms). + * @method mixed withTestNow($testNow = null, $callback = null) Temporarily sets a static date to be used within the callback. + * Using setTestNow to set the date, executing the callback, then + * clearing the test instance. + * /!\ Use this method for unit tests only. + * @method CarbonImmutable yesterday($tz = null) Create a Carbon instance for yesterday. + * + * </autodoc> + */ +class FactoryImmutable extends Factory +{ + protected $className = CarbonImmutable::class; +} diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/aa.php b/vendor/nesbot/carbon/src/Carbon/Lang/aa.php new file mode 100644 index 0000000..f3431e4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/aa.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/aa_DJ.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/aa_DJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/aa_DJ.php new file mode 100644 index 0000000..c6e23c0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/aa_DJ.php @@ -0,0 +1,44 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation locales@geez.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], + 'months' => ['Qunxa Garablu', 'Kudo', 'Ciggilta Kudo', 'Agda Baxisso', 'Caxah Alsa', 'Qasa Dirri', 'Qado Dirri', 'Liiqen', 'Waysu', 'Diteli', 'Ximoli', 'Kaxxa Garablu'], + 'months_short' => ['qun', 'nah', 'cig', 'agd', 'cax', 'qas', 'qad', 'leq', 'way', 'dit', 'xim', 'kax'], + 'weekdays' => ['Acaada', 'Etleeni', 'Talaata', 'Arbaqa', 'Kamiisi', 'Gumqata', 'Sabti'], + 'weekdays_short' => ['aca', 'etl', 'tal', 'arb', 'kam', 'gum', 'sab'], + 'weekdays_min' => ['aca', 'etl', 'tal', 'arb', 'kam', 'gum', 'sab'], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['saaku', 'carra'], + + 'year' => ':count gaqambo', // less reliable + 'y' => ':count gaqambo', // less reliable + 'a_year' => ':count gaqambo', // less reliable + + 'month' => ':count àlsa', + 'm' => ':count àlsa', + 'a_month' => ':count àlsa', + + 'day' => ':count saaku', // less reliable + 'd' => ':count saaku', // less reliable + 'a_day' => ':count saaku', // less reliable + + 'hour' => ':count ayti', // less reliable + 'h' => ':count ayti', // less reliable + 'a_hour' => ':count ayti', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER.php b/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER.php new file mode 100644 index 0000000..f8f395b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation locales@geez.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['Qunxa Garablu', 'Naharsi Kudo', 'Ciggilta Kudo', 'Agda Baxisso', 'Caxah Alsa', 'Qasa Dirri', 'Qado Dirri', 'Leqeeni', 'Waysu', 'Diteli', 'Ximoli', 'Kaxxa Garablu'], + 'months_short' => ['Qun', 'Nah', 'Cig', 'Agd', 'Cax', 'Qas', 'Qad', 'Leq', 'Way', 'Dit', 'Xim', 'Kax'], + 'weekdays' => ['Acaada', 'Etleeni', 'Talaata', 'Arbaqa', 'Kamiisi', 'Gumqata', 'Sabti'], + 'weekdays_short' => ['Aca', 'Etl', 'Tal', 'Arb', 'Kam', 'Gum', 'Sab'], + 'weekdays_min' => ['Aca', 'Etl', 'Tal', 'Arb', 'Kam', 'Gum', 'Sab'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['saaku', 'carra'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php b/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php new file mode 100644 index 0000000..6461225 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation locales@geez.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['Qunxa Garablu', 'Naharsi Kudo', 'Ciggilta Kudo', 'Agda Baxisso', 'Caxah Alsa', 'Qasa Dirri', 'Qado Dirri', 'Leqeeni', 'Waysu', 'Diteli', 'Ximoli', 'Kaxxa Garablu'], + 'months_short' => ['Qun', 'Nah', 'Cig', 'Agd', 'Cax', 'Qas', 'Qad', 'Leq', 'Way', 'Dit', 'Xim', 'Kax'], + 'weekdays' => ['Naba Sambat', 'Sani', 'Salus', 'Rabuq', 'Camus', 'Jumqata', 'Qunxa Sambat'], + 'weekdays_short' => ['Nab', 'San', 'Sal', 'Rab', 'Cam', 'Jum', 'Qun'], + 'weekdays_min' => ['Nab', 'San', 'Sal', 'Rab', 'Cam', 'Jum', 'Qun'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['saaku', 'carra'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/aa_ET.php b/vendor/nesbot/carbon/src/Carbon/Lang/aa_ET.php new file mode 100644 index 0000000..e55e591 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/aa_ET.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation locales@geez.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['Qunxa Garablu', 'Kudo', 'Ciggilta Kudo', 'Agda Baxisso', 'Caxah Alsa', 'Qasa Dirri', 'Qado Dirri', 'Liiqen', 'Waysu', 'Diteli', 'Ximoli', 'Kaxxa Garablu'], + 'months_short' => ['Qun', 'Kud', 'Cig', 'Agd', 'Cax', 'Qas', 'Qad', 'Leq', 'Way', 'Dit', 'Xim', 'Kax'], + 'weekdays' => ['Acaada', 'Etleeni', 'Talaata', 'Arbaqa', 'Kamiisi', 'Gumqata', 'Sabti'], + 'weekdays_short' => ['Aca', 'Etl', 'Tal', 'Arb', 'Kam', 'Gum', 'Sab'], + 'weekdays_min' => ['Aca', 'Etl', 'Tal', 'Arb', 'Kam', 'Gum', 'Sab'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['saaku', 'carra'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/af.php b/vendor/nesbot/carbon/src/Carbon/Lang/af.php new file mode 100644 index 0000000..27771d7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/af.php @@ -0,0 +1,79 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - JD Isaacks + * - Pierre du Plessis + */ +return [ + 'year' => ':count jaar', + 'a_year' => '\'n jaar|:count jaar', + 'y' => ':count j.', + 'month' => ':count maand|:count maande', + 'a_month' => '\'n maand|:count maande', + 'm' => ':count maa.', + 'week' => ':count week|:count weke', + 'a_week' => '\'n week|:count weke', + 'w' => ':count w.', + 'day' => ':count dag|:count dae', + 'a_day' => '\'n dag|:count dae', + 'd' => ':count d.', + 'hour' => ':count uur', + 'a_hour' => '\'n uur|:count uur', + 'h' => ':count u.', + 'minute' => ':count minuut|:count minute', + 'a_minute' => '\'n minuut|:count minute', + 'min' => ':count min.', + 'second' => ':count sekond|:count sekondes', + 'a_second' => '\'n paar sekondes|:count sekondes', + 's' => ':count s.', + 'ago' => ':time gelede', + 'from_now' => 'oor :time', + 'after' => ':time na', + 'before' => ':time voor', + 'diff_now' => 'Nou', + 'diff_today' => 'Vandag', + 'diff_today_regexp' => 'Vandag(?:\\s+om)?', + 'diff_yesterday' => 'Gister', + 'diff_yesterday_regexp' => 'Gister(?:\\s+om)?', + 'diff_tomorrow' => 'Môre', + 'diff_tomorrow_regexp' => 'Môre(?:\\s+om)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Vandag om] LT', + 'nextDay' => '[Môre om] LT', + 'nextWeek' => 'dddd [om] LT', + 'lastDay' => '[Gister om] LT', + 'lastWeek' => '[Laas] dddd [om] LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number) { + return $number.(($number === 1 || $number === 8 || $number >= 20) ? 'ste' : 'de'); + }, + 'meridiem' => ['VM', 'NM'], + 'months' => ['Januarie', 'Februarie', 'Maart', 'April', 'Mei', 'Junie', 'Julie', 'Augustus', 'September', 'Oktober', 'November', 'Desember'], + 'months_short' => ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'], + 'weekdays' => ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'], + 'weekdays_short' => ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'], + 'weekdays_min' => ['So', 'Ma', 'Di', 'Wo', 'Do', 'Vr', 'Sa'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' en '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/af_NA.php b/vendor/nesbot/carbon/src/Carbon/Lang/af_NA.php new file mode 100644 index 0000000..f2fcf05 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/af_NA.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/af.php', [ + 'meridiem' => ['v', 'n'], + 'weekdays' => ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'], + 'weekdays_short' => ['So.', 'Ma.', 'Di.', 'Wo.', 'Do.', 'Vr.', 'Sa.'], + 'weekdays_min' => ['So.', 'Ma.', 'Di.', 'Wo.', 'Do.', 'Vr.', 'Sa.'], + 'months' => ['Januarie', 'Februarie', 'Maart', 'April', 'Mei', 'Junie', 'Julie', 'Augustus', 'September', 'Oktober', 'November', 'Desember'], + 'months_short' => ['Jan.', 'Feb.', 'Mrt.', 'Apr.', 'Mei', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Okt.', 'Nov.', 'Des.'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY-MM-DD', + 'LL' => 'DD MMM YYYY', + 'LLL' => 'DD MMMM YYYY HH:mm', + 'LLLL' => 'dddd, DD MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/af_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/af_ZA.php new file mode 100644 index 0000000..27896bd --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/af_ZA.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/af.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/agq.php b/vendor/nesbot/carbon/src/Carbon/Lang/agq.php new file mode 100644 index 0000000..7011464 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/agq.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['a.g', 'a.k'], + 'weekdays' => ['tsuʔntsɨ', 'tsuʔukpà', 'tsuʔughɔe', 'tsuʔutɔ̀mlò', 'tsuʔumè', 'tsuʔughɨ̂m', 'tsuʔndzɨkɔʔɔ'], + 'weekdays_short' => ['nts', 'kpa', 'ghɔ', 'tɔm', 'ume', 'ghɨ', 'dzk'], + 'weekdays_min' => ['nts', 'kpa', 'ghɔ', 'tɔm', 'ume', 'ghɨ', 'dzk'], + 'months' => ['ndzɔ̀ŋɔ̀nùm', 'ndzɔ̀ŋɔ̀kƗ̀zùʔ', 'ndzɔ̀ŋɔ̀tƗ̀dʉ̀ghà', 'ndzɔ̀ŋɔ̀tǎafʉ̄ghā', 'ndzɔ̀ŋèsèe', 'ndzɔ̀ŋɔ̀nzùghò', 'ndzɔ̀ŋɔ̀dùmlo', 'ndzɔ̀ŋɔ̀kwîfɔ̀e', 'ndzɔ̀ŋɔ̀tƗ̀fʉ̀ghàdzughù', 'ndzɔ̀ŋɔ̀ghǔuwelɔ̀m', 'ndzɔ̀ŋɔ̀chwaʔàkaa wo', 'ndzɔ̀ŋèfwòo'], + 'months_short' => ['nùm', 'kɨz', 'tɨd', 'taa', 'see', 'nzu', 'dum', 'fɔe', 'dzu', 'lɔm', 'kaa', 'fwo'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM, YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/agr.php b/vendor/nesbot/carbon/src/Carbon/Lang/agr.php new file mode 100644 index 0000000..8f036ae --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/agr.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/agr_PE.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/agr_PE.php b/vendor/nesbot/carbon/src/Carbon/Lang/agr_PE.php new file mode 100644 index 0000000..54a326a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/agr_PE.php @@ -0,0 +1,44 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - somosazucar.org libc-alpha@sourceware.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['Petsatin', 'Kupitin', 'Uyaitin', 'Tayutin', 'Kegketin', 'Tegmatin', 'Kuntutin', 'Yagkujutin', 'Daiktatin', 'Ipamtatin', 'Shinutin', 'Sakamtin'], + 'months_short' => ['Pet', 'Kup', 'Uya', 'Tay', 'Keg', 'Teg', 'Kun', 'Yag', 'Dait', 'Ipam', 'Shin', 'Sak'], + 'weekdays' => ['Tuntuamtin', 'Achutin', 'Kugkuktin', 'Saketin', 'Shimpitin', 'Imaptin', 'Bataetin'], + 'weekdays_short' => ['Tun', 'Ach', 'Kug', 'Sak', 'Shim', 'Im', 'Bat'], + 'weekdays_min' => ['Tun', 'Ach', 'Kug', 'Sak', 'Shim', 'Im', 'Bat'], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 7, + 'meridiem' => ['VM', 'NM'], + + 'year' => ':count yaya', // less reliable + 'y' => ':count yaya', // less reliable + 'a_year' => ':count yaya', // less reliable + + 'month' => ':count nantu', // less reliable + 'm' => ':count nantu', // less reliable + 'a_month' => ':count nantu', // less reliable + + 'day' => ':count nayaim', // less reliable + 'd' => ':count nayaim', // less reliable + 'a_day' => ':count nayaim', // less reliable + + 'hour' => ':count kuwiš', // less reliable + 'h' => ':count kuwiš', // less reliable + 'a_hour' => ':count kuwiš', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ak.php b/vendor/nesbot/carbon/src/Carbon/Lang/ak.php new file mode 100644 index 0000000..5a64be3 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ak.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/ak_GH.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ak_GH.php b/vendor/nesbot/carbon/src/Carbon/Lang/ak_GH.php new file mode 100644 index 0000000..1381946 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ak_GH.php @@ -0,0 +1,40 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Sugar Labs // OLPC sugarlabs.org libc-alpha@sourceware.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'YYYY/MM/DD', + ], + 'months' => ['Sanda-Ɔpɛpɔn', 'Kwakwar-Ɔgyefuo', 'Ebɔw-Ɔbenem', 'Ebɔbira-Oforisuo', 'Esusow Aketseaba-Kɔtɔnimba', 'Obirade-Ayɛwohomumu', 'Ayɛwoho-Kitawonsa', 'Difuu-Ɔsandaa', 'Fankwa-Ɛbɔ', 'Ɔbɛsɛ-Ahinime', 'Ɔberɛfɛw-Obubuo', 'Mumu-Ɔpɛnimba'], + 'months_short' => ['S-Ɔ', 'K-Ɔ', 'E-Ɔ', 'E-O', 'E-K', 'O-A', 'A-K', 'D-Ɔ', 'F-Ɛ', 'Ɔ-A', 'Ɔ-O', 'M-Ɔ'], + 'weekdays' => ['Kwesida', 'Dwowda', 'Benada', 'Wukuda', 'Yawda', 'Fida', 'Memeneda'], + 'weekdays_short' => ['Kwe', 'Dwo', 'Ben', 'Wuk', 'Yaw', 'Fia', 'Mem'], + 'weekdays_min' => ['Kwe', 'Dwo', 'Ben', 'Wuk', 'Yaw', 'Fia', 'Mem'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['AN', 'EW'], + + 'year' => ':count afe', + 'y' => ':count afe', + 'a_year' => ':count afe', + + 'month' => ':count bosume', + 'm' => ':count bosume', + 'a_month' => ':count bosume', + + 'day' => ':count ɛda', + 'd' => ':count ɛda', + 'a_day' => ':count ɛda', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/am.php b/vendor/nesbot/carbon/src/Carbon/Lang/am.php new file mode 100644 index 0000000..63bf72d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/am.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/am_ET.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/am_ET.php b/vendor/nesbot/carbon/src/Carbon/Lang/am_ET.php new file mode 100644 index 0000000..ece8062 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/am_ET.php @@ -0,0 +1,58 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation locales@geez.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['ጃንዩወሪ', 'ፌብሩወሪ', 'ማርች', 'ኤፕሪል', 'ሜይ', 'ጁን', 'ጁላይ', 'ኦገስት', 'ሴፕቴምበር', 'ኦክቶበር', 'ኖቬምበር', 'ዲሴምበር'], + 'months_short' => ['ጃንዩ', 'ፌብሩ', 'ማርች', 'ኤፕረ', 'ሜይ ', 'ጁን ', 'ጁላይ', 'ኦገስ', 'ሴፕቴ', 'ኦክተ', 'ኖቬም', 'ዲሴም'], + 'weekdays' => ['እሑድ', 'ሰኞ', 'ማክሰኞ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ'], + 'weekdays_short' => ['እሑድ', 'ሰኞ ', 'ማክሰ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ'], + 'weekdays_min' => ['እሑድ', 'ሰኞ ', 'ማክሰ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['ጡዋት', 'ከሰዓት'], + + 'year' => ':count አመት', + 'y' => ':count አመት', + 'a_year' => ':count አመት', + + 'month' => ':count ወር', + 'm' => ':count ወር', + 'a_month' => ':count ወር', + + 'week' => ':count ሳምንት', + 'w' => ':count ሳምንት', + 'a_week' => ':count ሳምንት', + + 'day' => ':count ቀን', + 'd' => ':count ቀን', + 'a_day' => ':count ቀን', + + 'hour' => ':count ሰዓት', + 'h' => ':count ሰዓት', + 'a_hour' => ':count ሰዓት', + + 'minute' => ':count ደቂቃ', + 'min' => ':count ደቂቃ', + 'a_minute' => ':count ደቂቃ', + + 'second' => ':count ሴኮንድ', + 's' => ':count ሴኮንድ', + 'a_second' => ':count ሴኮንድ', + + 'ago' => 'ከ:time በፊት', + 'from_now' => 'በ:time ውስጥ', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/an.php b/vendor/nesbot/carbon/src/Carbon/Lang/an.php new file mode 100644 index 0000000..565abf2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/an.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/an_ES.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/an_ES.php b/vendor/nesbot/carbon/src/Carbon/Lang/an_ES.php new file mode 100644 index 0000000..faf8ae0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/an_ES.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Softaragones Jordi Mallach Pérez, Juan Pablo Martínez bug-glibc-locales@gnu.org, softaragones@softaragones.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['chinero', 'febrero', 'marzo', 'abril', 'mayo', 'chunyo', 'chuliol', 'agosto', 'setiembre', 'octubre', 'noviembre', 'aviento'], + 'months_short' => ['chi', 'feb', 'mar', 'abr', 'may', 'chn', 'chl', 'ago', 'set', 'oct', 'nov', 'avi'], + 'weekdays' => ['domingo', 'luns', 'martes', 'mierques', 'chueves', 'viernes', 'sabado'], + 'weekdays_short' => ['dom', 'lun', 'mar', 'mie', 'chu', 'vie', 'sab'], + 'weekdays_min' => ['dom', 'lun', 'mar', 'mie', 'chu', 'vie', 'sab'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + + 'year' => ':count año', + 'y' => ':count año', + 'a_year' => ':count año', + + 'month' => ':count mes', + 'm' => ':count mes', + 'a_month' => ':count mes', + + 'week' => ':count semana', + 'w' => ':count semana', + 'a_week' => ':count semana', + + 'day' => ':count día', + 'd' => ':count día', + 'a_day' => ':count día', + + 'hour' => ':count reloch', // less reliable + 'h' => ':count reloch', // less reliable + 'a_hour' => ':count reloch', // less reliable + + 'minute' => ':count minuto', + 'min' => ':count minuto', + 'a_minute' => ':count minuto', + + 'second' => ':count segundo', + 's' => ':count segundo', + 'a_second' => ':count segundo', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/anp.php b/vendor/nesbot/carbon/src/Carbon/Lang/anp.php new file mode 100644 index 0000000..b56c67b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/anp.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/anp_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/anp_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/anp_IN.php new file mode 100644 index 0000000..11069be --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/anp_IN.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - bhashaghar@googlegroups.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितंबर', 'अक्टूबर', 'नवंबर', 'दिसंबर"'], + 'months_short' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितंबर', 'अक्टूबर', 'नवंबर', 'दिसंबर'], + 'weekdays' => ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'बृहस्पतिवार', 'शुक्रवार', 'शनिवार'], + 'weekdays_short' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पति', 'शुक्र', 'शनि'], + 'weekdays_min' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पति', 'शुक्र', 'शनि'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar.php new file mode 100644 index 0000000..5f73f63 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar.php @@ -0,0 +1,93 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Atef Ben Ali (atefBB) + * - Ibrahim AshShohail + * - MLTDev + * - Mohamed Sabil (mohamedsabil83) + * - Yazan Alnugnugh (yazan-alnugnugh) + */ +$months = [ + 'يناير', + 'فبراير', + 'مارس', + 'أبريل', + 'مايو', + 'يونيو', + 'يوليو', + 'أغسطس', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر', +]; + +return [ + 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), + 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), + 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), + 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), + 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), + 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), + 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), + 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), + 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), + 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), + 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), + 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), + 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), + 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), + 'ago' => 'منذ :time', + 'from_now' => ':time من الآن', + 'after' => 'بعد :time', + 'before' => 'قبل :time', + 'diff_now' => 'الآن', + 'diff_today' => 'اليوم', + 'diff_today_regexp' => 'اليوم(?:\\s+عند)?(?:\\s+الساعة)?', + 'diff_yesterday' => 'أمس', + 'diff_yesterday_regexp' => 'أمس(?:\\s+عند)?(?:\\s+الساعة)?', + 'diff_tomorrow' => 'غداً', + 'diff_tomorrow_regexp' => 'غدًا(?:\\s+عند)?(?:\\s+الساعة)?', + 'diff_before_yesterday' => 'قبل الأمس', + 'diff_after_tomorrow' => 'بعد غد', + 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), + 'period_interval' => 'كل :interval', + 'period_start_date' => 'من :date', + 'period_end_date' => 'إلى :date', + 'months' => $months, + 'months_short' => $months, + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], + 'weekdays_min' => ['ح', 'اث', 'ثل', 'أر', 'خم', 'ج', 'س'], + 'list' => ['، ', ' و '], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[اليوم عند الساعة] LT', + 'nextDay' => '[غدًا عند الساعة] LT', + 'nextWeek' => 'dddd [عند الساعة] LT', + 'lastDay' => '[أمس عند الساعة] LT', + 'lastWeek' => 'dddd [عند الساعة] LT', + 'sameElse' => 'L', + ], + 'meridiem' => ['ص', 'م'], + 'weekend' => [5, 6], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_AE.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_AE.php new file mode 100644 index 0000000..75fe47f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_AE.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/ar.php', [ + 'formats' => [ + 'L' => 'DD MMM, YYYY', + ], + 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], + 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت '], + 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_BH.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_BH.php new file mode 100644 index 0000000..362009e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_BH.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/ar.php', [ + 'formats' => [ + 'L' => 'DD MMM, YYYY', + ], + 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], + 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_DJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_DJ.php new file mode 100644 index 0000000..e790b99 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_DJ.php @@ -0,0 +1,13 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ar.php', [ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_DZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_DZ.php new file mode 100644 index 0000000..aea4eee --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_DZ.php @@ -0,0 +1,92 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Authors: + * - Josh Soref + * - Noureddine LOUAHEDJ + * - JD Isaacks + * - Atef Ben Ali (atefBB) + * - Mohamed Sabil (mohamedsabil83) + */ +$months = [ + 'جانفي', + 'فيفري', + 'مارس', + 'أفريل', + 'ماي', + 'جوان', + 'جويلية', + 'أوت', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر', +]; + +return [ + 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), + 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), + 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), + 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), + 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), + 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), + 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), + 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), + 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), + 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), + 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), + 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), + 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), + 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), + 'ago' => 'منذ :time', + 'from_now' => 'في :time', + 'after' => 'بعد :time', + 'before' => 'قبل :time', + 'diff_now' => 'الآن', + 'diff_today' => 'اليوم', + 'diff_today_regexp' => 'اليوم(?:\\s+على)?(?:\\s+الساعة)?', + 'diff_yesterday' => 'أمس', + 'diff_yesterday_regexp' => 'أمس(?:\\s+على)?(?:\\s+الساعة)?', + 'diff_tomorrow' => 'غداً', + 'diff_tomorrow_regexp' => 'غدا(?:\\s+على)?(?:\\s+الساعة)?', + 'diff_before_yesterday' => 'قبل الأمس', + 'diff_after_tomorrow' => 'بعد غد', + 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), + 'period_interval' => 'كل :interval', + 'period_start_date' => 'من :date', + 'period_end_date' => 'إلى :date', + 'months' => $months, + 'months_short' => $months, + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], + 'weekdays_min' => ['أح', 'إث', 'ثلا', 'أر', 'خم', 'جم', 'سب'], + 'list' => ['، ', ' و '], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 4, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[اليوم على الساعة] LT', + 'nextDay' => '[غدا على الساعة] LT', + 'nextWeek' => 'dddd [على الساعة] LT', + 'lastDay' => '[أمس على الساعة] LT', + 'lastWeek' => 'dddd [على الساعة] LT', + 'sameElse' => 'L', + ], + 'meridiem' => ['ص', 'م'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_EG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_EG.php new file mode 100644 index 0000000..362009e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_EG.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/ar.php', [ + 'formats' => [ + 'L' => 'DD MMM, YYYY', + ], + 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], + 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_EH.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_EH.php new file mode 100644 index 0000000..e790b99 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_EH.php @@ -0,0 +1,13 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ar.php', [ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_ER.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_ER.php new file mode 100644 index 0000000..e790b99 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_ER.php @@ -0,0 +1,13 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ar.php', [ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_IL.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_IL.php new file mode 100644 index 0000000..e790b99 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_IL.php @@ -0,0 +1,13 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ar.php', [ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_IN.php new file mode 100644 index 0000000..5fecf70 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_IN.php @@ -0,0 +1,26 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/ar.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], + 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_IQ.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_IQ.php new file mode 100644 index 0000000..0ac0995 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_IQ.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/ar.php', [ + 'formats' => [ + 'L' => 'DD MMM, YYYY', + ], + 'months' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + 'months_short' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_JO.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_JO.php new file mode 100644 index 0000000..0ac0995 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_JO.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/ar.php', [ + 'formats' => [ + 'L' => 'DD MMM, YYYY', + ], + 'months' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + 'months_short' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_KM.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_KM.php new file mode 100644 index 0000000..e790b99 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_KM.php @@ -0,0 +1,13 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ar.php', [ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_KW.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_KW.php new file mode 100644 index 0000000..e6f0531 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_KW.php @@ -0,0 +1,93 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Authors: + * - Josh Soref + * - Nusret Parlak + * - JD Isaacks + * - Atef Ben Ali (atefBB) + * - Mohamed Sabil (mohamedsabil83) + */ +$months = [ + 'يناير', + 'فبراير', + 'مارس', + 'أبريل', + 'ماي', + 'يونيو', + 'يوليوز', + 'غشت', + 'شتنبر', + 'أكتوبر', + 'نونبر', + 'دجنبر', +]; + +return [ + 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), + 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), + 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), + 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), + 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), + 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), + 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), + 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), + 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), + 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), + 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), + 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), + 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), + 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), + 'ago' => 'منذ :time', + 'from_now' => 'في :time', + 'after' => 'بعد :time', + 'before' => 'قبل :time', + 'diff_now' => 'الآن', + 'diff_today' => 'اليوم', + 'diff_today_regexp' => 'اليوم(?:\\s+على)?(?:\\s+الساعة)?', + 'diff_yesterday' => 'أمس', + 'diff_yesterday_regexp' => 'أمس(?:\\s+على)?(?:\\s+الساعة)?', + 'diff_tomorrow' => 'غداً', + 'diff_tomorrow_regexp' => 'غدا(?:\\s+على)?(?:\\s+الساعة)?', + 'diff_before_yesterday' => 'قبل الأمس', + 'diff_after_tomorrow' => 'بعد غد', + 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), + 'period_interval' => 'كل :interval', + 'period_start_date' => 'من :date', + 'period_end_date' => 'إلى :date', + 'months' => $months, + 'months_short' => $months, + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], + 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'list' => ['، ', ' و '], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[اليوم على الساعة] LT', + 'nextDay' => '[غدا على الساعة] LT', + 'nextWeek' => 'dddd [على الساعة] LT', + 'lastDay' => '[أمس على الساعة] LT', + 'lastWeek' => 'dddd [على الساعة] LT', + 'sameElse' => 'L', + ], + 'meridiem' => ['ص', 'م'], + 'weekend' => [5, 6], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_LB.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_LB.php new file mode 100644 index 0000000..55bb10c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_LB.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/ar.php', [ + 'formats' => [ + 'L' => 'DD MMM, YYYY', + ], + 'months' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + 'months_short' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_LY.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_LY.php new file mode 100644 index 0000000..1f0af49 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_LY.php @@ -0,0 +1,92 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Atef Ben Ali (atefBB) + * - Ibrahim AshShohail + * - MLTDev + */ + +$months = [ + 'يناير', + 'فبراير', + 'مارس', + 'أبريل', + 'مايو', + 'يونيو', + 'يوليو', + 'أغسطس', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر', +]; + +return [ + 'year' => implode('|', [':count سنة', 'سنة', 'سنتين', ':count سنوات', ':count سنة']), + 'a_year' => implode('|', [':count سنة', 'سنة', 'سنتين', ':count سنوات', ':count سنة']), + 'month' => implode('|', [':count شهر', 'شهر', 'شهرين', ':count أشهر', ':count شهر']), + 'a_month' => implode('|', [':count شهر', 'شهر', 'شهرين', ':count أشهر', ':count شهر']), + 'week' => implode('|', [':count أسبوع', 'أسبوع', 'أسبوعين', ':count أسابيع', ':count أسبوع']), + 'a_week' => implode('|', [':count أسبوع', 'أسبوع', 'أسبوعين', ':count أسابيع', ':count أسبوع']), + 'day' => implode('|', [':count يوم', 'يوم', 'يومين', ':count أيام', ':count يوم']), + 'a_day' => implode('|', [':count يوم', 'يوم', 'يومين', ':count أيام', ':count يوم']), + 'hour' => implode('|', [':count ساعة', 'ساعة', 'ساعتين', ':count ساعات', ':count ساعة']), + 'a_hour' => implode('|', [':count ساعة', 'ساعة', 'ساعتين', ':count ساعات', ':count ساعة']), + 'minute' => implode('|', [':count دقيقة', 'دقيقة', 'دقيقتين', ':count دقائق', ':count دقيقة']), + 'a_minute' => implode('|', [':count دقيقة', 'دقيقة', 'دقيقتين', ':count دقائق', ':count دقيقة']), + 'second' => implode('|', [':count ثانية', 'ثانية', 'ثانيتين', ':count ثواني', ':count ثانية']), + 'a_second' => implode('|', [':count ثانية', 'ثانية', 'ثانيتين', ':count ثواني', ':count ثانية']), + 'ago' => 'منذ :time', + 'from_now' => ':time من الآن', + 'after' => 'بعد :time', + 'before' => 'قبل :time', + 'diff_now' => 'الآن', + 'diff_today' => 'اليوم', + 'diff_today_regexp' => 'اليوم(?:\\s+عند)?(?:\\s+الساعة)?', + 'diff_yesterday' => 'أمس', + 'diff_yesterday_regexp' => 'أمس(?:\\s+عند)?(?:\\s+الساعة)?', + 'diff_tomorrow' => 'غداً', + 'diff_tomorrow_regexp' => 'غدًا(?:\\s+عند)?(?:\\s+الساعة)?', + 'diff_before_yesterday' => 'قبل الأمس', + 'diff_after_tomorrow' => 'بعد غد', + 'period_recurrences' => implode('|', ['مرة', 'مرة', ':count مرتين', ':count مرات', ':count مرة']), + 'period_interval' => 'كل :interval', + 'period_start_date' => 'من :date', + 'period_end_date' => 'إلى :date', + 'months' => $months, + 'months_short' => $months, + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], + 'weekdays_min' => ['ح', 'اث', 'ثل', 'أر', 'خم', 'ج', 'س'], + 'list' => ['، ', ' و '], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[اليوم عند الساعة] LT', + 'nextDay' => '[غدًا عند الساعة] LT', + 'nextWeek' => 'dddd [عند الساعة] LT', + 'lastDay' => '[أمس عند الساعة] LT', + 'lastWeek' => 'dddd [عند الساعة] LT', + 'sameElse' => 'L', + ], + 'meridiem' => ['ص', 'م'], + 'weekend' => [5, 6], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_MA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_MA.php new file mode 100644 index 0000000..047ae05 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_MA.php @@ -0,0 +1,92 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Authors: + * - Josh Soref + * - JD Isaacks + * - Atef Ben Ali (atefBB) + * - Mohamed Sabil (mohamedsabil83) + */ +$months = [ + 'يناير', + 'فبراير', + 'مارس', + 'أبريل', + 'ماي', + 'يونيو', + 'يوليوز', + 'غشت', + 'شتنبر', + 'أكتوبر', + 'نونبر', + 'دجنبر', +]; + +return [ + 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), + 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), + 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), + 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), + 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), + 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), + 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), + 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), + 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), + 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), + 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), + 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), + 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), + 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), + 'ago' => 'منذ :time', + 'from_now' => 'في :time', + 'after' => 'بعد :time', + 'before' => 'قبل :time', + 'diff_now' => 'الآن', + 'diff_today' => 'اليوم', + 'diff_today_regexp' => 'اليوم(?:\\s+على)?(?:\\s+الساعة)?', + 'diff_yesterday' => 'أمس', + 'diff_yesterday_regexp' => 'أمس(?:\\s+على)?(?:\\s+الساعة)?', + 'diff_tomorrow' => 'غداً', + 'diff_tomorrow_regexp' => 'غدا(?:\\s+على)?(?:\\s+الساعة)?', + 'diff_before_yesterday' => 'قبل الأمس', + 'diff_after_tomorrow' => 'بعد غد', + 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), + 'period_interval' => 'كل :interval', + 'period_start_date' => 'من :date', + 'period_end_date' => 'إلى :date', + 'months' => $months, + 'months_short' => $months, + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], + 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'list' => ['، ', ' و '], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[اليوم على الساعة] LT', + 'nextDay' => '[غدا على الساعة] LT', + 'nextWeek' => 'dddd [على الساعة] LT', + 'lastDay' => '[أمس على الساعة] LT', + 'lastWeek' => 'dddd [على الساعة] LT', + 'sameElse' => 'L', + ], + 'meridiem' => ['ص', 'م'], + 'weekend' => [5, 6], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_MR.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_MR.php new file mode 100644 index 0000000..e790b99 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_MR.php @@ -0,0 +1,13 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ar.php', [ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_OM.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_OM.php new file mode 100644 index 0000000..362009e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_OM.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/ar.php', [ + 'formats' => [ + 'L' => 'DD MMM, YYYY', + ], + 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], + 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_PS.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_PS.php new file mode 100644 index 0000000..e790b99 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_PS.php @@ -0,0 +1,13 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ar.php', [ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_QA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_QA.php new file mode 100644 index 0000000..362009e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_QA.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/ar.php', [ + 'formats' => [ + 'L' => 'DD MMM, YYYY', + ], + 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], + 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_SA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_SA.php new file mode 100644 index 0000000..10aaa2e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_SA.php @@ -0,0 +1,92 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Authors: + * - Josh Soref + * - JD Isaacks + * - Atef Ben Ali (atefBB) + * - Mohamed Sabil (mohamedsabil83) + */ +$months = [ + 'يناير', + 'فبراير', + 'مارس', + 'أبريل', + 'مايو', + 'يونيو', + 'يوليو', + 'أغسطس', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر', +]; + +return [ + 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), + 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), + 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), + 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), + 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), + 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), + 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), + 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), + 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), + 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), + 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), + 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), + 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), + 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), + 'ago' => 'منذ :time', + 'from_now' => 'في :time', + 'after' => 'بعد :time', + 'before' => 'قبل :time', + 'diff_now' => 'الآن', + 'diff_today' => 'اليوم', + 'diff_today_regexp' => 'اليوم(?:\\s+على)?(?:\\s+الساعة)?', + 'diff_yesterday' => 'أمس', + 'diff_yesterday_regexp' => 'أمس(?:\\s+على)?(?:\\s+الساعة)?', + 'diff_tomorrow' => 'غداً', + 'diff_tomorrow_regexp' => 'غدا(?:\\s+على)?(?:\\s+الساعة)?', + 'diff_before_yesterday' => 'قبل الأمس', + 'diff_after_tomorrow' => 'بعد غد', + 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), + 'period_interval' => 'كل :interval', + 'period_start_date' => 'من :date', + 'period_end_date' => 'إلى :date', + 'months' => $months, + 'months_short' => $months, + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], + 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'list' => ['، ', ' و '], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[اليوم على الساعة] LT', + 'nextDay' => '[غدا على الساعة] LT', + 'nextWeek' => 'dddd [على الساعة] LT', + 'lastDay' => '[أمس على الساعة] LT', + 'lastWeek' => 'dddd [على الساعة] LT', + 'sameElse' => 'L', + ], + 'meridiem' => ['ص', 'م'], + 'weekend' => [5, 6], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_SD.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_SD.php new file mode 100644 index 0000000..362009e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_SD.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/ar.php', [ + 'formats' => [ + 'L' => 'DD MMM, YYYY', + ], + 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], + 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_SO.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_SO.php new file mode 100644 index 0000000..e790b99 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_SO.php @@ -0,0 +1,13 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ar.php', [ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_SS.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_SS.php new file mode 100644 index 0000000..32f3282 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_SS.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/ar.php', [ + 'formats' => [ + 'L' => 'DD MMM, YYYY', + ], + 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], + 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_SY.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_SY.php new file mode 100644 index 0000000..0ac0995 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_SY.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/ar.php', [ + 'formats' => [ + 'L' => 'DD MMM, YYYY', + ], + 'months' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + 'months_short' => ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'], + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php new file mode 100644 index 0000000..c2d4b43 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php @@ -0,0 +1,95 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Abdellah Chadidi + * - Atef Ben Ali (atefBB) + * - Mohamed Sabil (mohamedsabil83) + */ +// Same for long and short +$months = [ + // @TODO add shakl to months + 'يناير', + 'فبراير', + 'مارس', + 'أبريل', + 'مايو', + 'يونيو', + 'يوليو', + 'أغسطس', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر', +]; + +return [ + 'year' => implode('|', ['{0}:count سَنَة', '{1}سَنَة', '{2}سَنَتَيْن', ']2,11[:count سَنَوَات', ']10,Inf[:count سَنَة']), + 'a_year' => implode('|', ['{0}:count سَنَة', '{1}سَنَة', '{2}سَنَتَيْن', ']2,11[:count سَنَوَات', ']10,Inf[:count سَنَة']), + 'month' => implode('|', ['{0}:count شَهْرَ', '{1}شَهْرَ', '{2}شَهْرَيْن', ']2,11[:count أَشْهُر', ']10,Inf[:count شَهْرَ']), + 'a_month' => implode('|', ['{0}:count شَهْرَ', '{1}شَهْرَ', '{2}شَهْرَيْن', ']2,11[:count أَشْهُر', ']10,Inf[:count شَهْرَ']), + 'week' => implode('|', ['{0}:count أُسْبُوع', '{1}أُسْبُوع', '{2}أُسْبُوعَيْن', ']2,11[:count أَسَابِيع', ']10,Inf[:count أُسْبُوع']), + 'a_week' => implode('|', ['{0}:count أُسْبُوع', '{1}أُسْبُوع', '{2}أُسْبُوعَيْن', ']2,11[:count أَسَابِيع', ']10,Inf[:count أُسْبُوع']), + 'day' => implode('|', ['{0}:count يَوْم', '{1}يَوْم', '{2}يَوْمَيْن', ']2,11[:count أَيَّام', ']10,Inf[:count يَوْم']), + 'a_day' => implode('|', ['{0}:count يَوْم', '{1}يَوْم', '{2}يَوْمَيْن', ']2,11[:count أَيَّام', ']10,Inf[:count يَوْم']), + 'hour' => implode('|', ['{0}:count سَاعَة', '{1}سَاعَة', '{2}سَاعَتَيْن', ']2,11[:count سَاعَات', ']10,Inf[:count سَاعَة']), + 'a_hour' => implode('|', ['{0}:count سَاعَة', '{1}سَاعَة', '{2}سَاعَتَيْن', ']2,11[:count سَاعَات', ']10,Inf[:count سَاعَة']), + 'minute' => implode('|', ['{0}:count دَقِيقَة', '{1}دَقِيقَة', '{2}دَقِيقَتَيْن', ']2,11[:count دَقَائِق', ']10,Inf[:count دَقِيقَة']), + 'a_minute' => implode('|', ['{0}:count دَقِيقَة', '{1}دَقِيقَة', '{2}دَقِيقَتَيْن', ']2,11[:count دَقَائِق', ']10,Inf[:count دَقِيقَة']), + 'second' => implode('|', ['{0}:count ثَانِيَة', '{1}ثَانِيَة', '{2}ثَانِيَتَيْن', ']2,11[:count ثَوَان', ']10,Inf[:count ثَانِيَة']), + 'a_second' => implode('|', ['{0}:count ثَانِيَة', '{1}ثَانِيَة', '{2}ثَانِيَتَيْن', ']2,11[:count ثَوَان', ']10,Inf[:count ثَانِيَة']), + 'ago' => 'مُنْذُ :time', + 'from_now' => 'مِنَ الْآن :time', + 'after' => 'بَعْدَ :time', + 'before' => 'قَبْلَ :time', + + // @TODO add shakl to translations below + 'diff_now' => 'الآن', + 'diff_today' => 'اليوم', + 'diff_today_regexp' => 'اليوم(?:\\s+عند)?(?:\\s+الساعة)?', + 'diff_yesterday' => 'أمس', + 'diff_yesterday_regexp' => 'أمس(?:\\s+عند)?(?:\\s+الساعة)?', + 'diff_tomorrow' => 'غداً', + 'diff_tomorrow_regexp' => 'غدًا(?:\\s+عند)?(?:\\s+الساعة)?', + 'diff_before_yesterday' => 'قبل الأمس', + 'diff_after_tomorrow' => 'بعد غد', + 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), + 'period_interval' => 'كل :interval', + 'period_start_date' => 'من :date', + 'period_end_date' => 'إلى :date', + 'months' => $months, + 'months_short' => $months, + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], + 'weekdays_min' => ['ح', 'اث', 'ثل', 'أر', 'خم', 'ج', 'س'], + 'list' => ['، ', ' و '], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[اليوم عند الساعة] LT', + 'nextDay' => '[غدًا عند الساعة] LT', + 'nextWeek' => 'dddd [عند الساعة] LT', + 'lastDay' => '[أمس عند الساعة] LT', + 'lastWeek' => 'dddd [عند الساعة] LT', + 'sameElse' => 'L', + ], + 'meridiem' => ['ص', 'م'], + 'weekend' => [5, 6], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_TD.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_TD.php new file mode 100644 index 0000000..e790b99 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_TD.php @@ -0,0 +1,13 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ar.php', [ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_TN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_TN.php new file mode 100644 index 0000000..f096678 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_TN.php @@ -0,0 +1,91 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Authors: + * - JD Isaacks + * - Atef Ben Ali (atefBB) + * - Mohamed Sabil (mohamedsabil83) + */ +$months = [ + 'جانفي', + 'فيفري', + 'مارس', + 'أفريل', + 'ماي', + 'جوان', + 'جويلية', + 'أوت', + 'سبتمبر', + 'أكتوبر', + 'نوفمبر', + 'ديسمبر', +]; + +return [ + 'year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), + 'a_year' => implode('|', ['{0}:count سنة', '{1}سنة', '{2}سنتين', ']2,11[:count سنوات', ']10,Inf[:count سنة']), + 'month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), + 'a_month' => implode('|', ['{0}:count شهر', '{1}شهر', '{2}شهرين', ']2,11[:count أشهر', ']10,Inf[:count شهر']), + 'week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), + 'a_week' => implode('|', ['{0}:count أسبوع', '{1}أسبوع', '{2}أسبوعين', ']2,11[:count أسابيع', ']10,Inf[:count أسبوع']), + 'day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), + 'a_day' => implode('|', ['{0}:count يوم', '{1}يوم', '{2}يومين', ']2,11[:count أيام', ']10,Inf[:count يوم']), + 'hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), + 'a_hour' => implode('|', ['{0}:count ساعة', '{1}ساعة', '{2}ساعتين', ']2,11[:count ساعات', ']10,Inf[:count ساعة']), + 'minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), + 'a_minute' => implode('|', ['{0}:count دقيقة', '{1}دقيقة', '{2}دقيقتين', ']2,11[:count دقائق', ']10,Inf[:count دقيقة']), + 'second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), + 'a_second' => implode('|', ['{0}:count ثانية', '{1}ثانية', '{2}ثانيتين', ']2,11[:count ثواني', ']10,Inf[:count ثانية']), + 'ago' => 'منذ :time', + 'from_now' => 'في :time', + 'after' => 'بعد :time', + 'before' => 'قبل :time', + 'diff_now' => 'الآن', + 'diff_today' => 'اليوم', + 'diff_today_regexp' => 'اليوم(?:\\s+على)?(?:\\s+الساعة)?', + 'diff_yesterday' => 'أمس', + 'diff_yesterday_regexp' => 'أمس(?:\\s+على)?(?:\\s+الساعة)?', + 'diff_tomorrow' => 'غداً', + 'diff_tomorrow_regexp' => 'غدا(?:\\s+على)?(?:\\s+الساعة)?', + 'diff_before_yesterday' => 'قبل الأمس', + 'diff_after_tomorrow' => 'بعد غد', + 'period_recurrences' => implode('|', ['{0}مرة', '{1}مرة', '{2}:count مرتين', ']2,11[:count مرات', ']10,Inf[:count مرة']), + 'period_interval' => 'كل :interval', + 'period_start_date' => 'من :date', + 'period_end_date' => 'إلى :date', + 'months' => $months, + 'months_short' => $months, + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['أحد', 'اثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'], + 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'list' => ['، ', ' و '], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[اليوم على الساعة] LT', + 'nextDay' => '[غدا على الساعة] LT', + 'nextWeek' => 'dddd [على الساعة] LT', + 'lastDay' => '[أمس على الساعة] LT', + 'lastWeek' => 'dddd [على الساعة] LT', + 'sameElse' => 'L', + ], + 'meridiem' => ['ص', 'م'], + 'weekend' => [5, 6], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ar_YE.php b/vendor/nesbot/carbon/src/Carbon/Lang/ar_YE.php new file mode 100644 index 0000000..5dc2938 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ar_YE.php @@ -0,0 +1,26 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/ar.php', [ + 'formats' => [ + 'L' => 'DD MMM, YYYY', + ], + 'months' => ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'], + 'months_short' => ['ينا', 'فبر', 'مار', 'أبر', 'ماي', 'يون', 'يول', 'أغس', 'سبت', 'أكت', 'نوف', 'ديس'], + 'weekdays' => ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'], + 'weekdays_short' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'weekdays_min' => ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'], + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/as.php b/vendor/nesbot/carbon/src/Carbon/Lang/as.php new file mode 100644 index 0000000..04bc3df --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/as.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/as_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/as_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/as_IN.php new file mode 100644 index 0000000..5fbc3db --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/as_IN.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Amitakhya Phukan, Red Hat bug-glibc@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'D-MM-YYYY', + ], + 'months' => ['জানুৱাৰী', 'ফেব্ৰুৱাৰী', 'মাৰ্চ', 'এপ্ৰিল', 'মে', 'জুন', 'জুলাই', 'আগষ্ট', 'ছেপ্তেম্বৰ', 'অক্টোবৰ', 'নৱেম্বৰ', 'ডিচেম্বৰ'], + 'months_short' => ['জানু', 'ফেব্ৰু', 'মাৰ্চ', 'এপ্ৰিল', 'মে', 'জুন', 'জুলাই', 'আগ', 'সেপ্ট', 'অক্টো', 'নভে', 'ডিসে'], + 'weekdays' => ['দেওবাৰ', 'সোমবাৰ', 'মঙ্গলবাৰ', 'বুধবাৰ', 'বৃহষ্পতিবাৰ', 'শুক্ৰবাৰ', 'শনিবাৰ'], + 'weekdays_short' => ['দেও', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহষ্পতি', 'শুক্ৰ', 'শনি'], + 'weekdays_min' => ['দেও', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহষ্পতি', 'শুক্ৰ', 'শনি'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['পূৰ্ব্বাহ্ন', 'অপৰাহ্ন'], + + 'year' => ':count বছৰ', + 'y' => ':count বছৰ', + 'a_year' => ':count বছৰ', + + 'month' => ':count মাহ', + 'm' => ':count মাহ', + 'a_month' => ':count মাহ', + + 'week' => ':count সপ্তাহ', + 'w' => ':count সপ্তাহ', + 'a_week' => ':count সপ্তাহ', + + 'day' => ':count বাৰ', + 'd' => ':count বাৰ', + 'a_day' => ':count বাৰ', + + 'hour' => ':count ঘণ্টা', + 'h' => ':count ঘণ্টা', + 'a_hour' => ':count ঘণ্টা', + + 'minute' => ':count মিনিট', + 'min' => ':count মিনিট', + 'a_minute' => ':count মিনিট', + + 'second' => ':count দ্বিতীয়', + 's' => ':count দ্বিতীয়', + 'a_second' => ':count দ্বিতীয়', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/asa.php b/vendor/nesbot/carbon/src/Carbon/Lang/asa.php new file mode 100644 index 0000000..03bb483 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/asa.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['icheheavo', 'ichamthi'], + 'weekdays' => ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'], + 'weekdays_short' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Ijm', 'Jmo'], + 'weekdays_min' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Ijm', 'Jmo'], + 'months' => ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], + 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Dec'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ast.php b/vendor/nesbot/carbon/src/Carbon/Lang/ast.php new file mode 100644 index 0000000..d9bdebe --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ast.php @@ -0,0 +1,59 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Jordi Mallach jordi@gnu.org + * - Adolfo Jayme-Barrientos (fitojb) + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['de xineru', 'de febreru', 'de marzu', 'd’abril', 'de mayu', 'de xunu', 'de xunetu', 'd’agostu', 'de setiembre', 'd’ochobre', 'de payares', 'd’avientu'], + 'months_short' => ['xin', 'feb', 'mar', 'abr', 'may', 'xun', 'xnt', 'ago', 'set', 'och', 'pay', 'avi'], + 'weekdays' => ['domingu', 'llunes', 'martes', 'miércoles', 'xueves', 'vienres', 'sábadu'], + 'weekdays_short' => ['dom', 'llu', 'mar', 'mié', 'xue', 'vie', 'sáb'], + 'weekdays_min' => ['dom', 'llu', 'mar', 'mié', 'xue', 'vie', 'sáb'], + + 'year' => ':count añu|:count años', + 'y' => ':count añu|:count años', + 'a_year' => 'un añu|:count años', + + 'month' => ':count mes', + 'm' => ':count mes', + 'a_month' => 'un mes|:count mes', + + 'week' => ':count selmana|:count selmanes', + 'w' => ':count selmana|:count selmanes', + 'a_week' => 'una selmana|:count selmanes', + + 'day' => ':count día|:count díes', + 'd' => ':count día|:count díes', + 'a_day' => 'un día|:count díes', + + 'hour' => ':count hora|:count hores', + 'h' => ':count hora|:count hores', + 'a_hour' => 'una hora|:count hores', + + 'minute' => ':count minutu|:count minutos', + 'min' => ':count minutu|:count minutos', + 'a_minute' => 'un minutu|:count minutos', + + 'second' => ':count segundu|:count segundos', + 's' => ':count segundu|:count segundos', + 'a_second' => 'un segundu|:count segundos', + + 'ago' => 'hai :time', + 'from_now' => 'en :time', + 'after' => ':time dempués', + 'before' => ':time enantes', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ast_ES.php b/vendor/nesbot/carbon/src/Carbon/Lang/ast_ES.php new file mode 100644 index 0000000..04d7562 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ast_ES.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ast.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ayc.php b/vendor/nesbot/carbon/src/Carbon/Lang/ayc.php new file mode 100644 index 0000000..d6a6f63 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ayc.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/ayc_PE.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ayc_PE.php b/vendor/nesbot/carbon/src/Carbon/Lang/ayc_PE.php new file mode 100644 index 0000000..ff18504 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ayc_PE.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - runasimipi.org libc-alpha@sourceware.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['inïru', 'phiwriru', 'marsu', 'awrila', 'mayu', 'junyu', 'julyu', 'awustu', 'sitimri', 'uktuwri', 'nuwimri', 'risimri'], + 'months_short' => ['ini', 'phi', 'mar', 'awr', 'may', 'jun', 'jul', 'awu', 'sit', 'ukt', 'nuw', 'ris'], + 'weekdays' => ['tuminku', 'lunisa', 'martisa', 'mirkulisa', 'juywisa', 'wirnisa', 'sawäru'], + 'weekdays_short' => ['tum', 'lun', 'mar', 'mir', 'juy', 'wir', 'saw'], + 'weekdays_min' => ['tum', 'lun', 'mar', 'mir', 'juy', 'wir', 'saw'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['VM', 'NM'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/az.php b/vendor/nesbot/carbon/src/Carbon/Lang/az.php new file mode 100644 index 0000000..1e92106 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/az.php @@ -0,0 +1,128 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - Kunal Marwaha + * - François B + * - JD Isaacks + * - Orxan + * - Şəhriyar İmanov + * - Baran Şengül + */ +return [ + 'year' => ':count il', + 'a_year' => '{1}bir il|]1,Inf[:count il', + 'y' => ':count il', + 'month' => ':count ay', + 'a_month' => '{1}bir ay|]1,Inf[:count ay', + 'm' => ':count ay', + 'week' => ':count həftə', + 'a_week' => '{1}bir həftə|]1,Inf[:count həftə', + 'w' => ':count h.', + 'day' => ':count gün', + 'a_day' => '{1}bir gün|]1,Inf[:count gün', + 'd' => ':count g.', + 'hour' => ':count saat', + 'a_hour' => '{1}bir saat|]1,Inf[:count saat', + 'h' => ':count saat', + 'minute' => ':count d.', + 'a_minute' => '{1}bir dəqiqə|]1,Inf[:count dəqiqə', + 'min' => ':count dəqiqə', + 'second' => ':count san.', + 'a_second' => '{1}birneçə saniyə|]1,Inf[:count saniyə', + 's' => ':count saniyə', + 'ago' => ':time əvvəl', + 'from_now' => ':time sonra', + 'after' => ':time sonra', + 'before' => ':time əvvəl', + 'diff_now' => 'indi', + 'diff_today' => 'bugün', + 'diff_today_regexp' => 'bugün(?:\\s+saat)?', + 'diff_yesterday' => 'dünən', + 'diff_tomorrow' => 'sabah', + 'diff_tomorrow_regexp' => 'sabah(?:\\s+saat)?', + 'diff_before_yesterday' => 'srağagün', + 'diff_after_tomorrow' => 'birisi gün', + 'period_recurrences' => ':count dəfədən bir', + 'period_interval' => 'hər :interval', + 'period_start_date' => ':date tarixindən başlayaraq', + 'period_end_date' => ':date tarixinədək', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[bugün saat] LT', + 'nextDay' => '[sabah saat] LT', + 'nextWeek' => '[gələn həftə] dddd [saat] LT', + 'lastDay' => '[dünən] LT', + 'lastWeek' => '[keçən həftə] dddd [saat] LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number) { + if ($number === 0) { // special case for zero + return "$number-ıncı"; + } + + static $suffixes = [ + 1 => '-inci', + 5 => '-inci', + 8 => '-inci', + 70 => '-inci', + 80 => '-inci', + 2 => '-nci', + 7 => '-nci', + 20 => '-nci', + 50 => '-nci', + 3 => '-üncü', + 4 => '-üncü', + 100 => '-üncü', + 6 => '-ncı', + 9 => '-uncu', + 10 => '-uncu', + 30 => '-uncu', + 60 => '-ıncı', + 90 => '-ıncı', + ]; + + $lastDigit = $number % 10; + + return $number.($suffixes[$lastDigit] ?? $suffixes[$number % 100 - $lastDigit] ?? $suffixes[$number >= 100 ? 100 : -1] ?? ''); + }, + 'meridiem' => function ($hour) { + if ($hour < 4) { + return 'gecə'; + } + if ($hour < 12) { + return 'səhər'; + } + if ($hour < 17) { + return 'gündüz'; + } + + return 'axşam'; + }, + 'months' => ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avqust', 'sentyabr', 'oktyabr', 'noyabr', 'dekabr'], + 'months_short' => ['yan', 'fev', 'mar', 'apr', 'may', 'iyn', 'iyl', 'avq', 'sen', 'okt', 'noy', 'dek'], + 'months_standalone' => ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'May', 'İyun', 'İyul', 'Avqust', 'Sentyabr', 'Oktyabr', 'Noyabr', 'Dekabr'], + 'weekdays' => ['bazar', 'bazar ertəsi', 'çərşənbə axşamı', 'çərşənbə', 'cümə axşamı', 'cümə', 'şənbə'], + 'weekdays_short' => ['baz', 'bze', 'çax', 'çər', 'cax', 'cüm', 'şən'], + 'weekdays_min' => ['bz', 'be', 'ça', 'çə', 'ca', 'cü', 'şə'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' və '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/az_AZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/az_AZ.php new file mode 100644 index 0000000..2acf881 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/az_AZ.php @@ -0,0 +1,21 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Pablo Saratxaga pablo@mandrakesoft.com + */ +return array_replace_recursive(require __DIR__.'/az.php', [ + 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'İyn', 'İyl', 'Avq', 'Sen', 'Okt', 'Noy', 'Dek'], + 'weekdays' => ['bazar günü', 'bazar ertəsi', 'çərşənbə axşamı', 'çərşənbə', 'cümə axşamı', 'cümə', 'şənbə'], + 'weekdays_short' => ['baz', 'ber', 'çax', 'çər', 'cax', 'cüm', 'şnb'], + 'weekdays_min' => ['baz', 'ber', 'çax', 'çər', 'cax', 'cüm', 'şnb'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php b/vendor/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php new file mode 100644 index 0000000..28fc62f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php @@ -0,0 +1,20 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/az.php', [ + 'weekdays' => ['базар', 'базар ертәси', 'чәршәнбә ахшамы', 'чәршәнбә', 'ҹүмә ахшамы', 'ҹүмә', 'шәнбә'], + 'weekdays_short' => ['Б.', 'Б.Е.', 'Ч.А.', 'Ч.', 'Ҹ.А.', 'Ҹ.', 'Ш.'], + 'weekdays_min' => ['Б.', 'Б.Е.', 'Ч.А.', 'Ч.', 'Ҹ.А.', 'Ҹ.', 'Ш.'], + 'months' => ['јанвар', 'феврал', 'март', 'апрел', 'май', 'ијун', 'ијул', 'август', 'сентјабр', 'октјабр', 'нојабр', 'декабр'], + 'months_short' => ['јан', 'фев', 'мар', 'апр', 'май', 'ијн', 'ијл', 'авг', 'сен', 'окт', 'ној', 'дек'], + 'months_standalone' => ['Јанвар', 'Феврал', 'Март', 'Апрел', 'Май', 'Ијун', 'Ијул', 'Август', 'Сентјабр', 'Октјабр', 'Нојабр', 'Декабр'], + 'meridiem' => ['а', 'п'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/az_IR.php b/vendor/nesbot/carbon/src/Carbon/Lang/az_IR.php new file mode 100644 index 0000000..991a0ef --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/az_IR.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Mousa Moradi mousamk@gmail.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'OY/OM/OD', + ], + 'months' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مئی', 'ژوئن', 'جولای', 'آقۇست', 'سپتامبر', 'اوْکتوْبر', 'نوْوامبر', 'دسامبر'], + 'months_short' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مئی', 'ژوئن', 'جولای', 'آقۇست', 'سپتامبر', 'اوْکتوْبر', 'نوْوامبر', 'دسامبر'], + 'weekdays' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چارشنبه', 'جۆمعه آخشامی', 'جۆمعه', 'شنبه'], + 'weekdays_short' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چارشنبه', 'جۆمعه آخشامی', 'جۆمعه', 'شنبه'], + 'weekdays_min' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چارشنبه', 'جۆمعه آخشامی', 'جۆمعه', 'شنبه'], + 'first_day_of_week' => 6, + 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰۴', '۰۵', '۰۶', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱۴', '۱۵', '۱۶', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲۴', '۲۵', '۲۶', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳۴', '۳۵', '۳۶', '۳۷', '۳۸', '۳۹', '۴۰', '۴۱', '۴۲', '۴۳', '۴۴', '۴۵', '۴۶', '۴۷', '۴۸', '۴۹', '۵۰', '۵۱', '۵۲', '۵۳', '۵۴', '۵۵', '۵۶', '۵۷', '۵۸', '۵۹', '۶۰', '۶۱', '۶۲', '۶۳', '۶۴', '۶۵', '۶۶', '۶۷', '۶۸', '۶۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷۴', '۷۵', '۷۶', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸۴', '۸۵', '۸۶', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹۴', '۹۵', '۹۶', '۹۷', '۹۸', '۹۹'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/az_Latn.php b/vendor/nesbot/carbon/src/Carbon/Lang/az_Latn.php new file mode 100644 index 0000000..0be3391 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/az_Latn.php @@ -0,0 +1,29 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/az.php', [ + 'meridiem' => ['a', 'p'], + 'weekdays' => ['bazar', 'bazar ertəsi', 'çərşənbə axşamı', 'çərşənbə', 'cümə axşamı', 'cümə', 'şənbə'], + 'weekdays_short' => ['B.', 'B.E.', 'Ç.A.', 'Ç.', 'C.A.', 'C.', 'Ş.'], + 'weekdays_min' => ['B.', 'B.E.', 'Ç.A.', 'Ç.', 'C.A.', 'C.', 'Ş.'], + 'months' => ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avqust', 'sentyabr', 'oktyabr', 'noyabr', 'dekabr'], + 'months_short' => ['yan', 'fev', 'mar', 'apr', 'may', 'iyn', 'iyl', 'avq', 'sen', 'okt', 'noy', 'dek'], + 'months_standalone' => ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'May', 'İyun', 'İyul', 'Avqust', 'Sentyabr', 'Oktyabr', 'Noyabr', 'Dekabr'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'D MMMM YYYY, dddd HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bas.php b/vendor/nesbot/carbon/src/Carbon/Lang/bas.php new file mode 100644 index 0000000..41bfa1d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bas.php @@ -0,0 +1,32 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['I bikɛ̂glà', 'I ɓugajɔp'], + 'weekdays' => ['ŋgwà nɔ̂y', 'ŋgwà njaŋgumba', 'ŋgwà ûm', 'ŋgwà ŋgê', 'ŋgwà mbɔk', 'ŋgwà kɔɔ', 'ŋgwà jôn'], + 'weekdays_short' => ['nɔy', 'nja', 'uum', 'ŋge', 'mbɔ', 'kɔɔ', 'jon'], + 'weekdays_min' => ['nɔy', 'nja', 'uum', 'ŋge', 'mbɔ', 'kɔɔ', 'jon'], + 'months' => ['Kɔndɔŋ', 'Màcɛ̂l', 'Màtùmb', 'Màtop', 'M̀puyɛ', 'Hìlòndɛ̀', 'Njèbà', 'Hìkaŋ', 'Dìpɔ̀s', 'Bìòôm', 'Màyɛsèp', 'Lìbuy li ńyèe'], + 'months_short' => ['kɔn', 'mac', 'mat', 'mto', 'mpu', 'hil', 'nje', 'hik', 'dip', 'bio', 'may', 'liɓ'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM, YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + + 'second' => ':count móndî', // less reliable + 's' => ':count móndî', // less reliable + 'a_second' => ':count móndî', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/be.php b/vendor/nesbot/carbon/src/Carbon/Lang/be.php new file mode 100644 index 0000000..51b4d0c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/be.php @@ -0,0 +1,173 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +// @codeCoverageIgnoreStart + +use Carbon\CarbonInterface; +use Symfony\Component\Translation\PluralizationRules; + +if (class_exists('Symfony\\Component\\Translation\\PluralizationRules')) { + PluralizationRules::set(function ($number) { + return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); + }, 'be'); +} +// @codeCoverageIgnoreEnd + +/* + * Authors: + * - Josh Soref + * - SobakaSlava + * - François B + * - Serhan Apaydın + * - JD Isaacks + * - AbadonnaAbbys + * - Siomkin Alexander + */ +return [ + 'year' => ':count год|:count гады|:count гадоў', + 'a_year' => '{1}год|:count год|:count гады|:count гадоў', + 'y' => ':count год|:count гады|:count гадоў', + 'month' => ':count месяц|:count месяцы|:count месяцаў', + 'a_month' => '{1}месяц|:count месяц|:count месяцы|:count месяцаў', + 'm' => ':count месяц|:count месяцы|:count месяцаў', + 'week' => ':count тыдзень|:count тыдні|:count тыдняў', + 'a_week' => '{1}тыдзень|:count тыдзень|:count тыдні|:count тыдняў', + 'w' => ':count тыдзень|:count тыдні|:count тыдняў', + 'day' => ':count дзень|:count дні|:count дзён', + 'a_day' => '{1}дзень|:count дзень|:count дні|:count дзён', + 'd' => ':count дн', + 'hour' => ':count гадзіну|:count гадзіны|:count гадзін', + 'a_hour' => '{1}гадзіна|:count гадзіна|:count гадзіны|:count гадзін', + 'h' => ':count гадзіна|:count гадзіны|:count гадзін', + 'minute' => ':count хвіліна|:count хвіліны|:count хвілін', + 'a_minute' => '{1}хвіліна|:count хвіліна|:count хвіліны|:count хвілін', + 'min' => ':count хв', + 'second' => ':count секунда|:count секунды|:count секунд', + 'a_second' => '{1}некалькі секунд|:count секунда|:count секунды|:count секунд', + 's' => ':count сек', + + 'hour_ago' => ':count гадзіну|:count гадзіны|:count гадзін', + 'a_hour_ago' => '{1}гадзіну|:count гадзіну|:count гадзіны|:count гадзін', + 'h_ago' => ':count гадзіну|:count гадзіны|:count гадзін', + 'minute_ago' => ':count хвіліну|:count хвіліны|:count хвілін', + 'a_minute_ago' => '{1}хвіліну|:count хвіліну|:count хвіліны|:count хвілін', + 'min_ago' => ':count хвіліну|:count хвіліны|:count хвілін', + 'second_ago' => ':count секунду|:count секунды|:count секунд', + 'a_second_ago' => '{1}некалькі секунд|:count секунду|:count секунды|:count секунд', + 's_ago' => ':count секунду|:count секунды|:count секунд', + + 'hour_from_now' => ':count гадзіну|:count гадзіны|:count гадзін', + 'a_hour_from_now' => '{1}гадзіну|:count гадзіну|:count гадзіны|:count гадзін', + 'h_from_now' => ':count гадзіну|:count гадзіны|:count гадзін', + 'minute_from_now' => ':count хвіліну|:count хвіліны|:count хвілін', + 'a_minute_from_now' => '{1}хвіліну|:count хвіліну|:count хвіліны|:count хвілін', + 'min_from_now' => ':count хвіліну|:count хвіліны|:count хвілін', + 'second_from_now' => ':count секунду|:count секунды|:count секунд', + 'a_second_from_now' => '{1}некалькі секунд|:count секунду|:count секунды|:count секунд', + 's_from_now' => ':count секунду|:count секунды|:count секунд', + + 'hour_after' => ':count гадзіну|:count гадзіны|:count гадзін', + 'a_hour_after' => '{1}гадзіну|:count гадзіну|:count гадзіны|:count гадзін', + 'h_after' => ':count гадзіну|:count гадзіны|:count гадзін', + 'minute_after' => ':count хвіліну|:count хвіліны|:count хвілін', + 'a_minute_after' => '{1}хвіліну|:count хвіліну|:count хвіліны|:count хвілін', + 'min_after' => ':count хвіліну|:count хвіліны|:count хвілін', + 'second_after' => ':count секунду|:count секунды|:count секунд', + 'a_second_after' => '{1}некалькі секунд|:count секунду|:count секунды|:count секунд', + 's_after' => ':count секунду|:count секунды|:count секунд', + + 'hour_before' => ':count гадзіну|:count гадзіны|:count гадзін', + 'a_hour_before' => '{1}гадзіну|:count гадзіну|:count гадзіны|:count гадзін', + 'h_before' => ':count гадзіну|:count гадзіны|:count гадзін', + 'minute_before' => ':count хвіліну|:count хвіліны|:count хвілін', + 'a_minute_before' => '{1}хвіліну|:count хвіліну|:count хвіліны|:count хвілін', + 'min_before' => ':count хвіліну|:count хвіліны|:count хвілін', + 'second_before' => ':count секунду|:count секунды|:count секунд', + 'a_second_before' => '{1}некалькі секунд|:count секунду|:count секунды|:count секунд', + 's_before' => ':count секунду|:count секунды|:count секунд', + + 'ago' => ':time таму', + 'from_now' => 'праз :time', + 'after' => ':time пасля', + 'before' => ':time да', + 'diff_now' => 'цяпер', + 'diff_today' => 'Сёння', + 'diff_today_regexp' => 'Сёння(?:\\s+ў)?', + 'diff_yesterday' => 'учора', + 'diff_yesterday_regexp' => 'Учора(?:\\s+ў)?', + 'diff_tomorrow' => 'заўтра', + 'diff_tomorrow_regexp' => 'Заўтра(?:\\s+ў)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D MMMM YYYY г.', + 'LLL' => 'D MMMM YYYY г., HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY г., HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Сёння ў] LT', + 'nextDay' => '[Заўтра ў] LT', + 'nextWeek' => '[У] dddd [ў] LT', + 'lastDay' => '[Учора ў] LT', + 'lastWeek' => function (CarbonInterface $current) { + switch ($current->dayOfWeek) { + case 1: + case 2: + case 4: + return '[У мінулы] dddd [ў] LT'; + default: + return '[У мінулую] dddd [ў] LT'; + } + }, + 'sameElse' => 'L', + ], + 'ordinal' => function ($number, $period) { + switch ($period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return ($number % 10 === 2 || $number % 10 === 3) && ($number % 100 !== 12 && $number % 100 !== 13) ? $number.'-і' : $number.'-ы'; + case 'D': + return $number.'-га'; + default: + return $number; + } + }, + 'meridiem' => function ($hour) { + if ($hour < 4) { + return 'ночы'; + } + if ($hour < 12) { + return 'раніцы'; + } + if ($hour < 17) { + return 'дня'; + } + + return 'вечара'; + }, + 'months' => ['студзеня', 'лютага', 'сакавіка', 'красавіка', 'траўня', 'чэрвеня', 'ліпеня', 'жніўня', 'верасня', 'кастрычніка', 'лістапада', 'снежня'], + 'months_standalone' => ['студзень', 'люты', 'сакавік', 'красавік', 'травень', 'чэрвень', 'ліпень', 'жнівень', 'верасень', 'кастрычнік', 'лістапад', 'снежань'], + 'months_short' => ['студ', 'лют', 'сак', 'крас', 'трав', 'чэрв', 'ліп', 'жнів', 'вер', 'каст', 'ліст', 'снеж'], + 'months_regexp' => '/(DD?o?\.?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', + 'weekdays' => ['нядзелю', 'панядзелак', 'аўторак', 'сераду', 'чацвер', 'пятніцу', 'суботу'], + 'weekdays_standalone' => ['нядзеля', 'панядзелак', 'аўторак', 'серада', 'чацвер', 'пятніца', 'субота'], + 'weekdays_short' => ['нд', 'пн', 'ат', 'ср', 'чц', 'пт', 'сб'], + 'weekdays_min' => ['нд', 'пн', 'ат', 'ср', 'чц', 'пт', 'сб'], + 'weekdays_regexp' => '/\[ ?[Ууў] ?(?:мінулую|наступную)? ?\] ?dddd/', + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' і '], + 'months_short_standalone' => ['сту', 'лют', 'сак', 'кра', 'май', 'чэр', 'ліп', 'жні', 'вер', 'кас', 'ліс', 'сне'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/be_BY.php b/vendor/nesbot/carbon/src/Carbon/Lang/be_BY.php new file mode 100644 index 0000000..26684b4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/be_BY.php @@ -0,0 +1,22 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/be.php', [ + 'months' => ['студзеня', 'лютага', 'сакавіка', 'красавіка', 'мая', 'чэрвеня', 'ліпеня', 'жніўня', 'верасня', 'кастрычніка', 'лістапада', 'снежня'], + 'months_short' => ['сту', 'лют', 'сак', 'кра', 'мая', 'чэр', 'ліп', 'жні', 'вер', 'кас', 'ліс', 'сне'], + 'weekdays' => ['Нядзеля', 'Панядзелак', 'Аўторак', 'Серада', 'Чацвер', 'Пятніца', 'Субота'], + 'weekdays_short' => ['Няд', 'Пан', 'Аўт', 'Срд', 'Чцв', 'Пят', 'Суб'], + 'weekdays_min' => ['Няд', 'Пан', 'Аўт', 'Срд', 'Чцв', 'Пят', 'Суб'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php b/vendor/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php new file mode 100644 index 0000000..517ce83 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], + 'months' => ['studzienia', 'lutaha', 'sakavika', 'krasavika', 'maja', 'červienia', 'lipienia', 'žniŭnia', 'vieraśnia', 'kastryčnika', 'listapada', 'śniežnia'], + 'months_short' => ['Stu', 'Lut', 'Sak', 'Kra', 'Maj', 'Čer', 'Lip', 'Žni', 'Vie', 'Kas', 'Lis', 'Śni'], + 'weekdays' => ['Niadziela', 'Paniadziełak', 'Aŭtorak', 'Sierada', 'Čaćvier', 'Piatnica', 'Subota'], + 'weekdays_short' => ['Nia', 'Pan', 'Aŭt', 'Sie', 'Čać', 'Pia', 'Sub'], + 'weekdays_min' => ['Nia', 'Pan', 'Aŭt', 'Sie', 'Čać', 'Pia', 'Sub'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bem.php b/vendor/nesbot/carbon/src/Carbon/Lang/bem.php new file mode 100644 index 0000000..1c3ef03 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bem.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/bem_ZM.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bem_ZM.php b/vendor/nesbot/carbon/src/Carbon/Lang/bem_ZM.php new file mode 100644 index 0000000..620b579 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bem_ZM.php @@ -0,0 +1,56 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - ANLoc Martin Benjamin locales@africanlocalization.net + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'MM/DD/YYYY', + ], + 'months' => ['Januari', 'Februari', 'Machi', 'Epreo', 'Mei', 'Juni', 'Julai', 'Ogasti', 'Septemba', 'Oktoba', 'Novemba', 'Disemba'], + 'months_short' => ['Jan', 'Feb', 'Mac', 'Epr', 'Mei', 'Jun', 'Jul', 'Oga', 'Sep', 'Okt', 'Nov', 'Dis'], + 'weekdays' => ['Pa Mulungu', 'Palichimo', 'Palichibuli', 'Palichitatu', 'Palichine', 'Palichisano', 'Pachibelushi'], + 'weekdays_short' => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + 'weekdays_min' => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['uluchelo', 'akasuba'], + + 'year' => 'myaka :count', + 'y' => 'myaka :count', + 'a_year' => 'myaka :count', + + 'month' => 'myeshi :count', + 'm' => 'myeshi :count', + 'a_month' => 'myeshi :count', + + 'week' => 'umulungu :count', + 'w' => 'umulungu :count', + 'a_week' => 'umulungu :count', + + 'day' => 'inshiku :count', + 'd' => 'inshiku :count', + 'a_day' => 'inshiku :count', + + 'hour' => 'awala :count', + 'h' => 'awala :count', + 'a_hour' => 'awala :count', + + 'minute' => 'miniti :count', + 'min' => 'miniti :count', + 'a_minute' => 'miniti :count', + + 'second' => 'sekondi :count', + 's' => 'sekondi :count', + 'a_second' => 'sekondi :count', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ber.php b/vendor/nesbot/carbon/src/Carbon/Lang/ber.php new file mode 100644 index 0000000..685603c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ber.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/ber_DZ.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ber_DZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/ber_DZ.php new file mode 100644 index 0000000..38de10a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ber_DZ.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Pablo Saratxaga pablo@mandrakesoft.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], + 'months' => ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avqust', 'sentyabr', 'oktyabr', 'noyabr', 'dekabr'], + 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'İyn', 'İyl', 'Avq', 'Sen', 'Okt', 'Noy', 'Dek'], + 'weekdays' => ['bazar günü', 'birinci gün', 'ikinci gün', 'üçüncü gün', 'dördüncü gün', 'beşinci gün', 'altıncı gün'], + 'weekdays_short' => ['baz', 'bir', 'iki', 'üçü', 'dör', 'beş', 'alt'], + 'weekdays_min' => ['baz', 'bir', 'iki', 'üçü', 'dör', 'beş', 'alt'], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ber_MA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ber_MA.php new file mode 100644 index 0000000..38de10a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ber_MA.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Pablo Saratxaga pablo@mandrakesoft.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], + 'months' => ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avqust', 'sentyabr', 'oktyabr', 'noyabr', 'dekabr'], + 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'İyn', 'İyl', 'Avq', 'Sen', 'Okt', 'Noy', 'Dek'], + 'weekdays' => ['bazar günü', 'birinci gün', 'ikinci gün', 'üçüncü gün', 'dördüncü gün', 'beşinci gün', 'altıncı gün'], + 'weekdays_short' => ['baz', 'bir', 'iki', 'üçü', 'dör', 'beş', 'alt'], + 'weekdays_min' => ['baz', 'bir', 'iki', 'üçü', 'dör', 'beş', 'alt'], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bez.php b/vendor/nesbot/carbon/src/Carbon/Lang/bez.php new file mode 100644 index 0000000..d59c5ef --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bez.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['pamilau', 'pamunyi'], + 'weekdays' => ['pa mulungu', 'pa shahuviluha', 'pa hivili', 'pa hidatu', 'pa hitayi', 'pa hihanu', 'pa shahulembela'], + 'weekdays_short' => ['Mul', 'Vil', 'Hiv', 'Hid', 'Hit', 'Hih', 'Lem'], + 'weekdays_min' => ['Mul', 'Vil', 'Hiv', 'Hid', 'Hit', 'Hih', 'Lem'], + 'months' => ['pa mwedzi gwa hutala', 'pa mwedzi gwa wuvili', 'pa mwedzi gwa wudatu', 'pa mwedzi gwa wutai', 'pa mwedzi gwa wuhanu', 'pa mwedzi gwa sita', 'pa mwedzi gwa saba', 'pa mwedzi gwa nane', 'pa mwedzi gwa tisa', 'pa mwedzi gwa kumi', 'pa mwedzi gwa kumi na moja', 'pa mwedzi gwa kumi na mbili'], + 'months_short' => ['Hut', 'Vil', 'Dat', 'Tai', 'Han', 'Sit', 'Sab', 'Nan', 'Tis', 'Kum', 'Kmj', 'Kmb'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bg.php b/vendor/nesbot/carbon/src/Carbon/Lang/bg.php new file mode 100644 index 0000000..f768074 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bg.php @@ -0,0 +1,114 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - François B + * - Serhan Apaydın + * - JD Isaacks + * - Glavić + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => ':count година|:count години', + 'a_year' => 'година|:count години', + 'y' => ':count година|:count години', + 'month' => ':count месец|:count месеца', + 'a_month' => 'месец|:count месеца', + 'm' => ':count месец|:count месеца', + 'week' => ':count седмица|:count седмици', + 'a_week' => 'седмица|:count седмици', + 'w' => ':count седмица|:count седмици', + 'day' => ':count ден|:count дни', + 'a_day' => 'ден|:count дни', + 'd' => ':count ден|:count дни', + 'hour' => ':count час|:count часа', + 'a_hour' => 'час|:count часа', + 'h' => ':count час|:count часа', + 'minute' => ':count минута|:count минути', + 'a_minute' => 'минута|:count минути', + 'min' => ':count минута|:count минути', + 'second' => ':count секунда|:count секунди', + 'a_second' => 'няколко секунди|:count секунди', + 's' => ':count секунда|:count секунди', + 'ago' => 'преди :time', + 'from_now' => 'след :time', + 'after' => 'след :time', + 'before' => 'преди :time', + 'diff_now' => 'сега', + 'diff_today' => 'Днес', + 'diff_today_regexp' => 'Днес(?:\\s+в)?', + 'diff_yesterday' => 'вчера', + 'diff_yesterday_regexp' => 'Вчера(?:\\s+в)?', + 'diff_tomorrow' => 'утре', + 'diff_tomorrow_regexp' => 'Утре(?:\\s+в)?', + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'D.MM.YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY H:mm', + 'LLLL' => 'dddd, D MMMM YYYY H:mm', + ], + 'calendar' => [ + 'sameDay' => '[Днес в] LT', + 'nextDay' => '[Утре в] LT', + 'nextWeek' => 'dddd [в] LT', + 'lastDay' => '[Вчера в] LT', + 'lastWeek' => function (CarbonInterface $current) { + switch ($current->dayOfWeek) { + case 0: + case 3: + case 6: + return '[В изминалата] dddd [в] LT'; + default: + return '[В изминалия] dddd [в] LT'; + } + }, + 'sameElse' => 'L', + ], + 'ordinal' => function ($number) { + $lastDigit = $number % 10; + $last2Digits = $number % 100; + if ($number === 0) { + return "$number-ев"; + } + if ($last2Digits === 0) { + return "$number-ен"; + } + if ($last2Digits > 10 && $last2Digits < 20) { + return "$number-ти"; + } + if ($lastDigit === 1) { + return "$number-ви"; + } + if ($lastDigit === 2) { + return "$number-ри"; + } + if ($lastDigit === 7 || $lastDigit === 8) { + return "$number-ми"; + } + + return "$number-ти"; + }, + 'months' => ['януари', 'февруари', 'март', 'април', 'май', 'юни', 'юли', 'август', 'септември', 'октомври', 'ноември', 'декември'], + 'months_short' => ['яну', 'фев', 'мар', 'апр', 'май', 'юни', 'юли', 'авг', 'сеп', 'окт', 'ное', 'дек'], + 'weekdays' => ['неделя', 'понеделник', 'вторник', 'сряда', 'четвъртък', 'петък', 'събота'], + 'weekdays_short' => ['нед', 'пон', 'вто', 'сря', 'чет', 'пет', 'съб'], + 'weekdays_min' => ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' и '], + 'meridiem' => ['преди обяд', 'следобед'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bg_BG.php b/vendor/nesbot/carbon/src/Carbon/Lang/bg_BG.php new file mode 100644 index 0000000..b53874d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bg_BG.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/bg.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bhb.php b/vendor/nesbot/carbon/src/Carbon/Lang/bhb.php new file mode 100644 index 0000000..49f0803 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bhb.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/bhb_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bhb_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/bhb_IN.php new file mode 100644 index 0000000..ab557cb --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bhb_IN.php @@ -0,0 +1,26 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Samsung Electronics Co., Ltd. alexey.merzlyakov@samsung.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + 'weekdays' => ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + 'weekdays_short' => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + 'weekdays_min' => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bho.php b/vendor/nesbot/carbon/src/Carbon/Lang/bho.php new file mode 100644 index 0000000..e9ed0b6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bho.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/bho_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bho_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/bho_IN.php new file mode 100644 index 0000000..bc54f36 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bho_IN.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - bhashaghar@googlegroups.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर"'], + 'months_short' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर"'], + 'weekdays' => ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'], + 'weekdays_short' => ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'], + 'weekdays_min' => ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], + + 'hour' => ':count मौसम', + 'h' => ':count मौसम', + 'a_hour' => ':count मौसम', + + 'minute' => ':count कला', + 'min' => ':count कला', + 'a_minute' => ':count कला', + + 'second' => ':count सोमार', + 's' => ':count सोमार', + 'a_second' => ':count सोमार', + + 'year' => ':count साल', + 'y' => ':count साल', + 'a_year' => ':count साल', + + 'month' => ':count महिना', + 'm' => ':count महिना', + 'a_month' => ':count महिना', + + 'week' => ':count सप्ताह', + 'w' => ':count सप्ताह', + 'a_week' => ':count सप्ताह', + + 'day' => ':count दिन', + 'd' => ':count दिन', + 'a_day' => ':count दिन', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bi.php b/vendor/nesbot/carbon/src/Carbon/Lang/bi.php new file mode 100644 index 0000000..dd08128 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bi.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/bi_VU.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bi_VU.php b/vendor/nesbot/carbon/src/Carbon/Lang/bi_VU.php new file mode 100644 index 0000000..1fe7770 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bi_VU.php @@ -0,0 +1,53 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Samsung Electronics Co., Ltd. akhilesh.k@samsung.com & maninder1.s@samsung.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'dddd DD MMM YYYY', + ], + 'months' => ['jenuware', 'febwari', 'maj', 'epril', 'mei', 'jun', 'julae', 'ogis', 'septemba', 'oktoba', 'novemba', 'disemba'], + 'months_short' => ['jen', 'feb', 'maj', 'epr', 'mei', 'jun', 'jul', 'ogi', 'sep', 'okt', 'nov', 'dis'], + 'weekdays' => ['sande', 'mande', 'maj', 'wota', 'fraede', 'sarede'], + 'weekdays_short' => ['san', 'man', 'maj', 'wot', 'fra', 'sar'], + 'weekdays_min' => ['san', 'man', 'maj', 'wot', 'fra', 'sar'], + + 'year' => ':count seven', // less reliable + 'y' => ':count seven', // less reliable + 'a_year' => ':count seven', // less reliable + + 'month' => ':count mi', // less reliable + 'm' => ':count mi', // less reliable + 'a_month' => ':count mi', // less reliable + + 'week' => ':count sarede', // less reliable + 'w' => ':count sarede', // less reliable + 'a_week' => ':count sarede', // less reliable + + 'day' => ':count betde', // less reliable + 'd' => ':count betde', // less reliable + 'a_day' => ':count betde', // less reliable + + 'hour' => ':count klok', // less reliable + 'h' => ':count klok', // less reliable + 'a_hour' => ':count klok', // less reliable + + 'minute' => ':count smol', // less reliable + 'min' => ':count smol', // less reliable + 'a_minute' => ':count smol', // less reliable + + 'second' => ':count tu', // less reliable + 's' => ':count tu', // less reliable + 'a_second' => ':count tu', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bm.php b/vendor/nesbot/carbon/src/Carbon/Lang/bm.php new file mode 100644 index 0000000..92822d2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bm.php @@ -0,0 +1,70 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Estelle Comment + */ +return [ + 'year' => 'san :count', + 'a_year' => '{1}san kelen|san :count', + 'y' => 'san :count', + 'month' => 'kalo :count', + 'a_month' => '{1}kalo kelen|kalo :count', + 'm' => 'k. :count', + 'week' => 'dɔgɔkun :count', + 'a_week' => 'dɔgɔkun kelen', + 'w' => 'd. :count', + 'day' => 'tile :count', + 'd' => 't. :count', + 'a_day' => '{1}tile kelen|tile :count', + 'hour' => 'lɛrɛ :count', + 'a_hour' => '{1}lɛrɛ kelen|lɛrɛ :count', + 'h' => 'l. :count', + 'minute' => 'miniti :count', + 'a_minute' => '{1}miniti kelen|miniti :count', + 'min' => 'm. :count', + 'second' => 'sekondi :count', + 'a_second' => '{1}sanga dama dama|sekondi :count', + 's' => 'sek. :count', + 'ago' => 'a bɛ :time bɔ', + 'from_now' => ':time kɔnɔ', + 'diff_today' => 'Bi', + 'diff_yesterday' => 'Kunu', + 'diff_yesterday_regexp' => 'Kunu(?:\\s+lɛrɛ)?', + 'diff_tomorrow' => 'Sini', + 'diff_tomorrow_regexp' => 'Sini(?:\\s+lɛrɛ)?', + 'diff_today_regexp' => 'Bi(?:\\s+lɛrɛ)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'MMMM [tile] D [san] YYYY', + 'LLL' => 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm', + 'LLLL' => 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Bi lɛrɛ] LT', + 'nextDay' => '[Sini lɛrɛ] LT', + 'nextWeek' => 'dddd [don lɛrɛ] LT', + 'lastDay' => '[Kunu lɛrɛ] LT', + 'lastWeek' => 'dddd [tɛmɛnen lɛrɛ] LT', + 'sameElse' => 'L', + ], + 'months' => ['Zanwuyekalo', 'Fewuruyekalo', 'Marisikalo', 'Awirilikalo', 'Mɛkalo', 'Zuwɛnkalo', 'Zuluyekalo', 'Utikalo', 'Sɛtanburukalo', 'ɔkutɔburukalo', 'Nowanburukalo', 'Desanburukalo'], + 'months_short' => ['Zan', 'Few', 'Mar', 'Awi', 'Mɛ', 'Zuw', 'Zul', 'Uti', 'Sɛt', 'ɔku', 'Now', 'Des'], + 'weekdays' => ['Kari', 'Ntɛnɛn', 'Tarata', 'Araba', 'Alamisa', 'Juma', 'Sibiri'], + 'weekdays_short' => ['Kar', 'Ntɛ', 'Tar', 'Ara', 'Ala', 'Jum', 'Sib'], + 'weekdays_min' => ['Ka', 'Nt', 'Ta', 'Ar', 'Al', 'Ju', 'Si'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' ni '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bn.php b/vendor/nesbot/carbon/src/Carbon/Lang/bn.php new file mode 100644 index 0000000..8e14789 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bn.php @@ -0,0 +1,100 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - Shakib Hossain + * - Raju + * - Aniruddha Adhikary + * - JD Isaacks + * - Saiful Islam + * - Faisal Islam + */ +return [ + 'year' => ':count বছর', + 'a_year' => 'এক বছর|:count বছর', + 'y' => '১ বছর|:count বছর', + 'month' => ':count মাস', + 'a_month' => 'এক মাস|:count মাস', + 'm' => '১ মাস|:count মাস', + 'week' => ':count সপ্তাহ', + 'a_week' => '১ সপ্তাহ|:count সপ্তাহ', + 'w' => '১ সপ্তাহ|:count সপ্তাহ', + 'day' => ':count দিন', + 'a_day' => 'এক দিন|:count দিন', + 'd' => '১ দিন|:count দিন', + 'hour' => ':count ঘন্টা', + 'a_hour' => 'এক ঘন্টা|:count ঘন্টা', + 'h' => '১ ঘন্টা|:count ঘন্টা', + 'minute' => ':count মিনিট', + 'a_minute' => 'এক মিনিট|:count মিনিট', + 'min' => '১ মিনিট|:count মিনিট', + 'second' => ':count সেকেন্ড', + 'a_second' => 'কয়েক সেকেন্ড|:count সেকেন্ড', + 's' => '১ সেকেন্ড|:count সেকেন্ড', + 'ago' => ':time আগে', + 'from_now' => ':time পরে', + 'after' => ':time পরে', + 'before' => ':time আগে', + 'diff_now' => 'এখন', + 'diff_today' => 'আজ', + 'diff_yesterday' => 'গতকাল', + 'diff_tomorrow' => 'আগামীকাল', + 'period_recurrences' => ':count বার|:count বার', + 'period_interval' => 'প্রতি :interval', + 'period_start_date' => ':date থেকে', + 'period_end_date' => ':date পর্যন্ত', + 'formats' => [ + 'LT' => 'A Oh:Om সময়', + 'LTS' => 'A Oh:Om:Os সময়', + 'L' => 'OD/OM/OY', + 'LL' => 'OD MMMM OY', + 'LLL' => 'OD MMMM OY, A Oh:Om সময়', + 'LLLL' => 'dddd, OD MMMM OY, A Oh:Om সময়', + ], + 'calendar' => [ + 'sameDay' => '[আজ] LT', + 'nextDay' => '[আগামীকাল] LT', + 'nextWeek' => 'dddd, LT', + 'lastDay' => '[গতকাল] LT', + 'lastWeek' => '[গত] dddd, LT', + 'sameElse' => 'L', + ], + 'meridiem' => function ($hour) { + if ($hour < 4) { + return 'রাত'; + } + if ($hour < 10) { + return 'সকাল'; + } + if ($hour < 17) { + return 'দুপুর'; + } + if ($hour < 20) { + return 'বিকাল'; + } + + return 'রাত'; + }, + 'months' => ['জানুয়ারী', 'ফেব্রুয়ারি', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], + 'months_short' => ['জানু', 'ফেব', 'মার্চ', 'এপ্র', 'মে', 'জুন', 'জুল', 'আগ', 'সেপ্ট', 'অক্টো', 'নভে', 'ডিসে'], + 'weekdays' => ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'], + 'weekdays_short' => ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'], + 'weekdays_min' => ['রবি', 'সোম', 'মঙ্গ', 'বুধ', 'বৃহঃ', 'শুক্র', 'শনি'], + 'list' => [', ', ' এবং '], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, + 'weekdays_standalone' => ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহষ্পতিবার', 'শুক্রবার', 'শনিবার'], + 'weekdays_min_standalone' => ['রঃ', 'সোঃ', 'মঃ', 'বুঃ', 'বৃঃ', 'শুঃ', 'শনি'], + 'months_short_standalone' => ['জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], + 'alt_numbers' => ['০', '১', '২', '৩', '৪', '৫', '৬', '৭', '৮', '৯'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bn_BD.php b/vendor/nesbot/carbon/src/Carbon/Lang/bn_BD.php new file mode 100644 index 0000000..b5b28dd --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bn_BD.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ankur Group, Taneem Ahmed, Jamil Ahmed + */ +return array_replace_recursive(require __DIR__.'/bn.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], + 'months_short' => ['জানু', 'ফেব', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], + 'weekdays' => ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'], + 'weekdays_short' => ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহঃ', 'শুক্র', 'শনি'], + 'weekdays_min' => ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহঃ', 'শুক্র', 'শনি'], + 'first_day_of_week' => 5, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bn_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/bn_IN.php new file mode 100644 index 0000000..8b3a50e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bn_IN.php @@ -0,0 +1,26 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/bn.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], + 'months_short' => ['জানু', 'ফেব', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'], + 'weekdays' => ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'], + 'weekdays_short' => ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'], + 'weekdays_min' => ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'], + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bo.php b/vendor/nesbot/carbon/src/Carbon/Lang/bo.php new file mode 100644 index 0000000..99e1bf4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bo.php @@ -0,0 +1,71 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - JD Isaacks + */ +return [ + 'year' => '{1}ལོ་གཅིག|]1,Inf[:count ལོ', + 'month' => '{1}ཟླ་བ་གཅིག|]1,Inf[:count ཟླ་བ', + 'week' => ':count བདུན་ཕྲག', + 'day' => '{1}ཉིན་གཅིག|]1,Inf[:count ཉིན་', + 'hour' => '{1}ཆུ་ཚོད་གཅིག|]1,Inf[:count ཆུ་ཚོད', + 'minute' => '{1}སྐར་མ་གཅིག|]1,Inf[:count སྐར་མ', + 'second' => '{1}ལམ་སང|]1,Inf[:count སྐར་ཆ།', + 'ago' => ':time སྔན་ལ', + 'from_now' => ':time ལ་', + 'diff_yesterday' => 'ཁ་སང', + 'diff_today' => 'དི་རིང', + 'diff_tomorrow' => 'སང་ཉིན', + 'formats' => [ + 'LT' => 'A h:mm', + 'LTS' => 'A h:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY, A h:mm', + 'LLLL' => 'dddd, D MMMM YYYY, A h:mm', + ], + 'calendar' => [ + 'sameDay' => '[དི་རིང] LT', + 'nextDay' => '[སང་ཉིན] LT', + 'nextWeek' => '[བདུན་ཕྲག་རྗེས་མ], LT', + 'lastDay' => '[ཁ་སང] LT', + 'lastWeek' => '[བདུན་ཕྲག་མཐའ་མ] dddd, LT', + 'sameElse' => 'L', + ], + 'meridiem' => function ($hour) { + if ($hour < 4) { + return 'མཚན་མོ'; + } + if ($hour < 10) { + return 'ཞོགས་ཀས'; + } + if ($hour < 17) { + return 'ཉིན་གུང'; + } + if ($hour < 20) { + return 'དགོང་དག'; + } + + return 'མཚན་མོ'; + }, + 'months' => ['ཟླ་བ་དང་པོ', 'ཟླ་བ་གཉིས་པ', 'ཟླ་བ་གསུམ་པ', 'ཟླ་བ་བཞི་པ', 'ཟླ་བ་ལྔ་པ', 'ཟླ་བ་དྲུག་པ', 'ཟླ་བ་བདུན་པ', 'ཟླ་བ་བརྒྱད་པ', 'ཟླ་བ་དགུ་པ', 'ཟླ་བ་བཅུ་པ', 'ཟླ་བ་བཅུ་གཅིག་པ', 'ཟླ་བ་བཅུ་གཉིས་པ'], + 'months_short' => ['ཟླ་བ་དང་པོ', 'ཟླ་བ་གཉིས་པ', 'ཟླ་བ་གསུམ་པ', 'ཟླ་བ་བཞི་པ', 'ཟླ་བ་ལྔ་པ', 'ཟླ་བ་དྲུག་པ', 'ཟླ་བ་བདུན་པ', 'ཟླ་བ་བརྒྱད་པ', 'ཟླ་བ་དགུ་པ', 'ཟླ་བ་བཅུ་པ', 'ཟླ་བ་བཅུ་གཅིག་པ', 'ཟླ་བ་བཅུ་གཉིས་པ'], + 'weekdays' => ['གཟའ་ཉི་མ་', 'གཟའ་ཟླ་བ་', 'གཟའ་མིག་དམར་', 'གཟའ་ལྷག་པ་', 'གཟའ་ཕུར་བུ', 'གཟའ་པ་སངས་', 'གཟའ་སྤེན་པ་'], + 'weekdays_short' => ['ཉི་མ་', 'ཟླ་བ་', 'མིག་དམར་', 'ལྷག་པ་', 'ཕུར་བུ', 'པ་སངས་', 'སྤེན་པ་'], + 'weekdays_min' => ['ཉི་མ་', 'ཟླ་བ་', 'མིག་དམར་', 'ལྷག་པ་', 'ཕུར་བུ', 'པ་སངས་', 'སྤེན་པ་'], + 'list' => [', ', ' ཨནད་ '], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, + 'months_standalone' => ['ཟླ་བ་དང་པོ་', 'ཟླ་བ་གཉིས་པ་', 'ཟླ་བ་གསུམ་པ་', 'ཟླ་བ་བཞི་པ་', 'ཟླ་བ་ལྔ་པ་', 'ཟླ་བ་དྲུག་པ་', 'ཟླ་བ་བདུན་པ་', 'ཟླ་བ་བརྒྱད་པ་', 'ཟླ་བ་དགུ་པ་', 'ཟླ་བ་བཅུ་པ་', 'ཟླ་བ་བཅུ་གཅིག་པ་', 'ཟླ་བ་བཅུ་གཉིས་པ་'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bo_CN.php b/vendor/nesbot/carbon/src/Carbon/Lang/bo_CN.php new file mode 100644 index 0000000..380abb1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bo_CN.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/bo.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bo_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/bo_IN.php new file mode 100644 index 0000000..ca50d04 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bo_IN.php @@ -0,0 +1,29 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/bo.php', [ + 'meridiem' => ['སྔ་དྲོ་', 'ཕྱི་དྲོ་'], + 'weekdays' => ['གཟའ་ཉི་མ་', 'གཟའ་ཟླ་བ་', 'གཟའ་མིག་དམར་', 'གཟའ་ལྷག་པ་', 'གཟའ་ཕུར་བུ་', 'གཟའ་པ་སངས་', 'གཟའ་སྤེན་པ་'], + 'weekdays_short' => ['ཉི་མ་', 'ཟླ་བ་', 'མིག་དམར་', 'ལྷག་པ་', 'ཕུར་བུ་', 'པ་སངས་', 'སྤེན་པ་'], + 'weekdays_min' => ['ཉི་མ་', 'ཟླ་བ་', 'མིག་དམར་', 'ལྷག་པ་', 'ཕུར་བུ་', 'པ་སངས་', 'སྤེན་པ་'], + 'months' => ['ཟླ་བ་དང་པོ', 'ཟླ་བ་གཉིས་པ', 'ཟླ་བ་གསུམ་པ', 'ཟླ་བ་བཞི་པ', 'ཟླ་བ་ལྔ་པ', 'ཟླ་བ་དྲུག་པ', 'ཟླ་བ་བདུན་པ', 'ཟླ་བ་བརྒྱད་པ', 'ཟླ་བ་དགུ་པ', 'ཟླ་བ་བཅུ་པ', 'ཟླ་བ་བཅུ་གཅིག་པ', 'ཟླ་བ་བཅུ་གཉིས་པ'], + 'months_short' => ['ཟླ་༡', 'ཟླ་༢', 'ཟླ་༣', 'ཟླ་༤', 'ཟླ་༥', 'ཟླ་༦', 'ཟླ་༧', 'ཟླ་༨', 'ཟླ་༩', 'ཟླ་༡༠', 'ཟླ་༡༡', 'ཟླ་༡༢'], + 'months_standalone' => ['ཟླ་བ་དང་པོ་', 'ཟླ་བ་གཉིས་པ་', 'ཟླ་བ་གསུམ་པ་', 'ཟླ་བ་བཞི་པ་', 'ཟླ་བ་ལྔ་པ་', 'ཟླ་བ་དྲུག་པ་', 'ཟླ་བ་བདུན་པ་', 'ཟླ་བ་བརྒྱད་པ་', 'ཟླ་བ་དགུ་པ་', 'ཟླ་བ་བཅུ་པ་', 'ཟླ་བ་བཅུ་གཅིག་པ་', 'ཟླ་བ་བཅུ་གཉིས་པ་'], + 'weekend' => [0, 0], + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'YYYY-MM-DD', + 'LL' => 'YYYY ལོའི་MMMཚེས་D', + 'LLL' => 'སྤྱི་ལོ་YYYY MMMMའི་ཚེས་D h:mm a', + 'LLLL' => 'YYYY MMMMའི་ཚེས་D, dddd h:mm a', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/br.php b/vendor/nesbot/carbon/src/Carbon/Lang/br.php new file mode 100644 index 0000000..583472f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/br.php @@ -0,0 +1,76 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - Serhan Apaydın + * - JD Isaacks + */ +return [ + 'year' => '{1}:count bloaz|{3,4,5,9}:count bloaz|[0,Inf[:count vloaz', + 'a_year' => '{1}ur bloaz|{3,4,5,9}:count bloaz|[0,Inf[:count vloaz', + 'month' => '{1}:count miz|{2}:count viz|[0,Inf[:count miz', + 'a_month' => '{1}ur miz|{2}:count viz|[0,Inf[:count miz', + 'week' => ':count sizhun', + 'a_week' => '{1}ur sizhun|:count sizhun', + 'day' => '{1}:count devezh|{2}:count zevezh|[0,Inf[:count devezh', + 'a_day' => '{1}un devezh|{2}:count zevezh|[0,Inf[:count devezh', + 'hour' => ':count eur', + 'a_hour' => '{1}un eur|:count eur', + 'minute' => '{1}:count vunutenn|{2}:count vunutenn|[0,Inf[:count munutenn', + 'a_minute' => '{1}ur vunutenn|{2}:count vunutenn|[0,Inf[:count munutenn', + 'second' => ':count eilenn', + 'a_second' => '{1}un nebeud segondennoù|[0,Inf[:count eilenn', + 'ago' => ':time \'zo', + 'from_now' => 'a-benn :time', + 'diff_now' => 'bremañ', + 'diff_today' => 'Hiziv', + 'diff_today_regexp' => 'Hiziv(?:\\s+da)?', + 'diff_yesterday' => 'decʼh', + 'diff_yesterday_regexp' => 'Dec\'h(?:\\s+da)?', + 'diff_tomorrow' => 'warcʼhoazh', + 'diff_tomorrow_regexp' => 'Warc\'hoazh(?:\\s+da)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D [a viz] MMMM YYYY', + 'LLL' => 'D [a viz] MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D [a viz] MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Hiziv da] LT', + 'nextDay' => '[Warc\'hoazh da] LT', + 'nextWeek' => 'dddd [da] LT', + 'lastDay' => '[Dec\'h da] LT', + 'lastWeek' => 'dddd [paset da] LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number) { + return $number.($number === 1 ? 'añ' : 'vet'); + }, + 'months' => ['Genver', 'C\'hwevrer', 'Meurzh', 'Ebrel', 'Mae', 'Mezheven', 'Gouere', 'Eost', 'Gwengolo', 'Here', 'Du', 'Kerzu'], + 'months_short' => ['Gen', 'C\'hwe', 'Meu', 'Ebr', 'Mae', 'Eve', 'Gou', 'Eos', 'Gwe', 'Her', 'Du', 'Ker'], + 'weekdays' => ['Sul', 'Lun', 'Meurzh', 'Merc\'her', 'Yaou', 'Gwener', 'Sadorn'], + 'weekdays_short' => ['Sul', 'Lun', 'Meu', 'Mer', 'Yao', 'Gwe', 'Sad'], + 'weekdays_min' => ['Su', 'Lu', 'Me', 'Mer', 'Ya', 'Gw', 'Sa'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' hag '], + 'meridiem' => ['A.M.', 'G.M.'], + + 'y' => ':count bl.', + 'd' => ':count d', + 'h' => ':count e', + 'min' => ':count min', + 's' => ':count s', +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/br_FR.php b/vendor/nesbot/carbon/src/Carbon/Lang/br_FR.php new file mode 100644 index 0000000..7f54185 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/br_FR.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/br.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/brx.php b/vendor/nesbot/carbon/src/Carbon/Lang/brx.php new file mode 100644 index 0000000..a0a7bf9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/brx.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/brx_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/brx_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/brx_IN.php new file mode 100644 index 0000000..2d80ced --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/brx_IN.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Red Hat Pune bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'M/D/YY', + ], + 'months' => ['जानुवारी', 'फेब्रुवारी', 'मार्स', 'एफ्रिल', 'मे', 'जुन', 'जुलाइ', 'आगस्थ', 'सेबथेज्ब़र', 'अखथबर', 'नबेज्ब़र', 'दिसेज्ब़र'], + 'months_short' => ['जानुवारी', 'फेब्रुवारी', 'मार्स', 'एप्रिल', 'मे', 'जुन', 'जुलाइ', 'आगस्थ', 'सेबथेज्ब़र', 'अखथबर', 'नबेज्ब़र', 'दिसेज्ब़र'], + 'weekdays' => ['रबिबार', 'सोबार', 'मंगलबार', 'बुदबार', 'बिसथिबार', 'सुखुरबार', 'सुनिबार'], + 'weekdays_short' => ['रबि', 'सम', 'मंगल', 'बुद', 'बिसथि', 'सुखुर', 'सुनि'], + 'weekdays_min' => ['रबि', 'सम', 'मंगल', 'बुद', 'बिसथि', 'सुखुर', 'सुनि'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['फुं.', 'बेलासे.'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bs.php b/vendor/nesbot/carbon/src/Carbon/Lang/bs.php new file mode 100644 index 0000000..e5d6808 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bs.php @@ -0,0 +1,97 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - bokideckonja + * - Josh Soref + * - François B + * - shaishavgandhi05 + * - Serhan Apaydın + * - JD Isaacks + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => ':count godina|:count godine|:count godina', + 'y' => ':count godina|:count godine|:count godina', + 'month' => ':count mjesec|:count mjeseca|:count mjeseci', + 'm' => ':count mjesec|:count mjeseca|:count mjeseci', + 'week' => ':count sedmice|:count sedmicu|:count sedmica', + 'w' => ':count sedmice|:count sedmicu|:count sedmica', + 'day' => ':count dan|:count dana|:count dana', + 'd' => ':count dan|:count dana|:count dana', + 'hour' => ':count sat|:count sata|:count sati', + 'h' => ':count sat|:count sata|:count sati', + 'minute' => ':count minut|:count minuta|:count minuta', + 'min' => ':count minut|:count minuta|:count minuta', + 'second' => ':count sekund|:count sekunda|:count sekundi', + 's' => ':count sekund|:count sekunda|:count sekundi', + 'ago' => 'prije :time', + 'from_now' => 'za :time', + 'after' => 'nakon :time', + 'before' => ':time ranije', + 'diff_now' => 'sada', + 'diff_today' => 'danas', + 'diff_today_regexp' => 'danas(?:\\s+u)?', + 'diff_yesterday' => 'jučer', + 'diff_yesterday_regexp' => 'jučer(?:\\s+u)?', + 'diff_tomorrow' => 'sutra', + 'diff_tomorrow_regexp' => 'sutra(?:\\s+u)?', + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D. MMMM YYYY', + 'LLL' => 'D. MMMM YYYY H:mm', + 'LLLL' => 'dddd, D. MMMM YYYY H:mm', + ], + 'calendar' => [ + 'sameDay' => '[danas u] LT', + 'nextDay' => '[sutra u] LT', + 'nextWeek' => function (CarbonInterface $current) { + switch ($current->dayOfWeek) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + default: + return '[u] dddd [u] LT'; + } + }, + 'lastDay' => '[jučer u] LT', + 'lastWeek' => function (CarbonInterface $current) { + switch ($current->dayOfWeek) { + case 0: + case 3: + return '[prošlu] dddd [u] LT'; + case 6: + return '[prošle] [subote] [u] LT'; + default: + return '[prošli] dddd [u] LT'; + } + }, + 'sameElse' => 'L', + ], + 'ordinal' => ':number.', + 'months' => ['januar', 'februar', 'mart', 'april', 'maj', 'juni', 'juli', 'august', 'septembar', 'oktobar', 'novembar', 'decembar'], + 'months_short' => ['jan.', 'feb.', 'mar.', 'apr.', 'maj.', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'], + 'weekdays' => ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'], + 'weekdays_short' => ['ned.', 'pon.', 'uto.', 'sri.', 'čet.', 'pet.', 'sub.'], + 'weekdays_min' => ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' i '], + 'meridiem' => ['prijepodne', 'popodne'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php b/vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php new file mode 100644 index 0000000..0a59117 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/bs.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php b/vendor/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php new file mode 100644 index 0000000..e1a1744 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/bs.php', [ + 'meridiem' => ['пре подне', 'поподне'], + 'weekdays' => ['недјеља', 'понедјељак', 'уторак', 'сриједа', 'четвртак', 'петак', 'субота'], + 'weekdays_short' => ['нед', 'пон', 'уто', 'сри', 'чет', 'пет', 'суб'], + 'weekdays_min' => ['нед', 'пон', 'уто', 'сри', 'чет', 'пет', 'суб'], + 'months' => ['јануар', 'фебруар', 'март', 'април', 'мај', 'јуни', 'јули', 'аугуст', 'септембар', 'октобар', 'новембар', 'децембар'], + 'months_short' => ['јан', 'феб', 'мар', 'апр', 'мај', 'јун', 'јул', 'ауг', 'сеп', 'окт', 'нов', 'дец'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D.M.YYYY.', + 'LL' => 'DD.MM.YYYY.', + 'LLL' => 'DD. MMMM YYYY. HH:mm', + 'LLLL' => 'dddd, DD. MMMM YYYY. HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/bs_Latn.php b/vendor/nesbot/carbon/src/Carbon/Lang/bs_Latn.php new file mode 100644 index 0000000..b4e363e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/bs_Latn.php @@ -0,0 +1,13 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/bs.php', [ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/byn.php b/vendor/nesbot/carbon/src/Carbon/Lang/byn.php new file mode 100644 index 0000000..7125f3d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/byn.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/byn_ER.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/byn_ER.php b/vendor/nesbot/carbon/src/Carbon/Lang/byn_ER.php new file mode 100644 index 0000000..ad67533 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/byn_ER.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation locales@geez.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['ልደትሪ', 'ካብኽብቲ', 'ክብላ', 'ፋጅኺሪ', 'ክቢቅሪ', 'ምኪኤል ትጓ̅ኒሪ', 'ኰርኩ', 'ማርያም ትሪ', 'ያኸኒ መሳቅለሪ', 'መተሉ', 'ምኪኤል መሽወሪ', 'ተሕሳስሪ'], + 'months_short' => ['ልደት', 'ካብኽ', 'ክብላ', 'ፋጅኺ', 'ክቢቅ', 'ም/ት', 'ኰር', 'ማርያ', 'ያኸኒ', 'መተሉ', 'ም/ም', 'ተሕሳ'], + 'weekdays' => ['ሰንበር ቅዳዅ', 'ሰኑ', 'ሰሊጝ', 'ለጓ ወሪ ለብዋ', 'ኣምድ', 'ኣርብ', 'ሰንበር ሽጓዅ'], + 'weekdays_short' => ['ሰ/ቅ', 'ሰኑ', 'ሰሊጝ', 'ለጓ', 'ኣምድ', 'ኣርብ', 'ሰ/ሽ'], + 'weekdays_min' => ['ሰ/ቅ', 'ሰኑ', 'ሰሊጝ', 'ለጓ', 'ኣምድ', 'ኣርብ', 'ሰ/ሽ'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['ፋዱስ ጃብ', 'ፋዱስ ደምቢ'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ca.php b/vendor/nesbot/carbon/src/Carbon/Lang/ca.php new file mode 100644 index 0000000..b8b1994 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ca.php @@ -0,0 +1,117 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - mestremuten + * - François B + * - Marc Ordinas i Llopis + * - Pere Orga + * - JD Isaacks + * - Quentí + * - Víctor Díaz + * - Xavi + * - qcardona + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => ':count any|:count anys', + 'a_year' => 'un any|:count anys', + 'y' => ':count any|:count anys', + 'month' => ':count mes|:count mesos', + 'a_month' => 'un mes|:count mesos', + 'm' => ':count mes|:count mesos', + 'week' => ':count setmana|:count setmanes', + 'a_week' => 'una setmana|:count setmanes', + 'w' => ':count setmana|:count setmanes', + 'day' => ':count dia|:count dies', + 'a_day' => 'un dia|:count dies', + 'd' => ':count d', + 'hour' => ':count hora|:count hores', + 'a_hour' => 'una hora|:count hores', + 'h' => ':count h', + 'minute' => ':count minut|:count minuts', + 'a_minute' => 'un minut|:count minuts', + 'min' => ':count min', + 'second' => ':count segon|:count segons', + 'a_second' => 'uns segons|:count segons', + 's' => ':count s', + 'ago' => 'fa :time', + 'from_now' => 'd\'aquí a :time', + 'after' => ':time després', + 'before' => ':time abans', + 'diff_now' => 'ara mateix', + 'diff_today' => 'avui', + 'diff_today_regexp' => 'avui(?:\\s+a)?(?:\\s+les)?', + 'diff_yesterday' => 'ahir', + 'diff_yesterday_regexp' => 'ahir(?:\\s+a)?(?:\\s+les)?', + 'diff_tomorrow' => 'demà', + 'diff_tomorrow_regexp' => 'demà(?:\\s+a)?(?:\\s+les)?', + 'diff_before_yesterday' => 'abans d\'ahir', + 'diff_after_tomorrow' => 'demà passat', + 'period_recurrences' => ':count cop|:count cops', + 'period_interval' => 'cada :interval', + 'period_start_date' => 'de :date', + 'period_end_date' => 'fins a :date', + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM [de] YYYY', + 'LLL' => 'D MMMM [de] YYYY [a les] H:mm', + 'LLLL' => 'dddd D MMMM [de] YYYY [a les] H:mm', + ], + 'calendar' => [ + 'sameDay' => function (CarbonInterface $current) { + return '[avui a '.($current->hour !== 1 ? 'les' : 'la').'] LT'; + }, + 'nextDay' => function (CarbonInterface $current) { + return '[demà a '.($current->hour !== 1 ? 'les' : 'la').'] LT'; + }, + 'nextWeek' => function (CarbonInterface $current) { + return 'dddd [a '.($current->hour !== 1 ? 'les' : 'la').'] LT'; + }, + 'lastDay' => function (CarbonInterface $current) { + return '[ahir a '.($current->hour !== 1 ? 'les' : 'la').'] LT'; + }, + 'lastWeek' => function (CarbonInterface $current) { + return '[el] dddd [passat a '.($current->hour !== 1 ? 'les' : 'la').'] LT'; + }, + 'sameElse' => 'L', + ], + 'ordinal' => function ($number, $period) { + return $number.( + ($period === 'w' || $period === 'W') ? 'a' : ( + ($number === 1) ? 'r' : ( + ($number === 2) ? 'n' : ( + ($number === 3) ? 'r' : ( + ($number === 4) ? 't' : 'è' + ) + ) + ) + ) + ); + }, + 'months' => ['de gener', 'de febrer', 'de març', 'd\'abril', 'de maig', 'de juny', 'de juliol', 'd\'agost', 'de setembre', 'd\'octubre', 'de novembre', 'de desembre'], + 'months_standalone' => ['gener', 'febrer', 'març', 'abril', 'maig', 'juny', 'juliol', 'agost', 'setembre', 'octubre', 'novembre', 'desembre'], + 'months_short' => ['de gen.', 'de febr.', 'de març', 'd\'abr.', 'de maig', 'de juny', 'de jul.', 'd\'ag.', 'de set.', 'd\'oct.', 'de nov.', 'de des.'], + 'months_short_standalone' => ['gen.', 'febr.', 'març', 'abr.', 'maig', 'juny', 'jul.', 'ag.', 'set.', 'oct.', 'nov.', 'des.'], + 'months_regexp' => '/(D[oD]?[\s,]+MMMM?|L{2,4}|l{2,4})/', + 'weekdays' => ['diumenge', 'dilluns', 'dimarts', 'dimecres', 'dijous', 'divendres', 'dissabte'], + 'weekdays_short' => ['dg.', 'dl.', 'dt.', 'dc.', 'dj.', 'dv.', 'ds.'], + 'weekdays_min' => ['dg', 'dl', 'dt', 'dc', 'dj', 'dv', 'ds'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' i '], + 'meridiem' => ['a. m.', 'p. m.'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ca_AD.php b/vendor/nesbot/carbon/src/Carbon/Lang/ca_AD.php new file mode 100644 index 0000000..861acd2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ca_AD.php @@ -0,0 +1,13 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ca.php', [ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES.php b/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES.php new file mode 100644 index 0000000..5004978 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ca.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php b/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php new file mode 100644 index 0000000..861acd2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php @@ -0,0 +1,13 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ca.php', [ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ca_FR.php b/vendor/nesbot/carbon/src/Carbon/Lang/ca_FR.php new file mode 100644 index 0000000..861acd2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ca_FR.php @@ -0,0 +1,13 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ca.php', [ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ca_IT.php b/vendor/nesbot/carbon/src/Carbon/Lang/ca_IT.php new file mode 100644 index 0000000..861acd2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ca_IT.php @@ -0,0 +1,13 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ca.php', [ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ccp.php b/vendor/nesbot/carbon/src/Carbon/Lang/ccp.php new file mode 100644 index 0000000..99c1dca --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ccp.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'weekdays' => ['𑄢𑄧𑄝𑄨𑄝𑄢𑄴', '𑄥𑄧𑄟𑄴𑄝𑄢𑄴', '𑄟𑄧𑄁𑄉𑄧𑄣𑄴𑄝𑄢𑄴', '𑄝𑄪𑄖𑄴𑄝𑄢𑄴', '𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴𑄝𑄢𑄴', '𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴𑄝𑄢𑄴', '𑄥𑄧𑄚𑄨𑄝𑄢𑄴'], + 'weekdays_short' => ['𑄢𑄧𑄝𑄨', '𑄥𑄧𑄟𑄴', '𑄟𑄧𑄁𑄉𑄧𑄣𑄴', '𑄝𑄪𑄖𑄴', '𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴', '𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴', '𑄥𑄧𑄚𑄨'], + 'weekdays_min' => ['𑄢𑄧𑄝𑄨', '𑄥𑄧𑄟𑄴', '𑄟𑄧𑄁𑄉𑄧𑄣𑄴', '𑄝𑄪𑄖𑄴', '𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴', '𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴', '𑄥𑄧𑄚𑄨'], + 'months' => ['𑄎𑄚𑄪𑄠𑄢𑄨', '𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨', '𑄟𑄢𑄴𑄌𑄧', '𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴', '𑄟𑄬', '𑄎𑄪𑄚𑄴', '𑄎𑄪𑄣𑄭', '𑄃𑄉𑄧𑄌𑄴𑄑𑄴', '𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄃𑄧𑄇𑄴𑄑𑄬𑄝𑄧𑄢𑄴', '𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴'], + 'months_short' => ['𑄎𑄚𑄪', '𑄜𑄬𑄛𑄴', '𑄟𑄢𑄴𑄌𑄧', '𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴', '𑄟𑄬', '𑄎𑄪𑄚𑄴', '𑄎𑄪𑄣𑄭', '𑄃𑄉𑄧𑄌𑄴𑄑𑄴', '𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴', '𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄢𑄴'], + 'months_short_standalone' => ['𑄎𑄚𑄪𑄠𑄢𑄨', '𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨', '𑄟𑄢𑄴𑄌𑄧', '𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴', '𑄟𑄬', '𑄎𑄪𑄚𑄴', '𑄎𑄪𑄣𑄭', '𑄃𑄉𑄧𑄌𑄴𑄑𑄴', '𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴', '𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴', '𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴'], + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM, YYYY', + 'LLL' => 'D MMMM, YYYY h:mm a', + 'LLLL' => 'dddd, D MMMM, YYYY h:mm a', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ccp_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ccp_IN.php new file mode 100644 index 0000000..c1fa8af --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ccp_IN.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ccp.php', [ + 'weekend' => [0, 0], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ce.php b/vendor/nesbot/carbon/src/Carbon/Lang/ce.php new file mode 100644 index 0000000..f99f6ff --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ce.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/ce_RU.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ce_RU.php b/vendor/nesbot/carbon/src/Carbon/Lang/ce_RU.php new file mode 100644 index 0000000..f769856 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ce_RU.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - ANCHR + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'YYYY.DD.MM', + ], + 'months' => ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'], + 'months_short' => ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], + 'weekdays' => ['КӀиранан де', 'Оршотан де', 'Шинарин де', 'Кхаарин де', 'Еарин де', 'ПӀераскан де', 'Шот де'], + 'weekdays_short' => ['КӀ', 'Ор', 'Ши', 'Кх', 'Еа', 'ПӀ', 'Шо'], + 'weekdays_min' => ['КӀ', 'Ор', 'Ши', 'Кх', 'Еа', 'ПӀ', 'Шо'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + + 'year' => ':count шо', + 'y' => ':count шо', + 'a_year' => ':count шо', + + 'month' => ':count бутт', + 'm' => ':count бутт', + 'a_month' => ':count бутт', + + 'week' => ':count кӏира', + 'w' => ':count кӏира', + 'a_week' => ':count кӏира', + + 'day' => ':count де', + 'd' => ':count де', + 'a_day' => ':count де', + + 'hour' => ':count сахьт', + 'h' => ':count сахьт', + 'a_hour' => ':count сахьт', + + 'minute' => ':count минот', + 'min' => ':count минот', + 'a_minute' => ':count минот', + + 'second' => ':count секунд', + 's' => ':count секунд', + 'a_second' => ':count секунд', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cgg.php b/vendor/nesbot/carbon/src/Carbon/Lang/cgg.php new file mode 100644 index 0000000..09bcc1c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/cgg.php @@ -0,0 +1,31 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'weekdays' => ['Sande', 'Orwokubanza', 'Orwakabiri', 'Orwakashatu', 'Orwakana', 'Orwakataano', 'Orwamukaaga'], + 'weekdays_short' => ['SAN', 'ORK', 'OKB', 'OKS', 'OKN', 'OKT', 'OMK'], + 'weekdays_min' => ['SAN', 'ORK', 'OKB', 'OKS', 'OKN', 'OKT', 'OMK'], + 'months' => ['Okwokubanza', 'Okwakabiri', 'Okwakashatu', 'Okwakana', 'Okwakataana', 'Okwamukaaga', 'Okwamushanju', 'Okwamunaana', 'Okwamwenda', 'Okwaikumi', 'Okwaikumi na kumwe', 'Okwaikumi na ibiri'], + 'months_short' => ['KBZ', 'KBR', 'KST', 'KKN', 'KTN', 'KMK', 'KMS', 'KMN', 'KMW', 'KKM', 'KNK', 'KNB'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + + 'day' => ':count ruhanga', // less reliable + 'd' => ':count ruhanga', // less reliable + 'a_day' => ':count ruhanga', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/chr.php b/vendor/nesbot/carbon/src/Carbon/Lang/chr.php new file mode 100644 index 0000000..e26190f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/chr.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/chr_US.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/chr_US.php b/vendor/nesbot/carbon/src/Carbon/Lang/chr_US.php new file mode 100644 index 0000000..371353e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/chr_US.php @@ -0,0 +1,58 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Cherokee Nation Joseph Erb josepherb7@gmail.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'MM/DD/YYYY', + ], + 'months' => ['ᎤᏃᎸᏔᏅ', 'ᎧᎦᎵ', 'ᎠᏅᏱ', 'ᎧᏬᏂ', 'ᎠᏂᏍᎬᏘ', 'ᏕᎭᎷᏱ', 'ᎫᏰᏉᏂ', 'ᎦᎶᏂ', 'ᏚᎵᏍᏗ', 'ᏚᏂᏅᏗ', 'ᏅᏓᏕᏆ', 'ᎥᏍᎩᏱ'], + 'months_short' => ['ᎤᏃ', 'ᎧᎦ', 'ᎠᏅ', 'ᎧᏬ', 'ᎠᏂ', 'ᏕᎭ', 'ᎫᏰ', 'ᎦᎶ', 'ᏚᎵ', 'ᏚᏂ', 'ᏅᏓ', 'ᎥᏍ'], + 'weekdays' => ['ᎤᎾᏙᏓᏆᏍᎬ', 'ᎤᎾᏙᏓᏉᏅᎯ', 'ᏔᎵᏁᎢᎦ', 'ᏦᎢᏁᎢᎦ', 'ᏅᎩᏁᎢᎦ', 'ᏧᎾᎩᎶᏍᏗ', 'ᎤᎾᏙᏓᏈᏕᎾ'], + 'weekdays_short' => ['ᏆᏍᎬ', 'ᏉᏅᎯ', 'ᏔᎵᏁ', 'ᏦᎢᏁ', 'ᏅᎩᏁ', 'ᏧᎾᎩ', 'ᏈᏕᎾ'], + 'weekdays_min' => ['ᏆᏍᎬ', 'ᏉᏅᎯ', 'ᏔᎵᏁ', 'ᏦᎢᏁ', 'ᏅᎩᏁ', 'ᏧᎾᎩ', 'ᏈᏕᎾ'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['ᏌᎾᎴ', 'ᏒᎯᏱᎢᏗᏢ', 'ꮜꮎꮄ', 'ꮢꭿᏹꭲꮧꮲ'], + + 'second' => ':count ᏐᎢ', // less reliable + 's' => ':count ᏐᎢ', // less reliable + 'a_second' => ':count ᏐᎢ', // less reliable + + 'year' => ':count ᏑᏕᏘᏴᏓ', + 'y' => ':count ᏑᏕᏘᏴᏓ', + 'a_year' => ':count ᏑᏕᏘᏴᏓ', + + 'month' => ':count ᏏᏅᏙ', + 'm' => ':count ᏏᏅᏙ', + 'a_month' => ':count ᏏᏅᏙ', + + 'week' => ':count ᏑᎾᏙᏓᏆᏍᏗ', + 'w' => ':count ᏑᎾᏙᏓᏆᏍᏗ', + 'a_week' => ':count ᏑᎾᏙᏓᏆᏍᏗ', + + 'day' => ':count ᎢᎦ', + 'd' => ':count ᎢᎦ', + 'a_day' => ':count ᎢᎦ', + + 'hour' => ':count ᏑᏟᎶᏛ', + 'h' => ':count ᏑᏟᎶᏛ', + 'a_hour' => ':count ᏑᏟᎶᏛ', + + 'minute' => ':count ᎢᏯᏔᏬᏍᏔᏅ', + 'min' => ':count ᎢᏯᏔᏬᏍᏔᏅ', + 'a_minute' => ':count ᎢᏯᏔᏬᏍᏔᏅ', + + 'ago' => ':time ᏥᎨᏒ', + 'from_now' => 'ᎾᎿ :time', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ckb.php b/vendor/nesbot/carbon/src/Carbon/Lang/ckb.php new file mode 100644 index 0000000..acf4dc2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ckb.php @@ -0,0 +1,89 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Swara Mohammed + */ +$months = [ + 'ڕێبەندان', + 'ڕەشەمە', + 'نەورۆز', + 'گوڵان', + 'جۆزەردان', + 'پوشپەڕ', + 'گەلاوێژ', + 'خەرمانان', + 'ڕەزبەر', + 'گەڵاڕێزان', + 'سەرماوەرز', + 'بەفرانبار', +]; + +return [ + 'year' => implode('|', ['{0}:count ساڵێک', '{1}ساڵێک', '{2}دوو ساڵ', ']2,11[:count ساڵ', ']10,Inf[:count ساڵ']), + 'a_year' => implode('|', ['{0}:count ساڵێک', '{1}ساڵێک', '{2}دوو ساڵ', ']2,11[:count ساڵ', ']10,Inf[:count ساڵ']), + 'month' => implode('|', ['{0}:count مانگێک', '{1}مانگێک', '{2}دوو مانگ', ']2,11[:count مانگ', ']10,Inf[:count مانگ']), + 'a_month' => implode('|', ['{0}:count مانگێک', '{1}مانگێک', '{2}دوو مانگ', ']2,11[:count مانگ', ']10,Inf[:count مانگ']), + 'week' => implode('|', ['{0}:count هەفتەیەک', '{1}هەفتەیەک', '{2}دوو هەفتە', ']2,11[:count هەفتە', ']10,Inf[:count هەفتە']), + 'a_week' => implode('|', ['{0}:count هەفتەیەک', '{1}هەفتەیەک', '{2}دوو هەفتە', ']2,11[:count هەفتە', ']10,Inf[:count هەفتە']), + 'day' => implode('|', ['{0}:count ڕۆژێک', '{1}ڕۆژێک', '{2}دوو ڕۆژ', ']2,11[:count ڕۆژ', ']10,Inf[:count ڕۆژ']), + 'a_day' => implode('|', ['{0}:count ڕۆژێک', '{1}ڕۆژێک', '{2}دوو ڕۆژ', ']2,11[:count ڕۆژ', ']10,Inf[:count ڕۆژ']), + 'hour' => implode('|', ['{0}:count کاتژمێرێک', '{1}کاتژمێرێک', '{2}دوو کاتژمێر', ']2,11[:count کاتژمێر', ']10,Inf[:count کاتژمێر']), + 'a_hour' => implode('|', ['{0}:count کاتژمێرێک', '{1}کاتژمێرێک', '{2}دوو کاتژمێر', ']2,11[:count کاتژمێر', ']10,Inf[:count کاتژمێر']), + 'minute' => implode('|', ['{0}:count خولەکێک', '{1}خولەکێک', '{2}دوو خولەک', ']2,11[:count خولەک', ']10,Inf[:count خولەک']), + 'a_minute' => implode('|', ['{0}:count خولەکێک', '{1}خولەکێک', '{2}دوو خولەک', ']2,11[:count خولەک', ']10,Inf[:count خولەک']), + 'second' => implode('|', ['{0}:count چرکەیەک', '{1}چرکەیەک', '{2}دوو چرکە', ']2,11[:count چرکە', ']10,Inf[:count چرکە']), + 'a_second' => implode('|', ['{0}:count چرکەیەک', '{1}چرکەیەک', '{2}دوو چرکە', ']2,11[:count چرکە', ']10,Inf[:count چرکە']), + 'ago' => 'پێش :time', + 'from_now' => ':time لە ئێستاوە', + 'after' => 'دوای :time', + 'before' => 'پێش :time', + 'diff_now' => 'ئێستا', + 'diff_today' => 'ئەمڕۆ', + 'diff_today_regexp' => 'ڕۆژ(?:\\s+لە)?(?:\\s+کاتژمێر)?', + 'diff_yesterday' => 'دوێنێ', + 'diff_yesterday_regexp' => 'دوێنێ(?:\\s+لە)?(?:\\s+کاتژمێر)?', + 'diff_tomorrow' => 'سبەینێ', + 'diff_tomorrow_regexp' => 'سبەینێ(?:\\s+لە)?(?:\\s+کاتژمێر)?', + 'diff_before_yesterday' => 'پێش دوێنێ', + 'diff_after_tomorrow' => 'دوای سبەینێ', + 'period_recurrences' => implode('|', ['{0}جار', '{1}جار', '{2}:count دووجار', ']2,11[:count جار', ']10,Inf[:count جار']), + 'period_interval' => 'هەموو :interval', + 'period_start_date' => 'لە :date', + 'period_end_date' => 'بۆ :date', + 'months' => $months, + 'months_short' => $months, + 'weekdays' => ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'هەینی', 'شەممە'], + 'weekdays_short' => ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'هەینی', 'شەممە'], + 'weekdays_min' => ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'هەینی', 'شەممە'], + 'list' => ['، ', ' و '], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[ئەمڕۆ لە کاتژمێر] LT', + 'nextDay' => '[سبەینێ لە کاتژمێر] LT', + 'nextWeek' => 'dddd [لە کاتژمێر] LT', + 'lastDay' => '[دوێنێ لە کاتژمێر] LT', + 'lastWeek' => 'dddd [لە کاتژمێر] LT', + 'sameElse' => 'L', + ], + 'meridiem' => ['پ.ن', 'د.ن'], + 'weekend' => [5, 6], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cmn.php b/vendor/nesbot/carbon/src/Carbon/Lang/cmn.php new file mode 100644 index 0000000..80b1d69 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/cmn.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/cmn_TW.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cmn_TW.php b/vendor/nesbot/carbon/src/Carbon/Lang/cmn_TW.php new file mode 100644 index 0000000..7e43f9d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/cmn_TW.php @@ -0,0 +1,54 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'YYYY年MM月DD號', + ], + 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], + 'months_short' => [' 1月', ' 2月', ' 3月', ' 4月', ' 5月', ' 6月', ' 7月', ' 8月', ' 9月', '10月', '11月', '12月'], + 'weekdays' => ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], + 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], + 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], + 'meridiem' => ['上午', '下午'], + + 'year' => ':count 年', + 'y' => ':count 年', + 'a_year' => ':count 年', + + 'month' => ':count 月', + 'm' => ':count 月', + 'a_month' => ':count 月', + + 'week' => ':count 周', + 'w' => ':count 周', + 'a_week' => ':count 周', + + 'day' => ':count 白天', + 'd' => ':count 白天', + 'a_day' => ':count 白天', + + 'hour' => ':count 小时', + 'h' => ':count 小时', + 'a_hour' => ':count 小时', + + 'minute' => ':count 分钟', + 'min' => ':count 分钟', + 'a_minute' => ':count 分钟', + + 'second' => ':count 秒', + 's' => ':count 秒', + 'a_second' => ':count 秒', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/crh.php b/vendor/nesbot/carbon/src/Carbon/Lang/crh.php new file mode 100644 index 0000000..a1d7ce6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/crh.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/crh_UA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/crh_UA.php b/vendor/nesbot/carbon/src/Carbon/Lang/crh_UA.php new file mode 100644 index 0000000..0513933 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/crh_UA.php @@ -0,0 +1,56 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Reşat SABIQ tilde.birlik@gmail.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], + 'months' => ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'Mayıs', 'İyun', 'İyul', 'Avgust', 'Sentâbr', 'Oktâbr', 'Noyabr', 'Dekabr'], + 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'İyn', 'İyl', 'Avg', 'Sen', 'Okt', 'Noy', 'Dek'], + 'weekdays' => ['Bazar', 'Bazarertesi', 'Salı', 'Çarşembe', 'Cumaaqşamı', 'Cuma', 'Cumaertesi'], + 'weekdays_short' => ['Baz', 'Ber', 'Sal', 'Çar', 'Caq', 'Cum', 'Cer'], + 'weekdays_min' => ['Baz', 'Ber', 'Sal', 'Çar', 'Caq', 'Cum', 'Cer'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['ÜE', 'ÜS'], + + 'year' => ':count yıl', + 'y' => ':count yıl', + 'a_year' => ':count yıl', + + 'month' => ':count ay', + 'm' => ':count ay', + 'a_month' => ':count ay', + + 'week' => ':count afta', + 'w' => ':count afta', + 'a_week' => ':count afta', + + 'day' => ':count kün', + 'd' => ':count kün', + 'a_day' => ':count kün', + + 'hour' => ':count saat', + 'h' => ':count saat', + 'a_hour' => ':count saat', + + 'minute' => ':count daqqa', + 'min' => ':count daqqa', + 'a_minute' => ':count daqqa', + + 'second' => ':count ekinci', + 's' => ':count ekinci', + 'a_second' => ':count ekinci', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cs.php b/vendor/nesbot/carbon/src/Carbon/Lang/cs.php new file mode 100644 index 0000000..c01e3cc --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/cs.php @@ -0,0 +1,123 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Philippe Vaucher + * - Jakub Tesinsky + * - Martin Suja + * - Nikos Timiopulos + * - Bohuslav Blín + * - Tsutomu Kuroda + * - tjku + * - Lukas Svoboda + * - Max Melentiev + * - Juanito Fatas + * - Akira Matsuda + * - Christopher Dell + * - Václav Pávek + * - CodeSkills + * - Tlapi + * - newman101 + * - Petr Kadlec + * - tommaskraus + * - Karel Sommer (calvera) + */ +$za = function ($time) { + return 'za '.strtr($time, [ + 'hodina' => 'hodinu', + 'minuta' => 'minutu', + 'sekunda' => 'sekundu', + ]); +}; + +$pred = function ($time) { + $time = strtr($time, [ + 'hodina' => 'hodinou', + 'minuta' => 'minutou', + 'sekunda' => 'sekundou', + ]); + $time = preg_replace('/hodiny?(?!\w)/', 'hodinami', $time); + $time = preg_replace('/minuty?(?!\w)/', 'minutami', $time); + $time = preg_replace('/sekundy?(?!\w)/', 'sekundami', $time); + + return "před $time"; +}; + +return [ + 'year' => ':count rok|:count roky|:count let', + 'y' => ':count rok|:count roky|:count let', + 'a_year' => 'rok|:count roky|:count let', + 'month' => ':count měsíc|:count měsíce|:count měsíců', + 'm' => ':count měs.', + 'a_month' => 'měsíc|:count měsíce|:count měsíců', + 'week' => ':count týden|:count týdny|:count týdnů', + 'w' => ':count týd.', + 'a_week' => 'týden|:count týdny|:count týdnů', + 'day' => ':count den|:count dny|:count dní', + 'd' => ':count den|:count dny|:count dní', + 'a_day' => 'den|:count dny|:count dní', + 'hour' => ':count hodina|:count hodiny|:count hodin', + 'h' => ':count hod.', + 'a_hour' => 'hodina|:count hodiny|:count hodin', + 'minute' => ':count minuta|:count minuty|:count minut', + 'min' => ':count min.', + 'a_minute' => 'minuta|:count minuty|:count minut', + 'second' => ':count sekunda|:count sekundy|:count sekund', + 's' => ':count sek.', + 'a_second' => 'pár sekund|:count sekundy|:count sekund', + + 'month_ago' => ':count měsícem|:count měsíci|:count měsíci', + 'a_month_ago' => 'měsícem|:count měsíci|:count měsíci', + 'day_ago' => ':count dnem|:count dny|:count dny', + 'a_day_ago' => 'dnem|:count dny|:count dny', + 'week_ago' => ':count týdnem|:count týdny|:count týdny', + 'a_week_ago' => 'týdnem|:count týdny|:count týdny', + 'year_ago' => ':count rokem|:count roky|:count lety', + 'y_ago' => ':count rok.|:count rok.|:count let.', + 'a_year_ago' => 'rokem|:count roky|:count lety', + + 'month_before' => ':count měsícem|:count měsíci|:count měsíci', + 'a_month_before' => 'měsícem|:count měsíci|:count měsíci', + 'day_before' => ':count dnem|:count dny|:count dny', + 'a_day_before' => 'dnem|:count dny|:count dny', + 'week_before' => ':count týdnem|:count týdny|:count týdny', + 'a_week_before' => 'týdnem|:count týdny|:count týdny', + 'year_before' => ':count rokem|:count roky|:count lety', + 'y_before' => ':count rok.|:count rok.|:count let.', + 'a_year_before' => 'rokem|:count roky|:count lety', + + 'ago' => $pred, + 'from_now' => $za, + 'before' => $pred, + 'after' => $za, + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'months' => ['ledna', 'února', 'března', 'dubna', 'května', 'června', 'července', 'srpna', 'září', 'října', 'listopadu', 'prosince'], + 'months_standalone' => ['leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec'], + 'months_short' => ['led', 'úno', 'bře', 'dub', 'kvě', 'čvn', 'čvc', 'srp', 'zář', 'říj', 'lis', 'pro'], + 'weekdays' => ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'], + 'weekdays_short' => ['ned', 'pon', 'úte', 'stř', 'čtv', 'pát', 'sob'], + 'weekdays_min' => ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'], + 'list' => [', ', ' a '], + 'diff_now' => 'nyní', + 'diff_yesterday' => 'včera', + 'diff_tomorrow' => 'zítra', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD. MM. YYYY', + 'LL' => 'D. MMMM YYYY', + 'LLL' => 'D. MMMM YYYY HH:mm', + 'LLLL' => 'dddd D. MMMM YYYY HH:mm', + ], + 'meridiem' => ['dopoledne', 'odpoledne'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cs_CZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/cs_CZ.php new file mode 100644 index 0000000..ea2517e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/cs_CZ.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/cs.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/csb.php b/vendor/nesbot/carbon/src/Carbon/Lang/csb.php new file mode 100644 index 0000000..a35d281 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/csb.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/csb_PL.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/csb_PL.php b/vendor/nesbot/carbon/src/Carbon/Lang/csb_PL.php new file mode 100644 index 0000000..25e0ca8 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/csb_PL.php @@ -0,0 +1,41 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - csb_PL locale Michal Ostrowski bug-glibc-locales@gnu.org + */ +return [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY-MM-DD', + 'LL' => 'MMMM DD, YYYY', + 'LLL' => 'DD MMM HH:mm', + 'LLLL' => 'MMMM DD, YYYY HH:mm', + ], + 'months' => ['stëcznika', 'gromicznika', 'strëmiannika', 'łżëkwiata', 'maja', 'czerwińca', 'lëpińca', 'zélnika', 'séwnika', 'rujana', 'lëstopadnika', 'gòdnika'], + 'months_short' => ['stë', 'gro', 'str', 'łżë', 'maj', 'cze', 'lëp', 'zél', 'séw', 'ruj', 'lës', 'gòd'], + 'weekdays' => ['niedzela', 'pòniedzôłk', 'wtórk', 'strzoda', 'czwiôrtk', 'piątk', 'sobòta'], + 'weekdays_short' => ['nie', 'pòn', 'wtó', 'str', 'czw', 'pią', 'sob'], + 'weekdays_min' => ['nie', 'pòn', 'wtó', 'str', 'czw', 'pią', 'sob'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' a téż '], + 'two_words_connector' => ' a téż ', + 'year' => ':count rok', + 'month' => ':count miesiąc', + 'week' => ':count tidzéń', + 'day' => ':count dzéń', + 'hour' => ':count gòdzëna', + 'minute' => ':count minuta', + 'second' => ':count sekunda', +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cu.php b/vendor/nesbot/carbon/src/Carbon/Lang/cu.php new file mode 100644 index 0000000..d6d1312 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/cu.php @@ -0,0 +1,52 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'months' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], + 'months_short' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY-MM-DD', + 'LL' => 'YYYY MMM D', + 'LLL' => 'YYYY MMMM D HH:mm', + 'LLLL' => 'YYYY MMMM D, dddd HH:mm', + ], + + 'year' => ':count лѣто', + 'y' => ':count лѣто', + 'a_year' => ':count лѣто', + + 'month' => ':count мѣсѧць', + 'm' => ':count мѣсѧць', + 'a_month' => ':count мѣсѧць', + + 'week' => ':count сєдмица', + 'w' => ':count сєдмица', + 'a_week' => ':count сєдмица', + + 'day' => ':count дьнь', + 'd' => ':count дьнь', + 'a_day' => ':count дьнь', + + 'hour' => ':count година', + 'h' => ':count година', + 'a_hour' => ':count година', + + 'minute' => ':count малъ', // less reliable + 'min' => ':count малъ', // less reliable + 'a_minute' => ':count малъ', // less reliable + + 'second' => ':count въторъ', + 's' => ':count въторъ', + 'a_second' => ':count въторъ', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cv.php b/vendor/nesbot/carbon/src/Carbon/Lang/cv.php new file mode 100644 index 0000000..8aeb73a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/cv.php @@ -0,0 +1,65 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - François B + * - JD Isaacks + */ +return [ + 'year' => ':count ҫул', + 'a_year' => '{1}пӗр ҫул|:count ҫул', + 'month' => ':count уйӑх', + 'a_month' => '{1}пӗр уйӑх|:count уйӑх', + 'week' => ':count эрне', + 'a_week' => '{1}пӗр эрне|:count эрне', + 'day' => ':count кун', + 'a_day' => '{1}пӗр кун|:count кун', + 'hour' => ':count сехет', + 'a_hour' => '{1}пӗр сехет|:count сехет', + 'minute' => ':count минут', + 'a_minute' => '{1}пӗр минут|:count минут', + 'second' => ':count ҫеккунт', + 'a_second' => '{1}пӗр-ик ҫеккунт|:count ҫеккунт', + 'ago' => ':time каялла', + 'from_now' => function ($time) { + return $time.(preg_match('/сехет$/u', $time) ? 'рен' : (preg_match('/ҫул/u', $time) ? 'тан' : 'ран')); + }, + 'diff_yesterday' => 'Ӗнер', + 'diff_today' => 'Паян', + 'diff_tomorrow' => 'Ыран', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD-MM-YYYY', + 'LL' => 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]', + 'LLL' => 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm', + 'LLLL' => 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Паян] LT [сехетре]', + 'nextDay' => '[Ыран] LT [сехетре]', + 'nextWeek' => '[Ҫитес] dddd LT [сехетре]', + 'lastDay' => '[Ӗнер] LT [сехетре]', + 'lastWeek' => '[Иртнӗ] dddd LT [сехетре]', + 'sameElse' => 'L', + ], + 'ordinal' => ':number-мӗш', + 'months' => ['кӑрлач', 'нарӑс', 'пуш', 'ака', 'май', 'ҫӗртме', 'утӑ', 'ҫурла', 'авӑн', 'юпа', 'чӳк', 'раштав'], + 'months_short' => ['кӑр', 'нар', 'пуш', 'ака', 'май', 'ҫӗр', 'утӑ', 'ҫур', 'авн', 'юпа', 'чӳк', 'раш'], + 'weekdays' => ['вырсарникун', 'тунтикун', 'ытларикун', 'юнкун', 'кӗҫнерникун', 'эрнекун', 'шӑматкун'], + 'weekdays_short' => ['выр', 'тун', 'ытл', 'юн', 'кӗҫ', 'эрн', 'шӑм'], + 'weekdays_min' => ['вр', 'тн', 'ыт', 'юн', 'кҫ', 'эр', 'шм'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' тата '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cv_RU.php b/vendor/nesbot/carbon/src/Carbon/Lang/cv_RU.php new file mode 100644 index 0000000..197bd8d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/cv_RU.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/cv.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cy.php b/vendor/nesbot/carbon/src/Carbon/Lang/cy.php new file mode 100644 index 0000000..119274f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/cy.php @@ -0,0 +1,79 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - JD Isaacks + * - Daniel Monaghan + */ +return [ + 'year' => '{1}blwyddyn|]1,Inf[:count flynedd', + 'y' => ':countbl', + 'month' => '{1}mis|]1,Inf[:count mis', + 'm' => ':countmi', + 'week' => ':count wythnos', + 'w' => ':countw', + 'day' => '{1}diwrnod|]1,Inf[:count diwrnod', + 'd' => ':countd', + 'hour' => '{1}awr|]1,Inf[:count awr', + 'h' => ':counth', + 'minute' => '{1}munud|]1,Inf[:count munud', + 'min' => ':countm', + 'second' => '{1}ychydig eiliadau|]1,Inf[:count eiliad', + 's' => ':counts', + 'ago' => ':time yn ôl', + 'from_now' => 'mewn :time', + 'after' => ':time ar ôl', + 'before' => ':time o\'r blaen', + 'diff_now' => 'nawr', + 'diff_today' => 'Heddiw', + 'diff_today_regexp' => 'Heddiw(?:\\s+am)?', + 'diff_yesterday' => 'ddoe', + 'diff_yesterday_regexp' => 'Ddoe(?:\\s+am)?', + 'diff_tomorrow' => 'yfory', + 'diff_tomorrow_regexp' => 'Yfory(?:\\s+am)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Heddiw am] LT', + 'nextDay' => '[Yfory am] LT', + 'nextWeek' => 'dddd [am] LT', + 'lastDay' => '[Ddoe am] LT', + 'lastWeek' => 'dddd [diwethaf am] LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number) { + return $number.( + $number > 20 + ? (\in_array((int) $number, [40, 50, 60, 80, 100], true) ? 'fed' : 'ain') + : ([ + '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed + 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed', // 11eg to 20fed + ])[$number] ?? '' + ); + }, + 'months' => ['Ionawr', 'Chwefror', 'Mawrth', 'Ebrill', 'Mai', 'Mehefin', 'Gorffennaf', 'Awst', 'Medi', 'Hydref', 'Tachwedd', 'Rhagfyr'], + 'months_short' => ['Ion', 'Chwe', 'Maw', 'Ebr', 'Mai', 'Meh', 'Gor', 'Aws', 'Med', 'Hyd', 'Tach', 'Rhag'], + 'weekdays' => ['Dydd Sul', 'Dydd Llun', 'Dydd Mawrth', 'Dydd Mercher', 'Dydd Iau', 'Dydd Gwener', 'Dydd Sadwrn'], + 'weekdays_short' => ['Sul', 'Llun', 'Maw', 'Mer', 'Iau', 'Gwe', 'Sad'], + 'weekdays_min' => ['Su', 'Ll', 'Ma', 'Me', 'Ia', 'Gw', 'Sa'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' a '], + 'meridiem' => ['yb', 'yh'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cy_GB.php b/vendor/nesbot/carbon/src/Carbon/Lang/cy_GB.php new file mode 100644 index 0000000..2c8148d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/cy_GB.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/cy.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/da.php b/vendor/nesbot/carbon/src/Carbon/Lang/da.php new file mode 100644 index 0000000..322f91d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/da.php @@ -0,0 +1,81 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Rune Mønnike + * - François B + * - codenhagen + * - JD Isaacks + * - Jens Herlevsen + * - Ulrik McArdle (mcardle) + * - Frederik Sauer (FrittenKeeZ) + * - Janus Bahs Jacquet (kokoshneta) + */ +return [ + 'year' => ':count år|:count år', + 'a_year' => 'et år|:count år', + 'y' => ':count år|:count år', + 'month' => ':count måned|:count måneder', + 'a_month' => 'en måned|:count måneder', + 'm' => ':count mdr.', + 'week' => ':count uge|:count uger', + 'a_week' => 'en uge|:count uger', + 'w' => ':count u.', + 'day' => ':count dag|:count dage', + 'a_day' => ':count dag|:count dage', + 'd' => ':count d.', + 'hour' => ':count time|:count timer', + 'a_hour' => 'en time|:count timer', + 'h' => ':count t.', + 'minute' => ':count minut|:count minutter', + 'a_minute' => 'et minut|:count minutter', + 'min' => ':count min.', + 'second' => ':count sekund|:count sekunder', + 'a_second' => 'få sekunder|:count sekunder', + 's' => ':count s.', + 'ago' => 'for :time siden', + 'from_now' => 'om :time', + 'after' => ':time efter', + 'before' => ':time før', + 'diff_now' => 'nu', + 'diff_today' => 'i dag', + 'diff_today_regexp' => 'i dag(?:\\s+kl.)?', + 'diff_yesterday' => 'i går', + 'diff_yesterday_regexp' => 'i går(?:\\s+kl.)?', + 'diff_tomorrow' => 'i morgen', + 'diff_tomorrow_regexp' => 'i morgen(?:\\s+kl.)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D. MMMM YYYY', + 'LLL' => 'D. MMMM YYYY HH:mm', + 'LLLL' => 'dddd [d.] D. MMMM YYYY [kl.] HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[i dag kl.] LT', + 'nextDay' => '[i morgen kl.] LT', + 'nextWeek' => 'på dddd [kl.] LT', + 'lastDay' => '[i går kl.] LT', + 'lastWeek' => '[i] dddd[s kl.] LT', + 'sameElse' => 'L', + ], + 'ordinal' => ':number.', + 'months' => ['januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december'], + 'months_short' => ['jan.', 'feb.', 'mar.', 'apr.', 'maj.', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'], + 'weekdays' => ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'], + 'weekdays_short' => ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'], + 'weekdays_min' => ['sø', 'ma', 'ti', 'on', 'to', 'fr', 'lø'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' og '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/da_DK.php b/vendor/nesbot/carbon/src/Carbon/Lang/da_DK.php new file mode 100644 index 0000000..392c484 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/da_DK.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/da.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/da_GL.php b/vendor/nesbot/carbon/src/Carbon/Lang/da_GL.php new file mode 100644 index 0000000..ea5698b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/da_GL.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/da.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + 'LL' => 'D. MMM YYYY', + 'LLL' => 'D. MMMM YYYY HH.mm', + 'LLLL' => 'dddd [den] D. MMMM YYYY HH.mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dav.php b/vendor/nesbot/carbon/src/Carbon/Lang/dav.php new file mode 100644 index 0000000..e95ec4b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/dav.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['Luma lwa K', 'luma lwa p'], + 'weekdays' => ['Ituku ja jumwa', 'Kuramuka jimweri', 'Kuramuka kawi', 'Kuramuka kadadu', 'Kuramuka kana', 'Kuramuka kasanu', 'Kifula nguwo'], + 'weekdays_short' => ['Jum', 'Jim', 'Kaw', 'Kad', 'Kan', 'Kas', 'Ngu'], + 'weekdays_min' => ['Jum', 'Jim', 'Kaw', 'Kad', 'Kan', 'Kas', 'Ngu'], + 'months' => ['Mori ghwa imbiri', 'Mori ghwa kawi', 'Mori ghwa kadadu', 'Mori ghwa kana', 'Mori ghwa kasanu', 'Mori ghwa karandadu', 'Mori ghwa mfungade', 'Mori ghwa wunyanya', 'Mori ghwa ikenda', 'Mori ghwa ikumi', 'Mori ghwa ikumi na imweri', 'Mori ghwa ikumi na iwi'], + 'months_short' => ['Imb', 'Kaw', 'Kad', 'Kan', 'Kas', 'Kar', 'Mfu', 'Wun', 'Ike', 'Iku', 'Imw', 'Iwi'], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/de.php b/vendor/nesbot/carbon/src/Carbon/Lang/de.php new file mode 100644 index 0000000..3b70750 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/de.php @@ -0,0 +1,117 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Michael Hohl + * - sheriffmarley + * - dennisoderwald + * - Timo + * - Karag2006 + * - Pete Scopes (pdscopes) + */ +return [ + 'year' => ':count Jahr|:count Jahre', + 'a_year' => 'ein Jahr|:count Jahre', + 'y' => ':count J.', + 'month' => ':count Monat|:count Monate', + 'a_month' => 'ein Monat|:count Monate', + 'm' => ':count Mon.', + 'week' => ':count Woche|:count Wochen', + 'a_week' => 'eine Woche|:count Wochen', + 'w' => ':count Wo.', + 'day' => ':count Tag|:count Tage', + 'a_day' => 'ein Tag|:count Tage', + 'd' => ':count Tg.', + 'hour' => ':count Stunde|:count Stunden', + 'a_hour' => 'eine Stunde|:count Stunden', + 'h' => ':count Std.', + 'minute' => ':count Minute|:count Minuten', + 'a_minute' => 'eine Minute|:count Minuten', + 'min' => ':count Min.', + 'second' => ':count Sekunde|:count Sekunden', + 'a_second' => 'ein paar Sekunden|:count Sekunden', + 's' => ':count Sek.', + 'millisecond' => ':count Millisekunde|:count Millisekunden', + 'a_millisecond' => 'eine Millisekunde|:count Millisekunden', + 'ms' => ':countms', + 'microsecond' => ':count Mikrosekunde|:count Mikrosekunden', + 'a_microsecond' => 'eine Mikrosekunde|:count Mikrosekunden', + 'µs' => ':countµs', + 'ago' => 'vor :time', + 'from_now' => 'in :time', + 'after' => ':time später', + 'before' => ':time zuvor', + + 'year_from_now' => ':count Jahr|:count Jahren', + 'month_from_now' => ':count Monat|:count Monaten', + 'week_from_now' => ':count Woche|:count Wochen', + 'day_from_now' => ':count Tag|:count Tagen', + 'year_ago' => ':count Jahr|:count Jahren', + 'month_ago' => ':count Monat|:count Monaten', + 'week_ago' => ':count Woche|:count Wochen', + 'day_ago' => ':count Tag|:count Tagen', + 'a_year_from_now' => 'ein Jahr|:count Jahren', + 'a_month_from_now' => 'ein Monat|:count Monaten', + 'a_week_from_now' => 'eine Woche|:count Wochen', + 'a_day_from_now' => 'ein Tag|:count Tagen', + 'a_year_ago' => 'ein Jahr|:count Jahren', + 'a_month_ago' => 'ein Monat|:count Monaten', + 'a_week_ago' => 'eine Woche|:count Wochen', + 'a_day_ago' => 'ein Tag|:count Tagen', + + 'diff_now' => 'Gerade eben', + 'diff_today' => 'heute', + 'diff_today_regexp' => 'heute(?:\\s+um)?', + 'diff_yesterday' => 'Gestern', + 'diff_yesterday_regexp' => 'gestern(?:\\s+um)?', + 'diff_tomorrow' => 'Morgen', + 'diff_tomorrow_regexp' => 'morgen(?:\\s+um)?', + 'diff_before_yesterday' => 'Vorgestern', + 'diff_after_tomorrow' => 'Übermorgen', + + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D. MMMM YYYY', + 'LLL' => 'D. MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D. MMMM YYYY HH:mm', + ], + + 'calendar' => [ + 'sameDay' => '[heute um] LT [Uhr]', + 'nextDay' => '[morgen um] LT [Uhr]', + 'nextWeek' => 'dddd [um] LT [Uhr]', + 'lastDay' => '[gestern um] LT [Uhr]', + 'lastWeek' => '[letzten] dddd [um] LT [Uhr]', + 'sameElse' => 'L', + ], + + 'months' => ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'], + 'months_short' => ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'], + 'weekdays' => ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'], + 'weekdays_short' => ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'], + 'weekdays_min' => ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'], + 'ordinal' => ':number.', + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' und '], + 'ordinal_words' => [ + 'of' => 'im', + 'first' => 'erster', + 'second' => 'zweiter', + 'third' => 'dritter', + 'fourth' => 'vierten', + 'fifth' => 'fünfter', + 'last' => 'letzten', + ], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/de_AT.php b/vendor/nesbot/carbon/src/Carbon/Lang/de_AT.php new file mode 100644 index 0000000..a2ea4c0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/de_AT.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - sheriffmarley + * - Timo + * - Michael Hohl + * - Namoshek + * - Bernhard Baumrock (BernhardBaumrock) + */ +return array_replace_recursive(require __DIR__.'/de.php', [ + 'months' => [ + 0 => 'Jänner', + ], + 'months_short' => [ + 0 => 'Jän', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/de_BE.php b/vendor/nesbot/carbon/src/Carbon/Lang/de_BE.php new file mode 100644 index 0000000..8ed8dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/de_BE.php @@ -0,0 +1,20 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/de.php', [ + 'formats' => [ + 'L' => 'YYYY-MM-DD', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/de_CH.php b/vendor/nesbot/carbon/src/Carbon/Lang/de_CH.php new file mode 100644 index 0000000..a869ab4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/de_CH.php @@ -0,0 +1,20 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - sheriffmarley + * - Timo + * - Michael Hohl + */ +return array_replace_recursive(require __DIR__.'/de.php', [ + 'weekdays_short' => ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/de_DE.php b/vendor/nesbot/carbon/src/Carbon/Lang/de_DE.php new file mode 100644 index 0000000..fb1209d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/de_DE.php @@ -0,0 +1,16 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org + */ +return require __DIR__.'/de.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/de_IT.php b/vendor/nesbot/carbon/src/Carbon/Lang/de_IT.php new file mode 100644 index 0000000..604a856 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/de_IT.php @@ -0,0 +1,16 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Matthias Dieter Wallno:fer libc-locales@sourceware.org + */ +return require __DIR__.'/de.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/de_LI.php b/vendor/nesbot/carbon/src/Carbon/Lang/de_LI.php new file mode 100644 index 0000000..03e606a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/de_LI.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/de.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/de_LU.php b/vendor/nesbot/carbon/src/Carbon/Lang/de_LU.php new file mode 100644 index 0000000..8ed8dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/de_LU.php @@ -0,0 +1,20 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/de.php', [ + 'formats' => [ + 'L' => 'YYYY-MM-DD', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dje.php b/vendor/nesbot/carbon/src/Carbon/Lang/dje.php new file mode 100644 index 0000000..74b7ac1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/dje.php @@ -0,0 +1,40 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['Subbaahi', 'Zaarikay b'], + 'weekdays' => ['Alhadi', 'Atinni', 'Atalaata', 'Alarba', 'Alhamisi', 'Alzuma', 'Asibti'], + 'weekdays_short' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'], + 'weekdays_min' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'], + 'months' => ['Žanwiye', 'Feewiriye', 'Marsi', 'Awiril', 'Me', 'Žuweŋ', 'Žuyye', 'Ut', 'Sektanbur', 'Oktoobur', 'Noowanbur', 'Deesanbur'], + 'months_short' => ['Žan', 'Fee', 'Mar', 'Awi', 'Me', 'Žuw', 'Žuy', 'Ut', 'Sek', 'Okt', 'Noo', 'Dee'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM, YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + + 'year' => ':count hari', // less reliable + 'y' => ':count hari', // less reliable + 'a_year' => ':count hari', // less reliable + + 'week' => ':count alzuma', // less reliable + 'w' => ':count alzuma', // less reliable + 'a_week' => ':count alzuma', // less reliable + + 'second' => ':count atinni', // less reliable + 's' => ':count atinni', // less reliable + 'a_second' => ':count atinni', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/doi.php b/vendor/nesbot/carbon/src/Carbon/Lang/doi.php new file mode 100644 index 0000000..cb679c5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/doi.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/doi_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/doi_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/doi_IN.php new file mode 100644 index 0000000..d359721 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/doi_IN.php @@ -0,0 +1,31 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Red Hat Pune libc-alpha@sourceware.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'एप्रैल', 'मेई', 'जून', 'जूलै', 'अगस्त', 'सितंबर', 'अक्तूबर', 'नवंबर', 'दिसंबर'], + 'months_short' => ['जनवरी', 'फरवरी', 'मार्च', 'एप्रैल', 'मेई', 'जून', 'जूलै', 'अगस्त', 'सितंबर', 'अक्तूबर', 'नवंबर', 'दिसंबर'], + 'weekdays' => ['ऐतबार', 'सोमबार', 'मंगलबर', 'बुधबार', 'बीरबार', 'शुक्करबार', 'श्नीचरबार'], + 'weekdays_short' => ['ऐत', 'सोम', 'मंगल', 'बुध', 'बीर', 'शुक्कर', 'श्नीचर'], + 'weekdays_min' => ['ऐत', 'सोम', 'मंगल', 'बुध', 'बीर', 'शुक्कर', 'श्नीचर'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['सञं', 'सबेर'], + + 'second' => ':count सङार', // less reliable + 's' => ':count सङार', // less reliable + 'a_second' => ':count सङार', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dsb.php b/vendor/nesbot/carbon/src/Carbon/Lang/dsb.php new file mode 100644 index 0000000..1d214d5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/dsb.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/dsb_DE.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dsb_DE.php b/vendor/nesbot/carbon/src/Carbon/Lang/dsb_DE.php new file mode 100644 index 0000000..1b94187 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/dsb_DE.php @@ -0,0 +1,60 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Information from Michael Wolf bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'DD. MMMM YYYY', + 'LLL' => 'DD. MMMM, HH:mm [góź.]', + 'LLLL' => 'dddd, DD. MMMM YYYY, HH:mm [góź.]', + ], + 'months' => ['januara', 'februara', 'měrca', 'apryla', 'maja', 'junija', 'julija', 'awgusta', 'septembra', 'oktobra', 'nowembra', 'decembra'], + 'months_short' => ['Jan', 'Feb', 'Měr', 'Apr', 'Maj', 'Jun', 'Jul', 'Awg', 'Sep', 'Okt', 'Now', 'Dec'], + 'weekdays' => ['Njeźela', 'Pónjeźele', 'Wałtora', 'Srjoda', 'Stwórtk', 'Pětk', 'Sobota'], + 'weekdays_short' => ['Nj', 'Pó', 'Wa', 'Sr', 'St', 'Pě', 'So'], + 'weekdays_min' => ['Nj', 'Pó', 'Wa', 'Sr', 'St', 'Pě', 'So'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + + 'year' => ':count lěto', + 'y' => ':count lěto', + 'a_year' => ':count lěto', + + 'month' => ':count mjasec', + 'm' => ':count mjasec', + 'a_month' => ':count mjasec', + + 'week' => ':count tyźeń', + 'w' => ':count tyźeń', + 'a_week' => ':count tyźeń', + + 'day' => ':count źeń', + 'd' => ':count źeń', + 'a_day' => ':count źeń', + + 'hour' => ':count góźina', + 'h' => ':count góźina', + 'a_hour' => ':count góźina', + + 'minute' => ':count minuta', + 'min' => ':count minuta', + 'a_minute' => ':count minuta', + + 'second' => ':count drugi', + 's' => ':count drugi', + 'a_second' => ':count drugi', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dua.php b/vendor/nesbot/carbon/src/Carbon/Lang/dua.php new file mode 100644 index 0000000..55e5c7c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/dua.php @@ -0,0 +1,56 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['idiɓa', 'ebyámu'], + 'weekdays' => ['éti', 'mɔ́sú', 'kwasú', 'mukɔ́sú', 'ŋgisú', 'ɗónɛsú', 'esaɓasú'], + 'weekdays_short' => ['ét', 'mɔ́s', 'kwa', 'muk', 'ŋgi', 'ɗón', 'esa'], + 'weekdays_min' => ['ét', 'mɔ́s', 'kwa', 'muk', 'ŋgi', 'ɗón', 'esa'], + 'months' => ['dimɔ́di', 'ŋgɔndɛ', 'sɔŋɛ', 'diɓáɓá', 'emiasele', 'esɔpɛsɔpɛ', 'madiɓɛ́díɓɛ́', 'diŋgindi', 'nyɛtɛki', 'mayésɛ́', 'tiníní', 'eláŋgɛ́'], + 'months_short' => ['di', 'ŋgɔn', 'sɔŋ', 'diɓ', 'emi', 'esɔ', 'mad', 'diŋ', 'nyɛt', 'may', 'tin', 'elá'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + + 'year' => ':count ma mbu', // less reliable + 'y' => ':count ma mbu', // less reliable + 'a_year' => ':count ma mbu', // less reliable + + 'month' => ':count myo̱di', // less reliable + 'm' => ':count myo̱di', // less reliable + 'a_month' => ':count myo̱di', // less reliable + + 'week' => ':count woki', // less reliable + 'w' => ':count woki', // less reliable + 'a_week' => ':count woki', // less reliable + + 'day' => ':count buńa', // less reliable + 'd' => ':count buńa', // less reliable + 'a_day' => ':count buńa', // less reliable + + 'hour' => ':count ma awa', // less reliable + 'h' => ':count ma awa', // less reliable + 'a_hour' => ':count ma awa', // less reliable + + 'minute' => ':count minuti', // less reliable + 'min' => ':count minuti', // less reliable + 'a_minute' => ':count minuti', // less reliable + + 'second' => ':count maba', // less reliable + 's' => ':count maba', // less reliable + 'a_second' => ':count maba', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dv.php b/vendor/nesbot/carbon/src/Carbon/Lang/dv.php new file mode 100644 index 0000000..4b8d7e1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/dv.php @@ -0,0 +1,89 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +$months = [ + 'ޖެނުއަރީ', + 'ފެބްރުއަރީ', + 'މާރިޗު', + 'އޭޕްރީލު', + 'މޭ', + 'ޖޫން', + 'ޖުލައި', + 'އޯގަސްޓު', + 'ސެޕްޓެމްބަރު', + 'އޮކްޓޯބަރު', + 'ނޮވެމްބަރު', + 'ޑިސެމްބަރު', +]; + +$weekdays = [ + 'އާދިއްތަ', + 'ހޯމަ', + 'އަންގާރަ', + 'ބުދަ', + 'ބުރާސްފަތި', + 'ހުކުރު', + 'ހޮނިހިރު', +]; + +/* + * Authors: + * - Josh Soref + * - Jawish Hameed + */ +return [ + 'year' => ':count '.'އަހަރު', + 'a_year' => '{1}'.'އަހަރެއް'.'|:count '.'އަހަރު', + 'month' => ':count '.'މަސް', + 'a_month' => '{1}'.'މަހެއް'.'|:count '.'މަސް', + 'week' => ':count '.'ހަފްތާ', + 'a_week' => '{1}'.'ސިކުންތުކޮޅެއް'.'|:count '.'ހަފްތާ', + 'day' => ':count '.'ދުވަސް', + 'a_day' => '{1}'.'ދުވަހެއް'.'|:count '.'ދުވަސް', + 'hour' => ':count '.'ގަޑިއިރު', + 'a_hour' => '{1}'.'ގަޑިއިރެއް'.'|:count '.'ގަޑިއިރު', + 'minute' => ':count '.'މިނިޓު', + 'a_minute' => '{1}'.'މިނިޓެއް'.'|:count '.'މިނިޓު', + 'second' => ':count '.'ސިކުންތު', + 'a_second' => '{1}'.'ސިކުންތުކޮޅެއް'.'|:count '.'ސިކުންތު', + 'ago' => 'ކުރިން :time', + 'from_now' => 'ތެރޭގައި :time', + 'after' => ':time ފަހުން', + 'before' => ':time ކުރި', + 'diff_yesterday' => 'އިއްޔެ', + 'diff_today' => 'މިއަދު', + 'diff_tomorrow' => 'މާދަމާ', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[މިއަދު] LT', + 'nextDay' => '[މާދަމާ] LT', + 'nextWeek' => 'dddd LT', + 'lastDay' => '[އިއްޔެ] LT', + 'lastWeek' => '[ފާއިތުވި] dddd LT', + 'sameElse' => 'L', + ], + 'meridiem' => ['މކ', 'މފ'], + 'months' => $months, + 'months_short' => $months, + 'weekdays' => $weekdays, + 'weekdays_short' => $weekdays, + 'weekdays_min' => ['އާދި', 'ހޯމަ', 'އަން', 'ބުދަ', 'ބުރާ', 'ހުކު', 'ހޮނި'], + 'list' => [', ', ' އަދި '], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php b/vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php new file mode 100644 index 0000000..2668d5b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php @@ -0,0 +1,87 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ahmed Ali + */ + +$months = [ + 'ޖެނުއަރީ', + 'ފެބްރުއަރީ', + 'މާރިޗު', + 'އޭޕްރީލު', + 'މޭ', + 'ޖޫން', + 'ޖުލައި', + 'އޯގަސްޓު', + 'ސެޕްޓެމްބަރު', + 'އޮކްޓޯބަރު', + 'ނޮވެމްބަރު', + 'ޑިސެމްބަރު', +]; + +$weekdays = [ + 'އާދިއްތަ', + 'ހޯމަ', + 'އަންގާރަ', + 'ބުދަ', + 'ބުރާސްފަތި', + 'ހުކުރު', + 'ހޮނިހިރު', +]; + +return [ + 'year' => '{0}އަހަރެއް|[1,Inf]:count އަހަރު', + 'y' => '{0}އަހަރެއް|[1,Inf]:count އަހަރު', + 'month' => '{0}މައްސަރެއް|[1,Inf]:count މަސް', + 'm' => '{0}މައްސަރެއް|[1,Inf]:count މަސް', + 'week' => '{0}ހަފްތާއެއް|[1,Inf]:count ހަފްތާ', + 'w' => '{0}ހަފްތާއެއް|[1,Inf]:count ހަފްތާ', + 'day' => '{0}ދުވަސް|[1,Inf]:count ދުވަސް', + 'd' => '{0}ދުވަސް|[1,Inf]:count ދުވަސް', + 'hour' => '{0}ގަޑިއިރެއް|[1,Inf]:count ގަޑި', + 'h' => '{0}ގަޑިއިރެއް|[1,Inf]:count ގަޑި', + 'minute' => '{0}މިނެޓެއް|[1,Inf]:count މިނެޓް', + 'min' => '{0}މިނެޓެއް|[1,Inf]:count މިނެޓް', + 'second' => '{0}ސިކުންތެއް|[1,Inf]:count ސިކުންތު', + 's' => '{0}ސިކުންތެއް|[1,Inf]:count ސިކުންތު', + 'ago' => ':time ކުރިން', + 'from_now' => ':time ފަހުން', + 'after' => ':time ފަހުން', + 'before' => ':time ކުރި', + 'diff_yesterday' => 'އިއްޔެ', + 'diff_today' => 'މިއަދު', + 'diff_tomorrow' => 'މާދަމާ', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[މިއަދު] LT', + 'nextDay' => '[މާދަމާ] LT', + 'nextWeek' => 'dddd LT', + 'lastDay' => '[އިއްޔެ] LT', + 'lastWeek' => '[ފާއިތުވި] dddd LT', + 'sameElse' => 'L', + ], + 'meridiem' => ['މކ', 'މފ'], + 'months' => $months, + 'months_short' => $months, + 'weekdays' => $weekdays, + 'weekdays_short' => $weekdays, + 'weekdays_min' => ['އާދި', 'ހޯމަ', 'އަން', 'ބުދަ', 'ބުރާ', 'ހުކު', 'ހޮނި'], + 'list' => [', ', ' އަދި '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dyo.php b/vendor/nesbot/carbon/src/Carbon/Lang/dyo.php new file mode 100644 index 0000000..33082e6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/dyo.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'weekdays' => ['Dimas', 'Teneŋ', 'Talata', 'Alarbay', 'Aramisay', 'Arjuma', 'Sibiti'], + 'weekdays_short' => ['Dim', 'Ten', 'Tal', 'Ala', 'Ara', 'Arj', 'Sib'], + 'weekdays_min' => ['Dim', 'Ten', 'Tal', 'Ala', 'Ara', 'Arj', 'Sib'], + 'months' => ['Sanvie', 'Fébirie', 'Mars', 'Aburil', 'Mee', 'Sueŋ', 'Súuyee', 'Ut', 'Settembar', 'Oktobar', 'Novembar', 'Disambar'], + 'months_short' => ['Sa', 'Fe', 'Ma', 'Ab', 'Me', 'Su', 'Sú', 'Ut', 'Se', 'Ok', 'No', 'De'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dz.php b/vendor/nesbot/carbon/src/Carbon/Lang/dz.php new file mode 100644 index 0000000..cc17e69 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/dz.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/dz_BT.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/dz_BT.php b/vendor/nesbot/carbon/src/Carbon/Lang/dz_BT.php new file mode 100644 index 0000000..bfbcaf4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/dz_BT.php @@ -0,0 +1,43 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Sherubtse College bug-glibc@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'པསྱི་ལོYYཟལMMཚེསDD', + ], + 'months' => ['ཟླ་བ་དང་པ་', 'ཟླ་བ་གཉིས་པ་', 'ཟླ་བ་གསུམ་པ་', 'ཟླ་བ་བཞི་པ་', 'ཟླ་བ་ལྔ་ཕ་', 'ཟླ་བ་དྲུག་པ་', 'ཟླ་བ་བདུནཔ་', 'ཟླ་བ་བརྒྱད་པ་', 'ཟླ་བ་དགུ་པ་', 'ཟླ་བ་བཅུ་པ་', 'ཟླ་བ་བཅུ་གཅིག་པ་', 'ཟླ་བ་བཅུ་གཉིས་པ་'], + 'months_short' => ['ཟླ་༡', 'ཟླ་༢', 'ཟླ་༣', 'ཟླ་༤', 'ཟླ་༥', 'ཟླ་༦', 'ཟླ་༧', 'ཟླ་༨', 'ཟླ་༩', 'ཟླ་༡༠', 'ཟླ་༡༡', 'ཟླ་༡༢'], + 'weekdays' => ['གཟའ་ཟླ་བ་', 'གཟའ་མིག་དམར་', 'གཟའ་ལྷག་ཕ་', 'གཟའ་པུར་བུ་', 'གཟའ་པ་སངས་', 'གཟའ་སྤེན་ཕ་', 'གཟའ་ཉི་མ་'], + 'weekdays_short' => ['ཟླ་', 'མིར་', 'ལྷག་', 'པུར་', 'སངས་', 'སྤེན་', 'ཉི་'], + 'weekdays_min' => ['ཟླ་', 'མིར་', 'ལྷག་', 'པུར་', 'སངས་', 'སྤེན་', 'ཉི་'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['ངས་ཆ', 'ཕྱི་ཆ'], + + 'year' => ':count ཆརཔ', // less reliable + 'y' => ':count ཆརཔ', // less reliable + 'a_year' => ':count ཆརཔ', // less reliable + + 'month' => ':count ཟླ་བ', // less reliable + 'm' => ':count ཟླ་བ', // less reliable + 'a_month' => ':count ཟླ་བ', // less reliable + + 'day' => ':count ཉི', // less reliable + 'd' => ':count ཉི', // less reliable + 'a_day' => ':count ཉི', // less reliable + + 'second' => ':count ཆ', // less reliable + 's' => ':count ཆ', // less reliable + 'a_second' => ':count ཆ', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ebu.php b/vendor/nesbot/carbon/src/Carbon/Lang/ebu.php new file mode 100644 index 0000000..f60bc6f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ebu.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['KI', 'UT'], + 'weekdays' => ['Kiumia', 'Njumatatu', 'Njumaine', 'Njumatano', 'Aramithi', 'Njumaa', 'NJumamothii'], + 'weekdays_short' => ['Kma', 'Tat', 'Ine', 'Tan', 'Arm', 'Maa', 'NMM'], + 'weekdays_min' => ['Kma', 'Tat', 'Ine', 'Tan', 'Arm', 'Maa', 'NMM'], + 'months' => ['Mweri wa mbere', 'Mweri wa kaĩri', 'Mweri wa kathatũ', 'Mweri wa kana', 'Mweri wa gatano', 'Mweri wa gatantatũ', 'Mweri wa mũgwanja', 'Mweri wa kanana', 'Mweri wa kenda', 'Mweri wa ikũmi', 'Mweri wa ikũmi na ũmwe', 'Mweri wa ikũmi na Kaĩrĩ'], + 'months_short' => ['Mbe', 'Kai', 'Kat', 'Kan', 'Gat', 'Gan', 'Mug', 'Knn', 'Ken', 'Iku', 'Imw', 'Igi'], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ee.php b/vendor/nesbot/carbon/src/Carbon/Lang/ee.php new file mode 100644 index 0000000..f96c5c9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ee.php @@ -0,0 +1,56 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['ŋ', 'ɣ'], + 'weekdays' => ['kɔsiɖa', 'dzoɖa', 'blaɖa', 'kuɖa', 'yawoɖa', 'fiɖa', 'memleɖa'], + 'weekdays_short' => ['kɔs', 'dzo', 'bla', 'kuɖ', 'yaw', 'fiɖ', 'mem'], + 'weekdays_min' => ['kɔs', 'dzo', 'bla', 'kuɖ', 'yaw', 'fiɖ', 'mem'], + 'months' => ['dzove', 'dzodze', 'tedoxe', 'afɔfĩe', 'dama', 'masa', 'siamlɔm', 'deasiamime', 'anyɔnyɔ', 'kele', 'adeɛmekpɔxe', 'dzome'], + 'months_short' => ['dzv', 'dzd', 'ted', 'afɔ', 'dam', 'mas', 'sia', 'dea', 'any', 'kel', 'ade', 'dzm'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'a [ga] h:mm', + 'LTS' => 'a [ga] h:mm:ss', + 'L' => 'M/D/YYYY', + 'LL' => 'MMM D [lia], YYYY', + 'LLL' => 'a [ga] h:mm MMMM D [lia] YYYY', + 'LLLL' => 'a [ga] h:mm dddd, MMMM D [lia] YYYY', + ], + + 'year' => 'ƒe :count', + 'y' => 'ƒe :count', + 'a_year' => 'ƒe :count', + + 'month' => 'ɣleti :count', + 'm' => 'ɣleti :count', + 'a_month' => 'ɣleti :count', + + 'week' => 'kwasiɖa :count', + 'w' => 'kwasiɖa :count', + 'a_week' => 'kwasiɖa :count', + + 'day' => 'ŋkeke :count', + 'd' => 'ŋkeke :count', + 'a_day' => 'ŋkeke :count', + + 'hour' => 'gaƒoƒo :count', + 'h' => 'gaƒoƒo :count', + 'a_hour' => 'gaƒoƒo :count', + + 'minute' => 'miniti :count', // less reliable + 'min' => 'miniti :count', // less reliable + 'a_minute' => 'miniti :count', // less reliable + + 'second' => 'sɛkɛnd :count', // less reliable + 's' => 'sɛkɛnd :count', // less reliable + 'a_second' => 'sɛkɛnd :count', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ee_TG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ee_TG.php new file mode 100644 index 0000000..7a8b36c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ee_TG.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ee.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'LLL' => 'HH:mm MMMM D [lia] YYYY', + 'LLLL' => 'HH:mm dddd, MMMM D [lia] YYYY', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/el.php b/vendor/nesbot/carbon/src/Carbon/Lang/el.php new file mode 100644 index 0000000..7c40f9c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/el.php @@ -0,0 +1,93 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Alessandro Di Felice + * - François B + * - Tim Fish + * - Gabriel Monteagudo + * - JD Isaacks + * - yiannisdesp + * - Ilias Kasmeridis (iliaskasm) + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => ':count χρόνος|:count χρόνια', + 'a_year' => 'ένας χρόνος|:count χρόνια', + 'y' => ':count χρ.', + 'month' => ':count μήνας|:count μήνες', + 'a_month' => 'ένας μήνας|:count μήνες', + 'm' => ':count μήν.', + 'week' => ':count εβδομάδα|:count εβδομάδες', + 'a_week' => 'μια εβδομάδα|:count εβδομάδες', + 'w' => ':count εβδ.', + 'day' => ':count μέρα|:count μέρες', + 'a_day' => 'μία μέρα|:count μέρες', + 'd' => ':count μέρ.', + 'hour' => ':count ώρα|:count ώρες', + 'a_hour' => 'μία ώρα|:count ώρες', + 'h' => ':count ώρα|:count ώρες', + 'minute' => ':count λεπτό|:count λεπτά', + 'a_minute' => 'ένα λεπτό|:count λεπτά', + 'min' => ':count λεπ.', + 'second' => ':count δευτερόλεπτο|:count δευτερόλεπτα', + 'a_second' => 'λίγα δευτερόλεπτα|:count δευτερόλεπτα', + 's' => ':count δευ.', + 'ago' => 'πριν :time', + 'from_now' => 'σε :time', + 'after' => ':time μετά', + 'before' => ':time πριν', + 'diff_now' => 'τώρα', + 'diff_today' => 'Σήμερα', + 'diff_today_regexp' => 'Σήμερα(?:\\s+{})?', + 'diff_yesterday' => 'χθες', + 'diff_yesterday_regexp' => 'Χθες(?:\\s+{})?', + 'diff_tomorrow' => 'αύριο', + 'diff_tomorrow_regexp' => 'Αύριο(?:\\s+{})?', + 'formats' => [ + 'LT' => 'h:mm A', + 'LTS' => 'h:mm:ss A', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm A', + 'LLLL' => 'dddd, D MMMM YYYY h:mm A', + ], + 'calendar' => [ + 'sameDay' => '[Σήμερα {}] LT', + 'nextDay' => '[Αύριο {}] LT', + 'nextWeek' => 'dddd [{}] LT', + 'lastDay' => '[Χθες {}] LT', + 'lastWeek' => function (CarbonInterface $current) { + switch ($current->dayOfWeek) { + case 6: + return '[το προηγούμενο] dddd [{}] LT'; + default: + return '[την προηγούμενη] dddd [{}] LT'; + } + }, + 'sameElse' => 'L', + ], + 'ordinal' => ':numberη', + 'meridiem' => ['ΠΜ', 'ΜΜ', 'πμ', 'μμ'], + 'months' => ['Ιανουαρίου', 'Φεβρουαρίου', 'Μαρτίου', 'Απριλίου', 'Μαΐου', 'Ιουνίου', 'Ιουλίου', 'Αυγούστου', 'Σεπτεμβρίου', 'Οκτωβρίου', 'Νοεμβρίου', 'Δεκεμβρίου'], + 'months_standalone' => ['Ιανουάριος', 'Φεβρουάριος', 'Μάρτιος', 'Απρίλιος', 'Μάιος', 'Ιούνιος', 'Ιούλιος', 'Αύγουστος', 'Σεπτέμβριος', 'Οκτώβριος', 'Νοέμβριος', 'Δεκέμβριος'], + 'months_regexp' => '/(D[oD]?[\s,]+MMMM|L{2,4}|l{2,4})/', + 'months_short' => ['Ιαν', 'Φεβ', 'Μαρ', 'Απρ', 'Μαϊ', 'Ιουν', 'Ιουλ', 'Αυγ', 'Σεπ', 'Οκτ', 'Νοε', 'Δεκ'], + 'weekdays' => ['Κυριακή', 'Δευτέρα', 'Τρίτη', 'Τετάρτη', 'Πέμπτη', 'Παρασκευή', 'Σάββατο'], + 'weekdays_short' => ['Κυρ', 'Δευ', 'Τρι', 'Τετ', 'Πεμ', 'Παρ', 'Σαβ'], + 'weekdays_min' => ['Κυ', 'Δε', 'Τρ', 'Τε', 'Πε', 'Πα', 'Σα'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' και '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/el_CY.php b/vendor/nesbot/carbon/src/Carbon/Lang/el_CY.php new file mode 100644 index 0000000..8a693c1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/el_CY.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Greek Debian Translation Team bug-glibc@gnu.org + */ +return array_replace_recursive(require __DIR__.'/el.php', [ + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/el_GR.php b/vendor/nesbot/carbon/src/Carbon/Lang/el_GR.php new file mode 100644 index 0000000..df196af --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/el_GR.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/el.php', [ + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en.php b/vendor/nesbot/carbon/src/Carbon/Lang/en.php new file mode 100644 index 0000000..f81f617 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en.php @@ -0,0 +1,87 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Milos Sakovic + * - Paul + * - Pete Scopes (pdscopes) + */ +return [ + /* + * {1}, {0} and ]1,Inf[ are not needed as it's the default for English pluralization. + * But as some languages are using en.php as a fallback, it's better to specify it + * explicitly so those languages also fallback to English pluralization when a unit + * is missing. + */ + 'year' => '{1}:count year|{0}:count years|]1,Inf[:count years', + 'a_year' => '{1}a year|{0}:count years|]1,Inf[:count years', + 'y' => '{1}:countyr|{0}:countyrs|]1,Inf[:countyrs', + 'month' => '{1}:count month|{0}:count months|]1,Inf[:count months', + 'a_month' => '{1}a month|{0}:count months|]1,Inf[:count months', + 'm' => '{1}:countmo|{0}:countmos|]1,Inf[:countmos', + 'week' => '{1}:count week|{0}:count weeks|]1,Inf[:count weeks', + 'a_week' => '{1}a week|{0}:count weeks|]1,Inf[:count weeks', + 'w' => ':countw', + 'day' => '{1}:count day|{0}:count days|]1,Inf[:count days', + 'a_day' => '{1}a day|{0}:count days|]1,Inf[:count days', + 'd' => ':countd', + 'hour' => '{1}:count hour|{0}:count hours|]1,Inf[:count hours', + 'a_hour' => '{1}an hour|{0}:count hours|]1,Inf[:count hours', + 'h' => ':counth', + 'minute' => '{1}:count minute|{0}:count minutes|]1,Inf[:count minutes', + 'a_minute' => '{1}a minute|{0}:count minutes|]1,Inf[:count minutes', + 'min' => ':countm', + 'second' => '{1}:count second|{0}:count seconds|]1,Inf[:count seconds', + 'a_second' => '{1}a few seconds|{0}:count seconds|]1,Inf[:count seconds', + 's' => ':counts', + 'millisecond' => '{1}:count millisecond|{0}:count milliseconds|]1,Inf[:count milliseconds', + 'a_millisecond' => '{1}a millisecond|{0}:count milliseconds|]1,Inf[:count milliseconds', + 'ms' => ':countms', + 'microsecond' => '{1}:count microsecond|{0}:count microseconds|]1,Inf[:count microseconds', + 'a_microsecond' => '{1}a microsecond|{0}:count microseconds|]1,Inf[:count microseconds', + 'µs' => ':countµs', + 'ago' => ':time ago', + 'from_now' => ':time from now', + 'after' => ':time after', + 'before' => ':time before', + 'diff_now' => 'just now', + 'diff_today' => 'today', + 'diff_yesterday' => 'yesterday', + 'diff_tomorrow' => 'tomorrow', + 'diff_before_yesterday' => 'before yesterday', + 'diff_after_tomorrow' => 'after tomorrow', + 'period_recurrences' => '{1}once|{0}:count times|]1,Inf[:count times', + 'period_interval' => 'every :interval', + 'period_start_date' => 'from :date', + 'period_end_date' => 'to :date', + 'months' => ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + 'weekdays' => ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], + 'weekdays_short' => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + 'weekdays_min' => ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'], + 'ordinal' => function ($number) { + $lastDigit = $number % 10; + + return $number.( + ((int) ($number % 100 / 10) === 1) ? 'th' : ( + ($lastDigit === 1) ? 'st' : ( + ($lastDigit === 2) ? 'nd' : ( + ($lastDigit === 3) ? 'rd' : 'th' + ) + ) + ) + ); + }, + 'list' => [', ', ' and '], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_001.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_001.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_001.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_150.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_150.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_150.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_AG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_AG.php new file mode 100644 index 0000000..2c1c64f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_AG.php @@ -0,0 +1,21 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_AI.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_AI.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_AI.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_AS.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_AS.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_AS.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_AT.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_AT.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_AT.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_AU.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_AU.php new file mode 100644 index 0000000..f16bd4f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_AU.php @@ -0,0 +1,31 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Kunal Marwaha + * - François B + * - Mayank Badola + * - JD Isaacks + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'from_now' => 'in :time', + 'formats' => [ + 'LT' => 'h:mm A', + 'LTS' => 'h:mm:ss A', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm A', + 'LLLL' => 'dddd, D MMMM YYYY h:mm A', + ], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_BB.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_BB.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_BB.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_BE.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_BE.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_BE.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_BI.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_BI.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_BI.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_BM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_BM.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_BM.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_BS.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_BS.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_BS.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_BW.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_BW.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_BW.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_BZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_BZ.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_BZ.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_CA.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_CA.php new file mode 100644 index 0000000..e656086 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_CA.php @@ -0,0 +1,29 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - Zhan Tong Zhang + * - Mayank Badola + * - JD Isaacks + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'from_now' => 'in :time', + 'formats' => [ + 'LT' => 'h:mm A', + 'LTS' => 'h:mm:ss A', + 'L' => 'YYYY-MM-DD', + 'LL' => 'MMMM D, YYYY', + 'LLL' => 'MMMM D, YYYY h:mm A', + 'LLLL' => 'dddd, MMMM D, YYYY h:mm A', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_CC.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_CC.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_CC.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_CH.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_CH.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_CH.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_CK.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_CK.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_CK.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_CM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_CM.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_CM.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_CX.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_CX.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_CX.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_CY.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_CY.php new file mode 100644 index 0000000..a44c350 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_CY.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - NehaGautam + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'from_now' => 'in :time', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD-MM-YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_DE.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_DE.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_DE.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_DG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_DG.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_DG.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_DK.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_DK.php new file mode 100644 index 0000000..9e8a8c6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_DK.php @@ -0,0 +1,22 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Danish Standards Association bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'YYYY-MM-DD', + ], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_DM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_DM.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_DM.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_ER.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_ER.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_ER.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_FI.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_FI.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_FI.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_FJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_FJ.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_FJ.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_FK.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_FK.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_FK.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_FM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_FM.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_FM.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_GB.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_GB.php new file mode 100644 index 0000000..67d9fd6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_GB.php @@ -0,0 +1,30 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - Mayank Badola + * - JD Isaacks + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'from_now' => 'in :time', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_GD.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_GD.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_GD.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_GG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_GG.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_GG.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_GH.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_GH.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_GH.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_GI.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_GI.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_GI.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_GM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_GM.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_GM.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_GU.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_GU.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_GU.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_GY.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_GY.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_GY.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_HK.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_HK.php new file mode 100644 index 0000000..34aae98 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_HK.php @@ -0,0 +1,18 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_IE.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_IE.php new file mode 100644 index 0000000..c8d3c2f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_IE.php @@ -0,0 +1,31 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Martin McWhorter + * - François B + * - Chris Cartlidge + * - JD Isaacks + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'from_now' => 'in :time', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD-MM-YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_IL.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_IL.php new file mode 100644 index 0000000..e607924 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_IL.php @@ -0,0 +1,29 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Yoav Amit + * - François B + * - Mayank Badola + * - JD Isaacks + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'from_now' => 'in :time', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_IM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_IM.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_IM.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_IN.php new file mode 100644 index 0000000..00414e9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_IN.php @@ -0,0 +1,26 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YY', + 'LL' => 'MMMM DD, YYYY', + 'LLL' => 'DD MMM HH:mm', + 'LLLL' => 'MMMM DD, YYYY HH:mm', + ], + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_IO.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_IO.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_IO.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_ISO.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_ISO.php new file mode 100644 index 0000000..11457b0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_ISO.php @@ -0,0 +1,21 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY-MM-dd', + 'LL' => 'YYYY MMM D', + 'LLL' => 'YYYY MMMM D HH:mm', + 'LLLL' => 'dddd, YYYY MMMM DD HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_JE.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_JE.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_JE.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_JM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_JM.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_JM.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_KE.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_KE.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_KE.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_KI.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_KI.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_KI.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_KN.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_KN.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_KN.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_KY.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_KY.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_KY.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_LC.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_LC.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_LC.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_LR.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_LR.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_LR.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_LS.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_LS.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_LS.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MG.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_MG.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MH.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MH.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_MH.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MO.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MO.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_MO.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MP.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MP.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_MP.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MS.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MS.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_MS.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MT.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MT.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_MT.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MU.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MU.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_MU.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MW.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MW.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_MW.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_MY.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_MY.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_MY.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_NA.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_NA.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_NA.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_NF.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_NF.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_NF.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_NG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_NG.php new file mode 100644 index 0000000..67bceaa --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_NG.php @@ -0,0 +1,18 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_NL.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_NL.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_NL.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_NR.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_NR.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_NR.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_NU.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_NU.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_NU.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_NZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_NZ.php new file mode 100644 index 0000000..6a206a0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_NZ.php @@ -0,0 +1,31 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - Mayank Badola + * - Luke McGregor + * - JD Isaacks + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'from_now' => 'in :time', + 'formats' => [ + 'LT' => 'h:mm A', + 'LTS' => 'h:mm:ss A', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm A', + 'LLLL' => 'dddd, D MMMM YYYY h:mm A', + ], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_PG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_PG.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_PG.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_PH.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_PH.php new file mode 100644 index 0000000..34aae98 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_PH.php @@ -0,0 +1,18 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_PK.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_PK.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_PK.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_PN.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_PN.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_PN.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_PR.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_PR.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_PR.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_PW.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_PW.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_PW.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_RW.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_RW.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_RW.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SB.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SB.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_SB.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SC.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SC.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_SC.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SD.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SD.php new file mode 100644 index 0000000..c4e2557 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_SD.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 6, + 'weekend' => [5, 6], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SE.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SE.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_SE.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SG.php new file mode 100644 index 0000000..5ee9524 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_SG.php @@ -0,0 +1,24 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'from_now' => 'in :time', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SH.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SH.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_SH.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SI.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SI.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_SI.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SL.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SL.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_SL.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SS.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SS.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_SS.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SX.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SX.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_SX.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_SZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_SZ.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_SZ.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_TC.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_TC.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_TC.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_TK.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_TK.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_TK.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_TO.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_TO.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_TO.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_TT.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_TT.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_TT.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_TV.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_TV.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_TV.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_TZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_TZ.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_TZ.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_UG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_UG.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_UG.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_UM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_UM.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_UM.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_US.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_US.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_US.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_VC.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_VC.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_VC.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_VG.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_VG.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_VG.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_VI.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_VI.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_VI.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_VU.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_VU.php new file mode 100644 index 0000000..e2dd81d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_VU.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_WS.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_WS.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_WS.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_ZA.php new file mode 100644 index 0000000..48ea947 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_ZA.php @@ -0,0 +1,26 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YY', + 'LL' => 'MMMM DD, YYYY', + 'LLL' => 'DD MMM HH:mm', + 'LLLL' => 'MMMM DD, YYYY HH:mm', + ], + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_ZM.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_ZM.php new file mode 100644 index 0000000..d8a8cb5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_ZM.php @@ -0,0 +1,22 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - ANLoc Martin Benjamin locales@africanlocalization.net + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en_ZW.php b/vendor/nesbot/carbon/src/Carbon/Lang/en_ZW.php new file mode 100644 index 0000000..f086dc6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en_ZW.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/en.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/eo.php b/vendor/nesbot/carbon/src/Carbon/Lang/eo.php new file mode 100644 index 0000000..7c2efba --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/eo.php @@ -0,0 +1,77 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - François B + * - Mia Nordentoft + * - JD Isaacks + */ +return [ + 'year' => ':count jaro|:count jaroj', + 'a_year' => 'jaro|:count jaroj', + 'y' => ':count j.', + 'month' => ':count monato|:count monatoj', + 'a_month' => 'monato|:count monatoj', + 'm' => ':count mo.', + 'week' => ':count semajno|:count semajnoj', + 'a_week' => 'semajno|:count semajnoj', + 'w' => ':count sem.', + 'day' => ':count tago|:count tagoj', + 'a_day' => 'tago|:count tagoj', + 'd' => ':count t.', + 'hour' => ':count horo|:count horoj', + 'a_hour' => 'horo|:count horoj', + 'h' => ':count h.', + 'minute' => ':count minuto|:count minutoj', + 'a_minute' => 'minuto|:count minutoj', + 'min' => ':count min.', + 'second' => ':count sekundo|:count sekundoj', + 'a_second' => 'sekundoj|:count sekundoj', + 's' => ':count sek.', + 'ago' => 'antaŭ :time', + 'from_now' => 'post :time', + 'after' => ':time poste', + 'before' => ':time antaŭe', + 'diff_yesterday' => 'Hieraŭ', + 'diff_yesterday_regexp' => 'Hieraŭ(?:\\s+je)?', + 'diff_today' => 'Hodiaŭ', + 'diff_today_regexp' => 'Hodiaŭ(?:\\s+je)?', + 'diff_tomorrow' => 'Morgaŭ', + 'diff_tomorrow_regexp' => 'Morgaŭ(?:\\s+je)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY-MM-DD', + 'LL' => 'D[-a de] MMMM, YYYY', + 'LLL' => 'D[-a de] MMMM, YYYY HH:mm', + 'LLLL' => 'dddd, [la] D[-a de] MMMM, YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Hodiaŭ je] LT', + 'nextDay' => '[Morgaŭ je] LT', + 'nextWeek' => 'dddd [je] LT', + 'lastDay' => '[Hieraŭ je] LT', + 'lastWeek' => '[pasinta] dddd [je] LT', + 'sameElse' => 'L', + ], + 'ordinal' => ':numbera', + 'meridiem' => ['a.t.m.', 'p.t.m.'], + 'months' => ['januaro', 'februaro', 'marto', 'aprilo', 'majo', 'junio', 'julio', 'aŭgusto', 'septembro', 'oktobro', 'novembro', 'decembro'], + 'months_short' => ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aŭg', 'sep', 'okt', 'nov', 'dec'], + 'weekdays' => ['dimanĉo', 'lundo', 'mardo', 'merkredo', 'ĵaŭdo', 'vendredo', 'sabato'], + 'weekdays_short' => ['dim', 'lun', 'mard', 'merk', 'ĵaŭ', 'ven', 'sab'], + 'weekdays_min' => ['di', 'lu', 'ma', 'me', 'ĵa', 've', 'sa'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' kaj '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es.php b/vendor/nesbot/carbon/src/Carbon/Lang/es.php new file mode 100644 index 0000000..1c4fcfd --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es.php @@ -0,0 +1,121 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Kunal Marwaha + * - kostas + * - François B + * - Tim Fish + * - Claire Coloma + * - Steven Heinrich + * - JD Isaacks + * - Raphael Amorim + * - Jorge Y. Castillo + * - Víctor Díaz + * - Diego + * - Sebastian Thierer + * - quinterocesar + * - Daniel Commesse Liévanos (danielcommesse) + * - Pete Scopes (pdscopes) + * - gam04 + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => ':count año|:count años', + 'a_year' => 'un año|:count años', + 'y' => ':count año|:count años', + 'month' => ':count mes|:count meses', + 'a_month' => 'un mes|:count meses', + 'm' => ':count mes|:count meses', + 'week' => ':count semana|:count semanas', + 'a_week' => 'una semana|:count semanas', + 'w' => ':countsem', + 'day' => ':count día|:count días', + 'a_day' => 'un día|:count días', + 'd' => ':countd', + 'hour' => ':count hora|:count horas', + 'a_hour' => 'una hora|:count horas', + 'h' => ':counth', + 'minute' => ':count minuto|:count minutos', + 'a_minute' => 'un minuto|:count minutos', + 'min' => ':countm', + 'second' => ':count segundo|:count segundos', + 'a_second' => 'unos segundos|:count segundos', + 's' => ':counts', + 'millisecond' => ':count milisegundo|:count milisegundos', + 'a_millisecond' => 'un milisegundo|:count milisegundos', + 'ms' => ':countms', + 'microsecond' => ':count microsegundo|:count microsegundos', + 'a_microsecond' => 'un microsegundo|:count microsegundos', + 'µs' => ':countµs', + 'ago' => 'hace :time', + 'from_now' => 'en :time', + 'after' => ':time después', + 'before' => ':time antes', + 'diff_now' => 'ahora mismo', + 'diff_today' => 'hoy', + 'diff_today_regexp' => 'hoy(?:\\s+a)?(?:\\s+las)?', + 'diff_yesterday' => 'ayer', + 'diff_yesterday_regexp' => 'ayer(?:\\s+a)?(?:\\s+las)?', + 'diff_tomorrow' => 'mañana', + 'diff_tomorrow_regexp' => 'mañana(?:\\s+a)?(?:\\s+las)?', + 'diff_before_yesterday' => 'anteayer', + 'diff_after_tomorrow' => 'pasado mañana', + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D [de] MMMM [de] YYYY', + 'LLL' => 'D [de] MMMM [de] YYYY H:mm', + 'LLLL' => 'dddd, D [de] MMMM [de] YYYY H:mm', + ], + 'calendar' => [ + 'sameDay' => function (CarbonInterface $current) { + return '[hoy a la'.($current->hour !== 1 ? 's' : '').'] LT'; + }, + 'nextDay' => function (CarbonInterface $current) { + return '[mañana a la'.($current->hour !== 1 ? 's' : '').'] LT'; + }, + 'nextWeek' => function (CarbonInterface $current) { + return 'dddd [a la'.($current->hour !== 1 ? 's' : '').'] LT'; + }, + 'lastDay' => function (CarbonInterface $current) { + return '[ayer a la'.($current->hour !== 1 ? 's' : '').'] LT'; + }, + 'lastWeek' => function (CarbonInterface $current) { + return '[el] dddd [pasado a la'.($current->hour !== 1 ? 's' : '').'] LT'; + }, + 'sameElse' => 'L', + ], + 'months' => ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'], + 'months_short' => ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'], + 'mmm_suffix' => '.', + 'ordinal' => ':numberº', + 'weekdays' => ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'], + 'weekdays_short' => ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'], + 'weekdays_min' => ['do', 'lu', 'ma', 'mi', 'ju', 'vi', 'sá'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' y '], + 'meridiem' => ['a. m.', 'p. m.'], + 'ordinal_words' => [ + 'of' => 'de', + 'first' => 'primer', + 'second' => 'segundo', + 'third' => 'tercer', + 'fourth' => 'cuarto', + 'fifth' => 'quinto', + 'last' => 'último', + ], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_419.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_419.php new file mode 100644 index 0000000..a74806e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_419.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_AR.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_AR.php new file mode 100644 index 0000000..a74806e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_AR.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_BO.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_BO.php new file mode 100644 index 0000000..c9b8432 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_BO.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_BR.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_BR.php new file mode 100644 index 0000000..378d054 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_BR.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 0, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_BZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_BZ.php new file mode 100644 index 0000000..378d054 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_BZ.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 0, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_CL.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_CL.php new file mode 100644 index 0000000..a74806e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_CL.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_CO.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_CO.php new file mode 100644 index 0000000..a74806e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_CO.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_CR.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_CR.php new file mode 100644 index 0000000..553fc09 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_CR.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_CU.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_CU.php new file mode 100644 index 0000000..f02e1a6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_CU.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_DO.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_DO.php new file mode 100644 index 0000000..0f855ba --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_DO.php @@ -0,0 +1,31 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - kostas + * - François B + * - Tim Fish + * - Chiel Robben + * - Claire Coloma + * - Steven Heinrich + * - JD Isaacks + * - Raphael Amorim + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'diff_before_yesterday' => 'anteayer', + 'formats' => [ + 'LT' => 'h:mm A', + 'LTS' => 'h:mm:ss A', + 'LLL' => 'D [de] MMMM [de] YYYY h:mm A', + 'LLLL' => 'dddd, D [de] MMMM [de] YYYY h:mm A', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_EA.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_EA.php new file mode 100644 index 0000000..f02e1a6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_EA.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_EC.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_EC.php new file mode 100644 index 0000000..a74806e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_EC.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_ES.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_ES.php new file mode 100644 index 0000000..19217c2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_ES.php @@ -0,0 +1,16 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return require __DIR__.'/es.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_GQ.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_GQ.php new file mode 100644 index 0000000..f02e1a6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_GQ.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_GT.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_GT.php new file mode 100644 index 0000000..a74806e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_GT.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_HN.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_HN.php new file mode 100644 index 0000000..a74806e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_HN.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_IC.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_IC.php new file mode 100644 index 0000000..f02e1a6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_IC.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_MX.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_MX.php new file mode 100644 index 0000000..61e14cf --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_MX.php @@ -0,0 +1,20 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'diff_before_yesterday' => 'antier', + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_NI.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_NI.php new file mode 100644 index 0000000..6b964c1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_NI.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_PA.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_PA.php new file mode 100644 index 0000000..a74806e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_PA.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_PE.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_PE.php new file mode 100644 index 0000000..a74806e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_PE.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_PH.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_PH.php new file mode 100644 index 0000000..deae06a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_PH.php @@ -0,0 +1,22 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 0, + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'D/M/yy', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D [de] MMMM [de] YYYY h:mm a', + 'LLLL' => 'dddd, D [de] MMMM [de] YYYY h:mm a', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_PR.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_PR.php new file mode 100644 index 0000000..6b964c1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_PR.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_PY.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_PY.php new file mode 100644 index 0000000..a74806e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_PY.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_SV.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_SV.php new file mode 100644 index 0000000..00db08e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_SV.php @@ -0,0 +1,20 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'months' => ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'], + 'months_short' => ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'], + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_US.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_US.php new file mode 100644 index 0000000..f333136 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_US.php @@ -0,0 +1,38 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Kunal Marwaha + * - Josh Soref + * - Jørn Ølmheim + * - Craig Patik + * - bustta + * - François B + * - Tim Fish + * - Claire Coloma + * - Steven Heinrich + * - JD Isaacks + * - Raphael Amorim + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'diff_before_yesterday' => 'anteayer', + 'formats' => [ + 'LT' => 'h:mm A', + 'LTS' => 'h:mm:ss A', + 'L' => 'MM/DD/YYYY', + 'LL' => 'MMMM [de] D [de] YYYY', + 'LLL' => 'MMMM [de] D [de] YYYY h:mm A', + 'LLLL' => 'dddd, MMMM [de] D [de] YYYY h:mm A', + ], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_UY.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_UY.php new file mode 100644 index 0000000..39baff8 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_UY.php @@ -0,0 +1,21 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'months' => ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'setiembre', 'octubre', 'noviembre', 'diciembre'], + 'months_short' => ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'set', 'oct', 'nov', 'dic'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/es_VE.php b/vendor/nesbot/carbon/src/Carbon/Lang/es_VE.php new file mode 100644 index 0000000..a74806e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/es_VE.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/es.php', [ + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/et.php b/vendor/nesbot/carbon/src/Carbon/Lang/et.php new file mode 100644 index 0000000..f49c880 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/et.php @@ -0,0 +1,93 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Philippe Vaucher + * - Andres Ivanov + * - Tsutomu Kuroda + * - tjku + * - Max Melentiev + * - Juanito Fatas + * - RM87 + * - Akira Matsuda + * - Christopher Dell + * - Enrique Vidal + * - Simone Carletti + * - Aaron Patterson + * - Esko Lehtme + * - Mart Karu + * - Nicolás Hock Isaza + * - Kevin Valdek + * - Zahhar Kirillov + * - João Magalhães + * - Ingmar + * - Illimar Tambek + * - Mihkel + */ +return [ + 'year' => ':count aasta|:count aastat', + 'y' => ':count a', + 'month' => ':count kuu|:count kuud', + 'm' => ':count k', + 'week' => ':count nädal|:count nädalat', + 'w' => ':count näd', + 'day' => ':count päev|:count päeva', + 'd' => ':count p', + 'hour' => ':count tund|:count tundi', + 'h' => ':count t', + 'minute' => ':count minut|:count minutit', + 'min' => ':count min', + 'second' => ':count sekund|:count sekundit', + 's' => ':count s', + 'ago' => ':time tagasi', + 'from_now' => ':time pärast', + 'after' => ':time pärast', + 'before' => ':time enne', + 'year_from_now' => ':count aasta', + 'month_from_now' => ':count kuu', + 'week_from_now' => ':count nädala', + 'day_from_now' => ':count päeva', + 'hour_from_now' => ':count tunni', + 'minute_from_now' => ':count minuti', + 'second_from_now' => ':count sekundi', + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'diff_now' => 'nüüd', + 'diff_today' => 'täna', + 'diff_yesterday' => 'eile', + 'diff_tomorrow' => 'homme', + 'diff_before_yesterday' => 'üleeile', + 'diff_after_tomorrow' => 'ülehomme', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D. MMMM YYYY', + 'LLL' => 'D. MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D. MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[täna] LT', + 'nextDay' => '[homme] LT', + 'lastDay' => '[eile] LT', + 'nextWeek' => 'dddd LT', + 'lastWeek' => '[eelmine] dddd LT', + 'sameElse' => 'L', + ], + 'months' => ['jaanuar', 'veebruar', 'märts', 'aprill', 'mai', 'juuni', 'juuli', 'august', 'september', 'oktoober', 'november', 'detsember'], + 'months_short' => ['jaan', 'veebr', 'märts', 'apr', 'mai', 'juuni', 'juuli', 'aug', 'sept', 'okt', 'nov', 'dets'], + 'weekdays' => ['pühapäev', 'esmaspäev', 'teisipäev', 'kolmapäev', 'neljapäev', 'reede', 'laupäev'], + 'weekdays_short' => ['P', 'E', 'T', 'K', 'N', 'R', 'L'], + 'weekdays_min' => ['P', 'E', 'T', 'K', 'N', 'R', 'L'], + 'list' => [', ', ' ja '], + 'meridiem' => ['enne lõunat', 'pärast lõunat'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/et_EE.php b/vendor/nesbot/carbon/src/Carbon/Lang/et_EE.php new file mode 100644 index 0000000..0f112b3 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/et_EE.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/et.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/eu.php b/vendor/nesbot/carbon/src/Carbon/Lang/eu.php new file mode 100644 index 0000000..a543f1a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/eu.php @@ -0,0 +1,67 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - François B + * - JD Isaacks + */ +return [ + 'year' => 'urte bat|:count urte', + 'y' => 'Urte 1|:count urte', + 'month' => 'hilabete bat|:count hilabete', + 'm' => 'Hile 1|:count hile', + 'week' => 'Aste 1|:count aste', + 'w' => 'Aste 1|:count aste', + 'day' => 'egun bat|:count egun', + 'd' => 'Egun 1|:count egun', + 'hour' => 'ordu bat|:count ordu', + 'h' => 'Ordu 1|:count ordu', + 'minute' => 'minutu bat|:count minutu', + 'min' => 'Minutu 1|:count minutu', + 'second' => 'segundo batzuk|:count segundo', + 's' => 'Segundu 1|:count segundu', + 'ago' => 'duela :time', + 'from_now' => ':time barru', + 'after' => ':time geroago', + 'before' => ':time lehenago', + 'diff_now' => 'orain', + 'diff_today' => 'gaur', + 'diff_yesterday' => 'atzo', + 'diff_tomorrow' => 'bihar', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY-MM-DD', + 'LL' => 'YYYY[ko] MMMM[ren] D[a]', + 'LLL' => 'YYYY[ko] MMMM[ren] D[a] HH:mm', + 'LLLL' => 'dddd, YYYY[ko] MMMM[ren] D[a] HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[gaur] LT[etan]', + 'nextDay' => '[bihar] LT[etan]', + 'nextWeek' => 'dddd LT[etan]', + 'lastDay' => '[atzo] LT[etan]', + 'lastWeek' => '[aurreko] dddd LT[etan]', + 'sameElse' => 'L', + ], + 'ordinal' => ':number.', + 'months' => ['urtarrila', 'otsaila', 'martxoa', 'apirila', 'maiatza', 'ekaina', 'uztaila', 'abuztua', 'iraila', 'urria', 'azaroa', 'abendua'], + 'months_short' => ['urt.', 'ots.', 'mar.', 'api.', 'mai.', 'eka.', 'uzt.', 'abu.', 'ira.', 'urr.', 'aza.', 'abe.'], + 'weekdays' => ['igandea', 'astelehena', 'asteartea', 'asteazkena', 'osteguna', 'ostirala', 'larunbata'], + 'weekdays_short' => ['ig.', 'al.', 'ar.', 'az.', 'og.', 'ol.', 'lr.'], + 'weekdays_min' => ['ig', 'al', 'ar', 'az', 'og', 'ol', 'lr'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' eta '], + 'meridiem' => ['g', 'a'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/eu_ES.php b/vendor/nesbot/carbon/src/Carbon/Lang/eu_ES.php new file mode 100644 index 0000000..0d1e82a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/eu_ES.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/eu.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ewo.php b/vendor/nesbot/carbon/src/Carbon/Lang/ewo.php new file mode 100644 index 0000000..7808ab5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ewo.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['kíkíríg', 'ngəgógəle'], + 'weekdays' => ['sɔ́ndɔ', 'mɔ́ndi', 'sɔ́ndɔ məlú mə́bɛ̌', 'sɔ́ndɔ məlú mə́lɛ́', 'sɔ́ndɔ məlú mə́nyi', 'fúladé', 'séradé'], + 'weekdays_short' => ['sɔ́n', 'mɔ́n', 'smb', 'sml', 'smn', 'fúl', 'sér'], + 'weekdays_min' => ['sɔ́n', 'mɔ́n', 'smb', 'sml', 'smn', 'fúl', 'sér'], + 'months' => ['ngɔn osú', 'ngɔn bɛ̌', 'ngɔn lála', 'ngɔn nyina', 'ngɔn tána', 'ngɔn saməna', 'ngɔn zamgbála', 'ngɔn mwom', 'ngɔn ebulú', 'ngɔn awóm', 'ngɔn awóm ai dziá', 'ngɔn awóm ai bɛ̌'], + 'months_short' => ['ngo', 'ngb', 'ngl', 'ngn', 'ngt', 'ngs', 'ngz', 'ngm', 'nge', 'nga', 'ngad', 'ngab'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + + // Too unreliable + /* + 'year' => ':count mbu', // less reliable + 'y' => ':count mbu', // less reliable + 'a_year' => ':count mbu', // less reliable + + 'month' => ':count ngòn', // less reliable + 'm' => ':count ngòn', // less reliable + 'a_month' => ':count ngòn', // less reliable + + 'week' => ':count mësë', // less reliable + 'w' => ':count mësë', // less reliable + 'a_week' => ':count mësë', // less reliable + + 'day' => ':count mësë', // less reliable + 'd' => ':count mësë', // less reliable + 'a_day' => ':count mësë', // less reliable + + 'hour' => ':count awola', // less reliable + 'h' => ':count awola', // less reliable + 'a_hour' => ':count awola', // less reliable + + 'minute' => ':count awola', // less reliable + 'min' => ':count awola', // less reliable + 'a_minute' => ':count awola', // less reliable + */ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fa.php b/vendor/nesbot/carbon/src/Carbon/Lang/fa.php new file mode 100644 index 0000000..72e0308 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fa.php @@ -0,0 +1,84 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - François B + * - Nasser Ghiasi + * - JD Isaacks + * - Hossein Jabbari + * - nimamo + * - hafezdivandari + * - Hassan Pezeshk (hpez) + */ +return [ + 'year' => ':count سال', + 'a_year' => 'یک سال'.'|:count '.'سال', + 'y' => ':count سال', + 'month' => ':count ماه', + 'a_month' => 'یک ماه'.'|:count '.'ماه', + 'm' => ':count ماه', + 'week' => ':count هفته', + 'a_week' => 'یک هفته'.'|:count '.'هفته', + 'w' => ':count هفته', + 'day' => ':count روز', + 'a_day' => 'یک روز'.'|:count '.'روز', + 'd' => ':count روز', + 'hour' => ':count ساعت', + 'a_hour' => 'یک ساعت'.'|:count '.'ساعت', + 'h' => ':count ساعت', + 'minute' => ':count دقیقه', + 'a_minute' => 'یک دقیقه'.'|:count '.'دقیقه', + 'min' => ':count دقیقه', + 'second' => ':count ثانیه', + 's' => ':count ثانیه', + 'ago' => ':time پیش', + 'from_now' => ':time دیگر', + 'after' => ':time پس از', + 'before' => ':time پیش از', + 'diff_now' => 'اکنون', + 'diff_today' => 'امروز', + 'diff_today_regexp' => 'امروز(?:\\s+ساعت)?', + 'diff_yesterday' => 'دیروز', + 'diff_yesterday_regexp' => 'دیروز(?:\\s+ساعت)?', + 'diff_tomorrow' => 'فردا', + 'diff_tomorrow_regexp' => 'فردا(?:\\s+ساعت)?', + 'formats' => [ + 'LT' => 'OH:Om', + 'LTS' => 'OH:Om:Os', + 'L' => 'OD/OM/OY', + 'LL' => 'OD MMMM OY', + 'LLL' => 'OD MMMM OY OH:Om', + 'LLLL' => 'dddd, OD MMMM OY OH:Om', + ], + 'calendar' => [ + 'sameDay' => '[امروز ساعت] LT', + 'nextDay' => '[فردا ساعت] LT', + 'nextWeek' => 'dddd [ساعت] LT', + 'lastDay' => '[دیروز ساعت] LT', + 'lastWeek' => 'dddd [پیش] [ساعت] LT', + 'sameElse' => 'L', + ], + 'ordinal' => ':timeم', + 'meridiem' => ['قبل از ظهر', 'بعد از ظهر'], + 'months' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'], + 'months_short' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'], + 'weekdays' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'], + 'weekdays_short' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'], + 'weekdays_min' => ['ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, + 'list' => ['، ', ' و '], + 'alt_numbers' => ['۰۰', '۰۱', '۰۲', '۰۳', '۰۴', '۰۵', '۰۶', '۰۷', '۰۸', '۰۹', '۱۰', '۱۱', '۱۲', '۱۳', '۱۴', '۱۵', '۱۶', '۱۷', '۱۸', '۱۹', '۲۰', '۲۱', '۲۲', '۲۳', '۲۴', '۲۵', '۲۶', '۲۷', '۲۸', '۲۹', '۳۰', '۳۱', '۳۲', '۳۳', '۳۴', '۳۵', '۳۶', '۳۷', '۳۸', '۳۹', '۴۰', '۴۱', '۴۲', '۴۳', '۴۴', '۴۵', '۴۶', '۴۷', '۴۸', '۴۹', '۵۰', '۵۱', '۵۲', '۵۳', '۵۴', '۵۵', '۵۶', '۵۷', '۵۸', '۵۹', '۶۰', '۶۱', '۶۲', '۶۳', '۶۴', '۶۵', '۶۶', '۶۷', '۶۸', '۶۹', '۷۰', '۷۱', '۷۲', '۷۳', '۷۴', '۷۵', '۷۶', '۷۷', '۷۸', '۷۹', '۸۰', '۸۱', '۸۲', '۸۳', '۸۴', '۸۵', '۸۶', '۸۷', '۸۸', '۸۹', '۹۰', '۹۱', '۹۲', '۹۳', '۹۴', '۹۵', '۹۶', '۹۷', '۹۸', '۹۹'], + 'months_short_standalone' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'], + 'weekend' => [5, 5], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fa_AF.php b/vendor/nesbot/carbon/src/Carbon/Lang/fa_AF.php new file mode 100644 index 0000000..6947100 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fa_AF.php @@ -0,0 +1,21 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/fa.php', [ + 'meridiem' => ['ق', 'ب'], + 'weekend' => [4, 5], + 'formats' => [ + 'L' => 'OY/OM/OD', + 'LL' => 'OD MMM OY', + 'LLL' => 'OD MMMM OY،‏ H:mm', + 'LLLL' => 'dddd OD MMMM OY،‏ H:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fa_IR.php b/vendor/nesbot/carbon/src/Carbon/Lang/fa_IR.php new file mode 100644 index 0000000..08d0182 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fa_IR.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fa.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ff.php b/vendor/nesbot/carbon/src/Carbon/Lang/ff.php new file mode 100644 index 0000000..9525c95 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ff.php @@ -0,0 +1,60 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM, YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'months' => ['siilo', 'colte', 'mbooy', 'seeɗto', 'duujal', 'korse', 'morso', 'juko', 'siilto', 'yarkomaa', 'jolal', 'bowte'], + 'months_short' => ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'], + 'weekdays' => ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'], + 'weekdays_short' => ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'], + 'weekdays_min' => ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['subaka', 'kikiiɗe'], + + 'year' => ':count baret', // less reliable + 'y' => ':count baret', // less reliable + 'a_year' => ':count baret', // less reliable + + 'month' => ':count lewru', // less reliable + 'm' => ':count lewru', // less reliable + 'a_month' => ':count lewru', // less reliable + + 'week' => ':count naange', // less reliable + 'w' => ':count naange', // less reliable + 'a_week' => ':count naange', // less reliable + + 'day' => ':count dian', // less reliable + 'd' => ':count dian', // less reliable + 'a_day' => ':count dian', // less reliable + + 'hour' => ':count montor', // less reliable + 'h' => ':count montor', // less reliable + 'a_hour' => ':count montor', // less reliable + + 'minute' => ':count tokossuoum', // less reliable + 'min' => ':count tokossuoum', // less reliable + 'a_minute' => ':count tokossuoum', // less reliable + + 'second' => ':count tenen', // less reliable + 's' => ':count tenen', // less reliable + 'a_second' => ':count tenen', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ff_CM.php b/vendor/nesbot/carbon/src/Carbon/Lang/ff_CM.php new file mode 100644 index 0000000..b797ac0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ff_CM.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ff.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ff_GN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ff_GN.php new file mode 100644 index 0000000..b797ac0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ff_GN.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ff.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ff_MR.php b/vendor/nesbot/carbon/src/Carbon/Lang/ff_MR.php new file mode 100644 index 0000000..2f4c29f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ff_MR.php @@ -0,0 +1,21 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ff.php', [ + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM, YYYY', + 'LLL' => 'D MMMM YYYY h:mm a', + 'LLLL' => 'dddd D MMMM YYYY h:mm a', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ff_SN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ff_SN.php new file mode 100644 index 0000000..1e4c8b6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ff_SN.php @@ -0,0 +1,16 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Pular-Fulfulde.org Ibrahima Sarr admin@pulaar-fulfulde.org + */ +return require __DIR__.'/ff.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fi.php b/vendor/nesbot/carbon/src/Carbon/Lang/fi.php new file mode 100644 index 0000000..edf2d6d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fi.php @@ -0,0 +1,88 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Philippe Vaucher + * - Janne Warén + * - digitalfrost + * - Tsutomu Kuroda + * - Roope Salmi + * - tjku + * - Max Melentiev + * - Sami Haahtinen + * - Teemu Leisti + * - Artem Ignatyev + * - Akira Matsuda + * - Christopher Dell + * - Enrique Vidal + * - Simone Carletti + * - Robert Bjarnason + * - Aaron Patterson + * - Nicolás Hock Isaza + * - Tom Hughes + * - Sven Fuchs + * - Petri Kivikangas + * - Nizar Jouini + * - Marko Seppae + * - Tomi Mynttinen (Pikseli) + * - Petteri (powergrip) + */ +return [ + 'year' => ':count vuosi|:count vuotta', + 'y' => ':count v', + 'month' => ':count kuukausi|:count kuukautta', + 'm' => ':count kk', + 'week' => ':count viikko|:count viikkoa', + 'w' => ':count vk', + 'day' => ':count päivä|:count päivää', + 'd' => ':count pv', + 'hour' => ':count tunti|:count tuntia', + 'h' => ':count t', + 'minute' => ':count minuutti|:count minuuttia', + 'min' => ':count min', + 'second' => ':count sekunti|:count sekuntia', + 'a_second' => 'muutama sekunti|:count sekuntia', + 's' => ':count s', + 'ago' => ':time sitten', + 'from_now' => ':time päästä', + 'year_from_now' => ':count vuoden', + 'month_from_now' => ':count kuukauden', + 'week_from_now' => ':count viikon', + 'day_from_now' => ':count päivän', + 'hour_from_now' => ':count tunnin', + 'minute_from_now' => ':count minuutin', + 'second_from_now' => ':count sekunnin', + 'after' => ':time sen jälkeen', + 'before' => ':time ennen', + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' ja '], + 'diff_now' => 'nyt', + 'diff_yesterday' => 'eilen', + 'diff_tomorrow' => 'huomenna', + 'formats' => [ + 'LT' => 'HH.mm', + 'LTS' => 'HH.mm:ss', + 'L' => 'D.M.YYYY', + 'LL' => 'dddd D. MMMM[ta] YYYY', + 'll' => 'ddd D. MMM YYYY', + 'LLL' => 'D.MM. HH.mm', + 'LLLL' => 'D. MMMM[ta] YYYY HH.mm', + 'llll' => 'D. MMM YY HH.mm', + ], + 'weekdays' => ['sunnuntai', 'maanantai', 'tiistai', 'keskiviikko', 'torstai', 'perjantai', 'lauantai'], + 'weekdays_short' => ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'], + 'weekdays_min' => ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'], + 'months' => ['tammikuu', 'helmikuu', 'maaliskuu', 'huhtikuu', 'toukokuu', 'kesäkuu', 'heinäkuu', 'elokuu', 'syyskuu', 'lokakuu', 'marraskuu', 'joulukuu'], + 'months_short' => ['tammi', 'helmi', 'maalis', 'huhti', 'touko', 'kesä', 'heinä', 'elo', 'syys', 'loka', 'marras', 'joulu'], + 'meridiem' => ['aamupäivä', 'iltapäivä'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fi_FI.php b/vendor/nesbot/carbon/src/Carbon/Lang/fi_FI.php new file mode 100644 index 0000000..920f1ca --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fi_FI.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fi.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fil.php b/vendor/nesbot/carbon/src/Carbon/Lang/fil.php new file mode 100644 index 0000000..61114e3 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fil.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/fil_PH.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fil_PH.php b/vendor/nesbot/carbon/src/Carbon/Lang/fil_PH.php new file mode 100644 index 0000000..bcf1580 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fil_PH.php @@ -0,0 +1,62 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Rene Torres Rene Torres, Pablo Saratxaga rgtorre@rocketmail.com, pablo@mandrakesoft.com + * - Jaycee Mariano (alohajaycee) + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'MM/DD/YY', + ], + 'months' => ['Enero', 'Pebrero', 'Marso', 'Abril', 'Mayo', 'Hunyo', 'Hulyo', 'Agosto', 'Setyembre', 'Oktubre', 'Nobyembre', 'Disyembre'], + 'months_short' => ['Ene', 'Peb', 'Mar', 'Abr', 'May', 'Hun', 'Hul', 'Ago', 'Set', 'Okt', 'Nob', 'Dis'], + 'weekdays' => ['Linggo', 'Lunes', 'Martes', 'Miyerkoles', 'Huwebes', 'Biyernes', 'Sabado'], + 'weekdays_short' => ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'], + 'weekdays_min' => ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['N.U.', 'N.H.'], + + 'before' => ':time bago', + 'after' => ':time pagkatapos', + + 'year' => ':count taon', + 'y' => ':count taon', + 'a_year' => ':count taon', + + 'month' => ':count buwan', + 'm' => ':count buwan', + 'a_month' => ':count buwan', + + 'week' => ':count linggo', + 'w' => ':count linggo', + 'a_week' => ':count linggo', + + 'day' => ':count araw', + 'd' => ':count araw', + 'a_day' => ':count araw', + + 'hour' => ':count oras', + 'h' => ':count oras', + 'a_hour' => ':count oras', + + 'minute' => ':count minuto', + 'min' => ':count minuto', + 'a_minute' => ':count minuto', + + 'second' => ':count segundo', + 's' => ':count segundo', + 'a_second' => ':count segundo', + + 'ago' => ':time ang nakalipas', + 'from_now' => 'sa :time', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fo.php b/vendor/nesbot/carbon/src/Carbon/Lang/fo.php new file mode 100644 index 0000000..6a14a6f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fo.php @@ -0,0 +1,69 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Kristian Sakarisson + * - François B + * - JD Isaacks + * - Sverri Mohr Olsen + */ +return [ + 'year' => 'eitt ár|:count ár', + 'y' => ':count ár|:count ár', + 'month' => 'ein mánaði|:count mánaðir', + 'm' => ':count mánaður|:count mánaðir', + 'week' => ':count vika|:count vikur', + 'w' => ':count vika|:count vikur', + 'day' => 'ein dagur|:count dagar', + 'd' => ':count dag|:count dagar', + 'hour' => 'ein tími|:count tímar', + 'h' => ':count tími|:count tímar', + 'minute' => 'ein minutt|:count minuttir', + 'min' => ':count minutt|:count minuttir', + 'second' => 'fá sekund|:count sekundir', + 's' => ':count sekund|:count sekundir', + 'ago' => ':time síðani', + 'from_now' => 'um :time', + 'after' => ':time aftaná', + 'before' => ':time áðrenn', + 'diff_today' => 'Í', + 'diff_yesterday' => 'Í', + 'diff_yesterday_regexp' => 'Í(?:\\s+gjár)?(?:\\s+kl.)?', + 'diff_tomorrow' => 'Í', + 'diff_tomorrow_regexp' => 'Í(?:\\s+morgin)?(?:\\s+kl.)?', + 'diff_today_regexp' => 'Í(?:\\s+dag)?(?:\\s+kl.)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D. MMMM, YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Í dag kl.] LT', + 'nextDay' => '[Í morgin kl.] LT', + 'nextWeek' => 'dddd [kl.] LT', + 'lastDay' => '[Í gjár kl.] LT', + 'lastWeek' => '[síðstu] dddd [kl] LT', + 'sameElse' => 'L', + ], + 'ordinal' => ':number.', + 'months' => ['januar', 'februar', 'mars', 'apríl', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'], + 'months_short' => ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'], + 'weekdays' => ['sunnudagur', 'mánadagur', 'týsdagur', 'mikudagur', 'hósdagur', 'fríggjadagur', 'leygardagur'], + 'weekdays_short' => ['sun', 'mán', 'týs', 'mik', 'hós', 'frí', 'ley'], + 'weekdays_min' => ['su', 'má', 'tý', 'mi', 'hó', 'fr', 'le'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' og '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fo_DK.php b/vendor/nesbot/carbon/src/Carbon/Lang/fo_DK.php new file mode 100644 index 0000000..657f2c5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fo_DK.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/fo.php', [ + 'formats' => [ + 'L' => 'DD.MM.yy', + 'LL' => 'DD.MM.YYYY', + 'LLL' => 'D. MMMM YYYY, HH:mm', + 'LLLL' => 'dddd, D. MMMM YYYY, HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fo_FO.php b/vendor/nesbot/carbon/src/Carbon/Lang/fo_FO.php new file mode 100644 index 0000000..6d73616 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fo_FO.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fo.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr.php new file mode 100644 index 0000000..f4c7247 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr.php @@ -0,0 +1,123 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Dieter Sting + * - François B + * - Maxime VALY + * - JD Isaacks + * - Dieter Sting + * - François B + * - JD Isaacks + * - Sebastian Thierer + * - Fastfuel + * - Pete Scopes (pdscopes) + */ +return [ + 'year' => ':count an|:count ans', + 'a_year' => 'un an|:count ans', + 'y' => ':count an|:count ans', + 'month' => ':count mois|:count mois', + 'a_month' => 'un mois|:count mois', + 'm' => ':count mois', + 'week' => ':count semaine|:count semaines', + 'a_week' => 'une semaine|:count semaines', + 'w' => ':count sem.', + 'day' => ':count jour|:count jours', + 'a_day' => 'un jour|:count jours', + 'd' => ':count j', + 'hour' => ':count heure|:count heures', + 'a_hour' => 'une heure|:count heures', + 'h' => ':count h', + 'minute' => ':count minute|:count minutes', + 'a_minute' => 'une minute|:count minutes', + 'min' => ':count min', + 'second' => ':count seconde|:count secondes', + 'a_second' => 'quelques secondes|:count secondes', + 's' => ':count s', + 'millisecond' => ':count milliseconde|:count millisecondes', + 'a_millisecond' => 'une milliseconde|:count millisecondes', + 'ms' => ':countms', + 'microsecond' => ':count microseconde|:count microsecondes', + 'a_microsecond' => 'une microseconde|:count microsecondes', + 'µs' => ':countµs', + 'ago' => 'il y a :time', + 'from_now' => 'dans :time', + 'after' => ':time après', + 'before' => ':time avant', + 'diff_now' => "à l'instant", + 'diff_today' => "aujourd'hui", + 'diff_today_regexp' => "aujourd'hui(?:\s+à)?", + 'diff_yesterday' => 'hier', + 'diff_yesterday_regexp' => 'hier(?:\s+à)?', + 'diff_tomorrow' => 'demain', + 'diff_tomorrow_regexp' => 'demain(?:\s+à)?', + 'diff_before_yesterday' => 'avant-hier', + 'diff_after_tomorrow' => 'après-demain', + 'period_recurrences' => ':count fois', + 'period_interval' => 'tous les :interval', + 'period_start_date' => 'de :date', + 'period_end_date' => 'à :date', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Aujourd’hui à] LT', + 'nextDay' => '[Demain à] LT', + 'nextWeek' => 'dddd [à] LT', + 'lastDay' => '[Hier à] LT', + 'lastWeek' => 'dddd [dernier à] LT', + 'sameElse' => 'L', + ], + 'months' => ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'], + 'months_short' => ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'], + 'weekdays' => ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'], + 'weekdays_short' => ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'], + 'weekdays_min' => ['di', 'lu', 'ma', 'me', 'je', 've', 'sa'], + 'ordinal' => function ($number, $period) { + switch ($period) { + // In French, only the first has to be ordinal, other number remains cardinal + // @link https://fr.wikihow.com/%C3%A9crire-la-date-en-fran%C3%A7ais + case 'D': + return $number.($number === 1 ? 'er' : ''); + + default: + case 'M': + case 'Q': + case 'DDD': + case 'd': + return $number.($number === 1 ? 'er' : 'e'); + + // Words with feminine grammatical gender: semaine + case 'w': + case 'W': + return $number.($number === 1 ? 're' : 'e'); + } + }, + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' et '], + 'ordinal_words' => [ + 'of' => 'de', + 'first' => 'premier', + 'second' => 'deuxième', + 'third' => 'troisième', + 'fourth' => 'quatrième', + 'fifth' => 'cinquième', + 'last' => 'dernier', + ], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_BE.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_BE.php new file mode 100644 index 0000000..f6cafe8 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_BE.php @@ -0,0 +1,18 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/fr.php', [ + 'months_short' => ['jan', 'fév', 'mar', 'avr', 'mai', 'jun', 'jui', 'aoû', 'sep', 'oct', 'nov', 'déc'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_BF.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_BF.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_BF.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_BI.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_BI.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_BI.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_BJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_BJ.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_BJ.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_BL.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_BL.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_BL.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CA.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CA.php new file mode 100644 index 0000000..c9f6346 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CA.php @@ -0,0 +1,25 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Dieter Sting + * - François B + * - Maxime VALY + * - JD Isaacks + */ +return array_replace_recursive(require __DIR__.'/fr.php', [ + 'formats' => [ + 'L' => 'YYYY-MM-DD', + ], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CD.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CD.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CD.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CF.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CF.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CF.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CG.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CG.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CG.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CH.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CH.php new file mode 100644 index 0000000..8674c27 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CH.php @@ -0,0 +1,24 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Dieter Sting + * - François B + * - Gaspard Bucher + * - Maxime VALY + * - JD Isaacks + */ +return array_replace_recursive(require __DIR__.'/fr.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CI.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CI.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CI.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_CM.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CM.php new file mode 100644 index 0000000..67d3787 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_CM.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/fr.php', [ + 'meridiem' => ['mat.', 'soir'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_DJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_DJ.php new file mode 100644 index 0000000..2f06086 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_DJ.php @@ -0,0 +1,22 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/fr.php', [ + 'first_day_of_week' => 6, + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm a', + 'LLLL' => 'dddd D MMMM YYYY h:mm a', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_DZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_DZ.php new file mode 100644 index 0000000..ae8db5f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_DZ.php @@ -0,0 +1,23 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/fr.php', [ + 'first_day_of_week' => 6, + 'weekend' => [5, 6], + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm a', + 'LLLL' => 'dddd D MMMM YYYY h:mm a', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_FR.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_FR.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_FR.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_GA.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_GA.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_GA.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_GF.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_GF.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_GF.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_GN.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_GN.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_GN.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_GP.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_GP.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_GP.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_GQ.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_GQ.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_GQ.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_HT.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_HT.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_HT.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_KM.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_KM.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_KM.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_LU.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_LU.php new file mode 100644 index 0000000..8e37d85 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_LU.php @@ -0,0 +1,21 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/fr.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], + 'months_short' => ['jan', 'fév', 'mar', 'avr', 'mai', 'jun', 'jui', 'aoû', 'sep', 'oct', 'nov', 'déc'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MA.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MA.php new file mode 100644 index 0000000..1bf034d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MA.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/fr.php', [ + 'first_day_of_week' => 6, + 'weekend' => [5, 6], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MC.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MC.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MC.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MF.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MF.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MF.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MG.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MG.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MG.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_ML.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_ML.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_ML.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MQ.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MQ.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MQ.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MR.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MR.php new file mode 100644 index 0000000..37cf83f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MR.php @@ -0,0 +1,21 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/fr.php', [ + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm a', + 'LLLL' => 'dddd D MMMM YYYY h:mm a', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_MU.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MU.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_MU.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_NC.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_NC.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_NC.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_NE.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_NE.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_NE.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_PF.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_PF.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_PF.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_PM.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_PM.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_PM.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_RE.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_RE.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_RE.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_RW.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_RW.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_RW.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_SC.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_SC.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_SC.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_SN.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_SN.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_SN.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_SY.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_SY.php new file mode 100644 index 0000000..ae8db5f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_SY.php @@ -0,0 +1,23 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/fr.php', [ + 'first_day_of_week' => 6, + 'weekend' => [5, 6], + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm a', + 'LLLL' => 'dddd D MMMM YYYY h:mm a', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_TD.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_TD.php new file mode 100644 index 0000000..37cf83f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_TD.php @@ -0,0 +1,21 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/fr.php', [ + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm a', + 'LLLL' => 'dddd D MMMM YYYY h:mm a', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_TG.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_TG.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_TG.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_TN.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_TN.php new file mode 100644 index 0000000..6905e7a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_TN.php @@ -0,0 +1,22 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/fr.php', [ + 'weekend' => [5, 6], + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm a', + 'LLLL' => 'dddd D MMMM YYYY h:mm a', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_VU.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_VU.php new file mode 100644 index 0000000..37cf83f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_VU.php @@ -0,0 +1,21 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/fr.php', [ + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm a', + 'LLLL' => 'dddd D MMMM YYYY h:mm a', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_WF.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_WF.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_WF.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr_YT.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr_YT.php new file mode 100644 index 0000000..ec3ee35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr_YT.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/fr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fur.php b/vendor/nesbot/carbon/src/Carbon/Lang/fur.php new file mode 100644 index 0000000..36c2564 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fur.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/fur_IT.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fur_IT.php b/vendor/nesbot/carbon/src/Carbon/Lang/fur_IT.php new file mode 100644 index 0000000..0147a59 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fur_IT.php @@ -0,0 +1,39 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Pablo Saratxaga pablo@mandrakesoft.com + */ +return [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD. MM. YY', + 'LL' => 'DD di MMMM dal YYYY', + 'LLL' => 'DD di MMM HH:mm', + 'LLLL' => 'DD di MMMM dal YYYY HH:mm', + ], + 'months' => ['zenâr', 'fevrâr', 'març', 'avrîl', 'mai', 'jugn', 'lui', 'avost', 'setembar', 'otubar', 'novembar', 'dicembar'], + 'months_short' => ['zen', 'fev', 'mar', 'avr', 'mai', 'jug', 'lui', 'avo', 'set', 'otu', 'nov', 'dic'], + 'weekdays' => ['domenie', 'lunis', 'martars', 'miercus', 'joibe', 'vinars', 'sabide'], + 'weekdays_short' => ['dom', 'lun', 'mar', 'mie', 'joi', 'vin', 'sab'], + 'weekdays_min' => ['dom', 'lun', 'mar', 'mie', 'joi', 'vin', 'sab'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'year' => ':count an', + 'month' => ':count mês', + 'week' => ':count setemane', + 'day' => ':count zornade', + 'hour' => ':count ore', + 'minute' => ':count minût', + 'second' => ':count secont', +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fy.php b/vendor/nesbot/carbon/src/Carbon/Lang/fy.php new file mode 100644 index 0000000..c1b5439 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fy.php @@ -0,0 +1,76 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - Tim Fish + * - JD Isaacks + */ +return [ + 'year' => ':count jier|:count jierren', + 'a_year' => 'ien jier|:count jierren', + 'y' => ':count j', + 'month' => ':count moanne|:count moannen', + 'a_month' => 'ien moanne|:count moannen', + 'm' => ':count moa.', + 'week' => ':count wike|:count wiken', + 'a_week' => 'in wike|:count wiken', + 'a' => ':count w.', + 'day' => ':count dei|:count dagen', + 'a_day' => 'ien dei|:count dagen', + 'd' => ':count d.', + 'hour' => ':count oere|:count oeren', + 'a_hour' => 'ien oere|:count oeren', + 'h' => ':count o.', + 'minute' => ':count minút|:count minuten', + 'a_minute' => 'ien minút|:count minuten', + 'min' => ':count min.', + 'second' => ':count sekonde|:count sekonden', + 'a_second' => 'in pear sekonden|:count sekonden', + 's' => ':count s.', + 'ago' => ':time lyn', + 'from_now' => 'oer :time', + 'diff_yesterday' => 'juster', + 'diff_yesterday_regexp' => 'juster(?:\\s+om)?', + 'diff_today' => 'hjoed', + 'diff_today_regexp' => 'hjoed(?:\\s+om)?', + 'diff_tomorrow' => 'moarn', + 'diff_tomorrow_regexp' => 'moarn(?:\\s+om)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD-MM-YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[hjoed om] LT', + 'nextDay' => '[moarn om] LT', + 'nextWeek' => 'dddd [om] LT', + 'lastDay' => '[juster om] LT', + 'lastWeek' => '[ôfrûne] dddd [om] LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number) { + return $number.(($number === 1 || $number === 8 || $number >= 20) ? 'ste' : 'de'); + }, + 'months' => ['jannewaris', 'febrewaris', 'maart', 'april', 'maaie', 'juny', 'july', 'augustus', 'septimber', 'oktober', 'novimber', 'desimber'], + 'months_short' => ['jan', 'feb', 'mrt', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'], + 'mmm_suffix' => '.', + 'weekdays' => ['snein', 'moandei', 'tiisdei', 'woansdei', 'tongersdei', 'freed', 'sneon'], + 'weekdays_short' => ['si.', 'mo.', 'ti.', 'wo.', 'to.', 'fr.', 'so.'], + 'weekdays_min' => ['Si', 'Mo', 'Ti', 'Wo', 'To', 'Fr', 'So'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' en '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fy_DE.php b/vendor/nesbot/carbon/src/Carbon/Lang/fy_DE.php new file mode 100644 index 0000000..8559d5c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fy_DE.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - information from Kenneth Christiansen Kenneth Christiansen, Pablo Saratxaga kenneth@gnu.org, pablo@mandriva.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], + 'months' => ['Jaunuwoa', 'Februwoa', 'Moaz', 'Aprell', 'Mai', 'Juni', 'Juli', 'August', 'Septamba', 'Oktoba', 'Nowamba', 'Dezamba'], + 'months_short' => ['Jan', 'Feb', 'Moz', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Now', 'Dez'], + 'weekdays' => ['Sinndag', 'Mondag', 'Dingsdag', 'Meddwäakj', 'Donnadag', 'Friedag', 'Sinnowend'], + 'weekdays_short' => ['Sdg', 'Mdg', 'Dsg', 'Mwk', 'Ddg', 'Fdg', 'Swd'], + 'weekdays_min' => ['Sdg', 'Mdg', 'Dsg', 'Mwk', 'Ddg', 'Fdg', 'Swd'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fy_NL.php b/vendor/nesbot/carbon/src/Carbon/Lang/fy_NL.php new file mode 100644 index 0000000..01cc96c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fy_NL.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/fy.php', [ + 'formats' => [ + 'L' => 'DD-MM-YY', + ], + 'months' => ['Jannewaris', 'Febrewaris', 'Maart', 'April', 'Maaie', 'Juny', 'July', 'Augustus', 'Septimber', 'Oktober', 'Novimber', 'Desimber'], + 'months_short' => ['Jan', 'Feb', 'Mrt', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'], + 'weekdays' => ['Snein', 'Moandei', 'Tiisdei', 'Woansdei', 'Tongersdei', 'Freed', 'Sneon'], + 'weekdays_short' => ['Sn', 'Mo', 'Ti', 'Wo', 'To', 'Fr', 'Sn'], + 'weekdays_min' => ['Sn', 'Mo', 'Ti', 'Wo', 'To', 'Fr', 'Sn'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ga.php b/vendor/nesbot/carbon/src/Carbon/Lang/ga.php new file mode 100644 index 0000000..9f07a26 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ga.php @@ -0,0 +1,77 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Thanks to André Silva : https://github.com/askpt + */ + +return [ + 'year' => ':count bliain', + 'a_year' => '{1}bliain|:count bliain', + 'y' => ':countb', + 'month' => ':count mí', + 'a_month' => '{1}mí|:count mí', + 'm' => ':countm', + 'week' => ':count sheachtain', + 'a_week' => '{1}sheachtain|:count sheachtain', + 'w' => ':countsh', + 'day' => ':count lá', + 'a_day' => '{1}lá|:count lá', + 'd' => ':countl', + 'hour' => ':count uair an chloig', + 'a_hour' => '{1}uair an chloig|:count uair an chloig', + 'h' => ':countu', + 'minute' => ':count nóiméad', + 'a_minute' => '{1}nóiméad|:count nóiméad', + 'min' => ':countn', + 'second' => ':count soicind', + 'a_second' => '{1}cúpla soicind|:count soicind', + 's' => ':countso', + 'ago' => ':time ó shin', + 'from_now' => 'i :time', + 'after' => ':time tar éis', + 'before' => ':time roimh', + 'diff_now' => 'anois', + 'diff_today' => 'Inniu', + 'diff_today_regexp' => 'Inniu(?:\\s+ag)?', + 'diff_yesterday' => 'inné', + 'diff_yesterday_regexp' => 'Inné(?:\\s+aig)?', + 'diff_tomorrow' => 'amárach', + 'diff_tomorrow_regexp' => 'Amárach(?:\\s+ag)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Inniu ag] LT', + 'nextDay' => '[Amárach ag] LT', + 'nextWeek' => 'dddd [ag] LT', + 'lastDay' => '[Inné aig] LT', + 'lastWeek' => 'dddd [seo caite] [ag] LT', + 'sameElse' => 'L', + ], + 'months' => ['Eanáir', 'Feabhra', 'Márta', 'Aibreán', 'Bealtaine', 'Méitheamh', 'Iúil', 'Lúnasa', 'Meán Fómhair', 'Deaireadh Fómhair', 'Samhain', 'Nollaig'], + 'months_short' => ['Eaná', 'Feab', 'Márt', 'Aibr', 'Beal', 'Méit', 'Iúil', 'Lúna', 'Meán', 'Deai', 'Samh', 'Noll'], + 'weekdays' => ['Dé Domhnaigh', 'Dé Luain', 'Dé Máirt', 'Dé Céadaoin', 'Déardaoin', 'Dé hAoine', 'Dé Satharn'], + 'weekdays_short' => ['Dom', 'Lua', 'Mái', 'Céa', 'Déa', 'hAo', 'Sat'], + 'weekdays_min' => ['Do', 'Lu', 'Má', 'Ce', 'Dé', 'hA', 'Sa'], + 'ordinal' => function ($number) { + return $number.($number === 1 ? 'd' : ($number % 10 === 2 ? 'na' : 'mh')); + }, + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' agus '], + 'meridiem' => ['r.n.', 'i.n.'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ga_IE.php b/vendor/nesbot/carbon/src/Carbon/Lang/ga_IE.php new file mode 100644 index 0000000..57b0c4f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ga_IE.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ga.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gd.php b/vendor/nesbot/carbon/src/Carbon/Lang/gd.php new file mode 100644 index 0000000..63d064d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gd.php @@ -0,0 +1,75 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - Jon Ashdown + */ +return [ + 'year' => ':count bliadhna', + 'a_year' => '{1}bliadhna|:count bliadhna', + 'y' => ':count b.', + 'month' => ':count mìosan', + 'a_month' => '{1}mìos|:count mìosan', + 'm' => ':count ms.', + 'week' => ':count seachdainean', + 'a_week' => '{1}seachdain|:count seachdainean', + 'w' => ':count s.', + 'day' => ':count latha', + 'a_day' => '{1}latha|:count latha', + 'd' => ':count l.', + 'hour' => ':count uairean', + 'a_hour' => '{1}uair|:count uairean', + 'h' => ':count u.', + 'minute' => ':count mionaidean', + 'a_minute' => '{1}mionaid|:count mionaidean', + 'min' => ':count md.', + 'second' => ':count diogan', + 'a_second' => '{1}beagan diogan|:count diogan', + 's' => ':count d.', + 'ago' => 'bho chionn :time', + 'from_now' => 'ann an :time', + 'diff_yesterday' => 'An-dè', + 'diff_yesterday_regexp' => 'An-dè(?:\\s+aig)?', + 'diff_today' => 'An-diugh', + 'diff_today_regexp' => 'An-diugh(?:\\s+aig)?', + 'diff_tomorrow' => 'A-màireach', + 'diff_tomorrow_regexp' => 'A-màireach(?:\\s+aig)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[An-diugh aig] LT', + 'nextDay' => '[A-màireach aig] LT', + 'nextWeek' => 'dddd [aig] LT', + 'lastDay' => '[An-dè aig] LT', + 'lastWeek' => 'dddd [seo chaidh] [aig] LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number) { + return $number.($number === 1 ? 'd' : ($number % 10 === 2 ? 'na' : 'mh')); + }, + 'months' => ['Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd'], + 'months_short' => ['Faoi', 'Gear', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùn', 'Sult', 'Dàmh', 'Samh', 'Dùbh'], + 'weekdays' => ['Didòmhnaich', 'Diluain', 'Dimàirt', 'Diciadain', 'Diardaoin', 'Dihaoine', 'Disathairne'], + 'weekdays_short' => ['Did', 'Dil', 'Dim', 'Dic', 'Dia', 'Dih', 'Dis'], + 'weekdays_min' => ['Dò', 'Lu', 'Mà', 'Ci', 'Ar', 'Ha', 'Sa'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' agus '], + 'meridiem' => ['m', 'f'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gd_GB.php b/vendor/nesbot/carbon/src/Carbon/Lang/gd_GB.php new file mode 100644 index 0000000..4fc26b3 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gd_GB.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/gd.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gez.php b/vendor/nesbot/carbon/src/Carbon/Lang/gez.php new file mode 100644 index 0000000..b8a2f0e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gez.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/gez_ER.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gez_ER.php b/vendor/nesbot/carbon/src/Carbon/Lang/gez_ER.php new file mode 100644 index 0000000..f19d1df --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gez_ER.php @@ -0,0 +1,56 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation locales@geez.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['ጠሐረ', 'ከተተ', 'መገበ', 'አኀዘ', 'ግንባት', 'ሠንየ', 'ሐመለ', 'ነሐሰ', 'ከረመ', 'ጠቀመ', 'ኀደረ', 'ኀሠሠ'], + 'months_short' => ['ጠሐረ', 'ከተተ', 'መገበ', 'አኀዘ', 'ግንባ', 'ሠንየ', 'ሐመለ', 'ነሐሰ', 'ከረመ', 'ጠቀመ', 'ኀደረ', 'ኀሠሠ'], + 'weekdays' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚት'], + 'weekdays_short' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚ'], + 'weekdays_min' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚ'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['ጽባሕ', 'ምሴት'], + + 'month' => ':count ወርሕ', // less reliable + 'm' => ':count ወርሕ', // less reliable + 'a_month' => ':count ወርሕ', // less reliable + + 'week' => ':count ሰብዑ', // less reliable + 'w' => ':count ሰብዑ', // less reliable + 'a_week' => ':count ሰብዑ', // less reliable + + 'hour' => ':count አንትሙ', // less reliable + 'h' => ':count አንትሙ', // less reliable + 'a_hour' => ':count አንትሙ', // less reliable + + 'minute' => ':count ንኡስ', // less reliable + 'min' => ':count ንኡስ', // less reliable + 'a_minute' => ':count ንኡስ', // less reliable + + 'year' => ':count ዓመት', + 'y' => ':count ዓመት', + 'a_year' => ':count ዓመት', + + 'day' => ':count ዕለት', + 'd' => ':count ዕለት', + 'a_day' => ':count ዕለት', + + 'second' => ':count ካልእ', + 's' => ':count ካልእ', + 'a_second' => ':count ካልእ', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gez_ET.php b/vendor/nesbot/carbon/src/Carbon/Lang/gez_ET.php new file mode 100644 index 0000000..3933009 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gez_ET.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation locales@geez.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['ጃንዩወሪ', 'ፌብሩወሪ', 'ማርች', 'ኤፕረል', 'ሜይ', 'ጁን', 'ጁላይ', 'ኦገስት', 'ሴፕቴምበር', 'ኦክተውበር', 'ኖቬምበር', 'ዲሴምበር'], + 'months_short' => ['ጃንዩ', 'ፌብሩ', 'ማርች', 'ኤፕረ', 'ሜይ ', 'ጁን ', 'ጁላይ', 'ኦገስ', 'ሴፕቴ', 'ኦክተ', 'ኖቬም', 'ዲሴም'], + 'weekdays' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚት'], + 'weekdays_short' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚ'], + 'weekdays_min' => ['እኁድ', 'ሰኑይ', 'ሠሉስ', 'ራብዕ', 'ሐሙስ', 'ዓርበ', 'ቀዳሚ'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['ጽባሕ', 'ምሴት'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gl.php b/vendor/nesbot/carbon/src/Carbon/Lang/gl.php new file mode 100644 index 0000000..088b0f2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gl.php @@ -0,0 +1,98 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - Fidel Pita + * - JD Isaacks + * - Diego Vilariño + * - Sebastian Thierer + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => ':count ano|:count anos', + 'a_year' => 'un ano|:count anos', + 'y' => ':count a.', + 'month' => ':count mes|:count meses', + 'a_month' => 'un mes|:count meses', + 'm' => ':count mes.', + 'week' => ':count semana|:count semanas', + 'a_week' => 'unha semana|:count semanas', + 'w' => ':count sem.', + 'day' => ':count día|:count días', + 'a_day' => 'un día|:count días', + 'd' => ':count d.', + 'hour' => ':count hora|:count horas', + 'a_hour' => 'unha hora|:count horas', + 'h' => ':count h.', + 'minute' => ':count minuto|:count minutos', + 'a_minute' => 'un minuto|:count minutos', + 'min' => ':count min.', + 'second' => ':count segundo|:count segundos', + 'a_second' => 'uns segundos|:count segundos', + 's' => ':count seg.', + 'ago' => 'hai :time', + 'from_now' => function ($time) { + if (str_starts_with($time, 'un')) { + return "n$time"; + } + + return "en $time"; + }, + 'diff_now' => 'agora', + 'diff_today' => 'hoxe', + 'diff_today_regexp' => 'hoxe(?:\\s+ás)?', + 'diff_yesterday' => 'onte', + 'diff_yesterday_regexp' => 'onte(?:\\s+á)?', + 'diff_tomorrow' => 'mañá', + 'diff_tomorrow_regexp' => 'mañá(?:\\s+ás)?', + 'after' => ':time despois', + 'before' => ':time antes', + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D [de] MMMM [de] YYYY', + 'LLL' => 'D [de] MMMM [de] YYYY H:mm', + 'LLLL' => 'dddd, D [de] MMMM [de] YYYY H:mm', + ], + 'calendar' => [ + 'sameDay' => function (CarbonInterface $current) { + return '[hoxe '.($current->hour !== 1 ? 'ás' : 'á').'] LT'; + }, + 'nextDay' => function (CarbonInterface $current) { + return '[mañá '.($current->hour !== 1 ? 'ás' : 'á').'] LT'; + }, + 'nextWeek' => function (CarbonInterface $current) { + return 'dddd ['.($current->hour !== 1 ? 'ás' : 'á').'] LT'; + }, + 'lastDay' => function (CarbonInterface $current) { + return '[onte '.($current->hour !== 1 ? 'á' : 'a').'] LT'; + }, + 'lastWeek' => function (CarbonInterface $current) { + return '[o] dddd [pasado '.($current->hour !== 1 ? 'ás' : 'á').'] LT'; + }, + 'sameElse' => 'L', + ], + 'ordinal' => ':numberº', + 'months' => ['xaneiro', 'febreiro', 'marzo', 'abril', 'maio', 'xuño', 'xullo', 'agosto', 'setembro', 'outubro', 'novembro', 'decembro'], + 'months_short' => ['xan.', 'feb.', 'mar.', 'abr.', 'mai.', 'xuñ.', 'xul.', 'ago.', 'set.', 'out.', 'nov.', 'dec.'], + 'weekdays' => ['domingo', 'luns', 'martes', 'mércores', 'xoves', 'venres', 'sábado'], + 'weekdays_short' => ['dom.', 'lun.', 'mar.', 'mér.', 'xov.', 'ven.', 'sáb.'], + 'weekdays_min' => ['do', 'lu', 'ma', 'mé', 'xo', 've', 'sá'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' e '], + 'meridiem' => ['a.m.', 'p.m.'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gl_ES.php b/vendor/nesbot/carbon/src/Carbon/Lang/gl_ES.php new file mode 100644 index 0000000..9d6c1d9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gl_ES.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/gl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gom.php b/vendor/nesbot/carbon/src/Carbon/Lang/gom.php new file mode 100644 index 0000000..2a0584f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gom.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/gom_Latn.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gom_Latn.php b/vendor/nesbot/carbon/src/Carbon/Lang/gom_Latn.php new file mode 100644 index 0000000..612bb88 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gom_Latn.php @@ -0,0 +1,79 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return [ + 'year' => ':count voros|:count vorsam', + 'y' => ':countv', + 'month' => ':count mhoino|:count mhoine', + 'm' => ':countmh', + 'week' => ':count satolleacho|:count satolleache', + 'w' => ':countsa|:countsa', + 'day' => ':count dis', + 'd' => ':countd', + 'hour' => ':count hor|:count horam', + 'h' => ':counth', + 'minute' => ':count minute|:count mintam', + 'min' => ':countm', + 'second' => ':count second', + 's' => ':counts', + + 'diff_today' => 'Aiz', + 'diff_yesterday' => 'Kal', + 'diff_tomorrow' => 'Faleam', + 'formats' => [ + 'LT' => 'A h:mm [vazta]', + 'LTS' => 'A h:mm:ss [vazta]', + 'L' => 'DD-MM-YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY A h:mm [vazta]', + 'LLLL' => 'dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]', + 'llll' => 'ddd, D MMM YYYY, A h:mm [vazta]', + ], + + 'calendar' => [ + 'sameDay' => '[Aiz] LT', + 'nextDay' => '[Faleam] LT', + 'nextWeek' => '[Ieta to] dddd[,] LT', + 'lastDay' => '[Kal] LT', + 'lastWeek' => '[Fatlo] dddd[,] LT', + 'sameElse' => 'L', + ], + + 'months' => ['Janer', 'Febrer', 'Mars', 'Abril', 'Mai', 'Jun', 'Julai', 'Agost', 'Setembr', 'Otubr', 'Novembr', 'Dezembr'], + 'months_short' => ['Jan.', 'Feb.', 'Mars', 'Abr.', 'Mai', 'Jun', 'Jul.', 'Ago.', 'Set.', 'Otu.', 'Nov.', 'Dez.'], + 'weekdays' => ['Aitar', 'Somar', 'Mongllar', 'Budvar', 'Brestar', 'Sukrar', 'Son\'var'], + 'weekdays_short' => ['Ait.', 'Som.', 'Mon.', 'Bud.', 'Bre.', 'Suk.', 'Son.'], + 'weekdays_min' => ['Ai', 'Sm', 'Mo', 'Bu', 'Br', 'Su', 'Sn'], + + 'ordinal' => function ($number, $period) { + return $number.($period === 'D' ? 'er' : ''); + }, + + 'meridiem' => function ($hour) { + if ($hour < 4) { + return 'rati'; + } + if ($hour < 12) { + return 'sokalli'; + } + if ($hour < 16) { + return 'donparam'; + } + if ($hour < 20) { + return 'sanje'; + } + + return 'rati'; + }, + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' ani '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gsw.php b/vendor/nesbot/carbon/src/Carbon/Lang/gsw.php new file mode 100644 index 0000000..c5c850e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gsw.php @@ -0,0 +1,49 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Christopher Dell + * - Akira Matsuda + * - Enrique Vidal + * - Simone Carletti + * - Henning Kiel + * - Aaron Patterson + * - Florian Hanke + */ +return [ + 'year' => ':count Johr', + 'month' => ':count Monet', + 'week' => ':count Woche', + 'day' => ':count Tag', + 'hour' => ':count Schtund', + 'minute' => ':count Minute', + 'second' => ':count Sekunde', + 'weekdays' => ['Sunntig', 'Mäntig', 'Ziischtig', 'Mittwuch', 'Dunschtig', 'Friitig', 'Samschtig'], + 'weekdays_short' => ['Su', 'Mä', 'Zi', 'Mi', 'Du', 'Fr', 'Sa'], + 'weekdays_min' => ['Su', 'Mä', 'Zi', 'Mi', 'Du', 'Fr', 'Sa'], + 'months' => ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'Auguscht', 'September', 'Oktober', 'November', 'Dezember'], + 'months_short' => ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'], + 'meridiem' => ['am Vormittag', 'am Namittag'], + 'ordinal' => ':number.', + 'list' => [', ', ' und '], + 'diff_now' => 'now', + 'diff_yesterday' => 'geschter', + 'diff_tomorrow' => 'moorn', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'Do MMMM YYYY', + 'LLL' => 'Do MMMM, HH:mm [Uhr]', + 'LLLL' => 'dddd, Do MMMM YYYY, HH:mm [Uhr]', + ], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gsw_CH.php b/vendor/nesbot/carbon/src/Carbon/Lang/gsw_CH.php new file mode 100644 index 0000000..594eb25 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gsw_CH.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/gsw.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gsw_FR.php b/vendor/nesbot/carbon/src/Carbon/Lang/gsw_FR.php new file mode 100644 index 0000000..3581dcf --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gsw_FR.php @@ -0,0 +1,20 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/gsw.php', [ + 'meridiem' => ['vorm.', 'nam.'], + 'months' => ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'Auguscht', 'Septämber', 'Oktoober', 'Novämber', 'Dezämber'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LLL' => 'Do MMMM YYYY HH:mm', + 'LLLL' => 'dddd, Do MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gsw_LI.php b/vendor/nesbot/carbon/src/Carbon/Lang/gsw_LI.php new file mode 100644 index 0000000..3581dcf --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gsw_LI.php @@ -0,0 +1,20 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/gsw.php', [ + 'meridiem' => ['vorm.', 'nam.'], + 'months' => ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'Auguscht', 'Septämber', 'Oktoober', 'Novämber', 'Dezämber'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LLL' => 'Do MMMM YYYY HH:mm', + 'LLLL' => 'dddd, Do MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gu.php b/vendor/nesbot/carbon/src/Carbon/Lang/gu.php new file mode 100644 index 0000000..8bc4311 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gu.php @@ -0,0 +1,82 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - Kaushik Thanki + * - Josh Soref + */ +return [ + 'year' => 'એક વર્ષ|:count વર્ષ', + 'y' => ':countવર્ષ|:countવર્ષો', + 'month' => 'એક મહિનો|:count મહિના', + 'm' => ':countમહિનો|:countમહિના', + 'week' => ':count અઠવાડિયું|:count અઠવાડિયા', + 'w' => ':countઅઠ.|:countઅઠ.', + 'day' => 'એક દિવસ|:count દિવસ', + 'd' => ':countદિ.|:countદિ.', + 'hour' => 'એક કલાક|:count કલાક', + 'h' => ':countક.|:countક.', + 'minute' => 'એક મિનિટ|:count મિનિટ', + 'min' => ':countમિ.|:countમિ.', + 'second' => 'અમુક પળો|:count સેકંડ', + 's' => ':countસે.|:countસે.', + 'ago' => ':time પેહલા', + 'from_now' => ':time મા', + 'after' => ':time પછી', + 'before' => ':time પહેલા', + 'diff_now' => 'હમણાં', + 'diff_today' => 'આજ', + 'diff_yesterday' => 'ગઇકાલે', + 'diff_tomorrow' => 'કાલે', + 'formats' => [ + 'LT' => 'A h:mm વાગ્યે', + 'LTS' => 'A h:mm:ss વાગ્યે', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY, A h:mm વાગ્યે', + 'LLLL' => 'dddd, D MMMM YYYY, A h:mm વાગ્યે', + ], + 'calendar' => [ + 'sameDay' => '[આજ] LT', + 'nextDay' => '[કાલે] LT', + 'nextWeek' => 'dddd, LT', + 'lastDay' => '[ગઇકાલે] LT', + 'lastWeek' => '[પાછલા] dddd, LT', + 'sameElse' => 'L', + ], + 'meridiem' => function ($hour) { + if ($hour < 4) { + return 'રાત'; + } + if ($hour < 10) { + return 'સવાર'; + } + if ($hour < 17) { + return 'બપોર'; + } + if ($hour < 20) { + return 'સાંજ'; + } + + return 'રાત'; + }, + 'months' => ['જાન્યુઆરી', 'ફેબ્રુઆરી', 'માર્ચ', 'એપ્રિલ', 'મે', 'જૂન', 'જુલાઈ', 'ઑગસ્ટ', 'સપ્ટેમ્બર', 'ઑક્ટ્બર', 'નવેમ્બર', 'ડિસેમ્બર'], + 'months_short' => ['જાન્યુ.', 'ફેબ્રુ.', 'માર્ચ', 'એપ્રિ.', 'મે', 'જૂન', 'જુલા.', 'ઑગ.', 'સપ્ટે.', 'ઑક્ટ્.', 'નવે.', 'ડિસે.'], + 'weekdays' => ['રવિવાર', 'સોમવાર', 'મંગળવાર', 'બુધ્વાર', 'ગુરુવાર', 'શુક્રવાર', 'શનિવાર'], + 'weekdays_short' => ['રવિ', 'સોમ', 'મંગળ', 'બુધ્', 'ગુરુ', 'શુક્ર', 'શનિ'], + 'weekdays_min' => ['ર', 'સો', 'મં', 'બુ', 'ગુ', 'શુ', 'શ'], + 'list' => [', ', ' અને '], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, + 'weekend' => [0, 0], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gu_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/gu_IN.php new file mode 100644 index 0000000..02654b1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gu_IN.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/gu.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/guz.php b/vendor/nesbot/carbon/src/Carbon/Lang/guz.php new file mode 100644 index 0000000..6230165 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/guz.php @@ -0,0 +1,47 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['Ma', 'Mo'], + 'weekdays' => ['Chumapiri', 'Chumatato', 'Chumaine', 'Chumatano', 'Aramisi', 'Ichuma', 'Esabato'], + 'weekdays_short' => ['Cpr', 'Ctt', 'Cmn', 'Cmt', 'Ars', 'Icm', 'Est'], + 'weekdays_min' => ['Cpr', 'Ctt', 'Cmn', 'Cmt', 'Ars', 'Icm', 'Est'], + 'months' => ['Chanuari', 'Feburari', 'Machi', 'Apiriri', 'Mei', 'Juni', 'Chulai', 'Agosti', 'Septemba', 'Okitoba', 'Nobemba', 'Disemba'], + 'months_short' => ['Can', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Cul', 'Agt', 'Sep', 'Okt', 'Nob', 'Dis'], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + + 'month' => ':count omotunyi', // less reliable + 'm' => ':count omotunyi', // less reliable + 'a_month' => ':count omotunyi', // less reliable + + 'week' => ':count isano naibere', // less reliable + 'w' => ':count isano naibere', // less reliable + 'a_week' => ':count isano naibere', // less reliable + + 'second' => ':count ibere', // less reliable + 's' => ':count ibere', // less reliable + 'a_second' => ':count ibere', // less reliable + + 'year' => ':count omwaka', + 'y' => ':count omwaka', + 'a_year' => ':count omwaka', + + 'day' => ':count rituko', + 'd' => ':count rituko', + 'a_day' => ':count rituko', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gv.php b/vendor/nesbot/carbon/src/Carbon/Lang/gv.php new file mode 100644 index 0000000..7c52b94 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gv.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/gv_GB.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/gv_GB.php b/vendor/nesbot/carbon/src/Carbon/Lang/gv_GB.php new file mode 100644 index 0000000..6b1168f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/gv_GB.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Alastair McKinstry bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['Jerrey-geuree', 'Toshiaght-arree', 'Mayrnt', 'Averil', 'Boaldyn', 'Mean-souree', 'Jerrey-souree', 'Luanistyn', 'Mean-fouyir', 'Jerrey-fouyir', 'Mee Houney', 'Mee ny Nollick'], + 'months_short' => ['J-guer', 'T-arree', 'Mayrnt', 'Avrril', 'Boaldyn', 'M-souree', 'J-souree', 'Luanistyn', 'M-fouyir', 'J-fouyir', 'M.Houney', 'M.Nollick'], + 'weekdays' => ['Jedoonee', 'Jelhein', 'Jemayrt', 'Jercean', 'Jerdein', 'Jeheiney', 'Jesarn'], + 'weekdays_short' => ['Jed', 'Jel', 'Jem', 'Jerc', 'Jerd', 'Jeh', 'Jes'], + 'weekdays_min' => ['Jed', 'Jel', 'Jem', 'Jerc', 'Jerd', 'Jeh', 'Jes'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + + 'year' => ':count blein', + 'y' => ':count blein', + 'a_year' => ':count blein', + + 'month' => ':count mee', + 'm' => ':count mee', + 'a_month' => ':count mee', + + 'week' => ':count shiaghtin', + 'w' => ':count shiaghtin', + 'a_week' => ':count shiaghtin', + + 'day' => ':count laa', + 'd' => ':count laa', + 'a_day' => ':count laa', + + 'hour' => ':count oor', + 'h' => ':count oor', + 'a_hour' => ':count oor', + + 'minute' => ':count feer veg', + 'min' => ':count feer veg', + 'a_minute' => ':count feer veg', + + 'second' => ':count derrey', + 's' => ':count derrey', + 'a_second' => ':count derrey', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ha.php b/vendor/nesbot/carbon/src/Carbon/Lang/ha.php new file mode 100644 index 0000000..cd8e34d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ha.php @@ -0,0 +1,60 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - pablo@mandriva.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM, YYYY', + 'LLL' => 'D MMMM, YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM, YYYY HH:mm', + ], + 'months' => ['Janairu', 'Faburairu', 'Maris', 'Afirilu', 'Mayu', 'Yuni', 'Yuli', 'Agusta', 'Satumba', 'Oktoba', 'Nuwamba', 'Disamba'], + 'months_short' => ['Jan', 'Fab', 'Mar', 'Afi', 'May', 'Yun', 'Yul', 'Agu', 'Sat', 'Okt', 'Nuw', 'Dis'], + 'weekdays' => ['Lahadi', 'Litini', 'Talata', 'Laraba', 'Alhamis', 'Jumaʼa', 'Asabar'], + 'weekdays_short' => ['Lah', 'Lit', 'Tal', 'Lar', 'Alh', 'Jum', 'Asa'], + 'weekdays_min' => ['Lh', 'Li', 'Ta', 'Lr', 'Al', 'Ju', 'As'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + + 'year' => 'shekara :count', + 'y' => 'shekara :count', + 'a_year' => 'shekara :count', + + 'month' => ':count wátàa', + 'm' => ':count wátàa', + 'a_month' => ':count wátàa', + + 'week' => ':count mako', + 'w' => ':count mako', + 'a_week' => ':count mako', + + 'day' => ':count rana', + 'd' => ':count rana', + 'a_day' => ':count rana', + + 'hour' => ':count áwàa', + 'h' => ':count áwàa', + 'a_hour' => ':count áwàa', + + 'minute' => 'minti :count', + 'min' => 'minti :count', + 'a_minute' => 'minti :count', + + 'second' => ':count ná bíyú', + 's' => ':count ná bíyú', + 'a_second' => ':count ná bíyú', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ha_GH.php b/vendor/nesbot/carbon/src/Carbon/Lang/ha_GH.php new file mode 100644 index 0000000..f9f99a7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ha_GH.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ha.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ha_NE.php b/vendor/nesbot/carbon/src/Carbon/Lang/ha_NE.php new file mode 100644 index 0000000..f9f99a7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ha_NE.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ha.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ha_NG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ha_NG.php new file mode 100644 index 0000000..f9f99a7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ha_NG.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ha.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hak.php b/vendor/nesbot/carbon/src/Carbon/Lang/hak.php new file mode 100644 index 0000000..6c3260e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hak.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/hak_TW.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hak_TW.php b/vendor/nesbot/carbon/src/Carbon/Lang/hak_TW.php new file mode 100644 index 0000000..fe23986 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hak_TW.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'YYYY年MM月DD日', + ], + 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], + 'months_short' => [' 1月', ' 2月', ' 3月', ' 4月', ' 5月', ' 6月', ' 7月', ' 8月', ' 9月', '10月', '11月', '12月'], + 'weekdays' => ['禮拜日', '禮拜一', '禮拜二', '禮拜三', '禮拜四', '禮拜五', '禮拜六'], + 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], + 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['上晝', '下晝'], + + 'year' => ':count ngien11', + 'y' => ':count ngien11', + 'a_year' => ':count ngien11', + + 'month' => ':count ngie̍t', + 'm' => ':count ngie̍t', + 'a_month' => ':count ngie̍t', + + 'week' => ':count lî-pai', + 'w' => ':count lî-pai', + 'a_week' => ':count lî-pai', + + 'day' => ':count ngit', + 'd' => ':count ngit', + 'a_day' => ':count ngit', + + 'hour' => ':count sṳ̀', + 'h' => ':count sṳ̀', + 'a_hour' => ':count sṳ̀', + + 'minute' => ':count fûn', + 'min' => ':count fûn', + 'a_minute' => ':count fûn', + + 'second' => ':count miéu', + 's' => ':count miéu', + 'a_second' => ':count miéu', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/haw.php b/vendor/nesbot/carbon/src/Carbon/Lang/haw.php new file mode 100644 index 0000000..cdd3686 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/haw.php @@ -0,0 +1,54 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'months' => ['Ianuali', 'Pepeluali', 'Malaki', 'ʻApelila', 'Mei', 'Iune', 'Iulai', 'ʻAukake', 'Kepakemapa', 'ʻOkakopa', 'Nowemapa', 'Kekemapa'], + 'months_short' => ['Ian.', 'Pep.', 'Mal.', 'ʻAp.', 'Mei', 'Iun.', 'Iul.', 'ʻAu.', 'Kep.', 'ʻOk.', 'Now.', 'Kek.'], + 'weekdays' => ['Lāpule', 'Poʻakahi', 'Poʻalua', 'Poʻakolu', 'Poʻahā', 'Poʻalima', 'Poʻaono'], + 'weekdays_short' => ['LP', 'P1', 'P2', 'P3', 'P4', 'P5', 'P6'], + 'weekdays_min' => ['S', 'M', 'T', 'W', 'T', 'F', 'S'], + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm a', + 'LLLL' => 'dddd, D MMMM YYYY h:mm a', + ], + + 'year' => ':count makahiki', + 'y' => ':count makahiki', + 'a_year' => ':count makahiki', + + 'month' => ':count mahina', + 'm' => ':count mahina', + 'a_month' => ':count mahina', + + 'week' => ':count pule', + 'w' => ':count pule', + 'a_week' => ':count pule', + + 'day' => ':count lā', + 'd' => ':count lā', + 'a_day' => ':count lā', + + 'hour' => ':count hola', + 'h' => ':count hola', + 'a_hour' => ':count hola', + + 'minute' => ':count minuke', + 'min' => ':count minuke', + 'a_minute' => ':count minuke', + + 'second' => ':count lua', + 's' => ':count lua', + 'a_second' => ':count lua', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/he.php b/vendor/nesbot/carbon/src/Carbon/Lang/he.php new file mode 100644 index 0000000..c3fb3e9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/he.php @@ -0,0 +1,86 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Daniel Cohen Gindi + * - JD Isaacks + * - Itai Nathaniel + * - GabMic + * - Yaakov Dahan (yakidahan) + */ +return [ + 'year' => 'שנה|{2}שנתיים|:count שנים', + 'y' => 'שנה|:count שנ׳', + 'month' => 'חודש|{2}חודשיים|:count חודשים', + 'm' => 'חודש|:count חו׳', + 'week' => 'שבוע|{2}שבועיים|:count שבועות', + 'w' => 'שבוע|:count שב׳', + 'day' => 'יום|{2}יומיים|:count ימים', + 'd' => 'יום|:count ימ׳', + 'hour' => 'שעה|{2}שעתיים|:count שעות', + 'h' => 'שעה|:count שע׳', + 'minute' => 'דקה|{2}שתי דקות|:count דקות', + 'min' => 'דקה|:count דק׳', + 'second' => 'שנייה|:count שניות', + 'a_second' => 'כמה שניות|:count שניות', + 's' => 'שניה|:count שנ׳', + 'ago' => 'לפני :time', + 'from_now' => 'בעוד :time מעכשיו', + 'after' => 'אחרי :time', + 'before' => 'לפני :time', + 'diff_now' => 'עכשיו', + 'diff_today' => 'היום', + 'diff_today_regexp' => 'היום(?:\\s+ב־)?', + 'diff_yesterday' => 'אתמול', + 'diff_yesterday_regexp' => 'אתמול(?:\\s+ב־)?', + 'diff_tomorrow' => 'מחר', + 'diff_tomorrow_regexp' => 'מחר(?:\\s+ב־)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D [ב]MMMM YYYY', + 'LLL' => 'D [ב]MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D [ב]MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[היום ב־]LT', + 'nextDay' => '[מחר ב־]LT', + 'nextWeek' => 'dddd [בשעה] LT', + 'lastDay' => '[אתמול ב־]LT', + 'lastWeek' => '[ביום] dddd [האחרון בשעה] LT', + 'sameElse' => 'L', + ], + 'meridiem' => function ($hour, $minute, $isLower) { + if ($hour < 5) { + return 'לפנות בוקר'; + } + if ($hour < 10) { + return 'בבוקר'; + } + if ($hour < 12) { + return $isLower ? 'לפנה"צ' : 'לפני הצהריים'; + } + if ($hour < 18) { + return $isLower ? 'אחה"צ' : 'אחרי הצהריים'; + } + + return 'בערב'; + }, + 'months' => ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'], + 'months_short' => ['ינו׳', 'פבר׳', 'מרץ', 'אפר׳', 'מאי', 'יוני', 'יולי', 'אוג׳', 'ספט׳', 'אוק׳', 'נוב׳', 'דצמ׳'], + 'weekdays' => ['ראשון', 'שני', 'שלישי', 'רביעי', 'חמישי', 'שישי', 'שבת'], + 'weekdays_short' => ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'], + 'weekdays_min' => ['א', 'ב', 'ג', 'ד', 'ה', 'ו', 'ש'], + 'list' => [', ', ' ו -'], + 'weekend' => [5, 6], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/he_IL.php b/vendor/nesbot/carbon/src/Carbon/Lang/he_IL.php new file mode 100644 index 0000000..14fab3e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/he_IL.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/he.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hi.php b/vendor/nesbot/carbon/src/Carbon/Lang/hi.php new file mode 100644 index 0000000..70c57a2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hi.php @@ -0,0 +1,82 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - abhimanyu003 + * - Josh Soref + * - JD Isaacks + */ +return [ + 'year' => 'एक वर्ष|:count वर्ष', + 'y' => '1 वर्ष|:count वर्षों', + 'month' => 'एक महीने|:count महीने', + 'm' => '1 माह|:count महीने', + 'week' => '1 सप्ताह|:count सप्ताह', + 'w' => '1 सप्ताह|:count सप्ताह', + 'day' => 'एक दिन|:count दिन', + 'd' => '1 दिन|:count दिनों', + 'hour' => 'एक घंटा|:count घंटे', + 'h' => '1 घंटा|:count घंटे', + 'minute' => 'एक मिनट|:count मिनट', + 'min' => '1 मिनट|:count मिनटों', + 'second' => 'कुछ ही क्षण|:count सेकंड', + 's' => '1 सेकंड|:count सेकंड', + 'ago' => ':time पहले', + 'from_now' => ':time में', + 'after' => ':time के बाद', + 'before' => ':time के पहले', + 'diff_now' => 'अब', + 'diff_today' => 'आज', + 'diff_yesterday' => 'कल', + 'diff_tomorrow' => 'कल', + 'formats' => [ + 'LT' => 'A h:mm बजे', + 'LTS' => 'A h:mm:ss बजे', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY, A h:mm बजे', + 'LLLL' => 'dddd, D MMMM YYYY, A h:mm बजे', + ], + 'calendar' => [ + 'sameDay' => '[आज] LT', + 'nextDay' => '[कल] LT', + 'nextWeek' => 'dddd, LT', + 'lastDay' => '[कल] LT', + 'lastWeek' => '[पिछले] dddd, LT', + 'sameElse' => 'L', + ], + 'meridiem' => function ($hour) { + if ($hour < 4) { + return 'रात'; + } + if ($hour < 10) { + return 'सुबह'; + } + if ($hour < 17) { + return 'दोपहर'; + } + if ($hour < 20) { + return 'शाम'; + } + + return 'रात'; + }, + 'months' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], + 'months_short' => ['जन.', 'फ़र.', 'मार्च', 'अप्रै.', 'मई', 'जून', 'जुल.', 'अग.', 'सित.', 'अक्टू.', 'नव.', 'दिस.'], + 'weekdays' => ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरूवार', 'शुक्रवार', 'शनिवार'], + 'weekdays_short' => ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरू', 'शुक्र', 'शनि'], + 'weekdays_min' => ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'], + 'list' => [', ', ' और '], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, + 'weekend' => [0, 0], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hi_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/hi_IN.php new file mode 100644 index 0000000..749dd97 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hi_IN.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/hi.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hif.php b/vendor/nesbot/carbon/src/Carbon/Lang/hif.php new file mode 100644 index 0000000..65791dd --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hif.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/hif_FJ.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hif_FJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/hif_FJ.php new file mode 100644 index 0000000..30ad5e7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hif_FJ.php @@ -0,0 +1,54 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Samsung Electronics Co., Ltd. akhilesh.k@samsung.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'dddd DD MMM YYYY', + ], + 'months' => ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + 'weekdays' => ['Ravivar', 'Somvar', 'Mangalvar', 'Budhvar', 'Guruvar', 'Shukravar', 'Shanivar'], + 'weekdays_short' => ['Ravi', 'Som', 'Mangal', 'Budh', 'Guru', 'Shukra', 'Shani'], + 'weekdays_min' => ['Ravi', 'Som', 'Mangal', 'Budh', 'Guru', 'Shukra', 'Shani'], + 'meridiem' => ['Purvahan', 'Aparaahna'], + + 'hour' => ':count minit', // less reliable + 'h' => ':count minit', // less reliable + 'a_hour' => ':count minit', // less reliable + + 'year' => ':count saal', + 'y' => ':count saal', + 'a_year' => ':count saal', + + 'month' => ':count Mahina', + 'm' => ':count Mahina', + 'a_month' => ':count Mahina', + + 'week' => ':count Hafta', + 'w' => ':count Hafta', + 'a_week' => ':count Hafta', + + 'day' => ':count Din', + 'd' => ':count Din', + 'a_day' => ':count Din', + + 'minute' => ':count Minit', + 'min' => ':count Minit', + 'a_minute' => ':count Minit', + + 'second' => ':count Second', + 's' => ':count Second', + 'a_second' => ':count Second', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hne.php b/vendor/nesbot/carbon/src/Carbon/Lang/hne.php new file mode 100644 index 0000000..4bcb05c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hne.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/hne_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hne_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/hne_IN.php new file mode 100644 index 0000000..a5ca758 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hne_IN.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Red Hat, Pune bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'अपरेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितमबर', 'अकटूबर', 'नवमबर', 'दिसमबर'], + 'months_short' => ['जन', 'फर', 'मार्च', 'अप', 'मई', 'जून', 'जुला', 'अग', 'सित', 'अकटू', 'नव', 'दिस'], + 'weekdays' => ['इतवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'बिरसपत', 'सुकरवार', 'सनिवार'], + 'weekdays_short' => ['इत', 'सोम', 'मंग', 'बुध', 'बिर', 'सुक', 'सनि'], + 'weekdays_min' => ['इत', 'सोम', 'मंग', 'बुध', 'बिर', 'सुक', 'सनि'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['बिहिनियाँ', 'मंझनियाँ'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hr.php b/vendor/nesbot/carbon/src/Carbon/Lang/hr.php new file mode 100644 index 0000000..cfd85fd --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hr.php @@ -0,0 +1,111 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - François B + * - Tim Fish + * - shaishavgandhi05 + * - Serhan Apaydın + * - JD Isaacks + * - tomhorvat + * - Josh Soref + * - François B + * - shaishavgandhi05 + * - Serhan Apaydın + * - JD Isaacks + * - tomhorvat + * - Stjepan Majdak + * - Vanja Retkovac (vr00) + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => ':count godinu|:count godine|:count godina', + 'y' => ':count god.|:count god.|:count god.', + 'month' => ':count mjesec|:count mjeseca|:count mjeseci', + 'm' => ':count mj.|:count mj.|:count mj.', + 'week' => ':count tjedan|:count tjedna|:count tjedana', + 'w' => ':count tj.|:count tj.|:count tj.', + 'day' => ':count dan|:count dana|:count dana', + 'd' => ':count d.|:count d.|:count d.', + 'hour' => ':count sat|:count sata|:count sati', + 'h' => ':count sat|:count sata|:count sati', + 'minute' => ':count minutu|:count minute|:count minuta', + 'min' => ':count min.|:count min.|:count min.', + 'second' => ':count sekundu|:count sekunde|:count sekundi', + 'a_second' => 'nekoliko sekundi|:count sekunde|:count sekundi', + 's' => ':count sek.|:count sek.|:count sek.', + 'ago' => 'prije :time', + 'from_now' => 'za :time', + 'after' => ':time poslije', + 'before' => ':time prije', + 'diff_now' => 'sad', + 'diff_today' => 'danas', + 'diff_today_regexp' => 'danas(?:\\s+u)?', + 'diff_yesterday' => 'jučer', + 'diff_yesterday_regexp' => 'jučer(?:\\s+u)?', + 'diff_tomorrow' => 'sutra', + 'diff_tomorrow_regexp' => 'sutra(?:\\s+u)?', + 'diff_before_yesterday' => 'prekjučer', + 'diff_after_tomorrow' => 'prekosutra', + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'D. M. YYYY.', + 'LL' => 'D. MMMM YYYY.', + 'LLL' => 'D. MMMM YYYY. H:mm', + 'LLLL' => 'dddd, D. MMMM YYYY. H:mm', + ], + 'calendar' => [ + 'sameDay' => '[danas u] LT', + 'nextDay' => '[sutra u] LT', + 'nextWeek' => function (CarbonInterface $date) { + switch ($date->dayOfWeek) { + case 0: + return '[u] [nedjelju] [u] LT'; + case 3: + return '[u] [srijedu] [u] LT'; + case 6: + return '[u] [subotu] [u] LT'; + default: + return '[u] dddd [u] LT'; + } + }, + 'lastDay' => '[jučer u] LT', + 'lastWeek' => function (CarbonInterface $date) { + switch ($date->dayOfWeek) { + case 0: + case 3: + return '[prošlu] dddd [u] LT'; + case 6: + return '[prošle] [subote] [u] LT'; + default: + return '[prošli] dddd [u] LT'; + } + }, + 'sameElse' => 'L', + ], + 'ordinal' => ':number.', + 'months' => ['siječnja', 'veljače', 'ožujka', 'travnja', 'svibnja', 'lipnja', 'srpnja', 'kolovoza', 'rujna', 'listopada', 'studenoga', 'prosinca'], + 'months_standalone' => ['siječanj', 'veljača', 'ožujak', 'travanj', 'svibanj', 'lipanj', 'srpanj', 'kolovoz', 'rujan', 'listopad', 'studeni', 'prosinac'], + 'months_short' => ['sij.', 'velj.', 'ožu.', 'tra.', 'svi.', 'lip.', 'srp.', 'kol.', 'ruj.', 'lis.', 'stu.', 'pro.'], + 'months_regexp' => '/(D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', + 'weekdays' => ['nedjelju', 'ponedjeljak', 'utorak', 'srijedu', 'četvrtak', 'petak', 'subotu'], + 'weekdays_standalone' => ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'], + 'weekdays_short' => ['ned.', 'pon.', 'uto.', 'sri.', 'čet.', 'pet.', 'sub.'], + 'weekdays_min' => ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' i '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hr_BA.php b/vendor/nesbot/carbon/src/Carbon/Lang/hr_BA.php new file mode 100644 index 0000000..7763a45 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hr_BA.php @@ -0,0 +1,32 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - DarkoDevelop + */ +return array_replace_recursive(require __DIR__.'/hr.php', [ + 'weekdays' => ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'], + 'weekdays_short' => ['ned', 'pon', 'uto', 'sri', 'čet', 'pet', 'sub'], + 'weekdays_min' => ['ned', 'pon', 'uto', 'sri', 'čet', 'pet', 'sub'], + 'months' => ['siječnja', 'veljače', 'ožujka', 'travnja', 'svibnja', 'lipnja', 'srpnja', 'kolovoza', 'rujna', 'listopada', 'studenoga', 'prosinca'], + 'months_short' => ['sij', 'velj', 'ožu', 'tra', 'svi', 'lip', 'srp', 'kol', 'ruj', 'lis', 'stu', 'pro'], + 'months_standalone' => ['siječanj', 'veljača', 'ožujak', 'travanj', 'svibanj', 'lipanj', 'srpanj', 'kolovoz', 'rujan', 'listopad', 'studeni', 'prosinac'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D. M. yy.', + 'LL' => 'D. MMM YYYY.', + 'LLL' => 'D. MMMM YYYY. HH:mm', + 'LLLL' => 'dddd, D. MMMM YYYY. HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hr_HR.php b/vendor/nesbot/carbon/src/Carbon/Lang/hr_HR.php new file mode 100644 index 0000000..db74d8c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hr_HR.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/hr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hsb.php b/vendor/nesbot/carbon/src/Carbon/Lang/hsb.php new file mode 100644 index 0000000..3537b8b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hsb.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/hsb_DE.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hsb_DE.php b/vendor/nesbot/carbon/src/Carbon/Lang/hsb_DE.php new file mode 100644 index 0000000..6ba2271 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hsb_DE.php @@ -0,0 +1,60 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Information from Michael Wolf Andrzej Krzysztofowicz ankry@mif.pg.gda.pl + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'DD. MMMM YYYY', + 'LLL' => 'DD. MMMM, HH:mm [hodź.]', + 'LLLL' => 'dddd, DD. MMMM YYYY, HH:mm [hodź.]', + ], + 'months' => ['januara', 'februara', 'měrca', 'apryla', 'meje', 'junija', 'julija', 'awgusta', 'septembra', 'oktobra', 'nowembra', 'decembra'], + 'months_short' => ['Jan', 'Feb', 'Měr', 'Apr', 'Mej', 'Jun', 'Jul', 'Awg', 'Sep', 'Okt', 'Now', 'Dec'], + 'weekdays' => ['Njedźela', 'Póndźela', 'Wutora', 'Srjeda', 'Štvórtk', 'Pjatk', 'Sobota'], + 'weekdays_short' => ['Nj', 'Pó', 'Wu', 'Sr', 'Št', 'Pj', 'So'], + 'weekdays_min' => ['Nj', 'Pó', 'Wu', 'Sr', 'Št', 'Pj', 'So'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + + 'year' => ':count lěto', + 'y' => ':count lěto', + 'a_year' => ':count lěto', + + 'month' => ':count měsac', + 'm' => ':count měsac', + 'a_month' => ':count měsac', + + 'week' => ':count tydźeń', + 'w' => ':count tydźeń', + 'a_week' => ':count tydźeń', + + 'day' => ':count dźeń', + 'd' => ':count dźeń', + 'a_day' => ':count dźeń', + + 'hour' => ':count hodźina', + 'h' => ':count hodźina', + 'a_hour' => ':count hodźina', + + 'minute' => ':count chwila', + 'min' => ':count chwila', + 'a_minute' => ':count chwila', + + 'second' => ':count druhi', + 's' => ':count druhi', + 'a_second' => ':count druhi', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ht.php b/vendor/nesbot/carbon/src/Carbon/Lang/ht.php new file mode 100644 index 0000000..ebd12ad --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ht.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/ht_HT.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ht_HT.php b/vendor/nesbot/carbon/src/Carbon/Lang/ht_HT.php new file mode 100644 index 0000000..139b813 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ht_HT.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Sugar Labs // OLPC sugarlabs.org libc-alpha@sourceware.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['janvye', 'fevriye', 'mas', 'avril', 'me', 'jen', 'jiyè', 'out', 'septanm', 'oktòb', 'novanm', 'desanm'], + 'months_short' => ['jan', 'fev', 'mas', 'avr', 'me', 'jen', 'jiy', 'out', 'sep', 'okt', 'nov', 'des'], + 'weekdays' => ['dimanch', 'lendi', 'madi', 'mèkredi', 'jedi', 'vandredi', 'samdi'], + 'weekdays_short' => ['dim', 'len', 'mad', 'mèk', 'jed', 'van', 'sam'], + 'weekdays_min' => ['dim', 'len', 'mad', 'mèk', 'jed', 'van', 'sam'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + + 'year' => ':count lane', + 'y' => ':count lane', + 'a_year' => ':count lane', + + 'month' => 'mwa :count', + 'm' => 'mwa :count', + 'a_month' => 'mwa :count', + + 'week' => 'semèn :count', + 'w' => 'semèn :count', + 'a_week' => 'semèn :count', + + 'day' => ':count jou', + 'd' => ':count jou', + 'a_day' => ':count jou', + + 'hour' => ':count lè', + 'h' => ':count lè', + 'a_hour' => ':count lè', + + 'minute' => ':count minit', + 'min' => ':count minit', + 'a_minute' => ':count minit', + + 'second' => ':count segonn', + 's' => ':count segonn', + 'a_second' => ':count segonn', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hu.php b/vendor/nesbot/carbon/src/Carbon/Lang/hu.php new file mode 100644 index 0000000..b2d2ac1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hu.php @@ -0,0 +1,118 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Adam Brunner + * - Brett Johnson + * - balping + */ + +use Carbon\CarbonInterface; + +$huWeekEndings = ['vasárnap', 'hétfőn', 'kedden', 'szerdán', 'csütörtökön', 'pénteken', 'szombaton']; + +return [ + 'year' => ':count év', + 'y' => ':count év', + 'month' => ':count hónap', + 'm' => ':count hónap', + 'week' => ':count hét', + 'w' => ':count hét', + 'day' => ':count nap', + 'd' => ':count nap', + 'hour' => ':count óra', + 'h' => ':count óra', + 'minute' => ':count perc', + 'min' => ':count perc', + 'second' => ':count másodperc', + 's' => ':count másodperc', + 'ago' => ':time', + 'from_now' => ':time múlva', + 'after' => ':time később', + 'before' => ':time korábban', + 'year_ago' => ':count éve', + 'y_ago' => ':count éve', + 'month_ago' => ':count hónapja', + 'm_ago' => ':count hónapja', + 'week_ago' => ':count hete', + 'w_ago' => ':count hete', + 'day_ago' => ':count napja', + 'd_ago' => ':count napja', + 'hour_ago' => ':count órája', + 'h_ago' => ':count órája', + 'minute_ago' => ':count perce', + 'min_ago' => ':count perce', + 'second_ago' => ':count másodperce', + 's_ago' => ':count másodperce', + 'year_after' => ':count évvel', + 'y_after' => ':count évvel', + 'month_after' => ':count hónappal', + 'm_after' => ':count hónappal', + 'week_after' => ':count héttel', + 'w_after' => ':count héttel', + 'day_after' => ':count nappal', + 'd_after' => ':count nappal', + 'hour_after' => ':count órával', + 'h_after' => ':count órával', + 'minute_after' => ':count perccel', + 'min_after' => ':count perccel', + 'second_after' => ':count másodperccel', + 's_after' => ':count másodperccel', + 'year_before' => ':count évvel', + 'y_before' => ':count évvel', + 'month_before' => ':count hónappal', + 'm_before' => ':count hónappal', + 'week_before' => ':count héttel', + 'w_before' => ':count héttel', + 'day_before' => ':count nappal', + 'd_before' => ':count nappal', + 'hour_before' => ':count órával', + 'h_before' => ':count órával', + 'minute_before' => ':count perccel', + 'min_before' => ':count perccel', + 'second_before' => ':count másodperccel', + 's_before' => ':count másodperccel', + 'months' => ['január', 'február', 'március', 'április', 'május', 'június', 'július', 'augusztus', 'szeptember', 'október', 'november', 'december'], + 'months_short' => ['jan.', 'feb.', 'márc.', 'ápr.', 'máj.', 'jún.', 'júl.', 'aug.', 'szept.', 'okt.', 'nov.', 'dec.'], + 'weekdays' => ['vasárnap', 'hétfő', 'kedd', 'szerda', 'csütörtök', 'péntek', 'szombat'], + 'weekdays_short' => ['vas', 'hét', 'kedd', 'sze', 'csüt', 'pén', 'szo'], + 'weekdays_min' => ['v', 'h', 'k', 'sze', 'cs', 'p', 'sz'], + 'ordinal' => ':number.', + 'diff_now' => 'most', + 'diff_today' => 'ma', + 'diff_yesterday' => 'tegnap', + 'diff_tomorrow' => 'holnap', + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'YYYY.MM.DD.', + 'LL' => 'YYYY. MMMM D.', + 'LLL' => 'YYYY. MMMM D. H:mm', + 'LLLL' => 'YYYY. MMMM D., dddd H:mm', + ], + 'calendar' => [ + 'sameDay' => '[ma] LT[-kor]', + 'nextDay' => '[holnap] LT[-kor]', + 'nextWeek' => function (CarbonInterface $date) use ($huWeekEndings) { + return '['.$huWeekEndings[$date->dayOfWeek].'] LT[-kor]'; + }, + 'lastDay' => '[tegnap] LT[-kor]', + 'lastWeek' => function (CarbonInterface $date) use ($huWeekEndings) { + return '[múlt '.$huWeekEndings[$date->dayOfWeek].'] LT[-kor]'; + }, + 'sameElse' => 'L', + ], + 'meridiem' => ['DE', 'DU'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' és '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hu_HU.php b/vendor/nesbot/carbon/src/Carbon/Lang/hu_HU.php new file mode 100644 index 0000000..b1c4854 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hu_HU.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/hu.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hy.php b/vendor/nesbot/carbon/src/Carbon/Lang/hy.php new file mode 100644 index 0000000..8b12994 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hy.php @@ -0,0 +1,95 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - mhamlet + */ +return [ + 'year' => ':count տարի', + 'a_year' => 'տարի|:count տարի', + 'y' => ':countտ', + 'month' => ':count ամիս', + 'a_month' => 'ամիս|:count ամիս', + 'm' => ':countամ', + 'week' => ':count շաբաթ', + 'a_week' => 'շաբաթ|:count շաբաթ', + 'w' => ':countշ', + 'day' => ':count օր', + 'a_day' => 'օր|:count օր', + 'd' => ':countօր', + 'hour' => ':count ժամ', + 'a_hour' => 'ժամ|:count ժամ', + 'h' => ':countժ', + 'minute' => ':count րոպե', + 'a_minute' => 'րոպե|:count րոպե', + 'min' => ':countր', + 'second' => ':count վայրկյան', + 'a_second' => 'մի քանի վայրկյան|:count վայրկյան', + 's' => ':countվրկ', + 'ago' => ':time առաջ', + 'from_now' => ':timeից', + 'after' => ':time հետո', + 'before' => ':time առաջ', + 'diff_now' => 'հիմա', + 'diff_today' => 'այսօր', + 'diff_yesterday' => 'երեկ', + 'diff_tomorrow' => 'վաղը', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D MMMM YYYY թ.', + 'LLL' => 'D MMMM YYYY թ., HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY թ., HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[այսօր] LT', + 'nextDay' => '[վաղը] LT', + 'nextWeek' => 'dddd [օրը ժամը] LT', + 'lastDay' => '[երեկ] LT', + 'lastWeek' => '[անցած] dddd [օրը ժամը] LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number, $period) { + switch ($period) { + case 'DDD': + case 'w': + case 'W': + case 'DDDo': + return $number.($number === 1 ? '-ին' : '-րդ'); + default: + return $number; + } + }, + 'meridiem' => function ($hour) { + if ($hour < 4) { + return 'գիշերվա'; + } + if ($hour < 12) { + return 'առավոտվա'; + } + if ($hour < 17) { + return 'ցերեկվա'; + } + + return 'երեկոյան'; + }, + 'months' => ['հունվարի', 'փետրվարի', 'մարտի', 'ապրիլի', 'մայիսի', 'հունիսի', 'հուլիսի', 'օգոստոսի', 'սեպտեմբերի', 'հոկտեմբերի', 'նոյեմբերի', 'դեկտեմբերի'], + 'months_standalone' => ['հունվար', 'փետրվար', 'մարտ', 'ապրիլ', 'մայիս', 'հունիս', 'հուլիս', 'օգոստոս', 'սեպտեմբեր', 'հոկտեմբեր', 'նոյեմբեր', 'դեկտեմբեր'], + 'months_short' => ['հնվ', 'փտր', 'մրտ', 'ապր', 'մյս', 'հնս', 'հլս', 'օգս', 'սպտ', 'հկտ', 'նմբ', 'դկտ'], + 'months_regexp' => '/(D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', + 'weekdays' => ['կիրակի', 'երկուշաբթի', 'երեքշաբթի', 'չորեքշաբթի', 'հինգշաբթի', 'ուրբաթ', 'շաբաթ'], + 'weekdays_short' => ['կրկ', 'երկ', 'երք', 'չրք', 'հնգ', 'ուրբ', 'շբթ'], + 'weekdays_min' => ['կրկ', 'երկ', 'երք', 'չրք', 'հնգ', 'ուրբ', 'շբթ'], + 'list' => [', ', ' եւ '], + 'first_day_of_week' => 1, +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/hy_AM.php b/vendor/nesbot/carbon/src/Carbon/Lang/hy_AM.php new file mode 100644 index 0000000..4587df5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/hy_AM.php @@ -0,0 +1,24 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - François B + * - Tim Fish + * - Serhan Apaydın + * - JD Isaacks + */ +return array_replace_recursive(require __DIR__.'/hy.php', [ + 'from_now' => ':time հետո', + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/i18n.php b/vendor/nesbot/carbon/src/Carbon/Lang/i18n.php new file mode 100644 index 0000000..e65449b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/i18n.php @@ -0,0 +1,23 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'YYYY-MM-DD', + ], + 'months' => ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'], + 'months_short' => ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'], + 'weekdays' => ['1', '2', '3', '4', '5', '6', '7'], + 'weekdays_short' => ['1', '2', '3', '4', '5', '6', '7'], + 'weekdays_min' => ['1', '2', '3', '4', '5', '6', '7'], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 4, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ia.php b/vendor/nesbot/carbon/src/Carbon/Lang/ia.php new file mode 100644 index 0000000..0a0d5e6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ia.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/ia_FR.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ia_FR.php b/vendor/nesbot/carbon/src/Carbon/Lang/ia_FR.php new file mode 100644 index 0000000..de4b2fa --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ia_FR.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Fedora Project Nik Kalach nikka@fedoraproject.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], + 'months' => ['januario', 'februario', 'martio', 'april', 'maio', 'junio', 'julio', 'augusto', 'septembre', 'octobre', 'novembre', 'decembre'], + 'months_short' => ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'], + 'weekdays' => ['dominica', 'lunedi', 'martedi', 'mercuridi', 'jovedi', 'venerdi', 'sabbato'], + 'weekdays_short' => ['dom', 'lun', 'mar', 'mer', 'jov', 'ven', 'sab'], + 'weekdays_min' => ['dom', 'lun', 'mar', 'mer', 'jov', 'ven', 'sab'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + + 'year' => 'anno :count', + 'y' => 'anno :count', + 'a_year' => 'anno :count', + + 'month' => ':count mense', + 'm' => ':count mense', + 'a_month' => ':count mense', + + 'week' => ':count septimana', + 'w' => ':count septimana', + 'a_week' => ':count septimana', + + 'day' => ':count die', + 'd' => ':count die', + 'a_day' => ':count die', + + 'hour' => ':count hora', + 'h' => ':count hora', + 'a_hour' => ':count hora', + + 'minute' => ':count minuscule', + 'min' => ':count minuscule', + 'a_minute' => ':count minuscule', + + 'second' => ':count secunda', + 's' => ':count secunda', + 'a_second' => ':count secunda', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/id.php b/vendor/nesbot/carbon/src/Carbon/Lang/id.php new file mode 100644 index 0000000..afaf78f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/id.php @@ -0,0 +1,92 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - du + * - JD Isaacks + * - Nafies Luthfi + * - Raymundus Jati Primanda (mundusjp) + * - diankur313 + * - a-wip0 + */ +return [ + 'year' => ':count tahun', + 'a_year' => '{1}setahun|]1,Inf[:count tahun', + 'y' => ':countthn', + 'month' => ':count bulan', + 'a_month' => '{1}sebulan|]1,Inf[:count bulan', + 'm' => ':countbln', + 'week' => ':count minggu', + 'a_week' => '{1}seminggu|]1,Inf[:count minggu', + 'w' => ':countmgg', + 'day' => ':count hari', + 'a_day' => '{1}sehari|]1,Inf[:count hari', + 'd' => ':counthr', + 'hour' => ':count jam', + 'a_hour' => '{1}sejam|]1,Inf[:count jam', + 'h' => ':countj', + 'minute' => ':count menit', + 'a_minute' => '{1}semenit|]1,Inf[:count menit', + 'min' => ':countmnt', + 'second' => ':count detik', + 'a_second' => '{1}beberapa detik|]1,Inf[:count detik', + 's' => ':countdt', + 'ago' => ':time yang lalu', + 'from_now' => ':time dari sekarang', + 'after' => ':time setelahnya', + 'before' => ':time sebelumnya', + 'diff_now' => 'sekarang', + 'diff_today' => 'Hari', + 'diff_today_regexp' => 'Hari(?:\\s+ini)?(?:\\s+pukul)?', + 'diff_yesterday' => 'kemarin', + 'diff_yesterday_regexp' => 'Kemarin(?:\\s+pukul)?', + 'diff_tomorrow' => 'besok', + 'diff_tomorrow_regexp' => 'Besok(?:\\s+pukul)?', + 'formats' => [ + 'LT' => 'HH.mm', + 'LTS' => 'HH.mm.ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY [pukul] HH.mm', + 'LLLL' => 'dddd, D MMMM YYYY [pukul] HH.mm', + ], + 'calendar' => [ + 'sameDay' => '[Hari ini pukul] LT', + 'nextDay' => '[Besok pukul] LT', + 'nextWeek' => 'dddd [pukul] LT', + 'lastDay' => '[Kemarin pukul] LT', + 'lastWeek' => 'dddd [lalu pukul] LT', + 'sameElse' => 'L', + ], + 'meridiem' => function ($hour) { + if ($hour < 11) { + return 'pagi'; + } + if ($hour < 15) { + return 'siang'; + } + if ($hour < 19) { + return 'sore'; + } + + return 'malam'; + }, + 'months' => ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'], + 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agt', 'Sep', 'Okt', 'Nov', 'Des'], + 'weekdays' => ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'], + 'weekdays_short' => ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'], + 'weekdays_min' => ['Mg', 'Sn', 'Sl', 'Rb', 'Km', 'Jm', 'Sb'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' dan '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/id_ID.php b/vendor/nesbot/carbon/src/Carbon/Lang/id_ID.php new file mode 100644 index 0000000..d5953a1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/id_ID.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/id.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ig.php b/vendor/nesbot/carbon/src/Carbon/Lang/ig.php new file mode 100644 index 0000000..de51e9c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ig.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/ig_NG.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ig_NG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ig_NG.php new file mode 100644 index 0000000..0034e35 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ig_NG.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - pablo@mandriva.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['Jenụwarị', 'Febrụwarị', 'Maachị', 'Eprel', 'Mee', 'Juun', 'Julaị', 'Ọgọọst', 'Septemba', 'Ọktoba', 'Novemba', 'Disemba'], + 'months_short' => ['Jen', 'Feb', 'Maa', 'Epr', 'Mee', 'Juu', 'Jul', 'Ọgọ', 'Sep', 'Ọkt', 'Nov', 'Dis'], + 'weekdays' => ['sọnde', 'mọnde', 'tuzde', 'wenzde', 'tọsde', 'fraịde', 'satọde'], + 'weekdays_short' => ['sọn', 'mọn', 'tuz', 'wen', 'tọs', 'fra', 'sat'], + 'weekdays_min' => ['sọn', 'mọn', 'tuz', 'wen', 'tọs', 'fra', 'sat'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + + 'year' => 'afo :count', + 'y' => 'afo :count', + 'a_year' => 'afo :count', + + 'month' => 'önwa :count', + 'm' => 'önwa :count', + 'a_month' => 'önwa :count', + + 'week' => 'izu :count', + 'w' => 'izu :count', + 'a_week' => 'izu :count', + + 'day' => 'ụbọchị :count', + 'd' => 'ụbọchị :count', + 'a_day' => 'ụbọchị :count', + + 'hour' => 'awa :count', + 'h' => 'awa :count', + 'a_hour' => 'awa :count', + + 'minute' => 'minit :count', + 'min' => 'minit :count', + 'a_minute' => 'minit :count', + + 'second' => 'sekọnd :count', + 's' => 'sekọnd :count', + 'a_second' => 'sekọnd :count', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ii.php b/vendor/nesbot/carbon/src/Carbon/Lang/ii.php new file mode 100644 index 0000000..a4246c2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ii.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['ꎸꄑ', 'ꁯꋒ'], + 'weekdays' => ['ꑭꆏꑍ', 'ꆏꊂꋍ', 'ꆏꊂꑍ', 'ꆏꊂꌕ', 'ꆏꊂꇖ', 'ꆏꊂꉬ', 'ꆏꊂꃘ'], + 'weekdays_short' => ['ꑭꆏ', 'ꆏꋍ', 'ꆏꑍ', 'ꆏꌕ', 'ꆏꇖ', 'ꆏꉬ', 'ꆏꃘ'], + 'weekdays_min' => ['ꑭꆏ', 'ꆏꋍ', 'ꆏꑍ', 'ꆏꌕ', 'ꆏꇖ', 'ꆏꉬ', 'ꆏꃘ'], + 'months' => null, + 'months_short' => ['ꋍꆪ', 'ꑍꆪ', 'ꌕꆪ', 'ꇖꆪ', 'ꉬꆪ', 'ꃘꆪ', 'ꏃꆪ', 'ꉆꆪ', 'ꈬꆪ', 'ꊰꆪ', 'ꊰꊪꆪ', 'ꊰꑋꆪ'], + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'YYYY-MM-dd', + 'LL' => 'YYYY MMM D', + 'LLL' => 'YYYY MMMM D h:mm a', + 'LLLL' => 'YYYY MMMM D, dddd h:mm a', + ], + + 'year' => ':count ꒉ', // less reliable + 'y' => ':count ꒉ', // less reliable + 'a_year' => ':count ꒉ', // less reliable + + 'month' => ':count ꆪ', + 'm' => ':count ꆪ', + 'a_month' => ':count ꆪ', + + 'week' => ':count ꏃ', // less reliable + 'w' => ':count ꏃ', // less reliable + 'a_week' => ':count ꏃ', // less reliable + + 'day' => ':count ꏜ', // less reliable + 'd' => ':count ꏜ', // less reliable + 'a_day' => ':count ꏜ', // less reliable + + 'hour' => ':count ꄮꈉ', + 'h' => ':count ꄮꈉ', + 'a_hour' => ':count ꄮꈉ', + + 'minute' => ':count ꀄꊭ', // less reliable + 'min' => ':count ꀄꊭ', // less reliable + 'a_minute' => ':count ꀄꊭ', // less reliable + + 'second' => ':count ꇅ', // less reliable + 's' => ':count ꇅ', // less reliable + 'a_second' => ':count ꇅ', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ik.php b/vendor/nesbot/carbon/src/Carbon/Lang/ik.php new file mode 100644 index 0000000..7a13aa2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ik.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/ik_CA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ik_CA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ik_CA.php new file mode 100644 index 0000000..bb2a109 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ik_CA.php @@ -0,0 +1,50 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - pablo@mandriva.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['Siqiññaatchiaq', 'Siqiññaasrugruk', 'Paniqsiqsiivik', 'Qilġich Tatqiat', 'Suppivik', 'Iġñivik', 'Itchavik', 'Tiññivik', 'Amiġaiqsivik', 'Sikkuvik', 'Nippivik', 'Siqiñġiḷaq'], + 'months_short' => ['Sñt', 'Sñs', 'Pan', 'Qil', 'Sup', 'Iġñ', 'Itc', 'Tiñ', 'Ami', 'Sik', 'Nip', 'Siq'], + 'weekdays' => ['Minġuiqsioiq', 'Savałłiq', 'Ilaqtchiioiq', 'Qitchiioiq', 'Sisamiioiq', 'Tallimmiioiq', 'Maqinġuoiq'], + 'weekdays_short' => ['Min', 'Sav', 'Ila', 'Qit', 'Sis', 'Tal', 'Maq'], + 'weekdays_min' => ['Min', 'Sav', 'Ila', 'Qit', 'Sis', 'Tal', 'Maq'], + 'day_of_first_week_of_year' => 1, + + 'year' => ':count ukiuq', + 'y' => ':count ukiuq', + 'a_year' => ':count ukiuq', + + 'month' => ':count Tatqiat', + 'm' => ':count Tatqiat', + 'a_month' => ':count Tatqiat', + + 'week' => ':count tatqiat', // less reliable + 'w' => ':count tatqiat', // less reliable + 'a_week' => ':count tatqiat', // less reliable + + 'day' => ':count siqiñiq', // less reliable + 'd' => ':count siqiñiq', // less reliable + 'a_day' => ':count siqiñiq', // less reliable + + 'hour' => ':count Siḷa', // less reliable + 'h' => ':count Siḷa', // less reliable + 'a_hour' => ':count Siḷa', // less reliable + + 'second' => ':count iġñiq', // less reliable + 's' => ':count iġñiq', // less reliable + 'a_second' => ':count iġñiq', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/in.php b/vendor/nesbot/carbon/src/Carbon/Lang/in.php new file mode 100644 index 0000000..d5953a1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/in.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/id.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/is.php b/vendor/nesbot/carbon/src/Carbon/Lang/is.php new file mode 100644 index 0000000..9990168 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/is.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Kristján Ingi Geirsson + */ +return [ + 'year' => '1 ár|:count ár', + 'y' => '1 ár|:count ár', + 'month' => '1 mánuður|:count mánuðir', + 'm' => '1 mánuður|:count mánuðir', + 'week' => '1 vika|:count vikur', + 'w' => '1 vika|:count vikur', + 'day' => '1 dagur|:count dagar', + 'd' => '1 dagur|:count dagar', + 'hour' => '1 klukkutími|:count klukkutímar', + 'h' => '1 klukkutími|:count klukkutímar', + 'minute' => '1 mínúta|:count mínútur', + 'min' => '1 mínúta|:count mínútur', + 'second' => '1 sekúnda|:count sekúndur', + 's' => '1 sekúnda|:count sekúndur', + 'ago' => ':time síðan', + 'from_now' => ':time síðan', + 'after' => ':time eftir', + 'before' => ':time fyrir', + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' og '], + 'meridiem' => ['fh', 'eh'], + 'diff_now' => 'núna', + 'diff_yesterday' => 'í gær', + 'diff_tomorrow' => 'á morgun', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D. MMMM YYYY', + 'LLL' => 'D. MMMM [kl.] HH:mm', + 'LLLL' => 'dddd D. MMMM YYYY [kl.] HH:mm', + ], + 'weekdays' => ['sunnudaginn', 'mánudaginn', 'þriðjudaginn', 'miðvikudaginn', 'fimmtudaginn', 'föstudaginn', 'laugardaginn'], + 'weekdays_short' => ['sun', 'mán', 'þri', 'mið', 'fim', 'fös', 'lau'], + 'weekdays_min' => ['sun', 'mán', 'þri', 'mið', 'fim', 'fös', 'lau'], + 'months' => ['janúar', 'febrúar', 'mars', 'apríl', 'maí', 'júní', 'júlí', 'ágúst', 'september', 'október', 'nóvember', 'desember'], + 'months_short' => ['jan', 'feb', 'mar', 'apr', 'maí', 'jún', 'júl', 'ágú', 'sep', 'okt', 'nóv', 'des'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/is_IS.php b/vendor/nesbot/carbon/src/Carbon/Lang/is_IS.php new file mode 100644 index 0000000..4d35c44 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/is_IS.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/is.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/it.php b/vendor/nesbot/carbon/src/Carbon/Lang/it.php new file mode 100644 index 0000000..49875d7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/it.php @@ -0,0 +1,115 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ash + * - François B + * - Marco Perrando + * - Massimiliano Caniparoli + * - JD Isaacks + * - Andrea Martini + * - Francesco Marasco + * - Tizianoz93 + * - Davide Casiraghi (davide-casiraghi) + * - Pete Scopes (pdscopes) + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => ':count anno|:count anni', + 'a_year' => 'un anno|:count anni', + 'y' => ':count anno|:count anni', + 'month' => ':count mese|:count mesi', + 'a_month' => 'un mese|:count mesi', + 'm' => ':count mese|:count mesi', + 'week' => ':count settimana|:count settimane', + 'a_week' => 'una settimana|:count settimane', + 'w' => ':count set.', + 'day' => ':count giorno|:count giorni', + 'a_day' => 'un giorno|:count giorni', + 'd' => ':count g|:count gg', + 'hour' => ':count ora|:count ore', + 'a_hour' => 'un\'ora|:count ore', + 'h' => ':count h', + 'minute' => ':count minuto|:count minuti', + 'a_minute' => 'un minuto|:count minuti', + 'min' => ':count min.', + 'second' => ':count secondo|:count secondi', + 'a_second' => 'alcuni secondi|:count secondi', + 's' => ':count sec.', + 'millisecond' => ':count millisecondo|:count millisecondi', + 'a_millisecond' => 'un millisecondo|:count millisecondi', + 'ms' => ':countms', + 'microsecond' => ':count microsecondo|:count microsecondi', + 'a_microsecond' => 'un microsecondo|:count microsecondi', + 'µs' => ':countµs', + 'ago' => ':time fa', + 'from_now' => function ($time) { + return (preg_match('/^\d.+$/', $time) ? 'tra' : 'in')." $time"; + }, + 'after' => ':time dopo', + 'before' => ':time prima', + 'diff_now' => 'proprio ora', + 'diff_today' => 'Oggi', + 'diff_today_regexp' => 'Oggi(?:\\s+alle)?', + 'diff_yesterday' => 'ieri', + 'diff_yesterday_regexp' => 'Ieri(?:\\s+alle)?', + 'diff_tomorrow' => 'domani', + 'diff_tomorrow_regexp' => 'Domani(?:\\s+alle)?', + 'diff_before_yesterday' => 'l\'altro ieri', + 'diff_after_tomorrow' => 'dopodomani', + 'period_interval' => 'ogni :interval', + 'period_start_date' => 'dal :date', + 'period_end_date' => 'al :date', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Oggi alle] LT', + 'nextDay' => '[Domani alle] LT', + 'nextWeek' => 'dddd [alle] LT', + 'lastDay' => '[Ieri alle] LT', + 'lastWeek' => function (CarbonInterface $date) { + switch ($date->dayOfWeek) { + case 0: + return '[la scorsa] dddd [alle] LT'; + default: + return '[lo scorso] dddd [alle] LT'; + } + }, + 'sameElse' => 'L', + ], + 'ordinal' => ':numberº', + 'months' => ['gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre'], + 'months_short' => ['gen', 'feb', 'mar', 'apr', 'mag', 'giu', 'lug', 'ago', 'set', 'ott', 'nov', 'dic'], + 'weekdays' => ['domenica', 'lunedì', 'martedì', 'mercoledì', 'giovedì', 'venerdì', 'sabato'], + 'weekdays_short' => ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'], + 'weekdays_min' => ['do', 'lu', 'ma', 'me', 'gi', 've', 'sa'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' e '], + 'ordinal_words' => [ + 'of' => 'di', + 'first' => 'primo', + 'second' => 'secondo', + 'third' => 'terzo', + 'fourth' => 'quarto', + 'fifth' => 'quinto', + 'last' => 'ultimo', + ], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/it_CH.php b/vendor/nesbot/carbon/src/Carbon/Lang/it_CH.php new file mode 100644 index 0000000..c23cc50 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/it_CH.php @@ -0,0 +1,20 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Propaganistas + */ +return array_replace_recursive(require __DIR__.'/it.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/it_IT.php b/vendor/nesbot/carbon/src/Carbon/Lang/it_IT.php new file mode 100644 index 0000000..a5d1981 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/it_IT.php @@ -0,0 +1,16 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return require __DIR__.'/it.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/it_SM.php b/vendor/nesbot/carbon/src/Carbon/Lang/it_SM.php new file mode 100644 index 0000000..5e8fc92 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/it_SM.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/it.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/it_VA.php b/vendor/nesbot/carbon/src/Carbon/Lang/it_VA.php new file mode 100644 index 0000000..5e8fc92 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/it_VA.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/it.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/iu.php b/vendor/nesbot/carbon/src/Carbon/Lang/iu.php new file mode 100644 index 0000000..4fa9742 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/iu.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/iu_CA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/iu_CA.php b/vendor/nesbot/carbon/src/Carbon/Lang/iu_CA.php new file mode 100644 index 0000000..6ab7e14 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/iu_CA.php @@ -0,0 +1,54 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Pablo Saratxaga pablo@mandriva.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'MM/DD/YY', + ], + 'months' => ['ᔮᓄᐊᓕ', 'ᕕᕗᐊᓕ', 'ᒪᔅᓯ', 'ᐃᐳᓗ', 'ᒪᐃ', 'ᔪᓂ', 'ᔪᓚᐃ', 'ᐊᒋᓯ', 'ᓯᑎᕙ', 'ᐊᑦᑐᕙ', 'ᓄᕕᕙ', 'ᑎᓯᕝᕙ'], + 'months_short' => ['ᔮᓄ', 'ᕕᕗ', 'ᒪᔅ', 'ᐃᐳ', 'ᒪᐃ', 'ᔪᓂ', 'ᔪᓚ', 'ᐊᒋ', 'ᓯᑎ', 'ᐊᑦ', 'ᓄᕕ', 'ᑎᓯ'], + 'weekdays' => ['ᓈᑦᑎᖑᔭᕐᕕᒃ', 'ᓇᒡᒐᔾᔭᐅ', 'ᓇᒡᒐᔾᔭᐅᓕᖅᑭᑦ', 'ᐱᖓᓲᓕᖅᓯᐅᑦ', 'ᕿᑎᖅᑰᑦ', 'ᐅᓪᓗᕈᓘᑐᐃᓇᖅ', 'ᓯᕙᑖᕕᒃ'], + 'weekdays_short' => ['ᓈ', 'ᓇ', 'ᓕ', 'ᐱ', 'ᕿ', 'ᐅ', 'ᓯ'], + 'weekdays_min' => ['ᓈ', 'ᓇ', 'ᓕ', 'ᐱ', 'ᕿ', 'ᐅ', 'ᓯ'], + 'day_of_first_week_of_year' => 1, + + 'year' => ':count ᐅᑭᐅᖅ', + 'y' => ':count ᐅᑭᐅᖅ', + 'a_year' => ':count ᐅᑭᐅᖅ', + + 'month' => ':count qaammat', + 'm' => ':count qaammat', + 'a_month' => ':count qaammat', + + 'week' => ':count sapaatip akunnera', + 'w' => ':count sapaatip akunnera', + 'a_week' => ':count sapaatip akunnera', + + 'day' => ':count ulloq', + 'd' => ':count ulloq', + 'a_day' => ':count ulloq', + + 'hour' => ':count ikarraq', + 'h' => ':count ikarraq', + 'a_hour' => ':count ikarraq', + + 'minute' => ':count titiqqaralaaq', // less reliable + 'min' => ':count titiqqaralaaq', // less reliable + 'a_minute' => ':count titiqqaralaaq', // less reliable + + 'second' => ':count marluk', // less reliable + 's' => ':count marluk', // less reliable + 'a_second' => ':count marluk', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/iw.php b/vendor/nesbot/carbon/src/Carbon/Lang/iw.php new file mode 100644 index 0000000..a26e350 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/iw.php @@ -0,0 +1,58 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'months' => ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'], + 'months_short' => ['ינו׳', 'פבר׳', 'מרץ', 'אפר׳', 'מאי', 'יוני', 'יולי', 'אוג׳', 'ספט׳', 'אוק׳', 'נוב׳', 'דצמ׳'], + 'weekdays' => ['יום ראשון', 'יום שני', 'יום שלישי', 'יום רביעי', 'יום חמישי', 'יום שישי', 'יום שבת'], + 'weekdays_short' => ['יום א׳', 'יום ב׳', 'יום ג׳', 'יום ד׳', 'יום ה׳', 'יום ו׳', 'שבת'], + 'weekdays_min' => ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'], + 'meridiem' => ['לפנה״צ', 'אחה״צ'], + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'D.M.YYYY', + 'LL' => 'D בMMM YYYY', + 'LLL' => 'D בMMMM YYYY H:mm', + 'LLLL' => 'dddd, D בMMMM YYYY H:mm', + ], + + 'year' => ':count שנה', + 'y' => ':count שנה', + 'a_year' => ':count שנה', + + 'month' => ':count חודש', + 'm' => ':count חודש', + 'a_month' => ':count חודש', + + 'week' => ':count שבוע', + 'w' => ':count שבוע', + 'a_week' => ':count שבוע', + + 'day' => ':count יום', + 'd' => ':count יום', + 'a_day' => ':count יום', + + 'hour' => ':count שעה', + 'h' => ':count שעה', + 'a_hour' => ':count שעה', + + 'minute' => ':count דקה', + 'min' => ':count דקה', + 'a_minute' => ':count דקה', + + 'second' => ':count שניה', + 's' => ':count שניה', + 'a_second' => ':count שניה', + + 'ago' => 'לפני :time', + 'from_now' => 'בעוד :time', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ja.php b/vendor/nesbot/carbon/src/Carbon/Lang/ja.php new file mode 100644 index 0000000..1ca6751 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ja.php @@ -0,0 +1,102 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Takuya Sawada + * - Atsushi Tanaka + * - François B + * - Jason Katz-Brown + * - Serhan Apaydın + * - XueWei + * - JD Isaacks + * - toyama satoshi + * - atakigawa + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => ':count年', + 'y' => ':count年', + 'month' => ':countヶ月', + 'm' => ':countヶ月', + 'week' => ':count週間', + 'w' => ':count週間', + 'day' => ':count日', + 'd' => ':count日', + 'hour' => ':count時間', + 'h' => ':count時間', + 'minute' => ':count分', + 'min' => ':count分', + 'second' => ':count秒', + 'a_second' => '{1}数秒|]1,Inf[:count秒', + 's' => ':count秒', + 'ago' => ':time前', + 'from_now' => ':time後', + 'after' => ':time後', + 'before' => ':time前', + 'diff_now' => '今', + 'diff_today' => '今日', + 'diff_yesterday' => '昨日', + 'diff_tomorrow' => '明日', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY/MM/DD', + 'LL' => 'YYYY年M月D日', + 'LLL' => 'YYYY年M月D日 HH:mm', + 'LLLL' => 'YYYY年M月D日 dddd HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[今日] LT', + 'nextDay' => '[明日] LT', + 'nextWeek' => function (CarbonInterface $current, CarbonInterface $other) { + if ($other->week !== $current->week) { + return '[来週]dddd LT'; + } + + return 'dddd LT'; + }, + 'lastDay' => '[昨日] LT', + 'lastWeek' => function (CarbonInterface $current, CarbonInterface $other) { + if ($other->week !== $current->week) { + return '[先週]dddd LT'; + } + + return 'dddd LT'; + }, + 'sameElse' => 'L', + ], + 'ordinal' => function ($number, $period) { + switch ($period) { + case 'd': + case 'D': + case 'DDD': + return $number.'日'; + default: + return $number; + } + }, + 'meridiem' => ['午前', '午後'], + 'months' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], + 'months_short' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], + 'weekdays' => ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'], + 'weekdays_short' => ['日', '月', '火', '水', '木', '金', '土'], + 'weekdays_min' => ['日', '月', '火', '水', '木', '金', '土'], + 'list' => '、', + 'alt_numbers' => ['〇', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十', '二十一', '二十二', '二十三', '二十四', '二十五', '二十六', '二十七', '二十八', '二十九', '三十', '三十一', '三十二', '三十三', '三十四', '三十五', '三十六', '三十七', '三十八', '三十九', '四十', '四十一', '四十二', '四十三', '四十四', '四十五', '四十六', '四十七', '四十八', '四十九', '五十', '五十一', '五十二', '五十三', '五十四', '五十五', '五十六', '五十七', '五十八', '五十九', '六十', '六十一', '六十二', '六十三', '六十四', '六十五', '六十六', '六十七', '六十八', '六十九', '七十', '七十一', '七十二', '七十三', '七十四', '七十五', '七十六', '七十七', '七十八', '七十九', '八十', '八十一', '八十二', '八十三', '八十四', '八十五', '八十六', '八十七', '八十八', '八十九', '九十', '九十一', '九十二', '九十三', '九十四', '九十五', '九十六', '九十七', '九十八', '九十九'], + 'alt_numbers_pow' => [ + 10000 => '万', + 1000 => '千', + 100 => '百', + ], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ja_JP.php b/vendor/nesbot/carbon/src/Carbon/Lang/ja_JP.php new file mode 100644 index 0000000..c283625 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ja_JP.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ja.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/jgo.php b/vendor/nesbot/carbon/src/Carbon/Lang/jgo.php new file mode 100644 index 0000000..6a1e77a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/jgo.php @@ -0,0 +1,13 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/jmc.php b/vendor/nesbot/carbon/src/Carbon/Lang/jmc.php new file mode 100644 index 0000000..ed92e8e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/jmc.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['utuko', 'kyiukonyi'], + 'weekdays' => ['Jumapilyi', 'Jumatatuu', 'Jumanne', 'Jumatanu', 'Alhamisi', 'Ijumaa', 'Jumamosi'], + 'weekdays_short' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], + 'weekdays_min' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], + 'months' => ['Januari', 'Februari', 'Machi', 'Aprilyi', 'Mei', 'Junyi', 'Julyai', 'Agusti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], + 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/jv.php b/vendor/nesbot/carbon/src/Carbon/Lang/jv.php new file mode 100644 index 0000000..bcbe044 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/jv.php @@ -0,0 +1,71 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - tgfjt + * - JD Isaacks + */ +return [ + 'year' => '{1}setaun|]1,Inf[:count taun', + 'month' => '{1}sewulan|]1,Inf[:count wulan', + 'week' => '{1}sakminggu|]1,Inf[:count minggu', + 'day' => '{1}sedinten|]1,Inf[:count dinten', + 'hour' => '{1}setunggal jam|]1,Inf[:count jam', + 'minute' => '{1}setunggal menit|]1,Inf[:count menit', + 'second' => '{1}sawetawis detik|]1,Inf[:count detik', + 'ago' => ':time ingkang kepengker', + 'from_now' => 'wonten ing :time', + 'diff_today' => 'Dinten', + 'diff_yesterday' => 'Kala', + 'diff_yesterday_regexp' => 'Kala(?:\\s+wingi)?(?:\\s+pukul)?', + 'diff_tomorrow' => 'Mbenjang', + 'diff_tomorrow_regexp' => 'Mbenjang(?:\\s+pukul)?', + 'diff_today_regexp' => 'Dinten(?:\\s+puniko)?(?:\\s+pukul)?', + 'formats' => [ + 'LT' => 'HH.mm', + 'LTS' => 'HH.mm.ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY [pukul] HH.mm', + 'LLLL' => 'dddd, D MMMM YYYY [pukul] HH.mm', + ], + 'calendar' => [ + 'sameDay' => '[Dinten puniko pukul] LT', + 'nextDay' => '[Mbenjang pukul] LT', + 'nextWeek' => 'dddd [pukul] LT', + 'lastDay' => '[Kala wingi pukul] LT', + 'lastWeek' => 'dddd [kepengker pukul] LT', + 'sameElse' => 'L', + ], + 'meridiem' => function ($hour) { + if ($hour < 11) { + return 'enjing'; + } + if ($hour < 15) { + return 'siyang'; + } + if ($hour < 19) { + return 'sonten'; + } + + return 'ndalu'; + }, + 'months' => ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'Nopember', 'Desember'], + 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Ags', 'Sep', 'Okt', 'Nop', 'Des'], + 'weekdays' => ['Minggu', 'Senen', 'Seloso', 'Rebu', 'Kemis', 'Jemuwah', 'Septu'], + 'weekdays_short' => ['Min', 'Sen', 'Sel', 'Reb', 'Kem', 'Jem', 'Sep'], + 'weekdays_min' => ['Mg', 'Sn', 'Sl', 'Rb', 'Km', 'Jm', 'Sp'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' lan '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ka.php b/vendor/nesbot/carbon/src/Carbon/Lang/ka.php new file mode 100644 index 0000000..a5d563d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ka.php @@ -0,0 +1,204 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Tornike Razmadze + * - François B + * - Lasha Dolidze + * - Tim Fish + * - JD Isaacks + * - Tornike Razmadze + * - François B + * - Lasha Dolidze + * - JD Isaacks + * - LONGMAN + * - Avtandil Kikabidze (akalongman) + * - Levan Velijanashvili (Stichoza) + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => ':count წელი', + 'y' => ':count წელი', + 'a_year' => '{1}წელი|]1,Inf[:count წელი', + 'month' => ':count თვე', + 'm' => ':count თვე', + 'a_month' => '{1}თვე|]1,Inf[:count თვე', + 'week' => ':count კვირა', + 'w' => ':count კვირა', + 'a_week' => '{1}კვირა|]1,Inf[:count კვირა', + 'day' => ':count დღე', + 'd' => ':count დღე', + 'a_day' => '{1}დღე|]1,Inf[:count დღე', + 'hour' => ':count საათი', + 'h' => ':count საათი', + 'a_hour' => '{1}საათი|]1,Inf[:count საათი', + 'minute' => ':count წუთი', + 'min' => ':count წუთი', + 'a_minute' => '{1}წუთი|]1,Inf[:count წუთი', + 'second' => ':count წამი', + 's' => ':count წამი', + 'a_second' => '{1}რამდენიმე წამი|]1,Inf[:count წამი', + 'ago' => function ($time) { + $replacements = [ + // year + 'წელი' => 'წლის', + // month + 'თვე' => 'თვის', + // week + 'კვირა' => 'კვირის', + // day + 'დღე' => 'დღის', + // hour + 'საათი' => 'საათის', + // minute + 'წუთი' => 'წუთის', + // second + 'წამი' => 'წამის', + ]; + $time = strtr($time, array_flip($replacements)); + $time = strtr($time, $replacements); + + return "$time წინ"; + }, + 'from_now' => function ($time) { + $replacements = [ + // year + 'წელი' => 'წელიწადში', + // week + 'კვირა' => 'კვირაში', + // day + 'დღე' => 'დღეში', + // month + 'თვე' => 'თვეში', + // hour + 'საათი' => 'საათში', + // minute + 'წუთი' => 'წუთში', + // second + 'წამი' => 'წამში', + ]; + $time = strtr($time, array_flip($replacements)); + $time = strtr($time, $replacements); + + return $time; + }, + 'after' => function ($time) { + $replacements = [ + // year + 'წელი' => 'წლის', + // month + 'თვე' => 'თვის', + // week + 'კვირა' => 'კვირის', + // day + 'დღე' => 'დღის', + // hour + 'საათი' => 'საათის', + // minute + 'წუთი' => 'წუთის', + // second + 'წამი' => 'წამის', + ]; + $time = strtr($time, array_flip($replacements)); + $time = strtr($time, $replacements); + + return "$time შემდეგ"; + }, + 'before' => function ($time) { + $replacements = [ + // year + 'წელი' => 'წლით', + // month + 'თვე' => 'თვით', + // week + 'კვირა' => 'კვირით', + // day + 'დღე' => 'დღით', + // hour + 'საათი' => 'საათით', + // minute + 'წუთი' => 'წუთით', + // second + 'წამი' => 'წამით', + ]; + $time = strtr($time, array_flip($replacements)); + $time = strtr($time, $replacements); + + return "$time ადრე"; + }, + 'diff_now' => 'ახლა', + 'diff_today' => 'დღეს', + 'diff_yesterday' => 'გუშინ', + 'diff_tomorrow' => 'ხვალ', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[დღეს], LT[-ზე]', + 'nextDay' => '[ხვალ], LT[-ზე]', + 'nextWeek' => function (CarbonInterface $current, CarbonInterface $other) { + return ($current->isSameWeek($other) ? '' : '[შემდეგ] ').'dddd, LT[-ზე]'; + }, + 'lastDay' => '[გუშინ], LT[-ზე]', + 'lastWeek' => '[წინა] dddd, LT-ზე', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number) { + if ($number === 0) { + return $number; + } + if ($number === 1) { + return $number.'-ლი'; + } + if (($number < 20) || ($number <= 100 && ($number % 20 === 0)) || ($number % 100 === 0)) { + return 'მე-'.$number; + } + + return $number.'-ე'; + }, + 'months' => ['იანვარი', 'თებერვალი', 'მარტი', 'აპრილი', 'მაისი', 'ივნისი', 'ივლისი', 'აგვისტო', 'სექტემბერი', 'ოქტომბერი', 'ნოემბერი', 'დეკემბერი'], + 'months_standalone' => ['იანვარს', 'თებერვალს', 'მარტს', 'აპრილს', 'მაისს', 'ივნისს', 'ივლისს', 'აგვისტოს', 'სექტემბერს', 'ოქტომბერს', 'ნოემბერს', 'დეკემბერს'], + 'months_short' => ['იან', 'თებ', 'მარ', 'აპრ', 'მაი', 'ივნ', 'ივლ', 'აგვ', 'სექ', 'ოქტ', 'ნოე', 'დეკ'], + 'months_regexp' => '/(D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', + 'weekdays' => ['კვირას', 'ორშაბათს', 'სამშაბათს', 'ოთხშაბათს', 'ხუთშაბათს', 'პარასკევს', 'შაბათს'], + 'weekdays_standalone' => ['კვირა', 'ორშაბათი', 'სამშაბათი', 'ოთხშაბათი', 'ხუთშაბათი', 'პარასკევი', 'შაბათი'], + 'weekdays_short' => ['კვი', 'ორშ', 'სამ', 'ოთხ', 'ხუთ', 'პარ', 'შაბ'], + 'weekdays_min' => ['კვ', 'ორ', 'სა', 'ოთ', 'ხუ', 'პა', 'შა'], + 'weekdays_regexp' => '/^([^d].*|.*[^d])$/', + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' და '], + 'meridiem' => function ($hour) { + if ($hour >= 4) { + if ($hour < 11) { + return 'დილის'; + } + + if ($hour < 16) { + return 'შუადღის'; + } + + if ($hour < 22) { + return 'საღამოს'; + } + } + + return 'ღამის'; + }, +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ka_GE.php b/vendor/nesbot/carbon/src/Carbon/Lang/ka_GE.php new file mode 100644 index 0000000..a26d930 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ka_GE.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ka.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kab.php b/vendor/nesbot/carbon/src/Carbon/Lang/kab.php new file mode 100644 index 0000000..94d6473 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kab.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/kab_DZ.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kab_DZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/kab_DZ.php new file mode 100644 index 0000000..796660b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kab_DZ.php @@ -0,0 +1,56 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - belkacem77@gmail.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['Yennayer', 'Fuṛar', 'Meɣres', 'Yebrir', 'Mayyu', 'Yunyu', 'Yulyu', 'ɣuct', 'Ctembeṛ', 'Tubeṛ', 'Wambeṛ', 'Dujembeṛ'], + 'months_short' => ['Yen', 'Fur', 'Meɣ', 'Yeb', 'May', 'Yun', 'Yul', 'ɣuc', 'Cte', 'Tub', 'Wam', 'Duj'], + 'weekdays' => ['Acer', 'Arim', 'Aram', 'Ahad', 'Amhad', 'Sem', 'Sed'], + 'weekdays_short' => ['Ace', 'Ari', 'Ara', 'Aha', 'Amh', 'Sem', 'Sed'], + 'weekdays_min' => ['Ace', 'Ari', 'Ara', 'Aha', 'Amh', 'Sem', 'Sed'], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['FT', 'MD'], + + 'year' => ':count n yiseggasen', + 'y' => ':count n yiseggasen', + 'a_year' => ':count n yiseggasen', + + 'month' => ':count n wayyuren', + 'm' => ':count n wayyuren', + 'a_month' => ':count n wayyuren', + + 'week' => ':count n ledwaṛ', // less reliable + 'w' => ':count n ledwaṛ', // less reliable + 'a_week' => ':count n ledwaṛ', // less reliable + + 'day' => ':count n wussan', + 'd' => ':count n wussan', + 'a_day' => ':count n wussan', + + 'hour' => ':count n tsaɛtin', + 'h' => ':count n tsaɛtin', + 'a_hour' => ':count n tsaɛtin', + + 'minute' => ':count n tedqiqin', + 'min' => ':count n tedqiqin', + 'a_minute' => ':count n tedqiqin', + + 'second' => ':count tasdidt', // less reliable + 's' => ':count tasdidt', // less reliable + 'a_second' => ':count tasdidt', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kam.php b/vendor/nesbot/carbon/src/Carbon/Lang/kam.php new file mode 100644 index 0000000..0fc70d7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kam.php @@ -0,0 +1,50 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['Ĩyakwakya', 'Ĩyawĩoo'], + 'weekdays' => ['Wa kyumwa', 'Wa kwambĩlĩlya', 'Wa kelĩ', 'Wa katatũ', 'Wa kana', 'Wa katano', 'Wa thanthatũ'], + 'weekdays_short' => ['Wky', 'Wkw', 'Wkl', 'Wtũ', 'Wkn', 'Wtn', 'Wth'], + 'weekdays_min' => ['Wky', 'Wkw', 'Wkl', 'Wtũ', 'Wkn', 'Wtn', 'Wth'], + 'months' => ['Mwai wa mbee', 'Mwai wa kelĩ', 'Mwai wa katatũ', 'Mwai wa kana', 'Mwai wa katano', 'Mwai wa thanthatũ', 'Mwai wa muonza', 'Mwai wa nyaanya', 'Mwai wa kenda', 'Mwai wa ĩkumi', 'Mwai wa ĩkumi na ĩmwe', 'Mwai wa ĩkumi na ilĩ'], + 'months_short' => ['Mbe', 'Kel', 'Ktũ', 'Kan', 'Ktn', 'Tha', 'Moo', 'Nya', 'Knd', 'Ĩku', 'Ĩkm', 'Ĩkl'], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + + // Too unreliable + /* + 'year' => ':count mbua', // less reliable + 'y' => ':count mbua', // less reliable + 'a_year' => ':count mbua', // less reliable + + 'month' => ':count ndakitali', // less reliable + 'm' => ':count ndakitali', // less reliable + 'a_month' => ':count ndakitali', // less reliable + + 'day' => ':count wia', // less reliable + 'd' => ':count wia', // less reliable + 'a_day' => ':count wia', // less reliable + + 'hour' => ':count orasan', // less reliable + 'h' => ':count orasan', // less reliable + 'a_hour' => ':count orasan', // less reliable + + 'minute' => ':count orasan', // less reliable + 'min' => ':count orasan', // less reliable + 'a_minute' => ':count orasan', // less reliable + */ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kde.php b/vendor/nesbot/carbon/src/Carbon/Lang/kde.php new file mode 100644 index 0000000..fbcc9f3 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kde.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['Muhi', 'Chilo'], + 'weekdays' => ['Liduva lyapili', 'Liduva lyatatu', 'Liduva lyanchechi', 'Liduva lyannyano', 'Liduva lyannyano na linji', 'Liduva lyannyano na mavili', 'Liduva litandi'], + 'weekdays_short' => ['Ll2', 'Ll3', 'Ll4', 'Ll5', 'Ll6', 'Ll7', 'Ll1'], + 'weekdays_min' => ['Ll2', 'Ll3', 'Ll4', 'Ll5', 'Ll6', 'Ll7', 'Ll1'], + 'months' => ['Mwedi Ntandi', 'Mwedi wa Pili', 'Mwedi wa Tatu', 'Mwedi wa Nchechi', 'Mwedi wa Nnyano', 'Mwedi wa Nnyano na Umo', 'Mwedi wa Nnyano na Mivili', 'Mwedi wa Nnyano na Mitatu', 'Mwedi wa Nnyano na Nchechi', 'Mwedi wa Nnyano na Nnyano', 'Mwedi wa Nnyano na Nnyano na U', 'Mwedi wa Nnyano na Nnyano na M'], + 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kea.php b/vendor/nesbot/carbon/src/Carbon/Lang/kea.php new file mode 100644 index 0000000..8b6c21b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kea.php @@ -0,0 +1,49 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['a', 'p'], + 'weekdays' => ['dumingu', 'sigunda-fera', 'tersa-fera', 'kuarta-fera', 'kinta-fera', 'sesta-fera', 'sabadu'], + 'weekdays_short' => ['dum', 'sig', 'ter', 'kua', 'kin', 'ses', 'sab'], + 'weekdays_min' => ['du', 'si', 'te', 'ku', 'ki', 'se', 'sa'], + 'weekdays_standalone' => ['dumingu', 'sigunda-fera', 'tersa-fera', 'kuarta-fera', 'kinta-fera', 'sesta-fera', 'sábadu'], + 'months' => ['Janeru', 'Febreru', 'Marsu', 'Abril', 'Maiu', 'Junhu', 'Julhu', 'Agostu', 'Setenbru', 'Otubru', 'Nuvenbru', 'Dizenbru'], + 'months_short' => ['Jan', 'Feb', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Otu', 'Nuv', 'Diz'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D [di] MMMM [di] YYYY HH:mm', + 'LLLL' => 'dddd, D [di] MMMM [di] YYYY HH:mm', + ], + + 'year' => ':count otunu', // less reliable + 'y' => ':count otunu', // less reliable + 'a_year' => ':count otunu', // less reliable + + 'week' => ':count día dumingu', // less reliable + 'w' => ':count día dumingu', // less reliable + 'a_week' => ':count día dumingu', // less reliable + + 'day' => ':count diâ', // less reliable + 'd' => ':count diâ', // less reliable + 'a_day' => ':count diâ', // less reliable + + 'minute' => ':count sugundu', // less reliable + 'min' => ':count sugundu', // less reliable + 'a_minute' => ':count sugundu', // less reliable + + 'second' => ':count dós', // less reliable + 's' => ':count dós', // less reliable + 'a_second' => ':count dós', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/khq.php b/vendor/nesbot/carbon/src/Carbon/Lang/khq.php new file mode 100644 index 0000000..7a834cf --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/khq.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['Adduha', 'Aluula'], + 'weekdays' => ['Alhadi', 'Atini', 'Atalata', 'Alarba', 'Alhamiisa', 'Aljuma', 'Assabdu'], + 'weekdays_short' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alj', 'Ass'], + 'weekdays_min' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alj', 'Ass'], + 'months' => ['Žanwiye', 'Feewiriye', 'Marsi', 'Awiril', 'Me', 'Žuweŋ', 'Žuyye', 'Ut', 'Sektanbur', 'Oktoobur', 'Noowanbur', 'Deesanbur'], + 'months_short' => ['Žan', 'Fee', 'Mar', 'Awi', 'Me', 'Žuw', 'Žuy', 'Ut', 'Sek', 'Okt', 'Noo', 'Dee'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM, YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ki.php b/vendor/nesbot/carbon/src/Carbon/Lang/ki.php new file mode 100644 index 0000000..d86afc5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ki.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['Kiroko', 'Hwaĩ-inĩ'], + 'weekdays' => ['Kiumia', 'Njumatatũ', 'Njumaine', 'Njumatana', 'Aramithi', 'Njumaa', 'Njumamothi'], + 'weekdays_short' => ['KMA', 'NTT', 'NMN', 'NMT', 'ART', 'NMA', 'NMM'], + 'weekdays_min' => ['KMA', 'NTT', 'NMN', 'NMT', 'ART', 'NMA', 'NMM'], + 'months' => ['Njenuarĩ', 'Mwere wa kerĩ', 'Mwere wa gatatũ', 'Mwere wa kana', 'Mwere wa gatano', 'Mwere wa gatandatũ', 'Mwere wa mũgwanja', 'Mwere wa kanana', 'Mwere wa kenda', 'Mwere wa ikũmi', 'Mwere wa ikũmi na ũmwe', 'Ndithemba'], + 'months_short' => ['JEN', 'WKR', 'WGT', 'WKN', 'WTN', 'WTD', 'WMJ', 'WNN', 'WKD', 'WIK', 'WMW', 'DIT'], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + + 'year' => ':count mĩaka', // less reliable + 'y' => ':count mĩaka', // less reliable + 'a_year' => ':count mĩaka', // less reliable + + 'month' => ':count mweri', // less reliable + 'm' => ':count mweri', // less reliable + 'a_month' => ':count mweri', // less reliable + + 'week' => ':count kiumia', // less reliable + 'w' => ':count kiumia', // less reliable + 'a_week' => ':count kiumia', // less reliable + + 'day' => ':count mũthenya', // less reliable + 'd' => ':count mũthenya', // less reliable + 'a_day' => ':count mũthenya', // less reliable + + 'hour' => ':count thaa', // less reliable + 'h' => ':count thaa', // less reliable + 'a_hour' => ':count thaa', // less reliable + + 'minute' => ':count mundu', // less reliable + 'min' => ':count mundu', // less reliable + 'a_minute' => ':count mundu', // less reliable + + 'second' => ':count igego', // less reliable + 's' => ':count igego', // less reliable + 'a_second' => ':count igego', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kk.php b/vendor/nesbot/carbon/src/Carbon/Lang/kk.php new file mode 100644 index 0000000..59fa9af --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kk.php @@ -0,0 +1,103 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - François B + * - Talat Uspanov + * - Нурлан Рахимжанов + * - Toleugazy Kali + */ +return [ + 'year' => ':count жыл', + 'a_year' => '{1}бір жыл|:count жыл', + 'y' => ':count ж.', + 'month' => ':count ай', + 'a_month' => '{1}бір ай|:count ай', + 'm' => ':count ай', + 'week' => ':count апта', + 'a_week' => '{1}бір апта', + 'w' => ':count ап.', + 'day' => ':count күн', + 'a_day' => '{1}бір күн|:count күн', + 'd' => ':count к.', + 'hour' => ':count сағат', + 'a_hour' => '{1}бір сағат|:count сағат', + 'h' => ':count са.', + 'minute' => ':count минут', + 'a_minute' => '{1}бір минут|:count минут', + 'min' => ':count м.', + 'second' => ':count секунд', + 'a_second' => '{1}бірнеше секунд|:count секунд', + 's' => ':count се.', + 'ago' => ':time бұрын', + 'from_now' => ':time ішінде', + 'after' => ':time кейін', + 'before' => ':time бұрын', + 'diff_now' => 'қазір', + 'diff_today' => 'Бүгін', + 'diff_today_regexp' => 'Бүгін(?:\\s+сағат)?', + 'diff_yesterday' => 'кеше', + 'diff_yesterday_regexp' => 'Кеше(?:\\s+сағат)?', + 'diff_tomorrow' => 'ертең', + 'diff_tomorrow_regexp' => 'Ертең(?:\\s+сағат)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Бүгін сағат] LT', + 'nextDay' => '[Ертең сағат] LT', + 'nextWeek' => 'dddd [сағат] LT', + 'lastDay' => '[Кеше сағат] LT', + 'lastWeek' => '[Өткен аптаның] dddd [сағат] LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number) { + static $suffixes = [ + 0 => '-ші', + 1 => '-ші', + 2 => '-ші', + 3 => '-ші', + 4 => '-ші', + 5 => '-ші', + 6 => '-шы', + 7 => '-ші', + 8 => '-ші', + 9 => '-шы', + 10 => '-шы', + 20 => '-шы', + 30 => '-шы', + 40 => '-шы', + 50 => '-ші', + 60 => '-шы', + 70 => '-ші', + 80 => '-ші', + 90 => '-шы', + 100 => '-ші', + ]; + + return $number.($suffixes[$number] ?? $suffixes[$number % 10] ?? $suffixes[$number >= 100 ? 100 : -1] ?? ''); + }, + 'months' => ['қаңтар', 'ақпан', 'наурыз', 'сәуір', 'мамыр', 'маусым', 'шілде', 'тамыз', 'қыркүйек', 'қазан', 'қараша', 'желтоқсан'], + 'months_short' => ['қаң', 'ақп', 'нау', 'сәу', 'мам', 'мау', 'шіл', 'там', 'қыр', 'қаз', 'қар', 'жел'], + 'weekdays' => ['жексенбі', 'дүйсенбі', 'сейсенбі', 'сәрсенбі', 'бейсенбі', 'жұма', 'сенбі'], + 'weekdays_short' => ['жек', 'дүй', 'сей', 'сәр', 'бей', 'жұм', 'сен'], + 'weekdays_min' => ['жк', 'дй', 'сй', 'ср', 'бй', 'жм', 'сн'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' және '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kk_KZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/kk_KZ.php new file mode 100644 index 0000000..7dc5ebc --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kk_KZ.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/kk.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kkj.php b/vendor/nesbot/carbon/src/Carbon/Lang/kkj.php new file mode 100644 index 0000000..6a1e77a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kkj.php @@ -0,0 +1,13 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kl.php b/vendor/nesbot/carbon/src/Carbon/Lang/kl.php new file mode 100644 index 0000000..7329a07 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kl.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/kl_GL.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kl_GL.php b/vendor/nesbot/carbon/src/Carbon/Lang/kl_GL.php new file mode 100644 index 0000000..4fed720 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kl_GL.php @@ -0,0 +1,64 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Danish Standards Association bug-glibc-locales@gnu.org + * - John Eyðstein Johannesen (mashema) + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D. MMMM YYYY', + 'LLL' => 'D. MMMM YYYY HH:mm', + 'LLLL' => 'dddd [d.] D. MMMM YYYY [kl.] HH:mm', + ], + 'months' => ['januaarip', 'februaarip', 'marsip', 'apriilip', 'maajip', 'juunip', 'juulip', 'aggustip', 'septembarip', 'oktobarip', 'novembarip', 'decembarip'], + 'months_short' => ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], + 'weekdays' => ['sapaat', 'ataasinngorneq', 'marlunngorneq', 'pingasunngorneq', 'sisamanngorneq', 'tallimanngorneq', 'arfininngorneq'], + 'weekdays_short' => ['sap', 'ata', 'mar', 'pin', 'sis', 'tal', 'arf'], + 'weekdays_min' => ['sap', 'ata', 'mar', 'pin', 'sis', 'tal', 'arf'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + + 'year' => '{1}ukioq :count|{0}:count ukiut|]1,Inf[ukiut :count', + 'a_year' => '{1}ukioq|{0}:count ukiut|]1,Inf[ukiut :count', + 'y' => '{1}:countyr|{0}:countyrs|]1,Inf[:countyrs', + + 'month' => '{1}qaammat :count|{0}:count qaammatit|]1,Inf[qaammatit :count', + 'a_month' => '{1}qaammat|{0}:count qaammatit|]1,Inf[qaammatit :count', + 'm' => '{1}:countmo|{0}:countmos|]1,Inf[:countmos', + + 'week' => '{1}:count sap. ak.|{0}:count sap. ak.|]1,Inf[:count sap. ak.', + 'a_week' => '{1}a sap. ak.|{0}:count sap. ak.|]1,Inf[:count sap. ak.', + 'w' => ':countw', + + 'day' => '{1}:count ulloq|{0}:count ullut|]1,Inf[:count ullut', + 'a_day' => '{1}a ulloq|{0}:count ullut|]1,Inf[:count ullut', + 'd' => ':countd', + + 'hour' => '{1}:count tiimi|{0}:count tiimit|]1,Inf[:count tiimit', + 'a_hour' => '{1}tiimi|{0}:count tiimit|]1,Inf[:count tiimit', + 'h' => ':counth', + + 'minute' => '{1}:count minutsi|{0}:count minutsit|]1,Inf[:count minutsit', + 'a_minute' => '{1}a minutsi|{0}:count minutsit|]1,Inf[:count minutsit', + 'min' => ':countm', + + 'second' => '{1}:count sikunti|{0}:count sikuntit|]1,Inf[:count sikuntit', + 'a_second' => '{1}sikunti|{0}:count sikuntit|]1,Inf[:count sikuntit', + 's' => ':counts', + + 'ago' => ':time matuma siorna', + +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kln.php b/vendor/nesbot/carbon/src/Carbon/Lang/kln.php new file mode 100644 index 0000000..b9c3996 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kln.php @@ -0,0 +1,31 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['krn', 'koosk'], + 'weekdays' => ['Kotisap', 'Kotaai', 'Koaeng’', 'Kosomok', 'Koang’wan', 'Komuut', 'Kolo'], + 'weekdays_short' => ['Kts', 'Kot', 'Koo', 'Kos', 'Koa', 'Kom', 'Kol'], + 'weekdays_min' => ['Kts', 'Kot', 'Koo', 'Kos', 'Koa', 'Kom', 'Kol'], + 'months' => ['Mulgul', 'Ng’atyaato', 'Kiptaamo', 'Iwootkuut', 'Mamuut', 'Paagi', 'Ng’eiyeet', 'Rooptui', 'Bureet', 'Epeeso', 'Kipsuunde ne taai', 'Kipsuunde nebo aeng’'], + 'months_short' => ['Mul', 'Ngat', 'Taa', 'Iwo', 'Mam', 'Paa', 'Nge', 'Roo', 'Bur', 'Epe', 'Kpt', 'Kpa'], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + + 'year' => ':count maghatiat', // less reliable + 'y' => ':count maghatiat', // less reliable + 'a_year' => ':count maghatiat', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/km.php b/vendor/nesbot/carbon/src/Carbon/Lang/km.php new file mode 100644 index 0000000..da790ac --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/km.php @@ -0,0 +1,71 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Kruy Vanna + * - Sereysethy Touch + * - JD Isaacks + * - Sovichet Tep + */ +return [ + 'year' => '{1}មួយឆ្នាំ|]1,Inf[:count ឆ្នាំ', + 'y' => ':count ឆ្នាំ', + 'month' => '{1}មួយខែ|]1,Inf[:count ខែ', + 'm' => ':count ខែ', + 'week' => ':count សប្ដាហ៍', + 'w' => ':count សប្ដាហ៍', + 'day' => '{1}មួយថ្ងៃ|]1,Inf[:count ថ្ងៃ', + 'd' => ':count ថ្ងៃ', + 'hour' => '{1}មួយម៉ោង|]1,Inf[:count ម៉ោង', + 'h' => ':count ម៉ោង', + 'minute' => '{1}មួយនាទី|]1,Inf[:count នាទី', + 'min' => ':count នាទី', + 'second' => '{1}ប៉ុន្មានវិនាទី|]1,Inf[:count វិនាទី', + 's' => ':count វិនាទី', + 'ago' => ':timeមុន', + 'from_now' => ':timeទៀត', + 'after' => 'នៅ​ក្រោយ :time', + 'before' => 'នៅ​មុន :time', + 'diff_now' => 'ឥឡូវ', + 'diff_today' => 'ថ្ងៃនេះ', + 'diff_today_regexp' => 'ថ្ងៃនេះ(?:\\s+ម៉ោង)?', + 'diff_yesterday' => 'ម្សិលមិញ', + 'diff_yesterday_regexp' => 'ម្សិលមិញ(?:\\s+ម៉ោង)?', + 'diff_tomorrow' => 'ថ្ងៃ​ស្អែក', + 'diff_tomorrow_regexp' => 'ស្អែក(?:\\s+ម៉ោង)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[ថ្ងៃនេះ ម៉ោង] LT', + 'nextDay' => '[ស្អែក ម៉ោង] LT', + 'nextWeek' => 'dddd [ម៉ោង] LT', + 'lastDay' => '[ម្សិលមិញ ម៉ោង] LT', + 'lastWeek' => 'dddd [សប្តាហ៍មុន] [ម៉ោង] LT', + 'sameElse' => 'L', + ], + 'ordinal' => 'ទី:number', + 'meridiem' => ['ព្រឹក', 'ល្ងាច'], + 'months' => ['មករា', 'កុម្ភៈ', 'មីនា', 'មេសា', 'ឧសភា', 'មិថុនា', 'កក្កដា', 'សីហា', 'កញ្ញា', 'តុលា', 'វិច្ឆិកា', 'ធ្នូ'], + 'months_short' => ['មករា', 'កុម្ភៈ', 'មីនា', 'មេសា', 'ឧសភា', 'មិថុនា', 'កក្កដា', 'សីហា', 'កញ្ញា', 'តុលា', 'វិច្ឆិកា', 'ធ្នូ'], + 'weekdays' => ['អាទិត្យ', 'ច័ន្ទ', 'អង្គារ', 'ពុធ', 'ព្រហស្បតិ៍', 'សុក្រ', 'សៅរ៍'], + 'weekdays_short' => ['អា', 'ច', 'អ', 'ព', 'ព្រ', 'សុ', 'ស'], + 'weekdays_min' => ['អា', 'ច', 'អ', 'ព', 'ព្រ', 'សុ', 'ស'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', 'និង '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/km_KH.php b/vendor/nesbot/carbon/src/Carbon/Lang/km_KH.php new file mode 100644 index 0000000..92e5fdb --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/km_KH.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/km.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kn.php b/vendor/nesbot/carbon/src/Carbon/Lang/kn.php new file mode 100644 index 0000000..0d2ad08 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kn.php @@ -0,0 +1,75 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - MOHAN M U + * - François B + * - rajeevnaikte + */ +return [ + 'year' => '{1}ಒಂದು ವರ್ಷ|]1,Inf[:count ವರ್ಷ', + 'month' => '{1}ಒಂದು ತಿಂಗಳು|]1,Inf[:count ತಿಂಗಳು', + 'week' => '{1}ಒಂದು ವಾರ|]1,Inf[:count ವಾರಗಳು', + 'day' => '{1}ಒಂದು ದಿನ|]1,Inf[:count ದಿನ', + 'hour' => '{1}ಒಂದು ಗಂಟೆ|]1,Inf[:count ಗಂಟೆ', + 'minute' => '{1}ಒಂದು ನಿಮಿಷ|]1,Inf[:count ನಿಮಿಷ', + 'second' => '{1}ಕೆಲವು ಕ್ಷಣಗಳು|]1,Inf[:count ಸೆಕೆಂಡುಗಳು', + 'ago' => ':time ಹಿಂದೆ', + 'from_now' => ':time ನಂತರ', + 'diff_now' => 'ಈಗ', + 'diff_today' => 'ಇಂದು', + 'diff_yesterday' => 'ನಿನ್ನೆ', + 'diff_tomorrow' => 'ನಾಳೆ', + 'formats' => [ + 'LT' => 'A h:mm', + 'LTS' => 'A h:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY, A h:mm', + 'LLLL' => 'dddd, D MMMM YYYY, A h:mm', + ], + 'calendar' => [ + 'sameDay' => '[ಇಂದು] LT', + 'nextDay' => '[ನಾಳೆ] LT', + 'nextWeek' => 'dddd, LT', + 'lastDay' => '[ನಿನ್ನೆ] LT', + 'lastWeek' => '[ಕೊನೆಯ] dddd, LT', + 'sameElse' => 'L', + ], + 'ordinal' => ':numberನೇ', + 'meridiem' => function ($hour) { + if ($hour < 4) { + return 'ರಾತ್ರಿ'; + } + if ($hour < 10) { + return 'ಬೆಳಿಗ್ಗೆ'; + } + if ($hour < 17) { + return 'ಮಧ್ಯಾಹ್ನ'; + } + if ($hour < 20) { + return 'ಸಂಜೆ'; + } + + return 'ರಾತ್ರಿ'; + }, + 'months' => ['ಜನವರಿ', 'ಫೆಬ್ರವರಿ', 'ಮಾರ್ಚ್', 'ಏಪ್ರಿಲ್', 'ಮೇ', 'ಜೂನ್', 'ಜುಲೈ', 'ಆಗಸ್ಟ್', 'ಸೆಪ್ಟೆಂಬರ್', 'ಅಕ್ಟೋಬರ್', 'ನವೆಂಬರ್', 'ಡಿಸೆಂಬರ್'], + 'months_short' => ['ಜನ', 'ಫೆಬ್ರ', 'ಮಾರ್ಚ್', 'ಏಪ್ರಿಲ್', 'ಮೇ', 'ಜೂನ್', 'ಜುಲೈ', 'ಆಗಸ್ಟ್', 'ಸೆಪ್ಟೆಂ', 'ಅಕ್ಟೋ', 'ನವೆಂ', 'ಡಿಸೆಂ'], + 'weekdays' => ['ಭಾನುವಾರ', 'ಸೋಮವಾರ', 'ಮಂಗಳವಾರ', 'ಬುಧವಾರ', 'ಗುರುವಾರ', 'ಶುಕ್ರವಾರ', 'ಶನಿವಾರ'], + 'weekdays_short' => ['ಭಾನು', 'ಸೋಮ', 'ಮಂಗಳ', 'ಬುಧ', 'ಗುರು', 'ಶುಕ್ರ', 'ಶನಿ'], + 'weekdays_min' => ['ಭಾ', 'ಸೋ', 'ಮಂ', 'ಬು', 'ಗು', 'ಶು', 'ಶ'], + 'list' => ', ', + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, + 'weekend' => [0, 0], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kn_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/kn_IN.php new file mode 100644 index 0000000..30e3d88 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kn_IN.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/kn.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ko.php b/vendor/nesbot/carbon/src/Carbon/Lang/ko.php new file mode 100644 index 0000000..4fa6237 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ko.php @@ -0,0 +1,91 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Kunal Marwaha + * - FourwingsY + * - François B + * - Jason Katz-Brown + * - Seokjun Kim + * - Junho Kim + * - JD Isaacks + * - Juwon Kim + */ +return [ + 'year' => ':count년', + 'a_year' => '{1}일년|]1,Inf[:count년', + 'y' => ':count년', + 'month' => ':count개월', + 'a_month' => '{1}한달|]1,Inf[:count개월', + 'm' => ':count개월', + 'week' => ':count주', + 'a_week' => '{1}일주일|]1,Inf[:count 주', + 'w' => ':count주일', + 'day' => ':count일', + 'a_day' => '{1}하루|]1,Inf[:count일', + 'd' => ':count일', + 'hour' => ':count시간', + 'a_hour' => '{1}한시간|]1,Inf[:count시간', + 'h' => ':count시간', + 'minute' => ':count분', + 'a_minute' => '{1}일분|]1,Inf[:count분', + 'min' => ':count분', + 'second' => ':count초', + 'a_second' => '{1}몇초|]1,Inf[:count초', + 's' => ':count초', + 'ago' => ':time 전', + 'from_now' => ':time 후', + 'after' => ':time 후', + 'before' => ':time 전', + 'diff_now' => '지금', + 'diff_today' => '오늘', + 'diff_yesterday' => '어제', + 'diff_tomorrow' => '내일', + 'formats' => [ + 'LT' => 'A h:mm', + 'LTS' => 'A h:mm:ss', + 'L' => 'YYYY.MM.DD.', + 'LL' => 'YYYY년 MMMM D일', + 'LLL' => 'YYYY년 MMMM D일 A h:mm', + 'LLLL' => 'YYYY년 MMMM D일 dddd A h:mm', + ], + 'calendar' => [ + 'sameDay' => '오늘 LT', + 'nextDay' => '내일 LT', + 'nextWeek' => 'dddd LT', + 'lastDay' => '어제 LT', + 'lastWeek' => '지난주 dddd LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number, $period) { + switch ($period) { + case 'd': + case 'D': + case 'DDD': + return $number.'일'; + case 'M': + return $number.'월'; + case 'w': + case 'W': + return $number.'주'; + default: + return $number; + } + }, + 'meridiem' => ['오전', '오후'], + 'months' => ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'], + 'months_short' => ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'], + 'weekdays' => ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'], + 'weekdays_short' => ['일', '월', '화', '수', '목', '금', '토'], + 'weekdays_min' => ['일', '월', '화', '수', '목', '금', '토'], + 'list' => ' ', +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ko_KP.php b/vendor/nesbot/carbon/src/Carbon/Lang/ko_KP.php new file mode 100644 index 0000000..4ba802b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ko_KP.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ko.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ko_KR.php b/vendor/nesbot/carbon/src/Carbon/Lang/ko_KR.php new file mode 100644 index 0000000..9d873a2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ko_KR.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ko.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kok.php b/vendor/nesbot/carbon/src/Carbon/Lang/kok.php new file mode 100644 index 0000000..4adcddc --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kok.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/kok_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kok_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/kok_IN.php new file mode 100644 index 0000000..92ba844 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kok_IN.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Red Hat, Pune bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'D-M-YY', + ], + 'months' => ['जानेवारी', 'फेब्रुवारी', 'मार्च', 'एप्रिल', 'मे', 'जून', 'जुलै', 'ओगस्ट', 'सेप्टेंबर', 'ओक्टोबर', 'नोव्हेंबर', 'डिसेंबर'], + 'months_short' => ['जानेवारी', 'फेब्रुवारी', 'मार्च', 'एप्रिल', 'मे', 'जून', 'जुलै', 'ओगस्ट', 'सेप्टेंबर', 'ओक्टोबर', 'नोव्हेंबर', 'डिसेंबर'], + 'weekdays' => ['आयतार', 'सोमार', 'मंगळवार', 'बुधवार', 'बेरेसतार', 'शुकरार', 'शेनवार'], + 'weekdays_short' => ['आयतार', 'सोमार', 'मंगळवार', 'बुधवार', 'बेरेसतार', 'शुकरार', 'शेनवार'], + 'weekdays_min' => ['आयतार', 'सोमार', 'मंगळवार', 'बुधवार', 'बेरेसतार', 'शुकरार', 'शेनवार'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['म.पू.', 'म.नं.'], + + 'year' => ':count वैशाकु', // less reliable + 'y' => ':count वैशाकु', // less reliable + 'a_year' => ':count वैशाकु', // less reliable + + 'week' => ':count आदित्यवार', // less reliable + 'w' => ':count आदित्यवार', // less reliable + 'a_week' => ':count आदित्यवार', // less reliable + + 'minute' => ':count नोंद', // less reliable + 'min' => ':count नोंद', // less reliable + 'a_minute' => ':count नोंद', // less reliable + + 'second' => ':count तेंको', // less reliable + 's' => ':count तेंको', // less reliable + 'a_second' => ':count तेंको', // less reliable + + 'month' => ':count मैनो', + 'm' => ':count मैनो', + 'a_month' => ':count मैनो', + + 'day' => ':count दिवसु', + 'd' => ':count दिवसु', + 'a_day' => ':count दिवसु', + + 'hour' => ':count घंते', + 'h' => ':count घंते', + 'a_hour' => ':count घंते', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ks.php b/vendor/nesbot/carbon/src/Carbon/Lang/ks.php new file mode 100644 index 0000000..9876079 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ks.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/ks_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN.php new file mode 100644 index 0000000..ce9d5d4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN.php @@ -0,0 +1,51 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Red Hat, Pune bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'M/D/YY', + ], + 'months' => ['جنؤری', 'فرؤری', 'مارٕچ', 'اپریل', 'میٔ', 'جوٗن', 'جوٗلایی', 'اگست', 'ستمبر', 'اکتوٗبر', 'نومبر', 'دسمبر'], + 'months_short' => ['جنؤری', 'فرؤری', 'مارٕچ', 'اپریل', 'میٔ', 'جوٗن', 'جوٗلایی', 'اگست', 'ستمبر', 'اکتوٗبر', 'نومبر', 'دسمبر'], + 'weekdays' => ['آتهوار', 'ژءندروار', 'بوءںوار', 'بودهوار', 'برىسوار', 'جمع', 'بٹوار'], + 'weekdays_short' => ['آتهوار', 'ژءنتروار', 'بوءںوار', 'بودهوار', 'برىسوار', 'جمع', 'بٹوار'], + 'weekdays_min' => ['آتهوار', 'ژءنتروار', 'بوءںوار', 'بودهوار', 'برىسوار', 'جمع', 'بٹوار'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['دوپھربرونھ', 'دوپھرپتھ'], + + 'year' => ':count آب', // less reliable + 'y' => ':count آب', // less reliable + 'a_year' => ':count آب', // less reliable + + 'month' => ':count रान्', // less reliable + 'm' => ':count रान्', // less reliable + 'a_month' => ':count रान्', // less reliable + + 'week' => ':count آتھٕوار', // less reliable + 'w' => ':count آتھٕوار', // less reliable + 'a_week' => ':count آتھٕوار', // less reliable + + 'hour' => ':count سۄن', // less reliable + 'h' => ':count سۄن', // less reliable + 'a_hour' => ':count سۄن', // less reliable + + 'minute' => ':count فَن', // less reliable + 'min' => ':count فَن', // less reliable + 'a_minute' => ':count فَن', // less reliable + + 'second' => ':count दोʼयुम', // less reliable + 's' => ':count दोʼयुम', // less reliable + 'a_second' => ':count दोʼयुम', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php b/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php new file mode 100644 index 0000000..a2ae8b6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - ks-gnome-trans-commits@lists.code.indlinux.net + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'M/D/YY', + ], + 'months' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], + 'months_short' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], + 'weekdays' => ['आथवार', 'चॅ़दुरवार', 'बोमवार', 'ब्वदवार', 'ब्रसवार', 'शोकुरवार', 'बटुवार'], + 'weekdays_short' => ['आथ ', 'चॅ़दुर', 'बोम', 'ब्वद', 'ब्रस', 'शोकुर', 'बटु'], + 'weekdays_min' => ['आथ ', 'चॅ़दुर', 'बोम', 'ब्वद', 'ब्रस', 'शोकुर', 'बटु'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ksb.php b/vendor/nesbot/carbon/src/Carbon/Lang/ksb.php new file mode 100644 index 0000000..aaa0061 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ksb.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['makeo', 'nyiaghuo'], + 'weekdays' => ['Jumaapii', 'Jumaatatu', 'Jumaane', 'Jumaatano', 'Alhamisi', 'Ijumaa', 'Jumaamosi'], + 'weekdays_short' => ['Jpi', 'Jtt', 'Jmn', 'Jtn', 'Alh', 'Iju', 'Jmo'], + 'weekdays_min' => ['Jpi', 'Jtt', 'Jmn', 'Jtn', 'Alh', 'Iju', 'Jmo'], + 'months' => ['Januali', 'Febluali', 'Machi', 'Aplili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], + 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ksf.php b/vendor/nesbot/carbon/src/Carbon/Lang/ksf.php new file mode 100644 index 0000000..84a5967 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ksf.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['sárúwá', 'cɛɛ́nko'], + 'weekdays' => ['sɔ́ndǝ', 'lǝndí', 'maadí', 'mɛkrɛdí', 'jǝǝdí', 'júmbá', 'samdí'], + 'weekdays_short' => ['sɔ́n', 'lǝn', 'maa', 'mɛk', 'jǝǝ', 'júm', 'sam'], + 'weekdays_min' => ['sɔ́n', 'lǝn', 'maa', 'mɛk', 'jǝǝ', 'júm', 'sam'], + 'months' => ['ŋwíí a ntɔ́ntɔ', 'ŋwíí akǝ bɛ́ɛ', 'ŋwíí akǝ ráá', 'ŋwíí akǝ nin', 'ŋwíí akǝ táan', 'ŋwíí akǝ táafɔk', 'ŋwíí akǝ táabɛɛ', 'ŋwíí akǝ táaraa', 'ŋwíí akǝ táanin', 'ŋwíí akǝ ntɛk', 'ŋwíí akǝ ntɛk di bɔ́k', 'ŋwíí akǝ ntɛk di bɛ́ɛ'], + 'months_short' => ['ŋ1', 'ŋ2', 'ŋ3', 'ŋ4', 'ŋ5', 'ŋ6', 'ŋ7', 'ŋ8', 'ŋ9', 'ŋ10', 'ŋ11', 'ŋ12'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ksh.php b/vendor/nesbot/carbon/src/Carbon/Lang/ksh.php new file mode 100644 index 0000000..95457e2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ksh.php @@ -0,0 +1,57 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['v.M.', 'n.M.'], + 'weekdays' => ['Sunndaach', 'Mohndaach', 'Dinnsdaach', 'Metwoch', 'Dunnersdaach', 'Friidaach', 'Samsdaach'], + 'weekdays_short' => ['Su.', 'Mo.', 'Di.', 'Me.', 'Du.', 'Fr.', 'Sa.'], + 'weekdays_min' => ['Su', 'Mo', 'Di', 'Me', 'Du', 'Fr', 'Sa'], + 'months' => ['Jannewa', 'Fäbrowa', 'Määz', 'Aprell', 'Mai', 'Juuni', 'Juuli', 'Oujoß', 'Septämber', 'Oktohber', 'Novämber', 'Dezämber'], + 'months_short' => ['Jan', 'Fäb', 'Mäz', 'Apr', 'Mai', 'Jun', 'Jul', 'Ouj', 'Säp', 'Okt', 'Nov', 'Dez'], + 'months_short_standalone' => ['Jan.', 'Fäb.', 'Mäz.', 'Apr.', 'Mai', 'Jun.', 'Jul.', 'Ouj.', 'Säp.', 'Okt.', 'Nov.', 'Dez.'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D. M. YYYY', + 'LL' => 'D. MMM. YYYY', + 'LLL' => 'D. MMMM YYYY HH:mm', + 'LLLL' => 'dddd, [dä] D. MMMM YYYY HH:mm', + ], + + 'year' => ':count Johr', + 'y' => ':count Johr', + 'a_year' => ':count Johr', + + 'month' => ':count Moohnd', + 'm' => ':count Moohnd', + 'a_month' => ':count Moohnd', + + 'week' => ':count woch', + 'w' => ':count woch', + 'a_week' => ':count woch', + + 'day' => ':count Daach', + 'd' => ':count Daach', + 'a_day' => ':count Daach', + + 'hour' => ':count Uhr', + 'h' => ':count Uhr', + 'a_hour' => ':count Uhr', + + 'minute' => ':count Menutt', + 'min' => ':count Menutt', + 'a_minute' => ':count Menutt', + + 'second' => ':count Sekůndt', + 's' => ':count Sekůndt', + 'a_second' => ':count Sekůndt', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ku.php b/vendor/nesbot/carbon/src/Carbon/Lang/ku.php new file mode 100644 index 0000000..189960c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ku.php @@ -0,0 +1,40 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Unicode, Inc. + */ + +return [ + 'ago' => 'berî :time', + 'from_now' => 'di :time de', + 'after' => ':time piştî', + 'before' => ':time berê', + 'year' => ':count sal', + 'year_ago' => ':count salê|:count salan', + 'year_from_now' => 'salekê|:count salan', + 'month' => ':count meh', + 'week' => ':count hefte', + 'day' => ':count roj', + 'hour' => ':count saet', + 'minute' => ':count deqîqe', + 'second' => ':count saniye', + 'months' => ['rêbendanê', 'reşemiyê', 'adarê', 'avrêlê', 'gulanê', 'pûşperê', 'tîrmehê', 'gelawêjê', 'rezberê', 'kewçêrê', 'sermawezê', 'berfanbarê'], + 'months_standalone' => ['rêbendan', 'reşemî', 'adar', 'avrêl', 'gulan', 'pûşper', 'tîrmeh', 'gelawêj', 'rezber', 'kewçêr', 'sermawez', 'berfanbar'], + 'months_short' => ['rêb', 'reş', 'ada', 'avr', 'gul', 'pûş', 'tîr', 'gel', 'rez', 'kew', 'ser', 'ber'], + 'weekdays' => ['yekşem', 'duşem', 'sêşem', 'çarşem', 'pêncşem', 'în', 'şemî'], + 'weekdays_short' => ['yş', 'dş', 'sş', 'çş', 'pş', 'în', 'ş'], + 'weekdays_min' => ['Y', 'D', 'S', 'Ç', 'P', 'Î', 'Ş'], + 'list' => [', ', ' û '], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ku_TR.php b/vendor/nesbot/carbon/src/Carbon/Lang/ku_TR.php new file mode 100644 index 0000000..4243a82 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ku_TR.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ku.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kw.php b/vendor/nesbot/carbon/src/Carbon/Lang/kw.php new file mode 100644 index 0000000..26e242e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kw.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/kw_GB.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/kw_GB.php b/vendor/nesbot/carbon/src/Carbon/Lang/kw_GB.php new file mode 100644 index 0000000..00bf52b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/kw_GB.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Alastair McKinstry bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['mis Genver', 'mis Hwevrer', 'mis Meurth', 'mis Ebrel', 'mis Me', 'mis Metheven', 'mis Gortheren', 'mis Est', 'mis Gwynngala', 'mis Hedra', 'mis Du', 'mis Kevardhu'], + 'months_short' => ['Gen', 'Hwe', 'Meu', 'Ebr', 'Me', 'Met', 'Gor', 'Est', 'Gwn', 'Hed', 'Du', 'Kev'], + 'weekdays' => ['De Sul', 'De Lun', 'De Merth', 'De Merher', 'De Yow', 'De Gwener', 'De Sadorn'], + 'weekdays_short' => ['Sul', 'Lun', 'Mth', 'Mhr', 'Yow', 'Gwe', 'Sad'], + 'weekdays_min' => ['Sul', 'Lun', 'Mth', 'Mhr', 'Yow', 'Gwe', 'Sad'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + + 'year' => ':count bledhen', + 'y' => ':count bledhen', + 'a_year' => ':count bledhen', + + 'month' => ':count mis', + 'm' => ':count mis', + 'a_month' => ':count mis', + + 'week' => ':count seythen', + 'w' => ':count seythen', + 'a_week' => ':count seythen', + + 'day' => ':count dydh', + 'd' => ':count dydh', + 'a_day' => ':count dydh', + + 'hour' => ':count eur', + 'h' => ':count eur', + 'a_hour' => ':count eur', + + 'minute' => ':count mynysen', + 'min' => ':count mynysen', + 'a_minute' => ':count mynysen', + + 'second' => ':count pryjwyth', + 's' => ':count pryjwyth', + 'a_second' => ':count pryjwyth', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ky.php b/vendor/nesbot/carbon/src/Carbon/Lang/ky.php new file mode 100644 index 0000000..e0d1af1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ky.php @@ -0,0 +1,106 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - acutexyz + * - Josh Soref + * - François B + * - Chyngyz Arystan uulu + * - Chyngyz + * - acutexyz + * - Josh Soref + * - François B + * - Chyngyz Arystan uulu + */ +return [ + 'year' => ':count жыл', + 'a_year' => '{1}бир жыл|:count жыл', + 'y' => ':count жыл', + 'month' => ':count ай', + 'a_month' => '{1}бир ай|:count ай', + 'm' => ':count ай', + 'week' => ':count апта', + 'a_week' => '{1}бир апта|:count апта', + 'w' => ':count апт.', + 'day' => ':count күн', + 'a_day' => '{1}бир күн|:count күн', + 'd' => ':count күн', + 'hour' => ':count саат', + 'a_hour' => '{1}бир саат|:count саат', + 'h' => ':count саат.', + 'minute' => ':count мүнөт', + 'a_minute' => '{1}бир мүнөт|:count мүнөт', + 'min' => ':count мүн.', + 'second' => ':count секунд', + 'a_second' => '{1}бирнече секунд|:count секунд', + 's' => ':count сек.', + 'ago' => ':time мурун', + 'from_now' => ':time ичинде', + 'diff_now' => 'азыр', + 'diff_today' => 'Бүгүн', + 'diff_today_regexp' => 'Бүгүн(?:\\s+саат)?', + 'diff_yesterday' => 'кечээ', + 'diff_yesterday_regexp' => 'Кече(?:\\s+саат)?', + 'diff_tomorrow' => 'эртең', + 'diff_tomorrow_regexp' => 'Эртең(?:\\s+саат)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Бүгүн саат] LT', + 'nextDay' => '[Эртең саат] LT', + 'nextWeek' => 'dddd [саат] LT', + 'lastDay' => '[Кече саат] LT', + 'lastWeek' => '[Өткен аптанын] dddd [күнү] [саат] LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number) { + static $suffixes = [ + 0 => '-чү', + 1 => '-чи', + 2 => '-чи', + 3 => '-чү', + 4 => '-чү', + 5 => '-чи', + 6 => '-чы', + 7 => '-чи', + 8 => '-чи', + 9 => '-чу', + 10 => '-чу', + 20 => '-чы', + 30 => '-чу', + 40 => '-чы', + 50 => '-чү', + 60 => '-чы', + 70 => '-чи', + 80 => '-чи', + 90 => '-чу', + 100 => '-чү', + ]; + + return $number.($suffixes[$number] ?? $suffixes[$number % 10] ?? $suffixes[$number >= 100 ? 100 : -1] ?? ''); + }, + 'months' => ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'], + 'months_short' => ['янв', 'фев', 'март', 'апр', 'май', 'июнь', 'июль', 'авг', 'сен', 'окт', 'ноя', 'дек'], + 'weekdays' => ['Жекшемби', 'Дүйшөмбү', 'Шейшемби', 'Шаршемби', 'Бейшемби', 'Жума', 'Ишемби'], + 'weekdays_short' => ['Жек', 'Дүй', 'Шей', 'Шар', 'Бей', 'Жум', 'Ише'], + 'weekdays_min' => ['Жк', 'Дй', 'Шй', 'Шр', 'Бй', 'Жм', 'Иш'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => ' ', + 'meridiem' => ['таңкы', 'түштөн кийинки'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ky_KG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ky_KG.php new file mode 100644 index 0000000..9923a31 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ky_KG.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ky.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lag.php b/vendor/nesbot/carbon/src/Carbon/Lang/lag.php new file mode 100644 index 0000000..f3f57f6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lag.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['TOO', 'MUU'], + 'weekdays' => ['Jumapíiri', 'Jumatátu', 'Jumaíne', 'Jumatáano', 'Alamíisi', 'Ijumáa', 'Jumamóosi'], + 'weekdays_short' => ['Píili', 'Táatu', 'Íne', 'Táano', 'Alh', 'Ijm', 'Móosi'], + 'weekdays_min' => ['Píili', 'Táatu', 'Íne', 'Táano', 'Alh', 'Ijm', 'Móosi'], + 'months' => ['Kʉfúngatɨ', 'Kʉnaanɨ', 'Kʉkeenda', 'Kwiikumi', 'Kwiinyambála', 'Kwiidwaata', 'Kʉmʉʉnchɨ', 'Kʉvɨɨrɨ', 'Kʉsaatʉ', 'Kwiinyi', 'Kʉsaano', 'Kʉsasatʉ'], + 'months_short' => ['Fúngatɨ', 'Naanɨ', 'Keenda', 'Ikúmi', 'Inyambala', 'Idwaata', 'Mʉʉnchɨ', 'Vɨɨrɨ', 'Saatʉ', 'Inyi', 'Saano', 'Sasatʉ'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lb.php b/vendor/nesbot/carbon/src/Carbon/Lang/lb.php new file mode 100644 index 0000000..7636655 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lb.php @@ -0,0 +1,88 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Philippe Vaucher + * - Tsutomu Kuroda + * - dan-nl + * - Simon Lelorrain (slelorrain) + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => ':count Joer', + 'y' => ':countJ', + 'month' => ':count Mount|:count Méint', + 'm' => ':countMo', + 'week' => ':count Woch|:count Wochen', + 'w' => ':countWo|:countWo', + 'day' => ':count Dag|:count Deeg', + 'd' => ':countD', + 'hour' => ':count Stonn|:count Stonnen', + 'h' => ':countSto', + 'minute' => ':count Minutt|:count Minutten', + 'min' => ':countM', + 'second' => ':count Sekonn|:count Sekonnen', + 's' => ':countSek', + + 'ago' => 'virun :time', + 'from_now' => 'an :time', + 'before' => ':time virdrun', + 'after' => ':time duerno', + + 'diff_today' => 'Haut', + 'diff_yesterday' => 'Gëschter', + 'diff_yesterday_regexp' => 'Gëschter(?:\\s+um)?', + 'diff_tomorrow' => 'Muer', + 'diff_tomorrow_regexp' => 'Muer(?:\\s+um)?', + 'diff_today_regexp' => 'Haut(?:\\s+um)?', + 'formats' => [ + 'LT' => 'H:mm [Auer]', + 'LTS' => 'H:mm:ss [Auer]', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D. MMMM YYYY', + 'LLL' => 'D. MMMM YYYY H:mm [Auer]', + 'LLLL' => 'dddd, D. MMMM YYYY H:mm [Auer]', + ], + + 'calendar' => [ + 'sameDay' => '[Haut um] LT', + 'nextDay' => '[Muer um] LT', + 'nextWeek' => 'dddd [um] LT', + 'lastDay' => '[Gëschter um] LT', + 'lastWeek' => function (CarbonInterface $date) { + // Different date string for 'Dënschdeg' (Tuesday) and 'Donneschdeg' (Thursday) due to phonological rule + switch ($date->dayOfWeek) { + case 2: + case 4: + return '[Leschten] dddd [um] LT'; + default: + return '[Leschte] dddd [um] LT'; + } + }, + 'sameElse' => 'L', + ], + + 'months' => ['Januar', 'Februar', 'Mäerz', 'Abrëll', 'Mee', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'], + 'months_short' => ['Jan.', 'Febr.', 'Mrz.', 'Abr.', 'Mee', 'Jun.', 'Jul.', 'Aug.', 'Sept.', 'Okt.', 'Nov.', 'Dez.'], + 'weekdays' => ['Sonndeg', 'Méindeg', 'Dënschdeg', 'Mëttwoch', 'Donneschdeg', 'Freideg', 'Samschdeg'], + 'weekdays_short' => ['So.', 'Mé.', 'Dë.', 'Më.', 'Do.', 'Fr.', 'Sa.'], + 'weekdays_min' => ['So', 'Mé', 'Dë', 'Më', 'Do', 'Fr', 'Sa'], + 'ordinal' => ':number.', + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' an '], + 'meridiem' => ['moies', 'mëttes'], + 'weekdays_short_standalone' => ['Son', 'Méi', 'Dën', 'Mët', 'Don', 'Fre', 'Sam'], + 'months_short_standalone' => ['Jan', 'Feb', 'Mäe', 'Abr', 'Mee', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lb_LU.php b/vendor/nesbot/carbon/src/Carbon/Lang/lb_LU.php new file mode 100644 index 0000000..414bd4d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lb_LU.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/lb.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lg.php b/vendor/nesbot/carbon/src/Carbon/Lang/lg.php new file mode 100644 index 0000000..48bc68b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lg.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/lg_UG.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lg_UG.php b/vendor/nesbot/carbon/src/Carbon/Lang/lg_UG.php new file mode 100644 index 0000000..aa02214 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lg_UG.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Akademe ya Luganda Kizito Birabwa kompyuta@kizito.uklinux.net + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['Janwaliyo', 'Febwaliyo', 'Marisi', 'Apuli', 'Maayi', 'Juuni', 'Julaayi', 'Agusito', 'Sebuttemba', 'Okitobba', 'Novemba', 'Desemba'], + 'months_short' => ['Jan', 'Feb', 'Mar', 'Apu', 'Maa', 'Juu', 'Jul', 'Agu', 'Seb', 'Oki', 'Nov', 'Des'], + 'weekdays' => ['Sabiiti', 'Balaza', 'Lwakubiri', 'Lwakusatu', 'Lwakuna', 'Lwakutaano', 'Lwamukaaga'], + 'weekdays_short' => ['Sab', 'Bal', 'Lw2', 'Lw3', 'Lw4', 'Lw5', 'Lw6'], + 'weekdays_min' => ['Sab', 'Bal', 'Lw2', 'Lw3', 'Lw4', 'Lw5', 'Lw6'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + + 'month' => ':count njuba', // less reliable + 'm' => ':count njuba', // less reliable + 'a_month' => ':count njuba', // less reliable + + 'year' => ':count mwaaka', + 'y' => ':count mwaaka', + 'a_year' => ':count mwaaka', + + 'week' => ':count sabbiiti', + 'w' => ':count sabbiiti', + 'a_week' => ':count sabbiiti', + + 'day' => ':count lunaku', + 'd' => ':count lunaku', + 'a_day' => ':count lunaku', + + 'hour' => 'saawa :count', + 'h' => 'saawa :count', + 'a_hour' => 'saawa :count', + + 'minute' => 'ddakiika :count', + 'min' => 'ddakiika :count', + 'a_minute' => 'ddakiika :count', + + 'second' => ':count kyʼokubiri', + 's' => ':count kyʼokubiri', + 'a_second' => ':count kyʼokubiri', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/li.php b/vendor/nesbot/carbon/src/Carbon/Lang/li.php new file mode 100644 index 0000000..86c3009 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/li.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/li_NL.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/li_NL.php b/vendor/nesbot/carbon/src/Carbon/Lang/li_NL.php new file mode 100644 index 0000000..6c5feb7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/li_NL.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - information from Kenneth Christiansen Kenneth Christiansen, Pablo Saratxaga kenneth@gnu.org, pablo@mandriva.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], + 'months' => ['jannewarie', 'fibberwarie', 'miert', 'eprèl', 'meij', 'junie', 'julie', 'augustus', 'september', 'oktober', 'november', 'desember'], + 'months_short' => ['jan', 'fib', 'mie', 'epr', 'mei', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'], + 'weekdays' => ['zóndig', 'maondig', 'daensdig', 'goonsdig', 'dónderdig', 'vriedig', 'zaoterdig'], + 'weekdays_short' => ['zón', 'mao', 'dae', 'goo', 'dón', 'vri', 'zao'], + 'weekdays_min' => ['zón', 'mao', 'dae', 'goo', 'dón', 'vri', 'zao'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + + 'minute' => ':count momênt', // less reliable + 'min' => ':count momênt', // less reliable + 'a_minute' => ':count momênt', // less reliable + + 'year' => ':count jaor', + 'y' => ':count jaor', + 'a_year' => ':count jaor', + + 'month' => ':count maond', + 'm' => ':count maond', + 'a_month' => ':count maond', + + 'week' => ':count waek', + 'w' => ':count waek', + 'a_week' => ':count waek', + + 'day' => ':count daag', + 'd' => ':count daag', + 'a_day' => ':count daag', + + 'hour' => ':count oer', + 'h' => ':count oer', + 'a_hour' => ':count oer', + + 'second' => ':count Secónd', + 's' => ':count Secónd', + 'a_second' => ':count Secónd', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lij.php b/vendor/nesbot/carbon/src/Carbon/Lang/lij.php new file mode 100644 index 0000000..45732b5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lij.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/lij_IT.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lij_IT.php b/vendor/nesbot/carbon/src/Carbon/Lang/lij_IT.php new file mode 100644 index 0000000..f8726fd --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lij_IT.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Gastaldi alessio.gastaldi@libero.it + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['zenâ', 'fevrâ', 'marzo', 'avrî', 'mazzo', 'zûgno', 'lûggio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dixembre'], + 'months_short' => ['zen', 'fev', 'mar', 'arv', 'maz', 'zûg', 'lûg', 'ago', 'set', 'ött', 'nov', 'dix'], + 'weekdays' => ['domenega', 'lûnedì', 'martedì', 'mercUrdì', 'zêggia', 'venardì', 'sabbo'], + 'weekdays_short' => ['dom', 'lûn', 'mar', 'mer', 'zêu', 'ven', 'sab'], + 'weekdays_min' => ['dom', 'lûn', 'mar', 'mer', 'zêu', 'ven', 'sab'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + + 'year' => ':count etæ', // less reliable + 'y' => ':count etæ', // less reliable + 'a_year' => ':count etæ', // less reliable + + 'month' => ':count meize', + 'm' => ':count meize', + 'a_month' => ':count meize', + + 'week' => ':count settemannha', + 'w' => ':count settemannha', + 'a_week' => ':count settemannha', + + 'day' => ':count giorno', + 'd' => ':count giorno', + 'a_day' => ':count giorno', + + 'hour' => ':count reléuio', // less reliable + 'h' => ':count reléuio', // less reliable + 'a_hour' => ':count reléuio', // less reliable + + 'minute' => ':count menûo', + 'min' => ':count menûo', + 'a_minute' => ':count menûo', + + 'second' => ':count segondo', + 's' => ':count segondo', + 'a_second' => ':count segondo', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lkt.php b/vendor/nesbot/carbon/src/Carbon/Lang/lkt.php new file mode 100644 index 0000000..ae73a97 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lkt.php @@ -0,0 +1,41 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + + 'month' => ':count haŋwí', // less reliable + 'm' => ':count haŋwí', // less reliable + 'a_month' => ':count haŋwí', // less reliable + + 'week' => ':count šakówiŋ', // less reliable + 'w' => ':count šakówiŋ', // less reliable + 'a_week' => ':count šakówiŋ', // less reliable + + 'hour' => ':count maza škaŋškaŋ', // less reliable + 'h' => ':count maza škaŋškaŋ', // less reliable + 'a_hour' => ':count maza škaŋškaŋ', // less reliable + + 'minute' => ':count číkʼala', // less reliable + 'min' => ':count číkʼala', // less reliable + 'a_minute' => ':count číkʼala', // less reliable + + 'year' => ':count waníyetu', + 'y' => ':count waníyetu', + 'a_year' => ':count waníyetu', + + 'day' => ':count aŋpétu', + 'd' => ':count aŋpétu', + 'a_day' => ':count aŋpétu', + + 'second' => ':count icinuŋpa', + 's' => ':count icinuŋpa', + 'a_second' => ':count icinuŋpa', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ln.php b/vendor/nesbot/carbon/src/Carbon/Lang/ln.php new file mode 100644 index 0000000..9d5c35d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ln.php @@ -0,0 +1,60 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ubuntu René Manassé GALEKWA renemanasse@gmail.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'months' => ['sánzá ya yambo', 'sánzá ya míbalé', 'sánzá ya mísáto', 'sánzá ya mínei', 'sánzá ya mítáno', 'sánzá ya motóbá', 'sánzá ya nsambo', 'sánzá ya mwambe', 'sánzá ya libwa', 'sánzá ya zómi', 'sánzá ya zómi na mɔ̌kɔ́', 'sánzá ya zómi na míbalé'], + 'months_short' => ['yan', 'fbl', 'msi', 'apl', 'mai', 'yun', 'yul', 'agt', 'stb', 'ɔtb', 'nvb', 'dsb'], + 'weekdays' => ['Lomíngo', 'Mosálá mɔ̌kɔ́', 'Misálá míbalé', 'Misálá mísáto', 'Misálá mínei', 'Misálá mítáno', 'Mpɔ́sɔ'], + 'weekdays_short' => ['m1.', 'm2.', 'm3.', 'm4.', 'm5.', 'm6.', 'm7.'], + 'weekdays_min' => ['m1.', 'm2.', 'm3.', 'm4.', 'm5.', 'm6.', 'm7.'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + + 'year' => 'mbula :count', + 'y' => 'mbula :count', + 'a_year' => 'mbula :count', + + 'month' => 'sánzá :count', + 'm' => 'sánzá :count', + 'a_month' => 'sánzá :count', + + 'week' => 'mpɔ́sɔ :count', + 'w' => 'mpɔ́sɔ :count', + 'a_week' => 'mpɔ́sɔ :count', + + 'day' => 'mokɔlɔ :count', + 'd' => 'mokɔlɔ :count', + 'a_day' => 'mokɔlɔ :count', + + 'hour' => 'ngonga :count', + 'h' => 'ngonga :count', + 'a_hour' => 'ngonga :count', + + 'minute' => 'miniti :count', + 'min' => 'miniti :count', + 'a_minute' => 'miniti :count', + + 'second' => 'segɔnde :count', + 's' => 'segɔnde :count', + 'a_second' => 'segɔnde :count', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ln_AO.php b/vendor/nesbot/carbon/src/Carbon/Lang/ln_AO.php new file mode 100644 index 0000000..7fdb7f1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ln_AO.php @@ -0,0 +1,17 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ln.php', [ + 'weekdays' => ['eyenga', 'mokɔlɔ mwa yambo', 'mokɔlɔ mwa míbalé', 'mokɔlɔ mwa mísáto', 'mokɔlɔ ya mínéi', 'mokɔlɔ ya mítáno', 'mpɔ́sɔ'], + 'weekdays_short' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], + 'weekdays_min' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], + 'meridiem' => ['ntɔ́ngɔ́', 'mpókwa'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ln_CD.php b/vendor/nesbot/carbon/src/Carbon/Lang/ln_CD.php new file mode 100644 index 0000000..13635fc --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ln_CD.php @@ -0,0 +1,16 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ubuntu René Manassé GALEKWA renemanasse@gmail.com + */ +return require __DIR__.'/ln.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ln_CF.php b/vendor/nesbot/carbon/src/Carbon/Lang/ln_CF.php new file mode 100644 index 0000000..7fdb7f1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ln_CF.php @@ -0,0 +1,17 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ln.php', [ + 'weekdays' => ['eyenga', 'mokɔlɔ mwa yambo', 'mokɔlɔ mwa míbalé', 'mokɔlɔ mwa mísáto', 'mokɔlɔ ya mínéi', 'mokɔlɔ ya mítáno', 'mpɔ́sɔ'], + 'weekdays_short' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], + 'weekdays_min' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], + 'meridiem' => ['ntɔ́ngɔ́', 'mpókwa'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ln_CG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ln_CG.php new file mode 100644 index 0000000..7fdb7f1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ln_CG.php @@ -0,0 +1,17 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ln.php', [ + 'weekdays' => ['eyenga', 'mokɔlɔ mwa yambo', 'mokɔlɔ mwa míbalé', 'mokɔlɔ mwa mísáto', 'mokɔlɔ ya mínéi', 'mokɔlɔ ya mítáno', 'mpɔ́sɔ'], + 'weekdays_short' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], + 'weekdays_min' => ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'], + 'meridiem' => ['ntɔ́ngɔ́', 'mpókwa'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lo.php b/vendor/nesbot/carbon/src/Carbon/Lang/lo.php new file mode 100644 index 0000000..48715f5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lo.php @@ -0,0 +1,62 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - ryanhart2 + */ +return [ + 'year' => ':count ປີ', + 'y' => ':count ປີ', + 'month' => ':count ເດືອນ', + 'm' => ':count ດ. ', + 'week' => ':count ອາທິດ', + 'w' => ':count ອທ. ', + 'day' => ':count ມື້', + 'd' => ':count ມື້', + 'hour' => ':count ຊົ່ວໂມງ', + 'h' => ':count ຊມ. ', + 'minute' => ':count ນາທີ', + 'min' => ':count ນທ. ', + 'second' => '{1}ບໍ່ເທົ່າໃດວິນາທີ|]1,Inf[:count ວິນາທີ', + 's' => ':count ວິ. ', + 'ago' => ':timeຜ່ານມາ', + 'from_now' => 'ອີກ :time', + 'diff_now' => 'ຕອນນີ້', + 'diff_today' => 'ມື້ນີ້ເວລາ', + 'diff_yesterday' => 'ມື້ວານນີ້ເວລາ', + 'diff_tomorrow' => 'ມື້ອື່ນເວລາ', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'ວັນdddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[ມື້ນີ້ເວລາ] LT', + 'nextDay' => '[ມື້ອື່ນເວລາ] LT', + 'nextWeek' => '[ວັນ]dddd[ໜ້າເວລາ] LT', + 'lastDay' => '[ມື້ວານນີ້ເວລາ] LT', + 'lastWeek' => '[ວັນ]dddd[ແລ້ວນີ້ເວລາ] LT', + 'sameElse' => 'L', + ], + 'ordinal' => 'ທີ່:number', + 'meridiem' => ['ຕອນເຊົ້າ', 'ຕອນແລງ'], + 'months' => ['ມັງກອນ', 'ກຸມພາ', 'ມີນາ', 'ເມສາ', 'ພຶດສະພາ', 'ມິຖຸນາ', 'ກໍລະກົດ', 'ສິງຫາ', 'ກັນຍາ', 'ຕຸລາ', 'ພະຈິກ', 'ທັນວາ'], + 'months_short' => ['ມັງກອນ', 'ກຸມພາ', 'ມີນາ', 'ເມສາ', 'ພຶດສະພາ', 'ມິຖຸນາ', 'ກໍລະກົດ', 'ສິງຫາ', 'ກັນຍາ', 'ຕຸລາ', 'ພະຈິກ', 'ທັນວາ'], + 'weekdays' => ['ອາທິດ', 'ຈັນ', 'ອັງຄານ', 'ພຸດ', 'ພະຫັດ', 'ສຸກ', 'ເສົາ'], + 'weekdays_short' => ['ທິດ', 'ຈັນ', 'ອັງຄານ', 'ພຸດ', 'ພະຫັດ', 'ສຸກ', 'ເສົາ'], + 'weekdays_min' => ['ທ', 'ຈ', 'ອຄ', 'ພ', 'ພຫ', 'ສກ', 'ສ'], + 'list' => [', ', 'ແລະ '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lo_LA.php b/vendor/nesbot/carbon/src/Carbon/Lang/lo_LA.php new file mode 100644 index 0000000..9b7fd9b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lo_LA.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/lo.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lrc.php b/vendor/nesbot/carbon/src/Carbon/Lang/lrc.php new file mode 100644 index 0000000..546e679 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lrc.php @@ -0,0 +1,17 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + + 'minute' => ':count هنر', // less reliable + 'min' => ':count هنر', // less reliable + 'a_minute' => ':count هنر', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php b/vendor/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php new file mode 100644 index 0000000..d42f5e9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php @@ -0,0 +1,13 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/lrc.php', [ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lt.php b/vendor/nesbot/carbon/src/Carbon/Lang/lt.php new file mode 100644 index 0000000..7d1b6f7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lt.php @@ -0,0 +1,135 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Philippe Vaucher + * - Tsutomu Kuroda + * - tjku + * - valdas406 + * - Justas Palumickas + * - Max Melentiev + * - Andrius Janauskas + * - Juanito Fatas + * - Akira Matsuda + * - Christopher Dell + * - Enrique Vidal + * - Simone Carletti + * - Aaron Patterson + * - Nicolás Hock Isaza + * - Laurynas Butkus + * - Sven Fuchs + * - Dominykas Tijūnaitis + * - Justinas Bolys + * - Ričardas + * - Kirill Chalkin + * - Rolandas + * - Justinas (Gamesh) + */ +return [ + 'year' => ':count metai|:count metai|:count metų', + 'y' => ':count m.', + 'month' => ':count mėnuo|:count mėnesiai|:count mėnesį', + 'm' => ':count mėn.', + 'week' => ':count savaitė|:count savaitės|:count savaitę', + 'w' => ':count sav.', + 'day' => ':count diena|:count dienos|:count dienų', + 'd' => ':count d.', + 'hour' => ':count valanda|:count valandos|:count valandų', + 'h' => ':count val.', + 'minute' => ':count minutė|:count minutės|:count minutę', + 'min' => ':count min.', + 'second' => ':count sekundė|:count sekundės|:count sekundžių', + 's' => ':count sek.', + + 'year_ago' => ':count metus|:count metus|:count metų', + 'month_ago' => ':count mėnesį|:count mėnesius|:count mėnesių', + 'week_ago' => ':count savaitę|:count savaites|:count savaičių', + 'day_ago' => ':count dieną|:count dienas|:count dienų', + 'hour_ago' => ':count valandą|:count valandas|:count valandų', + 'minute_ago' => ':count minutę|:count minutes|:count minučių', + 'second_ago' => ':count sekundę|:count sekundes|:count sekundžių', + + 'year_from_now' => ':count metų', + 'month_from_now' => ':count mėnesio|:count mėnesių|:count mėnesių', + 'week_from_now' => ':count savaitės|:count savaičių|:count savaičių', + 'day_from_now' => ':count dienos|:count dienų|:count dienų', + 'hour_from_now' => ':count valandos|:count valandų|:count valandų', + 'minute_from_now' => ':count minutės|:count minučių|:count minučių', + 'second_from_now' => ':count sekundės|:count sekundžių|:count sekundžių', + + 'year_after' => ':count metų', + 'month_after' => ':count mėnesio|:count mėnesių|:count mėnesių', + 'week_after' => ':count savaitės|:count savaičių|:count savaičių', + 'day_after' => ':count dienos|:count dienų|:count dienų', + 'hour_after' => ':count valandos|:count valandų|:count valandų', + 'minute_after' => ':count minutės|:count minučių|:count minučių', + 'second_after' => ':count sekundės|:count sekundžių|:count sekundžių', + + 'ago' => 'prieš :time', + 'from_now' => ':time nuo dabar', + 'after' => 'po :time', + 'before' => 'už :time', + + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + + 'diff_now' => 'ką tik', + 'diff_today' => 'Šiandien', + 'diff_yesterday' => 'vakar', + 'diff_yesterday_regexp' => 'Vakar', + 'diff_tomorrow' => 'rytoj', + 'diff_tomorrow_regexp' => 'Rytoj', + 'diff_before_yesterday' => 'užvakar', + 'diff_after_tomorrow' => 'poryt', + + 'period_recurrences' => 'kartą|:count kartų', + 'period_interval' => 'kiekvieną :interval', + 'period_start_date' => 'nuo :date', + 'period_end_date' => 'iki :date', + + 'months' => ['sausio', 'vasario', 'kovo', 'balandžio', 'gegužės', 'birželio', 'liepos', 'rugpjūčio', 'rugsėjo', 'spalio', 'lapkričio', 'gruodžio'], + 'months_standalone' => ['sausis', 'vasaris', 'kovas', 'balandis', 'gegužė', 'birželis', 'liepa', 'rugpjūtis', 'rugsėjis', 'spalis', 'lapkritis', 'gruodis'], + 'months_regexp' => '/(L{2,4}|D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?)/', + 'months_short' => ['sau', 'vas', 'kov', 'bal', 'geg', 'bir', 'lie', 'rgp', 'rgs', 'spa', 'lap', 'gru'], + 'weekdays' => ['sekmadienį', 'pirmadienį', 'antradienį', 'trečiadienį', 'ketvirtadienį', 'penktadienį', 'šeštadienį'], + 'weekdays_standalone' => ['sekmadienis', 'pirmadienis', 'antradienis', 'trečiadienis', 'ketvirtadienis', 'penktadienis', 'šeštadienis'], + 'weekdays_short' => ['sek', 'pir', 'ant', 'tre', 'ket', 'pen', 'šeš'], + 'weekdays_min' => ['se', 'pi', 'an', 'tr', 'ke', 'pe', 'še'], + 'list' => [', ', ' ir '], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY-MM-DD', + 'LL' => 'MMMM DD, YYYY', + 'LLL' => 'DD MMM HH:mm', + 'LLLL' => 'MMMM DD, YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Šiandien] LT', + 'nextDay' => '[Rytoj] LT', + 'nextWeek' => 'dddd LT', + 'lastDay' => '[Vakar] LT', + 'lastWeek' => '[Paskutinį] dddd LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number) { + switch ($number) { + case 0: + return '0-is'; + case 3: + return '3-ias'; + default: + return "$number-as"; + } + }, + 'meridiem' => ['priešpiet', 'popiet'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lt_LT.php b/vendor/nesbot/carbon/src/Carbon/Lang/lt_LT.php new file mode 100644 index 0000000..f772d38 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lt_LT.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/lt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lu.php b/vendor/nesbot/carbon/src/Carbon/Lang/lu.php new file mode 100644 index 0000000..c8cd83a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lu.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['Dinda', 'Dilolo'], + 'weekdays' => ['Lumingu', 'Nkodya', 'Ndàayà', 'Ndangù', 'Njòwa', 'Ngòvya', 'Lubingu'], + 'weekdays_short' => ['Lum', 'Nko', 'Ndy', 'Ndg', 'Njw', 'Ngv', 'Lub'], + 'weekdays_min' => ['Lum', 'Nko', 'Ndy', 'Ndg', 'Njw', 'Ngv', 'Lub'], + 'months' => ['Ciongo', 'Lùishi', 'Lusòlo', 'Mùuyà', 'Lumùngùlù', 'Lufuimi', 'Kabàlàshìpù', 'Lùshìkà', 'Lutongolo', 'Lungùdi', 'Kaswèkèsè', 'Ciswà'], + 'months_short' => ['Cio', 'Lui', 'Lus', 'Muu', 'Lum', 'Luf', 'Kab', 'Lush', 'Lut', 'Lun', 'Kas', 'Cis'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/luo.php b/vendor/nesbot/carbon/src/Carbon/Lang/luo.php new file mode 100644 index 0000000..b55af73 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/luo.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['OD', 'OT'], + 'weekdays' => ['Jumapil', 'Wuok Tich', 'Tich Ariyo', 'Tich Adek', 'Tich Ang’wen', 'Tich Abich', 'Ngeso'], + 'weekdays_short' => ['JMP', 'WUT', 'TAR', 'TAD', 'TAN', 'TAB', 'NGS'], + 'weekdays_min' => ['JMP', 'WUT', 'TAR', 'TAD', 'TAN', 'TAB', 'NGS'], + 'months' => ['Dwe mar Achiel', 'Dwe mar Ariyo', 'Dwe mar Adek', 'Dwe mar Ang’wen', 'Dwe mar Abich', 'Dwe mar Auchiel', 'Dwe mar Abiriyo', 'Dwe mar Aboro', 'Dwe mar Ochiko', 'Dwe mar Apar', 'Dwe mar gi achiel', 'Dwe mar Apar gi ariyo'], + 'months_short' => ['DAC', 'DAR', 'DAD', 'DAN', 'DAH', 'DAU', 'DAO', 'DAB', 'DOC', 'DAP', 'DGI', 'DAG'], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + + 'year' => 'higni :count', + 'y' => 'higni :count', + 'a_year' => ':higni :count', + + 'month' => 'dweche :count', + 'm' => 'dweche :count', + 'a_month' => 'dweche :count', + + 'week' => 'jumbe :count', + 'w' => 'jumbe :count', + 'a_week' => 'jumbe :count', + + 'day' => 'ndalo :count', + 'd' => 'ndalo :count', + 'a_day' => 'ndalo :count', + + 'hour' => 'seche :count', + 'h' => 'seche :count', + 'a_hour' => 'seche :count', + + 'minute' => 'dakika :count', + 'min' => 'dakika :count', + 'a_minute' => 'dakika :count', + + 'second' => 'nus dakika :count', + 's' => 'nus dakika :count', + 'a_second' => 'nus dakika :count', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/luy.php b/vendor/nesbot/carbon/src/Carbon/Lang/luy.php new file mode 100644 index 0000000..2b37e3e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/luy.php @@ -0,0 +1,57 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'weekdays' => ['Jumapiri', 'Jumatatu', 'Jumanne', 'Jumatano', 'Murwa wa Kanne', 'Murwa wa Katano', 'Jumamosi'], + 'weekdays_short' => ['J2', 'J3', 'J4', 'J5', 'Al', 'Ij', 'J1'], + 'weekdays_min' => ['J2', 'J3', 'J4', 'J5', 'Al', 'Ij', 'J1'], + 'months' => ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], + 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + + // Too unreliable + /* + 'year' => ':count liliino', // less reliable + 'y' => ':count liliino', // less reliable + 'a_year' => ':count liliino', // less reliable + + 'month' => ':count kumwesi', // less reliable + 'm' => ':count kumwesi', // less reliable + 'a_month' => ':count kumwesi', // less reliable + + 'week' => ':count olutambi', // less reliable + 'w' => ':count olutambi', // less reliable + 'a_week' => ':count olutambi', // less reliable + + 'day' => ':count luno', // less reliable + 'd' => ':count luno', // less reliable + 'a_day' => ':count luno', // less reliable + + 'hour' => ':count ekengele', // less reliable + 'h' => ':count ekengele', // less reliable + 'a_hour' => ':count ekengele', // less reliable + + 'minute' => ':count omundu', // less reliable + 'min' => ':count omundu', // less reliable + 'a_minute' => ':count omundu', // less reliable + + 'second' => ':count liliino', // less reliable + 's' => ':count liliino', // less reliable + 'a_second' => ':count liliino', // less reliable + */ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lv.php b/vendor/nesbot/carbon/src/Carbon/Lang/lv.php new file mode 100644 index 0000000..d5cba7c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lv.php @@ -0,0 +1,183 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Carbon\CarbonInterface; + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Philippe Vaucher + * - pirminis + * - Tsutomu Kuroda + * - tjku + * - Andris Zāģeris + * - Max Melentiev + * - Edgars Beigarts + * - Juanito Fatas + * - Vitauts Stočka + * - Akira Matsuda + * - Christopher Dell + * - Enrique Vidal + * - Simone Carletti + * - Aaron Patterson + * - Kaspars Bankovskis + * - Nicolás Hock Isaza + * - Viesturs Kavacs (Kavacky) + * - zakse + * - Janis Eglitis (janiseglitis) + * - Guntars + * - Juris Sudmalis + */ +$daysOfWeek = ['svētdiena', 'pirmdiena', 'otrdiena', 'trešdiena', 'ceturtdiena', 'piektdiena', 'sestdiena']; +$daysOfWeekLocativum = ['svētdien', 'pirmdien', 'otrdien', 'trešdien', 'ceturtdien', 'piektdien', 'sestdien']; + +$transformDiff = function ($input) { + return strtr($input, [ + // Nominative => "pirms/pēc" Dative + 'gads' => 'gada', + 'gadi' => 'gadiem', + 'gadu' => 'gadiem', + 'mēnesis' => 'mēneša', + 'mēneši' => 'mēnešiem', + 'mēnešu' => 'mēnešiem', + 'nedēļa' => 'nedēļas', + 'nedēļas' => 'nedēļām', + 'nedēļu' => 'nedēļām', + 'diena' => 'dienas', + 'dienas' => 'dienām', + 'dienu' => 'dienām', + 'stunda' => 'stundas', + 'stundas' => 'stundām', + 'stundu' => 'stundām', + 'minūte' => 'minūtes', + 'minūtes' => 'minūtēm', + 'minūšu' => 'minūtēm', + 'sekunde' => 'sekundes', + 'sekundes' => 'sekundēm', + 'sekunžu' => 'sekundēm', + ]); +}; + +return [ + 'ago' => function ($time) use ($transformDiff) { + return 'pirms '.$transformDiff($time); + }, + 'from_now' => function ($time) use ($transformDiff) { + return 'pēc '.$transformDiff($time); + }, + + 'year' => '0 gadu|:count gads|:count gadi', + 'y' => ':count g.', + 'a_year' => '{1}gads|0 gadu|:count gads|:count gadi', + 'month' => '0 mēnešu|:count mēnesis|:count mēneši', + 'm' => ':count mēn.', + 'a_month' => '{1}mēnesis|0 mēnešu|:count mēnesis|:count mēneši', + 'week' => '0 nedēļu|:count nedēļa|:count nedēļas', + 'w' => ':count ned.', + 'a_week' => '{1}nedēļa|0 nedēļu|:count nedēļa|:count nedēļas', + 'day' => '0 dienu|:count diena|:count dienas', + 'd' => ':count d.', + 'a_day' => '{1}diena|0 dienu|:count diena|:count dienas', + 'hour' => '0 stundu|:count stunda|:count stundas', + 'h' => ':count st.', + 'a_hour' => '{1}stunda|0 stundu|:count stunda|:count stundas', + 'minute' => '0 minūšu|:count minūte|:count minūtes', + 'min' => ':count min.', + 'a_minute' => '{1}minūte|0 minūšu|:count minūte|:count minūtes', + 'second' => '0 sekunžu|:count sekunde|:count sekundes', + 's' => ':count sek.', + 'a_second' => '{1}sekunde|0 sekunžu|:count sekunde|:count sekundes', + + 'after' => ':time vēlāk', + 'year_after' => '0 gadus|:count gadu|:count gadus', + 'a_year_after' => '{1}gadu|0 gadus|:count gadu|:count gadus', + 'month_after' => '0 mēnešus|:count mēnesi|:count mēnešus', + 'a_month_after' => '{1}mēnesi|0 mēnešus|:count mēnesi|:count mēnešus', + 'week_after' => '0 nedēļas|:count nedēļu|:count nedēļas', + 'a_week_after' => '{1}nedēļu|0 nedēļas|:count nedēļu|:count nedēļas', + 'day_after' => '0 dienas|:count dienu|:count dienas', + 'a_day_after' => '{1}dienu|0 dienas|:count dienu|:count dienas', + 'hour_after' => '0 stundas|:count stundu|:count stundas', + 'a_hour_after' => '{1}stundu|0 stundas|:count stundu|:count stundas', + 'minute_after' => '0 minūtes|:count minūti|:count minūtes', + 'a_minute_after' => '{1}minūti|0 minūtes|:count minūti|:count minūtes', + 'second_after' => '0 sekundes|:count sekundi|:count sekundes', + 'a_second_after' => '{1}sekundi|0 sekundes|:count sekundi|:count sekundes', + + 'before' => ':time agrāk', + 'year_before' => '0 gadus|:count gadu|:count gadus', + 'a_year_before' => '{1}gadu|0 gadus|:count gadu|:count gadus', + 'month_before' => '0 mēnešus|:count mēnesi|:count mēnešus', + 'a_month_before' => '{1}mēnesi|0 mēnešus|:count mēnesi|:count mēnešus', + 'week_before' => '0 nedēļas|:count nedēļu|:count nedēļas', + 'a_week_before' => '{1}nedēļu|0 nedēļas|:count nedēļu|:count nedēļas', + 'day_before' => '0 dienas|:count dienu|:count dienas', + 'a_day_before' => '{1}dienu|0 dienas|:count dienu|:count dienas', + 'hour_before' => '0 stundas|:count stundu|:count stundas', + 'a_hour_before' => '{1}stundu|0 stundas|:count stundu|:count stundas', + 'minute_before' => '0 minūtes|:count minūti|:count minūtes', + 'a_minute_before' => '{1}minūti|0 minūtes|:count minūti|:count minūtes', + 'second_before' => '0 sekundes|:count sekundi|:count sekundes', + 'a_second_before' => '{1}sekundi|0 sekundes|:count sekundi|:count sekundes', + + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' un '], + + 'diff_now' => 'tagad', + 'diff_today' => 'šodien', + 'diff_yesterday' => 'vakar', + 'diff_before_yesterday' => 'aizvakar', + 'diff_tomorrow' => 'rīt', + 'diff_after_tomorrow' => 'parīt', + + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY.', + 'LL' => 'YYYY. [gada] D. MMMM', + 'LLL' => 'DD.MM.YYYY., HH:mm', + 'LLLL' => 'YYYY. [gada] D. MMMM, HH:mm', + ], + + 'calendar' => [ + 'sameDay' => '[šodien] [plkst.] LT', + 'nextDay' => '[rīt] [plkst.] LT', + 'nextWeek' => function (CarbonInterface $current, CarbonInterface $other) use ($daysOfWeekLocativum) { + if ($current->week !== $other->week) { + return '[nākošo] ['.$daysOfWeekLocativum[$current->dayOfWeek].'] [plkst.] LT'; + } + + return '['.$daysOfWeekLocativum[$current->dayOfWeek].'] [plkst.] LT'; + }, + 'lastDay' => '[vakar] [plkst.] LT', + 'lastWeek' => function (CarbonInterface $current) use ($daysOfWeekLocativum) { + return '[pagājušo] ['.$daysOfWeekLocativum[$current->dayOfWeek].'] [plkst.] LT'; + }, + 'sameElse' => 'L', + ], + + 'weekdays' => $daysOfWeek, + 'weekdays_short' => ['Sv.', 'P.', 'O.', 'T.', 'C.', 'Pk.', 'S.'], + 'weekdays_min' => ['Sv.', 'P.', 'O.', 'T.', 'C.', 'Pk.', 'S.'], + 'months' => ['janvāris', 'februāris', 'marts', 'aprīlis', 'maijs', 'jūnijs', 'jūlijs', 'augusts', 'septembris', 'oktobris', 'novembris', 'decembris'], + 'months_standalone' => ['janvārī', 'februārī', 'martā', 'aprīlī', 'maijā', 'jūnijā', 'jūlijā', 'augustā', 'septembrī', 'oktobrī', 'novembrī', 'decembrī'], + 'months_short' => ['janv.', 'febr.', 'martā', 'apr.', 'maijā', 'jūn.', 'jūl.', 'aug.', 'sept.', 'okt.', 'nov.', 'dec.'], + 'meridiem' => ['priekšpusdiena', 'pēcpusdiena'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lv_LV.php b/vendor/nesbot/carbon/src/Carbon/Lang/lv_LV.php new file mode 100644 index 0000000..ee91c36 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lv_LV.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/lv.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lzh.php b/vendor/nesbot/carbon/src/Carbon/Lang/lzh.php new file mode 100644 index 0000000..1180c6b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lzh.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/lzh_TW.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/lzh_TW.php b/vendor/nesbot/carbon/src/Carbon/Lang/lzh_TW.php new file mode 100644 index 0000000..3b1493e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/lzh_TW.php @@ -0,0 +1,56 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'OY[年]MMMMOD[日]', + ], + 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], + 'months_short' => [' 一 ', ' 二 ', ' 三 ', ' 四 ', ' 五 ', ' 六 ', ' 七 ', ' 八 ', ' 九 ', ' 十 ', '十一', '十二'], + 'weekdays' => ['週日', '週一', '週二', '週三', '週四', '週五', '週六'], + 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], + 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], + 'day_of_first_week_of_year' => 1, + 'alt_numbers' => ['〇', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '廿', '廿一', '廿二', '廿三', '廿四', '廿五', '廿六', '廿七', '廿八', '廿九', '卅', '卅一'], + 'meridiem' => ['朝', '暮'], + + 'year' => ':count 夏', // less reliable + 'y' => ':count 夏', // less reliable + 'a_year' => ':count 夏', // less reliable + + 'month' => ':count 月', // less reliable + 'm' => ':count 月', // less reliable + 'a_month' => ':count 月', // less reliable + + 'hour' => ':count 氧', // less reliable + 'h' => ':count 氧', // less reliable + 'a_hour' => ':count 氧', // less reliable + + 'minute' => ':count 點', // less reliable + 'min' => ':count 點', // less reliable + 'a_minute' => ':count 點', // less reliable + + 'second' => ':count 楚', // less reliable + 's' => ':count 楚', // less reliable + 'a_second' => ':count 楚', // less reliable + + 'week' => ':count 星期', + 'w' => ':count 星期', + 'a_week' => ':count 星期', + + 'day' => ':count 日(曆法)', + 'd' => ':count 日(曆法)', + 'a_day' => ':count 日(曆法)', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mag.php b/vendor/nesbot/carbon/src/Carbon/Lang/mag.php new file mode 100644 index 0000000..7532436 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mag.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/mag_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mag_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/mag_IN.php new file mode 100644 index 0000000..193f67a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mag_IN.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - bhashaghar@googlegroups.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], + 'months_short' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], + 'weekdays' => ['एतवार', 'सोमार', 'मंगर', 'बुध', 'बिफे', 'सूक', 'सनिचर'], + 'weekdays_short' => ['एतवार', 'सोमार', 'मंगर', 'बुध', 'बिफे', 'सूक', 'सनिचर'], + 'weekdays_min' => ['एतवार', 'सोमार', 'मंगर', 'बुध', 'बिफे', 'सूक', 'सनिचर'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mai.php b/vendor/nesbot/carbon/src/Carbon/Lang/mai.php new file mode 100644 index 0000000..792b973 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mai.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/mai_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mai_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/mai_IN.php new file mode 100644 index 0000000..03049d4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mai_IN.php @@ -0,0 +1,51 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Maithili Computing Research Center, Pune, India rajeshkajha@yahoo.com,akhilesh.k@samusng.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['बैसाख', 'जेठ', 'अषाढ़', 'सावोन', 'भादो', 'आसिन', 'कातिक', 'अगहन', 'पूस', 'माघ', 'फागुन', 'चैति'], + 'months_short' => ['बैसाख', 'जेठ', 'अषाढ़', 'सावोन', 'भादो', 'आसिन', 'कातिक', 'अगहन', 'पूस', 'माघ', 'फागुन', 'चैति'], + 'weekdays' => ['रविदिन', 'सोमदिन', 'मंगलदिन', 'बुधदिन', 'बृहस्पतीदिन', 'शुक्रदिन', 'शनीदिन'], + 'weekdays_short' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पती', 'शुक्र', 'शनी'], + 'weekdays_min' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पती', 'शुक्र', 'शनी'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], + + 'year' => ':count ऋतु', // less reliable + 'y' => ':count ऋतु', // less reliable + 'a_year' => ':count ऋतु', // less reliable + + 'month' => ':count महिना', + 'm' => ':count महिना', + 'a_month' => ':count महिना', + + 'week' => ':count श्रेणी:क्यालेन्डर', // less reliable + 'w' => ':count श्रेणी:क्यालेन्डर', // less reliable + 'a_week' => ':count श्रेणी:क्यालेन्डर', // less reliable + + 'day' => ':count दिन', + 'd' => ':count दिन', + 'a_day' => ':count दिन', + + 'hour' => ':count घण्टा', + 'h' => ':count घण्टा', + 'a_hour' => ':count घण्टा', + + 'minute' => ':count समय', // less reliable + 'min' => ':count समय', // less reliable + 'a_minute' => ':count समय', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mas.php b/vendor/nesbot/carbon/src/Carbon/Lang/mas.php new file mode 100644 index 0000000..cbd610c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mas.php @@ -0,0 +1,51 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['Ɛnkakɛnyá', 'Ɛndámâ'], + 'weekdays' => ['Jumapílí', 'Jumatátu', 'Jumane', 'Jumatánɔ', 'Alaámisi', 'Jumáa', 'Jumamósi'], + 'weekdays_short' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], + 'weekdays_min' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], + 'months' => ['Oladalʉ́', 'Arát', 'Ɔɛnɨ́ɔɨŋɔk', 'Olodoyíóríê inkókúâ', 'Oloilépūnyīē inkókúâ', 'Kújúɔrɔk', 'Mórusásin', 'Ɔlɔ́ɨ́bɔ́rárɛ', 'Kúshîn', 'Olgísan', 'Pʉshʉ́ka', 'Ntʉ́ŋʉ́s'], + 'months_short' => ['Dal', 'Ará', 'Ɔɛn', 'Doy', 'Lép', 'Rok', 'Sás', 'Bɔ́r', 'Kús', 'Gís', 'Shʉ́', 'Ntʉ́'], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + + 'year' => ':count olameyu', // less reliable + 'y' => ':count olameyu', // less reliable + 'a_year' => ':count olameyu', // less reliable + + 'week' => ':count engolongeare orwiki', // less reliable + 'w' => ':count engolongeare orwiki', // less reliable + 'a_week' => ':count engolongeare orwiki', // less reliable + + 'hour' => ':count esahabu', // less reliable + 'h' => ':count esahabu', // less reliable + 'a_hour' => ':count esahabu', // less reliable + + 'second' => ':count are', // less reliable + 's' => ':count are', // less reliable + 'a_second' => ':count are', // less reliable + + 'month' => ':count olapa', + 'm' => ':count olapa', + 'a_month' => ':count olapa', + + 'day' => ':count enkolongʼ', + 'd' => ':count enkolongʼ', + 'a_day' => ':count enkolongʼ', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mas_TZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/mas_TZ.php new file mode 100644 index 0000000..56e2905 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mas_TZ.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/mas.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mer.php b/vendor/nesbot/carbon/src/Carbon/Lang/mer.php new file mode 100644 index 0000000..2e14597 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mer.php @@ -0,0 +1,43 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['RŨ', 'ŨG'], + 'weekdays' => ['Kiumia', 'Muramuko', 'Wairi', 'Wethatu', 'Wena', 'Wetano', 'Jumamosi'], + 'weekdays_short' => ['KIU', 'MRA', 'WAI', 'WET', 'WEN', 'WTN', 'JUM'], + 'weekdays_min' => ['KIU', 'MRA', 'WAI', 'WET', 'WEN', 'WTN', 'JUM'], + 'months' => ['Januarĩ', 'Feburuarĩ', 'Machi', 'Ĩpurũ', 'Mĩĩ', 'Njuni', 'Njuraĩ', 'Agasti', 'Septemba', 'Oktũba', 'Novemba', 'Dicemba'], + 'months_short' => ['JAN', 'FEB', 'MAC', 'ĨPU', 'MĨĨ', 'NJU', 'NJR', 'AGA', 'SPT', 'OKT', 'NOV', 'DEC'], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + + 'year' => ':count murume', // less reliable + 'y' => ':count murume', // less reliable + 'a_year' => ':count murume', // less reliable + + 'month' => ':count muchaara', // less reliable + 'm' => ':count muchaara', // less reliable + 'a_month' => ':count muchaara', // less reliable + + 'minute' => ':count monto', // less reliable + 'min' => ':count monto', // less reliable + 'a_minute' => ':count monto', // less reliable + + 'second' => ':count gikeno', // less reliable + 's' => ':count gikeno', // less reliable + 'a_second' => ':count gikeno', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mfe.php b/vendor/nesbot/carbon/src/Carbon/Lang/mfe.php new file mode 100644 index 0000000..4d6e6b6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mfe.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/mfe_MU.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mfe_MU.php b/vendor/nesbot/carbon/src/Carbon/Lang/mfe_MU.php new file mode 100644 index 0000000..2d27b45 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mfe_MU.php @@ -0,0 +1,53 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Samsung Electronics Co., Ltd. akhilesh.k@samsung.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['zanvie', 'fevriye', 'mars', 'avril', 'me', 'zin', 'zilye', 'out', 'septam', 'oktob', 'novam', 'desam'], + 'months_short' => ['zan', 'fev', 'mar', 'avr', 'me', 'zin', 'zil', 'out', 'sep', 'okt', 'nov', 'des'], + 'weekdays' => ['dimans', 'lindi', 'mardi', 'merkredi', 'zedi', 'vandredi', 'samdi'], + 'weekdays_short' => ['dim', 'lin', 'mar', 'mer', 'ze', 'van', 'sam'], + 'weekdays_min' => ['dim', 'lin', 'mar', 'mer', 'ze', 'van', 'sam'], + + 'year' => ':count banané', + 'y' => ':count banané', + 'a_year' => ':count banané', + + 'month' => ':count mwa', + 'm' => ':count mwa', + 'a_month' => ':count mwa', + + 'week' => ':count sémenn', + 'w' => ':count sémenn', + 'a_week' => ':count sémenn', + + 'day' => ':count zour', + 'd' => ':count zour', + 'a_day' => ':count zour', + + 'hour' => ':count -er-tan', + 'h' => ':count -er-tan', + 'a_hour' => ':count -er-tan', + + 'minute' => ':count minitt', + 'min' => ':count minitt', + 'a_minute' => ':count minitt', + + 'second' => ':count déziém', + 's' => ':count déziém', + 'a_second' => ':count déziém', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mg.php b/vendor/nesbot/carbon/src/Carbon/Lang/mg.php new file mode 100644 index 0000000..40bc2a8 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mg.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/mg_MG.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mg_MG.php b/vendor/nesbot/carbon/src/Carbon/Lang/mg_MG.php new file mode 100644 index 0000000..6a14535 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mg_MG.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - The Debian Project modified by GNU//Linux Malagasy Rado Ramarotafika,Do-Risika RAFIEFERANTSIARONJY rado@linuxmg.org,dourix@free.fr + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], + 'months' => ['Janoary', 'Febroary', 'Martsa', 'Aprily', 'Mey', 'Jona', 'Jolay', 'Aogositra', 'Septambra', 'Oktobra', 'Novambra', 'Desambra'], + 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'Mey', 'Jon', 'Jol', 'Aog', 'Sep', 'Okt', 'Nov', 'Des'], + 'weekdays' => ['alahady', 'alatsinainy', 'talata', 'alarobia', 'alakamisy', 'zoma', 'sabotsy'], + 'weekdays_short' => ['lhd', 'lts', 'tlt', 'lrb', 'lkm', 'zom', 'sab'], + 'weekdays_min' => ['lhd', 'lts', 'tlt', 'lrb', 'lkm', 'zom', 'sab'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + + 'minute' => ':count minitra', // less reliable + 'min' => ':count minitra', // less reliable + 'a_minute' => ':count minitra', // less reliable + + 'year' => ':count taona', + 'y' => ':count taona', + 'a_year' => ':count taona', + + 'month' => ':count volana', + 'm' => ':count volana', + 'a_month' => ':count volana', + + 'week' => ':count herinandro', + 'w' => ':count herinandro', + 'a_week' => ':count herinandro', + + 'day' => ':count andro', + 'd' => ':count andro', + 'a_day' => ':count andro', + + 'hour' => ':count ora', + 'h' => ':count ora', + 'a_hour' => ':count ora', + + 'second' => ':count segondra', + 's' => ':count segondra', + 'a_second' => ':count segondra', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mgh.php b/vendor/nesbot/carbon/src/Carbon/Lang/mgh.php new file mode 100644 index 0000000..2a80960 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mgh.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['wichishu', 'mchochil’l'], + 'weekdays' => ['Sabato', 'Jumatatu', 'Jumanne', 'Jumatano', 'Arahamisi', 'Ijumaa', 'Jumamosi'], + 'weekdays_short' => ['Sab', 'Jtt', 'Jnn', 'Jtn', 'Ara', 'Iju', 'Jmo'], + 'weekdays_min' => ['Sab', 'Jtt', 'Jnn', 'Jtn', 'Ara', 'Iju', 'Jmo'], + 'months' => ['Mweri wo kwanza', 'Mweri wo unayeli', 'Mweri wo uneraru', 'Mweri wo unecheshe', 'Mweri wo unethanu', 'Mweri wo thanu na mocha', 'Mweri wo saba', 'Mweri wo nane', 'Mweri wo tisa', 'Mweri wo kumi', 'Mweri wo kumi na moja', 'Mweri wo kumi na yel’li'], + 'months_short' => ['Kwa', 'Una', 'Rar', 'Che', 'Tha', 'Moc', 'Sab', 'Nan', 'Tis', 'Kum', 'Moj', 'Yel'], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mgo.php b/vendor/nesbot/carbon/src/Carbon/Lang/mgo.php new file mode 100644 index 0000000..a126c9f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mgo.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'weekdays' => ['Aneg 1', 'Aneg 2', 'Aneg 3', 'Aneg 4', 'Aneg 5', 'Aneg 6', 'Aneg 7'], + 'weekdays_short' => ['Aneg 1', 'Aneg 2', 'Aneg 3', 'Aneg 4', 'Aneg 5', 'Aneg 6', 'Aneg 7'], + 'weekdays_min' => ['1', '2', '3', '4', '5', '6', '7'], + 'months' => ['iməg mbegtug', 'imeg àbùbì', 'imeg mbəŋchubi', 'iməg ngwə̀t', 'iməg fog', 'iməg ichiibɔd', 'iməg àdùmbə̀ŋ', 'iməg ichika', 'iməg kud', 'iməg tèsiʼe', 'iməg zò', 'iməg krizmed'], + 'months_short' => ['mbegtug', 'imeg àbùbì', 'imeg mbəŋchubi', 'iməg ngwə̀t', 'iməg fog', 'iməg ichiibɔd', 'iməg àdùmbə̀ŋ', 'iməg ichika', 'iməg kud', 'iməg tèsiʼe', 'iməg zò', 'iməg krizmed'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY-MM-dd', + 'LL' => 'YYYY MMM D', + 'LLL' => 'YYYY MMMM D HH:mm', + 'LLLL' => 'dddd, YYYY MMMM DD HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mhr.php b/vendor/nesbot/carbon/src/Carbon/Lang/mhr.php new file mode 100644 index 0000000..6bbc9f6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mhr.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/mhr_RU.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mhr_RU.php b/vendor/nesbot/carbon/src/Carbon/Lang/mhr_RU.php new file mode 100644 index 0000000..309ead9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mhr_RU.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - PeshSajSoft Ltd. Vyacheslav Kileev slavakileev@yandex.ru + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'YYYY.MM.DD', + ], + 'months' => ['Шорыкйол', 'Пургыж', 'Ӱярня', 'Вӱдшор', 'Ага', 'Пеледыш', 'Сӱрем', 'Сорла', 'Идым', 'Шыжа', 'Кылме', 'Теле'], + 'months_short' => ['Шрк', 'Пгж', 'Ӱрн', 'Вшр', 'Ага', 'Пдш', 'Срм', 'Срл', 'Идм', 'Шыж', 'Клм', 'Тел'], + 'weekdays' => ['Рушарня', 'Шочмо', 'Кушкыжмо', 'Вӱргече', 'Изарня', 'Кугарня', 'Шуматкече'], + 'weekdays_short' => ['Ршр', 'Шчм', 'Кжм', 'Вгч', 'Изр', 'Кгр', 'Шмт'], + 'weekdays_min' => ['Ршр', 'Шчм', 'Кжм', 'Вгч', 'Изр', 'Кгр', 'Шмт'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + + 'year' => ':count идалык', + 'y' => ':count идалык', + 'a_year' => ':count идалык', + + 'month' => ':count Тылзе', + 'm' => ':count Тылзе', + 'a_month' => ':count Тылзе', + + 'week' => ':count арня', + 'w' => ':count арня', + 'a_week' => ':count арня', + + 'day' => ':count кече', + 'd' => ':count кече', + 'a_day' => ':count кече', + + 'hour' => ':count час', + 'h' => ':count час', + 'a_hour' => ':count час', + + 'minute' => ':count минут', + 'min' => ':count минут', + 'a_minute' => ':count минут', + + 'second' => ':count кокымшан', + 's' => ':count кокымшан', + 'a_second' => ':count кокымшан', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mi.php b/vendor/nesbot/carbon/src/Carbon/Lang/mi.php new file mode 100644 index 0000000..b7f51ec --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mi.php @@ -0,0 +1,66 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - John Corrigan + * - François B + */ +return [ + 'year' => ':count tau', + 'a_year' => '{1}he tau|:count tau', + 'month' => ':count marama', + 'a_month' => '{1}he marama|:count marama', + 'week' => ':count wiki', + 'a_week' => '{1}he wiki|:count wiki', + 'day' => ':count ra', + 'a_day' => '{1}he ra|:count ra', + 'hour' => ':count haora', + 'a_hour' => '{1}te haora|:count haora', + 'minute' => ':count meneti', + 'a_minute' => '{1}he meneti|:count meneti', + 'second' => ':count hēkona', + 'a_second' => '{1}te hēkona ruarua|:count hēkona', + 'ago' => ':time i mua', + 'from_now' => 'i roto i :time', + 'diff_yesterday' => 'inanahi', + 'diff_yesterday_regexp' => 'inanahi(?:\\s+i)?', + 'diff_today' => 'i teie', + 'diff_today_regexp' => 'i teie(?:\\s+mahana,)?(?:\\s+i)?', + 'diff_tomorrow' => 'apopo', + 'diff_tomorrow_regexp' => 'apopo(?:\\s+i)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY [i] HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY [i] HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[i teie mahana, i] LT', + 'nextDay' => '[apopo i] LT', + 'nextWeek' => 'dddd [i] LT', + 'lastDay' => '[inanahi i] LT', + 'lastWeek' => 'dddd [whakamutunga i] LT', + 'sameElse' => 'L', + ], + 'ordinal' => ':numberº', + 'months' => ['Kohi-tāte', 'Hui-tanguru', 'Poutū-te-rangi', 'Paenga-whāwhā', 'Haratua', 'Pipiri', 'Hōngoingoi', 'Here-turi-kōkā', 'Mahuru', 'Whiringa-ā-nuku', 'Whiringa-ā-rangi', 'Hakihea'], + 'months_short' => ['Kohi', 'Hui', 'Pou', 'Pae', 'Hara', 'Pipi', 'Hōngoi', 'Here', 'Mahu', 'Whi-nu', 'Whi-ra', 'Haki'], + 'weekdays' => ['Rātapu', 'Mane', 'Tūrei', 'Wenerei', 'Tāite', 'Paraire', 'Hātarei'], + 'weekdays_short' => ['Ta', 'Ma', 'Tū', 'We', 'Tāi', 'Pa', 'Hā'], + 'weekdays_min' => ['Ta', 'Ma', 'Tū', 'We', 'Tāi', 'Pa', 'Hā'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' me te '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mi_NZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/mi_NZ.php new file mode 100644 index 0000000..6b964e3 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mi_NZ.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/mi.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/miq.php b/vendor/nesbot/carbon/src/Carbon/Lang/miq.php new file mode 100644 index 0000000..51e5a98 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/miq.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/miq_NI.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/miq_NI.php b/vendor/nesbot/carbon/src/Carbon/Lang/miq_NI.php new file mode 100644 index 0000000..57faa31 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/miq_NI.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['siakwa kati', 'kuswa kati', 'kakamuk kati', 'lî wainhka kati', 'lih mairin kati', 'lî kati', 'pastara kati', 'sikla kati', 'wîs kati', 'waupasa kati', 'yahbra kati', 'trisu kati'], + 'months_short' => ['siakwa kati', 'kuswa kati', 'kakamuk kati', 'lî wainhka kati', 'lih mairin kati', 'lî kati', 'pastara kati', 'sikla kati', 'wîs kati', 'waupasa kati', 'yahbra kati', 'trisu kati'], + 'weekdays' => ['sandi', 'mundi', 'tiusdi', 'wensde', 'tausde', 'praidi', 'satadi'], + 'weekdays_short' => ['san', 'mun', 'tius', 'wens', 'taus', 'prai', 'sat'], + 'weekdays_min' => ['san', 'mun', 'tius', 'wens', 'taus', 'prai', 'sat'], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 7, + 'meridiem' => ['VM', 'NM'], + + 'month' => ':count kati', // less reliable + 'm' => ':count kati', // less reliable + 'a_month' => ':count kati', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mjw.php b/vendor/nesbot/carbon/src/Carbon/Lang/mjw.php new file mode 100644 index 0000000..617154c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mjw.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/mjw_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mjw_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/mjw_IN.php new file mode 100644 index 0000000..58ed0d1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mjw_IN.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Jor Teron bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['Arkoi', 'Thangthang', 'There', 'Jangmi', 'Aru', 'Vosik', 'Jakhong', 'Paipai', 'Chiti', 'Phere', 'Phaikuni', 'Matijong'], + 'months_short' => ['Ark', 'Thang', 'The', 'Jang', 'Aru', 'Vos', 'Jak', 'Pai', 'Chi', 'Phe', 'Phai', 'Mati'], + 'weekdays' => ['Bhomkuru', 'Urmi', 'Durmi', 'Thelang', 'Theman', 'Bhomta', 'Bhomti'], + 'weekdays_short' => ['Bhom', 'Ur', 'Dur', 'Tkel', 'Tkem', 'Bhta', 'Bhti'], + 'weekdays_min' => ['Bhom', 'Ur', 'Dur', 'Tkel', 'Tkem', 'Bhta', 'Bhti'], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mk.php b/vendor/nesbot/carbon/src/Carbon/Lang/mk.php new file mode 100644 index 0000000..d822de0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mk.php @@ -0,0 +1,116 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Sashko Todorov + * - Josh Soref + * - François B + * - Serhan Apaydın + * - Borislav Mickov + * - JD Isaacks + * - Tomi Atanasoski + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => ':count година|:count години', + 'a_year' => 'година|:count години', + 'y' => ':count год.', + 'month' => ':count месец|:count месеци', + 'a_month' => 'месец|:count месеци', + 'm' => ':count месец|:count месеци', + 'week' => ':count седмица|:count седмици', + 'a_week' => 'седмица|:count седмици', + 'w' => ':count седмица|:count седмици', + 'day' => ':count ден|:count дена', + 'a_day' => 'ден|:count дена', + 'd' => ':count ден|:count дена', + 'hour' => ':count час|:count часа', + 'a_hour' => 'час|:count часа', + 'h' => ':count час|:count часа', + 'minute' => ':count минута|:count минути', + 'a_minute' => 'минута|:count минути', + 'min' => ':count мин.', + 'second' => ':count секунда|:count секунди', + 'a_second' => 'неколку секунди|:count секунди', + 's' => ':count сек.', + 'ago' => 'пред :time', + 'from_now' => 'после :time', + 'after' => 'по :time', + 'before' => 'пред :time', + 'diff_now' => 'сега', + 'diff_today' => 'Денес', + 'diff_today_regexp' => 'Денес(?:\\s+во)?', + 'diff_yesterday' => 'вчера', + 'diff_yesterday_regexp' => 'Вчера(?:\\s+во)?', + 'diff_tomorrow' => 'утре', + 'diff_tomorrow_regexp' => 'Утре(?:\\s+во)?', + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'D.MM.YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY H:mm', + 'LLLL' => 'dddd, D MMMM YYYY H:mm', + ], + 'calendar' => [ + 'sameDay' => '[Денес во] LT', + 'nextDay' => '[Утре во] LT', + 'nextWeek' => '[Во] dddd [во] LT', + 'lastDay' => '[Вчера во] LT', + 'lastWeek' => function (CarbonInterface $date) { + switch ($date->dayOfWeek) { + case 0: + case 3: + case 6: + return '[Изминатата] dddd [во] LT'; + default: + return '[Изминатиот] dddd [во] LT'; + } + }, + 'sameElse' => 'L', + ], + 'ordinal' => function ($number) { + $lastDigit = $number % 10; + $last2Digits = $number % 100; + if ($number === 0) { + return $number.'-ев'; + } + if ($last2Digits === 0) { + return $number.'-ен'; + } + if ($last2Digits > 10 && $last2Digits < 20) { + return $number.'-ти'; + } + if ($lastDigit === 1) { + return $number.'-ви'; + } + if ($lastDigit === 2) { + return $number.'-ри'; + } + if ($lastDigit === 7 || $lastDigit === 8) { + return $number.'-ми'; + } + + return $number.'-ти'; + }, + 'months' => ['јануари', 'февруари', 'март', 'април', 'мај', 'јуни', 'јули', 'август', 'септември', 'октомври', 'ноември', 'декември'], + 'months_short' => ['јан', 'фев', 'мар', 'апр', 'мај', 'јун', 'јул', 'авг', 'сеп', 'окт', 'ное', 'дек'], + 'weekdays' => ['недела', 'понеделник', 'вторник', 'среда', 'четврток', 'петок', 'сабота'], + 'weekdays_short' => ['нед', 'пон', 'вто', 'сре', 'чет', 'пет', 'саб'], + 'weekdays_min' => ['нe', 'пo', 'вт', 'ср', 'че', 'пе', 'сa'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' и '], + 'meridiem' => ['АМ', 'ПМ'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mk_MK.php b/vendor/nesbot/carbon/src/Carbon/Lang/mk_MK.php new file mode 100644 index 0000000..95e2ff9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mk_MK.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/mk.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ml.php b/vendor/nesbot/carbon/src/Carbon/Lang/ml.php new file mode 100644 index 0000000..1abd6c4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ml.php @@ -0,0 +1,76 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - JD Isaacks + */ +return [ + 'year' => ':count വർഷം', + 'a_year' => 'ഒരു വർഷം|:count വർഷം', + 'month' => ':count മാസം', + 'a_month' => 'ഒരു മാസം|:count മാസം', + 'week' => ':count ആഴ്ച', + 'a_week' => 'ഒരാഴ്ച|:count ആഴ്ച', + 'day' => ':count ദിവസം', + 'a_day' => 'ഒരു ദിവസം|:count ദിവസം', + 'hour' => ':count മണിക്കൂർ', + 'a_hour' => 'ഒരു മണിക്കൂർ|:count മണിക്കൂർ', + 'minute' => ':count മിനിറ്റ്', + 'a_minute' => 'ഒരു മിനിറ്റ്|:count മിനിറ്റ്', + 'second' => ':count സെക്കൻഡ്', + 'a_second' => 'അൽപ നിമിഷങ്ങൾ|:count സെക്കൻഡ്', + 'ago' => ':time മുൻപ്', + 'from_now' => ':time കഴിഞ്ഞ്', + 'diff_now' => 'ഇപ്പോൾ', + 'diff_today' => 'ഇന്ന്', + 'diff_yesterday' => 'ഇന്നലെ', + 'diff_tomorrow' => 'നാളെ', + 'formats' => [ + 'LT' => 'A h:mm -നു', + 'LTS' => 'A h:mm:ss -നു', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY, A h:mm -നു', + 'LLLL' => 'dddd, D MMMM YYYY, A h:mm -നു', + ], + 'calendar' => [ + 'sameDay' => '[ഇന്ന്] LT', + 'nextDay' => '[നാളെ] LT', + 'nextWeek' => 'dddd, LT', + 'lastDay' => '[ഇന്നലെ] LT', + 'lastWeek' => '[കഴിഞ്ഞ] dddd, LT', + 'sameElse' => 'L', + ], + 'meridiem' => function ($hour) { + if ($hour < 4) { + return 'രാത്രി'; + } + if ($hour < 12) { + return 'രാവിലെ'; + } + if ($hour < 17) { + return 'ഉച്ച കഴിഞ്ഞ്'; + } + if ($hour < 20) { + return 'വൈകുന്നേരം'; + } + + return 'രാത്രി'; + }, + 'months' => ['ജനുവരി', 'ഫെബ്രുവരി', 'മാർച്ച്', 'ഏപ്രിൽ', 'മേയ്', 'ജൂൺ', 'ജൂലൈ', 'ഓഗസ്റ്റ്', 'സെപ്റ്റംബർ', 'ഒക്ടോബർ', 'നവംബർ', 'ഡിസംബർ'], + 'months_short' => ['ജനു.', 'ഫെബ്രു.', 'മാർ.', 'ഏപ്രി.', 'മേയ്', 'ജൂൺ', 'ജൂലൈ.', 'ഓഗ.', 'സെപ്റ്റ.', 'ഒക്ടോ.', 'നവം.', 'ഡിസം.'], + 'weekdays' => ['ഞായറാഴ്ച', 'തിങ്കളാഴ്ച', 'ചൊവ്വാഴ്ച', 'ബുധനാഴ്ച', 'വ്യാഴാഴ്ച', 'വെള്ളിയാഴ്ച', 'ശനിയാഴ്ച'], + 'weekdays_short' => ['ഞായർ', 'തിങ്കൾ', 'ചൊവ്വ', 'ബുധൻ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'], + 'weekdays_min' => ['ഞാ', 'തി', 'ചൊ', 'ബു', 'വ്യാ', 'വെ', 'ശ'], + 'list' => ', ', + 'weekend' => [0, 0], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ml_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ml_IN.php new file mode 100644 index 0000000..000e795 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ml_IN.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ml.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mn.php b/vendor/nesbot/carbon/src/Carbon/Lang/mn.php new file mode 100644 index 0000000..38c6434 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mn.php @@ -0,0 +1,116 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Philippe Vaucher + * - Tsutomu Kuroda + * - tjku + * - Max Melentiev + * - Zolzaya Erdenebaatar + * - Tom Hughes + * - Akira Matsuda + * - Christopher Dell + * - Michael Kessler + * - Enrique Vidal + * - Simone Carletti + * - Aaron Patterson + * - Nicolás Hock Isaza + * - Ochirkhuyag + * - Batmandakh + * - lucifer-crybaby + */ +return [ + 'year' => ':count жил', + 'y' => ':count жил', + 'month' => ':count сар', + 'm' => ':count сар', + 'week' => ':count долоо хоног', + 'w' => ':count долоо хоног', + 'day' => ':count өдөр', + 'd' => ':count өдөр', + 'hour' => ':count цаг', + 'h' => ':countц', + 'minute' => ':count минут', + 'min' => ':countм', + 'second' => ':count секунд', + 's' => ':countс', + + 'ago_mode' => 'last', + 'ago' => ':time өмнө', + 'year_ago' => ':count жилийн', + 'y_ago' => ':count жилийн', + 'month_ago' => ':count сарын', + 'm_ago' => ':count сарын', + 'day_ago' => ':count хоногийн', + 'd_ago' => ':count хоногийн', + 'week_ago' => ':count долоо хоногийн', + 'w_ago' => ':count долоо хоногийн', + 'hour_ago' => ':count цагийн', + 'minute_ago' => ':count минутын', + 'second_ago' => ':count секундын', + + 'from_now_mode' => 'last', + 'from_now' => 'одоогоос :time', + 'year_from_now' => ':count жилийн дараа', + 'y_from_now' => ':count жилийн дараа', + 'month_from_now' => ':count сарын дараа', + 'm_from_now' => ':count сарын дараа', + 'day_from_now' => ':count хоногийн дараа', + 'd_from_now' => ':count хоногийн дараа', + 'hour_from_now' => ':count цагийн дараа', + 'minute_from_now' => ':count минутын дараа', + 'second_from_now' => ':count секундын дараа', + + 'after_mode' => 'last', + 'after' => ':time дараа', + 'year_after' => ':count жилийн', + 'y_after' => ':count жилийн', + 'month_after' => ':count сарын', + 'm_after' => ':count сарын', + 'day_after' => ':count хоногийн', + 'd_after' => ':count хоногийн', + 'hour_after' => ':count цагийн', + 'minute_after' => ':count минутын', + 'second_after' => ':count секундын', + + 'before_mode' => 'last', + 'before' => ':time өмнө', + 'year_before' => ':count жилийн', + 'y_before' => ':count жилийн', + 'month_before' => ':count сарын', + 'm_before' => ':count сарын', + 'day_before' => ':count хоногийн', + 'd_before' => ':count хоногийн', + 'hour_before' => ':count цагийн', + 'minute_before' => ':count минутын', + 'second_before' => ':count секундын', + + 'list' => ', ', + 'diff_now' => 'одоо', + 'diff_yesterday' => 'өчигдөр', + 'diff_tomorrow' => 'маргааш', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY-MM-DD', + 'LL' => 'YYYY MMMM DD', + 'LLL' => 'YY-MM-DD, HH:mm', + 'LLLL' => 'YYYY MMMM DD, HH:mm', + ], + 'weekdays' => ['Ням', 'Даваа', 'Мягмар', 'Лхагва', 'Пүрэв', 'Баасан', 'Бямба'], + 'weekdays_short' => ['Ня', 'Да', 'Мя', 'Лх', 'Пү', 'Ба', 'Бя'], + 'weekdays_min' => ['Ня', 'Да', 'Мя', 'Лх', 'Пү', 'Ба', 'Бя'], + 'months' => ['1 сар', '2 сар', '3 сар', '4 сар', '5 сар', '6 сар', '7 сар', '8 сар', '9 сар', '10 сар', '11 сар', '12 сар'], + 'months_short' => ['1 сар', '2 сар', '3 сар', '4 сар', '5 сар', '6 сар', '7 сар', '8 сар', '9 сар', '10 сар', '11 сар', '12 сар'], + 'meridiem' => ['өглөө', 'орой'], + 'first_day_of_week' => 1, +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mn_MN.php b/vendor/nesbot/carbon/src/Carbon/Lang/mn_MN.php new file mode 100644 index 0000000..e5ce426 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mn_MN.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/mn.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mni.php b/vendor/nesbot/carbon/src/Carbon/Lang/mni.php new file mode 100644 index 0000000..cafa2f8 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mni.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/mni_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mni_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/mni_IN.php new file mode 100644 index 0000000..45d430e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mni_IN.php @@ -0,0 +1,35 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Red Hat Pune libc-alpha@sourceware.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['জানুৱারি', 'ফেব্রুৱারি', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগষ্ট', 'সেপ্তেম্বর', 'ওক্তোবর', 'নবেম্বর', 'ডিসেম্বর'], + 'months_short' => ['জান', 'ফেব', 'মার', 'এপ্রি', 'মে', 'জুন', 'জুল', 'আগ', 'সেপ', 'ওক্ত', 'নবে', 'ডিস'], + 'weekdays' => ['নোংমাইজিং', 'নিংথৌকাবা', 'লৈবাকপোকপা', 'য়ুমশকৈশা', 'শগোলশেন', 'ইরাই', 'থাংজ'], + 'weekdays_short' => ['নোং', 'নিং', 'লৈবাক', 'য়ুম', 'শগোল', 'ইরা', 'থাং'], + 'weekdays_min' => ['নোং', 'নিং', 'লৈবাক', 'য়ুম', 'শগোল', 'ইরা', 'থাং'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['এ.ম.', 'প.ম.'], + + 'year' => ':count ইসিং', // less reliable + 'y' => ':count ইসিং', // less reliable + 'a_year' => ':count ইসিং', // less reliable + + 'second' => ':count ꯅꯤꯡꯊꯧꯀꯥꯕ', // less reliable + 's' => ':count ꯅꯤꯡꯊꯧꯀꯥꯕ', // less reliable + 'a_second' => ':count ꯅꯤꯡꯊꯧꯀꯥꯕ', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mo.php b/vendor/nesbot/carbon/src/Carbon/Lang/mo.php new file mode 100644 index 0000000..102afcd --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mo.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ro.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mr.php b/vendor/nesbot/carbon/src/Carbon/Lang/mr.php new file mode 100644 index 0000000..4aaeafd --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mr.php @@ -0,0 +1,86 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Vikram-enyota + */ +return [ + 'year' => ':count वर्ष', + 'y' => ':count वर्ष', + 'month' => ':count महिना|:count महिने', + 'm' => ':count महिना|:count महिने', + 'week' => ':count आठवडा|:count आठवडे', + 'w' => ':count आठवडा|:count आठवडे', + 'day' => ':count दिवस', + 'd' => ':count दिवस', + 'hour' => ':count तास', + 'h' => ':count तास', + 'minute' => ':count मिनिटे', + 'min' => ':count मिनिटे', + 'second' => ':count सेकंद', + 's' => ':count सेकंद', + + 'ago' => ':timeपूर्वी', + 'from_now' => ':timeमध्ये', + 'before' => ':timeपूर्वी', + 'after' => ':timeनंतर', + + 'diff_now' => 'आत्ता', + 'diff_today' => 'आज', + 'diff_yesterday' => 'काल', + 'diff_tomorrow' => 'उद्या', + + 'formats' => [ + 'LT' => 'A h:mm वाजता', + 'LTS' => 'A h:mm:ss वाजता', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY, A h:mm वाजता', + 'LLLL' => 'dddd, D MMMM YYYY, A h:mm वाजता', + ], + + 'calendar' => [ + 'sameDay' => '[आज] LT', + 'nextDay' => '[उद्या] LT', + 'nextWeek' => 'dddd, LT', + 'lastDay' => '[काल] LT', + 'lastWeek' => '[मागील] dddd, LT', + 'sameElse' => 'L', + ], + + 'meridiem' => function ($hour) { + if ($hour < 4) { + return 'रात्री'; + } + if ($hour < 10) { + return 'सकाळी'; + } + if ($hour < 17) { + return 'दुपारी'; + } + if ($hour < 20) { + return 'सायंकाळी'; + } + + return 'रात्री'; + }, + + 'months' => ['जानेवारी', 'फेब्रुवारी', 'मार्च', 'एप्रिल', 'मे', 'जून', 'जुलै', 'ऑगस्ट', 'सप्टेंबर', 'ऑक्टोबर', 'नोव्हेंबर', 'डिसेंबर'], + 'months_short' => ['जाने.', 'फेब्रु.', 'मार्च.', 'एप्रि.', 'मे.', 'जून.', 'जुलै.', 'ऑग.', 'सप्टें.', 'ऑक्टो.', 'नोव्हें.', 'डिसें.'], + 'weekdays' => ['रविवार', 'सोमवार', 'मंगळवार', 'बुधवार', 'गुरूवार', 'शुक्रवार', 'शनिवार'], + 'weekdays_short' => ['रवि', 'सोम', 'मंगळ', 'बुध', 'गुरू', 'शुक्र', 'शनि'], + 'weekdays_min' => ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'], + 'list' => [', ', ' आणि '], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, + 'weekend' => [0, 0], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mr_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/mr_IN.php new file mode 100644 index 0000000..7bca919 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mr_IN.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/mr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ms.php b/vendor/nesbot/carbon/src/Carbon/Lang/ms.php new file mode 100644 index 0000000..36934ee --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ms.php @@ -0,0 +1,104 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - Azri Jamil + * - JD Isaacks + * - Josh Soref + * - Azri Jamil + * - Hariadi Hinta + * - Ashraf Kamarudin + */ +return [ + 'year' => ':count tahun', + 'a_year' => '{1}setahun|]1,Inf[:count tahun', + 'y' => ':count tahun', + 'month' => ':count bulan', + 'a_month' => '{1}sebulan|]1,Inf[:count bulan', + 'm' => ':count bulan', + 'week' => ':count minggu', + 'a_week' => '{1}seminggu|]1,Inf[:count minggu', + 'w' => ':count minggu', + 'day' => ':count hari', + 'a_day' => '{1}sehari|]1,Inf[:count hari', + 'd' => ':count hari', + 'hour' => ':count jam', + 'a_hour' => '{1}sejam|]1,Inf[:count jam', + 'h' => ':count jam', + 'minute' => ':count minit', + 'a_minute' => '{1}seminit|]1,Inf[:count minit', + 'min' => ':count minit', + 'second' => ':count saat', + 'a_second' => '{1}beberapa saat|]1,Inf[:count saat', + 'millisecond' => ':count milisaat', + 'a_millisecond' => '{1}semilisaat|]1,Inf[:count milliseconds', + 'microsecond' => ':count mikrodetik', + 'a_microsecond' => '{1}semikrodetik|]1,Inf[:count mikrodetik', + 's' => ':count saat', + 'ago' => ':time yang lepas', + 'from_now' => ':time dari sekarang', + 'after' => ':time kemudian', + 'before' => ':time lepas', + 'diff_now' => 'sekarang', + 'diff_today' => 'Hari', + 'diff_today_regexp' => 'Hari(?:\\s+ini)?(?:\\s+pukul)?', + 'diff_yesterday' => 'semalam', + 'diff_yesterday_regexp' => 'Semalam(?:\\s+pukul)?', + 'diff_tomorrow' => 'esok', + 'diff_tomorrow_regexp' => 'Esok(?:\\s+pukul)?', + 'diff_before_yesterday' => 'kelmarin', + 'diff_after_tomorrow' => 'lusa', + 'formats' => [ + 'LT' => 'HH.mm', + 'LTS' => 'HH.mm.ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY [pukul] HH.mm', + 'LLLL' => 'dddd, D MMMM YYYY [pukul] HH.mm', + ], + 'calendar' => [ + 'sameDay' => '[Hari ini pukul] LT', + 'nextDay' => '[Esok pukul] LT', + 'nextWeek' => 'dddd [pukul] LT', + 'lastDay' => '[Kelmarin pukul] LT', + 'lastWeek' => 'dddd [lepas pukul] LT', + 'sameElse' => 'L', + ], + 'meridiem' => function ($hour) { + if ($hour < 1) { + return 'tengah malam'; + } + + if ($hour < 12) { + return 'pagi'; + } + + if ($hour < 13) { + return 'tengah hari'; + } + + if ($hour < 19) { + return 'petang'; + } + + return 'malam'; + }, + 'months' => ['Januari', 'Februari', 'Mac', 'April', 'Mei', 'Jun', 'Julai', 'Ogos', 'September', 'Oktober', 'November', 'Disember'], + 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ogs', 'Sep', 'Okt', 'Nov', 'Dis'], + 'weekdays' => ['Ahad', 'Isnin', 'Selasa', 'Rabu', 'Khamis', 'Jumaat', 'Sabtu'], + 'weekdays_short' => ['Ahd', 'Isn', 'Sel', 'Rab', 'Kha', 'Jum', 'Sab'], + 'weekdays_min' => ['Ah', 'Is', 'Sl', 'Rb', 'Km', 'Jm', 'Sb'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' dan '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ms_BN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ms_BN.php new file mode 100644 index 0000000..ef837a2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ms_BN.php @@ -0,0 +1,22 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ms.php', [ + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'D/MM/yy', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY, h:mm a', + 'LLLL' => 'dd MMMM YYYY, h:mm a', + ], + 'meridiem' => ['a', 'p'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ms_MY.php b/vendor/nesbot/carbon/src/Carbon/Lang/ms_MY.php new file mode 100644 index 0000000..970d604 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ms_MY.php @@ -0,0 +1,18 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - Azri Jamil + * - JD Isaacks + */ +return require __DIR__.'/ms.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ms_SG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ms_SG.php new file mode 100644 index 0000000..77cb83d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ms_SG.php @@ -0,0 +1,22 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ms.php', [ + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'D/MM/yy', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY, h:mm a', + 'LLLL' => 'dddd, D MMMM YYYY, h:mm a', + ], + 'meridiem' => ['a', 'p'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mt.php b/vendor/nesbot/carbon/src/Carbon/Lang/mt.php new file mode 100644 index 0000000..e8aadcc --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mt.php @@ -0,0 +1,65 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Alessandro Maruccia + */ +return [ + 'year' => 'sena|:count sni|:count sni|:count sni', + 'y' => 'sa sena|:count snin|:count snin|:count snin', + 'month' => 'xahar|:count xhur|:count xhur|:count xhur', + 'm' => ':count xahar|:count xhur|:count xhur|:count xhur', + 'week' => 'gimgħa|:count ġimgħat|:count ġimgħat|:count ġimgħat', + 'w' => 'ġimgħa|:count ġimgħat|:count ġimgħat|:count ġimgħat', + 'day' => 'ġurnata|:count ġranet|:count ġranet|:count ġranet', + 'd' => 'ġurnata|:count ġranet|:count ġranet|:count ġranet', + 'hour' => 'siegħa|:count siegħat|:count siegħat|:count siegħat', + 'h' => 'siegħa|:count sigħat|:count sigħat|:count sigħat', + 'minute' => 'minuta|:count minuti|:count minuti|:count minuti', + 'min' => 'min.|:count min.|:count min.|:count min.', + 'second' => 'ftit sekondi|:count sekondi|:count sekondi|:count sekondi', + 's' => 'sek.|:count sek.|:count sek.|:count sek.', + 'ago' => ':time ilu', + 'from_now' => 'f’ :time', + 'diff_now' => 'issa', + 'diff_today' => 'Illum', + 'diff_today_regexp' => 'Illum(?:\\s+fil-)?', + 'diff_yesterday' => 'lbieraħ', + 'diff_yesterday_regexp' => 'Il-bieraħ(?:\\s+fil-)?', + 'diff_tomorrow' => 'għada', + 'diff_tomorrow_regexp' => 'Għada(?:\\s+fil-)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Illum fil-]LT', + 'nextDay' => '[Għada fil-]LT', + 'nextWeek' => 'dddd [fil-]LT', + 'lastDay' => '[Il-bieraħ fil-]LT', + 'lastWeek' => 'dddd [li għadda] [fil-]LT', + 'sameElse' => 'L', + ], + 'ordinal' => ':numberº', + 'months' => ['Jannar', 'Frar', 'Marzu', 'April', 'Mejju', 'Ġunju', 'Lulju', 'Awwissu', 'Settembru', 'Ottubru', 'Novembru', 'Diċembru'], + 'months_short' => ['Jan', 'Fra', 'Mar', 'Apr', 'Mej', 'Ġun', 'Lul', 'Aww', 'Set', 'Ott', 'Nov', 'Diċ'], + 'weekdays' => ['Il-Ħadd', 'It-Tnejn', 'It-Tlieta', 'L-Erbgħa', 'Il-Ħamis', 'Il-Ġimgħa', 'Is-Sibt'], + 'weekdays_short' => ['Ħad', 'Tne', 'Tli', 'Erb', 'Ħam', 'Ġim', 'Sib'], + 'weekdays_min' => ['Ħa', 'Tn', 'Tl', 'Er', 'Ħa', 'Ġi', 'Si'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' u '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mt_MT.php b/vendor/nesbot/carbon/src/Carbon/Lang/mt_MT.php new file mode 100644 index 0000000..9534f68 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mt_MT.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/mt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mua.php b/vendor/nesbot/carbon/src/Carbon/Lang/mua.php new file mode 100644 index 0000000..a3a3c6f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mua.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['comme', 'lilli'], + 'weekdays' => ['Com’yakke', 'Comlaaɗii', 'Comzyiiɗii', 'Comkolle', 'Comkaldǝɓlii', 'Comgaisuu', 'Comzyeɓsuu'], + 'weekdays_short' => ['Cya', 'Cla', 'Czi', 'Cko', 'Cka', 'Cga', 'Cze'], + 'weekdays_min' => ['Cya', 'Cla', 'Czi', 'Cko', 'Cka', 'Cga', 'Cze'], + 'months' => ['Fĩi Loo', 'Cokcwaklaŋne', 'Cokcwaklii', 'Fĩi Marfoo', 'Madǝǝuutǝbijaŋ', 'Mamǝŋgwãafahbii', 'Mamǝŋgwãalii', 'Madǝmbii', 'Fĩi Dǝɓlii', 'Fĩi Mundaŋ', 'Fĩi Gwahlle', 'Fĩi Yuru'], + 'months_short' => ['FLO', 'CLA', 'CKI', 'FMF', 'MAD', 'MBI', 'MLI', 'MAM', 'FDE', 'FMU', 'FGW', 'FYU'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/my.php b/vendor/nesbot/carbon/src/Carbon/Lang/my.php new file mode 100644 index 0000000..bbdfba4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/my.php @@ -0,0 +1,70 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - JD Isaacks + * - Nay Lin Aung + */ +return [ + 'year' => '{1}တစ်နှစ်|]1,Inf[:count နှစ်', + 'y' => ':count နှစ်', + 'month' => '{1}တစ်လ|]1,Inf[:count လ', + 'm' => ':count လ', + 'week' => ':count ပတ်', + 'w' => ':count ပတ်', + 'day' => '{1}တစ်ရက်|]1,Inf[:count ရက်', + 'd' => ':count ရက်', + 'hour' => '{1}တစ်နာရီ|]1,Inf[:count နာရီ', + 'h' => ':count နာရီ', + 'minute' => '{1}တစ်မိနစ်|]1,Inf[:count မိနစ်', + 'min' => ':count မိနစ်', + 'second' => '{1}စက္ကန်.အနည်းငယ်|]1,Inf[:count စက္ကန့်', + 's' => ':count စက္ကန့်', + 'ago' => 'လွန်ခဲ့သော :time က', + 'from_now' => 'လာမည့် :time မှာ', + 'after' => ':time ကြာပြီးနောက်', + 'before' => ':time မတိုင်ခင်', + 'diff_now' => 'အခုလေးတင်', + 'diff_today' => 'ယနေ.', + 'diff_yesterday' => 'မနေ့က', + 'diff_yesterday_regexp' => 'မနေ.က', + 'diff_tomorrow' => 'မနက်ဖြန်', + 'diff_before_yesterday' => 'တမြန်နေ့က', + 'diff_after_tomorrow' => 'တဘက်ခါ', + 'period_recurrences' => ':count ကြိမ်', + 'formats' => [ + 'LT' => 'Oh:Om A', + 'LTS' => 'Oh:Om:Os A', + 'L' => 'OD/OM/OY', + 'LL' => 'OD MMMM OY', + 'LLL' => 'OD MMMM OY Oh:Om A', + 'LLLL' => 'dddd OD MMMM OY Oh:Om A', + ], + 'calendar' => [ + 'sameDay' => '[ယနေ.] LT [မှာ]', + 'nextDay' => '[မနက်ဖြန်] LT [မှာ]', + 'nextWeek' => 'dddd LT [မှာ]', + 'lastDay' => '[မနေ.က] LT [မှာ]', + 'lastWeek' => '[ပြီးခဲ့သော] dddd LT [မှာ]', + 'sameElse' => 'L', + ], + 'months' => ['ဇန်နဝါရီ', 'ဖေဖော်ဝါရီ', 'မတ်', 'ဧပြီ', 'မေ', 'ဇွန်', 'ဇူလိုင်', 'သြဂုတ်', 'စက်တင်ဘာ', 'အောက်တိုဘာ', 'နိုဝင်ဘာ', 'ဒီဇင်ဘာ'], + 'months_short' => ['ဇန်', 'ဖေ', 'မတ်', 'ပြီ', 'မေ', 'ဇွန်', 'လိုင်', 'သြ', 'စက်', 'အောက်', 'နို', 'ဒီ'], + 'weekdays' => ['တနင်္ဂနွေ', 'တနင်္လာ', 'အင်္ဂါ', 'ဗုဒ္ဓဟူး', 'ကြာသပတေး', 'သောကြာ', 'စနေ'], + 'weekdays_short' => ['နွေ', 'လာ', 'ဂါ', 'ဟူး', 'ကြာ', 'သော', 'နေ'], + 'weekdays_min' => ['နွေ', 'လာ', 'ဂါ', 'ဟူး', 'ကြာ', 'သော', 'နေ'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'alt_numbers' => ['၀၀', '၀၁', '၀၂', '၀၃', '၀၄', '၀၅', '၀၆', '၀၇', '၀၈', '၀၉', '၁၀', '၁၁', '၁၂', '၁၃', '၁၄', '၁၅', '၁၆', '၁၇', '၁၈', '၁၉', '၂၀', '၂၁', '၂၂', '၂၃', '၂၄', '၂၅', '၂၆', '၂၇', '၂၈', '၂၉', '၃၀', '၃၁', '၃၂', '၃၃', '၃၄', '၃၅', '၃၆', '၃၇', '၃၈', '၃၉', '၄၀', '၄၁', '၄၂', '၄၃', '၄၄', '၄၅', '၄၆', '၄၇', '၄၈', '၄၉', '၅၀', '၅၁', '၅၂', '၅၃', '၅၄', '၅၅', '၅၆', '၅၇', '၅၈', '၅၉', '၆၀', '၆၁', '၆၂', '၆၃', '၆၄', '၆၅', '၆၆', '၆၇', '၆၈', '၆၉', '၇၀', '၇၁', '၇၂', '၇၃', '၇၄', '၇၅', '၇၆', '၇၇', '၇၈', '၇၉', '၈၀', '၈၁', '၈၂', '၈၃', '၈၄', '၈၅', '၈၆', '၈၇', '၈၈', '၈၉', '၉၀', '၉၁', '၉၂', '၉၃', '၉၄', '၉၅', '၉၆', '၉၇', '၉၈', '၉၉'], + 'meridiem' => ['နံနက်', 'ညနေ'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/my_MM.php b/vendor/nesbot/carbon/src/Carbon/Lang/my_MM.php new file mode 100644 index 0000000..a0108dd --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/my_MM.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/my.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mzn.php b/vendor/nesbot/carbon/src/Carbon/Lang/mzn.php new file mode 100644 index 0000000..70f5f23 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mzn.php @@ -0,0 +1,25 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/fa.php', [ + 'months' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'], + 'months_short' => ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'], + 'first_day_of_week' => 6, + 'weekend' => [5, 5], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY-MM-dd', + 'LL' => 'YYYY MMM D', + 'LLL' => 'YYYY MMMM D HH:mm', + 'LLLL' => 'YYYY MMMM D, dddd HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nan.php b/vendor/nesbot/carbon/src/Carbon/Lang/nan.php new file mode 100644 index 0000000..0affece --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nan.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/nan_TW.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW.php b/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW.php new file mode 100644 index 0000000..5c50aa4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'YYYY年MM月DD日', + ], + 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], + 'months_short' => [' 1月', ' 2月', ' 3月', ' 4月', ' 5月', ' 6月', ' 7月', ' 8月', ' 9月', '10月', '11月', '12月'], + 'weekdays' => ['禮拜日', '禮拜一', '禮拜二', '禮拜三', '禮拜四', '禮拜五', '禮拜六'], + 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], + 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['頂晡', '下晡'], + + 'year' => ':count 年', + 'y' => ':count 年', + 'a_year' => ':count 年', + + 'month' => ':count goe̍h', + 'm' => ':count goe̍h', + 'a_month' => ':count goe̍h', + + 'week' => ':count lé-pài', + 'w' => ':count lé-pài', + 'a_week' => ':count lé-pài', + + 'day' => ':count 日', + 'd' => ':count 日', + 'a_day' => ':count 日', + + 'hour' => ':count tiám-cheng', + 'h' => ':count tiám-cheng', + 'a_hour' => ':count tiám-cheng', + + 'minute' => ':count Hun-cheng', + 'min' => ':count Hun-cheng', + 'a_minute' => ':count Hun-cheng', + + 'second' => ':count Bió', + 's' => ':count Bió', + 'a_second' => ':count Bió', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php b/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php new file mode 100644 index 0000000..99ca2a4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Arne Goetje arne@canonical.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'YYYY-MM-DD', + ], + 'months' => ['1goe̍h', '2goe̍h', '3goe̍h', '4goe̍h', '5goe̍h', '6goe̍h', '7goe̍h', '8goe̍h', '9goe̍h', '10goe̍h', '11goe̍h', '12goe̍h'], + 'months_short' => ['1g', '2g', '3g', '4g', '5g', '6g', '7g', '8g', '9g', '10g', '11g', '12g'], + 'weekdays' => ['lé-pài-ji̍t', 'pài-it', 'pài-jī', 'pài-saⁿ', 'pài-sì', 'pài-gō͘', 'pài-la̍k'], + 'weekdays_short' => ['lp', 'p1', 'p2', 'p3', 'p4', 'p5', 'p6'], + 'weekdays_min' => ['lp', 'p1', 'p2', 'p3', 'p4', 'p5', 'p6'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['téng-po͘', 'ē-po͘'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/naq.php b/vendor/nesbot/carbon/src/Carbon/Lang/naq.php new file mode 100644 index 0000000..fbd9be9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/naq.php @@ -0,0 +1,52 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['ǁgoagas', 'ǃuias'], + 'weekdays' => ['Sontaxtsees', 'Mantaxtsees', 'Denstaxtsees', 'Wunstaxtsees', 'Dondertaxtsees', 'Fraitaxtsees', 'Satertaxtsees'], + 'weekdays_short' => ['Son', 'Ma', 'De', 'Wu', 'Do', 'Fr', 'Sat'], + 'weekdays_min' => ['Son', 'Ma', 'De', 'Wu', 'Do', 'Fr', 'Sat'], + 'months' => ['ǃKhanni', 'ǃKhanǀgôab', 'ǀKhuuǁkhâb', 'ǃHôaǂkhaib', 'ǃKhaitsâb', 'Gamaǀaeb', 'ǂKhoesaob', 'Aoǁkhuumûǁkhâb', 'Taraǀkhuumûǁkhâb', 'ǂNûǁnâiseb', 'ǀHooǂgaeb', 'Hôasoreǁkhâb'], + 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm a', + 'LLLL' => 'dddd, D MMMM YYYY h:mm a', + ], + + 'year' => ':count kurigu', + 'y' => ':count kurigu', + 'a_year' => ':count kurigu', + + 'month' => ':count ǁaub', // less reliable + 'm' => ':count ǁaub', // less reliable + 'a_month' => ':count ǁaub', // less reliable + + 'week' => ':count hû', // less reliable + 'w' => ':count hû', // less reliable + 'a_week' => ':count hû', // less reliable + + 'day' => ':count ǀhobas', // less reliable + 'd' => ':count ǀhobas', // less reliable + 'a_day' => ':count ǀhobas', // less reliable + + 'hour' => ':count ǂgaes', // less reliable + 'h' => ':count ǂgaes', // less reliable + 'a_hour' => ':count ǂgaes', // less reliable + + 'minute' => ':count minutga', // less reliable + 'min' => ':count minutga', // less reliable + 'a_minute' => ':count minutga', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nb.php b/vendor/nesbot/carbon/src/Carbon/Lang/nb.php new file mode 100644 index 0000000..371ee84 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nb.php @@ -0,0 +1,84 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - Alexander Tømmerås + * - Sigurd Gartmann + * - JD Isaacks + */ +return [ + 'year' => ':count år|:count år', + 'a_year' => 'ett år|:count år', + 'y' => ':count år|:count år', + 'month' => ':count måned|:count måneder', + 'a_month' => 'en måned|:count måneder', + 'm' => ':count md.', + 'week' => ':count uke|:count uker', + 'a_week' => 'en uke|:count uker', + 'w' => ':count u.', + 'day' => ':count dag|:count dager', + 'a_day' => 'en dag|:count dager', + 'd' => ':count d.', + 'hour' => ':count time|:count timer', + 'a_hour' => 'en time|:count timer', + 'h' => ':count t', + 'minute' => ':count minutt|:count minutter', + 'a_minute' => 'ett minutt|:count minutter', + 'min' => ':count min', + 'second' => ':count sekund|:count sekunder', + 'a_second' => 'noen sekunder|:count sekunder', + 's' => ':count sek', + 'ago' => ':time siden', + 'from_now' => 'om :time', + 'after' => ':time etter', + 'before' => ':time før', + 'diff_now' => 'akkurat nå', + 'diff_today' => 'i dag', + 'diff_today_regexp' => 'i dag(?:\\s+kl.)?', + 'diff_yesterday' => 'i går', + 'diff_yesterday_regexp' => 'i går(?:\\s+kl.)?', + 'diff_tomorrow' => 'i morgen', + 'diff_tomorrow_regexp' => 'i morgen(?:\\s+kl.)?', + 'diff_before_yesterday' => 'i forgårs', + 'diff_after_tomorrow' => 'i overmorgen', + 'period_recurrences' => 'en gang|:count ganger', + 'period_interval' => 'hver :interval', + 'period_start_date' => 'fra :date', + 'period_end_date' => 'til :date', + 'months' => ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'], + 'months_short' => ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'], + 'weekdays' => ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'], + 'weekdays_short' => ['søn', 'man', 'tir', 'ons', 'tor', 'fre', 'lør'], + 'weekdays_min' => ['sø', 'ma', 'ti', 'on', 'to', 'fr', 'lø'], + 'ordinal' => ':number.', + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D. MMMM YYYY', + 'LLL' => 'D. MMMM YYYY [kl.] HH:mm', + 'LLLL' => 'dddd D. MMMM YYYY [kl.] HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[i dag kl.] LT', + 'nextDay' => '[i morgen kl.] LT', + 'nextWeek' => 'dddd [kl.] LT', + 'lastDay' => '[i går kl.] LT', + 'lastWeek' => '[forrige] dddd [kl.] LT', + 'sameElse' => 'L', + ], + 'list' => [', ', ' og '], + 'meridiem' => ['a.m.', 'p.m.'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nb_NO.php b/vendor/nesbot/carbon/src/Carbon/Lang/nb_NO.php new file mode 100644 index 0000000..31678c5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nb_NO.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/nb.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nb_SJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/nb_SJ.php new file mode 100644 index 0000000..ce0210b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nb_SJ.php @@ -0,0 +1,18 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/nb.php', [ + 'formats' => [ + 'LL' => 'D. MMM YYYY', + 'LLL' => 'D. MMMM YYYY, HH:mm', + 'LLLL' => 'dddd D. MMMM YYYY, HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nd.php b/vendor/nesbot/carbon/src/Carbon/Lang/nd.php new file mode 100644 index 0000000..f75d9a7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nd.php @@ -0,0 +1,54 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'weekdays' => ['Sonto', 'Mvulo', 'Sibili', 'Sithathu', 'Sine', 'Sihlanu', 'Mgqibelo'], + 'weekdays_short' => ['Son', 'Mvu', 'Sib', 'Sit', 'Sin', 'Sih', 'Mgq'], + 'weekdays_min' => ['Son', 'Mvu', 'Sib', 'Sit', 'Sin', 'Sih', 'Mgq'], + 'months' => ['Zibandlela', 'Nhlolanja', 'Mbimbitho', 'Mabasa', 'Nkwenkwezi', 'Nhlangula', 'Ntulikazi', 'Ncwabakazi', 'Mpandula', 'Mfumfu', 'Lwezi', 'Mpalakazi'], + 'months_short' => ['Zib', 'Nhlo', 'Mbi', 'Mab', 'Nkw', 'Nhla', 'Ntu', 'Ncw', 'Mpan', 'Mfu', 'Lwe', 'Mpal'], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + + 'year' => 'okweminyaka engu-:count', // less reliable + 'y' => 'okweminyaka engu-:count', // less reliable + 'a_year' => 'okweminyaka engu-:count', // less reliable + + 'month' => 'inyanga ezingu-:count', + 'm' => 'inyanga ezingu-:count', + 'a_month' => 'inyanga ezingu-:count', + + 'week' => 'amaviki angu-:count', + 'w' => 'amaviki angu-:count', + 'a_week' => 'amaviki angu-:count', + + 'day' => 'kwamalanga angu-:count', + 'd' => 'kwamalanga angu-:count', + 'a_day' => 'kwamalanga angu-:count', + + 'hour' => 'amahola angu-:count', + 'h' => 'amahola angu-:count', + 'a_hour' => 'amahola angu-:count', + + 'minute' => 'imizuzu engu-:count', + 'min' => 'imizuzu engu-:count', + 'a_minute' => 'imizuzu engu-:count', + + 'second' => 'imizuzwana engu-:count', + 's' => 'imizuzwana engu-:count', + 'a_second' => 'imizuzwana engu-:count', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nds.php b/vendor/nesbot/carbon/src/Carbon/Lang/nds.php new file mode 100644 index 0000000..c0b3775 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nds.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/nds_DE.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nds_DE.php b/vendor/nesbot/carbon/src/Carbon/Lang/nds_DE.php new file mode 100644 index 0000000..a6c57a9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nds_DE.php @@ -0,0 +1,60 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - information from Kenneth Christiansen Kenneth Christiansen, Pablo Saratxaga kenneth@gnu.org, pablo@mandrakesoft.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], + 'months' => ['Jannuaar', 'Feberwaar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'], + 'months_short' => ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'], + 'weekdays' => ['Sünndag', 'Maandag', 'Dingsdag', 'Middeweek', 'Dunnersdag', 'Freedag', 'Sünnavend'], + 'weekdays_short' => ['Sdag', 'Maan', 'Ding', 'Midd', 'Dunn', 'Free', 'Svd.'], + 'weekdays_min' => ['Sd', 'Ma', 'Di', 'Mi', 'Du', 'Fr', 'Sa'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + + 'year' => ':count Johr', + 'y' => ':countJ', + 'a_year' => '{1}een Johr|:count Johr', + + 'month' => ':count Maand', + 'm' => ':countM', + 'a_month' => '{1}een Maand|:count Maand', + + 'week' => ':count Week|:count Weken', + 'w' => ':countW', + 'a_week' => '{1}een Week|:count Week|:count Weken', + + 'day' => ':count Dag|:count Daag', + 'd' => ':countD', + 'a_day' => '{1}een Dag|:count Dag|:count Daag', + + 'hour' => ':count Stünn|:count Stünnen', + 'h' => ':countSt', + 'a_hour' => '{1}een Stünn|:count Stünn|:count Stünnen', + + 'minute' => ':count Minuut|:count Minuten', + 'min' => ':countm', + 'a_minute' => '{1}een Minuut|:count Minuut|:count Minuten', + + 'second' => ':count Sekunn|:count Sekunnen', + 's' => ':counts', + 'a_second' => 'en poor Sekunnen|:count Sekunn|:count Sekunnen', + + 'ago' => 'vör :time', + 'from_now' => 'in :time', + 'before' => ':time vörher', + 'after' => ':time later', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nds_NL.php b/vendor/nesbot/carbon/src/Carbon/Lang/nds_NL.php new file mode 100644 index 0000000..de2c57b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nds_NL.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - information from Kenneth Christiansen Kenneth Christiansen, Pablo Saratxaga kenneth@gnu.org, pablo@mandrakesoft.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], + 'months' => ['Jaunuwoa', 'Februwoa', 'Moaz', 'Aprell', 'Mai', 'Juni', 'Juli', 'August', 'Septamba', 'Oktoba', 'Nowamba', 'Dezamba'], + 'months_short' => ['Jan', 'Feb', 'Moz', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Now', 'Dez'], + 'weekdays' => ['Sinndag', 'Mondag', 'Dingsdag', 'Meddwäakj', 'Donnadag', 'Friedag', 'Sinnowend'], + 'weekdays_short' => ['Sdg', 'Mdg', 'Dsg', 'Mwk', 'Ddg', 'Fdg', 'Swd'], + 'weekdays_min' => ['Sdg', 'Mdg', 'Dsg', 'Mwk', 'Ddg', 'Fdg', 'Swd'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ne.php b/vendor/nesbot/carbon/src/Carbon/Lang/ne.php new file mode 100644 index 0000000..d4caf0e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ne.php @@ -0,0 +1,82 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - nootanghimire + * - Josh Soref + * - Nj Subedi + * - JD Isaacks + */ +return [ + 'year' => 'एक बर्ष|:count बर्ष', + 'y' => ':count वर्ष', + 'month' => 'एक महिना|:count महिना', + 'm' => ':count महिना', + 'week' => ':count हप्ता', + 'w' => ':count हप्ता', + 'day' => 'एक दिन|:count दिन', + 'd' => ':count दिन', + 'hour' => 'एक घण्टा|:count घण्टा', + 'h' => ':count घण्टा', + 'minute' => 'एक मिनेट|:count मिनेट', + 'min' => ':count मिनेट', + 'second' => 'केही क्षण|:count सेकेण्ड', + 's' => ':count सेकेण्ड', + 'ago' => ':time अगाडि', + 'from_now' => ':timeमा', + 'after' => ':time पछि', + 'before' => ':time अघि', + 'diff_now' => 'अहिले', + 'diff_today' => 'आज', + 'diff_yesterday' => 'हिजो', + 'diff_tomorrow' => 'भोलि', + 'formats' => [ + 'LT' => 'Aको h:mm बजे', + 'LTS' => 'Aको h:mm:ss बजे', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY, Aको h:mm बजे', + 'LLLL' => 'dddd, D MMMM YYYY, Aको h:mm बजे', + ], + 'calendar' => [ + 'sameDay' => '[आज] LT', + 'nextDay' => '[भोलि] LT', + 'nextWeek' => '[आउँदो] dddd[,] LT', + 'lastDay' => '[हिजो] LT', + 'lastWeek' => '[गएको] dddd[,] LT', + 'sameElse' => 'L', + ], + 'meridiem' => function ($hour) { + if ($hour < 3) { + return 'राति'; + } + if ($hour < 12) { + return 'बिहान'; + } + if ($hour < 16) { + return 'दिउँसो'; + } + if ($hour < 20) { + return 'साँझ'; + } + + return 'राति'; + }, + 'months' => ['जनवरी', 'फेब्रुवरी', 'मार्च', 'अप्रिल', 'मई', 'जुन', 'जुलाई', 'अगष्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोभेम्बर', 'डिसेम्बर'], + 'months_short' => ['जन.', 'फेब्रु.', 'मार्च', 'अप्रि.', 'मई', 'जुन', 'जुलाई.', 'अग.', 'सेप्ट.', 'अक्टो.', 'नोभे.', 'डिसे.'], + 'weekdays' => ['आइतबार', 'सोमबार', 'मङ्गलबार', 'बुधबार', 'बिहिबार', 'शुक्रबार', 'शनिबार'], + 'weekdays_short' => ['आइत.', 'सोम.', 'मङ्गल.', 'बुध.', 'बिहि.', 'शुक्र.', 'शनि.'], + 'weekdays_min' => ['आ.', 'सो.', 'मं.', 'बु.', 'बि.', 'शु.', 'श.'], + 'list' => [', ', ' र '], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ne_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ne_IN.php new file mode 100644 index 0000000..f68d00e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ne_IN.php @@ -0,0 +1,25 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ne.php', [ + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'yy/M/d', + 'LL' => 'YYYY MMM D', + 'LLL' => 'YYYY MMMM D, h:mm a', + 'LLLL' => 'YYYY MMMM D, dddd, h:mm a', + ], + 'months' => ['जनवरी', 'फेब्रुअरी', 'मार्च', 'अप्रिल', 'मे', 'जुन', 'जुलाई', 'अगस्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोभेम्बर', 'डिसेम्बर'], + 'months_short' => ['जनवरी', 'फेब्रुअरी', 'मार्च', 'अप्रिल', 'मे', 'जुन', 'जुलाई', 'अगस्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोभेम्बर', 'डिसेम्बर'], + 'weekend' => [0, 0], + 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ne_NP.php b/vendor/nesbot/carbon/src/Carbon/Lang/ne_NP.php new file mode 100644 index 0000000..27840c0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ne_NP.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ne.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nhn.php b/vendor/nesbot/carbon/src/Carbon/Lang/nhn.php new file mode 100644 index 0000000..5a85831 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nhn.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/nhn_MX.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nhn_MX.php b/vendor/nesbot/carbon/src/Carbon/Lang/nhn_MX.php new file mode 100644 index 0000000..9db88a1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nhn_MX.php @@ -0,0 +1,50 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP libc-alpha@sourceware.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'], + 'months_short' => ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'], + 'weekdays' => ['teoilhuitl', 'ceilhuitl', 'omeilhuitl', 'yeilhuitl', 'nahuilhuitl', 'macuililhuitl', 'chicuaceilhuitl'], + 'weekdays_short' => ['teo', 'cei', 'ome', 'yei', 'nau', 'mac', 'chi'], + 'weekdays_min' => ['teo', 'cei', 'ome', 'yei', 'nau', 'mac', 'chi'], + 'day_of_first_week_of_year' => 1, + + 'month' => ':count metztli', // less reliable + 'm' => ':count metztli', // less reliable + 'a_month' => ':count metztli', // less reliable + + 'week' => ':count tonalli', // less reliable + 'w' => ':count tonalli', // less reliable + 'a_week' => ':count tonalli', // less reliable + + 'day' => ':count tonatih', // less reliable + 'd' => ':count tonatih', // less reliable + 'a_day' => ':count tonatih', // less reliable + + 'minute' => ':count toltecayotl', // less reliable + 'min' => ':count toltecayotl', // less reliable + 'a_minute' => ':count toltecayotl', // less reliable + + 'second' => ':count ome', // less reliable + 's' => ':count ome', // less reliable + 'a_second' => ':count ome', // less reliable + + 'year' => ':count xihuitl', + 'y' => ':count xihuitl', + 'a_year' => ':count xihuitl', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/niu.php b/vendor/nesbot/carbon/src/Carbon/Lang/niu.php new file mode 100644 index 0000000..bd9be8a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/niu.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/niu_NU.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/niu_NU.php b/vendor/nesbot/carbon/src/Carbon/Lang/niu_NU.php new file mode 100644 index 0000000..6e7a697 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/niu_NU.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RockET Systems Emani Fakaotimanava-Lui emani@niue.nu + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['Ianuali', 'Fepuali', 'Masi', 'Apelila', 'Me', 'Iuni', 'Iulai', 'Aokuso', 'Sepetema', 'Oketopa', 'Novema', 'Tesemo'], + 'months_short' => ['Ian', 'Fep', 'Mas', 'Ape', 'Me', 'Iun', 'Iul', 'Aok', 'Sep', 'Oke', 'Nov', 'Tes'], + 'weekdays' => ['Aho Tapu', 'Aho Gofua', 'Aho Ua', 'Aho Lotu', 'Aho Tuloto', 'Aho Falaile', 'Aho Faiumu'], + 'weekdays_short' => ['Tapu', 'Gofua', 'Ua', 'Lotu', 'Tuloto', 'Falaile', 'Faiumu'], + 'weekdays_min' => ['Tapu', 'Gofua', 'Ua', 'Lotu', 'Tuloto', 'Falaile', 'Faiumu'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + + 'year' => ':count tau', + 'y' => ':count tau', + 'a_year' => ':count tau', + + 'month' => ':count mahina', + 'm' => ':count mahina', + 'a_month' => ':count mahina', + + 'week' => ':count faahi tapu', + 'w' => ':count faahi tapu', + 'a_week' => ':count faahi tapu', + + 'day' => ':count aho', + 'd' => ':count aho', + 'a_day' => ':count aho', + + 'hour' => ':count e tulā', + 'h' => ':count e tulā', + 'a_hour' => ':count e tulā', + + 'minute' => ':count minuti', + 'min' => ':count minuti', + 'a_minute' => ':count minuti', + + 'second' => ':count sekone', + 's' => ':count sekone', + 'a_second' => ':count sekone', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nl.php b/vendor/nesbot/carbon/src/Carbon/Lang/nl.php new file mode 100644 index 0000000..2d73770 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nl.php @@ -0,0 +1,113 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Roy + * - Stephan + * - François B + * - Tim Fish + * - Kevin Huang + * - Jacob Middag + * - JD Isaacks + * - Roy + * - Stephan + * - François B + * - Tim Fish + * - Jacob Middag + * - JD Isaacks + * - Propaganistas + * - MegaXLR + * - adriaanzon + * - MonkeyPhysics + * - JeroenG + * - RikSomers + * - proclame + * - Rik de Groot (hwdegroot) + */ +return [ + 'year' => ':count jaar|:count jaar', + 'a_year' => 'een jaar|:count jaar', + 'y' => ':countj', + 'month' => ':count maand|:count maanden', + 'a_month' => 'een maand|:count maanden', + 'm' => ':countmnd', + 'week' => ':count week|:count weken', + 'a_week' => 'een week|:count weken', + 'w' => ':countw', + 'day' => ':count dag|:count dagen', + 'a_day' => 'een dag|:count dagen', + 'd' => ':countd', + 'hour' => ':count uur|:count uur', + 'a_hour' => 'een uur|:count uur', + 'h' => ':countu', + 'minute' => ':count minuut|:count minuten', + 'a_minute' => 'een minuut|:count minuten', + 'min' => ':countmin', + 'second' => ':count seconde|:count seconden', + 'a_second' => 'een paar seconden|:count seconden', + 's' => ':counts', + 'ago' => ':time geleden', + 'from_now' => 'over :time', + 'after' => ':time later', + 'before' => ':time eerder', + 'diff_now' => 'nu', + 'diff_today' => 'vandaag', + 'diff_today_regexp' => 'vandaag(?:\\s+om)?', + 'diff_yesterday' => 'gisteren', + 'diff_yesterday_regexp' => 'gisteren(?:\\s+om)?', + 'diff_tomorrow' => 'morgen', + 'diff_tomorrow_regexp' => 'morgen(?:\\s+om)?', + 'diff_after_tomorrow' => 'overmorgen', + 'diff_before_yesterday' => 'eergisteren', + 'period_recurrences' => ':count keer', + 'period_interval' => function (string $interval = '') { + /** @var string $output */ + $output = preg_replace('/^(een|één|1)\s+/u', '', $interval); + + if (preg_match('/^(een|één|1)( jaar|j| uur|u)/u', $interval)) { + return "elk $output"; + } + + return "elke $output"; + }, + 'period_start_date' => 'van :date', + 'period_end_date' => 'tot :date', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD-MM-YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[vandaag om] LT', + 'nextDay' => '[morgen om] LT', + 'nextWeek' => 'dddd [om] LT', + 'lastDay' => '[gisteren om] LT', + 'lastWeek' => '[afgelopen] dddd [om] LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number) { + return $number.(($number === 1 || $number === 8 || $number >= 20) ? 'ste' : 'de'); + }, + 'months' => ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], + 'months_short' => ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], + 'mmm_suffix' => '.', + 'weekdays' => ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], + 'weekdays_short' => ['zo.', 'ma.', 'di.', 'wo.', 'do.', 'vr.', 'za.'], + 'weekdays_min' => ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' en '], + 'meridiem' => ['\'s ochtends', '\'s middags'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nl_AW.php b/vendor/nesbot/carbon/src/Carbon/Lang/nl_AW.php new file mode 100644 index 0000000..5ec136d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nl_AW.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Free Software Foundation, Inc. bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/nl.php', [ + 'formats' => [ + 'L' => 'DD-MM-YY', + ], + 'months' => ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], + 'months_short' => ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], + 'weekdays' => ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], + 'weekdays_short' => ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], + 'weekdays_min' => ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nl_BE.php b/vendor/nesbot/carbon/src/Carbon/Lang/nl_BE.php new file mode 100644 index 0000000..037f5b4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nl_BE.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Roy + * - Stephan + * - François B + * - Tim Fish + * - Kevin Huang + * - Jacob Middag + * - JD Isaacks + * - Propaganistas + */ +return array_replace_recursive(require __DIR__.'/nl.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nl_BQ.php b/vendor/nesbot/carbon/src/Carbon/Lang/nl_BQ.php new file mode 100644 index 0000000..c269197 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nl_BQ.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/nl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nl_CW.php b/vendor/nesbot/carbon/src/Carbon/Lang/nl_CW.php new file mode 100644 index 0000000..c269197 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nl_CW.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/nl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nl_NL.php b/vendor/nesbot/carbon/src/Carbon/Lang/nl_NL.php new file mode 100644 index 0000000..14e4853 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nl_NL.php @@ -0,0 +1,24 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/nl.php', [ + 'months' => ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'], + 'months_short' => ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], + 'weekdays' => ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'], + 'weekdays_short' => ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], + 'weekdays_min' => ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nl_SR.php b/vendor/nesbot/carbon/src/Carbon/Lang/nl_SR.php new file mode 100644 index 0000000..c269197 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nl_SR.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/nl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nl_SX.php b/vendor/nesbot/carbon/src/Carbon/Lang/nl_SX.php new file mode 100644 index 0000000..c269197 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nl_SX.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/nl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nmg.php b/vendor/nesbot/carbon/src/Carbon/Lang/nmg.php new file mode 100644 index 0000000..4d1df6e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nmg.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['maná', 'kugú'], + 'weekdays' => ['sɔ́ndɔ', 'mɔ́ndɔ', 'sɔ́ndɔ mafú mába', 'sɔ́ndɔ mafú málal', 'sɔ́ndɔ mafú mána', 'mabágá má sukul', 'sásadi'], + 'weekdays_short' => ['sɔ́n', 'mɔ́n', 'smb', 'sml', 'smn', 'mbs', 'sas'], + 'weekdays_min' => ['sɔ́n', 'mɔ́n', 'smb', 'sml', 'smn', 'mbs', 'sas'], + 'months' => ['ngwɛn matáhra', 'ngwɛn ńmba', 'ngwɛn ńlal', 'ngwɛn ńna', 'ngwɛn ńtan', 'ngwɛn ńtuó', 'ngwɛn hɛmbuɛrí', 'ngwɛn lɔmbi', 'ngwɛn rɛbvuâ', 'ngwɛn wum', 'ngwɛn wum navǔr', 'krísimin'], + 'months_short' => ['ng1', 'ng2', 'ng3', 'ng4', 'ng5', 'ng6', 'ng7', 'ng8', 'ng9', 'ng10', 'ng11', 'kris'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nn.php b/vendor/nesbot/carbon/src/Carbon/Lang/nn.php new file mode 100644 index 0000000..041f7b2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nn.php @@ -0,0 +1,78 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - Alexander Tømmerås + * - Øystein + * - JD Isaacks + * - Gaute Hvoslef Kvalnes (gaute) + */ +return [ + 'year' => ':count år', + 'a_year' => 'eit år|:count år', + 'y' => ':count år', + 'month' => ':count månad|:count månader', + 'a_month' => 'ein månad|:count månader', + 'm' => ':count md', + 'week' => ':count veke|:count veker', + 'a_week' => 'ei veke|:count veker', + 'w' => ':countv', + 'day' => ':count dag|:count dagar', + 'a_day' => 'ein dag|:count dagar', + 'd' => ':countd', + 'hour' => ':count time|:count timar', + 'a_hour' => 'ein time|:count timar', + 'h' => ':countt', + 'minute' => ':count minutt', + 'a_minute' => 'eit minutt|:count minutt', + 'min' => ':countm', + 'second' => ':count sekund', + 'a_second' => 'nokre sekund|:count sekund', + 's' => ':counts', + 'ago' => ':time sidan', + 'from_now' => 'om :time', + 'after' => ':time etter', + 'before' => ':time før', + 'diff_today' => 'I dag', + 'diff_yesterday' => 'I går', + 'diff_yesterday_regexp' => 'I går(?:\\s+klokka)?', + 'diff_tomorrow' => 'I morgon', + 'diff_tomorrow_regexp' => 'I morgon(?:\\s+klokka)?', + 'diff_today_regexp' => 'I dag(?:\\s+klokka)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D. MMMM YYYY', + 'LLL' => 'D. MMMM YYYY [kl.] H:mm', + 'LLLL' => 'dddd D. MMMM YYYY [kl.] HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[I dag klokka] LT', + 'nextDay' => '[I morgon klokka] LT', + 'nextWeek' => 'dddd [klokka] LT', + 'lastDay' => '[I går klokka] LT', + 'lastWeek' => '[Føregåande] dddd [klokka] LT', + 'sameElse' => 'L', + ], + 'ordinal' => ':number.', + 'months' => ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'], + 'months_short' => ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'], + 'weekdays' => ['sundag', 'måndag', 'tysdag', 'onsdag', 'torsdag', 'fredag', 'laurdag'], + 'weekdays_short' => ['sun', 'mån', 'tys', 'ons', 'tor', 'fre', 'lau'], + 'weekdays_min' => ['su', 'må', 'ty', 'on', 'to', 'fr', 'la'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' og '], + 'meridiem' => ['f.m.', 'e.m.'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nn_NO.php b/vendor/nesbot/carbon/src/Carbon/Lang/nn_NO.php new file mode 100644 index 0000000..8e16871 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nn_NO.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/nn.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nnh.php b/vendor/nesbot/carbon/src/Carbon/Lang/nnh.php new file mode 100644 index 0000000..007d239 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nnh.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['mbaʼámbaʼ', 'ncwònzém'], + 'weekdays' => null, + 'weekdays_short' => ['lyɛʼɛ́ sẅíŋtè', 'mvfò lyɛ̌ʼ', 'mbɔ́ɔntè mvfò lyɛ̌ʼ', 'tsètsɛ̀ɛ lyɛ̌ʼ', 'mbɔ́ɔntè tsetsɛ̀ɛ lyɛ̌ʼ', 'mvfò màga lyɛ̌ʼ', 'màga lyɛ̌ʼ'], + 'weekdays_min' => null, + 'months' => null, + 'months_short' => ['saŋ tsetsɛ̀ɛ lùm', 'saŋ kàg ngwóŋ', 'saŋ lepyè shúm', 'saŋ cÿó', 'saŋ tsɛ̀ɛ cÿó', 'saŋ njÿoláʼ', 'saŋ tyɛ̀b tyɛ̀b mbʉ̀ŋ', 'saŋ mbʉ̀ŋ', 'saŋ ngwɔ̀ʼ mbÿɛ', 'saŋ tàŋa tsetsáʼ', 'saŋ mejwoŋó', 'saŋ lùm'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/yy', + 'LL' => 'D MMM, YYYY', + 'LLL' => '[lyɛ]̌ʼ d [na] MMMM, YYYY HH:mm', + 'LLLL' => 'dddd , [lyɛ]̌ʼ d [na] MMMM, YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/no.php b/vendor/nesbot/carbon/src/Carbon/Lang/no.php new file mode 100644 index 0000000..f4497c7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/no.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Daniel S. Billing + * - Paul + * - Jimmie Johansson + * - Jens Herlevsen + */ +return array_replace_recursive(require __DIR__.'/nb.php', [ + 'formats' => [ + 'LLL' => 'D. MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D. MMMM YYYY [kl.] HH:mm', + ], + 'calendar' => [ + 'nextWeek' => 'på dddd [kl.] LT', + 'lastWeek' => '[i] dddd[s kl.] LT', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nr.php b/vendor/nesbot/carbon/src/Carbon/Lang/nr.php new file mode 100644 index 0000000..1bc999f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nr.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/nr_ZA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nr_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/nr_ZA.php new file mode 100644 index 0000000..f9a7be8 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nr_ZA.php @@ -0,0 +1,26 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['Janabari', 'uFeberbari', 'uMatjhi', 'u-Apreli', 'Meyi', 'Juni', 'Julayi', 'Arhostosi', 'Septemba', 'Oktoba', 'Usinyikhaba', 'Disemba'], + 'months_short' => ['Jan', 'Feb', 'Mat', 'Apr', 'Mey', 'Jun', 'Jul', 'Arh', 'Sep', 'Okt', 'Usi', 'Dis'], + 'weekdays' => ['uSonto', 'uMvulo', 'uLesibili', 'lesithathu', 'uLesine', 'ngoLesihlanu', 'umGqibelo'], + 'weekdays_short' => ['Son', 'Mvu', 'Bil', 'Tha', 'Ne', 'Hla', 'Gqi'], + 'weekdays_min' => ['Son', 'Mvu', 'Bil', 'Tha', 'Ne', 'Hla', 'Gqi'], + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nso.php b/vendor/nesbot/carbon/src/Carbon/Lang/nso.php new file mode 100644 index 0000000..2a6cabb --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nso.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/nso_ZA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nso_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/nso_ZA.php new file mode 100644 index 0000000..b08fe6d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nso_ZA.php @@ -0,0 +1,54 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['Janaware', 'Febereware', 'Matšhe', 'Aprele', 'Mei', 'June', 'Julae', 'Agostose', 'Setemere', 'Oktobere', 'Nofemere', 'Disemere'], + 'months_short' => ['Jan', 'Feb', 'Mat', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Set', 'Okt', 'Nof', 'Dis'], + 'weekdays' => ['LaMorena', 'Mošupologo', 'Labobedi', 'Laboraro', 'Labone', 'Labohlano', 'Mokibelo'], + 'weekdays_short' => ['Son', 'Moš', 'Bed', 'Rar', 'Ne', 'Hla', 'Mok'], + 'weekdays_min' => ['Son', 'Moš', 'Bed', 'Rar', 'Ne', 'Hla', 'Mok'], + 'day_of_first_week_of_year' => 1, + + 'year' => ':count ngwaga', + 'y' => ':count ngwaga', + 'a_year' => ':count ngwaga', + + 'month' => ':count Kgwedi', + 'm' => ':count Kgwedi', + 'a_month' => ':count Kgwedi', + + 'week' => ':count Beke', + 'w' => ':count Beke', + 'a_week' => ':count Beke', + + 'day' => ':count Letšatši', + 'd' => ':count Letšatši', + 'a_day' => ':count Letšatši', + + 'hour' => ':count Iri', + 'h' => ':count Iri', + 'a_hour' => ':count Iri', + + 'minute' => ':count Motsotso', + 'min' => ':count Motsotso', + 'a_minute' => ':count Motsotso', + + 'second' => ':count motsotswana', + 's' => ':count motsotswana', + 'a_second' => ':count motsotswana', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nus.php b/vendor/nesbot/carbon/src/Carbon/Lang/nus.php new file mode 100644 index 0000000..789bc39 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nus.php @@ -0,0 +1,36 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['RW', 'TŊ'], + 'weekdays' => ['Cäŋ kuɔth', 'Jiec la̱t', 'Rɛw lätni', 'Diɔ̱k lätni', 'Ŋuaan lätni', 'Dhieec lätni', 'Bäkɛl lätni'], + 'weekdays_short' => ['Cäŋ', 'Jiec', 'Rɛw', 'Diɔ̱k', 'Ŋuaan', 'Dhieec', 'Bäkɛl'], + 'weekdays_min' => ['Cäŋ', 'Jiec', 'Rɛw', 'Diɔ̱k', 'Ŋuaan', 'Dhieec', 'Bäkɛl'], + 'months' => ['Tiop thar pɛt', 'Pɛt', 'Duɔ̱ɔ̱ŋ', 'Guak', 'Duät', 'Kornyoot', 'Pay yie̱tni', 'Tho̱o̱r', 'Tɛɛr', 'Laath', 'Kur', 'Tio̱p in di̱i̱t'], + 'months_short' => ['Tiop', 'Pɛt', 'Duɔ̱ɔ̱', 'Guak', 'Duä', 'Kor', 'Pay', 'Thoo', 'Tɛɛ', 'Laa', 'Kur', 'Tid'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'D/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm a', + 'LLLL' => 'dddd D MMMM YYYY h:mm a', + ], + + 'year' => ':count jiök', // less reliable + 'y' => ':count jiök', // less reliable + 'a_year' => ':count jiök', // less reliable + + 'month' => ':count pay', // less reliable + 'm' => ':count pay', // less reliable + 'a_month' => ':count pay', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/nyn.php b/vendor/nesbot/carbon/src/Carbon/Lang/nyn.php new file mode 100644 index 0000000..8660ea4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/nyn.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'weekdays' => ['Sande', 'Orwokubanza', 'Orwakabiri', 'Orwakashatu', 'Orwakana', 'Orwakataano', 'Orwamukaaga'], + 'weekdays_short' => ['SAN', 'ORK', 'OKB', 'OKS', 'OKN', 'OKT', 'OMK'], + 'weekdays_min' => ['SAN', 'ORK', 'OKB', 'OKS', 'OKN', 'OKT', 'OMK'], + 'months' => ['Okwokubanza', 'Okwakabiri', 'Okwakashatu', 'Okwakana', 'Okwakataana', 'Okwamukaaga', 'Okwamushanju', 'Okwamunaana', 'Okwamwenda', 'Okwaikumi', 'Okwaikumi na kumwe', 'Okwaikumi na ibiri'], + 'months_short' => ['KBZ', 'KBR', 'KST', 'KKN', 'KTN', 'KMK', 'KMS', 'KMN', 'KMW', 'KKM', 'KNK', 'KNB'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/oc.php b/vendor/nesbot/carbon/src/Carbon/Lang/oc.php new file mode 100644 index 0000000..89693e6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/oc.php @@ -0,0 +1,100 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Quentí + */ +// @codeCoverageIgnoreStart +use Symfony\Component\Translation\PluralizationRules; + +if (class_exists('Symfony\\Component\\Translation\\PluralizationRules')) { + PluralizationRules::set(function ($number) { + return $number == 1 ? 0 : 1; + }, 'oc'); +} +// @codeCoverageIgnoreEnd + +return [ + 'year' => ':count an|:count ans', + 'a_year' => 'un an|:count ans', + 'y' => ':count an|:count ans', + 'month' => ':count mes|:count meses', + 'a_month' => 'un mes|:count meses', + 'm' => ':count mes|:count meses', + 'week' => ':count setmana|:count setmanas', + 'a_week' => 'una setmana|:count setmanas', + 'w' => ':count setmana|:count setmanas', + 'day' => ':count jorn|:count jorns', + 'a_day' => 'un jorn|:count jorns', + 'd' => ':count jorn|:count jorns', + 'hour' => ':count ora|:count oras', + 'a_hour' => 'una ora|:count oras', + 'h' => ':count ora|:count oras', + 'minute' => ':count minuta|:count minutas', + 'a_minute' => 'una minuta|:count minutas', + 'min' => ':count minuta|:count minutas', + 'second' => ':count segonda|:count segondas', + 'a_second' => 'una segonda|:count segondas', + 's' => ':count segonda|:count segondas', + 'ago' => 'fa :time', + 'from_now' => 'd\'aquí :time', + 'after' => ':time aprèp', + 'before' => ':time abans', + 'diff_now' => 'ara meteis', + 'diff_today' => 'Uèi', + 'diff_today_regexp' => 'Uèi(?:\\s+a)?', + 'diff_yesterday' => 'ièr', + 'diff_yesterday_regexp' => 'Ièr(?:\\s+a)?', + 'diff_tomorrow' => 'deman', + 'diff_tomorrow_regexp' => 'Deman(?:\\s+a)?', + 'diff_before_yesterday' => 'ièr delà', + 'diff_after_tomorrow' => 'deman passat', + 'period_recurrences' => ':count còp|:count còps', + 'period_interval' => 'cada :interval', + 'period_start_date' => 'de :date', + 'period_end_date' => 'fins a :date', + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM [de] YYYY', + 'LLL' => 'D MMMM [de] YYYY [a] H:mm', + 'LLLL' => 'dddd D MMMM [de] YYYY [a] H:mm', + ], + 'calendar' => [ + 'sameDay' => '[Uèi a] LT', + 'nextDay' => '[Deman a] LT', + 'nextWeek' => 'dddd [a] LT', + 'lastDay' => '[Ièr a] LT', + 'lastWeek' => 'dddd [passat a] LT', + 'sameElse' => 'L', + ], + 'months' => ['de genièr', 'de febrièr', 'de març', 'd\'abrial', 'de mai', 'de junh', 'de julhet', 'd\'agost', 'de setembre', 'd’octòbre', 'de novembre', 'de decembre'], + 'months_standalone' => ['genièr', 'febrièr', 'març', 'abrial', 'mai', 'junh', 'julh', 'agost', 'setembre', 'octòbre', 'novembre', 'decembre'], + 'months_short' => ['gen.', 'feb.', 'març', 'abr.', 'mai', 'junh', 'julh', 'ago.', 'sep.', 'oct.', 'nov.', 'dec.'], + 'weekdays' => ['dimenge', 'diluns', 'dimars', 'dimècres', 'dijòus', 'divendres', 'dissabte'], + 'weekdays_short' => ['dg', 'dl', 'dm', 'dc', 'dj', 'dv', 'ds'], + 'weekdays_min' => ['dg', 'dl', 'dm', 'dc', 'dj', 'dv', 'ds'], + 'ordinal' => function ($number, string $period = '') { + $ordinal = [1 => 'èr', 2 => 'nd'][(int) $number] ?? 'en'; + + // feminine for year, week, hour, minute, second + if (preg_match('/^[yYwWhHgGis]$/', $period)) { + $ordinal .= 'a'; + } + + return $number.$ordinal; + }, + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' e '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/oc_FR.php b/vendor/nesbot/carbon/src/Carbon/Lang/oc_FR.php new file mode 100644 index 0000000..01eb5c1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/oc_FR.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/oc.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/om.php b/vendor/nesbot/carbon/src/Carbon/Lang/om.php new file mode 100644 index 0000000..b8d5a0b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/om.php @@ -0,0 +1,60 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation & Sagalee Oromoo Publishing Co. Inc. locales@geez.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'dd-MMM-YYYY', + 'LLL' => 'dd MMMM YYYY HH:mm', + 'LLLL' => 'dddd, MMMM D, YYYY HH:mm', + ], + 'months' => ['Amajjii', 'Guraandhala', 'Bitooteessa', 'Elba', 'Caamsa', 'Waxabajjii', 'Adooleessa', 'Hagayya', 'Fuulbana', 'Onkololeessa', 'Sadaasa', 'Muddee'], + 'months_short' => ['Ama', 'Gur', 'Bit', 'Elb', 'Cam', 'Wax', 'Ado', 'Hag', 'Ful', 'Onk', 'Sad', 'Mud'], + 'weekdays' => ['Dilbata', 'Wiixata', 'Qibxata', 'Roobii', 'Kamiisa', 'Jimaata', 'Sanbata'], + 'weekdays_short' => ['Dil', 'Wix', 'Qib', 'Rob', 'Kam', 'Jim', 'San'], + 'weekdays_min' => ['Dil', 'Wix', 'Qib', 'Rob', 'Kam', 'Jim', 'San'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['WD', 'WB'], + + 'year' => 'wggoota :count', + 'y' => 'wggoota :count', + 'a_year' => 'wggoota :count', + + 'month' => 'ji’a :count', + 'm' => 'ji’a :count', + 'a_month' => 'ji’a :count', + + 'week' => 'torban :count', + 'w' => 'torban :count', + 'a_week' => 'torban :count', + + 'day' => 'guyyaa :count', + 'd' => 'guyyaa :count', + 'a_day' => 'guyyaa :count', + + 'hour' => 'saʼaatii :count', + 'h' => 'saʼaatii :count', + 'a_hour' => 'saʼaatii :count', + + 'minute' => 'daqiiqaa :count', + 'min' => 'daqiiqaa :count', + 'a_minute' => 'daqiiqaa :count', + + 'second' => 'sekoondii :count', + 's' => 'sekoondii :count', + 'a_second' => 'sekoondii :count', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/om_ET.php b/vendor/nesbot/carbon/src/Carbon/Lang/om_ET.php new file mode 100644 index 0000000..044760e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/om_ET.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/om.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/om_KE.php b/vendor/nesbot/carbon/src/Carbon/Lang/om_KE.php new file mode 100644 index 0000000..f5a4d1c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/om_KE.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/om.php', [ + 'day_of_first_week_of_year' => 0, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/or.php b/vendor/nesbot/carbon/src/Carbon/Lang/or.php new file mode 100644 index 0000000..3aa7173 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/or.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/or_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/or_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/or_IN.php new file mode 100644 index 0000000..57a89f5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/or_IN.php @@ -0,0 +1,51 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM AP Linux Technology Center, Yamato Software Laboratory bug-glibc@gnu.org + */ +return [ + 'diff_now' => 'ବର୍ତ୍ତମାନ', + 'diff_yesterday' => 'ଗତକାଲି', + 'diff_tomorrow' => 'ଆସନ୍ତାକାଲି', + 'formats' => [ + 'LT' => 'Oh:Om A', + 'LTS' => 'Oh:Om:Os A', + 'L' => 'OD-OM-OY', + 'LL' => 'OD MMMM OY', + 'LLL' => 'OD MMMM OY Oh:Om A', + 'LLLL' => 'dddd OD MMMM OY Oh:Om A', + ], + 'months' => ['ଜାନୁଆରୀ', 'ଫେବୃଆରୀ', 'ମାର୍ଚ୍ଚ', 'ଅପ୍ରେଲ', 'ମଇ', 'ଜୁନ', 'ଜୁଲାଇ', 'ଅଗଷ୍ଟ', 'ସେପ୍ଟେମ୍ବର', 'ଅକ୍ଟୋବର', 'ନଭେମ୍ବର', 'ଡିସେମ୍ବର'], + 'months_short' => ['ଜାନୁଆରୀ', 'ଫେବୃଆରୀ', 'ମାର୍ଚ୍ଚ', 'ଅପ୍ରେଲ', 'ମଇ', 'ଜୁନ', 'ଜୁଲାଇ', 'ଅଗଷ୍ଟ', 'ସେପ୍ଟେମ୍ବର', 'ଅକ୍ଟୋବର', 'ନଭେମ୍ବର', 'ଡିସେମ୍ବର'], + 'weekdays' => ['ରବିବାର', 'ସୋମବାର', 'ମଙ୍ଗଳବାର', 'ବୁଧବାର', 'ଗୁରୁବାର', 'ଶୁକ୍ରବାର', 'ଶନିବାର'], + 'weekdays_short' => ['ରବି', 'ସୋମ', 'ମଙ୍ଗଳ', 'ବୁଧ', 'ଗୁରୁ', 'ଶୁକ୍ର', 'ଶନି'], + 'weekdays_min' => ['ରବି', 'ସୋମ', 'ମଙ୍ଗଳ', 'ବୁଧ', 'ଗୁରୁ', 'ଶୁକ୍ର', 'ଶନି'], + 'day_of_first_week_of_year' => 1, + 'alt_numbers' => ['୦', '୧', '୨', '୩', '୪', '୫', '୬', '୭', '୮', '୯', '୧୦', '୧୧', '୧୨', '୧୩', '୧୪', '୧୫', '୧୬', '୧୭', '୧୮', '୧୯', '୨୦', '୨୧', '୨୨', '୨୩', '୨୪', '୨୫', '୨୬', '୨୭', '୨୮', '୨୯', '୩୦', '୩୧', '୩୨', '୩୩', '୩୪', '୩୫', '୩୬', '୩୭', '୩୮', '୩୯', '୪୦', '୪୧', '୪୨', '୪୩', '୪୪', '୪୫', '୪୬', '୪୭', '୪୮', '୪୯', '୫୦', '୫୧', '୫୨', '୫୩', '୫୪', '୫୫', '୫୬', '୫୭', '୫୮', '୫୯', '୬୦', '୬୧', '୬୨', '୬୩', '୬୪', '୬୫', '୬୬', '୬୭', '୬୮', '୬୯', '୭୦', '୭୧', '୭୨', '୭୩', '୭୪', '୭୫', '୭୬', '୭୭', '୭୮', '୭୯', '୮୦', '୮୧', '୮୨', '୮୩', '୮୪', '୮୫', '୮୬', '୮୭', '୮୮', '୮୯', '୯୦', '୯୧', '୯୨', '୯୩', '୯୪', '୯୫', '୯୬', '୯୭', '୯୮', '୯୯'], + 'year' => ':count ବର୍ଷ', + 'y' => ':count ବ.', + 'month' => ':count ମାସ', + 'm' => ':count ମା.', + 'week' => ':count ସପ୍ତାହ', + 'w' => ':count ସପ୍ତା.', + 'day' => ':count ଦିନ', + 'd' => ':count ଦିନ', + 'hour' => ':count ଘଣ୍ତ', + 'h' => ':count ଘ.', + 'minute' => ':count ମିନଟ', + 'min' => ':count ମି.', + 'second' => ':count ସେକଣ୍ଢ', + 's' => ':count ସେ.', + 'ago' => ':time ପୂର୍ବେ', + 'from_now' => ':timeରେ', +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/os.php b/vendor/nesbot/carbon/src/Carbon/Lang/os.php new file mode 100644 index 0000000..5f55e8a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/os.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/os_RU.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/os_RU.php b/vendor/nesbot/carbon/src/Carbon/Lang/os_RU.php new file mode 100644 index 0000000..9592d15 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/os_RU.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], + 'months' => ['январы', 'февралы', 'мартъийы', 'апрелы', 'майы', 'июны', 'июлы', 'августы', 'сентябры', 'октябры', 'ноябры', 'декабры'], + 'months_short' => ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'], + 'weekdays' => ['Хуыцаубон', 'Къуырисæр', 'Дыццæг', 'Æртыццæг', 'Цыппæрæм', 'Майрæмбон', 'Сабат'], + 'weekdays_short' => ['Хцб', 'Крс', 'Дцг', 'Æрт', 'Цпр', 'Мрб', 'Сбт'], + 'weekdays_min' => ['Хцб', 'Крс', 'Дцг', 'Æрт', 'Цпр', 'Мрб', 'Сбт'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + + 'minute' => ':count гыццыл', // less reliable + 'min' => ':count гыццыл', // less reliable + 'a_minute' => ':count гыццыл', // less reliable + + 'second' => ':count æндæр', // less reliable + 's' => ':count æндæр', // less reliable + 'a_second' => ':count æндæр', // less reliable + + 'year' => ':count аз', + 'y' => ':count аз', + 'a_year' => ':count аз', + + 'month' => ':count мӕй', + 'm' => ':count мӕй', + 'a_month' => ':count мӕй', + + 'week' => ':count къуыри', + 'w' => ':count къуыри', + 'a_week' => ':count къуыри', + + 'day' => ':count бон', + 'd' => ':count бон', + 'a_day' => ':count бон', + + 'hour' => ':count сахат', + 'h' => ':count сахат', + 'a_hour' => ':count сахат', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pa.php b/vendor/nesbot/carbon/src/Carbon/Lang/pa.php new file mode 100644 index 0000000..48b2033 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pa.php @@ -0,0 +1,76 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Philippe Vaucher + * - Tsutomu Kuroda + * - Punjab + */ +return [ + 'year' => 'ਇੱਕ ਸਾਲ|:count ਸਾਲ', + 'month' => 'ਇੱਕ ਮਹੀਨਾ|:count ਮਹੀਨੇ', + 'week' => 'ਹਫਤਾ|:count ਹਫ਼ਤੇ', + 'day' => 'ਇੱਕ ਦਿਨ|:count ਦਿਨ', + 'hour' => 'ਇੱਕ ਘੰਟਾ|:count ਘੰਟੇ', + 'minute' => 'ਇਕ ਮਿੰਟ|:count ਮਿੰਟ', + 'second' => 'ਕੁਝ ਸਕਿੰਟ|:count ਸਕਿੰਟ', + 'ago' => ':time ਪਹਿਲਾਂ', + 'from_now' => ':time ਵਿੱਚ', + 'before' => ':time ਤੋਂ ਪਹਿਲਾਂ', + 'after' => ':time ਤੋਂ ਬਾਅਦ', + 'diff_now' => 'ਹੁਣ', + 'diff_today' => 'ਅਜ', + 'diff_yesterday' => 'ਕਲ', + 'diff_tomorrow' => 'ਕਲ', + 'formats' => [ + 'LT' => 'A h:mm ਵਜੇ', + 'LTS' => 'A h:mm:ss ਵਜੇ', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY, A h:mm ਵਜੇ', + 'LLLL' => 'dddd, D MMMM YYYY, A h:mm ਵਜੇ', + ], + 'calendar' => [ + 'sameDay' => '[ਅਜ] LT', + 'nextDay' => '[ਕਲ] LT', + 'nextWeek' => '[ਅਗਲਾ] dddd, LT', + 'lastDay' => '[ਕਲ] LT', + 'lastWeek' => '[ਪਿਛਲੇ] dddd, LT', + 'sameElse' => 'L', + ], + 'meridiem' => function ($hour) { + if ($hour < 4) { + return 'ਰਾਤ'; + } + if ($hour < 10) { + return 'ਸਵੇਰ'; + } + if ($hour < 17) { + return 'ਦੁਪਹਿਰ'; + } + if ($hour < 20) { + return 'ਸ਼ਾਮ'; + } + + return 'ਰਾਤ'; + }, + 'months' => ['ਜਨਵਰੀ', 'ਫ਼ਰਵਰੀ', 'ਮਾਰਚ', 'ਅਪ੍ਰੈਲ', 'ਮਈ', 'ਜੂਨ', 'ਜੁਲਾਈ', 'ਅਗਸਤ', 'ਸਤੰਬਰ', 'ਅਕਤੂਬਰ', 'ਨਵੰਬਰ', 'ਦਸੰਬਰ'], + 'months_short' => ['ਜਨਵਰੀ', 'ਫ਼ਰਵਰੀ', 'ਮਾਰਚ', 'ਅਪ੍ਰੈਲ', 'ਮਈ', 'ਜੂਨ', 'ਜੁਲਾਈ', 'ਅਗਸਤ', 'ਸਤੰਬਰ', 'ਅਕਤੂਬਰ', 'ਨਵੰਬਰ', 'ਦਸੰਬਰ'], + 'weekdays' => ['ਐਤਵਾਰ', 'ਸੋਮਵਾਰ', 'ਮੰਗਲਵਾਰ', 'ਬੁਧਵਾਰ', 'ਵੀਰਵਾਰ', 'ਸ਼ੁੱਕਰਵਾਰ', 'ਸ਼ਨੀਚਰਵਾਰ'], + 'weekdays_short' => ['ਐਤ', 'ਸੋਮ', 'ਮੰਗਲ', 'ਬੁਧ', 'ਵੀਰ', 'ਸ਼ੁਕਰ', 'ਸ਼ਨੀ'], + 'weekdays_min' => ['ਐਤ', 'ਸੋਮ', 'ਮੰਗਲ', 'ਬੁਧ', 'ਵੀਰ', 'ਸ਼ੁਕਰ', 'ਸ਼ਨੀ'], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' ਅਤੇ '], + 'weekend' => [0, 0], + 'alt_numbers' => ['੦', '੧', '੨', '੩', '੪', '੫', '੬', '੭', '੮', '੯'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pa_Arab.php b/vendor/nesbot/carbon/src/Carbon/Lang/pa_Arab.php new file mode 100644 index 0000000..39b0653 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pa_Arab.php @@ -0,0 +1,26 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ur.php', [ + 'weekdays' => ['اتوار', 'پیر', 'منگل', 'بُدھ', 'جمعرات', 'جمعہ', 'ہفتہ'], + 'weekdays_short' => ['اتوار', 'پیر', 'منگل', 'بُدھ', 'جمعرات', 'جمعہ', 'ہفتہ'], + 'weekdays_min' => ['اتوار', 'پیر', 'منگل', 'بُدھ', 'جمعرات', 'جمعہ', 'ہفتہ'], + 'months' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئ', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], + 'months_short' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئ', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm a', + 'LLLL' => 'dddd, DD MMMM YYYY h:mm a', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pa_Guru.php b/vendor/nesbot/carbon/src/Carbon/Lang/pa_Guru.php new file mode 100644 index 0000000..7adff5c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pa_Guru.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/pa.php', [ + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'D/M/yy', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY, h:mm a', + 'LLLL' => 'dddd, D MMMM YYYY, h:mm a', + ], + 'months' => ['ਜਨਵਰੀ', 'ਫ਼ਰਵਰੀ', 'ਮਾਰਚ', 'ਅਪ੍ਰੈਲ', 'ਮਈ', 'ਜੂਨ', 'ਜੁਲਾਈ', 'ਅਗਸਤ', 'ਸਤੰਬਰ', 'ਅਕਤੂਬਰ', 'ਨਵੰਬਰ', 'ਦਸੰਬਰ'], + 'months_short' => ['ਜਨ', 'ਫ਼ਰ', 'ਮਾਰਚ', 'ਅਪ੍ਰੈ', 'ਮਈ', 'ਜੂਨ', 'ਜੁਲਾ', 'ਅਗ', 'ਸਤੰ', 'ਅਕਤੂ', 'ਨਵੰ', 'ਦਸੰ'], + 'weekdays' => ['ਐਤਵਾਰ', 'ਸੋਮਵਾਰ', 'ਮੰਗਲਵਾਰ', 'ਬੁੱਧਵਾਰ', 'ਵੀਰਵਾਰ', 'ਸ਼ੁੱਕਰਵਾਰ', 'ਸ਼ਨਿੱਚਰਵਾਰ'], + 'weekdays_short' => ['ਐਤ', 'ਸੋਮ', 'ਮੰਗਲ', 'ਬੁੱਧ', 'ਵੀਰ', 'ਸ਼ੁੱਕਰ', 'ਸ਼ਨਿੱਚਰ'], + 'weekdays_min' => ['ਐਤ', 'ਸੋਮ', 'ਮੰਗ', 'ਬੁੱਧ', 'ਵੀਰ', 'ਸ਼ੁੱਕ', 'ਸ਼ਨਿੱ'], + 'weekend' => [0, 0], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pa_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/pa_IN.php new file mode 100644 index 0000000..ca67642 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pa_IN.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Guo Xiang Tan + * - Josh Soref + * - Ash + * - harpreetkhalsagtbit + */ +return require __DIR__.'/pa.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pa_PK.php b/vendor/nesbot/carbon/src/Carbon/Lang/pa_PK.php new file mode 100644 index 0000000..f9af11c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pa_PK.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['جنوري', 'فروري', 'مارچ', 'اپريل', 'مٓی', 'جون', 'جولاي', 'اگست', 'ستمبر', 'اكتوبر', 'نومبر', 'دسمبر'], + 'months_short' => ['جنوري', 'فروري', 'مارچ', 'اپريل', 'مٓی', 'جون', 'جولاي', 'اگست', 'ستمبر', 'اكتوبر', 'نومبر', 'دسمبر'], + 'weekdays' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], + 'weekdays_short' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], + 'weekdays_min' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['ص', 'ش'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pap.php b/vendor/nesbot/carbon/src/Carbon/Lang/pap.php new file mode 100644 index 0000000..b4c1706 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pap.php @@ -0,0 +1,39 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return [ + 'formats' => [ + 'LT' => 'HH.mm', + 'LTS' => 'HH.mm:ss', + 'L' => 'DD-MM-YY', + 'LL' => 'MMMM [di] DD, YYYY', + 'LLL' => 'DD MMM HH.mm', + 'LLLL' => 'MMMM DD, YYYY HH.mm', + ], + 'months' => ['yanüari', 'febrüari', 'mart', 'aprel', 'mei', 'yüni', 'yüli', 'ougùstùs', 'sèptèmber', 'oktober', 'novèmber', 'desèmber'], + 'months_short' => ['yan', 'feb', 'mar', 'apr', 'mei', 'yün', 'yül', 'oug', 'sèp', 'okt', 'nov', 'des'], + 'weekdays' => ['djadomingo', 'djaluna', 'djamars', 'djawebs', 'djarason', 'djabierne', 'djasabra'], + 'weekdays_short' => ['do', 'lu', 'ma', 'we', 'ra', 'bi', 'sa'], + 'weekdays_min' => ['do', 'lu', 'ma', 'we', 'ra', 'bi', 'sa'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'year' => ':count aña', + 'month' => ':count luna', + 'week' => ':count siman', + 'day' => ':count dia', + 'hour' => ':count ora', + 'minute' => ':count minüt', + 'second' => ':count sekònde', + 'list' => [', ', ' i '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pap_AW.php b/vendor/nesbot/carbon/src/Carbon/Lang/pap_AW.php new file mode 100644 index 0000000..e9a48ff --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pap_AW.php @@ -0,0 +1,16 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - information from native speaker Pablo Saratxaga pablo@mandrakesoft.com + */ +return require __DIR__.'/pap.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pap_CW.php b/vendor/nesbot/carbon/src/Carbon/Lang/pap_CW.php new file mode 100644 index 0000000..e9a48ff --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pap_CW.php @@ -0,0 +1,16 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - information from native speaker Pablo Saratxaga pablo@mandrakesoft.com + */ +return require __DIR__.'/pap.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pl.php b/vendor/nesbot/carbon/src/Carbon/Lang/pl.php new file mode 100644 index 0000000..f0196c0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pl.php @@ -0,0 +1,126 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Wacław Jacek + * - François B + * - Tim Fish + * - Serhan Apaydın + * - Massimiliano Caniparoli + * - JD Isaacks + * - Jakub Szwacz + * - Jan + * - Paul + * - damlys + * - Marek (marast78) + * - Peter (UnrulyNatives) + * - Qrzysio + * - Jan (aso824) + * - diverpl + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => ':count rok|:count lata|:count lat', + 'a_year' => 'rok|:count lata|:count lat', + 'y' => ':count r|:count l|:count l', + 'month' => ':count miesiąc|:count miesiące|:count miesięcy', + 'a_month' => 'miesiąc|:count miesiące|:count miesięcy', + 'm' => ':count mies.', + 'week' => ':count tydzień|:count tygodnie|:count tygodni', + 'a_week' => 'tydzień|:count tygodnie|:count tygodni', + 'w' => ':count tyg.', + 'day' => ':count dzień|:count dni|:count dni', + 'a_day' => 'dzień|:count dni|:count dni', + 'd' => ':count d', + 'hour' => ':count godzina|:count godziny|:count godzin', + 'a_hour' => 'godzina|:count godziny|:count godzin', + 'h' => ':count godz.', + 'minute' => ':count minuta|:count minuty|:count minut', + 'a_minute' => 'minuta|:count minuty|:count minut', + 'min' => ':count min', + 'second' => ':count sekunda|:count sekundy|:count sekund', + 'a_second' => '{1}kilka sekund|:count sekunda|:count sekundy|:count sekund', + 's' => ':count sek.', + 'ago' => ':time temu', + 'from_now' => static function ($time) { + return 'za '.strtr($time, [ + 'godzina' => 'godzinę', + 'minuta' => 'minutę', + 'sekunda' => 'sekundę', + ]); + }, + 'after' => ':time po', + 'before' => ':time przed', + 'diff_now' => 'przed chwilą', + 'diff_today' => 'Dziś', + 'diff_today_regexp' => 'Dziś(?:\\s+o)?', + 'diff_yesterday' => 'wczoraj', + 'diff_yesterday_regexp' => 'Wczoraj(?:\\s+o)?', + 'diff_tomorrow' => 'jutro', + 'diff_tomorrow_regexp' => 'Jutro(?:\\s+o)?', + 'diff_before_yesterday' => 'przedwczoraj', + 'diff_after_tomorrow' => 'pojutrze', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Dziś o] LT', + 'nextDay' => '[Jutro o] LT', + 'nextWeek' => function (CarbonInterface $date) { + switch ($date->dayOfWeek) { + case 0: + return '[W niedzielę o] LT'; + case 2: + return '[We wtorek o] LT'; + case 3: + return '[W środę o] LT'; + case 6: + return '[W sobotę o] LT'; + default: + return '[W] dddd [o] LT'; + } + }, + 'lastDay' => '[Wczoraj o] LT', + 'lastWeek' => function (CarbonInterface $date) { + switch ($date->dayOfWeek) { + case 0: + return '[W zeszłą niedzielę o] LT'; + case 3: + return '[W zeszłą środę o] LT'; + case 6: + return '[W zeszłą sobotę o] LT'; + default: + return '[W zeszły] dddd [o] LT'; + } + }, + 'sameElse' => 'L', + ], + 'ordinal' => ':number.', + 'months' => ['stycznia', 'lutego', 'marca', 'kwietnia', 'maja', 'czerwca', 'lipca', 'sierpnia', 'września', 'października', 'listopada', 'grudnia'], + 'months_standalone' => ['styczeń', 'luty', 'marzec', 'kwiecień', 'maj', 'czerwiec', 'lipiec', 'sierpień', 'wrzesień', 'październik', 'listopad', 'grudzień'], + 'months_short' => ['sty', 'lut', 'mar', 'kwi', 'maj', 'cze', 'lip', 'sie', 'wrz', 'paź', 'lis', 'gru'], + 'months_regexp' => '/(DD?o?\.?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', + 'weekdays' => ['niedziela', 'poniedziałek', 'wtorek', 'środa', 'czwartek', 'piątek', 'sobota'], + 'weekdays_short' => ['ndz', 'pon', 'wt', 'śr', 'czw', 'pt', 'sob'], + 'weekdays_min' => ['Nd', 'Pn', 'Wt', 'Śr', 'Cz', 'Pt', 'So'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' i '], + 'meridiem' => ['przed południem', 'po południu'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pl_PL.php b/vendor/nesbot/carbon/src/Carbon/Lang/pl_PL.php new file mode 100644 index 0000000..222bcdb --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pl_PL.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/pl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/prg.php b/vendor/nesbot/carbon/src/Carbon/Lang/prg.php new file mode 100644 index 0000000..6e63f4a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/prg.php @@ -0,0 +1,52 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'months' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], + 'months_short' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY-MM-dd', + 'LL' => 'YYYY MMM D', + 'LLL' => 'YYYY MMMM D HH:mm', + 'LLLL' => 'YYYY MMMM D, dddd HH:mm', + ], + + 'year' => ':count meta', + 'y' => ':count meta', + 'a_year' => ':count meta', + + 'month' => ':count mēniks', // less reliable + 'm' => ':count mēniks', // less reliable + 'a_month' => ':count mēniks', // less reliable + + 'week' => ':count sawaītin', // less reliable + 'w' => ':count sawaītin', // less reliable + 'a_week' => ':count sawaītin', // less reliable + + 'day' => ':count di', + 'd' => ':count di', + 'a_day' => ':count di', + + 'hour' => ':count bruktēt', // less reliable + 'h' => ':count bruktēt', // less reliable + 'a_hour' => ':count bruktēt', // less reliable + + 'minute' => ':count līkuts', // less reliable + 'min' => ':count līkuts', // less reliable + 'a_minute' => ':count līkuts', // less reliable + + 'second' => ':count kitan', // less reliable + 's' => ':count kitan', // less reliable + 'a_second' => ':count kitan', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ps.php b/vendor/nesbot/carbon/src/Carbon/Lang/ps.php new file mode 100644 index 0000000..a928b28 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ps.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Muhammad Nasir Rahimi + * - Nassim Nasibullah (spinzar) + */ +return [ + 'year' => ':count کال|:count کاله', + 'y' => ':countکال|:countکاله', + 'month' => ':count مياشت|:count مياشتي', + 'm' => ':countمياشت|:countمياشتي', + 'week' => ':count اونۍ|:count اونۍ', + 'w' => ':countاونۍ|:countاونۍ', + 'day' => ':count ورځ|:count ورځي', + 'd' => ':countورځ|:countورځي', + 'hour' => ':count ساعت|:count ساعته', + 'h' => ':countساعت|:countساعته', + 'minute' => ':count دقيقه|:count دقيقې', + 'min' => ':countدقيقه|:countدقيقې', + 'second' => ':count ثانيه|:count ثانيې', + 's' => ':countثانيه|:countثانيې', + 'ago' => ':time دمخه', + 'from_now' => ':time له اوس څخه', + 'after' => ':time وروسته', + 'before' => ':time دمخه', + 'list' => ['، ', ' او '], + 'meridiem' => ['غ.م.', 'غ.و.'], + 'weekdays' => ['اتوار', 'ګل', 'نهه', 'شورو', 'زيارت', 'جمعه', 'خالي'], + 'weekdays_short' => ['ا', 'ګ', 'ن', 'ش', 'ز', 'ج', 'خ'], + 'weekdays_min' => ['ا', 'ګ', 'ن', 'ش', 'ز', 'ج', 'خ'], + 'months' => ['جنوري', 'فبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سېپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'], + 'months_short' => ['جنوري', 'فبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سېپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'], + 'months_standalone' => ['جنوري', 'فېبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'], + 'months_short_standalone' => ['جنوري', 'فبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'], + 'first_day_of_week' => 6, + 'weekend' => [4, 5], + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'YYYY/M/d', + 'LL' => 'YYYY MMM D', + 'LLL' => 'د YYYY د MMMM D H:mm', + 'LLLL' => 'dddd د YYYY د MMMM D H:mm', + ], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ps_AF.php b/vendor/nesbot/carbon/src/Carbon/Lang/ps_AF.php new file mode 100644 index 0000000..6ec5180 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ps_AF.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ps.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt.php new file mode 100644 index 0000000..bb6359b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pt.php @@ -0,0 +1,116 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Cassiano Montanari + * - Matt Pope + * - François B + * - Prodis + * - JD Isaacks + * - Raphael Amorim + * - João Magalhães + * - victortobias + * - Paulo Freitas + * - Sebastian Thierer + * - Claudson Martins (claudsonm) + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => ':count ano|:count anos', + 'a_year' => 'um ano|:count anos', + 'y' => ':counta', + 'month' => ':count mês|:count meses', + 'a_month' => 'um mês|:count meses', + 'm' => ':countm', + 'week' => ':count semana|:count semanas', + 'a_week' => 'uma semana|:count semanas', + 'w' => ':countsem', + 'day' => ':count dia|:count dias', + 'a_day' => 'um dia|:count dias', + 'd' => ':countd', + 'hour' => ':count hora|:count horas', + 'a_hour' => 'uma hora|:count horas', + 'h' => ':counth', + 'minute' => ':count minuto|:count minutos', + 'a_minute' => 'um minuto|:count minutos', + 'min' => ':countmin', + 'second' => ':count segundo|:count segundos', + 'a_second' => 'alguns segundos|:count segundos', + 's' => ':counts', + 'millisecond' => ':count milissegundo|:count milissegundos', + 'a_millisecond' => 'um milissegundo|:count milissegundos', + 'ms' => ':countms', + 'microsecond' => ':count microssegundo|:count microssegundos', + 'a_microsecond' => 'um microssegundo|:count microssegundos', + 'µs' => ':countµs', + 'ago' => 'há :time', + 'from_now' => 'em :time', + 'after' => ':time depois', + 'before' => ':time antes', + 'diff_now' => 'agora', + 'diff_today' => 'Hoje', + 'diff_today_regexp' => 'Hoje(?:\\s+às)?', + 'diff_yesterday' => 'ontem', + 'diff_yesterday_regexp' => 'Ontem(?:\\s+às)?', + 'diff_tomorrow' => 'amanhã', + 'diff_tomorrow_regexp' => 'Amanhã(?:\\s+às)?', + 'diff_before_yesterday' => 'anteontem', + 'diff_after_tomorrow' => 'depois de amanhã', + 'period_recurrences' => 'uma vez|:count vezes', + 'period_interval' => 'cada :interval', + 'period_start_date' => 'de :date', + 'period_end_date' => 'até :date', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D [de] MMMM [de] YYYY', + 'LLL' => 'D [de] MMMM [de] YYYY HH:mm', + 'LLLL' => 'dddd, D [de] MMMM [de] YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Hoje às] LT', + 'nextDay' => '[Amanhã às] LT', + 'nextWeek' => 'dddd [às] LT', + 'lastDay' => '[Ontem às] LT', + 'lastWeek' => function (CarbonInterface $date) { + switch ($date->dayOfWeek) { + case 0: + case 6: + return '[Último] dddd [às] LT'; + default: + return '[Última] dddd [às] LT'; + } + }, + 'sameElse' => 'L', + ], + 'ordinal' => ':numberº', + 'months' => ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'], + 'months_short' => ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'], + 'weekdays' => ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'], + 'weekdays_short' => ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'], + 'weekdays_min' => ['Do', '2ª', '3ª', '4ª', '5ª', '6ª', 'Sá'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' e '], + 'ordinal_words' => [ + 'of' => 'de', + 'first' => 'primeira', + 'second' => 'segunda', + 'third' => 'terceira', + 'fourth' => 'quarta', + 'fifth' => 'quinta', + 'last' => 'última', + ], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_AO.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_AO.php new file mode 100644 index 0000000..22c01ec --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pt_AO.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/pt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php new file mode 100644 index 0000000..e917c5c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php @@ -0,0 +1,39 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Cassiano Montanari + * - Eduardo Dalla Vecchia + * - David Rodrigues + * - Matt Pope + * - François B + * - Prodis + * - Marlon Maxwel + * - JD Isaacks + * - Raphael Amorim + * - Rafael Raupp + * - felipeleite1 + * - swalker + * - Lucas Macedo + * - Paulo Freitas + * - Sebastian Thierer + */ +return array_replace_recursive(require __DIR__.'/pt.php', [ + 'period_recurrences' => 'uma|:count vez', + 'period_interval' => 'toda :interval', + 'formats' => [ + 'LLL' => 'D [de] MMMM [de] YYYY [às] HH:mm', + 'LLLL' => 'dddd, D [de] MMMM [de] YYYY [às] HH:mm', + ], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_CH.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_CH.php new file mode 100644 index 0000000..22c01ec --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pt_CH.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/pt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_CV.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_CV.php new file mode 100644 index 0000000..22c01ec --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pt_CV.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/pt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_GQ.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_GQ.php new file mode 100644 index 0000000..22c01ec --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pt_GQ.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/pt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_GW.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_GW.php new file mode 100644 index 0000000..22c01ec --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pt_GW.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/pt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_LU.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_LU.php new file mode 100644 index 0000000..22c01ec --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pt_LU.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/pt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_MO.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_MO.php new file mode 100644 index 0000000..f2b5eab --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pt_MO.php @@ -0,0 +1,20 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/pt.php', [ + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'LLL' => 'D [de] MMMM [de] YYYY, h:mm a', + 'LLLL' => 'dddd, D [de] MMMM [de] YYYY, h:mm a', + ], + 'first_day_of_week' => 0, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_MZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_MZ.php new file mode 100644 index 0000000..fbc0c97 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pt_MZ.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/pt.php', [ + 'first_day_of_week' => 0, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_PT.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_PT.php new file mode 100644 index 0000000..2a76fc1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pt_PT.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RAP bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/pt.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'], + 'months_short' => ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'], + 'weekdays' => ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'], + 'weekdays_short' => ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'], + 'weekdays_min' => ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_ST.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_ST.php new file mode 100644 index 0000000..22c01ec --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pt_ST.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/pt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/pt_TL.php b/vendor/nesbot/carbon/src/Carbon/Lang/pt_TL.php new file mode 100644 index 0000000..22c01ec --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/pt_TL.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/pt.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/qu.php b/vendor/nesbot/carbon/src/Carbon/Lang/qu.php new file mode 100644 index 0000000..65278cd --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/qu.php @@ -0,0 +1,22 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/es_UY.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM, YYYY HH:mm', + ], + 'first_day_of_week' => 0, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/qu_BO.php b/vendor/nesbot/carbon/src/Carbon/Lang/qu_BO.php new file mode 100644 index 0000000..d5db6bf --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/qu_BO.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/qu.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/qu_EC.php b/vendor/nesbot/carbon/src/Carbon/Lang/qu_EC.php new file mode 100644 index 0000000..d5db6bf --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/qu_EC.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/qu.php', [ + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/quz.php b/vendor/nesbot/carbon/src/Carbon/Lang/quz.php new file mode 100644 index 0000000..1640c02 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/quz.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/quz_PE.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/quz_PE.php b/vendor/nesbot/carbon/src/Carbon/Lang/quz_PE.php new file mode 100644 index 0000000..d322918 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/quz_PE.php @@ -0,0 +1,54 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Sugar Labs // OLPC sugarlabs.org libc-alpha@sourceware.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['iniru', 'phiwriru', 'marsu', 'awril', 'mayu', 'huniyu', 'huliyu', 'agustu', 'siptiyimri', 'uktuwri', 'nuwiyimri', 'tisiyimri'], + 'months_short' => ['ini', 'phi', 'mar', 'awr', 'may', 'hun', 'hul', 'agu', 'sip', 'ukt', 'nuw', 'tis'], + 'weekdays' => ['tuminku', 'lunis', 'martis', 'miyirkulis', 'juywis', 'wiyirnis', 'sawatu'], + 'weekdays_short' => ['tum', 'lun', 'mar', 'miy', 'juy', 'wiy', 'saw'], + 'weekdays_min' => ['tum', 'lun', 'mar', 'miy', 'juy', 'wiy', 'saw'], + 'day_of_first_week_of_year' => 1, + + 'minute' => ':count uchuy', // less reliable + 'min' => ':count uchuy', // less reliable + 'a_minute' => ':count uchuy', // less reliable + + 'year' => ':count wata', + 'y' => ':count wata', + 'a_year' => ':count wata', + + 'month' => ':count killa', + 'm' => ':count killa', + 'a_month' => ':count killa', + + 'week' => ':count simana', + 'w' => ':count simana', + 'a_week' => ':count simana', + + 'day' => ':count pʼunchaw', + 'd' => ':count pʼunchaw', + 'a_day' => ':count pʼunchaw', + + 'hour' => ':count ura', + 'h' => ':count ura', + 'a_hour' => ':count ura', + + 'second' => ':count iskay ñiqin', + 's' => ':count iskay ñiqin', + 'a_second' => ':count iskay ñiqin', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/raj.php b/vendor/nesbot/carbon/src/Carbon/Lang/raj.php new file mode 100644 index 0000000..26138c9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/raj.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/raj_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/raj_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/raj_IN.php new file mode 100644 index 0000000..7b4589c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/raj_IN.php @@ -0,0 +1,47 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - meghrajsuthar03@gmail.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितंबर', 'अक्टूबर', 'नवंबर', 'दिसंबर'], + 'months_short' => ['जन', 'फर', 'मार्च', 'अप्रै', 'मई', 'जून', 'जुल', 'अग', 'सित', 'अक्टू', 'नव', 'दिस'], + 'weekdays' => ['रविवार', 'सोमवार', 'मंगल्लवार', 'बुधवार', 'बृहस्पतिवार', 'शुक्रवार', 'शनिवार'], + 'weekdays_short' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पति', 'शुक्र', 'शनि'], + 'weekdays_min' => ['रवि', 'सोम', 'मंगल', 'बुध', 'बृहस्पति', 'शुक्र', 'शनि'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], + + 'year' => ':count आंहू', // less reliable + 'y' => ':count आंहू', // less reliable + 'a_year' => ':count आंहू', // less reliable + + 'month' => ':count सूरज', // less reliable + 'm' => ':count सूरज', // less reliable + 'a_month' => ':count सूरज', // less reliable + + 'week' => ':count निवाज', // less reliable + 'w' => ':count निवाज', // less reliable + 'a_week' => ':count निवाज', // less reliable + + 'day' => ':count अेक', // less reliable + 'd' => ':count अेक', // less reliable + 'a_day' => ':count अेक', // less reliable + + 'hour' => ':count दुनियांण', // less reliable + 'h' => ':count दुनियांण', // less reliable + 'a_hour' => ':count दुनियांण', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/rm.php b/vendor/nesbot/carbon/src/Carbon/Lang/rm.php new file mode 100644 index 0000000..1843f45 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/rm.php @@ -0,0 +1,51 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Philippe Vaucher + * - tjku + * - Max Melentiev + * - Juanito Fatas + * - Tsutomu Kuroda + * - Akira Matsuda + * - Christopher Dell + * - Enrique Vidal + * - Simone Carletti + * - Aaron Patterson + * - Nicolás Hock Isaza + * - sebastian de castelberg + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'Do MMMM YYYY', + 'LLL' => 'Do MMMM, HH:mm [Uhr]', + 'LLLL' => 'dddd, Do MMMM YYYY, HH:mm [Uhr]', + ], + 'year' => ':count onn|:count onns', + 'month' => ':count mais', + 'week' => ':count emna|:count emnas', + 'day' => ':count di|:count dis', + 'hour' => ':count oura|:count ouras', + 'minute' => ':count minuta|:count minutas', + 'second' => ':count secunda|:count secundas', + 'weekdays' => ['dumengia', 'glindesdi', 'mardi', 'mesemna', 'gievgia', 'venderdi', 'sonda'], + 'weekdays_short' => ['du', 'gli', 'ma', 'me', 'gie', 've', 'so'], + 'weekdays_min' => ['du', 'gli', 'ma', 'me', 'gie', 've', 'so'], + 'months' => ['schaner', 'favrer', 'mars', 'avrigl', 'matg', 'zercladur', 'fanadur', 'avust', 'settember', 'october', 'november', 'december'], + 'months_short' => ['schan', 'favr', 'mars', 'avr', 'matg', 'zercl', 'fan', 'avust', 'sett', 'oct', 'nov', 'dec'], + 'meridiem' => ['avantmezdi', 'suentermezdi'], + 'list' => [', ', ' e '], + 'first_day_of_week' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/rn.php b/vendor/nesbot/carbon/src/Carbon/Lang/rn.php new file mode 100644 index 0000000..8ab958e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/rn.php @@ -0,0 +1,56 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['Z.MU.', 'Z.MW.'], + 'weekdays' => ['Ku w’indwi', 'Ku wa mbere', 'Ku wa kabiri', 'Ku wa gatatu', 'Ku wa kane', 'Ku wa gatanu', 'Ku wa gatandatu'], + 'weekdays_short' => ['cu.', 'mbe.', 'kab.', 'gtu.', 'kan.', 'gnu.', 'gnd.'], + 'weekdays_min' => ['cu.', 'mbe.', 'kab.', 'gtu.', 'kan.', 'gnu.', 'gnd.'], + 'months' => ['Nzero', 'Ruhuhuma', 'Ntwarante', 'Ndamukiza', 'Rusama', 'Ruheshi', 'Mukakaro', 'Nyandagaro', 'Nyakanga', 'Gitugutu', 'Munyonyo', 'Kigarama'], + 'months_short' => ['Mut.', 'Gas.', 'Wer.', 'Mat.', 'Gic.', 'Kam.', 'Nya.', 'Kan.', 'Nze.', 'Ukw.', 'Ugu.', 'Uku.'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + + 'year' => 'imyaka :count', + 'y' => 'imyaka :count', + 'a_year' => 'imyaka :count', + + 'month' => 'amezi :count', + 'm' => 'amezi :count', + 'a_month' => 'amezi :count', + + 'week' => 'indwi :count', + 'w' => 'indwi :count', + 'a_week' => 'indwi :count', + + 'day' => 'imisi :count', + 'd' => 'imisi :count', + 'a_day' => 'imisi :count', + + 'hour' => 'amasaha :count', + 'h' => 'amasaha :count', + 'a_hour' => 'amasaha :count', + + 'minute' => 'iminuta :count', + 'min' => 'iminuta :count', + 'a_minute' => 'iminuta :count', + + 'second' => 'inguvu :count', // less reliable + 's' => 'inguvu :count', // less reliable + 'a_second' => 'inguvu :count', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ro.php b/vendor/nesbot/carbon/src/Carbon/Lang/ro.php new file mode 100644 index 0000000..868a327 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ro.php @@ -0,0 +1,77 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - JD Isaacks + * - Cătălin Georgescu + * - Valentin Ivaşcu (oriceon) + */ +return [ + 'year' => ':count an|:count ani|:count ani', + 'a_year' => 'un an|:count ani|:count ani', + 'y' => ':count a.', + 'month' => ':count lună|:count luni|:count luni', + 'a_month' => 'o lună|:count luni|:count luni', + 'm' => ':count l.', + 'week' => ':count săptămână|:count săptămâni|:count săptămâni', + 'a_week' => 'o săptămână|:count săptămâni|:count săptămâni', + 'w' => ':count săp.', + 'day' => ':count zi|:count zile|:count zile', + 'a_day' => 'o zi|:count zile|:count zile', + 'd' => ':count z.', + 'hour' => ':count oră|:count ore|:count ore', + 'a_hour' => 'o oră|:count ore|:count ore', + 'h' => ':count o.', + 'minute' => ':count minut|:count minute|:count minute', + 'a_minute' => 'un minut|:count minute|:count minute', + 'min' => ':count m.', + 'second' => ':count secundă|:count secunde|:count secunde', + 'a_second' => 'câteva secunde|:count secunde|:count secunde', + 's' => ':count sec.', + 'ago' => ':time în urmă', + 'from_now' => 'peste :time', + 'after' => 'peste :time', + 'before' => 'acum :time', + 'diff_now' => 'acum', + 'diff_today' => 'azi', + 'diff_today_regexp' => 'azi(?:\\s+la)?', + 'diff_yesterday' => 'ieri', + 'diff_yesterday_regexp' => 'ieri(?:\\s+la)?', + 'diff_tomorrow' => 'mâine', + 'diff_tomorrow_regexp' => 'mâine(?:\\s+la)?', + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY H:mm', + 'LLLL' => 'dddd, D MMMM YYYY H:mm', + ], + 'calendar' => [ + 'sameDay' => '[azi la] LT', + 'nextDay' => '[mâine la] LT', + 'nextWeek' => 'dddd [la] LT', + 'lastDay' => '[ieri la] LT', + 'lastWeek' => '[fosta] dddd [la] LT', + 'sameElse' => 'L', + ], + 'months' => ['ianuarie', 'februarie', 'martie', 'aprilie', 'mai', 'iunie', 'iulie', 'august', 'septembrie', 'octombrie', 'noiembrie', 'decembrie'], + 'months_short' => ['ian.', 'feb.', 'mar.', 'apr.', 'mai', 'iun.', 'iul.', 'aug.', 'sept.', 'oct.', 'nov.', 'dec.'], + 'weekdays' => ['duminică', 'luni', 'marți', 'miercuri', 'joi', 'vineri', 'sâmbătă'], + 'weekdays_short' => ['dum', 'lun', 'mar', 'mie', 'joi', 'vin', 'sâm'], + 'weekdays_min' => ['du', 'lu', 'ma', 'mi', 'jo', 'vi', 'sâ'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' și '], + 'meridiem' => ['a.m.', 'p.m.'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ro_MD.php b/vendor/nesbot/carbon/src/Carbon/Lang/ro_MD.php new file mode 100644 index 0000000..ad1d2fa --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ro_MD.php @@ -0,0 +1,21 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ro.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY, HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY, HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ro_RO.php b/vendor/nesbot/carbon/src/Carbon/Lang/ro_RO.php new file mode 100644 index 0000000..102afcd --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ro_RO.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ro.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/rof.php b/vendor/nesbot/carbon/src/Carbon/Lang/rof.php new file mode 100644 index 0000000..205fc26 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/rof.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['kang’ama', 'kingoto'], + 'weekdays' => ['Ijumapili', 'Ijumatatu', 'Ijumanne', 'Ijumatano', 'Alhamisi', 'Ijumaa', 'Ijumamosi'], + 'weekdays_short' => ['Ijp', 'Ijt', 'Ijn', 'Ijtn', 'Alh', 'Iju', 'Ijm'], + 'weekdays_min' => ['Ijp', 'Ijt', 'Ijn', 'Ijtn', 'Alh', 'Iju', 'Ijm'], + 'months' => ['Mweri wa kwanza', 'Mweri wa kaili', 'Mweri wa katatu', 'Mweri wa kaana', 'Mweri wa tanu', 'Mweri wa sita', 'Mweri wa saba', 'Mweri wa nane', 'Mweri wa tisa', 'Mweri wa ikumi', 'Mweri wa ikumi na moja', 'Mweri wa ikumi na mbili'], + 'months_short' => ['M1', 'M2', 'M3', 'M4', 'M5', 'M6', 'M7', 'M8', 'M9', 'M10', 'M11', 'M12'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ru.php b/vendor/nesbot/carbon/src/Carbon/Lang/ru.php new file mode 100644 index 0000000..673b043 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ru.php @@ -0,0 +1,191 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Bari Badamshin + * - Jørn Ølmheim + * - François B + * - Tim Fish + * - Коренберг Марк (imac) + * - Serhan Apaydın + * - RomeroMsk + * - vsn4ik + * - JD Isaacks + * - Bari Badamshin + * - Jørn Ølmheim + * - François B + * - Коренберг Марк (imac) + * - Serhan Apaydın + * - RomeroMsk + * - vsn4ik + * - JD Isaacks + * - Fellzo + * - andrey-helldar + * - Pavel Skripkin (psxx) + * - AlexWalkerson + * - Vladislav UnsealedOne + * - dima-bzz + */ + +use Carbon\CarbonInterface; + +$transformDiff = function ($input) { + return strtr($input, [ + 'неделя' => 'неделю', + 'секунда' => 'секунду', + 'минута' => 'минуту', + ]); +}; + +return [ + 'year' => ':count год|:count года|:count лет', + 'y' => ':count г.|:count г.|:count л.', + 'a_year' => '{1}год|:count год|:count года|:count лет', + 'month' => ':count месяц|:count месяца|:count месяцев', + 'm' => ':count мес.', + 'a_month' => '{1}месяц|:count месяц|:count месяца|:count месяцев', + 'week' => ':count неделя|:count недели|:count недель', + 'w' => ':count нед.', + 'a_week' => '{1}неделя|:count неделю|:count недели|:count недель', + 'day' => ':count день|:count дня|:count дней', + 'd' => ':count д.', + 'a_day' => '{1}день|:count день|:count дня|:count дней', + 'hour' => ':count час|:count часа|:count часов', + 'h' => ':count ч.', + 'a_hour' => '{1}час|:count час|:count часа|:count часов', + 'minute' => ':count минута|:count минуты|:count минут', + 'min' => ':count мин.', + 'a_minute' => '{1}минута|:count минута|:count минуты|:count минут', + 'second' => ':count секунда|:count секунды|:count секунд', + 's' => ':count сек.', + 'a_second' => '{1}несколько секунд|:count секунду|:count секунды|:count секунд', + 'ago' => function ($time) use ($transformDiff) { + return $transformDiff($time).' назад'; + }, + 'from_now' => function ($time) use ($transformDiff) { + return 'через '.$transformDiff($time); + }, + 'after' => function ($time) use ($transformDiff) { + return $transformDiff($time).' после'; + }, + 'before' => function ($time) use ($transformDiff) { + return $transformDiff($time).' до'; + }, + 'diff_now' => 'только что', + 'diff_today' => 'Сегодня,', + 'diff_today_regexp' => 'Сегодня,?(?:\\s+в)?', + 'diff_yesterday' => 'вчера', + 'diff_yesterday_regexp' => 'Вчера,?(?:\\s+в)?', + 'diff_tomorrow' => 'завтра', + 'diff_tomorrow_regexp' => 'Завтра,?(?:\\s+в)?', + 'diff_before_yesterday' => 'позавчера', + 'diff_after_tomorrow' => 'послезавтра', + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D MMMM YYYY г.', + 'LLL' => 'D MMMM YYYY г., H:mm', + 'LLLL' => 'dddd, D MMMM YYYY г., H:mm', + ], + 'calendar' => [ + 'sameDay' => '[Сегодня, в] LT', + 'nextDay' => '[Завтра, в] LT', + 'nextWeek' => function (CarbonInterface $current, CarbonInterface $other) { + if ($current->week !== $other->week) { + switch ($current->dayOfWeek) { + case 0: + return '[В следующее] dddd, [в] LT'; + case 1: + case 2: + case 4: + return '[В следующий] dddd, [в] LT'; + case 3: + case 5: + case 6: + return '[В следующую] dddd, [в] LT'; + } + } + + if ($current->dayOfWeek === 2) { + return '[Во] dddd, [в] LT'; + } + + return '[В] dddd, [в] LT'; + }, + 'lastDay' => '[Вчера, в] LT', + 'lastWeek' => function (CarbonInterface $current, CarbonInterface $other) { + if ($current->week !== $other->week) { + switch ($current->dayOfWeek) { + case 0: + return '[В прошлое] dddd, [в] LT'; + case 1: + case 2: + case 4: + return '[В прошлый] dddd, [в] LT'; + case 3: + case 5: + case 6: + return '[В прошлую] dddd, [в] LT'; + } + } + + if ($current->dayOfWeek === 2) { + return '[Во] dddd, [в] LT'; + } + + return '[В] dddd, [в] LT'; + }, + 'sameElse' => 'L', + ], + 'ordinal' => function ($number, $period) { + switch ($period) { + case 'M': + case 'd': + case 'DDD': + return $number.'-й'; + case 'D': + return $number.'-го'; + case 'w': + case 'W': + return $number.'-я'; + default: + return $number; + } + }, + 'meridiem' => function ($hour) { + if ($hour < 4) { + return 'ночи'; + } + if ($hour < 12) { + return 'утра'; + } + if ($hour < 17) { + return 'дня'; + } + + return 'вечера'; + }, + 'months' => ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'], + 'months_standalone' => ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'], + 'months_short' => ['янв', 'фев', 'мар', 'апр', 'мая', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], + 'months_short_standalone' => ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], + 'months_regexp' => '/(DD?o?\.?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', + 'weekdays' => ['воскресенье', 'понедельник', 'вторник', 'среду', 'четверг', 'пятницу', 'субботу'], + 'weekdays_standalone' => ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'], + 'weekdays_short' => ['вск', 'пнд', 'втр', 'срд', 'чтв', 'птн', 'сбт'], + 'weekdays_min' => ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'], + 'weekdays_regexp' => '/\[\s*(В|в)\s*((?:прошлую|следующую|эту)\s*)?\]\s*dddd/', + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' и '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ru_BY.php b/vendor/nesbot/carbon/src/Carbon/Lang/ru_BY.php new file mode 100644 index 0000000..8ca7df3 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ru_BY.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ru.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ru_KG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ru_KG.php new file mode 100644 index 0000000..8ca7df3 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ru_KG.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ru.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ru_KZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/ru_KZ.php new file mode 100644 index 0000000..8ca7df3 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ru_KZ.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ru.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ru_MD.php b/vendor/nesbot/carbon/src/Carbon/Lang/ru_MD.php new file mode 100644 index 0000000..8ca7df3 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ru_MD.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ru.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ru_RU.php b/vendor/nesbot/carbon/src/Carbon/Lang/ru_RU.php new file mode 100644 index 0000000..8ca7df3 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ru_RU.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ru.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ru_UA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ru_UA.php new file mode 100644 index 0000000..db958d6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ru_UA.php @@ -0,0 +1,20 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - RFC 2319 bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/ru.php', [ + 'weekdays' => ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'], + 'weekdays_short' => ['вск', 'пнд', 'вто', 'срд', 'чтв', 'птн', 'суб'], + 'weekdays_min' => ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'су'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/rw.php b/vendor/nesbot/carbon/src/Carbon/Lang/rw.php new file mode 100644 index 0000000..bc4a347 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/rw.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/rw_RW.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/rw_RW.php b/vendor/nesbot/carbon/src/Carbon/Lang/rw_RW.php new file mode 100644 index 0000000..9b3e068 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/rw_RW.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Rwanda Steve Murphy murf@e-tools.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], + 'months' => ['Mutarama', 'Gashyantare', 'Werurwe', 'Mata', 'Gicuransi', 'Kamena', 'Nyakanga', 'Kanama', 'Nzeli', 'Ukwakira', 'Ugushyingo', 'Ukuboza'], + 'months_short' => ['Mut', 'Gas', 'Wer', 'Mat', 'Gic', 'Kam', 'Nya', 'Kan', 'Nze', 'Ukw', 'Ugu', 'Uku'], + 'weekdays' => ['Ku cyumweru', 'Kuwa mbere', 'Kuwa kabiri', 'Kuwa gatatu', 'Kuwa kane', 'Kuwa gatanu', 'Kuwa gatandatu'], + 'weekdays_short' => ['Mwe', 'Mbe', 'Kab', 'Gtu', 'Kan', 'Gnu', 'Gnd'], + 'weekdays_min' => ['Mwe', 'Mbe', 'Kab', 'Gtu', 'Kan', 'Gnu', 'Gnd'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + + 'second' => ':count vuna', // less reliable + 's' => ':count vuna', // less reliable + 'a_second' => ':count vuna', // less reliable + + 'year' => 'aka :count', + 'y' => 'aka :count', + 'a_year' => 'aka :count', + + 'month' => 'ezi :count', + 'm' => 'ezi :count', + 'a_month' => 'ezi :count', + + 'week' => ':count icyumweru', + 'w' => ':count icyumweru', + 'a_week' => ':count icyumweru', + + 'day' => ':count nsi', + 'd' => ':count nsi', + 'a_day' => ':count nsi', + + 'hour' => 'saha :count', + 'h' => 'saha :count', + 'a_hour' => 'saha :count', + + 'minute' => ':count -nzinya', + 'min' => ':count -nzinya', + 'a_minute' => ':count -nzinya', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/rwk.php b/vendor/nesbot/carbon/src/Carbon/Lang/rwk.php new file mode 100644 index 0000000..ed92e8e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/rwk.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['utuko', 'kyiukonyi'], + 'weekdays' => ['Jumapilyi', 'Jumatatuu', 'Jumanne', 'Jumatanu', 'Alhamisi', 'Ijumaa', 'Jumamosi'], + 'weekdays_short' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], + 'weekdays_min' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], + 'months' => ['Januari', 'Februari', 'Machi', 'Aprilyi', 'Mei', 'Junyi', 'Julyai', 'Agusti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], + 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sa.php b/vendor/nesbot/carbon/src/Carbon/Lang/sa.php new file mode 100644 index 0000000..1357c03 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sa.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/sa_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sa_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/sa_IN.php new file mode 100644 index 0000000..cfda9a6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sa_IN.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - The Debian project Christian Perrier bubulle@debian.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'D-MM-YY', + ], + 'months' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], + 'months_short' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], + 'weekdays' => ['रविवासर:', 'सोमवासर:', 'मंगलवासर:', 'बुधवासर:', 'बृहस्पतिवासरः', 'शुक्रवासर', 'शनिवासर:'], + 'weekdays_short' => ['रविः', 'सोम:', 'मंगल:', 'बुध:', 'बृहस्पतिः', 'शुक्र', 'शनि:'], + 'weekdays_min' => ['रविः', 'सोम:', 'मंगल:', 'बुध:', 'बृहस्पतिः', 'शुक्र', 'शनि:'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], + + 'minute' => ':count होरा', // less reliable + 'min' => ':count होरा', // less reliable + 'a_minute' => ':count होरा', // less reliable + + 'year' => ':count वर्ष', + 'y' => ':count वर्ष', + 'a_year' => ':count वर्ष', + + 'month' => ':count मास', + 'm' => ':count मास', + 'a_month' => ':count मास', + + 'week' => ':count सप्ताहः saptahaĥ', + 'w' => ':count सप्ताहः saptahaĥ', + 'a_week' => ':count सप्ताहः saptahaĥ', + + 'day' => ':count दिन', + 'd' => ':count दिन', + 'a_day' => ':count दिन', + + 'hour' => ':count घण्टा', + 'h' => ':count घण्टा', + 'a_hour' => ':count घण्टा', + + 'second' => ':count द्वितीयः', + 's' => ':count द्वितीयः', + 'a_second' => ':count द्वितीयः', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sah.php b/vendor/nesbot/carbon/src/Carbon/Lang/sah.php new file mode 100644 index 0000000..b828824 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sah.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/sah_RU.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sah_RU.php b/vendor/nesbot/carbon/src/Carbon/Lang/sah_RU.php new file mode 100644 index 0000000..94cc0cb --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sah_RU.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Valery Timiriliyev Valery Timiriliyev timiriliyev@gmail.com + */ +return array_replace_recursive(require __DIR__.'/ru.php', [ + 'formats' => [ + 'L' => 'YYYY.MM.DD', + ], + 'months' => ['тохсунньу', 'олунньу', 'кулун тутар', 'муус устар', 'ыам ыйын', 'бэс ыйын', 'от ыйын', 'атырдьах ыйын', 'балаҕан ыйын', 'алтынньы', 'сэтинньи', 'ахсынньы'], + 'months_short' => ['тохс', 'олун', 'кул', 'муус', 'ыам', 'бэс', 'от', 'атыр', 'бал', 'алт', 'сэт', 'ахс'], + 'weekdays' => ['баскыһыанньа', 'бэнидиэнньик', 'оптуорунньук', 'сэрэдэ', 'чэппиэр', 'бээтинсэ', 'субуота'], + 'weekdays_short' => ['бс', 'бн', 'оп', 'ср', 'чп', 'бт', 'сб'], + 'weekdays_min' => ['бс', 'бн', 'оп', 'ср', 'чп', 'бт', 'сб'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/saq.php b/vendor/nesbot/carbon/src/Carbon/Lang/saq.php new file mode 100644 index 0000000..ff8bf60 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/saq.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['Tesiran', 'Teipa'], + 'weekdays' => ['Mderot ee are', 'Mderot ee kuni', 'Mderot ee ong’wan', 'Mderot ee inet', 'Mderot ee ile', 'Mderot ee sapa', 'Mderot ee kwe'], + 'weekdays_short' => ['Are', 'Kun', 'Ong', 'Ine', 'Ile', 'Sap', 'Kwe'], + 'weekdays_min' => ['Are', 'Kun', 'Ong', 'Ine', 'Ile', 'Sap', 'Kwe'], + 'months' => ['Lapa le obo', 'Lapa le waare', 'Lapa le okuni', 'Lapa le ong’wan', 'Lapa le imet', 'Lapa le ile', 'Lapa le sapa', 'Lapa le isiet', 'Lapa le saal', 'Lapa le tomon', 'Lapa le tomon obo', 'Lapa le tomon waare'], + 'months_short' => ['Obo', 'Waa', 'Oku', 'Ong', 'Ime', 'Ile', 'Sap', 'Isi', 'Saa', 'Tom', 'Tob', 'Tow'], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sat.php b/vendor/nesbot/carbon/src/Carbon/Lang/sat.php new file mode 100644 index 0000000..c9914c6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sat.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/sat_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sat_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/sat_IN.php new file mode 100644 index 0000000..632b1af --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sat_IN.php @@ -0,0 +1,54 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Red Hat Pune libc-alpha@sourceware.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रेल', 'मई', 'जुन', 'जुलाई', 'अगस्त', 'सितम्बर', 'अखथबर', 'नवम्बर', 'दिसम्बर'], + 'months_short' => ['जनवरी', 'फरवरी', 'मार्च', 'अप्रेल', 'मई', 'जुन', 'जुलाई', 'अगस्त', 'सितम्बर', 'अखथबर', 'नवम्बर', 'दिसम्बर'], + 'weekdays' => ['सिंगेमाँहाँ', 'ओतेमाँहाँ', 'बालेमाँहाँ', 'सागुनमाँहाँ', 'सारदीमाँहाँ', 'जारुममाँहाँ', 'ञुहुममाँहाँ'], + 'weekdays_short' => ['सिंगे', 'ओते', 'बाले', 'सागुन', 'सारदी', 'जारुम', 'ञुहुम'], + 'weekdays_min' => ['सिंगे', 'ओते', 'बाले', 'सागुन', 'सारदी', 'जारुम', 'ञुहुम'], + 'day_of_first_week_of_year' => 1, + + 'month' => ':count ńindạ cando', // less reliable + 'm' => ':count ńindạ cando', // less reliable + 'a_month' => ':count ńindạ cando', // less reliable + + 'week' => ':count mãhã', // less reliable + 'w' => ':count mãhã', // less reliable + 'a_week' => ':count mãhã', // less reliable + + 'hour' => ':count ᱥᱳᱱᱚ', // less reliable + 'h' => ':count ᱥᱳᱱᱚ', // less reliable + 'a_hour' => ':count ᱥᱳᱱᱚ', // less reliable + + 'minute' => ':count ᱯᱤᱞᱪᱩ', // less reliable + 'min' => ':count ᱯᱤᱞᱪᱩ', // less reliable + 'a_minute' => ':count ᱯᱤᱞᱪᱩ', // less reliable + + 'second' => ':count ar', // less reliable + 's' => ':count ar', // less reliable + 'a_second' => ':count ar', // less reliable + + 'year' => ':count ne̲s', + 'y' => ':count ne̲s', + 'a_year' => ':count ne̲s', + + 'day' => ':count ᱫᱤᱱ', + 'd' => ':count ᱫᱤᱱ', + 'a_day' => ':count ᱫᱤᱱ', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sbp.php b/vendor/nesbot/carbon/src/Carbon/Lang/sbp.php new file mode 100644 index 0000000..e29ca37 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sbp.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['Lwamilawu', 'Pashamihe'], + 'weekdays' => ['Mulungu', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alahamisi', 'Ijumaa', 'Jumamosi'], + 'weekdays_short' => ['Mul', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], + 'weekdays_min' => ['Mul', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], + 'months' => ['Mupalangulwa', 'Mwitope', 'Mushende', 'Munyi', 'Mushende Magali', 'Mujimbi', 'Mushipepo', 'Mupuguto', 'Munyense', 'Mokhu', 'Musongandembwe', 'Muhaano'], + 'months_short' => ['Mup', 'Mwi', 'Msh', 'Mun', 'Mag', 'Muj', 'Msp', 'Mpg', 'Mye', 'Mok', 'Mus', 'Muh'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sc.php b/vendor/nesbot/carbon/src/Carbon/Lang/sc.php new file mode 100644 index 0000000..7178cf4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sc.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/sc_IT.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sc_IT.php b/vendor/nesbot/carbon/src/Carbon/Lang/sc_IT.php new file mode 100644 index 0000000..5d1e4ce --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sc_IT.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Sardinian Translators Team Massimeddu Cireddu massimeddu@gmail.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD. MM. YY', + ], + 'months' => ['Ghennàrgiu', 'Freàrgiu', 'Martzu', 'Abrile', 'Maju', 'Làmpadas', 'Argiolas//Trìulas', 'Austu', 'Cabudanni', 'Santugaine//Ladàmine', 'Onniasantu//Santandria', 'Nadale//Idas'], + 'months_short' => ['Ghe', 'Fre', 'Mar', 'Abr', 'Maj', 'Làm', 'Arg', 'Aus', 'Cab', 'Lad', 'Onn', 'Nad'], + 'weekdays' => ['Domìnigu', 'Lunis', 'Martis', 'Mèrcuris', 'Giòbia', 'Chenàbura', 'Sàbadu'], + 'weekdays_short' => ['Dom', 'Lun', 'Mar', 'Mèr', 'Giò', 'Che', 'Sàb'], + 'weekdays_min' => ['Dom', 'Lun', 'Mar', 'Mèr', 'Giò', 'Che', 'Sàb'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + + 'minute' => ':count mementu', // less reliable + 'min' => ':count mementu', // less reliable + 'a_minute' => ':count mementu', // less reliable + + 'year' => ':count annu', + 'y' => ':count annu', + 'a_year' => ':count annu', + + 'month' => ':count mese', + 'm' => ':count mese', + 'a_month' => ':count mese', + + 'week' => ':count chida', + 'w' => ':count chida', + 'a_week' => ':count chida', + + 'day' => ':count dí', + 'd' => ':count dí', + 'a_day' => ':count dí', + + 'hour' => ':count ora', + 'h' => ':count ora', + 'a_hour' => ':count ora', + + 'second' => ':count secundu', + 's' => ':count secundu', + 'a_second' => ':count secundu', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sd.php b/vendor/nesbot/carbon/src/Carbon/Lang/sd.php new file mode 100644 index 0000000..0022c5a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sd.php @@ -0,0 +1,81 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +$months = [ + 'جنوري', + 'فيبروري', + 'مارچ', + 'اپريل', + 'مئي', + 'جون', + 'جولاءِ', + 'آگسٽ', + 'سيپٽمبر', + 'آڪٽوبر', + 'نومبر', + 'ڊسمبر', +]; + +$weekdays = [ + 'آچر', + 'سومر', + 'اڱارو', + 'اربع', + 'خميس', + 'جمع', + 'ڇنڇر', +]; + +/* + * Authors: + * - Narain Sagar + * - Sawood Alam + * - Narain Sagar + */ +return [ + 'year' => '{1}'.'هڪ سال'.'|:count '.'سال', + 'month' => '{1}'.'هڪ مهينو'.'|:count '.'مهينا', + 'week' => '{1}'.'ھڪ ھفتو'.'|:count '.'هفتا', + 'day' => '{1}'.'هڪ ڏينهن'.'|:count '.'ڏينهن', + 'hour' => '{1}'.'هڪ ڪلاڪ'.'|:count '.'ڪلاڪ', + 'minute' => '{1}'.'هڪ منٽ'.'|:count '.'منٽ', + 'second' => '{1}'.'چند سيڪنڊ'.'|:count '.'سيڪنڊ', + 'ago' => ':time اڳ', + 'from_now' => ':time پوء', + 'diff_yesterday' => 'ڪالهه', + 'diff_today' => 'اڄ', + 'diff_tomorrow' => 'سڀاڻي', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd، D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[اڄ] LT', + 'nextDay' => '[سڀاڻي] LT', + 'nextWeek' => 'dddd [اڳين هفتي تي] LT', + 'lastDay' => '[ڪالهه] LT', + 'lastWeek' => '[گزريل هفتي] dddd [تي] LT', + 'sameElse' => 'L', + ], + 'meridiem' => ['صبح', 'شام'], + 'months' => $months, + 'months_short' => $months, + 'weekdays' => $weekdays, + 'weekdays_short' => $weekdays, + 'weekdays_min' => $weekdays, + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => ['، ', ' ۽ '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN.php new file mode 100644 index 0000000..de1dad0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN.php @@ -0,0 +1,26 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Red Hat, Pune bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/sd.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['جنوري', 'فبروري', 'مارچ', 'اپريل', 'مي', 'جون', 'جولاءِ', 'آگسٽ', 'سيپٽيمبر', 'آڪٽوبر', 'نومبر', 'ڊسمبر'], + 'months_short' => ['جنوري', 'فبروري', 'مارچ', 'اپريل', 'مي', 'جون', 'جولاءِ', 'آگسٽ', 'سيپٽيمبر', 'آڪٽوبر', 'نومبر', 'ڊسمبر'], + 'weekdays' => ['آرتوارُ', 'سومرُ', 'منگلُ', 'ٻُڌرُ', 'وسپت', 'جُمو', 'ڇنڇر'], + 'weekdays_short' => ['آرتوارُ', 'سومرُ', 'منگلُ', 'ٻُڌرُ', 'وسپت', 'جُمو', 'ڇنڇر'], + 'weekdays_min' => ['آرتوارُ', 'سومرُ', 'منگلُ', 'ٻُڌرُ', 'وسپت', 'جُمو', 'ڇنڇر'], + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php b/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php new file mode 100644 index 0000000..061fcc1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Red Hat, Pune bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/sd.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['जनवरी', 'फबरवरी', 'मार्चि', 'अप्रेल', 'मे', 'जूनि', 'जूलाइ', 'आगस्टु', 'सेप्टेंबरू', 'आक्टूबरू', 'नवंबरू', 'ॾिसंबरू'], + 'months_short' => ['जनवरी', 'फबरवरी', 'मार्चि', 'अप्रेल', 'मे', 'जूनि', 'जूलाइ', 'आगस्टु', 'सेप्टेंबरू', 'आक्टूबरू', 'नवंबरू', 'ॾिसंबरू'], + 'weekdays' => ['आर्तवारू', 'सूमरू', 'मंगलू', 'ॿुधरू', 'विस्पति', 'जुमो', 'छंछस'], + 'weekdays_short' => ['आर्तवारू', 'सूमरू', 'मंगलू', 'ॿुधरू', 'विस्पति', 'जुमो', 'छंछस'], + 'weekdays_min' => ['आर्तवारू', 'सूमरू', 'मंगलू', 'ॿुधरू', 'विस्पति', 'जुमो', 'छंछस'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['म.पू.', 'म.नं.'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/se.php b/vendor/nesbot/carbon/src/Carbon/Lang/se.php new file mode 100644 index 0000000..7c4b92a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/se.php @@ -0,0 +1,73 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - Karamell + */ +return [ + 'year' => '{1}:count jahki|:count jagit', + 'a_year' => '{1}okta jahki|:count jagit', + 'y' => ':count j.', + 'month' => '{1}:count mánnu|:count mánut', + 'a_month' => '{1}okta mánnu|:count mánut', + 'm' => ':count mán.', + 'week' => '{1}:count vahkku|:count vahkku', + 'a_week' => '{1}okta vahkku|:count vahkku', + 'w' => ':count v.', + 'day' => '{1}:count beaivi|:count beaivvit', + 'a_day' => '{1}okta beaivi|:count beaivvit', + 'd' => ':count b.', + 'hour' => '{1}:count diimmu|:count diimmut', + 'a_hour' => '{1}okta diimmu|:count diimmut', + 'h' => ':count d.', + 'minute' => '{1}:count minuhta|:count minuhtat', + 'a_minute' => '{1}okta minuhta|:count minuhtat', + 'min' => ':count min.', + 'second' => '{1}:count sekunddat|:count sekunddat', + 'a_second' => '{1}moadde sekunddat|:count sekunddat', + 's' => ':count s.', + 'ago' => 'maŋit :time', + 'from_now' => ':time geažes', + 'diff_yesterday' => 'ikte', + 'diff_yesterday_regexp' => 'ikte(?:\\s+ti)?', + 'diff_today' => 'otne', + 'diff_today_regexp' => 'otne(?:\\s+ti)?', + 'diff_tomorrow' => 'ihttin', + 'diff_tomorrow_regexp' => 'ihttin(?:\\s+ti)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'MMMM D. [b.] YYYY', + 'LLL' => 'MMMM D. [b.] YYYY [ti.] HH:mm', + 'LLLL' => 'dddd, MMMM D. [b.] YYYY [ti.] HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[otne ti] LT', + 'nextDay' => '[ihttin ti] LT', + 'nextWeek' => 'dddd [ti] LT', + 'lastDay' => '[ikte ti] LT', + 'lastWeek' => '[ovddit] dddd [ti] LT', + 'sameElse' => 'L', + ], + 'ordinal' => ':number.', + 'months' => ['ođđajagemánnu', 'guovvamánnu', 'njukčamánnu', 'cuoŋománnu', 'miessemánnu', 'geassemánnu', 'suoidnemánnu', 'borgemánnu', 'čakčamánnu', 'golggotmánnu', 'skábmamánnu', 'juovlamánnu'], + 'months_short' => ['ođđj', 'guov', 'njuk', 'cuo', 'mies', 'geas', 'suoi', 'borg', 'čakč', 'golg', 'skáb', 'juov'], + 'weekdays' => ['sotnabeaivi', 'vuossárga', 'maŋŋebárga', 'gaskavahkku', 'duorastat', 'bearjadat', 'lávvardat'], + 'weekdays_short' => ['sotn', 'vuos', 'maŋ', 'gask', 'duor', 'bear', 'láv'], + 'weekdays_min' => ['s', 'v', 'm', 'g', 'd', 'b', 'L'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' ja '], + 'meridiem' => ['i.b.', 'e.b.'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/se_FI.php b/vendor/nesbot/carbon/src/Carbon/Lang/se_FI.php new file mode 100644 index 0000000..cf01805 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/se_FI.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/se.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'months' => ['ođđajagemánnu', 'guovvamánnu', 'njukčamánnu', 'cuoŋománnu', 'miessemánnu', 'geassemánnu', 'suoidnemánnu', 'borgemánnu', 'čakčamánnu', 'golggotmánnu', 'skábmamánnu', 'juovlamánnu'], + 'months_short' => ['ođđj', 'guov', 'njuk', 'cuoŋ', 'mies', 'geas', 'suoi', 'borg', 'čakč', 'golg', 'skáb', 'juov'], + 'weekdays' => ['sotnabeaivi', 'mánnodat', 'disdat', 'gaskavahkku', 'duorastat', 'bearjadat', 'lávvordat'], + 'weekdays_short' => ['so', 'má', 'di', 'ga', 'du', 'be', 'lá'], + 'weekdays_min' => ['so', 'má', 'di', 'ga', 'du', 'be', 'lá'], + 'meridiem' => ['i', 'e'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/se_NO.php b/vendor/nesbot/carbon/src/Carbon/Lang/se_NO.php new file mode 100644 index 0000000..177c7e9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/se_NO.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/se.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/se_SE.php b/vendor/nesbot/carbon/src/Carbon/Lang/se_SE.php new file mode 100644 index 0000000..177c7e9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/se_SE.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/se.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/seh.php b/vendor/nesbot/carbon/src/Carbon/Lang/seh.php new file mode 100644 index 0000000..babf9af --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/seh.php @@ -0,0 +1,26 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'weekdays' => ['Dimingu', 'Chiposi', 'Chipiri', 'Chitatu', 'Chinai', 'Chishanu', 'Sabudu'], + 'weekdays_short' => ['Dim', 'Pos', 'Pir', 'Tat', 'Nai', 'Sha', 'Sab'], + 'weekdays_min' => ['Dim', 'Pos', 'Pir', 'Tat', 'Nai', 'Sha', 'Sab'], + 'months' => ['Janeiro', 'Fevreiro', 'Marco', 'Abril', 'Maio', 'Junho', 'Julho', 'Augusto', 'Setembro', 'Otubro', 'Novembro', 'Decembro'], + 'months_short' => ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Aug', 'Set', 'Otu', 'Nov', 'Dec'], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'd [de] MMM [de] YYYY', + 'LLL' => 'd [de] MMMM [de] YYYY HH:mm', + 'LLLL' => 'dddd, d [de] MMMM [de] YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ses.php b/vendor/nesbot/carbon/src/Carbon/Lang/ses.php new file mode 100644 index 0000000..e1099e6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ses.php @@ -0,0 +1,56 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['Adduha', 'Aluula'], + 'weekdays' => ['Alhadi', 'Atinni', 'Atalaata', 'Alarba', 'Alhamiisa', 'Alzuma', 'Asibti'], + 'weekdays_short' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'], + 'weekdays_min' => ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'], + 'months' => ['Žanwiye', 'Feewiriye', 'Marsi', 'Awiril', 'Me', 'Žuweŋ', 'Žuyye', 'Ut', 'Sektanbur', 'Oktoobur', 'Noowanbur', 'Deesanbur'], + 'months_short' => ['Žan', 'Fee', 'Mar', 'Awi', 'Me', 'Žuw', 'Žuy', 'Ut', 'Sek', 'Okt', 'Noo', 'Dee'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + + 'month' => ':count alaada', // less reliable + 'm' => ':count alaada', // less reliable + 'a_month' => ':count alaada', // less reliable + + 'hour' => ':count ɲaajin', // less reliable + 'h' => ':count ɲaajin', // less reliable + 'a_hour' => ':count ɲaajin', // less reliable + + 'minute' => ':count zarbu', // less reliable + 'min' => ':count zarbu', // less reliable + 'a_minute' => ':count zarbu', // less reliable + + 'year' => ':count jiiri', + 'y' => ':count jiiri', + 'a_year' => ':count jiiri', + + 'week' => ':count jirbiiyye', + 'w' => ':count jirbiiyye', + 'a_week' => ':count jirbiiyye', + + 'day' => ':count zaari', + 'd' => ':count zaari', + 'a_day' => ':count zaari', + + 'second' => ':count ihinkante', + 's' => ':count ihinkante', + 'a_second' => ':count ihinkante', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sg.php b/vendor/nesbot/carbon/src/Carbon/Lang/sg.php new file mode 100644 index 0000000..9264e89 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sg.php @@ -0,0 +1,52 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['ND', 'LK'], + 'weekdays' => ['Bikua-ôko', 'Bïkua-ûse', 'Bïkua-ptâ', 'Bïkua-usïö', 'Bïkua-okü', 'Lâpôsö', 'Lâyenga'], + 'weekdays_short' => ['Bk1', 'Bk2', 'Bk3', 'Bk4', 'Bk5', 'Lâp', 'Lây'], + 'weekdays_min' => ['Bk1', 'Bk2', 'Bk3', 'Bk4', 'Bk5', 'Lâp', 'Lây'], + 'months' => ['Nyenye', 'Fulundïgi', 'Mbängü', 'Ngubùe', 'Bêläwü', 'Föndo', 'Lengua', 'Kükürü', 'Mvuka', 'Ngberere', 'Nabändüru', 'Kakauka'], + 'months_short' => ['Nye', 'Ful', 'Mbä', 'Ngu', 'Bêl', 'Fön', 'Len', 'Kük', 'Mvu', 'Ngb', 'Nab', 'Kak'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM, YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + + 'year' => ':count dā', // less reliable + 'y' => ':count dā', // less reliable + 'a_year' => ':count dā', // less reliable + + 'week' => ':count bïkua-okü', // less reliable + 'w' => ':count bïkua-okü', // less reliable + 'a_week' => ':count bïkua-okü', // less reliable + + 'day' => ':count ziggawâ', // less reliable + 'd' => ':count ziggawâ', // less reliable + 'a_day' => ':count ziggawâ', // less reliable + + 'hour' => ':count yângâködörö', // less reliable + 'h' => ':count yângâködörö', // less reliable + 'a_hour' => ':count yângâködörö', // less reliable + + 'second' => ':count bïkua-ôko', // less reliable + 's' => ':count bïkua-ôko', // less reliable + 'a_second' => ':count bïkua-ôko', // less reliable + + 'month' => ':count Nze tî ngu', + 'm' => ':count Nze tî ngu', + 'a_month' => ':count Nze tî ngu', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sgs.php b/vendor/nesbot/carbon/src/Carbon/Lang/sgs.php new file mode 100644 index 0000000..864b989 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sgs.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/sgs_LT.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sgs_LT.php b/vendor/nesbot/carbon/src/Carbon/Lang/sgs_LT.php new file mode 100644 index 0000000..aa9e942 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sgs_LT.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Arnas Udovičius bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'YYYY.MM.DD', + ], + 'months' => ['sausė', 'vasarė', 'kuova', 'balondė', 'gegožės', 'bėrželė', 'lëpas', 'rogpjūtė', 'siejės', 'spalė', 'lapkrėstė', 'grůdė'], + 'months_short' => ['Sau', 'Vas', 'Kuo', 'Bal', 'Geg', 'Bėr', 'Lëp', 'Rgp', 'Sie', 'Spa', 'Lap', 'Grd'], + 'weekdays' => ['nedielės dëna', 'panedielis', 'oterninks', 'sereda', 'četvergs', 'petnīčė', 'sobata'], + 'weekdays_short' => ['Nd', 'Pn', 'Ot', 'Sr', 'Čt', 'Pt', 'Sb'], + 'weekdays_min' => ['Nd', 'Pn', 'Ot', 'Sr', 'Čt', 'Pt', 'Sb'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + + 'minute' => ':count mažos', // less reliable + 'min' => ':count mažos', // less reliable + 'a_minute' => ':count mažos', // less reliable + + 'year' => ':count metā', + 'y' => ':count metā', + 'a_year' => ':count metā', + + 'month' => ':count mienou', + 'm' => ':count mienou', + 'a_month' => ':count mienou', + + 'week' => ':count nedielė', + 'w' => ':count nedielė', + 'a_week' => ':count nedielė', + + 'day' => ':count dīna', + 'd' => ':count dīna', + 'a_day' => ':count dīna', + + 'hour' => ':count adīna', + 'h' => ':count adīna', + 'a_hour' => ':count adīna', + + 'second' => ':count Sekondė', + 's' => ':count Sekondė', + 'a_second' => ':count Sekondė', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sh.php b/vendor/nesbot/carbon/src/Carbon/Lang/sh.php new file mode 100644 index 0000000..e4aa5a1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sh.php @@ -0,0 +1,68 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +// @codeCoverageIgnoreStart +use Symfony\Component\Translation\PluralizationRules; + +if (class_exists('Symfony\\Component\\Translation\\PluralizationRules')) { + PluralizationRules::set(function ($number) { + return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); + }, 'sh'); +} +// @codeCoverageIgnoreEnd + +/* + * Authors: + * - Томица Кораћ + * - Enrique Vidal + * - Christopher Dell + * - dmilisic + * - danijel + * - Miroslav Matkovic (mikki021) + */ +return [ + 'diff_now' => 'sada', + 'diff_yesterday' => 'juče', + 'diff_tomorrow' => 'sutra', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'MMMM D, YYYY', + 'LLL' => 'DD MMM HH:mm', + 'LLLL' => 'MMMM DD, YYYY HH:mm', + ], + 'year' => ':count godina|:count godine|:count godina', + 'y' => ':count g.', + 'month' => ':count mesec|:count meseca|:count meseci', + 'm' => ':count m.', + 'week' => ':count nedelja|:count nedelje|:count nedelja', + 'w' => ':count n.', + 'day' => ':count dan|:count dana|:count dana', + 'd' => ':count d.', + 'hour' => ':count sat|:count sata|:count sati', + 'h' => ':count č.', + 'minute' => ':count minut|:count minuta|:count minuta', + 'min' => ':count min.', + 'second' => ':count sekund|:count sekunde|:count sekundi', + 's' => ':count s.', + 'ago' => 'pre :time', + 'from_now' => 'za :time', + 'after' => 'nakon :time', + 'before' => ':time raniјe', + 'weekdays' => ['Nedelja', 'Ponedeljak', 'Utorak', 'Sreda', 'Četvrtak', 'Petak', 'Subota'], + 'weekdays_short' => ['Ned', 'Pon', 'Uto', 'Sre', 'Čet', 'Pet', 'Sub'], + 'weekdays_min' => ['Ned', 'Pon', 'Uto', 'Sre', 'Čet', 'Pet', 'Sub'], + 'months' => ['Januar', 'Februar', 'Mart', 'April', 'Maj', 'Jun', 'Jul', 'Avgust', 'Septembar', 'Oktobar', 'Novembar', 'Decembar'], + 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Avg', 'Sep', 'Okt', 'Nov', 'Dec'], + 'list' => [', ', ' i '], + 'meridiem' => ['pre podne', 'po podne'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/shi.php b/vendor/nesbot/carbon/src/Carbon/Lang/shi.php new file mode 100644 index 0000000..7815186 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/shi.php @@ -0,0 +1,57 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['ⵜⵉⴼⴰⵡⵜ', 'ⵜⴰⴷⴳⴳⵯⴰⵜ'], + 'weekdays' => ['ⴰⵙⴰⵎⴰⵙ', 'ⴰⵢⵏⴰⵙ', 'ⴰⵙⵉⵏⴰⵙ', 'ⴰⴽⵕⴰⵙ', 'ⴰⴽⵡⴰⵙ', 'ⵙⵉⵎⵡⴰⵙ', 'ⴰⵙⵉⴹⵢⴰⵙ'], + 'weekdays_short' => ['ⴰⵙⴰ', 'ⴰⵢⵏ', 'ⴰⵙⵉ', 'ⴰⴽⵕ', 'ⴰⴽⵡ', 'ⴰⵙⵉⵎ', 'ⴰⵙⵉⴹ'], + 'weekdays_min' => ['ⴰⵙⴰ', 'ⴰⵢⵏ', 'ⴰⵙⵉ', 'ⴰⴽⵕ', 'ⴰⴽⵡ', 'ⴰⵙⵉⵎ', 'ⴰⵙⵉⴹ'], + 'months' => ['ⵉⵏⵏⴰⵢⵔ', 'ⴱⵕⴰⵢⵕ', 'ⵎⴰⵕⵚ', 'ⵉⴱⵔⵉⵔ', 'ⵎⴰⵢⵢⵓ', 'ⵢⵓⵏⵢⵓ', 'ⵢⵓⵍⵢⵓⵣ', 'ⵖⵓⵛⵜ', 'ⵛⵓⵜⴰⵏⴱⵉⵔ', 'ⴽⵜⵓⴱⵔ', 'ⵏⵓⵡⴰⵏⴱⵉⵔ', 'ⴷⵓⵊⴰⵏⴱⵉⵔ'], + 'months_short' => ['ⵉⵏⵏ', 'ⴱⵕⴰ', 'ⵎⴰⵕ', 'ⵉⴱⵔ', 'ⵎⴰⵢ', 'ⵢⵓⵏ', 'ⵢⵓⵍ', 'ⵖⵓⵛ', 'ⵛⵓⵜ', 'ⴽⵜⵓ', 'ⵏⵓⵡ', 'ⴷⵓⵊ'], + 'first_day_of_week' => 6, + 'weekend' => [5, 6], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM, YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + + 'year' => ':count aseggwas', + 'y' => ':count aseggwas', + 'a_year' => ':count aseggwas', + + 'month' => ':count ayyur', + 'm' => ':count ayyur', + 'a_month' => ':count ayyur', + + 'week' => ':count imalass', + 'w' => ':count imalass', + 'a_week' => ':count imalass', + + 'day' => ':count ass', + 'd' => ':count ass', + 'a_day' => ':count ass', + + 'hour' => ':count urɣ', // less reliable + 'h' => ':count urɣ', // less reliable + 'a_hour' => ':count urɣ', // less reliable + + 'minute' => ':count ⴰⵎⵥⵉ', // less reliable + 'min' => ':count ⴰⵎⵥⵉ', // less reliable + 'a_minute' => ':count ⴰⵎⵥⵉ', // less reliable + + 'second' => ':count sin', // less reliable + 's' => ':count sin', // less reliable + 'a_second' => ':count sin', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/shi_Latn.php b/vendor/nesbot/carbon/src/Carbon/Lang/shi_Latn.php new file mode 100644 index 0000000..cddfb24 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/shi_Latn.php @@ -0,0 +1,33 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/shi.php', [ + 'meridiem' => ['tifawt', 'tadggʷat'], + 'weekdays' => ['asamas', 'aynas', 'asinas', 'akṛas', 'akwas', 'asimwas', 'asiḍyas'], + 'weekdays_short' => ['asa', 'ayn', 'asi', 'akṛ', 'akw', 'asim', 'asiḍ'], + 'weekdays_min' => ['asa', 'ayn', 'asi', 'akṛ', 'akw', 'asim', 'asiḍ'], + 'months' => ['innayr', 'bṛayṛ', 'maṛṣ', 'ibrir', 'mayyu', 'yunyu', 'yulyuz', 'ɣuct', 'cutanbir', 'ktubr', 'nuwanbir', 'dujanbir'], + 'months_short' => ['inn', 'bṛa', 'maṛ', 'ibr', 'may', 'yun', 'yul', 'ɣuc', 'cut', 'ktu', 'nuw', 'duj'], + 'first_day_of_week' => 6, + 'weekend' => [5, 6], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM, YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + + 'minute' => ':count agur', // less reliable + 'min' => ':count agur', // less reliable + 'a_minute' => ':count agur', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php b/vendor/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php new file mode 100644 index 0000000..f3df1f2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/shi.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/shn.php b/vendor/nesbot/carbon/src/Carbon/Lang/shn.php new file mode 100644 index 0000000..fe7b1ea --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/shn.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/shn_MM.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/shn_MM.php b/vendor/nesbot/carbon/src/Carbon/Lang/shn_MM.php new file mode 100644 index 0000000..f399acf --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/shn_MM.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - ubuntu Myanmar LoCo Team https://ubuntu-mm.net Bone Pyae Sone bone.burma@mail.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'OY MMM OD dddd', + ], + 'months' => ['လိူၼ်ၵမ်', 'လိူၼ်သၢမ်', 'လိူၼ်သီ', 'လိူၼ်ႁႃႈ', 'လိူၼ်ႁူၵ်း', 'လိူၼ်ၸဵတ်း', 'လိူၼ်ပႅတ်ႇ', 'လိူၼ်ၵဝ်ႈ', 'လိူၼ်သိပ်း', 'လိူၼ်သိပ်းဢိတ်း', 'လိူၼ်သိပ်းဢိတ်းသွင်', 'လိူၼ်ၸဵင်'], + 'months_short' => ['လိူၼ်ၵမ်', 'လိူၼ်သၢမ်', 'လိူၼ်သီ', 'လိူၼ်ႁႃႈ', 'လိူၼ်ႁူၵ်း', 'လိူၼ်ၸဵတ်း', 'လိူၼ်ပႅတ်ႇ', 'လိူၼ်ၵဝ်ႈ', 'လိူၼ်သိပ်း', 'လိူၼ်သိပ်းဢိတ်း', 'လိူၼ်သိပ်းဢိတ်းသွင်', 'လိူၼ်ၸဵင်'], + 'weekdays' => ['ဝၼ်းဢႃးတိတ်ႉ', 'ဝၼ်းၸၼ်', 'ဝၼ်း​ဢၢင်း​ၵၢၼ်း', 'ဝၼ်းပူတ်ႉ', 'ဝၼ်းၽတ်း', 'ဝၼ်းသုၵ်း', 'ဝၼ်းသဝ်'], + 'weekdays_short' => ['တိတ့်', 'ၸၼ်', 'ၵၢၼ်း', 'ပုတ့်', 'ၽတ်း', 'သုၵ်း', 'သဝ်'], + 'weekdays_min' => ['တိတ့်', 'ၸၼ်', 'ၵၢၼ်း', 'ပုတ့်', 'ၽတ်း', 'သုၵ်း', 'သဝ်'], + 'alt_numbers' => ['႐႐', '႐႑', '႐႒', '႐႓', '႐႔', '႐႕', '႐႖', '႐႗', '႐႘', '႐႙', '႑႐', '႑႑', '႑႒', '႑႓', '႑႔', '႑႕', '႑႖', '႑႗', '႑႘', '႑႙', '႒႐', '႒႑', '႒႒', '႒႓', '႒႔', '႒႕', '႒႖', '႒႗', '႒႘', '႒႙', '႓႐', '႓႑', '႓႒', '႓႓', '႓႔', '႓႕', '႓႖', '႓႗', '႓႘', '႓႙', '႔႐', '႔႑', '႔႒', '႔႓', '႔႔', '႔႕', '႔႖', '႔႗', '႔႘', '႔႙', '႕႐', '႕႑', '႕႒', '႕႓', '႕႔', '႕႕', '႕႖', '႕႗', '႕႘', '႕႙', '႖႐', '႖႑', '႖႒', '႖႓', '႖႔', '႖႕', '႖႖', '႖႗', '႖႘', '႖႙', '႗႐', '႗႑', '႗႒', '႗႓', '႗႔', '႗႕', '႗႖', '႗႗', '႗႘', '႗႙', '႘႐', '႘႑', '႘႒', '႘႓', '႘႔', '႘႕', '႘႖', '႘႗', '႘႘', '႘႙', '႙႐', '႙႑', '႙႒', '႙႓', '႙႔', '႙႕', '႙႖', '႙႗', '႙႘', '႙႙'], + 'meridiem' => ['ၵၢင်ၼႂ်', 'တၢမ်းၶမ်ႈ'], + + 'month' => ':count လိူၼ်', // less reliable + 'm' => ':count လိူၼ်', // less reliable + 'a_month' => ':count လိူၼ်', // less reliable + + 'week' => ':count ဝၼ်း', // less reliable + 'w' => ':count ဝၼ်း', // less reliable + 'a_week' => ':count ဝၼ်း', // less reliable + + 'hour' => ':count ຕີ', // less reliable + 'h' => ':count ຕີ', // less reliable + 'a_hour' => ':count ຕີ', // less reliable + + 'minute' => ':count ເດັກ', // less reliable + 'min' => ':count ເດັກ', // less reliable + 'a_minute' => ':count ເດັກ', // less reliable + + 'second' => ':count ဢိုၼ်ႇ', // less reliable + 's' => ':count ဢိုၼ်ႇ', // less reliable + 'a_second' => ':count ဢိုၼ်ႇ', // less reliable + + 'year' => ':count ပီ', + 'y' => ':count ပီ', + 'a_year' => ':count ပီ', + + 'day' => ':count ກາງວັນ', + 'd' => ':count ກາງວັນ', + 'a_day' => ':count ກາງວັນ', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/shs.php b/vendor/nesbot/carbon/src/Carbon/Lang/shs.php new file mode 100644 index 0000000..8d2e1d7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/shs.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/shs_CA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/shs_CA.php b/vendor/nesbot/carbon/src/Carbon/Lang/shs_CA.php new file mode 100644 index 0000000..08d385e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/shs_CA.php @@ -0,0 +1,38 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Neskie Manuel bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['Pellkwet̓min', 'Pelctsipwen̓ten', 'Pellsqépts', 'Peslléwten', 'Pell7ell7é7llqten', 'Pelltspéntsk', 'Pelltqwelq̓wél̓t', 'Pellct̓éxel̓cten', 'Pesqelqlélten', 'Pesllwélsten', 'Pellc7ell7é7llcwten̓', 'Pelltetétq̓em'], + 'months_short' => ['Kwe', 'Tsi', 'Sqe', 'Éwt', 'Ell', 'Tsp', 'Tqw', 'Ct̓é', 'Qel', 'Wél', 'U7l', 'Tet'], + 'weekdays' => ['Sxetspesq̓t', 'Spetkesq̓t', 'Selesq̓t', 'Skellesq̓t', 'Smesesq̓t', 'Stselkstesq̓t', 'Stqmekstesq̓t'], + 'weekdays_short' => ['Sxe', 'Spe', 'Sel', 'Ske', 'Sme', 'Sts', 'Stq'], + 'weekdays_min' => ['Sxe', 'Spe', 'Sel', 'Ske', 'Sme', 'Sts', 'Stq'], + 'day_of_first_week_of_year' => 1, + + 'year' => ':count sqlélten', // less reliable + 'y' => ':count sqlélten', // less reliable + 'a_year' => ':count sqlélten', // less reliable + + 'month' => ':count swewll', // less reliable + 'm' => ':count swewll', // less reliable + 'a_month' => ':count swewll', // less reliable + + 'hour' => ':count seqwlút', // less reliable + 'h' => ':count seqwlút', // less reliable + 'a_hour' => ':count seqwlút', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/si.php b/vendor/nesbot/carbon/src/Carbon/Lang/si.php new file mode 100644 index 0000000..636bf69 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/si.php @@ -0,0 +1,78 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - Serhan Apaydın + * - JD Isaacks + * - Malinda Weerasinghe (MalindaWMD) + */ +return [ + 'year' => '{1}වසර 1|වසර :count', + 'a_year' => '{1}වසරක්|වසර :count', + 'month' => '{1}මාස 1|මාස :count', + 'a_month' => '{1}මාසය|මාස :count', + 'week' => '{1}සති 1|සති :count', + 'a_week' => '{1}සතියක්|සති :count', + 'day' => '{1}දින 1|දින :count', + 'a_day' => '{1}දිනක්|දින :count', + 'hour' => '{1}පැය 1|පැය :count', + 'a_hour' => '{1}පැයක්|පැය :count', + 'minute' => '{1}මිනිත්තු 1|මිනිත්තු :count', + 'a_minute' => '{1}මිනිත්තුවක්|මිනිත්තු :count', + 'second' => '{1}තත්පර 1|තත්පර :count', + 'a_second' => '{1}තත්පර කිහිපයකට|තත්පර :count', + 'ago' => ':time කට පෙර', + 'from_now' => function ($time) { + if (preg_match('/දින \d/u', $time)) { + return $time.' න්'; + } + + return $time.' කින්'; + }, + 'before' => ':time කට පෙර', + 'after' => function ($time) { + if (preg_match('/දින \d/u', $time)) { + return $time.' න්'; + } + + return $time.' කින්'; + }, + 'diff_now' => 'දැන්', + 'diff_today' => 'අද', + 'diff_yesterday' => 'ඊයේ', + 'diff_tomorrow' => 'හෙට', + 'formats' => [ + 'LT' => 'a h:mm', + 'LTS' => 'a h:mm:ss', + 'L' => 'YYYY/MM/DD', + 'LL' => 'YYYY MMMM D', + 'LLL' => 'YYYY MMMM D, a h:mm', + 'LLLL' => 'YYYY MMMM D [වැනි] dddd, a h:mm:ss', + ], + 'calendar' => [ + 'sameDay' => '[අද] LT[ට]', + 'nextDay' => '[හෙට] LT[ට]', + 'nextWeek' => 'dddd LT[ට]', + 'lastDay' => '[ඊයේ] LT[ට]', + 'lastWeek' => '[පසුගිය] dddd LT[ට]', + 'sameElse' => 'L', + ], + 'ordinal' => ':number වැනි', + 'meridiem' => ['පෙර වරු', 'පස් වරු', 'පෙ.ව.', 'ප.ව.'], + 'months' => ['ජනවාරි', 'පෙබරවාරි', 'මාර්තු', 'අප්‍රේල්', 'මැයි', 'ජූනි', 'ජූලි', 'අගෝස්තු', 'සැප්තැම්බර්', 'ඔක්තෝබර්', 'නොවැම්බර්', 'දෙසැම්බර්'], + 'months_short' => ['ජන', 'පෙබ', 'මාර්', 'අප්', 'මැයි', 'ජූනි', 'ජූලි', 'අගෝ', 'සැප්', 'ඔක්', 'නොවැ', 'දෙසැ'], + 'weekdays' => ['ඉරිදා', 'සඳුදා', 'අඟහරුවාදා', 'බදාදා', 'බ්‍රහස්පතින්දා', 'සිකුරාදා', 'සෙනසුරාදා'], + 'weekdays_short' => ['ඉරි', 'සඳු', 'අඟ', 'බදා', 'බ්‍රහ', 'සිකු', 'සෙන'], + 'weekdays_min' => ['ඉ', 'ස', 'අ', 'බ', 'බ්‍ර', 'සි', 'සෙ'], + 'first_day_of_week' => 1, +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/si_LK.php b/vendor/nesbot/carbon/src/Carbon/Lang/si_LK.php new file mode 100644 index 0000000..81c44e0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/si_LK.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/si.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sid.php b/vendor/nesbot/carbon/src/Carbon/Lang/sid.php new file mode 100644 index 0000000..b1c6521 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sid.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/sid_ET.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sid_ET.php b/vendor/nesbot/carbon/src/Carbon/Lang/sid_ET.php new file mode 100644 index 0000000..1296f9b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sid_ET.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation locales@geez.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + 'months_short' => ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + 'weekdays' => ['Sambata', 'Sanyo', 'Maakisanyo', 'Roowe', 'Hamuse', 'Arbe', 'Qidaame'], + 'weekdays_short' => ['Sam', 'San', 'Mak', 'Row', 'Ham', 'Arb', 'Qid'], + 'weekdays_min' => ['Sam', 'San', 'Mak', 'Row', 'Ham', 'Arb', 'Qid'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['soodo', 'hawwaro'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sk.php b/vendor/nesbot/carbon/src/Carbon/Lang/sk.php new file mode 100644 index 0000000..08af197 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sk.php @@ -0,0 +1,83 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Philippe Vaucher + * - Martin Suja + * - Tsutomu Kuroda + * - tjku + * - Max Melentiev + * - Juanito Fatas + * - Ivan Stana + * - Akira Matsuda + * - Christopher Dell + * - James McKinney + * - Enrique Vidal + * - Simone Carletti + * - Aaron Patterson + * - Jozef Fulop + * - Nicolás Hock Isaza + * - Tom Hughes + * - Simon Hürlimann (CyT) + * - jofi + * - Jakub ADAMEC + * - Marek Adamický + * - AlterwebStudio + */ +return [ + 'year' => 'rok|:count roky|:count rokov', + 'y' => ':count r', + 'month' => 'mesiac|:count mesiace|:count mesiacov', + 'm' => ':count m', + 'week' => 'týždeň|:count týždne|:count týždňov', + 'w' => ':count t', + 'day' => 'deň|:count dni|:count dní', + 'd' => ':count d', + 'hour' => 'hodinu|:count hodiny|:count hodín', + 'h' => ':count h', + 'minute' => 'minútu|:count minúty|:count minút', + 'min' => ':count min', + 'second' => 'sekundu|:count sekundy|:count sekúnd', + 'a_second' => 'pár sekúnd|:count sekundy|:count sekúnd', + 's' => ':count s', + 'ago' => 'pred :time', + 'from_now' => 'o :time', + 'after' => ':time po', + 'before' => ':time pred', + 'year_ago' => 'rokom|:count rokmi|:count rokmi', + 'month_ago' => 'mesiacom|:count mesiacmi|:count mesiacmi', + 'week_ago' => 'týždňom|:count týždňami|:count týždňami', + 'day_ago' => 'dňom|:count dňami|:count dňami', + 'hour_ago' => 'hodinou|:count hodinami|:count hodinami', + 'minute_ago' => 'minútou|:count minútami|:count minútami', + 'second_ago' => 'sekundou|:count sekundami|:count sekundami', + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' a '], + 'diff_now' => 'teraz', + 'diff_yesterday' => 'včera', + 'diff_tomorrow' => 'zajtra', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'DD. MMMM YYYY', + 'LLL' => 'D. M. HH:mm', + 'LLLL' => 'dddd D. MMMM YYYY HH:mm', + ], + 'weekdays' => ['nedeľa', 'pondelok', 'utorok', 'streda', 'štvrtok', 'piatok', 'sobota'], + 'weekdays_short' => ['ned', 'pod', 'uto', 'str', 'štv', 'pia', 'sob'], + 'weekdays_min' => ['ne', 'po', 'ut', 'st', 'št', 'pi', 'so'], + 'months' => ['január', 'február', 'marec', 'apríl', 'máj', 'jún', 'júl', 'august', 'september', 'október', 'november', 'december'], + 'months_short' => ['jan', 'feb', 'mar', 'apr', 'máj', 'jún', 'júl', 'aug', 'sep', 'okt', 'nov', 'dec'], + 'meridiem' => ['dopoludnia', 'popoludní'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sk_SK.php b/vendor/nesbot/carbon/src/Carbon/Lang/sk_SK.php new file mode 100644 index 0000000..0515601 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sk_SK.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/sk.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sl.php b/vendor/nesbot/carbon/src/Carbon/Lang/sl.php new file mode 100644 index 0000000..b000e30 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sl.php @@ -0,0 +1,129 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Philippe Vaucher + * - Tsutomu Kuroda + * - tjku + * - Max Melentiev + * - Juanito Fatas + * - Akira Matsuda + * - Christopher Dell + * - Enrique Vidal + * - Simone Carletti + * - Aaron Patterson + * - Nicolás Hock Isaza + * - Miha Rebernik + * - Gal Jakič (morpheus7CS) + * - Glavić + * - Anže Časar + * - Lovro Tramšek (Lovro1107) + * - burut13 + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => ':count leto|:count leti|:count leta|:count let', + 'y' => ':count leto|:count leti|:count leta|:count let', + 'month' => ':count mesec|:count meseca|:count mesece|:count mesecev', + 'm' => ':count mes.', + 'week' => ':count teden|:count tedna|:count tedne|:count tednov', + 'w' => ':count ted.', + 'day' => ':count dan|:count dni|:count dni|:count dni', + 'd' => ':count dan|:count dni|:count dni|:count dni', + 'hour' => ':count ura|:count uri|:count ure|:count ur', + 'h' => ':count h', + 'minute' => ':count minuta|:count minuti|:count minute|:count minut', + 'min' => ':count min.', + 'second' => ':count sekunda|:count sekundi|:count sekunde|:count sekund', + 'a_second' => '{1}nekaj sekund|:count sekunda|:count sekundi|:count sekunde|:count sekund', + 's' => ':count s', + + 'year_ago' => ':count letom|:count letoma|:count leti|:count leti', + 'y_ago' => ':count letom|:count letoma|:count leti|:count leti', + 'month_ago' => ':count mesecem|:count meseci|:count meseci|:count meseci', + 'week_ago' => ':count tednom|:count tednoma|:count tedni|:count tedni', + 'day_ago' => ':count dnem|:count dnevoma|:count dnevi|:count dnevi', + 'd_ago' => ':count dnem|:count dnevoma|:count dnevi|:count dnevi', + 'hour_ago' => ':count uro|:count urama|:count urami|:count urami', + 'minute_ago' => ':count minuto|:count minutama|:count minutami|:count minutami', + 'second_ago' => ':count sekundo|:count sekundama|:count sekundami|:count sekundami', + + 'day_from_now' => ':count dan|:count dneva|:count dni|:count dni', + 'd_from_now' => ':count dan|:count dneva|:count dni|:count dni', + 'hour_from_now' => ':count uro|:count uri|:count ure|:count ur', + 'minute_from_now' => ':count minuto|:count minuti|:count minute|:count minut', + 'second_from_now' => ':count sekundo|:count sekundi|:count sekunde|:count sekund', + + 'ago' => 'pred :time', + 'from_now' => 'čez :time', + 'after' => ':time kasneje', + 'before' => ':time prej', + + 'diff_now' => 'ravnokar', + 'diff_today' => 'danes', + 'diff_today_regexp' => 'danes(?:\\s+ob)?', + 'diff_yesterday' => 'včeraj', + 'diff_yesterday_regexp' => 'včeraj(?:\\s+ob)?', + 'diff_tomorrow' => 'jutri', + 'diff_tomorrow_regexp' => 'jutri(?:\\s+ob)?', + 'diff_before_yesterday' => 'predvčerajšnjim', + 'diff_after_tomorrow' => 'pojutrišnjem', + + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + + 'period_start_date' => 'od :date', + 'period_end_date' => 'do :date', + + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D. MMMM YYYY', + 'LLL' => 'D. MMMM YYYY H:mm', + 'LLLL' => 'dddd, D. MMMM YYYY H:mm', + ], + 'calendar' => [ + 'sameDay' => '[danes ob] LT', + 'nextDay' => '[jutri ob] LT', + 'nextWeek' => 'dddd [ob] LT', + 'lastDay' => '[včeraj ob] LT', + 'lastWeek' => function (CarbonInterface $date) { + switch ($date->dayOfWeek) { + case 0: + return '[preteklo] [nedeljo] [ob] LT'; + case 1: + return '[pretekli] [ponedeljek] [ob] LT'; + case 2: + return '[pretekli] [torek] [ob] LT'; + case 3: + return '[preteklo] [sredo] [ob] LT'; + case 4: + return '[pretekli] [četrtek] [ob] LT'; + case 5: + return '[pretekli] [petek] [ob] LT'; + case 6: + return '[preteklo] [soboto] [ob] LT'; + } + }, + 'sameElse' => 'L', + ], + 'months' => ['januar', 'februar', 'marec', 'april', 'maj', 'junij', 'julij', 'avgust', 'september', 'oktober', 'november', 'december'], + 'months_short' => ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'avg', 'sep', 'okt', 'nov', 'dec'], + 'weekdays' => ['nedelja', 'ponedeljek', 'torek', 'sreda', 'četrtek', 'petek', 'sobota'], + 'weekdays_short' => ['ned', 'pon', 'tor', 'sre', 'čet', 'pet', 'sob'], + 'weekdays_min' => ['ne', 'po', 'to', 'sr', 'če', 'pe', 'so'], + 'list' => [', ', ' in '], + 'meridiem' => ['dopoldan', 'popoldan'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sl_SI.php b/vendor/nesbot/carbon/src/Carbon/Lang/sl_SI.php new file mode 100644 index 0000000..5dad8c8 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sl_SI.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/sl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sm.php b/vendor/nesbot/carbon/src/Carbon/Lang/sm.php new file mode 100644 index 0000000..e8c118a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sm.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/sm_WS.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sm_WS.php b/vendor/nesbot/carbon/src/Carbon/Lang/sm_WS.php new file mode 100644 index 0000000..f066068 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sm_WS.php @@ -0,0 +1,53 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Samsung Electronics Co., Ltd. akhilesh.k@samsung.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['Ianuari', 'Fepuari', 'Mati', 'Aperila', 'Me', 'Iuni', 'Iulai', 'Auguso', 'Setema', 'Oketopa', 'Novema', 'Tesema'], + 'months_short' => ['Ian', 'Fep', 'Mat', 'Ape', 'Me', 'Iun', 'Iul', 'Aug', 'Set', 'Oke', 'Nov', 'Tes'], + 'weekdays' => ['Aso Sa', 'Aso Gafua', 'Aso Lua', 'Aso Lulu', 'Aso Tofi', 'Aso Farail', 'Aso To\'ana\'i'], + 'weekdays_short' => ['Aso Sa', 'Aso Gaf', 'Aso Lua', 'Aso Lul', 'Aso Tof', 'Aso Far', 'Aso To\''], + 'weekdays_min' => ['Aso Sa', 'Aso Gaf', 'Aso Lua', 'Aso Lul', 'Aso Tof', 'Aso Far', 'Aso To\''], + + 'hour' => ':count uati', // less reliable + 'h' => ':count uati', // less reliable + 'a_hour' => ':count uati', // less reliable + + 'minute' => ':count itiiti', // less reliable + 'min' => ':count itiiti', // less reliable + 'a_minute' => ':count itiiti', // less reliable + + 'second' => ':count lua', // less reliable + 's' => ':count lua', // less reliable + 'a_second' => ':count lua', // less reliable + + 'year' => ':count tausaga', + 'y' => ':count tausaga', + 'a_year' => ':count tausaga', + + 'month' => ':count māsina', + 'm' => ':count māsina', + 'a_month' => ':count māsina', + + 'week' => ':count vaiaso', + 'w' => ':count vaiaso', + 'a_week' => ':count vaiaso', + + 'day' => ':count aso', + 'd' => ':count aso', + 'a_day' => ':count aso', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/smn.php b/vendor/nesbot/carbon/src/Carbon/Lang/smn.php new file mode 100644 index 0000000..20add02 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/smn.php @@ -0,0 +1,57 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['ip.', 'ep.'], + 'weekdays' => ['pasepeeivi', 'vuossaargâ', 'majebaargâ', 'koskoho', 'tuorâstuv', 'vástuppeeivi', 'lávurduv'], + 'weekdays_short' => ['pas', 'vuo', 'maj', 'kos', 'tuo', 'vás', 'láv'], + 'weekdays_min' => ['pa', 'vu', 'ma', 'ko', 'tu', 'vá', 'lá'], + 'weekdays_standalone' => ['pasepeivi', 'vuossargâ', 'majebargâ', 'koskokko', 'tuorâstâh', 'vástuppeivi', 'lávurdâh'], + 'months' => ['uđđâivemáánu', 'kuovâmáánu', 'njuhčâmáánu', 'cuáŋuimáánu', 'vyesimáánu', 'kesimáánu', 'syeinimáánu', 'porgemáánu', 'čohčâmáánu', 'roovvâdmáánu', 'skammâmáánu', 'juovlâmáánu'], + 'months_short' => ['uđiv', 'kuovâ', 'njuhčâ', 'cuáŋui', 'vyesi', 'kesi', 'syeini', 'porge', 'čohčâ', 'roovvâd', 'skammâ', 'juovlâ'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'H.mm', + 'LTS' => 'H.mm.ss', + 'L' => 'D.M.YYYY', + 'LL' => 'MMM D. YYYY', + 'LLL' => 'MMMM D. YYYY H.mm', + 'LLLL' => 'dddd, MMMM D. YYYY H.mm', + ], + + 'hour' => ':count äigi', // less reliable + 'h' => ':count äigi', // less reliable + 'a_hour' => ':count äigi', // less reliable + + 'year' => ':count ihe', + 'y' => ':count ihe', + 'a_year' => ':count ihe', + + 'month' => ':count mánuppaje', + 'm' => ':count mánuppaje', + 'a_month' => ':count mánuppaje', + + 'week' => ':count okko', + 'w' => ':count okko', + 'a_week' => ':count okko', + + 'day' => ':count peivi', + 'd' => ':count peivi', + 'a_day' => ':count peivi', + + 'minute' => ':count miinut', + 'min' => ':count miinut', + 'a_minute' => ':count miinut', + + 'second' => ':count nubbe', + 's' => ':count nubbe', + 'a_second' => ':count nubbe', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sn.php b/vendor/nesbot/carbon/src/Carbon/Lang/sn.php new file mode 100644 index 0000000..4f25028 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sn.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['a', 'p'], + 'weekdays' => ['Svondo', 'Muvhuro', 'Chipiri', 'Chitatu', 'China', 'Chishanu', 'Mugovera'], + 'weekdays_short' => ['Svo', 'Muv', 'Chp', 'Cht', 'Chn', 'Chs', 'Mug'], + 'weekdays_min' => ['Sv', 'Mu', 'Cp', 'Ct', 'Cn', 'Cs', 'Mg'], + 'months' => ['Ndira', 'Kukadzi', 'Kurume', 'Kubvumbi', 'Chivabvu', 'Chikumi', 'Chikunguru', 'Nyamavhuvhu', 'Gunyana', 'Gumiguru', 'Mbudzi', 'Zvita'], + 'months_short' => ['Ndi', 'Kuk', 'Kur', 'Kub', 'Chv', 'Chk', 'Chg', 'Nya', 'Gun', 'Gum', 'Mbu', 'Zvi'], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY-MM-dd', + 'LL' => 'YYYY MMM D', + 'LLL' => 'YYYY MMMM D HH:mm', + 'LLLL' => 'YYYY MMMM D, dddd HH:mm', + ], + + 'year' => 'makore :count', + 'y' => 'makore :count', + 'a_year' => 'makore :count', + + 'month' => 'mwedzi :count', + 'm' => 'mwedzi :count', + 'a_month' => 'mwedzi :count', + + 'week' => 'vhiki :count', + 'w' => 'vhiki :count', + 'a_week' => 'vhiki :count', + + 'day' => 'mazuva :count', + 'd' => 'mazuva :count', + 'a_day' => 'mazuva :count', + + 'hour' => 'maawa :count', + 'h' => 'maawa :count', + 'a_hour' => 'maawa :count', + + 'minute' => 'minitsi :count', + 'min' => 'minitsi :count', + 'a_minute' => 'minitsi :count', + + 'second' => 'sekonzi :count', + 's' => 'sekonzi :count', + 'a_second' => 'sekonzi :count', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/so.php b/vendor/nesbot/carbon/src/Carbon/Lang/so.php new file mode 100644 index 0000000..5785271 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/so.php @@ -0,0 +1,74 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Author: + * - Abdifatah Abdilahi(@abdifatahz) + */ +return [ + 'year' => ':count sanad|:count sanadood', + 'a_year' => 'sanad|:count sanadood', + 'y' => '{1}:countsn|{0}:countsns|]1,Inf[:countsn', + 'month' => ':count bil|:count bilood', + 'a_month' => 'bil|:count bilood', + 'm' => ':countbil', + 'week' => ':count isbuuc', + 'a_week' => 'isbuuc|:count isbuuc', + 'w' => ':countis', + 'day' => ':count maalin|:count maalmood', + 'a_day' => 'maalin|:count maalmood', + 'd' => ':countml', + 'hour' => ':count saac', + 'a_hour' => 'saacad|:count saac', + 'h' => ':countsc', + 'minute' => ':count daqiiqo', + 'a_minute' => 'daqiiqo|:count daqiiqo', + 'min' => ':countdq', + 'second' => ':count ilbidhiqsi', + 'a_second' => 'xooga ilbidhiqsiyo|:count ilbidhiqsi', + 's' => ':countil', + 'ago' => ':time kahor', + 'from_now' => ':time gudahood', + 'after' => ':time kedib', + 'before' => ':time kahor', + 'diff_now' => 'hada', + 'diff_today' => 'maanta', + 'diff_today_regexp' => 'maanta(?:\s+markay\s+(?:tahay|ahayd))?', + 'diff_yesterday' => 'shalayto', + 'diff_yesterday_regexp' => 'shalayto(?:\s+markay\s+ahayd)?', + 'diff_tomorrow' => 'beri', + 'diff_tomorrow_regexp' => 'beri(?:\s+markay\s+tahay)?', + 'diff_before_yesterday' => 'doraato', + 'diff_after_tomorrow' => 'saadanbe', + 'period_recurrences' => 'mar|:count jeer', + 'period_interval' => ':interval kasta', + 'period_start_date' => 'laga bilaabo :date', + 'period_end_date' => 'ilaa :date', + 'months' => ['Janaayo', 'Febraayo', 'Abriil', 'Maajo', 'Juun', 'Luuliyo', 'Agoosto', 'Sebteembar', 'Oktoobar', 'Nofeembar', 'Diseembar'], + 'months_short' => ['Jan', 'Feb', 'Mar', 'Abr', 'Mjo', 'Jun', 'Lyo', 'Agt', 'Seb', 'Okt', 'Nof', 'Dis'], + 'weekdays' => ['Axad', 'Isniin', 'Talaada', 'Arbaca', 'Khamiis', 'Jimce', 'Sabti'], + 'weekdays_short' => ['Axd', 'Isn', 'Tal', 'Arb', 'Kha', 'Jim', 'Sbt'], + 'weekdays_min' => ['Ax', 'Is', 'Ta', 'Ar', 'Kh', 'Ji', 'Sa'], + 'list' => [', ', ' and '], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'calendar' => [ + 'sameDay' => '[Maanta markay tahay] LT', + 'nextDay' => '[Beri markay tahay] LT', + 'nextWeek' => 'dddd [markay tahay] LT', + 'lastDay' => '[Shalay markay ahayd] LT', + 'lastWeek' => '[Hore] dddd [Markay ahayd] LT', + 'sameElse' => 'L', + ], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/so_DJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/so_DJ.php new file mode 100644 index 0000000..273dda8 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/so_DJ.php @@ -0,0 +1,20 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation locales@geez.org + */ +return array_replace_recursive(require __DIR__.'/so.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/so_ET.php b/vendor/nesbot/carbon/src/Carbon/Lang/so_ET.php new file mode 100644 index 0000000..7b69971 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/so_ET.php @@ -0,0 +1,16 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation locales@geez.org + */ +return require __DIR__.'/so.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/so_KE.php b/vendor/nesbot/carbon/src/Carbon/Lang/so_KE.php new file mode 100644 index 0000000..7b69971 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/so_KE.php @@ -0,0 +1,16 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation locales@geez.org + */ +return require __DIR__.'/so.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/so_SO.php b/vendor/nesbot/carbon/src/Carbon/Lang/so_SO.php new file mode 100644 index 0000000..7b69971 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/so_SO.php @@ -0,0 +1,16 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation locales@geez.org + */ +return require __DIR__.'/so.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sq.php b/vendor/nesbot/carbon/src/Carbon/Lang/sq.php new file mode 100644 index 0000000..ffa592e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sq.php @@ -0,0 +1,79 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - JD Isaacks + * - Fadion Dashi + */ +return [ + 'year' => ':count vit|:count vjet', + 'a_year' => 'një vit|:count vite', + 'y' => ':count v.', + 'month' => ':count muaj', + 'a_month' => 'një muaj|:count muaj', + 'm' => ':count muaj', + 'week' => ':count javë', + 'a_week' => ':count javë|:count javë', + 'w' => ':count j.', + 'day' => ':count ditë', + 'a_day' => 'një ditë|:count ditë', + 'd' => ':count d.', + 'hour' => ':count orë', + 'a_hour' => 'një orë|:count orë', + 'h' => ':count o.', + 'minute' => ':count minutë|:count minuta', + 'a_minute' => 'një minutë|:count minuta', + 'min' => ':count min.', + 'second' => ':count sekondë|:count sekonda', + 'a_second' => 'disa sekonda|:count sekonda', + 's' => ':count s.', + 'ago' => ':time më parë', + 'from_now' => 'në :time', + 'after' => ':time pas', + 'before' => ':time para', + 'diff_now' => 'tani', + 'diff_today' => 'Sot', + 'diff_today_regexp' => 'Sot(?:\\s+në)?', + 'diff_yesterday' => 'dje', + 'diff_yesterday_regexp' => 'Dje(?:\\s+në)?', + 'diff_tomorrow' => 'nesër', + 'diff_tomorrow_regexp' => 'Nesër(?:\\s+në)?', + 'diff_before_yesterday' => 'pardje', + 'diff_after_tomorrow' => 'pasnesër', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Sot në] LT', + 'nextDay' => '[Nesër në] LT', + 'nextWeek' => 'dddd [në] LT', + 'lastDay' => '[Dje në] LT', + 'lastWeek' => 'dddd [e kaluar në] LT', + 'sameElse' => 'L', + ], + 'ordinal' => ':number.', + 'meridiem' => ['PD', 'MD'], + 'months' => ['janar', 'shkurt', 'mars', 'prill', 'maj', 'qershor', 'korrik', 'gusht', 'shtator', 'tetor', 'nëntor', 'dhjetor'], + 'months_short' => ['jan', 'shk', 'mar', 'pri', 'maj', 'qer', 'kor', 'gus', 'sht', 'tet', 'nën', 'dhj'], + 'weekdays' => ['e diel', 'e hënë', 'e martë', 'e mërkurë', 'e enjte', 'e premte', 'e shtunë'], + 'weekdays_short' => ['die', 'hën', 'mar', 'mër', 'enj', 'pre', 'sht'], + 'weekdays_min' => ['d', 'h', 'ma', 'më', 'e', 'p', 'sh'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' dhe '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sq_AL.php b/vendor/nesbot/carbon/src/Carbon/Lang/sq_AL.php new file mode 100644 index 0000000..ea5df3f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sq_AL.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/sq.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sq_MK.php b/vendor/nesbot/carbon/src/Carbon/Lang/sq_MK.php new file mode 100644 index 0000000..62f752c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sq_MK.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/sq.php', [ + 'formats' => [ + 'L' => 'D.M.YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY, HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY, HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sq_XK.php b/vendor/nesbot/carbon/src/Carbon/Lang/sq_XK.php new file mode 100644 index 0000000..62f752c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sq_XK.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/sq.php', [ + 'formats' => [ + 'L' => 'D.M.YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY, HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY, HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr.php new file mode 100644 index 0000000..68ba663 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sr.php @@ -0,0 +1,112 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - François B + * - shaishavgandhi05 + * - Serhan Apaydın + * - JD Isaacks + * - Glavić + * - Milos Sakovic + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => ':count godina|:count godine|:count godina', + 'y' => ':count g.', + 'month' => ':count mesec|:count meseca|:count meseci', + 'm' => ':count mj.', + 'week' => ':count nedelja|:count nedelje|:count nedelja', + 'w' => ':count ned.', + 'day' => ':count dan|:count dana|:count dana', + 'd' => ':count d.', + 'hour' => ':count sat|:count sata|:count sati', + 'h' => ':count č.', + 'minute' => ':count minut|:count minuta|:count minuta', + 'min' => ':count min.', + 'second' => ':count sekundu|:count sekunde|:count sekundi', + 's' => ':count sek.', + 'ago' => 'pre :time', + 'from_now' => 'za :time', + 'after' => 'nakon :time', + 'before' => 'pre :time', + + 'year_from_now' => ':count godinu|:count godine|:count godina', + 'year_ago' => ':count godinu|:count godine|:count godina', + 'week_from_now' => ':count nedelju|:count nedelje|:count nedelja', + 'week_ago' => ':count nedelju|:count nedelje|:count nedelja', + + 'diff_now' => 'upravo sada', + 'diff_today' => 'danas', + 'diff_today_regexp' => 'danas(?:\\s+u)?', + 'diff_yesterday' => 'juče', + 'diff_yesterday_regexp' => 'juče(?:\\s+u)?', + 'diff_tomorrow' => 'sutra', + 'diff_tomorrow_regexp' => 'sutra(?:\\s+u)?', + 'diff_before_yesterday' => 'prekjuče', + 'diff_after_tomorrow' => 'preksutra', + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D. MMMM YYYY', + 'LLL' => 'D. MMMM YYYY H:mm', + 'LLLL' => 'dddd, D. MMMM YYYY H:mm', + ], + 'calendar' => [ + 'sameDay' => '[danas u] LT', + 'nextDay' => '[sutra u] LT', + 'nextWeek' => function (CarbonInterface $date) { + switch ($date->dayOfWeek) { + case 0: + return '[u nedelju u] LT'; + case 3: + return '[u sredu u] LT'; + case 6: + return '[u subotu u] LT'; + default: + return '[u] dddd [u] LT'; + } + }, + 'lastDay' => '[juče u] LT', + 'lastWeek' => function (CarbonInterface $date) { + switch ($date->dayOfWeek) { + case 0: + return '[prošle nedelje u] LT'; + case 1: + return '[prošlog ponedeljka u] LT'; + case 2: + return '[prošlog utorka u] LT'; + case 3: + return '[prošle srede u] LT'; + case 4: + return '[prošlog četvrtka u] LT'; + case 5: + return '[prošlog petka u] LT'; + default: + return '[prošle subote u] LT'; + } + }, + 'sameElse' => 'L', + ], + 'ordinal' => ':number.', + 'months' => ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'], + 'months_short' => ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'], + 'weekdays' => ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'], + 'weekdays_short' => ['ned.', 'pon.', 'uto.', 'sre.', 'čet.', 'pet.', 'sub.'], + 'weekdays_min' => ['ne', 'po', 'ut', 'sr', 'če', 'pe', 'su'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' i '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php new file mode 100644 index 0000000..c09df19 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php @@ -0,0 +1,112 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - François B + * - shaishavgandhi05 + * - Serhan Apaydın + * - JD Isaacks + * - Glavić + * - Nikola Zeravcic + * - Milos Sakovic + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => '{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count године|[0,Inf[:count година', + 'y' => ':count г.', + 'month' => '{1}:count месец|{2,3,4}:count месеца|[0,Inf[:count месеци', + 'm' => ':count м.', + 'week' => '{1}:count недеља|{2,3,4}:count недеље|[0,Inf[:count недеља', + 'w' => ':count нед.', + 'day' => '{1,21,31}:count дан|[0,Inf[:count дана', + 'd' => ':count д.', + 'hour' => '{1,21}:count сат|{2,3,4,22,23,24}:count сата|[0,Inf[:count сати', + 'h' => ':count ч.', + 'minute' => '{1,21,31,41,51}:count минут|[0,Inf[:count минута', + 'min' => ':count мин.', + 'second' => '{1,21,31,41,51}:count секунд|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count секунде|[0,Inf[:count секунди', + 's' => ':count сек.', + 'ago' => 'пре :time', + 'from_now' => 'за :time', + 'after' => ':time након', + 'before' => ':time пре', + 'year_from_now' => '{1,21,31,41,51}:count годину|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count године|[0,Inf[:count година', + 'year_ago' => '{1,21,31,41,51}:count годину|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count године|[0,Inf[:count година', + 'week_from_now' => '{1}:count недељу|{2,3,4}:count недеље|[0,Inf[:count недеља', + 'week_ago' => '{1}:count недељу|{2,3,4}:count недеље|[0,Inf[:count недеља', + 'diff_now' => 'управо сада', + 'diff_today' => 'данас', + 'diff_today_regexp' => 'данас(?:\\s+у)?', + 'diff_yesterday' => 'јуче', + 'diff_yesterday_regexp' => 'јуче(?:\\s+у)?', + 'diff_tomorrow' => 'сутра', + 'diff_tomorrow_regexp' => 'сутра(?:\\s+у)?', + 'diff_before_yesterday' => 'прекјуче', + 'diff_after_tomorrow' => 'прекосутра', + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D. MMMM YYYY', + 'LLL' => 'D. MMMM YYYY H:mm', + 'LLLL' => 'dddd, D. MMMM YYYY H:mm', + ], + 'calendar' => [ + 'sameDay' => '[данас у] LT', + 'nextDay' => '[сутра у] LT', + 'nextWeek' => function (CarbonInterface $date) { + switch ($date->dayOfWeek) { + case 0: + return '[у недељу у] LT'; + case 3: + return '[у среду у] LT'; + case 6: + return '[у суботу у] LT'; + default: + return '[у] dddd [у] LT'; + } + }, + 'lastDay' => '[јуче у] LT', + 'lastWeek' => function (CarbonInterface $date) { + switch ($date->dayOfWeek) { + case 0: + return '[прошле недеље у] LT'; + case 1: + return '[прошлог понедељка у] LT'; + case 2: + return '[прошлог уторка у] LT'; + case 3: + return '[прошле среде у] LT'; + case 4: + return '[прошлог четвртка у] LT'; + case 5: + return '[прошлог петка у] LT'; + default: + return '[прошле суботе у] LT'; + } + }, + 'sameElse' => 'L', + ], + 'ordinal' => ':number.', + 'months' => ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'], + 'months_short' => ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'сеп.', 'окт.', 'нов.', 'дец.'], + 'weekdays' => ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'], + 'weekdays_short' => ['нед.', 'пон.', 'уто.', 'сре.', 'чет.', 'пет.', 'суб.'], + 'weekdays_min' => ['не', 'по', 'ут', 'ср', 'че', 'пе', 'су'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' и '], + 'meridiem' => ['АМ', 'ПМ'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php new file mode 100644 index 0000000..0fb63d7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php @@ -0,0 +1,23 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/sr_Cyrl.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D.M.yy.', + 'LL' => 'DD.MM.YYYY.', + 'LLL' => 'DD. MMMM YYYY. HH:mm', + 'LLLL' => 'dddd, DD. MMMM YYYY. HH:mm', + ], + 'weekdays' => ['недјеља', 'понедељак', 'уторак', 'сриједа', 'четвртак', 'петак', 'субота'], + 'weekdays_short' => ['нед.', 'пон.', 'ут.', 'ср.', 'чет.', 'пет.', 'суб.'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php new file mode 100644 index 0000000..d13229a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php @@ -0,0 +1,109 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Glavić + * - Milos Sakovic + */ + +use Carbon\CarbonInterface; + +return [ + 'year' => '{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count године|[0,Inf[:count година', + 'y' => ':count г.', + 'month' => '{1}:count мјесец|{2,3,4}:count мјесеца|[0,Inf[:count мјесеци', + 'm' => ':count мј.', + 'week' => '{1}:count недјеља|{2,3,4}:count недјеље|[0,Inf[:count недјеља', + 'w' => ':count нед.', + 'day' => '{1,21,31}:count дан|[0,Inf[:count дана', + 'd' => ':count д.', + 'hour' => '{1,21}:count сат|{2,3,4,22,23,24}:count сата|[0,Inf[:count сати', + 'h' => ':count ч.', + 'minute' => '{1,21,31,41,51}:count минут|[0,Inf[:count минута', + 'min' => ':count мин.', + 'second' => '{1,21,31,41,51}:count секунд|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count секунде|[0,Inf[:count секунди', + 's' => ':count сек.', + 'ago' => 'прије :time', + 'from_now' => 'за :time', + 'after' => ':time након', + 'before' => ':time прије', + + 'year_from_now' => '{1,21,31,41,51}:count годину|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count године|[0,Inf[:count година', + 'year_ago' => '{1,21,31,41,51}:count годину|{2,3,4,22,23,24,32,33,34,42,43,44,52,53,54}:count године|[0,Inf[:count година', + + 'week_from_now' => '{1}:count недјељу|{2,3,4}:count недјеље|[0,Inf[:count недјеља', + 'week_ago' => '{1}:count недјељу|{2,3,4}:count недјеље|[0,Inf[:count недјеља', + + 'diff_now' => 'управо сада', + 'diff_today' => 'данас', + 'diff_today_regexp' => 'данас(?:\\s+у)?', + 'diff_yesterday' => 'јуче', + 'diff_yesterday_regexp' => 'јуче(?:\\s+у)?', + 'diff_tomorrow' => 'сутра', + 'diff_tomorrow_regexp' => 'сутра(?:\\s+у)?', + 'diff_before_yesterday' => 'прекјуче', + 'diff_after_tomorrow' => 'прекосјутра', + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D. MMMM YYYY', + 'LLL' => 'D. MMMM YYYY H:mm', + 'LLLL' => 'dddd, D. MMMM YYYY H:mm', + ], + 'calendar' => [ + 'sameDay' => '[данас у] LT', + 'nextDay' => '[сутра у] LT', + 'nextWeek' => function (CarbonInterface $date) { + switch ($date->dayOfWeek) { + case 0: + return '[у недељу у] LT'; + case 3: + return '[у среду у] LT'; + case 6: + return '[у суботу у] LT'; + default: + return '[у] dddd [у] LT'; + } + }, + 'lastDay' => '[јуче у] LT', + 'lastWeek' => function (CarbonInterface $date) { + switch ($date->dayOfWeek) { + case 0: + return '[прошле недеље у] LT'; + case 1: + return '[прошлог понедељка у] LT'; + case 2: + return '[прошлог уторка у] LT'; + case 3: + return '[прошле среде у] LT'; + case 4: + return '[прошлог четвртка у] LT'; + case 5: + return '[прошлог петка у] LT'; + default: + return '[прошле суботе у] LT'; + } + }, + 'sameElse' => 'L', + ], + 'ordinal' => ':number.', + 'months' => ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'], + 'months_short' => ['јан.', 'феб.', 'мар.', 'апр.', 'мај', 'јун', 'јул', 'авг.', 'сеп.', 'окт.', 'нов.', 'дец.'], + 'weekdays' => ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'], + 'weekdays_short' => ['нед.', 'пон.', 'уто.', 'сре.', 'чет.', 'пет.', 'суб.'], + 'weekdays_min' => ['не', 'по', 'ут', 'ср', 'че', 'пе', 'су'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' и '], + 'meridiem' => ['АМ', 'ПМ'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php new file mode 100644 index 0000000..492baf0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/sr_Cyrl_BA.php', [ + 'weekdays' => ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn.php new file mode 100644 index 0000000..9971674 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/sr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php new file mode 100644 index 0000000..897c674 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php @@ -0,0 +1,23 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/sr_Latn.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D.M.yy.', + 'LL' => 'DD.MM.YYYY.', + 'LLL' => 'DD. MMMM YYYY. HH:mm', + 'LLLL' => 'dddd, DD. MMMM YYYY. HH:mm', + ], + 'weekdays' => ['nedjelja', 'ponedeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'], + 'weekdays_short' => ['ned.', 'pon.', 'ut.', 'sr.', 'čet.', 'pet.', 'sub.'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php new file mode 100644 index 0000000..e2133ef --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php @@ -0,0 +1,66 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Glavić + * - Milos Sakovic + */ + +use Carbon\CarbonInterface; + +return array_replace_recursive(require __DIR__.'/sr.php', [ + 'month' => ':count mjesec|:count mjeseca|:count mjeseci', + 'week' => ':count nedjelja|:count nedjelje|:count nedjelja', + 'second' => ':count sekund|:count sekunde|:count sekundi', + 'ago' => 'prije :time', + 'from_now' => 'za :time', + 'after' => ':time nakon', + 'before' => ':time prije', + 'week_from_now' => ':count nedjelju|:count nedjelje|:count nedjelja', + 'week_ago' => ':count nedjelju|:count nedjelje|:count nedjelja', + 'diff_tomorrow' => 'sjutra', + 'calendar' => [ + 'nextDay' => '[sjutra u] LT', + 'nextWeek' => function (CarbonInterface $date) { + switch ($date->dayOfWeek) { + case 0: + return '[u nedjelju u] LT'; + case 3: + return '[u srijedu u] LT'; + case 6: + return '[u subotu u] LT'; + default: + return '[u] dddd [u] LT'; + } + }, + 'lastWeek' => function (CarbonInterface $date) { + switch ($date->dayOfWeek) { + case 0: + return '[prošle nedjelje u] LT'; + case 1: + return '[prošle nedjelje u] LT'; + case 2: + return '[prošlog utorka u] LT'; + case 3: + return '[prošle srijede u] LT'; + case 4: + return '[prošlog četvrtka u] LT'; + case 5: + return '[prošlog petka u] LT'; + default: + return '[prošle subote u] LT'; + } + }, + ], + 'weekdays' => ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'], + 'weekdays_short' => ['ned.', 'pon.', 'uto.', 'sri.', 'čet.', 'pet.', 'sub.'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php new file mode 100644 index 0000000..d0b9d10 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/sr_Latn_BA.php', [ + 'weekdays' => ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php new file mode 100644 index 0000000..d7c65b9 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/sr_Latn_ME.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS.php new file mode 100644 index 0000000..bc5e04b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS.php @@ -0,0 +1,16 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - sr_YU, sr_CS locale Danilo Segan bug-glibc-locales@gnu.org + */ +return require __DIR__.'/sr_Cyrl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php b/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php new file mode 100644 index 0000000..9971674 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/sr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ss.php b/vendor/nesbot/carbon/src/Carbon/Lang/ss.php new file mode 100644 index 0000000..1c52c9b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ss.php @@ -0,0 +1,78 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - Nicolai Davies + */ +return [ + 'year' => '{1}umnyaka|:count iminyaka', + 'month' => '{1}inyanga|:count tinyanga', + 'week' => '{1}:count liviki|:count emaviki', + 'day' => '{1}lilanga|:count emalanga', + 'hour' => '{1}lihora|:count emahora', + 'minute' => '{1}umzuzu|:count emizuzu', + 'second' => '{1}emizuzwana lomcane|:count mzuzwana', + 'ago' => 'wenteka nga :time', + 'from_now' => 'nga :time', + 'diff_yesterday' => 'Itolo', + 'diff_yesterday_regexp' => 'Itolo(?:\\s+nga)?', + 'diff_today' => 'Namuhla', + 'diff_today_regexp' => 'Namuhla(?:\\s+nga)?', + 'diff_tomorrow' => 'Kusasa', + 'diff_tomorrow_regexp' => 'Kusasa(?:\\s+nga)?', + 'formats' => [ + 'LT' => 'h:mm A', + 'LTS' => 'h:mm:ss A', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm A', + 'LLLL' => 'dddd, D MMMM YYYY h:mm A', + ], + 'calendar' => [ + 'sameDay' => '[Namuhla nga] LT', + 'nextDay' => '[Kusasa nga] LT', + 'nextWeek' => 'dddd [nga] LT', + 'lastDay' => '[Itolo nga] LT', + 'lastWeek' => 'dddd [leliphelile] [nga] LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number) { + $lastDigit = $number % 10; + + return $number.( + ((int) ($number % 100 / 10) === 1) ? 'e' : ( + ($lastDigit === 1 || $lastDigit === 2) ? 'a' : 'e' + ) + ); + }, + 'meridiem' => function ($hour) { + if ($hour < 11) { + return 'ekuseni'; + } + if ($hour < 15) { + return 'emini'; + } + if ($hour < 19) { + return 'entsambama'; + } + + return 'ebusuku'; + }, + 'months' => ['Bhimbidvwane', 'Indlovana', 'Indlov\'lenkhulu', 'Mabasa', 'Inkhwekhweti', 'Inhlaba', 'Kholwane', 'Ingci', 'Inyoni', 'Imphala', 'Lweti', 'Ingongoni'], + 'months_short' => ['Bhi', 'Ina', 'Inu', 'Mab', 'Ink', 'Inh', 'Kho', 'Igc', 'Iny', 'Imp', 'Lwe', 'Igo'], + 'weekdays' => ['Lisontfo', 'Umsombuluko', 'Lesibili', 'Lesitsatfu', 'Lesine', 'Lesihlanu', 'Umgcibelo'], + 'weekdays_short' => ['Lis', 'Umb', 'Lsb', 'Les', 'Lsi', 'Lsh', 'Umg'], + 'weekdays_min' => ['Li', 'Us', 'Lb', 'Lt', 'Ls', 'Lh', 'Ug'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ss_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ss_ZA.php new file mode 100644 index 0000000..ba89527 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ss_ZA.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/ss.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/st.php b/vendor/nesbot/carbon/src/Carbon/Lang/st.php new file mode 100644 index 0000000..b065445 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/st.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/st_ZA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/st_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/st_ZA.php new file mode 100644 index 0000000..5bce7f2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/st_ZA.php @@ -0,0 +1,54 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['Pherekgong', 'Hlakola', 'Tlhakubele', 'Mmese', 'Motsheanong', 'Phupjane', 'Phupu', 'Phato', 'Leotse', 'Mphalane', 'Pudungwana', 'Tshitwe'], + 'months_short' => ['Phe', 'Hla', 'TlH', 'Mme', 'Mot', 'Jan', 'Upu', 'Pha', 'Leo', 'Mph', 'Pud', 'Tsh'], + 'weekdays' => ['Sontaha', 'Mantaha', 'Labobedi', 'Laboraro', 'Labone', 'Labohlano', 'Moqebelo'], + 'weekdays_short' => ['Son', 'Mma', 'Bed', 'Rar', 'Ne', 'Hla', 'Moq'], + 'weekdays_min' => ['Son', 'Mma', 'Bed', 'Rar', 'Ne', 'Hla', 'Moq'], + 'day_of_first_week_of_year' => 1, + + 'week' => ':count Sontaha', // less reliable + 'w' => ':count Sontaha', // less reliable + 'a_week' => ':count Sontaha', // less reliable + + 'day' => ':count letsatsi', // less reliable + 'd' => ':count letsatsi', // less reliable + 'a_day' => ':count letsatsi', // less reliable + + 'hour' => ':count sešupanako', // less reliable + 'h' => ':count sešupanako', // less reliable + 'a_hour' => ':count sešupanako', // less reliable + + 'minute' => ':count menyane', // less reliable + 'min' => ':count menyane', // less reliable + 'a_minute' => ':count menyane', // less reliable + + 'second' => ':count thusa', // less reliable + 's' => ':count thusa', // less reliable + 'a_second' => ':count thusa', // less reliable + + 'year' => ':count selemo', + 'y' => ':count selemo', + 'a_year' => ':count selemo', + + 'month' => ':count kgwedi', + 'm' => ':count kgwedi', + 'a_month' => ':count kgwedi', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sv.php b/vendor/nesbot/carbon/src/Carbon/Lang/sv.php new file mode 100644 index 0000000..1706c71 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sv.php @@ -0,0 +1,87 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - Kristoffer Snabb + * - JD Isaacks + * - Jens Herlevsen + * - Nightpine + * - Anders Nygren (litemerafrukt) + */ +return [ + 'year' => ':count år', + 'a_year' => 'ett år|:count år', + 'y' => ':count år', + 'month' => ':count månad|:count månader', + 'a_month' => 'en månad|:count månader', + 'm' => ':count mån', + 'week' => ':count vecka|:count veckor', + 'a_week' => 'en vecka|:count veckor', + 'w' => ':count v', + 'day' => ':count dag|:count dagar', + 'a_day' => 'en dag|:count dagar', + 'd' => ':count dgr', + 'hour' => ':count timme|:count timmar', + 'a_hour' => 'en timme|:count timmar', + 'h' => ':count tim', + 'minute' => ':count minut|:count minuter', + 'a_minute' => 'en minut|:count minuter', + 'min' => ':count min', + 'second' => ':count sekund|:count sekunder', + 'a_second' => 'några sekunder|:count sekunder', + 's' => ':count s', + 'ago' => 'för :time sedan', + 'from_now' => 'om :time', + 'after' => ':time efter', + 'before' => ':time före', + 'diff_now' => 'nu', + 'diff_today' => 'I dag', + 'diff_yesterday' => 'i går', + 'diff_yesterday_regexp' => 'I går', + 'diff_tomorrow' => 'i morgon', + 'diff_tomorrow_regexp' => 'I morgon', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY-MM-DD', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY [kl.] HH:mm', + 'LLLL' => 'dddd D MMMM YYYY [kl.] HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[I dag] LT', + 'nextDay' => '[I morgon] LT', + 'nextWeek' => '[På] dddd LT', + 'lastDay' => '[I går] LT', + 'lastWeek' => '[I] dddd[s] LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number) { + $lastDigit = $number % 10; + + return $number.( + ((int) ($number % 100 / 10) === 1) ? 'e' : ( + ($lastDigit === 1 || $lastDigit === 2) ? 'a' : 'e' + ) + ); + }, + 'months' => ['januari', 'februari', 'mars', 'april', 'maj', 'juni', 'juli', 'augusti', 'september', 'oktober', 'november', 'december'], + 'months_short' => ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], + 'weekdays' => ['söndag', 'måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag'], + 'weekdays_short' => ['sön', 'mån', 'tis', 'ons', 'tors', 'fre', 'lör'], + 'weekdays_min' => ['sö', 'må', 'ti', 'on', 'to', 'fr', 'lö'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' och '], + 'meridiem' => ['fm', 'em'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sv_AX.php b/vendor/nesbot/carbon/src/Carbon/Lang/sv_AX.php new file mode 100644 index 0000000..70cc558 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sv_AX.php @@ -0,0 +1,19 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/sv.php', [ + 'formats' => [ + 'L' => 'YYYY-MM-dd', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sv_FI.php b/vendor/nesbot/carbon/src/Carbon/Lang/sv_FI.php new file mode 100644 index 0000000..d7182c8 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sv_FI.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/sv.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sv_SE.php b/vendor/nesbot/carbon/src/Carbon/Lang/sv_SE.php new file mode 100644 index 0000000..d7182c8 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sv_SE.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/sv.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sw.php b/vendor/nesbot/carbon/src/Carbon/Lang/sw.php new file mode 100644 index 0000000..f8630d5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sw.php @@ -0,0 +1,74 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - leyluj + * - Josh Soref + * - ryanhart2 + */ +return [ + 'year' => 'mwaka :count|miaka :count', + 'a_year' => 'mwaka mmoja|miaka :count', + 'y' => 'mwaka :count|miaka :count', + 'month' => 'mwezi :count|miezi :count', + 'a_month' => 'mwezi mmoja|miezi :count', + 'm' => 'mwezi :count|miezi :count', + 'week' => 'wiki :count', + 'a_week' => 'wiki mmoja|wiki :count', + 'w' => 'w. :count', + 'day' => 'siku :count', + 'a_day' => 'siku moja|masiku :count', + 'd' => 'si. :count', + 'hour' => 'saa :count|masaa :count', + 'a_hour' => 'saa limoja|masaa :count', + 'h' => 'saa :count|masaa :count', + 'minute' => 'dakika :count', + 'a_minute' => 'dakika moja|dakika :count', + 'min' => 'd. :count', + 'second' => 'sekunde :count', + 'a_second' => 'hivi punde|sekunde :count', + 's' => 'se. :count', + 'ago' => 'tokea :time', + 'from_now' => ':time baadaye', + 'after' => ':time baada', + 'before' => ':time kabla', + 'diff_now' => 'sasa hivi', + 'diff_today' => 'leo', + 'diff_today_regexp' => 'leo(?:\\s+saa)?', + 'diff_yesterday' => 'jana', + 'diff_tomorrow' => 'kesho', + 'diff_tomorrow_regexp' => 'kesho(?:\\s+saa)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[leo saa] LT', + 'nextDay' => '[kesho saa] LT', + 'nextWeek' => '[wiki ijayo] dddd [saat] LT', + 'lastDay' => '[jana] LT', + 'lastWeek' => '[wiki iliyopita] dddd [saat] LT', + 'sameElse' => 'L', + ], + 'months' => ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], + 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], + 'weekdays' => ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'], + 'weekdays_short' => ['Jpl', 'Jtat', 'Jnne', 'Jtan', 'Alh', 'Ijm', 'Jmos'], + 'weekdays_min' => ['J2', 'J3', 'J4', 'J5', 'Al', 'Ij', 'J1'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' na '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sw_CD.php b/vendor/nesbot/carbon/src/Carbon/Lang/sw_CD.php new file mode 100644 index 0000000..ec9117b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sw_CD.php @@ -0,0 +1,17 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/sw.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sw_KE.php b/vendor/nesbot/carbon/src/Carbon/Lang/sw_KE.php new file mode 100644 index 0000000..2ace0db --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sw_KE.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Kamusi Project Martin Benjamin locales@kamusi.org + */ +return array_replace_recursive(require __DIR__.'/sw.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], + 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], + 'weekdays' => ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'], + 'weekdays_short' => ['J2', 'J3', 'J4', 'J5', 'Alh', 'Ij', 'J1'], + 'weekdays_min' => ['J2', 'J3', 'J4', 'J5', 'Alh', 'Ij', 'J1'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['asubuhi', 'alasiri'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sw_TZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/sw_TZ.php new file mode 100644 index 0000000..fab3cd6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sw_TZ.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Kamusi Project Martin Benjamin locales@kamusi.org + */ +return array_replace_recursive(require __DIR__.'/sw.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], + 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], + 'weekdays' => ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'], + 'weekdays_short' => ['J2', 'J3', 'J4', 'J5', 'Alh', 'Ij', 'J1'], + 'weekdays_min' => ['J2', 'J3', 'J4', 'J5', 'Alh', 'Ij', 'J1'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['asubuhi', 'alasiri'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sw_UG.php b/vendor/nesbot/carbon/src/Carbon/Lang/sw_UG.php new file mode 100644 index 0000000..ec9117b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sw_UG.php @@ -0,0 +1,17 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/sw.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/szl.php b/vendor/nesbot/carbon/src/Carbon/Lang/szl.php new file mode 100644 index 0000000..4429c4f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/szl.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/szl_PL.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/szl_PL.php b/vendor/nesbot/carbon/src/Carbon/Lang/szl_PL.php new file mode 100644 index 0000000..9adddcf --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/szl_PL.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - szl_PL locale Przemyslaw Buczkowski libc-alpha@sourceware.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], + 'months' => ['styczyń', 'luty', 'merc', 'kwjeciyń', 'moj', 'czyrwjyń', 'lipjyń', 'siyrpjyń', 'wrzesiyń', 'październik', 'listopad', 'grudziyń'], + 'months_short' => ['sty', 'lut', 'mer', 'kwj', 'moj', 'czy', 'lip', 'siy', 'wrz', 'paź', 'lis', 'gru'], + 'weekdays' => ['niydziela', 'pyńdziŏek', 'wtŏrek', 'strzŏda', 'sztwortek', 'pjōntek', 'sobŏta'], + 'weekdays_short' => ['niy', 'pyń', 'wtŏ', 'str', 'szt', 'pjō', 'sob'], + 'weekdays_min' => ['niy', 'pyń', 'wtŏ', 'str', 'szt', 'pjō', 'sob'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + + 'year' => ':count rok', + 'y' => ':count rok', + 'a_year' => ':count rok', + + 'month' => ':count mjeśůnc', + 'm' => ':count mjeśůnc', + 'a_month' => ':count mjeśůnc', + + 'week' => ':count tydźyń', + 'w' => ':count tydźyń', + 'a_week' => ':count tydźyń', + + 'day' => ':count dźyń', + 'd' => ':count dźyń', + 'a_day' => ':count dźyń', + + 'hour' => ':count godzina', + 'h' => ':count godzina', + 'a_hour' => ':count godzina', + + 'minute' => ':count minuta', + 'min' => ':count minuta', + 'a_minute' => ':count minuta', + + 'second' => ':count sekůnda', + 's' => ':count sekůnda', + 'a_second' => ':count sekůnda', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ta.php b/vendor/nesbot/carbon/src/Carbon/Lang/ta.php new file mode 100644 index 0000000..c1d89cb --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ta.php @@ -0,0 +1,97 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - François B + * - JD Isaacks + * - Satheez + */ +return [ + 'year' => ':count வருடம்|:count ஆண்டுகள்', + 'a_year' => 'ஒரு வருடம்|:count ஆண்டுகள்', + 'y' => ':count வருட.|:count ஆண்.', + 'month' => ':count மாதம்|:count மாதங்கள்', + 'a_month' => 'ஒரு மாதம்|:count மாதங்கள்', + 'm' => ':count மாத.', + 'week' => ':count வாரம்|:count வாரங்கள்', + 'a_week' => 'ஒரு வாரம்|:count வாரங்கள்', + 'w' => ':count வார.', + 'day' => ':count நாள்|:count நாட்கள்', + 'a_day' => 'ஒரு நாள்|:count நாட்கள்', + 'd' => ':count நாள்|:count நாட்.', + 'hour' => ':count மணி நேரம்|:count மணி நேரம்', + 'a_hour' => 'ஒரு மணி நேரம்|:count மணி நேரம்', + 'h' => ':count மணி.', + 'minute' => ':count நிமிடம்|:count நிமிடங்கள்', + 'a_minute' => 'ஒரு நிமிடம்|:count நிமிடங்கள்', + 'min' => ':count நிமி.', + 'second' => ':count சில விநாடிகள்|:count விநாடிகள்', + 'a_second' => 'ஒரு சில விநாடிகள்|:count விநாடிகள்', + 's' => ':count விநா.', + 'ago' => ':time முன்', + 'from_now' => ':time இல்', + 'before' => ':time முன்', + 'after' => ':time பின்', + 'diff_now' => 'இப்போது', + 'diff_today' => 'இன்று', + 'diff_yesterday' => 'நேற்று', + 'diff_tomorrow' => 'நாளை', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY, HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY, HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[இன்று] LT', + 'nextDay' => '[நாளை] LT', + 'nextWeek' => 'dddd, LT', + 'lastDay' => '[நேற்று] LT', + 'lastWeek' => '[கடந்த வாரம்] dddd, LT', + 'sameElse' => 'L', + ], + 'ordinal' => ':numberவது', + 'meridiem' => function ($hour) { + if ($hour < 2) { + return ' யாமம்'; + } + if ($hour < 6) { + return ' வைகறை'; + } + if ($hour < 10) { + return ' காலை'; + } + if ($hour < 14) { + return ' நண்பகல்'; + } + if ($hour < 18) { + return ' எற்பாடு'; + } + if ($hour < 22) { + return ' மாலை'; + } + + return ' யாமம்'; + }, + 'months' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டெம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], + 'months_short' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டெம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], + 'weekdays' => ['ஞாயிற்றுக்கிழமை', 'திங்கட்கிழமை', 'செவ்வாய்கிழமை', 'புதன்கிழமை', 'வியாழக்கிழமை', 'வெள்ளிக்கிழமை', 'சனிக்கிழமை'], + 'weekdays_short' => ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'], + 'weekdays_min' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' மற்றும் '], + 'weekend' => [0, 0], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ta_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ta_IN.php new file mode 100644 index 0000000..492d4c5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ta_IN.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/ta.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], + 'months_short' => ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'], + 'weekdays' => ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'], + 'weekdays_short' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], + 'weekdays_min' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['காலை', 'மாலை'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ta_LK.php b/vendor/nesbot/carbon/src/Carbon/Lang/ta_LK.php new file mode 100644 index 0000000..8e2afbf --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ta_LK.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - J.Yogaraj 94-777-315206 yogaraj.ubuntu@gmail.com + */ +return array_replace_recursive(require __DIR__.'/ta.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], + 'months_short' => ['ஜன', 'பிப்', 'மார்', 'ஏப்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக', 'செப்', 'அக்', 'நவ', 'டிச'], + 'weekdays' => ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'], + 'weekdays_short' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], + 'weekdays_min' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['காலை', 'மாலை'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ta_MY.php b/vendor/nesbot/carbon/src/Carbon/Lang/ta_MY.php new file mode 100644 index 0000000..a6cd8b5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ta_MY.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ta.php', [ + 'formats' => [ + 'LT' => 'a h:mm', + 'LTS' => 'a h:mm:ss', + 'L' => 'D/M/yy', + 'LL' => 'D MMM, YYYY', + 'LLL' => 'D MMMM, YYYY, a h:mm', + 'LLLL' => 'dddd, D MMMM, YYYY, a h:mm', + ], + 'months' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], + 'months_short' => ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'], + 'weekdays' => ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'], + 'weekdays_short' => ['ஞாயி.', 'திங்.', 'செவ்.', 'புத.', 'வியா.', 'வெள்.', 'சனி'], + 'weekdays_min' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], + 'first_day_of_week' => 1, + 'meridiem' => ['மு.ப', 'பி.ப'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ta_SG.php b/vendor/nesbot/carbon/src/Carbon/Lang/ta_SG.php new file mode 100644 index 0000000..7dbedee --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ta_SG.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ta.php', [ + 'formats' => [ + 'LT' => 'a h:mm', + 'LTS' => 'a h:mm:ss', + 'L' => 'D/M/yy', + 'LL' => 'D MMM, YYYY', + 'LLL' => 'D MMMM, YYYY, a h:mm', + 'LLLL' => 'dddd, D MMMM, YYYY, a h:mm', + ], + 'months' => ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'], + 'months_short' => ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'], + 'weekdays' => ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'], + 'weekdays_short' => ['ஞாயி.', 'திங்.', 'செவ்.', 'புத.', 'வியா.', 'வெள்.', 'சனி'], + 'weekdays_min' => ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'], + 'meridiem' => ['மு.ப', 'பி.ப'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tcy.php b/vendor/nesbot/carbon/src/Carbon/Lang/tcy.php new file mode 100644 index 0000000..2eb9905 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tcy.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/tcy_IN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tcy_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/tcy_IN.php new file mode 100644 index 0000000..2ff20e0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tcy_IN.php @@ -0,0 +1,39 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IndLinux.org, Samsung Electronics Co., Ltd. alexey.merzlyakov@samsung.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['ಜನವರಿ', 'ಫೆಬ್ರುವರಿ', 'ಮಾರ್ಚ್', 'ಏಪ್ರಿಲ್‌‌', 'ಮೇ', 'ಜೂನ್', 'ಜುಲೈ', 'ಆಗಸ್ಟ್', 'ಸೆಪ್ಟೆಂಬರ್‌', 'ಅಕ್ಟೋಬರ್', 'ನವೆಂಬರ್', 'ಡಿಸೆಂಬರ್'], + 'months_short' => ['ಜ', 'ಫೆ', 'ಮಾ', 'ಏ', 'ಮೇ', 'ಜೂ', 'ಜು', 'ಆ', 'ಸೆ', 'ಅ', 'ನ', 'ಡಿ'], + 'weekdays' => ['ಐಥಾರ', 'ಸೋಮಾರ', 'ಅಂಗರೆ', 'ಬುಧಾರ', 'ಗುರುವಾರ', 'ಶುಕ್ರರ', 'ಶನಿವಾರ'], + 'weekdays_short' => ['ಐ', 'ಸೋ', 'ಅಂ', 'ಬು', 'ಗು', 'ಶು', 'ಶ'], + 'weekdays_min' => ['ಐ', 'ಸೋ', 'ಅಂ', 'ಬು', 'ಗು', 'ಶು', 'ಶ'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['ಕಾಂಡೆ', 'ಬಯ್ಯ'], + + 'year' => ':count ನೀರ್', // less reliable + 'y' => ':count ನೀರ್', // less reliable + 'a_year' => ':count ನೀರ್', // less reliable + + 'month' => ':count ಮೀನ್', // less reliable + 'm' => ':count ಮೀನ್', // less reliable + 'a_month' => ':count ಮೀನ್', // less reliable + + 'day' => ':count ಸುಗ್ಗಿ', // less reliable + 'd' => ':count ಸುಗ್ಗಿ', // less reliable + 'a_day' => ':count ಸುಗ್ಗಿ', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/te.php b/vendor/nesbot/carbon/src/Carbon/Lang/te.php new file mode 100644 index 0000000..ac38218 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/te.php @@ -0,0 +1,89 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Kunal Marwaha + * - Josh Soref + * - François B + * - kc + */ +return [ + 'year' => ':count సంవత్సరం|:count సంవత్సరాలు', + 'a_year' => 'ఒక సంవత్సరం|:count సంవత్సరాలు', + 'y' => ':count సం.', + 'month' => ':count నెల|:count నెలలు', + 'a_month' => 'ఒక నెల|:count నెలలు', + 'm' => ':count నెల|:count నెల.', + 'week' => ':count వారం|:count వారాలు', + 'a_week' => 'ఒక వారం|:count వారాలు', + 'w' => ':count వార.|:count వారా.', + 'day' => ':count రోజు|:count రోజులు', + 'a_day' => 'ఒక రోజు|:count రోజులు', + 'd' => ':count రోజు|:count రోజు.', + 'hour' => ':count గంట|:count గంటలు', + 'a_hour' => 'ఒక గంట|:count గంటలు', + 'h' => ':count గం.', + 'minute' => ':count నిమిషం|:count నిమిషాలు', + 'a_minute' => 'ఒక నిమిషం|:count నిమిషాలు', + 'min' => ':count నిమి.', + 'second' => ':count సెకను|:count సెకన్లు', + 'a_second' => 'కొన్ని క్షణాలు|:count సెకన్లు', + 's' => ':count సెక.', + 'ago' => ':time క్రితం', + 'from_now' => ':time లో', + 'diff_now' => 'ప్రస్తుతం', + 'diff_today' => 'నేడు', + 'diff_yesterday' => 'నిన్న', + 'diff_tomorrow' => 'రేపు', + 'formats' => [ + 'LT' => 'A h:mm', + 'LTS' => 'A h:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY, A h:mm', + 'LLLL' => 'dddd, D MMMM YYYY, A h:mm', + ], + 'calendar' => [ + 'sameDay' => '[నేడు] LT', + 'nextDay' => '[రేపు] LT', + 'nextWeek' => 'dddd, LT', + 'lastDay' => '[నిన్న] LT', + 'lastWeek' => '[గత] dddd, LT', + 'sameElse' => 'L', + ], + 'ordinal' => ':numberవ', + 'meridiem' => function ($hour) { + if ($hour < 4) { + return 'రాత్రి'; + } + if ($hour < 10) { + return 'ఉదయం'; + } + if ($hour < 17) { + return 'మధ్యాహ్నం'; + } + if ($hour < 20) { + return 'సాయంత్రం'; + } + + return ' రాత్రి'; + }, + 'months' => ['జనవరి', 'ఫిబ్రవరి', 'మార్చి', 'ఏప్రిల్', 'మే', 'జూన్', 'జూలై', 'ఆగస్టు', 'సెప్టెంబర్', 'అక్టోబర్', 'నవంబర్', 'డిసెంబర్'], + 'months_short' => ['జన.', 'ఫిబ్ర.', 'మార్చి', 'ఏప్రి.', 'మే', 'జూన్', 'జూలై', 'ఆగ.', 'సెప్.', 'అక్టో.', 'నవ.', 'డిసె.'], + 'weekdays' => ['ఆదివారం', 'సోమవారం', 'మంగళవారం', 'బుధవారం', 'గురువారం', 'శుక్రవారం', 'శనివారం'], + 'weekdays_short' => ['ఆది', 'సోమ', 'మంగళ', 'బుధ', 'గురు', 'శుక్ర', 'శని'], + 'weekdays_min' => ['ఆ', 'సో', 'మం', 'బు', 'గు', 'శు', 'శ'], + 'list' => ', ', + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, + 'weekend' => [0, 0], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/te_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/te_IN.php new file mode 100644 index 0000000..3963f8d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/te_IN.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/te.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/teo.php b/vendor/nesbot/carbon/src/Carbon/Lang/teo.php new file mode 100644 index 0000000..ca30c37 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/teo.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ta.php', [ + 'meridiem' => ['Taparachu', 'Ebongi'], + 'weekdays' => ['Nakaejuma', 'Nakaebarasa', 'Nakaare', 'Nakauni', 'Nakaung’on', 'Nakakany', 'Nakasabiti'], + 'weekdays_short' => ['Jum', 'Bar', 'Aar', 'Uni', 'Ung', 'Kan', 'Sab'], + 'weekdays_min' => ['Jum', 'Bar', 'Aar', 'Uni', 'Ung', 'Kan', 'Sab'], + 'months' => ['Orara', 'Omuk', 'Okwamg’', 'Odung’el', 'Omaruk', 'Omodok’king’ol', 'Ojola', 'Opedel', 'Osokosokoma', 'Otibar', 'Olabor', 'Opoo'], + 'months_short' => ['Rar', 'Muk', 'Kwa', 'Dun', 'Mar', 'Mod', 'Jol', 'Ped', 'Sok', 'Tib', 'Lab', 'Poo'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/teo_KE.php b/vendor/nesbot/carbon/src/Carbon/Lang/teo_KE.php new file mode 100644 index 0000000..010a04f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/teo_KE.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/teo.php', [ + 'first_day_of_week' => 0, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tet.php b/vendor/nesbot/carbon/src/Carbon/Lang/tet.php new file mode 100644 index 0000000..d0544d4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tet.php @@ -0,0 +1,64 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Joshua Brooks + * - François B + */ +return [ + 'year' => 'tinan :count', + 'a_year' => '{1}tinan ida|tinan :count', + 'month' => 'fulan :count', + 'a_month' => '{1}fulan ida|fulan :count', + 'week' => 'semana :count', + 'a_week' => '{1}semana ida|semana :count', + 'day' => 'loron :count', + 'a_day' => '{1}loron ida|loron :count', + 'hour' => 'oras :count', + 'a_hour' => '{1}oras ida|oras :count', + 'minute' => 'minutu :count', + 'a_minute' => '{1}minutu ida|minutu :count', + 'second' => 'segundu :count', + 'a_second' => '{1}segundu balun|segundu :count', + 'ago' => ':time liuba', + 'from_now' => 'iha :time', + 'diff_yesterday' => 'Horiseik', + 'diff_yesterday_regexp' => 'Horiseik(?:\\s+iha)?', + 'diff_today' => 'Ohin', + 'diff_today_regexp' => 'Ohin(?:\\s+iha)?', + 'diff_tomorrow' => 'Aban', + 'diff_tomorrow_regexp' => 'Aban(?:\\s+iha)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Ohin iha] LT', + 'nextDay' => '[Aban iha] LT', + 'nextWeek' => 'dddd [iha] LT', + 'lastDay' => '[Horiseik iha] LT', + 'lastWeek' => 'dddd [semana kotuk] [iha] LT', + 'sameElse' => 'L', + ], + 'ordinal' => ':numberº', + 'months' => ['Janeiru', 'Fevereiru', 'Marsu', 'Abril', 'Maiu', 'Juñu', 'Jullu', 'Agustu', 'Setembru', 'Outubru', 'Novembru', 'Dezembru'], + 'months_short' => ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'], + 'weekdays' => ['Domingu', 'Segunda', 'Tersa', 'Kuarta', 'Kinta', 'Sesta', 'Sabadu'], + 'weekdays_short' => ['Dom', 'Seg', 'Ters', 'Kua', 'Kint', 'Sest', 'Sab'], + 'weekdays_min' => ['Do', 'Seg', 'Te', 'Ku', 'Ki', 'Ses', 'Sa'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tg.php b/vendor/nesbot/carbon/src/Carbon/Lang/tg.php new file mode 100644 index 0000000..b7df893 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tg.php @@ -0,0 +1,104 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Orif N. Jr + */ +return [ + 'year' => '{1}як сол|:count сол', + 'month' => '{1}як моҳ|:count моҳ', + 'week' => '{1}як ҳафта|:count ҳафта', + 'day' => '{1}як рӯз|:count рӯз', + 'hour' => '{1}як соат|:count соат', + 'minute' => '{1}як дақиқа|:count дақиқа', + 'second' => '{1}якчанд сония|:count сония', + 'ago' => ':time пеш', + 'from_now' => 'баъди :time', + 'diff_today' => 'Имрӯз', + 'diff_yesterday' => 'Дирӯз', + 'diff_yesterday_regexp' => 'Дирӯз(?:\\s+соати)?', + 'diff_tomorrow' => 'Пагоҳ', + 'diff_tomorrow_regexp' => 'Пагоҳ(?:\\s+соати)?', + 'diff_today_regexp' => 'Имрӯз(?:\\s+соати)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Имрӯз соати] LT', + 'nextDay' => '[Пагоҳ соати] LT', + 'nextWeek' => 'dddd[и] [ҳафтаи оянда соати] LT', + 'lastDay' => '[Дирӯз соати] LT', + 'lastWeek' => 'dddd[и] [ҳафтаи гузашта соати] LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number) { + if ($number === 0) { // special case for zero + return "$number-ıncı"; + } + + static $suffixes = [ + 0 => '-ум', + 1 => '-ум', + 2 => '-юм', + 3 => '-юм', + 4 => '-ум', + 5 => '-ум', + 6 => '-ум', + 7 => '-ум', + 8 => '-ум', + 9 => '-ум', + 10 => '-ум', + 12 => '-ум', + 13 => '-ум', + 20 => '-ум', + 30 => '-юм', + 40 => '-ум', + 50 => '-ум', + 60 => '-ум', + 70 => '-ум', + 80 => '-ум', + 90 => '-ум', + 100 => '-ум', + ]; + + return $number.($suffixes[$number] ?? $suffixes[$number % 10] ?? $suffixes[$number >= 100 ? 100 : -1] ?? ''); + }, + 'meridiem' => function ($hour) { + if ($hour < 4) { + return 'шаб'; + } + if ($hour < 11) { + return 'субҳ'; + } + if ($hour < 16) { + return 'рӯз'; + } + if ($hour < 19) { + return 'бегоҳ'; + } + + return 'шаб'; + }, + 'months' => ['январ', 'феврал', 'март', 'апрел', 'май', 'июн', 'июл', 'август', 'сентябр', 'октябр', 'ноябр', 'декабр'], + 'months_short' => ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], + 'weekdays' => ['якшанбе', 'душанбе', 'сешанбе', 'чоршанбе', 'панҷшанбе', 'ҷумъа', 'шанбе'], + 'weekdays_short' => ['яшб', 'дшб', 'сшб', 'чшб', 'пшб', 'ҷум', 'шнб'], + 'weekdays_min' => ['яш', 'дш', 'сш', 'чш', 'пш', 'ҷм', 'шб'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' ва '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tg_TJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/tg_TJ.php new file mode 100644 index 0000000..badc7d1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tg_TJ.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/tg.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/th.php b/vendor/nesbot/carbon/src/Carbon/Lang/th.php new file mode 100644 index 0000000..6397f6e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/th.php @@ -0,0 +1,73 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Nate Whittaker + * - John MacAslan + * - Chanintorn Asavavichairoj + * - JD Isaacks + * - ROKAISAKKON + * - RO'KAISAKKON + * - Andreas Möller + * - nithisa + */ +return [ + 'year' => ':count ปี', + 'y' => ':count ปี', + 'month' => ':count เดือน', + 'm' => ':count เดือน', + 'week' => ':count สัปดาห์', + 'w' => ':count สัปดาห์', + 'day' => ':count วัน', + 'd' => ':count วัน', + 'hour' => ':count ชั่วโมง', + 'h' => ':count ชั่วโมง', + 'minute' => ':count นาที', + 'min' => ':count นาที', + 'second' => ':count วินาที', + 'a_second' => '{1}ไม่กี่วินาที|]1,Inf[:count วินาที', + 's' => ':count วินาที', + 'ago' => ':timeที่แล้ว', + 'from_now' => 'อีก :time', + 'after' => ':timeหลังจากนี้', + 'before' => ':timeก่อน', + 'diff_now' => 'ขณะนี้', + 'diff_today' => 'วันนี้', + 'diff_today_regexp' => 'วันนี้(?:\\s+เวลา)?', + 'diff_yesterday' => 'เมื่อวาน', + 'diff_yesterday_regexp' => 'เมื่อวานนี้(?:\\s+เวลา)?', + 'diff_tomorrow' => 'พรุ่งนี้', + 'diff_tomorrow_regexp' => 'พรุ่งนี้(?:\\s+เวลา)?', + 'formats' => [ + 'LT' => 'H:mm', + 'LTS' => 'H:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY เวลา H:mm', + 'LLLL' => 'วันddddที่ D MMMM YYYY เวลา H:mm', + ], + 'calendar' => [ + 'sameDay' => '[วันนี้ เวลา] LT', + 'nextDay' => '[พรุ่งนี้ เวลา] LT', + 'nextWeek' => 'dddd[หน้า เวลา] LT', + 'lastDay' => '[เมื่อวานนี้ เวลา] LT', + 'lastWeek' => '[วัน]dddd[ที่แล้ว เวลา] LT', + 'sameElse' => 'L', + ], + 'meridiem' => ['ก่อนเที่ยง', 'หลังเที่ยง'], + 'months' => ['มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'], + 'months_short' => ['ม.ค.', 'ก.พ.', 'มี.ค.', 'เม.ย.', 'พ.ค.', 'มิ.ย.', 'ก.ค.', 'ส.ค.', 'ก.ย.', 'ต.ค.', 'พ.ย.', 'ธ.ค.'], + 'weekdays' => ['อาทิตย์', 'จันทร์', 'อังคาร', 'พุธ', 'พฤหัสบดี', 'ศุกร์', 'เสาร์'], + 'weekdays_short' => ['อาทิตย์', 'จันทร์', 'อังคาร', 'พุธ', 'พฤหัส', 'ศุกร์', 'เสาร์'], + 'weekdays_min' => ['อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.'], + 'list' => [', ', ' และ '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/th_TH.php b/vendor/nesbot/carbon/src/Carbon/Lang/th_TH.php new file mode 100644 index 0000000..b9f94b2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/th_TH.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/th.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/the.php b/vendor/nesbot/carbon/src/Carbon/Lang/the.php new file mode 100644 index 0000000..85f8333 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/the.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/the_NP.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/the_NP.php b/vendor/nesbot/carbon/src/Carbon/Lang/the_NP.php new file mode 100644 index 0000000..34da162 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/the_NP.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Chitwanix OS Development info@chitwanix.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'dddd DD MMM YYYY', + ], + 'months' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], + 'months_short' => ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रेल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितम्बर', 'अक्टूबर', 'नवम्बर', 'दिसम्बर'], + 'weekdays' => ['आइतबार', 'सोमबार', 'मंगलबार', 'बुधबार', 'बिहिबार', 'शुक्रबार', 'शनिबार'], + 'weekdays_short' => ['आइत', 'सोम', 'मंगल', 'बुध', 'बिहि', 'शुक्र', 'शनि'], + 'weekdays_min' => ['आइत', 'सोम', 'मंगल', 'बुध', 'बिहि', 'शुक्र', 'शनि'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['पूर्वाह्न', 'अपराह्न'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ti.php b/vendor/nesbot/carbon/src/Carbon/Lang/ti.php new file mode 100644 index 0000000..ffd3236 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ti.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/ti_ER.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ti_ER.php b/vendor/nesbot/carbon/src/Carbon/Lang/ti_ER.php new file mode 100644 index 0000000..310c51c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ti_ER.php @@ -0,0 +1,56 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation locales@geez.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['ጥሪ', 'ለካቲት', 'መጋቢት', 'ሚያዝያ', 'ግንቦት', 'ሰነ', 'ሓምለ', 'ነሓሰ', 'መስከረም', 'ጥቅምቲ', 'ሕዳር', 'ታሕሳስ'], + 'months_short' => ['ጥሪ ', 'ለካቲ', 'መጋቢ', 'ሚያዝ', 'ግንቦ', 'ሰነ ', 'ሓምለ', 'ነሓሰ', 'መስከ', 'ጥቅም', 'ሕዳር', 'ታሕሳ'], + 'weekdays' => ['ሰንበት', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], + 'weekdays_short' => ['ሰንበ', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], + 'weekdays_min' => ['ሰንበ', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['ንጉሆ ሰዓተ', 'ድሕር ሰዓት'], + + 'year' => ':count ዓመት', + 'y' => ':count ዓመት', + 'a_year' => ':count ዓመት', + + 'month' => 'ወርሒ :count', + 'm' => 'ወርሒ :count', + 'a_month' => 'ወርሒ :count', + + 'week' => ':count ሰሙን', + 'w' => ':count ሰሙን', + 'a_week' => ':count ሰሙን', + + 'day' => ':count መዓልቲ', + 'd' => ':count መዓልቲ', + 'a_day' => ':count መዓልቲ', + + 'hour' => ':count ሰዓት', + 'h' => ':count ሰዓት', + 'a_hour' => ':count ሰዓት', + + 'minute' => ':count ደቒቕ', + 'min' => ':count ደቒቕ', + 'a_minute' => ':count ደቒቕ', + + 'second' => ':count ሰከንድ', + 's' => ':count ሰከንድ', + 'a_second' => ':count ሰከንድ', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ti_ET.php b/vendor/nesbot/carbon/src/Carbon/Lang/ti_ET.php new file mode 100644 index 0000000..024217f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ti_ET.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation locales@geez.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['ጃንዩወሪ', 'ፌብሩወሪ', 'ማርች', 'ኤፕረል', 'ሜይ', 'ጁን', 'ጁላይ', 'ኦገስት', 'ሴፕቴምበር', 'ኦክተውበር', 'ኖቬምበር', 'ዲሴምበር'], + 'months_short' => ['ጃንዩ', 'ፌብሩ', 'ማርች', 'ኤፕረ', 'ሜይ ', 'ጁን ', 'ጁላይ', 'ኦገስ', 'ሴፕቴ', 'ኦክተ', 'ኖቬም', 'ዲሴም'], + 'weekdays' => ['ሰንበት', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], + 'weekdays_short' => ['ሰንበ', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], + 'weekdays_min' => ['ሰንበ', 'ሰኑይ', 'ሰሉስ', 'ረቡዕ', 'ሓሙስ', 'ዓርቢ', 'ቀዳም'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['ንጉሆ ሰዓተ', 'ድሕር ሰዓት'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tig.php b/vendor/nesbot/carbon/src/Carbon/Lang/tig.php new file mode 100644 index 0000000..186fe71 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tig.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/tig_ER.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tig_ER.php b/vendor/nesbot/carbon/src/Carbon/Lang/tig_ER.php new file mode 100644 index 0000000..46887b0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tig_ER.php @@ -0,0 +1,56 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation locales@geez.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['ጥሪ', 'ለካቲት', 'መጋቢት', 'ሚያዝያ', 'ግንቦት', 'ሰነ', 'ሓምለ', 'ነሓሰ', 'መስከረም', 'ጥቅምቲ', 'ሕዳር', 'ታሕሳስ'], + 'months_short' => ['ጥሪ ', 'ለካቲ', 'መጋቢ', 'ሚያዝ', 'ግንቦ', 'ሰነ ', 'ሓምለ', 'ነሓሰ', 'መስከ', 'ጥቅም', 'ሕዳር', 'ታሕሳ'], + 'weekdays' => ['ሰንበት ዓባይ', 'ሰኖ', 'ታላሸኖ', 'ኣረርባዓ', 'ከሚሽ', 'ጅምዓት', 'ሰንበት ንኢሽ'], + 'weekdays_short' => ['ሰ//ዓ', 'ሰኖ ', 'ታላሸ', 'ኣረር', 'ከሚሽ', 'ጅምዓ', 'ሰ//ን'], + 'weekdays_min' => ['ሰ//ዓ', 'ሰኖ ', 'ታላሸ', 'ኣረር', 'ከሚሽ', 'ጅምዓ', 'ሰ//ን'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['ቀደም ሰር ምዕል', 'ሓቆ ሰር ምዕል'], + + 'year' => ':count ማይ', // less reliable + 'y' => ':count ማይ', // less reliable + 'a_year' => ':count ማይ', // less reliable + + 'month' => ':count ሸምሽ', // less reliable + 'm' => ':count ሸምሽ', // less reliable + 'a_month' => ':count ሸምሽ', // less reliable + + 'week' => ':count ሰቡዕ', // less reliable + 'w' => ':count ሰቡዕ', // less reliable + 'a_week' => ':count ሰቡዕ', // less reliable + + 'day' => ':count ዎሮ', // less reliable + 'd' => ':count ዎሮ', // less reliable + 'a_day' => ':count ዎሮ', // less reliable + + 'hour' => ':count ሰዓት', // less reliable + 'h' => ':count ሰዓት', // less reliable + 'a_hour' => ':count ሰዓት', // less reliable + + 'minute' => ':count ካልኣይት', // less reliable + 'min' => ':count ካልኣይት', // less reliable + 'a_minute' => ':count ካልኣይት', // less reliable + + 'second' => ':count ካልኣይ', + 's' => ':count ካልኣይ', + 'a_second' => ':count ካልኣይ', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tk.php b/vendor/nesbot/carbon/src/Carbon/Lang/tk.php new file mode 100644 index 0000000..d8f7d19 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tk.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/tk_TM.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tk_TM.php b/vendor/nesbot/carbon/src/Carbon/Lang/tk_TM.php new file mode 100644 index 0000000..f949a43 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tk_TM.php @@ -0,0 +1,77 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Authors: + * - Ghorban M. Tavakoly Pablo Saratxaga & Ghorban M. Tavakoly pablo@walon.org & gmt314@yahoo.com + * - SuperManPHP + * - Maksat Meredow (isadma) + */ +$transformDiff = function ($input) { + return strtr($input, [ + 'sekunt' => 'sekunt', + 'hepde' => 'hepde', + ]); +}; + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], + 'months' => ['Ýanwar', 'Fewral', 'Mart', 'Aprel', 'Maý', 'Iýun', 'Iýul', 'Awgust', 'Sentýabr', 'Oktýabr', 'Noýabr', 'Dekabr'], + 'months_short' => ['Ýan', 'Few', 'Mar', 'Apr', 'Maý', 'Iýn', 'Iýl', 'Awg', 'Sen', 'Okt', 'Noý', 'Dek'], + 'weekdays' => ['Duşenbe', 'Sişenbe', 'Çarşenbe', 'Penşenbe', 'Anna', 'Şenbe', 'Ýekşenbe'], + 'weekdays_short' => ['Duş', 'Siş', 'Çar', 'Pen', 'Ann', 'Şen', 'Ýek'], + 'weekdays_min' => ['Du', 'Si', 'Ça', 'Pe', 'An', 'Şe', 'Ýe'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + + 'year' => ':count ýyl', + 'y' => ':count ýyl', + 'a_year' => ':count ýyl', + + 'month' => ':count aý', + 'm' => ':count aý', + 'a_month' => ':count aý', + + 'week' => ':count hepde', + 'w' => ':count hepde', + 'a_week' => ':count hepde', + + 'day' => ':count gün', + 'd' => ':count gün', + 'a_day' => ':count gün', + + 'hour' => ':count sagat', + 'h' => ':count sagat', + 'a_hour' => ':count sagat', + + 'minute' => ':count minut', + 'min' => ':count minut', + 'a_minute' => ':count minut', + + 'second' => ':count sekunt', + 's' => ':count sekunt', + 'a_second' => ':count sekunt', + + 'ago' => function ($time) use ($transformDiff) { + return $transformDiff($time).' ozal'; + }, + 'from_now' => function ($time) use ($transformDiff) { + return $transformDiff($time).' soňra'; + }, + 'after' => function ($time) use ($transformDiff) { + return $transformDiff($time).' soň'; + }, + 'before' => function ($time) use ($transformDiff) { + return $transformDiff($time).' öň'; + }, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tl.php b/vendor/nesbot/carbon/src/Carbon/Lang/tl.php new file mode 100644 index 0000000..410a266 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tl.php @@ -0,0 +1,61 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return [ + 'year' => ':count taon', + 'a_year' => '{1}isang taon|:count taon', + 'month' => ':count buwan', + 'a_month' => '{1}isang buwan|:count buwan', + 'week' => ':count linggo', + 'a_week' => '{1}isang linggo|:count linggo', + 'day' => ':count araw', + 'a_day' => '{1}isang araw|:count araw', + 'hour' => ':count oras', + 'a_hour' => '{1}isang oras|:count oras', + 'minute' => ':count minuto', + 'a_minute' => '{1}isang minuto|:count minuto', + 'min' => ':count min.', + 'second' => ':count segundo', + 'a_second' => '{1}ilang segundo|:count segundo', + 's' => ':count seg.', + 'ago' => ':time ang nakalipas', + 'from_now' => 'sa loob ng :time', + 'diff_now' => 'ngayon', + 'diff_today' => 'ngayong', + 'diff_today_regexp' => 'ngayong(?:\\s+araw)?', + 'diff_yesterday' => 'kahapon', + 'diff_tomorrow' => 'bukas', + 'diff_tomorrow_regexp' => 'Bukas(?:\\s+ng)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'MM/D/YYYY', + 'LL' => 'MMMM D, YYYY', + 'LLL' => 'MMMM D, YYYY HH:mm', + 'LLLL' => 'dddd, MMMM DD, YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => 'LT [ngayong araw]', + 'nextDay' => '[Bukas ng] LT', + 'nextWeek' => 'LT [sa susunod na] dddd', + 'lastDay' => 'LT [kahapon]', + 'lastWeek' => 'LT [noong nakaraang] dddd', + 'sameElse' => 'L', + ], + 'months' => ['Enero', 'Pebrero', 'Marso', 'Abril', 'Mayo', 'Hunyo', 'Hulyo', 'Agosto', 'Setyembre', 'Oktubre', 'Nobyembre', 'Disyembre'], + 'months_short' => ['Ene', 'Peb', 'Mar', 'Abr', 'May', 'Hun', 'Hul', 'Ago', 'Set', 'Okt', 'Nob', 'Dis'], + 'weekdays' => ['Linggo', 'Lunes', 'Martes', 'Miyerkules', 'Huwebes', 'Biyernes', 'Sabado'], + 'weekdays_short' => ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'], + 'weekdays_min' => ['Li', 'Lu', 'Ma', 'Mi', 'Hu', 'Bi', 'Sab'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' at '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tl_PH.php b/vendor/nesbot/carbon/src/Carbon/Lang/tl_PH.php new file mode 100644 index 0000000..95f508c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tl_PH.php @@ -0,0 +1,18 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - Ian De La Cruz + * - JD Isaacks + */ +return require __DIR__.'/tl.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tlh.php b/vendor/nesbot/carbon/src/Carbon/Lang/tlh.php new file mode 100644 index 0000000..fbf9e6f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tlh.php @@ -0,0 +1,72 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - Serhan Apaydın + * - Dominika + */ +return [ + 'year' => '{1}wa’ DIS|:count DIS', + 'month' => '{1}wa’ jar|:count jar', + 'week' => '{1}wa’ hogh|:count hogh', + 'day' => '{1}wa’ jaj|:count jaj', + 'hour' => '{1}wa’ rep|:count rep', + 'minute' => '{1}wa’ tup|:count tup', + 'second' => '{1}puS lup|:count lup', + 'ago' => function ($time) { + $output = strtr($time, [ + 'jaj' => 'Hu’', + 'jar' => 'wen', + 'DIS' => 'ben', + ]); + + return $output === $time ? "$time ret" : $output; + }, + 'from_now' => function ($time) { + $output = strtr($time, [ + 'jaj' => 'leS', + 'jar' => 'waQ', + 'DIS' => 'nem', + ]); + + return $output === $time ? "$time pIq" : $output; + }, + 'diff_yesterday' => 'wa’Hu’', + 'diff_today' => 'DaHjaj', + 'diff_tomorrow' => 'wa’leS', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[DaHjaj] LT', + 'nextDay' => '[wa’leS] LT', + 'nextWeek' => 'LLL', + 'lastDay' => '[wa’Hu’] LT', + 'lastWeek' => 'LLL', + 'sameElse' => 'L', + ], + 'ordinal' => ':number.', + 'months' => ['tera’ jar wa’', 'tera’ jar cha’', 'tera’ jar wej', 'tera’ jar loS', 'tera’ jar vagh', 'tera’ jar jav', 'tera’ jar Soch', 'tera’ jar chorgh', 'tera’ jar Hut', 'tera’ jar wa’maH', 'tera’ jar wa’maH wa’', 'tera’ jar wa’maH cha’'], + 'months_short' => ['jar wa’', 'jar cha’', 'jar wej', 'jar loS', 'jar vagh', 'jar jav', 'jar Soch', 'jar chorgh', 'jar Hut', 'jar wa’maH', 'jar wa’maH wa’', 'jar wa’maH cha’'], + 'weekdays' => ['lojmItjaj', 'DaSjaj', 'povjaj', 'ghItlhjaj', 'loghjaj', 'buqjaj', 'ghInjaj'], + 'weekdays_short' => ['lojmItjaj', 'DaSjaj', 'povjaj', 'ghItlhjaj', 'loghjaj', 'buqjaj', 'ghInjaj'], + 'weekdays_min' => ['lojmItjaj', 'DaSjaj', 'povjaj', 'ghItlhjaj', 'loghjaj', 'buqjaj', 'ghInjaj'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' ’ej '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tn.php b/vendor/nesbot/carbon/src/Carbon/Lang/tn.php new file mode 100644 index 0000000..f29bdf6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tn.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/tn_ZA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tn_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/tn_ZA.php new file mode 100644 index 0000000..aada7db --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tn_ZA.php @@ -0,0 +1,54 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['Ferikgong', 'Tlhakole', 'Mopitlwe', 'Moranang', 'Motsheganong', 'Seetebosigo', 'Phukwi', 'Phatwe', 'Lwetse', 'Diphalane', 'Ngwanatsele', 'Sedimonthole'], + 'months_short' => ['Fer', 'Tlh', 'Mop', 'Mor', 'Mot', 'See', 'Phu', 'Pha', 'Lwe', 'Dip', 'Ngw', 'Sed'], + 'weekdays' => ['laTshipi', 'Mosupologo', 'Labobedi', 'Laboraro', 'Labone', 'Labotlhano', 'Lamatlhatso'], + 'weekdays_short' => ['Tsh', 'Mos', 'Bed', 'Rar', 'Ne', 'Tlh', 'Mat'], + 'weekdays_min' => ['Tsh', 'Mos', 'Bed', 'Rar', 'Ne', 'Tlh', 'Mat'], + 'day_of_first_week_of_year' => 1, + + 'year' => 'dingwaga di le :count', + 'y' => 'dingwaga di le :count', + 'a_year' => 'dingwaga di le :count', + + 'month' => 'dikgwedi di le :count', + 'm' => 'dikgwedi di le :count', + 'a_month' => 'dikgwedi di le :count', + + 'week' => 'dibeke di le :count', + 'w' => 'dibeke di le :count', + 'a_week' => 'dibeke di le :count', + + 'day' => 'malatsi :count', + 'd' => 'malatsi :count', + 'a_day' => 'malatsi :count', + + 'hour' => 'diura di le :count', + 'h' => 'diura di le :count', + 'a_hour' => 'diura di le :count', + + 'minute' => 'metsotso e le :count', + 'min' => 'metsotso e le :count', + 'a_minute' => 'metsotso e le :count', + + 'second' => 'metsotswana e le :count', + 's' => 'metsotswana e le :count', + 'a_second' => 'metsotswana e le :count', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/to.php b/vendor/nesbot/carbon/src/Carbon/Lang/to.php new file mode 100644 index 0000000..20581bb --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/to.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/to_TO.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/to_TO.php b/vendor/nesbot/carbon/src/Carbon/Lang/to_TO.php new file mode 100644 index 0000000..335c69a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/to_TO.php @@ -0,0 +1,54 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - International Components for Unicode akhilesh.k@samsung.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'dddd DD MMM YYYY', + ], + 'months' => ['Sānuali', 'Fēpueli', 'Maʻasi', 'ʻEpeleli', 'Mē', 'Sune', 'Siulai', 'ʻAokosi', 'Sepitema', 'ʻOkatopa', 'Nōvema', 'Tīsema'], + 'months_short' => ['Sān', 'Fēp', 'Maʻa', 'ʻEpe', 'Mē', 'Sun', 'Siu', 'ʻAok', 'Sep', 'ʻOka', 'Nōv', 'Tīs'], + 'weekdays' => ['Sāpate', 'Mōnite', 'Tūsite', 'Pulelulu', 'Tuʻapulelulu', 'Falaite', 'Tokonaki'], + 'weekdays_short' => ['Sāp', 'Mōn', 'Tūs', 'Pul', 'Tuʻa', 'Fal', 'Tok'], + 'weekdays_min' => ['Sāp', 'Mōn', 'Tūs', 'Pul', 'Tuʻa', 'Fal', 'Tok'], + 'meridiem' => ['hengihengi', 'efiafi'], + + 'year' => ':count fitu', // less reliable + 'y' => ':count fitu', // less reliable + 'a_year' => ':count fitu', // less reliable + + 'month' => ':count mahina', // less reliable + 'm' => ':count mahina', // less reliable + 'a_month' => ':count mahina', // less reliable + + 'week' => ':count Sapate', // less reliable + 'w' => ':count Sapate', // less reliable + 'a_week' => ':count Sapate', // less reliable + + 'day' => ':count ʻaho', // less reliable + 'd' => ':count ʻaho', // less reliable + 'a_day' => ':count ʻaho', // less reliable + + 'hour' => ':count houa', + 'h' => ':count houa', + 'a_hour' => ':count houa', + + 'minute' => ':count miniti', + 'min' => ':count miniti', + 'a_minute' => ':count miniti', + + 'second' => ':count sekoni', + 's' => ':count sekoni', + 'a_second' => ':count sekoni', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tpi.php b/vendor/nesbot/carbon/src/Carbon/Lang/tpi.php new file mode 100644 index 0000000..7d38dae --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tpi.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/tpi_PG.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tpi_PG.php b/vendor/nesbot/carbon/src/Carbon/Lang/tpi_PG.php new file mode 100644 index 0000000..5f58c44 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tpi_PG.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Samsung Electronics Co., Ltd. akhilesh.k@samsung.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['Janueri', 'Februeri', 'Mas', 'Epril', 'Me', 'Jun', 'Julai', 'Ogas', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], + 'months_short' => ['Jan', 'Feb', 'Mas', 'Epr', 'Me', 'Jun', 'Jul', 'Oga', 'Sep', 'Okt', 'Nov', 'Des'], + 'weekdays' => ['Sande', 'Mande', 'Tunde', 'Trinde', 'Fonde', 'Fraide', 'Sarere'], + 'weekdays_short' => ['San', 'Man', 'Tun', 'Tri', 'Fon', 'Fra', 'Sar'], + 'weekdays_min' => ['San', 'Man', 'Tun', 'Tri', 'Fon', 'Fra', 'Sar'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['biknait', 'apinun'], + + 'year' => 'yia :count', + 'y' => 'yia :count', + 'a_year' => 'yia :count', + + 'month' => ':count mun', + 'm' => ':count mun', + 'a_month' => ':count mun', + + 'week' => ':count wik', + 'w' => ':count wik', + 'a_week' => ':count wik', + + 'day' => ':count de', + 'd' => ':count de', + 'a_day' => ':count de', + + 'hour' => ':count aua', + 'h' => ':count aua', + 'a_hour' => ':count aua', + + 'minute' => ':count minit', + 'min' => ':count minit', + 'a_minute' => ':count minit', + + 'second' => ':count namba tu', + 's' => ':count namba tu', + 'a_second' => ':count namba tu', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tr.php b/vendor/nesbot/carbon/src/Carbon/Lang/tr.php new file mode 100644 index 0000000..f5d9f4c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tr.php @@ -0,0 +1,121 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - Alan Agius + * - Erhan Gundogan + * - François B + * - JD Isaacks + * - Murat Yüksel + * - Baran Şengül + * - Selami (selamialtin) + * - TeomanBey + */ +return [ + 'year' => ':count yıl', + 'a_year' => '{1}bir yıl|]1,Inf[:count yıl', + 'y' => ':county', + 'month' => ':count ay', + 'a_month' => '{1}bir ay|]1,Inf[:count ay', + 'm' => ':countay', + 'week' => ':count hafta', + 'a_week' => '{1}bir hafta|]1,Inf[:count hafta', + 'w' => ':counth', + 'day' => ':count gün', + 'a_day' => '{1}bir gün|]1,Inf[:count gün', + 'd' => ':countg', + 'hour' => ':count saat', + 'a_hour' => '{1}bir saat|]1,Inf[:count saat', + 'h' => ':countsa', + 'minute' => ':count dakika', + 'a_minute' => '{1}bir dakika|]1,Inf[:count dakika', + 'min' => ':countdk', + 'second' => ':count saniye', + 'a_second' => '{1}birkaç saniye|]1,Inf[:count saniye', + 's' => ':countsn', + 'ago' => ':time önce', + 'from_now' => ':time sonra', + 'after' => ':time sonra', + 'before' => ':time önce', + 'diff_now' => 'şimdi', + 'diff_today' => 'bugün', + 'diff_today_regexp' => 'bugün(?:\\s+saat)?', + 'diff_yesterday' => 'dün', + 'diff_tomorrow' => 'yarın', + 'diff_tomorrow_regexp' => 'yarın(?:\\s+saat)?', + 'diff_before_yesterday' => 'evvelsi gün', + 'diff_after_tomorrow' => 'öbür gün', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[bugün saat] LT', + 'nextDay' => '[yarın saat] LT', + 'nextWeek' => '[gelecek] dddd [saat] LT', + 'lastDay' => '[dün] LT', + 'lastWeek' => '[geçen] dddd [saat] LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number, $period) { + switch ($period) { + case 'd': + case 'D': + case 'Do': + case 'DD': + return $number; + default: + if ($number === 0) { // special case for zero + return "$number'ıncı"; + } + + static $suffixes = [ + 1 => '\'inci', + 5 => '\'inci', + 8 => '\'inci', + 70 => '\'inci', + 80 => '\'inci', + 2 => '\'nci', + 7 => '\'nci', + 20 => '\'nci', + 50 => '\'nci', + 3 => '\'üncü', + 4 => '\'üncü', + 100 => '\'üncü', + 6 => '\'ncı', + 9 => '\'uncu', + 10 => '\'uncu', + 30 => '\'uncu', + 60 => '\'ıncı', + 90 => '\'ıncı', + ]; + + $lastDigit = $number % 10; + + return $number.($suffixes[$lastDigit] ?? $suffixes[$number % 100 - $lastDigit] ?? $suffixes[$number >= 100 ? 100 : -1] ?? ''); + } + }, + 'meridiem' => ['ÖÖ', 'ÖS', 'öö', 'ös'], + 'months' => ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'], + 'months_short' => ['Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz', 'Tem', 'Ağu', 'Eyl', 'Eki', 'Kas', 'Ara'], + 'weekdays' => ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'], + 'weekdays_short' => ['Paz', 'Pts', 'Sal', 'Çar', 'Per', 'Cum', 'Cts'], + 'weekdays_min' => ['Pz', 'Pt', 'Sa', 'Ça', 'Pe', 'Cu', 'Ct'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' ve '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tr_CY.php b/vendor/nesbot/carbon/src/Carbon/Lang/tr_CY.php new file mode 100644 index 0000000..23f1144 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tr_CY.php @@ -0,0 +1,23 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/tr.php', [ + 'weekdays_short' => ['Paz', 'Pzt', 'Sal', 'Çar', 'Per', 'Cum', 'Cmt'], + 'weekdays_min' => ['Pa', 'Pt', 'Sa', 'Ça', 'Pe', 'Cu', 'Ct'], + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'D.MM.YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm a', + 'LLLL' => 'D MMMM YYYY dddd h:mm a', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tr_TR.php b/vendor/nesbot/carbon/src/Carbon/Lang/tr_TR.php new file mode 100644 index 0000000..9e99482 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tr_TR.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/tr.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ts.php b/vendor/nesbot/carbon/src/Carbon/Lang/ts.php new file mode 100644 index 0000000..525736b --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ts.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/ts_ZA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ts_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ts_ZA.php new file mode 100644 index 0000000..37a24ec --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ts_ZA.php @@ -0,0 +1,54 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['Sunguti', 'Nyenyenyani', 'Nyenyankulu', 'Dzivamisoko', 'Mudyaxihi', 'Khotavuxika', 'Mawuwani', 'Mhawuri', 'Ndzhati', 'Nhlangula', 'Hukuri', 'N\'wendzamhala'], + 'months_short' => ['Sun', 'Yan', 'Kul', 'Dzi', 'Mud', 'Kho', 'Maw', 'Mha', 'Ndz', 'Nhl', 'Huk', 'N\'w'], + 'weekdays' => ['Sonto', 'Musumbhunuku', 'Ravumbirhi', 'Ravunharhu', 'Ravumune', 'Ravuntlhanu', 'Mugqivela'], + 'weekdays_short' => ['Son', 'Mus', 'Bir', 'Har', 'Ne', 'Tlh', 'Mug'], + 'weekdays_min' => ['Son', 'Mus', 'Bir', 'Har', 'Ne', 'Tlh', 'Mug'], + 'day_of_first_week_of_year' => 1, + + 'year' => 'malembe ya :count', + 'y' => 'malembe ya :count', + 'a_year' => 'malembe ya :count', + + 'month' => 'tin’hweti ta :count', + 'm' => 'tin’hweti ta :count', + 'a_month' => 'tin’hweti ta :count', + + 'week' => 'mavhiki ya :count', + 'w' => 'mavhiki ya :count', + 'a_week' => 'mavhiki ya :count', + + 'day' => 'masiku :count', + 'd' => 'masiku :count', + 'a_day' => 'masiku :count', + + 'hour' => 'tiawara ta :count', + 'h' => 'tiawara ta :count', + 'a_hour' => 'tiawara ta :count', + + 'minute' => 'timinete ta :count', + 'min' => 'timinete ta :count', + 'a_minute' => 'timinete ta :count', + + 'second' => 'tisekoni ta :count', + 's' => 'tisekoni ta :count', + 'a_second' => 'tisekoni ta :count', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tt.php b/vendor/nesbot/carbon/src/Carbon/Lang/tt.php new file mode 100644 index 0000000..d67d896 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tt.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/tt_RU.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU.php b/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU.php new file mode 100644 index 0000000..38e42d0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU.php @@ -0,0 +1,39 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Rinat Norkin Pablo Saratxaga, Rinat Norkin pablo@mandrakesoft.com, rinat@taif.ru + */ +return [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'DD MMM, HH:mm', + 'LLLL' => 'DD MMMM YYYY, HH:mm', + ], + 'months' => ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'], + 'months_short' => ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], + 'weekdays' => ['якшәмбе', 'дышәмбе', 'сишәмбе', 'чәршәәмбе', 'пәнҗешмбе', 'җомга', 'шимбә'], + 'weekdays_short' => ['якш', 'дыш', 'сиш', 'чәрш', 'пәнҗ', 'җом', 'шим'], + 'weekdays_min' => ['якш', 'дыш', 'сиш', 'чәрш', 'пәнҗ', 'җом', 'шим'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'year' => ':count ел', + 'month' => ':count ай', + 'week' => ':count атна', + 'day' => ':count көн', + 'hour' => ':count сәгать', + 'minute' => ':count минут', + 'second' => ':count секунд', +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php b/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php new file mode 100644 index 0000000..16b8efb --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Reshat Sabiq tatar.iqtelif.i18n@gmail.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD.MM.YYYY', + ], + 'months' => ['Ğınwar', 'Fiwral\'', 'Mart', 'April', 'May', 'Yün', 'Yül', 'Awgust', 'Sintebír', 'Üktebír', 'Noyebír', 'Dikebír'], + 'months_short' => ['Ğın', 'Fiw', 'Mar', 'Apr', 'May', 'Yün', 'Yül', 'Awg', 'Sin', 'Ükt', 'Noy', 'Dik'], + 'weekdays' => ['Yekşembí', 'Düşembí', 'Sişembí', 'Çerşembí', 'Pencíşembí', 'Comğa', 'Şimbe'], + 'weekdays_short' => ['Yek', 'Düş', 'Siş', 'Çer', 'Pen', 'Com', 'Şim'], + 'weekdays_min' => ['Yek', 'Düş', 'Siş', 'Çer', 'Pen', 'Com', 'Şim'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['ÖA', 'ÖS'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/twq.php b/vendor/nesbot/carbon/src/Carbon/Lang/twq.php new file mode 100644 index 0000000..5cbb46e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/twq.php @@ -0,0 +1,14 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/ses.php', [ + 'meridiem' => ['Subbaahi', 'Zaarikay b'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tzl.php b/vendor/nesbot/carbon/src/Carbon/Lang/tzl.php new file mode 100644 index 0000000..50bf26d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tzl.php @@ -0,0 +1,65 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return [ + 'year' => '[0,1]:count ar|:count ars', + 'y' => '[0,1]:count ar|:count ars', + 'month' => '[0,1]:count mes|:count mesen', + 'm' => '[0,1]:count mes|:count mesen', + 'week' => '[0,1]:count seifetziua|:count seifetziuas', + 'w' => '[0,1]:count seifetziua|:count seifetziuas', + 'day' => '[0,1]:count ziua|:count ziuas', + 'd' => '[0,1]:count ziua|:count ziuas', + 'hour' => '[0,1]:count þora|:count þoras', + 'h' => '[0,1]:count þora|:count þoras', + 'minute' => '[0,1]:count míut|:count míuts', + 'min' => '[0,1]:count míut|:count míuts', + 'second' => ':count secunds', + 's' => ':count secunds', + + 'ago' => 'ja :time', + 'from_now' => 'osprei :time', + + 'diff_yesterday' => 'ieiri', + 'diff_yesterday_regexp' => 'ieiri(?:\\s+à)?', + 'diff_today' => 'oxhi', + 'diff_today_regexp' => 'oxhi(?:\\s+à)?', + 'diff_tomorrow' => 'demà', + 'diff_tomorrow_regexp' => 'demà(?:\\s+à)?', + + 'formats' => [ + 'LT' => 'HH.mm', + 'LTS' => 'HH.mm.ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D. MMMM [dallas] YYYY', + 'LLL' => 'D. MMMM [dallas] YYYY HH.mm', + 'LLLL' => 'dddd, [li] D. MMMM [dallas] YYYY HH.mm', + ], + + 'calendar' => [ + 'sameDay' => '[oxhi à] LT', + 'nextDay' => '[demà à] LT', + 'nextWeek' => 'dddd [à] LT', + 'lastDay' => '[ieiri à] LT', + 'lastWeek' => '[sür el] dddd [lasteu à] LT', + 'sameElse' => 'L', + ], + + 'meridiem' => ["D'A", "D'O"], + 'months' => ['Januar', 'Fevraglh', 'Març', 'Avrïu', 'Mai', 'Gün', 'Julia', 'Guscht', 'Setemvar', 'Listopäts', 'Noemvar', 'Zecemvar'], + 'months_short' => ['Jan', 'Fev', 'Mar', 'Avr', 'Mai', 'Gün', 'Jul', 'Gus', 'Set', 'Lis', 'Noe', 'Zec'], + 'weekdays' => ['Súladi', 'Lúneçi', 'Maitzi', 'Márcuri', 'Xhúadi', 'Viénerçi', 'Sáturi'], + 'weekdays_short' => ['Súl', 'Lún', 'Mai', 'Már', 'Xhú', 'Vié', 'Sát'], + 'weekdays_min' => ['Sú', 'Lú', 'Ma', 'Má', 'Xh', 'Vi', 'Sá'], + 'ordinal' => ':number.', + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tzm.php b/vendor/nesbot/carbon/src/Carbon/Lang/tzm.php new file mode 100644 index 0000000..2a1a0f2 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tzm.php @@ -0,0 +1,57 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - JD Isaacks + */ +return [ + 'year' => '{1}ⴰⵙⴳⴰⵙ|:count ⵉⵙⴳⴰⵙⵏ', + 'month' => '{1}ⴰⵢoⵓⵔ|:count ⵉⵢⵢⵉⵔⵏ', + 'week' => ':count ⵉⵎⴰⵍⴰⵙⵙ', + 'day' => '{1}ⴰⵙⵙ|:count oⵙⵙⴰⵏ', + 'hour' => '{1}ⵙⴰⵄⴰ|:count ⵜⴰⵙⵙⴰⵄⵉⵏ', + 'minute' => '{1}ⵎⵉⵏⵓⴺ|:count ⵎⵉⵏⵓⴺ', + 'second' => '{1}ⵉⵎⵉⴽ|:count ⵉⵎⵉⴽ', + 'ago' => 'ⵢⴰⵏ :time', + 'from_now' => 'ⴷⴰⴷⵅ ⵙ ⵢⴰⵏ :time', + 'diff_today' => 'ⴰⵙⴷⵅ', + 'diff_yesterday' => 'ⴰⵚⴰⵏⵜ', + 'diff_yesterday_regexp' => 'ⴰⵚⴰⵏⵜ(?:\\s+ⴴ)?', + 'diff_tomorrow' => 'ⴰⵙⴽⴰ', + 'diff_tomorrow_regexp' => 'ⴰⵙⴽⴰ(?:\\s+ⴴ)?', + 'diff_today_regexp' => 'ⴰⵙⴷⵅ(?:\\s+ⴴ)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[ⴰⵙⴷⵅ ⴴ] LT', + 'nextDay' => '[ⴰⵙⴽⴰ ⴴ] LT', + 'nextWeek' => 'dddd [ⴴ] LT', + 'lastDay' => '[ⴰⵚⴰⵏⵜ ⴴ] LT', + 'lastWeek' => 'dddd [ⴴ] LT', + 'sameElse' => 'L', + ], + 'months' => ['ⵉⵏⵏⴰⵢⵔ', 'ⴱⵕⴰⵢⵕ', 'ⵎⴰⵕⵚ', 'ⵉⴱⵔⵉⵔ', 'ⵎⴰⵢⵢⵓ', 'ⵢⵓⵏⵢⵓ', 'ⵢⵓⵍⵢⵓⵣ', 'ⵖⵓⵛⵜ', 'ⵛⵓⵜⴰⵏⴱⵉⵔ', 'ⴽⵟⵓⴱⵕ', 'ⵏⵓⵡⴰⵏⴱⵉⵔ', 'ⴷⵓⵊⵏⴱⵉⵔ'], + 'months_short' => ['ⵉⵏⵏⴰⵢⵔ', 'ⴱⵕⴰⵢⵕ', 'ⵎⴰⵕⵚ', 'ⵉⴱⵔⵉⵔ', 'ⵎⴰⵢⵢⵓ', 'ⵢⵓⵏⵢⵓ', 'ⵢⵓⵍⵢⵓⵣ', 'ⵖⵓⵛⵜ', 'ⵛⵓⵜⴰⵏⴱⵉⵔ', 'ⴽⵟⵓⴱⵕ', 'ⵏⵓⵡⴰⵏⴱⵉⵔ', 'ⴷⵓⵊⵏⴱⵉⵔ'], + 'weekdays' => ['ⴰⵙⴰⵎⴰⵙ', 'ⴰⵢⵏⴰⵙ', 'ⴰⵙⵉⵏⴰⵙ', 'ⴰⴽⵔⴰⵙ', 'ⴰⴽⵡⴰⵙ', 'ⴰⵙⵉⵎⵡⴰⵙ', 'ⴰⵙⵉⴹⵢⴰⵙ'], + 'weekdays_short' => ['ⴰⵙⴰⵎⴰⵙ', 'ⴰⵢⵏⴰⵙ', 'ⴰⵙⵉⵏⴰⵙ', 'ⴰⴽⵔⴰⵙ', 'ⴰⴽⵡⴰⵙ', 'ⴰⵙⵉⵎⵡⴰⵙ', 'ⴰⵙⵉⴹⵢⴰⵙ'], + 'weekdays_min' => ['ⴰⵙⴰⵎⴰⵙ', 'ⴰⵢⵏⴰⵙ', 'ⴰⵙⵉⵏⴰⵙ', 'ⴰⴽⵔⴰⵙ', 'ⴰⴽⵡⴰⵙ', 'ⴰⵙⵉⵎⵡⴰⵙ', 'ⴰⵙⵉⴹⵢⴰⵙ'], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, + 'weekend' => [5, 6], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php b/vendor/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php new file mode 100644 index 0000000..5840d20 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php @@ -0,0 +1,64 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - JD Isaacks + */ +return [ + 'year' => '{1}:count asgas|:count isgasn', + 'a_year' => 'asgas|:count isgasn', + 'month' => '{1}:count ayowr|:count iyyirn', + 'a_month' => 'ayowr|:count iyyirn', + 'week' => ':count imalass', + 'a_week' => ':imalass', + 'day' => '{1}:count ass|:count ossan', + 'a_day' => 'ass|:count ossan', + 'hour' => '{1}:count saɛa|:count tassaɛin', + 'a_hour' => '{1}saɛa|:count tassaɛin', + 'minute' => ':count minuḍ', + 'a_minute' => '{1}minuḍ|:count minuḍ', + 'second' => ':count imik', + 'a_second' => '{1}imik|:count imik', + 'ago' => 'yan :time', + 'from_now' => 'dadkh s yan :time', + 'diff_yesterday' => 'assant', + 'diff_yesterday_regexp' => 'assant(?:\\s+g)?', + 'diff_today' => 'asdkh', + 'diff_today_regexp' => 'asdkh(?:\\s+g)?', + 'diff_tomorrow' => 'aska', + 'diff_tomorrow_regexp' => 'aska(?:\\s+g)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[asdkh g] LT', + 'nextDay' => '[aska g] LT', + 'nextWeek' => 'dddd [g] LT', + 'lastDay' => '[assant g] LT', + 'lastWeek' => 'dddd [g] LT', + 'sameElse' => 'L', + ], + 'months' => ['innayr', 'brˤayrˤ', 'marˤsˤ', 'ibrir', 'mayyw', 'ywnyw', 'ywlywz', 'ɣwšt', 'šwtanbir', 'ktˤwbrˤ', 'nwwanbir', 'dwjnbir'], + 'months_short' => ['innayr', 'brˤayrˤ', 'marˤsˤ', 'ibrir', 'mayyw', 'ywnyw', 'ywlywz', 'ɣwšt', 'šwtanbir', 'ktˤwbrˤ', 'nwwanbir', 'dwjnbir'], + 'weekdays' => ['asamas', 'aynas', 'asinas', 'akras', 'akwas', 'asimwas', 'asiḍyas'], + 'weekdays_short' => ['asamas', 'aynas', 'asinas', 'akras', 'akwas', 'asimwas', 'asiḍyas'], + 'weekdays_min' => ['asamas', 'aynas', 'asinas', 'akras', 'akwas', 'asimwas', 'asiḍyas'], + 'meridiem' => ['Zdat azal', 'Ḍeffir aza'], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ug.php b/vendor/nesbot/carbon/src/Carbon/Lang/ug.php new file mode 100644 index 0000000..259b99a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ug.php @@ -0,0 +1,90 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Philippe Vaucher + * - Tsutomu Kuroda + * - yasinn + */ +return [ + 'year' => '{1}'.'بىر يىل'.'|:count '.'يىل', + 'month' => '{1}'.'بىر ئاي'.'|:count '.'ئاي', + 'week' => '{1}'.'بىر ھەپتە'.'|:count '.'ھەپتە', + 'day' => '{1}'.'بىر كۈن'.'|:count '.'كۈن', + 'hour' => '{1}'.'بىر سائەت'.'|:count '.'سائەت', + 'minute' => '{1}'.'بىر مىنۇت'.'|:count '.'مىنۇت', + 'second' => '{1}'.'نەچچە سېكونت'.'|:count '.'سېكونت', + 'ago' => ':time بۇرۇن', + 'from_now' => ':time كېيىن', + 'diff_today' => 'بۈگۈن', + 'diff_yesterday' => 'تۆنۈگۈن', + 'diff_tomorrow' => 'ئەتە', + 'diff_tomorrow_regexp' => 'ئەتە(?:\\s+سائەت)?', + 'diff_today_regexp' => 'بۈگۈن(?:\\s+سائەت)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY-MM-DD', + 'LL' => 'YYYY-يىلىM-ئاينىڭD-كۈنى', + 'LLL' => 'YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm', + 'LLLL' => 'dddd، YYYY-يىلىM-ئاينىڭD-كۈنى، HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[بۈگۈن سائەت] LT', + 'nextDay' => '[ئەتە سائەت] LT', + 'nextWeek' => '[كېلەركى] dddd [سائەت] LT', + 'lastDay' => '[تۆنۈگۈن] LT', + 'lastWeek' => '[ئالدىنقى] dddd [سائەت] LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number, $period) { + switch ($period) { + case 'd': + case 'D': + case 'DDD': + return $number.'-كۈنى'; + case 'w': + case 'W': + return $number.'-ھەپتە'; + default: + return $number; + } + }, + 'meridiem' => function ($hour, $minute) { + $time = $hour * 100 + $minute; + if ($time < 600) { + return 'يېرىم كېچە'; + } + if ($time < 900) { + return 'سەھەر'; + } + if ($time < 1130) { + return 'چۈشتىن بۇرۇن'; + } + if ($time < 1230) { + return 'چۈش'; + } + if ($time < 1800) { + return 'چۈشتىن كېيىن'; + } + + return 'كەچ'; + }, + 'months' => ['يانۋار', 'فېۋرال', 'مارت', 'ئاپرېل', 'ماي', 'ئىيۇن', 'ئىيۇل', 'ئاۋغۇست', 'سېنتەبىر', 'ئۆكتەبىر', 'نويابىر', 'دېكابىر'], + 'months_short' => ['يانۋار', 'فېۋرال', 'مارت', 'ئاپرېل', 'ماي', 'ئىيۇن', 'ئىيۇل', 'ئاۋغۇست', 'سېنتەبىر', 'ئۆكتەبىر', 'نويابىر', 'دېكابىر'], + 'weekdays' => ['يەكشەنبە', 'دۈشەنبە', 'سەيشەنبە', 'چارشەنبە', 'پەيشەنبە', 'جۈمە', 'شەنبە'], + 'weekdays_short' => ['يە', 'دۈ', 'سە', 'چا', 'پە', 'جۈ', 'شە'], + 'weekdays_min' => ['يە', 'دۈ', 'سە', 'چا', 'پە', 'جۈ', 'شە'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' ۋە '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ug_CN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ug_CN.php new file mode 100644 index 0000000..deb828c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ug_CN.php @@ -0,0 +1,17 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Kunal Marwaha + * - Alim Boyaq + */ +return require __DIR__.'/ug.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uk.php b/vendor/nesbot/carbon/src/Carbon/Lang/uk.php new file mode 100644 index 0000000..1d5ba70 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/uk.php @@ -0,0 +1,212 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Carbon\CarbonInterface; + +$processHoursFunction = function (CarbonInterface $date, string $format) { + return $format.'о'.($date->hour === 11 ? 'б' : '').'] LT'; +}; + +/* + * Authors: + * - Kunal Marwaha + * - Josh Soref + * - François B + * - Tim Fish + * - Serhan Apaydın + * - Max Mykhailenko + * - JD Isaacks + * - Max Kovpak + * - AucT + * - Philippe Vaucher + * - Ilya Shaplyko + * - Vadym Ievsieiev + * - Denys Kurets + * - Igor Kasyanchuk + * - Tsutomu Kuroda + * - tjku + * - Max Melentiev + * - Oleh + * - epaminond + * - Juanito Fatas + * - Vitalii Khustochka + * - Akira Matsuda + * - Christopher Dell + * - Enrique Vidal + * - Simone Carletti + * - Aaron Patterson + * - Andriy Tyurnikov + * - Nicolás Hock Isaza + * - Iwakura Taro + * - Andrii Ponomarov + * - alecrabbit + * - vystepanenko + * - AlexWalkerson + * - Andre Havryliuk (Andrend) + * - Max Datsenko (datsenko-md) + */ +return [ + 'year' => ':count рік|:count роки|:count років', + 'y' => ':countр', + 'a_year' => '{1}рік|:count рік|:count роки|:count років', + 'month' => ':count місяць|:count місяці|:count місяців', + 'm' => ':countм', + 'a_month' => '{1}місяць|:count місяць|:count місяці|:count місяців', + 'week' => ':count тиждень|:count тижні|:count тижнів', + 'w' => ':countт', + 'a_week' => '{1}тиждень|:count тиждень|:count тижні|:count тижнів', + 'day' => ':count день|:count дні|:count днів', + 'd' => ':countд', + 'a_day' => '{1}день|:count день|:count дні|:count днів', + 'hour' => ':count година|:count години|:count годин', + 'h' => ':countг', + 'a_hour' => '{1}година|:count година|:count години|:count годин', + 'minute' => ':count хвилина|:count хвилини|:count хвилин', + 'min' => ':countхв', + 'a_minute' => '{1}хвилина|:count хвилина|:count хвилини|:count хвилин', + 'second' => ':count секунда|:count секунди|:count секунд', + 's' => ':countсек', + 'a_second' => '{1}декілька секунд|:count секунда|:count секунди|:count секунд', + + 'hour_ago' => ':count годину|:count години|:count годин', + 'a_hour_ago' => '{1}годину|:count годину|:count години|:count годин', + 'minute_ago' => ':count хвилину|:count хвилини|:count хвилин', + 'a_minute_ago' => '{1}хвилину|:count хвилину|:count хвилини|:count хвилин', + 'second_ago' => ':count секунду|:count секунди|:count секунд', + 'a_second_ago' => '{1}декілька секунд|:count секунду|:count секунди|:count секунд', + + 'hour_from_now' => ':count годину|:count години|:count годин', + 'a_hour_from_now' => '{1}годину|:count годину|:count години|:count годин', + 'minute_from_now' => ':count хвилину|:count хвилини|:count хвилин', + 'a_minute_from_now' => '{1}хвилину|:count хвилину|:count хвилини|:count хвилин', + 'second_from_now' => ':count секунду|:count секунди|:count секунд', + 'a_second_from_now' => '{1}декілька секунд|:count секунду|:count секунди|:count секунд', + + 'hour_after' => ':count годину|:count години|:count годин', + 'a_hour_after' => '{1}годину|:count годину|:count години|:count годин', + 'minute_after' => ':count хвилину|:count хвилини|:count хвилин', + 'a_minute_after' => '{1}хвилину|:count хвилину|:count хвилини|:count хвилин', + 'second_after' => ':count секунду|:count секунди|:count секунд', + 'a_second_after' => '{1}декілька секунд|:count секунду|:count секунди|:count секунд', + + 'hour_before' => ':count годину|:count години|:count годин', + 'a_hour_before' => '{1}годину|:count годину|:count години|:count годин', + 'minute_before' => ':count хвилину|:count хвилини|:count хвилин', + 'a_minute_before' => '{1}хвилину|:count хвилину|:count хвилини|:count хвилин', + 'second_before' => ':count секунду|:count секунди|:count секунд', + 'a_second_before' => '{1}декілька секунд|:count секунду|:count секунди|:count секунд', + + 'ago' => ':time тому', + 'from_now' => 'за :time', + 'after' => ':time після', + 'before' => ':time до', + 'diff_now' => 'щойно', + 'diff_today' => 'Сьогодні', + 'diff_today_regexp' => 'Сьогодні(?:\\s+о)?', + 'diff_yesterday' => 'вчора', + 'diff_yesterday_regexp' => 'Вчора(?:\\s+о)?', + 'diff_tomorrow' => 'завтра', + 'diff_tomorrow_regexp' => 'Завтра(?:\\s+о)?', + 'diff_before_yesterday' => 'позавчора', + 'diff_after_tomorrow' => 'післязавтра', + 'period_recurrences' => 'один раз|:count рази|:count разів', + 'period_interval' => 'кожні :interval', + 'period_start_date' => 'з :date', + 'period_end_date' => 'до :date', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY, HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY, HH:mm', + ], + 'calendar' => [ + 'sameDay' => function (CarbonInterface $date) use ($processHoursFunction) { + return $processHoursFunction($date, '[Сьогодні '); + }, + 'nextDay' => function (CarbonInterface $date) use ($processHoursFunction) { + return $processHoursFunction($date, '[Завтра '); + }, + 'nextWeek' => function (CarbonInterface $date) use ($processHoursFunction) { + return $processHoursFunction($date, '[У] dddd ['); + }, + 'lastDay' => function (CarbonInterface $date) use ($processHoursFunction) { + return $processHoursFunction($date, '[Вчора '); + }, + 'lastWeek' => function (CarbonInterface $date) use ($processHoursFunction) { + switch ($date->dayOfWeek) { + case 0: + case 3: + case 5: + case 6: + return $processHoursFunction($date, '[Минулої] dddd ['); + default: + return $processHoursFunction($date, '[Минулого] dddd ['); + } + }, + 'sameElse' => 'L', + ], + 'ordinal' => function ($number, $period) { + switch ($period) { + case 'M': + case 'd': + case 'DDD': + case 'w': + case 'W': + return $number.'-й'; + case 'D': + return $number.'-го'; + default: + return $number; + } + }, + 'meridiem' => function ($hour) { + if ($hour < 4) { + return 'ночі'; + } + if ($hour < 12) { + return 'ранку'; + } + if ($hour < 17) { + return 'дня'; + } + + return 'вечора'; + }, + 'months' => ['січня', 'лютого', 'березня', 'квітня', 'травня', 'червня', 'липня', 'серпня', 'вересня', 'жовтня', 'листопада', 'грудня'], + 'months_standalone' => ['січень', 'лютий', 'березень', 'квітень', 'травень', 'червень', 'липень', 'серпень', 'вересень', 'жовтень', 'листопад', 'грудень'], + 'months_short' => ['січ', 'лют', 'бер', 'кві', 'тра', 'чер', 'лип', 'сер', 'вер', 'жов', 'лис', 'гру'], + 'months_regexp' => '/(D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|L{2,4}|l{2,4})/', + 'weekdays' => function (CarbonInterface $date, $format, $index) { + static $words = [ + 'nominative' => ['неділя', 'понеділок', 'вівторок', 'середа', 'четвер', 'п’ятниця', 'субота'], + 'accusative' => ['неділю', 'понеділок', 'вівторок', 'середу', 'четвер', 'п’ятницю', 'суботу'], + 'genitive' => ['неділі', 'понеділка', 'вівторка', 'середи', 'четверга', 'п’ятниці', 'суботи'], + ]; + + $format = $format ?? ''; + $nounCase = preg_match('/(\[(В|в|У|у)\])\s+dddd/u', $format) + ? 'accusative' + : ( + preg_match('/\[?(?:минулої|наступної)?\s*\]\s+dddd/u', $format) + ? 'genitive' + : 'nominative' + ); + + return $words[$nounCase][$index] ?? null; + }, + 'weekdays_short' => ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'], + 'weekdays_min' => ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' i '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uk_UA.php b/vendor/nesbot/carbon/src/Carbon/Lang/uk_UA.php new file mode 100644 index 0000000..bd11d86 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/uk_UA.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/uk.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/unm.php b/vendor/nesbot/carbon/src/Carbon/Lang/unm.php new file mode 100644 index 0000000..d3f19f0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/unm.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/unm_US.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/unm_US.php b/vendor/nesbot/carbon/src/Carbon/Lang/unm_US.php new file mode 100644 index 0000000..fa5c374 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/unm_US.php @@ -0,0 +1,57 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['enikwsi', 'chkwali', 'xamokhwite', 'kwetayoxe', 'tainipen', 'kichinipen', 'lainipen', 'winaminke', 'kichitahkok', 'puksit', 'wini', 'muxkotae'], + 'months_short' => ['eni', 'chk', 'xam', 'kwe', 'tai', 'nip', 'lai', 'win', 'tah', 'puk', 'kun', 'mux'], + 'weekdays' => ['kentuwei', 'manteke', 'tusteke', 'lelai', 'tasteke', 'pelaiteke', 'sateteke'], + 'weekdays_short' => ['ken', 'man', 'tus', 'lel', 'tas', 'pel', 'sat'], + 'weekdays_min' => ['ken', 'man', 'tus', 'lel', 'tas', 'pel', 'sat'], + 'day_of_first_week_of_year' => 1, + + // Too unreliable + /* + 'year' => ':count kaxtëne', + 'y' => ':count kaxtëne', + 'a_year' => ':count kaxtëne', + + 'month' => ':count piskewëni kishux', // less reliable + 'm' => ':count piskewëni kishux', // less reliable + 'a_month' => ':count piskewëni kishux', // less reliable + + 'week' => ':count kishku', // less reliable + 'w' => ':count kishku', // less reliable + 'a_week' => ':count kishku', // less reliable + + 'day' => ':count kishku', + 'd' => ':count kishku', + 'a_day' => ':count kishku', + + 'hour' => ':count xkuk', // less reliable + 'h' => ':count xkuk', // less reliable + 'a_hour' => ':count xkuk', // less reliable + + 'minute' => ':count txituwàk', // less reliable + 'min' => ':count txituwàk', // less reliable + 'a_minute' => ':count txituwàk', // less reliable + + 'second' => ':count nisha', // less reliable + 's' => ':count nisha', // less reliable + 'a_second' => ':count nisha', // less reliable + */ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ur.php b/vendor/nesbot/carbon/src/Carbon/Lang/ur.php new file mode 100644 index 0000000..dc16c2c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ur.php @@ -0,0 +1,94 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +$months = [ + 'جنوری', + 'فروری', + 'مارچ', + 'اپریل', + 'مئی', + 'جون', + 'جولائی', + 'اگست', + 'ستمبر', + 'اکتوبر', + 'نومبر', + 'دسمبر', +]; + +$weekdays = [ + 'اتوار', + 'پیر', + 'منگل', + 'بدھ', + 'جمعرات', + 'جمعہ', + 'ہفتہ', +]; + +/* + * Authors: + * - Sawood Alam + * - Mehshan + * - Philippe Vaucher + * - Tsutomu Kuroda + * - tjku + * - Zaid Akram + * - Max Melentiev + * - hafezdivandari + * - Hossein Jabbari + * - nimamo + */ +return [ + 'year' => 'ایک سال|:count سال', + 'month' => 'ایک ماہ|:count ماہ', + 'week' => ':count ہفتے', + 'day' => 'ایک دن|:count دن', + 'hour' => 'ایک گھنٹہ|:count گھنٹے', + 'minute' => 'ایک منٹ|:count منٹ', + 'second' => 'چند سیکنڈ|:count سیکنڈ', + 'ago' => ':time قبل', + 'from_now' => ':time بعد', + 'after' => ':time بعد', + 'before' => ':time پہلے', + 'diff_now' => 'اب', + 'diff_today' => 'آج', + 'diff_today_regexp' => 'آج(?:\\s+بوقت)?', + 'diff_yesterday' => 'گزشتہ کل', + 'diff_yesterday_regexp' => 'گذشتہ(?:\\s+روز)?(?:\\s+بوقت)?', + 'diff_tomorrow' => 'آئندہ کل', + 'diff_tomorrow_regexp' => 'کل(?:\\s+بوقت)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd، D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[آج بوقت] LT', + 'nextDay' => '[کل بوقت] LT', + 'nextWeek' => 'dddd [بوقت] LT', + 'lastDay' => '[گذشتہ روز بوقت] LT', + 'lastWeek' => '[گذشتہ] dddd [بوقت] LT', + 'sameElse' => 'L', + ], + 'meridiem' => ['صبح', 'شام'], + 'months' => $months, + 'months_short' => $months, + 'weekdays' => $weekdays, + 'weekdays_short' => $weekdays, + 'weekdays_min' => $weekdays, + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => ['، ', ' اور '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ur_IN.php b/vendor/nesbot/carbon/src/Carbon/Lang/ur_IN.php new file mode 100644 index 0000000..f81c84d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ur_IN.php @@ -0,0 +1,26 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Red Hat, Pune bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/ur.php', [ + 'formats' => [ + 'L' => 'D/M/YY', + ], + 'months' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], + 'months_short' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], + 'weekdays' => ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'سنیچر'], + 'weekdays_short' => ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'سنیچر'], + 'weekdays_min' => ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'سنیچر'], + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ur_PK.php b/vendor/nesbot/carbon/src/Carbon/Lang/ur_PK.php new file mode 100644 index 0000000..8cd593d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ur_PK.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/ur.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], + 'months_short' => ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'], + 'weekdays' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], + 'weekdays_short' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], + 'weekdays_min' => ['اتوار', 'پير', 'منگل', 'بدھ', 'جمعرات', 'جمعه', 'هفته'], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['ص', 'ش'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uz.php b/vendor/nesbot/carbon/src/Carbon/Lang/uz.php new file mode 100644 index 0000000..61f3b64 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/uz.php @@ -0,0 +1,85 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Dmitriy Shabanov + * - JD Isaacks + * - Inoyatulloh + * - Jamshid + * - aarkhipov + * - Philippe Vaucher + * - felixthemagnificent + * - Tsutomu Kuroda + * - tjku + * - Max Melentiev + * - Juanito Fatas + * - Alisher Ulugbekov + * - Ergashev Adizbek + */ +return [ + 'year' => ':count йил', + 'a_year' => '{1}бир йил|:count йил', + 'y' => ':count й', + 'month' => ':count ой', + 'a_month' => '{1}бир ой|:count ой', + 'm' => ':count о', + 'week' => ':count ҳафта', + 'a_week' => '{1}бир ҳафта|:count ҳафта', + 'w' => ':count ҳ', + 'day' => ':count кун', + 'a_day' => '{1}бир кун|:count кун', + 'd' => ':count к', + 'hour' => ':count соат', + 'a_hour' => '{1}бир соат|:count соат', + 'h' => ':count с', + 'minute' => ':count дақиқа', + 'a_minute' => '{1}бир дақиқа|:count дақиқа', + 'min' => ':count д', + 'second' => ':count сония', + 'a_second' => '{1}сония|:count сония', + 's' => ':count с', + 'ago' => ':time аввал', + 'from_now' => 'Якин :time ичида', + 'after' => ':timeдан кейин', + 'before' => ':time олдин', + 'diff_now' => 'ҳозир', + 'diff_today' => 'Бугун', + 'diff_today_regexp' => 'Бугун(?:\\s+соат)?', + 'diff_yesterday' => 'Кеча', + 'diff_yesterday_regexp' => 'Кеча(?:\\s+соат)?', + 'diff_tomorrow' => 'Эртага', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'D MMMM YYYY, dddd HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Бугун соат] LT [да]', + 'nextDay' => '[Эртага] LT [да]', + 'nextWeek' => 'dddd [куни соат] LT [да]', + 'lastDay' => '[Кеча соат] LT [да]', + 'lastWeek' => '[Утган] dddd [куни соат] LT [да]', + 'sameElse' => 'L', + ], + 'months' => ['январ', 'феврал', 'март', 'апрел', 'май', 'июн', 'июл', 'август', 'сентябр', 'октябр', 'ноябр', 'декабр'], + 'months_short' => ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'], + 'weekdays' => ['якшанба', 'душанба', 'сешанба', 'чоршанба', 'пайшанба', 'жума', 'шанба'], + 'weekdays_short' => ['якш', 'душ', 'сеш', 'чор', 'пай', 'жум', 'шан'], + 'weekdays_min' => ['як', 'ду', 'се', 'чо', 'па', 'жу', 'ша'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['эрталаб', 'кечаси'], + 'list' => [', ', ' ва '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uz_Arab.php b/vendor/nesbot/carbon/src/Carbon/Lang/uz_Arab.php new file mode 100644 index 0000000..ffb5131 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/uz_Arab.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/fa.php', [ + 'weekdays' => ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'], + 'weekdays_short' => ['ی.', 'د.', 'س.', 'چ.', 'پ.', 'ج.', 'ش.'], + 'weekdays_min' => ['ی.', 'د.', 'س.', 'چ.', 'پ.', 'ج.', 'ش.'], + 'months' => ['جنوری', 'فبروری', 'مارچ', 'اپریل', 'می', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'], + 'months_short' => ['جنو', 'فبر', 'مار', 'اپر', 'می', 'جون', 'جول', 'اگس', 'سپت', 'اکت', 'نوم', 'دسم'], + 'first_day_of_week' => 6, + 'weekend' => [4, 5], + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY-MM-dd', + 'LL' => 'YYYY MMM D', + 'LLL' => 'YYYY MMMM D HH:mm', + 'LLLL' => 'YYYY MMMM D, dddd HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php b/vendor/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php new file mode 100644 index 0000000..89e9971 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php @@ -0,0 +1,20 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/uz.php', [ + 'formats' => [ + 'L' => 'DD/MM/yy', + 'LL' => 'D MMM, YYYY', + 'LLL' => 'D MMMM, YYYY HH:mm', + 'LLLL' => 'dddd, DD MMMM, YYYY HH:mm', + ], + 'meridiem' => ['ТО', 'ТК'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uz_Latn.php b/vendor/nesbot/carbon/src/Carbon/Lang/uz_Latn.php new file mode 100644 index 0000000..ecceeaa --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/uz_Latn.php @@ -0,0 +1,74 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Josh Soref + * - Rasulbek + * - Ilyosjon Kamoldinov (ilyosjon09) + */ +return [ + 'year' => ':count yil', + 'a_year' => '{1}bir yil|:count yil', + 'y' => ':count y', + 'month' => ':count oy', + 'a_month' => '{1}bir oy|:count oy', + 'm' => ':count o', + 'week' => ':count hafta', + 'a_week' => '{1}bir hafta|:count hafta', + 'w' => ':count h', + 'day' => ':count kun', + 'a_day' => '{1}bir kun|:count kun', + 'd' => ':count k', + 'hour' => ':count soat', + 'a_hour' => '{1}bir soat|:count soat', + 'h' => ':count soat', + 'minute' => ':count daqiqa', + 'a_minute' => '{1}bir daqiqa|:count daqiqa', + 'min' => ':count d', + 'second' => ':count soniya', + 'a_second' => '{1}soniya|:count soniya', + 's' => ':count son.', + 'ago' => ':time avval', + 'from_now' => 'Yaqin :time ichida', + 'after' => ':timedan keyin', + 'before' => ':time oldin', + 'diff_yesterday' => 'Kecha', + 'diff_yesterday_regexp' => 'Kecha(?:\\s+soat)?', + 'diff_today' => 'Bugun', + 'diff_today_regexp' => 'Bugun(?:\\s+soat)?', + 'diff_tomorrow' => 'Ertaga', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'D MMMM YYYY, dddd HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Bugun soat] LT [da]', + 'nextDay' => '[Ertaga] LT [da]', + 'nextWeek' => 'dddd [kuni soat] LT [da]', + 'lastDay' => '[Kecha soat] LT [da]', + 'lastWeek' => '[O\'tgan] dddd [kuni soat] LT [da]', + 'sameElse' => 'L', + ], + 'months' => ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'May', 'Iyun', 'Iyul', 'Avgust', 'Sentabr', 'Oktabr', 'Noyabr', 'Dekabr'], + 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'Iyun', 'Iyul', 'Avg', 'Sen', 'Okt', 'Noy', 'Dek'], + 'weekdays' => ['Yakshanba', 'Dushanba', 'Seshanba', 'Chorshanba', 'Payshanba', 'Juma', 'Shanba'], + 'weekdays_short' => ['Yak', 'Dush', 'Sesh', 'Chor', 'Pay', 'Jum', 'Shan'], + 'weekdays_min' => ['Ya', 'Du', 'Se', 'Cho', 'Pa', 'Ju', 'Sha'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' va '], + 'meridiem' => ['TO', 'TK'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ.php b/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ.php new file mode 100644 index 0000000..d41bfee --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Bobir Ismailov Bobir Ismailov, Pablo Saratxaga, Mashrab Kuvatov bobir_is@yahoo.com, pablo@mandrakesoft.com, kmashrab@uni-bremen.de + */ +return array_replace_recursive(require __DIR__.'/uz_Latn.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'May', 'Iyun', 'Iyul', 'Avgust', 'Sentabr', 'Oktabr', 'Noyabr', 'Dekabr'], + 'months_short' => ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'Iyn', 'Iyl', 'Avg', 'Sen', 'Okt', 'Noy', 'Dek'], + 'weekdays' => ['Yakshanba', 'Dushanba', 'Seshanba', 'Chorshanba', 'Payshanba', 'Juma', 'Shanba'], + 'weekdays_short' => ['Yak', 'Du', 'Se', 'Cho', 'Pay', 'Ju', 'Sha'], + 'weekdays_min' => ['Yak', 'Du', 'Se', 'Cho', 'Pay', 'Ju', 'Sha'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php b/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php new file mode 100644 index 0000000..2fa967c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Mashrab Kuvatov Mashrab Kuvatov, Pablo Saratxaga kmashrab@uni-bremen.de, pablo@mandrakesoft.com + */ +return array_replace_recursive(require __DIR__.'/uz.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['Январ', 'Феврал', 'Март', 'Апрел', 'Май', 'Июн', 'Июл', 'Август', 'Сентябр', 'Октябр', 'Ноябр', 'Декабр'], + 'months_short' => ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'], + 'weekdays' => ['Якшанба', 'Душанба', 'Сешанба', 'Чоршанба', 'Пайшанба', 'Жума', 'Шанба'], + 'weekdays_short' => ['Якш', 'Душ', 'Сеш', 'Чор', 'Пай', 'Жум', 'Шан'], + 'weekdays_min' => ['Якш', 'Душ', 'Сеш', 'Чор', 'Пай', 'Жум', 'Шан'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/vai.php b/vendor/nesbot/carbon/src/Carbon/Lang/vai.php new file mode 100644 index 0000000..3c378df --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/vai.php @@ -0,0 +1,35 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'weekdays' => ['ꕞꕌꔵ', 'ꗳꗡꘉ', 'ꕚꕞꕚ', 'ꕉꕞꕒ', 'ꕉꔤꕆꕢ', 'ꕉꔤꕀꕮ', 'ꔻꔬꔳ'], + 'weekdays_short' => ['ꕞꕌꔵ', 'ꗳꗡꘉ', 'ꕚꕞꕚ', 'ꕉꕞꕒ', 'ꕉꔤꕆꕢ', 'ꕉꔤꕀꕮ', 'ꔻꔬꔳ'], + 'weekdays_min' => ['ꕞꕌꔵ', 'ꗳꗡꘉ', 'ꕚꕞꕚ', 'ꕉꕞꕒ', 'ꕉꔤꕆꕢ', 'ꕉꔤꕀꕮ', 'ꔻꔬꔳ'], + 'months' => ['ꖨꖕ ꕪꕴ ꔞꔀꕮꕊ', 'ꕒꕡꖝꖕ', 'ꕾꖺ', 'ꖢꖕ', 'ꖑꕱ', 'ꖱꘋ', 'ꖱꕞꔤ', 'ꗛꔕ', 'ꕢꕌ', 'ꕭꖃ', 'ꔞꘋꕔꕿ ꕸꖃꗏ', 'ꖨꖕ ꕪꕴ ꗏꖺꕮꕊ'], + 'months_short' => ['ꖨꖕꔞ', 'ꕒꕡ', 'ꕾꖺ', 'ꖢꖕ', 'ꖑꕱ', 'ꖱꘋ', 'ꖱꕞ', 'ꗛꔕ', 'ꕢꕌ', 'ꕭꖃ', 'ꔞꘋ', 'ꖨꖕꗏ'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm a', + 'LLLL' => 'dddd, D MMMM YYYY h:mm a', + ], + + 'year' => ':count ꕀ', // less reliable + 'y' => ':count ꕀ', // less reliable + 'a_year' => ':count ꕀ', // less reliable + + 'second' => ':count ꗱꕞꕯꕊ', // less reliable + 's' => ':count ꗱꕞꕯꕊ', // less reliable + 'a_second' => ':count ꗱꕞꕯꕊ', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/vai_Latn.php b/vendor/nesbot/carbon/src/Carbon/Lang/vai_Latn.php new file mode 100644 index 0000000..51e83cc --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/vai_Latn.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'weekdays' => ['lahadi', 'tɛɛnɛɛ', 'talata', 'alaba', 'aimisa', 'aijima', 'siɓiti'], + 'weekdays_short' => ['lahadi', 'tɛɛnɛɛ', 'talata', 'alaba', 'aimisa', 'aijima', 'siɓiti'], + 'weekdays_min' => ['lahadi', 'tɛɛnɛɛ', 'talata', 'alaba', 'aimisa', 'aijima', 'siɓiti'], + 'months' => ['luukao kemã', 'ɓandaɓu', 'vɔɔ', 'fulu', 'goo', '6', '7', 'kɔnde', 'saah', 'galo', 'kenpkato ɓololɔ', 'luukao lɔma'], + 'months_short' => ['luukao kemã', 'ɓandaɓu', 'vɔɔ', 'fulu', 'goo', '6', '7', 'kɔnde', 'saah', 'galo', 'kenpkato ɓololɔ', 'luukao lɔma'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'h:mm a', + 'LTS' => 'h:mm:ss a', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm a', + 'LLLL' => 'dddd, D MMMM YYYY h:mm a', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php b/vendor/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php new file mode 100644 index 0000000..b4bb533 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/vai.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ve.php b/vendor/nesbot/carbon/src/Carbon/Lang/ve.php new file mode 100644 index 0000000..7f10aeb --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ve.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/ve_ZA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ve_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/ve_ZA.php new file mode 100644 index 0000000..5eb2b91 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ve_ZA.php @@ -0,0 +1,49 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['Phando', 'Luhuhi', 'Ṱhafamuhwe', 'Lambamai', 'Shundunthule', 'Fulwi', 'Fulwana', 'Ṱhangule', 'Khubvumedzi', 'Tshimedzi', 'Ḽara', 'Nyendavhusiku'], + 'months_short' => ['Pha', 'Luh', 'Fam', 'Lam', 'Shu', 'Lwi', 'Lwa', 'Ngu', 'Khu', 'Tsh', 'Ḽar', 'Nye'], + 'weekdays' => ['Swondaha', 'Musumbuluwo', 'Ḽavhuvhili', 'Ḽavhuraru', 'Ḽavhuṋa', 'Ḽavhuṱanu', 'Mugivhela'], + 'weekdays_short' => ['Swo', 'Mus', 'Vhi', 'Rar', 'ṋa', 'Ṱan', 'Mug'], + 'weekdays_min' => ['Swo', 'Mus', 'Vhi', 'Rar', 'ṋa', 'Ṱan', 'Mug'], + 'day_of_first_week_of_year' => 1, + + // Too unreliable + /* + 'day' => ':count vhege', // less reliable + 'd' => ':count vhege', // less reliable + 'a_day' => ':count vhege', // less reliable + + 'hour' => ':count watshi', // less reliable + 'h' => ':count watshi', // less reliable + 'a_hour' => ':count watshi', // less reliable + + 'minute' => ':count watshi', // less reliable + 'min' => ':count watshi', // less reliable + 'a_minute' => ':count watshi', // less reliable + + 'second' => ':count Mu', // less reliable + 's' => ':count Mu', // less reliable + 'a_second' => ':count Mu', // less reliable + + 'week' => ':count vhege', + 'w' => ':count vhege', + 'a_week' => ':count vhege', + */ +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/vi.php b/vendor/nesbot/carbon/src/Carbon/Lang/vi.php new file mode 100644 index 0000000..73e2852 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/vi.php @@ -0,0 +1,76 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - Andre Polykanine A.K.A. Menelion Elensúlë + * - JD Isaacks + */ +return [ + 'year' => ':count năm', + 'a_year' => '{1}một năm|]1, Inf[:count năm', + 'y' => ':count năm', + 'month' => ':count tháng', + 'a_month' => '{1}một tháng|]1, Inf[:count tháng', + 'm' => ':count tháng', + 'week' => ':count tuần', + 'a_week' => '{1}một tuần|]1, Inf[:count tuần', + 'w' => ':count tuần', + 'day' => ':count ngày', + 'a_day' => '{1}một ngày|]1, Inf[:count ngày', + 'd' => ':count ngày', + 'hour' => ':count giờ', + 'a_hour' => '{1}một giờ|]1, Inf[:count giờ', + 'h' => ':count giờ', + 'minute' => ':count phút', + 'a_minute' => '{1}một phút|]1, Inf[:count phút', + 'min' => ':count phút', + 'second' => ':count giây', + 'a_second' => '{1}vài giây|]1, Inf[:count giây', + 's' => ':count giây', + 'ago' => ':time trước', + 'from_now' => ':time tới', + 'after' => ':time sau', + 'before' => ':time trước', + 'diff_now' => 'bây giờ', + 'diff_today' => 'Hôm', + 'diff_today_regexp' => 'Hôm(?:\\s+nay)?(?:\\s+lúc)?', + 'diff_yesterday' => 'Hôm qua', + 'diff_yesterday_regexp' => 'Hôm(?:\\s+qua)?(?:\\s+lúc)?', + 'diff_tomorrow' => 'Ngày mai', + 'diff_tomorrow_regexp' => 'Ngày(?:\\s+mai)?(?:\\s+lúc)?', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM [năm] YYYY', + 'LLL' => 'D MMMM [năm] YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM [năm] YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[Hôm nay lúc] LT', + 'nextDay' => '[Ngày mai lúc] LT', + 'nextWeek' => 'dddd [tuần tới lúc] LT', + 'lastDay' => '[Hôm qua lúc] LT', + 'lastWeek' => 'dddd [tuần trước lúc] LT', + 'sameElse' => 'L', + ], + 'meridiem' => ['SA', 'CH'], + 'months' => ['tháng 1', 'tháng 2', 'tháng 3', 'tháng 4', 'tháng 5', 'tháng 6', 'tháng 7', 'tháng 8', 'tháng 9', 'tháng 10', 'tháng 11', 'tháng 12'], + 'months_short' => ['Th01', 'Th02', 'Th03', 'Th04', 'Th05', 'Th06', 'Th07', 'Th08', 'Th09', 'Th10', 'Th11', 'Th12'], + 'weekdays' => ['chủ nhật', 'thứ hai', 'thứ ba', 'thứ tư', 'thứ năm', 'thứ sáu', 'thứ bảy'], + 'weekdays_short' => ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], + 'weekdays_min' => ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => [', ', ' và '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/vi_VN.php b/vendor/nesbot/carbon/src/Carbon/Lang/vi_VN.php new file mode 100644 index 0000000..18d8987 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/vi_VN.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/vi.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/vo.php b/vendor/nesbot/carbon/src/Carbon/Lang/vo.php new file mode 100644 index 0000000..e273033 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/vo.php @@ -0,0 +1,52 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'months' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], + 'months_short' => ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY-MM-dd', + 'LL' => 'YYYY MMM D', + 'LLL' => 'YYYY MMMM D HH:mm', + 'LLLL' => 'YYYY MMMM D, dddd HH:mm', + ], + + 'year' => ':count yel', + 'y' => ':count yel', + 'a_year' => ':count yel', + + 'month' => ':count mul', + 'm' => ':count mul', + 'a_month' => ':count mul', + + 'week' => ':count vig', + 'w' => ':count vig', + 'a_week' => ':count vig', + + 'day' => ':count del', + 'd' => ':count del', + 'a_day' => ':count del', + + 'hour' => ':count düp', + 'h' => ':count düp', + 'a_hour' => ':count düp', + + 'minute' => ':count minut', + 'min' => ':count minut', + 'a_minute' => ':count minut', + + 'second' => ':count sekun', + 's' => ':count sekun', + 'a_second' => ':count sekun', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/vun.php b/vendor/nesbot/carbon/src/Carbon/Lang/vun.php new file mode 100644 index 0000000..ed92e8e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/vun.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['utuko', 'kyiukonyi'], + 'weekdays' => ['Jumapilyi', 'Jumatatuu', 'Jumanne', 'Jumatanu', 'Alhamisi', 'Ijumaa', 'Jumamosi'], + 'weekdays_short' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], + 'weekdays_min' => ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'], + 'months' => ['Januari', 'Februari', 'Machi', 'Aprilyi', 'Mei', 'Junyi', 'Julyai', 'Agusti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'], + 'months_short' => ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/wa.php b/vendor/nesbot/carbon/src/Carbon/Lang/wa.php new file mode 100644 index 0000000..f6dc4cc --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/wa.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/wa_BE.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/wa_BE.php b/vendor/nesbot/carbon/src/Carbon/Lang/wa_BE.php new file mode 100644 index 0000000..a76d80d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/wa_BE.php @@ -0,0 +1,55 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Djan SACRE Pablo Saratxaga pablo@mandrakesoft.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['di djanvî', 'di fevrî', 'di måss', 'd’ avri', 'di may', 'di djun', 'di djulete', 'd’ awousse', 'di setimbe', 'd’ octôbe', 'di nôvimbe', 'di decimbe'], + 'months_short' => ['dja', 'fev', 'mås', 'avr', 'may', 'djn', 'djl', 'awo', 'set', 'oct', 'nôv', 'dec'], + 'weekdays' => ['dimegne', 'londi', 'mårdi', 'mierkidi', 'djudi', 'vénrdi', 'semdi'], + 'weekdays_short' => ['dim', 'lon', 'mår', 'mie', 'dju', 'vén', 'sem'], + 'weekdays_min' => ['dim', 'lon', 'mår', 'mie', 'dju', 'vén', 'sem'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + + 'year' => ':count anêye', + 'y' => ':count anêye', + 'a_year' => ':count anêye', + + 'month' => ':count meûs', + 'm' => ':count meûs', + 'a_month' => ':count meûs', + + 'week' => ':count samwinne', + 'w' => ':count samwinne', + 'a_week' => ':count samwinne', + + 'day' => ':count djoû', + 'd' => ':count djoû', + 'a_day' => ':count djoû', + + 'hour' => ':count eure', + 'h' => ':count eure', + 'a_hour' => ':count eure', + + 'minute' => ':count munute', + 'min' => ':count munute', + 'a_minute' => ':count munute', + + 'second' => ':count Sigonde', + 's' => ':count Sigonde', + 'a_second' => ':count Sigonde', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/wae.php b/vendor/nesbot/carbon/src/Carbon/Lang/wae.php new file mode 100644 index 0000000..bf57f23 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/wae.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/wae_CH.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/wae_CH.php b/vendor/nesbot/carbon/src/Carbon/Lang/wae_CH.php new file mode 100644 index 0000000..2af50b4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/wae_CH.php @@ -0,0 +1,31 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Walser Translation Team ml@translate-wae.ch + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'YYYY-MM-DD', + ], + 'months' => ['Jenner', 'Hornig', 'Märze', 'Abrille', 'Meije', 'Bráčet', 'Heiwet', 'Öigšte', 'Herbštmánet', 'Wímánet', 'Wintermánet', 'Chrištmánet'], + 'months_short' => ['Jen', 'Hor', 'Mär', 'Abr', 'Mei', 'Brá', 'Hei', 'Öig', 'Her', 'Wím', 'Win', 'Chr'], + 'weekdays' => ['Suntag', 'Mäntag', 'Zischtag', 'Mittwuch', 'Frontag', 'Fritag', 'Samschtag'], + 'weekdays_short' => ['Sun', 'Män', 'Zis', 'Mit', 'Fro', 'Fri', 'Sam'], + 'weekdays_min' => ['Sun', 'Män', 'Zis', 'Mit', 'Fro', 'Fri', 'Sam'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + + 'month' => ':count Maano', // less reliable + 'm' => ':count Maano', // less reliable + 'a_month' => ':count Maano', // less reliable +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/wal.php b/vendor/nesbot/carbon/src/Carbon/Lang/wal.php new file mode 100644 index 0000000..e8ec40f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/wal.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/wal_ET.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/wal_ET.php b/vendor/nesbot/carbon/src/Carbon/Lang/wal_ET.php new file mode 100644 index 0000000..a4e619a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/wal_ET.php @@ -0,0 +1,27 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Ge'ez Frontier Foundation locales@geez.org + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['ጃንዩወሪ', 'ፌብሩወሪ', 'ማርች', 'ኤፕረል', 'ሜይ', 'ጁን', 'ጁላይ', 'ኦገስት', 'ሴፕቴምበር', 'ኦክተውበር', 'ኖቬምበር', 'ዲሴምበር'], + 'months_short' => ['ጃንዩ', 'ፌብሩ', 'ማርች', 'ኤፕረ', 'ሜይ ', 'ጁን ', 'ጁላይ', 'ኦገስ', 'ሴፕቴ', 'ኦክተ', 'ኖቬም', 'ዲሴም'], + 'weekdays' => ['ወጋ', 'ሳይኖ', 'ማቆሳኛ', 'አሩዋ', 'ሃሙሳ', 'አርባ', 'ቄራ'], + 'weekdays_short' => ['ወጋ ', 'ሳይኖ', 'ማቆሳ', 'አሩዋ', 'ሃሙሳ', 'አርባ', 'ቄራ '], + 'weekdays_min' => ['ወጋ ', 'ሳይኖ', 'ማቆሳ', 'አሩዋ', 'ሃሙሳ', 'አርባ', 'ቄራ '], + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['ማለዶ', 'ቃማ'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/wo.php b/vendor/nesbot/carbon/src/Carbon/Lang/wo.php new file mode 100644 index 0000000..74b95df --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/wo.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/wo_SN.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/wo_SN.php b/vendor/nesbot/carbon/src/Carbon/Lang/wo_SN.php new file mode 100644 index 0000000..f8a85b3 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/wo_SN.php @@ -0,0 +1,39 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - The Debian Project Christian Perrier bubulle@debian.org + */ +return [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD.MM.YYYY', + 'LL' => 'MMMM DD, YYYY', + 'LLL' => 'DD MMM HH:mm', + 'LLLL' => 'MMMM DD, YYYY HH:mm', + ], + 'months' => ['sanwiy\'e', 'feebriy\'e', 'mars', 'awril', 'me', 'suwen', 'sulet', 'uut', 'septaambar', 'oktoobar', 'nowaambar', 'desaambar'], + 'months_short' => ['san', 'fee', 'mar', 'awr', 'me ', 'suw', 'sul', 'uut', 'sep', 'okt', 'now', 'des'], + 'weekdays' => ['dib\'eer', 'altine', 'talaata', 'allarba', 'alxames', 'ajjuma', 'gaawu'], + 'weekdays_short' => ['dib', 'alt', 'tal', 'all', 'alx', 'ajj', 'gaa'], + 'weekdays_min' => ['dib', 'alt', 'tal', 'all', 'alx', 'ajj', 'gaa'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'year' => ':count at', + 'month' => ':count wèr', + 'week' => ':count ayubés', + 'day' => ':count bés', + 'hour' => ':count waxtu', + 'minute' => ':count simili', + 'second' => ':count saa', +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/xh.php b/vendor/nesbot/carbon/src/Carbon/Lang/xh.php new file mode 100644 index 0000000..e88c78d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/xh.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/xh_ZA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/xh_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/xh_ZA.php new file mode 100644 index 0000000..910f831 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/xh_ZA.php @@ -0,0 +1,54 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['eyoMqungu', 'eyoMdumba', 'eyoKwindla', 'uTshazimpuzi', 'uCanzibe', 'eyeSilimela', 'eyeKhala', 'eyeThupa', 'eyoMsintsi', 'eyeDwarha', 'eyeNkanga', 'eyoMnga'], + 'months_short' => ['Mqu', 'Mdu', 'Kwi', 'Tsh', 'Can', 'Sil', 'Kha', 'Thu', 'Msi', 'Dwa', 'Nka', 'Mng'], + 'weekdays' => ['iCawa', 'uMvulo', 'lwesiBini', 'lwesiThathu', 'ulweSine', 'lwesiHlanu', 'uMgqibelo'], + 'weekdays_short' => ['Caw', 'Mvu', 'Bin', 'Tha', 'Sin', 'Hla', 'Mgq'], + 'weekdays_min' => ['Caw', 'Mvu', 'Bin', 'Tha', 'Sin', 'Hla', 'Mgq'], + 'day_of_first_week_of_year' => 1, + + 'year' => ':count ihlobo', // less reliable + 'y' => ':count ihlobo', // less reliable + 'a_year' => ':count ihlobo', // less reliable + + 'hour' => ':count iwotshi', // less reliable + 'h' => ':count iwotshi', // less reliable + 'a_hour' => ':count iwotshi', // less reliable + + 'minute' => ':count ingqalelo', // less reliable + 'min' => ':count ingqalelo', // less reliable + 'a_minute' => ':count ingqalelo', // less reliable + + 'second' => ':count nceda', // less reliable + 's' => ':count nceda', // less reliable + 'a_second' => ':count nceda', // less reliable + + 'month' => ':count inyanga', + 'm' => ':count inyanga', + 'a_month' => ':count inyanga', + + 'week' => ':count veki', + 'w' => ':count veki', + 'a_week' => ':count veki', + + 'day' => ':count imini', + 'd' => ':count imini', + 'a_day' => ':count imini', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/xog.php b/vendor/nesbot/carbon/src/Carbon/Lang/xog.php new file mode 100644 index 0000000..eb55b4a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/xog.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['Munkyo', 'Eigulo'], + 'weekdays' => ['Sabiiti', 'Balaza', 'Owokubili', 'Owokusatu', 'Olokuna', 'Olokutaanu', 'Olomukaaga'], + 'weekdays_short' => ['Sabi', 'Bala', 'Kubi', 'Kusa', 'Kuna', 'Kuta', 'Muka'], + 'weekdays_min' => ['Sabi', 'Bala', 'Kubi', 'Kusa', 'Kuna', 'Kuta', 'Muka'], + 'months' => ['Janwaliyo', 'Febwaliyo', 'Marisi', 'Apuli', 'Maayi', 'Juuni', 'Julaayi', 'Agusito', 'Sebuttemba', 'Okitobba', 'Novemba', 'Desemba'], + 'months_short' => ['Jan', 'Feb', 'Mar', 'Apu', 'Maa', 'Juu', 'Jul', 'Agu', 'Seb', 'Oki', 'Nov', 'Des'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yav.php b/vendor/nesbot/carbon/src/Carbon/Lang/yav.php new file mode 100644 index 0000000..225a20d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/yav.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/en.php', [ + 'meridiem' => ['kiɛmɛ́ɛm', 'kisɛ́ndɛ'], + 'weekdays' => ['sɔ́ndiɛ', 'móndie', 'muányáŋmóndie', 'metúkpíápɛ', 'kúpélimetúkpiapɛ', 'feléte', 'séselé'], + 'weekdays_short' => ['sd', 'md', 'mw', 'et', 'kl', 'fl', 'ss'], + 'weekdays_min' => ['sd', 'md', 'mw', 'et', 'kl', 'fl', 'ss'], + 'months' => ['pikítíkítie, oólí ú kutúan', 'siɛyɛ́, oóli ú kándíɛ', 'ɔnsúmbɔl, oóli ú kátátúɛ', 'mesiŋ, oóli ú kénie', 'ensil, oóli ú kátánuɛ', 'ɔsɔn', 'efute', 'pisuyú', 'imɛŋ i puɔs', 'imɛŋ i putúk,oóli ú kátíɛ', 'makandikɛ', 'pilɔndɔ́'], + 'months_short' => ['o.1', 'o.2', 'o.3', 'o.4', 'o.5', 'o.6', 'o.7', 'o.8', 'o.9', 'o.10', 'o.11', 'o.12'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yi.php b/vendor/nesbot/carbon/src/Carbon/Lang/yi.php new file mode 100644 index 0000000..8f32022 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/yi.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/yi_US.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yi_US.php b/vendor/nesbot/carbon/src/Carbon/Lang/yi_US.php new file mode 100644 index 0000000..f764d36 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/yi_US.php @@ -0,0 +1,54 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - http://www.uyip.org/ Pablo Saratxaga pablo@mandrakesoft.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['יאַנואַר', 'פֿעברואַר', 'מערץ', 'אַפּריל', 'מיי', 'יוני', 'יולי', 'אויגוסט', 'סעפּטעמבער', 'אקטאבער', 'נאוועמבער', 'דעצעמבער'], + 'months_short' => ['יאַנ', 'פֿעב', 'מאַר', 'אַפּר', 'מײַ ', 'יונ', 'יול', 'אױג', 'סעפּ', 'אָקט', 'נאָװ', 'דעצ'], + 'weekdays' => ['זונטיק', 'מאָנטיק', 'דינסטיק', 'מיטװאָך', 'דאָנערשטיק', 'פֿרײַטיק', 'שבת'], + 'weekdays_short' => ['זונ\'', 'מאָנ\'', 'דינ\'', 'מיט\'', 'דאָנ\'', 'פֿרײַ\'', 'שבת'], + 'weekdays_min' => ['זונ\'', 'מאָנ\'', 'דינ\'', 'מיט\'', 'דאָנ\'', 'פֿרײַ\'', 'שבת'], + 'day_of_first_week_of_year' => 1, + + 'year' => ':count יאר', + 'y' => ':count יאר', + 'a_year' => ':count יאר', + + 'month' => ':count חודש', + 'm' => ':count חודש', + 'a_month' => ':count חודש', + + 'week' => ':count וואָך', + 'w' => ':count וואָך', + 'a_week' => ':count וואָך', + + 'day' => ':count טאָג', + 'd' => ':count טאָג', + 'a_day' => ':count טאָג', + + 'hour' => ':count שעה', + 'h' => ':count שעה', + 'a_hour' => ':count שעה', + + 'minute' => ':count מינוט', + 'min' => ':count מינוט', + 'a_minute' => ':count מינוט', + + 'second' => ':count סעקונדע', + 's' => ':count סעקונדע', + 'a_second' => ':count סעקונדע', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yo.php b/vendor/nesbot/carbon/src/Carbon/Lang/yo.php new file mode 100644 index 0000000..0a82981 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/yo.php @@ -0,0 +1,65 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - François B + * - Atolagbe Abisoye + */ +return [ + 'year' => 'ọdún :count', + 'a_year' => '{1}ọdún kan|ọdún :count', + 'month' => 'osù :count', + 'a_month' => '{1}osù kan|osù :count', + 'week' => 'ọsẹ :count', + 'a_week' => '{1}ọsẹ kan|ọsẹ :count', + 'day' => 'ọjọ́ :count', + 'a_day' => '{1}ọjọ́ kan|ọjọ́ :count', + 'hour' => 'wákati :count', + 'a_hour' => '{1}wákati kan|wákati :count', + 'minute' => 'ìsẹjú :count', + 'a_minute' => '{1}ìsẹjú kan|ìsẹjú :count', + 'second' => 'iaayá :count', + 'a_second' => '{1}ìsẹjú aayá die|aayá :count', + 'ago' => ':time kọjá', + 'from_now' => 'ní :time', + 'diff_yesterday' => 'Àna', + 'diff_yesterday_regexp' => 'Àna(?:\\s+ni)?', + 'diff_today' => 'Ònì', + 'diff_today_regexp' => 'Ònì(?:\\s+ni)?', + 'diff_tomorrow' => 'Ọ̀la', + 'diff_tomorrow_regexp' => 'Ọ̀la(?:\\s+ni)?', + 'formats' => [ + 'LT' => 'h:mm A', + 'LTS' => 'h:mm:ss A', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY h:mm A', + 'LLLL' => 'dddd, D MMMM YYYY h:mm A', + ], + 'calendar' => [ + 'sameDay' => '[Ònì ni] LT', + 'nextDay' => '[Ọ̀la ni] LT', + 'nextWeek' => 'dddd [Ọsẹ̀ tón\'bọ] [ni] LT', + 'lastDay' => '[Àna ni] LT', + 'lastWeek' => 'dddd [Ọsẹ̀ tólọ́] [ni] LT', + 'sameElse' => 'L', + ], + 'ordinal' => 'ọjọ́ :number', + 'months' => ['Sẹ́rẹ́', 'Èrèlè', 'Ẹrẹ̀nà', 'Ìgbé', 'Èbibi', 'Òkùdu', 'Agẹmo', 'Ògún', 'Owewe', 'Ọ̀wàrà', 'Bélú', 'Ọ̀pẹ̀̀'], + 'months_short' => ['Sẹ́r', 'Èrl', 'Ẹrn', 'Ìgb', 'Èbi', 'Òkù', 'Agẹ', 'Ògú', 'Owe', 'Ọ̀wà', 'Bél', 'Ọ̀pẹ̀̀'], + 'weekdays' => ['Àìkú', 'Ajé', 'Ìsẹ́gun', 'Ọjọ́rú', 'Ọjọ́bọ', 'Ẹtì', 'Àbámẹ́ta'], + 'weekdays_short' => ['Àìk', 'Ajé', 'Ìsẹ́', 'Ọjr', 'Ọjb', 'Ẹtì', 'Àbá'], + 'weekdays_min' => ['Àì', 'Aj', 'Ìs', 'Ọr', 'Ọb', 'Ẹt', 'Àb'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'meridiem' => ['Àárọ̀', 'Ọ̀sán'], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yo_BJ.php b/vendor/nesbot/carbon/src/Carbon/Lang/yo_BJ.php new file mode 100644 index 0000000..12b9e81 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/yo_BJ.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return array_replace_recursive(require __DIR__.'/yo.php', [ + 'meridiem' => ['Àárɔ̀', 'Ɔ̀sán'], + 'weekdays' => ['Ɔjɔ́ Àìkú', 'Ɔjɔ́ Ajé', 'Ɔjɔ́ Ìsɛ́gun', 'Ɔjɔ́rú', 'Ɔjɔ́bɔ', 'Ɔjɔ́ Ɛtì', 'Ɔjɔ́ Àbámɛ́ta'], + 'weekdays_short' => ['Àìkú', 'Ajé', 'Ìsɛ́gun', 'Ɔjɔ́rú', 'Ɔjɔ́bɔ', 'Ɛtì', 'Àbámɛ́ta'], + 'weekdays_min' => ['Àìkú', 'Ajé', 'Ìsɛ́gun', 'Ɔjɔ́rú', 'Ɔjɔ́bɔ', 'Ɛtì', 'Àbámɛ́ta'], + 'months' => ['Oshù Shɛ́rɛ́', 'Oshù Èrèlè', 'Oshù Ɛrɛ̀nà', 'Oshù Ìgbé', 'Oshù Ɛ̀bibi', 'Oshù Òkúdu', 'Oshù Agɛmɔ', 'Oshù Ògún', 'Oshù Owewe', 'Oshù Ɔ̀wàrà', 'Oshù Bélú', 'Oshù Ɔ̀pɛ̀'], + 'months_short' => ['Shɛ́rɛ́', 'Èrèlè', 'Ɛrɛ̀nà', 'Ìgbé', 'Ɛ̀bibi', 'Òkúdu', 'Agɛmɔ', 'Ògún', 'Owewe', 'Ɔ̀wàrà', 'Bélú', 'Ɔ̀pɛ̀'], + 'first_day_of_week' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd, D MMMM YYYY HH:mm', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yo_NG.php b/vendor/nesbot/carbon/src/Carbon/Lang/yo_NG.php new file mode 100644 index 0000000..6860bc1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/yo_NG.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/yo.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yue.php b/vendor/nesbot/carbon/src/Carbon/Lang/yue.php new file mode 100644 index 0000000..ce233a4 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/yue.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/yue_HK.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yue_HK.php b/vendor/nesbot/carbon/src/Carbon/Lang/yue_HK.php new file mode 100644 index 0000000..4e7d5c3 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/yue_HK.php @@ -0,0 +1,28 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/zh_HK.php', [ + 'formats' => [ + 'L' => 'YYYY年MM月DD日 dddd', + ], + 'months' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], + 'months_short' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], + 'weekdays' => ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], + 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], + 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], + 'first_day_of_week' => 0, + 'day_of_first_week_of_year' => 1, + 'meridiem' => ['上午', '下午'], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hans.php b/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hans.php new file mode 100644 index 0000000..db913ca --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hans.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/zh_Hans.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hant.php b/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hant.php new file mode 100644 index 0000000..e2526f1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hant.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/zh_Hant.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yuw.php b/vendor/nesbot/carbon/src/Carbon/Lang/yuw.php new file mode 100644 index 0000000..8efdc93 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/yuw.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/yuw_PG.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/yuw_PG.php b/vendor/nesbot/carbon/src/Carbon/Lang/yuw_PG.php new file mode 100644 index 0000000..b99ad2e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/yuw_PG.php @@ -0,0 +1,26 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Information from native speakers Hannah Sarvasy nungon.localization@gmail.com + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YY', + ], + 'months' => ['jenuari', 'febuari', 'mas', 'epril', 'mei', 'jun', 'julai', 'ögus', 'septemba', 'öktoba', 'nöwemba', 'diksemba'], + 'months_short' => ['jen', 'feb', 'mas', 'epr', 'mei', 'jun', 'jul', 'ögu', 'sep', 'ökt', 'nöw', 'dis'], + 'weekdays' => ['sönda', 'mönda', 'sinda', 'mitiwö', 'sogipbono', 'nenggo', 'söndanggie'], + 'weekdays_short' => ['sön', 'mön', 'sin', 'mit', 'soi', 'nen', 'sab'], + 'weekdays_min' => ['sön', 'mön', 'sin', 'mit', 'soi', 'nen', 'sab'], + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zgh.php b/vendor/nesbot/carbon/src/Carbon/Lang/zgh.php new file mode 100644 index 0000000..4d2c3b3 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zgh.php @@ -0,0 +1,80 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - BAKTETE Miloud + */ +return [ + 'year' => ':count ⵓⵙⴳⴳⵯⴰⵙ|:count ⵉⵙⴳⴳⵓⵙⴰ', + 'a_year' => 'ⵓⵙⴳⴳⵯⴰⵙ|:count ⵉⵙⴳⴳⵓⵙⴰ', + 'y' => ':count ⵓⵙⴳⴳⵯⴰⵙ|:count ⵉⵙⴳⴳⵓⵙⴰ', + 'month' => ':count ⵡⴰⵢⵢⵓⵔ|:count ⴰⵢⵢⵓⵔⵏ', + 'a_month' => 'ⵉⴷⵊ ⵡⴰⵢⵢⵓⵔ|:count ⴰⵢⵢⵓⵔⵏ', + 'm' => ':count ⴰⵢⵢⵓⵔⵏ', + 'week' => ':count ⵉⵎⴰⵍⴰⵙⵙ|:count ⵉⵎⴰⵍⴰⵙⵙⵏ', + 'a_week' => 'ⵉⵛⵜ ⵉⵎⴰⵍⴰⵙⵙ|:count ⵉⵎⴰⵍⴰⵙⵙⵏ', + 'w' => ':count ⵉⵎⴰⵍⴰⵙⵙ.', + 'day' => ':count ⵡⴰⵙⵙ|:count ⵓⵙⵙⴰⵏ', + 'a_day' => 'ⵉⴷⵊ ⵡⴰⵙⵙ|:count ⵓⵙⵙⴰⵏ', + 'd' => ':count ⵓ', + 'hour' => ':count ⵜⵙⵔⴰⴳⵜ|:count ⵜⵉⵙⵔⴰⴳⵉⵏ', + 'a_hour' => 'ⵉⵛⵜ ⵜⵙⵔⴰⴳⵜ|:count ⵜⵉⵙⵔⴰⴳⵉⵏ', + 'h' => ':count ⵜ', + 'minute' => ':count ⵜⵓⵙⴷⵉⴷⵜ|:count ⵜⵓⵙⴷⵉⴷⵉⵏ', + 'a_minute' => 'ⵉⵛⵜ ⵜⵓⵙⴷⵉⴷⵜ|:count ⵜⵓⵙⴷⵉⴷⵉⵏ', + 'min' => ':count ⵜⵓⵙ', + 'second' => ':count ⵜⵙⵉⵏⵜ|:count ⵜⵉⵙⵉⵏⴰ', + 'a_second' => 'ⴽⵔⴰ ⵜⵉⵙⵉⵏⴰ|:count ⵜⵉⵙⵉⵏⴰ', + 's' => ':count ⵜ', + 'ago' => 'ⵣⴳ :time', + 'from_now' => 'ⴷⴳ :time', + 'after' => ':time ⴰⵡⴰⵔ', + 'before' => ':time ⴷⴰⵜ', + 'diff_now' => 'ⴰⴷⵡⴰⵍⵉ', + 'diff_today' => 'ⴰⵙⵙ', + 'diff_today_regexp' => 'ⴰⵙⵙ(?:\\s+ⴰ/ⴰⴷ)?(?:\\s+ⴳ)?', + 'diff_yesterday' => 'ⴰⵙⵙⵏⵏⴰⵟ', + 'diff_yesterday_regexp' => 'ⴰⵙⵙⵏⵏⴰⵟ(?:\\s+ⴳ)?', + 'diff_tomorrow' => 'ⴰⵙⴽⴽⴰ', + 'diff_tomorrow_regexp' => 'ⴰⵙⴽⴽⴰ(?:\\s+ⴳ)?', + 'diff_before_yesterday' => 'ⴼⵔ ⵉⴹⵏⵏⴰⵟ', + 'diff_after_tomorrow' => 'ⵏⴰⴼ ⵓⵙⴽⴽⴰ', + 'period_recurrences' => ':count ⵜⵉⴽⴽⴰⵍ', + 'period_interval' => 'ⴽⵓ :interval', + 'period_start_date' => 'ⴳ :date', + 'period_end_date' => 'ⵉ :date', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'DD/MM/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[ⴰⵙⵙ ⴰ/ⴰⴷ ⴳ] LT', + 'nextDay' => '[ⴰⵙⴽⴽⴰ ⴳ] LT', + 'nextWeek' => 'dddd [ⴳ] LT', + 'lastDay' => '[ⴰⵙⵙⵏⵏⴰⵟ ⴳ] LT', + 'lastWeek' => 'dddd [ⴰⵎⴳⴳⴰⵔⵓ ⴳ] LT', + 'sameElse' => 'L', + ], + 'meridiem' => ['ⵜⵉⴼⴰⵡⵜ', 'ⵜⴰⴷⴳⴳⵯⴰⵜ'], + 'months' => ['ⵉⵏⵏⴰⵢⵔ', 'ⴱⵕⴰⵢⵕ', 'ⵎⴰⵕⵚ', 'ⵉⴱⵔⵉⵔ', 'ⵎⴰⵢⵢⵓ', 'ⵢⵓⵏⵢⵓ', 'ⵢⵓⵍⵢⵓⵣ', 'ⵖⵓⵛⵜ', 'ⵛⵓⵜⴰⵏⴱⵉⵔ', 'ⴽⵟⵓⴱⵕ', 'ⵏⵓⵡⴰⵏⴱⵉⵔ', 'ⴷⵓⵊⴰⵏⴱⵉⵔ'], + 'months_short' => ['ⵉⵏⵏ', 'ⴱⵕⴰ', 'ⵎⴰⵕ', 'ⵉⴱⵔ', 'ⵎⴰⵢ', 'ⵢⵓⵏ', 'ⵢⵓⵍ', 'ⵖⵓⵛ', 'ⵛⵓⵜ', 'ⴽⵟⵓ', 'ⵏⵓⵡ', 'ⴷⵓⵊ'], + 'weekdays' => ['ⵓⵙⴰⵎⴰⵙ', 'ⵡⴰⵢⵏⴰⵙ', 'ⵓⵙⵉⵏⴰⵙ', 'ⵡⴰⴽⵕⴰⵙ', 'ⵓⴽⵡⴰⵙ', 'ⵓⵙⵉⵎⵡⴰⵙ', 'ⵓⵙⵉⴹⵢⴰⵙ'], + 'weekdays_short' => ['ⵓⵙⴰ', 'ⵡⴰⵢ', 'ⵓⵙⵉ', 'ⵡⴰⴽ', 'ⵓⴽⵡ', 'ⵓⵙⵉⵎ', 'ⵓⵙⵉⴹ'], + 'weekdays_min' => ['ⵓⵙⴰ', 'ⵡⴰⵢ', 'ⵓⵙⵉ', 'ⵡⴰⴽ', 'ⵓⴽⵡ', 'ⵓⵙⵉⵎ', 'ⵓⵙⵉⴹ'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 1, + 'list' => [', ', ' ⴷ '], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh.php new file mode 100644 index 0000000..1187c3d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zh.php @@ -0,0 +1,29 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - xuri + * - sycuato + * - bokideckonja + * - Luo Ning + * - William Yang (williamyang233) + */ +return array_merge(require __DIR__.'/zh_Hans.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY/MM/DD', + 'LL' => 'YYYY年M月D日', + 'LLL' => 'YYYY年M月D日 A h点mm分', + 'LLLL' => 'YYYY年M月D日dddd A h点mm分', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_CN.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_CN.php new file mode 100644 index 0000000..9c05d5a --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zh_CN.php @@ -0,0 +1,33 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - monkeycon + * - François B + * - Jason Katz-Brown + * - Serhan Apaydın + * - Matt Johnson + * - JD Isaacks + * - Zeno Zeng + * - Chris Hemp + * - shankesgk2 + */ +return array_merge(require __DIR__.'/zh.php', [ + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY/MM/DD', + 'LL' => 'YYYY年M月D日', + 'LLL' => 'YYYY年M月D日Ah点mm分', + 'LLLL' => 'YYYY年M月D日ddddAh点mm分', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_HK.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_HK.php new file mode 100644 index 0000000..c3ee9fc --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zh_HK.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/zh_Hant_HK.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans.php new file mode 100644 index 0000000..9b91785 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans.php @@ -0,0 +1,109 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - monkeycon + * - François B + * - Jason Katz-Brown + * - Konstantin Konev + * - Chris Lam + * - Serhan Apaydın + * - Gary Lo + * - JD Isaacks + * - Chris Hemp + * - shankesgk2 + * - Daniel Cheung (danvim) + */ +return [ + 'year' => ':count:optional-space年', + 'y' => ':count:optional-space年', + 'month' => ':count:optional-space个月', + 'm' => ':count:optional-space个月', + 'week' => ':count:optional-space周', + 'w' => ':count:optional-space周', + 'day' => ':count:optional-space天', + 'd' => ':count:optional-space天', + 'hour' => ':count:optional-space小时', + 'h' => ':count:optional-space小时', + 'minute' => ':count:optional-space分钟', + 'min' => ':count:optional-space分钟', + 'second' => ':count:optional-space秒', + 'a_second' => '{1}几秒|]1,Inf[:count:optional-space秒', + 's' => ':count:optional-space秒', + 'ago' => ':time前', + 'from_now' => ':time后', + 'after' => ':time后', + 'before' => ':time前', + 'diff_now' => '现在', + 'diff_today' => '今天', + 'diff_yesterday' => '昨天', + 'diff_tomorrow' => '明天', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY/MM/DD', + 'LL' => 'YYYY年M月D日', + 'LLL' => 'YYYY年M月D日 HH:mm', + 'LLLL' => 'YYYY年M月D日dddd HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[今天]LT', + 'nextDay' => '[明天]LT', + 'nextWeek' => '[下]ddddLT', + 'lastDay' => '[昨天]LT', + 'lastWeek' => '[上]ddddLT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number, $period) { + switch ($period) { + case 'd': + case 'D': + case 'DDD': + return $number.'日'; + case 'M': + return $number.'月'; + case 'w': + case 'W': + return $number.'周'; + default: + return $number; + } + }, + 'meridiem' => function ($hour, $minute) { + $time = $hour * 100 + $minute; + if ($time < 600) { + return '凌晨'; + } + if ($time < 900) { + return '早上'; + } + if ($time < 1130) { + return '上午'; + } + if ($time < 1230) { + return '中午'; + } + if ($time < 1800) { + return '下午'; + } + + return '晚上'; + }, + 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], + 'months_short' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], + 'weekdays' => ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], + 'weekdays_short' => ['周日', '周一', '周二', '周三', '周四', '周五', '周六'], + 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => '', +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php new file mode 100644 index 0000000..db913ca --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/zh_Hans.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php new file mode 100644 index 0000000..db913ca --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/zh_Hans.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php new file mode 100644 index 0000000..db913ca --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/zh_Hans.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant.php new file mode 100644 index 0000000..a27b610 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant.php @@ -0,0 +1,111 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Adam + * - monkeycon + * - François B + * - Jason Katz-Brown + * - Chris Lam + * - Serhan Apaydın + * - Gary Lo + * - JD Isaacks + * - Chris Hemp + * - Eddie + * - KID + * - shankesgk2 + * - Daniel Cheung (danvim) + */ +return [ + 'year' => ':count:optional-space年', + 'y' => ':count:optional-space年', + 'month' => ':count:optional-space個月', + 'm' => ':count:optional-space月', + 'week' => ':count:optional-space週', + 'w' => ':count:optional-space週', + 'day' => ':count:optional-space天', + 'd' => ':count:optional-space天', + 'hour' => ':count:optional-space小時', + 'h' => ':count:optional-space小時', + 'minute' => ':count:optional-space分鐘', + 'min' => ':count:optional-space分鐘', + 'second' => ':count:optional-space秒', + 'a_second' => '{1}幾秒|]1,Inf[:count:optional-space秒', + 's' => ':count:optional-space秒', + 'ago' => ':time前', + 'from_now' => ':time後', + 'after' => ':time後', + 'before' => ':time前', + 'diff_now' => '現在', + 'diff_today' => '今天', + 'diff_yesterday' => '昨天', + 'diff_tomorrow' => '明天', + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'YYYY/MM/DD', + 'LL' => 'YYYY年M月D日', + 'LLL' => 'YYYY年M月D日 HH:mm', + 'LLLL' => 'YYYY年M月D日dddd HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[今天] LT', + 'nextDay' => '[明天] LT', + 'nextWeek' => '[下]dddd LT', + 'lastDay' => '[昨天] LT', + 'lastWeek' => '[上]dddd LT', + 'sameElse' => 'L', + ], + 'ordinal' => function ($number, $period) { + switch ($period) { + case 'd': + case 'D': + case 'DDD': + return $number.'日'; + case 'M': + return $number.'月'; + case 'w': + case 'W': + return $number.'周'; + default: + return $number; + } + }, + 'meridiem' => function ($hour, $minute) { + $time = $hour * 100 + $minute; + if ($time < 600) { + return '凌晨'; + } + if ($time < 900) { + return '早上'; + } + if ($time < 1130) { + return '上午'; + } + if ($time < 1230) { + return '中午'; + } + if ($time < 1800) { + return '下午'; + } + + return '晚上'; + }, + 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], + 'months_short' => ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'], + 'weekdays' => ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], + 'weekdays_short' => ['週日', '週一', '週二', '週三', '週四', '週五', '週六'], + 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], + 'first_day_of_week' => 1, + 'day_of_first_week_of_year' => 4, + 'list' => '', +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php new file mode 100644 index 0000000..e2526f1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/zh_Hant.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php new file mode 100644 index 0000000..e2526f1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/zh_Hant.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php new file mode 100644 index 0000000..e2526f1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/zh_Hant.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_MO.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_MO.php new file mode 100644 index 0000000..1c86d47 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zh_MO.php @@ -0,0 +1,21 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - tarunvelli + * - Eddie + * - KID + * - shankesgk2 + */ +return array_replace_recursive(require __DIR__.'/zh_Hant.php', [ + 'after' => ':time后', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_SG.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_SG.php new file mode 100644 index 0000000..c451a56 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zh_SG.php @@ -0,0 +1,26 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/zh.php', [ + 'formats' => [ + 'L' => 'YYYY年MM月DD日', + ], + 'months' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], + 'months_short' => ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], + 'weekdays' => ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], + 'weekdays_short' => ['日', '一', '二', '三', '四', '五', '六'], + 'weekdays_min' => ['日', '一', '二', '三', '四', '五', '六'], + 'day_of_first_week_of_year' => 1, +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php new file mode 100644 index 0000000..c6789ed --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php @@ -0,0 +1,12 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return require __DIR__.'/zh_Hant_TW.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zh_YUE.php b/vendor/nesbot/carbon/src/Carbon/Lang/zh_YUE.php new file mode 100644 index 0000000..b0d9ba8 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zh_YUE.php @@ -0,0 +1,20 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - IBM Globalization Center of Competency, Yamato Software Laboratory bug-glibc-locales@gnu.org + */ +return array_replace_recursive(require __DIR__.'/zh.php', [ + 'formats' => [ + 'L' => 'YYYY-MM-DD', + ], +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zu.php b/vendor/nesbot/carbon/src/Carbon/Lang/zu.php new file mode 100644 index 0000000..9a6cce0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zu.php @@ -0,0 +1,15 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Unknown default region, use the first alphabetically. + */ +return require __DIR__.'/zu_ZA.php'; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/zu_ZA.php b/vendor/nesbot/carbon/src/Carbon/Lang/zu_ZA.php new file mode 100644 index 0000000..6bfb72f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/zu_ZA.php @@ -0,0 +1,54 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Zuza Software Foundation (Translate.org.za) Dwayne Bailey dwayne@translate.org.za + */ +return array_replace_recursive(require __DIR__.'/en.php', [ + 'formats' => [ + 'L' => 'DD/MM/YYYY', + ], + 'months' => ['Januwari', 'Februwari', 'Mashi', 'Ephreli', 'Meyi', 'Juni', 'Julayi', 'Agasti', 'Septhemba', 'Okthoba', 'Novemba', 'Disemba'], + 'months_short' => ['Jan', 'Feb', 'Mas', 'Eph', 'Mey', 'Jun', 'Jul', 'Aga', 'Sep', 'Okt', 'Nov', 'Dis'], + 'weekdays' => ['iSonto', 'uMsombuluko', 'uLwesibili', 'uLwesithathu', 'uLwesine', 'uLwesihlanu', 'uMgqibelo'], + 'weekdays_short' => ['Son', 'Mso', 'Bil', 'Tha', 'Sin', 'Hla', 'Mgq'], + 'weekdays_min' => ['Son', 'Mso', 'Bil', 'Tha', 'Sin', 'Hla', 'Mgq'], + 'day_of_first_week_of_year' => 1, + + 'year' => 'kweminyaka engu-:count', + 'y' => 'kweminyaka engu-:count', + 'a_year' => 'kweminyaka engu-:count', + + 'month' => 'izinyanga ezingu-:count', + 'm' => 'izinyanga ezingu-:count', + 'a_month' => 'izinyanga ezingu-:count', + + 'week' => 'lwamasonto angu-:count', + 'w' => 'lwamasonto angu-:count', + 'a_week' => 'lwamasonto angu-:count', + + 'day' => 'ezingaba ngu-:count', + 'd' => 'ezingaba ngu-:count', + 'a_day' => 'ezingaba ngu-:count', + + 'hour' => 'amahora angu-:count', + 'h' => 'amahora angu-:count', + 'a_hour' => 'amahora angu-:count', + + 'minute' => 'ngemizuzu engu-:count', + 'min' => 'ngemizuzu engu-:count', + 'a_minute' => 'ngemizuzu engu-:count', + + 'second' => 'imizuzwana engu-:count', + 's' => 'imizuzwana engu-:count', + 'a_second' => 'imizuzwana engu-:count', +]); diff --git a/vendor/nesbot/carbon/src/Carbon/Language.php b/vendor/nesbot/carbon/src/Carbon/Language.php new file mode 100644 index 0000000..1fb5baf --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Language.php @@ -0,0 +1,342 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon; + +use JsonSerializable; +use ReturnTypeWillChange; + +class Language implements JsonSerializable +{ + /** + * @var array + */ + protected static $languagesNames; + + /** + * @var array + */ + protected static $regionsNames; + + /** + * @var string + */ + protected $id; + + /** + * @var string + */ + protected $code; + + /** + * @var string|null + */ + protected $variant; + + /** + * @var string|null + */ + protected $region; + + /** + * @var array + */ + protected $names; + + /** + * @var string + */ + protected $isoName; + + /** + * @var string + */ + protected $nativeName; + + public function __construct(string $id) + { + $this->id = str_replace('-', '_', $id); + $parts = explode('_', $this->id); + $this->code = $parts[0]; + + if (isset($parts[1])) { + if (!preg_match('/^[A-Z]+$/', $parts[1])) { + $this->variant = $parts[1]; + $parts[1] = $parts[2] ?? null; + } + if ($parts[1]) { + $this->region = $parts[1]; + } + } + } + + /** + * Get the list of the known languages. + * + * @return array + */ + public static function all() + { + if (!static::$languagesNames) { + static::$languagesNames = require __DIR__.'/List/languages.php'; + } + + return static::$languagesNames; + } + + /** + * Get the list of the known regions. + * + * @return array + */ + public static function regions() + { + if (!static::$regionsNames) { + static::$regionsNames = require __DIR__.'/List/regions.php'; + } + + return static::$regionsNames; + } + + /** + * Get both isoName and nativeName as an array. + * + * @return array + */ + public function getNames(): array + { + if (!$this->names) { + $this->names = static::all()[$this->code] ?? [ + 'isoName' => $this->code, + 'nativeName' => $this->code, + ]; + } + + return $this->names; + } + + /** + * Returns the original locale ID. + * + * @return string + */ + public function getId(): string + { + return $this->id; + } + + /** + * Returns the code of the locale "en"/"fr". + * + * @return string + */ + public function getCode(): string + { + return $this->code; + } + + /** + * Returns the variant code such as cyrl/latn. + * + * @return string|null + */ + public function getVariant(): ?string + { + return $this->variant; + } + + /** + * Returns the variant such as Cyrillic/Latin. + * + * @return string|null + */ + public function getVariantName(): ?string + { + if ($this->variant === 'Latn') { + return 'Latin'; + } + + if ($this->variant === 'Cyrl') { + return 'Cyrillic'; + } + + return $this->variant; + } + + /** + * Returns the region part of the locale. + * + * @return string|null + */ + public function getRegion(): ?string + { + return $this->region; + } + + /** + * Returns the region name for the current language. + * + * @return string|null + */ + public function getRegionName(): ?string + { + return $this->region ? (static::regions()[$this->region] ?? $this->region) : null; + } + + /** + * Returns the long ISO language name. + * + * @return string + */ + public function getFullIsoName(): string + { + if (!$this->isoName) { + $this->isoName = $this->getNames()['isoName']; + } + + return $this->isoName; + } + + /** + * Set the ISO language name. + * + * @param string $isoName + */ + public function setIsoName(string $isoName): self + { + $this->isoName = $isoName; + + return $this; + } + + /** + * Return the full name of the language in this language. + * + * @return string + */ + public function getFullNativeName(): string + { + if (!$this->nativeName) { + $this->nativeName = $this->getNames()['nativeName']; + } + + return $this->nativeName; + } + + /** + * Set the name of the language in this language. + * + * @param string $nativeName + */ + public function setNativeName(string $nativeName): self + { + $this->nativeName = $nativeName; + + return $this; + } + + /** + * Returns the short ISO language name. + * + * @return string + */ + public function getIsoName(): string + { + $name = $this->getFullIsoName(); + + return trim(strstr($name, ',', true) ?: $name); + } + + /** + * Get the short name of the language in this language. + * + * @return string + */ + public function getNativeName(): string + { + $name = $this->getFullNativeName(); + + return trim(strstr($name, ',', true) ?: $name); + } + + /** + * Get a string with short ISO name, region in parentheses if applicable, variant in parentheses if applicable. + * + * @return string + */ + public function getIsoDescription() + { + $region = $this->getRegionName(); + $variant = $this->getVariantName(); + + return $this->getIsoName().($region ? ' ('.$region.')' : '').($variant ? ' ('.$variant.')' : ''); + } + + /** + * Get a string with short native name, region in parentheses if applicable, variant in parentheses if applicable. + * + * @return string + */ + public function getNativeDescription() + { + $region = $this->getRegionName(); + $variant = $this->getVariantName(); + + return $this->getNativeName().($region ? ' ('.$region.')' : '').($variant ? ' ('.$variant.')' : ''); + } + + /** + * Get a string with long ISO name, region in parentheses if applicable, variant in parentheses if applicable. + * + * @return string + */ + public function getFullIsoDescription() + { + $region = $this->getRegionName(); + $variant = $this->getVariantName(); + + return $this->getFullIsoName().($region ? ' ('.$region.')' : '').($variant ? ' ('.$variant.')' : ''); + } + + /** + * Get a string with long native name, region in parentheses if applicable, variant in parentheses if applicable. + * + * @return string + */ + public function getFullNativeDescription() + { + $region = $this->getRegionName(); + $variant = $this->getVariantName(); + + return $this->getFullNativeName().($region ? ' ('.$region.')' : '').($variant ? ' ('.$variant.')' : ''); + } + + /** + * Returns the original locale ID. + * + * @return string + */ + public function __toString() + { + return $this->getId(); + } + + /** + * Get a string with short ISO name, region in parentheses if applicable, variant in parentheses if applicable. + * + * @return string + */ + #[ReturnTypeWillChange] + public function jsonSerialize() + { + return $this->getIsoDescription(); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php b/vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php new file mode 100644 index 0000000..84e241e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php @@ -0,0 +1,127 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Laravel; + +use Carbon\Carbon; +use Carbon\CarbonImmutable; +use Carbon\CarbonInterval; +use Carbon\CarbonPeriod; +use Illuminate\Contracts\Events\Dispatcher as DispatcherContract; +use Illuminate\Events\Dispatcher; +use Illuminate\Events\EventDispatcher; +use Illuminate\Support\Carbon as IlluminateCarbon; +use Illuminate\Support\Facades\Date; +use Throwable; + +class ServiceProvider extends \Illuminate\Support\ServiceProvider +{ + /** @var callable|null */ + protected $appGetter = null; + + /** @var callable|null */ + protected $localeGetter = null; + + public function setAppGetter(?callable $appGetter): void + { + $this->appGetter = $appGetter; + } + + public function setLocaleGetter(?callable $localeGetter): void + { + $this->localeGetter = $localeGetter; + } + + public function boot() + { + $this->updateLocale(); + + if (!$this->app->bound('events')) { + return; + } + + $service = $this; + $events = $this->app['events']; + + if ($this->isEventDispatcher($events)) { + $events->listen(class_exists('Illuminate\Foundation\Events\LocaleUpdated') ? 'Illuminate\Foundation\Events\LocaleUpdated' : 'locale.changed', function () use ($service) { + $service->updateLocale(); + }); + } + } + + public function updateLocale() + { + $locale = $this->getLocale(); + + if ($locale === null) { + return; + } + + Carbon::setLocale($locale); + CarbonImmutable::setLocale($locale); + CarbonPeriod::setLocale($locale); + CarbonInterval::setLocale($locale); + + if (class_exists(IlluminateCarbon::class)) { + IlluminateCarbon::setLocale($locale); + } + + if (class_exists(Date::class)) { + try { + $root = Date::getFacadeRoot(); + $root->setLocale($locale); + } catch (Throwable $e) { + // Non Carbon class in use in Date facade + } + } + } + + public function register() + { + // Needed for Laravel < 5.3 compatibility + } + + protected function getLocale() + { + if ($this->localeGetter) { + return ($this->localeGetter)(); + } + + $app = $this->getApp(); + $app = $app && method_exists($app, 'getLocale') + ? $app + : $this->getGlobalApp('translator'); + + return $app ? $app->getLocale() : null; + } + + protected function getApp() + { + if ($this->appGetter) { + return ($this->appGetter)(); + } + + return $this->app ?? $this->getGlobalApp(); + } + + protected function getGlobalApp(...$args) + { + return \function_exists('app') ? \app(...$args) : null; + } + + protected function isEventDispatcher($instance) + { + return $instance instanceof EventDispatcher + || $instance instanceof Dispatcher + || $instance instanceof DispatcherContract; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/List/languages.php b/vendor/nesbot/carbon/src/Carbon/List/languages.php new file mode 100644 index 0000000..5b5d9a1 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/List/languages.php @@ -0,0 +1,1239 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +return [ + /* + * ISO 639-2 + */ + 'ab' => [ + 'isoName' => 'Abkhazian', + 'nativeName' => 'аҧсуа бызшәа, аҧсшәа', + ], + 'aa' => [ + 'isoName' => 'Afar', + 'nativeName' => 'Afaraf', + ], + 'af' => [ + 'isoName' => 'Afrikaans', + 'nativeName' => 'Afrikaans', + ], + 'ak' => [ + 'isoName' => 'Akan', + 'nativeName' => 'Akan', + ], + 'sq' => [ + 'isoName' => 'Albanian', + 'nativeName' => 'Shqip', + ], + 'am' => [ + 'isoName' => 'Amharic', + 'nativeName' => 'አማርኛ', + ], + 'ar' => [ + 'isoName' => 'Arabic', + 'nativeName' => 'العربية', + ], + 'an' => [ + 'isoName' => 'Aragonese', + 'nativeName' => 'aragonés', + ], + 'hy' => [ + 'isoName' => 'Armenian', + 'nativeName' => 'Հայերեն', + ], + 'as' => [ + 'isoName' => 'Assamese', + 'nativeName' => 'অসমীয়া', + ], + 'av' => [ + 'isoName' => 'Avaric', + 'nativeName' => 'авар мацӀ, магӀарул мацӀ', + ], + 'ae' => [ + 'isoName' => 'Avestan', + 'nativeName' => 'avesta', + ], + 'ay' => [ + 'isoName' => 'Aymara', + 'nativeName' => 'aymar aru', + ], + 'az' => [ + 'isoName' => 'Azerbaijani', + 'nativeName' => 'azərbaycan dili', + ], + 'bm' => [ + 'isoName' => 'Bambara', + 'nativeName' => 'bamanankan', + ], + 'ba' => [ + 'isoName' => 'Bashkir', + 'nativeName' => 'башҡорт теле', + ], + 'eu' => [ + 'isoName' => 'Basque', + 'nativeName' => 'euskara, euskera', + ], + 'be' => [ + 'isoName' => 'Belarusian', + 'nativeName' => 'беларуская мова', + ], + 'bn' => [ + 'isoName' => 'Bengali', + 'nativeName' => 'বাংলা', + ], + 'bh' => [ + 'isoName' => 'Bihari languages', + 'nativeName' => 'भोजपुरी', + ], + 'bi' => [ + 'isoName' => 'Bislama', + 'nativeName' => 'Bislama', + ], + 'bs' => [ + 'isoName' => 'Bosnian', + 'nativeName' => 'bosanski jezik', + ], + 'br' => [ + 'isoName' => 'Breton', + 'nativeName' => 'brezhoneg', + ], + 'bg' => [ + 'isoName' => 'Bulgarian', + 'nativeName' => 'български език', + ], + 'my' => [ + 'isoName' => 'Burmese', + 'nativeName' => 'ဗမာစာ', + ], + 'ca' => [ + 'isoName' => 'Catalan, Valencian', + 'nativeName' => 'català, valencià', + ], + 'ch' => [ + 'isoName' => 'Chamorro', + 'nativeName' => 'Chamoru', + ], + 'ce' => [ + 'isoName' => 'Chechen', + 'nativeName' => 'нохчийн мотт', + ], + 'ny' => [ + 'isoName' => 'Chichewa, Chewa, Nyanja', + 'nativeName' => 'chiCheŵa, chinyanja', + ], + 'zh' => [ + 'isoName' => 'Chinese', + 'nativeName' => '中文 (Zhōngwén), 汉语, 漢語', + ], + 'cv' => [ + 'isoName' => 'Chuvash', + 'nativeName' => 'чӑваш чӗлхи', + ], + 'kw' => [ + 'isoName' => 'Cornish', + 'nativeName' => 'Kernewek', + ], + 'co' => [ + 'isoName' => 'Corsican', + 'nativeName' => 'corsu, lingua corsa', + ], + 'cr' => [ + 'isoName' => 'Cree', + 'nativeName' => 'ᓀᐦᐃᔭᐍᐏᐣ', + ], + 'hr' => [ + 'isoName' => 'Croatian', + 'nativeName' => 'hrvatski jezik', + ], + 'cs' => [ + 'isoName' => 'Czech', + 'nativeName' => 'čeština, český jazyk', + ], + 'da' => [ + 'isoName' => 'Danish', + 'nativeName' => 'dansk', + ], + 'dv' => [ + 'isoName' => 'Divehi, Dhivehi, Maldivian', + 'nativeName' => 'ދިވެހި', + ], + 'nl' => [ + 'isoName' => 'Dutch, Flemish', + 'nativeName' => 'Nederlands, Vlaams', + ], + 'dz' => [ + 'isoName' => 'Dzongkha', + 'nativeName' => 'རྫོང་ཁ', + ], + 'en' => [ + 'isoName' => 'English', + 'nativeName' => 'English', + ], + 'eo' => [ + 'isoName' => 'Esperanto', + 'nativeName' => 'Esperanto', + ], + 'et' => [ + 'isoName' => 'Estonian', + 'nativeName' => 'eesti, eesti keel', + ], + 'ee' => [ + 'isoName' => 'Ewe', + 'nativeName' => 'Eʋegbe', + ], + 'fo' => [ + 'isoName' => 'Faroese', + 'nativeName' => 'føroyskt', + ], + 'fj' => [ + 'isoName' => 'Fijian', + 'nativeName' => 'vosa Vakaviti', + ], + 'fi' => [ + 'isoName' => 'Finnish', + 'nativeName' => 'suomi, suomen kieli', + ], + 'fr' => [ + 'isoName' => 'French', + 'nativeName' => 'français', + ], + 'ff' => [ + 'isoName' => 'Fulah', + 'nativeName' => 'Fulfulde, Pulaar, Pular', + ], + 'gl' => [ + 'isoName' => 'Galician', + 'nativeName' => 'Galego', + ], + 'ka' => [ + 'isoName' => 'Georgian', + 'nativeName' => 'ქართული', + ], + 'de' => [ + 'isoName' => 'German', + 'nativeName' => 'Deutsch', + ], + 'el' => [ + 'isoName' => 'Greek (modern)', + 'nativeName' => 'ελληνικά', + ], + 'gn' => [ + 'isoName' => 'Guaraní', + 'nativeName' => 'Avañe\'ẽ', + ], + 'gu' => [ + 'isoName' => 'Gujarati', + 'nativeName' => 'ગુજરાતી', + ], + 'ht' => [ + 'isoName' => 'Haitian, Haitian Creole', + 'nativeName' => 'Kreyòl ayisyen', + ], + 'ha' => [ + 'isoName' => 'Hausa', + 'nativeName' => '(Hausa) هَوُسَ', + ], + 'he' => [ + 'isoName' => 'Hebrew (modern)', + 'nativeName' => 'עברית', + ], + 'hz' => [ + 'isoName' => 'Herero', + 'nativeName' => 'Otjiherero', + ], + 'hi' => [ + 'isoName' => 'Hindi', + 'nativeName' => 'हिन्दी, हिंदी', + ], + 'ho' => [ + 'isoName' => 'Hiri Motu', + 'nativeName' => 'Hiri Motu', + ], + 'hu' => [ + 'isoName' => 'Hungarian', + 'nativeName' => 'magyar', + ], + 'ia' => [ + 'isoName' => 'Interlingua', + 'nativeName' => 'Interlingua', + ], + 'id' => [ + 'isoName' => 'Indonesian', + 'nativeName' => 'Bahasa Indonesia', + ], + 'ie' => [ + 'isoName' => 'Interlingue', + 'nativeName' => 'Originally called Occidental; then Interlingue after WWII', + ], + 'ga' => [ + 'isoName' => 'Irish', + 'nativeName' => 'Gaeilge', + ], + 'ig' => [ + 'isoName' => 'Igbo', + 'nativeName' => 'Asụsụ Igbo', + ], + 'ik' => [ + 'isoName' => 'Inupiaq', + 'nativeName' => 'Iñupiaq, Iñupiatun', + ], + 'io' => [ + 'isoName' => 'Ido', + 'nativeName' => 'Ido', + ], + 'is' => [ + 'isoName' => 'Icelandic', + 'nativeName' => 'Íslenska', + ], + 'it' => [ + 'isoName' => 'Italian', + 'nativeName' => 'Italiano', + ], + 'iu' => [ + 'isoName' => 'Inuktitut', + 'nativeName' => 'ᐃᓄᒃᑎᑐᑦ', + ], + 'ja' => [ + 'isoName' => 'Japanese', + 'nativeName' => '日本語 (にほんご)', + ], + 'jv' => [ + 'isoName' => 'Javanese', + 'nativeName' => 'ꦧꦱꦗꦮ, Basa Jawa', + ], + 'kl' => [ + 'isoName' => 'Kalaallisut, Greenlandic', + 'nativeName' => 'kalaallisut, kalaallit oqaasii', + ], + 'kn' => [ + 'isoName' => 'Kannada', + 'nativeName' => 'ಕನ್ನಡ', + ], + 'kr' => [ + 'isoName' => 'Kanuri', + 'nativeName' => 'Kanuri', + ], + 'ks' => [ + 'isoName' => 'Kashmiri', + 'nativeName' => 'कश्मीरी, كشميري‎', + ], + 'kk' => [ + 'isoName' => 'Kazakh', + 'nativeName' => 'қазақ тілі', + ], + 'km' => [ + 'isoName' => 'Central Khmer', + 'nativeName' => 'ខ្មែរ, ខេមរភាសា, ភាសាខ្មែរ', + ], + 'ki' => [ + 'isoName' => 'Kikuyu, Gikuyu', + 'nativeName' => 'Gĩkũyũ', + ], + 'rw' => [ + 'isoName' => 'Kinyarwanda', + 'nativeName' => 'Ikinyarwanda', + ], + 'ky' => [ + 'isoName' => 'Kirghiz, Kyrgyz', + 'nativeName' => 'Кыргызча, Кыргыз тили', + ], + 'kv' => [ + 'isoName' => 'Komi', + 'nativeName' => 'коми кыв', + ], + 'kg' => [ + 'isoName' => 'Kongo', + 'nativeName' => 'Kikongo', + ], + 'ko' => [ + 'isoName' => 'Korean', + 'nativeName' => '한국어', + ], + 'ku' => [ + 'isoName' => 'Kurdish', + 'nativeName' => 'Kurdî, کوردی‎', + ], + 'kj' => [ + 'isoName' => 'Kuanyama, Kwanyama', + 'nativeName' => 'Kuanyama', + ], + 'la' => [ + 'isoName' => 'Latin', + 'nativeName' => 'latine, lingua latina', + ], + 'lb' => [ + 'isoName' => 'Luxembourgish, Letzeburgesch', + 'nativeName' => 'Lëtzebuergesch', + ], + 'lg' => [ + 'isoName' => 'Ganda', + 'nativeName' => 'Luganda', + ], + 'li' => [ + 'isoName' => 'Limburgan, Limburger, Limburgish', + 'nativeName' => 'Limburgs', + ], + 'ln' => [ + 'isoName' => 'Lingala', + 'nativeName' => 'Lingála', + ], + 'lo' => [ + 'isoName' => 'Lao', + 'nativeName' => 'ພາສາລາວ', + ], + 'lt' => [ + 'isoName' => 'Lithuanian', + 'nativeName' => 'lietuvių kalba', + ], + 'lu' => [ + 'isoName' => 'Luba-Katanga', + 'nativeName' => 'Kiluba', + ], + 'lv' => [ + 'isoName' => 'Latvian', + 'nativeName' => 'latviešu valoda', + ], + 'gv' => [ + 'isoName' => 'Manx', + 'nativeName' => 'Gaelg, Gailck', + ], + 'mk' => [ + 'isoName' => 'Macedonian', + 'nativeName' => 'македонски јазик', + ], + 'mg' => [ + 'isoName' => 'Malagasy', + 'nativeName' => 'fiteny malagasy', + ], + 'ms' => [ + 'isoName' => 'Malay', + 'nativeName' => 'Bahasa Melayu, بهاس ملايو‎', + ], + 'ml' => [ + 'isoName' => 'Malayalam', + 'nativeName' => 'മലയാളം', + ], + 'mt' => [ + 'isoName' => 'Maltese', + 'nativeName' => 'Malti', + ], + 'mi' => [ + 'isoName' => 'Maori', + 'nativeName' => 'te reo Māori', + ], + 'mr' => [ + 'isoName' => 'Marathi', + 'nativeName' => 'मराठी', + ], + 'mh' => [ + 'isoName' => 'Marshallese', + 'nativeName' => 'Kajin M̧ajeļ', + ], + 'mn' => [ + 'isoName' => 'Mongolian', + 'nativeName' => 'Монгол хэл', + ], + 'na' => [ + 'isoName' => 'Nauru', + 'nativeName' => 'Dorerin Naoero', + ], + 'nv' => [ + 'isoName' => 'Navajo, Navaho', + 'nativeName' => 'Diné bizaad', + ], + 'nd' => [ + 'isoName' => 'North Ndebele', + 'nativeName' => 'isiNdebele', + ], + 'ne' => [ + 'isoName' => 'Nepali', + 'nativeName' => 'नेपाली', + ], + 'ng' => [ + 'isoName' => 'Ndonga', + 'nativeName' => 'Owambo', + ], + 'nb' => [ + 'isoName' => 'Norwegian Bokmål', + 'nativeName' => 'Norsk Bokmål', + ], + 'nn' => [ + 'isoName' => 'Norwegian Nynorsk', + 'nativeName' => 'Norsk Nynorsk', + ], + 'no' => [ + 'isoName' => 'Norwegian', + 'nativeName' => 'Norsk', + ], + 'ii' => [ + 'isoName' => 'Sichuan Yi, Nuosu', + 'nativeName' => 'ꆈꌠ꒿ Nuosuhxop', + ], + 'nr' => [ + 'isoName' => 'South Ndebele', + 'nativeName' => 'isiNdebele', + ], + 'oc' => [ + 'isoName' => 'Occitan', + 'nativeName' => 'occitan, lenga d\'òc', + ], + 'oj' => [ + 'isoName' => 'Ojibwa', + 'nativeName' => 'ᐊᓂᔑᓈᐯᒧᐎᓐ', + ], + 'cu' => [ + 'isoName' => 'Church Slavic, Church Slavonic, Old Church Slavonic, Old Slavonic, Old Bulgarian', + 'nativeName' => 'ѩзыкъ словѣньскъ', + ], + 'om' => [ + 'isoName' => 'Oromo', + 'nativeName' => 'Afaan Oromoo', + ], + 'or' => [ + 'isoName' => 'Oriya', + 'nativeName' => 'ଓଡ଼ିଆ', + ], + 'os' => [ + 'isoName' => 'Ossetian, Ossetic', + 'nativeName' => 'ирон æвзаг', + ], + 'pa' => [ + 'isoName' => 'Panjabi, Punjabi', + 'nativeName' => 'ਪੰਜਾਬੀ', + ], + 'pi' => [ + 'isoName' => 'Pali', + 'nativeName' => 'पाऴि', + ], + 'fa' => [ + 'isoName' => 'Persian', + 'nativeName' => 'فارسی', + ], + 'pl' => [ + 'isoName' => 'Polish', + 'nativeName' => 'język polski, polszczyzna', + ], + 'ps' => [ + 'isoName' => 'Pashto, Pushto', + 'nativeName' => 'پښتو', + ], + 'pt' => [ + 'isoName' => 'Portuguese', + 'nativeName' => 'Português', + ], + 'qu' => [ + 'isoName' => 'Quechua', + 'nativeName' => 'Runa Simi, Kichwa', + ], + 'rm' => [ + 'isoName' => 'Romansh', + 'nativeName' => 'Rumantsch Grischun', + ], + 'rn' => [ + 'isoName' => 'Rundi', + 'nativeName' => 'Ikirundi', + ], + 'ro' => [ + 'isoName' => 'Romanian, Moldavian, Moldovan', + 'nativeName' => 'Română', + ], + 'ru' => [ + 'isoName' => 'Russian', + 'nativeName' => 'русский', + ], + 'sa' => [ + 'isoName' => 'Sanskrit', + 'nativeName' => 'संस्कृतम्', + ], + 'sc' => [ + 'isoName' => 'Sardinian', + 'nativeName' => 'sardu', + ], + 'sd' => [ + 'isoName' => 'Sindhi', + 'nativeName' => 'सिन्धी, سنڌي، سندھی‎', + ], + 'se' => [ + 'isoName' => 'Northern Sami', + 'nativeName' => 'Davvisámegiella', + ], + 'sm' => [ + 'isoName' => 'Samoan', + 'nativeName' => 'gagana fa\'a Samoa', + ], + 'sg' => [ + 'isoName' => 'Sango', + 'nativeName' => 'yângâ tî sängö', + ], + 'sr' => [ + 'isoName' => 'Serbian', + 'nativeName' => 'српски језик', + ], + 'gd' => [ + 'isoName' => 'Gaelic, Scottish Gaelic', + 'nativeName' => 'Gàidhlig', + ], + 'sn' => [ + 'isoName' => 'Shona', + 'nativeName' => 'chiShona', + ], + 'si' => [ + 'isoName' => 'Sinhala, Sinhalese', + 'nativeName' => 'සිංහල', + ], + 'sk' => [ + 'isoName' => 'Slovak', + 'nativeName' => 'Slovenčina, Slovenský Jazyk', + ], + 'sl' => [ + 'isoName' => 'Slovene', + 'nativeName' => 'Slovenski Jezik, Slovenščina', + ], + 'so' => [ + 'isoName' => 'Somali', + 'nativeName' => 'Soomaaliga, af Soomaali', + ], + 'st' => [ + 'isoName' => 'Southern Sotho', + 'nativeName' => 'Sesotho', + ], + 'es' => [ + 'isoName' => 'Spanish, Castilian', + 'nativeName' => 'Español', + ], + 'su' => [ + 'isoName' => 'Sundanese', + 'nativeName' => 'Basa Sunda', + ], + 'sw' => [ + 'isoName' => 'Swahili', + 'nativeName' => 'Kiswahili', + ], + 'ss' => [ + 'isoName' => 'Swati', + 'nativeName' => 'SiSwati', + ], + 'sv' => [ + 'isoName' => 'Swedish', + 'nativeName' => 'Svenska', + ], + 'ta' => [ + 'isoName' => 'Tamil', + 'nativeName' => 'தமிழ்', + ], + 'te' => [ + 'isoName' => 'Telugu', + 'nativeName' => 'తెలుగు', + ], + 'tg' => [ + 'isoName' => 'Tajik', + 'nativeName' => 'тоҷикӣ, toçikī, تاجیکی‎', + ], + 'th' => [ + 'isoName' => 'Thai', + 'nativeName' => 'ไทย', + ], + 'ti' => [ + 'isoName' => 'Tigrinya', + 'nativeName' => 'ትግርኛ', + ], + 'bo' => [ + 'isoName' => 'Tibetan', + 'nativeName' => 'བོད་ཡིག', + ], + 'tk' => [ + 'isoName' => 'Turkmen', + 'nativeName' => 'Türkmen, Түркмен', + ], + 'tl' => [ + 'isoName' => 'Tagalog', + 'nativeName' => 'Wikang Tagalog', + ], + 'tn' => [ + 'isoName' => 'Tswana', + 'nativeName' => 'Setswana', + ], + 'to' => [ + 'isoName' => 'Tongan (Tonga Islands)', + 'nativeName' => 'Faka Tonga', + ], + 'tr' => [ + 'isoName' => 'Turkish', + 'nativeName' => 'Türkçe', + ], + 'ts' => [ + 'isoName' => 'Tsonga', + 'nativeName' => 'Xitsonga', + ], + 'tt' => [ + 'isoName' => 'Tatar', + 'nativeName' => 'татар теле, tatar tele', + ], + 'tw' => [ + 'isoName' => 'Twi', + 'nativeName' => 'Twi', + ], + 'ty' => [ + 'isoName' => 'Tahitian', + 'nativeName' => 'Reo Tahiti', + ], + 'ug' => [ + 'isoName' => 'Uighur, Uyghur', + 'nativeName' => 'Uyƣurqə, ‫ئۇيغۇرچ', + ], + 'uk' => [ + 'isoName' => 'Ukrainian', + 'nativeName' => 'Українська', + ], + 'ur' => [ + 'isoName' => 'Urdu', + 'nativeName' => 'اردو', + ], + 'uz' => [ + 'isoName' => 'Uzbek', + 'nativeName' => 'Oʻzbek, Ўзбек, أۇزبېك‎', + ], + 've' => [ + 'isoName' => 'Venda', + 'nativeName' => 'Tshivenḓa', + ], + 'vi' => [ + 'isoName' => 'Vietnamese', + 'nativeName' => 'Tiếng Việt', + ], + 'vo' => [ + 'isoName' => 'Volapük', + 'nativeName' => 'Volapük', + ], + 'wa' => [ + 'isoName' => 'Walloon', + 'nativeName' => 'Walon', + ], + 'cy' => [ + 'isoName' => 'Welsh', + 'nativeName' => 'Cymraeg', + ], + 'wo' => [ + 'isoName' => 'Wolof', + 'nativeName' => 'Wollof', + ], + 'fy' => [ + 'isoName' => 'Western Frisian', + 'nativeName' => 'Frysk', + ], + 'xh' => [ + 'isoName' => 'Xhosa', + 'nativeName' => 'isiXhosa', + ], + 'yi' => [ + 'isoName' => 'Yiddish', + 'nativeName' => 'ייִדיש', + ], + 'yo' => [ + 'isoName' => 'Yoruba', + 'nativeName' => 'Yorùbá', + ], + 'za' => [ + 'isoName' => 'Zhuang, Chuang', + 'nativeName' => 'Saɯ cueŋƅ, Saw cuengh', + ], + 'zu' => [ + 'isoName' => 'Zulu', + 'nativeName' => 'isiZulu', + ], + /* + * Add ISO 639-3 languages available in Carbon + */ + 'agq' => [ + 'isoName' => 'Aghem', + 'nativeName' => 'Aghem', + ], + 'agr' => [ + 'isoName' => 'Aguaruna', + 'nativeName' => 'Aguaruna', + ], + 'anp' => [ + 'isoName' => 'Angika', + 'nativeName' => 'Angika', + ], + 'asa' => [ + 'isoName' => 'Asu', + 'nativeName' => 'Asu', + ], + 'ast' => [ + 'isoName' => 'Asturian', + 'nativeName' => 'Asturian', + ], + 'ayc' => [ + 'isoName' => 'Southern Aymara', + 'nativeName' => 'Southern Aymara', + ], + 'bas' => [ + 'isoName' => 'Basaa', + 'nativeName' => 'Basaa', + ], + 'bem' => [ + 'isoName' => 'Bemba', + 'nativeName' => 'Bemba', + ], + 'bez' => [ + 'isoName' => 'Bena', + 'nativeName' => 'Bena', + ], + 'bhb' => [ + 'isoName' => 'Bhili', + 'nativeName' => 'Bhili', + ], + 'bho' => [ + 'isoName' => 'Bhojpuri', + 'nativeName' => 'Bhojpuri', + ], + 'brx' => [ + 'isoName' => 'Bodo', + 'nativeName' => 'Bodo', + ], + 'byn' => [ + 'isoName' => 'Bilin', + 'nativeName' => 'Bilin', + ], + 'ccp' => [ + 'isoName' => 'Chakma', + 'nativeName' => 'Chakma', + ], + 'cgg' => [ + 'isoName' => 'Chiga', + 'nativeName' => 'Chiga', + ], + 'chr' => [ + 'isoName' => 'Cherokee', + 'nativeName' => 'Cherokee', + ], + 'cmn' => [ + 'isoName' => 'Chinese', + 'nativeName' => 'Chinese', + ], + 'crh' => [ + 'isoName' => 'Crimean Turkish', + 'nativeName' => 'Crimean Turkish', + ], + 'csb' => [ + 'isoName' => 'Kashubian', + 'nativeName' => 'Kashubian', + ], + 'dav' => [ + 'isoName' => 'Taita', + 'nativeName' => 'Taita', + ], + 'dje' => [ + 'isoName' => 'Zarma', + 'nativeName' => 'Zarma', + ], + 'doi' => [ + 'isoName' => 'Dogri (macrolanguage)', + 'nativeName' => 'Dogri (macrolanguage)', + ], + 'dsb' => [ + 'isoName' => 'Lower Sorbian', + 'nativeName' => 'Lower Sorbian', + ], + 'dua' => [ + 'isoName' => 'Duala', + 'nativeName' => 'Duala', + ], + 'dyo' => [ + 'isoName' => 'Jola-Fonyi', + 'nativeName' => 'Jola-Fonyi', + ], + 'ebu' => [ + 'isoName' => 'Embu', + 'nativeName' => 'Embu', + ], + 'ewo' => [ + 'isoName' => 'Ewondo', + 'nativeName' => 'Ewondo', + ], + 'fil' => [ + 'isoName' => 'Filipino', + 'nativeName' => 'Filipino', + ], + 'fur' => [ + 'isoName' => 'Friulian', + 'nativeName' => 'Friulian', + ], + 'gez' => [ + 'isoName' => 'Geez', + 'nativeName' => 'Geez', + ], + 'gom' => [ + 'isoName' => 'Konkani, Goan', + 'nativeName' => 'ಕೊಂಕಣಿ', + ], + 'gsw' => [ + 'isoName' => 'Swiss German', + 'nativeName' => 'Swiss German', + ], + 'guz' => [ + 'isoName' => 'Gusii', + 'nativeName' => 'Gusii', + ], + 'hak' => [ + 'isoName' => 'Hakka Chinese', + 'nativeName' => 'Hakka Chinese', + ], + 'haw' => [ + 'isoName' => 'Hawaiian', + 'nativeName' => 'Hawaiian', + ], + 'hif' => [ + 'isoName' => 'Fiji Hindi', + 'nativeName' => 'Fiji Hindi', + ], + 'hne' => [ + 'isoName' => 'Chhattisgarhi', + 'nativeName' => 'Chhattisgarhi', + ], + 'hsb' => [ + 'isoName' => 'Upper Sorbian', + 'nativeName' => 'Upper Sorbian', + ], + 'jgo' => [ + 'isoName' => 'Ngomba', + 'nativeName' => 'Ngomba', + ], + 'jmc' => [ + 'isoName' => 'Machame', + 'nativeName' => 'Machame', + ], + 'kab' => [ + 'isoName' => 'Kabyle', + 'nativeName' => 'Kabyle', + ], + 'kam' => [ + 'isoName' => 'Kamba', + 'nativeName' => 'Kamba', + ], + 'kde' => [ + 'isoName' => 'Makonde', + 'nativeName' => 'Makonde', + ], + 'kea' => [ + 'isoName' => 'Kabuverdianu', + 'nativeName' => 'Kabuverdianu', + ], + 'khq' => [ + 'isoName' => 'Koyra Chiini', + 'nativeName' => 'Koyra Chiini', + ], + 'kkj' => [ + 'isoName' => 'Kako', + 'nativeName' => 'Kako', + ], + 'kln' => [ + 'isoName' => 'Kalenjin', + 'nativeName' => 'Kalenjin', + ], + 'kok' => [ + 'isoName' => 'Konkani', + 'nativeName' => 'Konkani', + ], + 'ksb' => [ + 'isoName' => 'Shambala', + 'nativeName' => 'Shambala', + ], + 'ksf' => [ + 'isoName' => 'Bafia', + 'nativeName' => 'Bafia', + ], + 'ksh' => [ + 'isoName' => 'Colognian', + 'nativeName' => 'Colognian', + ], + 'lag' => [ + 'isoName' => 'Langi', + 'nativeName' => 'Langi', + ], + 'lij' => [ + 'isoName' => 'Ligurian', + 'nativeName' => 'Ligurian', + ], + 'lkt' => [ + 'isoName' => 'Lakota', + 'nativeName' => 'Lakota', + ], + 'lrc' => [ + 'isoName' => 'Northern Luri', + 'nativeName' => 'Northern Luri', + ], + 'luo' => [ + 'isoName' => 'Luo', + 'nativeName' => 'Luo', + ], + 'luy' => [ + 'isoName' => 'Luyia', + 'nativeName' => 'Luyia', + ], + 'lzh' => [ + 'isoName' => 'Literary Chinese', + 'nativeName' => 'Literary Chinese', + ], + 'mag' => [ + 'isoName' => 'Magahi', + 'nativeName' => 'Magahi', + ], + 'mai' => [ + 'isoName' => 'Maithili', + 'nativeName' => 'Maithili', + ], + 'mas' => [ + 'isoName' => 'Masai', + 'nativeName' => 'Masai', + ], + 'mer' => [ + 'isoName' => 'Meru', + 'nativeName' => 'Meru', + ], + 'mfe' => [ + 'isoName' => 'Morisyen', + 'nativeName' => 'Morisyen', + ], + 'mgh' => [ + 'isoName' => 'Makhuwa-Meetto', + 'nativeName' => 'Makhuwa-Meetto', + ], + 'mgo' => [ + 'isoName' => 'Metaʼ', + 'nativeName' => 'Metaʼ', + ], + 'mhr' => [ + 'isoName' => 'Eastern Mari', + 'nativeName' => 'Eastern Mari', + ], + 'miq' => [ + 'isoName' => 'Mískito', + 'nativeName' => 'Mískito', + ], + 'mjw' => [ + 'isoName' => 'Karbi', + 'nativeName' => 'Karbi', + ], + 'mni' => [ + 'isoName' => 'Manipuri', + 'nativeName' => 'Manipuri', + ], + 'mua' => [ + 'isoName' => 'Mundang', + 'nativeName' => 'Mundang', + ], + 'mzn' => [ + 'isoName' => 'Mazanderani', + 'nativeName' => 'Mazanderani', + ], + 'nan' => [ + 'isoName' => 'Min Nan Chinese', + 'nativeName' => 'Min Nan Chinese', + ], + 'naq' => [ + 'isoName' => 'Nama', + 'nativeName' => 'Nama', + ], + 'nds' => [ + 'isoName' => 'Low German', + 'nativeName' => 'Low German', + ], + 'nhn' => [ + 'isoName' => 'Central Nahuatl', + 'nativeName' => 'Central Nahuatl', + ], + 'niu' => [ + 'isoName' => 'Niuean', + 'nativeName' => 'Niuean', + ], + 'nmg' => [ + 'isoName' => 'Kwasio', + 'nativeName' => 'Kwasio', + ], + 'nnh' => [ + 'isoName' => 'Ngiemboon', + 'nativeName' => 'Ngiemboon', + ], + 'nso' => [ + 'isoName' => 'Northern Sotho', + 'nativeName' => 'Northern Sotho', + ], + 'nus' => [ + 'isoName' => 'Nuer', + 'nativeName' => 'Nuer', + ], + 'nyn' => [ + 'isoName' => 'Nyankole', + 'nativeName' => 'Nyankole', + ], + 'pap' => [ + 'isoName' => 'Papiamento', + 'nativeName' => 'Papiamento', + ], + 'prg' => [ + 'isoName' => 'Prussian', + 'nativeName' => 'Prussian', + ], + 'quz' => [ + 'isoName' => 'Cusco Quechua', + 'nativeName' => 'Cusco Quechua', + ], + 'raj' => [ + 'isoName' => 'Rajasthani', + 'nativeName' => 'Rajasthani', + ], + 'rof' => [ + 'isoName' => 'Rombo', + 'nativeName' => 'Rombo', + ], + 'rwk' => [ + 'isoName' => 'Rwa', + 'nativeName' => 'Rwa', + ], + 'sah' => [ + 'isoName' => 'Sakha', + 'nativeName' => 'Sakha', + ], + 'saq' => [ + 'isoName' => 'Samburu', + 'nativeName' => 'Samburu', + ], + 'sat' => [ + 'isoName' => 'Santali', + 'nativeName' => 'Santali', + ], + 'sbp' => [ + 'isoName' => 'Sangu', + 'nativeName' => 'Sangu', + ], + 'scr' => [ + 'isoName' => 'Serbo Croatian', + 'nativeName' => 'Serbo Croatian', + ], + 'seh' => [ + 'isoName' => 'Sena', + 'nativeName' => 'Sena', + ], + 'ses' => [ + 'isoName' => 'Koyraboro Senni', + 'nativeName' => 'Koyraboro Senni', + ], + 'sgs' => [ + 'isoName' => 'Samogitian', + 'nativeName' => 'Samogitian', + ], + 'shi' => [ + 'isoName' => 'Tachelhit', + 'nativeName' => 'Tachelhit', + ], + 'shn' => [ + 'isoName' => 'Shan', + 'nativeName' => 'Shan', + ], + 'shs' => [ + 'isoName' => 'Shuswap', + 'nativeName' => 'Shuswap', + ], + 'sid' => [ + 'isoName' => 'Sidamo', + 'nativeName' => 'Sidamo', + ], + 'smn' => [ + 'isoName' => 'Inari Sami', + 'nativeName' => 'Inari Sami', + ], + 'szl' => [ + 'isoName' => 'Silesian', + 'nativeName' => 'Silesian', + ], + 'tcy' => [ + 'isoName' => 'Tulu', + 'nativeName' => 'Tulu', + ], + 'teo' => [ + 'isoName' => 'Teso', + 'nativeName' => 'Teso', + ], + 'tet' => [ + 'isoName' => 'Tetum', + 'nativeName' => 'Tetum', + ], + 'the' => [ + 'isoName' => 'Chitwania Tharu', + 'nativeName' => 'Chitwania Tharu', + ], + 'tig' => [ + 'isoName' => 'Tigre', + 'nativeName' => 'Tigre', + ], + 'tlh' => [ + 'isoName' => 'Klingon', + 'nativeName' => 'tlhIngan Hol', + ], + 'tpi' => [ + 'isoName' => 'Tok Pisin', + 'nativeName' => 'Tok Pisin', + ], + 'twq' => [ + 'isoName' => 'Tasawaq', + 'nativeName' => 'Tasawaq', + ], + 'tzl' => [ + 'isoName' => 'Talossan', + 'nativeName' => 'Talossan', + ], + 'tzm' => [ + 'isoName' => 'Tamazight, Central Atlas', + 'nativeName' => 'ⵜⵎⴰⵣⵉⵖⵜ', + ], + 'unm' => [ + 'isoName' => 'Unami', + 'nativeName' => 'Unami', + ], + 'vai' => [ + 'isoName' => 'Vai', + 'nativeName' => 'Vai', + ], + 'vun' => [ + 'isoName' => 'Vunjo', + 'nativeName' => 'Vunjo', + ], + 'wae' => [ + 'isoName' => 'Walser', + 'nativeName' => 'Walser', + ], + 'wal' => [ + 'isoName' => 'Wolaytta', + 'nativeName' => 'Wolaytta', + ], + 'xog' => [ + 'isoName' => 'Soga', + 'nativeName' => 'Soga', + ], + 'yav' => [ + 'isoName' => 'Yangben', + 'nativeName' => 'Yangben', + ], + 'yue' => [ + 'isoName' => 'Cantonese', + 'nativeName' => 'Cantonese', + ], + 'yuw' => [ + 'isoName' => 'Yau (Morobe Province)', + 'nativeName' => 'Yau (Morobe Province)', + ], + 'zgh' => [ + 'isoName' => 'Standard Moroccan Tamazight', + 'nativeName' => 'Standard Moroccan Tamazight', + ], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/List/regions.php b/vendor/nesbot/carbon/src/Carbon/List/regions.php new file mode 100644 index 0000000..8ab8a9e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/List/regions.php @@ -0,0 +1,265 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * ISO 3166-2 + */ +return [ + 'AD' => 'Andorra', + 'AE' => 'United Arab Emirates', + 'AF' => 'Afghanistan', + 'AG' => 'Antigua and Barbuda', + 'AI' => 'Anguilla', + 'AL' => 'Albania', + 'AM' => 'Armenia', + 'AO' => 'Angola', + 'AQ' => 'Antarctica', + 'AR' => 'Argentina', + 'AS' => 'American Samoa', + 'AT' => 'Austria', + 'AU' => 'Australia', + 'AW' => 'Aruba', + 'AX' => 'Åland Islands', + 'AZ' => 'Azerbaijan', + 'BA' => 'Bosnia and Herzegovina', + 'BB' => 'Barbados', + 'BD' => 'Bangladesh', + 'BE' => 'Belgium', + 'BF' => 'Burkina Faso', + 'BG' => 'Bulgaria', + 'BH' => 'Bahrain', + 'BI' => 'Burundi', + 'BJ' => 'Benin', + 'BL' => 'Saint Barthélemy', + 'BM' => 'Bermuda', + 'BN' => 'Brunei Darussalam', + 'BO' => 'Bolivia (Plurinational State of)', + 'BQ' => 'Bonaire, Sint Eustatius and Saba', + 'BR' => 'Brazil', + 'BS' => 'Bahamas', + 'BT' => 'Bhutan', + 'BV' => 'Bouvet Island', + 'BW' => 'Botswana', + 'BY' => 'Belarus', + 'BZ' => 'Belize', + 'CA' => 'Canada', + 'CC' => 'Cocos (Keeling) Islands', + 'CD' => 'Congo, Democratic Republic of the', + 'CF' => 'Central African Republic', + 'CG' => 'Congo', + 'CH' => 'Switzerland', + 'CI' => 'Côte d\'Ivoire', + 'CK' => 'Cook Islands', + 'CL' => 'Chile', + 'CM' => 'Cameroon', + 'CN' => 'China', + 'CO' => 'Colombia', + 'CR' => 'Costa Rica', + 'CU' => 'Cuba', + 'CV' => 'Cabo Verde', + 'CW' => 'Curaçao', + 'CX' => 'Christmas Island', + 'CY' => 'Cyprus', + 'CZ' => 'Czechia', + 'DE' => 'Germany', + 'DJ' => 'Djibouti', + 'DK' => 'Denmark', + 'DM' => 'Dominica', + 'DO' => 'Dominican Republic', + 'DZ' => 'Algeria', + 'EC' => 'Ecuador', + 'EE' => 'Estonia', + 'EG' => 'Egypt', + 'EH' => 'Western Sahara', + 'ER' => 'Eritrea', + 'ES' => 'Spain', + 'ET' => 'Ethiopia', + 'FI' => 'Finland', + 'FJ' => 'Fiji', + 'FK' => 'Falkland Islands (Malvinas)', + 'FM' => 'Micronesia (Federated States of)', + 'FO' => 'Faroe Islands', + 'FR' => 'France', + 'GA' => 'Gabon', + 'GB' => 'United Kingdom of Great Britain and Northern Ireland', + 'GD' => 'Grenada', + 'GE' => 'Georgia', + 'GF' => 'French Guiana', + 'GG' => 'Guernsey', + 'GH' => 'Ghana', + 'GI' => 'Gibraltar', + 'GL' => 'Greenland', + 'GM' => 'Gambia', + 'GN' => 'Guinea', + 'GP' => 'Guadeloupe', + 'GQ' => 'Equatorial Guinea', + 'GR' => 'Greece', + 'GS' => 'South Georgia and the South Sandwich Islands', + 'GT' => 'Guatemala', + 'GU' => 'Guam', + 'GW' => 'Guinea-Bissau', + 'GY' => 'Guyana', + 'HK' => 'Hong Kong', + 'HM' => 'Heard Island and McDonald Islands', + 'HN' => 'Honduras', + 'HR' => 'Croatia', + 'HT' => 'Haiti', + 'HU' => 'Hungary', + 'ID' => 'Indonesia', + 'IE' => 'Ireland', + 'IL' => 'Israel', + 'IM' => 'Isle of Man', + 'IN' => 'India', + 'IO' => 'British Indian Ocean Territory', + 'IQ' => 'Iraq', + 'IR' => 'Iran (Islamic Republic of)', + 'IS' => 'Iceland', + 'IT' => 'Italy', + 'JE' => 'Jersey', + 'JM' => 'Jamaica', + 'JO' => 'Jordan', + 'JP' => 'Japan', + 'KE' => 'Kenya', + 'KG' => 'Kyrgyzstan', + 'KH' => 'Cambodia', + 'KI' => 'Kiribati', + 'KM' => 'Comoros', + 'KN' => 'Saint Kitts and Nevis', + 'KP' => 'Korea (Democratic People\'s Republic of)', + 'KR' => 'Korea, Republic of', + 'KW' => 'Kuwait', + 'KY' => 'Cayman Islands', + 'KZ' => 'Kazakhstan', + 'LA' => 'Lao People\'s Democratic Republic', + 'LB' => 'Lebanon', + 'LC' => 'Saint Lucia', + 'LI' => 'Liechtenstein', + 'LK' => 'Sri Lanka', + 'LR' => 'Liberia', + 'LS' => 'Lesotho', + 'LT' => 'Lithuania', + 'LU' => 'Luxembourg', + 'LV' => 'Latvia', + 'LY' => 'Libya', + 'MA' => 'Morocco', + 'MC' => 'Monaco', + 'MD' => 'Moldova, Republic of', + 'ME' => 'Montenegro', + 'MF' => 'Saint Martin (French part)', + 'MG' => 'Madagascar', + 'MH' => 'Marshall Islands', + 'MK' => 'Macedonia, the former Yugoslav Republic of', + 'ML' => 'Mali', + 'MM' => 'Myanmar', + 'MN' => 'Mongolia', + 'MO' => 'Macao', + 'MP' => 'Northern Mariana Islands', + 'MQ' => 'Martinique', + 'MR' => 'Mauritania', + 'MS' => 'Montserrat', + 'MT' => 'Malta', + 'MU' => 'Mauritius', + 'MV' => 'Maldives', + 'MW' => 'Malawi', + 'MX' => 'Mexico', + 'MY' => 'Malaysia', + 'MZ' => 'Mozambique', + 'NA' => 'Namibia', + 'NC' => 'New Caledonia', + 'NE' => 'Niger', + 'NF' => 'Norfolk Island', + 'NG' => 'Nigeria', + 'NI' => 'Nicaragua', + 'NL' => 'Netherlands', + 'NO' => 'Norway', + 'NP' => 'Nepal', + 'NR' => 'Nauru', + 'NU' => 'Niue', + 'NZ' => 'New Zealand', + 'OM' => 'Oman', + 'PA' => 'Panama', + 'PE' => 'Peru', + 'PF' => 'French Polynesia', + 'PG' => 'Papua New Guinea', + 'PH' => 'Philippines', + 'PK' => 'Pakistan', + 'PL' => 'Poland', + 'PM' => 'Saint Pierre and Miquelon', + 'PN' => 'Pitcairn', + 'PR' => 'Puerto Rico', + 'PS' => 'Palestine, State of', + 'PT' => 'Portugal', + 'PW' => 'Palau', + 'PY' => 'Paraguay', + 'QA' => 'Qatar', + 'RE' => 'Réunion', + 'RO' => 'Romania', + 'RS' => 'Serbia', + 'RU' => 'Russian Federation', + 'RW' => 'Rwanda', + 'SA' => 'Saudi Arabia', + 'SB' => 'Solomon Islands', + 'SC' => 'Seychelles', + 'SD' => 'Sudan', + 'SE' => 'Sweden', + 'SG' => 'Singapore', + 'SH' => 'Saint Helena, Ascension and Tristan da Cunha', + 'SI' => 'Slovenia', + 'SJ' => 'Svalbard and Jan Mayen', + 'SK' => 'Slovakia', + 'SL' => 'Sierra Leone', + 'SM' => 'San Marino', + 'SN' => 'Senegal', + 'SO' => 'Somalia', + 'SR' => 'Suriname', + 'SS' => 'South Sudan', + 'ST' => 'Sao Tome and Principe', + 'SV' => 'El Salvador', + 'SX' => 'Sint Maarten (Dutch part)', + 'SY' => 'Syrian Arab Republic', + 'SZ' => 'Eswatini', + 'TC' => 'Turks and Caicos Islands', + 'TD' => 'Chad', + 'TF' => 'French Southern Territories', + 'TG' => 'Togo', + 'TH' => 'Thailand', + 'TJ' => 'Tajikistan', + 'TK' => 'Tokelau', + 'TL' => 'Timor-Leste', + 'TM' => 'Turkmenistan', + 'TN' => 'Tunisia', + 'TO' => 'Tonga', + 'TR' => 'Turkey', + 'TT' => 'Trinidad and Tobago', + 'TV' => 'Tuvalu', + 'TW' => 'Taiwan, Province of China', + 'TZ' => 'Tanzania, United Republic of', + 'UA' => 'Ukraine', + 'UG' => 'Uganda', + 'UM' => 'United States Minor Outlying Islands', + 'US' => 'United States of America', + 'UY' => 'Uruguay', + 'UZ' => 'Uzbekistan', + 'VA' => 'Holy See', + 'VC' => 'Saint Vincent and the Grenadines', + 'VE' => 'Venezuela (Bolivarian Republic of)', + 'VG' => 'Virgin Islands (British)', + 'VI' => 'Virgin Islands (U.S.)', + 'VN' => 'Viet Nam', + 'VU' => 'Vanuatu', + 'WF' => 'Wallis and Futuna', + 'WS' => 'Samoa', + 'YE' => 'Yemen', + 'YT' => 'Mayotte', + 'ZA' => 'South Africa', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe', +]; diff --git a/vendor/nesbot/carbon/src/Carbon/PHPStan/AbstractMacro.php b/vendor/nesbot/carbon/src/Carbon/PHPStan/AbstractMacro.php new file mode 100644 index 0000000..5123d1e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/PHPStan/AbstractMacro.php @@ -0,0 +1,288 @@ +<?php + +declare(strict_types=1); + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\PHPStan; + +use Closure; +use InvalidArgumentException; +use PHPStan\BetterReflection\Reflection\Adapter\ReflectionParameter as AdapterReflectionParameter; +use PHPStan\BetterReflection\Reflection\Adapter\ReflectionType as AdapterReflectionType; +use PHPStan\BetterReflection\Reflection\ReflectionClass as BetterReflectionClass; +use PHPStan\BetterReflection\Reflection\ReflectionFunction as BetterReflectionFunction; +use PHPStan\BetterReflection\Reflection\ReflectionParameter as BetterReflectionParameter; +use PHPStan\Reflection\Php\BuiltinMethodReflection; +use PHPStan\TrinaryLogic; +use ReflectionClass; +use ReflectionFunction; +use ReflectionMethod; +use ReflectionParameter; +use ReflectionType; +use stdClass; +use Throwable; + +abstract class AbstractMacro implements BuiltinMethodReflection +{ + /** + * The reflection function/method. + * + * @var ReflectionFunction|ReflectionMethod + */ + protected $reflectionFunction; + + /** + * The class name. + * + * @var class-string + */ + private $className; + + /** + * The method name. + * + * @var string + */ + private $methodName; + + /** + * The parameters. + * + * @var ReflectionParameter[] + */ + private $parameters; + + /** + * The is static. + * + * @var bool + */ + private $static = false; + + /** + * Macro constructor. + * + * @param string $className + * @phpstan-param class-string $className + * + * @param string $methodName + * @param callable $macro + */ + public function __construct(string $className, string $methodName, $macro) + { + $this->className = $className; + $this->methodName = $methodName; + $rawReflectionFunction = \is_array($macro) + ? new ReflectionMethod($macro[0], $macro[1]) + : new ReflectionFunction($macro); + $this->reflectionFunction = self::hasModernParser() + ? $this->getReflectionFunction($macro) + : $rawReflectionFunction; // @codeCoverageIgnore + $this->parameters = array_map( + function ($parameter) { + if ($parameter instanceof BetterReflectionParameter) { + return new AdapterReflectionParameter($parameter); + } + + return $parameter; // @codeCoverageIgnore + }, + $this->reflectionFunction->getParameters() + ); + + if ($rawReflectionFunction->isClosure()) { + try { + $closure = $rawReflectionFunction->getClosure(); + $boundClosure = Closure::bind($closure, new stdClass()); + $this->static = (!$boundClosure || (new ReflectionFunction($boundClosure))->getClosureThis() === null); + } catch (Throwable $e) { + $this->static = true; + } + } + } + + private function getReflectionFunction($spec) + { + if (\is_array($spec) && \count($spec) === 2 && \is_string($spec[1])) { + \assert($spec[1] !== ''); + + if (\is_object($spec[0])) { + return BetterReflectionClass::createFromInstance($spec[0]) + ->getMethod($spec[1]); + } + + return BetterReflectionClass::createFromName($spec[0]) + ->getMethod($spec[1]); + } + + if (\is_string($spec)) { + return BetterReflectionFunction::createFromName($spec); + } + + if ($spec instanceof Closure) { + return BetterReflectionFunction::createFromClosure($spec); + } + + throw new InvalidArgumentException('Could not create reflection from the spec given'); // @codeCoverageIgnore + } + + /** + * {@inheritdoc} + */ + public function getDeclaringClass(): ReflectionClass + { + return new ReflectionClass($this->className); + } + + /** + * {@inheritdoc} + */ + public function isPrivate(): bool + { + return false; + } + + /** + * {@inheritdoc} + */ + public function isPublic(): bool + { + return true; + } + + /** + * {@inheritdoc} + */ + public function isFinal(): bool + { + return false; + } + + /** + * {@inheritdoc} + */ + public function isInternal(): bool + { + return false; + } + + /** + * {@inheritdoc} + */ + public function isAbstract(): bool + { + return false; + } + + /** + * {@inheritdoc} + */ + public function isStatic(): bool + { + return $this->static; + } + + /** + * {@inheritdoc} + */ + public function getDocComment(): ?string + { + return $this->reflectionFunction->getDocComment() ?: null; + } + + /** + * {@inheritdoc} + */ + public function getName(): string + { + return $this->methodName; + } + + /** + * {@inheritdoc} + */ + public function getParameters(): array + { + return $this->parameters; + } + + /** + * {@inheritdoc} + */ + public function getReturnType(): ?ReflectionType + { + $type = $this->reflectionFunction->getReturnType(); + + if ($type instanceof ReflectionType) { + return $type; // @codeCoverageIgnore + } + + return self::adaptType($type); + } + + /** + * {@inheritdoc} + */ + public function isDeprecated(): TrinaryLogic + { + return TrinaryLogic::createFromBoolean( + $this->reflectionFunction->isDeprecated() || + preg_match('/@deprecated/i', $this->getDocComment() ?: '') + ); + } + + /** + * {@inheritdoc} + */ + public function isVariadic(): bool + { + return $this->reflectionFunction->isVariadic(); + } + + /** + * {@inheritdoc} + */ + public function getPrototype(): BuiltinMethodReflection + { + return $this; + } + + public function getTentativeReturnType(): ?ReflectionType + { + return null; + } + + public function returnsByReference(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + + private static function adaptType($type) + { + $method = method_exists(AdapterReflectionType::class, 'fromTypeOrNull') + ? 'fromTypeOrNull' + : 'fromReturnTypeOrNull'; // @codeCoverageIgnore + + return AdapterReflectionType::$method($type); + } + + private static function hasModernParser(): bool + { + static $modernParser = null; + + if ($modernParser !== null) { + return $modernParser; + } + + $modernParser = method_exists(AdapterReflectionType::class, 'fromTypeOrNull'); + + return $modernParser; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/PHPStan/Macro.php b/vendor/nesbot/carbon/src/Carbon/PHPStan/Macro.php new file mode 100644 index 0000000..de3e51f --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/PHPStan/Macro.php @@ -0,0 +1,34 @@ +<?php + +declare(strict_types=1); + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\PHPStan; + +use PHPStan\BetterReflection\Reflection\Adapter; +use PHPStan\Reflection\Php\BuiltinMethodReflection; +use ReflectionMethod; + +$method = new ReflectionMethod(BuiltinMethodReflection::class, 'getReflection'); + +require $method->hasReturnType() && $method->getReturnType()->getName() === Adapter\ReflectionMethod::class + ? __DIR__.'/../../../lazy/Carbon/PHPStan/AbstractMacroStatic.php' + : __DIR__.'/../../../lazy/Carbon/PHPStan/AbstractMacroBuiltin.php'; + +$method = new ReflectionMethod(BuiltinMethodReflection::class, 'getFileName'); + +require $method->hasReturnType() + ? __DIR__.'/../../../lazy/Carbon/PHPStan/MacroStrongType.php' + : __DIR__.'/../../../lazy/Carbon/PHPStan/MacroWeakType.php'; + +final class Macro extends LazyMacro +{ +} diff --git a/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php b/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php new file mode 100644 index 0000000..2cd6fce --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php @@ -0,0 +1,88 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\PHPStan; + +use PHPStan\Reflection\Assertions; +use PHPStan\Reflection\ClassReflection; +use PHPStan\Reflection\MethodReflection; +use PHPStan\Reflection\MethodsClassReflectionExtension; +use PHPStan\Reflection\Php\PhpMethodReflectionFactory; +use PHPStan\Reflection\ReflectionProvider; +use PHPStan\Type\TypehintHelper; + +/** + * Class MacroExtension. + * + * @codeCoverageIgnore Pure PHPStan wrapper. + */ +final class MacroExtension implements MethodsClassReflectionExtension +{ + /** + * @var PhpMethodReflectionFactory + */ + protected $methodReflectionFactory; + + /** + * @var MacroScanner + */ + protected $scanner; + + /** + * Extension constructor. + * + * @param PhpMethodReflectionFactory $methodReflectionFactory + * @param ReflectionProvider $reflectionProvider + */ + public function __construct( + PhpMethodReflectionFactory $methodReflectionFactory, + ReflectionProvider $reflectionProvider + ) { + $this->scanner = new MacroScanner($reflectionProvider); + $this->methodReflectionFactory = $methodReflectionFactory; + } + + /** + * {@inheritdoc} + */ + public function hasMethod(ClassReflection $classReflection, string $methodName): bool + { + return $this->scanner->hasMethod($classReflection->getName(), $methodName); + } + + /** + * {@inheritdoc} + */ + public function getMethod(ClassReflection $classReflection, string $methodName): MethodReflection + { + $builtinMacro = $this->scanner->getMethod($classReflection->getName(), $methodName); + $supportAssertions = class_exists(Assertions::class); + + return $this->methodReflectionFactory->create( + $classReflection, + null, + $builtinMacro, + $classReflection->getActiveTemplateTypeMap(), + [], + TypehintHelper::decideTypeFromReflection($builtinMacro->getReturnType()), + null, + null, + $builtinMacro->isDeprecated()->yes(), + $builtinMacro->isInternal(), + $builtinMacro->isFinal(), + $supportAssertions ? null : $builtinMacro->getDocComment(), + $supportAssertions ? Assertions::createEmpty() : null, + null, + $builtinMacro->getDocComment(), + [] + ); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroScanner.php b/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroScanner.php new file mode 100644 index 0000000..c88e49e --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroScanner.php @@ -0,0 +1,87 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\PHPStan; + +use Carbon\CarbonInterface; +use PHPStan\Reflection\ReflectionProvider; +use ReflectionClass; +use ReflectionException; + +final class MacroScanner +{ + /** + * @var \PHPStan\Reflection\ReflectionProvider + */ + private $reflectionProvider; + + /** + * MacroScanner constructor. + * + * @param \PHPStan\Reflection\ReflectionProvider $reflectionProvider + */ + public function __construct(ReflectionProvider $reflectionProvider) + { + $this->reflectionProvider = $reflectionProvider; + } + + /** + * Return true if the given pair class-method is a Carbon macro. + * + * @param string $className + * @phpstan-param class-string $className + * + * @param string $methodName + * + * @return bool + */ + public function hasMethod(string $className, string $methodName): bool + { + $classReflection = $this->reflectionProvider->getClass($className); + + if ( + $classReflection->getName() !== CarbonInterface::class && + !$classReflection->isSubclassOf(CarbonInterface::class) + ) { + return false; + } + + return \is_callable([$className, 'hasMacro']) && + $className::hasMacro($methodName); + } + + /** + * Return the Macro for a given pair class-method. + * + * @param string $className + * @phpstan-param class-string $className + * + * @param string $methodName + * + * @throws ReflectionException + * + * @return Macro + */ + public function getMethod(string $className, string $methodName): Macro + { + $reflectionClass = new ReflectionClass($className); + $property = $reflectionClass->getProperty('globalMacros'); + + $property->setAccessible(true); + $macro = $property->getValue()[$methodName]; + + return new Macro( + $className, + $methodName, + $macro + ); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Boundaries.php b/vendor/nesbot/carbon/src/Carbon/Traits/Boundaries.php new file mode 100644 index 0000000..71bbb72 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Boundaries.php @@ -0,0 +1,443 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use Carbon\Exceptions\UnknownUnitException; + +/** + * Trait Boundaries. + * + * startOf, endOf and derived method for each unit. + * + * Depends on the following properties: + * + * @property int $year + * @property int $month + * @property int $daysInMonth + * @property int $quarter + * + * Depends on the following methods: + * + * @method $this setTime(int $hour, int $minute, int $second = 0, int $microseconds = 0) + * @method $this setDate(int $year, int $month, int $day) + * @method $this addMonths(int $value = 1) + */ +trait Boundaries +{ + /** + * Resets the time to 00:00:00 start of day + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfDay(); + * ``` + * + * @return static + */ + public function startOfDay() + { + return $this->setTime(0, 0, 0, 0); + } + + /** + * Resets the time to 23:59:59.999999 end of day + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfDay(); + * ``` + * + * @return static + */ + public function endOfDay() + { + return $this->setTime(static::HOURS_PER_DAY - 1, static::MINUTES_PER_HOUR - 1, static::SECONDS_PER_MINUTE - 1, static::MICROSECONDS_PER_SECOND - 1); + } + + /** + * Resets the date to the first day of the month and the time to 00:00:00 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfMonth(); + * ``` + * + * @return static + */ + public function startOfMonth() + { + return $this->setDate($this->year, $this->month, 1)->startOfDay(); + } + + /** + * Resets the date to end of the month and time to 23:59:59.999999 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfMonth(); + * ``` + * + * @return static + */ + public function endOfMonth() + { + return $this->setDate($this->year, $this->month, $this->daysInMonth)->endOfDay(); + } + + /** + * Resets the date to the first day of the quarter and the time to 00:00:00 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfQuarter(); + * ``` + * + * @return static + */ + public function startOfQuarter() + { + $month = ($this->quarter - 1) * static::MONTHS_PER_QUARTER + 1; + + return $this->setDate($this->year, $month, 1)->startOfDay(); + } + + /** + * Resets the date to end of the quarter and time to 23:59:59.999999 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfQuarter(); + * ``` + * + * @return static + */ + public function endOfQuarter() + { + return $this->startOfQuarter()->addMonths(static::MONTHS_PER_QUARTER - 1)->endOfMonth(); + } + + /** + * Resets the date to the first day of the year and the time to 00:00:00 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfYear(); + * ``` + * + * @return static + */ + public function startOfYear() + { + return $this->setDate($this->year, 1, 1)->startOfDay(); + } + + /** + * Resets the date to end of the year and time to 23:59:59.999999 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfYear(); + * ``` + * + * @return static + */ + public function endOfYear() + { + return $this->setDate($this->year, 12, 31)->endOfDay(); + } + + /** + * Resets the date to the first day of the decade and the time to 00:00:00 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfDecade(); + * ``` + * + * @return static + */ + public function startOfDecade() + { + $year = $this->year - $this->year % static::YEARS_PER_DECADE; + + return $this->setDate($year, 1, 1)->startOfDay(); + } + + /** + * Resets the date to end of the decade and time to 23:59:59.999999 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfDecade(); + * ``` + * + * @return static + */ + public function endOfDecade() + { + $year = $this->year - $this->year % static::YEARS_PER_DECADE + static::YEARS_PER_DECADE - 1; + + return $this->setDate($year, 12, 31)->endOfDay(); + } + + /** + * Resets the date to the first day of the century and the time to 00:00:00 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfCentury(); + * ``` + * + * @return static + */ + public function startOfCentury() + { + $year = $this->year - ($this->year - 1) % static::YEARS_PER_CENTURY; + + return $this->setDate($year, 1, 1)->startOfDay(); + } + + /** + * Resets the date to end of the century and time to 23:59:59.999999 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfCentury(); + * ``` + * + * @return static + */ + public function endOfCentury() + { + $year = $this->year - 1 - ($this->year - 1) % static::YEARS_PER_CENTURY + static::YEARS_PER_CENTURY; + + return $this->setDate($year, 12, 31)->endOfDay(); + } + + /** + * Resets the date to the first day of the millennium and the time to 00:00:00 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfMillennium(); + * ``` + * + * @return static + */ + public function startOfMillennium() + { + $year = $this->year - ($this->year - 1) % static::YEARS_PER_MILLENNIUM; + + return $this->setDate($year, 1, 1)->startOfDay(); + } + + /** + * Resets the date to end of the millennium and time to 23:59:59.999999 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfMillennium(); + * ``` + * + * @return static + */ + public function endOfMillennium() + { + $year = $this->year - 1 - ($this->year - 1) % static::YEARS_PER_MILLENNIUM + static::YEARS_PER_MILLENNIUM; + + return $this->setDate($year, 12, 31)->endOfDay(); + } + + /** + * Resets the date to the first day of week (defined in $weekStartsAt) and the time to 00:00:00 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfWeek() . "\n"; + * echo Carbon::parse('2018-07-25 12:45:16')->locale('ar')->startOfWeek() . "\n"; + * echo Carbon::parse('2018-07-25 12:45:16')->startOfWeek(Carbon::SUNDAY) . "\n"; + * ``` + * + * @param int $weekStartsAt optional start allow you to specify the day of week to use to start the week + * + * @return static + */ + public function startOfWeek($weekStartsAt = null) + { + return $this->subDays((7 + $this->dayOfWeek - ($weekStartsAt ?? $this->firstWeekDay)) % 7)->startOfDay(); + } + + /** + * Resets the date to end of week (defined in $weekEndsAt) and time to 23:59:59.999999 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfWeek() . "\n"; + * echo Carbon::parse('2018-07-25 12:45:16')->locale('ar')->endOfWeek() . "\n"; + * echo Carbon::parse('2018-07-25 12:45:16')->endOfWeek(Carbon::SATURDAY) . "\n"; + * ``` + * + * @param int $weekEndsAt optional start allow you to specify the day of week to use to end the week + * + * @return static + */ + public function endOfWeek($weekEndsAt = null) + { + return $this->addDays((7 - $this->dayOfWeek + ($weekEndsAt ?? $this->lastWeekDay)) % 7)->endOfDay(); + } + + /** + * Modify to start of current hour, minutes and seconds become 0 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfHour(); + * ``` + * + * @return static + */ + public function startOfHour() + { + return $this->setTime($this->hour, 0, 0, 0); + } + + /** + * Modify to end of current hour, minutes and seconds become 59 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfHour(); + * ``` + * + * @return static + */ + public function endOfHour() + { + return $this->setTime($this->hour, static::MINUTES_PER_HOUR - 1, static::SECONDS_PER_MINUTE - 1, static::MICROSECONDS_PER_SECOND - 1); + } + + /** + * Modify to start of current minute, seconds become 0 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->startOfMinute(); + * ``` + * + * @return static + */ + public function startOfMinute() + { + return $this->setTime($this->hour, $this->minute, 0, 0); + } + + /** + * Modify to end of current minute, seconds become 59 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16')->endOfMinute(); + * ``` + * + * @return static + */ + public function endOfMinute() + { + return $this->setTime($this->hour, $this->minute, static::SECONDS_PER_MINUTE - 1, static::MICROSECONDS_PER_SECOND - 1); + } + + /** + * Modify to start of current second, microseconds become 0 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16.334455') + * ->startOfSecond() + * ->format('H:i:s.u'); + * ``` + * + * @return static + */ + public function startOfSecond() + { + return $this->setTime($this->hour, $this->minute, $this->second, 0); + } + + /** + * Modify to end of current second, microseconds become 999999 + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16.334455') + * ->endOfSecond() + * ->format('H:i:s.u'); + * ``` + * + * @return static + */ + public function endOfSecond() + { + return $this->setTime($this->hour, $this->minute, $this->second, static::MICROSECONDS_PER_SECOND - 1); + } + + /** + * Modify to start of current given unit. + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16.334455') + * ->startOf('month') + * ->endOf('week', Carbon::FRIDAY); + * ``` + * + * @param string $unit + * @param array<int, mixed> $params + * + * @return static + */ + public function startOf($unit, ...$params) + { + $ucfUnit = ucfirst(static::singularUnit($unit)); + $method = "startOf$ucfUnit"; + if (!method_exists($this, $method)) { + throw new UnknownUnitException($unit); + } + + return $this->$method(...$params); + } + + /** + * Modify to end of current given unit. + * + * @example + * ``` + * echo Carbon::parse('2018-07-25 12:45:16.334455') + * ->startOf('month') + * ->endOf('week', Carbon::FRIDAY); + * ``` + * + * @param string $unit + * @param array<int, mixed> $params + * + * @return static + */ + public function endOf($unit, ...$params) + { + $ucfUnit = ucfirst(static::singularUnit($unit)); + $method = "endOf$ucfUnit"; + if (!method_exists($this, $method)) { + throw new UnknownUnitException($unit); + } + + return $this->$method(...$params); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Cast.php b/vendor/nesbot/carbon/src/Carbon/Traits/Cast.php new file mode 100644 index 0000000..5f7c7c0 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Cast.php @@ -0,0 +1,43 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use Carbon\Exceptions\InvalidCastException; +use DateTimeInterface; + +/** + * Trait Cast. + * + * Utils to cast into an other class. + */ +trait Cast +{ + /** + * Cast the current instance into the given class. + * + * @param string $className The $className::instance() method will be called to cast the current object. + * + * @return DateTimeInterface + */ + public function cast(string $className) + { + if (!method_exists($className, 'instance')) { + if (is_a($className, DateTimeInterface::class, true)) { + return new $className($this->rawFormat('Y-m-d H:i:s.u'), $this->getTimezone()); + } + + throw new InvalidCastException("$className has not the instance() method needed to cast the date."); + } + + return $className::instance($this); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php b/vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php new file mode 100644 index 0000000..d4c2d8c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php @@ -0,0 +1,1099 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use BadMethodCallException; +use Carbon\CarbonInterface; +use Carbon\Exceptions\BadComparisonUnitException; +use InvalidArgumentException; + +/** + * Trait Comparison. + * + * Comparison utils and testers. All the following methods return booleans. + * nowWithSameTz + * + * Depends on the following methods: + * + * @method static resolveCarbon($date) + * @method static copy() + * @method static nowWithSameTz() + * @method static static yesterday($timezone = null) + * @method static static tomorrow($timezone = null) + */ +trait Comparison +{ + /** @var bool */ + protected $endOfTime = false; + + /** @var bool */ + protected $startOfTime = false; + + /** + * Determines if the instance is equal to another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->eq('2018-07-25 12:45:16'); // true + * Carbon::parse('2018-07-25 12:45:16')->eq(Carbon::parse('2018-07-25 12:45:16')); // true + * Carbon::parse('2018-07-25 12:45:16')->eq('2018-07-25 12:45:17'); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see equalTo() + * + * @return bool + */ + public function eq($date): bool + { + return $this->equalTo($date); + } + + /** + * Determines if the instance is equal to another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->equalTo('2018-07-25 12:45:16'); // true + * Carbon::parse('2018-07-25 12:45:16')->equalTo(Carbon::parse('2018-07-25 12:45:16')); // true + * Carbon::parse('2018-07-25 12:45:16')->equalTo('2018-07-25 12:45:17'); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @return bool + */ + public function equalTo($date): bool + { + $this->discourageNull($date); + $this->discourageBoolean($date); + + return $this == $this->resolveCarbon($date); + } + + /** + * Determines if the instance is not equal to another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->ne('2018-07-25 12:45:16'); // false + * Carbon::parse('2018-07-25 12:45:16')->ne(Carbon::parse('2018-07-25 12:45:16')); // false + * Carbon::parse('2018-07-25 12:45:16')->ne('2018-07-25 12:45:17'); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see notEqualTo() + * + * @return bool + */ + public function ne($date): bool + { + return $this->notEqualTo($date); + } + + /** + * Determines if the instance is not equal to another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->notEqualTo('2018-07-25 12:45:16'); // false + * Carbon::parse('2018-07-25 12:45:16')->notEqualTo(Carbon::parse('2018-07-25 12:45:16')); // false + * Carbon::parse('2018-07-25 12:45:16')->notEqualTo('2018-07-25 12:45:17'); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @return bool + */ + public function notEqualTo($date): bool + { + return !$this->equalTo($date); + } + + /** + * Determines if the instance is greater (after) than another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:15'); // true + * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:16'); // false + * Carbon::parse('2018-07-25 12:45:16')->gt('2018-07-25 12:45:17'); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see greaterThan() + * + * @return bool + */ + public function gt($date): bool + { + return $this->greaterThan($date); + } + + /** + * Determines if the instance is greater (after) than another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:15'); // true + * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:16'); // false + * Carbon::parse('2018-07-25 12:45:16')->greaterThan('2018-07-25 12:45:17'); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @return bool + */ + public function greaterThan($date): bool + { + $this->discourageNull($date); + $this->discourageBoolean($date); + + return $this > $this->resolveCarbon($date); + } + + /** + * Determines if the instance is greater (after) than another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:15'); // true + * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:16'); // false + * Carbon::parse('2018-07-25 12:45:16')->isAfter('2018-07-25 12:45:17'); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see greaterThan() + * + * @return bool + */ + public function isAfter($date): bool + { + return $this->greaterThan($date); + } + + /** + * Determines if the instance is greater (after) than or equal to another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:15'); // true + * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:16'); // true + * Carbon::parse('2018-07-25 12:45:16')->gte('2018-07-25 12:45:17'); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see greaterThanOrEqualTo() + * + * @return bool + */ + public function gte($date): bool + { + return $this->greaterThanOrEqualTo($date); + } + + /** + * Determines if the instance is greater (after) than or equal to another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:15'); // true + * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:16'); // true + * Carbon::parse('2018-07-25 12:45:16')->greaterThanOrEqualTo('2018-07-25 12:45:17'); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @return bool + */ + public function greaterThanOrEqualTo($date): bool + { + $this->discourageNull($date); + $this->discourageBoolean($date); + + return $this >= $this->resolveCarbon($date); + } + + /** + * Determines if the instance is less (before) than another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:15'); // false + * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:16'); // false + * Carbon::parse('2018-07-25 12:45:16')->lt('2018-07-25 12:45:17'); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see lessThan() + * + * @return bool + */ + public function lt($date): bool + { + return $this->lessThan($date); + } + + /** + * Determines if the instance is less (before) than another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:15'); // false + * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:16'); // false + * Carbon::parse('2018-07-25 12:45:16')->lessThan('2018-07-25 12:45:17'); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @return bool + */ + public function lessThan($date): bool + { + $this->discourageNull($date); + $this->discourageBoolean($date); + + return $this < $this->resolveCarbon($date); + } + + /** + * Determines if the instance is less (before) than another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:15'); // false + * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:16'); // false + * Carbon::parse('2018-07-25 12:45:16')->isBefore('2018-07-25 12:45:17'); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see lessThan() + * + * @return bool + */ + public function isBefore($date): bool + { + return $this->lessThan($date); + } + + /** + * Determines if the instance is less (before) or equal to another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:15'); // false + * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:16'); // true + * Carbon::parse('2018-07-25 12:45:16')->lte('2018-07-25 12:45:17'); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see lessThanOrEqualTo() + * + * @return bool + */ + public function lte($date): bool + { + return $this->lessThanOrEqualTo($date); + } + + /** + * Determines if the instance is less (before) or equal to another + * + * @example + * ``` + * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:15'); // false + * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:16'); // true + * Carbon::parse('2018-07-25 12:45:16')->lessThanOrEqualTo('2018-07-25 12:45:17'); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @return bool + */ + public function lessThanOrEqualTo($date): bool + { + $this->discourageNull($date); + $this->discourageBoolean($date); + + return $this <= $this->resolveCarbon($date); + } + + /** + * Determines if the instance is between two others. + * + * The third argument allow you to specify if bounds are included or not (true by default) + * but for when you including/excluding bounds may produce different results in your application, + * we recommend to use the explicit methods ->betweenIncluded() or ->betweenExcluded() instead. + * + * @example + * ``` + * Carbon::parse('2018-07-25')->between('2018-07-14', '2018-08-01'); // true + * Carbon::parse('2018-07-25')->between('2018-08-01', '2018-08-20'); // false + * Carbon::parse('2018-07-25')->between('2018-07-25', '2018-08-01'); // true + * Carbon::parse('2018-07-25')->between('2018-07-25', '2018-08-01', false); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 + * @param bool $equal Indicates if an equal to comparison should be done + * + * @return bool + */ + public function between($date1, $date2, $equal = true): bool + { + $date1 = $this->resolveCarbon($date1); + $date2 = $this->resolveCarbon($date2); + + if ($date1->greaterThan($date2)) { + [$date1, $date2] = [$date2, $date1]; + } + + if ($equal) { + return $this >= $date1 && $this <= $date2; + } + + return $this > $date1 && $this < $date2; + } + + /** + * Determines if the instance is between two others, bounds included. + * + * @example + * ``` + * Carbon::parse('2018-07-25')->betweenIncluded('2018-07-14', '2018-08-01'); // true + * Carbon::parse('2018-07-25')->betweenIncluded('2018-08-01', '2018-08-20'); // false + * Carbon::parse('2018-07-25')->betweenIncluded('2018-07-25', '2018-08-01'); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 + * + * @return bool + */ + public function betweenIncluded($date1, $date2): bool + { + return $this->between($date1, $date2, true); + } + + /** + * Determines if the instance is between two others, bounds excluded. + * + * @example + * ``` + * Carbon::parse('2018-07-25')->betweenExcluded('2018-07-14', '2018-08-01'); // true + * Carbon::parse('2018-07-25')->betweenExcluded('2018-08-01', '2018-08-20'); // false + * Carbon::parse('2018-07-25')->betweenExcluded('2018-07-25', '2018-08-01'); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 + * + * @return bool + */ + public function betweenExcluded($date1, $date2): bool + { + return $this->between($date1, $date2, false); + } + + /** + * Determines if the instance is between two others + * + * @example + * ``` + * Carbon::parse('2018-07-25')->isBetween('2018-07-14', '2018-08-01'); // true + * Carbon::parse('2018-07-25')->isBetween('2018-08-01', '2018-08-20'); // false + * Carbon::parse('2018-07-25')->isBetween('2018-07-25', '2018-08-01'); // true + * Carbon::parse('2018-07-25')->isBetween('2018-07-25', '2018-08-01', false); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 + * @param bool $equal Indicates if an equal to comparison should be done + * + * @return bool + */ + public function isBetween($date1, $date2, $equal = true): bool + { + return $this->between($date1, $date2, $equal); + } + + /** + * Determines if the instance is a weekday. + * + * @example + * ``` + * Carbon::parse('2019-07-14')->isWeekday(); // false + * Carbon::parse('2019-07-15')->isWeekday(); // true + * ``` + * + * @return bool + */ + public function isWeekday() + { + return !$this->isWeekend(); + } + + /** + * Determines if the instance is a weekend day. + * + * @example + * ``` + * Carbon::parse('2019-07-14')->isWeekend(); // true + * Carbon::parse('2019-07-15')->isWeekend(); // false + * ``` + * + * @return bool + */ + public function isWeekend() + { + return \in_array($this->dayOfWeek, static::$weekendDays, true); + } + + /** + * Determines if the instance is yesterday. + * + * @example + * ``` + * Carbon::yesterday()->isYesterday(); // true + * Carbon::tomorrow()->isYesterday(); // false + * ``` + * + * @return bool + */ + public function isYesterday() + { + return $this->toDateString() === static::yesterday($this->getTimezone())->toDateString(); + } + + /** + * Determines if the instance is today. + * + * @example + * ``` + * Carbon::today()->isToday(); // true + * Carbon::tomorrow()->isToday(); // false + * ``` + * + * @return bool + */ + public function isToday() + { + return $this->toDateString() === $this->nowWithSameTz()->toDateString(); + } + + /** + * Determines if the instance is tomorrow. + * + * @example + * ``` + * Carbon::tomorrow()->isTomorrow(); // true + * Carbon::yesterday()->isTomorrow(); // false + * ``` + * + * @return bool + */ + public function isTomorrow() + { + return $this->toDateString() === static::tomorrow($this->getTimezone())->toDateString(); + } + + /** + * Determines if the instance is in the future, ie. greater (after) than now. + * + * @example + * ``` + * Carbon::now()->addHours(5)->isFuture(); // true + * Carbon::now()->subHours(5)->isFuture(); // false + * ``` + * + * @return bool + */ + public function isFuture() + { + return $this->greaterThan($this->nowWithSameTz()); + } + + /** + * Determines if the instance is in the past, ie. less (before) than now. + * + * @example + * ``` + * Carbon::now()->subHours(5)->isPast(); // true + * Carbon::now()->addHours(5)->isPast(); // false + * ``` + * + * @return bool + */ + public function isPast() + { + return $this->lessThan($this->nowWithSameTz()); + } + + /** + * Determines if the instance is a leap year. + * + * @example + * ``` + * Carbon::parse('2020-01-01')->isLeapYear(); // true + * Carbon::parse('2019-01-01')->isLeapYear(); // false + * ``` + * + * @return bool + */ + public function isLeapYear() + { + return $this->rawFormat('L') === '1'; + } + + /** + * Determines if the instance is a long year + * + * @example + * ``` + * Carbon::parse('2015-01-01')->isLongYear(); // true + * Carbon::parse('2016-01-01')->isLongYear(); // false + * ``` + * + * @see https://en.wikipedia.org/wiki/ISO_8601#Week_dates + * + * @return bool + */ + public function isLongYear() + { + return static::create($this->year, 12, 28, 0, 0, 0, $this->tz)->weekOfYear === 53; + } + + /** + * Compares the formatted values of the two dates. + * + * @example + * ``` + * Carbon::parse('2019-06-13')->isSameAs('Y-d', Carbon::parse('2019-12-13')); // true + * Carbon::parse('2019-06-13')->isSameAs('Y-d', Carbon::parse('2019-06-14')); // false + * ``` + * + * @param string $format date formats to compare. + * @param \Carbon\Carbon|\DateTimeInterface|string|null $date instance to compare with or null to use current day. + * + * @return bool + */ + public function isSameAs($format, $date = null) + { + return $this->rawFormat($format) === $this->resolveCarbon($date)->rawFormat($format); + } + + /** + * Determines if the instance is in the current unit given. + * + * @example + * ``` + * Carbon::parse('2019-01-13')->isSameUnit('year', Carbon::parse('2019-12-25')); // true + * Carbon::parse('2018-12-13')->isSameUnit('year', Carbon::parse('2019-12-25')); // false + * ``` + * + * @param string $unit singular unit string + * @param \Carbon\Carbon|\DateTimeInterface|null $date instance to compare with or null to use current day. + * + * @throws BadComparisonUnitException + * + * @return bool + */ + public function isSameUnit($unit, $date = null) + { + $units = [ + // @call isSameUnit + 'year' => 'Y', + // @call isSameUnit + 'week' => 'o-W', + // @call isSameUnit + 'day' => 'Y-m-d', + // @call isSameUnit + 'hour' => 'Y-m-d H', + // @call isSameUnit + 'minute' => 'Y-m-d H:i', + // @call isSameUnit + 'second' => 'Y-m-d H:i:s', + // @call isSameUnit + 'micro' => 'Y-m-d H:i:s.u', + // @call isSameUnit + 'microsecond' => 'Y-m-d H:i:s.u', + ]; + + if (isset($units[$unit])) { + return $this->isSameAs($units[$unit], $date); + } + + if (isset($this->$unit)) { + return $this->resolveCarbon($date)->$unit === $this->$unit; + } + + if ($this->localStrictModeEnabled ?? static::isStrictModeEnabled()) { + throw new BadComparisonUnitException($unit); + } + + return false; + } + + /** + * Determines if the instance is in the current unit given. + * + * @example + * ``` + * Carbon::now()->isCurrentUnit('hour'); // true + * Carbon::now()->subHours(2)->isCurrentUnit('hour'); // false + * ``` + * + * @param string $unit The unit to test. + * + * @throws BadMethodCallException + * + * @return bool + */ + public function isCurrentUnit($unit) + { + return $this->{'isSame'.ucfirst($unit)}(); + } + + /** + * Checks if the passed in date is in the same quarter as the instance quarter (and year if needed). + * + * @example + * ``` + * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2019-03-01')); // true + * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2019-04-01')); // false + * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2018-03-01')); // false + * Carbon::parse('2019-01-12')->isSameQuarter(Carbon::parse('2018-03-01'), false); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|string|null $date The instance to compare with or null to use current day. + * @param bool $ofSameYear Check if it is the same month in the same year. + * + * @return bool + */ + public function isSameQuarter($date = null, $ofSameYear = true) + { + $date = $this->resolveCarbon($date); + + return $this->quarter === $date->quarter && (!$ofSameYear || $this->isSameYear($date)); + } + + /** + * Checks if the passed in date is in the same month as the instance´s month. + * + * @example + * ``` + * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2019-01-01')); // true + * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2019-02-01')); // false + * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2018-01-01')); // false + * Carbon::parse('2019-01-12')->isSameMonth(Carbon::parse('2018-01-01'), false); // true + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|null $date The instance to compare with or null to use the current date. + * @param bool $ofSameYear Check if it is the same month in the same year. + * + * @return bool + */ + public function isSameMonth($date = null, $ofSameYear = true) + { + return $this->isSameAs($ofSameYear ? 'Y-m' : 'm', $date); + } + + /** + * Checks if this day is a specific day of the week. + * + * @example + * ``` + * Carbon::parse('2019-07-17')->isDayOfWeek(Carbon::WEDNESDAY); // true + * Carbon::parse('2019-07-17')->isDayOfWeek(Carbon::FRIDAY); // false + * Carbon::parse('2019-07-17')->isDayOfWeek('Wednesday'); // true + * Carbon::parse('2019-07-17')->isDayOfWeek('Friday'); // false + * ``` + * + * @param int $dayOfWeek + * + * @return bool + */ + public function isDayOfWeek($dayOfWeek) + { + if (\is_string($dayOfWeek) && \defined($constant = static::class.'::'.strtoupper($dayOfWeek))) { + $dayOfWeek = \constant($constant); + } + + return $this->dayOfWeek === $dayOfWeek; + } + + /** + * Check if its the birthday. Compares the date/month values of the two dates. + * + * @example + * ``` + * Carbon::now()->subYears(5)->isBirthday(); // true + * Carbon::now()->subYears(5)->subDay()->isBirthday(); // false + * Carbon::parse('2019-06-05')->isBirthday(Carbon::parse('2001-06-05')); // true + * Carbon::parse('2019-06-05')->isBirthday(Carbon::parse('2001-06-06')); // false + * ``` + * + * @param \Carbon\Carbon|\DateTimeInterface|null $date The instance to compare with or null to use current day. + * + * @return bool + */ + public function isBirthday($date = null) + { + return $this->isSameAs('md', $date); + } + + /** + * Check if today is the last day of the Month + * + * @example + * ``` + * Carbon::parse('2019-02-28')->isLastOfMonth(); // true + * Carbon::parse('2019-03-28')->isLastOfMonth(); // false + * Carbon::parse('2019-03-30')->isLastOfMonth(); // false + * Carbon::parse('2019-03-31')->isLastOfMonth(); // true + * Carbon::parse('2019-04-30')->isLastOfMonth(); // true + * ``` + * + * @return bool + */ + public function isLastOfMonth() + { + return $this->day === $this->daysInMonth; + } + + /** + * Check if the instance is start of day / midnight. + * + * @example + * ``` + * Carbon::parse('2019-02-28 00:00:00')->isStartOfDay(); // true + * Carbon::parse('2019-02-28 00:00:00.999999')->isStartOfDay(); // true + * Carbon::parse('2019-02-28 00:00:01')->isStartOfDay(); // false + * Carbon::parse('2019-02-28 00:00:00.000000')->isStartOfDay(true); // true + * Carbon::parse('2019-02-28 00:00:00.000012')->isStartOfDay(true); // false + * ``` + * + * @param bool $checkMicroseconds check time at microseconds precision + * + * @return bool + */ + public function isStartOfDay($checkMicroseconds = false) + { + /* @var CarbonInterface $this */ + return $checkMicroseconds + ? $this->rawFormat('H:i:s.u') === '00:00:00.000000' + : $this->rawFormat('H:i:s') === '00:00:00'; + } + + /** + * Check if the instance is end of day. + * + * @example + * ``` + * Carbon::parse('2019-02-28 23:59:59.999999')->isEndOfDay(); // true + * Carbon::parse('2019-02-28 23:59:59.123456')->isEndOfDay(); // true + * Carbon::parse('2019-02-28 23:59:59')->isEndOfDay(); // true + * Carbon::parse('2019-02-28 23:59:58.999999')->isEndOfDay(); // false + * Carbon::parse('2019-02-28 23:59:59.999999')->isEndOfDay(true); // true + * Carbon::parse('2019-02-28 23:59:59.123456')->isEndOfDay(true); // false + * Carbon::parse('2019-02-28 23:59:59')->isEndOfDay(true); // false + * ``` + * + * @param bool $checkMicroseconds check time at microseconds precision + * + * @return bool + */ + public function isEndOfDay($checkMicroseconds = false) + { + /* @var CarbonInterface $this */ + return $checkMicroseconds + ? $this->rawFormat('H:i:s.u') === '23:59:59.999999' + : $this->rawFormat('H:i:s') === '23:59:59'; + } + + /** + * Check if the instance is start of day / midnight. + * + * @example + * ``` + * Carbon::parse('2019-02-28 00:00:00')->isMidnight(); // true + * Carbon::parse('2019-02-28 00:00:00.999999')->isMidnight(); // true + * Carbon::parse('2019-02-28 00:00:01')->isMidnight(); // false + * ``` + * + * @return bool + */ + public function isMidnight() + { + return $this->isStartOfDay(); + } + + /** + * Check if the instance is midday. + * + * @example + * ``` + * Carbon::parse('2019-02-28 11:59:59.999999')->isMidday(); // false + * Carbon::parse('2019-02-28 12:00:00')->isMidday(); // true + * Carbon::parse('2019-02-28 12:00:00.999999')->isMidday(); // true + * Carbon::parse('2019-02-28 12:00:01')->isMidday(); // false + * ``` + * + * @return bool + */ + public function isMidday() + { + /* @var CarbonInterface $this */ + return $this->rawFormat('G:i:s') === static::$midDayAt.':00:00'; + } + + /** + * Checks if the (date)time string is in a given format. + * + * @example + * ``` + * Carbon::hasFormat('11:12:45', 'h:i:s'); // true + * Carbon::hasFormat('13:12:45', 'h:i:s'); // false + * ``` + * + * @param string $date + * @param string $format + * + * @return bool + */ + public static function hasFormat($date, $format) + { + // createFromFormat() is known to handle edge cases silently. + // E.g. "1975-5-1" (Y-n-j) will still be parsed correctly when "Y-m-d" is supplied as the format. + // To ensure we're really testing against our desired format, perform an additional regex validation. + + return self::matchFormatPattern((string) $date, preg_quote((string) $format, '/'), static::$regexFormats); + } + + /** + * Checks if the (date)time string is in a given format. + * + * @example + * ``` + * Carbon::hasFormatWithModifiers('31/08/2015', 'd#m#Y'); // true + * Carbon::hasFormatWithModifiers('31/08/2015', 'm#d#Y'); // false + * ``` + * + * @param string $date + * @param string $format + * + * @return bool + */ + public static function hasFormatWithModifiers($date, $format): bool + { + return self::matchFormatPattern((string) $date, (string) $format, array_merge(static::$regexFormats, static::$regexFormatModifiers)); + } + + /** + * Checks if the (date)time string is in a given format and valid to create a + * new instance. + * + * @example + * ``` + * Carbon::canBeCreatedFromFormat('11:12:45', 'h:i:s'); // true + * Carbon::canBeCreatedFromFormat('13:12:45', 'h:i:s'); // false + * ``` + * + * @param string $date + * @param string $format + * + * @return bool + */ + public static function canBeCreatedFromFormat($date, $format) + { + try { + // Try to create a DateTime object. Throws an InvalidArgumentException if the provided time string + // doesn't match the format in any way. + if (!static::rawCreateFromFormat($format, $date)) { + return false; + } + } catch (InvalidArgumentException $e) { + return false; + } + + return static::hasFormatWithModifiers($date, $format); + } + + /** + * Returns true if the current date matches the given string. + * + * @example + * ``` + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019')); // true + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2018')); // false + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019-06')); // true + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('06-02')); // true + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('2019-06-02')); // true + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('Sunday')); // true + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('June')); // true + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23')); // true + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23:45')); // true + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12:23:00')); // false + * var_dump(Carbon::parse('2019-06-02 12:23:45')->is('12h')); // true + * var_dump(Carbon::parse('2019-06-02 15:23:45')->is('3pm')); // true + * var_dump(Carbon::parse('2019-06-02 15:23:45')->is('3am')); // false + * ``` + * + * @param string $tester day name, month name, hour, date, etc. as string + * + * @return bool + */ + public function is(string $tester) + { + $tester = trim($tester); + + if (preg_match('/^\d+$/', $tester)) { + return $this->year === (int) $tester; + } + + if (preg_match('/^\d{3,}-\d{1,2}$/', $tester)) { + return $this->isSameMonth(static::parse($tester)); + } + + if (preg_match('/^\d{1,2}-\d{1,2}$/', $tester)) { + return $this->isSameDay(static::parse($this->year.'-'.$tester)); + } + + $modifier = preg_replace('/(\d)h$/i', '$1:00', $tester); + + /* @var CarbonInterface $max */ + $median = static::parse('5555-06-15 12:30:30.555555')->modify($modifier); + $current = $this->avoidMutation(); + /* @var CarbonInterface $other */ + $other = $this->avoidMutation()->modify($modifier); + + if ($current->eq($other)) { + return true; + } + + if (preg_match('/\d:\d{1,2}:\d{1,2}$/', $tester)) { + return $current->startOfSecond()->eq($other); + } + + if (preg_match('/\d:\d{1,2}$/', $tester)) { + return $current->startOfMinute()->eq($other); + } + + if (preg_match('/\d(h|am|pm)$/', $tester)) { + return $current->startOfHour()->eq($other); + } + + if (preg_match( + '/^(january|february|march|april|may|june|july|august|september|october|november|december)\s+\d+$/i', + $tester + )) { + return $current->startOfMonth()->eq($other->startOfMonth()); + } + + $units = [ + 'month' => [1, 'year'], + 'day' => [1, 'month'], + 'hour' => [0, 'day'], + 'minute' => [0, 'hour'], + 'second' => [0, 'minute'], + 'microsecond' => [0, 'second'], + ]; + + foreach ($units as $unit => [$minimum, $startUnit]) { + if ($minimum === $median->$unit) { + $current = $current->startOf($startUnit); + + break; + } + } + + return $current->eq($other); + } + + /** + * Checks if the (date)time string is in a given format with + * given list of pattern replacements. + * + * @example + * ``` + * Carbon::hasFormat('11:12:45', 'h:i:s'); // true + * Carbon::hasFormat('13:12:45', 'h:i:s'); // false + * ``` + * + * @param string $date + * @param string $format + * @param array $replacements + * + * @return bool + */ + private static function matchFormatPattern(string $date, string $format, array $replacements): bool + { + // Preg quote, but remove escaped backslashes since we'll deal with escaped characters in the format string. + $regex = str_replace('\\\\', '\\', $format); + // Replace not-escaped letters + $regex = preg_replace_callback( + '/(?<!\\\\)((?:\\\\{2})*)(['.implode('', array_keys($replacements)).'])/', + function ($match) use ($replacements) { + return $match[1].strtr($match[2], $replacements); + }, + $regex + ); + // Replace escaped letters by the letter itself + $regex = preg_replace('/(?<!\\\\)((?:\\\\{2})*)\\\\(\w)/', '$1$2', $regex); + // Escape not escaped slashes + $regex = preg_replace('#(?<!\\\\)((?:\\\\{2})*)/#', '$1\\/', $regex); + + return (bool) @preg_match('/^'.$regex.'$/', $date); + } + + /** + * Returns true if the date was created using CarbonImmutable::startOfTime() + * + * @return bool + */ + public function isStartOfTime(): bool + { + return $this->startOfTime ?? false; + } + + /** + * Returns true if the date was created using CarbonImmutable::endOfTime() + * + * @return bool + */ + public function isEndOfTime(): bool + { + return $this->endOfTime ?? false; + } + + private function discourageNull($value): void + { + if ($value === null) { + @trigger_error("Since 2.61.0, it's deprecated to compare a date to null, meaning of such comparison is ambiguous and will no longer be possible in 3.0.0, you should explicitly pass 'now' or make an other check to eliminate null values.", \E_USER_DEPRECATED); + } + } + + private function discourageBoolean($value): void + { + if (\is_bool($value)) { + @trigger_error("Since 2.61.0, it's deprecated to compare a date to true or false, meaning of such comparison is ambiguous and will no longer be possible in 3.0.0, you should explicitly pass 'now' or make an other check to eliminate boolean values.", \E_USER_DEPRECATED); + } + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Converter.php b/vendor/nesbot/carbon/src/Carbon/Traits/Converter.php new file mode 100644 index 0000000..05598d5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Converter.php @@ -0,0 +1,636 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use Carbon\Carbon; +use Carbon\CarbonImmutable; +use Carbon\CarbonInterface; +use Carbon\CarbonInterval; +use Carbon\CarbonPeriod; +use Carbon\Exceptions\UnitException; +use Closure; +use DateTime; +use DateTimeImmutable; +use ReturnTypeWillChange; + +/** + * Trait Converter. + * + * Change date into different string formats and types and + * handle the string cast. + * + * Depends on the following methods: + * + * @method static copy() + */ +trait Converter +{ + use ToStringFormat; + + /** + * Returns the formatted date string on success or FALSE on failure. + * + * @see https://php.net/manual/en/datetime.format.php + * + * @param string $format + * + * @return string + */ + #[ReturnTypeWillChange] + public function format($format) + { + $function = $this->localFormatFunction ?: static::$formatFunction; + + if (!$function) { + return $this->rawFormat($format); + } + + if (\is_string($function) && method_exists($this, $function)) { + $function = [$this, $function]; + } + + return $function(...\func_get_args()); + } + + /** + * @see https://php.net/manual/en/datetime.format.php + * + * @param string $format + * + * @return string + */ + public function rawFormat($format) + { + return parent::format($format); + } + + /** + * Format the instance as a string using the set format + * + * @example + * ``` + * echo Carbon::now(); // Carbon instances can be cast to string + * ``` + * + * @return string + */ + public function __toString() + { + $format = $this->localToStringFormat ?? static::$toStringFormat; + + return $format instanceof Closure + ? $format($this) + : $this->rawFormat($format ?: ( + \defined('static::DEFAULT_TO_STRING_FORMAT') + ? static::DEFAULT_TO_STRING_FORMAT + : CarbonInterface::DEFAULT_TO_STRING_FORMAT + )); + } + + /** + * Format the instance as date + * + * @example + * ``` + * echo Carbon::now()->toDateString(); + * ``` + * + * @return string + */ + public function toDateString() + { + return $this->rawFormat('Y-m-d'); + } + + /** + * Format the instance as a readable date + * + * @example + * ``` + * echo Carbon::now()->toFormattedDateString(); + * ``` + * + * @return string + */ + public function toFormattedDateString() + { + return $this->rawFormat('M j, Y'); + } + + /** + * Format the instance with the day, and a readable date + * + * @example + * ``` + * echo Carbon::now()->toFormattedDayDateString(); + * ``` + * + * @return string + */ + public function toFormattedDayDateString(): string + { + return $this->rawFormat('D, M j, Y'); + } + + /** + * Format the instance as time + * + * @example + * ``` + * echo Carbon::now()->toTimeString(); + * ``` + * + * @param string $unitPrecision + * + * @return string + */ + public function toTimeString($unitPrecision = 'second') + { + return $this->rawFormat(static::getTimeFormatByPrecision($unitPrecision)); + } + + /** + * Format the instance as date and time + * + * @example + * ``` + * echo Carbon::now()->toDateTimeString(); + * ``` + * + * @param string $unitPrecision + * + * @return string + */ + public function toDateTimeString($unitPrecision = 'second') + { + return $this->rawFormat('Y-m-d '.static::getTimeFormatByPrecision($unitPrecision)); + } + + /** + * Return a format from H:i to H:i:s.u according to given unit precision. + * + * @param string $unitPrecision "minute", "second", "millisecond" or "microsecond" + * + * @return string + */ + public static function getTimeFormatByPrecision($unitPrecision) + { + switch (static::singularUnit($unitPrecision)) { + case 'minute': + return 'H:i'; + case 'second': + return 'H:i:s'; + case 'm': + case 'millisecond': + return 'H:i:s.v'; + case 'µ': + case 'microsecond': + return 'H:i:s.u'; + } + + throw new UnitException('Precision unit expected among: minute, second, millisecond and microsecond.'); + } + + /** + * Format the instance as date and time T-separated with no timezone + * + * @example + * ``` + * echo Carbon::now()->toDateTimeLocalString(); + * echo "\n"; + * echo Carbon::now()->toDateTimeLocalString('minute'); // You can specify precision among: minute, second, millisecond and microsecond + * ``` + * + * @param string $unitPrecision + * + * @return string + */ + public function toDateTimeLocalString($unitPrecision = 'second') + { + return $this->rawFormat('Y-m-d\T'.static::getTimeFormatByPrecision($unitPrecision)); + } + + /** + * Format the instance with day, date and time + * + * @example + * ``` + * echo Carbon::now()->toDayDateTimeString(); + * ``` + * + * @return string + */ + public function toDayDateTimeString() + { + return $this->rawFormat('D, M j, Y g:i A'); + } + + /** + * Format the instance as ATOM + * + * @example + * ``` + * echo Carbon::now()->toAtomString(); + * ``` + * + * @return string + */ + public function toAtomString() + { + return $this->rawFormat(DateTime::ATOM); + } + + /** + * Format the instance as COOKIE + * + * @example + * ``` + * echo Carbon::now()->toCookieString(); + * ``` + * + * @return string + */ + public function toCookieString() + { + return $this->rawFormat(DateTime::COOKIE); + } + + /** + * Format the instance as ISO8601 + * + * @example + * ``` + * echo Carbon::now()->toIso8601String(); + * ``` + * + * @return string + */ + public function toIso8601String() + { + return $this->toAtomString(); + } + + /** + * Format the instance as RFC822 + * + * @example + * ``` + * echo Carbon::now()->toRfc822String(); + * ``` + * + * @return string + */ + public function toRfc822String() + { + return $this->rawFormat(DateTime::RFC822); + } + + /** + * Convert the instance to UTC and return as Zulu ISO8601 + * + * @example + * ``` + * echo Carbon::now()->toIso8601ZuluString(); + * ``` + * + * @param string $unitPrecision + * + * @return string + */ + public function toIso8601ZuluString($unitPrecision = 'second') + { + return $this->avoidMutation() + ->utc() + ->rawFormat('Y-m-d\T'.static::getTimeFormatByPrecision($unitPrecision).'\Z'); + } + + /** + * Format the instance as RFC850 + * + * @example + * ``` + * echo Carbon::now()->toRfc850String(); + * ``` + * + * @return string + */ + public function toRfc850String() + { + return $this->rawFormat(DateTime::RFC850); + } + + /** + * Format the instance as RFC1036 + * + * @example + * ``` + * echo Carbon::now()->toRfc1036String(); + * ``` + * + * @return string + */ + public function toRfc1036String() + { + return $this->rawFormat(DateTime::RFC1036); + } + + /** + * Format the instance as RFC1123 + * + * @example + * ``` + * echo Carbon::now()->toRfc1123String(); + * ``` + * + * @return string + */ + public function toRfc1123String() + { + return $this->rawFormat(DateTime::RFC1123); + } + + /** + * Format the instance as RFC2822 + * + * @example + * ``` + * echo Carbon::now()->toRfc2822String(); + * ``` + * + * @return string + */ + public function toRfc2822String() + { + return $this->rawFormat(DateTime::RFC2822); + } + + /** + * Format the instance as RFC3339 + * + * @param bool $extended + * + * @example + * ``` + * echo Carbon::now()->toRfc3339String() . "\n"; + * echo Carbon::now()->toRfc3339String(true) . "\n"; + * ``` + * + * @return string + */ + public function toRfc3339String($extended = false) + { + $format = DateTime::RFC3339; + if ($extended) { + $format = DateTime::RFC3339_EXTENDED; + } + + return $this->rawFormat($format); + } + + /** + * Format the instance as RSS + * + * @example + * ``` + * echo Carbon::now()->toRssString(); + * ``` + * + * @return string + */ + public function toRssString() + { + return $this->rawFormat(DateTime::RSS); + } + + /** + * Format the instance as W3C + * + * @example + * ``` + * echo Carbon::now()->toW3cString(); + * ``` + * + * @return string + */ + public function toW3cString() + { + return $this->rawFormat(DateTime::W3C); + } + + /** + * Format the instance as RFC7231 + * + * @example + * ``` + * echo Carbon::now()->toRfc7231String(); + * ``` + * + * @return string + */ + public function toRfc7231String() + { + return $this->avoidMutation() + ->setTimezone('GMT') + ->rawFormat(\defined('static::RFC7231_FORMAT') ? static::RFC7231_FORMAT : CarbonInterface::RFC7231_FORMAT); + } + + /** + * Get default array representation. + * + * @example + * ``` + * var_dump(Carbon::now()->toArray()); + * ``` + * + * @return array + */ + public function toArray() + { + return [ + 'year' => $this->year, + 'month' => $this->month, + 'day' => $this->day, + 'dayOfWeek' => $this->dayOfWeek, + 'dayOfYear' => $this->dayOfYear, + 'hour' => $this->hour, + 'minute' => $this->minute, + 'second' => $this->second, + 'micro' => $this->micro, + 'timestamp' => $this->timestamp, + 'formatted' => $this->rawFormat(\defined('static::DEFAULT_TO_STRING_FORMAT') ? static::DEFAULT_TO_STRING_FORMAT : CarbonInterface::DEFAULT_TO_STRING_FORMAT), + 'timezone' => $this->timezone, + ]; + } + + /** + * Get default object representation. + * + * @example + * ``` + * var_dump(Carbon::now()->toObject()); + * ``` + * + * @return object + */ + public function toObject() + { + return (object) $this->toArray(); + } + + /** + * Returns english human readable complete date string. + * + * @example + * ``` + * echo Carbon::now()->toString(); + * ``` + * + * @return string + */ + public function toString() + { + return $this->avoidMutation()->locale('en')->isoFormat('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + } + + /** + * Return the ISO-8601 string (ex: 1977-04-22T06:00:00Z, if $keepOffset truthy, offset will be kept: + * 1977-04-22T01:00:00-05:00). + * + * @example + * ``` + * echo Carbon::now('America/Toronto')->toISOString() . "\n"; + * echo Carbon::now('America/Toronto')->toISOString(true) . "\n"; + * ``` + * + * @param bool $keepOffset Pass true to keep the date offset. Else forced to UTC. + * + * @return null|string + */ + public function toISOString($keepOffset = false) + { + if (!$this->isValid()) { + return null; + } + + $yearFormat = $this->year < 0 || $this->year > 9999 ? 'YYYYYY' : 'YYYY'; + $tzFormat = $keepOffset ? 'Z' : '[Z]'; + $date = $keepOffset ? $this : $this->avoidMutation()->utc(); + + return $date->isoFormat("$yearFormat-MM-DD[T]HH:mm:ss.SSSSSS$tzFormat"); + } + + /** + * Return the ISO-8601 string (ex: 1977-04-22T06:00:00Z) with UTC timezone. + * + * @example + * ``` + * echo Carbon::now('America/Toronto')->toJSON(); + * ``` + * + * @return null|string + */ + public function toJSON() + { + return $this->toISOString(); + } + + /** + * Return native DateTime PHP object matching the current instance. + * + * @example + * ``` + * var_dump(Carbon::now()->toDateTime()); + * ``` + * + * @return DateTime + */ + public function toDateTime() + { + return new DateTime($this->rawFormat('Y-m-d H:i:s.u'), $this->getTimezone()); + } + + /** + * Return native toDateTimeImmutable PHP object matching the current instance. + * + * @example + * ``` + * var_dump(Carbon::now()->toDateTimeImmutable()); + * ``` + * + * @return DateTimeImmutable + */ + public function toDateTimeImmutable() + { + return new DateTimeImmutable($this->rawFormat('Y-m-d H:i:s.u'), $this->getTimezone()); + } + + /** + * @alias toDateTime + * + * Return native DateTime PHP object matching the current instance. + * + * @example + * ``` + * var_dump(Carbon::now()->toDate()); + * ``` + * + * @return DateTime + */ + public function toDate() + { + return $this->toDateTime(); + } + + /** + * Create a iterable CarbonPeriod object from current date to a given end date (and optional interval). + * + * @param \DateTimeInterface|Carbon|CarbonImmutable|int|null $end period end date or recurrences count if int + * @param int|\DateInterval|string|null $interval period default interval or number of the given $unit + * @param string|null $unit if specified, $interval must be an integer + * + * @return CarbonPeriod + */ + public function toPeriod($end = null, $interval = null, $unit = null) + { + if ($unit) { + $interval = CarbonInterval::make("$interval ".static::pluralUnit($unit)); + } + + $period = (new CarbonPeriod())->setDateClass(static::class)->setStartDate($this); + + if ($interval) { + $period->setDateInterval($interval); + } + + if (\is_int($end) || (\is_string($end) && ctype_digit($end))) { + $period->setRecurrences($end); + } elseif ($end) { + $period->setEndDate($end); + } + + return $period; + } + + /** + * Create a iterable CarbonPeriod object from current date to a given end date (and optional interval). + * + * @param \DateTimeInterface|Carbon|CarbonImmutable|null $end period end date + * @param int|\DateInterval|string|null $interval period default interval or number of the given $unit + * @param string|null $unit if specified, $interval must be an integer + * + * @return CarbonPeriod + */ + public function range($end = null, $interval = null, $unit = null) + { + return $this->toPeriod($end, $interval, $unit); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php b/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php new file mode 100644 index 0000000..be2c0f7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php @@ -0,0 +1,950 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use Carbon\Carbon; +use Carbon\CarbonImmutable; +use Carbon\CarbonInterface; +use Carbon\Exceptions\InvalidDateException; +use Carbon\Exceptions\InvalidFormatException; +use Carbon\Exceptions\OutOfRangeException; +use Carbon\Translator; +use Closure; +use DateTimeInterface; +use DateTimeZone; +use Exception; +use ReturnTypeWillChange; + +/** + * Trait Creator. + * + * Static creators. + * + * Depends on the following methods: + * + * @method static Carbon|CarbonImmutable getTestNow() + */ +trait Creator +{ + use ObjectInitialisation; + + /** + * The errors that can occur. + * + * @var array + */ + protected static $lastErrors; + + /** + * Create a new Carbon instance. + * + * Please see the testing aids section (specifically static::setTestNow()) + * for more on the possibility of this constructor returning a test instance. + * + * @param DateTimeInterface|string|null $time + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + */ + public function __construct($time = null, $tz = null) + { + if ($time instanceof DateTimeInterface) { + $time = $this->constructTimezoneFromDateTime($time, $tz)->format('Y-m-d H:i:s.u'); + } + + if (is_numeric($time) && (!\is_string($time) || !preg_match('/^\d{1,14}$/', $time))) { + $time = static::createFromTimestampUTC($time)->format('Y-m-d\TH:i:s.uP'); + } + + // If the class has a test now set and we are trying to create a now() + // instance then override as required + $isNow = empty($time) || $time === 'now'; + + if (method_exists(static::class, 'hasTestNow') && + method_exists(static::class, 'getTestNow') && + static::hasTestNow() && + ($isNow || static::hasRelativeKeywords($time)) + ) { + static::mockConstructorParameters($time, $tz); + } + + // Work-around for PHP bug https://bugs.php.net/bug.php?id=67127 + if (!str_contains((string) .1, '.')) { + $locale = setlocale(LC_NUMERIC, '0'); // @codeCoverageIgnore + setlocale(LC_NUMERIC, 'C'); // @codeCoverageIgnore + } + + try { + parent::__construct($time ?: 'now', static::safeCreateDateTimeZone($tz) ?: null); + } catch (Exception $exception) { + throw new InvalidFormatException($exception->getMessage(), 0, $exception); + } + + $this->constructedObjectId = spl_object_hash($this); + + if (isset($locale)) { + setlocale(LC_NUMERIC, $locale); // @codeCoverageIgnore + } + + self::setLastErrors(parent::getLastErrors()); + } + + /** + * Get timezone from a datetime instance. + * + * @param DateTimeInterface $date + * @param DateTimeZone|string|null $tz + * + * @return DateTimeInterface + */ + private function constructTimezoneFromDateTime(DateTimeInterface $date, &$tz) + { + if ($tz !== null) { + $safeTz = static::safeCreateDateTimeZone($tz); + + if ($safeTz) { + return $date->setTimezone($safeTz); + } + + return $date; + } + + $tz = $date->getTimezone(); + + return $date; + } + + /** + * Update constructedObjectId on cloned. + */ + public function __clone() + { + $this->constructedObjectId = spl_object_hash($this); + } + + /** + * Create a Carbon instance from a DateTime one. + * + * @param DateTimeInterface $date + * + * @return static + */ + public static function instance($date) + { + if ($date instanceof static) { + return clone $date; + } + + static::expectDateTime($date); + + $instance = new static($date->format('Y-m-d H:i:s.u'), $date->getTimezone()); + + if ($date instanceof CarbonInterface) { + $settings = $date->getSettings(); + + if (!$date->hasLocalTranslator()) { + unset($settings['locale']); + } + + $instance->settings($settings); + } + + return $instance; + } + + /** + * Create a carbon instance from a string. + * + * This is an alias for the constructor that allows better fluent syntax + * as it allows you to do Carbon::parse('Monday next week')->fn() rather + * than (new Carbon('Monday next week'))->fn(). + * + * @param string|DateTimeInterface|null $time + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + * + * @return static + */ + public static function rawParse($time = null, $tz = null) + { + if ($time instanceof DateTimeInterface) { + return static::instance($time); + } + + try { + return new static($time, $tz); + } catch (Exception $exception) { + $date = @static::now($tz)->change($time); + + if (!$date) { + throw new InvalidFormatException("Could not parse '$time': ".$exception->getMessage(), 0, $exception); + } + + return $date; + } + } + + /** + * Create a carbon instance from a string. + * + * This is an alias for the constructor that allows better fluent syntax + * as it allows you to do Carbon::parse('Monday next week')->fn() rather + * than (new Carbon('Monday next week'))->fn(). + * + * @param string|DateTimeInterface|null $time + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + * + * @return static + */ + public static function parse($time = null, $tz = null) + { + $function = static::$parseFunction; + + if (!$function) { + return static::rawParse($time, $tz); + } + + if (\is_string($function) && method_exists(static::class, $function)) { + $function = [static::class, $function]; + } + + return $function(...\func_get_args()); + } + + /** + * Create a carbon instance from a localized string (in French, Japanese, Arabic, etc.). + * + * @param string $time date/time string in the given language (may also contain English). + * @param string|null $locale if locale is null or not specified, current global locale will be + * used instead. + * @param DateTimeZone|string|null $tz optional timezone for the new instance. + * + * @throws InvalidFormatException + * + * @return static + */ + public static function parseFromLocale($time, $locale = null, $tz = null) + { + return static::rawParse(static::translateTimeString($time, $locale, 'en'), $tz); + } + + /** + * Get a Carbon instance for the current date and time. + * + * @param DateTimeZone|string|null $tz + * + * @return static + */ + public static function now($tz = null) + { + return new static(null, $tz); + } + + /** + * Create a Carbon instance for today. + * + * @param DateTimeZone|string|null $tz + * + * @return static + */ + public static function today($tz = null) + { + return static::rawParse('today', $tz); + } + + /** + * Create a Carbon instance for tomorrow. + * + * @param DateTimeZone|string|null $tz + * + * @return static + */ + public static function tomorrow($tz = null) + { + return static::rawParse('tomorrow', $tz); + } + + /** + * Create a Carbon instance for yesterday. + * + * @param DateTimeZone|string|null $tz + * + * @return static + */ + public static function yesterday($tz = null) + { + return static::rawParse('yesterday', $tz); + } + + /** + * Create a Carbon instance for the greatest supported date. + * + * @return static + */ + public static function maxValue() + { + if (self::$PHPIntSize === 4) { + // 32 bit + return static::createFromTimestamp(PHP_INT_MAX); // @codeCoverageIgnore + } + + // 64 bit + return static::create(9999, 12, 31, 23, 59, 59); + } + + /** + * Create a Carbon instance for the lowest supported date. + * + * @return static + */ + public static function minValue() + { + if (self::$PHPIntSize === 4) { + // 32 bit + return static::createFromTimestamp(~PHP_INT_MAX); // @codeCoverageIgnore + } + + // 64 bit + return static::create(1, 1, 1, 0, 0, 0); + } + + private static function assertBetween($unit, $value, $min, $max) + { + if (static::isStrictModeEnabled() && ($value < $min || $value > $max)) { + throw new OutOfRangeException($unit, $min, $max, $value); + } + } + + private static function createNowInstance($tz) + { + if (!static::hasTestNow()) { + return static::now($tz); + } + + $now = static::getTestNow(); + + if ($now instanceof Closure) { + return $now(static::now($tz)); + } + + return $now->avoidMutation()->tz($tz); + } + + /** + * Create a new Carbon instance from a specific date and time. + * + * If any of $year, $month or $day are set to null their now() values will + * be used. + * + * If $hour is null it will be set to its now() value and the default + * values for $minute and $second will be their now() values. + * + * If $hour is not null then the default values for $minute and $second + * will be 0. + * + * @param int|null $year + * @param int|null $month + * @param int|null $day + * @param int|null $hour + * @param int|null $minute + * @param int|null $second + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + * + * @return static|false + */ + public static function create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $tz = null) + { + if ((\is_string($year) && !is_numeric($year)) || $year instanceof DateTimeInterface) { + return static::parse($year, $tz ?: (\is_string($month) || $month instanceof DateTimeZone ? $month : null)); + } + + $defaults = null; + $getDefault = function ($unit) use ($tz, &$defaults) { + if ($defaults === null) { + $now = self::createNowInstance($tz); + + $defaults = array_combine([ + 'year', + 'month', + 'day', + 'hour', + 'minute', + 'second', + ], explode('-', $now->rawFormat('Y-n-j-G-i-s.u'))); + } + + return $defaults[$unit]; + }; + + $year = $year ?? $getDefault('year'); + $month = $month ?? $getDefault('month'); + $day = $day ?? $getDefault('day'); + $hour = $hour ?? $getDefault('hour'); + $minute = $minute ?? $getDefault('minute'); + $second = (float) ($second ?? $getDefault('second')); + + self::assertBetween('month', $month, 0, 99); + self::assertBetween('day', $day, 0, 99); + self::assertBetween('hour', $hour, 0, 99); + self::assertBetween('minute', $minute, 0, 99); + self::assertBetween('second', $second, 0, 99); + + $fixYear = null; + + if ($year < 0) { + $fixYear = $year; + $year = 0; + } elseif ($year > 9999) { + $fixYear = $year - 9999; + $year = 9999; + } + + $second = ($second < 10 ? '0' : '').number_format($second, 6); + $instance = static::rawCreateFromFormat('!Y-n-j G:i:s.u', sprintf('%s-%s-%s %s:%02s:%02s', $year, $month, $day, $hour, $minute, $second), $tz); + + if ($fixYear !== null) { + $instance = $instance->addYears($fixYear); + } + + return $instance; + } + + /** + * Create a new safe Carbon instance from a specific date and time. + * + * If any of $year, $month or $day are set to null their now() values will + * be used. + * + * If $hour is null it will be set to its now() value and the default + * values for $minute and $second will be their now() values. + * + * If $hour is not null then the default values for $minute and $second + * will be 0. + * + * If one of the set values is not valid, an InvalidDateException + * will be thrown. + * + * @param int|null $year + * @param int|null $month + * @param int|null $day + * @param int|null $hour + * @param int|null $minute + * @param int|null $second + * @param DateTimeZone|string|null $tz + * + * @throws InvalidDateException + * + * @return static|false + */ + public static function createSafe($year = null, $month = null, $day = null, $hour = null, $minute = null, $second = null, $tz = null) + { + $fields = static::getRangesByUnit(); + + foreach ($fields as $field => $range) { + if ($$field !== null && (!\is_int($$field) || $$field < $range[0] || $$field > $range[1])) { + if (static::isStrictModeEnabled()) { + throw new InvalidDateException($field, $$field); + } + + return false; + } + } + + $instance = static::create($year, $month, $day, $hour, $minute, $second, $tz); + + foreach (array_reverse($fields) as $field => $range) { + if ($$field !== null && (!\is_int($$field) || $$field !== $instance->$field)) { + if (static::isStrictModeEnabled()) { + throw new InvalidDateException($field, $$field); + } + + return false; + } + } + + return $instance; + } + + /** + * Create a new Carbon instance from a specific date and time using strict validation. + * + * @see create() + * + * @param int|null $year + * @param int|null $month + * @param int|null $day + * @param int|null $hour + * @param int|null $minute + * @param int|null $second + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + * + * @return static + */ + public static function createStrict(?int $year = 0, ?int $month = 1, ?int $day = 1, ?int $hour = 0, ?int $minute = 0, ?int $second = 0, $tz = null): self + { + $initialStrictMode = static::isStrictModeEnabled(); + static::useStrictMode(true); + + try { + $date = static::create($year, $month, $day, $hour, $minute, $second, $tz); + } finally { + static::useStrictMode($initialStrictMode); + } + + return $date; + } + + /** + * Create a Carbon instance from just a date. The time portion is set to now. + * + * @param int|null $year + * @param int|null $month + * @param int|null $day + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + * + * @return static + */ + public static function createFromDate($year = null, $month = null, $day = null, $tz = null) + { + return static::create($year, $month, $day, null, null, null, $tz); + } + + /** + * Create a Carbon instance from just a date. The time portion is set to midnight. + * + * @param int|null $year + * @param int|null $month + * @param int|null $day + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + * + * @return static + */ + public static function createMidnightDate($year = null, $month = null, $day = null, $tz = null) + { + return static::create($year, $month, $day, 0, 0, 0, $tz); + } + + /** + * Create a Carbon instance from just a time. The date portion is set to today. + * + * @param int|null $hour + * @param int|null $minute + * @param int|null $second + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + * + * @return static + */ + public static function createFromTime($hour = 0, $minute = 0, $second = 0, $tz = null) + { + return static::create(null, null, null, $hour, $minute, $second, $tz); + } + + /** + * Create a Carbon instance from a time string. The date portion is set to today. + * + * @param string $time + * @param DateTimeZone|string|null $tz + * + * @throws InvalidFormatException + * + * @return static + */ + public static function createFromTimeString($time, $tz = null) + { + return static::today($tz)->setTimeFromTimeString($time); + } + + /** + * @param string $format Datetime format + * @param string $time + * @param DateTimeZone|string|false|null $originalTz + * + * @return DateTimeInterface|false + */ + private static function createFromFormatAndTimezone($format, $time, $originalTz) + { + // Work-around for https://bugs.php.net/bug.php?id=75577 + // @codeCoverageIgnoreStart + if (version_compare(PHP_VERSION, '7.3.0-dev', '<')) { + $format = str_replace('.v', '.u', $format); + } + // @codeCoverageIgnoreEnd + + if ($originalTz === null) { + return parent::createFromFormat($format, (string) $time); + } + + $tz = \is_int($originalTz) + ? @timezone_name_from_abbr('', (int) ($originalTz * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE), 1) + : $originalTz; + + $tz = static::safeCreateDateTimeZone($tz, $originalTz); + + if ($tz === false) { + return false; + } + + return parent::createFromFormat($format, (string) $time, $tz); + } + + /** + * Create a Carbon instance from a specific format. + * + * @param string $format Datetime format + * @param string $time + * @param DateTimeZone|string|false|null $tz + * + * @throws InvalidFormatException + * + * @return static|false + */ + public static function rawCreateFromFormat($format, $time, $tz = null) + { + // Work-around for https://bugs.php.net/bug.php?id=80141 + $format = preg_replace('/(?<!\\\\)((?:\\\\{2})*)c/', '$1Y-m-d\TH:i:sP', $format); + + if (preg_match('/(?<!\\\\)(?:\\\\{2})*(a|A)/', $format, $aMatches, PREG_OFFSET_CAPTURE) && + preg_match('/(?<!\\\\)(?:\\\\{2})*(h|g|H|G)/', $format, $hMatches, PREG_OFFSET_CAPTURE) && + $aMatches[1][1] < $hMatches[1][1] && + preg_match('/(am|pm|AM|PM)/', $time) + ) { + $format = preg_replace('/^(.*)(?<!\\\\)((?:\\\\{2})*)(a|A)(.*)$/U', '$1$2$4 $3', $format); + $time = preg_replace('/^(.*)(am|pm|AM|PM)(.*)$/U', '$1$3 $2', $time); + } + + // First attempt to create an instance, so that error messages are based on the unmodified format. + $date = self::createFromFormatAndTimezone($format, $time, $tz); + $lastErrors = parent::getLastErrors(); + /** @var \Carbon\CarbonImmutable|\Carbon\Carbon|null $mock */ + $mock = static::getMockedTestNow($tz); + + if ($mock && $date instanceof DateTimeInterface) { + // Set timezone from mock if custom timezone was neither given directly nor as a part of format. + // First let's skip the part that will be ignored by the parser. + $nonEscaped = '(?<!\\\\)(\\\\{2})*'; + + $nonIgnored = preg_replace("/^.*{$nonEscaped}!/s", '', $format); + + if ($tz === null && !preg_match("/{$nonEscaped}[eOPT]/", $nonIgnored)) { + $tz = clone $mock->getTimezone(); + } + + // Set microseconds to zero to match behavior of DateTime::createFromFormat() + // See https://bugs.php.net/bug.php?id=74332 + $mock = $mock->copy()->microsecond(0); + + // Prepend mock datetime only if the format does not contain non escaped unix epoch reset flag. + if (!preg_match("/{$nonEscaped}[!|]/", $format)) { + $format = static::MOCK_DATETIME_FORMAT.' '.$format; + $time = ($mock instanceof self ? $mock->rawFormat(static::MOCK_DATETIME_FORMAT) : $mock->format(static::MOCK_DATETIME_FORMAT)).' '.$time; + } + + // Regenerate date from the modified format to base result on the mocked instance instead of now. + $date = self::createFromFormatAndTimezone($format, $time, $tz); + } + + if ($date instanceof DateTimeInterface) { + $instance = static::instance($date); + $instance::setLastErrors($lastErrors); + + return $instance; + } + + if (static::isStrictModeEnabled()) { + throw new InvalidFormatException(implode(PHP_EOL, $lastErrors['errors'])); + } + + return false; + } + + /** + * Create a Carbon instance from a specific format. + * + * @param string $format Datetime format + * @param string $time + * @param DateTimeZone|string|false|null $tz + * + * @throws InvalidFormatException + * + * @return static|false + */ + #[ReturnTypeWillChange] + public static function createFromFormat($format, $time, $tz = null) + { + $function = static::$createFromFormatFunction; + + if (!$function) { + return static::rawCreateFromFormat($format, $time, $tz); + } + + if (\is_string($function) && method_exists(static::class, $function)) { + $function = [static::class, $function]; + } + + return $function(...\func_get_args()); + } + + /** + * Create a Carbon instance from a specific ISO format (same replacements as ->isoFormat()). + * + * @param string $format Datetime format + * @param string $time + * @param DateTimeZone|string|false|null $tz optional timezone + * @param string|null $locale locale to be used for LTS, LT, LL, LLL, etc. macro-formats (en by fault, unneeded if no such macro-format in use) + * @param \Symfony\Component\Translation\TranslatorInterface $translator optional custom translator to use for macro-formats + * + * @throws InvalidFormatException + * + * @return static|false + */ + public static function createFromIsoFormat($format, $time, $tz = null, $locale = 'en', $translator = null) + { + $format = preg_replace_callback('/(?<!\\\\)(\\\\{2})*(LTS|LT|[Ll]{1,4})/', function ($match) use ($locale, $translator) { + [$code] = $match; + + static $formats = null; + + if ($formats === null) { + $translator = $translator ?: Translator::get($locale); + + $formats = [ + 'LT' => static::getTranslationMessageWith($translator, 'formats.LT', $locale, 'h:mm A'), + 'LTS' => static::getTranslationMessageWith($translator, 'formats.LTS', $locale, 'h:mm:ss A'), + 'L' => static::getTranslationMessageWith($translator, 'formats.L', $locale, 'MM/DD/YYYY'), + 'LL' => static::getTranslationMessageWith($translator, 'formats.LL', $locale, 'MMMM D, YYYY'), + 'LLL' => static::getTranslationMessageWith($translator, 'formats.LLL', $locale, 'MMMM D, YYYY h:mm A'), + 'LLLL' => static::getTranslationMessageWith($translator, 'formats.LLLL', $locale, 'dddd, MMMM D, YYYY h:mm A'), + ]; + } + + return $formats[$code] ?? preg_replace_callback( + '/MMMM|MM|DD|dddd/', + function ($code) { + return mb_substr($code[0], 1); + }, + $formats[strtoupper($code)] ?? '' + ); + }, $format); + + $format = preg_replace_callback('/(?<!\\\\)(\\\\{2})*('.CarbonInterface::ISO_FORMAT_REGEXP.'|[A-Za-z])/', function ($match) { + [$code] = $match; + + static $replacements = null; + + if ($replacements === null) { + $replacements = [ + 'OD' => 'd', + 'OM' => 'M', + 'OY' => 'Y', + 'OH' => 'G', + 'Oh' => 'g', + 'Om' => 'i', + 'Os' => 's', + 'D' => 'd', + 'DD' => 'd', + 'Do' => 'd', + 'd' => '!', + 'dd' => '!', + 'ddd' => 'D', + 'dddd' => 'D', + 'DDD' => 'z', + 'DDDD' => 'z', + 'DDDo' => 'z', + 'e' => '!', + 'E' => '!', + 'H' => 'G', + 'HH' => 'H', + 'h' => 'g', + 'hh' => 'h', + 'k' => 'G', + 'kk' => 'G', + 'hmm' => 'gi', + 'hmmss' => 'gis', + 'Hmm' => 'Gi', + 'Hmmss' => 'Gis', + 'm' => 'i', + 'mm' => 'i', + 'a' => 'a', + 'A' => 'a', + 's' => 's', + 'ss' => 's', + 'S' => '*', + 'SS' => '*', + 'SSS' => '*', + 'SSSS' => '*', + 'SSSSS' => '*', + 'SSSSSS' => 'u', + 'SSSSSSS' => 'u*', + 'SSSSSSSS' => 'u*', + 'SSSSSSSSS' => 'u*', + 'M' => 'm', + 'MM' => 'm', + 'MMM' => 'M', + 'MMMM' => 'M', + 'Mo' => 'm', + 'Q' => '!', + 'Qo' => '!', + 'G' => '!', + 'GG' => '!', + 'GGG' => '!', + 'GGGG' => '!', + 'GGGGG' => '!', + 'g' => '!', + 'gg' => '!', + 'ggg' => '!', + 'gggg' => '!', + 'ggggg' => '!', + 'W' => '!', + 'WW' => '!', + 'Wo' => '!', + 'w' => '!', + 'ww' => '!', + 'wo' => '!', + 'x' => 'U???', + 'X' => 'U', + 'Y' => 'Y', + 'YY' => 'y', + 'YYYY' => 'Y', + 'YYYYY' => 'Y', + 'YYYYYY' => 'Y', + 'z' => 'e', + 'zz' => 'e', + 'Z' => 'e', + 'ZZ' => 'e', + ]; + } + + $format = $replacements[$code] ?? '?'; + + if ($format === '!') { + throw new InvalidFormatException("Format $code not supported for creation."); + } + + return $format; + }, $format); + + return static::rawCreateFromFormat($format, $time, $tz); + } + + /** + * Create a Carbon instance from a specific format and a string in a given language. + * + * @param string $format Datetime format + * @param string $locale + * @param string $time + * @param DateTimeZone|string|false|null $tz + * + * @throws InvalidFormatException + * + * @return static|false + */ + public static function createFromLocaleFormat($format, $locale, $time, $tz = null) + { + return static::rawCreateFromFormat($format, static::translateTimeString($time, $locale, 'en'), $tz); + } + + /** + * Create a Carbon instance from a specific ISO format and a string in a given language. + * + * @param string $format Datetime ISO format + * @param string $locale + * @param string $time + * @param DateTimeZone|string|false|null $tz + * + * @throws InvalidFormatException + * + * @return static|false + */ + public static function createFromLocaleIsoFormat($format, $locale, $time, $tz = null) + { + $time = static::translateTimeString($time, $locale, 'en', CarbonInterface::TRANSLATE_MONTHS | CarbonInterface::TRANSLATE_DAYS | CarbonInterface::TRANSLATE_MERIDIEM); + + return static::createFromIsoFormat($format, $time, $tz, $locale); + } + + /** + * Make a Carbon instance from given variable if possible. + * + * Always return a new instance. Parse only strings and only these likely to be dates (skip intervals + * and recurrences). Throw an exception for invalid format, but otherwise return null. + * + * @param mixed $var + * + * @throws InvalidFormatException + * + * @return static|null + */ + public static function make($var) + { + if ($var instanceof DateTimeInterface) { + return static::instance($var); + } + + $date = null; + + if (\is_string($var)) { + $var = trim($var); + + if (!preg_match('/^P[\dT]/', $var) && + !preg_match('/^R\d/', $var) && + preg_match('/[a-z\d]/i', $var) + ) { + $date = static::parse($var); + } + } + + return $date; + } + + /** + * Set last errors. + * + * @param array|bool $lastErrors + * + * @return void + */ + private static function setLastErrors($lastErrors) + { + if (\is_array($lastErrors) || $lastErrors === false) { + static::$lastErrors = \is_array($lastErrors) ? $lastErrors : [ + 'warning_count' => 0, + 'warnings' => [], + 'error_count' => 0, + 'errors' => [], + ]; + } + } + + /** + * {@inheritdoc} + * + * @return array + */ + #[ReturnTypeWillChange] + public static function getLastErrors() + { + return static::$lastErrors; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Date.php b/vendor/nesbot/carbon/src/Carbon/Traits/Date.php new file mode 100644 index 0000000..da3775c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Date.php @@ -0,0 +1,2746 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use BadMethodCallException; +use Carbon\Carbon; +use Carbon\CarbonInterface; +use Carbon\CarbonPeriod; +use Carbon\CarbonTimeZone; +use Carbon\Exceptions\BadComparisonUnitException; +use Carbon\Exceptions\ImmutableException; +use Carbon\Exceptions\InvalidTimeZoneException; +use Carbon\Exceptions\InvalidTypeException; +use Carbon\Exceptions\UnknownGetterException; +use Carbon\Exceptions\UnknownMethodException; +use Carbon\Exceptions\UnknownSetterException; +use Carbon\Exceptions\UnknownUnitException; +use Closure; +use DateInterval; +use DatePeriod; +use DateTime; +use DateTimeImmutable; +use DateTimeInterface; +use DateTimeZone; +use InvalidArgumentException; +use ReflectionException; +use ReturnTypeWillChange; +use Throwable; + +/** + * A simple API extension for DateTime. + * + * @mixin DeprecatedProperties + * + * <autodoc generated by `composer phpdoc`> + * + * @property int $year + * @property int $yearIso + * @property int $month + * @property int $day + * @property int $hour + * @property int $minute + * @property int $second + * @property int $micro + * @property int $microsecond + * @property int|float|string $timestamp seconds since the Unix Epoch + * @property string $englishDayOfWeek the day of week in English + * @property string $shortEnglishDayOfWeek the abbreviated day of week in English + * @property string $englishMonth the month in English + * @property string $shortEnglishMonth the abbreviated month in English + * @property int $milliseconds + * @property int $millisecond + * @property int $milli + * @property int $week 1 through 53 + * @property int $isoWeek 1 through 53 + * @property int $weekYear year according to week format + * @property int $isoWeekYear year according to ISO week format + * @property int $dayOfYear 1 through 366 + * @property int $age does a diffInYears() with default parameters + * @property int $offset the timezone offset in seconds from UTC + * @property int $offsetMinutes the timezone offset in minutes from UTC + * @property int $offsetHours the timezone offset in hours from UTC + * @property CarbonTimeZone $timezone the current timezone + * @property CarbonTimeZone $tz alias of $timezone + * @property-read int $dayOfWeek 0 (for Sunday) through 6 (for Saturday) + * @property-read int $dayOfWeekIso 1 (for Monday) through 7 (for Sunday) + * @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday + * @property-read int $daysInMonth number of days in the given month + * @property-read string $latinMeridiem "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) + * @property-read string $latinUpperMeridiem "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) + * @property-read string $timezoneAbbreviatedName the current timezone abbreviated name + * @property-read string $tzAbbrName alias of $timezoneAbbreviatedName + * @property-read string $dayName long name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortDayName short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $minDayName very short name of weekday translated according to Carbon locale, in english if no translation available for current language + * @property-read string $monthName long name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $shortMonthName short name of month translated according to Carbon locale, in english if no translation available for current language + * @property-read string $meridiem lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read string $upperMeridiem uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + * @property-read int $noZeroHour current hour from 1 to 24 + * @property-read int $weeksInYear 51 through 53 + * @property-read int $isoWeeksInYear 51 through 53 + * @property-read int $weekOfMonth 1 through 5 + * @property-read int $weekNumberInMonth 1 through 5 + * @property-read int $firstWeekDay 0 through 6 + * @property-read int $lastWeekDay 0 through 6 + * @property-read int $daysInYear 365 or 366 + * @property-read int $quarter the quarter of this instance, 1 - 4 + * @property-read int $decade the decade of this instance + * @property-read int $century the century of this instance + * @property-read int $millennium the millennium of this instance + * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise + * @property-read bool $local checks if the timezone is local, true if local, false otherwise + * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise + * @property-read string $timezoneName the current timezone name + * @property-read string $tzName alias of $timezoneName + * @property-read string $locale locale of the current instance + * + * @method bool isUtc() Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) + * @method bool isLocal() Check if the current instance has non-UTC timezone. + * @method bool isValid() Check if the current instance is a valid date. + * @method bool isDST() Check if the current instance is in a daylight saving time. + * @method bool isSunday() Checks if the instance day is sunday. + * @method bool isMonday() Checks if the instance day is monday. + * @method bool isTuesday() Checks if the instance day is tuesday. + * @method bool isWednesday() Checks if the instance day is wednesday. + * @method bool isThursday() Checks if the instance day is thursday. + * @method bool isFriday() Checks if the instance day is friday. + * @method bool isSaturday() Checks if the instance day is saturday. + * @method bool isSameYear(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same year as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentYear() Checks if the instance is in the same year as the current moment. + * @method bool isNextYear() Checks if the instance is in the same year as the current moment next year. + * @method bool isLastYear() Checks if the instance is in the same year as the current moment last year. + * @method bool isSameWeek(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same week as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentWeek() Checks if the instance is in the same week as the current moment. + * @method bool isNextWeek() Checks if the instance is in the same week as the current moment next week. + * @method bool isLastWeek() Checks if the instance is in the same week as the current moment last week. + * @method bool isSameDay(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same day as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDay() Checks if the instance is in the same day as the current moment. + * @method bool isNextDay() Checks if the instance is in the same day as the current moment next day. + * @method bool isLastDay() Checks if the instance is in the same day as the current moment last day. + * @method bool isSameHour(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same hour as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentHour() Checks if the instance is in the same hour as the current moment. + * @method bool isNextHour() Checks if the instance is in the same hour as the current moment next hour. + * @method bool isLastHour() Checks if the instance is in the same hour as the current moment last hour. + * @method bool isSameMinute(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same minute as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMinute() Checks if the instance is in the same minute as the current moment. + * @method bool isNextMinute() Checks if the instance is in the same minute as the current moment next minute. + * @method bool isLastMinute() Checks if the instance is in the same minute as the current moment last minute. + * @method bool isSameSecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same second as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentSecond() Checks if the instance is in the same second as the current moment. + * @method bool isNextSecond() Checks if the instance is in the same second as the current moment next second. + * @method bool isLastSecond() Checks if the instance is in the same second as the current moment last second. + * @method bool isSameMicro(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicro() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicro() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicro() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isSameMicrosecond(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same microsecond as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMicrosecond() Checks if the instance is in the same microsecond as the current moment. + * @method bool isNextMicrosecond() Checks if the instance is in the same microsecond as the current moment next microsecond. + * @method bool isLastMicrosecond() Checks if the instance is in the same microsecond as the current moment last microsecond. + * @method bool isCurrentMonth() Checks if the instance is in the same month as the current moment. + * @method bool isNextMonth() Checks if the instance is in the same month as the current moment next month. + * @method bool isLastMonth() Checks if the instance is in the same month as the current moment last month. + * @method bool isCurrentQuarter() Checks if the instance is in the same quarter as the current moment. + * @method bool isNextQuarter() Checks if the instance is in the same quarter as the current moment next quarter. + * @method bool isLastQuarter() Checks if the instance is in the same quarter as the current moment last quarter. + * @method bool isSameDecade(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same decade as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentDecade() Checks if the instance is in the same decade as the current moment. + * @method bool isNextDecade() Checks if the instance is in the same decade as the current moment next decade. + * @method bool isLastDecade() Checks if the instance is in the same decade as the current moment last decade. + * @method bool isSameCentury(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same century as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentCentury() Checks if the instance is in the same century as the current moment. + * @method bool isNextCentury() Checks if the instance is in the same century as the current moment next century. + * @method bool isLastCentury() Checks if the instance is in the same century as the current moment last century. + * @method bool isSameMillennium(Carbon|DateTimeInterface|string|null $date = null) Checks if the given date is in the same millennium as the instance. If null passed, compare to now (with the same timezone). + * @method bool isCurrentMillennium() Checks if the instance is in the same millennium as the current moment. + * @method bool isNextMillennium() Checks if the instance is in the same millennium as the current moment next millennium. + * @method bool isLastMillennium() Checks if the instance is in the same millennium as the current moment last millennium. + * @method CarbonInterface years(int $value) Set current instance year to the given value. + * @method CarbonInterface year(int $value) Set current instance year to the given value. + * @method CarbonInterface setYears(int $value) Set current instance year to the given value. + * @method CarbonInterface setYear(int $value) Set current instance year to the given value. + * @method CarbonInterface months(int $value) Set current instance month to the given value. + * @method CarbonInterface month(int $value) Set current instance month to the given value. + * @method CarbonInterface setMonths(int $value) Set current instance month to the given value. + * @method CarbonInterface setMonth(int $value) Set current instance month to the given value. + * @method CarbonInterface days(int $value) Set current instance day to the given value. + * @method CarbonInterface day(int $value) Set current instance day to the given value. + * @method CarbonInterface setDays(int $value) Set current instance day to the given value. + * @method CarbonInterface setDay(int $value) Set current instance day to the given value. + * @method CarbonInterface hours(int $value) Set current instance hour to the given value. + * @method CarbonInterface hour(int $value) Set current instance hour to the given value. + * @method CarbonInterface setHours(int $value) Set current instance hour to the given value. + * @method CarbonInterface setHour(int $value) Set current instance hour to the given value. + * @method CarbonInterface minutes(int $value) Set current instance minute to the given value. + * @method CarbonInterface minute(int $value) Set current instance minute to the given value. + * @method CarbonInterface setMinutes(int $value) Set current instance minute to the given value. + * @method CarbonInterface setMinute(int $value) Set current instance minute to the given value. + * @method CarbonInterface seconds(int $value) Set current instance second to the given value. + * @method CarbonInterface second(int $value) Set current instance second to the given value. + * @method CarbonInterface setSeconds(int $value) Set current instance second to the given value. + * @method CarbonInterface setSecond(int $value) Set current instance second to the given value. + * @method CarbonInterface millis(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface milli(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface setMillis(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface setMilli(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface milliseconds(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface millisecond(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface setMilliseconds(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface setMillisecond(int $value) Set current instance millisecond to the given value. + * @method CarbonInterface micros(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface micro(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface setMicros(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface setMicro(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface microseconds(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface microsecond(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface setMicroseconds(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface setMicrosecond(int $value) Set current instance microsecond to the given value. + * @method CarbonInterface addYears(int $value = 1) Add years (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addYear() Add one year to the instance (using date interval). + * @method CarbonInterface subYears(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subYear() Sub one year to the instance (using date interval). + * @method CarbonInterface addYearsWithOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addYearWithOverflow() Add one year to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subYearsWithOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subYearWithOverflow() Sub one year to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addYearsWithoutOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearWithoutOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearsWithoutOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearWithoutOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearsWithNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearWithNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearsWithNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearWithNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearsNoOverflow(int $value = 1) Add years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addYearNoOverflow() Add one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearsNoOverflow(int $value = 1) Sub years (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subYearNoOverflow() Sub one year to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonths(int $value = 1) Add months (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMonth() Add one month to the instance (using date interval). + * @method CarbonInterface subMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMonth() Sub one month to the instance (using date interval). + * @method CarbonInterface addMonthsWithOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addMonthWithOverflow() Add one month to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subMonthsWithOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subMonthWithOverflow() Sub one month to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addMonthsWithoutOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthWithoutOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthsWithoutOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthWithoutOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthsWithNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthWithNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthsWithNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthWithNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthsNoOverflow(int $value = 1) Add months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMonthNoOverflow() Add one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthsNoOverflow(int $value = 1) Sub months (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMonthNoOverflow() Sub one month to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDays(int $value = 1) Add days (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addDay() Add one day to the instance (using date interval). + * @method CarbonInterface subDays(int $value = 1) Sub days (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subDay() Sub one day to the instance (using date interval). + * @method CarbonInterface addHours(int $value = 1) Add hours (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addHour() Add one hour to the instance (using date interval). + * @method CarbonInterface subHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subHour() Sub one hour to the instance (using date interval). + * @method CarbonInterface addMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMinute() Add one minute to the instance (using date interval). + * @method CarbonInterface subMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMinute() Sub one minute to the instance (using date interval). + * @method CarbonInterface addSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addSecond() Add one second to the instance (using date interval). + * @method CarbonInterface subSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subSecond() Sub one second to the instance (using date interval). + * @method CarbonInterface addMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMilli() Add one millisecond to the instance (using date interval). + * @method CarbonInterface subMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMilli() Sub one millisecond to the instance (using date interval). + * @method CarbonInterface addMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMillisecond() Add one millisecond to the instance (using date interval). + * @method CarbonInterface subMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMillisecond() Sub one millisecond to the instance (using date interval). + * @method CarbonInterface addMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMicro() Add one microsecond to the instance (using date interval). + * @method CarbonInterface subMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMicro() Sub one microsecond to the instance (using date interval). + * @method CarbonInterface addMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMicrosecond() Add one microsecond to the instance (using date interval). + * @method CarbonInterface subMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMicrosecond() Sub one microsecond to the instance (using date interval). + * @method CarbonInterface addMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addMillennium() Add one millennium to the instance (using date interval). + * @method CarbonInterface subMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subMillennium() Sub one millennium to the instance (using date interval). + * @method CarbonInterface addMillenniaWithOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addMillenniumWithOverflow() Add one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subMillenniaWithOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subMillenniumWithOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addMillenniaWithoutOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniumWithoutOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniaWithoutOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniumWithoutOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniaWithNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniumWithNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniaWithNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniumWithNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniaNoOverflow(int $value = 1) Add millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addMillenniumNoOverflow() Add one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniaNoOverflow(int $value = 1) Sub millennia (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subMillenniumNoOverflow() Sub one millennium to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addCentury() Add one century to the instance (using date interval). + * @method CarbonInterface subCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subCentury() Sub one century to the instance (using date interval). + * @method CarbonInterface addCenturiesWithOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addCenturyWithOverflow() Add one century to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subCenturiesWithOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subCenturyWithOverflow() Sub one century to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addCenturiesWithoutOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturyWithoutOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturiesWithoutOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturyWithoutOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturiesWithNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturyWithNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturiesWithNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturyWithNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturiesNoOverflow(int $value = 1) Add centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addCenturyNoOverflow() Add one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturiesNoOverflow(int $value = 1) Sub centuries (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subCenturyNoOverflow() Sub one century to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addDecade() Add one decade to the instance (using date interval). + * @method CarbonInterface subDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subDecade() Sub one decade to the instance (using date interval). + * @method CarbonInterface addDecadesWithOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addDecadeWithOverflow() Add one decade to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subDecadesWithOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subDecadeWithOverflow() Sub one decade to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addDecadesWithoutOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadeWithoutOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadesWithoutOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadeWithoutOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadesWithNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadeWithNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadesWithNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadeWithNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadesNoOverflow(int $value = 1) Add decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addDecadeNoOverflow() Add one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadesNoOverflow(int $value = 1) Sub decades (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subDecadeNoOverflow() Sub one decade to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addQuarter() Add one quarter to the instance (using date interval). + * @method CarbonInterface subQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subQuarter() Sub one quarter to the instance (using date interval). + * @method CarbonInterface addQuartersWithOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addQuarterWithOverflow() Add one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subQuartersWithOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface subQuarterWithOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly allowed. + * @method CarbonInterface addQuartersWithoutOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuarterWithoutOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuartersWithoutOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuarterWithoutOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuartersWithNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuarterWithNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuartersWithNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuarterWithNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuartersNoOverflow(int $value = 1) Add quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addQuarterNoOverflow() Add one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuartersNoOverflow(int $value = 1) Sub quarters (the $value count passed in) to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface subQuarterNoOverflow() Sub one quarter to the instance (using date interval) with overflow explicitly forbidden. + * @method CarbonInterface addWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addWeek() Add one week to the instance (using date interval). + * @method CarbonInterface subWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subWeek() Sub one week to the instance (using date interval). + * @method CarbonInterface addWeekdays(int $value = 1) Add weekdays (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface addWeekday() Add one weekday to the instance (using date interval). + * @method CarbonInterface subWeekdays(int $value = 1) Sub weekdays (the $value count passed in) to the instance (using date interval). + * @method CarbonInterface subWeekday() Sub one weekday to the instance (using date interval). + * @method CarbonInterface addRealMicros(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealMicro() Add one microsecond to the instance (using timestamp). + * @method CarbonInterface subRealMicros(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealMicro() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method CarbonInterface addRealMicroseconds(int $value = 1) Add microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealMicrosecond() Add one microsecond to the instance (using timestamp). + * @method CarbonInterface subRealMicroseconds(int $value = 1) Sub microseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealMicrosecond() Sub one microsecond to the instance (using timestamp). + * @method CarbonPeriod microsecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each microsecond or every X microseconds if a factor is given. + * @method CarbonInterface addRealMillis(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealMilli() Add one millisecond to the instance (using timestamp). + * @method CarbonInterface subRealMillis(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealMilli() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method CarbonInterface addRealMilliseconds(int $value = 1) Add milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealMillisecond() Add one millisecond to the instance (using timestamp). + * @method CarbonInterface subRealMilliseconds(int $value = 1) Sub milliseconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealMillisecond() Sub one millisecond to the instance (using timestamp). + * @method CarbonPeriod millisecondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millisecond or every X milliseconds if a factor is given. + * @method CarbonInterface addRealSeconds(int $value = 1) Add seconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealSecond() Add one second to the instance (using timestamp). + * @method CarbonInterface subRealSeconds(int $value = 1) Sub seconds (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealSecond() Sub one second to the instance (using timestamp). + * @method CarbonPeriod secondsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each second or every X seconds if a factor is given. + * @method CarbonInterface addRealMinutes(int $value = 1) Add minutes (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealMinute() Add one minute to the instance (using timestamp). + * @method CarbonInterface subRealMinutes(int $value = 1) Sub minutes (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealMinute() Sub one minute to the instance (using timestamp). + * @method CarbonPeriod minutesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each minute or every X minutes if a factor is given. + * @method CarbonInterface addRealHours(int $value = 1) Add hours (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealHour() Add one hour to the instance (using timestamp). + * @method CarbonInterface subRealHours(int $value = 1) Sub hours (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealHour() Sub one hour to the instance (using timestamp). + * @method CarbonPeriod hoursUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each hour or every X hours if a factor is given. + * @method CarbonInterface addRealDays(int $value = 1) Add days (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealDay() Add one day to the instance (using timestamp). + * @method CarbonInterface subRealDays(int $value = 1) Sub days (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealDay() Sub one day to the instance (using timestamp). + * @method CarbonPeriod daysUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each day or every X days if a factor is given. + * @method CarbonInterface addRealWeeks(int $value = 1) Add weeks (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealWeek() Add one week to the instance (using timestamp). + * @method CarbonInterface subRealWeeks(int $value = 1) Sub weeks (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealWeek() Sub one week to the instance (using timestamp). + * @method CarbonPeriod weeksUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each week or every X weeks if a factor is given. + * @method CarbonInterface addRealMonths(int $value = 1) Add months (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealMonth() Add one month to the instance (using timestamp). + * @method CarbonInterface subRealMonths(int $value = 1) Sub months (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealMonth() Sub one month to the instance (using timestamp). + * @method CarbonPeriod monthsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each month or every X months if a factor is given. + * @method CarbonInterface addRealQuarters(int $value = 1) Add quarters (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealQuarter() Add one quarter to the instance (using timestamp). + * @method CarbonInterface subRealQuarters(int $value = 1) Sub quarters (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealQuarter() Sub one quarter to the instance (using timestamp). + * @method CarbonPeriod quartersUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each quarter or every X quarters if a factor is given. + * @method CarbonInterface addRealYears(int $value = 1) Add years (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealYear() Add one year to the instance (using timestamp). + * @method CarbonInterface subRealYears(int $value = 1) Sub years (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealYear() Sub one year to the instance (using timestamp). + * @method CarbonPeriod yearsUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each year or every X years if a factor is given. + * @method CarbonInterface addRealDecades(int $value = 1) Add decades (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealDecade() Add one decade to the instance (using timestamp). + * @method CarbonInterface subRealDecades(int $value = 1) Sub decades (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealDecade() Sub one decade to the instance (using timestamp). + * @method CarbonPeriod decadesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each decade or every X decades if a factor is given. + * @method CarbonInterface addRealCenturies(int $value = 1) Add centuries (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealCentury() Add one century to the instance (using timestamp). + * @method CarbonInterface subRealCenturies(int $value = 1) Sub centuries (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealCentury() Sub one century to the instance (using timestamp). + * @method CarbonPeriod centuriesUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each century or every X centuries if a factor is given. + * @method CarbonInterface addRealMillennia(int $value = 1) Add millennia (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface addRealMillennium() Add one millennium to the instance (using timestamp). + * @method CarbonInterface subRealMillennia(int $value = 1) Sub millennia (the $value count passed in) to the instance (using timestamp). + * @method CarbonInterface subRealMillennium() Sub one millennium to the instance (using timestamp). + * @method CarbonPeriod millenniaUntil($endDate = null, int $factor = 1) Return an iterable period from current date to given end (string, DateTime or Carbon instance) for each millennium or every X millennia if a factor is given. + * @method CarbonInterface roundYear(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method CarbonInterface roundYears(float $precision = 1, string $function = "round") Round the current instance year with given precision using the given function. + * @method CarbonInterface floorYear(float $precision = 1) Truncate the current instance year with given precision. + * @method CarbonInterface floorYears(float $precision = 1) Truncate the current instance year with given precision. + * @method CarbonInterface ceilYear(float $precision = 1) Ceil the current instance year with given precision. + * @method CarbonInterface ceilYears(float $precision = 1) Ceil the current instance year with given precision. + * @method CarbonInterface roundMonth(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method CarbonInterface roundMonths(float $precision = 1, string $function = "round") Round the current instance month with given precision using the given function. + * @method CarbonInterface floorMonth(float $precision = 1) Truncate the current instance month with given precision. + * @method CarbonInterface floorMonths(float $precision = 1) Truncate the current instance month with given precision. + * @method CarbonInterface ceilMonth(float $precision = 1) Ceil the current instance month with given precision. + * @method CarbonInterface ceilMonths(float $precision = 1) Ceil the current instance month with given precision. + * @method CarbonInterface roundDay(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method CarbonInterface roundDays(float $precision = 1, string $function = "round") Round the current instance day with given precision using the given function. + * @method CarbonInterface floorDay(float $precision = 1) Truncate the current instance day with given precision. + * @method CarbonInterface floorDays(float $precision = 1) Truncate the current instance day with given precision. + * @method CarbonInterface ceilDay(float $precision = 1) Ceil the current instance day with given precision. + * @method CarbonInterface ceilDays(float $precision = 1) Ceil the current instance day with given precision. + * @method CarbonInterface roundHour(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method CarbonInterface roundHours(float $precision = 1, string $function = "round") Round the current instance hour with given precision using the given function. + * @method CarbonInterface floorHour(float $precision = 1) Truncate the current instance hour with given precision. + * @method CarbonInterface floorHours(float $precision = 1) Truncate the current instance hour with given precision. + * @method CarbonInterface ceilHour(float $precision = 1) Ceil the current instance hour with given precision. + * @method CarbonInterface ceilHours(float $precision = 1) Ceil the current instance hour with given precision. + * @method CarbonInterface roundMinute(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method CarbonInterface roundMinutes(float $precision = 1, string $function = "round") Round the current instance minute with given precision using the given function. + * @method CarbonInterface floorMinute(float $precision = 1) Truncate the current instance minute with given precision. + * @method CarbonInterface floorMinutes(float $precision = 1) Truncate the current instance minute with given precision. + * @method CarbonInterface ceilMinute(float $precision = 1) Ceil the current instance minute with given precision. + * @method CarbonInterface ceilMinutes(float $precision = 1) Ceil the current instance minute with given precision. + * @method CarbonInterface roundSecond(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method CarbonInterface roundSeconds(float $precision = 1, string $function = "round") Round the current instance second with given precision using the given function. + * @method CarbonInterface floorSecond(float $precision = 1) Truncate the current instance second with given precision. + * @method CarbonInterface floorSeconds(float $precision = 1) Truncate the current instance second with given precision. + * @method CarbonInterface ceilSecond(float $precision = 1) Ceil the current instance second with given precision. + * @method CarbonInterface ceilSeconds(float $precision = 1) Ceil the current instance second with given precision. + * @method CarbonInterface roundMillennium(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method CarbonInterface roundMillennia(float $precision = 1, string $function = "round") Round the current instance millennium with given precision using the given function. + * @method CarbonInterface floorMillennium(float $precision = 1) Truncate the current instance millennium with given precision. + * @method CarbonInterface floorMillennia(float $precision = 1) Truncate the current instance millennium with given precision. + * @method CarbonInterface ceilMillennium(float $precision = 1) Ceil the current instance millennium with given precision. + * @method CarbonInterface ceilMillennia(float $precision = 1) Ceil the current instance millennium with given precision. + * @method CarbonInterface roundCentury(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method CarbonInterface roundCenturies(float $precision = 1, string $function = "round") Round the current instance century with given precision using the given function. + * @method CarbonInterface floorCentury(float $precision = 1) Truncate the current instance century with given precision. + * @method CarbonInterface floorCenturies(float $precision = 1) Truncate the current instance century with given precision. + * @method CarbonInterface ceilCentury(float $precision = 1) Ceil the current instance century with given precision. + * @method CarbonInterface ceilCenturies(float $precision = 1) Ceil the current instance century with given precision. + * @method CarbonInterface roundDecade(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method CarbonInterface roundDecades(float $precision = 1, string $function = "round") Round the current instance decade with given precision using the given function. + * @method CarbonInterface floorDecade(float $precision = 1) Truncate the current instance decade with given precision. + * @method CarbonInterface floorDecades(float $precision = 1) Truncate the current instance decade with given precision. + * @method CarbonInterface ceilDecade(float $precision = 1) Ceil the current instance decade with given precision. + * @method CarbonInterface ceilDecades(float $precision = 1) Ceil the current instance decade with given precision. + * @method CarbonInterface roundQuarter(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method CarbonInterface roundQuarters(float $precision = 1, string $function = "round") Round the current instance quarter with given precision using the given function. + * @method CarbonInterface floorQuarter(float $precision = 1) Truncate the current instance quarter with given precision. + * @method CarbonInterface floorQuarters(float $precision = 1) Truncate the current instance quarter with given precision. + * @method CarbonInterface ceilQuarter(float $precision = 1) Ceil the current instance quarter with given precision. + * @method CarbonInterface ceilQuarters(float $precision = 1) Ceil the current instance quarter with given precision. + * @method CarbonInterface roundMillisecond(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method CarbonInterface roundMilliseconds(float $precision = 1, string $function = "round") Round the current instance millisecond with given precision using the given function. + * @method CarbonInterface floorMillisecond(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method CarbonInterface floorMilliseconds(float $precision = 1) Truncate the current instance millisecond with given precision. + * @method CarbonInterface ceilMillisecond(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method CarbonInterface ceilMilliseconds(float $precision = 1) Ceil the current instance millisecond with given precision. + * @method CarbonInterface roundMicrosecond(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method CarbonInterface roundMicroseconds(float $precision = 1, string $function = "round") Round the current instance microsecond with given precision using the given function. + * @method CarbonInterface floorMicrosecond(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method CarbonInterface floorMicroseconds(float $precision = 1) Truncate the current instance microsecond with given precision. + * @method CarbonInterface ceilMicrosecond(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method CarbonInterface ceilMicroseconds(float $precision = 1) Ceil the current instance microsecond with given precision. + * @method string shortAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longAbsoluteDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Absolute' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'Relative' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToNowDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToNow' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string shortRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (short format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * @method string longRelativeToOtherDiffForHumans(DateTimeInterface $other = null, int $parts = 1) Get the difference (long format, 'RelativeToOther' mode) in a human readable format in the current locale. ($other and $parts parameters can be swapped.) + * + * </autodoc> + */ +trait Date +{ + use Boundaries; + use Comparison; + use Converter; + use Creator; + use Difference; + use Macro; + use MagicParameter; + use Modifiers; + use Mutability; + use ObjectInitialisation; + use Options; + use Rounding; + use Serialization; + use Test; + use Timestamp; + use Units; + use Week; + + /** + * Names of days of the week. + * + * @var array + */ + protected static $days = [ + // @call isDayOfWeek + CarbonInterface::SUNDAY => 'Sunday', + // @call isDayOfWeek + CarbonInterface::MONDAY => 'Monday', + // @call isDayOfWeek + CarbonInterface::TUESDAY => 'Tuesday', + // @call isDayOfWeek + CarbonInterface::WEDNESDAY => 'Wednesday', + // @call isDayOfWeek + CarbonInterface::THURSDAY => 'Thursday', + // @call isDayOfWeek + CarbonInterface::FRIDAY => 'Friday', + // @call isDayOfWeek + CarbonInterface::SATURDAY => 'Saturday', + ]; + + /** + * Will UTF8 encoding be used to print localized date/time ? + * + * @var bool + */ + protected static $utf8 = false; + + /** + * List of unit and magic methods associated as doc-comments. + * + * @var array + */ + protected static $units = [ + // @call setUnit + // @call addUnit + 'year', + // @call setUnit + // @call addUnit + 'month', + // @call setUnit + // @call addUnit + 'day', + // @call setUnit + // @call addUnit + 'hour', + // @call setUnit + // @call addUnit + 'minute', + // @call setUnit + // @call addUnit + 'second', + // @call setUnit + // @call addUnit + 'milli', + // @call setUnit + // @call addUnit + 'millisecond', + // @call setUnit + // @call addUnit + 'micro', + // @call setUnit + // @call addUnit + 'microsecond', + ]; + + /** + * Creates a DateTimeZone from a string, DateTimeZone or integer offset. + * + * @param DateTimeZone|string|int|null $object original value to get CarbonTimeZone from it. + * @param DateTimeZone|string|int|null $objectDump dump of the object for error messages. + * + * @throws InvalidTimeZoneException + * + * @return CarbonTimeZone|false + */ + protected static function safeCreateDateTimeZone($object, $objectDump = null) + { + return CarbonTimeZone::instance($object, $objectDump); + } + + /** + * Get the TimeZone associated with the Carbon instance (as CarbonTimeZone). + * + * @return CarbonTimeZone + * + * @link https://php.net/manual/en/datetime.gettimezone.php + */ + #[ReturnTypeWillChange] + public function getTimezone() + { + return CarbonTimeZone::instance(parent::getTimezone()); + } + + /** + * List of minimum and maximums for each unit. + * + * @param int $daysInMonth + * + * @return array + */ + protected static function getRangesByUnit(int $daysInMonth = 31): array + { + return [ + // @call roundUnit + 'year' => [1, 9999], + // @call roundUnit + 'month' => [1, static::MONTHS_PER_YEAR], + // @call roundUnit + 'day' => [1, $daysInMonth], + // @call roundUnit + 'hour' => [0, static::HOURS_PER_DAY - 1], + // @call roundUnit + 'minute' => [0, static::MINUTES_PER_HOUR - 1], + // @call roundUnit + 'second' => [0, static::SECONDS_PER_MINUTE - 1], + ]; + } + + /** + * Get a copy of the instance. + * + * @return static + */ + public function copy() + { + return clone $this; + } + + /** + * @alias copy + * + * Get a copy of the instance. + * + * @return static + */ + public function clone() + { + return clone $this; + } + + /** + * Clone the current instance if it's mutable. + * + * This method is convenient to ensure you don't mutate the initial object + * but avoid to make a useless copy of it if it's already immutable. + * + * @return static + */ + public function avoidMutation(): self + { + if ($this instanceof DateTimeImmutable) { + return $this; + } + + return clone $this; + } + + /** + * Returns a present instance in the same timezone. + * + * @return static + */ + public function nowWithSameTz() + { + return static::now($this->getTimezone()); + } + + /** + * Throws an exception if the given object is not a DateTime and does not implement DateTimeInterface. + * + * @param mixed $date + * @param string|array $other + * + * @throws InvalidTypeException + */ + protected static function expectDateTime($date, $other = []) + { + $message = 'Expected '; + foreach ((array) $other as $expect) { + $message .= "$expect, "; + } + + if (!$date instanceof DateTime && !$date instanceof DateTimeInterface) { + throw new InvalidTypeException( + $message.'DateTime or DateTimeInterface, '. + (\is_object($date) ? \get_class($date) : \gettype($date)).' given' + ); + } + } + + /** + * Return the Carbon instance passed through, a now instance in the same timezone + * if null given or parse the input if string given. + * + * @param Carbon|DateTimeInterface|string|null $date + * + * @return static + */ + protected function resolveCarbon($date = null) + { + if (!$date) { + return $this->nowWithSameTz(); + } + + if (\is_string($date)) { + return static::parse($date, $this->getTimezone()); + } + + static::expectDateTime($date, ['null', 'string']); + + return $date instanceof self ? $date : static::instance($date); + } + + /** + * Return the Carbon instance passed through, a now instance in UTC + * if null given or parse the input if string given (using current timezone + * then switching to UTC). + * + * @param Carbon|DateTimeInterface|string|null $date + * + * @return static + */ + protected function resolveUTC($date = null): self + { + if (!$date) { + return static::now('UTC'); + } + + if (\is_string($date)) { + return static::parse($date, $this->getTimezone())->utc(); + } + + static::expectDateTime($date, ['null', 'string']); + + return $date instanceof self ? $date : static::instance($date)->utc(); + } + + /** + * Return the Carbon instance passed through, a now instance in the same timezone + * if null given or parse the input if string given. + * + * @param Carbon|\Carbon\CarbonPeriod|\Carbon\CarbonInterval|\DateInterval|\DatePeriod|DateTimeInterface|string|null $date + * + * @return static + */ + public function carbonize($date = null) + { + if ($date instanceof DateInterval) { + return $this->avoidMutation()->add($date); + } + + if ($date instanceof DatePeriod || $date instanceof CarbonPeriod) { + $date = $date->getStartDate(); + } + + return $this->resolveCarbon($date); + } + + /////////////////////////////////////////////////////////////////// + ///////////////////////// GETTERS AND SETTERS ///////////////////// + /////////////////////////////////////////////////////////////////// + + /** + * Get a part of the Carbon object + * + * @param string $name + * + * @throws UnknownGetterException + * + * @return string|int|bool|DateTimeZone|null + */ + public function __get($name) + { + return $this->get($name); + } + + /** + * Get a part of the Carbon object + * + * @param string $name + * + * @throws UnknownGetterException + * + * @return string|int|bool|DateTimeZone|null + */ + public function get($name) + { + static $formats = [ + // @property int + 'year' => 'Y', + // @property int + 'yearIso' => 'o', + // @property int + // @call isSameUnit + 'month' => 'n', + // @property int + 'day' => 'j', + // @property int + 'hour' => 'G', + // @property int + 'minute' => 'i', + // @property int + 'second' => 's', + // @property int + 'micro' => 'u', + // @property int + 'microsecond' => 'u', + // @property-read int 0 (for Sunday) through 6 (for Saturday) + 'dayOfWeek' => 'w', + // @property-read int 1 (for Monday) through 7 (for Sunday) + 'dayOfWeekIso' => 'N', + // @property-read int ISO-8601 week number of year, weeks starting on Monday + 'weekOfYear' => 'W', + // @property-read int number of days in the given month + 'daysInMonth' => 't', + // @property int|float|string seconds since the Unix Epoch + 'timestamp' => 'U', + // @property-read string "am"/"pm" (Ante meridiem or Post meridiem latin lowercase mark) + 'latinMeridiem' => 'a', + // @property-read string "AM"/"PM" (Ante meridiem or Post meridiem latin uppercase mark) + 'latinUpperMeridiem' => 'A', + // @property string the day of week in English + 'englishDayOfWeek' => 'l', + // @property string the abbreviated day of week in English + 'shortEnglishDayOfWeek' => 'D', + // @property string the month in English + 'englishMonth' => 'F', + // @property string the abbreviated month in English + 'shortEnglishMonth' => 'M', + // @property string the day of week in current locale LC_TIME + // @deprecated + // reason: It uses OS language package and strftime() which is deprecated since PHP 8.1. + // replacement: Use ->isoFormat('MMM') instead. + // since: 2.55.0 + 'localeDayOfWeek' => '%A', + // @property string the abbreviated day of week in current locale LC_TIME + // @deprecated + // reason: It uses OS language package and strftime() which is deprecated since PHP 8.1. + // replacement: Use ->isoFormat('dddd') instead. + // since: 2.55.0 + 'shortLocaleDayOfWeek' => '%a', + // @property string the month in current locale LC_TIME + // @deprecated + // reason: It uses OS language package and strftime() which is deprecated since PHP 8.1. + // replacement: Use ->isoFormat('ddd') instead. + // since: 2.55.0 + 'localeMonth' => '%B', + // @property string the abbreviated month in current locale LC_TIME + // @deprecated + // reason: It uses OS language package and strftime() which is deprecated since PHP 8.1. + // replacement: Use ->isoFormat('MMMM') instead. + // since: 2.55.0 + 'shortLocaleMonth' => '%b', + // @property-read string $timezoneAbbreviatedName the current timezone abbreviated name + 'timezoneAbbreviatedName' => 'T', + // @property-read string $tzAbbrName alias of $timezoneAbbreviatedName + 'tzAbbrName' => 'T', + ]; + + switch (true) { + case isset($formats[$name]): + $format = $formats[$name]; + $method = str_starts_with($format, '%') ? 'formatLocalized' : 'rawFormat'; + $value = $this->$method($format); + + return is_numeric($value) ? (int) $value : $value; + + // @property-read string long name of weekday translated according to Carbon locale, in english if no translation available for current language + case $name === 'dayName': + return $this->getTranslatedDayName(); + // @property-read string short name of weekday translated according to Carbon locale, in english if no translation available for current language + case $name === 'shortDayName': + return $this->getTranslatedShortDayName(); + // @property-read string very short name of weekday translated according to Carbon locale, in english if no translation available for current language + case $name === 'minDayName': + return $this->getTranslatedMinDayName(); + // @property-read string long name of month translated according to Carbon locale, in english if no translation available for current language + case $name === 'monthName': + return $this->getTranslatedMonthName(); + // @property-read string short name of month translated according to Carbon locale, in english if no translation available for current language + case $name === 'shortMonthName': + return $this->getTranslatedShortMonthName(); + // @property-read string lowercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + case $name === 'meridiem': + return $this->meridiem(true); + // @property-read string uppercase meridiem mark translated according to Carbon locale, in latin if no translation available for current language + case $name === 'upperMeridiem': + return $this->meridiem(); + // @property-read int current hour from 1 to 24 + case $name === 'noZeroHour': + return $this->hour ?: 24; + // @property int + case $name === 'milliseconds': + // @property int + case $name === 'millisecond': + // @property int + case $name === 'milli': + return (int) floor(((int) $this->rawFormat('u')) / 1000); + + // @property int 1 through 53 + case $name === 'week': + return (int) $this->week(); + + // @property int 1 through 53 + case $name === 'isoWeek': + return (int) $this->isoWeek(); + + // @property int year according to week format + case $name === 'weekYear': + return (int) $this->weekYear(); + + // @property int year according to ISO week format + case $name === 'isoWeekYear': + return (int) $this->isoWeekYear(); + + // @property-read int 51 through 53 + case $name === 'weeksInYear': + return $this->weeksInYear(); + + // @property-read int 51 through 53 + case $name === 'isoWeeksInYear': + return $this->isoWeeksInYear(); + + // @property-read int 1 through 5 + case $name === 'weekOfMonth': + return (int) ceil($this->day / static::DAYS_PER_WEEK); + + // @property-read int 1 through 5 + case $name === 'weekNumberInMonth': + return (int) ceil(($this->day + $this->avoidMutation()->startOfMonth()->dayOfWeekIso - 1) / static::DAYS_PER_WEEK); + + // @property-read int 0 through 6 + case $name === 'firstWeekDay': + return $this->localTranslator ? ($this->getTranslationMessage('first_day_of_week') ?? 0) : static::getWeekStartsAt(); + + // @property-read int 0 through 6 + case $name === 'lastWeekDay': + return $this->localTranslator ? (($this->getTranslationMessage('first_day_of_week') ?? 0) + static::DAYS_PER_WEEK - 1) % static::DAYS_PER_WEEK : static::getWeekEndsAt(); + + // @property int 1 through 366 + case $name === 'dayOfYear': + return 1 + (int) ($this->rawFormat('z')); + + // @property-read int 365 or 366 + case $name === 'daysInYear': + return $this->isLeapYear() ? 366 : 365; + + // @property int does a diffInYears() with default parameters + case $name === 'age': + return $this->diffInYears(); + + // @property-read int the quarter of this instance, 1 - 4 + // @call isSameUnit + case $name === 'quarter': + return (int) ceil($this->month / static::MONTHS_PER_QUARTER); + + // @property-read int the decade of this instance + // @call isSameUnit + case $name === 'decade': + return (int) ceil($this->year / static::YEARS_PER_DECADE); + + // @property-read int the century of this instance + // @call isSameUnit + case $name === 'century': + $factor = 1; + $year = $this->year; + if ($year < 0) { + $year = -$year; + $factor = -1; + } + + return (int) ($factor * ceil($year / static::YEARS_PER_CENTURY)); + + // @property-read int the millennium of this instance + // @call isSameUnit + case $name === 'millennium': + $factor = 1; + $year = $this->year; + if ($year < 0) { + $year = -$year; + $factor = -1; + } + + return (int) ($factor * ceil($year / static::YEARS_PER_MILLENNIUM)); + + // @property int the timezone offset in seconds from UTC + case $name === 'offset': + return $this->getOffset(); + + // @property int the timezone offset in minutes from UTC + case $name === 'offsetMinutes': + return $this->getOffset() / static::SECONDS_PER_MINUTE; + + // @property int the timezone offset in hours from UTC + case $name === 'offsetHours': + return $this->getOffset() / static::SECONDS_PER_MINUTE / static::MINUTES_PER_HOUR; + + // @property-read bool daylight savings time indicator, true if DST, false otherwise + case $name === 'dst': + return $this->rawFormat('I') === '1'; + + // @property-read bool checks if the timezone is local, true if local, false otherwise + case $name === 'local': + return $this->getOffset() === $this->avoidMutation()->setTimezone(date_default_timezone_get())->getOffset(); + + // @property-read bool checks if the timezone is UTC, true if UTC, false otherwise + case $name === 'utc': + return $this->getOffset() === 0; + + // @property CarbonTimeZone $timezone the current timezone + // @property CarbonTimeZone $tz alias of $timezone + case $name === 'timezone' || $name === 'tz': + return CarbonTimeZone::instance($this->getTimezone()); + + // @property-read string $timezoneName the current timezone name + // @property-read string $tzName alias of $timezoneName + case $name === 'timezoneName' || $name === 'tzName': + return $this->getTimezone()->getName(); + + // @property-read string locale of the current instance + case $name === 'locale': + return $this->getTranslatorLocale(); + + default: + $macro = $this->getLocalMacro('get'.ucfirst($name)); + + if ($macro) { + return $this->executeCallableWithContext($macro); + } + + throw new UnknownGetterException($name); + } + } + + /** + * Check if an attribute exists on the object + * + * @param string $name + * + * @return bool + */ + public function __isset($name) + { + try { + $this->__get($name); + } catch (UnknownGetterException | ReflectionException $e) { + return false; + } + + return true; + } + + /** + * Set a part of the Carbon object + * + * @param string $name + * @param string|int|DateTimeZone $value + * + * @throws UnknownSetterException|ReflectionException + * + * @return void + */ + public function __set($name, $value) + { + if ($this->constructedObjectId === spl_object_hash($this)) { + $this->set($name, $value); + + return; + } + + $this->$name = $value; + } + + /** + * Set a part of the Carbon object + * + * @param string|array $name + * @param string|int|DateTimeZone $value + * + * @throws ImmutableException|UnknownSetterException + * + * @return $this + */ + public function set($name, $value = null) + { + if ($this->isImmutable()) { + throw new ImmutableException(sprintf('%s class', static::class)); + } + + if (\is_array($name)) { + foreach ($name as $key => $value) { + $this->set($key, $value); + } + + return $this; + } + + switch ($name) { + case 'milliseconds': + case 'millisecond': + case 'milli': + case 'microseconds': + case 'microsecond': + case 'micro': + if (str_starts_with($name, 'milli')) { + $value *= 1000; + } + + while ($value < 0) { + $this->subSecond(); + $value += static::MICROSECONDS_PER_SECOND; + } + + while ($value >= static::MICROSECONDS_PER_SECOND) { + $this->addSecond(); + $value -= static::MICROSECONDS_PER_SECOND; + } + + $this->modify($this->rawFormat('H:i:s.').str_pad((string) round($value), 6, '0', STR_PAD_LEFT)); + + break; + + case 'year': + case 'month': + case 'day': + case 'hour': + case 'minute': + case 'second': + [$year, $month, $day, $hour, $minute, $second] = array_map('intval', explode('-', $this->rawFormat('Y-n-j-G-i-s'))); + $$name = $value; + $this->setDateTime($year, $month, $day, $hour, $minute, $second); + + break; + + case 'week': + $this->week($value); + + break; + + case 'isoWeek': + $this->isoWeek($value); + + break; + + case 'weekYear': + $this->weekYear($value); + + break; + + case 'isoWeekYear': + $this->isoWeekYear($value); + + break; + + case 'dayOfYear': + $this->addDays($value - $this->dayOfYear); + + break; + + case 'timestamp': + $this->setTimestamp($value); + + break; + + case 'offset': + $this->setTimezone(static::safeCreateDateTimeZone($value / static::SECONDS_PER_MINUTE / static::MINUTES_PER_HOUR)); + + break; + + case 'offsetMinutes': + $this->setTimezone(static::safeCreateDateTimeZone($value / static::MINUTES_PER_HOUR)); + + break; + + case 'offsetHours': + $this->setTimezone(static::safeCreateDateTimeZone($value)); + + break; + + case 'timezone': + case 'tz': + $this->setTimezone($value); + + break; + + default: + $macro = $this->getLocalMacro('set'.ucfirst($name)); + + if ($macro) { + $this->executeCallableWithContext($macro, $value); + + break; + } + + if ($this->localStrictModeEnabled ?? static::isStrictModeEnabled()) { + throw new UnknownSetterException($name); + } + + $this->$name = $value; + } + + return $this; + } + + protected function getTranslatedFormByRegExp($baseKey, $keySuffix, $context, $subKey, $defaultValue) + { + $key = $baseKey.$keySuffix; + $standaloneKey = "{$key}_standalone"; + $baseTranslation = $this->getTranslationMessage($key); + + if ($baseTranslation instanceof Closure) { + return $baseTranslation($this, $context, $subKey) ?: $defaultValue; + } + + if ( + $this->getTranslationMessage("$standaloneKey.$subKey") && + (!$context || (($regExp = $this->getTranslationMessage("{$baseKey}_regexp")) && !preg_match($regExp, $context))) + ) { + $key = $standaloneKey; + } + + return $this->getTranslationMessage("$key.$subKey", null, $defaultValue); + } + + /** + * Get the translation of the current week day name (with context for languages with multiple forms). + * + * @param string|null $context whole format string + * @param string $keySuffix "", "_short" or "_min" + * @param string|null $defaultValue default value if translation missing + * + * @return string + */ + public function getTranslatedDayName($context = null, $keySuffix = '', $defaultValue = null) + { + return $this->getTranslatedFormByRegExp('weekdays', $keySuffix, $context, $this->dayOfWeek, $defaultValue ?: $this->englishDayOfWeek); + } + + /** + * Get the translation of the current short week day name (with context for languages with multiple forms). + * + * @param string|null $context whole format string + * + * @return string + */ + public function getTranslatedShortDayName($context = null) + { + return $this->getTranslatedDayName($context, '_short', $this->shortEnglishDayOfWeek); + } + + /** + * Get the translation of the current abbreviated week day name (with context for languages with multiple forms). + * + * @param string|null $context whole format string + * + * @return string + */ + public function getTranslatedMinDayName($context = null) + { + return $this->getTranslatedDayName($context, '_min', $this->shortEnglishDayOfWeek); + } + + /** + * Get the translation of the current month day name (with context for languages with multiple forms). + * + * @param string|null $context whole format string + * @param string $keySuffix "" or "_short" + * @param string|null $defaultValue default value if translation missing + * + * @return string + */ + public function getTranslatedMonthName($context = null, $keySuffix = '', $defaultValue = null) + { + return $this->getTranslatedFormByRegExp('months', $keySuffix, $context, $this->month - 1, $defaultValue ?: $this->englishMonth); + } + + /** + * Get the translation of the current short month day name (with context for languages with multiple forms). + * + * @param string|null $context whole format string + * + * @return string + */ + public function getTranslatedShortMonthName($context = null) + { + return $this->getTranslatedMonthName($context, '_short', $this->shortEnglishMonth); + } + + /** + * Get/set the day of year. + * + * @param int|null $value new value for day of year if using as setter. + * + * @return static|int + */ + public function dayOfYear($value = null) + { + $dayOfYear = $this->dayOfYear; + + return $value === null ? $dayOfYear : $this->addDays($value - $dayOfYear); + } + + /** + * Get/set the weekday from 0 (Sunday) to 6 (Saturday). + * + * @param int|null $value new value for weekday if using as setter. + * + * @return static|int + */ + public function weekday($value = null) + { + if ($value === null) { + return $this->dayOfWeek; + } + + $firstDay = (int) ($this->getTranslationMessage('first_day_of_week') ?? 0); + $dayOfWeek = ($this->dayOfWeek + 7 - $firstDay) % 7; + + return $this->addDays((($value + 7 - $firstDay) % 7) - $dayOfWeek); + } + + /** + * Get/set the ISO weekday from 1 (Monday) to 7 (Sunday). + * + * @param int|null $value new value for weekday if using as setter. + * + * @return static|int + */ + public function isoWeekday($value = null) + { + $dayOfWeekIso = $this->dayOfWeekIso; + + return $value === null ? $dayOfWeekIso : $this->addDays($value - $dayOfWeekIso); + } + + /** + * Return the number of days since the start of the week (using the current locale or the first parameter + * if explicitly given). + * + * @param int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week, + * if not provided, start of week is inferred from the locale + * (Sunday for en_US, Monday for de_DE, etc.) + * + * @return int + */ + public function getDaysFromStartOfWeek(int $weekStartsAt = null): int + { + $firstDay = (int) ($weekStartsAt ?? $this->getTranslationMessage('first_day_of_week') ?? 0); + + return ($this->dayOfWeek + 7 - $firstDay) % 7; + } + + /** + * Set the day (keeping the current time) to the start of the week + the number of days passed as the first + * parameter. First day of week is driven by the locale unless explicitly set with the second parameter. + * + * @param int $numberOfDays number of days to add after the start of the current week + * @param int|null $weekStartsAt optional start allow you to specify the day of week to use to start the week, + * if not provided, start of week is inferred from the locale + * (Sunday for en_US, Monday for de_DE, etc.) + * + * @return static + */ + public function setDaysFromStartOfWeek(int $numberOfDays, int $weekStartsAt = null) + { + return $this->addDays($numberOfDays - $this->getDaysFromStartOfWeek($weekStartsAt)); + } + + /** + * Set any unit to a new value without overflowing current other unit given. + * + * @param string $valueUnit unit name to modify + * @param int $value new value for the input unit + * @param string $overflowUnit unit name to not overflow + * + * @return static + */ + public function setUnitNoOverflow($valueUnit, $value, $overflowUnit) + { + try { + $original = $this->avoidMutation(); + /** @var static $date */ + $date = $this->$valueUnit($value); + $end = $original->avoidMutation()->endOf($overflowUnit); + $start = $original->avoidMutation()->startOf($overflowUnit); + if ($date < $start) { + $date = $date->setDateTimeFrom($start); + } elseif ($date > $end) { + $date = $date->setDateTimeFrom($end); + } + + return $date; + } catch (BadMethodCallException | ReflectionException $exception) { + throw new UnknownUnitException($valueUnit, 0, $exception); + } + } + + /** + * Add any unit to a new value without overflowing current other unit given. + * + * @param string $valueUnit unit name to modify + * @param int $value amount to add to the input unit + * @param string $overflowUnit unit name to not overflow + * + * @return static + */ + public function addUnitNoOverflow($valueUnit, $value, $overflowUnit) + { + return $this->setUnitNoOverflow($valueUnit, $this->$valueUnit + $value, $overflowUnit); + } + + /** + * Subtract any unit to a new value without overflowing current other unit given. + * + * @param string $valueUnit unit name to modify + * @param int $value amount to subtract to the input unit + * @param string $overflowUnit unit name to not overflow + * + * @return static + */ + public function subUnitNoOverflow($valueUnit, $value, $overflowUnit) + { + return $this->setUnitNoOverflow($valueUnit, $this->$valueUnit - $value, $overflowUnit); + } + + /** + * Returns the minutes offset to UTC if no arguments passed, else set the timezone with given minutes shift passed. + * + * @param int|null $minuteOffset + * + * @return int|static + */ + public function utcOffset(int $minuteOffset = null) + { + if (\func_num_args() < 1) { + return $this->offsetMinutes; + } + + return $this->setTimezone(CarbonTimeZone::createFromMinuteOffset($minuteOffset)); + } + + /** + * Set the date with gregorian year, month and day numbers. + * + * @see https://php.net/manual/en/datetime.setdate.php + * + * @param int $year + * @param int $month + * @param int $day + * + * @return static + */ + #[ReturnTypeWillChange] + public function setDate($year, $month, $day) + { + return parent::setDate((int) $year, (int) $month, (int) $day); + } + + /** + * Set a date according to the ISO 8601 standard - using weeks and day offsets rather than specific dates. + * + * @see https://php.net/manual/en/datetime.setisodate.php + * + * @param int $year + * @param int $week + * @param int $day + * + * @return static + */ + #[ReturnTypeWillChange] + public function setISODate($year, $week, $day = 1) + { + return parent::setISODate((int) $year, (int) $week, (int) $day); + } + + /** + * Set the date and time all together. + * + * @param int $year + * @param int $month + * @param int $day + * @param int $hour + * @param int $minute + * @param int $second + * @param int $microseconds + * + * @return static + */ + public function setDateTime($year, $month, $day, $hour, $minute, $second = 0, $microseconds = 0) + { + return $this->setDate($year, $month, $day)->setTime((int) $hour, (int) $minute, (int) $second, (int) $microseconds); + } + + /** + * Resets the current time of the DateTime object to a different time. + * + * @see https://php.net/manual/en/datetime.settime.php + * + * @param int $hour + * @param int $minute + * @param int $second + * @param int $microseconds + * + * @return static + */ + #[ReturnTypeWillChange] + public function setTime($hour, $minute, $second = 0, $microseconds = 0) + { + return parent::setTime((int) $hour, (int) $minute, (int) $second, (int) $microseconds); + } + + /** + * Set the instance's timestamp. + * + * Timestamp input can be given as int, float or a string containing one or more numbers. + * + * @param float|int|string $unixTimestamp + * + * @return static + */ + #[ReturnTypeWillChange] + public function setTimestamp($unixTimestamp) + { + [$timestamp, $microseconds] = self::getIntegerAndDecimalParts($unixTimestamp); + + return parent::setTimestamp((int) $timestamp)->setMicroseconds((int) $microseconds); + } + + /** + * Set the time by time string. + * + * @param string $time + * + * @return static + */ + public function setTimeFromTimeString($time) + { + if (!str_contains($time, ':')) { + $time .= ':0'; + } + + return $this->modify($time); + } + + /** + * @alias setTimezone + * + * @param DateTimeZone|string $value + * + * @return static + */ + public function timezone($value) + { + return $this->setTimezone($value); + } + + /** + * Set the timezone or returns the timezone name if no arguments passed. + * + * @param DateTimeZone|string $value + * + * @return static|string + */ + public function tz($value = null) + { + if (\func_num_args() < 1) { + return $this->tzName; + } + + return $this->setTimezone($value); + } + + /** + * Set the instance's timezone from a string or object. + * + * @param DateTimeZone|string $value + * + * @return static + */ + #[ReturnTypeWillChange] + public function setTimezone($value) + { + $tz = static::safeCreateDateTimeZone($value); + + if ($tz === false && !self::isStrictModeEnabled()) { + $tz = new CarbonTimeZone(); + } + + return parent::setTimezone($tz); + } + + /** + * Set the instance's timezone from a string or object and add/subtract the offset difference. + * + * @param DateTimeZone|string $value + * + * @return static + */ + public function shiftTimezone($value) + { + $dateTimeString = $this->format('Y-m-d H:i:s.u'); + + return $this + ->setTimezone($value) + ->modify($dateTimeString); + } + + /** + * Set the instance's timezone to UTC. + * + * @return static + */ + public function utc() + { + return $this->setTimezone('UTC'); + } + + /** + * Set the year, month, and date for this instance to that of the passed instance. + * + * @param Carbon|DateTimeInterface $date now if null + * + * @return static + */ + public function setDateFrom($date = null) + { + $date = $this->resolveCarbon($date); + + return $this->setDate($date->year, $date->month, $date->day); + } + + /** + * Set the hour, minute, second and microseconds for this instance to that of the passed instance. + * + * @param Carbon|DateTimeInterface $date now if null + * + * @return static + */ + public function setTimeFrom($date = null) + { + $date = $this->resolveCarbon($date); + + return $this->setTime($date->hour, $date->minute, $date->second, $date->microsecond); + } + + /** + * Set the date and time for this instance to that of the passed instance. + * + * @param Carbon|DateTimeInterface $date + * + * @return static + */ + public function setDateTimeFrom($date = null) + { + $date = $this->resolveCarbon($date); + + return $this->modify($date->rawFormat('Y-m-d H:i:s.u')); + } + + /** + * Get the days of the week + * + * @return array + */ + public static function getDays() + { + return static::$days; + } + + /////////////////////////////////////////////////////////////////// + /////////////////////// WEEK SPECIAL DAYS ///////////////////////// + /////////////////////////////////////////////////////////////////// + + private static function getFirstDayOfWeek(): int + { + return (int) static::getTranslationMessageWith( + static::getTranslator(), + 'first_day_of_week' + ); + } + + /** + * Get the first day of week + * + * @return int + */ + public static function getWeekStartsAt() + { + if (static::$weekStartsAt === static::WEEK_DAY_AUTO) { + return self::getFirstDayOfWeek(); + } + + return static::$weekStartsAt; + } + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * Use $weekEndsAt optional parameter instead when using endOfWeek method. You can also use the + * 'first_day_of_week' locale setting to change the start of week according to current locale + * selected and implicitly the end of week. + * + * Set the first day of week + * + * @param int|string $day week start day (or 'auto' to get the first day of week from Carbon::getLocale() culture). + * + * @return void + */ + public static function setWeekStartsAt($day) + { + static::$weekStartsAt = $day === static::WEEK_DAY_AUTO ? $day : max(0, (7 + $day) % 7); + } + + /** + * Get the last day of week + * + * @return int + */ + public static function getWeekEndsAt() + { + if (static::$weekStartsAt === static::WEEK_DAY_AUTO) { + return (int) (static::DAYS_PER_WEEK - 1 + self::getFirstDayOfWeek()) % static::DAYS_PER_WEEK; + } + + return static::$weekEndsAt; + } + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * Use $weekStartsAt optional parameter instead when using startOfWeek, floorWeek, ceilWeek + * or roundWeek method. You can also use the 'first_day_of_week' locale setting to change the + * start of week according to current locale selected and implicitly the end of week. + * + * Set the last day of week + * + * @param int|string $day week end day (or 'auto' to get the day before the first day of week + * from Carbon::getLocale() culture). + * + * @return void + */ + public static function setWeekEndsAt($day) + { + static::$weekEndsAt = $day === static::WEEK_DAY_AUTO ? $day : max(0, (7 + $day) % 7); + } + + /** + * Get weekend days + * + * @return array + */ + public static function getWeekendDays() + { + return static::$weekendDays; + } + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather consider week-end is always saturday and sunday, and if you have some custom + * week-end days to handle, give to those days an other name and create a macro for them: + * + * ``` + * Carbon::macro('isDayOff', function ($date) { + * return $date->isSunday() || $date->isMonday(); + * }); + * Carbon::macro('isNotDayOff', function ($date) { + * return !$date->isDayOff(); + * }); + * if ($someDate->isDayOff()) ... + * if ($someDate->isNotDayOff()) ... + * // Add 5 not-off days + * $count = 5; + * while ($someDate->isDayOff() || ($count-- > 0)) { + * $someDate->addDay(); + * } + * ``` + * + * Set weekend days + * + * @param array $days + * + * @return void + */ + public static function setWeekendDays($days) + { + static::$weekendDays = $days; + } + + /** + * Determine if a time string will produce a relative date. + * + * @param string $time + * + * @return bool true if time match a relative date, false if absolute or invalid time string + */ + public static function hasRelativeKeywords($time) + { + if (!$time || strtotime($time) === false) { + return false; + } + + $date1 = new DateTime('2000-01-01T00:00:00Z'); + $date1->modify($time); + $date2 = new DateTime('2001-12-25T00:00:00Z'); + $date2->modify($time); + + return $date1 != $date2; + } + + /////////////////////////////////////////////////////////////////// + /////////////////////// STRING FORMATTING ///////////////////////// + /////////////////////////////////////////////////////////////////// + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use UTF-8 language packages on every machine. + * + * Set if UTF8 will be used for localized date/time. + * + * @param bool $utf8 + */ + public static function setUtf8($utf8) + { + static::$utf8 = $utf8; + } + + /** + * Format the instance with the current locale. You can set the current + * locale using setlocale() https://php.net/setlocale. + * + * @deprecated It uses OS language package and strftime() which is deprecated since PHP 8.1. + * Use ->isoFormat() instead. + * Deprecated since 2.55.0 + * + * @param string $format + * + * @return string + */ + public function formatLocalized($format) + { + // Check for Windows to find and replace the %e modifier correctly. + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + $format = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $format); // @codeCoverageIgnore + } + + $time = strtotime($this->toDateTimeString()); + $formatted = ($this->localStrictModeEnabled ?? static::isStrictModeEnabled()) + ? strftime($format, $time) + : @strftime($format, $time); + + return static::$utf8 + ? ( + \function_exists('mb_convert_encoding') + ? mb_convert_encoding($formatted, 'UTF-8', mb_list_encodings()) + : utf8_encode($formatted) + ) + : $formatted; + } + + /** + * Returns list of locale formats for ISO formatting. + * + * @param string|null $locale current locale used if null + * + * @return array + */ + public function getIsoFormats($locale = null) + { + return [ + 'LT' => $this->getTranslationMessage('formats.LT', $locale, 'h:mm A'), + 'LTS' => $this->getTranslationMessage('formats.LTS', $locale, 'h:mm:ss A'), + 'L' => $this->getTranslationMessage('formats.L', $locale, 'MM/DD/YYYY'), + 'LL' => $this->getTranslationMessage('formats.LL', $locale, 'MMMM D, YYYY'), + 'LLL' => $this->getTranslationMessage('formats.LLL', $locale, 'MMMM D, YYYY h:mm A'), + 'LLLL' => $this->getTranslationMessage('formats.LLLL', $locale, 'dddd, MMMM D, YYYY h:mm A'), + 'l' => $this->getTranslationMessage('formats.l', $locale), + 'll' => $this->getTranslationMessage('formats.ll', $locale), + 'lll' => $this->getTranslationMessage('formats.lll', $locale), + 'llll' => $this->getTranslationMessage('formats.llll', $locale), + ]; + } + + /** + * Returns list of calendar formats for ISO formatting. + * + * @param string|null $locale current locale used if null + * + * @return array + */ + public function getCalendarFormats($locale = null) + { + return [ + 'sameDay' => $this->getTranslationMessage('calendar.sameDay', $locale, '[Today at] LT'), + 'nextDay' => $this->getTranslationMessage('calendar.nextDay', $locale, '[Tomorrow at] LT'), + 'nextWeek' => $this->getTranslationMessage('calendar.nextWeek', $locale, 'dddd [at] LT'), + 'lastDay' => $this->getTranslationMessage('calendar.lastDay', $locale, '[Yesterday at] LT'), + 'lastWeek' => $this->getTranslationMessage('calendar.lastWeek', $locale, '[Last] dddd [at] LT'), + 'sameElse' => $this->getTranslationMessage('calendar.sameElse', $locale, 'L'), + ]; + } + + /** + * Returns list of locale units for ISO formatting. + * + * @return array + */ + public static function getIsoUnits() + { + static $units = null; + + if ($units === null) { + $units = [ + 'OD' => ['getAltNumber', ['day']], + 'OM' => ['getAltNumber', ['month']], + 'OY' => ['getAltNumber', ['year']], + 'OH' => ['getAltNumber', ['hour']], + 'Oh' => ['getAltNumber', ['h']], + 'Om' => ['getAltNumber', ['minute']], + 'Os' => ['getAltNumber', ['second']], + 'D' => 'day', + 'DD' => ['rawFormat', ['d']], + 'Do' => ['ordinal', ['day', 'D']], + 'd' => 'dayOfWeek', + 'dd' => function (CarbonInterface $date, $originalFormat = null) { + return $date->getTranslatedMinDayName($originalFormat); + }, + 'ddd' => function (CarbonInterface $date, $originalFormat = null) { + return $date->getTranslatedShortDayName($originalFormat); + }, + 'dddd' => function (CarbonInterface $date, $originalFormat = null) { + return $date->getTranslatedDayName($originalFormat); + }, + 'DDD' => 'dayOfYear', + 'DDDD' => ['getPaddedUnit', ['dayOfYear', 3]], + 'DDDo' => ['ordinal', ['dayOfYear', 'DDD']], + 'e' => ['weekday', []], + 'E' => 'dayOfWeekIso', + 'H' => ['rawFormat', ['G']], + 'HH' => ['rawFormat', ['H']], + 'h' => ['rawFormat', ['g']], + 'hh' => ['rawFormat', ['h']], + 'k' => 'noZeroHour', + 'kk' => ['getPaddedUnit', ['noZeroHour']], + 'hmm' => ['rawFormat', ['gi']], + 'hmmss' => ['rawFormat', ['gis']], + 'Hmm' => ['rawFormat', ['Gi']], + 'Hmmss' => ['rawFormat', ['Gis']], + 'm' => 'minute', + 'mm' => ['rawFormat', ['i']], + 'a' => 'meridiem', + 'A' => 'upperMeridiem', + 's' => 'second', + 'ss' => ['getPaddedUnit', ['second']], + 'S' => function (CarbonInterface $date) { + return (string) floor($date->micro / 100000); + }, + 'SS' => function (CarbonInterface $date) { + return str_pad((string) floor($date->micro / 10000), 2, '0', STR_PAD_LEFT); + }, + 'SSS' => function (CarbonInterface $date) { + return str_pad((string) floor($date->micro / 1000), 3, '0', STR_PAD_LEFT); + }, + 'SSSS' => function (CarbonInterface $date) { + return str_pad((string) floor($date->micro / 100), 4, '0', STR_PAD_LEFT); + }, + 'SSSSS' => function (CarbonInterface $date) { + return str_pad((string) floor($date->micro / 10), 5, '0', STR_PAD_LEFT); + }, + 'SSSSSS' => ['getPaddedUnit', ['micro', 6]], + 'SSSSSSS' => function (CarbonInterface $date) { + return str_pad((string) floor($date->micro * 10), 7, '0', STR_PAD_LEFT); + }, + 'SSSSSSSS' => function (CarbonInterface $date) { + return str_pad((string) floor($date->micro * 100), 8, '0', STR_PAD_LEFT); + }, + 'SSSSSSSSS' => function (CarbonInterface $date) { + return str_pad((string) floor($date->micro * 1000), 9, '0', STR_PAD_LEFT); + }, + 'M' => 'month', + 'MM' => ['rawFormat', ['m']], + 'MMM' => function (CarbonInterface $date, $originalFormat = null) { + $month = $date->getTranslatedShortMonthName($originalFormat); + $suffix = $date->getTranslationMessage('mmm_suffix'); + if ($suffix && $month !== $date->monthName) { + $month .= $suffix; + } + + return $month; + }, + 'MMMM' => function (CarbonInterface $date, $originalFormat = null) { + return $date->getTranslatedMonthName($originalFormat); + }, + 'Mo' => ['ordinal', ['month', 'M']], + 'Q' => 'quarter', + 'Qo' => ['ordinal', ['quarter', 'M']], + 'G' => 'isoWeekYear', + 'GG' => ['getPaddedUnit', ['isoWeekYear']], + 'GGG' => ['getPaddedUnit', ['isoWeekYear', 3]], + 'GGGG' => ['getPaddedUnit', ['isoWeekYear', 4]], + 'GGGGG' => ['getPaddedUnit', ['isoWeekYear', 5]], + 'g' => 'weekYear', + 'gg' => ['getPaddedUnit', ['weekYear']], + 'ggg' => ['getPaddedUnit', ['weekYear', 3]], + 'gggg' => ['getPaddedUnit', ['weekYear', 4]], + 'ggggg' => ['getPaddedUnit', ['weekYear', 5]], + 'W' => 'isoWeek', + 'WW' => ['getPaddedUnit', ['isoWeek']], + 'Wo' => ['ordinal', ['isoWeek', 'W']], + 'w' => 'week', + 'ww' => ['getPaddedUnit', ['week']], + 'wo' => ['ordinal', ['week', 'w']], + 'x' => ['valueOf', []], + 'X' => 'timestamp', + 'Y' => 'year', + 'YY' => ['rawFormat', ['y']], + 'YYYY' => ['getPaddedUnit', ['year', 4]], + 'YYYYY' => ['getPaddedUnit', ['year', 5]], + 'YYYYYY' => function (CarbonInterface $date) { + return ($date->year < 0 ? '' : '+').$date->getPaddedUnit('year', 6); + }, + 'z' => ['rawFormat', ['T']], + 'zz' => 'tzName', + 'Z' => ['getOffsetString', []], + 'ZZ' => ['getOffsetString', ['']], + ]; + } + + return $units; + } + + /** + * Returns a unit of the instance padded with 0 by default or any other string if specified. + * + * @param string $unit Carbon unit name + * @param int $length Length of the output (2 by default) + * @param string $padString String to use for padding ("0" by default) + * @param int $padType Side(s) to pad (STR_PAD_LEFT by default) + * + * @return string + */ + public function getPaddedUnit($unit, $length = 2, $padString = '0', $padType = STR_PAD_LEFT) + { + return ($this->$unit < 0 ? '-' : '').str_pad((string) abs($this->$unit), $length, $padString, $padType); + } + + /** + * Return a property with its ordinal. + * + * @param string $key + * @param string|null $period + * + * @return string + */ + public function ordinal(string $key, ?string $period = null): string + { + $number = $this->$key; + $result = $this->translate('ordinal', [ + ':number' => $number, + ':period' => (string) $period, + ]); + + return (string) ($result === 'ordinal' ? $number : $result); + } + + /** + * Return the meridiem of the current time in the current locale. + * + * @param bool $isLower if true, returns lowercase variant if available in the current locale. + * + * @return string + */ + public function meridiem(bool $isLower = false): string + { + $hour = $this->hour; + $index = $hour < 12 ? 0 : 1; + + if ($isLower) { + $key = 'meridiem.'.($index + 2); + $result = $this->translate($key); + + if ($result !== $key) { + return $result; + } + } + + $key = "meridiem.$index"; + $result = $this->translate($key); + if ($result === $key) { + $result = $this->translate('meridiem', [ + ':hour' => $this->hour, + ':minute' => $this->minute, + ':isLower' => $isLower, + ]); + + if ($result === 'meridiem') { + return $isLower ? $this->latinMeridiem : $this->latinUpperMeridiem; + } + } elseif ($isLower) { + $result = mb_strtolower($result); + } + + return $result; + } + + /** + * Returns the alternative number for a given date property if available in the current locale. + * + * @param string $key date property + * + * @return string + */ + public function getAltNumber(string $key): string + { + return $this->translateNumber(\strlen($key) > 1 ? $this->$key : $this->rawFormat('h')); + } + + /** + * Format in the current language using ISO replacement patterns. + * + * @param string $format + * @param string|null $originalFormat provide context if a chunk has been passed alone + * + * @return string + */ + public function isoFormat(string $format, ?string $originalFormat = null): string + { + $result = ''; + $length = mb_strlen($format); + $originalFormat = $originalFormat ?: $format; + $inEscaped = false; + $formats = null; + $units = null; + + for ($i = 0; $i < $length; $i++) { + $char = mb_substr($format, $i, 1); + + if ($char === '\\') { + $result .= mb_substr($format, ++$i, 1); + + continue; + } + + if ($char === '[' && !$inEscaped) { + $inEscaped = true; + + continue; + } + + if ($char === ']' && $inEscaped) { + $inEscaped = false; + + continue; + } + + if ($inEscaped) { + $result .= $char; + + continue; + } + + $input = mb_substr($format, $i); + + if (preg_match('/^(LTS|LT|l{1,4}|L{1,4})/', $input, $match)) { + if ($formats === null) { + $formats = $this->getIsoFormats(); + } + + $code = $match[0]; + $sequence = $formats[$code] ?? preg_replace_callback( + '/MMMM|MM|DD|dddd/', + function ($code) { + return mb_substr($code[0], 1); + }, + $formats[strtoupper($code)] ?? '' + ); + $rest = mb_substr($format, $i + mb_strlen($code)); + $format = mb_substr($format, 0, $i).$sequence.$rest; + $length = mb_strlen($format); + $input = $sequence.$rest; + } + + if (preg_match('/^'.CarbonInterface::ISO_FORMAT_REGEXP.'/', $input, $match)) { + $code = $match[0]; + + if ($units === null) { + $units = static::getIsoUnits(); + } + + $sequence = $units[$code] ?? ''; + + if ($sequence instanceof Closure) { + $sequence = $sequence($this, $originalFormat); + } elseif (\is_array($sequence)) { + try { + $sequence = $this->{$sequence[0]}(...$sequence[1]); + } catch (ReflectionException | InvalidArgumentException | BadMethodCallException $e) { + $sequence = ''; + } + } elseif (\is_string($sequence)) { + $sequence = $this->$sequence ?? $code; + } + + $format = mb_substr($format, 0, $i).$sequence.mb_substr($format, $i + mb_strlen($code)); + $i += mb_strlen((string) $sequence) - 1; + $length = mb_strlen($format); + $char = $sequence; + } + + $result .= $char; + } + + return $result; + } + + /** + * List of replacements from date() format to isoFormat(). + * + * @return array + */ + public static function getFormatsToIsoReplacements() + { + static $replacements = null; + + if ($replacements === null) { + $replacements = [ + 'd' => true, + 'D' => 'ddd', + 'j' => true, + 'l' => 'dddd', + 'N' => true, + 'S' => function ($date) { + $day = $date->rawFormat('j'); + + return str_replace((string) $day, '', $date->isoFormat('Do')); + }, + 'w' => true, + 'z' => true, + 'W' => true, + 'F' => 'MMMM', + 'm' => true, + 'M' => 'MMM', + 'n' => true, + 't' => true, + 'L' => true, + 'o' => true, + 'Y' => true, + 'y' => true, + 'a' => 'a', + 'A' => 'A', + 'B' => true, + 'g' => true, + 'G' => true, + 'h' => true, + 'H' => true, + 'i' => true, + 's' => true, + 'u' => true, + 'v' => true, + 'E' => true, + 'I' => true, + 'O' => true, + 'P' => true, + 'Z' => true, + 'c' => true, + 'r' => true, + 'U' => true, + ]; + } + + return $replacements; + } + + /** + * Format as ->format() do (using date replacements patterns from https://php.net/manual/en/function.date.php) + * but translate words whenever possible (months, day names, etc.) using the current locale. + * + * @param string $format + * + * @return string + */ + public function translatedFormat(string $format): string + { + $replacements = static::getFormatsToIsoReplacements(); + $context = ''; + $isoFormat = ''; + $length = mb_strlen($format); + + for ($i = 0; $i < $length; $i++) { + $char = mb_substr($format, $i, 1); + + if ($char === '\\') { + $replacement = mb_substr($format, $i, 2); + $isoFormat .= $replacement; + $i++; + + continue; + } + + if (!isset($replacements[$char])) { + $replacement = preg_match('/^[A-Za-z]$/', $char) ? "\\$char" : $char; + $isoFormat .= $replacement; + $context .= $replacement; + + continue; + } + + $replacement = $replacements[$char]; + + if ($replacement === true) { + static $contextReplacements = null; + + if ($contextReplacements === null) { + $contextReplacements = [ + 'm' => 'MM', + 'd' => 'DD', + 't' => 'D', + 'j' => 'D', + 'N' => 'e', + 'w' => 'e', + 'n' => 'M', + 'o' => 'YYYY', + 'Y' => 'YYYY', + 'y' => 'YY', + 'g' => 'h', + 'G' => 'H', + 'h' => 'hh', + 'H' => 'HH', + 'i' => 'mm', + 's' => 'ss', + ]; + } + + $isoFormat .= '['.$this->rawFormat($char).']'; + $context .= $contextReplacements[$char] ?? ' '; + + continue; + } + + if ($replacement instanceof Closure) { + $replacement = '['.$replacement($this).']'; + $isoFormat .= $replacement; + $context .= $replacement; + + continue; + } + + $isoFormat .= $replacement; + $context .= $replacement; + } + + return $this->isoFormat($isoFormat, $context); + } + + /** + * Returns the offset hour and minute formatted with +/- and a given separator (":" by default). + * For example, if the time zone is 9 hours 30 minutes, you'll get "+09:30", with "@@" as first + * argument, "+09@@30", with "" as first argument, "+0930". Negative offset will return something + * like "-12:00". + * + * @param string $separator string to place between hours and minutes (":" by default) + * + * @return string + */ + public function getOffsetString($separator = ':') + { + $second = $this->getOffset(); + $symbol = $second < 0 ? '-' : '+'; + $minute = abs($second) / static::SECONDS_PER_MINUTE; + $hour = str_pad((string) floor($minute / static::MINUTES_PER_HOUR), 2, '0', STR_PAD_LEFT); + $minute = str_pad((string) (((int) $minute) % static::MINUTES_PER_HOUR), 2, '0', STR_PAD_LEFT); + + return "$symbol$hour$separator$minute"; + } + + protected static function executeStaticCallable($macro, ...$parameters) + { + return static::bindMacroContext(null, function () use (&$macro, &$parameters) { + if ($macro instanceof Closure) { + $boundMacro = @Closure::bind($macro, null, static::class); + + return ($boundMacro ?: $macro)(...$parameters); + } + + return $macro(...$parameters); + }); + } + + /** + * Dynamically handle calls to the class. + * + * @param string $method magic method name called + * @param array $parameters parameters list + * + * @throws BadMethodCallException + * + * @return mixed + */ + public static function __callStatic($method, $parameters) + { + if (!static::hasMacro($method)) { + foreach (static::getGenericMacros() as $callback) { + try { + return static::executeStaticCallable($callback, $method, ...$parameters); + } catch (BadMethodCallException $exception) { + continue; + } + } + if (static::isStrictModeEnabled()) { + throw new UnknownMethodException(sprintf('%s::%s', static::class, $method)); + } + + return null; + } + + return static::executeStaticCallable(static::$globalMacros[$method], ...$parameters); + } + + /** + * Set specified unit to new given value. + * + * @param string $unit year, month, day, hour, minute, second or microsecond + * @param int $value new value for given unit + * + * @return static + */ + public function setUnit($unit, $value = null) + { + $unit = static::singularUnit($unit); + $dateUnits = ['year', 'month', 'day']; + if (\in_array($unit, $dateUnits)) { + return $this->setDate(...array_map(function ($name) use ($unit, $value) { + return (int) ($name === $unit ? $value : $this->$name); + }, $dateUnits)); + } + + $units = ['hour', 'minute', 'second', 'micro']; + if ($unit === 'millisecond' || $unit === 'milli') { + $value *= 1000; + $unit = 'micro'; + } elseif ($unit === 'microsecond') { + $unit = 'micro'; + } + + return $this->setTime(...array_map(function ($name) use ($unit, $value) { + return (int) ($name === $unit ? $value : $this->$name); + }, $units)); + } + + /** + * Returns standardized singular of a given singular/plural unit name (in English). + * + * @param string $unit + * + * @return string + */ + public static function singularUnit(string $unit): string + { + $unit = rtrim(mb_strtolower($unit), 's'); + + if ($unit === 'centurie') { + return 'century'; + } + + if ($unit === 'millennia') { + return 'millennium'; + } + + return $unit; + } + + /** + * Returns standardized plural of a given singular/plural unit name (in English). + * + * @param string $unit + * + * @return string + */ + public static function pluralUnit(string $unit): string + { + $unit = rtrim(strtolower($unit), 's'); + + if ($unit === 'century') { + return 'centuries'; + } + + if ($unit === 'millennium' || $unit === 'millennia') { + return 'millennia'; + } + + return "{$unit}s"; + } + + protected function executeCallable($macro, ...$parameters) + { + if ($macro instanceof Closure) { + $boundMacro = @$macro->bindTo($this, static::class) ?: @$macro->bindTo(null, static::class); + + return ($boundMacro ?: $macro)(...$parameters); + } + + return $macro(...$parameters); + } + + protected function executeCallableWithContext($macro, ...$parameters) + { + return static::bindMacroContext($this, function () use (&$macro, &$parameters) { + return $this->executeCallable($macro, ...$parameters); + }); + } + + protected static function getGenericMacros() + { + foreach (static::$globalGenericMacros as $list) { + foreach ($list as $macro) { + yield $macro; + } + } + } + + /** + * Dynamically handle calls to the class. + * + * @param string $method magic method name called + * @param array $parameters parameters list + * + * @throws UnknownMethodException|BadMethodCallException|ReflectionException|Throwable + * + * @return mixed + */ + public function __call($method, $parameters) + { + $diffSizes = [ + // @mode diffForHumans + 'short' => true, + // @mode diffForHumans + 'long' => false, + ]; + $diffSyntaxModes = [ + // @call diffForHumans + 'Absolute' => CarbonInterface::DIFF_ABSOLUTE, + // @call diffForHumans + 'Relative' => CarbonInterface::DIFF_RELATIVE_AUTO, + // @call diffForHumans + 'RelativeToNow' => CarbonInterface::DIFF_RELATIVE_TO_NOW, + // @call diffForHumans + 'RelativeToOther' => CarbonInterface::DIFF_RELATIVE_TO_OTHER, + ]; + $sizePattern = implode('|', array_keys($diffSizes)); + $syntaxPattern = implode('|', array_keys($diffSyntaxModes)); + + if (preg_match("/^(?<size>$sizePattern)(?<syntax>$syntaxPattern)DiffForHumans$/", $method, $match)) { + $dates = array_filter($parameters, function ($parameter) { + return $parameter instanceof DateTimeInterface; + }); + $other = null; + + if (\count($dates)) { + $key = key($dates); + $other = current($dates); + array_splice($parameters, $key, 1); + } + + return $this->diffForHumans($other, $diffSyntaxModes[$match['syntax']], $diffSizes[$match['size']], ...$parameters); + } + + $roundedValue = $this->callRoundMethod($method, $parameters); + + if ($roundedValue !== null) { + return $roundedValue; + } + + $unit = rtrim($method, 's'); + + if (str_starts_with($unit, 'is')) { + $word = substr($unit, 2); + + if (\in_array($word, static::$days, true)) { + return $this->isDayOfWeek($word); + } + + switch ($word) { + // @call is Check if the current instance has UTC timezone. (Both isUtc and isUTC cases are valid.) + case 'Utc': + case 'UTC': + return $this->utc; + // @call is Check if the current instance has non-UTC timezone. + case 'Local': + return $this->local; + // @call is Check if the current instance is a valid date. + case 'Valid': + return $this->year !== 0; + // @call is Check if the current instance is in a daylight saving time. + case 'DST': + return $this->dst; + } + } + + $action = substr($unit, 0, 3); + $overflow = null; + + if ($action === 'set') { + $unit = strtolower(substr($unit, 3)); + } + + if (\in_array($unit, static::$units, true)) { + return $this->setUnit($unit, ...$parameters); + } + + if ($action === 'add' || $action === 'sub') { + $unit = substr($unit, 3); + + if (str_starts_with($unit, 'Real')) { + $unit = static::singularUnit(substr($unit, 4)); + + return $this->{"{$action}RealUnit"}($unit, ...$parameters); + } + + if (preg_match('/^(Month|Quarter|Year|Decade|Century|Centurie|Millennium|Millennia)s?(No|With|Without|WithNo)Overflow$/', $unit, $match)) { + $unit = $match[1]; + $overflow = $match[2] === 'With'; + } + + $unit = static::singularUnit($unit); + } + + if (static::isModifiableUnit($unit)) { + return $this->{"{$action}Unit"}($unit, $this->getMagicParameter($parameters, 0, 'value', 1), $overflow); + } + + $sixFirstLetters = substr($unit, 0, 6); + $factor = -1; + + if ($sixFirstLetters === 'isLast') { + $sixFirstLetters = 'isNext'; + $factor = 1; + } + + if ($sixFirstLetters === 'isNext') { + $lowerUnit = strtolower(substr($unit, 6)); + + if (static::isModifiableUnit($lowerUnit)) { + return $this->copy()->addUnit($lowerUnit, $factor, false)->isSameUnit($lowerUnit, ...$parameters); + } + } + + if ($sixFirstLetters === 'isSame') { + try { + return $this->isSameUnit(strtolower(substr($unit, 6)), ...$parameters); + } catch (BadComparisonUnitException $exception) { + // Try next + } + } + + if (str_starts_with($unit, 'isCurrent')) { + try { + return $this->isCurrentUnit(strtolower(substr($unit, 9))); + } catch (BadComparisonUnitException | BadMethodCallException $exception) { + // Try next + } + } + + if (str_ends_with($method, 'Until')) { + try { + $unit = static::singularUnit(substr($method, 0, -5)); + + return $this->range( + $this->getMagicParameter($parameters, 0, 'endDate', $this), + $this->getMagicParameter($parameters, 1, 'factor', 1), + $unit + ); + } catch (InvalidArgumentException $exception) { + // Try macros + } + } + + return static::bindMacroContext($this, function () use (&$method, &$parameters) { + $macro = $this->getLocalMacro($method); + + if (!$macro) { + foreach ([$this->localGenericMacros ?: [], static::getGenericMacros()] as $list) { + foreach ($list as $callback) { + try { + return $this->executeCallable($callback, $method, ...$parameters); + } catch (BadMethodCallException $exception) { + continue; + } + } + } + + if ($this->localStrictModeEnabled ?? static::isStrictModeEnabled()) { + throw new UnknownMethodException($method); + } + + return null; + } + + return $this->executeCallable($macro, ...$parameters); + }); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/DeprecatedProperties.php b/vendor/nesbot/carbon/src/Carbon/Traits/DeprecatedProperties.php new file mode 100644 index 0000000..5acc6f5 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/DeprecatedProperties.php @@ -0,0 +1,61 @@ +<?php + +declare(strict_types=1); + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +trait DeprecatedProperties +{ + /** + * the day of week in current locale LC_TIME + * + * @var string + * + * @deprecated It uses OS language package and strftime() which is deprecated since PHP 8.1. + * Use ->isoFormat('MMM') instead. + * Deprecated since 2.55.0 + */ + public $localeDayOfWeek; + + /** + * the abbreviated day of week in current locale LC_TIME + * + * @var string + * + * @deprecated It uses OS language package and strftime() which is deprecated since PHP 8.1. + * Use ->isoFormat('dddd') instead. + * Deprecated since 2.55.0 + */ + public $shortLocaleDayOfWeek; + + /** + * the month in current locale LC_TIME + * + * @var string + * + * @deprecated It uses OS language package and strftime() which is deprecated since PHP 8.1. + * Use ->isoFormat('ddd') instead. + * Deprecated since 2.55.0 + */ + public $localeMonth; + + /** + * the abbreviated month in current locale LC_TIME + * + * @var string + * + * @deprecated It uses OS language package and strftime() which is deprecated since PHP 8.1. + * Use ->isoFormat('MMMM') instead. + * Deprecated since 2.55.0 + */ + public $shortLocaleMonth; +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Difference.php b/vendor/nesbot/carbon/src/Carbon/Traits/Difference.php new file mode 100644 index 0000000..4f1fcec --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Difference.php @@ -0,0 +1,1182 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use Carbon\Carbon; +use Carbon\CarbonImmutable; +use Carbon\CarbonInterface; +use Carbon\CarbonInterval; +use Carbon\CarbonPeriod; +use Carbon\Translator; +use Closure; +use DateInterval; +use DateTimeInterface; +use ReturnTypeWillChange; + +/** + * Trait Difference. + * + * Depends on the following methods: + * + * @method bool lessThan($date) + * @method static copy() + * @method static resolveCarbon($date = null) + * @method static Translator translator() + */ +trait Difference +{ + /** + * @codeCoverageIgnore + * + * @param CarbonInterval $diff + */ + protected static function fixNegativeMicroseconds(CarbonInterval $diff) + { + if ($diff->s !== 0 || $diff->i !== 0 || $diff->h !== 0 || $diff->d !== 0 || $diff->m !== 0 || $diff->y !== 0) { + $diff->f = (round($diff->f * 1000000) + 1000000) / 1000000; + $diff->s--; + + if ($diff->s < 0) { + $diff->s += 60; + $diff->i--; + + if ($diff->i < 0) { + $diff->i += 60; + $diff->h--; + + if ($diff->h < 0) { + $diff->h += 24; + $diff->d--; + + if ($diff->d < 0) { + $diff->d += 30; + $diff->m--; + + if ($diff->m < 0) { + $diff->m += 12; + $diff->y--; + } + } + } + } + } + + return; + } + + $diff->f *= -1; + $diff->invert(); + } + + /** + * @param DateInterval $diff + * @param bool $absolute + * + * @return CarbonInterval + */ + protected static function fixDiffInterval(DateInterval $diff, $absolute, array $skip = []) + { + $diff = CarbonInterval::instance($diff, $skip); + + // Work-around for https://bugs.php.net/bug.php?id=77145 + // @codeCoverageIgnoreStart + if ($diff->f > 0 && $diff->y === -1 && $diff->m === 11 && $diff->d >= 27 && $diff->h === 23 && $diff->i === 59 && $diff->s === 59) { + $diff->y = 0; + $diff->m = 0; + $diff->d = 0; + $diff->h = 0; + $diff->i = 0; + $diff->s = 0; + $diff->f = (1000000 - round($diff->f * 1000000)) / 1000000; + $diff->invert(); + } elseif ($diff->f < 0) { + static::fixNegativeMicroseconds($diff); + } + // @codeCoverageIgnoreEnd + + if ($absolute && $diff->invert) { + $diff->invert(); + } + + return $diff; + } + + /** + * Get the difference as a DateInterval instance. + * Return relative interval (negative if $absolute flag is not set to true and the given date is before + * current one). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return DateInterval + */ + #[ReturnTypeWillChange] + public function diff($date = null, $absolute = false) + { + $other = $this->resolveCarbon($date); + + // Work-around for https://bugs.php.net/bug.php?id=81458 + // It was initially introduced for https://bugs.php.net/bug.php?id=80998 + // The very specific case of 80998 was fixed in PHP 8.1beta3, but it introduced 81458 + // So we still need to keep this for now + // @codeCoverageIgnoreStart + if (version_compare(PHP_VERSION, '8.1.0-dev', '>=') && $other->tz !== $this->tz) { + $other = $other->avoidMutation()->tz($this->tz); + } + // @codeCoverageIgnoreEnd + + return parent::diff($other, (bool) $absolute); + } + + /** + * Get the difference as a CarbonInterval instance. + * Return relative interval (negative if $absolute flag is not set to true and the given date is before + * current one). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return CarbonInterval + */ + public function diffAsCarbonInterval($date = null, $absolute = true, array $skip = []) + { + return static::fixDiffInterval($this->diff($this->resolveCarbon($date), $absolute), $absolute, $skip); + } + + /** + * Get the difference in years + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInYears($date = null, $absolute = true) + { + return (int) $this->diff($this->resolveCarbon($date), $absolute)->format('%r%y'); + } + + /** + * Get the difference in quarters rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInQuarters($date = null, $absolute = true) + { + return (int) ($this->diffInMonths($date, $absolute) / static::MONTHS_PER_QUARTER); + } + + /** + * Get the difference in months rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInMonths($date = null, $absolute = true) + { + $date = $this->resolveCarbon($date)->avoidMutation()->tz($this->tz); + + [$yearStart, $monthStart, $dayStart] = explode('-', $this->format('Y-m-dHisu')); + [$yearEnd, $monthEnd, $dayEnd] = explode('-', $date->format('Y-m-dHisu')); + + $diff = (((int) $yearEnd) - ((int) $yearStart)) * static::MONTHS_PER_YEAR + + ((int) $monthEnd) - ((int) $monthStart); + + if ($diff > 0) { + $diff -= ($dayStart > $dayEnd ? 1 : 0); + } elseif ($diff < 0) { + $diff += ($dayStart < $dayEnd ? 1 : 0); + } + + return $absolute ? abs($diff) : $diff; + } + + /** + * Get the difference in weeks rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInWeeks($date = null, $absolute = true) + { + return (int) ($this->diffInDays($date, $absolute) / static::DAYS_PER_WEEK); + } + + /** + * Get the difference in days rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInDays($date = null, $absolute = true) + { + return $this->getIntervalDayDiff($this->diff($this->resolveCarbon($date), $absolute)); + } + + /** + * Get the difference in days using a filter closure rounded down. + * + * @param Closure $callback + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInDaysFiltered(Closure $callback, $date = null, $absolute = true) + { + return $this->diffFiltered(CarbonInterval::day(), $callback, $date, $absolute); + } + + /** + * Get the difference in hours using a filter closure rounded down. + * + * @param Closure $callback + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInHoursFiltered(Closure $callback, $date = null, $absolute = true) + { + return $this->diffFiltered(CarbonInterval::hour(), $callback, $date, $absolute); + } + + /** + * Get the difference by the given interval using a filter closure. + * + * @param CarbonInterval $ci An interval to traverse by + * @param Closure $callback + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffFiltered(CarbonInterval $ci, Closure $callback, $date = null, $absolute = true) + { + $start = $this; + $end = $this->resolveCarbon($date); + $inverse = false; + + if ($end < $start) { + $start = $end; + $end = $this; + $inverse = true; + } + + $options = CarbonPeriod::EXCLUDE_END_DATE | ($this->isMutable() ? 0 : CarbonPeriod::IMMUTABLE); + $diff = $ci->toPeriod($start, $end, $options)->filter($callback)->count(); + + return $inverse && !$absolute ? -$diff : $diff; + } + + /** + * Get the difference in weekdays rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInWeekdays($date = null, $absolute = true) + { + return $this->diffInDaysFiltered(function (CarbonInterface $date) { + return $date->isWeekday(); + }, $date, $absolute); + } + + /** + * Get the difference in weekend days using a filter rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInWeekendDays($date = null, $absolute = true) + { + return $this->diffInDaysFiltered(function (CarbonInterface $date) { + return $date->isWeekend(); + }, $date, $absolute); + } + + /** + * Get the difference in hours rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInHours($date = null, $absolute = true) + { + return (int) ($this->diffInSeconds($date, $absolute) / static::SECONDS_PER_MINUTE / static::MINUTES_PER_HOUR); + } + + /** + * Get the difference in hours rounded down using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInRealHours($date = null, $absolute = true) + { + return (int) ($this->diffInRealSeconds($date, $absolute) / static::SECONDS_PER_MINUTE / static::MINUTES_PER_HOUR); + } + + /** + * Get the difference in minutes rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInMinutes($date = null, $absolute = true) + { + return (int) ($this->diffInSeconds($date, $absolute) / static::SECONDS_PER_MINUTE); + } + + /** + * Get the difference in minutes rounded down using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInRealMinutes($date = null, $absolute = true) + { + return (int) ($this->diffInRealSeconds($date, $absolute) / static::SECONDS_PER_MINUTE); + } + + /** + * Get the difference in seconds rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInSeconds($date = null, $absolute = true) + { + $diff = $this->diff($date); + + if ($diff->days === 0) { + $diff = static::fixDiffInterval($diff, $absolute); + } + + $value = (((($diff->m || $diff->y ? $diff->days : $diff->d) * static::HOURS_PER_DAY) + + $diff->h) * static::MINUTES_PER_HOUR + + $diff->i) * static::SECONDS_PER_MINUTE + + $diff->s; + + return $absolute || !$diff->invert ? $value : -$value; + } + + /** + * Get the difference in microseconds. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInMicroseconds($date = null, $absolute = true) + { + $diff = $this->diff($date); + $value = (int) round(((((($diff->m || $diff->y ? $diff->days : $diff->d) * static::HOURS_PER_DAY) + + $diff->h) * static::MINUTES_PER_HOUR + + $diff->i) * static::SECONDS_PER_MINUTE + + ($diff->f + $diff->s)) * static::MICROSECONDS_PER_SECOND); + + return $absolute || !$diff->invert ? $value : -$value; + } + + /** + * Get the difference in milliseconds rounded down. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInMilliseconds($date = null, $absolute = true) + { + return (int) ($this->diffInMicroseconds($date, $absolute) / static::MICROSECONDS_PER_MILLISECOND); + } + + /** + * Get the difference in seconds using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInRealSeconds($date = null, $absolute = true) + { + /** @var CarbonInterface $date */ + $date = $this->resolveCarbon($date); + $value = $date->getTimestamp() - $this->getTimestamp(); + + return $absolute ? abs($value) : $value; + } + + /** + * Get the difference in microseconds using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInRealMicroseconds($date = null, $absolute = true) + { + /** @var CarbonInterface $date */ + $date = $this->resolveCarbon($date); + $value = ($date->timestamp - $this->timestamp) * static::MICROSECONDS_PER_SECOND + + $date->micro - $this->micro; + + return $absolute ? abs($value) : $value; + } + + /** + * Get the difference in milliseconds rounded down using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return int + */ + public function diffInRealMilliseconds($date = null, $absolute = true) + { + return (int) ($this->diffInRealMicroseconds($date, $absolute) / static::MICROSECONDS_PER_MILLISECOND); + } + + /** + * Get the difference in seconds as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInSeconds($date = null, $absolute = true) + { + return (float) ($this->diffInMicroseconds($date, $absolute) / static::MICROSECONDS_PER_SECOND); + } + + /** + * Get the difference in minutes as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInMinutes($date = null, $absolute = true) + { + return $this->floatDiffInSeconds($date, $absolute) / static::SECONDS_PER_MINUTE; + } + + /** + * Get the difference in hours as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInHours($date = null, $absolute = true) + { + return $this->floatDiffInMinutes($date, $absolute) / static::MINUTES_PER_HOUR; + } + + /** + * Get the difference in days as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInDays($date = null, $absolute = true) + { + $hoursDiff = $this->floatDiffInHours($date, $absolute); + $interval = $this->diff($date, $absolute); + + if ($interval->y === 0 && $interval->m === 0 && $interval->d === 0) { + return $hoursDiff / static::HOURS_PER_DAY; + } + + $daysDiff = $this->getIntervalDayDiff($interval); + + return $daysDiff + fmod($hoursDiff, static::HOURS_PER_DAY) / static::HOURS_PER_DAY; + } + + /** + * Get the difference in weeks as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInWeeks($date = null, $absolute = true) + { + return $this->floatDiffInDays($date, $absolute) / static::DAYS_PER_WEEK; + } + + /** + * Get the difference in months as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInMonths($date = null, $absolute = true) + { + $start = $this; + $end = $this->resolveCarbon($date); + $ascending = ($start <= $end); + $sign = $absolute || $ascending ? 1 : -1; + if (!$ascending) { + [$start, $end] = [$end, $start]; + } + $monthsDiff = $start->diffInMonths($end); + /** @var Carbon|CarbonImmutable $floorEnd */ + $floorEnd = $start->avoidMutation()->addMonths($monthsDiff); + + if ($floorEnd >= $end) { + return $sign * $monthsDiff; + } + + /** @var Carbon|CarbonImmutable $startOfMonthAfterFloorEnd */ + $startOfMonthAfterFloorEnd = $floorEnd->avoidMutation()->addMonth()->startOfMonth(); + + if ($startOfMonthAfterFloorEnd > $end) { + return $sign * ($monthsDiff + $floorEnd->floatDiffInDays($end) / $floorEnd->daysInMonth); + } + + return $sign * ($monthsDiff + $floorEnd->floatDiffInDays($startOfMonthAfterFloorEnd) / $floorEnd->daysInMonth + $startOfMonthAfterFloorEnd->floatDiffInDays($end) / $end->daysInMonth); + } + + /** + * Get the difference in year as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInYears($date = null, $absolute = true) + { + $start = $this; + $end = $this->resolveCarbon($date); + $ascending = ($start <= $end); + $sign = $absolute || $ascending ? 1 : -1; + if (!$ascending) { + [$start, $end] = [$end, $start]; + } + $yearsDiff = $start->diffInYears($end); + /** @var Carbon|CarbonImmutable $floorEnd */ + $floorEnd = $start->avoidMutation()->addYears($yearsDiff); + + if ($floorEnd >= $end) { + return $sign * $yearsDiff; + } + + /** @var Carbon|CarbonImmutable $startOfYearAfterFloorEnd */ + $startOfYearAfterFloorEnd = $floorEnd->avoidMutation()->addYear()->startOfYear(); + + if ($startOfYearAfterFloorEnd > $end) { + return $sign * ($yearsDiff + $floorEnd->floatDiffInDays($end) / $floorEnd->daysInYear); + } + + return $sign * ($yearsDiff + $floorEnd->floatDiffInDays($startOfYearAfterFloorEnd) / $floorEnd->daysInYear + $startOfYearAfterFloorEnd->floatDiffInDays($end) / $end->daysInYear); + } + + /** + * Get the difference in seconds as float (microsecond-precision) using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInRealSeconds($date = null, $absolute = true) + { + return $this->diffInRealMicroseconds($date, $absolute) / static::MICROSECONDS_PER_SECOND; + } + + /** + * Get the difference in minutes as float (microsecond-precision) using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInRealMinutes($date = null, $absolute = true) + { + return $this->floatDiffInRealSeconds($date, $absolute) / static::SECONDS_PER_MINUTE; + } + + /** + * Get the difference in hours as float (microsecond-precision) using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInRealHours($date = null, $absolute = true) + { + return $this->floatDiffInRealMinutes($date, $absolute) / static::MINUTES_PER_HOUR; + } + + /** + * Get the difference in days as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInRealDays($date = null, $absolute = true) + { + $date = $this->resolveUTC($date); + $utc = $this->avoidMutation()->utc(); + $hoursDiff = $utc->floatDiffInRealHours($date, $absolute); + + return ($hoursDiff < 0 ? -1 : 1) * $utc->diffInDays($date) + fmod($hoursDiff, static::HOURS_PER_DAY) / static::HOURS_PER_DAY; + } + + /** + * Get the difference in weeks as float (microsecond-precision). + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInRealWeeks($date = null, $absolute = true) + { + return $this->floatDiffInRealDays($date, $absolute) / static::DAYS_PER_WEEK; + } + + /** + * Get the difference in months as float (microsecond-precision) using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInRealMonths($date = null, $absolute = true) + { + $start = $this; + $end = $this->resolveCarbon($date); + $ascending = ($start <= $end); + $sign = $absolute || $ascending ? 1 : -1; + if (!$ascending) { + [$start, $end] = [$end, $start]; + } + $monthsDiff = $start->diffInMonths($end); + /** @var Carbon|CarbonImmutable $floorEnd */ + $floorEnd = $start->avoidMutation()->addMonths($monthsDiff); + + if ($floorEnd >= $end) { + return $sign * $monthsDiff; + } + + /** @var Carbon|CarbonImmutable $startOfMonthAfterFloorEnd */ + $startOfMonthAfterFloorEnd = $floorEnd->avoidMutation()->addMonth()->startOfMonth(); + + if ($startOfMonthAfterFloorEnd > $end) { + return $sign * ($monthsDiff + $floorEnd->floatDiffInRealDays($end) / $floorEnd->daysInMonth); + } + + return $sign * ($monthsDiff + $floorEnd->floatDiffInRealDays($startOfMonthAfterFloorEnd) / $floorEnd->daysInMonth + $startOfMonthAfterFloorEnd->floatDiffInRealDays($end) / $end->daysInMonth); + } + + /** + * Get the difference in year as float (microsecond-precision) using timestamps. + * + * @param \Carbon\CarbonInterface|\DateTimeInterface|string|null $date + * @param bool $absolute Get the absolute of the difference + * + * @return float + */ + public function floatDiffInRealYears($date = null, $absolute = true) + { + $start = $this; + $end = $this->resolveCarbon($date); + $ascending = ($start <= $end); + $sign = $absolute || $ascending ? 1 : -1; + if (!$ascending) { + [$start, $end] = [$end, $start]; + } + $yearsDiff = $start->diffInYears($end); + /** @var Carbon|CarbonImmutable $floorEnd */ + $floorEnd = $start->avoidMutation()->addYears($yearsDiff); + + if ($floorEnd >= $end) { + return $sign * $yearsDiff; + } + + /** @var Carbon|CarbonImmutable $startOfYearAfterFloorEnd */ + $startOfYearAfterFloorEnd = $floorEnd->avoidMutation()->addYear()->startOfYear(); + + if ($startOfYearAfterFloorEnd > $end) { + return $sign * ($yearsDiff + $floorEnd->floatDiffInRealDays($end) / $floorEnd->daysInYear); + } + + return $sign * ($yearsDiff + $floorEnd->floatDiffInRealDays($startOfYearAfterFloorEnd) / $floorEnd->daysInYear + $startOfYearAfterFloorEnd->floatDiffInRealDays($end) / $end->daysInYear); + } + + /** + * The number of seconds since midnight. + * + * @return int + */ + public function secondsSinceMidnight() + { + return $this->diffInSeconds($this->avoidMutation()->startOfDay()); + } + + /** + * The number of seconds until 23:59:59. + * + * @return int + */ + public function secondsUntilEndOfDay() + { + return $this->diffInSeconds($this->avoidMutation()->endOfDay()); + } + + /** + * Get the difference in a human readable format in the current locale from current instance to an other + * instance given (or now if null given). + * + * @example + * ``` + * echo Carbon::tomorrow()->diffForHumans() . "\n"; + * echo Carbon::tomorrow()->diffForHumans(['parts' => 2]) . "\n"; + * echo Carbon::tomorrow()->diffForHumans(['parts' => 3, 'join' => true]) . "\n"; + * echo Carbon::tomorrow()->diffForHumans(Carbon::yesterday()) . "\n"; + * echo Carbon::tomorrow()->diffForHumans(Carbon::yesterday(), ['short' => true]) . "\n"; + * ``` + * + * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; + * if null passed, now will be used as comparison reference; + * if any other type, it will be converted to date and used as reference. + * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: + * - 'syntax' entry (see below) + * - 'short' entry (see below) + * - 'parts' entry (see below) + * - 'options' entry (see below) + * - 'skip' entry, list of units to skip (array of strings or a single string, + * ` it can be the unit name (singular or plural) or its shortcut + * ` (y, m, w, d, h, min, s, ms, µs). + * - 'aUnit' entry, prefer "an hour" over "1 hour" if true + * - 'join' entry determines how to join multiple parts of the string + * ` - if $join is a string, it's used as a joiner glue + * ` - if $join is a callable/closure, it get the list of string and should return a string + * ` - if $join is an array, the first item will be the default glue, and the second item + * ` will be used instead of the glue for the last item + * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) + * ` - if $join is missing, a space will be used as glue + * - 'other' entry (see above) + * - 'minimumUnit' entry determines the smallest unit of time to display can be long or + * ` short form of the units, e.g. 'hour' or 'h' (default value: s) + * if int passed, it add modifiers: + * Possible values: + * - CarbonInterface::DIFF_ABSOLUTE no modifiers + * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier + * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier + * Default value: CarbonInterface::DIFF_ABSOLUTE + * @param bool $short displays short format of time units + * @param int $parts maximum number of parts to display (default value: 1: single unit) + * @param int $options human diff options + * + * @return string + */ + public function diffForHumans($other = null, $syntax = null, $short = false, $parts = 1, $options = null) + { + /* @var CarbonInterface $this */ + if (\is_array($other)) { + $other['syntax'] = \array_key_exists('syntax', $other) ? $other['syntax'] : $syntax; + $syntax = $other; + $other = $syntax['other'] ?? null; + } + + $intSyntax = &$syntax; + if (\is_array($syntax)) { + $syntax['syntax'] = $syntax['syntax'] ?? null; + $intSyntax = &$syntax['syntax']; + } + $intSyntax = (int) ($intSyntax ?? static::DIFF_RELATIVE_AUTO); + $intSyntax = $intSyntax === static::DIFF_RELATIVE_AUTO && $other === null ? static::DIFF_RELATIVE_TO_NOW : $intSyntax; + + $parts = min(7, max(1, (int) $parts)); + $skip = \is_array($syntax) ? ($syntax['skip'] ?? []) : []; + + return $this->diffAsCarbonInterval($other, false, $skip) + ->setLocalTranslator($this->getLocalTranslator()) + ->forHumans($syntax, (bool) $short, $parts, $options ?? $this->localHumanDiffOptions ?? static::getHumanDiffOptions()); + } + + /** + * @alias diffForHumans + * + * Get the difference in a human readable format in the current locale from current instance to an other + * instance given (or now if null given). + * + * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; + * if null passed, now will be used as comparison reference; + * if any other type, it will be converted to date and used as reference. + * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: + * - 'syntax' entry (see below) + * - 'short' entry (see below) + * - 'parts' entry (see below) + * - 'options' entry (see below) + * - 'join' entry determines how to join multiple parts of the string + * ` - if $join is a string, it's used as a joiner glue + * ` - if $join is a callable/closure, it get the list of string and should return a string + * ` - if $join is an array, the first item will be the default glue, and the second item + * ` will be used instead of the glue for the last item + * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) + * ` - if $join is missing, a space will be used as glue + * - 'other' entry (see above) + * if int passed, it add modifiers: + * Possible values: + * - CarbonInterface::DIFF_ABSOLUTE no modifiers + * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier + * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier + * Default value: CarbonInterface::DIFF_ABSOLUTE + * @param bool $short displays short format of time units + * @param int $parts maximum number of parts to display (default value: 1: single unit) + * @param int $options human diff options + * + * @return string + */ + public function from($other = null, $syntax = null, $short = false, $parts = 1, $options = null) + { + return $this->diffForHumans($other, $syntax, $short, $parts, $options); + } + + /** + * @alias diffForHumans + * + * Get the difference in a human readable format in the current locale from current instance to an other + * instance given (or now if null given). + */ + public function since($other = null, $syntax = null, $short = false, $parts = 1, $options = null) + { + return $this->diffForHumans($other, $syntax, $short, $parts, $options); + } + + /** + * Get the difference in a human readable format in the current locale from an other + * instance given (or now if null given) to current instance. + * + * When comparing a value in the past to default now: + * 1 hour from now + * 5 months from now + * + * When comparing a value in the future to default now: + * 1 hour ago + * 5 months ago + * + * When comparing a value in the past to another value: + * 1 hour after + * 5 months after + * + * When comparing a value in the future to another value: + * 1 hour before + * 5 months before + * + * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; + * if null passed, now will be used as comparison reference; + * if any other type, it will be converted to date and used as reference. + * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: + * - 'syntax' entry (see below) + * - 'short' entry (see below) + * - 'parts' entry (see below) + * - 'options' entry (see below) + * - 'join' entry determines how to join multiple parts of the string + * ` - if $join is a string, it's used as a joiner glue + * ` - if $join is a callable/closure, it get the list of string and should return a string + * ` - if $join is an array, the first item will be the default glue, and the second item + * ` will be used instead of the glue for the last item + * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) + * ` - if $join is missing, a space will be used as glue + * - 'other' entry (see above) + * if int passed, it add modifiers: + * Possible values: + * - CarbonInterface::DIFF_ABSOLUTE no modifiers + * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier + * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier + * Default value: CarbonInterface::DIFF_ABSOLUTE + * @param bool $short displays short format of time units + * @param int $parts maximum number of parts to display (default value: 1: single unit) + * @param int $options human diff options + * + * @return string + */ + public function to($other = null, $syntax = null, $short = false, $parts = 1, $options = null) + { + if (!$syntax && !$other) { + $syntax = CarbonInterface::DIFF_RELATIVE_TO_NOW; + } + + return $this->resolveCarbon($other)->diffForHumans($this, $syntax, $short, $parts, $options); + } + + /** + * @alias to + * + * Get the difference in a human readable format in the current locale from an other + * instance given (or now if null given) to current instance. + * + * @param Carbon|\DateTimeInterface|string|array|null $other if array passed, will be used as parameters array, see $syntax below; + * if null passed, now will be used as comparison reference; + * if any other type, it will be converted to date and used as reference. + * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: + * - 'syntax' entry (see below) + * - 'short' entry (see below) + * - 'parts' entry (see below) + * - 'options' entry (see below) + * - 'join' entry determines how to join multiple parts of the string + * ` - if $join is a string, it's used as a joiner glue + * ` - if $join is a callable/closure, it get the list of string and should return a string + * ` - if $join is an array, the first item will be the default glue, and the second item + * ` will be used instead of the glue for the last item + * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) + * ` - if $join is missing, a space will be used as glue + * - 'other' entry (see above) + * if int passed, it add modifiers: + * Possible values: + * - CarbonInterface::DIFF_ABSOLUTE no modifiers + * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier + * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier + * Default value: CarbonInterface::DIFF_ABSOLUTE + * @param bool $short displays short format of time units + * @param int $parts maximum number of parts to display (default value: 1: single unit) + * @param int $options human diff options + * + * @return string + */ + public function until($other = null, $syntax = null, $short = false, $parts = 1, $options = null) + { + return $this->to($other, $syntax, $short, $parts, $options); + } + + /** + * Get the difference in a human readable format in the current locale from current + * instance to now. + * + * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: + * - 'syntax' entry (see below) + * - 'short' entry (see below) + * - 'parts' entry (see below) + * - 'options' entry (see below) + * - 'join' entry determines how to join multiple parts of the string + * ` - if $join is a string, it's used as a joiner glue + * ` - if $join is a callable/closure, it get the list of string and should return a string + * ` - if $join is an array, the first item will be the default glue, and the second item + * ` will be used instead of the glue for the last item + * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) + * ` - if $join is missing, a space will be used as glue + * if int passed, it add modifiers: + * Possible values: + * - CarbonInterface::DIFF_ABSOLUTE no modifiers + * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier + * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier + * Default value: CarbonInterface::DIFF_ABSOLUTE + * @param bool $short displays short format of time units + * @param int $parts maximum number of parts to display (default value: 1: single unit) + * @param int $options human diff options + * + * @return string + */ + public function fromNow($syntax = null, $short = false, $parts = 1, $options = null) + { + $other = null; + + if ($syntax instanceof DateTimeInterface) { + [$other, $syntax, $short, $parts, $options] = array_pad(\func_get_args(), 5, null); + } + + return $this->from($other, $syntax, $short, $parts, $options); + } + + /** + * Get the difference in a human readable format in the current locale from an other + * instance given to now + * + * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: + * - 'syntax' entry (see below) + * - 'short' entry (see below) + * - 'parts' entry (see below) + * - 'options' entry (see below) + * - 'join' entry determines how to join multiple parts of the string + * ` - if $join is a string, it's used as a joiner glue + * ` - if $join is a callable/closure, it get the list of string and should return a string + * ` - if $join is an array, the first item will be the default glue, and the second item + * ` will be used instead of the glue for the last item + * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) + * ` - if $join is missing, a space will be used as glue + * if int passed, it add modifiers: + * Possible values: + * - CarbonInterface::DIFF_ABSOLUTE no modifiers + * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier + * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier + * Default value: CarbonInterface::DIFF_ABSOLUTE + * @param bool $short displays short format of time units + * @param int $parts maximum number of parts to display (default value: 1: single part) + * @param int $options human diff options + * + * @return string + */ + public function toNow($syntax = null, $short = false, $parts = 1, $options = null) + { + return $this->to(null, $syntax, $short, $parts, $options); + } + + /** + * Get the difference in a human readable format in the current locale from an other + * instance given to now + * + * @param int|array $syntax if array passed, parameters will be extracted from it, the array may contains: + * - 'syntax' entry (see below) + * - 'short' entry (see below) + * - 'parts' entry (see below) + * - 'options' entry (see below) + * - 'join' entry determines how to join multiple parts of the string + * ` - if $join is a string, it's used as a joiner glue + * ` - if $join is a callable/closure, it get the list of string and should return a string + * ` - if $join is an array, the first item will be the default glue, and the second item + * ` will be used instead of the glue for the last item + * ` - if $join is true, it will be guessed from the locale ('list' translation file entry) + * ` - if $join is missing, a space will be used as glue + * if int passed, it add modifiers: + * Possible values: + * - CarbonInterface::DIFF_ABSOLUTE no modifiers + * - CarbonInterface::DIFF_RELATIVE_TO_NOW add ago/from now modifier + * - CarbonInterface::DIFF_RELATIVE_TO_OTHER add before/after modifier + * Default value: CarbonInterface::DIFF_ABSOLUTE + * @param bool $short displays short format of time units + * @param int $parts maximum number of parts to display (default value: 1: single part) + * @param int $options human diff options + * + * @return string + */ + public function ago($syntax = null, $short = false, $parts = 1, $options = null) + { + $other = null; + + if ($syntax instanceof DateTimeInterface) { + [$other, $syntax, $short, $parts, $options] = array_pad(\func_get_args(), 5, null); + } + + return $this->from($other, $syntax, $short, $parts, $options); + } + + /** + * Get the difference in a human readable format in the current locale from current instance to an other + * instance given (or now if null given). + * + * @return string + */ + public function timespan($other = null, $timezone = null) + { + if (!$other instanceof DateTimeInterface) { + $other = static::parse($other, $timezone); + } + + return $this->diffForHumans($other, [ + 'join' => ', ', + 'syntax' => CarbonInterface::DIFF_ABSOLUTE, + 'options' => CarbonInterface::NO_ZERO_DIFF, + 'parts' => -1, + ]); + } + + /** + * Returns either day of week + time (e.g. "Last Friday at 3:30 PM") if reference time is within 7 days, + * or a calendar date (e.g. "10/29/2017") otherwise. + * + * Language, date and time formats will change according to the current locale. + * + * @param Carbon|\DateTimeInterface|string|null $referenceTime + * @param array $formats + * + * @return string + */ + public function calendar($referenceTime = null, array $formats = []) + { + /** @var CarbonInterface $current */ + $current = $this->avoidMutation()->startOfDay(); + /** @var CarbonInterface $other */ + $other = $this->resolveCarbon($referenceTime)->avoidMutation()->setTimezone($this->getTimezone())->startOfDay(); + $diff = $other->diffInDays($current, false); + $format = $diff < -6 ? 'sameElse' : ( + $diff < -1 ? 'lastWeek' : ( + $diff < 0 ? 'lastDay' : ( + $diff < 1 ? 'sameDay' : ( + $diff < 2 ? 'nextDay' : ( + $diff < 7 ? 'nextWeek' : 'sameElse' + ) + ) + ) + ) + ); + $format = array_merge($this->getCalendarFormats(), $formats)[$format]; + if ($format instanceof Closure) { + $format = $format($current, $other) ?? ''; + } + + return $this->isoFormat((string) $format); + } + + private function getIntervalDayDiff(DateInterval $interval): int + { + $daysDiff = (int) $interval->format('%a'); + $sign = $interval->format('%r') === '-' ? -1 : 1; + + if (\is_int($interval->days) && + $interval->y === 0 && + $interval->m === 0 && + version_compare(PHP_VERSION, '8.1.0-dev', '<') && + abs($interval->d - $daysDiff) === 1 + ) { + $daysDiff = abs($interval->d); // @codeCoverageIgnore + } + + return $daysDiff * $sign; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php b/vendor/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php new file mode 100644 index 0000000..4cd66b6 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php @@ -0,0 +1,57 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use Carbon\CarbonInterval; +use Carbon\Exceptions\InvalidIntervalException; +use DateInterval; + +/** + * Trait to call rounding methods to interval or the interval of a period. + */ +trait IntervalRounding +{ + protected function callRoundMethod(string $method, array $parameters) + { + $action = substr($method, 0, 4); + + if ($action !== 'ceil') { + $action = substr($method, 0, 5); + } + + if (\in_array($action, ['round', 'floor', 'ceil'])) { + return $this->{$action.'Unit'}(substr($method, \strlen($action)), ...$parameters); + } + + return null; + } + + protected function roundWith($precision, $function) + { + $unit = 'second'; + + if ($precision instanceof DateInterval) { + $precision = (string) CarbonInterval::instance($precision); + } + + if (\is_string($precision) && preg_match('/^\s*(?<precision>\d+)?\s*(?<unit>\w+)(?<other>\W.*)?$/', $precision, $match)) { + if (trim($match['other'] ?? '') !== '') { + throw new InvalidIntervalException('Rounding is only possible with single unit intervals.'); + } + + $precision = (int) ($match['precision'] ?: 1); + $unit = $match['unit']; + } + + return $this->roundUnit($unit, $precision, $function); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php b/vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php new file mode 100644 index 0000000..82d7c32 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php @@ -0,0 +1,93 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use Carbon\Carbon; +use Carbon\CarbonImmutable; +use Carbon\CarbonInterface; +use Closure; +use DateTimeImmutable; +use DateTimeInterface; + +trait IntervalStep +{ + /** + * Step to apply instead of a fixed interval to get the new date. + * + * @var Closure|null + */ + protected $step; + + /** + * Get the dynamic step in use. + * + * @return Closure + */ + public function getStep(): ?Closure + { + return $this->step; + } + + /** + * Set a step to apply instead of a fixed interval to get the new date. + * + * Or pass null to switch to fixed interval. + * + * @param Closure|null $step + */ + public function setStep(?Closure $step): void + { + $this->step = $step; + } + + /** + * Take a date and apply either the step if set, or the current interval else. + * + * The interval/step is applied negatively (typically subtraction instead of addition) if $negated is true. + * + * @param DateTimeInterface $dateTime + * @param bool $negated + * + * @return CarbonInterface + */ + public function convertDate(DateTimeInterface $dateTime, bool $negated = false): CarbonInterface + { + /** @var CarbonInterface $carbonDate */ + $carbonDate = $dateTime instanceof CarbonInterface ? $dateTime : $this->resolveCarbon($dateTime); + + if ($this->step) { + return $carbonDate->setDateTimeFrom(($this->step)($carbonDate->avoidMutation(), $negated)); + } + + if ($negated) { + return $carbonDate->rawSub($this); + } + + return $carbonDate->rawAdd($this); + } + + /** + * Convert DateTimeImmutable instance to CarbonImmutable instance and DateTime instance to Carbon instance. + * + * @param DateTimeInterface $dateTime + * + * @return Carbon|CarbonImmutable + */ + private function resolveCarbon(DateTimeInterface $dateTime) + { + if ($dateTime instanceof DateTimeImmutable) { + return CarbonImmutable::instance($dateTime); + } + + return Carbon::instance($dateTime); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php b/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php new file mode 100644 index 0000000..ff24956 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php @@ -0,0 +1,838 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use Carbon\CarbonInterface; +use Carbon\Exceptions\InvalidTypeException; +use Carbon\Exceptions\NotLocaleAwareException; +use Carbon\Language; +use Carbon\Translator; +use Carbon\TranslatorStrongTypeInterface; +use Closure; +use Symfony\Component\Translation\TranslatorBagInterface; +use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\LocaleAwareInterface; +use Symfony\Contracts\Translation\TranslatorInterface as ContractsTranslatorInterface; + +if (interface_exists('Symfony\\Contracts\\Translation\\TranslatorInterface') && + !interface_exists('Symfony\\Component\\Translation\\TranslatorInterface') +) { + class_alias( + 'Symfony\\Contracts\\Translation\\TranslatorInterface', + 'Symfony\\Component\\Translation\\TranslatorInterface' + ); +} + +/** + * Trait Localization. + * + * Embed default and locale translators and translation base methods. + */ +trait Localization +{ + /** + * Default translator. + * + * @var \Symfony\Component\Translation\TranslatorInterface + */ + protected static $translator; + + /** + * Specific translator of the current instance. + * + * @var \Symfony\Component\Translation\TranslatorInterface + */ + protected $localTranslator; + + /** + * Options for diffForHumans(). + * + * @var int + */ + protected static $humanDiffOptions = CarbonInterface::NO_ZERO_DIFF; + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * @see settings + * + * @param int $humanDiffOptions + */ + public static function setHumanDiffOptions($humanDiffOptions) + { + static::$humanDiffOptions = $humanDiffOptions; + } + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * @see settings + * + * @param int $humanDiffOption + */ + public static function enableHumanDiffOption($humanDiffOption) + { + static::$humanDiffOptions = static::getHumanDiffOptions() | $humanDiffOption; + } + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * @see settings + * + * @param int $humanDiffOption + */ + public static function disableHumanDiffOption($humanDiffOption) + { + static::$humanDiffOptions = static::getHumanDiffOptions() & ~$humanDiffOption; + } + + /** + * Return default humanDiff() options (merged flags as integer). + * + * @return int + */ + public static function getHumanDiffOptions() + { + return static::$humanDiffOptions; + } + + /** + * Get the default translator instance in use. + * + * @return \Symfony\Component\Translation\TranslatorInterface + */ + public static function getTranslator() + { + return static::translator(); + } + + /** + * Set the default translator instance to use. + * + * @param \Symfony\Component\Translation\TranslatorInterface $translator + * + * @return void + */ + public static function setTranslator(TranslatorInterface $translator) + { + static::$translator = $translator; + } + + /** + * Return true if the current instance has its own translator. + * + * @return bool + */ + public function hasLocalTranslator() + { + return isset($this->localTranslator); + } + + /** + * Get the translator of the current instance or the default if none set. + * + * @return \Symfony\Component\Translation\TranslatorInterface + */ + public function getLocalTranslator() + { + return $this->localTranslator ?: static::translator(); + } + + /** + * Set the translator for the current instance. + * + * @param \Symfony\Component\Translation\TranslatorInterface $translator + * + * @return $this + */ + public function setLocalTranslator(TranslatorInterface $translator) + { + $this->localTranslator = $translator; + + return $this; + } + + /** + * Returns raw translation message for a given key. + * + * @param \Symfony\Component\Translation\TranslatorInterface $translator the translator to use + * @param string $key key to find + * @param string|null $locale current locale used if null + * @param string|null $default default value if translation returns the key + * + * @return string + */ + public static function getTranslationMessageWith($translator, string $key, ?string $locale = null, ?string $default = null) + { + if (!($translator instanceof TranslatorBagInterface && $translator instanceof TranslatorInterface)) { + throw new InvalidTypeException( + 'Translator does not implement '.TranslatorInterface::class.' and '.TranslatorBagInterface::class.'. '. + (\is_object($translator) ? \get_class($translator) : \gettype($translator)).' has been given.' + ); + } + + if (!$locale && $translator instanceof LocaleAwareInterface) { + $locale = $translator->getLocale(); + } + + $result = self::getFromCatalogue($translator, $translator->getCatalogue($locale), $key); + + return $result === $key ? $default : $result; + } + + /** + * Returns raw translation message for a given key. + * + * @param string $key key to find + * @param string|null $locale current locale used if null + * @param string|null $default default value if translation returns the key + * @param \Symfony\Component\Translation\TranslatorInterface $translator an optional translator to use + * + * @return string + */ + public function getTranslationMessage(string $key, ?string $locale = null, ?string $default = null, $translator = null) + { + return static::getTranslationMessageWith($translator ?: $this->getLocalTranslator(), $key, $locale, $default); + } + + /** + * Translate using translation string or callback available. + * + * @param \Symfony\Component\Translation\TranslatorInterface $translator + * @param string $key + * @param array $parameters + * @param null $number + * + * @return string + */ + public static function translateWith(TranslatorInterface $translator, string $key, array $parameters = [], $number = null): string + { + $message = static::getTranslationMessageWith($translator, $key, null, $key); + if ($message instanceof Closure) { + return (string) $message(...array_values($parameters)); + } + + if ($number !== null) { + $parameters['%count%'] = $number; + } + if (isset($parameters['%count%'])) { + $parameters[':count'] = $parameters['%count%']; + } + + // @codeCoverageIgnoreStart + $choice = $translator instanceof ContractsTranslatorInterface + ? $translator->trans($key, $parameters) + : $translator->transChoice($key, $number, $parameters); + // @codeCoverageIgnoreEnd + + return (string) $choice; + } + + /** + * Translate using translation string or callback available. + * + * @param string $key + * @param array $parameters + * @param string|int|float|null $number + * @param \Symfony\Component\Translation\TranslatorInterface|null $translator + * @param bool $altNumbers + * + * @return string + */ + public function translate(string $key, array $parameters = [], $number = null, ?TranslatorInterface $translator = null, bool $altNumbers = false): string + { + $translation = static::translateWith($translator ?: $this->getLocalTranslator(), $key, $parameters, $number); + + if ($number !== null && $altNumbers) { + return str_replace($number, $this->translateNumber($number), $translation); + } + + return $translation; + } + + /** + * Returns the alternative number for a given integer if available in the current locale. + * + * @param int $number + * + * @return string + */ + public function translateNumber(int $number): string + { + $translateKey = "alt_numbers.$number"; + $symbol = $this->translate($translateKey); + + if ($symbol !== $translateKey) { + return $symbol; + } + + if ($number > 99 && $this->translate('alt_numbers.99') !== 'alt_numbers.99') { + $start = ''; + foreach ([10000, 1000, 100] as $exp) { + $key = "alt_numbers_pow.$exp"; + if ($number >= $exp && $number < $exp * 10 && ($pow = $this->translate($key)) !== $key) { + $unit = floor($number / $exp); + $number -= $unit * $exp; + $start .= ($unit > 1 ? $this->translate("alt_numbers.$unit") : '').$pow; + } + } + $result = ''; + while ($number) { + $chunk = $number % 100; + $result = $this->translate("alt_numbers.$chunk").$result; + $number = floor($number / 100); + } + + return "$start$result"; + } + + if ($number > 9 && $this->translate('alt_numbers.9') !== 'alt_numbers.9') { + $result = ''; + while ($number) { + $chunk = $number % 10; + $result = $this->translate("alt_numbers.$chunk").$result; + $number = floor($number / 10); + } + + return $result; + } + + return (string) $number; + } + + /** + * Translate a time string from a locale to an other. + * + * @param string $timeString date/time/duration string to translate (may also contain English) + * @param string|null $from input locale of the $timeString parameter (`Carbon::getLocale()` by default) + * @param string|null $to output locale of the result returned (`"en"` by default) + * @param int $mode specify what to translate with options: + * - CarbonInterface::TRANSLATE_ALL (default) + * - CarbonInterface::TRANSLATE_MONTHS + * - CarbonInterface::TRANSLATE_DAYS + * - CarbonInterface::TRANSLATE_UNITS + * - CarbonInterface::TRANSLATE_MERIDIEM + * You can use pipe to group: CarbonInterface::TRANSLATE_MONTHS | CarbonInterface::TRANSLATE_DAYS + * + * @return string + */ + public static function translateTimeString($timeString, $from = null, $to = null, $mode = CarbonInterface::TRANSLATE_ALL) + { + // Fallback source and destination locales + $from = $from ?: static::getLocale(); + $to = $to ?: 'en'; + + if ($from === $to) { + return $timeString; + } + + // Standardize apostrophe + $timeString = strtr($timeString, ['’' => "'"]); + + $fromTranslations = []; + $toTranslations = []; + + foreach (['from', 'to'] as $key) { + $language = $$key; + $translator = Translator::get($language); + $translations = $translator->getMessages(); + + if (!isset($translations[$language])) { + return $timeString; + } + + $translationKey = $key.'Translations'; + $messages = $translations[$language]; + $months = $messages['months'] ?? []; + $weekdays = $messages['weekdays'] ?? []; + $meridiem = $messages['meridiem'] ?? ['AM', 'PM']; + + if (isset($messages['ordinal_words'])) { + $timeString = self::replaceOrdinalWords( + $timeString, + $key === 'from' ? array_flip($messages['ordinal_words']) : $messages['ordinal_words'] + ); + } + + if ($key === 'from') { + foreach (['months', 'weekdays'] as $variable) { + $list = $messages[$variable.'_standalone'] ?? null; + + if ($list) { + foreach ($$variable as $index => &$name) { + $name .= '|'.$messages[$variable.'_standalone'][$index]; + } + } + } + } + + $$translationKey = array_merge( + $mode & CarbonInterface::TRANSLATE_MONTHS ? static::getTranslationArray($months, 12, $timeString) : [], + $mode & CarbonInterface::TRANSLATE_MONTHS ? static::getTranslationArray($messages['months_short'] ?? [], 12, $timeString) : [], + $mode & CarbonInterface::TRANSLATE_DAYS ? static::getTranslationArray($weekdays, 7, $timeString) : [], + $mode & CarbonInterface::TRANSLATE_DAYS ? static::getTranslationArray($messages['weekdays_short'] ?? [], 7, $timeString) : [], + $mode & CarbonInterface::TRANSLATE_DIFF ? static::translateWordsByKeys([ + 'diff_now', + 'diff_today', + 'diff_yesterday', + 'diff_tomorrow', + 'diff_before_yesterday', + 'diff_after_tomorrow', + ], $messages, $key) : [], + $mode & CarbonInterface::TRANSLATE_UNITS ? static::translateWordsByKeys([ + 'year', + 'month', + 'week', + 'day', + 'hour', + 'minute', + 'second', + ], $messages, $key) : [], + $mode & CarbonInterface::TRANSLATE_MERIDIEM ? array_map(function ($hour) use ($meridiem) { + if (\is_array($meridiem)) { + return $meridiem[$hour < 12 ? 0 : 1]; + } + + return $meridiem($hour, 0, false); + }, range(0, 23)) : [] + ); + } + + return substr(preg_replace_callback('/(?<=[\d\s+.\/,_-])('.implode('|', $fromTranslations).')(?=[\d\s+.\/,_-])/iu', function ($match) use ($fromTranslations, $toTranslations) { + [$chunk] = $match; + + foreach ($fromTranslations as $index => $word) { + if (preg_match("/^$word\$/iu", $chunk)) { + return $toTranslations[$index] ?? ''; + } + } + + return $chunk; // @codeCoverageIgnore + }, " $timeString "), 1, -1); + } + + /** + * Translate a time string from the current locale (`$date->locale()`) to an other. + * + * @param string $timeString time string to translate + * @param string|null $to output locale of the result returned ("en" by default) + * + * @return string + */ + public function translateTimeStringTo($timeString, $to = null) + { + return static::translateTimeString($timeString, $this->getTranslatorLocale(), $to); + } + + /** + * Get/set the locale for the current instance. + * + * @param string|null $locale + * @param string ...$fallbackLocales + * + * @return $this|string + */ + public function locale(string $locale = null, ...$fallbackLocales) + { + if ($locale === null) { + return $this->getTranslatorLocale(); + } + + if (!$this->localTranslator || $this->getTranslatorLocale($this->localTranslator) !== $locale) { + $translator = Translator::get($locale); + + if (!empty($fallbackLocales)) { + $translator->setFallbackLocales($fallbackLocales); + + foreach ($fallbackLocales as $fallbackLocale) { + $messages = Translator::get($fallbackLocale)->getMessages(); + + if (isset($messages[$fallbackLocale])) { + $translator->setMessages($fallbackLocale, $messages[$fallbackLocale]); + } + } + } + + $this->localTranslator = $translator; + } + + return $this; + } + + /** + * Get the current translator locale. + * + * @return string + */ + public static function getLocale() + { + return static::getLocaleAwareTranslator()->getLocale(); + } + + /** + * Set the current translator locale and indicate if the source locale file exists. + * Pass 'auto' as locale to use closest language from the current LC_TIME locale. + * + * @param string $locale locale ex. en + * + * @return bool + */ + public static function setLocale($locale) + { + return static::getLocaleAwareTranslator()->setLocale($locale) !== false; + } + + /** + * Set the fallback locale. + * + * @see https://symfony.com/doc/current/components/translation.html#fallback-locales + * + * @param string $locale + */ + public static function setFallbackLocale($locale) + { + $translator = static::getTranslator(); + + if (method_exists($translator, 'setFallbackLocales')) { + $translator->setFallbackLocales([$locale]); + + if ($translator instanceof Translator) { + $preferredLocale = $translator->getLocale(); + $translator->setMessages($preferredLocale, array_replace_recursive( + $translator->getMessages()[$locale] ?? [], + Translator::get($locale)->getMessages()[$locale] ?? [], + $translator->getMessages($preferredLocale) + )); + } + } + } + + /** + * Get the fallback locale. + * + * @see https://symfony.com/doc/current/components/translation.html#fallback-locales + * + * @return string|null + */ + public static function getFallbackLocale() + { + $translator = static::getTranslator(); + + if (method_exists($translator, 'getFallbackLocales')) { + return $translator->getFallbackLocales()[0] ?? null; + } + + return null; + } + + /** + * Set the current locale to the given, execute the passed function, reset the locale to previous one, + * then return the result of the closure (or null if the closure was void). + * + * @param string $locale locale ex. en + * @param callable $func + * + * @return mixed + */ + public static function executeWithLocale($locale, $func) + { + $currentLocale = static::getLocale(); + $result = $func(static::setLocale($locale) ? static::getLocale() : false, static::translator()); + static::setLocale($currentLocale); + + return $result; + } + + /** + * Returns true if the given locale is internally supported and has short-units support. + * Support is considered enabled if either year, day or hour has a short variant translated. + * + * @param string $locale locale ex. en + * + * @return bool + */ + public static function localeHasShortUnits($locale) + { + return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) { + return ($newLocale && (($y = static::translateWith($translator, 'y')) !== 'y' && $y !== static::translateWith($translator, 'year'))) || ( + ($y = static::translateWith($translator, 'd')) !== 'd' && + $y !== static::translateWith($translator, 'day') + ) || ( + ($y = static::translateWith($translator, 'h')) !== 'h' && + $y !== static::translateWith($translator, 'hour') + ); + }); + } + + /** + * Returns true if the given locale is internally supported and has diff syntax support (ago, from now, before, after). + * Support is considered enabled if the 4 sentences are translated in the given locale. + * + * @param string $locale locale ex. en + * + * @return bool + */ + public static function localeHasDiffSyntax($locale) + { + return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) { + if (!$newLocale) { + return false; + } + + foreach (['ago', 'from_now', 'before', 'after'] as $key) { + if ($translator instanceof TranslatorBagInterface && + self::getFromCatalogue($translator, $translator->getCatalogue($newLocale), $key) instanceof Closure + ) { + continue; + } + + if ($translator->trans($key) === $key) { + return false; + } + } + + return true; + }); + } + + /** + * Returns true if the given locale is internally supported and has words for 1-day diff (just now, yesterday, tomorrow). + * Support is considered enabled if the 3 words are translated in the given locale. + * + * @param string $locale locale ex. en + * + * @return bool + */ + public static function localeHasDiffOneDayWords($locale) + { + return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) { + return $newLocale && + $translator->trans('diff_now') !== 'diff_now' && + $translator->trans('diff_yesterday') !== 'diff_yesterday' && + $translator->trans('diff_tomorrow') !== 'diff_tomorrow'; + }); + } + + /** + * Returns true if the given locale is internally supported and has words for 2-days diff (before yesterday, after tomorrow). + * Support is considered enabled if the 2 words are translated in the given locale. + * + * @param string $locale locale ex. en + * + * @return bool + */ + public static function localeHasDiffTwoDayWords($locale) + { + return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) { + return $newLocale && + $translator->trans('diff_before_yesterday') !== 'diff_before_yesterday' && + $translator->trans('diff_after_tomorrow') !== 'diff_after_tomorrow'; + }); + } + + /** + * Returns true if the given locale is internally supported and has period syntax support (X times, every X, from X, to X). + * Support is considered enabled if the 4 sentences are translated in the given locale. + * + * @param string $locale locale ex. en + * + * @return bool + */ + public static function localeHasPeriodSyntax($locale) + { + return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) { + return $newLocale && + $translator->trans('period_recurrences') !== 'period_recurrences' && + $translator->trans('period_interval') !== 'period_interval' && + $translator->trans('period_start_date') !== 'period_start_date' && + $translator->trans('period_end_date') !== 'period_end_date'; + }); + } + + /** + * Returns the list of internally available locales and already loaded custom locales. + * (It will ignore custom translator dynamic loading.) + * + * @return array + */ + public static function getAvailableLocales() + { + $translator = static::getLocaleAwareTranslator(); + + return $translator instanceof Translator + ? $translator->getAvailableLocales() + : [$translator->getLocale()]; + } + + /** + * Returns list of Language object for each available locale. This object allow you to get the ISO name, native + * name, region and variant of the locale. + * + * @return Language[] + */ + public static function getAvailableLocalesInfo() + { + $languages = []; + foreach (static::getAvailableLocales() as $id) { + $languages[$id] = new Language($id); + } + + return $languages; + } + + /** + * Initialize the default translator instance if necessary. + * + * @return \Symfony\Component\Translation\TranslatorInterface + */ + protected static function translator() + { + if (static::$translator === null) { + static::$translator = Translator::get(); + } + + return static::$translator; + } + + /** + * Get the locale of a given translator. + * + * If null or omitted, current local translator is used. + * If no local translator is in use, current global translator is used. + * + * @param null $translator + * + * @return string|null + */ + protected function getTranslatorLocale($translator = null): ?string + { + if (\func_num_args() === 0) { + $translator = $this->getLocalTranslator(); + } + + $translator = static::getLocaleAwareTranslator($translator); + + return $translator ? $translator->getLocale() : null; + } + + /** + * Throw an error if passed object is not LocaleAwareInterface. + * + * @param LocaleAwareInterface|null $translator + * + * @return LocaleAwareInterface|null + */ + protected static function getLocaleAwareTranslator($translator = null) + { + if (\func_num_args() === 0) { + $translator = static::translator(); + } + + if ($translator && !($translator instanceof LocaleAwareInterface || method_exists($translator, 'getLocale'))) { + throw new NotLocaleAwareException($translator); // @codeCoverageIgnore + } + + return $translator; + } + + /** + * @param mixed $translator + * @param \Symfony\Component\Translation\MessageCatalogueInterface $catalogue + * + * @return mixed + */ + private static function getFromCatalogue($translator, $catalogue, string $id, string $domain = 'messages') + { + return $translator instanceof TranslatorStrongTypeInterface + ? $translator->getFromCatalogue($catalogue, $id, $domain) // @codeCoverageIgnore + : $catalogue->get($id, $domain); + } + + /** + * Return the word cleaned from its translation codes. + * + * @param string $word + * + * @return string + */ + private static function cleanWordFromTranslationString($word) + { + $word = str_replace([':count', '%count', ':time'], '', $word); + $word = strtr($word, ['’' => "'"]); + $word = preg_replace('/({\d+(,(\d+|Inf))?}|[\[\]]\d+(,(\d+|Inf))?[\[\]])/', '', $word); + + return trim($word); + } + + /** + * Translate a list of words. + * + * @param string[] $keys keys to translate. + * @param string[] $messages messages bag handling translations. + * @param string $key 'to' (to get the translation) or 'from' (to get the detection RegExp pattern). + * + * @return string[] + */ + private static function translateWordsByKeys($keys, $messages, $key): array + { + return array_map(function ($wordKey) use ($messages, $key) { + $message = $key === 'from' && isset($messages[$wordKey.'_regexp']) + ? $messages[$wordKey.'_regexp'] + : ($messages[$wordKey] ?? null); + + if (!$message) { + return '>>DO NOT REPLACE<<'; + } + + $parts = explode('|', $message); + + return $key === 'to' + ? self::cleanWordFromTranslationString(end($parts)) + : '(?:'.implode('|', array_map([static::class, 'cleanWordFromTranslationString'], $parts)).')'; + }, $keys); + } + + /** + * Get an array of translations based on the current date. + * + * @param callable $translation + * @param int $length + * @param string $timeString + * + * @return string[] + */ + private static function getTranslationArray($translation, $length, $timeString): array + { + $filler = '>>DO NOT REPLACE<<'; + + if (\is_array($translation)) { + return array_pad($translation, $length, $filler); + } + + $list = []; + $date = static::now(); + + for ($i = 0; $i < $length; $i++) { + $list[] = $translation($date, $timeString, $i) ?? $filler; + } + + return $list; + } + + private static function replaceOrdinalWords(string $timeString, array $ordinalWords): string + { + return preg_replace_callback('/(?<![a-z])[a-z]+(?![a-z])/i', function (array $match) use ($ordinalWords) { + return $ordinalWords[mb_strtolower($match[0])] ?? $match[0]; + }, $timeString); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Macro.php b/vendor/nesbot/carbon/src/Carbon/Traits/Macro.php new file mode 100644 index 0000000..92b6c9d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Macro.php @@ -0,0 +1,136 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +/** + * Trait Macros. + * + * Allows users to register macros within the Carbon class. + */ +trait Macro +{ + use Mixin; + + /** + * The registered macros. + * + * @var array + */ + protected static $globalMacros = []; + + /** + * The registered generic macros. + * + * @var array + */ + protected static $globalGenericMacros = []; + + /** + * Register a custom macro. + * + * @example + * ``` + * $userSettings = [ + * 'locale' => 'pt', + * 'timezone' => 'America/Sao_Paulo', + * ]; + * Carbon::macro('userFormat', function () use ($userSettings) { + * return $this->copy()->locale($userSettings['locale'])->tz($userSettings['timezone'])->calendar(); + * }); + * echo Carbon::yesterday()->hours(11)->userFormat(); + * ``` + * + * @param string $name + * @param object|callable $macro + * + * @return void + */ + public static function macro($name, $macro) + { + static::$globalMacros[$name] = $macro; + } + + /** + * Remove all macros and generic macros. + */ + public static function resetMacros() + { + static::$globalMacros = []; + static::$globalGenericMacros = []; + } + + /** + * Register a custom macro. + * + * @param object|callable $macro + * @param int $priority marco with higher priority is tried first + * + * @return void + */ + public static function genericMacro($macro, $priority = 0) + { + if (!isset(static::$globalGenericMacros[$priority])) { + static::$globalGenericMacros[$priority] = []; + krsort(static::$globalGenericMacros, SORT_NUMERIC); + } + + static::$globalGenericMacros[$priority][] = $macro; + } + + /** + * Checks if macro is registered globally. + * + * @param string $name + * + * @return bool + */ + public static function hasMacro($name) + { + return isset(static::$globalMacros[$name]); + } + + /** + * Get the raw callable macro registered globally for a given name. + * + * @param string $name + * + * @return callable|null + */ + public static function getMacro($name) + { + return static::$globalMacros[$name] ?? null; + } + + /** + * Checks if macro is registered globally or locally. + * + * @param string $name + * + * @return bool + */ + public function hasLocalMacro($name) + { + return ($this->localMacros && isset($this->localMacros[$name])) || static::hasMacro($name); + } + + /** + * Get the raw callable macro registered globally or locally for a given name. + * + * @param string $name + * + * @return callable|null + */ + public function getLocalMacro($name) + { + return ($this->localMacros ?? [])[$name] ?? static::getMacro($name); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/MagicParameter.php b/vendor/nesbot/carbon/src/Carbon/Traits/MagicParameter.php new file mode 100644 index 0000000..310a44d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/MagicParameter.php @@ -0,0 +1,33 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +/** + * Trait MagicParameter. + * + * Allows to retrieve parameter in magic calls by index or name. + */ +trait MagicParameter +{ + private function getMagicParameter(array $parameters, int $index, string $key, $default) + { + if (\array_key_exists($index, $parameters)) { + return $parameters[$index]; + } + + if (\array_key_exists($key, $parameters)) { + return $parameters[$key]; + } + + return $default; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Mixin.php b/vendor/nesbot/carbon/src/Carbon/Traits/Mixin.php new file mode 100644 index 0000000..88b251d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Mixin.php @@ -0,0 +1,191 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use Closure; +use Generator; +use ReflectionClass; +use ReflectionException; +use ReflectionMethod; +use Throwable; + +/** + * Trait Mixin. + * + * Allows mixing in entire classes with multiple macros. + */ +trait Mixin +{ + /** + * Stack of macro instance contexts. + * + * @var array + */ + protected static $macroContextStack = []; + + /** + * Mix another object into the class. + * + * @example + * ``` + * Carbon::mixin(new class { + * public function addMoon() { + * return function () { + * return $this->addDays(30); + * }; + * } + * public function subMoon() { + * return function () { + * return $this->subDays(30); + * }; + * } + * }); + * $fullMoon = Carbon::create('2018-12-22'); + * $nextFullMoon = $fullMoon->addMoon(); + * $blackMoon = Carbon::create('2019-01-06'); + * $previousBlackMoon = $blackMoon->subMoon(); + * echo "$nextFullMoon\n"; + * echo "$previousBlackMoon\n"; + * ``` + * + * @param object|string $mixin + * + * @throws ReflectionException + * + * @return void + */ + public static function mixin($mixin) + { + \is_string($mixin) && trait_exists($mixin) + ? self::loadMixinTrait($mixin) + : self::loadMixinClass($mixin); + } + + /** + * @param object|string $mixin + * + * @throws ReflectionException + */ + private static function loadMixinClass($mixin) + { + $methods = (new ReflectionClass($mixin))->getMethods( + ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED + ); + + foreach ($methods as $method) { + if ($method->isConstructor() || $method->isDestructor()) { + continue; + } + + $method->setAccessible(true); + + static::macro($method->name, $method->invoke($mixin)); + } + } + + /** + * @param string $trait + */ + private static function loadMixinTrait($trait) + { + $context = eval(self::getAnonymousClassCodeForTrait($trait)); + $className = \get_class($context); + + foreach (self::getMixableMethods($context) as $name) { + $closureBase = Closure::fromCallable([$context, $name]); + + static::macro($name, function () use ($closureBase, $className) { + /** @phpstan-ignore-next-line */ + $context = isset($this) ? $this->cast($className) : new $className(); + + try { + // @ is required to handle error if not converted into exceptions + $closure = @$closureBase->bindTo($context); + } catch (Throwable $throwable) { // @codeCoverageIgnore + $closure = $closureBase; // @codeCoverageIgnore + } + + // in case of errors not converted into exceptions + $closure = $closure ?: $closureBase; + + return $closure(...\func_get_args()); + }); + } + } + + private static function getAnonymousClassCodeForTrait(string $trait) + { + return 'return new class() extends '.static::class.' {use '.$trait.';};'; + } + + private static function getMixableMethods(self $context): Generator + { + foreach (get_class_methods($context) as $name) { + if (method_exists(static::class, $name)) { + continue; + } + + yield $name; + } + } + + /** + * Stack a Carbon context from inside calls of self::this() and execute a given action. + * + * @param static|null $context + * @param callable $callable + * + * @throws Throwable + * + * @return mixed + */ + protected static function bindMacroContext($context, callable $callable) + { + static::$macroContextStack[] = $context; + $exception = null; + $result = null; + + try { + $result = $callable(); + } catch (Throwable $throwable) { + $exception = $throwable; + } + + array_pop(static::$macroContextStack); + + if ($exception) { + throw $exception; + } + + return $result; + } + + /** + * Return the current context from inside a macro callee or a null if static. + * + * @return static|null + */ + protected static function context() + { + return end(static::$macroContextStack) ?: null; + } + + /** + * Return the current context from inside a macro callee or a new one if static. + * + * @return static + */ + protected static function this() + { + return end(static::$macroContextStack) ?: new static(); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Modifiers.php b/vendor/nesbot/carbon/src/Carbon/Traits/Modifiers.php new file mode 100644 index 0000000..164dbbd --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Modifiers.php @@ -0,0 +1,472 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use Carbon\CarbonInterface; +use ReturnTypeWillChange; + +/** + * Trait Modifiers. + * + * Returns dates relative to current date using modifier short-hand. + */ +trait Modifiers +{ + /** + * Midday/noon hour. + * + * @var int + */ + protected static $midDayAt = 12; + + /** + * get midday/noon hour + * + * @return int + */ + public static function getMidDayAt() + { + return static::$midDayAt; + } + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather consider mid-day is always 12pm, then if you need to test if it's an other + * hour, test it explicitly: + * $date->format('G') == 13 + * or to set explicitly to a given hour: + * $date->setTime(13, 0, 0, 0) + * + * Set midday/noon hour + * + * @param int $hour midday hour + * + * @return void + */ + public static function setMidDayAt($hour) + { + static::$midDayAt = $hour; + } + + /** + * Modify to midday, default to self::$midDayAt + * + * @return static + */ + public function midDay() + { + return $this->setTime(static::$midDayAt, 0, 0, 0); + } + + /** + * Modify to the next occurrence of a given modifier such as a day of + * the week. If no modifier is provided, modify to the next occurrence + * of the current day of the week. Use the supplied constants + * to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param string|int|null $modifier + * + * @return static + */ + public function next($modifier = null) + { + if ($modifier === null) { + $modifier = $this->dayOfWeek; + } + + return $this->change( + 'next '.(\is_string($modifier) ? $modifier : static::$days[$modifier]) + ); + } + + /** + * Go forward or backward to the next week- or weekend-day. + * + * @param bool $weekday + * @param bool $forward + * + * @return static + */ + private function nextOrPreviousDay($weekday = true, $forward = true) + { + /** @var CarbonInterface $date */ + $date = $this; + $step = $forward ? 1 : -1; + + do { + $date = $date->addDays($step); + } while ($weekday ? $date->isWeekend() : $date->isWeekday()); + + return $date; + } + + /** + * Go forward to the next weekday. + * + * @return static + */ + public function nextWeekday() + { + return $this->nextOrPreviousDay(); + } + + /** + * Go backward to the previous weekday. + * + * @return static + */ + public function previousWeekday() + { + return $this->nextOrPreviousDay(true, false); + } + + /** + * Go forward to the next weekend day. + * + * @return static + */ + public function nextWeekendDay() + { + return $this->nextOrPreviousDay(false); + } + + /** + * Go backward to the previous weekend day. + * + * @return static + */ + public function previousWeekendDay() + { + return $this->nextOrPreviousDay(false, false); + } + + /** + * Modify to the previous occurrence of a given modifier such as a day of + * the week. If no dayOfWeek is provided, modify to the previous occurrence + * of the current day of the week. Use the supplied constants + * to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param string|int|null $modifier + * + * @return static + */ + public function previous($modifier = null) + { + if ($modifier === null) { + $modifier = $this->dayOfWeek; + } + + return $this->change( + 'last '.(\is_string($modifier) ? $modifier : static::$days[$modifier]) + ); + } + + /** + * Modify to the first occurrence of a given day of the week + * in the current month. If no dayOfWeek is provided, modify to the + * first day of the current month. Use the supplied constants + * to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int|null $dayOfWeek + * + * @return static + */ + public function firstOfMonth($dayOfWeek = null) + { + $date = $this->startOfDay(); + + if ($dayOfWeek === null) { + return $date->day(1); + } + + return $date->modify('first '.static::$days[$dayOfWeek].' of '.$date->rawFormat('F').' '.$date->year); + } + + /** + * Modify to the last occurrence of a given day of the week + * in the current month. If no dayOfWeek is provided, modify to the + * last day of the current month. Use the supplied constants + * to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int|null $dayOfWeek + * + * @return static + */ + public function lastOfMonth($dayOfWeek = null) + { + $date = $this->startOfDay(); + + if ($dayOfWeek === null) { + return $date->day($date->daysInMonth); + } + + return $date->modify('last '.static::$days[$dayOfWeek].' of '.$date->rawFormat('F').' '.$date->year); + } + + /** + * Modify to the given occurrence of a given day of the week + * in the current month. If the calculated occurrence is outside the scope + * of the current month, then return false and no modifications are made. + * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int $nth + * @param int $dayOfWeek + * + * @return mixed + */ + public function nthOfMonth($nth, $dayOfWeek) + { + $date = $this->avoidMutation()->firstOfMonth(); + $check = $date->rawFormat('Y-m'); + $date = $date->modify('+'.$nth.' '.static::$days[$dayOfWeek]); + + return $date->rawFormat('Y-m') === $check ? $this->modify((string) $date) : false; + } + + /** + * Modify to the first occurrence of a given day of the week + * in the current quarter. If no dayOfWeek is provided, modify to the + * first day of the current quarter. Use the supplied constants + * to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int|null $dayOfWeek day of the week default null + * + * @return static + */ + public function firstOfQuarter($dayOfWeek = null) + { + return $this->setDate($this->year, $this->quarter * static::MONTHS_PER_QUARTER - 2, 1)->firstOfMonth($dayOfWeek); + } + + /** + * Modify to the last occurrence of a given day of the week + * in the current quarter. If no dayOfWeek is provided, modify to the + * last day of the current quarter. Use the supplied constants + * to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int|null $dayOfWeek day of the week default null + * + * @return static + */ + public function lastOfQuarter($dayOfWeek = null) + { + return $this->setDate($this->year, $this->quarter * static::MONTHS_PER_QUARTER, 1)->lastOfMonth($dayOfWeek); + } + + /** + * Modify to the given occurrence of a given day of the week + * in the current quarter. If the calculated occurrence is outside the scope + * of the current quarter, then return false and no modifications are made. + * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int $nth + * @param int $dayOfWeek + * + * @return mixed + */ + public function nthOfQuarter($nth, $dayOfWeek) + { + $date = $this->avoidMutation()->day(1)->month($this->quarter * static::MONTHS_PER_QUARTER); + $lastMonth = $date->month; + $year = $date->year; + $date = $date->firstOfQuarter()->modify('+'.$nth.' '.static::$days[$dayOfWeek]); + + return ($lastMonth < $date->month || $year !== $date->year) ? false : $this->modify((string) $date); + } + + /** + * Modify to the first occurrence of a given day of the week + * in the current year. If no dayOfWeek is provided, modify to the + * first day of the current year. Use the supplied constants + * to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int|null $dayOfWeek day of the week default null + * + * @return static + */ + public function firstOfYear($dayOfWeek = null) + { + return $this->month(1)->firstOfMonth($dayOfWeek); + } + + /** + * Modify to the last occurrence of a given day of the week + * in the current year. If no dayOfWeek is provided, modify to the + * last day of the current year. Use the supplied constants + * to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int|null $dayOfWeek day of the week default null + * + * @return static + */ + public function lastOfYear($dayOfWeek = null) + { + return $this->month(static::MONTHS_PER_YEAR)->lastOfMonth($dayOfWeek); + } + + /** + * Modify to the given occurrence of a given day of the week + * in the current year. If the calculated occurrence is outside the scope + * of the current year, then return false and no modifications are made. + * Use the supplied constants to indicate the desired dayOfWeek, ex. static::MONDAY. + * + * @param int $nth + * @param int $dayOfWeek + * + * @return mixed + */ + public function nthOfYear($nth, $dayOfWeek) + { + $date = $this->avoidMutation()->firstOfYear()->modify('+'.$nth.' '.static::$days[$dayOfWeek]); + + return $this->year === $date->year ? $this->modify((string) $date) : false; + } + + /** + * Modify the current instance to the average of a given instance (default now) and the current instance + * (second-precision). + * + * @param \Carbon\Carbon|\DateTimeInterface|null $date + * + * @return static + */ + public function average($date = null) + { + return $this->addRealMicroseconds((int) ($this->diffInRealMicroseconds($this->resolveCarbon($date), false) / 2)); + } + + /** + * Get the closest date from the instance (second-precision). + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 + * + * @return static + */ + public function closest($date1, $date2) + { + return $this->diffInRealMicroseconds($date1) < $this->diffInRealMicroseconds($date2) ? $date1 : $date2; + } + + /** + * Get the farthest date from the instance (second-precision). + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date1 + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date2 + * + * @return static + */ + public function farthest($date1, $date2) + { + return $this->diffInRealMicroseconds($date1) > $this->diffInRealMicroseconds($date2) ? $date1 : $date2; + } + + /** + * Get the minimum instance between a given instance (default now) and the current instance. + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @return static + */ + public function min($date = null) + { + $date = $this->resolveCarbon($date); + + return $this->lt($date) ? $this : $date; + } + + /** + * Get the minimum instance between a given instance (default now) and the current instance. + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see min() + * + * @return static + */ + public function minimum($date = null) + { + return $this->min($date); + } + + /** + * Get the maximum instance between a given instance (default now) and the current instance. + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @return static + */ + public function max($date = null) + { + $date = $this->resolveCarbon($date); + + return $this->gt($date) ? $this : $date; + } + + /** + * Get the maximum instance between a given instance (default now) and the current instance. + * + * @param \Carbon\Carbon|\DateTimeInterface|mixed $date + * + * @see max() + * + * @return static + */ + public function maximum($date = null) + { + return $this->max($date); + } + + /** + * Calls \DateTime::modify if mutable or \DateTimeImmutable::modify else. + * + * @see https://php.net/manual/en/datetime.modify.php + * + * @return static|false + */ + #[ReturnTypeWillChange] + public function modify($modify) + { + return parent::modify((string) $modify); + } + + /** + * Similar to native modify() method of DateTime but can handle more grammars. + * + * @example + * ``` + * echo Carbon::now()->change('next 2pm'); + * ``` + * + * @link https://php.net/manual/en/datetime.modify.php + * + * @param string $modifier + * + * @return static + */ + public function change($modifier) + { + return $this->modify(preg_replace_callback('/^(next|previous|last)\s+(\d{1,2}(h|am|pm|:\d{1,2}(:\d{1,2})?))$/i', function ($match) { + $match[2] = str_replace('h', ':00', $match[2]); + $test = $this->avoidMutation()->modify($match[2]); + $method = $match[1] === 'next' ? 'lt' : 'gt'; + $match[1] = $test->$method($this) ? $match[1].' day' : 'today'; + + return $match[1].' '.$match[2]; + }, strtr(trim($modifier), [ + ' at ' => ' ', + 'just now' => 'now', + 'after tomorrow' => 'tomorrow +1 day', + 'before yesterday' => 'yesterday -1 day', + ]))); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Mutability.php b/vendor/nesbot/carbon/src/Carbon/Traits/Mutability.php new file mode 100644 index 0000000..561c867 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Mutability.php @@ -0,0 +1,71 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use Carbon\Carbon; +use Carbon\CarbonImmutable; + +/** + * Trait Mutability. + * + * Utils to know if the current object is mutable or immutable and convert it. + */ +trait Mutability +{ + use Cast; + + /** + * Returns true if the current class/instance is mutable. + * + * @return bool + */ + public static function isMutable() + { + return false; + } + + /** + * Returns true if the current class/instance is immutable. + * + * @return bool + */ + public static function isImmutable() + { + return !static::isMutable(); + } + + /** + * Return a mutable copy of the instance. + * + * @return Carbon + */ + public function toMutable() + { + /** @var Carbon $date */ + $date = $this->cast(Carbon::class); + + return $date; + } + + /** + * Return a immutable copy of the instance. + * + * @return CarbonImmutable + */ + public function toImmutable() + { + /** @var CarbonImmutable $date */ + $date = $this->cast(CarbonImmutable::class); + + return $date; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php b/vendor/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php new file mode 100644 index 0000000..c77a102 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php @@ -0,0 +1,22 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +trait ObjectInitialisation +{ + /** + * True when parent::__construct has been called. + * + * @var string + */ + protected $constructedObjectId; +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Options.php b/vendor/nesbot/carbon/src/Carbon/Traits/Options.php new file mode 100644 index 0000000..0ddee8d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Options.php @@ -0,0 +1,471 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use Carbon\CarbonInterface; +use DateTimeInterface; +use Throwable; + +/** + * Trait Options. + * + * Embed base methods to change settings of Carbon classes. + * + * Depends on the following methods: + * + * @method \Carbon\Carbon|\Carbon\CarbonImmutable shiftTimezone($timezone) Set the timezone + */ +trait Options +{ + use Localization; + + /** + * Customizable PHP_INT_SIZE override. + * + * @var int + */ + public static $PHPIntSize = PHP_INT_SIZE; + + /** + * First day of week. + * + * @var int|string + */ + protected static $weekStartsAt = CarbonInterface::MONDAY; + + /** + * Last day of week. + * + * @var int|string + */ + protected static $weekEndsAt = CarbonInterface::SUNDAY; + + /** + * Days of weekend. + * + * @var array + */ + protected static $weekendDays = [ + CarbonInterface::SATURDAY, + CarbonInterface::SUNDAY, + ]; + + /** + * Format regex patterns. + * + * @var array<string, string> + */ + protected static $regexFormats = [ + 'd' => '(3[01]|[12][0-9]|0[1-9])', + 'D' => '(Sun|Mon|Tue|Wed|Thu|Fri|Sat)', + 'j' => '([123][0-9]|[1-9])', + 'l' => '([a-zA-Z]{2,})', + 'N' => '([1-7])', + 'S' => '(st|nd|rd|th)', + 'w' => '([0-6])', + 'z' => '(36[0-5]|3[0-5][0-9]|[12][0-9]{2}|[1-9]?[0-9])', + 'W' => '(5[012]|[1-4][0-9]|0?[1-9])', + 'F' => '([a-zA-Z]{2,})', + 'm' => '(1[012]|0[1-9])', + 'M' => '([a-zA-Z]{3})', + 'n' => '(1[012]|[1-9])', + 't' => '(2[89]|3[01])', + 'L' => '(0|1)', + 'o' => '([1-9][0-9]{0,4})', + 'Y' => '([1-9]?[0-9]{4})', + 'y' => '([0-9]{2})', + 'a' => '(am|pm)', + 'A' => '(AM|PM)', + 'B' => '([0-9]{3})', + 'g' => '(1[012]|[1-9])', + 'G' => '(2[0-3]|1?[0-9])', + 'h' => '(1[012]|0[1-9])', + 'H' => '(2[0-3]|[01][0-9])', + 'i' => '([0-5][0-9])', + 's' => '([0-5][0-9])', + 'u' => '([0-9]{1,6})', + 'v' => '([0-9]{1,3})', + 'e' => '([a-zA-Z]{1,5})|([a-zA-Z]*\\/[a-zA-Z]*)', + 'I' => '(0|1)', + 'O' => '([+-](1[012]|0[0-9])[0134][05])', + 'P' => '([+-](1[012]|0[0-9]):[0134][05])', + 'p' => '(Z|[+-](1[012]|0[0-9]):[0134][05])', + 'T' => '([a-zA-Z]{1,5})', + 'Z' => '(-?[1-5]?[0-9]{1,4})', + 'U' => '([0-9]*)', + + // The formats below are combinations of the above formats. + 'c' => '(([1-9]?[0-9]{4})-(1[012]|0[1-9])-(3[01]|[12][0-9]|0[1-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])[+-](1[012]|0[0-9]):([0134][05]))', // Y-m-dTH:i:sP + 'r' => '(([a-zA-Z]{3}), ([123][0-9]|0[1-9]) ([a-zA-Z]{3}) ([1-9]?[0-9]{4}) (2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9]) [+-](1[012]|0[0-9])([0134][05]))', // D, d M Y H:i:s O + ]; + + /** + * Format modifiers (such as available in createFromFormat) regex patterns. + * + * @var array + */ + protected static $regexFormatModifiers = [ + '*' => '.+', + ' ' => '[ ]', + '#' => '[;:\\/.,()-]', + '?' => '([^a]|[a])', + '!' => '', + '|' => '', + '+' => '', + ]; + + /** + * Indicates if months should be calculated with overflow. + * Global setting. + * + * @var bool + */ + protected static $monthsOverflow = true; + + /** + * Indicates if years should be calculated with overflow. + * Global setting. + * + * @var bool + */ + protected static $yearsOverflow = true; + + /** + * Indicates if the strict mode is in use. + * Global setting. + * + * @var bool + */ + protected static $strictModeEnabled = true; + + /** + * Function to call instead of format. + * + * @var string|callable|null + */ + protected static $formatFunction; + + /** + * Function to call instead of createFromFormat. + * + * @var string|callable|null + */ + protected static $createFromFormatFunction; + + /** + * Function to call instead of parse. + * + * @var string|callable|null + */ + protected static $parseFunction; + + /** + * Indicates if months should be calculated with overflow. + * Specific setting. + * + * @var bool|null + */ + protected $localMonthsOverflow; + + /** + * Indicates if years should be calculated with overflow. + * Specific setting. + * + * @var bool|null + */ + protected $localYearsOverflow; + + /** + * Indicates if the strict mode is in use. + * Specific setting. + * + * @var bool|null + */ + protected $localStrictModeEnabled; + + /** + * Options for diffForHumans and forHumans methods. + * + * @var bool|null + */ + protected $localHumanDiffOptions; + + /** + * Format to use on string cast. + * + * @var string|null + */ + protected $localToStringFormat; + + /** + * Format to use on JSON serialization. + * + * @var string|null + */ + protected $localSerializer; + + /** + * Instance-specific macros. + * + * @var array|null + */ + protected $localMacros; + + /** + * Instance-specific generic macros. + * + * @var array|null + */ + protected $localGenericMacros; + + /** + * Function to call instead of format. + * + * @var string|callable|null + */ + protected $localFormatFunction; + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * @see settings + * + * Enable the strict mode (or disable with passing false). + * + * @param bool $strictModeEnabled + */ + public static function useStrictMode($strictModeEnabled = true) + { + static::$strictModeEnabled = $strictModeEnabled; + } + + /** + * Returns true if the strict mode is globally in use, false else. + * (It can be overridden in specific instances.) + * + * @return bool + */ + public static function isStrictModeEnabled() + { + return static::$strictModeEnabled; + } + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants + * are available for quarters, years, decade, centuries, millennia (singular and plural forms). + * @see settings + * + * Indicates if months should be calculated with overflow. + * + * @param bool $monthsOverflow + * + * @return void + */ + public static function useMonthsOverflow($monthsOverflow = true) + { + static::$monthsOverflow = $monthsOverflow; + } + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * Or you can use method variants: addMonthsWithOverflow/addMonthsNoOverflow, same variants + * are available for quarters, years, decade, centuries, millennia (singular and plural forms). + * @see settings + * + * Reset the month overflow behavior. + * + * @return void + */ + public static function resetMonthsOverflow() + { + static::$monthsOverflow = true; + } + + /** + * Get the month overflow global behavior (can be overridden in specific instances). + * + * @return bool + */ + public static function shouldOverflowMonths() + { + return static::$monthsOverflow; + } + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants + * are available for quarters, years, decade, centuries, millennia (singular and plural forms). + * @see settings + * + * Indicates if years should be calculated with overflow. + * + * @param bool $yearsOverflow + * + * @return void + */ + public static function useYearsOverflow($yearsOverflow = true) + { + static::$yearsOverflow = $yearsOverflow; + } + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather use the ->settings() method. + * Or you can use method variants: addYearsWithOverflow/addYearsNoOverflow, same variants + * are available for quarters, years, decade, centuries, millennia (singular and plural forms). + * @see settings + * + * Reset the month overflow behavior. + * + * @return void + */ + public static function resetYearsOverflow() + { + static::$yearsOverflow = true; + } + + /** + * Get the month overflow global behavior (can be overridden in specific instances). + * + * @return bool + */ + public static function shouldOverflowYears() + { + return static::$yearsOverflow; + } + + /** + * Set specific options. + * - strictMode: true|false|null + * - monthOverflow: true|false|null + * - yearOverflow: true|false|null + * - humanDiffOptions: int|null + * - toStringFormat: string|Closure|null + * - toJsonFormat: string|Closure|null + * - locale: string|null + * - timezone: \DateTimeZone|string|int|null + * - macros: array|null + * - genericMacros: array|null + * + * @param array $settings + * + * @return $this|static + */ + public function settings(array $settings) + { + $this->localStrictModeEnabled = $settings['strictMode'] ?? null; + $this->localMonthsOverflow = $settings['monthOverflow'] ?? null; + $this->localYearsOverflow = $settings['yearOverflow'] ?? null; + $this->localHumanDiffOptions = $settings['humanDiffOptions'] ?? null; + $this->localToStringFormat = $settings['toStringFormat'] ?? null; + $this->localSerializer = $settings['toJsonFormat'] ?? null; + $this->localMacros = $settings['macros'] ?? null; + $this->localGenericMacros = $settings['genericMacros'] ?? null; + $this->localFormatFunction = $settings['formatFunction'] ?? null; + + if (isset($settings['locale'])) { + $locales = $settings['locale']; + + if (!\is_array($locales)) { + $locales = [$locales]; + } + + $this->locale(...$locales); + } + + if (isset($settings['innerTimezone'])) { + return $this->setTimezone($settings['innerTimezone']); + } + + if (isset($settings['timezone'])) { + return $this->shiftTimezone($settings['timezone']); + } + + return $this; + } + + /** + * Returns current local settings. + * + * @return array + */ + public function getSettings() + { + $settings = []; + $map = [ + 'localStrictModeEnabled' => 'strictMode', + 'localMonthsOverflow' => 'monthOverflow', + 'localYearsOverflow' => 'yearOverflow', + 'localHumanDiffOptions' => 'humanDiffOptions', + 'localToStringFormat' => 'toStringFormat', + 'localSerializer' => 'toJsonFormat', + 'localMacros' => 'macros', + 'localGenericMacros' => 'genericMacros', + 'locale' => 'locale', + 'tzName' => 'timezone', + 'localFormatFunction' => 'formatFunction', + ]; + + foreach ($map as $property => $key) { + $value = $this->$property ?? null; + + if ($value !== null) { + $settings[$key] = $value; + } + } + + return $settings; + } + + /** + * Show truthy properties on var_dump(). + * + * @return array + */ + public function __debugInfo() + { + $infos = array_filter(get_object_vars($this), function ($var) { + return $var; + }); + + foreach (['dumpProperties', 'constructedObjectId'] as $property) { + if (isset($infos[$property])) { + unset($infos[$property]); + } + } + + $this->addExtraDebugInfos($infos); + + return $infos; + } + + protected function addExtraDebugInfos(&$infos): void + { + if ($this instanceof DateTimeInterface) { + try { + if (!isset($infos['date'])) { + $infos['date'] = $this->format(CarbonInterface::MOCK_DATETIME_FORMAT); + } + + if (!isset($infos['timezone'])) { + $infos['timezone'] = $this->tzName; + } + } catch (Throwable $exception) { + // noop + } + } + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php b/vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php new file mode 100644 index 0000000..f98c2a3 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php @@ -0,0 +1,258 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use Carbon\CarbonInterface; +use Carbon\Exceptions\UnknownUnitException; + +/** + * Trait Rounding. + * + * Round, ceil, floor units. + * + * Depends on the following methods: + * + * @method static copy() + * @method static startOfWeek(int $weekStartsAt = null) + */ +trait Rounding +{ + use IntervalRounding; + + /** + * Round the current instance at the given unit with given precision if specified and the given function. + * + * @param string $unit + * @param float|int $precision + * @param string $function + * + * @return CarbonInterface + */ + public function roundUnit($unit, $precision = 1, $function = 'round') + { + $metaUnits = [ + // @call roundUnit + 'millennium' => [static::YEARS_PER_MILLENNIUM, 'year'], + // @call roundUnit + 'century' => [static::YEARS_PER_CENTURY, 'year'], + // @call roundUnit + 'decade' => [static::YEARS_PER_DECADE, 'year'], + // @call roundUnit + 'quarter' => [static::MONTHS_PER_QUARTER, 'month'], + // @call roundUnit + 'millisecond' => [1000, 'microsecond'], + ]; + $normalizedUnit = static::singularUnit($unit); + $ranges = array_merge(static::getRangesByUnit($this->daysInMonth), [ + // @call roundUnit + 'microsecond' => [0, 999999], + ]); + $factor = 1; + $initialMonth = $this->month; + + if ($normalizedUnit === 'week') { + $normalizedUnit = 'day'; + $precision *= static::DAYS_PER_WEEK; + } + + if (isset($metaUnits[$normalizedUnit])) { + [$factor, $normalizedUnit] = $metaUnits[$normalizedUnit]; + } + + $precision *= $factor; + + if (!isset($ranges[$normalizedUnit])) { + throw new UnknownUnitException($unit); + } + + $found = false; + $fraction = 0; + $arguments = null; + $initialValue = null; + $factor = $this->year < 0 ? -1 : 1; + $changes = []; + $minimumInc = null; + + foreach ($ranges as $unit => [$minimum, $maximum]) { + if ($normalizedUnit === $unit) { + $arguments = [$this->$unit, $minimum]; + $initialValue = $this->$unit; + $fraction = $precision - floor($precision); + $found = true; + + continue; + } + + if ($found) { + $delta = $maximum + 1 - $minimum; + $factor /= $delta; + $fraction *= $delta; + $inc = ($this->$unit - $minimum) * $factor; + + if ($inc !== 0.0) { + $minimumInc = $minimumInc ?? ($arguments[0] / pow(2, 52)); + + // If value is still the same when adding a non-zero increment/decrement, + // it means precision got lost in the addition + if (abs($inc) < $minimumInc) { + $inc = $minimumInc * ($inc < 0 ? -1 : 1); + } + + // If greater than $precision, assume precision loss caused an overflow + if ($function !== 'floor' || abs($arguments[0] + $inc - $initialValue) >= $precision) { + $arguments[0] += $inc; + } + } + + $changes[$unit] = round( + $minimum + ($fraction ? $fraction * $function(($this->$unit - $minimum) / $fraction) : 0) + ); + + // Cannot use modulo as it lose double precision + while ($changes[$unit] >= $delta) { + $changes[$unit] -= $delta; + } + + $fraction -= floor($fraction); + } + } + + [$value, $minimum] = $arguments; + $normalizedValue = floor($function(($value - $minimum) / $precision) * $precision + $minimum); + + /** @var CarbonInterface $result */ + $result = $this->$normalizedUnit($normalizedValue); + + foreach ($changes as $unit => $value) { + $result = $result->$unit($value); + } + + return $normalizedUnit === 'month' && $precision <= 1 && abs($result->month - $initialMonth) === 2 + // Re-run the change in case an overflow occurred + ? $result->$normalizedUnit($normalizedValue) + : $result; + } + + /** + * Truncate the current instance at the given unit with given precision if specified. + * + * @param string $unit + * @param float|int $precision + * + * @return CarbonInterface + */ + public function floorUnit($unit, $precision = 1) + { + return $this->roundUnit($unit, $precision, 'floor'); + } + + /** + * Ceil the current instance at the given unit with given precision if specified. + * + * @param string $unit + * @param float|int $precision + * + * @return CarbonInterface + */ + public function ceilUnit($unit, $precision = 1) + { + return $this->roundUnit($unit, $precision, 'ceil'); + } + + /** + * Round the current instance second with given precision if specified. + * + * @param float|int|string|\DateInterval|null $precision + * @param string $function + * + * @return CarbonInterface + */ + public function round($precision = 1, $function = 'round') + { + return $this->roundWith($precision, $function); + } + + /** + * Round the current instance second with given precision if specified. + * + * @param float|int|string|\DateInterval|null $precision + * + * @return CarbonInterface + */ + public function floor($precision = 1) + { + return $this->round($precision, 'floor'); + } + + /** + * Ceil the current instance second with given precision if specified. + * + * @param float|int|string|\DateInterval|null $precision + * + * @return CarbonInterface + */ + public function ceil($precision = 1) + { + return $this->round($precision, 'ceil'); + } + + /** + * Round the current instance week. + * + * @param int $weekStartsAt optional start allow you to specify the day of week to use to start the week + * + * @return CarbonInterface + */ + public function roundWeek($weekStartsAt = null) + { + return $this->closest( + $this->avoidMutation()->floorWeek($weekStartsAt), + $this->avoidMutation()->ceilWeek($weekStartsAt) + ); + } + + /** + * Truncate the current instance week. + * + * @param int $weekStartsAt optional start allow you to specify the day of week to use to start the week + * + * @return CarbonInterface + */ + public function floorWeek($weekStartsAt = null) + { + return $this->startOfWeek($weekStartsAt); + } + + /** + * Ceil the current instance week. + * + * @param int $weekStartsAt optional start allow you to specify the day of week to use to start the week + * + * @return CarbonInterface + */ + public function ceilWeek($weekStartsAt = null) + { + if ($this->isMutable()) { + $startOfWeek = $this->avoidMutation()->startOfWeek($weekStartsAt); + + return $startOfWeek != $this ? + $this->startOfWeek($weekStartsAt)->addWeek() : + $this; + } + + $startOfWeek = $this->startOfWeek($weekStartsAt); + + return $startOfWeek != $this ? + $startOfWeek->addWeek() : + $this->avoidMutation(); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php b/vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php new file mode 100644 index 0000000..9e86bd3 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php @@ -0,0 +1,304 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use Carbon\Exceptions\InvalidFormatException; +use ReturnTypeWillChange; +use Throwable; + +/** + * Trait Serialization. + * + * Serialization and JSON stuff. + * + * Depends on the following properties: + * + * @property int $year + * @property int $month + * @property int $daysInMonth + * @property int $quarter + * + * Depends on the following methods: + * + * @method string|static locale(string $locale = null, string ...$fallbackLocales) + * @method string toJSON() + */ +trait Serialization +{ + use ObjectInitialisation; + + /** + * The custom Carbon JSON serializer. + * + * @var callable|null + */ + protected static $serializer; + + /** + * List of key to use for dump/serialization. + * + * @var string[] + */ + protected $dumpProperties = ['date', 'timezone_type', 'timezone']; + + /** + * Locale to dump comes here before serialization. + * + * @var string|null + */ + protected $dumpLocale; + + /** + * Embed date properties to dump in a dedicated variables so it won't overlap native + * DateTime ones. + * + * @var array|null + */ + protected $dumpDateProperties; + + /** + * Return a serialized string of the instance. + * + * @return string + */ + public function serialize() + { + return serialize($this); + } + + /** + * Create an instance from a serialized string. + * + * @param string $value + * + * @throws InvalidFormatException + * + * @return static + */ + public static function fromSerialized($value) + { + $instance = @unserialize((string) $value); + + if (!$instance instanceof static) { + throw new InvalidFormatException("Invalid serialized value: $value"); + } + + return $instance; + } + + /** + * The __set_state handler. + * + * @param string|array $dump + * + * @return static + */ + #[ReturnTypeWillChange] + public static function __set_state($dump) + { + if (\is_string($dump)) { + return static::parse($dump); + } + + /** @var \DateTimeInterface $date */ + $date = get_parent_class(static::class) && method_exists(parent::class, '__set_state') + ? parent::__set_state((array) $dump) + : (object) $dump; + + return static::instance($date); + } + + /** + * Returns the list of properties to dump on serialize() called on. + * + * @return array + */ + public function __sleep() + { + $properties = $this->getSleepProperties(); + + if ($this->localTranslator ?? null) { + $properties[] = 'dumpLocale'; + $this->dumpLocale = $this->locale ?? null; + } + + return $properties; + } + + public function __serialize(): array + { + if (isset($this->timezone_type)) { + return [ + 'date' => $this->date ?? null, + 'timezone_type' => $this->timezone_type, + 'timezone' => $this->timezone ?? null, + ]; + } + + $timezone = $this->getTimezone(); + $export = [ + 'date' => $this->format('Y-m-d H:i:s.u'), + 'timezone_type' => $timezone->getType(), + 'timezone' => $timezone->getName(), + ]; + + // @codeCoverageIgnoreStart + if (\extension_loaded('msgpack') && isset($this->constructedObjectId)) { + $export['dumpDateProperties'] = [ + 'date' => $this->format('Y-m-d H:i:s.u'), + 'timezone' => serialize($this->timezone ?? null), + ]; + } + // @codeCoverageIgnoreEnd + + if ($this->localTranslator ?? null) { + $export['dumpLocale'] = $this->locale ?? null; + } + + return $export; + } + + /** + * Set locale if specified on unserialize() called. + * + * @return void + */ + #[ReturnTypeWillChange] + public function __wakeup() + { + if (parent::class && method_exists(parent::class, '__wakeup')) { + // @codeCoverageIgnoreStart + try { + parent::__wakeup(); + } catch (Throwable $exception) { + try { + // FatalError occurs when calling msgpack_unpack() in PHP 7.4 or later. + ['date' => $date, 'timezone' => $timezone] = $this->dumpDateProperties; + parent::__construct($date, unserialize($timezone)); + } catch (Throwable $ignoredException) { + throw $exception; + } + } + // @codeCoverageIgnoreEnd + } + + $this->constructedObjectId = spl_object_hash($this); + + if (isset($this->dumpLocale)) { + $this->locale($this->dumpLocale); + $this->dumpLocale = null; + } + + $this->cleanupDumpProperties(); + } + + public function __unserialize(array $data): void + { + // @codeCoverageIgnoreStart + try { + $this->__construct($data['date'] ?? null, $data['timezone'] ?? null); + } catch (Throwable $exception) { + if (!isset($data['dumpDateProperties']['date'], $data['dumpDateProperties']['timezone'])) { + throw $exception; + } + + try { + // FatalError occurs when calling msgpack_unpack() in PHP 7.4 or later. + ['date' => $date, 'timezone' => $timezone] = $data['dumpDateProperties']; + $this->__construct($date, unserialize($timezone)); + } catch (Throwable $ignoredException) { + throw $exception; + } + } + // @codeCoverageIgnoreEnd + + if (isset($data['dumpLocale'])) { + $this->locale($data['dumpLocale']); + } + } + + /** + * Prepare the object for JSON serialization. + * + * @return array|string + */ + #[ReturnTypeWillChange] + public function jsonSerialize() + { + $serializer = $this->localSerializer ?? static::$serializer; + + if ($serializer) { + return \is_string($serializer) + ? $this->rawFormat($serializer) + : $serializer($this); + } + + return $this->toJSON(); + } + + /** + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather transform Carbon object before the serialization. + * + * JSON serialize all Carbon instances using the given callback. + * + * @param callable $callback + * + * @return void + */ + public static function serializeUsing($callback) + { + static::$serializer = $callback; + } + + /** + * Cleanup properties attached to the public scope of DateTime when a dump of the date is requested. + * foreach ($date as $_) {} + * serializer($date) + * var_export($date) + * get_object_vars($date) + */ + public function cleanupDumpProperties() + { + if (PHP_VERSION < 8.2) { + foreach ($this->dumpProperties as $property) { + if (isset($this->$property)) { + unset($this->$property); + } + } + } + + return $this; + } + + private function getSleepProperties(): array + { + $properties = $this->dumpProperties; + + // @codeCoverageIgnoreStart + if (!\extension_loaded('msgpack')) { + return $properties; + } + + if (isset($this->constructedObjectId)) { + $this->dumpDateProperties = [ + 'date' => $this->format('Y-m-d H:i:s.u'), + 'timezone' => serialize($this->timezone ?? null), + ]; + + $properties[] = 'dumpDateProperties'; + } + + return $properties; + // @codeCoverageIgnoreEnd + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Test.php b/vendor/nesbot/carbon/src/Carbon/Traits/Test.php new file mode 100644 index 0000000..e0c9e80 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Test.php @@ -0,0 +1,226 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use Carbon\CarbonInterface; +use Carbon\CarbonTimeZone; +use Closure; +use DateTimeImmutable; +use DateTimeInterface; +use InvalidArgumentException; +use Throwable; + +trait Test +{ + /////////////////////////////////////////////////////////////////// + ///////////////////////// TESTING AIDS //////////////////////////// + /////////////////////////////////////////////////////////////////// + + /** + * A test Carbon instance to be returned when now instances are created. + * + * @var Closure|static|null + */ + protected static $testNow; + + /** + * The timezone to resto to when clearing the time mock. + * + * @var string|null + */ + protected static $testDefaultTimezone; + + /** + * Set a Carbon instance (real or mock) to be returned when a "now" + * instance is created. The provided instance will be returned + * specifically under the following conditions: + * - A call to the static now() method, ex. Carbon::now() + * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) + * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') + * - When a string containing the desired time is passed to Carbon::parse(). + * + * Note the timezone parameter was left out of the examples above and + * has no affect as the mock value will be returned regardless of its value. + * + * Only the moment is mocked with setTestNow(), the timezone will still be the one passed + * as parameter of date_default_timezone_get() as a fallback (see setTestNowAndTimezone()). + * + * To clear the test instance call this method using the default + * parameter of null. + * + * /!\ Use this method for unit tests only. + * + * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance + */ + public static function setTestNow($testNow = null) + { + static::$testNow = $testNow instanceof self || $testNow instanceof Closure + ? $testNow + : static::make($testNow); + } + + /** + * Set a Carbon instance (real or mock) to be returned when a "now" + * instance is created. The provided instance will be returned + * specifically under the following conditions: + * - A call to the static now() method, ex. Carbon::now() + * - When a null (or blank string) is passed to the constructor or parse(), ex. new Carbon(null) + * - When the string "now" is passed to the constructor or parse(), ex. new Carbon('now') + * - When a string containing the desired time is passed to Carbon::parse(). + * + * It will also align default timezone (e.g. call date_default_timezone_set()) with + * the second argument or if null, with the timezone of the given date object. + * + * To clear the test instance call this method using the default + * parameter of null. + * + * /!\ Use this method for unit tests only. + * + * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance + */ + public static function setTestNowAndTimezone($testNow = null, $tz = null) + { + if ($testNow) { + self::$testDefaultTimezone = self::$testDefaultTimezone ?? date_default_timezone_get(); + } + + $useDateInstanceTimezone = $testNow instanceof DateTimeInterface; + + if ($useDateInstanceTimezone) { + self::setDefaultTimezone($testNow->getTimezone()->getName(), $testNow); + } + + static::setTestNow($testNow); + + if (!$useDateInstanceTimezone) { + $now = static::getMockedTestNow(\func_num_args() === 1 ? null : $tz); + $tzName = $now ? $now->tzName : null; + self::setDefaultTimezone($tzName ?? self::$testDefaultTimezone ?? 'UTC', $now); + } + + if (!$testNow) { + self::$testDefaultTimezone = null; + } + } + + /** + * Temporarily sets a static date to be used within the callback. + * Using setTestNow to set the date, executing the callback, then + * clearing the test instance. + * + * /!\ Use this method for unit tests only. + * + * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance + * @param Closure|null $callback + * + * @return mixed + */ + public static function withTestNow($testNow = null, $callback = null) + { + static::setTestNow($testNow); + + try { + $result = $callback(); + } finally { + static::setTestNow(); + } + + return $result; + } + + /** + * Get the Carbon instance (real or mock) to be returned when a "now" + * instance is created. + * + * @return Closure|static the current instance used for testing + */ + public static function getTestNow() + { + return static::$testNow; + } + + /** + * Determine if there is a valid test instance set. A valid test instance + * is anything that is not null. + * + * @return bool true if there is a test instance, otherwise false + */ + public static function hasTestNow() + { + return static::getTestNow() !== null; + } + + /** + * Get the mocked date passed in setTestNow() and if it's a Closure, execute it. + * + * @param string|\DateTimeZone $tz + * + * @return \Carbon\CarbonImmutable|\Carbon\Carbon|null + */ + protected static function getMockedTestNow($tz) + { + $testNow = static::getTestNow(); + + if ($testNow instanceof Closure) { + $realNow = new DateTimeImmutable('now'); + $testNow = $testNow(static::parse( + $realNow->format('Y-m-d H:i:s.u'), + $tz ?: $realNow->getTimezone() + )); + } + /* @var \Carbon\CarbonImmutable|\Carbon\Carbon|null $testNow */ + + return $testNow instanceof CarbonInterface + ? $testNow->avoidMutation()->tz($tz) + : $testNow; + } + + protected static function mockConstructorParameters(&$time, $tz) + { + /** @var \Carbon\CarbonImmutable|\Carbon\Carbon $testInstance */ + $testInstance = clone static::getMockedTestNow($tz); + + if (static::hasRelativeKeywords($time)) { + $testInstance = $testInstance->modify($time); + } + + $time = $testInstance instanceof self + ? $testInstance->rawFormat(static::MOCK_DATETIME_FORMAT) + : $testInstance->format(static::MOCK_DATETIME_FORMAT); + } + + private static function setDefaultTimezone($timezone, DateTimeInterface $date = null) + { + $previous = null; + $success = false; + + try { + $success = date_default_timezone_set($timezone); + } catch (Throwable $exception) { + $previous = $exception; + } + + if (!$success) { + $suggestion = @CarbonTimeZone::create($timezone)->toRegionName($date); + + throw new InvalidArgumentException( + "Timezone ID '$timezone' is invalid". + ($suggestion && $suggestion !== $timezone ? ", did you mean '$suggestion'?" : '.')."\n". + "It must be one of the IDs from DateTimeZone::listIdentifiers(),\n". + 'For the record, hours/minutes offset are relevant only for a particular moment, '. + 'but not as a default timezone.', + 0, + $previous + ); + } + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php b/vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php new file mode 100644 index 0000000..88a465c --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php @@ -0,0 +1,198 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +/** + * Trait Timestamp. + */ +trait Timestamp +{ + /** + * Create a Carbon instance from a timestamp and set the timezone (use default one if not specified). + * + * Timestamp input can be given as int, float or a string containing one or more numbers. + * + * @param float|int|string $timestamp + * @param \DateTimeZone|string|null $tz + * + * @return static + */ + public static function createFromTimestamp($timestamp, $tz = null) + { + return static::createFromTimestampUTC($timestamp)->setTimezone($tz); + } + + /** + * Create a Carbon instance from an timestamp keeping the timezone to UTC. + * + * Timestamp input can be given as int, float or a string containing one or more numbers. + * + * @param float|int|string $timestamp + * + * @return static + */ + public static function createFromTimestampUTC($timestamp) + { + [$integer, $decimal] = self::getIntegerAndDecimalParts($timestamp); + $delta = floor($decimal / static::MICROSECONDS_PER_SECOND); + $integer += $delta; + $decimal -= $delta * static::MICROSECONDS_PER_SECOND; + $decimal = str_pad((string) $decimal, 6, '0', STR_PAD_LEFT); + + return static::rawCreateFromFormat('U u', "$integer $decimal"); + } + + /** + * Create a Carbon instance from a timestamp in milliseconds. + * + * Timestamp input can be given as int, float or a string containing one or more numbers. + * + * @param float|int|string $timestamp + * + * @return static + */ + public static function createFromTimestampMsUTC($timestamp) + { + [$milliseconds, $microseconds] = self::getIntegerAndDecimalParts($timestamp, 3); + $sign = $milliseconds < 0 || ($milliseconds === 0.0 && $microseconds < 0) ? -1 : 1; + $milliseconds = abs($milliseconds); + $microseconds = $sign * abs($microseconds) + static::MICROSECONDS_PER_MILLISECOND * ($milliseconds % static::MILLISECONDS_PER_SECOND); + $seconds = $sign * floor($milliseconds / static::MILLISECONDS_PER_SECOND); + $delta = floor($microseconds / static::MICROSECONDS_PER_SECOND); + $seconds += $delta; + $microseconds -= $delta * static::MICROSECONDS_PER_SECOND; + $microseconds = str_pad($microseconds, 6, '0', STR_PAD_LEFT); + + return static::rawCreateFromFormat('U u', "$seconds $microseconds"); + } + + /** + * Create a Carbon instance from a timestamp in milliseconds. + * + * Timestamp input can be given as int, float or a string containing one or more numbers. + * + * @param float|int|string $timestamp + * @param \DateTimeZone|string|null $tz + * + * @return static + */ + public static function createFromTimestampMs($timestamp, $tz = null) + { + return static::createFromTimestampMsUTC($timestamp) + ->setTimezone($tz); + } + + /** + * Set the instance's timestamp. + * + * Timestamp input can be given as int, float or a string containing one or more numbers. + * + * @param float|int|string $unixTimestamp + * + * @return static + */ + public function timestamp($unixTimestamp) + { + return $this->setTimestamp($unixTimestamp); + } + + /** + * Returns a timestamp rounded with the given precision (6 by default). + * + * @example getPreciseTimestamp() 1532087464437474 (microsecond maximum precision) + * @example getPreciseTimestamp(6) 1532087464437474 + * @example getPreciseTimestamp(5) 153208746443747 (1/100000 second precision) + * @example getPreciseTimestamp(4) 15320874644375 (1/10000 second precision) + * @example getPreciseTimestamp(3) 1532087464437 (millisecond precision) + * @example getPreciseTimestamp(2) 153208746444 (1/100 second precision) + * @example getPreciseTimestamp(1) 15320874644 (1/10 second precision) + * @example getPreciseTimestamp(0) 1532087464 (second precision) + * @example getPreciseTimestamp(-1) 153208746 (10 second precision) + * @example getPreciseTimestamp(-2) 15320875 (100 second precision) + * + * @param int $precision + * + * @return float + */ + public function getPreciseTimestamp($precision = 6) + { + return round(((float) $this->rawFormat('Uu')) / pow(10, 6 - $precision)); + } + + /** + * Returns the milliseconds timestamps used amongst other by Date javascript objects. + * + * @return float + */ + public function valueOf() + { + return $this->getPreciseTimestamp(3); + } + + /** + * Returns the timestamp with millisecond precision. + * + * @return int + */ + public function getTimestampMs() + { + return (int) $this->getPreciseTimestamp(3); + } + + /** + * @alias getTimestamp + * + * Returns the UNIX timestamp for the current date. + * + * @return int + */ + public function unix() + { + return $this->getTimestamp(); + } + + /** + * Return an array with integer part digits and decimals digits split from one or more positive numbers + * (such as timestamps) as string with the given number of decimals (6 by default). + * + * By splitting integer and decimal, this method obtain a better precision than + * number_format when the input is a string. + * + * @param float|int|string $numbers one or more numbers + * @param int $decimals number of decimals precision (6 by default) + * + * @return array 0-index is integer part, 1-index is decimal part digits + */ + private static function getIntegerAndDecimalParts($numbers, $decimals = 6) + { + if (\is_int($numbers) || \is_float($numbers)) { + $numbers = number_format($numbers, $decimals, '.', ''); + } + + $sign = str_starts_with($numbers, '-') ? -1 : 1; + $integer = 0; + $decimal = 0; + + foreach (preg_split('`[^\d.]+`', $numbers) as $chunk) { + [$integerPart, $decimalPart] = explode('.', "$chunk."); + + $integer += (int) $integerPart; + $decimal += (float) ("0.$decimalPart"); + } + + $overflow = floor($decimal); + $integer += $overflow; + $decimal -= $overflow; + + return [$sign * $integer, $decimal === 0.0 ? 0.0 : $sign * round($decimal * pow(10, $decimals))]; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php b/vendor/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php new file mode 100644 index 0000000..38cb240 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php @@ -0,0 +1,56 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use Closure; + +/** + * Trait ToStringFormat. + * + * Handle global format customization for string cast of the object. + */ +trait ToStringFormat +{ + /** + * Format to use for __toString method when type juggling occurs. + * + * @var string|Closure|null + */ + protected static $toStringFormat; + + /** + * Reset the format used to the default when type juggling a Carbon instance to a string + * + * @return void + */ + public static function resetToStringFormat() + { + static::setToStringFormat(null); + } + + /** + * @param string|Closure|null $format + * + * @return void + * + * @deprecated To avoid conflict between different third-party libraries, static setters should not be used. + * You should rather let Carbon object being cast to string with DEFAULT_TO_STRING_FORMAT, and + * use other method or custom format passed to format() method if you need to dump another string + * format. + * + * Set the default format used when type juggling a Carbon instance to a string. + */ + public static function setToStringFormat($format) + { + static::$toStringFormat = $format; + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Units.php b/vendor/nesbot/carbon/src/Carbon/Traits/Units.php new file mode 100644 index 0000000..f4f797d --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Units.php @@ -0,0 +1,406 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +use Carbon\CarbonConverterInterface; +use Carbon\CarbonInterface; +use Carbon\CarbonInterval; +use Carbon\Exceptions\UnitException; +use Closure; +use DateInterval; +use ReturnTypeWillChange; + +/** + * Trait Units. + * + * Add, subtract and set units. + */ +trait Units +{ + /** + * Add seconds to the instance using timestamp. Positive $value travels + * forward while negative $value travels into the past. + * + * @param string $unit + * @param int $value + * + * @return static + */ + public function addRealUnit($unit, $value = 1) + { + switch ($unit) { + // @call addRealUnit + case 'micro': + + // @call addRealUnit + case 'microsecond': + /* @var CarbonInterface $this */ + $diff = $this->microsecond + $value; + $time = $this->getTimestamp(); + $seconds = (int) floor($diff / static::MICROSECONDS_PER_SECOND); + $time += $seconds; + $diff -= $seconds * static::MICROSECONDS_PER_SECOND; + $microtime = str_pad((string) $diff, 6, '0', STR_PAD_LEFT); + $tz = $this->tz; + + return $this->tz('UTC')->modify("@$time.$microtime")->tz($tz); + + // @call addRealUnit + case 'milli': + // @call addRealUnit + case 'millisecond': + return $this->addRealUnit('microsecond', $value * static::MICROSECONDS_PER_MILLISECOND); + + // @call addRealUnit + case 'second': + break; + + // @call addRealUnit + case 'minute': + $value *= static::SECONDS_PER_MINUTE; + + break; + + // @call addRealUnit + case 'hour': + $value *= static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; + + break; + + // @call addRealUnit + case 'day': + $value *= static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; + + break; + + // @call addRealUnit + case 'week': + $value *= static::DAYS_PER_WEEK * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; + + break; + + // @call addRealUnit + case 'month': + $value *= 30 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; + + break; + + // @call addRealUnit + case 'quarter': + $value *= static::MONTHS_PER_QUARTER * 30 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; + + break; + + // @call addRealUnit + case 'year': + $value *= 365 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; + + break; + + // @call addRealUnit + case 'decade': + $value *= static::YEARS_PER_DECADE * 365 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; + + break; + + // @call addRealUnit + case 'century': + $value *= static::YEARS_PER_CENTURY * 365 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; + + break; + + // @call addRealUnit + case 'millennium': + $value *= static::YEARS_PER_MILLENNIUM * 365 * static::HOURS_PER_DAY * static::MINUTES_PER_HOUR * static::SECONDS_PER_MINUTE; + + break; + + default: + if ($this->localStrictModeEnabled ?? static::isStrictModeEnabled()) { + throw new UnitException("Invalid unit for real timestamp add/sub: '$unit'"); + } + + return $this; + } + + /* @var CarbonInterface $this */ + return $this->setTimestamp((int) ($this->getTimestamp() + $value)); + } + + public function subRealUnit($unit, $value = 1) + { + return $this->addRealUnit($unit, -$value); + } + + /** + * Returns true if a property can be changed via setter. + * + * @param string $unit + * + * @return bool + */ + public static function isModifiableUnit($unit) + { + static $modifiableUnits = [ + // @call addUnit + 'millennium', + // @call addUnit + 'century', + // @call addUnit + 'decade', + // @call addUnit + 'quarter', + // @call addUnit + 'week', + // @call addUnit + 'weekday', + ]; + + return \in_array($unit, $modifiableUnits, true) || \in_array($unit, static::$units, true); + } + + /** + * Call native PHP DateTime/DateTimeImmutable add() method. + * + * @param DateInterval $interval + * + * @return static + */ + public function rawAdd(DateInterval $interval) + { + return parent::add($interval); + } + + /** + * Add given units or interval to the current instance. + * + * @example $date->add('hour', 3) + * @example $date->add(15, 'days') + * @example $date->add(CarbonInterval::days(4)) + * + * @param string|DateInterval|Closure|CarbonConverterInterface $unit + * @param int $value + * @param bool|null $overflow + * + * @return static + */ + #[ReturnTypeWillChange] + public function add($unit, $value = 1, $overflow = null) + { + if (\is_string($unit) && \func_num_args() === 1) { + $unit = CarbonInterval::make($unit); + } + + if ($unit instanceof CarbonConverterInterface) { + return $this->resolveCarbon($unit->convertDate($this, false)); + } + + if ($unit instanceof Closure) { + return $this->resolveCarbon($unit($this, false)); + } + + if ($unit instanceof DateInterval) { + return parent::add($unit); + } + + if (is_numeric($unit)) { + [$value, $unit] = [$unit, $value]; + } + + return $this->addUnit($unit, $value, $overflow); + } + + /** + * Add given units to the current instance. + * + * @param string $unit + * @param int $value + * @param bool|null $overflow + * + * @return static + */ + public function addUnit($unit, $value = 1, $overflow = null) + { + $originalArgs = \func_get_args(); + + $date = $this; + + if (!is_numeric($value) || !(float) $value) { + return $date->isMutable() ? $date : $date->avoidMutation(); + } + + $unit = self::singularUnit($unit); + $metaUnits = [ + 'millennium' => [static::YEARS_PER_MILLENNIUM, 'year'], + 'century' => [static::YEARS_PER_CENTURY, 'year'], + 'decade' => [static::YEARS_PER_DECADE, 'year'], + 'quarter' => [static::MONTHS_PER_QUARTER, 'month'], + ]; + + if (isset($metaUnits[$unit])) { + [$factor, $unit] = $metaUnits[$unit]; + $value *= $factor; + } + + if ($unit === 'weekday') { + $weekendDays = static::getWeekendDays(); + + if ($weekendDays !== [static::SATURDAY, static::SUNDAY]) { + $absoluteValue = abs($value); + $sign = $value / max(1, $absoluteValue); + $weekDaysCount = 7 - min(6, \count(array_unique($weekendDays))); + $weeks = floor($absoluteValue / $weekDaysCount); + + for ($diff = $absoluteValue % $weekDaysCount; $diff; $diff--) { + /** @var static $date */ + $date = $date->addDays($sign); + + while (\in_array($date->dayOfWeek, $weekendDays, true)) { + $date = $date->addDays($sign); + } + } + + $value = $weeks * $sign; + $unit = 'week'; + } + + $timeString = $date->toTimeString(); + } elseif ($canOverflow = (\in_array($unit, [ + 'month', + 'year', + ]) && ($overflow === false || ( + $overflow === null && + ($ucUnit = ucfirst($unit).'s') && + !($this->{'local'.$ucUnit.'Overflow'} ?? static::{'shouldOverflow'.$ucUnit}()) + )))) { + $day = $date->day; + } + + $value = (int) $value; + + if ($unit === 'milli' || $unit === 'millisecond') { + $unit = 'microsecond'; + $value *= static::MICROSECONDS_PER_MILLISECOND; + } + + // Work-around for bug https://bugs.php.net/bug.php?id=75642 + if ($unit === 'micro' || $unit === 'microsecond') { + $microseconds = $this->micro + $value; + $second = (int) floor($microseconds / static::MICROSECONDS_PER_SECOND); + $microseconds %= static::MICROSECONDS_PER_SECOND; + if ($microseconds < 0) { + $microseconds += static::MICROSECONDS_PER_SECOND; + } + $date = $date->microseconds($microseconds); + $unit = 'second'; + $value = $second; + } + $date = $date->modify("$value $unit"); + + if (isset($timeString)) { + $date = $date->setTimeFromTimeString($timeString); + } elseif (isset($canOverflow, $day) && $canOverflow && $day !== $date->day) { + $date = $date->modify('last day of previous month'); + } + + if (!$date) { + throw new UnitException('Unable to add unit '.var_export($originalArgs, true)); + } + + return $date; + } + + /** + * Subtract given units to the current instance. + * + * @param string $unit + * @param int $value + * @param bool|null $overflow + * + * @return static + */ + public function subUnit($unit, $value = 1, $overflow = null) + { + return $this->addUnit($unit, -$value, $overflow); + } + + /** + * Call native PHP DateTime/DateTimeImmutable sub() method. + * + * @param DateInterval $interval + * + * @return static + */ + public function rawSub(DateInterval $interval) + { + return parent::sub($interval); + } + + /** + * Subtract given units or interval to the current instance. + * + * @example $date->sub('hour', 3) + * @example $date->sub(15, 'days') + * @example $date->sub(CarbonInterval::days(4)) + * + * @param string|DateInterval|Closure|CarbonConverterInterface $unit + * @param int $value + * @param bool|null $overflow + * + * @return static + */ + #[ReturnTypeWillChange] + public function sub($unit, $value = 1, $overflow = null) + { + if (\is_string($unit) && \func_num_args() === 1) { + $unit = CarbonInterval::make($unit); + } + + if ($unit instanceof CarbonConverterInterface) { + return $this->resolveCarbon($unit->convertDate($this, true)); + } + + if ($unit instanceof Closure) { + return $this->resolveCarbon($unit($this, true)); + } + + if ($unit instanceof DateInterval) { + return parent::sub($unit); + } + + if (is_numeric($unit)) { + [$value, $unit] = [$unit, $value]; + } + + return $this->addUnit($unit, -(float) $value, $overflow); + } + + /** + * Subtract given units or interval to the current instance. + * + * @see sub() + * + * @param string|DateInterval $unit + * @param int $value + * @param bool|null $overflow + * + * @return static + */ + public function subtract($unit, $value = 1, $overflow = null) + { + if (\is_string($unit) && \func_num_args() === 1) { + $unit = CarbonInterval::make($unit); + } + + return $this->sub($unit, $value, $overflow); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Week.php b/vendor/nesbot/carbon/src/Carbon/Traits/Week.php new file mode 100644 index 0000000..6f14814 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Week.php @@ -0,0 +1,219 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Traits; + +/** + * Trait Week. + * + * week and ISO week number, year and count in year. + * + * Depends on the following properties: + * + * @property int $daysInYear + * @property int $dayOfWeek + * @property int $dayOfYear + * @property int $year + * + * Depends on the following methods: + * + * @method static addWeeks(int $weeks = 1) + * @method static copy() + * @method static dayOfYear(int $dayOfYear) + * @method string getTranslationMessage(string $key, ?string $locale = null, ?string $default = null, $translator = null) + * @method static next(int|string $day = null) + * @method static startOfWeek(int $day = 1) + * @method static subWeeks(int $weeks = 1) + * @method static year(int $year = null) + */ +trait Week +{ + /** + * Set/get the week number of year using given first day of week and first + * day of year included in the first week. Or use ISO format if no settings + * given. + * + * @param int|null $year if null, act as a getter, if not null, set the year and return current instance. + * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) + * @param int|null $dayOfYear first day of year included in the week #1 + * + * @return int|static + */ + public function isoWeekYear($year = null, $dayOfWeek = null, $dayOfYear = null) + { + return $this->weekYear( + $year, + $dayOfWeek ?? 1, + $dayOfYear ?? 4 + ); + } + + /** + * Set/get the week number of year using given first day of week and first + * day of year included in the first week. Or use US format if no settings + * given (Sunday / Jan 6). + * + * @param int|null $year if null, act as a getter, if not null, set the year and return current instance. + * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) + * @param int|null $dayOfYear first day of year included in the week #1 + * + * @return int|static + */ + public function weekYear($year = null, $dayOfWeek = null, $dayOfYear = null) + { + $dayOfWeek = $dayOfWeek ?? $this->getTranslationMessage('first_day_of_week') ?? 0; + $dayOfYear = $dayOfYear ?? $this->getTranslationMessage('day_of_first_week_of_year') ?? 1; + + if ($year !== null) { + $year = (int) round($year); + + if ($this->weekYear(null, $dayOfWeek, $dayOfYear) === $year) { + return $this->avoidMutation(); + } + + $week = $this->week(null, $dayOfWeek, $dayOfYear); + $day = $this->dayOfWeek; + $date = $this->year($year); + switch ($date->weekYear(null, $dayOfWeek, $dayOfYear) - $year) { + case 1: + $date = $date->subWeeks(26); + + break; + case -1: + $date = $date->addWeeks(26); + + break; + } + + $date = $date->addWeeks($week - $date->week(null, $dayOfWeek, $dayOfYear))->startOfWeek($dayOfWeek); + + if ($date->dayOfWeek === $day) { + return $date; + } + + return $date->next($day); + } + + $year = $this->year; + $day = $this->dayOfYear; + $date = $this->avoidMutation()->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); + + if ($date->year === $year && $day < $date->dayOfYear) { + return $year - 1; + } + + $date = $this->avoidMutation()->addYear()->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); + + if ($date->year === $year && $day >= $date->dayOfYear) { + return $year + 1; + } + + return $year; + } + + /** + * Get the number of weeks of the current week-year using given first day of week and first + * day of year included in the first week. Or use ISO format if no settings + * given. + * + * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) + * @param int|null $dayOfYear first day of year included in the week #1 + * + * @return int + */ + public function isoWeeksInYear($dayOfWeek = null, $dayOfYear = null) + { + return $this->weeksInYear( + $dayOfWeek ?? 1, + $dayOfYear ?? 4 + ); + } + + /** + * Get the number of weeks of the current week-year using given first day of week and first + * day of year included in the first week. Or use US format if no settings + * given (Sunday / Jan 6). + * + * @param int|null $dayOfWeek first date of week from 0 (Sunday) to 6 (Saturday) + * @param int|null $dayOfYear first day of year included in the week #1 + * + * @return int + */ + public function weeksInYear($dayOfWeek = null, $dayOfYear = null) + { + $dayOfWeek = $dayOfWeek ?? $this->getTranslationMessage('first_day_of_week') ?? 0; + $dayOfYear = $dayOfYear ?? $this->getTranslationMessage('day_of_first_week_of_year') ?? 1; + $year = $this->year; + $start = $this->avoidMutation()->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); + $startDay = $start->dayOfYear; + if ($start->year !== $year) { + $startDay -= $start->daysInYear; + } + $end = $this->avoidMutation()->addYear()->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); + $endDay = $end->dayOfYear; + if ($end->year !== $year) { + $endDay += $this->daysInYear; + } + + return (int) round(($endDay - $startDay) / 7); + } + + /** + * Get/set the week number using given first day of week and first + * day of year included in the first week. Or use US format if no settings + * given (Sunday / Jan 6). + * + * @param int|null $week + * @param int|null $dayOfWeek + * @param int|null $dayOfYear + * + * @return int|static + */ + public function week($week = null, $dayOfWeek = null, $dayOfYear = null) + { + $date = $this; + $dayOfWeek = $dayOfWeek ?? $this->getTranslationMessage('first_day_of_week') ?? 0; + $dayOfYear = $dayOfYear ?? $this->getTranslationMessage('day_of_first_week_of_year') ?? 1; + + if ($week !== null) { + return $date->addWeeks(round($week) - $this->week(null, $dayOfWeek, $dayOfYear)); + } + + $start = $date->avoidMutation()->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); + $end = $date->avoidMutation()->startOfWeek($dayOfWeek); + if ($start > $end) { + $start = $start->subWeeks(26)->dayOfYear($dayOfYear)->startOfWeek($dayOfWeek); + } + $week = (int) ($start->diffInDays($end) / 7 + 1); + + return $week > $end->weeksInYear($dayOfWeek, $dayOfYear) ? 1 : $week; + } + + /** + * Get/set the week number using given first day of week and first + * day of year included in the first week. Or use ISO format if no settings + * given. + * + * @param int|null $week + * @param int|null $dayOfWeek + * @param int|null $dayOfYear + * + * @return int|static + */ + public function isoWeek($week = null, $dayOfWeek = null, $dayOfYear = null) + { + return $this->week( + $week, + $dayOfWeek ?? 1, + $dayOfYear ?? 4 + ); + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/Translator.php b/vendor/nesbot/carbon/src/Carbon/Translator.php new file mode 100644 index 0000000..491c9e7 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Translator.php @@ -0,0 +1,32 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon; + +use ReflectionMethod; +use Symfony\Component\Translation; +use Symfony\Contracts\Translation\TranslatorInterface; + +$transMethod = new ReflectionMethod( + class_exists(TranslatorInterface::class) + ? TranslatorInterface::class + : Translation\Translator::class, + 'trans' +); + +require $transMethod->hasReturnType() + ? __DIR__.'/../../lazy/Carbon/TranslatorStrongType.php' + : __DIR__.'/../../lazy/Carbon/TranslatorWeakType.php'; + +class Translator extends LazyTranslator +{ + // Proxy dynamically loaded LazyTranslator in a static way +} diff --git a/vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php b/vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php new file mode 100644 index 0000000..ad36c67 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php @@ -0,0 +1,99 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon; + +use Carbon\Exceptions\ImmutableException; +use Symfony\Component\Config\ConfigCacheFactoryInterface; +use Symfony\Component\Translation\Formatter\MessageFormatterInterface; + +class TranslatorImmutable extends Translator +{ + /** @var bool */ + private $constructed = false; + + public function __construct($locale, MessageFormatterInterface $formatter = null, $cacheDir = null, $debug = false) + { + parent::__construct($locale, $formatter, $cacheDir, $debug); + $this->constructed = true; + } + + /** + * @codeCoverageIgnore + */ + public function setDirectories(array $directories) + { + $this->disallowMutation(__METHOD__); + + return parent::setDirectories($directories); + } + + public function setLocale($locale) + { + $this->disallowMutation(__METHOD__); + + return parent::setLocale($locale); + } + + /** + * @codeCoverageIgnore + */ + public function setMessages($locale, $messages) + { + $this->disallowMutation(__METHOD__); + + return parent::setMessages($locale, $messages); + } + + /** + * @codeCoverageIgnore + */ + public function setTranslations($messages) + { + $this->disallowMutation(__METHOD__); + + return parent::setTranslations($messages); + } + + /** + * @codeCoverageIgnore + */ + public function setConfigCacheFactory(ConfigCacheFactoryInterface $configCacheFactory) + { + $this->disallowMutation(__METHOD__); + + parent::setConfigCacheFactory($configCacheFactory); + } + + public function resetMessages($locale = null) + { + $this->disallowMutation(__METHOD__); + + return parent::resetMessages($locale); + } + + /** + * @codeCoverageIgnore + */ + public function setFallbackLocales(array $locales) + { + $this->disallowMutation(__METHOD__); + + parent::setFallbackLocales($locales); + } + + private function disallowMutation($method) + { + if ($this->constructed) { + throw new ImmutableException($method.' not allowed on '.static::class); + } + } +} diff --git a/vendor/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php b/vendor/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php new file mode 100644 index 0000000..ef4dee8 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php @@ -0,0 +1,22 @@ +<?php + +/** + * This file is part of the Carbon package. + * + * (c) Brian Nesbitt <brian@nesbot.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon; + +use Symfony\Component\Translation\MessageCatalogueInterface; + +/** + * Mark translator using strong type from symfony/translation >= 6. + */ +interface TranslatorStrongTypeInterface +{ + public function getFromCatalogue(MessageCatalogueInterface $catalogue, string $id, string $domain = 'messages'); +} diff --git a/vendor/nikic/fast-route/.gitignore b/vendor/nikic/fast-route/.gitignore new file mode 100644 index 0000000..e378a07 --- /dev/null +++ b/vendor/nikic/fast-route/.gitignore @@ -0,0 +1,5 @@ +/vendor/ +.idea/ + +# ignore lock file since we have no extra dependencies +composer.lock diff --git a/vendor/nikic/fast-route/.hhconfig b/vendor/nikic/fast-route/.hhconfig new file mode 100644 index 0000000..0c2153c --- /dev/null +++ b/vendor/nikic/fast-route/.hhconfig @@ -0,0 +1 @@ +assume_php=false diff --git a/vendor/nikic/fast-route/.travis.yml b/vendor/nikic/fast-route/.travis.yml new file mode 100644 index 0000000..10f8381 --- /dev/null +++ b/vendor/nikic/fast-route/.travis.yml @@ -0,0 +1,20 @@ +sudo: false +language: php + +php: + - 5.4 + - 5.5 + - 5.6 + - 7.0 + - 7.1 + - 7.2 + - hhvm + +script: + - ./vendor/bin/phpunit + +before_install: + - travis_retry composer self-update + +install: + - composer install diff --git a/vendor/nikic/fast-route/FastRoute.hhi b/vendor/nikic/fast-route/FastRoute.hhi new file mode 100644 index 0000000..8d50738 --- /dev/null +++ b/vendor/nikic/fast-route/FastRoute.hhi @@ -0,0 +1,126 @@ +<?hh // decl + +namespace FastRoute { + class BadRouteException extends \LogicException { + } + + interface RouteParser { + public function parse(string $route): array<array>; + } + + class RouteCollector { + public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator); + public function addRoute(mixed $httpMethod, string $route, mixed $handler): void; + public function getData(): array; + } + + class Route { + public function __construct(string $httpMethod, mixed $handler, string $regex, array $variables); + public function matches(string $str): bool; + } + + interface DataGenerator { + public function addRoute(string $httpMethod, array $routeData, mixed $handler); + public function getData(): array; + } + + interface Dispatcher { + const int NOT_FOUND = 0; + const int FOUND = 1; + const int METHOD_NOT_ALLOWED = 2; + public function dispatch(string $httpMethod, string $uri): array; + } + + function simpleDispatcher( + (function(RouteCollector): void) $routeDefinitionCallback, + shape( + ?'routeParser' => classname<RouteParser>, + ?'dataGenerator' => classname<DataGenerator>, + ?'dispatcher' => classname<Dispatcher>, + ?'routeCollector' => classname<RouteCollector>, + ) $options = shape()): Dispatcher; + + function cachedDispatcher( + (function(RouteCollector): void) $routeDefinitionCallback, + shape( + ?'routeParser' => classname<RouteParser>, + ?'dataGenerator' => classname<DataGenerator>, + ?'dispatcher' => classname<Dispatcher>, + ?'routeCollector' => classname<RouteCollector>, + ?'cacheDisabled' => bool, + ?'cacheFile' => string, + ) $options = shape()): Dispatcher; +} + +namespace FastRoute\DataGenerator { + abstract class RegexBasedAbstract implements \FastRoute\DataGenerator { + protected abstract function getApproxChunkSize(); + protected abstract function processChunk($regexToRoutesMap); + + public function addRoute(string $httpMethod, array $routeData, mixed $handler): void; + public function getData(): array; + } + + class CharCountBased extends RegexBasedAbstract { + protected function getApproxChunkSize(): int; + protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>; + } + + class GroupCountBased extends RegexBasedAbstract { + protected function getApproxChunkSize(): int; + protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>; + } + + class GroupPosBased extends RegexBasedAbstract { + protected function getApproxChunkSize(): int; + protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>; + } + + class MarkBased extends RegexBasedAbstract { + protected function getApproxChunkSize(): int; + protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>; + } +} + +namespace FastRoute\Dispatcher { + abstract class RegexBasedAbstract implements \FastRoute\Dispatcher { + protected abstract function dispatchVariableRoute(array<array> $routeData, string $uri): array; + + public function dispatch(string $httpMethod, string $uri): array; + } + + class GroupPosBased extends RegexBasedAbstract { + public function __construct(array $data); + protected function dispatchVariableRoute(array<array> $routeData, string $uri): array; + } + + class GroupCountBased extends RegexBasedAbstract { + public function __construct(array $data); + protected function dispatchVariableRoute(array<array> $routeData, string $uri): array; + } + + class CharCountBased extends RegexBasedAbstract { + public function __construct(array $data); + protected function dispatchVariableRoute(array<array> $routeData, string $uri): array; + } + + class MarkBased extends RegexBasedAbstract { + public function __construct(array $data); + protected function dispatchVariableRoute(array<array> $routeData, string $uri): array; + } +} + +namespace FastRoute\RouteParser { + class Std implements \FastRoute\RouteParser { + const string VARIABLE_REGEX = <<<'REGEX' +\{ + \s* ([a-zA-Z][a-zA-Z0-9_]*) \s* + (?: + : \s* ([^{}]*(?:\{(?-1)\}[^{}]*)*) + )? +\} +REGEX; + const string DEFAULT_DISPATCH_REGEX = '[^/]+'; + public function parse(string $route): array<array>; + } +} diff --git a/vendor/nikic/fast-route/LICENSE b/vendor/nikic/fast-route/LICENSE new file mode 100644 index 0000000..478e764 --- /dev/null +++ b/vendor/nikic/fast-route/LICENSE @@ -0,0 +1,31 @@ +Copyright (c) 2013 by Nikita Popov. + +Some 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. + + * The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/nikic/fast-route/README.md b/vendor/nikic/fast-route/README.md new file mode 100644 index 0000000..91bd466 --- /dev/null +++ b/vendor/nikic/fast-route/README.md @@ -0,0 +1,313 @@ +FastRoute - Fast request router for PHP +======================================= + +This library provides a fast implementation of a regular expression based router. [Blog post explaining how the +implementation works and why it is fast.][blog_post] + +Install +------- + +To install with composer: + +```sh +composer require nikic/fast-route +``` + +Requires PHP 5.4 or newer. + +Usage +----- + +Here's a basic usage example: + +```php +<?php + +require '/path/to/vendor/autoload.php'; + +$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) { + $r->addRoute('GET', '/users', 'get_all_users_handler'); + // {id} must be a number (\d+) + $r->addRoute('GET', '/user/{id:\d+}', 'get_user_handler'); + // The /{title} suffix is optional + $r->addRoute('GET', '/articles/{id:\d+}[/{title}]', 'get_article_handler'); +}); + +// Fetch method and URI from somewhere +$httpMethod = $_SERVER['REQUEST_METHOD']; +$uri = $_SERVER['REQUEST_URI']; + +// Strip query string (?foo=bar) and decode URI +if (false !== $pos = strpos($uri, '?')) { + $uri = substr($uri, 0, $pos); +} +$uri = rawurldecode($uri); + +$routeInfo = $dispatcher->dispatch($httpMethod, $uri); +switch ($routeInfo[0]) { + case FastRoute\Dispatcher::NOT_FOUND: + // ... 404 Not Found + break; + case FastRoute\Dispatcher::METHOD_NOT_ALLOWED: + $allowedMethods = $routeInfo[1]; + // ... 405 Method Not Allowed + break; + case FastRoute\Dispatcher::FOUND: + $handler = $routeInfo[1]; + $vars = $routeInfo[2]; + // ... call $handler with $vars + break; +} +``` + +### Defining routes + +The routes are defined by calling the `FastRoute\simpleDispatcher()` function, which accepts +a callable taking a `FastRoute\RouteCollector` instance. The routes are added by calling +`addRoute()` on the collector instance: + +```php +$r->addRoute($method, $routePattern, $handler); +``` + +The `$method` is an uppercase HTTP method string for which a certain route should match. It +is possible to specify multiple valid methods using an array: + +```php +// These two calls +$r->addRoute('GET', '/test', 'handler'); +$r->addRoute('POST', '/test', 'handler'); +// Are equivalent to this one call +$r->addRoute(['GET', 'POST'], '/test', 'handler'); +``` + +By default the `$routePattern` uses a syntax where `{foo}` specifies a placeholder with name `foo` +and matching the regex `[^/]+`. To adjust the pattern the placeholder matches, you can specify +a custom pattern by writing `{bar:[0-9]+}`. Some examples: + +```php +// Matches /user/42, but not /user/xyz +$r->addRoute('GET', '/user/{id:\d+}', 'handler'); + +// Matches /user/foobar, but not /user/foo/bar +$r->addRoute('GET', '/user/{name}', 'handler'); + +// Matches /user/foo/bar as well +$r->addRoute('GET', '/user/{name:.+}', 'handler'); +``` + +Custom patterns for route placeholders cannot use capturing groups. For example `{lang:(en|de)}` +is not a valid placeholder, because `()` is a capturing group. Instead you can use either +`{lang:en|de}` or `{lang:(?:en|de)}`. + +Furthermore parts of the route enclosed in `[...]` are considered optional, so that `/foo[bar]` +will match both `/foo` and `/foobar`. Optional parts are only supported in a trailing position, +not in the middle of a route. + +```php +// This route +$r->addRoute('GET', '/user/{id:\d+}[/{name}]', 'handler'); +// Is equivalent to these two routes +$r->addRoute('GET', '/user/{id:\d+}', 'handler'); +$r->addRoute('GET', '/user/{id:\d+}/{name}', 'handler'); + +// Multiple nested optional parts are possible as well +$r->addRoute('GET', '/user[/{id:\d+}[/{name}]]', 'handler'); + +// This route is NOT valid, because optional parts can only occur at the end +$r->addRoute('GET', '/user[/{id:\d+}]/{name}', 'handler'); +``` + +The `$handler` parameter does not necessarily have to be a callback, it could also be a controller +class name or any other kind of data you wish to associate with the route. FastRoute only tells you +which handler corresponds to your URI, how you interpret it is up to you. + +#### Shorcut methods for common request methods + +For the `GET`, `POST`, `PUT`, `PATCH`, `DELETE` and `HEAD` request methods shortcut methods are available. For example: + +```php +$r->get('/get-route', 'get_handler'); +$r->post('/post-route', 'post_handler'); +``` + +Is equivalent to: + +```php +$r->addRoute('GET', '/get-route', 'get_handler'); +$r->addRoute('POST', '/post-route', 'post_handler'); +``` + +#### Route Groups + +Additionally, you can specify routes inside of a group. All routes defined inside a group will have a common prefix. + +For example, defining your routes as: + +```php +$r->addGroup('/admin', function (RouteCollector $r) { + $r->addRoute('GET', '/do-something', 'handler'); + $r->addRoute('GET', '/do-another-thing', 'handler'); + $r->addRoute('GET', '/do-something-else', 'handler'); +}); +``` + +Will have the same result as: + + ```php +$r->addRoute('GET', '/admin/do-something', 'handler'); +$r->addRoute('GET', '/admin/do-another-thing', 'handler'); +$r->addRoute('GET', '/admin/do-something-else', 'handler'); + ``` + +Nested groups are also supported, in which case the prefixes of all the nested groups are combined. + +### Caching + +The reason `simpleDispatcher` accepts a callback for defining the routes is to allow seamless +caching. By using `cachedDispatcher` instead of `simpleDispatcher` you can cache the generated +routing data and construct the dispatcher from the cached information: + +```php +<?php + +$dispatcher = FastRoute\cachedDispatcher(function(FastRoute\RouteCollector $r) { + $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); + $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1'); + $r->addRoute('GET', '/user/{name}', 'handler2'); +}, [ + 'cacheFile' => __DIR__ . '/route.cache', /* required */ + 'cacheDisabled' => IS_DEBUG_ENABLED, /* optional, enabled by default */ +]); +``` + +The second parameter to the function is an options array, which can be used to specify the cache +file location, among other things. + +### Dispatching a URI + +A URI is dispatched by calling the `dispatch()` method of the created dispatcher. This method +accepts the HTTP method and a URI. Getting those two bits of information (and normalizing them +appropriately) is your job - this library is not bound to the PHP web SAPIs. + +The `dispatch()` method returns an array whose first element contains a status code. It is one +of `Dispatcher::NOT_FOUND`, `Dispatcher::METHOD_NOT_ALLOWED` and `Dispatcher::FOUND`. For the +method not allowed status the second array element contains a list of HTTP methods allowed for +the supplied URI. For example: + + [FastRoute\Dispatcher::METHOD_NOT_ALLOWED, ['GET', 'POST']] + +> **NOTE:** The HTTP specification requires that a `405 Method Not Allowed` response include the +`Allow:` header to detail available methods for the requested resource. Applications using FastRoute +should use the second array element to add this header when relaying a 405 response. + +For the found status the second array element is the handler that was associated with the route +and the third array element is a dictionary of placeholder names to their values. For example: + + /* Routing against GET /user/nikic/42 */ + + [FastRoute\Dispatcher::FOUND, 'handler0', ['name' => 'nikic', 'id' => '42']] + +### Overriding the route parser and dispatcher + +The routing process makes use of three components: A route parser, a data generator and a +dispatcher. The three components adhere to the following interfaces: + +```php +<?php + +namespace FastRoute; + +interface RouteParser { + public function parse($route); +} + +interface DataGenerator { + public function addRoute($httpMethod, $routeData, $handler); + public function getData(); +} + +interface Dispatcher { + const NOT_FOUND = 0, FOUND = 1, METHOD_NOT_ALLOWED = 2; + + public function dispatch($httpMethod, $uri); +} +``` + +The route parser takes a route pattern string and converts it into an array of route infos, where +each route info is again an array of it's parts. The structure is best understood using an example: + + /* The route /user/{id:\d+}[/{name}] converts to the following array: */ + [ + [ + '/user/', + ['id', '\d+'], + ], + [ + '/user/', + ['id', '\d+'], + '/', + ['name', '[^/]+'], + ], + ] + +This array can then be passed to the `addRoute()` method of a data generator. After all routes have +been added the `getData()` of the generator is invoked, which returns all the routing data required +by the dispatcher. The format of this data is not further specified - it is tightly coupled to +the corresponding dispatcher. + +The dispatcher accepts the routing data via a constructor and provides a `dispatch()` method, which +you're already familiar with. + +The route parser can be overwritten individually (to make use of some different pattern syntax), +however the data generator and dispatcher should always be changed as a pair, as the output from +the former is tightly coupled to the input of the latter. The reason the generator and the +dispatcher are separate is that only the latter is needed when using caching (as the output of +the former is what is being cached.) + +When using the `simpleDispatcher` / `cachedDispatcher` functions from above the override happens +through the options array: + +```php +<?php + +$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) { + /* ... */ +}, [ + 'routeParser' => 'FastRoute\\RouteParser\\Std', + 'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', + 'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased', +]); +``` + +The above options array corresponds to the defaults. By replacing `GroupCountBased` by +`GroupPosBased` you could switch to a different dispatching strategy. + +### A Note on HEAD Requests + +The HTTP spec requires servers to [support both GET and HEAD methods][2616-511]: + +> The methods GET and HEAD MUST be supported by all general-purpose servers + +To avoid forcing users to manually register HEAD routes for each resource we fallback to matching an +available GET route for a given resource. The PHP web SAPI transparently removes the entity body +from HEAD responses so this behavior has no effect on the vast majority of users. + +However, implementers using FastRoute outside the web SAPI environment (e.g. a custom server) MUST +NOT send entity bodies generated in response to HEAD requests. If you are a non-SAPI user this is +*your responsibility*; FastRoute has no purview to prevent you from breaking HTTP in such cases. + +Finally, note that applications MAY always specify their own HEAD method route for a given +resource to bypass this behavior entirely. + +### Credits + +This library is based on a router that [Levi Morrison][levi] implemented for the Aerys server. + +A large number of tests, as well as HTTP compliance considerations, were provided by [Daniel Lowrey][rdlowrey]. + + +[2616-511]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.1 "RFC 2616 Section 5.1.1" +[blog_post]: http://nikic.github.io/2014/02/18/Fast-request-routing-using-regular-expressions.html +[levi]: https://github.com/morrisonlevi +[rdlowrey]: https://github.com/rdlowrey diff --git a/vendor/nikic/fast-route/composer.json b/vendor/nikic/fast-route/composer.json new file mode 100644 index 0000000..fb446a2 --- /dev/null +++ b/vendor/nikic/fast-route/composer.json @@ -0,0 +1,24 @@ +{ + "name": "nikic/fast-route", + "description": "Fast request router for PHP", + "keywords": ["routing", "router"], + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "autoload": { + "psr-4": { + "FastRoute\\": "src/" + }, + "files": ["src/functions.php"] + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + } +} diff --git a/vendor/nikic/fast-route/phpunit.xml b/vendor/nikic/fast-route/phpunit.xml new file mode 100644 index 0000000..3c807b6 --- /dev/null +++ b/vendor/nikic/fast-route/phpunit.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<phpunit backupGlobals="false" + backupStaticAttributes="false" + colors="true" + convertErrorsToExceptions="true" + convertNoticesToExceptions="true" + convertWarningsToExceptions="true" + processIsolation="false" + syntaxCheck="false" + bootstrap="test/bootstrap.php" + > + <testsuites> + <testsuite name="FastRoute Tests"> + <directory>./test/</directory> + </testsuite> + </testsuites> + + <filter> + <whitelist> + <directory>./src/</directory> + </whitelist> + </filter> +</phpunit> diff --git a/vendor/nikic/fast-route/psalm.xml b/vendor/nikic/fast-route/psalm.xml new file mode 100644 index 0000000..0dca5d7 --- /dev/null +++ b/vendor/nikic/fast-route/psalm.xml @@ -0,0 +1,28 @@ +<?xml version="1.0"?> +<psalm + name="Example Psalm config with recommended defaults" + stopOnFirstError="false" + useDocblockTypes="true" + totallyTyped="false" + requireVoidReturnType="false" +> + <projectFiles> + <directory name="src" /> + </projectFiles> + + <issueHandlers> + <LessSpecificReturnType errorLevel="info" /> + + <!-- level 3 issues - slightly lazy code writing, but provably low false-negatives --> + <DeprecatedMethod errorLevel="info" /> + + <MissingClosureReturnType errorLevel="info" /> + <MissingReturnType errorLevel="info" /> + <MissingPropertyType errorLevel="info" /> + <InvalidDocblock errorLevel="info" /> + <MisplacedRequiredParam errorLevel="info" /> + + <PropertyNotSetInConstructor errorLevel="info" /> + <MissingConstructor errorLevel="info" /> + </issueHandlers> +</psalm> diff --git a/vendor/nikic/fast-route/src/BadRouteException.php b/vendor/nikic/fast-route/src/BadRouteException.php new file mode 100644 index 0000000..62262ec --- /dev/null +++ b/vendor/nikic/fast-route/src/BadRouteException.php @@ -0,0 +1,7 @@ +<?php + +namespace FastRoute; + +class BadRouteException extends \LogicException +{ +} diff --git a/vendor/nikic/fast-route/src/DataGenerator.php b/vendor/nikic/fast-route/src/DataGenerator.php new file mode 100644 index 0000000..af577cd --- /dev/null +++ b/vendor/nikic/fast-route/src/DataGenerator.php @@ -0,0 +1,26 @@ +<?php + +namespace FastRoute; + +interface DataGenerator +{ + /** + * Adds a route to the data generator. The route data uses the + * same format that is returned by RouterParser::parser(). + * + * The handler doesn't necessarily need to be a callable, it + * can be arbitrary data that will be returned when the route + * matches. + * + * @param string $httpMethod + * @param array $routeData + * @param mixed $handler + */ + public function addRoute($httpMethod, $routeData, $handler); + + /** + * Returns dispatcher data in some unspecified format, which + * depends on the used method of dispatch. + */ + public function getData(); +} diff --git a/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php b/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php new file mode 100644 index 0000000..3cfeed6 --- /dev/null +++ b/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php @@ -0,0 +1,31 @@ +<?php + +namespace FastRoute\DataGenerator; + +class CharCountBased extends RegexBasedAbstract +{ + protected function getApproxChunkSize() + { + return 30; + } + + protected function processChunk($regexToRoutesMap) + { + $routeMap = []; + $regexes = []; + + $suffixLen = 0; + $suffix = ''; + $count = count($regexToRoutesMap); + foreach ($regexToRoutesMap as $regex => $route) { + $suffixLen++; + $suffix .= "\t"; + + $regexes[] = '(?:' . $regex . '/(\t{' . $suffixLen . '})\t{' . ($count - $suffixLen) . '})'; + $routeMap[$suffix] = [$route->handler, $route->variables]; + } + + $regex = '~^(?|' . implode('|', $regexes) . ')$~'; + return ['regex' => $regex, 'suffix' => '/' . $suffix, 'routeMap' => $routeMap]; + } +} diff --git a/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php b/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php new file mode 100644 index 0000000..54d9a05 --- /dev/null +++ b/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php @@ -0,0 +1,30 @@ +<?php + +namespace FastRoute\DataGenerator; + +class GroupCountBased extends RegexBasedAbstract +{ + protected function getApproxChunkSize() + { + return 10; + } + + protected function processChunk($regexToRoutesMap) + { + $routeMap = []; + $regexes = []; + $numGroups = 0; + foreach ($regexToRoutesMap as $regex => $route) { + $numVariables = count($route->variables); + $numGroups = max($numGroups, $numVariables); + + $regexes[] = $regex . str_repeat('()', $numGroups - $numVariables); + $routeMap[$numGroups + 1] = [$route->handler, $route->variables]; + + ++$numGroups; + } + + $regex = '~^(?|' . implode('|', $regexes) . ')$~'; + return ['regex' => $regex, 'routeMap' => $routeMap]; + } +} diff --git a/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php b/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php new file mode 100644 index 0000000..fc4dc0a --- /dev/null +++ b/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php @@ -0,0 +1,27 @@ +<?php + +namespace FastRoute\DataGenerator; + +class GroupPosBased extends RegexBasedAbstract +{ + protected function getApproxChunkSize() + { + return 10; + } + + protected function processChunk($regexToRoutesMap) + { + $routeMap = []; + $regexes = []; + $offset = 1; + foreach ($regexToRoutesMap as $regex => $route) { + $regexes[] = $regex; + $routeMap[$offset] = [$route->handler, $route->variables]; + + $offset += count($route->variables); + } + + $regex = '~^(?:' . implode('|', $regexes) . ')$~'; + return ['regex' => $regex, 'routeMap' => $routeMap]; + } +} diff --git a/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php b/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php new file mode 100644 index 0000000..0aebed9 --- /dev/null +++ b/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php @@ -0,0 +1,27 @@ +<?php + +namespace FastRoute\DataGenerator; + +class MarkBased extends RegexBasedAbstract +{ + protected function getApproxChunkSize() + { + return 30; + } + + protected function processChunk($regexToRoutesMap) + { + $routeMap = []; + $regexes = []; + $markName = 'a'; + foreach ($regexToRoutesMap as $regex => $route) { + $regexes[] = $regex . '(*MARK:' . $markName . ')'; + $routeMap[$markName] = [$route->handler, $route->variables]; + + ++$markName; + } + + $regex = '~^(?|' . implode('|', $regexes) . ')$~'; + return ['regex' => $regex, 'routeMap' => $routeMap]; + } +} diff --git a/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php b/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php new file mode 100644 index 0000000..6457290 --- /dev/null +++ b/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php @@ -0,0 +1,186 @@ +<?php + +namespace FastRoute\DataGenerator; + +use FastRoute\BadRouteException; +use FastRoute\DataGenerator; +use FastRoute\Route; + +abstract class RegexBasedAbstract implements DataGenerator +{ + /** @var mixed[][] */ + protected $staticRoutes = []; + + /** @var Route[][] */ + protected $methodToRegexToRoutesMap = []; + + /** + * @return int + */ + abstract protected function getApproxChunkSize(); + + /** + * @return mixed[] + */ + abstract protected function processChunk($regexToRoutesMap); + + public function addRoute($httpMethod, $routeData, $handler) + { + if ($this->isStaticRoute($routeData)) { + $this->addStaticRoute($httpMethod, $routeData, $handler); + } else { + $this->addVariableRoute($httpMethod, $routeData, $handler); + } + } + + /** + * @return mixed[] + */ + public function getData() + { + if (empty($this->methodToRegexToRoutesMap)) { + return [$this->staticRoutes, []]; + } + + return [$this->staticRoutes, $this->generateVariableRouteData()]; + } + + /** + * @return mixed[] + */ + private function generateVariableRouteData() + { + $data = []; + foreach ($this->methodToRegexToRoutesMap as $method => $regexToRoutesMap) { + $chunkSize = $this->computeChunkSize(count($regexToRoutesMap)); + $chunks = array_chunk($regexToRoutesMap, $chunkSize, true); + $data[$method] = array_map([$this, 'processChunk'], $chunks); + } + return $data; + } + + /** + * @param int + * @return int + */ + private function computeChunkSize($count) + { + $numParts = max(1, round($count / $this->getApproxChunkSize())); + return (int) ceil($count / $numParts); + } + + /** + * @param mixed[] + * @return bool + */ + private function isStaticRoute($routeData) + { + return count($routeData) === 1 && is_string($routeData[0]); + } + + private function addStaticRoute($httpMethod, $routeData, $handler) + { + $routeStr = $routeData[0]; + + if (isset($this->staticRoutes[$httpMethod][$routeStr])) { + throw new BadRouteException(sprintf( + 'Cannot register two routes matching "%s" for method "%s"', + $routeStr, $httpMethod + )); + } + + if (isset($this->methodToRegexToRoutesMap[$httpMethod])) { + foreach ($this->methodToRegexToRoutesMap[$httpMethod] as $route) { + if ($route->matches($routeStr)) { + throw new BadRouteException(sprintf( + 'Static route "%s" is shadowed by previously defined variable route "%s" for method "%s"', + $routeStr, $route->regex, $httpMethod + )); + } + } + } + + $this->staticRoutes[$httpMethod][$routeStr] = $handler; + } + + private function addVariableRoute($httpMethod, $routeData, $handler) + { + list($regex, $variables) = $this->buildRegexForRoute($routeData); + + if (isset($this->methodToRegexToRoutesMap[$httpMethod][$regex])) { + throw new BadRouteException(sprintf( + 'Cannot register two routes matching "%s" for method "%s"', + $regex, $httpMethod + )); + } + + $this->methodToRegexToRoutesMap[$httpMethod][$regex] = new Route( + $httpMethod, $handler, $regex, $variables + ); + } + + /** + * @param mixed[] + * @return mixed[] + */ + private function buildRegexForRoute($routeData) + { + $regex = ''; + $variables = []; + foreach ($routeData as $part) { + if (is_string($part)) { + $regex .= preg_quote($part, '~'); + continue; + } + + list($varName, $regexPart) = $part; + + if (isset($variables[$varName])) { + throw new BadRouteException(sprintf( + 'Cannot use the same placeholder "%s" twice', $varName + )); + } + + if ($this->regexHasCapturingGroups($regexPart)) { + throw new BadRouteException(sprintf( + 'Regex "%s" for parameter "%s" contains a capturing group', + $regexPart, $varName + )); + } + + $variables[$varName] = $varName; + $regex .= '(' . $regexPart . ')'; + } + + return [$regex, $variables]; + } + + /** + * @param string + * @return bool + */ + private function regexHasCapturingGroups($regex) + { + if (false === strpos($regex, '(')) { + // Needs to have at least a ( to contain a capturing group + return false; + } + + // Semi-accurate detection for capturing groups + return (bool) preg_match( + '~ + (?: + \(\?\( + | \[ [^\]\\\\]* (?: \\\\ . [^\]\\\\]* )* \] + | \\\\ . + ) (*SKIP)(*FAIL) | + \( + (?! + \? (?! <(?![!=]) | P< | \' ) + | \* + ) + ~x', + $regex + ); + } +} diff --git a/vendor/nikic/fast-route/src/Dispatcher.php b/vendor/nikic/fast-route/src/Dispatcher.php new file mode 100644 index 0000000..4ae72a3 --- /dev/null +++ b/vendor/nikic/fast-route/src/Dispatcher.php @@ -0,0 +1,26 @@ +<?php + +namespace FastRoute; + +interface Dispatcher +{ + const NOT_FOUND = 0; + const FOUND = 1; + const METHOD_NOT_ALLOWED = 2; + + /** + * Dispatches against the provided HTTP method verb and URI. + * + * Returns array with one of the following formats: + * + * [self::NOT_FOUND] + * [self::METHOD_NOT_ALLOWED, ['GET', 'OTHER_ALLOWED_METHODS']] + * [self::FOUND, $handler, ['varName' => 'value', ...]] + * + * @param string $httpMethod + * @param string $uri + * + * @return array + */ + public function dispatch($httpMethod, $uri); +} diff --git a/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php b/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php new file mode 100644 index 0000000..ef1eec1 --- /dev/null +++ b/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php @@ -0,0 +1,31 @@ +<?php + +namespace FastRoute\Dispatcher; + +class CharCountBased extends RegexBasedAbstract +{ + public function __construct($data) + { + list($this->staticRouteMap, $this->variableRouteData) = $data; + } + + protected function dispatchVariableRoute($routeData, $uri) + { + foreach ($routeData as $data) { + if (!preg_match($data['regex'], $uri . $data['suffix'], $matches)) { + continue; + } + + list($handler, $varNames) = $data['routeMap'][end($matches)]; + + $vars = []; + $i = 0; + foreach ($varNames as $varName) { + $vars[$varName] = $matches[++$i]; + } + return [self::FOUND, $handler, $vars]; + } + + return [self::NOT_FOUND]; + } +} diff --git a/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php b/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php new file mode 100644 index 0000000..493e7a9 --- /dev/null +++ b/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php @@ -0,0 +1,31 @@ +<?php + +namespace FastRoute\Dispatcher; + +class GroupCountBased extends RegexBasedAbstract +{ + public function __construct($data) + { + list($this->staticRouteMap, $this->variableRouteData) = $data; + } + + protected function dispatchVariableRoute($routeData, $uri) + { + foreach ($routeData as $data) { + if (!preg_match($data['regex'], $uri, $matches)) { + continue; + } + + list($handler, $varNames) = $data['routeMap'][count($matches)]; + + $vars = []; + $i = 0; + foreach ($varNames as $varName) { + $vars[$varName] = $matches[++$i]; + } + return [self::FOUND, $handler, $vars]; + } + + return [self::NOT_FOUND]; + } +} diff --git a/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php b/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php new file mode 100644 index 0000000..498220e --- /dev/null +++ b/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php @@ -0,0 +1,33 @@ +<?php + +namespace FastRoute\Dispatcher; + +class GroupPosBased extends RegexBasedAbstract +{ + public function __construct($data) + { + list($this->staticRouteMap, $this->variableRouteData) = $data; + } + + protected function dispatchVariableRoute($routeData, $uri) + { + foreach ($routeData as $data) { + if (!preg_match($data['regex'], $uri, $matches)) { + continue; + } + + // find first non-empty match + for ($i = 1; '' === $matches[$i]; ++$i); + + list($handler, $varNames) = $data['routeMap'][$i]; + + $vars = []; + foreach ($varNames as $varName) { + $vars[$varName] = $matches[$i++]; + } + return [self::FOUND, $handler, $vars]; + } + + return [self::NOT_FOUND]; + } +} diff --git a/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php b/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php new file mode 100644 index 0000000..22eb09b --- /dev/null +++ b/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php @@ -0,0 +1,31 @@ +<?php + +namespace FastRoute\Dispatcher; + +class MarkBased extends RegexBasedAbstract +{ + public function __construct($data) + { + list($this->staticRouteMap, $this->variableRouteData) = $data; + } + + protected function dispatchVariableRoute($routeData, $uri) + { + foreach ($routeData as $data) { + if (!preg_match($data['regex'], $uri, $matches)) { + continue; + } + + list($handler, $varNames) = $data['routeMap'][$matches['MARK']]; + + $vars = []; + $i = 0; + foreach ($varNames as $varName) { + $vars[$varName] = $matches[++$i]; + } + return [self::FOUND, $handler, $vars]; + } + + return [self::NOT_FOUND]; + } +} diff --git a/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php b/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php new file mode 100644 index 0000000..206e879 --- /dev/null +++ b/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php @@ -0,0 +1,88 @@ +<?php + +namespace FastRoute\Dispatcher; + +use FastRoute\Dispatcher; + +abstract class RegexBasedAbstract implements Dispatcher +{ + /** @var mixed[][] */ + protected $staticRouteMap = []; + + /** @var mixed[] */ + protected $variableRouteData = []; + + /** + * @return mixed[] + */ + abstract protected function dispatchVariableRoute($routeData, $uri); + + public function dispatch($httpMethod, $uri) + { + if (isset($this->staticRouteMap[$httpMethod][$uri])) { + $handler = $this->staticRouteMap[$httpMethod][$uri]; + return [self::FOUND, $handler, []]; + } + + $varRouteData = $this->variableRouteData; + if (isset($varRouteData[$httpMethod])) { + $result = $this->dispatchVariableRoute($varRouteData[$httpMethod], $uri); + if ($result[0] === self::FOUND) { + return $result; + } + } + + // For HEAD requests, attempt fallback to GET + if ($httpMethod === 'HEAD') { + if (isset($this->staticRouteMap['GET'][$uri])) { + $handler = $this->staticRouteMap['GET'][$uri]; + return [self::FOUND, $handler, []]; + } + if (isset($varRouteData['GET'])) { + $result = $this->dispatchVariableRoute($varRouteData['GET'], $uri); + if ($result[0] === self::FOUND) { + return $result; + } + } + } + + // If nothing else matches, try fallback routes + if (isset($this->staticRouteMap['*'][$uri])) { + $handler = $this->staticRouteMap['*'][$uri]; + return [self::FOUND, $handler, []]; + } + if (isset($varRouteData['*'])) { + $result = $this->dispatchVariableRoute($varRouteData['*'], $uri); + if ($result[0] === self::FOUND) { + return $result; + } + } + + // Find allowed methods for this URI by matching against all other HTTP methods as well + $allowedMethods = []; + + foreach ($this->staticRouteMap as $method => $uriMap) { + if ($method !== $httpMethod && isset($uriMap[$uri])) { + $allowedMethods[] = $method; + } + } + + foreach ($varRouteData as $method => $routeData) { + if ($method === $httpMethod) { + continue; + } + + $result = $this->dispatchVariableRoute($routeData, $uri); + if ($result[0] === self::FOUND) { + $allowedMethods[] = $method; + } + } + + // If there are no allowed methods the route simply does not exist + if ($allowedMethods) { + return [self::METHOD_NOT_ALLOWED, $allowedMethods]; + } + + return [self::NOT_FOUND]; + } +} diff --git a/vendor/nikic/fast-route/src/Route.php b/vendor/nikic/fast-route/src/Route.php new file mode 100644 index 0000000..e1bf7dd --- /dev/null +++ b/vendor/nikic/fast-route/src/Route.php @@ -0,0 +1,47 @@ +<?php + +namespace FastRoute; + +class Route +{ + /** @var string */ + public $httpMethod; + + /** @var string */ + public $regex; + + /** @var array */ + public $variables; + + /** @var mixed */ + public $handler; + + /** + * Constructs a route (value object). + * + * @param string $httpMethod + * @param mixed $handler + * @param string $regex + * @param array $variables + */ + public function __construct($httpMethod, $handler, $regex, $variables) + { + $this->httpMethod = $httpMethod; + $this->handler = $handler; + $this->regex = $regex; + $this->variables = $variables; + } + + /** + * Tests whether this route matches the given string. + * + * @param string $str + * + * @return bool + */ + public function matches($str) + { + $regex = '~^' . $this->regex . '$~'; + return (bool) preg_match($regex, $str); + } +} diff --git a/vendor/nikic/fast-route/src/RouteCollector.php b/vendor/nikic/fast-route/src/RouteCollector.php new file mode 100644 index 0000000..c1c1762 --- /dev/null +++ b/vendor/nikic/fast-route/src/RouteCollector.php @@ -0,0 +1,152 @@ +<?php + +namespace FastRoute; + +class RouteCollector +{ + /** @var RouteParser */ + protected $routeParser; + + /** @var DataGenerator */ + protected $dataGenerator; + + /** @var string */ + protected $currentGroupPrefix; + + /** + * Constructs a route collector. + * + * @param RouteParser $routeParser + * @param DataGenerator $dataGenerator + */ + public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator) + { + $this->routeParser = $routeParser; + $this->dataGenerator = $dataGenerator; + $this->currentGroupPrefix = ''; + } + + /** + * Adds a route to the collection. + * + * The syntax used in the $route string depends on the used route parser. + * + * @param string|string[] $httpMethod + * @param string $route + * @param mixed $handler + */ + public function addRoute($httpMethod, $route, $handler) + { + $route = $this->currentGroupPrefix . $route; + $routeDatas = $this->routeParser->parse($route); + foreach ((array) $httpMethod as $method) { + foreach ($routeDatas as $routeData) { + $this->dataGenerator->addRoute($method, $routeData, $handler); + } + } + } + + /** + * Create a route group with a common prefix. + * + * All routes created in the passed callback will have the given group prefix prepended. + * + * @param string $prefix + * @param callable $callback + */ + public function addGroup($prefix, callable $callback) + { + $previousGroupPrefix = $this->currentGroupPrefix; + $this->currentGroupPrefix = $previousGroupPrefix . $prefix; + $callback($this); + $this->currentGroupPrefix = $previousGroupPrefix; + } + + /** + * Adds a GET route to the collection + * + * This is simply an alias of $this->addRoute('GET', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function get($route, $handler) + { + $this->addRoute('GET', $route, $handler); + } + + /** + * Adds a POST route to the collection + * + * This is simply an alias of $this->addRoute('POST', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function post($route, $handler) + { + $this->addRoute('POST', $route, $handler); + } + + /** + * Adds a PUT route to the collection + * + * This is simply an alias of $this->addRoute('PUT', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function put($route, $handler) + { + $this->addRoute('PUT', $route, $handler); + } + + /** + * Adds a DELETE route to the collection + * + * This is simply an alias of $this->addRoute('DELETE', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function delete($route, $handler) + { + $this->addRoute('DELETE', $route, $handler); + } + + /** + * Adds a PATCH route to the collection + * + * This is simply an alias of $this->addRoute('PATCH', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function patch($route, $handler) + { + $this->addRoute('PATCH', $route, $handler); + } + + /** + * Adds a HEAD route to the collection + * + * This is simply an alias of $this->addRoute('HEAD', $route, $handler) + * + * @param string $route + * @param mixed $handler + */ + public function head($route, $handler) + { + $this->addRoute('HEAD', $route, $handler); + } + + /** + * Returns the collected route data, as provided by the data generator. + * + * @return array + */ + public function getData() + { + return $this->dataGenerator->getData(); + } +} diff --git a/vendor/nikic/fast-route/src/RouteParser.php b/vendor/nikic/fast-route/src/RouteParser.php new file mode 100644 index 0000000..6a7685c --- /dev/null +++ b/vendor/nikic/fast-route/src/RouteParser.php @@ -0,0 +1,37 @@ +<?php + +namespace FastRoute; + +interface RouteParser +{ + /** + * Parses a route string into multiple route data arrays. + * + * The expected output is defined using an example: + * + * For the route string "/fixedRoutePart/{varName}[/moreFixed/{varName2:\d+}]", if {varName} is interpreted as + * a placeholder and [...] is interpreted as an optional route part, the expected result is: + * + * [ + * // first route: without optional part + * [ + * "/fixedRoutePart/", + * ["varName", "[^/]+"], + * ], + * // second route: with optional part + * [ + * "/fixedRoutePart/", + * ["varName", "[^/]+"], + * "/moreFixed/", + * ["varName2", [0-9]+"], + * ], + * ] + * + * Here one route string was converted into two route data arrays. + * + * @param string $route Route string to parse + * + * @return mixed[][] Array of route data arrays + */ + public function parse($route); +} diff --git a/vendor/nikic/fast-route/src/RouteParser/Std.php b/vendor/nikic/fast-route/src/RouteParser/Std.php new file mode 100644 index 0000000..4fbdee1 --- /dev/null +++ b/vendor/nikic/fast-route/src/RouteParser/Std.php @@ -0,0 +1,87 @@ +<?php + +namespace FastRoute\RouteParser; + +use FastRoute\BadRouteException; +use FastRoute\RouteParser; + +/** + * Parses route strings of the following form: + * + * "/user/{name}[/{id:[0-9]+}]" + */ +class Std implements RouteParser +{ + const VARIABLE_REGEX = <<<'REGEX' +\{ + \s* ([a-zA-Z_][a-zA-Z0-9_-]*) \s* + (?: + : \s* ([^{}]*(?:\{(?-1)\}[^{}]*)*) + )? +\} +REGEX; + const DEFAULT_DISPATCH_REGEX = '[^/]+'; + + public function parse($route) + { + $routeWithoutClosingOptionals = rtrim($route, ']'); + $numOptionals = strlen($route) - strlen($routeWithoutClosingOptionals); + + // Split on [ while skipping placeholders + $segments = preg_split('~' . self::VARIABLE_REGEX . '(*SKIP)(*F) | \[~x', $routeWithoutClosingOptionals); + if ($numOptionals !== count($segments) - 1) { + // If there are any ] in the middle of the route, throw a more specific error message + if (preg_match('~' . self::VARIABLE_REGEX . '(*SKIP)(*F) | \]~x', $routeWithoutClosingOptionals)) { + throw new BadRouteException('Optional segments can only occur at the end of a route'); + } + throw new BadRouteException("Number of opening '[' and closing ']' does not match"); + } + + $currentRoute = ''; + $routeDatas = []; + foreach ($segments as $n => $segment) { + if ($segment === '' && $n !== 0) { + throw new BadRouteException('Empty optional part'); + } + + $currentRoute .= $segment; + $routeDatas[] = $this->parsePlaceholders($currentRoute); + } + return $routeDatas; + } + + /** + * Parses a route string that does not contain optional segments. + * + * @param string + * @return mixed[] + */ + private function parsePlaceholders($route) + { + if (!preg_match_all( + '~' . self::VARIABLE_REGEX . '~x', $route, $matches, + PREG_OFFSET_CAPTURE | PREG_SET_ORDER + )) { + return [$route]; + } + + $offset = 0; + $routeData = []; + foreach ($matches as $set) { + if ($set[0][1] > $offset) { + $routeData[] = substr($route, $offset, $set[0][1] - $offset); + } + $routeData[] = [ + $set[1][0], + isset($set[2]) ? trim($set[2][0]) : self::DEFAULT_DISPATCH_REGEX + ]; + $offset = $set[0][1] + strlen($set[0][0]); + } + + if ($offset !== strlen($route)) { + $routeData[] = substr($route, $offset); + } + + return $routeData; + } +} diff --git a/vendor/nikic/fast-route/src/bootstrap.php b/vendor/nikic/fast-route/src/bootstrap.php new file mode 100644 index 0000000..0bce3a4 --- /dev/null +++ b/vendor/nikic/fast-route/src/bootstrap.php @@ -0,0 +1,12 @@ +<?php + +namespace FastRoute; + +require __DIR__ . '/functions.php'; + +spl_autoload_register(function ($class) { + if (strpos($class, 'FastRoute\\') === 0) { + $name = substr($class, strlen('FastRoute')); + require __DIR__ . strtr($name, '\\', DIRECTORY_SEPARATOR) . '.php'; + } +}); diff --git a/vendor/nikic/fast-route/src/functions.php b/vendor/nikic/fast-route/src/functions.php new file mode 100644 index 0000000..876a5d9 --- /dev/null +++ b/vendor/nikic/fast-route/src/functions.php @@ -0,0 +1,74 @@ +<?php + +namespace FastRoute; + +if (!function_exists('FastRoute\simpleDispatcher')) { + /** + * @param callable $routeDefinitionCallback + * @param array $options + * + * @return Dispatcher + */ + function simpleDispatcher(callable $routeDefinitionCallback, array $options = []) + { + $options += [ + 'routeParser' => 'FastRoute\\RouteParser\\Std', + 'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', + 'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased', + 'routeCollector' => 'FastRoute\\RouteCollector', + ]; + + /** @var RouteCollector $routeCollector */ + $routeCollector = new $options['routeCollector']( + new $options['routeParser'], new $options['dataGenerator'] + ); + $routeDefinitionCallback($routeCollector); + + return new $options['dispatcher']($routeCollector->getData()); + } + + /** + * @param callable $routeDefinitionCallback + * @param array $options + * + * @return Dispatcher + */ + function cachedDispatcher(callable $routeDefinitionCallback, array $options = []) + { + $options += [ + 'routeParser' => 'FastRoute\\RouteParser\\Std', + 'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased', + 'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased', + 'routeCollector' => 'FastRoute\\RouteCollector', + 'cacheDisabled' => false, + ]; + + if (!isset($options['cacheFile'])) { + throw new \LogicException('Must specify "cacheFile" option'); + } + + if (!$options['cacheDisabled'] && file_exists($options['cacheFile'])) { + $dispatchData = require $options['cacheFile']; + if (!is_array($dispatchData)) { + throw new \RuntimeException('Invalid cache file "' . $options['cacheFile'] . '"'); + } + return new $options['dispatcher']($dispatchData); + } + + $routeCollector = new $options['routeCollector']( + new $options['routeParser'], new $options['dataGenerator'] + ); + $routeDefinitionCallback($routeCollector); + + /** @var RouteCollector $routeCollector */ + $dispatchData = $routeCollector->getData(); + if (!$options['cacheDisabled']) { + file_put_contents( + $options['cacheFile'], + '<?php return ' . var_export($dispatchData, true) . ';' + ); + } + + return new $options['dispatcher']($dispatchData); + } +} diff --git a/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php b/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php new file mode 100644 index 0000000..e15ff8b --- /dev/null +++ b/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php @@ -0,0 +1,16 @@ +<?php + +namespace FastRoute\Dispatcher; + +class CharCountBasedTest extends DispatcherTest +{ + protected function getDispatcherClass() + { + return 'FastRoute\\Dispatcher\\CharCountBased'; + } + + protected function getDataGeneratorClass() + { + return 'FastRoute\\DataGenerator\\CharCountBased'; + } +} diff --git a/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php b/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php new file mode 100644 index 0000000..c2edf8c --- /dev/null +++ b/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php @@ -0,0 +1,581 @@ +<?php + +namespace FastRoute\Dispatcher; + +use FastRoute\RouteCollector; +use PHPUnit\Framework\TestCase; + +abstract class DispatcherTest extends TestCase +{ + /** + * Delegate dispatcher selection to child test classes + */ + abstract protected function getDispatcherClass(); + + /** + * Delegate dataGenerator selection to child test classes + */ + abstract protected function getDataGeneratorClass(); + + /** + * Set appropriate options for the specific Dispatcher class we're testing + */ + private function generateDispatcherOptions() + { + return [ + 'dataGenerator' => $this->getDataGeneratorClass(), + 'dispatcher' => $this->getDispatcherClass() + ]; + } + + /** + * @dataProvider provideFoundDispatchCases + */ + public function testFoundDispatches($method, $uri, $callback, $handler, $argDict) + { + $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions()); + $info = $dispatcher->dispatch($method, $uri); + $this->assertSame($dispatcher::FOUND, $info[0]); + $this->assertSame($handler, $info[1]); + $this->assertSame($argDict, $info[2]); + } + + /** + * @dataProvider provideNotFoundDispatchCases + */ + public function testNotFoundDispatches($method, $uri, $callback) + { + $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions()); + $routeInfo = $dispatcher->dispatch($method, $uri); + $this->assertArrayNotHasKey(1, $routeInfo, + 'NOT_FOUND result must only contain a single element in the returned info array' + ); + $this->assertSame($dispatcher::NOT_FOUND, $routeInfo[0]); + } + + /** + * @dataProvider provideMethodNotAllowedDispatchCases + */ + public function testMethodNotAllowedDispatches($method, $uri, $callback, $availableMethods) + { + $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions()); + $routeInfo = $dispatcher->dispatch($method, $uri); + $this->assertArrayHasKey(1, $routeInfo, + 'METHOD_NOT_ALLOWED result must return an array of allowed methods at index 1' + ); + + list($routedStatus, $methodArray) = $dispatcher->dispatch($method, $uri); + $this->assertSame($dispatcher::METHOD_NOT_ALLOWED, $routedStatus); + $this->assertSame($availableMethods, $methodArray); + } + + /** + * @expectedException \FastRoute\BadRouteException + * @expectedExceptionMessage Cannot use the same placeholder "test" twice + */ + public function testDuplicateVariableNameError() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { + $r->addRoute('GET', '/foo/{test}/{test:\d+}', 'handler0'); + }, $this->generateDispatcherOptions()); + } + + /** + * @expectedException \FastRoute\BadRouteException + * @expectedExceptionMessage Cannot register two routes matching "/user/([^/]+)" for method "GET" + */ + public function testDuplicateVariableRoute() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { + $r->addRoute('GET', '/user/{id}', 'handler0'); // oops, forgot \d+ restriction ;) + $r->addRoute('GET', '/user/{name}', 'handler1'); + }, $this->generateDispatcherOptions()); + } + + /** + * @expectedException \FastRoute\BadRouteException + * @expectedExceptionMessage Cannot register two routes matching "/user" for method "GET" + */ + public function testDuplicateStaticRoute() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { + $r->addRoute('GET', '/user', 'handler0'); + $r->addRoute('GET', '/user', 'handler1'); + }, $this->generateDispatcherOptions()); + } + + /** + * @expectedException \FastRoute\BadRouteException + * @expectedExceptionMessage Static route "/user/nikic" is shadowed by previously defined variable route "/user/([^/]+)" for method "GET" + */ + public function testShadowedStaticRoute() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { + $r->addRoute('GET', '/user/{name}', 'handler0'); + $r->addRoute('GET', '/user/nikic', 'handler1'); + }, $this->generateDispatcherOptions()); + } + + /** + * @expectedException \FastRoute\BadRouteException + * @expectedExceptionMessage Regex "(en|de)" for parameter "lang" contains a capturing group + */ + public function testCapturing() + { + \FastRoute\simpleDispatcher(function (RouteCollector $r) { + $r->addRoute('GET', '/{lang:(en|de)}', 'handler0'); + }, $this->generateDispatcherOptions()); + } + + public function provideFoundDispatchCases() + { + $cases = []; + + // 0 --------------------------------------------------------------------------------------> + + $callback = function (RouteCollector $r) { + $r->addRoute('GET', '/resource/123/456', 'handler0'); + }; + + $method = 'GET'; + $uri = '/resource/123/456'; + $handler = 'handler0'; + $argDict = []; + + $cases[] = [$method, $uri, $callback, $handler, $argDict]; + + // 1 --------------------------------------------------------------------------------------> + + $callback = function (RouteCollector $r) { + $r->addRoute('GET', '/handler0', 'handler0'); + $r->addRoute('GET', '/handler1', 'handler1'); + $r->addRoute('GET', '/handler2', 'handler2'); + }; + + $method = 'GET'; + $uri = '/handler2'; + $handler = 'handler2'; + $argDict = []; + + $cases[] = [$method, $uri, $callback, $handler, $argDict]; + + // 2 --------------------------------------------------------------------------------------> + + $callback = function (RouteCollector $r) { + $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); + $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1'); + $r->addRoute('GET', '/user/{name}', 'handler2'); + }; + + $method = 'GET'; + $uri = '/user/rdlowrey'; + $handler = 'handler2'; + $argDict = ['name' => 'rdlowrey']; + + $cases[] = [$method, $uri, $callback, $handler, $argDict]; + + // 3 --------------------------------------------------------------------------------------> + + // reuse $callback from #2 + + $method = 'GET'; + $uri = '/user/12345'; + $handler = 'handler1'; + $argDict = ['id' => '12345']; + + $cases[] = [$method, $uri, $callback, $handler, $argDict]; + + // 4 --------------------------------------------------------------------------------------> + + // reuse $callback from #3 + + $method = 'GET'; + $uri = '/user/NaN'; + $handler = 'handler2'; + $argDict = ['name' => 'NaN']; + + $cases[] = [$method, $uri, $callback, $handler, $argDict]; + + // 5 --------------------------------------------------------------------------------------> + + // reuse $callback from #4 + + $method = 'GET'; + $uri = '/user/rdlowrey/12345'; + $handler = 'handler0'; + $argDict = ['name' => 'rdlowrey', 'id' => '12345']; + + $cases[] = [$method, $uri, $callback, $handler, $argDict]; + + // 6 --------------------------------------------------------------------------------------> + + $callback = function (RouteCollector $r) { + $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler0'); + $r->addRoute('GET', '/user/12345/extension', 'handler1'); + $r->addRoute('GET', '/user/{id:[0-9]+}.{extension}', 'handler2'); + }; + + $method = 'GET'; + $uri = '/user/12345.svg'; + $handler = 'handler2'; + $argDict = ['id' => '12345', 'extension' => 'svg']; + + $cases[] = [$method, $uri, $callback, $handler, $argDict]; + + // 7 ----- Test GET method fallback on HEAD route miss ------------------------------------> + + $callback = function (RouteCollector $r) { + $r->addRoute('GET', '/user/{name}', 'handler0'); + $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler1'); + $r->addRoute('GET', '/static0', 'handler2'); + $r->addRoute('GET', '/static1', 'handler3'); + $r->addRoute('HEAD', '/static1', 'handler4'); + }; + + $method = 'HEAD'; + $uri = '/user/rdlowrey'; + $handler = 'handler0'; + $argDict = ['name' => 'rdlowrey']; + + $cases[] = [$method, $uri, $callback, $handler, $argDict]; + + // 8 ----- Test GET method fallback on HEAD route miss ------------------------------------> + + // reuse $callback from #7 + + $method = 'HEAD'; + $uri = '/user/rdlowrey/1234'; + $handler = 'handler1'; + $argDict = ['name' => 'rdlowrey', 'id' => '1234']; + + $cases[] = [$method, $uri, $callback, $handler, $argDict]; + + // 9 ----- Test GET method fallback on HEAD route miss ------------------------------------> + + // reuse $callback from #8 + + $method = 'HEAD'; + $uri = '/static0'; + $handler = 'handler2'; + $argDict = []; + + $cases[] = [$method, $uri, $callback, $handler, $argDict]; + + // 10 ---- Test existing HEAD route used if available (no fallback) -----------------------> + + // reuse $callback from #9 + + $method = 'HEAD'; + $uri = '/static1'; + $handler = 'handler4'; + $argDict = []; + + $cases[] = [$method, $uri, $callback, $handler, $argDict]; + + // 11 ---- More specified routes are not shadowed by less specific of another method ------> + + $callback = function (RouteCollector $r) { + $r->addRoute('GET', '/user/{name}', 'handler0'); + $r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1'); + }; + + $method = 'POST'; + $uri = '/user/rdlowrey'; + $handler = 'handler1'; + $argDict = ['name' => 'rdlowrey']; + + $cases[] = [$method, $uri, $callback, $handler, $argDict]; + + // 12 ---- Handler of more specific routes is used, if it occurs first --------------------> + + $callback = function (RouteCollector $r) { + $r->addRoute('GET', '/user/{name}', 'handler0'); + $r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1'); + $r->addRoute('POST', '/user/{name}', 'handler2'); + }; + + $method = 'POST'; + $uri = '/user/rdlowrey'; + $handler = 'handler1'; + $argDict = ['name' => 'rdlowrey']; + + $cases[] = [$method, $uri, $callback, $handler, $argDict]; + + // 13 ---- Route with constant suffix -----------------------------------------------------> + + $callback = function (RouteCollector $r) { + $r->addRoute('GET', '/user/{name}', 'handler0'); + $r->addRoute('GET', '/user/{name}/edit', 'handler1'); + }; + + $method = 'GET'; + $uri = '/user/rdlowrey/edit'; + $handler = 'handler1'; + $argDict = ['name' => 'rdlowrey']; + + $cases[] = [$method, $uri, $callback, $handler, $argDict]; + + // 14 ---- Handle multiple methods with the same handler ----------------------------------> + + $callback = function (RouteCollector $r) { + $r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost'); + $r->addRoute(['DELETE'], '/user', 'handlerDelete'); + $r->addRoute([], '/user', 'handlerNone'); + }; + + $argDict = []; + $cases[] = ['GET', '/user', $callback, 'handlerGetPost', $argDict]; + $cases[] = ['POST', '/user', $callback, 'handlerGetPost', $argDict]; + $cases[] = ['DELETE', '/user', $callback, 'handlerDelete', $argDict]; + + // 17 ---- + + $callback = function (RouteCollector $r) { + $r->addRoute('POST', '/user.json', 'handler0'); + $r->addRoute('GET', '/{entity}.json', 'handler1'); + }; + + $cases[] = ['GET', '/user.json', $callback, 'handler1', ['entity' => 'user']]; + + // 18 ---- + + $callback = function (RouteCollector $r) { + $r->addRoute('GET', '', 'handler0'); + }; + + $cases[] = ['GET', '', $callback, 'handler0', []]; + + // 19 ---- + + $callback = function (RouteCollector $r) { + $r->addRoute('HEAD', '/a/{foo}', 'handler0'); + $r->addRoute('GET', '/b/{foo}', 'handler1'); + }; + + $cases[] = ['HEAD', '/b/bar', $callback, 'handler1', ['foo' => 'bar']]; + + // 20 ---- + + $callback = function (RouteCollector $r) { + $r->addRoute('HEAD', '/a', 'handler0'); + $r->addRoute('GET', '/b', 'handler1'); + }; + + $cases[] = ['HEAD', '/b', $callback, 'handler1', []]; + + // 21 ---- + + $callback = function (RouteCollector $r) { + $r->addRoute('GET', '/foo', 'handler0'); + $r->addRoute('HEAD', '/{bar}', 'handler1'); + }; + + $cases[] = ['HEAD', '/foo', $callback, 'handler1', ['bar' => 'foo']]; + + // 22 ---- + + $callback = function (RouteCollector $r) { + $r->addRoute('*', '/user', 'handler0'); + $r->addRoute('*', '/{user}', 'handler1'); + $r->addRoute('GET', '/user', 'handler2'); + }; + + $cases[] = ['GET', '/user', $callback, 'handler2', []]; + + // 23 ---- + + $callback = function (RouteCollector $r) { + $r->addRoute('*', '/user', 'handler0'); + $r->addRoute('GET', '/user', 'handler1'); + }; + + $cases[] = ['POST', '/user', $callback, 'handler0', []]; + + // 24 ---- + + $cases[] = ['HEAD', '/user', $callback, 'handler1', []]; + + // 25 ---- + + $callback = function (RouteCollector $r) { + $r->addRoute('GET', '/{bar}', 'handler0'); + $r->addRoute('*', '/foo', 'handler1'); + }; + + $cases[] = ['GET', '/foo', $callback, 'handler0', ['bar' => 'foo']]; + + // 26 ---- + + $callback = function(RouteCollector $r) { + $r->addRoute('GET', '/user', 'handler0'); + $r->addRoute('*', '/{foo:.*}', 'handler1'); + }; + + $cases[] = ['POST', '/bar', $callback, 'handler1', ['foo' => 'bar']]; + + // x --------------------------------------------------------------------------------------> + + return $cases; + } + + public function provideNotFoundDispatchCases() + { + $cases = []; + + // 0 --------------------------------------------------------------------------------------> + + $callback = function (RouteCollector $r) { + $r->addRoute('GET', '/resource/123/456', 'handler0'); + }; + + $method = 'GET'; + $uri = '/not-found'; + + $cases[] = [$method, $uri, $callback]; + + // 1 --------------------------------------------------------------------------------------> + + // reuse callback from #0 + $method = 'POST'; + $uri = '/not-found'; + + $cases[] = [$method, $uri, $callback]; + + // 2 --------------------------------------------------------------------------------------> + + // reuse callback from #1 + $method = 'PUT'; + $uri = '/not-found'; + + $cases[] = [$method, $uri, $callback]; + + // 3 --------------------------------------------------------------------------------------> + + $callback = function (RouteCollector $r) { + $r->addRoute('GET', '/handler0', 'handler0'); + $r->addRoute('GET', '/handler1', 'handler1'); + $r->addRoute('GET', '/handler2', 'handler2'); + }; + + $method = 'GET'; + $uri = '/not-found'; + + $cases[] = [$method, $uri, $callback]; + + // 4 --------------------------------------------------------------------------------------> + + $callback = function (RouteCollector $r) { + $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); + $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1'); + $r->addRoute('GET', '/user/{name}', 'handler2'); + }; + + $method = 'GET'; + $uri = '/not-found'; + + $cases[] = [$method, $uri, $callback]; + + // 5 --------------------------------------------------------------------------------------> + + // reuse callback from #4 + $method = 'GET'; + $uri = '/user/rdlowrey/12345/not-found'; + + $cases[] = [$method, $uri, $callback]; + + // 6 --------------------------------------------------------------------------------------> + + // reuse callback from #5 + $method = 'HEAD'; + + $cases[] = [$method, $uri, $callback]; + + // x --------------------------------------------------------------------------------------> + + return $cases; + } + + public function provideMethodNotAllowedDispatchCases() + { + $cases = []; + + // 0 --------------------------------------------------------------------------------------> + + $callback = function (RouteCollector $r) { + $r->addRoute('GET', '/resource/123/456', 'handler0'); + }; + + $method = 'POST'; + $uri = '/resource/123/456'; + $allowedMethods = ['GET']; + + $cases[] = [$method, $uri, $callback, $allowedMethods]; + + // 1 --------------------------------------------------------------------------------------> + + $callback = function (RouteCollector $r) { + $r->addRoute('GET', '/resource/123/456', 'handler0'); + $r->addRoute('POST', '/resource/123/456', 'handler1'); + $r->addRoute('PUT', '/resource/123/456', 'handler2'); + $r->addRoute('*', '/', 'handler3'); + }; + + $method = 'DELETE'; + $uri = '/resource/123/456'; + $allowedMethods = ['GET', 'POST', 'PUT']; + + $cases[] = [$method, $uri, $callback, $allowedMethods]; + + // 2 --------------------------------------------------------------------------------------> + + $callback = function (RouteCollector $r) { + $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0'); + $r->addRoute('POST', '/user/{name}/{id:[0-9]+}', 'handler1'); + $r->addRoute('PUT', '/user/{name}/{id:[0-9]+}', 'handler2'); + $r->addRoute('PATCH', '/user/{name}/{id:[0-9]+}', 'handler3'); + }; + + $method = 'DELETE'; + $uri = '/user/rdlowrey/42'; + $allowedMethods = ['GET', 'POST', 'PUT', 'PATCH']; + + $cases[] = [$method, $uri, $callback, $allowedMethods]; + + // 3 --------------------------------------------------------------------------------------> + + $callback = function (RouteCollector $r) { + $r->addRoute('POST', '/user/{name}', 'handler1'); + $r->addRoute('PUT', '/user/{name:[a-z]+}', 'handler2'); + $r->addRoute('PATCH', '/user/{name:[a-z]+}', 'handler3'); + }; + + $method = 'GET'; + $uri = '/user/rdlowrey'; + $allowedMethods = ['POST', 'PUT', 'PATCH']; + + $cases[] = [$method, $uri, $callback, $allowedMethods]; + + // 4 --------------------------------------------------------------------------------------> + + $callback = function (RouteCollector $r) { + $r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost'); + $r->addRoute(['DELETE'], '/user', 'handlerDelete'); + $r->addRoute([], '/user', 'handlerNone'); + }; + + $cases[] = ['PUT', '/user', $callback, ['GET', 'POST', 'DELETE']]; + + // 5 + + $callback = function (RouteCollector $r) { + $r->addRoute('POST', '/user.json', 'handler0'); + $r->addRoute('GET', '/{entity}.json', 'handler1'); + }; + + $cases[] = ['PUT', '/user.json', $callback, ['POST', 'GET']]; + + // x --------------------------------------------------------------------------------------> + + return $cases; + } +} diff --git a/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php b/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php new file mode 100644 index 0000000..f821ef5 --- /dev/null +++ b/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php @@ -0,0 +1,16 @@ +<?php + +namespace FastRoute\Dispatcher; + +class GroupCountBasedTest extends DispatcherTest +{ + protected function getDispatcherClass() + { + return 'FastRoute\\Dispatcher\\GroupCountBased'; + } + + protected function getDataGeneratorClass() + { + return 'FastRoute\\DataGenerator\\GroupCountBased'; + } +} diff --git a/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php b/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php new file mode 100644 index 0000000..b5c9567 --- /dev/null +++ b/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php @@ -0,0 +1,16 @@ +<?php + +namespace FastRoute\Dispatcher; + +class GroupPosBasedTest extends DispatcherTest +{ + protected function getDispatcherClass() + { + return 'FastRoute\\Dispatcher\\GroupPosBased'; + } + + protected function getDataGeneratorClass() + { + return 'FastRoute\\DataGenerator\\GroupPosBased'; + } +} diff --git a/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php b/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php new file mode 100644 index 0000000..b3b27dd --- /dev/null +++ b/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php @@ -0,0 +1,24 @@ +<?php + +namespace FastRoute\Dispatcher; + +class MarkBasedTest extends DispatcherTest +{ + public function setUp() + { + preg_match('/(*MARK:A)a/', 'a', $matches); + if (!isset($matches['MARK'])) { + $this->markTestSkipped('PHP 5.6 required for MARK support'); + } + } + + protected function getDispatcherClass() + { + return 'FastRoute\\Dispatcher\\MarkBased'; + } + + protected function getDataGeneratorClass() + { + return 'FastRoute\\DataGenerator\\MarkBased'; + } +} diff --git a/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php b/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php new file mode 100644 index 0000000..b6fc53f --- /dev/null +++ b/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php @@ -0,0 +1,44 @@ +<?php + +namespace FastRoute; + +use PHPUnit\Framework\TestCase; + +class HackTypecheckerTest extends TestCase +{ + const SERVER_ALREADY_RUNNING_CODE = 77; + + public function testTypechecks($recurse = true) + { + if (!defined('HHVM_VERSION')) { + $this->markTestSkipped('HHVM only'); + } + if (!version_compare(HHVM_VERSION, '3.9.0', '>=')) { + $this->markTestSkipped('classname<T> requires HHVM 3.9+'); + } + + // The typechecker recurses the whole tree, so it makes sure + // that everything in fixtures/ is valid when this runs. + + $output = []; + $exit_code = null; + exec( + 'hh_server --check ' . escapeshellarg(__DIR__ . '/../../') . ' 2>&1', + $output, + $exit_code + ); + if ($exit_code === self::SERVER_ALREADY_RUNNING_CODE) { + $this->assertTrue( + $recurse, + 'Typechecker still running after running hh_client stop' + ); + // Server already running - 3.10 => 3.11 regression: + // https://github.com/facebook/hhvm/issues/6646 + exec('hh_client stop 2>/dev/null'); + $this->testTypechecks(/* recurse = */ false); + return; + + } + $this->assertSame(0, $exit_code, implode("\n", $output)); + } +} diff --git a/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php b/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php new file mode 100644 index 0000000..05a9af2 --- /dev/null +++ b/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php @@ -0,0 +1,29 @@ +<?hh + +namespace FastRoute\TestFixtures; + +function all_options_simple(): \FastRoute\Dispatcher { + return \FastRoute\simpleDispatcher( + $collector ==> {}, + shape( + 'routeParser' => \FastRoute\RouteParser\Std::class, + 'dataGenerator' => \FastRoute\DataGenerator\GroupCountBased::class, + 'dispatcher' => \FastRoute\Dispatcher\GroupCountBased::class, + 'routeCollector' => \FastRoute\RouteCollector::class, + ), + ); +} + +function all_options_cached(): \FastRoute\Dispatcher { + return \FastRoute\cachedDispatcher( + $collector ==> {}, + shape( + 'routeParser' => \FastRoute\RouteParser\Std::class, + 'dataGenerator' => \FastRoute\DataGenerator\GroupCountBased::class, + 'dispatcher' => \FastRoute\Dispatcher\GroupCountBased::class, + 'routeCollector' => \FastRoute\RouteCollector::class, + 'cacheFile' => '/dev/null', + 'cacheDisabled' => false, + ), + ); +} diff --git a/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php b/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php new file mode 100644 index 0000000..61eb541 --- /dev/null +++ b/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php @@ -0,0 +1,11 @@ +<?hh + +namespace FastRoute\TestFixtures; + +function empty_options_simple(): \FastRoute\Dispatcher { + return \FastRoute\simpleDispatcher($collector ==> {}, shape()); +} + +function empty_options_cached(): \FastRoute\Dispatcher { + return \FastRoute\cachedDispatcher($collector ==> {}, shape()); +} diff --git a/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php b/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php new file mode 100644 index 0000000..44b5422 --- /dev/null +++ b/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php @@ -0,0 +1,11 @@ +<?hh + +namespace FastRoute\TestFixtures; + +function no_options_simple(): \FastRoute\Dispatcher { + return \FastRoute\simpleDispatcher($collector ==> {}); +} + +function no_options_cached(): \FastRoute\Dispatcher { + return \FastRoute\cachedDispatcher($collector ==> {}); +} diff --git a/vendor/nikic/fast-route/test/RouteCollectorTest.php b/vendor/nikic/fast-route/test/RouteCollectorTest.php new file mode 100644 index 0000000..cc54407 --- /dev/null +++ b/vendor/nikic/fast-route/test/RouteCollectorTest.php @@ -0,0 +1,108 @@ +<?php + +namespace FastRoute; + +use PHPUnit\Framework\TestCase; + +class RouteCollectorTest extends TestCase +{ + public function testShortcuts() + { + $r = new DummyRouteCollector(); + + $r->delete('/delete', 'delete'); + $r->get('/get', 'get'); + $r->head('/head', 'head'); + $r->patch('/patch', 'patch'); + $r->post('/post', 'post'); + $r->put('/put', 'put'); + + $expected = [ + ['DELETE', '/delete', 'delete'], + ['GET', '/get', 'get'], + ['HEAD', '/head', 'head'], + ['PATCH', '/patch', 'patch'], + ['POST', '/post', 'post'], + ['PUT', '/put', 'put'], + ]; + + $this->assertSame($expected, $r->routes); + } + + public function testGroups() + { + $r = new DummyRouteCollector(); + + $r->delete('/delete', 'delete'); + $r->get('/get', 'get'); + $r->head('/head', 'head'); + $r->patch('/patch', 'patch'); + $r->post('/post', 'post'); + $r->put('/put', 'put'); + + $r->addGroup('/group-one', function (DummyRouteCollector $r) { + $r->delete('/delete', 'delete'); + $r->get('/get', 'get'); + $r->head('/head', 'head'); + $r->patch('/patch', 'patch'); + $r->post('/post', 'post'); + $r->put('/put', 'put'); + + $r->addGroup('/group-two', function (DummyRouteCollector $r) { + $r->delete('/delete', 'delete'); + $r->get('/get', 'get'); + $r->head('/head', 'head'); + $r->patch('/patch', 'patch'); + $r->post('/post', 'post'); + $r->put('/put', 'put'); + }); + }); + + $r->addGroup('/admin', function (DummyRouteCollector $r) { + $r->get('-some-info', 'admin-some-info'); + }); + $r->addGroup('/admin-', function (DummyRouteCollector $r) { + $r->get('more-info', 'admin-more-info'); + }); + + $expected = [ + ['DELETE', '/delete', 'delete'], + ['GET', '/get', 'get'], + ['HEAD', '/head', 'head'], + ['PATCH', '/patch', 'patch'], + ['POST', '/post', 'post'], + ['PUT', '/put', 'put'], + ['DELETE', '/group-one/delete', 'delete'], + ['GET', '/group-one/get', 'get'], + ['HEAD', '/group-one/head', 'head'], + ['PATCH', '/group-one/patch', 'patch'], + ['POST', '/group-one/post', 'post'], + ['PUT', '/group-one/put', 'put'], + ['DELETE', '/group-one/group-two/delete', 'delete'], + ['GET', '/group-one/group-two/get', 'get'], + ['HEAD', '/group-one/group-two/head', 'head'], + ['PATCH', '/group-one/group-two/patch', 'patch'], + ['POST', '/group-one/group-two/post', 'post'], + ['PUT', '/group-one/group-two/put', 'put'], + ['GET', '/admin-some-info', 'admin-some-info'], + ['GET', '/admin-more-info', 'admin-more-info'], + ]; + + $this->assertSame($expected, $r->routes); + } +} + +class DummyRouteCollector extends RouteCollector +{ + public $routes = []; + + public function __construct() + { + } + + public function addRoute($method, $route, $handler) + { + $route = $this->currentGroupPrefix . $route; + $this->routes[] = [$method, $route, $handler]; + } +} diff --git a/vendor/nikic/fast-route/test/RouteParser/StdTest.php b/vendor/nikic/fast-route/test/RouteParser/StdTest.php new file mode 100644 index 0000000..e13e4de --- /dev/null +++ b/vendor/nikic/fast-route/test/RouteParser/StdTest.php @@ -0,0 +1,154 @@ +<?php + +namespace FastRoute\RouteParser; + +use PHPUnit\Framework\TestCase; + +class StdTest extends TestCase +{ + /** @dataProvider provideTestParse */ + public function testParse($routeString, $expectedRouteDatas) + { + $parser = new Std(); + $routeDatas = $parser->parse($routeString); + $this->assertSame($expectedRouteDatas, $routeDatas); + } + + /** @dataProvider provideTestParseError */ + public function testParseError($routeString, $expectedExceptionMessage) + { + $parser = new Std(); + $this->setExpectedException('FastRoute\\BadRouteException', $expectedExceptionMessage); + $parser->parse($routeString); + } + + public function provideTestParse() + { + return [ + [ + '/test', + [ + ['/test'], + ] + ], + [ + '/test/{param}', + [ + ['/test/', ['param', '[^/]+']], + ] + ], + [ + '/te{ param }st', + [ + ['/te', ['param', '[^/]+'], 'st'] + ] + ], + [ + '/test/{param1}/test2/{param2}', + [ + ['/test/', ['param1', '[^/]+'], '/test2/', ['param2', '[^/]+']] + ] + ], + [ + '/test/{param:\d+}', + [ + ['/test/', ['param', '\d+']] + ] + ], + [ + '/test/{ param : \d{1,9} }', + [ + ['/test/', ['param', '\d{1,9}']] + ] + ], + [ + '/test[opt]', + [ + ['/test'], + ['/testopt'], + ] + ], + [ + '/test[/{param}]', + [ + ['/test'], + ['/test/', ['param', '[^/]+']], + ] + ], + [ + '/{param}[opt]', + [ + ['/', ['param', '[^/]+']], + ['/', ['param', '[^/]+'], 'opt'] + ] + ], + [ + '/test[/{name}[/{id:[0-9]+}]]', + [ + ['/test'], + ['/test/', ['name', '[^/]+']], + ['/test/', ['name', '[^/]+'], '/', ['id', '[0-9]+']], + ] + ], + [ + '', + [ + [''], + ] + ], + [ + '[test]', + [ + [''], + ['test'], + ] + ], + [ + '/{foo-bar}', + [ + ['/', ['foo-bar', '[^/]+']] + ] + ], + [ + '/{_foo:.*}', + [ + ['/', ['_foo', '.*']] + ] + ], + ]; + } + + public function provideTestParseError() + { + return [ + [ + '/test[opt', + "Number of opening '[' and closing ']' does not match" + ], + [ + '/test[opt[opt2]', + "Number of opening '[' and closing ']' does not match" + ], + [ + '/testopt]', + "Number of opening '[' and closing ']' does not match" + ], + [ + '/test[]', + 'Empty optional part' + ], + [ + '/test[[opt]]', + 'Empty optional part' + ], + [ + '[[test]]', + 'Empty optional part' + ], + [ + '/test[/opt]/required', + 'Optional segments can only occur at the end of a route' + ], + ]; + } +} diff --git a/vendor/nikic/fast-route/test/bootstrap.php b/vendor/nikic/fast-route/test/bootstrap.php new file mode 100644 index 0000000..3023f41 --- /dev/null +++ b/vendor/nikic/fast-route/test/bootstrap.php @@ -0,0 +1,11 @@ +<?php + +require_once __DIR__ . '/../src/functions.php'; + +spl_autoload_register(function ($class) { + if (strpos($class, 'FastRoute\\') === 0) { + $dir = strcasecmp(substr($class, -4), 'Test') ? 'src/' : 'test/'; + $name = substr($class, strlen('FastRoute')); + require __DIR__ . '/../' . $dir . strtr($name, '\\', DIRECTORY_SEPARATOR) . '.php'; + } +}); diff --git a/vendor/nsp-team/webman-throttler/.gitignore b/vendor/nsp-team/webman-throttler/.gitignore new file mode 100644 index 0000000..4c9a917 --- /dev/null +++ b/vendor/nsp-team/webman-throttler/.gitignore @@ -0,0 +1,22 @@ +/.idea +/.vscode +/vendor + +# OS X +.DS_Store +# OS X Thumbnails +._* + +# Windows image file caches +Thumbs.db +ehthumbs.db +Desktop.ini + +#------------------------- +# Environment Files +#------------------------- +# These should never be under version control, +# as it poses a security risk. +.env +.vagrant +Vagrantfile \ No newline at end of file diff --git a/vendor/nsp-team/webman-throttler/LICENSE b/vendor/nsp-team/webman-throttler/LICENSE new file mode 100644 index 0000000..0586643 --- /dev/null +++ b/vendor/nsp-team/webman-throttler/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 webman + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/vendor/nsp-team/webman-throttler/README.md b/vendor/nsp-team/webman-throttler/README.md new file mode 100644 index 0000000..84016b7 --- /dev/null +++ b/vendor/nsp-team/webman-throttler/README.md @@ -0,0 +1,38 @@ +# webman-throttler +限流类(Throttler)提供了一种非常简单的方法,可以将用户要执行的活动限制为在设定的时间段内只能进行一定次数的尝试。这最常用于对 API 进行速率限制,或限制用户针对表单进行的尝试次数,以帮助防止暴力攻击。 该类可用于你根据设置的时间来进行限制的操作。 + + + + +限流类 + +* 全局中间件,整个应用接口限流, +* 路由中间件,某些功能接口请求速率限制 + +缓存依据的是`Support\Cache的 instance()`, 其他类只要是实现 `get($key, $default = null)`, `set($key, $value, $ttl = null)`, `delete($key)` funtion就行. + + +> 项目地址:https://github.com/nsp-team/webman-throttler + +## 安装 +`composer require nsp-team/webman-throttler` + +## 基本用法 +> 默认 开启全局中间件限流 +```php +return [ + '' => [ + \NspTeam\WebmanThrottler\Middleware\ThrottlerMiddleware::class, + ] +]; +``` + +> 你也可以启用路由中间件,控制接口请求速率限制 +例如: +```php +Route::group('/sys/user', static function () { + Route::post('/test', [User::class, 'test']); +})->middleware([ + \NspTeam\WebmanThrottler\Middleware\ThrottlerMiddleware::class +]); +``` \ No newline at end of file diff --git a/vendor/nsp-team/webman-throttler/composer.json b/vendor/nsp-team/webman-throttler/composer.json new file mode 100644 index 0000000..9fd0c5e --- /dev/null +++ b/vendor/nsp-team/webman-throttler/composer.json @@ -0,0 +1,20 @@ +{ + "name": "nsp-team/webman-throttler", + "description": "very Very easy to use a current limiting component, the code is very simple, based on the webman framework.", + "license": "MIT", + "require": { + "php": ">=7.2", + "workerman/webman-framework": "^1.2.1" + }, + "autoload": { + "psr-4": { + "NspTeam\\WebmanThrottler\\": "src/" + } + }, + "authors": [ + { + "name": "maoxp", + "email": "maoxingpei8686@163.com" + } + ] +} diff --git a/vendor/nsp-team/webman-throttler/src/Install.php b/vendor/nsp-team/webman-throttler/src/Install.php new file mode 100644 index 0000000..f52b856 --- /dev/null +++ b/vendor/nsp-team/webman-throttler/src/Install.php @@ -0,0 +1,69 @@ +<?php +namespace NspTeam\WebmanThrottler; + +class Install +{ + const WEBMAN_PLUGIN = true; + + /** + * @var array + */ + protected static $pathRelation = array ( + 'config/plugin/nsp-team/webman-throttler' => 'config/plugin/nsp-team/webman-throttler', +); + + /** + * Install + * @return void + */ + public static function install() + { + static::installByRelation(); + } + + /** + * Uninstall + * @return void + */ + public static function uninstall() + { + self::uninstallByRelation(); + } + + /** + * installByRelation + * @return void + */ + public static function installByRelation() + { + foreach (static::$pathRelation as $source => $dest) { + if ($pos = strrpos($dest, '/')) { + $parent_dir = base_path().'/'.substr($dest, 0, $pos); + if (!is_dir($parent_dir)) { + mkdir($parent_dir, 0777, true); + } + } + //symlink(__DIR__ . "/$source", base_path()."/$dest"); + copy_dir(__DIR__ . "/$source", base_path()."/$dest"); + } + } + + /** + * uninstallByRelation + * @return void + */ + public static function uninstallByRelation() + { + foreach (static::$pathRelation as $source => $dest) { + $path = base_path()."/$dest"; + if (!is_dir($path) && !is_file($path)) { + continue; + } + /*if (is_link($path) { + unlink($path); + }*/ + remove_dir($path); + } + } + +} \ No newline at end of file diff --git a/vendor/nsp-team/webman-throttler/src/Middleware/ThrottlerMiddleware.php b/vendor/nsp-team/webman-throttler/src/Middleware/ThrottlerMiddleware.php new file mode 100644 index 0000000..64149c6 --- /dev/null +++ b/vendor/nsp-team/webman-throttler/src/Middleware/ThrottlerMiddleware.php @@ -0,0 +1,47 @@ +<?php + +namespace NspTeam\WebmanThrottler\Middleware; + + +use NspTeam\WebmanThrottler\Throttle\Throttler; +use support\Cache; +use support\Container; +use Webman\Http\Request; +use Webman\Http\Response; +use Webman\MiddlewareInterface; + + +/** + * ThrottlerMiddleware + */ +class ThrottlerMiddleware implements MiddlewareInterface +{ + + /** + * @inheritDoc + * @param Request $request + * @param callable $handler + * @return Response + */ + public function process(Request $request, callable $handler): Response + { + /** + * @var Throttler + */ + $throttler = Container::make(Throttler::class, [Cache::instance()]); + + $config = config('plugin.nsp-team.webman-throttler.app'); + $capacity = $config['capacity'] ?? 60; + $seconds = $config['seconds'] ?? 60; + $cost = $config['cost'] ?? 1; + $customerHandle = $config['customer_handle']; + + if ($throttler->check($request->getRemoteIp(), $capacity, $seconds, $cost) === false) { + $newClass = $customerHandle['class']; + return new $newClass(... \array_values($customerHandle['constructor'])); + //return new Response(429, ['Content-Type' => 'application/json'], json_encode(['success' => false, 'msg' => '请求此时太频繁'], JSON_UNESCAPED_UNICODE)); + } + + return $handler($request); + } +} \ No newline at end of file diff --git a/vendor/nsp-team/webman-throttler/src/Throttle/Throttler.php b/vendor/nsp-team/webman-throttler/src/Throttle/Throttler.php new file mode 100644 index 0000000..a8ac9bd --- /dev/null +++ b/vendor/nsp-team/webman-throttler/src/Throttle/Throttler.php @@ -0,0 +1,168 @@ +<?php + +namespace NspTeam\WebmanThrottler\Throttle; + + +/** + * Class Throttler + * + * Uses an implementation of the Token Bucket algorithm to implement a + * "rolling window" type of throttling that can be used for rate limiting + * an API or any other request. + * + * Each "token" in the "bucket" is equivalent to a single request + * for the purposes of this implementation. + * + * @see https://en.wikipedia.org/wiki/Token_bucket + */ +class Throttler implements ThrottlerInterface +{ + /** + * Container for throttle counters. + * + * @var object + */ + protected $cache; + + /** + * The number of seconds until the next token is available. + * + * @var int + */ + protected $tokenTime = 0; + + /** + * The prefix applied to all keys to + * minimize potential conflicts. + * + * @var string + */ + protected $prefix = 'throttler_'; + + /** + * Timestamp to use (during testing) + * + * @var int + */ + protected $testTime; + + public function __construct(object $cache) + { + $this->cache = $cache; + } + + /** + * @param string $key The name of the bucket + * @return $this + */ + public function remove(string $key): self + { + $tokenName = $this->prefix . $key; + + $this->cache->delete($tokenName); + $this->cache->delete($tokenName . 'Time'); + + return $this; + } + + /** + * Return the test time, defaulting to current. + */ + private function time(): int + { + return $this->testTime ?? time(); + } + + /** + * Used during testing to set the current timestamp to use. + * + * @return $this + */ + public function setTestTime(int $time): self + { + $this->testTime = $time; + + return $this; + } + + /** + * Restricts the number of requests made by a single IP address within + * a set number of seconds. + * + * Example: + * + * if (! $throttler->check($request->getRemoteIp(), 60, MINUTE)) { + * die('You submitted over 60 requests within a minute.'); + * } + * + * @param string $key The name to use as the "bucket" name. + * @param int $capacity The number of requests the "bucket" can hold + * @param int $seconds The time it takes the "bucket" to completely refill + * @param int $cost The number of tokens this action uses. + * + * @internal param int $maxRequests + */ + public function check(string $key, int $capacity, int $seconds, int $cost): bool + { + $tokenName = $this->prefix . $key; + + // Number of tokens to add back per second + $rate = $capacity / $seconds; + // Number of seconds to get one token + $refresh = 1 / $rate; + + // Check to see if the bucket has even been created yet. + if (($tokens = $this->cache->get($tokenName)) === null) { + // If it hasn't been created, then we'll set it to the maximum + // capacity - 1, and save it to the cache. + $tokens = $capacity - $cost; + $this->cache->set($tokenName, $tokens, $seconds); + $this->cache->set($tokenName . 'Time', $this->time(), $seconds); + + $this->tokenTime = 0; + + return true; + } + + // If $tokens > 0, then we need to replenish the bucket + // based on how long it's been since the last update. + $throttleTime = $this->cache->get($tokenName . 'Time'); + $elapsed = $this->time() - $throttleTime; + + // Add tokens based up on number per second that + // should be refilled, then checked against capacity + // to be sure the bucket didn't overflow. + $tokens += $rate * $elapsed; + $tokens = $tokens > $capacity ? $capacity : $tokens; + + // If $tokens >= 1, then we are safe to perform the action, but + // we need to decrement the number of available tokens. + if ($tokens >= 1) { + $tokens -= $cost; + $this->cache->set($tokenName, $tokens, $seconds); + $this->cache->set($tokenName . 'Time', $this->time(), $seconds); + + $this->tokenTime = 0; + + return true; + } + + // How many seconds till a new token is available. + // We must have a minimum wait of 1 second for a new token. + // Primarily stored to allow devs to report back to users. + $newTokenAvailable = (int)($refresh - $elapsed - $refresh * $tokens); + $this->tokenTime = max(1, $newTokenAvailable); + + return false; + } + + /** + * Returns the number of seconds until the next available token will + * be released for usage. + * @return int + */ + public function getTokenTime(): int + { + return $this->tokenTime; + } +} \ No newline at end of file diff --git a/vendor/nsp-team/webman-throttler/src/Throttle/ThrottlerInterface.php b/vendor/nsp-team/webman-throttler/src/Throttle/ThrottlerInterface.php new file mode 100644 index 0000000..f12d74d --- /dev/null +++ b/vendor/nsp-team/webman-throttler/src/Throttle/ThrottlerInterface.php @@ -0,0 +1,37 @@ +<?php + +namespace NspTeam\WebmanThrottler\Throttle; + +/** + * Expected behavior of a Throttler + * @package NspTeam\WebmanThrottler\Throttle + */ +interface ThrottlerInterface +{ + /** + * Restricts the number of requests made by a single key within + * a set number of seconds. + * + * Example: + * + * if (! $throttler->checkIPAddress($request->ipAddress(), 60, MINUTE)) + * { + * die('You submitted over 60 requests within a minute.'); + * } + * + * @param string $key The name to use as the "bucket" name. + * @param int $capacity The number of requests the "bucket" can hold + * @param int $seconds The time it takes the "bucket" to completely refill + * @param int $cost The number of tokens this action uses. + * + * @return bool + */ + public function check(string $key, int $capacity, int $seconds, int $cost): bool; + + /** + * Returns the number of seconds until the next available token will + * be released for usage. + * @return int + */ + public function getTokenTime(): int; +} \ No newline at end of file diff --git a/vendor/nsp-team/webman-throttler/src/config/plugin/nsp-team/webman-throttler/app.php b/vendor/nsp-team/webman-throttler/src/config/plugin/nsp-team/webman-throttler/app.php new file mode 100644 index 0000000..ca25a15 --- /dev/null +++ b/vendor/nsp-team/webman-throttler/src/config/plugin/nsp-team/webman-throttler/app.php @@ -0,0 +1,16 @@ +<?php +return [ + 'enable' => true, + + 'capacity' => 60, // The number of requests the "bucket" can hold + 'seconds' => 60, // The time it takes the "bucket" to completely refill + 'cost' => 1, // The number of tokens this action uses. + 'customer_handle' => [ + 'class' => \support\Response::class, + 'constructor' => [ + 429, + array(), + json_encode(['success' => false, 'msg' => '请求次数太频繁'], 256), + ], + ], +]; \ No newline at end of file diff --git a/vendor/nsp-team/webman-throttler/src/config/plugin/nsp-team/webman-throttler/middleware.php b/vendor/nsp-team/webman-throttler/src/config/plugin/nsp-team/webman-throttler/middleware.php new file mode 100644 index 0000000..9e525b7 --- /dev/null +++ b/vendor/nsp-team/webman-throttler/src/config/plugin/nsp-team/webman-throttler/middleware.php @@ -0,0 +1,19 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + '' => [ + \NspTeam\WebmanThrottler\Middleware\ThrottlerMiddleware::class, + ] +]; \ No newline at end of file diff --git a/vendor/phpoption/phpoption/LICENSE b/vendor/phpoption/phpoption/LICENSE new file mode 100644 index 0000000..f49a4e1 --- /dev/null +++ b/vendor/phpoption/phpoption/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/vendor/phpoption/phpoption/Makefile b/vendor/phpoption/phpoption/Makefile new file mode 100644 index 0000000..84d715d --- /dev/null +++ b/vendor/phpoption/phpoption/Makefile @@ -0,0 +1,26 @@ +install: + @docker run -it -w /data -v ${PWD}:/data:delegated -v ~/.composer:/root/.composer:delegated --entrypoint composer --rm registry.gitlab.com/grahamcampbell/php:7.4-base update + @docker run -it -w /data -v ${PWD}:/data:delegated -v ~/.composer:/root/.composer:delegated --entrypoint composer --rm registry.gitlab.com/grahamcampbell/php:7.4-base bin all update + +phpunit: + @rm -f bootstrap/cache/*.php && docker run -it -w /data -v ${PWD}:/data:delegated --entrypoint vendor/bin/phpunit --rm registry.gitlab.com/grahamcampbell/php:7.4-cli + +phpstan-analyze-src: + @docker run -it -w /data -v ${PWD}:/data:delegated --entrypoint vendor/bin/phpstan --rm registry.gitlab.com/grahamcampbell/php:7.4-cli analyze src -c phpstan.src.neon.dist + +phpstan-analyze-tests: + @docker run -it -w /data -v ${PWD}:/data:delegated --entrypoint vendor/bin/phpstan --rm registry.gitlab.com/grahamcampbell/php:7.4-cli analyze tests -c phpstan.tests.neon.dist + +phpstan-baseline: + @docker run -it -w /data -v ${PWD}:/data:delegated --entrypoint vendor/bin/phpstan --rm registry.gitlab.com/grahamcampbell/php:7.4-cli analyze src -c phpstan.src.neon.dist --generate-baseline + +psalm-analyze: + @docker run -it -w /data -v ${PWD}:/data:delegated --entrypoint vendor/bin/psalm.phar --rm registry.gitlab.com/grahamcampbell/php:7.4-cli + +psalm-show-info: + @docker run -it -w /data -v ${PWD}:/data:delegated --entrypoint vendor/bin/psalm .phar--rm registry.gitlab.com/grahamcampbell/php:7.4-cli --show-info=true + +test: phpunit phpstan-analyze-src phpstan-analyze-tests psalm-analyze + +clean: + @rm -rf .phpunit.result.cache composer.lock vendor vendor-bin/*/composer.lock vendor-bin/*/vendor diff --git a/vendor/phpoption/phpoption/composer.json b/vendor/phpoption/phpoption/composer.json new file mode 100644 index 0000000..3cff6ef --- /dev/null +++ b/vendor/phpoption/phpoption/composer.json @@ -0,0 +1,45 @@ +{ + "name": "phpoption/phpoption", + "description": "Option Type for PHP", + "keywords": ["php", "option", "language", "type"], + "license": "Apache-2.0", + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "require": { + "php": "^7.0 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "autoload-dev": { + "psr-4": { + "PhpOption\\Tests\\": "tests/PhpOption/Tests/" + } + }, + "config": { + "preferred-install": "dist" + }, + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/vendor/phpoption/phpoption/src/PhpOption/LazyOption.php b/vendor/phpoption/phpoption/src/PhpOption/LazyOption.php new file mode 100644 index 0000000..9cb77c8 --- /dev/null +++ b/vendor/phpoption/phpoption/src/PhpOption/LazyOption.php @@ -0,0 +1,175 @@ +<?php + +/* + * Copyright 2012 Johannes M. Schmitt <schmittjoh@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpOption; + +use Traversable; + +/** + * @template T + * + * @extends Option<T> + */ +final class LazyOption extends Option +{ + /** @var callable(mixed...):(Option<T>) */ + private $callback; + + /** @var array<int, mixed> */ + private $arguments; + + /** @var Option<T>|null */ + private $option; + + /** + * @template S + * @param callable(mixed...):(Option<S>) $callback + * @param array<int, mixed> $arguments + * + * @return LazyOption<S> + */ + public static function create($callback, array $arguments = []): self + { + return new self($callback, $arguments); + } + + /** + * @param callable(mixed...):(Option<T>) $callback + * @param array<int, mixed> $arguments + */ + public function __construct($callback, array $arguments = []) + { + if (!is_callable($callback)) { + throw new \InvalidArgumentException('Invalid callback given'); + } + + $this->callback = $callback; + $this->arguments = $arguments; + } + + public function isDefined(): bool + { + return $this->option()->isDefined(); + } + + public function isEmpty(): bool + { + return $this->option()->isEmpty(); + } + + public function get() + { + return $this->option()->get(); + } + + public function getOrElse($default) + { + return $this->option()->getOrElse($default); + } + + public function getOrCall($callable) + { + return $this->option()->getOrCall($callable); + } + + public function getOrThrow(\Exception $ex) + { + return $this->option()->getOrThrow($ex); + } + + public function orElse(Option $else) + { + return $this->option()->orElse($else); + } + + public function ifDefined($callable) + { + $this->option()->forAll($callable); + } + + public function forAll($callable) + { + return $this->option()->forAll($callable); + } + + public function map($callable) + { + return $this->option()->map($callable); + } + + public function flatMap($callable) + { + return $this->option()->flatMap($callable); + } + + public function filter($callable) + { + return $this->option()->filter($callable); + } + + public function filterNot($callable) + { + return $this->option()->filterNot($callable); + } + + public function select($value) + { + return $this->option()->select($value); + } + + public function reject($value) + { + return $this->option()->reject($value); + } + + /** + * @return Traversable<T> + */ + public function getIterator(): Traversable + { + return $this->option()->getIterator(); + } + + public function foldLeft($initialValue, $callable) + { + return $this->option()->foldLeft($initialValue, $callable); + } + + public function foldRight($initialValue, $callable) + { + return $this->option()->foldRight($initialValue, $callable); + } + + /** + * @return Option<T> + */ + private function option(): Option + { + if (null === $this->option) { + /** @var mixed */ + $option = call_user_func_array($this->callback, $this->arguments); + if ($option instanceof Option) { + $this->option = $option; + } else { + throw new \RuntimeException(sprintf('Expected instance of %s', Option::class)); + } + } + + return $this->option; + } +} diff --git a/vendor/phpoption/phpoption/src/PhpOption/None.php b/vendor/phpoption/phpoption/src/PhpOption/None.php new file mode 100644 index 0000000..4b85d22 --- /dev/null +++ b/vendor/phpoption/phpoption/src/PhpOption/None.php @@ -0,0 +1,136 @@ +<?php + +/* + * Copyright 2012 Johannes M. Schmitt <schmittjoh@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpOption; + +use EmptyIterator; + +/** + * @extends Option<mixed> + */ +final class None extends Option +{ + /** @var None|null */ + private static $instance; + + /** + * @return None + */ + public static function create(): self + { + if (null === self::$instance) { + self::$instance = new self(); + } + + return self::$instance; + } + + public function get() + { + throw new \RuntimeException('None has no value.'); + } + + public function getOrCall($callable) + { + return $callable(); + } + + public function getOrElse($default) + { + return $default; + } + + public function getOrThrow(\Exception $ex) + { + throw $ex; + } + + public function isEmpty(): bool + { + return true; + } + + public function isDefined(): bool + { + return false; + } + + public function orElse(Option $else) + { + return $else; + } + + public function ifDefined($callable) + { + // Just do nothing in that case. + } + + public function forAll($callable) + { + return $this; + } + + public function map($callable) + { + return $this; + } + + public function flatMap($callable) + { + return $this; + } + + public function filter($callable) + { + return $this; + } + + public function filterNot($callable) + { + return $this; + } + + public function select($value) + { + return $this; + } + + public function reject($value) + { + return $this; + } + + public function getIterator(): EmptyIterator + { + return new EmptyIterator(); + } + + public function foldLeft($initialValue, $callable) + { + return $initialValue; + } + + public function foldRight($initialValue, $callable) + { + return $initialValue; + } + + private function __construct() + { + } +} diff --git a/vendor/phpoption/phpoption/src/PhpOption/Option.php b/vendor/phpoption/phpoption/src/PhpOption/Option.php new file mode 100644 index 0000000..172924c --- /dev/null +++ b/vendor/phpoption/phpoption/src/PhpOption/Option.php @@ -0,0 +1,434 @@ +<?php + +/* + * Copyright 2012 Johannes M. Schmitt <schmittjoh@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpOption; + +use ArrayAccess; +use IteratorAggregate; + +/** + * @template T + * + * @implements IteratorAggregate<T> + */ +abstract class Option implements IteratorAggregate +{ + /** + * Creates an option given a return value. + * + * This is intended for consuming existing APIs and allows you to easily + * convert them to an option. By default, we treat ``null`` as the None + * case, and everything else as Some. + * + * @template S + * + * @param S $value The actual return value. + * @param S $noneValue The value which should be considered "None"; null by + * default. + * + * @return Option<S> + */ + public static function fromValue($value, $noneValue = null) + { + if ($value === $noneValue) { + return None::create(); + } + + return new Some($value); + } + + /** + * Creates an option from an array's value. + * + * If the key does not exist in the array, the array is not actually an + * array, or the array's value at the given key is null, None is returned. + * Otherwise, Some is returned wrapping the value at the given key. + * + * @template S + * + * @param array<string|int,S>|ArrayAccess<string|int,S>|null $array A potential array or \ArrayAccess value. + * @param string $key The key to check. + * + * @return Option<S> + */ + public static function fromArraysValue($array, $key) + { + if (!(is_array($array) || $array instanceof ArrayAccess) || !isset($array[$key])) { + return None::create(); + } + + return new Some($array[$key]); + } + + /** + * Creates a lazy-option with the given callback. + * + * This is also a helper constructor for lazy-consuming existing APIs where + * the return value is not yet an option. By default, we treat ``null`` as + * None case, and everything else as Some. + * + * @template S + * + * @param callable $callback The callback to evaluate. + * @param array $arguments The arguments for the callback. + * @param S $noneValue The value which should be considered "None"; + * null by default. + * + * @return LazyOption<S> + */ + public static function fromReturn($callback, array $arguments = [], $noneValue = null) + { + return new LazyOption(static function () use ($callback, $arguments, $noneValue) { + /** @var mixed */ + $return = call_user_func_array($callback, $arguments); + + if ($return === $noneValue) { + return None::create(); + } + + return new Some($return); + }); + } + + /** + * Option factory, which creates new option based on passed value. + * + * If value is already an option, it simply returns. If value is callable, + * LazyOption with passed callback created and returned. If Option + * returned from callback, it returns directly. On other case value passed + * to Option::fromValue() method. + * + * @template S + * + * @param Option<S>|callable|S $value + * @param S $noneValue Used when $value is mixed or + * callable, for None-check. + * + * @return Option<S>|LazyOption<S> + */ + public static function ensure($value, $noneValue = null) + { + if ($value instanceof self) { + return $value; + } elseif (is_callable($value)) { + return new LazyOption(static function () use ($value, $noneValue) { + /** @var mixed */ + $return = $value(); + + if ($return instanceof self) { + return $return; + } else { + return self::fromValue($return, $noneValue); + } + }); + } else { + return self::fromValue($value, $noneValue); + } + } + + /** + * Lift a function so that it accepts Option as parameters. + * + * We return a new closure that wraps the original callback. If any of the + * parameters passed to the lifted function is empty, the function will + * return a value of None. Otherwise, we will pass all parameters to the + * original callback and return the value inside a new Option, unless an + * Option is returned from the function, in which case, we use that. + * + * @template S + * + * @param callable $callback + * @param mixed $noneValue + * + * @return callable + */ + public static function lift($callback, $noneValue = null) + { + return static function () use ($callback, $noneValue) { + /** @var array<int, mixed> */ + $args = func_get_args(); + + $reduced_args = array_reduce( + $args, + /** @param bool $status */ + static function ($status, self $o) { + return $o->isEmpty() ? true : $status; + }, + false + ); + // if at least one parameter is empty, return None + if ($reduced_args) { + return None::create(); + } + + $args = array_map( + /** @return T */ + static function (self $o) { + // it is safe to do so because the fold above checked + // that all arguments are of type Some + /** @var T */ + return $o->get(); + }, + $args + ); + + return self::ensure(call_user_func_array($callback, $args), $noneValue); + }; + } + + /** + * Returns the value if available, or throws an exception otherwise. + * + * @throws \RuntimeException If value is not available. + * + * @return T + */ + abstract public function get(); + + /** + * Returns the value if available, or the default value if not. + * + * @template S + * + * @param S $default + * + * @return T|S + */ + abstract public function getOrElse($default); + + /** + * Returns the value if available, or the results of the callable. + * + * This is preferable over ``getOrElse`` if the computation of the default + * value is expensive. + * + * @template S + * + * @param callable():S $callable + * + * @return T|S + */ + abstract public function getOrCall($callable); + + /** + * Returns the value if available, or throws the passed exception. + * + * @param \Exception $ex + * + * @return T + */ + abstract public function getOrThrow(\Exception $ex); + + /** + * Returns true if no value is available, false otherwise. + * + * @return bool + */ + abstract public function isEmpty(); + + /** + * Returns true if a value is available, false otherwise. + * + * @return bool + */ + abstract public function isDefined(); + + /** + * Returns this option if non-empty, or the passed option otherwise. + * + * This can be used to try multiple alternatives, and is especially useful + * with lazy evaluating options: + * + * ```php + * $repo->findSomething() + * ->orElse(new LazyOption(array($repo, 'findSomethingElse'))) + * ->orElse(new LazyOption(array($repo, 'createSomething'))); + * ``` + * + * @param Option<T> $else + * + * @return Option<T> + */ + abstract public function orElse(self $else); + + /** + * This is similar to map() below except that the return value has no meaning; + * the passed callable is simply executed if the option is non-empty, and + * ignored if the option is empty. + * + * In all cases, the return value of the callable is discarded. + * + * ```php + * $comment->getMaybeFile()->ifDefined(function($file) { + * // Do something with $file here. + * }); + * ``` + * + * If you're looking for something like ``ifEmpty``, you can use ``getOrCall`` + * and ``getOrElse`` in these cases. + * + * @deprecated Use forAll() instead. + * + * @param callable(T):mixed $callable + * + * @return void + */ + abstract public function ifDefined($callable); + + /** + * This is similar to map() except that the return value of the callable has no meaning. + * + * The passed callable is simply executed if the option is non-empty, and ignored if the + * option is empty. This method is preferred for callables with side-effects, while map() + * is intended for callables without side-effects. + * + * @param callable(T):mixed $callable + * + * @return Option<T> + */ + abstract public function forAll($callable); + + /** + * Applies the callable to the value of the option if it is non-empty, + * and returns the return value of the callable wrapped in Some(). + * + * If the option is empty, then the callable is not applied. + * + * ```php + * (new Some("foo"))->map('strtoupper')->get(); // "FOO" + * ``` + * + * @template S + * + * @param callable(T):S $callable + * + * @return Option<S> + */ + abstract public function map($callable); + + /** + * Applies the callable to the value of the option if it is non-empty, and + * returns the return value of the callable directly. + * + * In contrast to ``map``, the return value of the callable is expected to + * be an Option itself; it is not automatically wrapped in Some(). + * + * @template S + * + * @param callable(T):Option<S> $callable must return an Option + * + * @return Option<S> + */ + abstract public function flatMap($callable); + + /** + * If the option is empty, it is returned immediately without applying the callable. + * + * If the option is non-empty, the callable is applied, and if it returns true, + * the option itself is returned; otherwise, None is returned. + * + * @param callable(T):bool $callable + * + * @return Option<T> + */ + abstract public function filter($callable); + + /** + * If the option is empty, it is returned immediately without applying the callable. + * + * If the option is non-empty, the callable is applied, and if it returns false, + * the option itself is returned; otherwise, None is returned. + * + * @param callable(T):bool $callable + * + * @return Option<T> + */ + abstract public function filterNot($callable); + + /** + * If the option is empty, it is returned immediately. + * + * If the option is non-empty, and its value does not equal the passed value + * (via a shallow comparison ===), then None is returned. Otherwise, the + * Option is returned. + * + * In other words, this will filter all but the passed value. + * + * @param T $value + * + * @return Option<T> + */ + abstract public function select($value); + + /** + * If the option is empty, it is returned immediately. + * + * If the option is non-empty, and its value does equal the passed value (via + * a shallow comparison ===), then None is returned; otherwise, the Option is + * returned. + * + * In other words, this will let all values through except the passed value. + * + * @param T $value + * + * @return Option<T> + */ + abstract public function reject($value); + + /** + * Binary operator for the initial value and the option's value. + * + * If empty, the initial value is returned. If non-empty, the callable + * receives the initial value and the option's value as arguments. + * + * ```php + * + * $some = new Some(5); + * $none = None::create(); + * $result = $some->foldLeft(1, function($a, $b) { return $a + $b; }); // int(6) + * $result = $none->foldLeft(1, function($a, $b) { return $a + $b; }); // int(1) + * + * // This can be used instead of something like the following: + * $option = Option::fromValue($integerOrNull); + * $result = 1; + * if ( ! $option->isEmpty()) { + * $result += $option->get(); + * } + * ``` + * + * @template S + * + * @param S $initialValue + * @param callable(S, T):S $callable + * + * @return S + */ + abstract public function foldLeft($initialValue, $callable); + + /** + * foldLeft() but with reversed arguments for the callable. + * + * @template S + * + * @param S $initialValue + * @param callable(T, S):S $callable + * + * @return S + */ + abstract public function foldRight($initialValue, $callable); +} diff --git a/vendor/phpoption/phpoption/src/PhpOption/Some.php b/vendor/phpoption/phpoption/src/PhpOption/Some.php new file mode 100644 index 0000000..032632e --- /dev/null +++ b/vendor/phpoption/phpoption/src/PhpOption/Some.php @@ -0,0 +1,169 @@ +<?php + +/* + * Copyright 2012 Johannes M. Schmitt <schmittjoh@gmail.com> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace PhpOption; + +use ArrayIterator; + +/** + * @template T + * + * @extends Option<T> + */ +final class Some extends Option +{ + /** @var T */ + private $value; + + /** + * @param T $value + */ + public function __construct($value) + { + $this->value = $value; + } + + /** + * @template U + * + * @param U $value + * + * @return Some<U> + */ + public static function create($value): self + { + return new self($value); + } + + public function isDefined(): bool + { + return true; + } + + public function isEmpty(): bool + { + return false; + } + + public function get() + { + return $this->value; + } + + public function getOrElse($default) + { + return $this->value; + } + + public function getOrCall($callable) + { + return $this->value; + } + + public function getOrThrow(\Exception $ex) + { + return $this->value; + } + + public function orElse(Option $else) + { + return $this; + } + + public function ifDefined($callable) + { + $this->forAll($callable); + } + + public function forAll($callable) + { + $callable($this->value); + + return $this; + } + + public function map($callable) + { + return new self($callable($this->value)); + } + + public function flatMap($callable) + { + /** @var mixed */ + $rs = $callable($this->value); + if (!$rs instanceof Option) { + throw new \RuntimeException('Callables passed to flatMap() must return an Option. Maybe you should use map() instead?'); + } + + return $rs; + } + + public function filter($callable) + { + if (true === $callable($this->value)) { + return $this; + } + + return None::create(); + } + + public function filterNot($callable) + { + if (false === $callable($this->value)) { + return $this; + } + + return None::create(); + } + + public function select($value) + { + if ($this->value === $value) { + return $this; + } + + return None::create(); + } + + public function reject($value) + { + if ($this->value === $value) { + return None::create(); + } + + return $this; + } + + /** + * @return ArrayIterator<int, T> + */ + public function getIterator(): ArrayIterator + { + return new ArrayIterator([$this->value]); + } + + public function foldLeft($initialValue, $callable) + { + return $callable($initialValue, $this->value); + } + + public function foldRight($initialValue, $callable) + { + return $callable($this->value, $initialValue); + } +} diff --git a/vendor/psr/cache/CHANGELOG.md b/vendor/psr/cache/CHANGELOG.md new file mode 100644 index 0000000..58ddab0 --- /dev/null +++ b/vendor/psr/cache/CHANGELOG.md @@ -0,0 +1,16 @@ +# Changelog + +All notable changes to this project will be documented in this file, in reverse chronological order by release. + +## 1.0.1 - 2016-08-06 + +### Fixed + +- Make spacing consistent in phpdoc annotations php-fig/cache#9 - chalasr +- Fix grammar in phpdoc annotations php-fig/cache#10 - chalasr +- Be more specific in docblocks that `getItems()` and `deleteItems()` take an array of strings (`string[]`) compared to just `array` php-fig/cache#8 - GrahamCampbell +- For `expiresAt()` and `expiresAfter()` in CacheItemInterface fix docblock to specify null as a valid parameters as well as an implementation of DateTimeInterface php-fig/cache#7 - GrahamCampbell + +## 1.0.0 - 2015-12-11 + +Initial stable release; reflects accepted PSR-6 specification diff --git a/vendor/psr/cache/LICENSE.txt b/vendor/psr/cache/LICENSE.txt new file mode 100644 index 0000000..b1c2c97 --- /dev/null +++ b/vendor/psr/cache/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2015 PHP Framework Interoperability Group + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/psr/cache/README.md b/vendor/psr/cache/README.md new file mode 100644 index 0000000..9855a31 --- /dev/null +++ b/vendor/psr/cache/README.md @@ -0,0 +1,12 @@ +Caching Interface +============== + +This repository holds all interfaces related to [PSR-6 (Caching Interface)][psr-url]. + +Note that this is not a Caching implementation of its own. It is merely interfaces that describe the components of a Caching mechanism. + +The installable [package][package-url] and [implementations][implementation-url] are listed on Packagist. + +[psr-url]: https://www.php-fig.org/psr/psr-6/ +[package-url]: https://packagist.org/packages/psr/cache +[implementation-url]: https://packagist.org/providers/psr/cache-implementation diff --git a/vendor/psr/cache/composer.json b/vendor/psr/cache/composer.json new file mode 100644 index 0000000..4b68797 --- /dev/null +++ b/vendor/psr/cache/composer.json @@ -0,0 +1,25 @@ +{ + "name": "psr/cache", + "description": "Common interface for caching libraries", + "keywords": ["psr", "psr-6", "cache"], + "license": "MIT", + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "require": { + "php": ">=8.0.0" + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + } +} diff --git a/vendor/psr/cache/src/CacheException.php b/vendor/psr/cache/src/CacheException.php new file mode 100644 index 0000000..bb785f4 --- /dev/null +++ b/vendor/psr/cache/src/CacheException.php @@ -0,0 +1,10 @@ +<?php + +namespace Psr\Cache; + +/** + * Exception interface for all exceptions thrown by an Implementing Library. + */ +interface CacheException extends \Throwable +{ +} diff --git a/vendor/psr/cache/src/CacheItemInterface.php b/vendor/psr/cache/src/CacheItemInterface.php new file mode 100644 index 0000000..2b2e4bb --- /dev/null +++ b/vendor/psr/cache/src/CacheItemInterface.php @@ -0,0 +1,105 @@ +<?php + +namespace Psr\Cache; + +/** + * CacheItemInterface defines an interface for interacting with objects inside a cache. + * + * Each Item object MUST be associated with a specific key, which can be set + * according to the implementing system and is typically passed by the + * Cache\CacheItemPoolInterface object. + * + * The Cache\CacheItemInterface object encapsulates the storage and retrieval of + * cache items. Each Cache\CacheItemInterface is generated by a + * Cache\CacheItemPoolInterface object, which is responsible for any required + * setup as well as associating the object with a unique Key. + * Cache\CacheItemInterface objects MUST be able to store and retrieve any type + * of PHP value defined in the Data section of the specification. + * + * Calling Libraries MUST NOT instantiate Item objects themselves. They may only + * be requested from a Pool object via the getItem() method. Calling Libraries + * SHOULD NOT assume that an Item created by one Implementing Library is + * compatible with a Pool from another Implementing Library. + */ +interface CacheItemInterface +{ + /** + * Returns the key for the current cache item. + * + * The key is loaded by the Implementing Library, but should be available to + * the higher level callers when needed. + * + * @return string + * The key string for this cache item. + */ + public function getKey(): string; + + /** + * Retrieves the value of the item from the cache associated with this object's key. + * + * The value returned must be identical to the value originally stored by set(). + * + * If isHit() returns false, this method MUST return null. Note that null + * is a legitimate cached value, so the isHit() method SHOULD be used to + * differentiate between "null value was found" and "no value was found." + * + * @return mixed + * The value corresponding to this cache item's key, or null if not found. + */ + public function get(): mixed; + + /** + * Confirms if the cache item lookup resulted in a cache hit. + * + * Note: This method MUST NOT have a race condition between calling isHit() + * and calling get(). + * + * @return bool + * True if the request resulted in a cache hit. False otherwise. + */ + public function isHit(): bool; + + /** + * Sets the value represented by this cache item. + * + * The $value argument may be any item that can be serialized by PHP, + * although the method of serialization is left up to the Implementing + * Library. + * + * @param mixed $value + * The serializable value to be stored. + * + * @return static + * The invoked object. + */ + public function set(mixed $value): static; + + /** + * Sets the expiration time for this cache item. + * + * @param ?\DateTimeInterface $expiration + * The point in time after which the item MUST be considered expired. + * If null is passed explicitly, a default value MAY be used. If none is set, + * the value should be stored permanently or for as long as the + * implementation allows. + * + * @return static + * The called object. + */ + public function expiresAt(?\DateTimeInterface $expiration): static; + + /** + * Sets the expiration time for this cache item. + * + * @param int|\DateInterval|null $time + * The period of time from the present after which the item MUST be considered + * expired. An integer parameter is understood to be the time in seconds until + * expiration. If null is passed explicitly, a default value MAY be used. + * If none is set, the value should be stored permanently or for as long as the + * implementation allows. + * + * @return static + * The called object. + */ + public function expiresAfter(int|\DateInterval|null $time): static; +} diff --git a/vendor/psr/cache/src/CacheItemPoolInterface.php b/vendor/psr/cache/src/CacheItemPoolInterface.php new file mode 100644 index 0000000..4b3017c --- /dev/null +++ b/vendor/psr/cache/src/CacheItemPoolInterface.php @@ -0,0 +1,138 @@ +<?php + +namespace Psr\Cache; + +/** + * CacheItemPoolInterface generates CacheItemInterface objects. + * + * The primary purpose of Cache\CacheItemPoolInterface is to accept a key from + * the Calling Library and return the associated Cache\CacheItemInterface object. + * It is also the primary point of interaction with the entire cache collection. + * All configuration and initialization of the Pool is left up to an + * Implementing Library. + */ +interface CacheItemPoolInterface +{ + /** + * Returns a Cache Item representing the specified key. + * + * This method must always return a CacheItemInterface object, even in case of + * a cache miss. It MUST NOT return null. + * + * @param string $key + * The key for which to return the corresponding Cache Item. + * + * @throws InvalidArgumentException + * If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException + * MUST be thrown. + * + * @return CacheItemInterface + * The corresponding Cache Item. + */ + public function getItem(string $key): CacheItemInterface; + + /** + * Returns a traversable set of cache items. + * + * @param string[] $keys + * An indexed array of keys of items to retrieve. + * + * @throws InvalidArgumentException + * If any of the keys in $keys are not a legal value a \Psr\Cache\InvalidArgumentException + * MUST be thrown. + * + * @return iterable + * An iterable collection of Cache Items keyed by the cache keys of + * each item. A Cache item will be returned for each key, even if that + * key is not found. However, if no keys are specified then an empty + * traversable MUST be returned instead. + */ + public function getItems(array $keys = []): iterable; + + /** + * Confirms if the cache contains specified cache item. + * + * Note: This method MAY avoid retrieving the cached value for performance reasons. + * This could result in a race condition with CacheItemInterface::get(). To avoid + * such situation use CacheItemInterface::isHit() instead. + * + * @param string $key + * The key for which to check existence. + * + * @throws InvalidArgumentException + * If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException + * MUST be thrown. + * + * @return bool + * True if item exists in the cache, false otherwise. + */ + public function hasItem(string $key): bool; + + /** + * Deletes all items in the pool. + * + * @return bool + * True if the pool was successfully cleared. False if there was an error. + */ + public function clear(): bool; + + /** + * Removes the item from the pool. + * + * @param string $key + * The key to delete. + * + * @throws InvalidArgumentException + * If the $key string is not a legal value a \Psr\Cache\InvalidArgumentException + * MUST be thrown. + * + * @return bool + * True if the item was successfully removed. False if there was an error. + */ + public function deleteItem(string $key): bool; + + /** + * Removes multiple items from the pool. + * + * @param string[] $keys + * An array of keys that should be removed from the pool. + * + * @throws InvalidArgumentException + * If any of the keys in $keys are not a legal value a \Psr\Cache\InvalidArgumentException + * MUST be thrown. + * + * @return bool + * True if the items were successfully removed. False if there was an error. + */ + public function deleteItems(array $keys): bool; + + /** + * Persists a cache item immediately. + * + * @param CacheItemInterface $item + * The cache item to save. + * + * @return bool + * True if the item was successfully persisted. False if there was an error. + */ + public function save(CacheItemInterface $item): bool; + + /** + * Sets a cache item to be persisted later. + * + * @param CacheItemInterface $item + * The cache item to save. + * + * @return bool + * False if the item could not be queued or if a commit was attempted and failed. True otherwise. + */ + public function saveDeferred(CacheItemInterface $item): bool; + + /** + * Persists any deferred cache items. + * + * @return bool + * True if all not-yet-saved items were successfully saved or there were none. False otherwise. + */ + public function commit(): bool; +} diff --git a/vendor/psr/cache/src/InvalidArgumentException.php b/vendor/psr/cache/src/InvalidArgumentException.php new file mode 100644 index 0000000..be7c6fa --- /dev/null +++ b/vendor/psr/cache/src/InvalidArgumentException.php @@ -0,0 +1,13 @@ +<?php + +namespace Psr\Cache; + +/** + * Exception interface for invalid cache arguments. + * + * Any time an invalid argument is passed into a method it must throw an + * exception class which implements Psr\Cache\InvalidArgumentException. + */ +interface InvalidArgumentException extends CacheException +{ +} diff --git a/vendor/psr/container/.gitignore b/vendor/psr/container/.gitignore new file mode 100644 index 0000000..b2395aa --- /dev/null +++ b/vendor/psr/container/.gitignore @@ -0,0 +1,3 @@ +composer.lock +composer.phar +/vendor/ diff --git a/vendor/psr/container/LICENSE b/vendor/psr/container/LICENSE new file mode 100644 index 0000000..2877a48 --- /dev/null +++ b/vendor/psr/container/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013-2016 container-interop +Copyright (c) 2016 PHP Framework Interoperability Group + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/psr/container/README.md b/vendor/psr/container/README.md new file mode 100644 index 0000000..1b9d9e5 --- /dev/null +++ b/vendor/psr/container/README.md @@ -0,0 +1,13 @@ +Container interface +============== + +This repository holds all interfaces related to [PSR-11 (Container Interface)][psr-url]. + +Note that this is not a Container implementation of its own. It is merely abstractions that describe the components of a Dependency Injection Container. + +The installable [package][package-url] and [implementations][implementation-url] are listed on Packagist. + +[psr-url]: https://www.php-fig.org/psr/psr-11/ +[package-url]: https://packagist.org/packages/psr/container +[implementation-url]: https://packagist.org/providers/psr/container-implementation + diff --git a/vendor/psr/container/composer.json b/vendor/psr/container/composer.json new file mode 100644 index 0000000..017f41e --- /dev/null +++ b/vendor/psr/container/composer.json @@ -0,0 +1,22 @@ +{ + "name": "psr/container", + "type": "library", + "description": "Common Container Interface (PHP FIG PSR-11)", + "keywords": ["psr", "psr-11", "container", "container-interop", "container-interface"], + "homepage": "https://github.com/php-fig/container", + "license": "MIT", + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "require": { + "php": ">=7.4.0" + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + } +} diff --git a/vendor/psr/container/src/ContainerExceptionInterface.php b/vendor/psr/container/src/ContainerExceptionInterface.php new file mode 100644 index 0000000..0f213f2 --- /dev/null +++ b/vendor/psr/container/src/ContainerExceptionInterface.php @@ -0,0 +1,12 @@ +<?php + +namespace Psr\Container; + +use Throwable; + +/** + * Base interface representing a generic exception in a container. + */ +interface ContainerExceptionInterface extends Throwable +{ +} diff --git a/vendor/psr/container/src/ContainerInterface.php b/vendor/psr/container/src/ContainerInterface.php new file mode 100644 index 0000000..cf8e7fd --- /dev/null +++ b/vendor/psr/container/src/ContainerInterface.php @@ -0,0 +1,36 @@ +<?php + +declare(strict_types=1); + +namespace Psr\Container; + +/** + * Describes the interface of a container that exposes methods to read its entries. + */ +interface ContainerInterface +{ + /** + * Finds an entry of the container by its identifier and returns it. + * + * @param string $id Identifier of the entry to look for. + * + * @throws NotFoundExceptionInterface No entry was found for **this** identifier. + * @throws ContainerExceptionInterface Error while retrieving the entry. + * + * @return mixed Entry. + */ + public function get(string $id); + + /** + * Returns true if the container can return an entry for the given identifier. + * Returns false otherwise. + * + * `has($id)` returning true does not mean that `get($id)` will not throw an exception. + * It does however mean that `get($id)` will not throw a `NotFoundExceptionInterface`. + * + * @param string $id Identifier of the entry to look for. + * + * @return bool + */ + public function has(string $id); +} diff --git a/vendor/psr/container/src/NotFoundExceptionInterface.php b/vendor/psr/container/src/NotFoundExceptionInterface.php new file mode 100644 index 0000000..650bf46 --- /dev/null +++ b/vendor/psr/container/src/NotFoundExceptionInterface.php @@ -0,0 +1,10 @@ +<?php + +namespace Psr\Container; + +/** + * No entry was found in the container. + */ +interface NotFoundExceptionInterface extends ContainerExceptionInterface +{ +} diff --git a/vendor/psr/http-client/CHANGELOG.md b/vendor/psr/http-client/CHANGELOG.md new file mode 100644 index 0000000..e2dc25f --- /dev/null +++ b/vendor/psr/http-client/CHANGELOG.md @@ -0,0 +1,23 @@ +# Changelog + +All notable changes to this project will be documented in this file, in reverse chronological order by release. + +## 1.0.1 + +Allow installation with PHP 8. No code changes. + +## 1.0.0 + +First stable release. No changes since 0.3.0. + +## 0.3.0 + +Added Interface suffix on exceptions + +## 0.2.0 + +All exceptions are in `Psr\Http\Client` namespace + +## 0.1.0 + +First release diff --git a/vendor/psr/http-client/LICENSE b/vendor/psr/http-client/LICENSE new file mode 100644 index 0000000..cd5e002 --- /dev/null +++ b/vendor/psr/http-client/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2017 PHP Framework Interoperability Group + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/psr/http-client/README.md b/vendor/psr/http-client/README.md new file mode 100644 index 0000000..6876b84 --- /dev/null +++ b/vendor/psr/http-client/README.md @@ -0,0 +1,12 @@ +HTTP Client +=========== + +This repository holds all the common code related to [PSR-18 (HTTP Client)][psr-url]. + +Note that this is not a HTTP Client implementation of its own. It is merely abstractions that describe the components of a HTTP Client. + +The installable [package][package-url] and [implementations][implementation-url] are listed on Packagist. + +[psr-url]: http://www.php-fig.org/psr/psr-18 +[package-url]: https://packagist.org/packages/psr/http-client +[implementation-url]: https://packagist.org/providers/psr/http-client-implementation diff --git a/vendor/psr/http-client/composer.json b/vendor/psr/http-client/composer.json new file mode 100644 index 0000000..c195f8f --- /dev/null +++ b/vendor/psr/http-client/composer.json @@ -0,0 +1,27 @@ +{ + "name": "psr/http-client", + "description": "Common interface for HTTP clients", + "keywords": ["psr", "psr-18", "http", "http-client"], + "homepage": "https://github.com/php-fig/http-client", + "license": "MIT", + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + } +} diff --git a/vendor/psr/http-client/src/ClientExceptionInterface.php b/vendor/psr/http-client/src/ClientExceptionInterface.php new file mode 100644 index 0000000..aa0b9cf --- /dev/null +++ b/vendor/psr/http-client/src/ClientExceptionInterface.php @@ -0,0 +1,10 @@ +<?php + +namespace Psr\Http\Client; + +/** + * Every HTTP client related exception MUST implement this interface. + */ +interface ClientExceptionInterface extends \Throwable +{ +} diff --git a/vendor/psr/http-client/src/ClientInterface.php b/vendor/psr/http-client/src/ClientInterface.php new file mode 100644 index 0000000..ad99fd4 --- /dev/null +++ b/vendor/psr/http-client/src/ClientInterface.php @@ -0,0 +1,20 @@ +<?php + +namespace Psr\Http\Client; + +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; + +interface ClientInterface +{ + /** + * Sends a PSR-7 request and returns a PSR-7 response. + * + * @param RequestInterface $request + * + * @return ResponseInterface + * + * @throws \Psr\Http\Client\ClientExceptionInterface If an error happens while processing the request. + */ + public function sendRequest(RequestInterface $request): ResponseInterface; +} diff --git a/vendor/psr/http-client/src/NetworkExceptionInterface.php b/vendor/psr/http-client/src/NetworkExceptionInterface.php new file mode 100644 index 0000000..4a11627 --- /dev/null +++ b/vendor/psr/http-client/src/NetworkExceptionInterface.php @@ -0,0 +1,24 @@ +<?php + +namespace Psr\Http\Client; + +use Psr\Http\Message\RequestInterface; + +/** + * Thrown when the request cannot be completed because of network issues. + * + * There is no response object as this exception is thrown when no response has been received. + * + * Example: the target host name can not be resolved or the connection failed. + */ +interface NetworkExceptionInterface extends ClientExceptionInterface +{ + /** + * Returns the request. + * + * The request object MAY be a different object from the one passed to ClientInterface::sendRequest() + * + * @return RequestInterface + */ + public function getRequest(): RequestInterface; +} diff --git a/vendor/psr/http-client/src/RequestExceptionInterface.php b/vendor/psr/http-client/src/RequestExceptionInterface.php new file mode 100644 index 0000000..b17fc34 --- /dev/null +++ b/vendor/psr/http-client/src/RequestExceptionInterface.php @@ -0,0 +1,24 @@ +<?php + +namespace Psr\Http\Client; + +use Psr\Http\Message\RequestInterface; + +/** + * Exception for when a request failed. + * + * Examples: + * - Request is invalid (e.g. method is missing) + * - Runtime request errors (e.g. the body stream is not seekable) + */ +interface RequestExceptionInterface extends ClientExceptionInterface +{ + /** + * Returns the request. + * + * The request object MAY be a different object from the one passed to ClientInterface::sendRequest() + * + * @return RequestInterface + */ + public function getRequest(): RequestInterface; +} diff --git a/vendor/psr/http-factory/.gitignore b/vendor/psr/http-factory/.gitignore new file mode 100644 index 0000000..d8a7996 --- /dev/null +++ b/vendor/psr/http-factory/.gitignore @@ -0,0 +1,2 @@ +composer.lock +vendor/ diff --git a/vendor/psr/http-factory/.pullapprove.yml b/vendor/psr/http-factory/.pullapprove.yml new file mode 100644 index 0000000..8cf0819 --- /dev/null +++ b/vendor/psr/http-factory/.pullapprove.yml @@ -0,0 +1,7 @@ +extends: default +reviewers: + - + name: contributors + required: 1 + teams: + - http-factory-contributors diff --git a/vendor/psr/http-factory/LICENSE b/vendor/psr/http-factory/LICENSE new file mode 100644 index 0000000..3f1559b --- /dev/null +++ b/vendor/psr/http-factory/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 PHP-FIG + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/psr/http-factory/README.md b/vendor/psr/http-factory/README.md new file mode 100644 index 0000000..41d362a --- /dev/null +++ b/vendor/psr/http-factory/README.md @@ -0,0 +1,10 @@ +HTTP Factories +============== + +This repository holds all interfaces related to [PSR-17 (HTTP Message Factories)][psr-17]. +Please refer to the specification for a description. + +You can find implementations of the specification by looking for packages providing the +[psr/http-factory-implementation](https://packagist.org/providers/psr/http-factory-implementation) virtual package. + +[psr-17]: https://www.php-fig.org/psr/psr-17/ diff --git a/vendor/psr/http-factory/composer.json b/vendor/psr/http-factory/composer.json new file mode 100644 index 0000000..af62b29 --- /dev/null +++ b/vendor/psr/http-factory/composer.json @@ -0,0 +1,35 @@ +{ + "name": "psr/http-factory", + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "psr", + "psr-7", + "psr-17", + "http", + "factory", + "message", + "request", + "response" + ], + "license": "MIT", + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + } +} diff --git a/vendor/psr/http-factory/src/RequestFactoryInterface.php b/vendor/psr/http-factory/src/RequestFactoryInterface.php new file mode 100644 index 0000000..cb39a08 --- /dev/null +++ b/vendor/psr/http-factory/src/RequestFactoryInterface.php @@ -0,0 +1,18 @@ +<?php + +namespace Psr\Http\Message; + +interface RequestFactoryInterface +{ + /** + * Create a new request. + * + * @param string $method The HTTP method associated with the request. + * @param UriInterface|string $uri The URI associated with the request. If + * the value is a string, the factory MUST create a UriInterface + * instance based on it. + * + * @return RequestInterface + */ + public function createRequest(string $method, $uri): RequestInterface; +} diff --git a/vendor/psr/http-factory/src/ResponseFactoryInterface.php b/vendor/psr/http-factory/src/ResponseFactoryInterface.php new file mode 100644 index 0000000..212562f --- /dev/null +++ b/vendor/psr/http-factory/src/ResponseFactoryInterface.php @@ -0,0 +1,18 @@ +<?php + +namespace Psr\Http\Message; + +interface ResponseFactoryInterface +{ + /** + * Create a new response. + * + * @param int $code HTTP status code; defaults to 200 + * @param string $reasonPhrase Reason phrase to associate with status code + * in generated response; if none is provided implementations MAY use + * the defaults as suggested in the HTTP specification. + * + * @return ResponseInterface + */ + public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface; +} diff --git a/vendor/psr/http-factory/src/ServerRequestFactoryInterface.php b/vendor/psr/http-factory/src/ServerRequestFactoryInterface.php new file mode 100644 index 0000000..9fe031a --- /dev/null +++ b/vendor/psr/http-factory/src/ServerRequestFactoryInterface.php @@ -0,0 +1,24 @@ +<?php + +namespace Psr\Http\Message; + +interface ServerRequestFactoryInterface +{ + /** + * Create a new server request. + * + * Note that server-params are taken precisely as given - no parsing/processing + * of the given values is performed, and, in particular, no attempt is made to + * determine the HTTP method or URI, which must be provided explicitly. + * + * @param string $method The HTTP method associated with the request. + * @param UriInterface|string $uri The URI associated with the request. If + * the value is a string, the factory MUST create a UriInterface + * instance based on it. + * @param array $serverParams Array of SAPI parameters with which to seed + * the generated request instance. + * + * @return ServerRequestInterface + */ + public function createServerRequest(string $method, $uri, array $serverParams = []): ServerRequestInterface; +} diff --git a/vendor/psr/http-factory/src/StreamFactoryInterface.php b/vendor/psr/http-factory/src/StreamFactoryInterface.php new file mode 100644 index 0000000..90e3240 --- /dev/null +++ b/vendor/psr/http-factory/src/StreamFactoryInterface.php @@ -0,0 +1,45 @@ +<?php + +namespace Psr\Http\Message; + +interface StreamFactoryInterface +{ + /** + * Create a new stream from a string. + * + * The stream SHOULD be created with a temporary resource. + * + * @param string $content String content with which to populate the stream. + * + * @return StreamInterface + */ + public function createStream(string $content = ''): StreamInterface; + + /** + * Create a stream from an existing file. + * + * The file MUST be opened using the given mode, which may be any mode + * supported by the `fopen` function. + * + * The `$filename` MAY be any string supported by `fopen()`. + * + * @param string $filename Filename or stream URI to use as basis of stream. + * @param string $mode Mode with which to open the underlying filename/stream. + * + * @return StreamInterface + * @throws \RuntimeException If the file cannot be opened. + * @throws \InvalidArgumentException If the mode is invalid. + */ + public function createStreamFromFile(string $filename, string $mode = 'r'): StreamInterface; + + /** + * Create a new stream from an existing resource. + * + * The stream MUST be readable and may be writable. + * + * @param resource $resource PHP resource to use as basis of stream. + * + * @return StreamInterface + */ + public function createStreamFromResource($resource): StreamInterface; +} diff --git a/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php b/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php new file mode 100644 index 0000000..7db4e30 --- /dev/null +++ b/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php @@ -0,0 +1,34 @@ +<?php + +namespace Psr\Http\Message; + +interface UploadedFileFactoryInterface +{ + /** + * Create a new uploaded file. + * + * If a size is not provided it will be determined by checking the size of + * the file. + * + * @see http://php.net/manual/features.file-upload.post-method.php + * @see http://php.net/manual/features.file-upload.errors.php + * + * @param StreamInterface $stream Underlying stream representing the + * uploaded file content. + * @param int $size in bytes + * @param int $error PHP file upload error + * @param string $clientFilename Filename as provided by the client, if any. + * @param string $clientMediaType Media type as provided by the client, if any. + * + * @return UploadedFileInterface + * + * @throws \InvalidArgumentException If the file resource is not readable. + */ + public function createUploadedFile( + StreamInterface $stream, + int $size = null, + int $error = \UPLOAD_ERR_OK, + string $clientFilename = null, + string $clientMediaType = null + ): UploadedFileInterface; +} diff --git a/vendor/psr/http-factory/src/UriFactoryInterface.php b/vendor/psr/http-factory/src/UriFactoryInterface.php new file mode 100644 index 0000000..06df0b4 --- /dev/null +++ b/vendor/psr/http-factory/src/UriFactoryInterface.php @@ -0,0 +1,17 @@ +<?php + +namespace Psr\Http\Message; + +interface UriFactoryInterface +{ + /** + * Create a new URI. + * + * @param string $uri + * + * @return UriInterface + * + * @throws \InvalidArgumentException If the given URI cannot be parsed. + */ + public function createUri(string $uri = ''): UriInterface; +} diff --git a/vendor/psr/http-message/CHANGELOG.md b/vendor/psr/http-message/CHANGELOG.md new file mode 100644 index 0000000..74b1ef9 --- /dev/null +++ b/vendor/psr/http-message/CHANGELOG.md @@ -0,0 +1,36 @@ +# Changelog + +All notable changes to this project will be documented in this file, in reverse chronological order by release. + +## 1.0.1 - 2016-08-06 + +### Added + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- Updated all `@return self` annotation references in interfaces to use + `@return static`, which more closelly follows the semantics of the + specification. +- Updated the `MessageInterface::getHeaders()` return annotation to use the + value `string[][]`, indicating the format is a nested array of strings. +- Updated the `@link` annotation for `RequestInterface::withRequestTarget()` + to point to the correct section of RFC 7230. +- Updated the `ServerRequestInterface::withUploadedFiles()` parameter annotation + to add the parameter name (`$uploadedFiles`). +- Updated a `@throws` annotation for the `UploadedFileInterface::moveTo()` + method to correctly reference the method parameter (it was referencing an + incorrect parameter name previously). + +## 1.0.0 - 2016-05-18 + +Initial stable release; reflects accepted PSR-7 specification. diff --git a/vendor/psr/http-message/LICENSE b/vendor/psr/http-message/LICENSE new file mode 100644 index 0000000..c2d8e45 --- /dev/null +++ b/vendor/psr/http-message/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014 PHP Framework Interoperability Group + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/psr/http-message/README.md b/vendor/psr/http-message/README.md new file mode 100644 index 0000000..2818533 --- /dev/null +++ b/vendor/psr/http-message/README.md @@ -0,0 +1,13 @@ +PSR Http Message +================ + +This repository holds all interfaces/classes/traits related to +[PSR-7](http://www.php-fig.org/psr/psr-7/). + +Note that this is not a HTTP message implementation of its own. It is merely an +interface that describes a HTTP message. See the specification for more details. + +Usage +----- + +We'll certainly need some stuff in here. \ No newline at end of file diff --git a/vendor/psr/http-message/composer.json b/vendor/psr/http-message/composer.json new file mode 100644 index 0000000..b0d2937 --- /dev/null +++ b/vendor/psr/http-message/composer.json @@ -0,0 +1,26 @@ +{ + "name": "psr/http-message", + "description": "Common interface for HTTP messages", + "keywords": ["psr", "psr-7", "http", "http-message", "request", "response"], + "homepage": "https://github.com/php-fig/http-message", + "license": "MIT", + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "require": { + "php": ">=5.3.0" + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + } +} diff --git a/vendor/psr/http-message/src/MessageInterface.php b/vendor/psr/http-message/src/MessageInterface.php new file mode 100644 index 0000000..dd46e5e --- /dev/null +++ b/vendor/psr/http-message/src/MessageInterface.php @@ -0,0 +1,187 @@ +<?php + +namespace Psr\Http\Message; + +/** + * HTTP messages consist of requests from a client to a server and responses + * from a server to a client. This interface defines the methods common to + * each. + * + * Messages are considered immutable; all methods that might change state MUST + * be implemented such that they retain the internal state of the current + * message and return an instance that contains the changed state. + * + * @link http://www.ietf.org/rfc/rfc7230.txt + * @link http://www.ietf.org/rfc/rfc7231.txt + */ +interface MessageInterface +{ + /** + * Retrieves the HTTP protocol version as a string. + * + * The string MUST contain only the HTTP version number (e.g., "1.1", "1.0"). + * + * @return string HTTP protocol version. + */ + public function getProtocolVersion(); + + /** + * Return an instance with the specified HTTP protocol version. + * + * The version string MUST contain only the HTTP version number (e.g., + * "1.1", "1.0"). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * new protocol version. + * + * @param string $version HTTP protocol version + * @return static + */ + public function withProtocolVersion($version); + + /** + * Retrieves all message header values. + * + * The keys represent the header name as it will be sent over the wire, and + * each value is an array of strings associated with the header. + * + * // Represent the headers as a string + * foreach ($message->getHeaders() as $name => $values) { + * echo $name . ": " . implode(", ", $values); + * } + * + * // Emit headers iteratively: + * foreach ($message->getHeaders() as $name => $values) { + * foreach ($values as $value) { + * header(sprintf('%s: %s', $name, $value), false); + * } + * } + * + * While header names are not case-sensitive, getHeaders() will preserve the + * exact case in which headers were originally specified. + * + * @return string[][] Returns an associative array of the message's headers. Each + * key MUST be a header name, and each value MUST be an array of strings + * for that header. + */ + public function getHeaders(); + + /** + * Checks if a header exists by the given case-insensitive name. + * + * @param string $name Case-insensitive header field name. + * @return bool Returns true if any header names match the given header + * name using a case-insensitive string comparison. Returns false if + * no matching header name is found in the message. + */ + public function hasHeader($name); + + /** + * Retrieves a message header value by the given case-insensitive name. + * + * This method returns an array of all the header values of the given + * case-insensitive header name. + * + * If the header does not appear in the message, this method MUST return an + * empty array. + * + * @param string $name Case-insensitive header field name. + * @return string[] An array of string values as provided for the given + * header. If the header does not appear in the message, this method MUST + * return an empty array. + */ + public function getHeader($name); + + /** + * Retrieves a comma-separated string of the values for a single header. + * + * This method returns all of the header values of the given + * case-insensitive header name as a string concatenated together using + * a comma. + * + * NOTE: Not all header values may be appropriately represented using + * comma concatenation. For such headers, use getHeader() instead + * and supply your own delimiter when concatenating. + * + * If the header does not appear in the message, this method MUST return + * an empty string. + * + * @param string $name Case-insensitive header field name. + * @return string A string of values as provided for the given header + * concatenated together using a comma. If the header does not appear in + * the message, this method MUST return an empty string. + */ + public function getHeaderLine($name); + + /** + * Return an instance with the provided value replacing the specified header. + * + * While header names are case-insensitive, the casing of the header will + * be preserved by this function, and returned from getHeaders(). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * new and/or updated header and value. + * + * @param string $name Case-insensitive header field name. + * @param string|string[] $value Header value(s). + * @return static + * @throws \InvalidArgumentException for invalid header names or values. + */ + public function withHeader($name, $value); + + /** + * Return an instance with the specified header appended with the given value. + * + * Existing values for the specified header will be maintained. The new + * value(s) will be appended to the existing list. If the header did not + * exist previously, it will be added. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * new header and/or value. + * + * @param string $name Case-insensitive header field name to add. + * @param string|string[] $value Header value(s). + * @return static + * @throws \InvalidArgumentException for invalid header names or values. + */ + public function withAddedHeader($name, $value); + + /** + * Return an instance without the specified header. + * + * Header resolution MUST be done without case-sensitivity. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that removes + * the named header. + * + * @param string $name Case-insensitive header field name to remove. + * @return static + */ + public function withoutHeader($name); + + /** + * Gets the body of the message. + * + * @return StreamInterface Returns the body as a stream. + */ + public function getBody(); + + /** + * Return an instance with the specified message body. + * + * The body MUST be a StreamInterface object. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return a new instance that has the + * new body stream. + * + * @param StreamInterface $body Body. + * @return static + * @throws \InvalidArgumentException When the body is not valid. + */ + public function withBody(StreamInterface $body); +} diff --git a/vendor/psr/http-message/src/RequestInterface.php b/vendor/psr/http-message/src/RequestInterface.php new file mode 100644 index 0000000..a96d4fd --- /dev/null +++ b/vendor/psr/http-message/src/RequestInterface.php @@ -0,0 +1,129 @@ +<?php + +namespace Psr\Http\Message; + +/** + * Representation of an outgoing, client-side request. + * + * Per the HTTP specification, this interface includes properties for + * each of the following: + * + * - Protocol version + * - HTTP method + * - URI + * - Headers + * - Message body + * + * During construction, implementations MUST attempt to set the Host header from + * a provided URI if no Host header is provided. + * + * Requests are considered immutable; all methods that might change state MUST + * be implemented such that they retain the internal state of the current + * message and return an instance that contains the changed state. + */ +interface RequestInterface extends MessageInterface +{ + /** + * Retrieves the message's request target. + * + * Retrieves the message's request-target either as it will appear (for + * clients), as it appeared at request (for servers), or as it was + * specified for the instance (see withRequestTarget()). + * + * In most cases, this will be the origin-form of the composed URI, + * unless a value was provided to the concrete implementation (see + * withRequestTarget() below). + * + * If no URI is available, and no request-target has been specifically + * provided, this method MUST return the string "/". + * + * @return string + */ + public function getRequestTarget(); + + /** + * Return an instance with the specific request-target. + * + * If the request needs a non-origin-form request-target — e.g., for + * specifying an absolute-form, authority-form, or asterisk-form — + * this method may be used to create an instance with the specified + * request-target, verbatim. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * changed request target. + * + * @link http://tools.ietf.org/html/rfc7230#section-5.3 (for the various + * request-target forms allowed in request messages) + * @param mixed $requestTarget + * @return static + */ + public function withRequestTarget($requestTarget); + + /** + * Retrieves the HTTP method of the request. + * + * @return string Returns the request method. + */ + public function getMethod(); + + /** + * Return an instance with the provided HTTP method. + * + * While HTTP method names are typically all uppercase characters, HTTP + * method names are case-sensitive and thus implementations SHOULD NOT + * modify the given string. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * changed request method. + * + * @param string $method Case-sensitive method. + * @return static + * @throws \InvalidArgumentException for invalid HTTP methods. + */ + public function withMethod($method); + + /** + * Retrieves the URI instance. + * + * This method MUST return a UriInterface instance. + * + * @link http://tools.ietf.org/html/rfc3986#section-4.3 + * @return UriInterface Returns a UriInterface instance + * representing the URI of the request. + */ + public function getUri(); + + /** + * Returns an instance with the provided URI. + * + * This method MUST update the Host header of the returned request by + * default if the URI contains a host component. If the URI does not + * contain a host component, any pre-existing Host header MUST be carried + * over to the returned request. + * + * You can opt-in to preserving the original state of the Host header by + * setting `$preserveHost` to `true`. When `$preserveHost` is set to + * `true`, this method interacts with the Host header in the following ways: + * + * - If the Host header is missing or empty, and the new URI contains + * a host component, this method MUST update the Host header in the returned + * request. + * - If the Host header is missing or empty, and the new URI does not contain a + * host component, this method MUST NOT update the Host header in the returned + * request. + * - If a Host header is present and non-empty, this method MUST NOT update + * the Host header in the returned request. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * new UriInterface instance. + * + * @link http://tools.ietf.org/html/rfc3986#section-4.3 + * @param UriInterface $uri New request URI to use. + * @param bool $preserveHost Preserve the original state of the Host header. + * @return static + */ + public function withUri(UriInterface $uri, $preserveHost = false); +} diff --git a/vendor/psr/http-message/src/ResponseInterface.php b/vendor/psr/http-message/src/ResponseInterface.php new file mode 100644 index 0000000..c306514 --- /dev/null +++ b/vendor/psr/http-message/src/ResponseInterface.php @@ -0,0 +1,68 @@ +<?php + +namespace Psr\Http\Message; + +/** + * Representation of an outgoing, server-side response. + * + * Per the HTTP specification, this interface includes properties for + * each of the following: + * + * - Protocol version + * - Status code and reason phrase + * - Headers + * - Message body + * + * Responses are considered immutable; all methods that might change state MUST + * be implemented such that they retain the internal state of the current + * message and return an instance that contains the changed state. + */ +interface ResponseInterface extends MessageInterface +{ + /** + * Gets the response status code. + * + * The status code is a 3-digit integer result code of the server's attempt + * to understand and satisfy the request. + * + * @return int Status code. + */ + public function getStatusCode(); + + /** + * Return an instance with the specified status code and, optionally, reason phrase. + * + * If no reason phrase is specified, implementations MAY choose to default + * to the RFC 7231 or IANA recommended reason phrase for the response's + * status code. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated status and reason phrase. + * + * @link http://tools.ietf.org/html/rfc7231#section-6 + * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml + * @param int $code The 3-digit integer result code to set. + * @param string $reasonPhrase The reason phrase to use with the + * provided status code; if none is provided, implementations MAY + * use the defaults as suggested in the HTTP specification. + * @return static + * @throws \InvalidArgumentException For invalid status code arguments. + */ + public function withStatus($code, $reasonPhrase = ''); + + /** + * Gets the response reason phrase associated with the status code. + * + * Because a reason phrase is not a required element in a response + * status line, the reason phrase value MAY be null. Implementations MAY + * choose to return the default RFC 7231 recommended reason phrase (or those + * listed in the IANA HTTP Status Code Registry) for the response's + * status code. + * + * @link http://tools.ietf.org/html/rfc7231#section-6 + * @link http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml + * @return string Reason phrase; must return an empty string if none present. + */ + public function getReasonPhrase(); +} diff --git a/vendor/psr/http-message/src/ServerRequestInterface.php b/vendor/psr/http-message/src/ServerRequestInterface.php new file mode 100644 index 0000000..0251234 --- /dev/null +++ b/vendor/psr/http-message/src/ServerRequestInterface.php @@ -0,0 +1,261 @@ +<?php + +namespace Psr\Http\Message; + +/** + * Representation of an incoming, server-side HTTP request. + * + * Per the HTTP specification, this interface includes properties for + * each of the following: + * + * - Protocol version + * - HTTP method + * - URI + * - Headers + * - Message body + * + * Additionally, it encapsulates all data as it has arrived to the + * application from the CGI and/or PHP environment, including: + * + * - The values represented in $_SERVER. + * - Any cookies provided (generally via $_COOKIE) + * - Query string arguments (generally via $_GET, or as parsed via parse_str()) + * - Upload files, if any (as represented by $_FILES) + * - Deserialized body parameters (generally from $_POST) + * + * $_SERVER values MUST be treated as immutable, as they represent application + * state at the time of request; as such, no methods are provided to allow + * modification of those values. The other values provide such methods, as they + * can be restored from $_SERVER or the request body, and may need treatment + * during the application (e.g., body parameters may be deserialized based on + * content type). + * + * Additionally, this interface recognizes the utility of introspecting a + * request to derive and match additional parameters (e.g., via URI path + * matching, decrypting cookie values, deserializing non-form-encoded body + * content, matching authorization headers to users, etc). These parameters + * are stored in an "attributes" property. + * + * Requests are considered immutable; all methods that might change state MUST + * be implemented such that they retain the internal state of the current + * message and return an instance that contains the changed state. + */ +interface ServerRequestInterface extends RequestInterface +{ + /** + * Retrieve server parameters. + * + * Retrieves data related to the incoming request environment, + * typically derived from PHP's $_SERVER superglobal. The data IS NOT + * REQUIRED to originate from $_SERVER. + * + * @return array + */ + public function getServerParams(); + + /** + * Retrieve cookies. + * + * Retrieves cookies sent by the client to the server. + * + * The data MUST be compatible with the structure of the $_COOKIE + * superglobal. + * + * @return array + */ + public function getCookieParams(); + + /** + * Return an instance with the specified cookies. + * + * The data IS NOT REQUIRED to come from the $_COOKIE superglobal, but MUST + * be compatible with the structure of $_COOKIE. Typically, this data will + * be injected at instantiation. + * + * This method MUST NOT update the related Cookie header of the request + * instance, nor related values in the server params. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated cookie values. + * + * @param array $cookies Array of key/value pairs representing cookies. + * @return static + */ + public function withCookieParams(array $cookies); + + /** + * Retrieve query string arguments. + * + * Retrieves the deserialized query string arguments, if any. + * + * Note: the query params might not be in sync with the URI or server + * params. If you need to ensure you are only getting the original + * values, you may need to parse the query string from `getUri()->getQuery()` + * or from the `QUERY_STRING` server param. + * + * @return array + */ + public function getQueryParams(); + + /** + * Return an instance with the specified query string arguments. + * + * These values SHOULD remain immutable over the course of the incoming + * request. They MAY be injected during instantiation, such as from PHP's + * $_GET superglobal, or MAY be derived from some other value such as the + * URI. In cases where the arguments are parsed from the URI, the data + * MUST be compatible with what PHP's parse_str() would return for + * purposes of how duplicate query parameters are handled, and how nested + * sets are handled. + * + * Setting query string arguments MUST NOT change the URI stored by the + * request, nor the values in the server params. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated query string arguments. + * + * @param array $query Array of query string arguments, typically from + * $_GET. + * @return static + */ + public function withQueryParams(array $query); + + /** + * Retrieve normalized file upload data. + * + * This method returns upload metadata in a normalized tree, with each leaf + * an instance of Psr\Http\Message\UploadedFileInterface. + * + * These values MAY be prepared from $_FILES or the message body during + * instantiation, or MAY be injected via withUploadedFiles(). + * + * @return array An array tree of UploadedFileInterface instances; an empty + * array MUST be returned if no data is present. + */ + public function getUploadedFiles(); + + /** + * Create a new instance with the specified uploaded files. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated body parameters. + * + * @param array $uploadedFiles An array tree of UploadedFileInterface instances. + * @return static + * @throws \InvalidArgumentException if an invalid structure is provided. + */ + public function withUploadedFiles(array $uploadedFiles); + + /** + * Retrieve any parameters provided in the request body. + * + * If the request Content-Type is either application/x-www-form-urlencoded + * or multipart/form-data, and the request method is POST, this method MUST + * return the contents of $_POST. + * + * Otherwise, this method may return any results of deserializing + * the request body content; as parsing returns structured content, the + * potential types MUST be arrays or objects only. A null value indicates + * the absence of body content. + * + * @return null|array|object The deserialized body parameters, if any. + * These will typically be an array or object. + */ + public function getParsedBody(); + + /** + * Return an instance with the specified body parameters. + * + * These MAY be injected during instantiation. + * + * If the request Content-Type is either application/x-www-form-urlencoded + * or multipart/form-data, and the request method is POST, use this method + * ONLY to inject the contents of $_POST. + * + * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of + * deserializing the request body content. Deserialization/parsing returns + * structured data, and, as such, this method ONLY accepts arrays or objects, + * or a null value if nothing was available to parse. + * + * As an example, if content negotiation determines that the request data + * is a JSON payload, this method could be used to create a request + * instance with the deserialized parameters. + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated body parameters. + * + * @param null|array|object $data The deserialized body data. This will + * typically be in an array or object. + * @return static + * @throws \InvalidArgumentException if an unsupported argument type is + * provided. + */ + public function withParsedBody($data); + + /** + * Retrieve attributes derived from the request. + * + * The request "attributes" may be used to allow injection of any + * parameters derived from the request: e.g., the results of path + * match operations; the results of decrypting cookies; the results of + * deserializing non-form-encoded message bodies; etc. Attributes + * will be application and request specific, and CAN be mutable. + * + * @return array Attributes derived from the request. + */ + public function getAttributes(); + + /** + * Retrieve a single derived request attribute. + * + * Retrieves a single derived request attribute as described in + * getAttributes(). If the attribute has not been previously set, returns + * the default value as provided. + * + * This method obviates the need for a hasAttribute() method, as it allows + * specifying a default value to return if the attribute is not found. + * + * @see getAttributes() + * @param string $name The attribute name. + * @param mixed $default Default value to return if the attribute does not exist. + * @return mixed + */ + public function getAttribute($name, $default = null); + + /** + * Return an instance with the specified derived request attribute. + * + * This method allows setting a single derived request attribute as + * described in getAttributes(). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that has the + * updated attribute. + * + * @see getAttributes() + * @param string $name The attribute name. + * @param mixed $value The value of the attribute. + * @return static + */ + public function withAttribute($name, $value); + + /** + * Return an instance that removes the specified derived request attribute. + * + * This method allows removing a single derived request attribute as + * described in getAttributes(). + * + * This method MUST be implemented in such a way as to retain the + * immutability of the message, and MUST return an instance that removes + * the attribute. + * + * @see getAttributes() + * @param string $name The attribute name. + * @return static + */ + public function withoutAttribute($name); +} diff --git a/vendor/psr/http-message/src/StreamInterface.php b/vendor/psr/http-message/src/StreamInterface.php new file mode 100644 index 0000000..f68f391 --- /dev/null +++ b/vendor/psr/http-message/src/StreamInterface.php @@ -0,0 +1,158 @@ +<?php + +namespace Psr\Http\Message; + +/** + * Describes a data stream. + * + * Typically, an instance will wrap a PHP stream; this interface provides + * a wrapper around the most common operations, including serialization of + * the entire stream to a string. + */ +interface StreamInterface +{ + /** + * Reads all data from the stream into a string, from the beginning to end. + * + * This method MUST attempt to seek to the beginning of the stream before + * reading data and read the stream until the end is reached. + * + * Warning: This could attempt to load a large amount of data into memory. + * + * This method MUST NOT raise an exception in order to conform with PHP's + * string casting operations. + * + * @see http://php.net/manual/en/language.oop5.magic.php#object.tostring + * @return string + */ + public function __toString(); + + /** + * Closes the stream and any underlying resources. + * + * @return void + */ + public function close(); + + /** + * Separates any underlying resources from the stream. + * + * After the stream has been detached, the stream is in an unusable state. + * + * @return resource|null Underlying PHP stream, if any + */ + public function detach(); + + /** + * Get the size of the stream if known. + * + * @return int|null Returns the size in bytes if known, or null if unknown. + */ + public function getSize(); + + /** + * Returns the current position of the file read/write pointer + * + * @return int Position of the file pointer + * @throws \RuntimeException on error. + */ + public function tell(); + + /** + * Returns true if the stream is at the end of the stream. + * + * @return bool + */ + public function eof(); + + /** + * Returns whether or not the stream is seekable. + * + * @return bool + */ + public function isSeekable(); + + /** + * Seek to a position in the stream. + * + * @link http://www.php.net/manual/en/function.fseek.php + * @param int $offset Stream offset + * @param int $whence Specifies how the cursor position will be calculated + * based on the seek offset. Valid values are identical to the built-in + * PHP $whence values for `fseek()`. SEEK_SET: Set position equal to + * offset bytes SEEK_CUR: Set position to current location plus offset + * SEEK_END: Set position to end-of-stream plus offset. + * @throws \RuntimeException on failure. + */ + public function seek($offset, $whence = SEEK_SET); + + /** + * Seek to the beginning of the stream. + * + * If the stream is not seekable, this method will raise an exception; + * otherwise, it will perform a seek(0). + * + * @see seek() + * @link http://www.php.net/manual/en/function.fseek.php + * @throws \RuntimeException on failure. + */ + public function rewind(); + + /** + * Returns whether or not the stream is writable. + * + * @return bool + */ + public function isWritable(); + + /** + * Write data to the stream. + * + * @param string $string The string that is to be written. + * @return int Returns the number of bytes written to the stream. + * @throws \RuntimeException on failure. + */ + public function write($string); + + /** + * Returns whether or not the stream is readable. + * + * @return bool + */ + public function isReadable(); + + /** + * Read data from the stream. + * + * @param int $length Read up to $length bytes from the object and return + * them. Fewer than $length bytes may be returned if underlying stream + * call returns fewer bytes. + * @return string Returns the data read from the stream, or an empty string + * if no bytes are available. + * @throws \RuntimeException if an error occurs. + */ + public function read($length); + + /** + * Returns the remaining contents in a string + * + * @return string + * @throws \RuntimeException if unable to read or an error occurs while + * reading. + */ + public function getContents(); + + /** + * Get stream metadata as an associative array or retrieve a specific key. + * + * The keys returned are identical to the keys returned from PHP's + * stream_get_meta_data() function. + * + * @link http://php.net/manual/en/function.stream-get-meta-data.php + * @param string $key Specific metadata to retrieve. + * @return array|mixed|null Returns an associative array if no key is + * provided. Returns a specific key value if a key is provided and the + * value is found, or null if the key is not found. + */ + public function getMetadata($key = null); +} diff --git a/vendor/psr/http-message/src/UploadedFileInterface.php b/vendor/psr/http-message/src/UploadedFileInterface.php new file mode 100644 index 0000000..f8a6901 --- /dev/null +++ b/vendor/psr/http-message/src/UploadedFileInterface.php @@ -0,0 +1,123 @@ +<?php + +namespace Psr\Http\Message; + +/** + * Value object representing a file uploaded through an HTTP request. + * + * Instances of this interface are considered immutable; all methods that + * might change state MUST be implemented such that they retain the internal + * state of the current instance and return an instance that contains the + * changed state. + */ +interface UploadedFileInterface +{ + /** + * Retrieve a stream representing the uploaded file. + * + * This method MUST return a StreamInterface instance, representing the + * uploaded file. The purpose of this method is to allow utilizing native PHP + * stream functionality to manipulate the file upload, such as + * stream_copy_to_stream() (though the result will need to be decorated in a + * native PHP stream wrapper to work with such functions). + * + * If the moveTo() method has been called previously, this method MUST raise + * an exception. + * + * @return StreamInterface Stream representation of the uploaded file. + * @throws \RuntimeException in cases when no stream is available or can be + * created. + */ + public function getStream(); + + /** + * Move the uploaded file to a new location. + * + * Use this method as an alternative to move_uploaded_file(). This method is + * guaranteed to work in both SAPI and non-SAPI environments. + * Implementations must determine which environment they are in, and use the + * appropriate method (move_uploaded_file(), rename(), or a stream + * operation) to perform the operation. + * + * $targetPath may be an absolute path, or a relative path. If it is a + * relative path, resolution should be the same as used by PHP's rename() + * function. + * + * The original file or stream MUST be removed on completion. + * + * If this method is called more than once, any subsequent calls MUST raise + * an exception. + * + * When used in an SAPI environment where $_FILES is populated, when writing + * files via moveTo(), is_uploaded_file() and move_uploaded_file() SHOULD be + * used to ensure permissions and upload status are verified correctly. + * + * If you wish to move to a stream, use getStream(), as SAPI operations + * cannot guarantee writing to stream destinations. + * + * @see http://php.net/is_uploaded_file + * @see http://php.net/move_uploaded_file + * @param string $targetPath Path to which to move the uploaded file. + * @throws \InvalidArgumentException if the $targetPath specified is invalid. + * @throws \RuntimeException on any error during the move operation, or on + * the second or subsequent call to the method. + */ + public function moveTo($targetPath); + + /** + * Retrieve the file size. + * + * Implementations SHOULD return the value stored in the "size" key of + * the file in the $_FILES array if available, as PHP calculates this based + * on the actual size transmitted. + * + * @return int|null The file size in bytes or null if unknown. + */ + public function getSize(); + + /** + * Retrieve the error associated with the uploaded file. + * + * The return value MUST be one of PHP's UPLOAD_ERR_XXX constants. + * + * If the file was uploaded successfully, this method MUST return + * UPLOAD_ERR_OK. + * + * Implementations SHOULD return the value stored in the "error" key of + * the file in the $_FILES array. + * + * @see http://php.net/manual/en/features.file-upload.errors.php + * @return int One of PHP's UPLOAD_ERR_XXX constants. + */ + public function getError(); + + /** + * Retrieve the filename sent by the client. + * + * Do not trust the value returned by this method. A client could send + * a malicious filename with the intention to corrupt or hack your + * application. + * + * Implementations SHOULD return the value stored in the "name" key of + * the file in the $_FILES array. + * + * @return string|null The filename sent by the client or null if none + * was provided. + */ + public function getClientFilename(); + + /** + * Retrieve the media type sent by the client. + * + * Do not trust the value returned by this method. A client could send + * a malicious media type with the intention to corrupt or hack your + * application. + * + * Implementations SHOULD return the value stored in the "type" key of + * the file in the $_FILES array. + * + * @return string|null The media type sent by the client or null if none + * was provided. + */ + public function getClientMediaType(); +} diff --git a/vendor/psr/http-message/src/UriInterface.php b/vendor/psr/http-message/src/UriInterface.php new file mode 100644 index 0000000..9d7ab9e --- /dev/null +++ b/vendor/psr/http-message/src/UriInterface.php @@ -0,0 +1,323 @@ +<?php +namespace Psr\Http\Message; + +/** + * Value object representing a URI. + * + * This interface is meant to represent URIs according to RFC 3986 and to + * provide methods for most common operations. Additional functionality for + * working with URIs can be provided on top of the interface or externally. + * Its primary use is for HTTP requests, but may also be used in other + * contexts. + * + * Instances of this interface are considered immutable; all methods that + * might change state MUST be implemented such that they retain the internal + * state of the current instance and return an instance that contains the + * changed state. + * + * Typically the Host header will be also be present in the request message. + * For server-side requests, the scheme will typically be discoverable in the + * server parameters. + * + * @link http://tools.ietf.org/html/rfc3986 (the URI specification) + */ +interface UriInterface +{ + /** + * Retrieve the scheme component of the URI. + * + * If no scheme is present, this method MUST return an empty string. + * + * The value returned MUST be normalized to lowercase, per RFC 3986 + * Section 3.1. + * + * The trailing ":" character is not part of the scheme and MUST NOT be + * added. + * + * @see https://tools.ietf.org/html/rfc3986#section-3.1 + * @return string The URI scheme. + */ + public function getScheme(); + + /** + * Retrieve the authority component of the URI. + * + * If no authority information is present, this method MUST return an empty + * string. + * + * The authority syntax of the URI is: + * + * <pre> + * [user-info@]host[:port] + * </pre> + * + * If the port component is not set or is the standard port for the current + * scheme, it SHOULD NOT be included. + * + * @see https://tools.ietf.org/html/rfc3986#section-3.2 + * @return string The URI authority, in "[user-info@]host[:port]" format. + */ + public function getAuthority(); + + /** + * Retrieve the user information component of the URI. + * + * If no user information is present, this method MUST return an empty + * string. + * + * If a user is present in the URI, this will return that value; + * additionally, if the password is also present, it will be appended to the + * user value, with a colon (":") separating the values. + * + * The trailing "@" character is not part of the user information and MUST + * NOT be added. + * + * @return string The URI user information, in "username[:password]" format. + */ + public function getUserInfo(); + + /** + * Retrieve the host component of the URI. + * + * If no host is present, this method MUST return an empty string. + * + * The value returned MUST be normalized to lowercase, per RFC 3986 + * Section 3.2.2. + * + * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 + * @return string The URI host. + */ + public function getHost(); + + /** + * Retrieve the port component of the URI. + * + * If a port is present, and it is non-standard for the current scheme, + * this method MUST return it as an integer. If the port is the standard port + * used with the current scheme, this method SHOULD return null. + * + * If no port is present, and no scheme is present, this method MUST return + * a null value. + * + * If no port is present, but a scheme is present, this method MAY return + * the standard port for that scheme, but SHOULD return null. + * + * @return null|int The URI port. + */ + public function getPort(); + + /** + * Retrieve the path component of the URI. + * + * The path can either be empty or absolute (starting with a slash) or + * rootless (not starting with a slash). Implementations MUST support all + * three syntaxes. + * + * Normally, the empty path "" and absolute path "/" are considered equal as + * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically + * do this normalization because in contexts with a trimmed base path, e.g. + * the front controller, this difference becomes significant. It's the task + * of the user to handle both "" and "/". + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.3. + * + * As an example, if the value should include a slash ("/") not intended as + * delimiter between path segments, that value MUST be passed in encoded + * form (e.g., "%2F") to the instance. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.3 + * @return string The URI path. + */ + public function getPath(); + + /** + * Retrieve the query string of the URI. + * + * If no query string is present, this method MUST return an empty string. + * + * The leading "?" character is not part of the query and MUST NOT be + * added. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.4. + * + * As an example, if a value in a key/value pair of the query string should + * include an ampersand ("&") not intended as a delimiter between values, + * that value MUST be passed in encoded form (e.g., "%26") to the instance. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.4 + * @return string The URI query string. + */ + public function getQuery(); + + /** + * Retrieve the fragment component of the URI. + * + * If no fragment is present, this method MUST return an empty string. + * + * The leading "#" character is not part of the fragment and MUST NOT be + * added. + * + * The value returned MUST be percent-encoded, but MUST NOT double-encode + * any characters. To determine what characters to encode, please refer to + * RFC 3986, Sections 2 and 3.5. + * + * @see https://tools.ietf.org/html/rfc3986#section-2 + * @see https://tools.ietf.org/html/rfc3986#section-3.5 + * @return string The URI fragment. + */ + public function getFragment(); + + /** + * Return an instance with the specified scheme. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified scheme. + * + * Implementations MUST support the schemes "http" and "https" case + * insensitively, and MAY accommodate other schemes if required. + * + * An empty scheme is equivalent to removing the scheme. + * + * @param string $scheme The scheme to use with the new instance. + * @return static A new instance with the specified scheme. + * @throws \InvalidArgumentException for invalid or unsupported schemes. + */ + public function withScheme($scheme); + + /** + * Return an instance with the specified user information. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified user information. + * + * Password is optional, but the user information MUST include the + * user; an empty string for the user is equivalent to removing user + * information. + * + * @param string $user The user name to use for authority. + * @param null|string $password The password associated with $user. + * @return static A new instance with the specified user information. + */ + public function withUserInfo($user, $password = null); + + /** + * Return an instance with the specified host. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified host. + * + * An empty host value is equivalent to removing the host. + * + * @param string $host The hostname to use with the new instance. + * @return static A new instance with the specified host. + * @throws \InvalidArgumentException for invalid hostnames. + */ + public function withHost($host); + + /** + * Return an instance with the specified port. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified port. + * + * Implementations MUST raise an exception for ports outside the + * established TCP and UDP port ranges. + * + * A null value provided for the port is equivalent to removing the port + * information. + * + * @param null|int $port The port to use with the new instance; a null value + * removes the port information. + * @return static A new instance with the specified port. + * @throws \InvalidArgumentException for invalid ports. + */ + public function withPort($port); + + /** + * Return an instance with the specified path. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified path. + * + * The path can either be empty or absolute (starting with a slash) or + * rootless (not starting with a slash). Implementations MUST support all + * three syntaxes. + * + * If the path is intended to be domain-relative rather than path relative then + * it must begin with a slash ("/"). Paths not starting with a slash ("/") + * are assumed to be relative to some base path known to the application or + * consumer. + * + * Users can provide both encoded and decoded path characters. + * Implementations ensure the correct encoding as outlined in getPath(). + * + * @param string $path The path to use with the new instance. + * @return static A new instance with the specified path. + * @throws \InvalidArgumentException for invalid paths. + */ + public function withPath($path); + + /** + * Return an instance with the specified query string. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified query string. + * + * Users can provide both encoded and decoded query characters. + * Implementations ensure the correct encoding as outlined in getQuery(). + * + * An empty query string value is equivalent to removing the query string. + * + * @param string $query The query string to use with the new instance. + * @return static A new instance with the specified query string. + * @throws \InvalidArgumentException for invalid query strings. + */ + public function withQuery($query); + + /** + * Return an instance with the specified URI fragment. + * + * This method MUST retain the state of the current instance, and return + * an instance that contains the specified URI fragment. + * + * Users can provide both encoded and decoded fragment characters. + * Implementations ensure the correct encoding as outlined in getFragment(). + * + * An empty fragment value is equivalent to removing the fragment. + * + * @param string $fragment The fragment to use with the new instance. + * @return static A new instance with the specified fragment. + */ + public function withFragment($fragment); + + /** + * Return the string representation as a URI reference. + * + * Depending on which components of the URI are present, the resulting + * string is either a full URI or relative reference according to RFC 3986, + * Section 4.1. The method concatenates the various components of the URI, + * using the appropriate delimiters: + * + * - If a scheme is present, it MUST be suffixed by ":". + * - If an authority is present, it MUST be prefixed by "//". + * - The path can be concatenated without delimiters. But there are two + * cases where the path has to be adjusted to make the URI reference + * valid as PHP does not allow to throw an exception in __toString(): + * - If the path is rootless and an authority is present, the path MUST + * be prefixed by "/". + * - If the path is starting with more than one "/" and no authority is + * present, the starting slashes MUST be reduced to one. + * - If a query is present, it MUST be prefixed by "?". + * - If a fragment is present, it MUST be prefixed by "#". + * + * @see http://tools.ietf.org/html/rfc3986#section-4.1 + * @return string + */ + public function __toString(); +} diff --git a/vendor/psr/log/LICENSE b/vendor/psr/log/LICENSE new file mode 100644 index 0000000..474c952 --- /dev/null +++ b/vendor/psr/log/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2012 PHP Framework Interoperability Group + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/psr/log/README.md b/vendor/psr/log/README.md new file mode 100644 index 0000000..a9f20c4 --- /dev/null +++ b/vendor/psr/log/README.md @@ -0,0 +1,58 @@ +PSR Log +======= + +This repository holds all interfaces/classes/traits related to +[PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md). + +Note that this is not a logger of its own. It is merely an interface that +describes a logger. See the specification for more details. + +Installation +------------ + +```bash +composer require psr/log +``` + +Usage +----- + +If you need a logger, you can use the interface like this: + +```php +<?php + +use Psr\Log\LoggerInterface; + +class Foo +{ + private $logger; + + public function __construct(LoggerInterface $logger = null) + { + $this->logger = $logger; + } + + public function doSomething() + { + if ($this->logger) { + $this->logger->info('Doing work'); + } + + try { + $this->doSomethingElse(); + } catch (Exception $exception) { + $this->logger->error('Oh no!', array('exception' => $exception)); + } + + // do something useful + } +} +``` + +You can then pick one of the implementations of the interface to get a logger. + +If you want to implement the interface, you can require this package and +implement `Psr\Log\LoggerInterface` in your code. Please read the +[specification text](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) +for details. diff --git a/vendor/psr/log/composer.json b/vendor/psr/log/composer.json new file mode 100644 index 0000000..879fc6f --- /dev/null +++ b/vendor/psr/log/composer.json @@ -0,0 +1,26 @@ +{ + "name": "psr/log", + "description": "Common interface for logging libraries", + "keywords": ["psr", "psr-3", "log"], + "homepage": "https://github.com/php-fig/log", + "license": "MIT", + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "require": { + "php": ">=8.0.0" + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + } +} diff --git a/vendor/psr/log/src/AbstractLogger.php b/vendor/psr/log/src/AbstractLogger.php new file mode 100644 index 0000000..d60a091 --- /dev/null +++ b/vendor/psr/log/src/AbstractLogger.php @@ -0,0 +1,15 @@ +<?php + +namespace Psr\Log; + +/** + * This is a simple Logger implementation that other Loggers can inherit from. + * + * It simply delegates all log-level-specific methods to the `log` method to + * reduce boilerplate code that a simple Logger that does the same thing with + * messages regardless of the error level has to implement. + */ +abstract class AbstractLogger implements LoggerInterface +{ + use LoggerTrait; +} diff --git a/vendor/psr/log/src/InvalidArgumentException.php b/vendor/psr/log/src/InvalidArgumentException.php new file mode 100644 index 0000000..67f852d --- /dev/null +++ b/vendor/psr/log/src/InvalidArgumentException.php @@ -0,0 +1,7 @@ +<?php + +namespace Psr\Log; + +class InvalidArgumentException extends \InvalidArgumentException +{ +} diff --git a/vendor/psr/log/src/LogLevel.php b/vendor/psr/log/src/LogLevel.php new file mode 100644 index 0000000..9cebcac --- /dev/null +++ b/vendor/psr/log/src/LogLevel.php @@ -0,0 +1,18 @@ +<?php + +namespace Psr\Log; + +/** + * Describes log levels. + */ +class LogLevel +{ + const EMERGENCY = 'emergency'; + const ALERT = 'alert'; + const CRITICAL = 'critical'; + const ERROR = 'error'; + const WARNING = 'warning'; + const NOTICE = 'notice'; + const INFO = 'info'; + const DEBUG = 'debug'; +} diff --git a/vendor/psr/log/src/LoggerAwareInterface.php b/vendor/psr/log/src/LoggerAwareInterface.php new file mode 100644 index 0000000..cc46a95 --- /dev/null +++ b/vendor/psr/log/src/LoggerAwareInterface.php @@ -0,0 +1,18 @@ +<?php + +namespace Psr\Log; + +/** + * Describes a logger-aware instance. + */ +interface LoggerAwareInterface +{ + /** + * Sets a logger instance on the object. + * + * @param LoggerInterface $logger + * + * @return void + */ + public function setLogger(LoggerInterface $logger): void; +} diff --git a/vendor/psr/log/src/LoggerAwareTrait.php b/vendor/psr/log/src/LoggerAwareTrait.php new file mode 100644 index 0000000..4fb57a2 --- /dev/null +++ b/vendor/psr/log/src/LoggerAwareTrait.php @@ -0,0 +1,26 @@ +<?php + +namespace Psr\Log; + +/** + * Basic Implementation of LoggerAwareInterface. + */ +trait LoggerAwareTrait +{ + /** + * The logger instance. + * + * @var LoggerInterface|null + */ + protected ?LoggerInterface $logger = null; + + /** + * Sets a logger. + * + * @param LoggerInterface $logger + */ + public function setLogger(LoggerInterface $logger): void + { + $this->logger = $logger; + } +} diff --git a/vendor/psr/log/src/LoggerInterface.php b/vendor/psr/log/src/LoggerInterface.php new file mode 100644 index 0000000..b3a24b5 --- /dev/null +++ b/vendor/psr/log/src/LoggerInterface.php @@ -0,0 +1,125 @@ +<?php + +namespace Psr\Log; + +/** + * Describes a logger instance. + * + * The message MUST be a string or object implementing __toString(). + * + * The message MAY contain placeholders in the form: {foo} where foo + * will be replaced by the context data in key "foo". + * + * The context array can contain arbitrary data. The only assumption that + * can be made by implementors is that if an Exception instance is given + * to produce a stack trace, it MUST be in a key named "exception". + * + * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md + * for the full interface specification. + */ +interface LoggerInterface +{ + /** + * System is unusable. + * + * @param string|\Stringable $message + * @param mixed[] $context + * + * @return void + */ + public function emergency(string|\Stringable $message, array $context = []): void; + + /** + * Action must be taken immediately. + * + * Example: Entire website down, database unavailable, etc. This should + * trigger the SMS alerts and wake you up. + * + * @param string|\Stringable $message + * @param mixed[] $context + * + * @return void + */ + public function alert(string|\Stringable $message, array $context = []): void; + + /** + * Critical conditions. + * + * Example: Application component unavailable, unexpected exception. + * + * @param string|\Stringable $message + * @param mixed[] $context + * + * @return void + */ + public function critical(string|\Stringable $message, array $context = []): void; + + /** + * Runtime errors that do not require immediate action but should typically + * be logged and monitored. + * + * @param string|\Stringable $message + * @param mixed[] $context + * + * @return void + */ + public function error(string|\Stringable $message, array $context = []): void; + + /** + * Exceptional occurrences that are not errors. + * + * Example: Use of deprecated APIs, poor use of an API, undesirable things + * that are not necessarily wrong. + * + * @param string|\Stringable $message + * @param mixed[] $context + * + * @return void + */ + public function warning(string|\Stringable $message, array $context = []): void; + + /** + * Normal but significant events. + * + * @param string|\Stringable $message + * @param mixed[] $context + * + * @return void + */ + public function notice(string|\Stringable $message, array $context = []): void; + + /** + * Interesting events. + * + * Example: User logs in, SQL logs. + * + * @param string|\Stringable $message + * @param mixed[] $context + * + * @return void + */ + public function info(string|\Stringable $message, array $context = []): void; + + /** + * Detailed debug information. + * + * @param string|\Stringable $message + * @param mixed[] $context + * + * @return void + */ + public function debug(string|\Stringable $message, array $context = []): void; + + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string|\Stringable $message + * @param mixed[] $context + * + * @return void + * + * @throws \Psr\Log\InvalidArgumentException + */ + public function log($level, string|\Stringable $message, array $context = []): void; +} diff --git a/vendor/psr/log/src/LoggerTrait.php b/vendor/psr/log/src/LoggerTrait.php new file mode 100644 index 0000000..9c8733f --- /dev/null +++ b/vendor/psr/log/src/LoggerTrait.php @@ -0,0 +1,142 @@ +<?php + +namespace Psr\Log; + +/** + * This is a simple Logger trait that classes unable to extend AbstractLogger + * (because they extend another class, etc) can include. + * + * It simply delegates all log-level-specific methods to the `log` method to + * reduce boilerplate code that a simple Logger that does the same thing with + * messages regardless of the error level has to implement. + */ +trait LoggerTrait +{ + /** + * System is unusable. + * + * @param string|\Stringable $message + * @param array $context + * + * @return void + */ + public function emergency(string|\Stringable $message, array $context = []): void + { + $this->log(LogLevel::EMERGENCY, $message, $context); + } + + /** + * Action must be taken immediately. + * + * Example: Entire website down, database unavailable, etc. This should + * trigger the SMS alerts and wake you up. + * + * @param string|\Stringable $message + * @param array $context + * + * @return void + */ + public function alert(string|\Stringable $message, array $context = []): void + { + $this->log(LogLevel::ALERT, $message, $context); + } + + /** + * Critical conditions. + * + * Example: Application component unavailable, unexpected exception. + * + * @param string|\Stringable $message + * @param array $context + * + * @return void + */ + public function critical(string|\Stringable $message, array $context = []): void + { + $this->log(LogLevel::CRITICAL, $message, $context); + } + + /** + * Runtime errors that do not require immediate action but should typically + * be logged and monitored. + * + * @param string|\Stringable $message + * @param array $context + * + * @return void + */ + public function error(string|\Stringable $message, array $context = []): void + { + $this->log(LogLevel::ERROR, $message, $context); + } + + /** + * Exceptional occurrences that are not errors. + * + * Example: Use of deprecated APIs, poor use of an API, undesirable things + * that are not necessarily wrong. + * + * @param string|\Stringable $message + * @param array $context + * + * @return void + */ + public function warning(string|\Stringable $message, array $context = []): void + { + $this->log(LogLevel::WARNING, $message, $context); + } + + /** + * Normal but significant events. + * + * @param string|\Stringable $message + * @param array $context + * + * @return void + */ + public function notice(string|\Stringable $message, array $context = []): void + { + $this->log(LogLevel::NOTICE, $message, $context); + } + + /** + * Interesting events. + * + * Example: User logs in, SQL logs. + * + * @param string|\Stringable $message + * @param array $context + * + * @return void + */ + public function info(string|\Stringable $message, array $context = []): void + { + $this->log(LogLevel::INFO, $message, $context); + } + + /** + * Detailed debug information. + * + * @param string|\Stringable $message + * @param array $context + * + * @return void + */ + public function debug(string|\Stringable $message, array $context = []): void + { + $this->log(LogLevel::DEBUG, $message, $context); + } + + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string|\Stringable $message + * @param array $context + * + * @return void + * + * @throws \Psr\Log\InvalidArgumentException + */ + abstract public function log($level, string|\Stringable $message, array $context = []): void; +} diff --git a/vendor/psr/log/src/NullLogger.php b/vendor/psr/log/src/NullLogger.php new file mode 100644 index 0000000..c1cc3c0 --- /dev/null +++ b/vendor/psr/log/src/NullLogger.php @@ -0,0 +1,30 @@ +<?php + +namespace Psr\Log; + +/** + * This Logger can be used to avoid conditional log calls. + * + * Logging should always be optional, and if no logger is provided to your + * library creating a NullLogger instance to have something to throw logs at + * is a good way to avoid littering your code with `if ($this->logger) { }` + * blocks. + */ +class NullLogger extends AbstractLogger +{ + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string|\Stringable $message + * @param array $context + * + * @return void + * + * @throws \Psr\Log\InvalidArgumentException + */ + public function log($level, string|\Stringable $message, array $context = []): void + { + // noop + } +} diff --git a/vendor/psr/simple-cache/.editorconfig b/vendor/psr/simple-cache/.editorconfig new file mode 100644 index 0000000..48542cb --- /dev/null +++ b/vendor/psr/simple-cache/.editorconfig @@ -0,0 +1,12 @@ +; This file is for unifying the coding style for different editors and IDEs. +; More information at http://editorconfig.org + +root = true + +[*] +charset = utf-8 +indent_size = 4 +indent_style = space +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/vendor/psr/simple-cache/LICENSE.md b/vendor/psr/simple-cache/LICENSE.md new file mode 100644 index 0000000..e49a7c8 --- /dev/null +++ b/vendor/psr/simple-cache/LICENSE.md @@ -0,0 +1,21 @@ +# The MIT License (MIT) + +Copyright (c) 2016 PHP Framework Interoperability Group + +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in +> all copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +> THE SOFTWARE. diff --git a/vendor/psr/simple-cache/README.md b/vendor/psr/simple-cache/README.md new file mode 100644 index 0000000..43641d1 --- /dev/null +++ b/vendor/psr/simple-cache/README.md @@ -0,0 +1,8 @@ +PHP FIG Simple Cache PSR +======================== + +This repository holds all interfaces related to PSR-16. + +Note that this is not a cache implementation of its own. It is merely an interface that describes a cache implementation. See [the specification](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-16-simple-cache.md) for more details. + +You can find implementations of the specification by looking for packages providing the [psr/simple-cache-implementation](https://packagist.org/providers/psr/simple-cache-implementation) virtual package. diff --git a/vendor/psr/simple-cache/composer.json b/vendor/psr/simple-cache/composer.json new file mode 100644 index 0000000..f307a84 --- /dev/null +++ b/vendor/psr/simple-cache/composer.json @@ -0,0 +1,25 @@ +{ + "name": "psr/simple-cache", + "description": "Common interfaces for simple caching", + "keywords": ["psr", "psr-16", "cache", "simple-cache", "caching"], + "license": "MIT", + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "require": { + "php": ">=8.0.0" + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + } +} diff --git a/vendor/psr/simple-cache/src/CacheException.php b/vendor/psr/simple-cache/src/CacheException.php new file mode 100644 index 0000000..f61b24c --- /dev/null +++ b/vendor/psr/simple-cache/src/CacheException.php @@ -0,0 +1,10 @@ +<?php + +namespace Psr\SimpleCache; + +/** + * Interface used for all types of exceptions thrown by the implementing library. + */ +interface CacheException extends \Throwable +{ +} diff --git a/vendor/psr/simple-cache/src/CacheInterface.php b/vendor/psr/simple-cache/src/CacheInterface.php new file mode 100644 index 0000000..671e340 --- /dev/null +++ b/vendor/psr/simple-cache/src/CacheInterface.php @@ -0,0 +1,114 @@ +<?php + +namespace Psr\SimpleCache; + +interface CacheInterface +{ + /** + * Fetches a value from the cache. + * + * @param string $key The unique key of this item in the cache. + * @param mixed $default Default value to return if the key does not exist. + * + * @return mixed The value of the item from the cache, or $default in case of cache miss. + * + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if the $key string is not a legal value. + */ + public function get(string $key, mixed $default = null): mixed; + + /** + * Persists data in the cache, uniquely referenced by a key with an optional expiration TTL time. + * + * @param string $key The key of the item to store. + * @param mixed $value The value of the item to store, must be serializable. + * @param null|int|\DateInterval $ttl Optional. The TTL value of this item. If no value is sent and + * the driver supports TTL then the library may set a default value + * for it or let the driver take care of that. + * + * @return bool True on success and false on failure. + * + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if the $key string is not a legal value. + */ + public function set(string $key, mixed $value, null|int|\DateInterval $ttl = null): bool; + + /** + * Delete an item from the cache by its unique key. + * + * @param string $key The unique cache key of the item to delete. + * + * @return bool True if the item was successfully removed. False if there was an error. + * + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if the $key string is not a legal value. + */ + public function delete(string $key): bool; + + /** + * Wipes clean the entire cache's keys. + * + * @return bool True on success and false on failure. + */ + public function clear(): bool; + + /** + * Obtains multiple cache items by their unique keys. + * + * @param iterable<string> $keys A list of keys that can be obtained in a single operation. + * @param mixed $default Default value to return for keys that do not exist. + * + * @return iterable<string, mixed> A list of key => value pairs. Cache keys that do not exist or are stale will have $default as value. + * + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if $keys is neither an array nor a Traversable, + * or if any of the $keys are not a legal value. + */ + public function getMultiple(iterable $keys, mixed $default = null): iterable; + + /** + * Persists a set of key => value pairs in the cache, with an optional TTL. + * + * @param iterable $values A list of key => value pairs for a multiple-set operation. + * @param null|int|\DateInterval $ttl Optional. The TTL value of this item. If no value is sent and + * the driver supports TTL then the library may set a default value + * for it or let the driver take care of that. + * + * @return bool True on success and false on failure. + * + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if $values is neither an array nor a Traversable, + * or if any of the $values are not a legal value. + */ + public function setMultiple(iterable $values, null|int|\DateInterval $ttl = null): bool; + + /** + * Deletes multiple cache items in a single operation. + * + * @param iterable<string> $keys A list of string-based keys to be deleted. + * + * @return bool True if the items were successfully removed. False if there was an error. + * + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if $keys is neither an array nor a Traversable, + * or if any of the $keys are not a legal value. + */ + public function deleteMultiple(iterable $keys): bool; + + /** + * Determines whether an item is present in the cache. + * + * NOTE: It is recommended that has() is only to be used for cache warming type purposes + * and not to be used within your live applications operations for get/set, as this method + * is subject to a race condition where your has() will return true and immediately after, + * another script can remove it making the state of your app out of date. + * + * @param string $key The cache item key. + * + * @return bool + * + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if the $key string is not a legal value. + */ + public function has(string $key): bool; +} diff --git a/vendor/psr/simple-cache/src/InvalidArgumentException.php b/vendor/psr/simple-cache/src/InvalidArgumentException.php new file mode 100644 index 0000000..6a9524a --- /dev/null +++ b/vendor/psr/simple-cache/src/InvalidArgumentException.php @@ -0,0 +1,13 @@ +<?php + +namespace Psr\SimpleCache; + +/** + * Exception interface for invalid cache arguments. + * + * When an invalid argument is passed it must throw an exception which implements + * this interface + */ +interface InvalidArgumentException extends CacheException +{ +} diff --git a/vendor/ralouphie/getallheaders/LICENSE b/vendor/ralouphie/getallheaders/LICENSE new file mode 100644 index 0000000..be5540c --- /dev/null +++ b/vendor/ralouphie/getallheaders/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Ralph Khattar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/ralouphie/getallheaders/README.md b/vendor/ralouphie/getallheaders/README.md new file mode 100644 index 0000000..9430d76 --- /dev/null +++ b/vendor/ralouphie/getallheaders/README.md @@ -0,0 +1,27 @@ +getallheaders +============= + +PHP `getallheaders()` polyfill. Compatible with PHP >= 5.3. + +[![Build Status](https://travis-ci.org/ralouphie/getallheaders.svg?branch=master)](https://travis-ci.org/ralouphie/getallheaders) +[![Coverage Status](https://coveralls.io/repos/ralouphie/getallheaders/badge.png?branch=master)](https://coveralls.io/r/ralouphie/getallheaders?branch=master) +[![Latest Stable Version](https://poser.pugx.org/ralouphie/getallheaders/v/stable.png)](https://packagist.org/packages/ralouphie/getallheaders) +[![Latest Unstable Version](https://poser.pugx.org/ralouphie/getallheaders/v/unstable.png)](https://packagist.org/packages/ralouphie/getallheaders) +[![License](https://poser.pugx.org/ralouphie/getallheaders/license.png)](https://packagist.org/packages/ralouphie/getallheaders) + + +This is a simple polyfill for [`getallheaders()`](http://www.php.net/manual/en/function.getallheaders.php). + +## Install + +For PHP version **`>= 5.6`**: + +``` +composer require ralouphie/getallheaders +``` + +For PHP version **`< 5.6`**: + +``` +composer require ralouphie/getallheaders "^2" +``` diff --git a/vendor/ralouphie/getallheaders/composer.json b/vendor/ralouphie/getallheaders/composer.json new file mode 100644 index 0000000..de8ce62 --- /dev/null +++ b/vendor/ralouphie/getallheaders/composer.json @@ -0,0 +1,26 @@ +{ + "name": "ralouphie/getallheaders", + "description": "A polyfill for getallheaders.", + "license": "MIT", + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "require": { + "php": ">=5.6" + }, + "require-dev": { + "phpunit/phpunit": "^5 || ^6.5", + "php-coveralls/php-coveralls": "^2.1" + }, + "autoload": { + "files": ["src/getallheaders.php"] + }, + "autoload-dev": { + "psr-4": { + "getallheaders\\Tests\\": "tests/" + } + } +} diff --git a/vendor/ralouphie/getallheaders/src/getallheaders.php b/vendor/ralouphie/getallheaders/src/getallheaders.php new file mode 100644 index 0000000..c7285a5 --- /dev/null +++ b/vendor/ralouphie/getallheaders/src/getallheaders.php @@ -0,0 +1,46 @@ +<?php + +if (!function_exists('getallheaders')) { + + /** + * Get all HTTP header key/values as an associative array for the current request. + * + * @return string[string] The HTTP header key/value pairs. + */ + function getallheaders() + { + $headers = array(); + + $copy_server = array( + 'CONTENT_TYPE' => 'Content-Type', + 'CONTENT_LENGTH' => 'Content-Length', + 'CONTENT_MD5' => 'Content-Md5', + ); + + foreach ($_SERVER as $key => $value) { + if (substr($key, 0, 5) === 'HTTP_') { + $key = substr($key, 5); + if (!isset($copy_server[$key]) || !isset($_SERVER[$key])) { + $key = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $key)))); + $headers[$key] = $value; + } + } elseif (isset($copy_server[$key])) { + $headers[$copy_server[$key]] = $value; + } + } + + if (!isset($headers['Authorization'])) { + if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) { + $headers['Authorization'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION']; + } elseif (isset($_SERVER['PHP_AUTH_USER'])) { + $basic_pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : ''; + $headers['Authorization'] = 'Basic ' . base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $basic_pass); + } elseif (isset($_SERVER['PHP_AUTH_DIGEST'])) { + $headers['Authorization'] = $_SERVER['PHP_AUTH_DIGEST']; + } + } + + return $headers; + } + +} diff --git a/vendor/respect/stringifier/LICENSE.md b/vendor/respect/stringifier/LICENSE.md new file mode 100644 index 0000000..b7df61c --- /dev/null +++ b/vendor/respect/stringifier/LICENSE.md @@ -0,0 +1,21 @@ +# License + +Copyright (c) [Henrique Moody](http://github.com/henriquemoody). + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/respect/stringifier/README.md b/vendor/respect/stringifier/README.md new file mode 100644 index 0000000..c880904 --- /dev/null +++ b/vendor/respect/stringifier/README.md @@ -0,0 +1,46 @@ +# Respect\Stringifier + +[![Build Status](https://img.shields.io/travis/Respect/Stringifier/master.svg?style=flat-square)](http://travis-ci.org/Respect/Stringifier) +[![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/Respect/Stringifier/master.svg?style=flat-square)](https://scrutinizer-ci.com/g/Respect/Stringifier/?branch=master) +[![Code Coverage](https://img.shields.io/scrutinizer/coverage/g/Respect/Stringifier/master.svg?style=flat-square)](https://scrutinizer-ci.com/g/Respect/Stringifier/?branch=master) +[![Latest Stable Version](https://img.shields.io/packagist/v/respect/stringifier.svg?style=flat-square)](https://packagist.org/packages/respect/stringifier) +[![Total Downloads](https://img.shields.io/packagist/dt/respect/stringifier.svg?style=flat-square)](https://packagist.org/packages/respect/stringifier) +[![License](https://img.shields.io/packagist/l/respect/stringifier.svg?style=flat-square)](https://packagist.org/packages/respect/stringifier) + +Converts any PHP value into a string. + +## Installation + +Package is available on [Packagist](https://packagist.org/packages/respect/stringifier), you can install it +using [Composer](http://getcomposer.org). + +```bash +composer require respect/stringifier +``` + +This library requires PHP >= 7.1. + +## Feature Guide + +Below a quick guide of how to use the library. + +### Namespace import + +Respect\Stringifier is namespaced, and you can make your life easier by importing +a single function into your context: + +```php +use function Respect\Stringifier\stringify; +``` + +Stringifier was built using objects, the `stringify()` is a easy way to use it. + +### Usage + +Simply use the function to convert any value you want to: + +```php +echo stringify($value); +``` + +To see more examples of how to use the library check the [integration tests](tests/integration). diff --git a/vendor/respect/stringifier/composer.json b/vendor/respect/stringifier/composer.json new file mode 100644 index 0000000..f63ace2 --- /dev/null +++ b/vendor/respect/stringifier/composer.json @@ -0,0 +1,36 @@ +{ + "name": "respect/stringifier", + "description": "Converts any value to a string", + "keywords": ["respect", "stringifier", "stringify"], + "type": "library", + "homepage": "http://respect.github.io/Stringifier/", + "license": "MIT", + "authors": [ + { + "name": "Respect/Stringifier Contributors", + "homepage": "https://github.com/Respect/Stringifier/graphs/contributors" + } + ], + "require": { + "php": ">=7.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.8", + "malukenho/docheader": "^0.1.7", + "phpunit/phpunit": "^6.4" + }, + "autoload": { + "psr-4": { + "Respect\\Stringifier\\": "src/" + }, + "files": [ + "src/stringify.php" + ] + }, + "scripts": { + "docheader": "vendor/bin/docheader check src/ tests/", + "test": "vendor/bin/phpunit", + "test-unit": "vendor/bin/phpunit --testsuite=unit", + "test-integration": "vendor/bin/phpunit --testsuite=integration" + } +} diff --git a/vendor/respect/stringifier/src/Quoter.php b/vendor/respect/stringifier/src/Quoter.php new file mode 100644 index 0000000..3d5e9cf --- /dev/null +++ b/vendor/respect/stringifier/src/Quoter.php @@ -0,0 +1,27 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier; + +interface Quoter +{ + /** + * Should add quotes to the given string. + * + * @param string $string The string to add quotes to + * @param int $depth The current depth + * + * @return string + */ + public function quote(string $string, int $depth): string; +} diff --git a/vendor/respect/stringifier/src/Quoters/CodeQuoter.php b/vendor/respect/stringifier/src/Quoters/CodeQuoter.php new file mode 100644 index 0000000..d663ce0 --- /dev/null +++ b/vendor/respect/stringifier/src/Quoters/CodeQuoter.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier\Quoters; + +use Respect\Stringifier\Quoter; + +/** + * Add "`" quotes around a string depending on its level. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class CodeQuoter implements Quoter +{ + /** + * {@inheritdoc} + */ + public function quote(string $string, int $depth): string + { + if (0 === $depth) { + return sprintf('`%s`', $string); + } + + return $string; + } +} diff --git a/vendor/respect/stringifier/src/Stringifier.php b/vendor/respect/stringifier/src/Stringifier.php new file mode 100644 index 0000000..b89e56d --- /dev/null +++ b/vendor/respect/stringifier/src/Stringifier.php @@ -0,0 +1,27 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier; + +interface Stringifier +{ + /** + * Converts the value into string if possible. + * + * @param mixed $raw The raw value to be converted. + * @param int $depth The current depth of the conversion. + * + * @return null|string Returns NULL when the conversion is not possible. + */ + public function stringify($raw, int $depth): ?string; +} diff --git a/vendor/respect/stringifier/src/Stringifiers/ArrayStringifier.php b/vendor/respect/stringifier/src/Stringifiers/ArrayStringifier.php new file mode 100644 index 0000000..d7912ad --- /dev/null +++ b/vendor/respect/stringifier/src/Stringifiers/ArrayStringifier.php @@ -0,0 +1,114 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier\Stringifiers; + +use function array_keys; +use function implode; +use function is_array; +use function is_int; +use function sprintf; +use Respect\Stringifier\Quoter; +use Respect\Stringifier\Stringifier; + +/** + * Converts an array value into a string. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ArrayStringifier implements Stringifier +{ + /** + * @var Stringifier + */ + private $stringifier; + + /** + * @var Quoter + */ + private $quoter; + + /** + * @var int + */ + private $maximumDepth; + + /** + * @var int + */ + private $itemsLimit; + + /** + * Initializes the stringifier. + * + * @param Stringifier $stringifier + * @param Quoter $quoter + * @param int $maximumDepth + * @param int $itemsLimit + */ + public function __construct(Stringifier $stringifier, Quoter $quoter, int $maximumDepth, int $itemsLimit) + { + $this->stringifier = $stringifier; + $this->quoter = $quoter; + $this->maximumDepth = $maximumDepth; + $this->itemsLimit = $itemsLimit; + } + + /** + * {@inheritdoc} + */ + public function stringify($raw, int $depth): ?string + { + if (!is_array($raw)) { + return null; + } + + if (empty($raw)) { + return $this->quoter->quote('{ }', $depth); + } + + if ($depth >= $this->maximumDepth) { + return '...'; + } + + $items = []; + $itemsCount = 0; + $isSequential = $this->isSequential($raw); + foreach ($raw as $key => $value) { + if (++$itemsCount > $this->itemsLimit) { + $items[$itemsCount] = '...'; + break; + } + + $items[$itemsCount] = ''; + if (false === $isSequential) { + $items[$itemsCount] .= sprintf('%s: ', $this->stringifier->stringify($key, $depth + 1)); + } + $items[$itemsCount] .= $this->stringifier->stringify($value, $depth + 1); + } + + return $this->quoter->quote(sprintf('{ %s }', implode(', ', $items)), $depth); + } + + /** + * Returns whether the array is sequential or not. + * + * @param array $array + * + * @return bool + */ + private function isSequential(array $array): bool + { + return array_keys($array) === range(0, count($array) - 1); + } +} diff --git a/vendor/respect/stringifier/src/Stringifiers/BoolStringifier.php b/vendor/respect/stringifier/src/Stringifiers/BoolStringifier.php new file mode 100644 index 0000000..74debc6 --- /dev/null +++ b/vendor/respect/stringifier/src/Stringifiers/BoolStringifier.php @@ -0,0 +1,53 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier\Stringifiers; + +use function is_bool; +use Respect\Stringifier\Quoter; +use Respect\Stringifier\Stringifier; + +/** + * Converts a boolean value into a string. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class BoolStringifier implements Stringifier +{ + /** + * @var Quoter + */ + private $quoter; + + /** + * Initializes the stringifier. + * + * @param Quoter $quoter + */ + public function __construct(Quoter $quoter) + { + $this->quoter = $quoter; + } + + /** + * {@inheritdoc} + */ + public function stringify($raw, int $depth): ?string + { + if (!is_bool($raw)) { + return null; + } + + return $this->quoter->quote($raw ? 'TRUE' : 'FALSE', $depth); + } +} diff --git a/vendor/respect/stringifier/src/Stringifiers/ClusterStringifier.php b/vendor/respect/stringifier/src/Stringifiers/ClusterStringifier.php new file mode 100644 index 0000000..30de710 --- /dev/null +++ b/vendor/respect/stringifier/src/Stringifiers/ClusterStringifier.php @@ -0,0 +1,117 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier\Stringifiers; + +use Respect\Stringifier\Quoters\CodeQuoter; +use Respect\Stringifier\Quoters\StringQuoter; +use Respect\Stringifier\Stringifier; + +/** + * Converts a value into a string using the defined Stringifiers. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ClusterStringifier implements Stringifier +{ + /** + * @var Stringifier[] + */ + private $stringifiers; + + /** + * Initializes the stringifier. + * + * @param Stringifier[] ...$stringifiers + */ + public function __construct(Stringifier ...$stringifiers) + { + $this->setStringifiers($stringifiers); + } + + /** + * Create a default instance of the class. + * + * This instance includes all possible stringifiers. + * + * @return ClusterStringifier + */ + public static function createDefault(): self + { + $quoter = new CodeQuoter(); + + $stringifier = new self(); + $stringifier->setStringifiers([ + new TraversableStringifier($stringifier, $quoter), + new DateTimeStringifier($stringifier, $quoter, 'c'), + new ThrowableStringifier($stringifier, $quoter), + new StringableObjectStringifier($stringifier), + new JsonSerializableStringifier($stringifier, $quoter), + new ObjectStringifier($stringifier, $quoter), + new ArrayStringifier($stringifier, $quoter, 3, 5), + new InfiniteStringifier($quoter), + new NanStringifier($quoter), + new ResourceStringifier($quoter), + new BoolStringifier($quoter), + new NullStringifier($quoter), + new JsonParsableStringifier(), + ]); + + return $stringifier; + } + + /** + * Set stringifiers. + * + * @param array $stringifiers + * + * @return void + */ + public function setStringifiers(array $stringifiers): void + { + $this->stringifiers = []; + + foreach ($stringifiers as $stringifier) { + $this->addStringifier($stringifier); + } + } + + /** + * Add a stringifier to the chain + * + * @param Stringifier $stringifier + * + * @return void + */ + public function addStringifier(Stringifier $stringifier): void + { + $this->stringifiers[] = $stringifier; + } + + /** + * {@inheritdoc} + */ + public function stringify($value, int $depth): ?string + { + foreach ($this->stringifiers as $stringifier) { + $string = $stringifier->stringify($value, $depth); + if (null === $string) { + continue; + } + + return $string; + } + + return null; + } +} diff --git a/vendor/respect/stringifier/src/Stringifiers/DateTimeStringifier.php b/vendor/respect/stringifier/src/Stringifiers/DateTimeStringifier.php new file mode 100644 index 0000000..be9335f --- /dev/null +++ b/vendor/respect/stringifier/src/Stringifiers/DateTimeStringifier.php @@ -0,0 +1,76 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier\Stringifiers; + +use DateTimeInterface; +use function get_class; +use function sprintf; +use Respect\Stringifier\Quoter; +use Respect\Stringifier\Stringifier; + +/** + * Converts an instance of DateTimeInterface into a string. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class DateTimeStringifier implements Stringifier +{ + /** + * @var Stringifier + */ + private $stringifier; + + /** + * @var Quoter + */ + private $quoter; + + /** + * @var string + */ + private $format; + + /** + * Initializes the stringifier. + * + * @param Stringifier $stringifier + * @param Quoter $quoter + * @param string $format + */ + public function __construct(Stringifier $stringifier, Quoter $quoter, string $format) + { + $this->stringifier = $stringifier; + $this->quoter = $quoter; + $this->format = $format; + } + + /** + * {@inheritdoc} + */ + public function stringify($raw, int $depth): ?string + { + if (!$raw instanceof DateTimeInterface) { + return null; + } + + return $this->quoter->quote( + sprintf( + '[date-time] (%s: %s)', + get_class($raw), + $this->stringifier->stringify($raw->format($this->format), $depth + 1) + ), + $depth + ); + } +} diff --git a/vendor/respect/stringifier/src/Stringifiers/InfiniteStringifier.php b/vendor/respect/stringifier/src/Stringifiers/InfiniteStringifier.php new file mode 100644 index 0000000..b09b3d3 --- /dev/null +++ b/vendor/respect/stringifier/src/Stringifiers/InfiniteStringifier.php @@ -0,0 +1,58 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier\Stringifiers; + +use function is_float; +use function is_infinite; +use Respect\Stringifier\Quoter; +use Respect\Stringifier\Stringifier; + +/** + * Converts an infinite float value into a string. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class InfiniteStringifier implements Stringifier +{ + /** + * @var Quoter + */ + private $quoter; + + /** + * Initializes the stringifier. + * + * @param Quoter $quoter + */ + public function __construct(Quoter $quoter) + { + $this->quoter = $quoter; + } + + /** + * {@inheritdoc} + */ + public function stringify($raw, int $depth): ?string + { + if (!is_float($raw)) { + return null; + } + + if (!is_infinite($raw)) { + return null; + } + + return $this->quoter->quote(($raw > 0 ? '' : '-').'INF', $depth); + } +} diff --git a/vendor/respect/stringifier/src/Stringifiers/JsonParsableStringifier.php b/vendor/respect/stringifier/src/Stringifiers/JsonParsableStringifier.php new file mode 100644 index 0000000..3db387b --- /dev/null +++ b/vendor/respect/stringifier/src/Stringifiers/JsonParsableStringifier.php @@ -0,0 +1,40 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier\Stringifiers; + +use const JSON_UNESCAPED_UNICODE; +use const JSON_UNESCAPED_SLASHES; +use function json_encode; +use Respect\Stringifier\Stringifier; + +/** + * Converts any value into JSON parsable string representation. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class JsonParsableStringifier implements Stringifier +{ + /** + * {@inheritdoc} + */ + public function stringify($raw, int $depth): ?string + { + $string = json_encode($raw, (JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRESERVE_ZERO_FRACTION)); + if (false === $string) { + return null; + } + + return $string; + } +} diff --git a/vendor/respect/stringifier/src/Stringifiers/JsonSerializableStringifier.php b/vendor/respect/stringifier/src/Stringifiers/JsonSerializableStringifier.php new file mode 100644 index 0000000..67986e5 --- /dev/null +++ b/vendor/respect/stringifier/src/Stringifiers/JsonSerializableStringifier.php @@ -0,0 +1,67 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier\Stringifiers; + +use Respect\Stringifier\Quoter; +use Respect\Stringifier\Stringifier; +use JsonSerializable; + +/** + * Converts an instance of JsonSerializable into a string. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class JsonSerializableStringifier implements Stringifier +{ + /** + * @var Stringifier + */ + private $stringifier; + + /** + * @var Quoter + */ + private $quoter; + + /** + * Initializes the stringifier. + * + * @param Stringifier $stringifier + * @param Quoter $quoter + */ + public function __construct(Stringifier $stringifier, Quoter $quoter) + { + $this->stringifier = $stringifier; + $this->quoter = $quoter; + } + + /** + * {@inheritdoc} + */ + public function stringify($raw, int $depth): ?string + { + if (!$raw instanceof JsonSerializable) { + return null; + } + + return $this->quoter->quote( + sprintf( + '[json-serializable] (%s: %s)', + get_class($raw), + $this->stringifier->stringify($raw->jsonSerialize(), $depth + 1) + ), + $depth + ); + } +} diff --git a/vendor/respect/stringifier/src/Stringifiers/NanStringifier.php b/vendor/respect/stringifier/src/Stringifiers/NanStringifier.php new file mode 100644 index 0000000..5afeefc --- /dev/null +++ b/vendor/respect/stringifier/src/Stringifiers/NanStringifier.php @@ -0,0 +1,58 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier\Stringifiers; + +use function is_float; +use function is_nan; +use Respect\Stringifier\Quoter; +use Respect\Stringifier\Stringifier; + +/** + * Converts a NaN value into a string. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NanStringifier implements Stringifier +{ + /** + * @var Quoter + */ + private $quoter; + + /** + * Initializes the stringifier. + * + * @param Quoter $quoter + */ + public function __construct(Quoter $quoter) + { + $this->quoter = $quoter; + } + + /** + * {@inheritdoc} + */ + public function stringify($raw, int $depth): ?string + { + if (!is_float($raw)) { + return null; + } + + if (!is_nan($raw)) { + return null; + } + + return $this->quoter->quote('NaN', $depth); + } +} diff --git a/vendor/respect/stringifier/src/Stringifiers/NullStringifier.php b/vendor/respect/stringifier/src/Stringifiers/NullStringifier.php new file mode 100644 index 0000000..a430e36 --- /dev/null +++ b/vendor/respect/stringifier/src/Stringifiers/NullStringifier.php @@ -0,0 +1,52 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier\Stringifiers; + +use Respect\Stringifier\Quoter; +use Respect\Stringifier\Stringifier; + +/** + * Converts a NULL value into a string. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NullStringifier implements Stringifier +{ + /** + * @var Quoter + */ + private $quoter; + + /** + * Initializes the stringifier. + * + * @param Quoter $quoter + */ + public function __construct(Quoter $quoter) + { + $this->quoter = $quoter; + } + + /** + * {@inheritdoc} + */ + public function stringify($raw, int $depth): ?string + { + if (null !== $raw) { + return null; + } + + return $this->quoter->quote('NULL', $depth); + } +} diff --git a/vendor/respect/stringifier/src/Stringifiers/ObjectStringifier.php b/vendor/respect/stringifier/src/Stringifiers/ObjectStringifier.php new file mode 100644 index 0000000..e19cbb3 --- /dev/null +++ b/vendor/respect/stringifier/src/Stringifiers/ObjectStringifier.php @@ -0,0 +1,70 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier\Stringifiers; + +use function get_class; +use function get_object_vars; +use function is_object; +use function sprintf; +use Respect\Stringifier\Quoter; +use Respect\Stringifier\Stringifier; + +/** + * Converts an object into a string. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ObjectStringifier implements Stringifier +{ + /** + * @var Stringifier + */ + private $stringifier; + + /** + * @var Quoter + */ + private $quoter; + + /** + * Initializes the stringifier. + * + * @param Stringifier $stringifier + * @param Quoter $quoter + */ + public function __construct(Stringifier $stringifier, Quoter $quoter) + { + $this->stringifier = $stringifier; + $this->quoter = $quoter; + } + + /** + * {@inheritdoc} + */ + public function stringify($raw, int $depth): ?string + { + if (!is_object($raw)) { + return null; + } + + return $this->quoter->quote( + sprintf( + '[object] (%s: %s)', + get_class($raw), + $this->stringifier->stringify(get_object_vars($raw), $depth + 1) + ), + $depth + ); + } +} diff --git a/vendor/respect/stringifier/src/Stringifiers/ResourceStringifier.php b/vendor/respect/stringifier/src/Stringifiers/ResourceStringifier.php new file mode 100644 index 0000000..2efb4ea --- /dev/null +++ b/vendor/respect/stringifier/src/Stringifiers/ResourceStringifier.php @@ -0,0 +1,61 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier\Stringifiers; + +use function get_resource_type; +use function is_resource; +use function sprintf; +use Respect\Stringifier\Quoter; +use Respect\Stringifier\Stringifier; + +/** + * Converts a resource value into a string. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ResourceStringifier implements Stringifier +{ + /** + * @var Quoter + */ + private $quoter; + + /** + * Initializes the stringifier. + * + * @param Quoter $quoter + */ + public function __construct(Quoter $quoter) + { + $this->quoter = $quoter; + } + + /** + * {@inheritdoc} + */ + public function stringify($raw, int $depth): ?string + { + if (!is_resource($raw)) { + return null; + } + + return $this->quoter->quote( + sprintf( + '[resource] (%s)', + get_resource_type($raw) + ), + $depth + ); + } +} diff --git a/vendor/respect/stringifier/src/Stringifiers/StringableObjectStringifier.php b/vendor/respect/stringifier/src/Stringifiers/StringableObjectStringifier.php new file mode 100644 index 0000000..18e5ef8 --- /dev/null +++ b/vendor/respect/stringifier/src/Stringifiers/StringableObjectStringifier.php @@ -0,0 +1,57 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier\Stringifiers; + +use function is_object; +use function method_exists; +use Respect\Stringifier\Stringifier; + +/** + * Converts a object that implements the __toString() magic method into a string. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class StringableObjectStringifier implements Stringifier +{ + /** + * @var Stringifier + */ + private $stringifier; + + /** + * Initializes the stringifier. + * + * @param Stringifier $stringifier + */ + public function __construct(Stringifier $stringifier) + { + $this->stringifier = $stringifier; + } + + /** + * {@inheritdoc} + */ + public function stringify($raw, int $depth): ?string + { + if (!is_object($raw)) { + return null; + } + + if (!method_exists($raw, '__toString')) { + return null; + } + + return $this->stringifier->stringify($raw->__toString(), $depth); + } +} diff --git a/vendor/respect/stringifier/src/Stringifiers/ThrowableStringifier.php b/vendor/respect/stringifier/src/Stringifiers/ThrowableStringifier.php new file mode 100644 index 0000000..f9783a3 --- /dev/null +++ b/vendor/respect/stringifier/src/Stringifiers/ThrowableStringifier.php @@ -0,0 +1,84 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier\Stringifiers; + +use function get_class; +use function getcwd; +use function sprintf; +use function str_replace; +use Respect\Stringifier\Quoter; +use Respect\Stringifier\Stringifier; +use Throwable; + +/** + * Converts an instance of Throwable into a string. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ThrowableStringifier implements Stringifier +{ + /** + * @var Stringifier + */ + private $stringifier; + + /** + * @var Quoter + */ + private $quoter; + + /** + * Initializes the stringifier. + * + * @param Stringifier $stringifier + * @param Quoter $quoter + */ + public function __construct(Stringifier $stringifier, Quoter $quoter) + { + $this->stringifier = $stringifier; + $this->quoter = $quoter; + } + + /** + * {@inheritdoc} + */ + public function stringify($raw, int $depth): ?string + { + if (!$raw instanceof Throwable) { + return null; + } + + return $this->quoter->quote( + sprintf( + '[throwable] (%s: %s)', + get_class($raw), + $this->stringifier->stringify($this->getData($raw), $depth + 1) + ), + $depth + ); + } + + private function getData(Throwable $throwable): array + { + return [ + 'message' => $throwable->getMessage(), + 'code' => $throwable->getCode(), + 'file' => sprintf( + '%s:%d', + str_replace(getcwd().'/', '', $throwable->getFile()), + $throwable->getLine() + ), + ]; + } +} diff --git a/vendor/respect/stringifier/src/Stringifiers/TraversableStringifier.php b/vendor/respect/stringifier/src/Stringifiers/TraversableStringifier.php new file mode 100644 index 0000000..6c33f59 --- /dev/null +++ b/vendor/respect/stringifier/src/Stringifiers/TraversableStringifier.php @@ -0,0 +1,69 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier\Stringifiers; + +use function get_class; +use function iterator_to_array; +use Respect\Stringifier\Quoter; +use Respect\Stringifier\Stringifier; +use Traversable; + +/** + * Converts an instance of Traversable into a string. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class TraversableStringifier implements Stringifier +{ + /** + * @var Stringifier + */ + private $stringifier; + + /** + * @var Quoter + */ + private $quoter; + + /** + * Initializes the stringifier. + * + * @param Stringifier $stringifier + * @param Quoter $quoter + */ + public function __construct(Stringifier $stringifier, Quoter $quoter) + { + $this->stringifier = $stringifier; + $this->quoter = $quoter; + } + + /** + * {@inheritdoc} + */ + public function stringify($raw, int $depth): ?string + { + if (!$raw instanceof Traversable) { + return null; + } + + return $this->quoter->quote( + sprintf( + '[traversable] (%s: %s)', + get_class($raw), + $this->stringifier->stringify(iterator_to_array($raw), $depth + 1) + ), + $depth + ); + } +} diff --git a/vendor/respect/stringifier/src/stringify.php b/vendor/respect/stringifier/src/stringify.php new file mode 100644 index 0000000..d12fddf --- /dev/null +++ b/vendor/respect/stringifier/src/stringify.php @@ -0,0 +1,27 @@ +<?php + +/* + * This file is part of Respect/Stringifier. + * + * (c) Henrique Moody <henriquemoody@gmail.com> + * + * For the full copyright and license information, please view the "LICENSE.md" + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Stringifier; + +use Respect\Stringifier\Stringifiers\ClusterStringifier; + +function stringify($value): string +{ + static $stringifier; + + if (null === $stringifier) { + $stringifier = ClusterStringifier::createDefault(); + } + + return $stringifier->stringify($value, 0) ?? '#ERROR#'; +} diff --git a/vendor/symfony/cache-contracts/.gitignore b/vendor/symfony/cache-contracts/.gitignore new file mode 100644 index 0000000..c49a5d8 --- /dev/null +++ b/vendor/symfony/cache-contracts/.gitignore @@ -0,0 +1,3 @@ +vendor/ +composer.lock +phpunit.xml diff --git a/vendor/symfony/cache-contracts/CHANGELOG.md b/vendor/symfony/cache-contracts/CHANGELOG.md new file mode 100644 index 0000000..7932e26 --- /dev/null +++ b/vendor/symfony/cache-contracts/CHANGELOG.md @@ -0,0 +1,5 @@ +CHANGELOG +========= + +The changelog is maintained for all Symfony contracts at the following URL: +https://github.com/symfony/contracts/blob/main/CHANGELOG.md diff --git a/vendor/symfony/cache-contracts/CacheInterface.php b/vendor/symfony/cache-contracts/CacheInterface.php new file mode 100644 index 0000000..0840a8f --- /dev/null +++ b/vendor/symfony/cache-contracts/CacheInterface.php @@ -0,0 +1,55 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Cache; + +use Psr\Cache\CacheItemInterface; +use Psr\Cache\InvalidArgumentException; + +/** + * Covers most simple to advanced caching needs. + * + * @author Nicolas Grekas <p@tchwork.com> + */ +interface CacheInterface +{ + /** + * Fetches a value from the pool or computes it if not found. + * + * On cache misses, a callback is called that should return the missing value. + * This callback is given a PSR-6 CacheItemInterface instance corresponding to the + * requested key, that could be used e.g. for expiration control. It could also + * be an ItemInterface instance when its additional features are needed. + * + * @param string $key The key of the item to retrieve from the cache + * @param callable|CallbackInterface $callback Should return the computed value for the given key/item + * @param float|null $beta A float that, as it grows, controls the likeliness of triggering + * early expiration. 0 disables it, INF forces immediate expiration. + * The default (or providing null) is implementation dependent but should + * typically be 1.0, which should provide optimal stampede protection. + * See https://en.wikipedia.org/wiki/Cache_stampede#Probabilistic_early_expiration + * @param array &$metadata The metadata of the cached item {@see ItemInterface::getMetadata()} + * + * @throws InvalidArgumentException When $key is not valid or when $beta is negative + */ + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed; + + /** + * Removes an item from the pool. + * + * @param string $key The key to delete + * + * @throws InvalidArgumentException When $key is not valid + * + * @return bool True if the item was successfully removed, false if there was any error + */ + public function delete(string $key): bool; +} diff --git a/vendor/symfony/cache-contracts/CacheTrait.php b/vendor/symfony/cache-contracts/CacheTrait.php new file mode 100644 index 0000000..d245df6 --- /dev/null +++ b/vendor/symfony/cache-contracts/CacheTrait.php @@ -0,0 +1,78 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Cache; + +use Psr\Cache\CacheItemPoolInterface; +use Psr\Cache\InvalidArgumentException; +use Psr\Log\LoggerInterface; + +// Help opcache.preload discover always-needed symbols +class_exists(InvalidArgumentException::class); + +/** + * An implementation of CacheInterface for PSR-6 CacheItemPoolInterface classes. + * + * @author Nicolas Grekas <p@tchwork.com> + */ +trait CacheTrait +{ + /** + * {@inheritdoc} + */ + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed + { + return $this->doGet($this, $key, $callback, $beta, $metadata); + } + + /** + * {@inheritdoc} + */ + public function delete(string $key): bool + { + return $this->deleteItem($key); + } + + private function doGet(CacheItemPoolInterface $pool, string $key, callable $callback, ?float $beta, array &$metadata = null, LoggerInterface $logger = null): mixed + { + if (0 > $beta = $beta ?? 1.0) { + throw new class(sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', static::class, $beta)) extends \InvalidArgumentException implements InvalidArgumentException { }; + } + + $item = $pool->getItem($key); + $recompute = !$item->isHit() || \INF === $beta; + $metadata = $item instanceof ItemInterface ? $item->getMetadata() : []; + + if (!$recompute && $metadata) { + $expiry = $metadata[ItemInterface::METADATA_EXPIRY] ?? false; + $ctime = $metadata[ItemInterface::METADATA_CTIME] ?? false; + + if ($recompute = $ctime && $expiry && $expiry <= ($now = microtime(true)) - $ctime / 1000 * $beta * log(random_int(1, \PHP_INT_MAX) / \PHP_INT_MAX)) { + // force applying defaultLifetime to expiry + $item->expiresAt(null); + $logger && $logger->info('Item "{key}" elected for early recomputation {delta}s before its expiration', [ + 'key' => $key, + 'delta' => sprintf('%.1f', $expiry - $now), + ]); + } + } + + if ($recompute) { + $save = true; + $item->set($callback($item, $save)); + if ($save) { + $pool->save($item); + } + } + + return $item->get(); + } +} diff --git a/vendor/symfony/cache-contracts/CallbackInterface.php b/vendor/symfony/cache-contracts/CallbackInterface.php new file mode 100644 index 0000000..437a3c9 --- /dev/null +++ b/vendor/symfony/cache-contracts/CallbackInterface.php @@ -0,0 +1,30 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Cache; + +use Psr\Cache\CacheItemInterface; + +/** + * Computes and returns the cached value of an item. + * + * @author Nicolas Grekas <p@tchwork.com> + */ +interface CallbackInterface +{ + /** + * @param CacheItemInterface|ItemInterface $item The item to compute the value for + * @param bool &$save Should be set to false when the value should not be saved in the pool + * + * @return mixed The computed value for the passed item + */ + public function __invoke(CacheItemInterface $item, bool &$save): mixed; +} diff --git a/vendor/symfony/cache-contracts/ItemInterface.php b/vendor/symfony/cache-contracts/ItemInterface.php new file mode 100644 index 0000000..8c4c512 --- /dev/null +++ b/vendor/symfony/cache-contracts/ItemInterface.php @@ -0,0 +1,65 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Cache; + +use Psr\Cache\CacheException; +use Psr\Cache\CacheItemInterface; +use Psr\Cache\InvalidArgumentException; + +/** + * Augments PSR-6's CacheItemInterface with support for tags and metadata. + * + * @author Nicolas Grekas <p@tchwork.com> + */ +interface ItemInterface extends CacheItemInterface +{ + /** + * References the Unix timestamp stating when the item will expire. + */ + public const METADATA_EXPIRY = 'expiry'; + + /** + * References the time the item took to be created, in milliseconds. + */ + public const METADATA_CTIME = 'ctime'; + + /** + * References the list of tags that were assigned to the item, as string[]. + */ + public const METADATA_TAGS = 'tags'; + + /** + * Reserved characters that cannot be used in a key or tag. + */ + public const RESERVED_CHARACTERS = '{}()/\@:'; + + /** + * Adds a tag to a cache item. + * + * Tags are strings that follow the same validation rules as keys. + * + * @param string|string[] $tags A tag or array of tags + * + * @return $this + * + * @throws InvalidArgumentException When $tag is not valid + * @throws CacheException When the item comes from a pool that is not tag-aware + */ + public function tag(string|iterable $tags): static; + + /** + * Returns a list of metadata info that were saved alongside with the cached value. + * + * See ItemInterface::METADATA_* consts for keys potentially found in the returned array. + */ + public function getMetadata(): array; +} diff --git a/vendor/symfony/cache-contracts/LICENSE b/vendor/symfony/cache-contracts/LICENSE new file mode 100644 index 0000000..74cdc2d --- /dev/null +++ b/vendor/symfony/cache-contracts/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-2022 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/vendor/symfony/cache-contracts/README.md b/vendor/symfony/cache-contracts/README.md new file mode 100644 index 0000000..7085a69 --- /dev/null +++ b/vendor/symfony/cache-contracts/README.md @@ -0,0 +1,9 @@ +Symfony Cache Contracts +======================= + +A set of abstractions extracted out of the Symfony components. + +Can be used to build on semantics that the Symfony components proved useful - and +that already have battle tested implementations. + +See https://github.com/symfony/contracts/blob/main/README.md for more information. diff --git a/vendor/symfony/cache-contracts/TagAwareCacheInterface.php b/vendor/symfony/cache-contracts/TagAwareCacheInterface.php new file mode 100644 index 0000000..8e0b6be --- /dev/null +++ b/vendor/symfony/cache-contracts/TagAwareCacheInterface.php @@ -0,0 +1,38 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Cache; + +use Psr\Cache\InvalidArgumentException; + +/** + * Allows invalidating cached items using tags. + * + * @author Nicolas Grekas <p@tchwork.com> + */ +interface TagAwareCacheInterface extends CacheInterface +{ + /** + * Invalidates cached items using tags. + * + * When implemented on a PSR-6 pool, invalidation should not apply + * to deferred items. Instead, they should be committed as usual. + * This allows replacing old tagged values by new ones without + * race conditions. + * + * @param string[] $tags An array of tags to invalidate + * + * @return bool True on success + * + * @throws InvalidArgumentException When $tags is not valid + */ + public function invalidateTags(array $tags): bool; +} diff --git a/vendor/symfony/cache-contracts/composer.json b/vendor/symfony/cache-contracts/composer.json new file mode 100644 index 0000000..1523e06 --- /dev/null +++ b/vendor/symfony/cache-contracts/composer.json @@ -0,0 +1,38 @@ +{ + "name": "symfony/cache-contracts", + "type": "library", + "description": "Generic abstractions related to caching", + "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=8.0.2", + "psr/cache": "^3.0" + }, + "suggest": { + "symfony/cache-implementation": "" + }, + "autoload": { + "psr-4": { "Symfony\\Contracts\\Cache\\": "" } + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + } +} diff --git a/vendor/symfony/cache/Adapter/AbstractAdapter.php b/vendor/symfony/cache/Adapter/AbstractAdapter.php new file mode 100644 index 0000000..30ea8f8 --- /dev/null +++ b/vendor/symfony/cache/Adapter/AbstractAdapter.php @@ -0,0 +1,204 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Psr\Log\LoggerAwareInterface; +use Psr\Log\LoggerInterface; +use Symfony\Component\Cache\CacheItem; +use Symfony\Component\Cache\Exception\InvalidArgumentException; +use Symfony\Component\Cache\ResettableInterface; +use Symfony\Component\Cache\Traits\AbstractAdapterTrait; +use Symfony\Component\Cache\Traits\ContractsTrait; +use Symfony\Contracts\Cache\CacheInterface; + +/** + * @author Nicolas Grekas <p@tchwork.com> + */ +abstract class AbstractAdapter implements AdapterInterface, CacheInterface, LoggerAwareInterface, ResettableInterface +{ + use AbstractAdapterTrait; + use ContractsTrait; + + /** + * @internal + */ + protected const NS_SEPARATOR = ':'; + + private static $apcuSupported; + private static $phpFilesSupported; + + protected function __construct(string $namespace = '', int $defaultLifetime = 0) + { + $this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace).static::NS_SEPARATOR; + $this->defaultLifetime = $defaultLifetime; + if (null !== $this->maxIdLength && \strlen($namespace) > $this->maxIdLength - 24) { + throw new InvalidArgumentException(sprintf('Namespace must be %d chars max, %d given ("%s").', $this->maxIdLength - 24, \strlen($namespace), $namespace)); + } + self::$createCacheItem ?? self::$createCacheItem = \Closure::bind( + static function ($key, $value, $isHit) { + $item = new CacheItem(); + $item->key = $key; + $item->value = $v = $value; + $item->isHit = $isHit; + // Detect wrapped values that encode for their expiry and creation duration + // For compactness, these values are packed in the key of an array using + // magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F + if (\is_array($v) && 1 === \count($v) && 10 === \strlen($k = (string) array_key_first($v)) && "\x9D" === $k[0] && "\0" === $k[5] && "\x5F" === $k[9]) { + $item->value = $v[$k]; + $v = unpack('Ve/Nc', substr($k, 1, -1)); + $item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET; + $item->metadata[CacheItem::METADATA_CTIME] = $v['c']; + } + + return $item; + }, + null, + CacheItem::class + ); + self::$mergeByLifetime ?? self::$mergeByLifetime = \Closure::bind( + static function ($deferred, $namespace, &$expiredIds, $getId, $defaultLifetime) { + $byLifetime = []; + $now = microtime(true); + $expiredIds = []; + + foreach ($deferred as $key => $item) { + $key = (string) $key; + if (null === $item->expiry) { + $ttl = 0 < $defaultLifetime ? $defaultLifetime : 0; + } elseif (!$item->expiry) { + $ttl = 0; + } elseif (0 >= $ttl = (int) (0.1 + $item->expiry - $now)) { + $expiredIds[] = $getId($key); + continue; + } + if (isset(($metadata = $item->newMetadata)[CacheItem::METADATA_TAGS])) { + unset($metadata[CacheItem::METADATA_TAGS]); + } + // For compactness, expiry and creation duration are packed in the key of an array, using magic numbers as separators + $byLifetime[$ttl][$getId($key)] = $metadata ? ["\x9D".pack('VN', (int) (0.1 + $metadata[self::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[self::METADATA_CTIME])."\x5F" => $item->value] : $item->value; + } + + return $byLifetime; + }, + null, + CacheItem::class + ); + } + + /** + * Returns the best possible adapter that your runtime supports. + * + * Using ApcuAdapter makes system caches compatible with read-only filesystems. + */ + public static function createSystemCache(string $namespace, int $defaultLifetime, string $version, string $directory, LoggerInterface $logger = null): AdapterInterface + { + $opcache = new PhpFilesAdapter($namespace, $defaultLifetime, $directory, true); + if (null !== $logger) { + $opcache->setLogger($logger); + } + + if (!self::$apcuSupported = self::$apcuSupported ?? ApcuAdapter::isSupported()) { + return $opcache; + } + + if (\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) && !filter_var(\ini_get('apc.enable_cli'), \FILTER_VALIDATE_BOOLEAN)) { + return $opcache; + } + + $apcu = new ApcuAdapter($namespace, intdiv($defaultLifetime, 5), $version); + if (null !== $logger) { + $apcu->setLogger($logger); + } + + return new ChainAdapter([$apcu, $opcache]); + } + + public static function createConnection(string $dsn, array $options = []) + { + if (str_starts_with($dsn, 'redis:') || str_starts_with($dsn, 'rediss:')) { + return RedisAdapter::createConnection($dsn, $options); + } + if (str_starts_with($dsn, 'memcached:')) { + return MemcachedAdapter::createConnection($dsn, $options); + } + if (0 === strpos($dsn, 'couchbase:')) { + if (CouchbaseBucketAdapter::isSupported()) { + return CouchbaseBucketAdapter::createConnection($dsn, $options); + } + + return CouchbaseCollectionAdapter::createConnection($dsn, $options); + } + + throw new InvalidArgumentException(sprintf('Unsupported DSN: "%s".', $dsn)); + } + + /** + * {@inheritdoc} + */ + public function commit(): bool + { + $ok = true; + $byLifetime = (self::$mergeByLifetime)($this->deferred, $this->namespace, $expiredIds, \Closure::fromCallable([$this, 'getId']), $this->defaultLifetime); + $retry = $this->deferred = []; + + if ($expiredIds) { + try { + $this->doDelete($expiredIds); + } catch (\Exception $e) { + $ok = false; + CacheItem::log($this->logger, 'Failed to delete expired items: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]); + } + } + foreach ($byLifetime as $lifetime => $values) { + try { + $e = $this->doSave($values, $lifetime); + } catch (\Exception $e) { + } + if (true === $e || [] === $e) { + continue; + } + if (\is_array($e) || 1 === \count($values)) { + foreach (\is_array($e) ? $e : array_keys($values) as $id) { + $ok = false; + $v = $values[$id]; + $type = get_debug_type($v); + $message = sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': '.$e->getMessage() : '.'); + CacheItem::log($this->logger, $message, ['key' => substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]); + } + } else { + foreach ($values as $id => $v) { + $retry[$lifetime][] = $id; + } + } + } + + // When bulk-save failed, retry each item individually + foreach ($retry as $lifetime => $ids) { + foreach ($ids as $id) { + try { + $v = $byLifetime[$lifetime][$id]; + $e = $this->doSave([$id => $v], $lifetime); + } catch (\Exception $e) { + } + if (true === $e || [] === $e) { + continue; + } + $ok = false; + $type = get_debug_type($v); + $message = sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': '.$e->getMessage() : '.'); + CacheItem::log($this->logger, $message, ['key' => substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]); + } + } + + return $ok; + } +} diff --git a/vendor/symfony/cache/Adapter/AbstractTagAwareAdapter.php b/vendor/symfony/cache/Adapter/AbstractTagAwareAdapter.php new file mode 100644 index 0000000..565bc9b --- /dev/null +++ b/vendor/symfony/cache/Adapter/AbstractTagAwareAdapter.php @@ -0,0 +1,328 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Psr\Log\LoggerAwareInterface; +use Symfony\Component\Cache\CacheItem; +use Symfony\Component\Cache\Exception\InvalidArgumentException; +use Symfony\Component\Cache\ResettableInterface; +use Symfony\Component\Cache\Traits\AbstractAdapterTrait; +use Symfony\Component\Cache\Traits\ContractsTrait; +use Symfony\Contracts\Cache\TagAwareCacheInterface; + +/** + * Abstract for native TagAware adapters. + * + * To keep info on tags, the tags are both serialized as part of cache value and provided as tag ids + * to Adapters on operations when needed for storage to doSave(), doDelete() & doInvalidate(). + * + * @author Nicolas Grekas <p@tchwork.com> + * @author André Rømcke <andre.romcke+symfony@gmail.com> + * + * @internal + */ +abstract class AbstractTagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface, LoggerAwareInterface, ResettableInterface +{ + use AbstractAdapterTrait; + use ContractsTrait; + + private const TAGS_PREFIX = "\0tags\0"; + + protected function __construct(string $namespace = '', int $defaultLifetime = 0) + { + $this->namespace = '' === $namespace ? '' : CacheItem::validateKey($namespace).':'; + $this->defaultLifetime = $defaultLifetime; + if (null !== $this->maxIdLength && \strlen($namespace) > $this->maxIdLength - 24) { + throw new InvalidArgumentException(sprintf('Namespace must be %d chars max, %d given ("%s").', $this->maxIdLength - 24, \strlen($namespace), $namespace)); + } + self::$createCacheItem ?? self::$createCacheItem = \Closure::bind( + static function ($key, $value, $isHit) { + $item = new CacheItem(); + $item->key = $key; + $item->isTaggable = true; + // If structure does not match what we expect return item as is (no value and not a hit) + if (!\is_array($value) || !\array_key_exists('value', $value)) { + return $item; + } + $item->isHit = $isHit; + // Extract value, tags and meta data from the cache value + $item->value = $value['value']; + $item->metadata[CacheItem::METADATA_TAGS] = $value['tags'] ?? []; + if (isset($value['meta'])) { + // For compactness these values are packed, & expiry is offset to reduce size + $v = unpack('Ve/Nc', $value['meta']); + $item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET; + $item->metadata[CacheItem::METADATA_CTIME] = $v['c']; + } + + return $item; + }, + null, + CacheItem::class + ); + self::$mergeByLifetime ?? self::$mergeByLifetime = \Closure::bind( + static function ($deferred, &$expiredIds, $getId, $tagPrefix, $defaultLifetime) { + $byLifetime = []; + $now = microtime(true); + $expiredIds = []; + + foreach ($deferred as $key => $item) { + $key = (string) $key; + if (null === $item->expiry) { + $ttl = 0 < $defaultLifetime ? $defaultLifetime : 0; + } elseif (!$item->expiry) { + $ttl = 0; + } elseif (0 >= $ttl = (int) (0.1 + $item->expiry - $now)) { + $expiredIds[] = $getId($key); + continue; + } + // Store Value and Tags on the cache value + if (isset(($metadata = $item->newMetadata)[CacheItem::METADATA_TAGS])) { + $value = ['value' => $item->value, 'tags' => $metadata[CacheItem::METADATA_TAGS]]; + unset($metadata[CacheItem::METADATA_TAGS]); + } else { + $value = ['value' => $item->value, 'tags' => []]; + } + + if ($metadata) { + // For compactness, expiry and creation duration are packed, using magic numbers as separators + $value['meta'] = pack('VN', (int) (0.1 + $metadata[self::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[self::METADATA_CTIME]); + } + + // Extract tag changes, these should be removed from values in doSave() + $value['tag-operations'] = ['add' => [], 'remove' => []]; + $oldTags = $item->metadata[CacheItem::METADATA_TAGS] ?? []; + foreach (array_diff($value['tags'], $oldTags) as $addedTag) { + $value['tag-operations']['add'][] = $getId($tagPrefix.$addedTag); + } + foreach (array_diff($oldTags, $value['tags']) as $removedTag) { + $value['tag-operations']['remove'][] = $getId($tagPrefix.$removedTag); + } + + $byLifetime[$ttl][$getId($key)] = $value; + $item->metadata = $item->newMetadata; + } + + return $byLifetime; + }, + null, + CacheItem::class + ); + } + + /** + * Persists several cache items immediately. + * + * @param array $values The values to cache, indexed by their cache identifier + * @param int $lifetime The lifetime of the cached values, 0 for persisting until manual cleaning + * @param array[] $addTagData Hash where key is tag id, and array value is list of cache id's to add to tag + * @param array[] $removeTagData Hash where key is tag id, and array value is list of cache id's to remove to tag + * + * @return array The identifiers that failed to be cached or a boolean stating if caching succeeded or not + */ + abstract protected function doSave(array $values, int $lifetime, array $addTagData = [], array $removeTagData = []): array; + + /** + * Removes multiple items from the pool and their corresponding tags. + * + * @param array $ids An array of identifiers that should be removed from the pool + */ + abstract protected function doDelete(array $ids): bool; + + /** + * Removes relations between tags and deleted items. + * + * @param array $tagData Array of tag => key identifiers that should be removed from the pool + */ + abstract protected function doDeleteTagRelations(array $tagData): bool; + + /** + * Invalidates cached items using tags. + * + * @param string[] $tagIds An array of tags to invalidate, key is tag and value is tag id + */ + abstract protected function doInvalidate(array $tagIds): bool; + + /** + * Delete items and yields the tags they were bound to. + */ + protected function doDeleteYieldTags(array $ids): iterable + { + foreach ($this->doFetch($ids) as $id => $value) { + yield $id => \is_array($value) && \is_array($value['tags'] ?? null) ? $value['tags'] : []; + } + + $this->doDelete($ids); + } + + /** + * {@inheritdoc} + */ + public function commit(): bool + { + $ok = true; + $byLifetime = (self::$mergeByLifetime)($this->deferred, $expiredIds, \Closure::fromCallable([$this, 'getId']), self::TAGS_PREFIX, $this->defaultLifetime); + $retry = $this->deferred = []; + + if ($expiredIds) { + // Tags are not cleaned up in this case, however that is done on invalidateTags(). + try { + $this->doDelete($expiredIds); + } catch (\Exception $e) { + $ok = false; + CacheItem::log($this->logger, 'Failed to delete expired items: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]); + } + } + foreach ($byLifetime as $lifetime => $values) { + try { + $values = $this->extractTagData($values, $addTagData, $removeTagData); + $e = $this->doSave($values, $lifetime, $addTagData, $removeTagData); + } catch (\Exception $e) { + } + if (true === $e || [] === $e) { + continue; + } + if (\is_array($e) || 1 === \count($values)) { + foreach (\is_array($e) ? $e : array_keys($values) as $id) { + $ok = false; + $v = $values[$id]; + $type = get_debug_type($v); + $message = sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': '.$e->getMessage() : '.'); + CacheItem::log($this->logger, $message, ['key' => substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]); + } + } else { + foreach ($values as $id => $v) { + $retry[$lifetime][] = $id; + } + } + } + + // When bulk-save failed, retry each item individually + foreach ($retry as $lifetime => $ids) { + foreach ($ids as $id) { + try { + $v = $byLifetime[$lifetime][$id]; + $values = $this->extractTagData([$id => $v], $addTagData, $removeTagData); + $e = $this->doSave($values, $lifetime, $addTagData, $removeTagData); + } catch (\Exception $e) { + } + if (true === $e || [] === $e) { + continue; + } + $ok = false; + $type = get_debug_type($v); + $message = sprintf('Failed to save key "{key}" of type %s%s', $type, $e instanceof \Exception ? ': '.$e->getMessage() : '.'); + CacheItem::log($this->logger, $message, ['key' => substr($id, \strlen($this->namespace)), 'exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]); + } + } + + return $ok; + } + + /** + * {@inheritdoc} + */ + public function deleteItems(array $keys): bool + { + if (!$keys) { + return true; + } + + $ok = true; + $ids = []; + $tagData = []; + + foreach ($keys as $key) { + $ids[$key] = $this->getId($key); + unset($this->deferred[$key]); + } + + try { + foreach ($this->doDeleteYieldTags(array_values($ids)) as $id => $tags) { + foreach ($tags as $tag) { + $tagData[$this->getId(self::TAGS_PREFIX.$tag)][] = $id; + } + } + } catch (\Exception $e) { + $ok = false; + } + + try { + if ((!$tagData || $this->doDeleteTagRelations($tagData)) && $ok) { + return true; + } + } catch (\Exception $e) { + } + + // When bulk-delete failed, retry each item individually + foreach ($ids as $key => $id) { + try { + $e = null; + if ($this->doDelete([$id])) { + continue; + } + } catch (\Exception $e) { + } + $message = 'Failed to delete key "{key}"'.($e instanceof \Exception ? ': '.$e->getMessage() : '.'); + CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); + $ok = false; + } + + return $ok; + } + + /** + * {@inheritdoc} + */ + public function invalidateTags(array $tags): bool + { + if (empty($tags)) { + return false; + } + + $tagIds = []; + foreach (array_unique($tags) as $tag) { + $tagIds[] = $this->getId(self::TAGS_PREFIX.$tag); + } + + try { + if ($this->doInvalidate($tagIds)) { + return true; + } + } catch (\Exception $e) { + CacheItem::log($this->logger, 'Failed to invalidate tags: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]); + } + + return false; + } + + /** + * Extracts tags operation data from $values set in mergeByLifetime, and returns values without it. + */ + private function extractTagData(array $values, ?array &$addTagData, ?array &$removeTagData): array + { + $addTagData = $removeTagData = []; + foreach ($values as $id => $value) { + foreach ($value['tag-operations']['add'] as $tag => $tagId) { + $addTagData[$tagId][] = $id; + } + + foreach ($value['tag-operations']['remove'] as $tag => $tagId) { + $removeTagData[$tagId][] = $id; + } + + unset($values[$id]['tag-operations']); + } + + return $values; + } +} diff --git a/vendor/symfony/cache/Adapter/AdapterInterface.php b/vendor/symfony/cache/Adapter/AdapterInterface.php new file mode 100644 index 0000000..7b0771b --- /dev/null +++ b/vendor/symfony/cache/Adapter/AdapterInterface.php @@ -0,0 +1,43 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Psr\Cache\CacheItemPoolInterface; +use Symfony\Component\Cache\CacheItem; + +// Help opcache.preload discover always-needed symbols +class_exists(CacheItem::class); + +/** + * Interface for adapters managing instances of Symfony's CacheItem. + * + * @author Kévin Dunglas <dunglas@gmail.com> + */ +interface AdapterInterface extends CacheItemPoolInterface +{ + /** + * {@inheritdoc} + */ + public function getItem(mixed $key): CacheItem; + + /** + * {@inheritdoc} + * + * @return iterable<string, CacheItem> + */ + public function getItems(array $keys = []): iterable; + + /** + * {@inheritdoc} + */ + public function clear(string $prefix = ''): bool; +} diff --git a/vendor/symfony/cache/Adapter/ApcuAdapter.php b/vendor/symfony/cache/Adapter/ApcuAdapter.php new file mode 100644 index 0000000..ba222d1 --- /dev/null +++ b/vendor/symfony/cache/Adapter/ApcuAdapter.php @@ -0,0 +1,131 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Symfony\Component\Cache\CacheItem; +use Symfony\Component\Cache\Exception\CacheException; +use Symfony\Component\Cache\Marshaller\MarshallerInterface; + +/** + * @author Nicolas Grekas <p@tchwork.com> + */ +class ApcuAdapter extends AbstractAdapter +{ + private $marshaller; + + /** + * @throws CacheException if APCu is not enabled + */ + public function __construct(string $namespace = '', int $defaultLifetime = 0, string $version = null, MarshallerInterface $marshaller = null) + { + if (!static::isSupported()) { + throw new CacheException('APCu is not enabled.'); + } + if ('cli' === \PHP_SAPI) { + ini_set('apc.use_request_time', 0); + } + parent::__construct($namespace, $defaultLifetime); + + if (null !== $version) { + CacheItem::validateKey($version); + + if (!apcu_exists($version.'@'.$namespace)) { + $this->doClear($namespace); + apcu_add($version.'@'.$namespace, null); + } + } + + $this->marshaller = $marshaller; + } + + public static function isSupported() + { + return \function_exists('apcu_fetch') && filter_var(\ini_get('apc.enabled'), \FILTER_VALIDATE_BOOLEAN); + } + + /** + * {@inheritdoc} + */ + protected function doFetch(array $ids): iterable + { + $unserializeCallbackHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback'); + try { + $values = []; + foreach (apcu_fetch($ids, $ok) ?: [] as $k => $v) { + if (null !== $v || $ok) { + $values[$k] = null !== $this->marshaller ? $this->marshaller->unmarshall($v) : $v; + } + } + + return $values; + } catch (\Error $e) { + throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine()); + } finally { + ini_set('unserialize_callback_func', $unserializeCallbackHandler); + } + } + + /** + * {@inheritdoc} + */ + protected function doHave(string $id): bool + { + return apcu_exists($id); + } + + /** + * {@inheritdoc} + */ + protected function doClear(string $namespace): bool + { + return isset($namespace[0]) && class_exists(\APCUIterator::class, false) && ('cli' !== \PHP_SAPI || filter_var(\ini_get('apc.enable_cli'), \FILTER_VALIDATE_BOOLEAN)) + ? apcu_delete(new \APCUIterator(sprintf('/^%s/', preg_quote($namespace, '/')), \APC_ITER_KEY)) + : apcu_clear_cache(); + } + + /** + * {@inheritdoc} + */ + protected function doDelete(array $ids): bool + { + foreach ($ids as $id) { + apcu_delete($id); + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doSave(array $values, int $lifetime): array|bool + { + if (null !== $this->marshaller && (!$values = $this->marshaller->marshall($values, $failed))) { + return $failed; + } + + try { + if (false === $failures = apcu_store($values, null, $lifetime)) { + $failures = $values; + } + + return array_keys($failures); + } catch (\Throwable $e) { + if (1 === \count($values)) { + // Workaround https://github.com/krakjoe/apcu/issues/170 + apcu_delete(array_key_first($values)); + } + + throw $e; + } + } +} diff --git a/vendor/symfony/cache/Adapter/ArrayAdapter.php b/vendor/symfony/cache/Adapter/ArrayAdapter.php new file mode 100644 index 0000000..8d503d0 --- /dev/null +++ b/vendor/symfony/cache/Adapter/ArrayAdapter.php @@ -0,0 +1,391 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Psr\Cache\CacheItemInterface; +use Psr\Log\LoggerAwareInterface; +use Psr\Log\LoggerAwareTrait; +use Symfony\Component\Cache\CacheItem; +use Symfony\Component\Cache\Exception\InvalidArgumentException; +use Symfony\Component\Cache\ResettableInterface; +use Symfony\Contracts\Cache\CacheInterface; + +/** + * An in-memory cache storage. + * + * Acts as a least-recently-used (LRU) storage when configured with a maximum number of items. + * + * @author Nicolas Grekas <p@tchwork.com> + */ +class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInterface, ResettableInterface +{ + use LoggerAwareTrait; + + private bool $storeSerialized; + private array $values = []; + private array $expiries = []; + private int $defaultLifetime; + private float $maxLifetime; + private int $maxItems; + + private static \Closure $createCacheItem; + + /** + * @param bool $storeSerialized Disabling serialization can lead to cache corruptions when storing mutable values but increases performance otherwise + */ + public function __construct(int $defaultLifetime = 0, bool $storeSerialized = true, float $maxLifetime = 0, int $maxItems = 0) + { + if (0 > $maxLifetime) { + throw new InvalidArgumentException(sprintf('Argument $maxLifetime must be positive, %F passed.', $maxLifetime)); + } + + if (0 > $maxItems) { + throw new InvalidArgumentException(sprintf('Argument $maxItems must be a positive integer, %d passed.', $maxItems)); + } + + $this->defaultLifetime = $defaultLifetime; + $this->storeSerialized = $storeSerialized; + $this->maxLifetime = $maxLifetime; + $this->maxItems = $maxItems; + self::$createCacheItem ?? self::$createCacheItem = \Closure::bind( + static function ($key, $value, $isHit) { + $item = new CacheItem(); + $item->key = $key; + $item->value = $value; + $item->isHit = $isHit; + + return $item; + }, + null, + CacheItem::class + ); + } + + /** + * {@inheritdoc} + */ + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed + { + $item = $this->getItem($key); + $metadata = $item->getMetadata(); + + // ArrayAdapter works in memory, we don't care about stampede protection + if (\INF === $beta || !$item->isHit()) { + $save = true; + $item->set($callback($item, $save)); + if ($save) { + $this->save($item); + } + } + + return $item->get(); + } + + /** + * {@inheritdoc} + */ + public function delete(string $key): bool + { + return $this->deleteItem($key); + } + + /** + * {@inheritdoc} + */ + public function hasItem(mixed $key): bool + { + if (\is_string($key) && isset($this->expiries[$key]) && $this->expiries[$key] > microtime(true)) { + if ($this->maxItems) { + // Move the item last in the storage + $value = $this->values[$key]; + unset($this->values[$key]); + $this->values[$key] = $value; + } + + return true; + } + \assert('' !== CacheItem::validateKey($key)); + + return isset($this->expiries[$key]) && !$this->deleteItem($key); + } + + /** + * {@inheritdoc} + */ + public function getItem(mixed $key): CacheItem + { + if (!$isHit = $this->hasItem($key)) { + $value = null; + + if (!$this->maxItems) { + // Track misses in non-LRU mode only + $this->values[$key] = null; + } + } else { + $value = $this->storeSerialized ? $this->unfreeze($key, $isHit) : $this->values[$key]; + } + + return (self::$createCacheItem)($key, $value, $isHit); + } + + /** + * {@inheritdoc} + */ + public function getItems(array $keys = []): iterable + { + \assert(self::validateKeys($keys)); + + return $this->generateItems($keys, microtime(true), self::$createCacheItem); + } + + /** + * {@inheritdoc} + */ + public function deleteItem(mixed $key): bool + { + \assert('' !== CacheItem::validateKey($key)); + unset($this->values[$key], $this->expiries[$key]); + + return true; + } + + /** + * {@inheritdoc} + */ + public function deleteItems(array $keys): bool + { + foreach ($keys as $key) { + $this->deleteItem($key); + } + + return true; + } + + /** + * {@inheritdoc} + */ + public function save(CacheItemInterface $item): bool + { + if (!$item instanceof CacheItem) { + return false; + } + $item = (array) $item; + $key = $item["\0*\0key"]; + $value = $item["\0*\0value"]; + $expiry = $item["\0*\0expiry"]; + + $now = microtime(true); + + if (null !== $expiry) { + if (!$expiry) { + $expiry = \PHP_INT_MAX; + } elseif ($expiry <= $now) { + $this->deleteItem($key); + + return true; + } + } + if ($this->storeSerialized && null === $value = $this->freeze($value, $key)) { + return false; + } + if (null === $expiry && 0 < $this->defaultLifetime) { + $expiry = $this->defaultLifetime; + $expiry = $now + ($expiry > ($this->maxLifetime ?: $expiry) ? $this->maxLifetime : $expiry); + } elseif ($this->maxLifetime && (null === $expiry || $expiry > $now + $this->maxLifetime)) { + $expiry = $now + $this->maxLifetime; + } + + if ($this->maxItems) { + unset($this->values[$key]); + + // Iterate items and vacuum expired ones while we are at it + foreach ($this->values as $k => $v) { + if ($this->expiries[$k] > $now && \count($this->values) < $this->maxItems) { + break; + } + + unset($this->values[$k], $this->expiries[$k]); + } + } + + $this->values[$key] = $value; + $this->expiries[$key] = $expiry ?? \PHP_INT_MAX; + + return true; + } + + /** + * {@inheritdoc} + */ + public function saveDeferred(CacheItemInterface $item): bool + { + return $this->save($item); + } + + /** + * {@inheritdoc} + */ + public function commit(): bool + { + return true; + } + + /** + * {@inheritdoc} + */ + public function clear(string $prefix = ''): bool + { + if ('' !== $prefix) { + $now = microtime(true); + + foreach ($this->values as $key => $value) { + if (!isset($this->expiries[$key]) || $this->expiries[$key] <= $now || 0 === strpos($key, $prefix)) { + unset($this->values[$key], $this->expiries[$key]); + } + } + + if ($this->values) { + return true; + } + } + + $this->values = $this->expiries = []; + + return true; + } + + /** + * Returns all cached values, with cache miss as null. + */ + public function getValues(): array + { + if (!$this->storeSerialized) { + return $this->values; + } + + $values = $this->values; + foreach ($values as $k => $v) { + if (null === $v || 'N;' === $v) { + continue; + } + if (!\is_string($v) || !isset($v[2]) || ':' !== $v[1]) { + $values[$k] = serialize($v); + } + } + + return $values; + } + + /** + * {@inheritdoc} + */ + public function reset() + { + $this->clear(); + } + + private function generateItems(array $keys, float $now, \Closure $f): \Generator + { + foreach ($keys as $i => $key) { + if (!$isHit = isset($this->expiries[$key]) && ($this->expiries[$key] > $now || !$this->deleteItem($key))) { + $value = null; + + if (!$this->maxItems) { + // Track misses in non-LRU mode only + $this->values[$key] = null; + } + } else { + if ($this->maxItems) { + // Move the item last in the storage + $value = $this->values[$key]; + unset($this->values[$key]); + $this->values[$key] = $value; + } + + $value = $this->storeSerialized ? $this->unfreeze($key, $isHit) : $this->values[$key]; + } + unset($keys[$i]); + + yield $key => $f($key, $value, $isHit); + } + + foreach ($keys as $key) { + yield $key => $f($key, null, false); + } + } + + private function freeze($value, string $key) + { + if (null === $value) { + return 'N;'; + } + if (\is_string($value)) { + // Serialize strings if they could be confused with serialized objects or arrays + if ('N;' === $value || (isset($value[2]) && ':' === $value[1])) { + return serialize($value); + } + } elseif (!\is_scalar($value)) { + try { + $serialized = serialize($value); + } catch (\Exception $e) { + unset($this->values[$key]); + $type = get_debug_type($value); + $message = sprintf('Failed to save key "{key}" of type %s: %s', $type, $e->getMessage()); + CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); + + return; + } + // Keep value serialized if it contains any objects or any internal references + if ('C' === $serialized[0] || 'O' === $serialized[0] || preg_match('/;[OCRr]:[1-9]/', $serialized)) { + return $serialized; + } + } + + return $value; + } + + private function unfreeze(string $key, bool &$isHit) + { + if ('N;' === $value = $this->values[$key]) { + return null; + } + if (\is_string($value) && isset($value[2]) && ':' === $value[1]) { + try { + $value = unserialize($value); + } catch (\Exception $e) { + CacheItem::log($this->logger, 'Failed to unserialize key "{key}": '.$e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); + $value = false; + } + if (false === $value) { + $value = null; + $isHit = false; + + if (!$this->maxItems) { + $this->values[$key] = null; + } + } + } + + return $value; + } + + private function validateKeys(array $keys): bool + { + foreach ($keys as $key) { + if (!\is_string($key) || !isset($this->expiries[$key])) { + CacheItem::validateKey($key); + } + } + + return true; + } +} diff --git a/vendor/symfony/cache/Adapter/ChainAdapter.php b/vendor/symfony/cache/Adapter/ChainAdapter.php new file mode 100644 index 0000000..b003ce0 --- /dev/null +++ b/vendor/symfony/cache/Adapter/ChainAdapter.php @@ -0,0 +1,328 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Psr\Cache\CacheItemInterface; +use Psr\Cache\CacheItemPoolInterface; +use Symfony\Component\Cache\CacheItem; +use Symfony\Component\Cache\Exception\InvalidArgumentException; +use Symfony\Component\Cache\PruneableInterface; +use Symfony\Component\Cache\ResettableInterface; +use Symfony\Component\Cache\Traits\ContractsTrait; +use Symfony\Contracts\Cache\CacheInterface; +use Symfony\Contracts\Service\ResetInterface; + +/** + * Chains several adapters together. + * + * Cached items are fetched from the first adapter having them in its data store. + * They are saved and deleted in all adapters at once. + * + * @author Kévin Dunglas <dunglas@gmail.com> + */ +class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface +{ + use ContractsTrait; + + private array $adapters = []; + private int $adapterCount; + private int $defaultLifetime; + + private static \Closure $syncItem; + + /** + * @param CacheItemPoolInterface[] $adapters The ordered list of adapters used to fetch cached items + * @param int $defaultLifetime The default lifetime of items propagated from lower adapters to upper ones + */ + public function __construct(array $adapters, int $defaultLifetime = 0) + { + if (!$adapters) { + throw new InvalidArgumentException('At least one adapter must be specified.'); + } + + foreach ($adapters as $adapter) { + if (!$adapter instanceof CacheItemPoolInterface) { + throw new InvalidArgumentException(sprintf('The class "%s" does not implement the "%s" interface.', get_debug_type($adapter), CacheItemPoolInterface::class)); + } + if (\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) && $adapter instanceof ApcuAdapter && !filter_var(\ini_get('apc.enable_cli'), \FILTER_VALIDATE_BOOLEAN)) { + continue; // skip putting APCu in the chain when the backend is disabled + } + + if ($adapter instanceof AdapterInterface) { + $this->adapters[] = $adapter; + } else { + $this->adapters[] = new ProxyAdapter($adapter); + } + } + $this->adapterCount = \count($this->adapters); + $this->defaultLifetime = $defaultLifetime; + + self::$syncItem ?? self::$syncItem = \Closure::bind( + static function ($sourceItem, $item, $defaultLifetime, $sourceMetadata = null) { + $sourceItem->isTaggable = false; + $sourceMetadata = $sourceMetadata ?? $sourceItem->metadata; + unset($sourceMetadata[CacheItem::METADATA_TAGS]); + + $item->value = $sourceItem->value; + $item->isHit = $sourceItem->isHit; + $item->metadata = $item->newMetadata = $sourceItem->metadata = $sourceMetadata; + + if (isset($item->metadata[CacheItem::METADATA_EXPIRY])) { + $item->expiresAt(\DateTime::createFromFormat('U.u', sprintf('%.6F', $item->metadata[CacheItem::METADATA_EXPIRY]))); + } elseif (0 < $defaultLifetime) { + $item->expiresAfter($defaultLifetime); + } + + return $item; + }, + null, + CacheItem::class + ); + } + + /** + * {@inheritdoc} + */ + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed + { + $doSave = true; + $callback = static function (CacheItem $item, bool &$save) use ($callback, &$doSave) { + $value = $callback($item, $save); + $doSave = $save; + + return $value; + }; + + $lastItem = null; + $i = 0; + $wrap = function (CacheItem $item = null, bool &$save = true) use ($key, $callback, $beta, &$wrap, &$i, &$doSave, &$lastItem, &$metadata) { + $adapter = $this->adapters[$i]; + if (isset($this->adapters[++$i])) { + $callback = $wrap; + $beta = \INF === $beta ? \INF : 0; + } + if ($adapter instanceof CacheInterface) { + $value = $adapter->get($key, $callback, $beta, $metadata); + } else { + $value = $this->doGet($adapter, $key, $callback, $beta, $metadata); + } + if (null !== $item) { + (self::$syncItem)($lastItem = $lastItem ?? $item, $item, $this->defaultLifetime, $metadata); + } + $save = $doSave; + + return $value; + }; + + return $wrap(); + } + + /** + * {@inheritdoc} + */ + public function getItem(mixed $key): CacheItem + { + $syncItem = self::$syncItem; + $misses = []; + + foreach ($this->adapters as $i => $adapter) { + $item = $adapter->getItem($key); + + if ($item->isHit()) { + while (0 <= --$i) { + $this->adapters[$i]->save($syncItem($item, $misses[$i], $this->defaultLifetime)); + } + + return $item; + } + + $misses[$i] = $item; + } + + return $item; + } + + /** + * {@inheritdoc} + */ + public function getItems(array $keys = []): iterable + { + return $this->generateItems($this->adapters[0]->getItems($keys), 0); + } + + private function generateItems(iterable $items, int $adapterIndex): \Generator + { + $missing = []; + $misses = []; + $nextAdapterIndex = $adapterIndex + 1; + $nextAdapter = $this->adapters[$nextAdapterIndex] ?? null; + + foreach ($items as $k => $item) { + if (!$nextAdapter || $item->isHit()) { + yield $k => $item; + } else { + $missing[] = $k; + $misses[$k] = $item; + } + } + + if ($missing) { + $syncItem = self::$syncItem; + $adapter = $this->adapters[$adapterIndex]; + $items = $this->generateItems($nextAdapter->getItems($missing), $nextAdapterIndex); + + foreach ($items as $k => $item) { + if ($item->isHit()) { + $adapter->save($syncItem($item, $misses[$k], $this->defaultLifetime)); + } + + yield $k => $item; + } + } + } + + /** + * {@inheritdoc} + */ + public function hasItem(mixed $key): bool + { + foreach ($this->adapters as $adapter) { + if ($adapter->hasItem($key)) { + return true; + } + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function clear(string $prefix = ''): bool + { + $cleared = true; + $i = $this->adapterCount; + + while ($i--) { + if ($this->adapters[$i] instanceof AdapterInterface) { + $cleared = $this->adapters[$i]->clear($prefix) && $cleared; + } else { + $cleared = $this->adapters[$i]->clear() && $cleared; + } + } + + return $cleared; + } + + /** + * {@inheritdoc} + */ + public function deleteItem(mixed $key): bool + { + $deleted = true; + $i = $this->adapterCount; + + while ($i--) { + $deleted = $this->adapters[$i]->deleteItem($key) && $deleted; + } + + return $deleted; + } + + /** + * {@inheritdoc} + */ + public function deleteItems(array $keys): bool + { + $deleted = true; + $i = $this->adapterCount; + + while ($i--) { + $deleted = $this->adapters[$i]->deleteItems($keys) && $deleted; + } + + return $deleted; + } + + /** + * {@inheritdoc} + */ + public function save(CacheItemInterface $item): bool + { + $saved = true; + $i = $this->adapterCount; + + while ($i--) { + $saved = $this->adapters[$i]->save($item) && $saved; + } + + return $saved; + } + + /** + * {@inheritdoc} + */ + public function saveDeferred(CacheItemInterface $item): bool + { + $saved = true; + $i = $this->adapterCount; + + while ($i--) { + $saved = $this->adapters[$i]->saveDeferred($item) && $saved; + } + + return $saved; + } + + /** + * {@inheritdoc} + */ + public function commit(): bool + { + $committed = true; + $i = $this->adapterCount; + + while ($i--) { + $committed = $this->adapters[$i]->commit() && $committed; + } + + return $committed; + } + + /** + * {@inheritdoc} + */ + public function prune(): bool + { + $pruned = true; + + foreach ($this->adapters as $adapter) { + if ($adapter instanceof PruneableInterface) { + $pruned = $adapter->prune() && $pruned; + } + } + + return $pruned; + } + + /** + * {@inheritdoc} + */ + public function reset() + { + foreach ($this->adapters as $adapter) { + if ($adapter instanceof ResetInterface) { + $adapter->reset(); + } + } + } +} diff --git a/vendor/symfony/cache/Adapter/CouchbaseBucketAdapter.php b/vendor/symfony/cache/Adapter/CouchbaseBucketAdapter.php new file mode 100644 index 0000000..1107c1d --- /dev/null +++ b/vendor/symfony/cache/Adapter/CouchbaseBucketAdapter.php @@ -0,0 +1,247 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Symfony\Component\Cache\Exception\CacheException; +use Symfony\Component\Cache\Exception\InvalidArgumentException; +use Symfony\Component\Cache\Marshaller\DefaultMarshaller; +use Symfony\Component\Cache\Marshaller\MarshallerInterface; + +/** + * @author Antonio Jose Cerezo Aranda <aj.cerezo@gmail.com> + */ +class CouchbaseBucketAdapter extends AbstractAdapter +{ + private const THIRTY_DAYS_IN_SECONDS = 2592000; + private const MAX_KEY_LENGTH = 250; + private const KEY_NOT_FOUND = 13; + private const VALID_DSN_OPTIONS = [ + 'operationTimeout', + 'configTimeout', + 'configNodeTimeout', + 'n1qlTimeout', + 'httpTimeout', + 'configDelay', + 'htconfigIdleTimeout', + 'durabilityInterval', + 'durabilityTimeout', + ]; + + private $bucket; + private $marshaller; + + public function __construct(\CouchbaseBucket $bucket, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) + { + if (!static::isSupported()) { + throw new CacheException('Couchbase >= 2.6.0 < 3.0.0 is required.'); + } + + $this->maxIdLength = static::MAX_KEY_LENGTH; + + $this->bucket = $bucket; + + parent::__construct($namespace, $defaultLifetime); + $this->enableVersioning(); + $this->marshaller = $marshaller ?? new DefaultMarshaller(); + } + + public static function createConnection(array|string $servers, array $options = []): \CouchbaseBucket + { + if (\is_string($servers)) { + $servers = [$servers]; + } + + if (!static::isSupported()) { + throw new CacheException('Couchbase >= 2.6.0 < 3.0.0 is required.'); + } + + set_error_handler(function ($type, $msg, $file, $line) { throw new \ErrorException($msg, 0, $type, $file, $line); }); + + $dsnPattern = '/^(?<protocol>couchbase(?:s)?)\:\/\/(?:(?<username>[^\:]+)\:(?<password>[^\@]{6,})@)?' + .'(?<host>[^\:]+(?:\:\d+)?)(?:\/(?<bucketName>[^\?]+))(?:\?(?<options>.*))?$/i'; + + $newServers = []; + $protocol = 'couchbase'; + try { + $options = self::initOptions($options); + $username = $options['username']; + $password = $options['password']; + + foreach ($servers as $dsn) { + if (0 !== strpos($dsn, 'couchbase:')) { + throw new InvalidArgumentException(sprintf('Invalid Couchbase DSN: "%s" does not start with "couchbase:".', $dsn)); + } + + preg_match($dsnPattern, $dsn, $matches); + + $username = $matches['username'] ?: $username; + $password = $matches['password'] ?: $password; + $protocol = $matches['protocol'] ?: $protocol; + + if (isset($matches['options'])) { + $optionsInDsn = self::getOptions($matches['options']); + + foreach ($optionsInDsn as $parameter => $value) { + $options[$parameter] = $value; + } + } + + $newServers[] = $matches['host']; + } + + $connectionString = $protocol.'://'.implode(',', $newServers); + + $client = new \CouchbaseCluster($connectionString); + $client->authenticateAs($username, $password); + + $bucket = $client->openBucket($matches['bucketName']); + + unset($options['username'], $options['password']); + foreach ($options as $option => $value) { + if (!empty($value)) { + $bucket->$option = $value; + } + } + + return $bucket; + } finally { + restore_error_handler(); + } + } + + public static function isSupported(): bool + { + return \extension_loaded('couchbase') && version_compare(phpversion('couchbase'), '2.6.0', '>=') && version_compare(phpversion('couchbase'), '3.0', '<'); + } + + private static function getOptions(string $options): array + { + $results = []; + $optionsInArray = explode('&', $options); + + foreach ($optionsInArray as $option) { + [$key, $value] = explode('=', $option); + + if (\in_array($key, static::VALID_DSN_OPTIONS, true)) { + $results[$key] = $value; + } + } + + return $results; + } + + private static function initOptions(array $options): array + { + $options['username'] = $options['username'] ?? ''; + $options['password'] = $options['password'] ?? ''; + $options['operationTimeout'] = $options['operationTimeout'] ?? 0; + $options['configTimeout'] = $options['configTimeout'] ?? 0; + $options['configNodeTimeout'] = $options['configNodeTimeout'] ?? 0; + $options['n1qlTimeout'] = $options['n1qlTimeout'] ?? 0; + $options['httpTimeout'] = $options['httpTimeout'] ?? 0; + $options['configDelay'] = $options['configDelay'] ?? 0; + $options['htconfigIdleTimeout'] = $options['htconfigIdleTimeout'] ?? 0; + $options['durabilityInterval'] = $options['durabilityInterval'] ?? 0; + $options['durabilityTimeout'] = $options['durabilityTimeout'] ?? 0; + + return $options; + } + + /** + * {@inheritdoc} + */ + protected function doFetch(array $ids): iterable + { + $resultsCouchbase = $this->bucket->get($ids); + + $results = []; + foreach ($resultsCouchbase as $key => $value) { + if (null !== $value->error) { + continue; + } + $results[$key] = $this->marshaller->unmarshall($value->value); + } + + return $results; + } + + /** + * {@inheritdoc} + */ + protected function doHave(string $id): bool + { + return false !== $this->bucket->get($id); + } + + /** + * {@inheritdoc} + */ + protected function doClear(string $namespace): bool + { + if ('' === $namespace) { + $this->bucket->manager()->flush(); + + return true; + } + + return false; + } + + /** + * {@inheritdoc} + */ + protected function doDelete(array $ids): bool + { + $results = $this->bucket->remove(array_values($ids)); + + foreach ($results as $key => $result) { + if (null !== $result->error && static::KEY_NOT_FOUND !== $result->error->getCode()) { + continue; + } + unset($results[$key]); + } + + return 0 === \count($results); + } + + /** + * {@inheritdoc} + */ + protected function doSave(array $values, int $lifetime): array|bool + { + if (!$values = $this->marshaller->marshall($values, $failed)) { + return $failed; + } + + $lifetime = $this->normalizeExpiry($lifetime); + + $ko = []; + foreach ($values as $key => $value) { + $result = $this->bucket->upsert($key, $value, ['expiry' => $lifetime]); + + if (null !== $result->error) { + $ko[$key] = $result; + } + } + + return [] === $ko ? true : $ko; + } + + private function normalizeExpiry(int $expiry): int + { + if ($expiry && $expiry > static::THIRTY_DAYS_IN_SECONDS) { + $expiry += time(); + } + + return $expiry; + } +} diff --git a/vendor/symfony/cache/Adapter/CouchbaseCollectionAdapter.php b/vendor/symfony/cache/Adapter/CouchbaseCollectionAdapter.php new file mode 100644 index 0000000..6c91ef4 --- /dev/null +++ b/vendor/symfony/cache/Adapter/CouchbaseCollectionAdapter.php @@ -0,0 +1,214 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Couchbase\Bucket; +use Couchbase\Cluster; +use Couchbase\ClusterOptions; +use Couchbase\Collection; +use Couchbase\DocumentNotFoundException; +use Couchbase\UpsertOptions; +use Symfony\Component\Cache\Exception\CacheException; +use Symfony\Component\Cache\Exception\InvalidArgumentException; +use Symfony\Component\Cache\Marshaller\DefaultMarshaller; +use Symfony\Component\Cache\Marshaller\MarshallerInterface; + +/** + * @author Antonio Jose Cerezo Aranda <aj.cerezo@gmail.com> + */ +class CouchbaseCollectionAdapter extends AbstractAdapter +{ + private const MAX_KEY_LENGTH = 250; + + private $connection; + private $marshaller; + + public function __construct(Collection $connection, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) + { + if (!static::isSupported()) { + throw new CacheException('Couchbase >= 3.0.0 < 4.0.0 is required.'); + } + + $this->maxIdLength = static::MAX_KEY_LENGTH; + + $this->connection = $connection; + + parent::__construct($namespace, $defaultLifetime); + $this->enableVersioning(); + $this->marshaller = $marshaller ?? new DefaultMarshaller(); + } + + public static function createConnection(array|string $dsn, array $options = []): Bucket|Collection + { + if (\is_string($dsn)) { + $dsn = [$dsn]; + } + + if (!static::isSupported()) { + throw new CacheException('Couchbase >= 3.0.0 < 4.0.0 is required.'); + } + + set_error_handler(function ($type, $msg, $file, $line): bool { throw new \ErrorException($msg, 0, $type, $file, $line); }); + + $dsnPattern = '/^(?<protocol>couchbase(?:s)?)\:\/\/(?:(?<username>[^\:]+)\:(?<password>[^\@]{6,})@)?' + .'(?<host>[^\:]+(?:\:\d+)?)(?:\/(?<bucketName>[^\/\?]+))(?:(?:\/(?<scopeName>[^\/]+))' + .'(?:\/(?<collectionName>[^\/\?]+)))?(?:\/)?(?:\?(?<options>.*))?$/i'; + + $newServers = []; + $protocol = 'couchbase'; + try { + $username = $options['username'] ?? ''; + $password = $options['password'] ?? ''; + + foreach ($dsn as $server) { + if (0 !== strpos($server, 'couchbase:')) { + throw new InvalidArgumentException(sprintf('Invalid Couchbase DSN: "%s" does not start with "couchbase:".', $server)); + } + + preg_match($dsnPattern, $server, $matches); + + $username = $matches['username'] ?: $username; + $password = $matches['password'] ?: $password; + $protocol = $matches['protocol'] ?: $protocol; + + if (isset($matches['options'])) { + $optionsInDsn = self::getOptions($matches['options']); + + foreach ($optionsInDsn as $parameter => $value) { + $options[$parameter] = $value; + } + } + + $newServers[] = $matches['host']; + } + + $option = isset($matches['options']) ? '?'.$matches['options'] : ''; + $connectionString = $protocol.'://'.implode(',', $newServers).$option; + + $clusterOptions = new ClusterOptions(); + $clusterOptions->credentials($username, $password); + + $client = new Cluster($connectionString, $clusterOptions); + + $bucket = $client->bucket($matches['bucketName']); + $collection = $bucket->defaultCollection(); + if (!empty($matches['scopeName'])) { + $scope = $bucket->scope($matches['scopeName']); + $collection = $scope->collection($matches['collectionName']); + } + + return $collection; + } finally { + restore_error_handler(); + } + } + + public static function isSupported(): bool + { + return \extension_loaded('couchbase') && version_compare(phpversion('couchbase'), '3.0.5', '>=') && version_compare(phpversion('couchbase'), '4.0', '<'); + } + + private static function getOptions(string $options): array + { + $results = []; + $optionsInArray = explode('&', $options); + + foreach ($optionsInArray as $option) { + [$key, $value] = explode('=', $option); + + $results[$key] = $value; + } + + return $results; + } + + /** + * {@inheritdoc} + */ + protected function doFetch(array $ids): array + { + $results = []; + foreach ($ids as $id) { + try { + $resultCouchbase = $this->connection->get($id); + } catch (DocumentNotFoundException $exception) { + continue; + } + + $content = $resultCouchbase->value ?? $resultCouchbase->content(); + + $results[$id] = $this->marshaller->unmarshall($content); + } + + return $results; + } + + /** + * {@inheritdoc} + */ + protected function doHave($id): bool + { + return $this->connection->exists($id)->exists(); + } + + /** + * {@inheritdoc} + */ + protected function doClear($namespace): bool + { + return false; + } + + /** + * {@inheritdoc} + */ + protected function doDelete(array $ids): bool + { + $idsErrors = []; + foreach ($ids as $id) { + try { + $result = $this->connection->remove($id); + + if (null === $result->mutationToken()) { + $idsErrors[] = $id; + } + } catch (DocumentNotFoundException $exception) { + } + } + + return 0 === \count($idsErrors); + } + + /** + * {@inheritdoc} + */ + protected function doSave(array $values, $lifetime): array|bool + { + if (!$values = $this->marshaller->marshall($values, $failed)) { + return $failed; + } + + $upsertOptions = new UpsertOptions(); + $upsertOptions->expiry($lifetime); + + $ko = []; + foreach ($values as $key => $value) { + try { + $this->connection->upsert($key, $value, $upsertOptions); + } catch (\Exception $exception) { + $ko[$key] = ''; + } + } + + return [] === $ko ? true : $ko; + } +} diff --git a/vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php b/vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php new file mode 100644 index 0000000..606f341 --- /dev/null +++ b/vendor/symfony/cache/Adapter/DoctrineDbalAdapter.php @@ -0,0 +1,393 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Doctrine\DBAL\Connection; +use Doctrine\DBAL\Driver\ServerInfoAwareConnection; +use Doctrine\DBAL\DriverManager; +use Doctrine\DBAL\Exception as DBALException; +use Doctrine\DBAL\Exception\TableNotFoundException; +use Doctrine\DBAL\ParameterType; +use Doctrine\DBAL\Schema\Schema; +use Symfony\Component\Cache\Exception\InvalidArgumentException; +use Symfony\Component\Cache\Marshaller\DefaultMarshaller; +use Symfony\Component\Cache\Marshaller\MarshallerInterface; +use Symfony\Component\Cache\PruneableInterface; + +class DoctrineDbalAdapter extends AbstractAdapter implements PruneableInterface +{ + protected $maxIdLength = 255; + + private $marshaller; + private $conn; + private string $platformName; + private string $serverVersion; + private string $table = 'cache_items'; + private string $idCol = 'item_id'; + private string $dataCol = 'item_data'; + private string $lifetimeCol = 'item_lifetime'; + private string $timeCol = 'item_time'; + private string $namespace; + + /** + * You can either pass an existing database Doctrine DBAL Connection or + * a DSN string that will be used to connect to the database. + * + * The cache table is created automatically when possible. + * Otherwise, use the createTable() method. + * + * List of available options: + * * db_table: The name of the table [default: cache_items] + * * db_id_col: The column where to store the cache id [default: item_id] + * * db_data_col: The column where to store the cache data [default: item_data] + * * db_lifetime_col: The column where to store the lifetime [default: item_lifetime] + * * db_time_col: The column where to store the timestamp [default: item_time] + * + * @throws InvalidArgumentException When namespace contains invalid characters + */ + public function __construct(Connection|string $connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], MarshallerInterface $marshaller = null) + { + if (isset($namespace[0]) && preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) { + throw new InvalidArgumentException(sprintf('Namespace contains "%s" but only characters in [-+.A-Za-z0-9] are allowed.', $match[0])); + } + + if ($connOrDsn instanceof Connection) { + $this->conn = $connOrDsn; + } else { + if (!class_exists(DriverManager::class)) { + throw new InvalidArgumentException(sprintf('Failed to parse the DSN "%s". Try running "composer require doctrine/dbal".', $connOrDsn)); + } + $this->conn = DriverManager::getConnection(['url' => $connOrDsn]); + } + + $this->table = $options['db_table'] ?? $this->table; + $this->idCol = $options['db_id_col'] ?? $this->idCol; + $this->dataCol = $options['db_data_col'] ?? $this->dataCol; + $this->lifetimeCol = $options['db_lifetime_col'] ?? $this->lifetimeCol; + $this->timeCol = $options['db_time_col'] ?? $this->timeCol; + $this->namespace = $namespace; + $this->marshaller = $marshaller ?? new DefaultMarshaller(); + + parent::__construct($namespace, $defaultLifetime); + } + + /** + * Creates the table to store cache items which can be called once for setup. + * + * Cache ID are saved in a column of maximum length 255. Cache data is + * saved in a BLOB. + * + * @throws DBALException When the table already exists + */ + public function createTable(): void + { + $schema = new Schema(); + $this->addTableToSchema($schema); + + foreach ($schema->toSql($this->conn->getDatabasePlatform()) as $sql) { + $this->conn->executeStatement($sql); + } + } + + /** + * {@inheritdoc} + */ + public function configureSchema(Schema $schema, Connection $forConnection): void + { + // only update the schema for this connection + if ($forConnection !== $this->conn) { + return; + } + + if ($schema->hasTable($this->table)) { + return; + } + + $this->addTableToSchema($schema); + } + + /** + * {@inheritdoc} + */ + public function prune(): bool + { + $deleteSql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ?"; + $params = [time()]; + $paramTypes = [ParameterType::INTEGER]; + + if ('' !== $this->namespace) { + $deleteSql .= " AND $this->idCol LIKE ?"; + $params[] = sprintf('%s%%', $this->namespace); + $paramTypes[] = ParameterType::STRING; + } + + try { + $this->conn->executeStatement($deleteSql, $params, $paramTypes); + } catch (TableNotFoundException $e) { + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doFetch(array $ids): iterable + { + $now = time(); + $expired = []; + + $sql = "SELECT $this->idCol, CASE WHEN $this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > ? THEN $this->dataCol ELSE NULL END FROM $this->table WHERE $this->idCol IN (?)"; + $result = $this->conn->executeQuery($sql, [ + $now, + $ids, + ], [ + ParameterType::INTEGER, + Connection::PARAM_STR_ARRAY, + ])->iterateNumeric(); + + foreach ($result as $row) { + if (null === $row[1]) { + $expired[] = $row[0]; + } else { + yield $row[0] => $this->marshaller->unmarshall(\is_resource($row[1]) ? stream_get_contents($row[1]) : $row[1]); + } + } + + if ($expired) { + $sql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ? AND $this->idCol IN (?)"; + $this->conn->executeStatement($sql, [ + $now, + $expired, + ], [ + ParameterType::INTEGER, + Connection::PARAM_STR_ARRAY, + ]); + } + } + + /** + * {@inheritdoc} + */ + protected function doHave(string $id): bool + { + $sql = "SELECT 1 FROM $this->table WHERE $this->idCol = ? AND ($this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > ?)"; + $result = $this->conn->executeQuery($sql, [ + $id, + time(), + ], [ + ParameterType::STRING, + ParameterType::INTEGER, + ]); + + return (bool) $result->fetchOne(); + } + + /** + * {@inheritdoc} + */ + protected function doClear(string $namespace): bool + { + if ('' === $namespace) { + if ('sqlite' === $this->getPlatformName()) { + $sql = "DELETE FROM $this->table"; + } else { + $sql = "TRUNCATE TABLE $this->table"; + } + } else { + $sql = "DELETE FROM $this->table WHERE $this->idCol LIKE '$namespace%'"; + } + + try { + $this->conn->executeStatement($sql); + } catch (TableNotFoundException $e) { + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doDelete(array $ids): bool + { + $sql = "DELETE FROM $this->table WHERE $this->idCol IN (?)"; + try { + $this->conn->executeStatement($sql, [array_values($ids)], [Connection::PARAM_STR_ARRAY]); + } catch (TableNotFoundException $e) { + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doSave(array $values, int $lifetime): array|bool + { + if (!$values = $this->marshaller->marshall($values, $failed)) { + return $failed; + } + + $platformName = $this->getPlatformName(); + $insertSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?)"; + + switch (true) { + case 'mysql' === $platformName: + $sql = $insertSql." ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)"; + break; + case 'oci' === $platformName: + // DUAL is Oracle specific dummy table + $sql = "MERGE INTO $this->table USING DUAL ON ($this->idCol = ?) ". + "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ". + "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?"; + break; + case 'sqlsrv' === $platformName && version_compare($this->getServerVersion(), '10', '>='): + // MERGE is only available since SQL Server 2008 and must be terminated by semicolon + // It also requires HOLDLOCK according to http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx + $sql = "MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) ". + "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ". + "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;"; + break; + case 'sqlite' === $platformName: + $sql = 'INSERT OR REPLACE'.substr($insertSql, 6); + break; + case 'pgsql' === $platformName && version_compare($this->getServerVersion(), '9.5', '>='): + $sql = $insertSql." ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)"; + break; + default: + $platformName = null; + $sql = "UPDATE $this->table SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ? WHERE $this->idCol = ?"; + break; + } + + $now = time(); + $lifetime = $lifetime ?: null; + try { + $stmt = $this->conn->prepare($sql); + } catch (TableNotFoundException $e) { + if (!$this->conn->isTransactionActive() || \in_array($platformName, ['pgsql', 'sqlite', 'sqlsrv'], true)) { + $this->createTable(); + } + $stmt = $this->conn->prepare($sql); + } + + // $id and $data are defined later in the loop. Binding is done by reference, values are read on execution. + if ('sqlsrv' === $platformName || 'oci' === $platformName) { + $stmt->bindParam(1, $id); + $stmt->bindParam(2, $id); + $stmt->bindParam(3, $data, ParameterType::LARGE_OBJECT); + $stmt->bindValue(4, $lifetime, ParameterType::INTEGER); + $stmt->bindValue(5, $now, ParameterType::INTEGER); + $stmt->bindParam(6, $data, ParameterType::LARGE_OBJECT); + $stmt->bindValue(7, $lifetime, ParameterType::INTEGER); + $stmt->bindValue(8, $now, ParameterType::INTEGER); + } elseif (null !== $platformName) { + $stmt->bindParam(1, $id); + $stmt->bindParam(2, $data, ParameterType::LARGE_OBJECT); + $stmt->bindValue(3, $lifetime, ParameterType::INTEGER); + $stmt->bindValue(4, $now, ParameterType::INTEGER); + } else { + $stmt->bindParam(1, $data, ParameterType::LARGE_OBJECT); + $stmt->bindValue(2, $lifetime, ParameterType::INTEGER); + $stmt->bindValue(3, $now, ParameterType::INTEGER); + $stmt->bindParam(4, $id); + + $insertStmt = $this->conn->prepare($insertSql); + $insertStmt->bindParam(1, $id); + $insertStmt->bindParam(2, $data, ParameterType::LARGE_OBJECT); + $insertStmt->bindValue(3, $lifetime, ParameterType::INTEGER); + $insertStmt->bindValue(4, $now, ParameterType::INTEGER); + } + + foreach ($values as $id => $data) { + try { + $rowCount = $stmt->executeStatement(); + } catch (TableNotFoundException $e) { + if (!$this->conn->isTransactionActive() || \in_array($platformName, ['pgsql', 'sqlite', 'sqlsrv'], true)) { + $this->createTable(); + } + $rowCount = $stmt->executeStatement(); + } + if (null === $platformName && 0 === $rowCount) { + try { + $insertStmt->executeStatement(); + } catch (DBALException $e) { + // A concurrent write won, let it be + } + } + } + + return $failed; + } + + private function getPlatformName(): string + { + if (isset($this->platformName)) { + return $this->platformName; + } + + $platform = $this->conn->getDatabasePlatform(); + + switch (true) { + case $platform instanceof \Doctrine\DBAL\Platforms\MySQLPlatform: + case $platform instanceof \Doctrine\DBAL\Platforms\MySQL57Platform: + return $this->platformName = 'mysql'; + + case $platform instanceof \Doctrine\DBAL\Platforms\SqlitePlatform: + return $this->platformName = 'sqlite'; + + case $platform instanceof \Doctrine\DBAL\Platforms\PostgreSQLPlatform: + case $platform instanceof \Doctrine\DBAL\Platforms\PostgreSQL94Platform: + return $this->platformName = 'pgsql'; + + case $platform instanceof \Doctrine\DBAL\Platforms\OraclePlatform: + return $this->platformName = 'oci'; + + case $platform instanceof \Doctrine\DBAL\Platforms\SQLServerPlatform: + case $platform instanceof \Doctrine\DBAL\Platforms\SQLServer2012Platform: + return $this->platformName = 'sqlsrv'; + + default: + return $this->platformName = \get_class($platform); + } + } + + private function getServerVersion(): string + { + if (isset($this->serverVersion)) { + return $this->serverVersion; + } + + $conn = $this->conn->getWrappedConnection(); + if ($conn instanceof ServerInfoAwareConnection) { + return $this->serverVersion = $conn->getServerVersion(); + } + + return $this->serverVersion = '0'; + } + + private function addTableToSchema(Schema $schema): void + { + $types = [ + 'mysql' => 'binary', + 'sqlite' => 'text', + ]; + + $table = $schema->createTable($this->table); + $table->addColumn($this->idCol, $types[$this->getPlatformName()] ?? 'string', ['length' => 255]); + $table->addColumn($this->dataCol, 'blob', ['length' => 16777215]); + $table->addColumn($this->lifetimeCol, 'integer', ['unsigned' => true, 'notnull' => false]); + $table->addColumn($this->timeCol, 'integer', ['unsigned' => true]); + $table->setPrimaryKey([$this->idCol]); + } +} diff --git a/vendor/symfony/cache/Adapter/FilesystemAdapter.php b/vendor/symfony/cache/Adapter/FilesystemAdapter.php new file mode 100644 index 0000000..7185dd4 --- /dev/null +++ b/vendor/symfony/cache/Adapter/FilesystemAdapter.php @@ -0,0 +1,29 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Symfony\Component\Cache\Marshaller\DefaultMarshaller; +use Symfony\Component\Cache\Marshaller\MarshallerInterface; +use Symfony\Component\Cache\PruneableInterface; +use Symfony\Component\Cache\Traits\FilesystemTrait; + +class FilesystemAdapter extends AbstractAdapter implements PruneableInterface +{ + use FilesystemTrait; + + public function __construct(string $namespace = '', int $defaultLifetime = 0, string $directory = null, MarshallerInterface $marshaller = null) + { + $this->marshaller = $marshaller ?? new DefaultMarshaller(); + parent::__construct('', $defaultLifetime); + $this->init($namespace, $directory); + } +} diff --git a/vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php b/vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php new file mode 100644 index 0000000..140c91f --- /dev/null +++ b/vendor/symfony/cache/Adapter/FilesystemTagAwareAdapter.php @@ -0,0 +1,235 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Symfony\Component\Cache\Marshaller\MarshallerInterface; +use Symfony\Component\Cache\Marshaller\TagAwareMarshaller; +use Symfony\Component\Cache\PruneableInterface; +use Symfony\Component\Cache\Traits\FilesystemTrait; + +/** + * Stores tag id <> cache id relationship as a symlink, and lookup on invalidation calls. + * + * @author Nicolas Grekas <p@tchwork.com> + * @author André Rømcke <andre.romcke+symfony@gmail.com> + */ +class FilesystemTagAwareAdapter extends AbstractTagAwareAdapter implements PruneableInterface +{ + use FilesystemTrait { + doClear as private doClearCache; + doSave as private doSaveCache; + } + + /** + * Folder used for tag symlinks. + */ + private const TAG_FOLDER = 'tags'; + + public function __construct(string $namespace = '', int $defaultLifetime = 0, string $directory = null, MarshallerInterface $marshaller = null) + { + $this->marshaller = new TagAwareMarshaller($marshaller); + parent::__construct('', $defaultLifetime); + $this->init($namespace, $directory); + } + + /** + * {@inheritdoc} + */ + protected function doClear(string $namespace): bool + { + $ok = $this->doClearCache($namespace); + + if ('' !== $namespace) { + return $ok; + } + + set_error_handler(static function () {}); + $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + + try { + foreach ($this->scanHashDir($this->directory.self::TAG_FOLDER.\DIRECTORY_SEPARATOR) as $dir) { + if (rename($dir, $renamed = substr_replace($dir, bin2hex(random_bytes(4)), -8))) { + $dir = $renamed.\DIRECTORY_SEPARATOR; + } else { + $dir .= \DIRECTORY_SEPARATOR; + $renamed = null; + } + + for ($i = 0; $i < 38; ++$i) { + if (!is_dir($dir.$chars[$i])) { + continue; + } + for ($j = 0; $j < 38; ++$j) { + if (!is_dir($d = $dir.$chars[$i].\DIRECTORY_SEPARATOR.$chars[$j])) { + continue; + } + foreach (scandir($d, \SCANDIR_SORT_NONE) ?: [] as $link) { + if ('.' !== $link && '..' !== $link && (null !== $renamed || !realpath($d.\DIRECTORY_SEPARATOR.$link))) { + unlink($d.\DIRECTORY_SEPARATOR.$link); + } + } + null === $renamed ?: rmdir($d); + } + null === $renamed ?: rmdir($dir.$chars[$i]); + } + null === $renamed ?: rmdir($renamed); + } + } finally { + restore_error_handler(); + } + + return $ok; + } + + /** + * {@inheritdoc} + */ + protected function doSave(array $values, int $lifetime, array $addTagData = [], array $removeTagData = []): array + { + $failed = $this->doSaveCache($values, $lifetime); + + // Add Tags as symlinks + foreach ($addTagData as $tagId => $ids) { + $tagFolder = $this->getTagFolder($tagId); + foreach ($ids as $id) { + if ($failed && \in_array($id, $failed, true)) { + continue; + } + + $file = $this->getFile($id); + + if (!@symlink($file, $tagLink = $this->getFile($id, true, $tagFolder)) && !is_link($tagLink)) { + @unlink($file); + $failed[] = $id; + } + } + } + + // Unlink removed Tags + foreach ($removeTagData as $tagId => $ids) { + $tagFolder = $this->getTagFolder($tagId); + foreach ($ids as $id) { + if ($failed && \in_array($id, $failed, true)) { + continue; + } + + @unlink($this->getFile($id, false, $tagFolder)); + } + } + + return $failed; + } + + /** + * {@inheritdoc} + */ + protected function doDeleteYieldTags(array $ids): iterable + { + foreach ($ids as $id) { + $file = $this->getFile($id); + if (!is_file($file) || !$h = @fopen($file, 'r')) { + continue; + } + + if (!@unlink($file)) { + fclose($h); + continue; + } + + $meta = explode("\n", fread($h, 4096), 3)[2] ?? ''; + + // detect the compact format used in marshall() using magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F + if (13 < \strlen($meta) && "\x9D" === $meta[0] && "\0" === $meta[5] && "\x5F" === $meta[9]) { + $meta[9] = "\0"; + $tagLen = unpack('Nlen', $meta, 9)['len']; + $meta = substr($meta, 13, $tagLen); + + if (0 < $tagLen -= \strlen($meta)) { + $meta .= fread($h, $tagLen); + } + + try { + yield $id => '' === $meta ? [] : $this->marshaller->unmarshall($meta); + } catch (\Exception $e) { + yield $id => []; + } + } + + fclose($h); + } + } + + /** + * {@inheritdoc} + */ + protected function doDeleteTagRelations(array $tagData): bool + { + foreach ($tagData as $tagId => $idList) { + $tagFolder = $this->getTagFolder($tagId); + foreach ($idList as $id) { + @unlink($this->getFile($id, false, $tagFolder)); + } + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doInvalidate(array $tagIds): bool + { + foreach ($tagIds as $tagId) { + if (!is_dir($tagFolder = $this->getTagFolder($tagId))) { + continue; + } + + set_error_handler(static function () {}); + + try { + if (rename($tagFolder, $renamed = substr_replace($tagFolder, bin2hex(random_bytes(4)), -9))) { + $tagFolder = $renamed.\DIRECTORY_SEPARATOR; + } else { + $renamed = null; + } + + foreach ($this->scanHashDir($tagFolder) as $itemLink) { + unlink(realpath($itemLink) ?: $itemLink); + unlink($itemLink); + } + + if (null === $renamed) { + continue; + } + + $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + + for ($i = 0; $i < 38; ++$i) { + for ($j = 0; $j < 38; ++$j) { + rmdir($tagFolder.$chars[$i].\DIRECTORY_SEPARATOR.$chars[$j]); + } + rmdir($tagFolder.$chars[$i]); + } + rmdir($renamed); + } finally { + restore_error_handler(); + } + } + + return true; + } + + private function getTagFolder(string $tagId): string + { + return $this->getFile($tagId, false, $this->directory.self::TAG_FOLDER.\DIRECTORY_SEPARATOR).\DIRECTORY_SEPARATOR; + } +} diff --git a/vendor/symfony/cache/Adapter/MemcachedAdapter.php b/vendor/symfony/cache/Adapter/MemcachedAdapter.php new file mode 100644 index 0000000..f00b42d --- /dev/null +++ b/vendor/symfony/cache/Adapter/MemcachedAdapter.php @@ -0,0 +1,349 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Symfony\Component\Cache\Exception\CacheException; +use Symfony\Component\Cache\Exception\InvalidArgumentException; +use Symfony\Component\Cache\Marshaller\DefaultMarshaller; +use Symfony\Component\Cache\Marshaller\MarshallerInterface; + +/** + * @author Rob Frawley 2nd <rmf@src.run> + * @author Nicolas Grekas <p@tchwork.com> + */ +class MemcachedAdapter extends AbstractAdapter +{ + /** + * We are replacing characters that are illegal in Memcached keys with reserved characters from + * {@see \Symfony\Contracts\Cache\ItemInterface::RESERVED_CHARACTERS} that are legal in Memcached. + * Note: don’t use {@see \Symfony\Component\Cache\Adapter\AbstractAdapter::NS_SEPARATOR}. + */ + private const RESERVED_MEMCACHED = " \n\r\t\v\f\0"; + private const RESERVED_PSR6 = '@()\{}/'; + + protected $maxIdLength = 250; + + private const DEFAULT_CLIENT_OPTIONS = [ + 'persistent_id' => null, + 'username' => null, + 'password' => null, + \Memcached::OPT_SERIALIZER => \Memcached::SERIALIZER_PHP, + ]; + + private $marshaller; + private $client; + private $lazyClient; + + /** + * Using a MemcachedAdapter with a TagAwareAdapter for storing tags is discouraged. + * Using a RedisAdapter is recommended instead. If you cannot do otherwise, be aware that: + * - the Memcached::OPT_BINARY_PROTOCOL must be enabled + * (that's the default when using MemcachedAdapter::createConnection()); + * - tags eviction by Memcached's LRU algorithm will break by-tags invalidation; + * your Memcached memory should be large enough to never trigger LRU. + * + * Using a MemcachedAdapter as a pure items store is fine. + */ + public function __construct(\Memcached $client, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) + { + if (!static::isSupported()) { + throw new CacheException('Memcached '.(\PHP_VERSION_ID >= 80100 ? '> 3.1.5' : '>= 2.2.0').' is required.'); + } + if ('Memcached' === \get_class($client)) { + $opt = $client->getOption(\Memcached::OPT_SERIALIZER); + if (\Memcached::SERIALIZER_PHP !== $opt && \Memcached::SERIALIZER_IGBINARY !== $opt) { + throw new CacheException('MemcachedAdapter: "serializer" option must be "php" or "igbinary".'); + } + $this->maxIdLength -= \strlen($client->getOption(\Memcached::OPT_PREFIX_KEY)); + $this->client = $client; + } else { + $this->lazyClient = $client; + } + + parent::__construct($namespace, $defaultLifetime); + $this->enableVersioning(); + $this->marshaller = $marshaller ?? new DefaultMarshaller(); + } + + public static function isSupported() + { + return \extension_loaded('memcached') && version_compare(phpversion('memcached'), \PHP_VERSION_ID >= 80100 ? '3.1.6' : '2.2.0', '>='); + } + + /** + * Creates a Memcached instance. + * + * By default, the binary protocol, no block, and libketama compatible options are enabled. + * + * Examples for servers: + * - 'memcached://user:pass@localhost?weight=33' + * - [['localhost', 11211, 33]] + * + * @param array[]|string|string[] $servers An array of servers, a DSN, or an array of DSNs + * + * @throws \ErrorException When invalid options or servers are provided + */ + public static function createConnection(array|string $servers, array $options = []): \Memcached + { + if (\is_string($servers)) { + $servers = [$servers]; + } + if (!static::isSupported()) { + throw new CacheException('Memcached '.(\PHP_VERSION_ID >= 80100 ? '> 3.1.5' : '>= 2.2.0').' is required.'); + } + set_error_handler(function ($type, $msg, $file, $line) { throw new \ErrorException($msg, 0, $type, $file, $line); }); + try { + $options += static::DEFAULT_CLIENT_OPTIONS; + $client = new \Memcached($options['persistent_id']); + $username = $options['username']; + $password = $options['password']; + + // parse any DSN in $servers + foreach ($servers as $i => $dsn) { + if (\is_array($dsn)) { + continue; + } + if (!str_starts_with($dsn, 'memcached:')) { + throw new InvalidArgumentException(sprintf('Invalid Memcached DSN: "%s" does not start with "memcached:".', $dsn)); + } + $params = preg_replace_callback('#^memcached:(//)?(?:([^@]*+)@)?#', function ($m) use (&$username, &$password) { + if (!empty($m[2])) { + [$username, $password] = explode(':', $m[2], 2) + [1 => null]; + } + + return 'file:'.($m[1] ?? ''); + }, $dsn); + if (false === $params = parse_url($params)) { + throw new InvalidArgumentException(sprintf('Invalid Memcached DSN: "%s".', $dsn)); + } + $query = $hosts = []; + if (isset($params['query'])) { + parse_str($params['query'], $query); + + if (isset($query['host'])) { + if (!\is_array($hosts = $query['host'])) { + throw new InvalidArgumentException(sprintf('Invalid Memcached DSN: "%s".', $dsn)); + } + foreach ($hosts as $host => $weight) { + if (false === $port = strrpos($host, ':')) { + $hosts[$host] = [$host, 11211, (int) $weight]; + } else { + $hosts[$host] = [substr($host, 0, $port), (int) substr($host, 1 + $port), (int) $weight]; + } + } + $hosts = array_values($hosts); + unset($query['host']); + } + if ($hosts && !isset($params['host']) && !isset($params['path'])) { + unset($servers[$i]); + $servers = array_merge($servers, $hosts); + continue; + } + } + if (!isset($params['host']) && !isset($params['path'])) { + throw new InvalidArgumentException(sprintf('Invalid Memcached DSN: "%s".', $dsn)); + } + if (isset($params['path']) && preg_match('#/(\d+)$#', $params['path'], $m)) { + $params['weight'] = $m[1]; + $params['path'] = substr($params['path'], 0, -\strlen($m[0])); + } + $params += [ + 'host' => $params['host'] ?? $params['path'], + 'port' => isset($params['host']) ? 11211 : null, + 'weight' => 0, + ]; + if ($query) { + $params += $query; + $options = $query + $options; + } + + $servers[$i] = [$params['host'], $params['port'], $params['weight']]; + + if ($hosts) { + $servers = array_merge($servers, $hosts); + } + } + + // set client's options + unset($options['persistent_id'], $options['username'], $options['password'], $options['weight'], $options['lazy']); + $options = array_change_key_case($options, \CASE_UPPER); + $client->setOption(\Memcached::OPT_BINARY_PROTOCOL, true); + $client->setOption(\Memcached::OPT_NO_BLOCK, true); + $client->setOption(\Memcached::OPT_TCP_NODELAY, true); + if (!\array_key_exists('LIBKETAMA_COMPATIBLE', $options) && !\array_key_exists(\Memcached::OPT_LIBKETAMA_COMPATIBLE, $options)) { + $client->setOption(\Memcached::OPT_LIBKETAMA_COMPATIBLE, true); + } + foreach ($options as $name => $value) { + if (\is_int($name)) { + continue; + } + if ('HASH' === $name || 'SERIALIZER' === $name || 'DISTRIBUTION' === $name) { + $value = \constant('Memcached::'.$name.'_'.strtoupper($value)); + } + unset($options[$name]); + + if (\defined('Memcached::OPT_'.$name)) { + $options[\constant('Memcached::OPT_'.$name)] = $value; + } + } + $client->setOptions($options); + + // set client's servers, taking care of persistent connections + if (!$client->isPristine()) { + $oldServers = []; + foreach ($client->getServerList() as $server) { + $oldServers[] = [$server['host'], $server['port']]; + } + + $newServers = []; + foreach ($servers as $server) { + if (1 < \count($server)) { + $server = array_values($server); + unset($server[2]); + $server[1] = (int) $server[1]; + } + $newServers[] = $server; + } + + if ($oldServers !== $newServers) { + $client->resetServerList(); + $client->addServers($servers); + } + } else { + $client->addServers($servers); + } + + if (null !== $username || null !== $password) { + if (!method_exists($client, 'setSaslAuthData')) { + trigger_error('Missing SASL support: the memcached extension must be compiled with --enable-memcached-sasl.'); + } + $client->setSaslAuthData($username, $password); + } + + return $client; + } finally { + restore_error_handler(); + } + } + + /** + * {@inheritdoc} + */ + protected function doSave(array $values, int $lifetime): array|bool + { + if (!$values = $this->marshaller->marshall($values, $failed)) { + return $failed; + } + + if ($lifetime && $lifetime > 30 * 86400) { + $lifetime += time(); + } + + $encodedValues = []; + foreach ($values as $key => $value) { + $encodedValues[self::encodeKey($key)] = $value; + } + + return $this->checkResultCode($this->getClient()->setMulti($encodedValues, $lifetime)) ? $failed : false; + } + + /** + * {@inheritdoc} + */ + protected function doFetch(array $ids): iterable + { + try { + $encodedIds = array_map([__CLASS__, 'encodeKey'], $ids); + + $encodedResult = $this->checkResultCode($this->getClient()->getMulti($encodedIds)); + + $result = []; + foreach ($encodedResult as $key => $value) { + $result[self::decodeKey($key)] = $this->marshaller->unmarshall($value); + } + + return $result; + } catch (\Error $e) { + throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine()); + } + } + + /** + * {@inheritdoc} + */ + protected function doHave(string $id): bool + { + return false !== $this->getClient()->get(self::encodeKey($id)) || $this->checkResultCode(\Memcached::RES_SUCCESS === $this->client->getResultCode()); + } + + /** + * {@inheritdoc} + */ + protected function doDelete(array $ids): bool + { + $ok = true; + $encodedIds = array_map([__CLASS__, 'encodeKey'], $ids); + foreach ($this->checkResultCode($this->getClient()->deleteMulti($encodedIds)) as $result) { + if (\Memcached::RES_SUCCESS !== $result && \Memcached::RES_NOTFOUND !== $result) { + $ok = false; + } + } + + return $ok; + } + + /** + * {@inheritdoc} + */ + protected function doClear(string $namespace): bool + { + return '' === $namespace && $this->getClient()->flush(); + } + + private function checkResultCode(mixed $result) + { + $code = $this->client->getResultCode(); + + if (\Memcached::RES_SUCCESS === $code || \Memcached::RES_NOTFOUND === $code) { + return $result; + } + + throw new CacheException('MemcachedAdapter client error: '.strtolower($this->client->getResultMessage())); + } + + private function getClient(): \Memcached + { + if (isset($this->client)) { + return $this->client; + } + + $opt = $this->lazyClient->getOption(\Memcached::OPT_SERIALIZER); + if (\Memcached::SERIALIZER_PHP !== $opt && \Memcached::SERIALIZER_IGBINARY !== $opt) { + throw new CacheException('MemcachedAdapter: "serializer" option must be "php" or "igbinary".'); + } + if ('' !== $prefix = (string) $this->lazyClient->getOption(\Memcached::OPT_PREFIX_KEY)) { + throw new CacheException(sprintf('MemcachedAdapter: "prefix_key" option must be empty when using proxified connections, "%s" given.', $prefix)); + } + + return $this->client = $this->lazyClient; + } + + private static function encodeKey(string $key): string + { + return strtr($key, self::RESERVED_MEMCACHED, self::RESERVED_PSR6); + } + + private static function decodeKey(string $key): string + { + return strtr($key, self::RESERVED_PSR6, self::RESERVED_MEMCACHED); + } +} diff --git a/vendor/symfony/cache/Adapter/NullAdapter.php b/vendor/symfony/cache/Adapter/NullAdapter.php new file mode 100644 index 0000000..7827000 --- /dev/null +++ b/vendor/symfony/cache/Adapter/NullAdapter.php @@ -0,0 +1,138 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Psr\Cache\CacheItemInterface; +use Symfony\Component\Cache\CacheItem; +use Symfony\Contracts\Cache\CacheInterface; + +/** + * @author Titouan Galopin <galopintitouan@gmail.com> + */ +class NullAdapter implements AdapterInterface, CacheInterface +{ + private static $createCacheItem; + + public function __construct() + { + self::$createCacheItem ?? self::$createCacheItem = \Closure::bind( + static function ($key) { + $item = new CacheItem(); + $item->key = $key; + $item->isHit = false; + + return $item; + }, + null, + CacheItem::class + ); + } + + /** + * {@inheritdoc} + */ + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed + { + $save = true; + + return $callback((self::$createCacheItem)($key), $save); + } + + /** + * {@inheritdoc} + */ + public function getItem(mixed $key): CacheItem + { + return (self::$createCacheItem)($key); + } + + /** + * {@inheritdoc} + */ + public function getItems(array $keys = []): iterable + { + return $this->generateItems($keys); + } + + /** + * {@inheritdoc} + */ + public function hasItem(mixed $key): bool + { + return false; + } + + /** + * {@inheritdoc} + */ + public function clear(string $prefix = ''): bool + { + return true; + } + + /** + * {@inheritdoc} + */ + public function deleteItem(mixed $key): bool + { + return true; + } + + /** + * {@inheritdoc} + */ + public function deleteItems(array $keys): bool + { + return true; + } + + /** + * {@inheritdoc} + */ + public function save(CacheItemInterface $item): bool + { + return true; + } + + /** + * {@inheritdoc} + */ + public function saveDeferred(CacheItemInterface $item): bool + { + return true; + } + + /** + * {@inheritdoc} + */ + public function commit(): bool + { + return true; + } + + /** + * {@inheritdoc} + */ + public function delete(string $key): bool + { + return $this->deleteItem($key); + } + + private function generateItems(array $keys): \Generator + { + $f = self::$createCacheItem; + + foreach ($keys as $key) { + yield $key => $f($key); + } + } +} diff --git a/vendor/symfony/cache/Adapter/ParameterNormalizer.php b/vendor/symfony/cache/Adapter/ParameterNormalizer.php new file mode 100644 index 0000000..e33ae9f --- /dev/null +++ b/vendor/symfony/cache/Adapter/ParameterNormalizer.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +/** + * @author Lars Strojny <lars@strojny.net> + */ +final class ParameterNormalizer +{ + public static function normalizeDuration(string $duration): int + { + if (is_numeric($duration)) { + return $duration; + } + + if (false !== $time = strtotime($duration, 0)) { + return $time; + } + + try { + return \DateTime::createFromFormat('U', 0)->add(new \DateInterval($duration))->getTimestamp(); + } catch (\Exception $e) { + throw new \InvalidArgumentException(sprintf('Cannot parse date interval "%s".', $duration), 0, $e); + } + } +} diff --git a/vendor/symfony/cache/Adapter/PdoAdapter.php b/vendor/symfony/cache/Adapter/PdoAdapter.php new file mode 100644 index 0000000..7c3c705 --- /dev/null +++ b/vendor/symfony/cache/Adapter/PdoAdapter.php @@ -0,0 +1,383 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Doctrine\DBAL\Connection; +use Symfony\Component\Cache\Exception\InvalidArgumentException; +use Symfony\Component\Cache\Marshaller\DefaultMarshaller; +use Symfony\Component\Cache\Marshaller\MarshallerInterface; +use Symfony\Component\Cache\PruneableInterface; + +class PdoAdapter extends AbstractAdapter implements PruneableInterface +{ + protected $maxIdLength = 255; + + private $marshaller; + private $conn; + private string $dsn; + private string $driver; + private string $serverVersion; + private mixed $table = 'cache_items'; + private mixed $idCol = 'item_id'; + private mixed $dataCol = 'item_data'; + private mixed $lifetimeCol = 'item_lifetime'; + private mixed $timeCol = 'item_time'; + private mixed $username = ''; + private mixed $password = ''; + private mixed $connectionOptions = []; + private string $namespace; + + /** + * You can either pass an existing database connection as PDO instance or + * a DSN string that will be used to lazy-connect to the database when the + * cache is actually used. + * + * List of available options: + * * db_table: The name of the table [default: cache_items] + * * db_id_col: The column where to store the cache id [default: item_id] + * * db_data_col: The column where to store the cache data [default: item_data] + * * db_lifetime_col: The column where to store the lifetime [default: item_lifetime] + * * db_time_col: The column where to store the timestamp [default: item_time] + * * db_username: The username when lazy-connect [default: ''] + * * db_password: The password when lazy-connect [default: ''] + * * db_connection_options: An array of driver-specific connection options [default: []] + * + * @throws InvalidArgumentException When first argument is not PDO nor Connection nor string + * @throws InvalidArgumentException When PDO error mode is not PDO::ERRMODE_EXCEPTION + * @throws InvalidArgumentException When namespace contains invalid characters + */ + public function __construct(\PDO|string $connOrDsn, string $namespace = '', int $defaultLifetime = 0, array $options = [], MarshallerInterface $marshaller = null) + { + if (\is_string($connOrDsn) && str_contains($connOrDsn, '://')) { + throw new InvalidArgumentException(sprintf('Usage of Doctrine DBAL URL with "%s" is not supported. Use a PDO DSN or "%s" instead. Got "%s".', __CLASS__, DoctrineDbalAdapter::class, $connOrDsn)); + } + + if (isset($namespace[0]) && preg_match('#[^-+.A-Za-z0-9]#', $namespace, $match)) { + throw new InvalidArgumentException(sprintf('Namespace contains "%s" but only characters in [-+.A-Za-z0-9] are allowed.', $match[0])); + } + + if ($connOrDsn instanceof \PDO) { + if (\PDO::ERRMODE_EXCEPTION !== $connOrDsn->getAttribute(\PDO::ATTR_ERRMODE)) { + throw new InvalidArgumentException(sprintf('"%s" requires PDO error mode attribute be set to throw Exceptions (i.e. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)).', __CLASS__)); + } + + $this->conn = $connOrDsn; + } else { + $this->dsn = $connOrDsn; + } + + $this->table = $options['db_table'] ?? $this->table; + $this->idCol = $options['db_id_col'] ?? $this->idCol; + $this->dataCol = $options['db_data_col'] ?? $this->dataCol; + $this->lifetimeCol = $options['db_lifetime_col'] ?? $this->lifetimeCol; + $this->timeCol = $options['db_time_col'] ?? $this->timeCol; + $this->username = $options['db_username'] ?? $this->username; + $this->password = $options['db_password'] ?? $this->password; + $this->connectionOptions = $options['db_connection_options'] ?? $this->connectionOptions; + $this->namespace = $namespace; + $this->marshaller = $marshaller ?? new DefaultMarshaller(); + + parent::__construct($namespace, $defaultLifetime); + } + + /** + * Creates the table to store cache items which can be called once for setup. + * + * Cache ID are saved in a column of maximum length 255. Cache data is + * saved in a BLOB. + * + * @throws \PDOException When the table already exists + * @throws \DomainException When an unsupported PDO driver is used + */ + public function createTable() + { + // connect if we are not yet + $conn = $this->getConnection(); + + switch ($this->driver) { + case 'mysql': + // We use varbinary for the ID column because it prevents unwanted conversions: + // - character set conversions between server and client + // - trailing space removal + // - case-insensitivity + // - language processing like é == e + $sql = "CREATE TABLE $this->table ($this->idCol VARBINARY(255) NOT NULL PRIMARY KEY, $this->dataCol MEDIUMBLOB NOT NULL, $this->lifetimeCol INTEGER UNSIGNED, $this->timeCol INTEGER UNSIGNED NOT NULL) COLLATE utf8mb4_bin, ENGINE = InnoDB"; + break; + case 'sqlite': + $sql = "CREATE TABLE $this->table ($this->idCol TEXT NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)"; + break; + case 'pgsql': + $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol BYTEA NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)"; + break; + case 'oci': + $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR2(255) NOT NULL PRIMARY KEY, $this->dataCol BLOB NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)"; + break; + case 'sqlsrv': + $sql = "CREATE TABLE $this->table ($this->idCol VARCHAR(255) NOT NULL PRIMARY KEY, $this->dataCol VARBINARY(MAX) NOT NULL, $this->lifetimeCol INTEGER, $this->timeCol INTEGER NOT NULL)"; + break; + default: + throw new \DomainException(sprintf('Creating the cache table is currently not implemented for PDO driver "%s".', $this->driver)); + } + + $conn->exec($sql); + } + + /** + * {@inheritdoc} + */ + public function prune(): bool + { + $deleteSql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= :time"; + + if ('' !== $this->namespace) { + $deleteSql .= " AND $this->idCol LIKE :namespace"; + } + + $connection = $this->getConnection(); + + try { + $delete = $connection->prepare($deleteSql); + } catch (\PDOException $e) { + return true; + } + $delete->bindValue(':time', time(), \PDO::PARAM_INT); + + if ('' !== $this->namespace) { + $delete->bindValue(':namespace', sprintf('%s%%', $this->namespace), \PDO::PARAM_STR); + } + try { + return $delete->execute(); + } catch (\PDOException $e) { + return true; + } + } + + /** + * {@inheritdoc} + */ + protected function doFetch(array $ids): iterable + { + $connection = $this->getConnection(); + + $now = time(); + $expired = []; + + $sql = str_pad('', (\count($ids) << 1) - 1, '?,'); + $sql = "SELECT $this->idCol, CASE WHEN $this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > ? THEN $this->dataCol ELSE NULL END FROM $this->table WHERE $this->idCol IN ($sql)"; + $stmt = $connection->prepare($sql); + $stmt->bindValue($i = 1, $now, \PDO::PARAM_INT); + foreach ($ids as $id) { + $stmt->bindValue(++$i, $id); + } + $result = $stmt->execute(); + + if (\is_object($result)) { + $result = $result->iterateNumeric(); + } else { + $stmt->setFetchMode(\PDO::FETCH_NUM); + $result = $stmt; + } + + foreach ($result as $row) { + if (null === $row[1]) { + $expired[] = $row[0]; + } else { + yield $row[0] => $this->marshaller->unmarshall(\is_resource($row[1]) ? stream_get_contents($row[1]) : $row[1]); + } + } + + if ($expired) { + $sql = str_pad('', (\count($expired) << 1) - 1, '?,'); + $sql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol <= ? AND $this->idCol IN ($sql)"; + $stmt = $connection->prepare($sql); + $stmt->bindValue($i = 1, $now, \PDO::PARAM_INT); + foreach ($expired as $id) { + $stmt->bindValue(++$i, $id); + } + $stmt->execute(); + } + } + + /** + * {@inheritdoc} + */ + protected function doHave(string $id): bool + { + $connection = $this->getConnection(); + + $sql = "SELECT 1 FROM $this->table WHERE $this->idCol = :id AND ($this->lifetimeCol IS NULL OR $this->lifetimeCol + $this->timeCol > :time)"; + $stmt = $connection->prepare($sql); + + $stmt->bindValue(':id', $id); + $stmt->bindValue(':time', time(), \PDO::PARAM_INT); + $stmt->execute(); + + return (bool) $stmt->fetchColumn(); + } + + /** + * {@inheritdoc} + */ + protected function doClear(string $namespace): bool + { + $conn = $this->getConnection(); + + if ('' === $namespace) { + if ('sqlite' === $this->driver) { + $sql = "DELETE FROM $this->table"; + } else { + $sql = "TRUNCATE TABLE $this->table"; + } + } else { + $sql = "DELETE FROM $this->table WHERE $this->idCol LIKE '$namespace%'"; + } + + try { + $conn->exec($sql); + } catch (\PDOException $e) { + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doDelete(array $ids): bool + { + $sql = str_pad('', (\count($ids) << 1) - 1, '?,'); + $sql = "DELETE FROM $this->table WHERE $this->idCol IN ($sql)"; + try { + $stmt = $this->getConnection()->prepare($sql); + $stmt->execute(array_values($ids)); + } catch (\PDOException $e) { + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doSave(array $values, int $lifetime): array|bool + { + if (!$values = $this->marshaller->marshall($values, $failed)) { + return $failed; + } + + $conn = $this->getConnection(); + + $driver = $this->driver; + $insertSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time)"; + + switch (true) { + case 'mysql' === $driver: + $sql = $insertSql." ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)"; + break; + case 'oci' === $driver: + // DUAL is Oracle specific dummy table + $sql = "MERGE INTO $this->table USING DUAL ON ($this->idCol = ?) ". + "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ". + "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?"; + break; + case 'sqlsrv' === $driver && version_compare($this->getServerVersion(), '10', '>='): + // MERGE is only available since SQL Server 2008 and must be terminated by semicolon + // It also requires HOLDLOCK according to http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx + $sql = "MERGE INTO $this->table WITH (HOLDLOCK) USING (SELECT 1 AS dummy) AS src ON ($this->idCol = ?) ". + "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ". + "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?;"; + break; + case 'sqlite' === $driver: + $sql = 'INSERT OR REPLACE'.substr($insertSql, 6); + break; + case 'pgsql' === $driver && version_compare($this->getServerVersion(), '9.5', '>='): + $sql = $insertSql." ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)"; + break; + default: + $driver = null; + $sql = "UPDATE $this->table SET $this->dataCol = :data, $this->lifetimeCol = :lifetime, $this->timeCol = :time WHERE $this->idCol = :id"; + break; + } + + $now = time(); + $lifetime = $lifetime ?: null; + try { + $stmt = $conn->prepare($sql); + } catch (\PDOException $e) { + if (!$conn->inTransaction() || \in_array($this->driver, ['pgsql', 'sqlite', 'sqlsrv'], true)) { + $this->createTable(); + } + $stmt = $conn->prepare($sql); + } + + // $id and $data are defined later in the loop. Binding is done by reference, values are read on execution. + if ('sqlsrv' === $driver || 'oci' === $driver) { + $stmt->bindParam(1, $id); + $stmt->bindParam(2, $id); + $stmt->bindParam(3, $data, \PDO::PARAM_LOB); + $stmt->bindValue(4, $lifetime, \PDO::PARAM_INT); + $stmt->bindValue(5, $now, \PDO::PARAM_INT); + $stmt->bindParam(6, $data, \PDO::PARAM_LOB); + $stmt->bindValue(7, $lifetime, \PDO::PARAM_INT); + $stmt->bindValue(8, $now, \PDO::PARAM_INT); + } else { + $stmt->bindParam(':id', $id); + $stmt->bindParam(':data', $data, \PDO::PARAM_LOB); + $stmt->bindValue(':lifetime', $lifetime, \PDO::PARAM_INT); + $stmt->bindValue(':time', $now, \PDO::PARAM_INT); + } + if (null === $driver) { + $insertStmt = $conn->prepare($insertSql); + + $insertStmt->bindParam(':id', $id); + $insertStmt->bindParam(':data', $data, \PDO::PARAM_LOB); + $insertStmt->bindValue(':lifetime', $lifetime, \PDO::PARAM_INT); + $insertStmt->bindValue(':time', $now, \PDO::PARAM_INT); + } + + foreach ($values as $id => $data) { + try { + $stmt->execute(); + } catch (\PDOException $e) { + if (!$conn->inTransaction() || \in_array($this->driver, ['pgsql', 'sqlite', 'sqlsrv'], true)) { + $this->createTable(); + } + $stmt->execute(); + } + if (null === $driver && !$stmt->rowCount()) { + try { + $insertStmt->execute(); + } catch (\PDOException $e) { + // A concurrent write won, let it be + } + } + } + + return $failed; + } + + private function getConnection(): \PDO + { + if (!isset($this->conn)) { + $this->conn = new \PDO($this->dsn, $this->username, $this->password, $this->connectionOptions); + $this->conn->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + } + $this->driver ??= $this->conn->getAttribute(\PDO::ATTR_DRIVER_NAME); + + return $this->conn; + } + + private function getServerVersion(): string + { + return $this->serverVersion ??= $this->conn->getAttribute(\PDO::ATTR_SERVER_VERSION); + } +} diff --git a/vendor/symfony/cache/Adapter/PhpArrayAdapter.php b/vendor/symfony/cache/Adapter/PhpArrayAdapter.php new file mode 100644 index 0000000..ee6ce63 --- /dev/null +++ b/vendor/symfony/cache/Adapter/PhpArrayAdapter.php @@ -0,0 +1,419 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Psr\Cache\CacheItemInterface; +use Psr\Cache\CacheItemPoolInterface; +use Symfony\Component\Cache\CacheItem; +use Symfony\Component\Cache\Exception\InvalidArgumentException; +use Symfony\Component\Cache\PruneableInterface; +use Symfony\Component\Cache\ResettableInterface; +use Symfony\Component\Cache\Traits\ContractsTrait; +use Symfony\Component\Cache\Traits\ProxyTrait; +use Symfony\Component\VarExporter\VarExporter; +use Symfony\Contracts\Cache\CacheInterface; + +/** + * Caches items at warm up time using a PHP array that is stored in shared memory by OPCache since PHP 7.0. + * Warmed up items are read-only and run-time discovered items are cached using a fallback adapter. + * + * @author Titouan Galopin <galopintitouan@gmail.com> + * @author Nicolas Grekas <p@tchwork.com> + */ +class PhpArrayAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface +{ + use ContractsTrait; + use ProxyTrait; + + private string $file; + private array $keys; + private array $values; + + private static \Closure $createCacheItem; + private static array $valuesCache = []; + + /** + * @param string $file The PHP file were values are cached + * @param AdapterInterface $fallbackPool A pool to fallback on when an item is not hit + */ + public function __construct(string $file, AdapterInterface $fallbackPool) + { + $this->file = $file; + $this->pool = $fallbackPool; + self::$createCacheItem ?? self::$createCacheItem = \Closure::bind( + static function ($key, $value, $isHit) { + $item = new CacheItem(); + $item->key = $key; + $item->value = $value; + $item->isHit = $isHit; + + return $item; + }, + null, + CacheItem::class + ); + } + + /** + * This adapter takes advantage of how PHP stores arrays in its latest versions. + * + * @param string $file The PHP file were values are cached + * @param CacheItemPoolInterface $fallbackPool A pool to fallback on when an item is not hit + */ + public static function create(string $file, CacheItemPoolInterface $fallbackPool): CacheItemPoolInterface + { + if (!$fallbackPool instanceof AdapterInterface) { + $fallbackPool = new ProxyAdapter($fallbackPool); + } + + return new static($file, $fallbackPool); + } + + /** + * {@inheritdoc} + */ + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed + { + if (!isset($this->values)) { + $this->initialize(); + } + if (!isset($this->keys[$key])) { + get_from_pool: + if ($this->pool instanceof CacheInterface) { + return $this->pool->get($key, $callback, $beta, $metadata); + } + + return $this->doGet($this->pool, $key, $callback, $beta, $metadata); + } + $value = $this->values[$this->keys[$key]]; + + if ('N;' === $value) { + return null; + } + try { + if ($value instanceof \Closure) { + return $value(); + } + } catch (\Throwable $e) { + unset($this->keys[$key]); + goto get_from_pool; + } + + return $value; + } + + /** + * {@inheritdoc} + */ + public function getItem(mixed $key): CacheItem + { + if (!\is_string($key)) { + throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); + } + if (!isset($this->values)) { + $this->initialize(); + } + if (!isset($this->keys[$key])) { + return $this->pool->getItem($key); + } + + $value = $this->values[$this->keys[$key]]; + $isHit = true; + + if ('N;' === $value) { + $value = null; + } elseif ($value instanceof \Closure) { + try { + $value = $value(); + } catch (\Throwable $e) { + $value = null; + $isHit = false; + } + } + + return (self::$createCacheItem)($key, $value, $isHit); + } + + /** + * {@inheritdoc} + */ + public function getItems(array $keys = []): iterable + { + foreach ($keys as $key) { + if (!\is_string($key)) { + throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); + } + } + if (!isset($this->values)) { + $this->initialize(); + } + + return $this->generateItems($keys); + } + + /** + * {@inheritdoc} + */ + public function hasItem(mixed $key): bool + { + if (!\is_string($key)) { + throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); + } + if (!isset($this->values)) { + $this->initialize(); + } + + return isset($this->keys[$key]) || $this->pool->hasItem($key); + } + + /** + * {@inheritdoc} + */ + public function deleteItem(mixed $key): bool + { + if (!\is_string($key)) { + throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); + } + if (!isset($this->values)) { + $this->initialize(); + } + + return !isset($this->keys[$key]) && $this->pool->deleteItem($key); + } + + /** + * {@inheritdoc} + */ + public function deleteItems(array $keys): bool + { + $deleted = true; + $fallbackKeys = []; + + foreach ($keys as $key) { + if (!\is_string($key)) { + throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); + } + + if (isset($this->keys[$key])) { + $deleted = false; + } else { + $fallbackKeys[] = $key; + } + } + if (!isset($this->values)) { + $this->initialize(); + } + + if ($fallbackKeys) { + $deleted = $this->pool->deleteItems($fallbackKeys) && $deleted; + } + + return $deleted; + } + + /** + * {@inheritdoc} + */ + public function save(CacheItemInterface $item): bool + { + if (!isset($this->values)) { + $this->initialize(); + } + + return !isset($this->keys[$item->getKey()]) && $this->pool->save($item); + } + + /** + * {@inheritdoc} + */ + public function saveDeferred(CacheItemInterface $item): bool + { + if (!isset($this->values)) { + $this->initialize(); + } + + return !isset($this->keys[$item->getKey()]) && $this->pool->saveDeferred($item); + } + + /** + * {@inheritdoc} + */ + public function commit(): bool + { + return $this->pool->commit(); + } + + /** + * {@inheritdoc} + */ + public function clear(string $prefix = ''): bool + { + $this->keys = $this->values = []; + + $cleared = @unlink($this->file) || !file_exists($this->file); + unset(self::$valuesCache[$this->file]); + + if ($this->pool instanceof AdapterInterface) { + return $this->pool->clear($prefix) && $cleared; + } + + return $this->pool->clear() && $cleared; + } + + /** + * Store an array of cached values. + * + * @param array $values The cached values + * + * @return string[] A list of classes to preload on PHP 7.4+ + */ + public function warmUp(array $values): array + { + if (file_exists($this->file)) { + if (!is_file($this->file)) { + throw new InvalidArgumentException(sprintf('Cache path exists and is not a file: "%s".', $this->file)); + } + + if (!is_writable($this->file)) { + throw new InvalidArgumentException(sprintf('Cache file is not writable: "%s".', $this->file)); + } + } else { + $directory = \dirname($this->file); + + if (!is_dir($directory) && !@mkdir($directory, 0777, true)) { + throw new InvalidArgumentException(sprintf('Cache directory does not exist and cannot be created: "%s".', $directory)); + } + + if (!is_writable($directory)) { + throw new InvalidArgumentException(sprintf('Cache directory is not writable: "%s".', $directory)); + } + } + + $preload = []; + $dumpedValues = ''; + $dumpedMap = []; + $dump = <<<'EOF' +<?php + +// This file has been auto-generated by the Symfony Cache Component. + +return [[ + + +EOF; + + foreach ($values as $key => $value) { + CacheItem::validateKey(\is_int($key) ? (string) $key : $key); + $isStaticValue = true; + + if (null === $value) { + $value = "'N;'"; + } elseif (\is_object($value) || \is_array($value)) { + try { + $value = VarExporter::export($value, $isStaticValue, $preload); + } catch (\Exception $e) { + throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable "%s" value.', $key, get_debug_type($value)), 0, $e); + } + } elseif (\is_string($value)) { + // Wrap "N;" in a closure to not confuse it with an encoded `null` + if ('N;' === $value) { + $isStaticValue = false; + } + $value = var_export($value, true); + } elseif (!\is_scalar($value)) { + throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable "%s" value.', $key, get_debug_type($value))); + } else { + $value = var_export($value, true); + } + + if (!$isStaticValue) { + $value = str_replace("\n", "\n ", $value); + $value = "static function () {\n return {$value};\n}"; + } + $hash = hash('md5', $value); + + if (null === $id = $dumpedMap[$hash] ?? null) { + $id = $dumpedMap[$hash] = \count($dumpedMap); + $dumpedValues .= "{$id} => {$value},\n"; + } + + $dump .= var_export($key, true)." => {$id},\n"; + } + + $dump .= "\n], [\n\n{$dumpedValues}\n]];\n"; + + $tmpFile = uniqid($this->file, true); + + file_put_contents($tmpFile, $dump); + @chmod($tmpFile, 0666 & ~umask()); + unset($serialized, $value, $dump); + + @rename($tmpFile, $this->file); + unset(self::$valuesCache[$this->file]); + + $this->initialize(); + + return $preload; + } + + /** + * Load the cache file. + */ + private function initialize() + { + if (isset(self::$valuesCache[$this->file])) { + $values = self::$valuesCache[$this->file]; + } elseif (!is_file($this->file)) { + $this->keys = $this->values = []; + + return; + } else { + $values = self::$valuesCache[$this->file] = (include $this->file) ?: [[], []]; + } + + if (2 !== \count($values) || !isset($values[0], $values[1])) { + $this->keys = $this->values = []; + } else { + [$this->keys, $this->values] = $values; + } + } + + private function generateItems(array $keys): \Generator + { + $f = self::$createCacheItem; + $fallbackKeys = []; + + foreach ($keys as $key) { + if (isset($this->keys[$key])) { + $value = $this->values[$this->keys[$key]]; + + if ('N;' === $value) { + yield $key => $f($key, null, true); + } elseif ($value instanceof \Closure) { + try { + yield $key => $f($key, $value(), true); + } catch (\Throwable $e) { + yield $key => $f($key, null, false); + } + } else { + yield $key => $f($key, $value, true); + } + } else { + $fallbackKeys[] = $key; + } + } + + if ($fallbackKeys) { + yield from $this->pool->getItems($fallbackKeys); + } + } +} diff --git a/vendor/symfony/cache/Adapter/PhpFilesAdapter.php b/vendor/symfony/cache/Adapter/PhpFilesAdapter.php new file mode 100644 index 0000000..bd9792d --- /dev/null +++ b/vendor/symfony/cache/Adapter/PhpFilesAdapter.php @@ -0,0 +1,327 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Symfony\Component\Cache\Exception\CacheException; +use Symfony\Component\Cache\Exception\InvalidArgumentException; +use Symfony\Component\Cache\PruneableInterface; +use Symfony\Component\Cache\Traits\FilesystemCommonTrait; +use Symfony\Component\VarExporter\VarExporter; + +/** + * @author Piotr Stankowski <git@trakos.pl> + * @author Nicolas Grekas <p@tchwork.com> + * @author Rob Frawley 2nd <rmf@src.run> + */ +class PhpFilesAdapter extends AbstractAdapter implements PruneableInterface +{ + use FilesystemCommonTrait { + doClear as private doCommonClear; + doDelete as private doCommonDelete; + } + + private \Closure $includeHandler; + private bool $appendOnly; + private array $values = []; + private array $files = []; + + private static int $startTime; + private static array $valuesCache = []; + + /** + * @param $appendOnly Set to `true` to gain extra performance when the items stored in this pool never expire. + * Doing so is encouraged because it fits perfectly OPcache's memory model. + * + * @throws CacheException if OPcache is not enabled + */ + public function __construct(string $namespace = '', int $defaultLifetime = 0, string $directory = null, bool $appendOnly = false) + { + $this->appendOnly = $appendOnly; + self::$startTime = self::$startTime ?? $_SERVER['REQUEST_TIME'] ?? time(); + parent::__construct('', $defaultLifetime); + $this->init($namespace, $directory); + $this->includeHandler = static function ($type, $msg, $file, $line) { + throw new \ErrorException($msg, 0, $type, $file, $line); + }; + } + + public static function isSupported() + { + self::$startTime = self::$startTime ?? $_SERVER['REQUEST_TIME'] ?? time(); + + return \function_exists('opcache_invalidate') && filter_var(\ini_get('opcache.enable'), \FILTER_VALIDATE_BOOLEAN) && (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) || filter_var(\ini_get('opcache.enable_cli'), \FILTER_VALIDATE_BOOLEAN)); + } + + public function prune(): bool + { + $time = time(); + $pruned = true; + $getExpiry = true; + + set_error_handler($this->includeHandler); + try { + foreach ($this->scanHashDir($this->directory) as $file) { + try { + if (\is_array($expiresAt = include $file)) { + $expiresAt = $expiresAt[0]; + } + } catch (\ErrorException $e) { + $expiresAt = $time; + } + + if ($time >= $expiresAt) { + $pruned = $this->doUnlink($file) && !file_exists($file) && $pruned; + } + } + } finally { + restore_error_handler(); + } + + return $pruned; + } + + /** + * {@inheritdoc} + */ + protected function doFetch(array $ids): iterable + { + if ($this->appendOnly) { + $now = 0; + $missingIds = []; + } else { + $now = time(); + $missingIds = $ids; + $ids = []; + } + $values = []; + + begin: + $getExpiry = false; + + foreach ($ids as $id) { + if (null === $value = $this->values[$id] ?? null) { + $missingIds[] = $id; + } elseif ('N;' === $value) { + $values[$id] = null; + } elseif (!\is_object($value)) { + $values[$id] = $value; + } elseif (!$value instanceof LazyValue) { + $values[$id] = $value(); + } elseif (false === $values[$id] = include $value->file) { + unset($values[$id], $this->values[$id]); + $missingIds[] = $id; + } + if (!$this->appendOnly) { + unset($this->values[$id]); + } + } + + if (!$missingIds) { + return $values; + } + + set_error_handler($this->includeHandler); + try { + $getExpiry = true; + + foreach ($missingIds as $k => $id) { + try { + $file = $this->files[$id] ?? $this->files[$id] = $this->getFile($id); + + if (isset(self::$valuesCache[$file])) { + [$expiresAt, $this->values[$id]] = self::$valuesCache[$file]; + } elseif (\is_array($expiresAt = include $file)) { + if ($this->appendOnly) { + self::$valuesCache[$file] = $expiresAt; + } + + [$expiresAt, $this->values[$id]] = $expiresAt; + } elseif ($now < $expiresAt) { + $this->values[$id] = new LazyValue($file); + } + + if ($now >= $expiresAt) { + unset($this->values[$id], $missingIds[$k], self::$valuesCache[$file]); + } + } catch (\ErrorException $e) { + unset($missingIds[$k]); + } + } + } finally { + restore_error_handler(); + } + + $ids = $missingIds; + $missingIds = []; + goto begin; + } + + /** + * {@inheritdoc} + */ + protected function doHave(string $id): bool + { + if ($this->appendOnly && isset($this->values[$id])) { + return true; + } + + set_error_handler($this->includeHandler); + try { + $file = $this->files[$id] ?? $this->files[$id] = $this->getFile($id); + $getExpiry = true; + + if (isset(self::$valuesCache[$file])) { + [$expiresAt, $value] = self::$valuesCache[$file]; + } elseif (\is_array($expiresAt = include $file)) { + if ($this->appendOnly) { + self::$valuesCache[$file] = $expiresAt; + } + + [$expiresAt, $value] = $expiresAt; + } elseif ($this->appendOnly) { + $value = new LazyValue($file); + } + } catch (\ErrorException $e) { + return false; + } finally { + restore_error_handler(); + } + if ($this->appendOnly) { + $now = 0; + $this->values[$id] = $value; + } else { + $now = time(); + } + + return $now < $expiresAt; + } + + /** + * {@inheritdoc} + */ + protected function doSave(array $values, int $lifetime): array|bool + { + $ok = true; + $expiry = $lifetime ? time() + $lifetime : 'PHP_INT_MAX'; + $allowCompile = self::isSupported(); + + foreach ($values as $key => $value) { + unset($this->values[$key]); + $isStaticValue = true; + if (null === $value) { + $value = "'N;'"; + } elseif (\is_object($value) || \is_array($value)) { + try { + $value = VarExporter::export($value, $isStaticValue); + } catch (\Exception $e) { + throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable "%s" value.', $key, get_debug_type($value)), 0, $e); + } + } elseif (\is_string($value)) { + // Wrap "N;" in a closure to not confuse it with an encoded `null` + if ('N;' === $value) { + $isStaticValue = false; + } + $value = var_export($value, true); + } elseif (!\is_scalar($value)) { + throw new InvalidArgumentException(sprintf('Cache key "%s" has non-serializable "%s" value.', $key, get_debug_type($value))); + } else { + $value = var_export($value, true); + } + + $encodedKey = rawurlencode($key); + + if ($isStaticValue) { + $value = "return [{$expiry}, {$value}];"; + } elseif ($this->appendOnly) { + $value = "return [{$expiry}, static function () { return {$value}; }];"; + } else { + // We cannot use a closure here because of https://bugs.php.net/76982 + $value = str_replace('\Symfony\Component\VarExporter\Internal\\', '', $value); + $value = "namespace Symfony\Component\VarExporter\Internal;\n\nreturn \$getExpiry ? {$expiry} : {$value};"; + } + + $file = $this->files[$key] = $this->getFile($key, true); + // Since OPcache only compiles files older than the script execution start, set the file's mtime in the past + $ok = $this->write($file, "<?php //{$encodedKey}\n\n{$value}\n", self::$startTime - 10) && $ok; + + if ($allowCompile) { + @opcache_invalidate($file, true); + @opcache_compile_file($file); + } + unset(self::$valuesCache[$file]); + } + + if (!$ok && !is_writable($this->directory)) { + throw new CacheException(sprintf('Cache directory is not writable (%s).', $this->directory)); + } + + return $ok; + } + + /** + * {@inheritdoc} + */ + protected function doClear(string $namespace): bool + { + $this->values = []; + + return $this->doCommonClear($namespace); + } + + /** + * {@inheritdoc} + */ + protected function doDelete(array $ids): bool + { + foreach ($ids as $id) { + unset($this->values[$id]); + } + + return $this->doCommonDelete($ids); + } + + protected function doUnlink(string $file) + { + unset(self::$valuesCache[$file]); + + if (self::isSupported()) { + @opcache_invalidate($file, true); + } + + return @unlink($file); + } + + private function getFileKey(string $file): string + { + if (!$h = @fopen($file, 'r')) { + return ''; + } + + $encodedKey = substr(fgets($h), 8); + fclose($h); + + return rawurldecode(rtrim($encodedKey)); + } +} + +/** + * @internal + */ +class LazyValue +{ + public string $file; + + public function __construct(string $file) + { + $this->file = $file; + } +} diff --git a/vendor/symfony/cache/Adapter/ProxyAdapter.php b/vendor/symfony/cache/Adapter/ProxyAdapter.php new file mode 100644 index 0000000..23434cd --- /dev/null +++ b/vendor/symfony/cache/Adapter/ProxyAdapter.php @@ -0,0 +1,254 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Psr\Cache\CacheItemInterface; +use Psr\Cache\CacheItemPoolInterface; +use Symfony\Component\Cache\CacheItem; +use Symfony\Component\Cache\PruneableInterface; +use Symfony\Component\Cache\ResettableInterface; +use Symfony\Component\Cache\Traits\ContractsTrait; +use Symfony\Component\Cache\Traits\ProxyTrait; +use Symfony\Contracts\Cache\CacheInterface; + +/** + * @author Nicolas Grekas <p@tchwork.com> + */ +class ProxyAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface +{ + use ContractsTrait; + use ProxyTrait; + + private string $namespace = ''; + private int $namespaceLen; + private string $poolHash; + private int $defaultLifetime; + + private static \Closure $createCacheItem; + private static \Closure $setInnerItem; + + public function __construct(CacheItemPoolInterface $pool, string $namespace = '', int $defaultLifetime = 0) + { + $this->pool = $pool; + $this->poolHash = spl_object_hash($pool); + if ('' !== $namespace) { + \assert('' !== CacheItem::validateKey($namespace)); + $this->namespace = $namespace; + } + $this->namespaceLen = \strlen($namespace); + $this->defaultLifetime = $defaultLifetime; + self::$createCacheItem ?? self::$createCacheItem = \Closure::bind( + static function ($key, $innerItem, $poolHash) { + $item = new CacheItem(); + $item->key = $key; + + if (null === $innerItem) { + return $item; + } + + $item->value = $v = $innerItem->get(); + $item->isHit = $innerItem->isHit(); + $item->innerItem = $innerItem; + $item->poolHash = $poolHash; + + // Detect wrapped values that encode for their expiry and creation duration + // For compactness, these values are packed in the key of an array using + // magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F + if (\is_array($v) && 1 === \count($v) && 10 === \strlen($k = (string) array_key_first($v)) && "\x9D" === $k[0] && "\0" === $k[5] && "\x5F" === $k[9]) { + $item->value = $v[$k]; + $v = unpack('Ve/Nc', substr($k, 1, -1)); + $item->metadata[CacheItem::METADATA_EXPIRY] = $v['e'] + CacheItem::METADATA_EXPIRY_OFFSET; + $item->metadata[CacheItem::METADATA_CTIME] = $v['c']; + } elseif ($innerItem instanceof CacheItem) { + $item->metadata = $innerItem->metadata; + } + $innerItem->set(null); + + return $item; + }, + null, + CacheItem::class + ); + self::$setInnerItem ?? self::$setInnerItem = \Closure::bind( + /** + * @param array $item A CacheItem cast to (array); accessing protected properties requires adding the "\0*\0" PHP prefix + */ + static function (CacheItemInterface $innerItem, array $item) { + // Tags are stored separately, no need to account for them when considering this item's newly set metadata + if (isset(($metadata = $item["\0*\0newMetadata"])[CacheItem::METADATA_TAGS])) { + unset($metadata[CacheItem::METADATA_TAGS]); + } + if ($metadata) { + // For compactness, expiry and creation duration are packed in the key of an array, using magic numbers as separators + $item["\0*\0value"] = ["\x9D".pack('VN', (int) (0.1 + $metadata[self::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[self::METADATA_CTIME])."\x5F" => $item["\0*\0value"]]; + } + $innerItem->set($item["\0*\0value"]); + $innerItem->expiresAt(null !== $item["\0*\0expiry"] ? \DateTime::createFromFormat('U.u', sprintf('%.6F', $item["\0*\0expiry"])) : null); + }, + null, + CacheItem::class + ); + } + + /** + * {@inheritdoc} + */ + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed + { + if (!$this->pool instanceof CacheInterface) { + return $this->doGet($this, $key, $callback, $beta, $metadata); + } + + return $this->pool->get($this->getId($key), function ($innerItem, bool &$save) use ($key, $callback) { + $item = (self::$createCacheItem)($key, $innerItem, $this->poolHash); + $item->set($value = $callback($item, $save)); + (self::$setInnerItem)($innerItem, (array) $item); + + return $value; + }, $beta, $metadata); + } + + /** + * {@inheritdoc} + */ + public function getItem(mixed $key): CacheItem + { + $item = $this->pool->getItem($this->getId($key)); + + return (self::$createCacheItem)($key, $item, $this->poolHash); + } + + /** + * {@inheritdoc} + */ + public function getItems(array $keys = []): iterable + { + if ($this->namespaceLen) { + foreach ($keys as $i => $key) { + $keys[$i] = $this->getId($key); + } + } + + return $this->generateItems($this->pool->getItems($keys)); + } + + /** + * {@inheritdoc} + */ + public function hasItem(mixed $key): bool + { + return $this->pool->hasItem($this->getId($key)); + } + + /** + * {@inheritdoc} + */ + public function clear(string $prefix = ''): bool + { + if ($this->pool instanceof AdapterInterface) { + return $this->pool->clear($this->namespace.$prefix); + } + + return $this->pool->clear(); + } + + /** + * {@inheritdoc} + */ + public function deleteItem(mixed $key): bool + { + return $this->pool->deleteItem($this->getId($key)); + } + + /** + * {@inheritdoc} + */ + public function deleteItems(array $keys): bool + { + if ($this->namespaceLen) { + foreach ($keys as $i => $key) { + $keys[$i] = $this->getId($key); + } + } + + return $this->pool->deleteItems($keys); + } + + /** + * {@inheritdoc} + */ + public function save(CacheItemInterface $item): bool + { + return $this->doSave($item, __FUNCTION__); + } + + /** + * {@inheritdoc} + */ + public function saveDeferred(CacheItemInterface $item): bool + { + return $this->doSave($item, __FUNCTION__); + } + + /** + * {@inheritdoc} + */ + public function commit(): bool + { + return $this->pool->commit(); + } + + private function doSave(CacheItemInterface $item, string $method): bool + { + if (!$item instanceof CacheItem) { + return false; + } + $item = (array) $item; + if (null === $item["\0*\0expiry"] && 0 < $this->defaultLifetime) { + $item["\0*\0expiry"] = microtime(true) + $this->defaultLifetime; + } + + if ($item["\0*\0poolHash"] === $this->poolHash && $item["\0*\0innerItem"]) { + $innerItem = $item["\0*\0innerItem"]; + } elseif ($this->pool instanceof AdapterInterface) { + // this is an optimization specific for AdapterInterface implementations + // so we can save a round-trip to the backend by just creating a new item + $innerItem = (self::$createCacheItem)($this->namespace.$item["\0*\0key"], null, $this->poolHash); + } else { + $innerItem = $this->pool->getItem($this->namespace.$item["\0*\0key"]); + } + + (self::$setInnerItem)($innerItem, $item); + + return $this->pool->$method($innerItem); + } + + private function generateItems(iterable $items): \Generator + { + $f = self::$createCacheItem; + + foreach ($items as $key => $item) { + if ($this->namespaceLen) { + $key = substr($key, $this->namespaceLen); + } + + yield $key => $f($key, $item, $this->poolHash); + } + } + + private function getId(mixed $key): string + { + \assert('' !== CacheItem::validateKey($key)); + + return $this->namespace.$key; + } +} diff --git a/vendor/symfony/cache/Adapter/Psr16Adapter.php b/vendor/symfony/cache/Adapter/Psr16Adapter.php new file mode 100644 index 0000000..664c18b --- /dev/null +++ b/vendor/symfony/cache/Adapter/Psr16Adapter.php @@ -0,0 +1,86 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Psr\SimpleCache\CacheInterface; +use Symfony\Component\Cache\PruneableInterface; +use Symfony\Component\Cache\ResettableInterface; +use Symfony\Component\Cache\Traits\ProxyTrait; + +/** + * Turns a PSR-16 cache into a PSR-6 one. + * + * @author Nicolas Grekas <p@tchwork.com> + */ +class Psr16Adapter extends AbstractAdapter implements PruneableInterface, ResettableInterface +{ + use ProxyTrait; + + /** + * @internal + */ + protected const NS_SEPARATOR = '_'; + + private object $miss; + + public function __construct(CacheInterface $pool, string $namespace = '', int $defaultLifetime = 0) + { + parent::__construct($namespace, $defaultLifetime); + + $this->pool = $pool; + $this->miss = new \stdClass(); + } + + /** + * {@inheritdoc} + */ + protected function doFetch(array $ids): iterable + { + foreach ($this->pool->getMultiple($ids, $this->miss) as $key => $value) { + if ($this->miss !== $value) { + yield $key => $value; + } + } + } + + /** + * {@inheritdoc} + */ + protected function doHave(string $id): bool + { + return $this->pool->has($id); + } + + /** + * {@inheritdoc} + */ + protected function doClear(string $namespace): bool + { + return $this->pool->clear(); + } + + /** + * {@inheritdoc} + */ + protected function doDelete(array $ids): bool + { + return $this->pool->deleteMultiple($ids); + } + + /** + * {@inheritdoc} + */ + protected function doSave(array $values, int $lifetime): array|bool + { + return $this->pool->setMultiple($values, 0 === $lifetime ? null : $lifetime); + } +} diff --git a/vendor/symfony/cache/Adapter/RedisAdapter.php b/vendor/symfony/cache/Adapter/RedisAdapter.php new file mode 100644 index 0000000..45bc340 --- /dev/null +++ b/vendor/symfony/cache/Adapter/RedisAdapter.php @@ -0,0 +1,27 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Symfony\Component\Cache\Marshaller\MarshallerInterface; +use Symfony\Component\Cache\Traits\RedisClusterProxy; +use Symfony\Component\Cache\Traits\RedisProxy; +use Symfony\Component\Cache\Traits\RedisTrait; + +class RedisAdapter extends AbstractAdapter +{ + use RedisTrait; + + public function __construct(\Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) + { + $this->init($redis, $namespace, $defaultLifetime, $marshaller); + } +} diff --git a/vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php b/vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php new file mode 100644 index 0000000..7451592 --- /dev/null +++ b/vendor/symfony/cache/Adapter/RedisTagAwareAdapter.php @@ -0,0 +1,320 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Predis\Connection\Aggregate\ClusterInterface; +use Predis\Connection\Aggregate\PredisCluster; +use Predis\Connection\Aggregate\ReplicationInterface; +use Predis\Response\ErrorInterface; +use Predis\Response\Status; +use Symfony\Component\Cache\CacheItem; +use Symfony\Component\Cache\Exception\InvalidArgumentException; +use Symfony\Component\Cache\Exception\LogicException; +use Symfony\Component\Cache\Marshaller\DeflateMarshaller; +use Symfony\Component\Cache\Marshaller\MarshallerInterface; +use Symfony\Component\Cache\Marshaller\TagAwareMarshaller; +use Symfony\Component\Cache\Traits\RedisClusterProxy; +use Symfony\Component\Cache\Traits\RedisProxy; +use Symfony\Component\Cache\Traits\RedisTrait; + +/** + * Stores tag id <> cache id relationship as a Redis Set. + * + * Set (tag relation info) is stored without expiry (non-volatile), while cache always gets an expiry (volatile) even + * if not set by caller. Thus if you configure redis with the right eviction policy you can be safe this tag <> cache + * relationship survives eviction (cache cleanup when Redis runs out of memory). + * + * Redis server 2.8+ with any `volatile-*` eviction policy, OR `noeviction` if you're sure memory will NEVER fill up + * + * Design limitations: + * - Max 4 billion cache keys per cache tag as limited by Redis Set datatype. + * E.g. If you use a "all" items tag for expiry instead of clear(), that limits you to 4 billion cache items also. + * + * @see https://redis.io/topics/lru-cache#eviction-policies Documentation for Redis eviction policies. + * @see https://redis.io/topics/data-types#sets Documentation for Redis Set datatype. + * + * @author Nicolas Grekas <p@tchwork.com> + * @author André Rømcke <andre.romcke+symfony@gmail.com> + */ +class RedisTagAwareAdapter extends AbstractTagAwareAdapter +{ + use RedisTrait; + + /** + * On cache items without a lifetime set, we set it to 100 days. This is to make sure cache items are + * preferred to be evicted over tag Sets, if eviction policy is configured according to requirements. + */ + private const DEFAULT_CACHE_TTL = 8640000; + + /** + * detected eviction policy used on Redis server. + */ + private string $redisEvictionPolicy; + private string $namespace; + + public function __construct(\Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis, string $namespace = '', int $defaultLifetime = 0, MarshallerInterface $marshaller = null) + { + if ($redis instanceof \Predis\ClientInterface && $redis->getConnection() instanceof ClusterInterface && !$redis->getConnection() instanceof PredisCluster) { + throw new InvalidArgumentException(sprintf('Unsupported Predis cluster connection: only "%s" is, "%s" given.', PredisCluster::class, get_debug_type($redis->getConnection()))); + } + + if (\defined('Redis::OPT_COMPRESSION') && ($redis instanceof \Redis || $redis instanceof \RedisArray || $redis instanceof \RedisCluster)) { + $compression = $redis->getOption(\Redis::OPT_COMPRESSION); + + foreach (\is_array($compression) ? $compression : [$compression] as $c) { + if (\Redis::COMPRESSION_NONE !== $c) { + throw new InvalidArgumentException(sprintf('phpredis compression must be disabled when using "%s", use "%s" instead.', static::class, DeflateMarshaller::class)); + } + } + } + + $this->init($redis, $namespace, $defaultLifetime, new TagAwareMarshaller($marshaller)); + $this->namespace = $namespace; + } + + /** + * {@inheritdoc} + */ + protected function doSave(array $values, int $lifetime, array $addTagData = [], array $delTagData = []): array + { + $eviction = $this->getRedisEvictionPolicy(); + if ('noeviction' !== $eviction && !str_starts_with($eviction, 'volatile-')) { + throw new LogicException(sprintf('Redis maxmemory-policy setting "%s" is *not* supported by RedisTagAwareAdapter, use "noeviction" or "volatile-*" eviction policies.', $eviction)); + } + + // serialize values + if (!$serialized = $this->marshaller->marshall($values, $failed)) { + return $failed; + } + + // While pipeline isn't supported on RedisCluster, other setups will at least benefit from doing this in one op + $results = $this->pipeline(static function () use ($serialized, $lifetime, $addTagData, $delTagData, $failed) { + // Store cache items, force a ttl if none is set, as there is no MSETEX we need to set each one + foreach ($serialized as $id => $value) { + yield 'setEx' => [ + $id, + 0 >= $lifetime ? self::DEFAULT_CACHE_TTL : $lifetime, + $value, + ]; + } + + // Add and Remove Tags + foreach ($addTagData as $tagId => $ids) { + if (!$failed || $ids = array_diff($ids, $failed)) { + yield 'sAdd' => array_merge([$tagId], $ids); + } + } + + foreach ($delTagData as $tagId => $ids) { + if (!$failed || $ids = array_diff($ids, $failed)) { + yield 'sRem' => array_merge([$tagId], $ids); + } + } + }); + + foreach ($results as $id => $result) { + // Skip results of SADD/SREM operations, they'll be 1 or 0 depending on if set value already existed or not + if (is_numeric($result)) { + continue; + } + // setEx results + if (true !== $result && (!$result instanceof Status || Status::get('OK') !== $result)) { + $failed[] = $id; + } + } + + return $failed; + } + + /** + * {@inheritdoc} + */ + protected function doDeleteYieldTags(array $ids): iterable + { + $lua = <<<'EOLUA' + local v = redis.call('GET', KEYS[1]) + local e = redis.pcall('UNLINK', KEYS[1]) + + if type(e) ~= 'number' then + redis.call('DEL', KEYS[1]) + end + + if not v or v:len() <= 13 or v:byte(1) ~= 0x9D or v:byte(6) ~= 0 or v:byte(10) ~= 0x5F then + return '' + end + + return v:sub(14, 13 + v:byte(13) + v:byte(12) * 256 + v:byte(11) * 65536) +EOLUA; + + $results = $this->pipeline(function () use ($ids, $lua) { + foreach ($ids as $id) { + yield 'eval' => $this->redis instanceof \Predis\ClientInterface ? [$lua, 1, $id] : [$lua, [$id], 1]; + } + }); + + foreach ($results as $id => $result) { + if ($result instanceof \RedisException || $result instanceof ErrorInterface) { + CacheItem::log($this->logger, 'Failed to delete key "{key}": '.$result->getMessage(), ['key' => substr($id, \strlen($this->namespace)), 'exception' => $result]); + + continue; + } + + try { + yield $id => !\is_string($result) || '' === $result ? [] : $this->marshaller->unmarshall($result); + } catch (\Exception $e) { + yield $id => []; + } + } + } + + /** + * {@inheritdoc} + */ + protected function doDeleteTagRelations(array $tagData): bool + { + $results = $this->pipeline(static function () use ($tagData) { + foreach ($tagData as $tagId => $idList) { + array_unshift($idList, $tagId); + yield 'sRem' => $idList; + } + }); + foreach ($results as $result) { + // no-op + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doInvalidate(array $tagIds): bool + { + // This script scans the set of items linked to tag: it empties the set + // and removes the linked items. When the set is still not empty after + // the scan, it means we're in cluster mode and that the linked items + // are on other nodes: we move the links to a temporary set and we + // garbage collect that set from the client side. + + $lua = <<<'EOLUA' + redis.replicate_commands() + + local cursor = '0' + local id = KEYS[1] + repeat + local result = redis.call('SSCAN', id, cursor, 'COUNT', 5000); + cursor = result[1]; + local rems = {} + + for _, v in ipairs(result[2]) do + local ok, _ = pcall(redis.call, 'DEL', ARGV[1]..v) + if ok then + table.insert(rems, v) + end + end + if 0 < #rems then + redis.call('SREM', id, unpack(rems)) + end + until '0' == cursor; + + redis.call('SUNIONSTORE', '{'..id..'}'..id, id) + redis.call('DEL', id) + + return redis.call('SSCAN', '{'..id..'}'..id, '0', 'COUNT', 5000) +EOLUA; + + $results = $this->pipeline(function () use ($tagIds, $lua) { + if ($this->redis instanceof \Predis\ClientInterface) { + $prefix = $this->redis->getOptions()->prefix ? $this->redis->getOptions()->prefix->getPrefix() : ''; + } elseif (\is_array($prefix = $this->redis->getOption(\Redis::OPT_PREFIX) ?? '')) { + $prefix = current($prefix); + } + + foreach ($tagIds as $id) { + yield 'eval' => $this->redis instanceof \Predis\ClientInterface ? [$lua, 1, $id, $prefix] : [$lua, [$id, $prefix], 1]; + } + }); + + $lua = <<<'EOLUA' + redis.replicate_commands() + + local id = KEYS[1] + local cursor = table.remove(ARGV) + redis.call('SREM', '{'..id..'}'..id, unpack(ARGV)) + + return redis.call('SSCAN', '{'..id..'}'..id, cursor, 'COUNT', 5000) +EOLUA; + + $success = true; + foreach ($results as $id => $values) { + if ($values instanceof \RedisException || $values instanceof ErrorInterface) { + CacheItem::log($this->logger, 'Failed to invalidate key "{key}": '.$values->getMessage(), ['key' => substr($id, \strlen($this->namespace)), 'exception' => $values]); + $success = false; + + continue; + } + + [$cursor, $ids] = $values; + + while ($ids || '0' !== $cursor) { + $this->doDelete($ids); + + $evalArgs = [$id, $cursor]; + array_splice($evalArgs, 1, 0, $ids); + + if ($this->redis instanceof \Predis\ClientInterface) { + array_unshift($evalArgs, $lua, 1); + } else { + $evalArgs = [$lua, $evalArgs, 1]; + } + + $results = $this->pipeline(function () use ($evalArgs) { + yield 'eval' => $evalArgs; + }); + + foreach ($results as [$cursor, $ids]) { + // no-op + } + } + } + + return $success; + } + + private function getRedisEvictionPolicy(): string + { + if (isset($this->redisEvictionPolicy)) { + return $this->redisEvictionPolicy; + } + + $hosts = $this->getHosts(); + $host = reset($hosts); + if ($host instanceof \Predis\Client && $host->getConnection() instanceof ReplicationInterface) { + // Predis supports info command only on the master in replication environments + $hosts = [$host->getClientFor('master')]; + } + + foreach ($hosts as $host) { + $info = $host->info('Memory'); + + if ($info instanceof ErrorInterface) { + continue; + } + + $info = $info['Memory'] ?? $info; + + return $this->redisEvictionPolicy = $info['maxmemory_policy']; + } + + return $this->redisEvictionPolicy = ''; + } +} diff --git a/vendor/symfony/cache/Adapter/TagAwareAdapter.php b/vendor/symfony/cache/Adapter/TagAwareAdapter.php new file mode 100644 index 0000000..a6f66ee --- /dev/null +++ b/vendor/symfony/cache/Adapter/TagAwareAdapter.php @@ -0,0 +1,409 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Psr\Cache\CacheItemInterface; +use Psr\Cache\InvalidArgumentException; +use Psr\Log\LoggerAwareInterface; +use Psr\Log\LoggerAwareTrait; +use Symfony\Component\Cache\CacheItem; +use Symfony\Component\Cache\PruneableInterface; +use Symfony\Component\Cache\ResettableInterface; +use Symfony\Component\Cache\Traits\ContractsTrait; +use Symfony\Component\Cache\Traits\ProxyTrait; +use Symfony\Contracts\Cache\TagAwareCacheInterface; + +/** + * @author Nicolas Grekas <p@tchwork.com> + */ +class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface, PruneableInterface, ResettableInterface, LoggerAwareInterface +{ + use ContractsTrait; + use LoggerAwareTrait; + use ProxyTrait; + + public const TAGS_PREFIX = "\0tags\0"; + + private array $deferred = []; + private $tags; + private array $knownTagVersions = []; + private float $knownTagVersionsTtl; + + private static \Closure $createCacheItem; + private static \Closure $setCacheItemTags; + private static \Closure $getTagsByKey; + private static \Closure $saveTags; + + public function __construct(AdapterInterface $itemsPool, AdapterInterface $tagsPool = null, float $knownTagVersionsTtl = 0.15) + { + $this->pool = $itemsPool; + $this->tags = $tagsPool ?? $itemsPool; + $this->knownTagVersionsTtl = $knownTagVersionsTtl; + self::$createCacheItem ?? self::$createCacheItem = \Closure::bind( + static function ($key, $value, CacheItem $protoItem) { + $item = new CacheItem(); + $item->key = $key; + $item->value = $value; + $item->expiry = $protoItem->expiry; + $item->poolHash = $protoItem->poolHash; + + return $item; + }, + null, + CacheItem::class + ); + self::$setCacheItemTags ?? self::$setCacheItemTags = \Closure::bind( + static function (CacheItem $item, $key, array &$itemTags) { + $item->isTaggable = true; + if (!$item->isHit) { + return $item; + } + if (isset($itemTags[$key])) { + foreach ($itemTags[$key] as $tag => $version) { + $item->metadata[CacheItem::METADATA_TAGS][$tag] = $tag; + } + unset($itemTags[$key]); + } else { + $item->value = null; + $item->isHit = false; + } + + return $item; + }, + null, + CacheItem::class + ); + self::$getTagsByKey ?? self::$getTagsByKey = \Closure::bind( + static function ($deferred) { + $tagsByKey = []; + foreach ($deferred as $key => $item) { + $tagsByKey[$key] = $item->newMetadata[CacheItem::METADATA_TAGS] ?? []; + $item->metadata = $item->newMetadata; + } + + return $tagsByKey; + }, + null, + CacheItem::class + ); + self::$saveTags ?? self::$saveTags = \Closure::bind( + static function (AdapterInterface $tagsAdapter, array $tags) { + ksort($tags); + + foreach ($tags as $v) { + $v->expiry = 0; + $tagsAdapter->saveDeferred($v); + } + + return $tagsAdapter->commit(); + }, + null, + CacheItem::class + ); + } + + /** + * {@inheritdoc} + */ + public function invalidateTags(array $tags): bool + { + $ids = []; + foreach ($tags as $tag) { + \assert('' !== CacheItem::validateKey($tag)); + unset($this->knownTagVersions[$tag]); + $ids[] = $tag.static::TAGS_PREFIX; + } + + return !$tags || $this->tags->deleteItems($ids); + } + + /** + * {@inheritdoc} + */ + public function hasItem(mixed $key): bool + { + if (\is_string($key) && isset($this->deferred[$key])) { + $this->commit(); + } + + if (!$this->pool->hasItem($key)) { + return false; + } + + $itemTags = $this->pool->getItem(static::TAGS_PREFIX.$key); + + if (!$itemTags->isHit()) { + return false; + } + + if (!$itemTags = $itemTags->get()) { + return true; + } + + foreach ($this->getTagVersions([$itemTags]) as $tag => $version) { + if ($itemTags[$tag] !== $version) { + return false; + } + } + + return true; + } + + /** + * {@inheritdoc} + */ + public function getItem(mixed $key): CacheItem + { + foreach ($this->getItems([$key]) as $item) { + return $item; + } + } + + /** + * {@inheritdoc} + */ + public function getItems(array $keys = []): iterable + { + $tagKeys = []; + $commit = false; + + foreach ($keys as $key) { + if ('' !== $key && \is_string($key)) { + $commit = $commit || isset($this->deferred[$key]); + $key = static::TAGS_PREFIX.$key; + $tagKeys[$key] = $key; + } + } + + if ($commit) { + $this->commit(); + } + + try { + $items = $this->pool->getItems($tagKeys + $keys); + } catch (InvalidArgumentException $e) { + $this->pool->getItems($keys); // Should throw an exception + + throw $e; + } + + return $this->generateItems($items, $tagKeys); + } + + /** + * {@inheritdoc} + */ + public function clear(string $prefix = ''): bool + { + if ('' !== $prefix) { + foreach ($this->deferred as $key => $item) { + if (str_starts_with($key, $prefix)) { + unset($this->deferred[$key]); + } + } + } else { + $this->deferred = []; + } + + if ($this->pool instanceof AdapterInterface) { + return $this->pool->clear($prefix); + } + + return $this->pool->clear(); + } + + /** + * {@inheritdoc} + */ + public function deleteItem(mixed $key): bool + { + return $this->deleteItems([$key]); + } + + /** + * {@inheritdoc} + */ + public function deleteItems(array $keys): bool + { + foreach ($keys as $key) { + if ('' !== $key && \is_string($key)) { + $keys[] = static::TAGS_PREFIX.$key; + } + } + + return $this->pool->deleteItems($keys); + } + + /** + * {@inheritdoc} + */ + public function save(CacheItemInterface $item): bool + { + if (!$item instanceof CacheItem) { + return false; + } + $this->deferred[$item->getKey()] = $item; + + return $this->commit(); + } + + /** + * {@inheritdoc} + */ + public function saveDeferred(CacheItemInterface $item): bool + { + if (!$item instanceof CacheItem) { + return false; + } + $this->deferred[$item->getKey()] = $item; + + return true; + } + + /** + * {@inheritdoc} + */ + public function commit(): bool + { + if (!$this->deferred) { + return true; + } + + $ok = true; + foreach ($this->deferred as $key => $item) { + if (!$this->pool->saveDeferred($item)) { + unset($this->deferred[$key]); + $ok = false; + } + } + + $items = $this->deferred; + $tagsByKey = (self::$getTagsByKey)($items); + $this->deferred = []; + + $tagVersions = $this->getTagVersions($tagsByKey); + $f = self::$createCacheItem; + + foreach ($tagsByKey as $key => $tags) { + $this->pool->saveDeferred($f(static::TAGS_PREFIX.$key, array_intersect_key($tagVersions, $tags), $items[$key])); + } + + return $this->pool->commit() && $ok; + } + + public function __sleep(): array + { + throw new \BadMethodCallException('Cannot serialize '.__CLASS__); + } + + public function __wakeup() + { + throw new \BadMethodCallException('Cannot unserialize '.__CLASS__); + } + + public function __destruct() + { + $this->commit(); + } + + private function generateItems(iterable $items, array $tagKeys): \Generator + { + $bufferedItems = $itemTags = []; + $f = self::$setCacheItemTags; + + foreach ($items as $key => $item) { + if (!$tagKeys) { + yield $key => $f($item, static::TAGS_PREFIX.$key, $itemTags); + continue; + } + if (!isset($tagKeys[$key])) { + $bufferedItems[$key] = $item; + continue; + } + + unset($tagKeys[$key]); + + if ($item->isHit()) { + $itemTags[$key] = $item->get() ?: []; + } + + if (!$tagKeys) { + $tagVersions = $this->getTagVersions($itemTags); + + foreach ($itemTags as $key => $tags) { + foreach ($tags as $tag => $version) { + if ($tagVersions[$tag] !== $version) { + unset($itemTags[$key]); + continue 2; + } + } + } + $tagVersions = $tagKeys = null; + + foreach ($bufferedItems as $key => $item) { + yield $key => $f($item, static::TAGS_PREFIX.$key, $itemTags); + } + $bufferedItems = null; + } + } + } + + private function getTagVersions(array $tagsByKey): array + { + $tagVersions = []; + $fetchTagVersions = false; + + foreach ($tagsByKey as $tags) { + $tagVersions += $tags; + + foreach ($tags as $tag => $version) { + if ($tagVersions[$tag] !== $version) { + unset($this->knownTagVersions[$tag]); + } + } + } + + if (!$tagVersions) { + return []; + } + + $now = microtime(true); + $tags = []; + foreach ($tagVersions as $tag => $version) { + $tags[$tag.static::TAGS_PREFIX] = $tag; + if ($fetchTagVersions || ($this->knownTagVersions[$tag][1] ?? null) !== $version || $now - $this->knownTagVersions[$tag][0] >= $this->knownTagVersionsTtl) { + // reuse previously fetched tag versions up to the ttl + $fetchTagVersions = true; + } + } + + if (!$fetchTagVersions) { + return $tagVersions; + } + + $newTags = []; + $newVersion = null; + foreach ($this->tags->getItems(array_keys($tags)) as $tag => $version) { + if (!$version->isHit()) { + $newTags[$tag] = $version->set($newVersion ?? $newVersion = random_int(\PHP_INT_MIN, \PHP_INT_MAX)); + } + $tagVersions[$tag = $tags[$tag]] = $version->get(); + $this->knownTagVersions[$tag] = [$now, $tagVersions[$tag]]; + } + + if ($newTags) { + (self::$saveTags)($this->tags, $newTags); + } + + return $tagVersions; + } +} diff --git a/vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php b/vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php new file mode 100644 index 0000000..9242779 --- /dev/null +++ b/vendor/symfony/cache/Adapter/TagAwareAdapterInterface.php @@ -0,0 +1,31 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Psr\Cache\InvalidArgumentException; + +/** + * Interface for invalidating cached items using tags. + * + * @author Nicolas Grekas <p@tchwork.com> + */ +interface TagAwareAdapterInterface extends AdapterInterface +{ + /** + * Invalidates cached items using tags. + * + * @param string[] $tags An array of tags to invalidate + * + * @throws InvalidArgumentException When $tags is not valid + */ + public function invalidateTags(array $tags): bool; +} diff --git a/vendor/symfony/cache/Adapter/TraceableAdapter.php b/vendor/symfony/cache/Adapter/TraceableAdapter.php new file mode 100644 index 0000000..0b577aa --- /dev/null +++ b/vendor/symfony/cache/Adapter/TraceableAdapter.php @@ -0,0 +1,284 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Psr\Cache\CacheItemInterface; +use Symfony\Component\Cache\CacheItem; +use Symfony\Component\Cache\PruneableInterface; +use Symfony\Component\Cache\ResettableInterface; +use Symfony\Contracts\Cache\CacheInterface; +use Symfony\Contracts\Service\ResetInterface; + +/** + * An adapter that collects data about all cache calls. + * + * @author Aaron Scherer <aequasi@gmail.com> + * @author Tobias Nyholm <tobias.nyholm@gmail.com> + * @author Nicolas Grekas <p@tchwork.com> + */ +class TraceableAdapter implements AdapterInterface, CacheInterface, PruneableInterface, ResettableInterface +{ + protected $pool; + private array $calls = []; + + public function __construct(AdapterInterface $pool) + { + $this->pool = $pool; + } + + /** + * {@inheritdoc} + */ + public function get(string $key, callable $callback, float $beta = null, array &$metadata = null): mixed + { + if (!$this->pool instanceof CacheInterface) { + throw new \BadMethodCallException(sprintf('Cannot call "%s::get()": this class doesn\'t implement "%s".', get_debug_type($this->pool), CacheInterface::class)); + } + + $isHit = true; + $callback = function (CacheItem $item, bool &$save) use ($callback, &$isHit) { + $isHit = $item->isHit(); + + return $callback($item, $save); + }; + + $event = $this->start(__FUNCTION__); + try { + $value = $this->pool->get($key, $callback, $beta, $metadata); + $event->result[$key] = get_debug_type($value); + } finally { + $event->end = microtime(true); + } + if ($isHit) { + ++$event->hits; + } else { + ++$event->misses; + } + + return $value; + } + + /** + * {@inheritdoc} + */ + public function getItem(mixed $key): CacheItem + { + $event = $this->start(__FUNCTION__); + try { + $item = $this->pool->getItem($key); + } finally { + $event->end = microtime(true); + } + if ($event->result[$key] = $item->isHit()) { + ++$event->hits; + } else { + ++$event->misses; + } + + return $item; + } + + /** + * {@inheritdoc} + */ + public function hasItem(mixed $key): bool + { + $event = $this->start(__FUNCTION__); + try { + return $event->result[$key] = $this->pool->hasItem($key); + } finally { + $event->end = microtime(true); + } + } + + /** + * {@inheritdoc} + */ + public function deleteItem(mixed $key): bool + { + $event = $this->start(__FUNCTION__); + try { + return $event->result[$key] = $this->pool->deleteItem($key); + } finally { + $event->end = microtime(true); + } + } + + /** + * {@inheritdoc} + */ + public function save(CacheItemInterface $item): bool + { + $event = $this->start(__FUNCTION__); + try { + return $event->result[$item->getKey()] = $this->pool->save($item); + } finally { + $event->end = microtime(true); + } + } + + /** + * {@inheritdoc} + */ + public function saveDeferred(CacheItemInterface $item): bool + { + $event = $this->start(__FUNCTION__); + try { + return $event->result[$item->getKey()] = $this->pool->saveDeferred($item); + } finally { + $event->end = microtime(true); + } + } + + /** + * {@inheritdoc} + */ + public function getItems(array $keys = []): iterable + { + $event = $this->start(__FUNCTION__); + try { + $result = $this->pool->getItems($keys); + } finally { + $event->end = microtime(true); + } + $f = function () use ($result, $event) { + $event->result = []; + foreach ($result as $key => $item) { + if ($event->result[$key] = $item->isHit()) { + ++$event->hits; + } else { + ++$event->misses; + } + yield $key => $item; + } + }; + + return $f(); + } + + /** + * {@inheritdoc} + */ + public function clear(string $prefix = ''): bool + { + $event = $this->start(__FUNCTION__); + try { + if ($this->pool instanceof AdapterInterface) { + return $event->result = $this->pool->clear($prefix); + } + + return $event->result = $this->pool->clear(); + } finally { + $event->end = microtime(true); + } + } + + /** + * {@inheritdoc} + */ + public function deleteItems(array $keys): bool + { + $event = $this->start(__FUNCTION__); + $event->result['keys'] = $keys; + try { + return $event->result['result'] = $this->pool->deleteItems($keys); + } finally { + $event->end = microtime(true); + } + } + + /** + * {@inheritdoc} + */ + public function commit(): bool + { + $event = $this->start(__FUNCTION__); + try { + return $event->result = $this->pool->commit(); + } finally { + $event->end = microtime(true); + } + } + + /** + * {@inheritdoc} + */ + public function prune(): bool + { + if (!$this->pool instanceof PruneableInterface) { + return false; + } + $event = $this->start(__FUNCTION__); + try { + return $event->result = $this->pool->prune(); + } finally { + $event->end = microtime(true); + } + } + + /** + * {@inheritdoc} + */ + public function reset() + { + if ($this->pool instanceof ResetInterface) { + $this->pool->reset(); + } + + $this->clearCalls(); + } + + /** + * {@inheritdoc} + */ + public function delete(string $key): bool + { + $event = $this->start(__FUNCTION__); + try { + return $event->result[$key] = $this->pool->deleteItem($key); + } finally { + $event->end = microtime(true); + } + } + + public function getCalls() + { + return $this->calls; + } + + public function clearCalls() + { + $this->calls = []; + } + + protected function start(string $name) + { + $this->calls[] = $event = new TraceableAdapterEvent(); + $event->name = $name; + $event->start = microtime(true); + + return $event; + } +} + +/** + * @internal + */ +class TraceableAdapterEvent +{ + public string $name; + public float $start; + public float $end; + public array|bool $result; + public int $hits = 0; + public int $misses = 0; +} diff --git a/vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php b/vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php new file mode 100644 index 0000000..3550633 --- /dev/null +++ b/vendor/symfony/cache/Adapter/TraceableTagAwareAdapter.php @@ -0,0 +1,38 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Adapter; + +use Symfony\Contracts\Cache\TagAwareCacheInterface; + +/** + * @author Robin Chalas <robin.chalas@gmail.com> + */ +class TraceableTagAwareAdapter extends TraceableAdapter implements TagAwareAdapterInterface, TagAwareCacheInterface +{ + public function __construct(TagAwareAdapterInterface $pool) + { + parent::__construct($pool); + } + + /** + * {@inheritdoc} + */ + public function invalidateTags(array $tags): bool + { + $event = $this->start(__FUNCTION__); + try { + return $event->result = $this->pool->invalidateTags($tags); + } finally { + $event->end = microtime(true); + } + } +} diff --git a/vendor/symfony/cache/CHANGELOG.md b/vendor/symfony/cache/CHANGELOG.md new file mode 100644 index 0000000..1f54db7 --- /dev/null +++ b/vendor/symfony/cache/CHANGELOG.md @@ -0,0 +1,114 @@ +CHANGELOG +========= + +6.0 +--- + + * Remove `DoctrineProvider` and `DoctrineAdapter` + * Remove support of Doctrine DBAL in `PdoAdapter` + +5.4 +--- + + * Deprecate `DoctrineProvider` and `DoctrineAdapter` because these classes have been added to the `doctrine/cache` package + * Add `DoctrineDbalAdapter` identical to `PdoAdapter` for `Doctrine\DBAL\Connection` or DBAL URL + * Deprecate usage of `PdoAdapter` with `Doctrine\DBAL\Connection` or DBAL URL + +5.3 +--- + + * added support for connecting to Redis Sentinel clusters when using the Redis PHP extension + * add support for a custom serializer to the `ApcuAdapter` class + +5.2.0 +----- + + * added integration with Messenger to allow computing cached values in a worker + * allow ISO 8601 time intervals to specify default lifetime + +5.1.0 +----- + + * added max-items + LRU + max-lifetime capabilities to `ArrayCache` + * added `CouchbaseBucketAdapter` + * added context `cache-adapter` to log messages + +5.0.0 +----- + + * removed all PSR-16 implementations in the `Simple` namespace + * removed `SimpleCacheAdapter` + * removed `AbstractAdapter::unserialize()` + * removed `CacheItem::getPreviousTags()` + +4.4.0 +----- + + * added support for connecting to Redis Sentinel clusters + * added argument `$prefix` to `AdapterInterface::clear()` + * improved `RedisTagAwareAdapter` to support Redis server >= 2.8 and up to 4B items per tag + * added `TagAwareMarshaller` for optimized data storage when using `AbstractTagAwareAdapter` + * added `DeflateMarshaller` to compress serialized values + * removed support for phpredis 4 `compression` + * [BC BREAK] `RedisTagAwareAdapter` is not compatible with `RedisCluster` from `Predis` anymore, use `phpredis` instead + * Marked the `CacheDataCollector` class as `@final`. + * added `SodiumMarshaller` to encrypt/decrypt values using libsodium + +4.3.0 +----- + + * removed `psr/simple-cache` dependency, run `composer require psr/simple-cache` if you need it + * deprecated all PSR-16 adapters, use `Psr16Cache` or `Symfony\Contracts\Cache\CacheInterface` implementations instead + * deprecated `SimpleCacheAdapter`, use `Psr16Adapter` instead + +4.2.0 +----- + + * added support for connecting to Redis clusters via DSN + * added support for configuring multiple Memcached servers via DSN + * added `MarshallerInterface` and `DefaultMarshaller` to allow changing the serializer and provide one that automatically uses igbinary when available + * implemented `CacheInterface`, which provides stampede protection via probabilistic early expiration and should become the preferred way to use a cache + * added sub-second expiry accuracy for backends that support it + * added support for phpredis 4 `compression` and `tcp_keepalive` options + * added automatic table creation when using Doctrine DBAL with PDO-based backends + * throw `LogicException` when `CacheItem::tag()` is called on an item coming from a non tag-aware pool + * deprecated `CacheItem::getPreviousTags()`, use `CacheItem::getMetadata()` instead + * deprecated the `AbstractAdapter::unserialize()` and `AbstractCache::unserialize()` methods + * added `CacheCollectorPass` (originally in `FrameworkBundle`) + * added `CachePoolClearerPass` (originally in `FrameworkBundle`) + * added `CachePoolPass` (originally in `FrameworkBundle`) + * added `CachePoolPrunerPass` (originally in `FrameworkBundle`) + +3.4.0 +----- + + * added using options from Memcached DSN + * added PruneableInterface so PSR-6 or PSR-16 cache implementations can declare support for manual stale cache pruning + * added prune logic to FilesystemTrait, PhpFilesTrait, PdoTrait, TagAwareAdapter and ChainTrait + * now FilesystemAdapter, PhpFilesAdapter, FilesystemCache, PhpFilesCache, PdoAdapter, PdoCache, ChainAdapter, and + ChainCache implement PruneableInterface and support manual stale cache pruning + +3.3.0 +----- + + * added CacheItem::getPreviousTags() to get bound tags coming from the pool storage if any + * added PSR-16 "Simple Cache" implementations for all existing PSR-6 adapters + * added Psr6Cache and SimpleCacheAdapter for bidirectional interoperability between PSR-6 and PSR-16 + * added MemcachedAdapter (PSR-6) and MemcachedCache (PSR-16) + * added TraceableAdapter (PSR-6) and TraceableCache (PSR-16) + +3.2.0 +----- + + * added TagAwareAdapter for tags-based invalidation + * added PdoAdapter with PDO and Doctrine DBAL support + * added PhpArrayAdapter and PhpFilesAdapter for OPcache-backed shared memory storage (PHP 7+ only) + * added NullAdapter + +3.1.0 +----- + + * added the component with strict PSR-6 implementations + * added ApcuAdapter, ArrayAdapter, FilesystemAdapter and RedisAdapter + * added AbstractAdapter, ChainAdapter and ProxyAdapter + * added DoctrineAdapter and DoctrineProvider for bidirectional interoperability with Doctrine Cache diff --git a/vendor/symfony/cache/CacheItem.php b/vendor/symfony/cache/CacheItem.php new file mode 100644 index 0000000..d48a46d --- /dev/null +++ b/vendor/symfony/cache/CacheItem.php @@ -0,0 +1,184 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache; + +use Psr\Log\LoggerInterface; +use Symfony\Component\Cache\Exception\InvalidArgumentException; +use Symfony\Component\Cache\Exception\LogicException; +use Symfony\Contracts\Cache\ItemInterface; + +/** + * @author Nicolas Grekas <p@tchwork.com> + */ +final class CacheItem implements ItemInterface +{ + private const METADATA_EXPIRY_OFFSET = 1527506807; + + protected string $key; + protected mixed $value = null; + protected bool $isHit = false; + protected float|int|null $expiry = null; + protected array $metadata = []; + protected array $newMetadata = []; + protected $innerItem = null; + protected ?string $poolHash = null; + protected bool $isTaggable = false; + + /** + * {@inheritdoc} + */ + public function getKey(): string + { + return $this->key; + } + + /** + * {@inheritdoc} + */ + public function get(): mixed + { + return $this->value; + } + + /** + * {@inheritdoc} + */ + public function isHit(): bool + { + return $this->isHit; + } + + /** + * {@inheritdoc} + * + * @return $this + */ + public function set($value): static + { + $this->value = $value; + + return $this; + } + + /** + * {@inheritdoc} + * + * @return $this + */ + public function expiresAt(?\DateTimeInterface $expiration): static + { + $this->expiry = null !== $expiration ? (float) $expiration->format('U.u') : null; + + return $this; + } + + /** + * {@inheritdoc} + * + * @return $this + */ + public function expiresAfter(mixed $time): static + { + if (null === $time) { + $this->expiry = null; + } elseif ($time instanceof \DateInterval) { + $this->expiry = microtime(true) + \DateTime::createFromFormat('U', 0)->add($time)->format('U.u'); + } elseif (\is_int($time)) { + $this->expiry = $time + microtime(true); + } else { + throw new InvalidArgumentException(sprintf('Expiration date must be an integer, a DateInterval or null, "%s" given.', get_debug_type($time))); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function tag(mixed $tags): static + { + if (!$this->isTaggable) { + throw new LogicException(sprintf('Cache item "%s" comes from a non tag-aware pool: you cannot tag it.', $this->key)); + } + if (!is_iterable($tags)) { + $tags = [$tags]; + } + foreach ($tags as $tag) { + if (!\is_string($tag) && !$tag instanceof \Stringable) { + throw new InvalidArgumentException(sprintf('Cache tag must be string or object that implements __toString(), "%s" given.', get_debug_type($tag))); + } + $tag = (string) $tag; + if (isset($this->newMetadata[self::METADATA_TAGS][$tag])) { + continue; + } + if ('' === $tag) { + throw new InvalidArgumentException('Cache tag length must be greater than zero.'); + } + if (false !== strpbrk($tag, self::RESERVED_CHARACTERS)) { + throw new InvalidArgumentException(sprintf('Cache tag "%s" contains reserved characters "%s".', $tag, self::RESERVED_CHARACTERS)); + } + $this->newMetadata[self::METADATA_TAGS][$tag] = $tag; + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function getMetadata(): array + { + return $this->metadata; + } + + /** + * Validates a cache key according to PSR-6. + * + * @param mixed $key The key to validate + * + * @throws InvalidArgumentException When $key is not valid + */ + public static function validateKey($key): string + { + if (!\is_string($key)) { + throw new InvalidArgumentException(sprintf('Cache key must be string, "%s" given.', get_debug_type($key))); + } + if ('' === $key) { + throw new InvalidArgumentException('Cache key length must be greater than zero.'); + } + if (false !== strpbrk($key, self::RESERVED_CHARACTERS)) { + throw new InvalidArgumentException(sprintf('Cache key "%s" contains reserved characters "%s".', $key, self::RESERVED_CHARACTERS)); + } + + return $key; + } + + /** + * Internal logging helper. + * + * @internal + */ + public static function log(?LoggerInterface $logger, string $message, array $context = []) + { + if ($logger) { + $logger->warning($message, $context); + } else { + $replace = []; + foreach ($context as $k => $v) { + if (\is_scalar($v)) { + $replace['{'.$k.'}'] = $v; + } + } + @trigger_error(strtr($message, $replace), \E_USER_WARNING); + } + } +} diff --git a/vendor/symfony/cache/DataCollector/CacheDataCollector.php b/vendor/symfony/cache/DataCollector/CacheDataCollector.php new file mode 100644 index 0000000..4fb700b --- /dev/null +++ b/vendor/symfony/cache/DataCollector/CacheDataCollector.php @@ -0,0 +1,183 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\DataCollector; + +use Symfony\Component\Cache\Adapter\TraceableAdapter; +use Symfony\Component\Cache\Adapter\TraceableAdapterEvent; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\DataCollector\DataCollector; +use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface; + +/** + * @author Aaron Scherer <aequasi@gmail.com> + * @author Tobias Nyholm <tobias.nyholm@gmail.com> + * + * @final + */ +class CacheDataCollector extends DataCollector implements LateDataCollectorInterface +{ + /** + * @var TraceableAdapter[] + */ + private array $instances = []; + + public function addInstance(string $name, TraceableAdapter $instance) + { + $this->instances[$name] = $instance; + } + + /** + * {@inheritdoc} + */ + public function collect(Request $request, Response $response, \Throwable $exception = null) + { + $empty = ['calls' => [], 'config' => [], 'options' => [], 'statistics' => []]; + $this->data = ['instances' => $empty, 'total' => $empty]; + foreach ($this->instances as $name => $instance) { + $this->data['instances']['calls'][$name] = $instance->getCalls(); + } + + $this->data['instances']['statistics'] = $this->calculateStatistics(); + $this->data['total']['statistics'] = $this->calculateTotalStatistics(); + } + + public function reset() + { + $this->data = []; + foreach ($this->instances as $instance) { + $instance->clearCalls(); + } + } + + public function lateCollect() + { + $this->data['instances']['calls'] = $this->cloneVar($this->data['instances']['calls']); + } + + /** + * {@inheritdoc} + */ + public function getName(): string + { + return 'cache'; + } + + /** + * Method returns amount of logged Cache reads: "get" calls. + */ + public function getStatistics(): array + { + return $this->data['instances']['statistics']; + } + + /** + * Method returns the statistic totals. + */ + public function getTotals(): array + { + return $this->data['total']['statistics']; + } + + /** + * Method returns all logged Cache call objects. + */ + public function getCalls(): mixed + { + return $this->data['instances']['calls']; + } + + private function calculateStatistics(): array + { + $statistics = []; + foreach ($this->data['instances']['calls'] as $name => $calls) { + $statistics[$name] = [ + 'calls' => 0, + 'time' => 0, + 'reads' => 0, + 'writes' => 0, + 'deletes' => 0, + 'hits' => 0, + 'misses' => 0, + ]; + /** @var TraceableAdapterEvent $call */ + foreach ($calls as $call) { + ++$statistics[$name]['calls']; + $statistics[$name]['time'] += $call->end - $call->start; + if ('get' === $call->name) { + ++$statistics[$name]['reads']; + if ($call->hits) { + ++$statistics[$name]['hits']; + } else { + ++$statistics[$name]['misses']; + ++$statistics[$name]['writes']; + } + } elseif ('getItem' === $call->name) { + ++$statistics[$name]['reads']; + if ($call->hits) { + ++$statistics[$name]['hits']; + } else { + ++$statistics[$name]['misses']; + } + } elseif ('getItems' === $call->name) { + $statistics[$name]['reads'] += $call->hits + $call->misses; + $statistics[$name]['hits'] += $call->hits; + $statistics[$name]['misses'] += $call->misses; + } elseif ('hasItem' === $call->name) { + ++$statistics[$name]['reads']; + if (false === $call->result) { + ++$statistics[$name]['misses']; + } else { + ++$statistics[$name]['hits']; + } + } elseif ('save' === $call->name) { + ++$statistics[$name]['writes']; + } elseif ('deleteItem' === $call->name) { + ++$statistics[$name]['deletes']; + } + } + if ($statistics[$name]['reads']) { + $statistics[$name]['hit_read_ratio'] = round(100 * $statistics[$name]['hits'] / $statistics[$name]['reads'], 2); + } else { + $statistics[$name]['hit_read_ratio'] = null; + } + } + + return $statistics; + } + + private function calculateTotalStatistics(): array + { + $statistics = $this->getStatistics(); + $totals = [ + 'calls' => 0, + 'time' => 0, + 'reads' => 0, + 'writes' => 0, + 'deletes' => 0, + 'hits' => 0, + 'misses' => 0, + ]; + foreach ($statistics as $name => $values) { + foreach ($totals as $key => $value) { + $totals[$key] += $statistics[$name][$key]; + } + } + if ($totals['reads']) { + $totals['hit_read_ratio'] = round(100 * $totals['hits'] / $totals['reads'], 2); + } else { + $totals['hit_read_ratio'] = null; + } + + return $totals; + } +} diff --git a/vendor/symfony/cache/DependencyInjection/CacheCollectorPass.php b/vendor/symfony/cache/DependencyInjection/CacheCollectorPass.php new file mode 100644 index 0000000..33b3b6e --- /dev/null +++ b/vendor/symfony/cache/DependencyInjection/CacheCollectorPass.php @@ -0,0 +1,79 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\DependencyInjection; + +use Symfony\Component\Cache\Adapter\TagAwareAdapterInterface; +use Symfony\Component\Cache\Adapter\TraceableAdapter; +use Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Definition; +use Symfony\Component\DependencyInjection\Reference; + +/** + * Inject a data collector to all the cache services to be able to get detailed statistics. + * + * @author Tobias Nyholm <tobias.nyholm@gmail.com> + */ +class CacheCollectorPass implements CompilerPassInterface +{ + /** + * {@inheritdoc} + */ + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition('data_collector.cache')) { + return; + } + + foreach ($container->findTaggedServiceIds('cache.pool') as $id => $attributes) { + $poolName = $attributes[0]['name'] ?? $id; + + $this->addToCollector($id, $poolName, $container); + } + } + + private function addToCollector(string $id, string $name, ContainerBuilder $container) + { + $definition = $container->getDefinition($id); + if ($definition->isAbstract()) { + return; + } + + $collectorDefinition = $container->getDefinition('data_collector.cache'); + $recorder = new Definition(is_subclass_of($definition->getClass(), TagAwareAdapterInterface::class) ? TraceableTagAwareAdapter::class : TraceableAdapter::class); + $recorder->setTags($definition->getTags()); + if (!$definition->isPublic() || !$definition->isPrivate()) { + $recorder->setPublic($definition->isPublic()); + } + $recorder->setArguments([new Reference($innerId = $id.'.recorder_inner')]); + + foreach ($definition->getMethodCalls() as [$method, $args]) { + if ('setCallbackWrapper' !== $method || !$args[0] instanceof Definition || !($args[0]->getArguments()[2] ?? null) instanceof Definition) { + continue; + } + if ([new Reference($id), 'setCallbackWrapper'] == $args[0]->getArguments()[2]->getFactory()) { + $args[0]->getArguments()[2]->setFactory([new Reference($innerId), 'setCallbackWrapper']); + } + } + + $definition->setTags([]); + $definition->setPublic(false); + + $container->setDefinition($innerId, $definition); + $container->setDefinition($id, $recorder); + + // Tell the collector to add the new instance + $collectorDefinition->addMethodCall('addInstance', [$name, new Reference($id)]); + $collectorDefinition->setPublic(false); + } +} diff --git a/vendor/symfony/cache/DependencyInjection/CachePoolClearerPass.php b/vendor/symfony/cache/DependencyInjection/CachePoolClearerPass.php new file mode 100644 index 0000000..76dd19d --- /dev/null +++ b/vendor/symfony/cache/DependencyInjection/CachePoolClearerPass.php @@ -0,0 +1,41 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\DependencyInjection; + +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Reference; + +/** + * @author Nicolas Grekas <p@tchwork.com> + */ +class CachePoolClearerPass implements CompilerPassInterface +{ + /** + * {@inheritdoc} + */ + public function process(ContainerBuilder $container) + { + $container->getParameterBag()->remove('cache.prefix.seed'); + + foreach ($container->findTaggedServiceIds('cache.pool.clearer') as $id => $attr) { + $clearer = $container->getDefinition($id); + $pools = []; + foreach ($clearer->getArgument(0) as $name => $ref) { + if ($container->hasDefinition($ref)) { + $pools[$name] = new Reference($ref); + } + } + $clearer->replaceArgument(0, $pools); + } + } +} diff --git a/vendor/symfony/cache/DependencyInjection/CachePoolPass.php b/vendor/symfony/cache/DependencyInjection/CachePoolPass.php new file mode 100644 index 0000000..e292e31 --- /dev/null +++ b/vendor/symfony/cache/DependencyInjection/CachePoolPass.php @@ -0,0 +1,247 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\DependencyInjection; + +use Symfony\Component\Cache\Adapter\AbstractAdapter; +use Symfony\Component\Cache\Adapter\ArrayAdapter; +use Symfony\Component\Cache\Adapter\ChainAdapter; +use Symfony\Component\Cache\Adapter\NullAdapter; +use Symfony\Component\Cache\Adapter\ParameterNormalizer; +use Symfony\Component\Cache\Messenger\EarlyExpirationDispatcher; +use Symfony\Component\DependencyInjection\ChildDefinition; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Definition; +use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; +use Symfony\Component\DependencyInjection\Reference; + +/** + * @author Nicolas Grekas <p@tchwork.com> + */ +class CachePoolPass implements CompilerPassInterface +{ + /** + * {@inheritdoc} + */ + public function process(ContainerBuilder $container) + { + if ($container->hasParameter('cache.prefix.seed')) { + $seed = $container->getParameterBag()->resolveValue($container->getParameter('cache.prefix.seed')); + } else { + $seed = '_'.$container->getParameter('kernel.project_dir'); + $seed .= '.'.$container->getParameter('kernel.container_class'); + } + + $needsMessageHandler = false; + $allPools = []; + $clearers = []; + $attributes = [ + 'provider', + 'name', + 'namespace', + 'default_lifetime', + 'early_expiration_message_bus', + 'reset', + ]; + foreach ($container->findTaggedServiceIds('cache.pool') as $id => $tags) { + $adapter = $pool = $container->getDefinition($id); + if ($pool->isAbstract()) { + continue; + } + $class = $adapter->getClass(); + while ($adapter instanceof ChildDefinition) { + $adapter = $container->findDefinition($adapter->getParent()); + $class = $class ?: $adapter->getClass(); + if ($t = $adapter->getTag('cache.pool')) { + $tags[0] += $t[0]; + } + } + $name = $tags[0]['name'] ?? $id; + if (!isset($tags[0]['namespace'])) { + $namespaceSeed = $seed; + if (null !== $class) { + $namespaceSeed .= '.'.$class; + } + + $tags[0]['namespace'] = $this->getNamespace($namespaceSeed, $name); + } + if (isset($tags[0]['clearer'])) { + $clearer = $tags[0]['clearer']; + while ($container->hasAlias($clearer)) { + $clearer = (string) $container->getAlias($clearer); + } + } else { + $clearer = null; + } + unset($tags[0]['clearer'], $tags[0]['name']); + + if (isset($tags[0]['provider'])) { + $tags[0]['provider'] = new Reference(static::getServiceProvider($container, $tags[0]['provider'])); + } + + if (ChainAdapter::class === $class) { + $adapters = []; + foreach ($adapter->getArgument(0) as $provider => $adapter) { + if ($adapter instanceof ChildDefinition) { + $chainedPool = $adapter; + } else { + $chainedPool = $adapter = new ChildDefinition($adapter); + } + + $chainedTags = [\is_int($provider) ? [] : ['provider' => $provider]]; + $chainedClass = ''; + + while ($adapter instanceof ChildDefinition) { + $adapter = $container->findDefinition($adapter->getParent()); + $chainedClass = $chainedClass ?: $adapter->getClass(); + if ($t = $adapter->getTag('cache.pool')) { + $chainedTags[0] += $t[0]; + } + } + + if (ChainAdapter::class === $chainedClass) { + throw new InvalidArgumentException(sprintf('Invalid service "%s": chain of adapters cannot reference another chain, found "%s".', $id, $chainedPool->getParent())); + } + + $i = 0; + + if (isset($chainedTags[0]['provider'])) { + $chainedPool->replaceArgument($i++, new Reference(static::getServiceProvider($container, $chainedTags[0]['provider']))); + } + + if (isset($tags[0]['namespace']) && !\in_array($adapter->getClass(), [ArrayAdapter::class, NullAdapter::class], true)) { + $chainedPool->replaceArgument($i++, $tags[0]['namespace']); + } + + if (isset($tags[0]['default_lifetime'])) { + $chainedPool->replaceArgument($i++, $tags[0]['default_lifetime']); + } + + $adapters[] = $chainedPool; + } + + $pool->replaceArgument(0, $adapters); + unset($tags[0]['provider'], $tags[0]['namespace']); + $i = 1; + } else { + $i = 0; + } + + foreach ($attributes as $attr) { + if (!isset($tags[0][$attr])) { + // no-op + } elseif ('reset' === $attr) { + if ($tags[0][$attr]) { + $pool->addTag('kernel.reset', ['method' => $tags[0][$attr]]); + } + } elseif ('early_expiration_message_bus' === $attr) { + $needsMessageHandler = true; + $pool->addMethodCall('setCallbackWrapper', [(new Definition(EarlyExpirationDispatcher::class)) + ->addArgument(new Reference($tags[0]['early_expiration_message_bus'])) + ->addArgument(new Reference('reverse_container')) + ->addArgument((new Definition('callable')) + ->setFactory([new Reference($id), 'setCallbackWrapper']) + ->addArgument(null) + ), + ]); + $pool->addTag('container.reversible'); + } elseif ('namespace' !== $attr || !\in_array($class, [ArrayAdapter::class, NullAdapter::class], true)) { + $argument = $tags[0][$attr]; + + if ('default_lifetime' === $attr && !is_numeric($argument)) { + $argument = (new Definition('int', [$argument])) + ->setFactory([ParameterNormalizer::class, 'normalizeDuration']); + } + + $pool->replaceArgument($i++, $argument); + } + unset($tags[0][$attr]); + } + if (!empty($tags[0])) { + throw new InvalidArgumentException(sprintf('Invalid "cache.pool" tag for service "%s": accepted attributes are "clearer", "provider", "name", "namespace", "default_lifetime", "early_expiration_message_bus" and "reset", found "%s".', $id, implode('", "', array_keys($tags[0])))); + } + + if (null !== $clearer) { + $clearers[$clearer][$name] = new Reference($id, $container::IGNORE_ON_UNINITIALIZED_REFERENCE); + } + + $allPools[$name] = new Reference($id, $container::IGNORE_ON_UNINITIALIZED_REFERENCE); + } + + if (!$needsMessageHandler) { + $container->removeDefinition('cache.early_expiration_handler'); + } + + $notAliasedCacheClearerId = $aliasedCacheClearerId = 'cache.global_clearer'; + while ($container->hasAlias('cache.global_clearer')) { + $aliasedCacheClearerId = (string) $container->getAlias('cache.global_clearer'); + } + if ($container->hasDefinition($aliasedCacheClearerId)) { + $clearers[$notAliasedCacheClearerId] = $allPools; + } + + foreach ($clearers as $id => $pools) { + $clearer = $container->getDefinition($id); + if ($clearer instanceof ChildDefinition) { + $clearer->replaceArgument(0, $pools); + } else { + $clearer->setArgument(0, $pools); + } + $clearer->addTag('cache.pool.clearer'); + + if ('cache.system_clearer' === $id) { + $clearer->addTag('kernel.cache_clearer'); + } + } + + $allPoolsKeys = array_keys($allPools); + + if ($container->hasDefinition('console.command.cache_pool_list')) { + $container->getDefinition('console.command.cache_pool_list')->replaceArgument(0, $allPoolsKeys); + } + + if ($container->hasDefinition('console.command.cache_pool_clear')) { + $container->getDefinition('console.command.cache_pool_clear')->addArgument($allPoolsKeys); + } + + if ($container->hasDefinition('console.command.cache_pool_delete')) { + $container->getDefinition('console.command.cache_pool_delete')->addArgument($allPoolsKeys); + } + } + + private function getNamespace(string $seed, string $id) + { + return substr(str_replace('/', '-', base64_encode(hash('sha256', $id.$seed, true))), 0, 10); + } + + /** + * @internal + */ + public static function getServiceProvider(ContainerBuilder $container, string $name) + { + $container->resolveEnvPlaceholders($name, null, $usedEnvs); + + if ($usedEnvs || preg_match('#^[a-z]++:#', $name)) { + $dsn = $name; + + if (!$container->hasDefinition($name = '.cache_connection.'.ContainerBuilder::hash($dsn))) { + $definition = new Definition(AbstractAdapter::class); + $definition->setPublic(false); + $definition->setFactory([AbstractAdapter::class, 'createConnection']); + $definition->setArguments([$dsn, ['lazy' => true]]); + $container->setDefinition($name, $definition); + } + } + + return $name; + } +} diff --git a/vendor/symfony/cache/DependencyInjection/CachePoolPrunerPass.php b/vendor/symfony/cache/DependencyInjection/CachePoolPrunerPass.php new file mode 100644 index 0000000..3bbc4b8 --- /dev/null +++ b/vendor/symfony/cache/DependencyInjection/CachePoolPrunerPass.php @@ -0,0 +1,51 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\DependencyInjection; + +use Symfony\Component\Cache\PruneableInterface; +use Symfony\Component\DependencyInjection\Argument\IteratorArgument; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; +use Symfony\Component\DependencyInjection\Reference; + +/** + * @author Rob Frawley 2nd <rmf@src.run> + */ +class CachePoolPrunerPass implements CompilerPassInterface +{ + /** + * {@inheritdoc} + */ + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition('console.command.cache_pool_prune')) { + return; + } + + $services = []; + + foreach ($container->findTaggedServiceIds('cache.pool') as $id => $tags) { + $class = $container->getParameterBag()->resolveValue($container->getDefinition($id)->getClass()); + + if (!$reflection = $container->getReflectionClass($class)) { + throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); + } + + if ($reflection->implementsInterface(PruneableInterface::class)) { + $services[$id] = new Reference($id); + } + } + + $container->getDefinition('console.command.cache_pool_prune')->replaceArgument(0, new IteratorArgument($services)); + } +} diff --git a/vendor/symfony/cache/Exception/CacheException.php b/vendor/symfony/cache/Exception/CacheException.php new file mode 100644 index 0000000..d2e975b --- /dev/null +++ b/vendor/symfony/cache/Exception/CacheException.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Exception; + +use Psr\Cache\CacheException as Psr6CacheInterface; +use Psr\SimpleCache\CacheException as SimpleCacheInterface; + +if (interface_exists(SimpleCacheInterface::class)) { + class CacheException extends \Exception implements Psr6CacheInterface, SimpleCacheInterface + { + } +} else { + class CacheException extends \Exception implements Psr6CacheInterface + { + } +} diff --git a/vendor/symfony/cache/Exception/InvalidArgumentException.php b/vendor/symfony/cache/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..7f9584a --- /dev/null +++ b/vendor/symfony/cache/Exception/InvalidArgumentException.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Exception; + +use Psr\Cache\InvalidArgumentException as Psr6CacheInterface; +use Psr\SimpleCache\InvalidArgumentException as SimpleCacheInterface; + +if (interface_exists(SimpleCacheInterface::class)) { + class InvalidArgumentException extends \InvalidArgumentException implements Psr6CacheInterface, SimpleCacheInterface + { + } +} else { + class InvalidArgumentException extends \InvalidArgumentException implements Psr6CacheInterface + { + } +} diff --git a/vendor/symfony/cache/Exception/LogicException.php b/vendor/symfony/cache/Exception/LogicException.php new file mode 100644 index 0000000..9ffa7ed --- /dev/null +++ b/vendor/symfony/cache/Exception/LogicException.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Exception; + +use Psr\Cache\CacheException as Psr6CacheInterface; +use Psr\SimpleCache\CacheException as SimpleCacheInterface; + +if (interface_exists(SimpleCacheInterface::class)) { + class LogicException extends \LogicException implements Psr6CacheInterface, SimpleCacheInterface + { + } +} else { + class LogicException extends \LogicException implements Psr6CacheInterface + { + } +} diff --git a/vendor/symfony/cache/LICENSE b/vendor/symfony/cache/LICENSE new file mode 100644 index 0000000..7fa9539 --- /dev/null +++ b/vendor/symfony/cache/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2016-2022 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/vendor/symfony/cache/LockRegistry.php b/vendor/symfony/cache/LockRegistry.php new file mode 100644 index 0000000..d8b8296 --- /dev/null +++ b/vendor/symfony/cache/LockRegistry.php @@ -0,0 +1,164 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache; + +use Psr\Log\LoggerInterface; +use Symfony\Contracts\Cache\CacheInterface; +use Symfony\Contracts\Cache\ItemInterface; + +/** + * LockRegistry is used internally by existing adapters to protect against cache stampede. + * + * It does so by wrapping the computation of items in a pool of locks. + * Foreach each apps, there can be at most 20 concurrent processes that + * compute items at the same time and only one per cache-key. + * + * @author Nicolas Grekas <p@tchwork.com> + */ +final class LockRegistry +{ + private static $openedFiles = []; + private static $lockedFiles; + private static $signalingException; + private static $signalingCallback; + + /** + * The number of items in this list controls the max number of concurrent processes. + */ + private static $files = [ + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'AbstractAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'AbstractTagAwareAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'AdapterInterface.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ApcuAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ArrayAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ChainAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'CouchbaseBucketAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'CouchbaseCollectionAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'DoctrineDbalAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'FilesystemAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'FilesystemTagAwareAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'MemcachedAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'NullAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ParameterNormalizer.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'PdoAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'PhpArrayAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'PhpFilesAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'ProxyAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'Psr16Adapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'RedisAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'RedisTagAwareAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'TagAwareAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'TagAwareAdapterInterface.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'TraceableAdapter.php', + __DIR__.\DIRECTORY_SEPARATOR.'Adapter'.\DIRECTORY_SEPARATOR.'TraceableTagAwareAdapter.php', + ]; + + /** + * Defines a set of existing files that will be used as keys to acquire locks. + * + * @return array The previously defined set of files + */ + public static function setFiles(array $files): array + { + $previousFiles = self::$files; + self::$files = $files; + + foreach (self::$openedFiles as $file) { + if ($file) { + flock($file, \LOCK_UN); + fclose($file); + } + } + self::$openedFiles = self::$lockedFiles = []; + + return $previousFiles; + } + + public static function compute(callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, \Closure $setMetadata = null, LoggerInterface $logger = null) + { + if ('\\' === \DIRECTORY_SEPARATOR && null === self::$lockedFiles) { + // disable locking on Windows by default + self::$files = self::$lockedFiles = []; + } + + $key = self::$files ? abs(crc32($item->getKey())) % \count(self::$files) : -1; + + if ($key < 0 || self::$lockedFiles || !$lock = self::open($key)) { + return $callback($item, $save); + } + + self::$signalingException ??= unserialize("O:9:\"Exception\":1:{s:16:\"\0Exception\0trace\";a:0:{}}"); + self::$signalingCallback ??= function () { throw self::$signalingException; }; + + while (true) { + try { + $locked = false; + // race to get the lock in non-blocking mode + $locked = flock($lock, \LOCK_EX | \LOCK_NB, $wouldBlock); + + if ($locked || !$wouldBlock) { + $logger && $logger->info(sprintf('Lock %s, now computing item "{key}"', $locked ? 'acquired' : 'not supported'), ['key' => $item->getKey()]); + self::$lockedFiles[$key] = true; + + $value = $callback($item, $save); + + if ($save) { + if ($setMetadata) { + $setMetadata($item); + } + + $pool->save($item->set($value)); + $save = false; + } + + return $value; + } + // if we failed the race, retry locking in blocking mode to wait for the winner + $logger && $logger->info('Item "{key}" is locked, waiting for it to be released', ['key' => $item->getKey()]); + flock($lock, \LOCK_SH); + } finally { + flock($lock, \LOCK_UN); + unset(self::$lockedFiles[$key]); + } + + try { + $value = $pool->get($item->getKey(), self::$signalingCallback, 0); + $logger && $logger->info('Item "{key}" retrieved after lock was released', ['key' => $item->getKey()]); + $save = false; + + return $value; + } catch (\Exception $e) { + if (self::$signalingException !== $e) { + throw $e; + } + $logger && $logger->info('Item "{key}" not found while lock was released, now retrying', ['key' => $item->getKey()]); + } + } + + return null; + } + + private static function open(int $key) + { + if (null !== $h = self::$openedFiles[$key] ?? null) { + return $h; + } + set_error_handler(function () {}); + try { + $h = fopen(self::$files[$key], 'r+'); + } finally { + restore_error_handler(); + } + + return self::$openedFiles[$key] = $h ?: @fopen(self::$files[$key], 'r'); + } +} diff --git a/vendor/symfony/cache/Marshaller/DefaultMarshaller.php b/vendor/symfony/cache/Marshaller/DefaultMarshaller.php new file mode 100644 index 0000000..7459a9d --- /dev/null +++ b/vendor/symfony/cache/Marshaller/DefaultMarshaller.php @@ -0,0 +1,104 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Marshaller; + +use Symfony\Component\Cache\Exception\CacheException; + +/** + * Serializes/unserializes values using igbinary_serialize() if available, serialize() otherwise. + * + * @author Nicolas Grekas <p@tchwork.com> + */ +class DefaultMarshaller implements MarshallerInterface +{ + private bool $useIgbinarySerialize = true; + private bool $throwOnSerializationFailure = false; + + public function __construct(bool $useIgbinarySerialize = null, bool $throwOnSerializationFailure = false) + { + if (null === $useIgbinarySerialize) { + $useIgbinarySerialize = \extension_loaded('igbinary') && version_compare('3.1.6', phpversion('igbinary'), '<='); + } elseif ($useIgbinarySerialize && (!\extension_loaded('igbinary') || version_compare('3.1.6', phpversion('igbinary'), '>'))) { + throw new CacheException(\extension_loaded('igbinary') ? 'Please upgrade the "igbinary" PHP extension to v3.1.6 or higher.' : 'The "igbinary" PHP extension is not loaded.'); + } + $this->useIgbinarySerialize = $useIgbinarySerialize; + $this->throwOnSerializationFailure = $throwOnSerializationFailure; + } + + /** + * {@inheritdoc} + */ + public function marshall(array $values, ?array &$failed): array + { + $serialized = $failed = []; + + foreach ($values as $id => $value) { + try { + if ($this->useIgbinarySerialize) { + $serialized[$id] = igbinary_serialize($value); + } else { + $serialized[$id] = serialize($value); + } + } catch (\Exception $e) { + if ($this->throwOnSerializationFailure) { + throw new \ValueError($e->getMessage(), 0, $e); + } + $failed[] = $id; + } + } + + return $serialized; + } + + /** + * {@inheritdoc} + */ + public function unmarshall(string $value): mixed + { + if ('b:0;' === $value) { + return false; + } + if ('N;' === $value) { + return null; + } + static $igbinaryNull; + if ($value === ($igbinaryNull ?? $igbinaryNull = \extension_loaded('igbinary') ? igbinary_serialize(null) : false)) { + return null; + } + $unserializeCallbackHandler = ini_set('unserialize_callback_func', __CLASS__.'::handleUnserializeCallback'); + try { + if (':' === ($value[1] ?? ':')) { + if (false !== $value = unserialize($value)) { + return $value; + } + } elseif (false === $igbinaryNull) { + throw new \RuntimeException('Failed to unserialize values, did you forget to install the "igbinary" extension?'); + } elseif (null !== $value = igbinary_unserialize($value)) { + return $value; + } + + throw new \DomainException(error_get_last() ? error_get_last()['message'] : 'Failed to unserialize values.'); + } catch (\Error $e) { + throw new \ErrorException($e->getMessage(), $e->getCode(), \E_ERROR, $e->getFile(), $e->getLine()); + } finally { + ini_set('unserialize_callback_func', $unserializeCallbackHandler); + } + } + + /** + * @internal + */ + public static function handleUnserializeCallback(string $class) + { + throw new \DomainException('Class not found: '.$class); + } +} diff --git a/vendor/symfony/cache/Marshaller/DeflateMarshaller.php b/vendor/symfony/cache/Marshaller/DeflateMarshaller.php new file mode 100644 index 0000000..ef861fa --- /dev/null +++ b/vendor/symfony/cache/Marshaller/DeflateMarshaller.php @@ -0,0 +1,53 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Marshaller; + +use Symfony\Component\Cache\Exception\CacheException; + +/** + * Compresses values using gzdeflate(). + * + * @author Nicolas Grekas <p@tchwork.com> + */ +class DeflateMarshaller implements MarshallerInterface +{ + private $marshaller; + + public function __construct(MarshallerInterface $marshaller) + { + if (!\function_exists('gzdeflate')) { + throw new CacheException('The "zlib" PHP extension is not loaded.'); + } + + $this->marshaller = $marshaller; + } + + /** + * {@inheritdoc} + */ + public function marshall(array $values, ?array &$failed): array + { + return array_map('gzdeflate', $this->marshaller->marshall($values, $failed)); + } + + /** + * {@inheritdoc} + */ + public function unmarshall(string $value): mixed + { + if (false !== $inflatedValue = @gzinflate($value)) { + $value = $inflatedValue; + } + + return $this->marshaller->unmarshall($value); + } +} diff --git a/vendor/symfony/cache/Marshaller/MarshallerInterface.php b/vendor/symfony/cache/Marshaller/MarshallerInterface.php new file mode 100644 index 0000000..5b81aad --- /dev/null +++ b/vendor/symfony/cache/Marshaller/MarshallerInterface.php @@ -0,0 +1,38 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Marshaller; + +/** + * Serializes/unserializes PHP values. + * + * Implementations of this interface MUST deal with errors carefully. They MUST + * also deal with forward and backward compatibility at the storage format level. + * + * @author Nicolas Grekas <p@tchwork.com> + */ +interface MarshallerInterface +{ + /** + * Serializes a list of values. + * + * When serialization fails for a specific value, no exception should be + * thrown. Instead, its key should be listed in $failed. + */ + public function marshall(array $values, ?array &$failed): array; + + /** + * Unserializes a single value and throws an exception if anything goes wrong. + * + * @throws \Exception Whenever unserialization fails + */ + public function unmarshall(string $value): mixed; +} diff --git a/vendor/symfony/cache/Marshaller/SodiumMarshaller.php b/vendor/symfony/cache/Marshaller/SodiumMarshaller.php new file mode 100644 index 0000000..a8119dc --- /dev/null +++ b/vendor/symfony/cache/Marshaller/SodiumMarshaller.php @@ -0,0 +1,80 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Marshaller; + +use Symfony\Component\Cache\Exception\CacheException; +use Symfony\Component\Cache\Exception\InvalidArgumentException; + +/** + * Encrypt/decrypt values using Libsodium. + * + * @author Ahmed TAILOULOUTE <ahmed.tailouloute@gmail.com> + */ +class SodiumMarshaller implements MarshallerInterface +{ + private $marshaller; + private array $decryptionKeys; + + /** + * @param string[] $decryptionKeys The key at index "0" is required and is used to decrypt and encrypt values; + * more rotating keys can be provided to decrypt values; + * each key must be generated using sodium_crypto_box_keypair() + */ + public function __construct(array $decryptionKeys, MarshallerInterface $marshaller = null) + { + if (!self::isSupported()) { + throw new CacheException('The "sodium" PHP extension is not loaded.'); + } + + if (!isset($decryptionKeys[0])) { + throw new InvalidArgumentException('At least one decryption key must be provided at index "0".'); + } + + $this->marshaller = $marshaller ?? new DefaultMarshaller(); + $this->decryptionKeys = $decryptionKeys; + } + + public static function isSupported(): bool + { + return \function_exists('sodium_crypto_box_seal'); + } + + /** + * {@inheritdoc} + */ + public function marshall(array $values, ?array &$failed): array + { + $encryptionKey = sodium_crypto_box_publickey($this->decryptionKeys[0]); + + $encryptedValues = []; + foreach ($this->marshaller->marshall($values, $failed) as $k => $v) { + $encryptedValues[$k] = sodium_crypto_box_seal($v, $encryptionKey); + } + + return $encryptedValues; + } + + /** + * {@inheritdoc} + */ + public function unmarshall(string $value): mixed + { + foreach ($this->decryptionKeys as $k) { + if (false !== $decryptedValue = @sodium_crypto_box_seal_open($value, $k)) { + $value = $decryptedValue; + break; + } + } + + return $this->marshaller->unmarshall($value); + } +} diff --git a/vendor/symfony/cache/Marshaller/TagAwareMarshaller.php b/vendor/symfony/cache/Marshaller/TagAwareMarshaller.php new file mode 100644 index 0000000..d32c994 --- /dev/null +++ b/vendor/symfony/cache/Marshaller/TagAwareMarshaller.php @@ -0,0 +1,89 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Marshaller; + +/** + * A marshaller optimized for data structures generated by AbstractTagAwareAdapter. + * + * @author Nicolas Grekas <p@tchwork.com> + */ +class TagAwareMarshaller implements MarshallerInterface +{ + private $marshaller; + + public function __construct(MarshallerInterface $marshaller = null) + { + $this->marshaller = $marshaller ?? new DefaultMarshaller(); + } + + /** + * {@inheritdoc} + */ + public function marshall(array $values, ?array &$failed): array + { + $failed = $notSerialized = $serialized = []; + + foreach ($values as $id => $value) { + if (\is_array($value) && \is_array($value['tags'] ?? null) && \array_key_exists('value', $value) && \count($value) === 2 + (\is_string($value['meta'] ?? null) && 8 === \strlen($value['meta']))) { + // if the value is an array with keys "tags", "value" and "meta", use a compact serialization format + // magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F allow detecting this format quickly in unmarshall() + + $v = $this->marshaller->marshall($value, $f); + + if ($f) { + $f = []; + $failed[] = $id; + } else { + if ([] === $value['tags']) { + $v['tags'] = ''; + } + + $serialized[$id] = "\x9D".($value['meta'] ?? "\0\0\0\0\0\0\0\0").pack('N', \strlen($v['tags'])).$v['tags'].$v['value']; + $serialized[$id][9] = "\x5F"; + } + } else { + // other arbitrary values are serialized using the decorated marshaller below + $notSerialized[$id] = $value; + } + } + + if ($notSerialized) { + $serialized += $this->marshaller->marshall($notSerialized, $f); + $failed = array_merge($failed, $f); + } + + return $serialized; + } + + /** + * {@inheritdoc} + */ + public function unmarshall(string $value): mixed + { + // detect the compact format used in marshall() using magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F + if (13 >= \strlen($value) || "\x9D" !== $value[0] || "\0" !== $value[5] || "\x5F" !== $value[9]) { + return $this->marshaller->unmarshall($value); + } + + // data consists of value, tags and metadata which we need to unpack + $meta = substr($value, 1, 12); + $meta[8] = "\0"; + $tagLen = unpack('Nlen', $meta, 8)['len']; + $meta = substr($meta, 0, 8); + + return [ + 'value' => $this->marshaller->unmarshall(substr($value, 13 + $tagLen)), + 'tags' => $tagLen ? $this->marshaller->unmarshall(substr($value, 13, $tagLen)) : [], + 'meta' => "\0\0\0\0\0\0\0\0" === $meta ? null : $meta, + ]; + } +} diff --git a/vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php b/vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php new file mode 100644 index 0000000..e4d9ea0 --- /dev/null +++ b/vendor/symfony/cache/Messenger/EarlyExpirationDispatcher.php @@ -0,0 +1,61 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Messenger; + +use Psr\Log\LoggerInterface; +use Symfony\Component\Cache\Adapter\AdapterInterface; +use Symfony\Component\Cache\CacheItem; +use Symfony\Component\DependencyInjection\ReverseContainer; +use Symfony\Component\Messenger\MessageBusInterface; +use Symfony\Component\Messenger\Stamp\HandledStamp; + +/** + * Sends the computation of cached values to a message bus. + */ +class EarlyExpirationDispatcher +{ + private $bus; + private $reverseContainer; + private ?\Closure $callbackWrapper; + + public function __construct(MessageBusInterface $bus, ReverseContainer $reverseContainer, callable $callbackWrapper = null) + { + $this->bus = $bus; + $this->reverseContainer = $reverseContainer; + $this->callbackWrapper = null === $callbackWrapper || $callbackWrapper instanceof \Closure ? $callbackWrapper : \Closure::fromCallable($callbackWrapper); + } + + public function __invoke(callable $callback, CacheItem $item, bool &$save, AdapterInterface $pool, \Closure $setMetadata, LoggerInterface $logger = null) + { + if (!$item->isHit() || null === $message = EarlyExpirationMessage::create($this->reverseContainer, $callback, $item, $pool)) { + // The item is stale or the callback cannot be reversed: we must compute the value now + $logger && $logger->info('Computing item "{key}" online: '.($item->isHit() ? 'callback cannot be reversed' : 'item is stale'), ['key' => $item->getKey()]); + + return null !== $this->callbackWrapper ? ($this->callbackWrapper)($callback, $item, $save, $pool, $setMetadata, $logger) : $callback($item, $save); + } + + $envelope = $this->bus->dispatch($message); + + if ($logger) { + if ($envelope->last(HandledStamp::class)) { + $logger->info('Item "{key}" was computed online', ['key' => $item->getKey()]); + } else { + $logger->info('Item "{key}" sent for recomputation', ['key' => $item->getKey()]); + } + } + + // The item's value is not stale, no need to write it to the backend + $save = false; + + return $message->getItem()->get() ?? $item->get(); + } +} diff --git a/vendor/symfony/cache/Messenger/EarlyExpirationHandler.php b/vendor/symfony/cache/Messenger/EarlyExpirationHandler.php new file mode 100644 index 0000000..88e725a --- /dev/null +++ b/vendor/symfony/cache/Messenger/EarlyExpirationHandler.php @@ -0,0 +1,80 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Messenger; + +use Symfony\Component\Cache\CacheItem; +use Symfony\Component\DependencyInjection\ReverseContainer; +use Symfony\Component\Messenger\Handler\MessageHandlerInterface; + +/** + * Computes cached values sent to a message bus. + */ +class EarlyExpirationHandler implements MessageHandlerInterface +{ + private $reverseContainer; + private array $processedNonces = []; + + public function __construct(ReverseContainer $reverseContainer) + { + $this->reverseContainer = $reverseContainer; + } + + public function __invoke(EarlyExpirationMessage $message) + { + $item = $message->getItem(); + $metadata = $item->getMetadata(); + $expiry = $metadata[CacheItem::METADATA_EXPIRY] ?? 0; + $ctime = $metadata[CacheItem::METADATA_CTIME] ?? 0; + + if ($expiry && $ctime) { + // skip duplicate or expired messages + + $processingNonce = [$expiry, $ctime]; + $pool = $message->getPool(); + $key = $item->getKey(); + + if (($this->processedNonces[$pool][$key] ?? null) === $processingNonce) { + return; + } + + if (microtime(true) >= $expiry) { + return; + } + + $this->processedNonces[$pool] = [$key => $processingNonce] + ($this->processedNonces[$pool] ?? []); + + if (\count($this->processedNonces[$pool]) > 100) { + array_pop($this->processedNonces[$pool]); + } + } + + static $setMetadata; + + $setMetadata ?? $setMetadata = \Closure::bind( + function (CacheItem $item, float $startTime) { + if ($item->expiry > $endTime = microtime(true)) { + $item->newMetadata[CacheItem::METADATA_EXPIRY] = $item->expiry; + $item->newMetadata[CacheItem::METADATA_CTIME] = (int) ceil(1000 * ($endTime - $startTime)); + } + }, + null, + CacheItem::class + ); + + $startTime = microtime(true); + $pool = $message->findPool($this->reverseContainer); + $callback = $message->findCallback($this->reverseContainer); + $value = $callback($item); + $setMetadata($item, $startTime); + $pool->save($item->set($value)); + } +} diff --git a/vendor/symfony/cache/Messenger/EarlyExpirationMessage.php b/vendor/symfony/cache/Messenger/EarlyExpirationMessage.php new file mode 100644 index 0000000..9633e08 --- /dev/null +++ b/vendor/symfony/cache/Messenger/EarlyExpirationMessage.php @@ -0,0 +1,100 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Messenger; + +use Symfony\Component\Cache\Adapter\AdapterInterface; +use Symfony\Component\Cache\CacheItem; +use Symfony\Component\DependencyInjection\ReverseContainer; + +/** + * Conveys a cached value that needs to be computed. + */ +final class EarlyExpirationMessage +{ + private $item; + private string $pool; + private string|array $callback; + + public static function create(ReverseContainer $reverseContainer, callable $callback, CacheItem $item, AdapterInterface $pool): ?self + { + try { + $item = clone $item; + $item->set(null); + } catch (\Exception $e) { + return null; + } + + $pool = $reverseContainer->getId($pool); + + if (\is_object($callback)) { + if (null === $id = $reverseContainer->getId($callback)) { + return null; + } + + $callback = '@'.$id; + } elseif (!\is_array($callback)) { + $callback = (string) $callback; + } elseif (!\is_object($callback[0])) { + $callback = [(string) $callback[0], (string) $callback[1]]; + } else { + if (null === $id = $reverseContainer->getId($callback[0])) { + return null; + } + + $callback = ['@'.$id, (string) $callback[1]]; + } + + return new self($item, $pool, $callback); + } + + public function getItem(): CacheItem + { + return $this->item; + } + + public function getPool(): string + { + return $this->pool; + } + + /** + * @return string|string[] + */ + public function getCallback(): string|array + { + return $this->callback; + } + + public function findPool(ReverseContainer $reverseContainer): AdapterInterface + { + return $reverseContainer->getService($this->pool); + } + + public function findCallback(ReverseContainer $reverseContainer): callable + { + if (\is_string($callback = $this->callback)) { + return '@' === $callback[0] ? $reverseContainer->getService(substr($callback, 1)) : $callback; + } + if ('@' === $callback[0][0]) { + $callback[0] = $reverseContainer->getService(substr($callback[0], 1)); + } + + return $callback; + } + + private function __construct(CacheItem $item, string $pool, string|array $callback) + { + $this->item = $item; + $this->pool = $pool; + $this->callback = $callback; + } +} diff --git a/vendor/symfony/cache/PruneableInterface.php b/vendor/symfony/cache/PruneableInterface.php new file mode 100644 index 0000000..3095c80 --- /dev/null +++ b/vendor/symfony/cache/PruneableInterface.php @@ -0,0 +1,20 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache; + +/** + * Interface extends psr-6 and psr-16 caches to allow for pruning (deletion) of all expired cache items. + */ +interface PruneableInterface +{ + public function prune(): bool; +} diff --git a/vendor/symfony/cache/Psr16Cache.php b/vendor/symfony/cache/Psr16Cache.php new file mode 100644 index 0000000..5c1618d --- /dev/null +++ b/vendor/symfony/cache/Psr16Cache.php @@ -0,0 +1,269 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache; + +use Psr\Cache\CacheException as Psr6CacheException; +use Psr\Cache\CacheItemPoolInterface; +use Psr\SimpleCache\CacheException as SimpleCacheException; +use Psr\SimpleCache\CacheInterface; +use Symfony\Component\Cache\Adapter\AdapterInterface; +use Symfony\Component\Cache\Exception\InvalidArgumentException; +use Symfony\Component\Cache\Traits\ProxyTrait; + +/** + * Turns a PSR-6 cache into a PSR-16 one. + * + * @author Nicolas Grekas <p@tchwork.com> + */ +class Psr16Cache implements CacheInterface, PruneableInterface, ResettableInterface +{ + use ProxyTrait; + + private const METADATA_EXPIRY_OFFSET = 1527506807; + + private ?\Closure $createCacheItem = null; + private $cacheItemPrototype = null; + + public function __construct(CacheItemPoolInterface $pool) + { + $this->pool = $pool; + + if (!$pool instanceof AdapterInterface) { + return; + } + $cacheItemPrototype = &$this->cacheItemPrototype; + $createCacheItem = \Closure::bind( + static function ($key, $value, $allowInt = false) use (&$cacheItemPrototype) { + $item = clone $cacheItemPrototype; + $item->poolHash = $item->innerItem = null; + if ($allowInt && \is_int($key)) { + $item->key = (string) $key; + } else { + \assert('' !== CacheItem::validateKey($key)); + $item->key = $key; + } + $item->value = $value; + $item->isHit = false; + + return $item; + }, + null, + CacheItem::class + ); + $this->createCacheItem = function ($key, $value, $allowInt = false) use ($createCacheItem) { + if (null === $this->cacheItemPrototype) { + $this->get($allowInt && \is_int($key) ? (string) $key : $key); + } + $this->createCacheItem = $createCacheItem; + + return $createCacheItem($key, null, $allowInt)->set($value); + }; + } + + /** + * {@inheritdoc} + */ + public function get($key, $default = null): mixed + { + try { + $item = $this->pool->getItem($key); + } catch (SimpleCacheException $e) { + throw $e; + } catch (Psr6CacheException $e) { + throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); + } + if (null === $this->cacheItemPrototype) { + $this->cacheItemPrototype = clone $item; + $this->cacheItemPrototype->set(null); + } + + return $item->isHit() ? $item->get() : $default; + } + + /** + * {@inheritdoc} + */ + public function set($key, $value, $ttl = null): bool + { + try { + if (null !== $f = $this->createCacheItem) { + $item = $f($key, $value); + } else { + $item = $this->pool->getItem($key)->set($value); + } + } catch (SimpleCacheException $e) { + throw $e; + } catch (Psr6CacheException $e) { + throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); + } + if (null !== $ttl) { + $item->expiresAfter($ttl); + } + + return $this->pool->save($item); + } + + /** + * {@inheritdoc} + */ + public function delete($key): bool + { + try { + return $this->pool->deleteItem($key); + } catch (SimpleCacheException $e) { + throw $e; + } catch (Psr6CacheException $e) { + throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * {@inheritdoc} + */ + public function clear(): bool + { + return $this->pool->clear(); + } + + /** + * {@inheritdoc} + */ + public function getMultiple($keys, $default = null): iterable + { + if ($keys instanceof \Traversable) { + $keys = iterator_to_array($keys, false); + } elseif (!\is_array($keys)) { + throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, "%s" given.', get_debug_type($keys))); + } + + try { + $items = $this->pool->getItems($keys); + } catch (SimpleCacheException $e) { + throw $e; + } catch (Psr6CacheException $e) { + throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); + } + $values = []; + + if (!$this->pool instanceof AdapterInterface) { + foreach ($items as $key => $item) { + $values[$key] = $item->isHit() ? $item->get() : $default; + } + + return $values; + } + + foreach ($items as $key => $item) { + if (!$item->isHit()) { + $values[$key] = $default; + continue; + } + $values[$key] = $item->get(); + + if (!$metadata = $item->getMetadata()) { + continue; + } + unset($metadata[CacheItem::METADATA_TAGS]); + + if ($metadata) { + $values[$key] = ["\x9D".pack('VN', (int) (0.1 + $metadata[CacheItem::METADATA_EXPIRY] - self::METADATA_EXPIRY_OFFSET), $metadata[CacheItem::METADATA_CTIME])."\x5F" => $values[$key]]; + } + } + + return $values; + } + + /** + * {@inheritdoc} + */ + public function setMultiple($values, $ttl = null): bool + { + $valuesIsArray = \is_array($values); + if (!$valuesIsArray && !$values instanceof \Traversable) { + throw new InvalidArgumentException(sprintf('Cache values must be array or Traversable, "%s" given.', get_debug_type($values))); + } + $items = []; + + try { + if (null !== $f = $this->createCacheItem) { + $valuesIsArray = false; + foreach ($values as $key => $value) { + $items[$key] = $f($key, $value, true); + } + } elseif ($valuesIsArray) { + $items = []; + foreach ($values as $key => $value) { + $items[] = (string) $key; + } + $items = $this->pool->getItems($items); + } else { + foreach ($values as $key => $value) { + if (\is_int($key)) { + $key = (string) $key; + } + $items[$key] = $this->pool->getItem($key)->set($value); + } + } + } catch (SimpleCacheException $e) { + throw $e; + } catch (Psr6CacheException $e) { + throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); + } + $ok = true; + + foreach ($items as $key => $item) { + if ($valuesIsArray) { + $item->set($values[$key]); + } + if (null !== $ttl) { + $item->expiresAfter($ttl); + } + $ok = $this->pool->saveDeferred($item) && $ok; + } + + return $this->pool->commit() && $ok; + } + + /** + * {@inheritdoc} + */ + public function deleteMultiple($keys): bool + { + if ($keys instanceof \Traversable) { + $keys = iterator_to_array($keys, false); + } elseif (!\is_array($keys)) { + throw new InvalidArgumentException(sprintf('Cache keys must be array or Traversable, "%s" given.', get_debug_type($keys))); + } + + try { + return $this->pool->deleteItems($keys); + } catch (SimpleCacheException $e) { + throw $e; + } catch (Psr6CacheException $e) { + throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * {@inheritdoc} + */ + public function has($key): bool + { + try { + return $this->pool->hasItem($key); + } catch (SimpleCacheException $e) { + throw $e; + } catch (Psr6CacheException $e) { + throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); + } + } +} diff --git a/vendor/symfony/cache/README.md b/vendor/symfony/cache/README.md new file mode 100644 index 0000000..c466d57 --- /dev/null +++ b/vendor/symfony/cache/README.md @@ -0,0 +1,19 @@ +Symfony PSR-6 implementation for caching +======================================== + +The Cache component provides extended +[PSR-6](https://www.php-fig.org/psr/psr-6/) implementations for adding cache to +your applications. It is designed to have a low overhead so that caching is +fastest. It ships with adapters for the most widespread caching backends. +It also provides a [PSR-16](https://www.php-fig.org/psr/psr-16/) adapter, +and implementations for [symfony/cache-contracts](https://github.com/symfony/cache-contracts)' +`CacheInterface` and `TagAwareCacheInterface`. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/cache.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/cache/ResettableInterface.php b/vendor/symfony/cache/ResettableInterface.php new file mode 100644 index 0000000..7b0a853 --- /dev/null +++ b/vendor/symfony/cache/ResettableInterface.php @@ -0,0 +1,21 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache; + +use Symfony\Contracts\Service\ResetInterface; + +/** + * Resets a pool's local state. + */ +interface ResettableInterface extends ResetInterface +{ +} diff --git a/vendor/symfony/cache/Traits/AbstractAdapterTrait.php b/vendor/symfony/cache/Traits/AbstractAdapterTrait.php new file mode 100644 index 0000000..749217c --- /dev/null +++ b/vendor/symfony/cache/Traits/AbstractAdapterTrait.php @@ -0,0 +1,403 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Traits; + +use Psr\Cache\CacheItemInterface; +use Psr\Log\LoggerAwareTrait; +use Symfony\Component\Cache\CacheItem; +use Symfony\Component\Cache\Exception\InvalidArgumentException; + +/** + * @author Nicolas Grekas <p@tchwork.com> + * + * @internal + */ +trait AbstractAdapterTrait +{ + use LoggerAwareTrait; + + /** + * needs to be set by class, signature is function(string <key>, mixed <value>, bool <isHit>). + */ + private static \Closure $createCacheItem; + + /** + * needs to be set by class, signature is function(array <deferred>, string <namespace>, array <&expiredIds>). + */ + private static \Closure $mergeByLifetime; + + private string $namespace = ''; + private int $defaultLifetime; + private string $namespaceVersion = ''; + private bool $versioningIsEnabled = false; + private array $deferred = []; + private array $ids = []; + + /** + * @var int|null The maximum length to enforce for identifiers or null when no limit applies + */ + protected $maxIdLength; + + /** + * Fetches several cache items. + * + * @param array $ids The cache identifiers to fetch + * + * @return array|\Traversable + */ + abstract protected function doFetch(array $ids): iterable; + + /** + * Confirms if the cache contains specified cache item. + * + * @param string $id The identifier for which to check existence + */ + abstract protected function doHave(string $id): bool; + + /** + * Deletes all items in the pool. + * + * @param string $namespace The prefix used for all identifiers managed by this pool + */ + abstract protected function doClear(string $namespace): bool; + + /** + * Removes multiple items from the pool. + * + * @param array $ids An array of identifiers that should be removed from the pool + */ + abstract protected function doDelete(array $ids): bool; + + /** + * Persists several cache items immediately. + * + * @param array $values The values to cache, indexed by their cache identifier + * @param int $lifetime The lifetime of the cached values, 0 for persisting until manual cleaning + * + * @return array|bool The identifiers that failed to be cached or a boolean stating if caching succeeded or not + */ + abstract protected function doSave(array $values, int $lifetime): array|bool; + + /** + * {@inheritdoc} + */ + public function hasItem(mixed $key): bool + { + $id = $this->getId($key); + + if (isset($this->deferred[$key])) { + $this->commit(); + } + + try { + return $this->doHave($id); + } catch (\Exception $e) { + CacheItem::log($this->logger, 'Failed to check if key "{key}" is cached: '.$e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); + + return false; + } + } + + /** + * {@inheritdoc} + */ + public function clear(string $prefix = ''): bool + { + $this->deferred = []; + if ($cleared = $this->versioningIsEnabled) { + if ('' === $namespaceVersionToClear = $this->namespaceVersion) { + foreach ($this->doFetch([static::NS_SEPARATOR.$this->namespace]) as $v) { + $namespaceVersionToClear = $v; + } + } + $namespaceToClear = $this->namespace.$namespaceVersionToClear; + $namespaceVersion = self::formatNamespaceVersion(mt_rand()); + try { + $e = $this->doSave([static::NS_SEPARATOR.$this->namespace => $namespaceVersion], 0); + } catch (\Exception $e) { + } + if (true !== $e && [] !== $e) { + $cleared = false; + $message = 'Failed to save the new namespace'.($e instanceof \Exception ? ': '.$e->getMessage() : '.'); + CacheItem::log($this->logger, $message, ['exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]); + } else { + $this->namespaceVersion = $namespaceVersion; + $this->ids = []; + } + } else { + $namespaceToClear = $this->namespace.$prefix; + } + + try { + return $this->doClear($namespaceToClear) || $cleared; + } catch (\Exception $e) { + CacheItem::log($this->logger, 'Failed to clear the cache: '.$e->getMessage(), ['exception' => $e, 'cache-adapter' => get_debug_type($this)]); + + return false; + } + } + + /** + * {@inheritdoc} + */ + public function deleteItem(mixed $key): bool + { + return $this->deleteItems([$key]); + } + + /** + * {@inheritdoc} + */ + public function deleteItems(array $keys): bool + { + $ids = []; + + foreach ($keys as $key) { + $ids[$key] = $this->getId($key); + unset($this->deferred[$key]); + } + + try { + if ($this->doDelete($ids)) { + return true; + } + } catch (\Exception $e) { + } + + $ok = true; + + // When bulk-delete failed, retry each item individually + foreach ($ids as $key => $id) { + try { + $e = null; + if ($this->doDelete([$id])) { + continue; + } + } catch (\Exception $e) { + } + $message = 'Failed to delete key "{key}"'.($e instanceof \Exception ? ': '.$e->getMessage() : '.'); + CacheItem::log($this->logger, $message, ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); + $ok = false; + } + + return $ok; + } + + /** + * {@inheritdoc} + */ + public function getItem(mixed $key): CacheItem + { + $id = $this->getId($key); + + if (isset($this->deferred[$key])) { + $this->commit(); + } + + $isHit = false; + $value = null; + + try { + foreach ($this->doFetch([$id]) as $value) { + $isHit = true; + } + + return (self::$createCacheItem)($key, $value, $isHit); + } catch (\Exception $e) { + CacheItem::log($this->logger, 'Failed to fetch key "{key}": '.$e->getMessage(), ['key' => $key, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); + } + + return (self::$createCacheItem)($key, null, false); + } + + /** + * {@inheritdoc} + */ + public function getItems(array $keys = []): iterable + { + $ids = []; + $commit = false; + + foreach ($keys as $key) { + $ids[] = $this->getId($key); + $commit = $commit || isset($this->deferred[$key]); + } + + if ($commit) { + $this->commit(); + } + + try { + $items = $this->doFetch($ids); + } catch (\Exception $e) { + CacheItem::log($this->logger, 'Failed to fetch items: '.$e->getMessage(), ['keys' => $keys, 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); + $items = []; + } + $ids = array_combine($ids, $keys); + + return $this->generateItems($items, $ids); + } + + /** + * {@inheritdoc} + */ + public function save(CacheItemInterface $item): bool + { + if (!$item instanceof CacheItem) { + return false; + } + $this->deferred[$item->getKey()] = $item; + + return $this->commit(); + } + + /** + * {@inheritdoc} + */ + public function saveDeferred(CacheItemInterface $item): bool + { + if (!$item instanceof CacheItem) { + return false; + } + $this->deferred[$item->getKey()] = $item; + + return true; + } + + /** + * Enables/disables versioning of items. + * + * When versioning is enabled, clearing the cache is atomic and doesn't require listing existing keys to proceed, + * but old keys may need garbage collection and extra round-trips to the back-end are required. + * + * Calling this method also clears the memoized namespace version and thus forces a resynchonization of it. + * + * @return bool the previous state of versioning + */ + public function enableVersioning(bool $enable = true): bool + { + $wasEnabled = $this->versioningIsEnabled; + $this->versioningIsEnabled = $enable; + $this->namespaceVersion = ''; + $this->ids = []; + + return $wasEnabled; + } + + /** + * {@inheritdoc} + */ + public function reset() + { + if ($this->deferred) { + $this->commit(); + } + $this->namespaceVersion = ''; + $this->ids = []; + } + + public function __sleep(): array + { + throw new \BadMethodCallException('Cannot serialize '.__CLASS__); + } + + public function __wakeup() + { + throw new \BadMethodCallException('Cannot unserialize '.__CLASS__); + } + + public function __destruct() + { + if ($this->deferred) { + $this->commit(); + } + } + + private function generateItems(iterable $items, array &$keys): \Generator + { + $f = self::$createCacheItem; + + try { + foreach ($items as $id => $value) { + if (!isset($keys[$id])) { + throw new InvalidArgumentException(sprintf('Could not match value id "%s" to keys "%s".', $id, implode('", "', $keys))); + } + $key = $keys[$id]; + unset($keys[$id]); + yield $key => $f($key, $value, true); + } + } catch (\Exception $e) { + CacheItem::log($this->logger, 'Failed to fetch items: '.$e->getMessage(), ['keys' => array_values($keys), 'exception' => $e, 'cache-adapter' => get_debug_type($this)]); + } + + foreach ($keys as $key) { + yield $key => $f($key, null, false); + } + } + + private function getId(mixed $key) + { + if ($this->versioningIsEnabled && '' === $this->namespaceVersion) { + $this->ids = []; + $this->namespaceVersion = '1'.static::NS_SEPARATOR; + try { + foreach ($this->doFetch([static::NS_SEPARATOR.$this->namespace]) as $v) { + $this->namespaceVersion = $v; + } + $e = true; + if ('1'.static::NS_SEPARATOR === $this->namespaceVersion) { + $this->namespaceVersion = self::formatNamespaceVersion(time()); + $e = $this->doSave([static::NS_SEPARATOR.$this->namespace => $this->namespaceVersion], 0); + } + } catch (\Exception $e) { + } + if (true !== $e && [] !== $e) { + $message = 'Failed to save the new namespace'.($e instanceof \Exception ? ': '.$e->getMessage() : '.'); + CacheItem::log($this->logger, $message, ['exception' => $e instanceof \Exception ? $e : null, 'cache-adapter' => get_debug_type($this)]); + } + } + + if (\is_string($key) && isset($this->ids[$key])) { + return $this->namespace.$this->namespaceVersion.$this->ids[$key]; + } + \assert('' !== CacheItem::validateKey($key)); + $this->ids[$key] = $key; + + if (\count($this->ids) > 1000) { + $this->ids = \array_slice($this->ids, 500, null, true); // stop memory leak if there are many keys + } + + if (null === $this->maxIdLength) { + return $this->namespace.$this->namespaceVersion.$key; + } + if (\strlen($id = $this->namespace.$this->namespaceVersion.$key) > $this->maxIdLength) { + // Use MD5 to favor speed over security, which is not an issue here + $this->ids[$key] = $id = substr_replace(base64_encode(hash('md5', $key, true)), static::NS_SEPARATOR, -(\strlen($this->namespaceVersion) + 2)); + $id = $this->namespace.$this->namespaceVersion.$id; + } + + return $id; + } + + /** + * @internal + */ + public static function handleUnserializeCallback(string $class) + { + throw new \DomainException('Class not found: '.$class); + } + + private static function formatNamespaceVersion(int $value): string + { + return strtr(substr_replace(base64_encode(pack('V', $value)), static::NS_SEPARATOR, 5), '/', '_'); + } +} diff --git a/vendor/symfony/cache/Traits/ContractsTrait.php b/vendor/symfony/cache/Traits/ContractsTrait.php new file mode 100644 index 0000000..30b0ed1 --- /dev/null +++ b/vendor/symfony/cache/Traits/ContractsTrait.php @@ -0,0 +1,118 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Traits; + +use Psr\Log\LoggerInterface; +use Symfony\Component\Cache\Adapter\AdapterInterface; +use Symfony\Component\Cache\CacheItem; +use Symfony\Component\Cache\Exception\InvalidArgumentException; +use Symfony\Component\Cache\LockRegistry; +use Symfony\Contracts\Cache\CacheInterface; +use Symfony\Contracts\Cache\CacheTrait; +use Symfony\Contracts\Cache\ItemInterface; + +/** + * @author Nicolas Grekas <p@tchwork.com> + * + * @internal + */ +trait ContractsTrait +{ + use CacheTrait { + doGet as private contractsGet; + } + + /** + * @var callable + */ + private $callbackWrapper; + private array $computing = []; + + /** + * Wraps the callback passed to ->get() in a callable. + * + * @return callable the previous callback wrapper + */ + public function setCallbackWrapper(?callable $callbackWrapper): callable + { + if (!isset($this->callbackWrapper)) { + $this->callbackWrapper = \Closure::fromCallable([LockRegistry::class, 'compute']); + + if (\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true)) { + $this->setCallbackWrapper(null); + } + } + + if (null !== $callbackWrapper && !$callbackWrapper instanceof \Closure) { + $callbackWrapper = \Closure::fromCallable($callbackWrapper); + } + + $previousWrapper = $this->callbackWrapper; + $this->callbackWrapper = $callbackWrapper ?? static function (callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, \Closure $setMetadata, ?LoggerInterface $logger) { + return $callback($item, $save); + }; + + return $previousWrapper; + } + + private function doGet(AdapterInterface $pool, string $key, callable $callback, ?float $beta, array &$metadata = null) + { + if (0 > $beta = $beta ?? 1.0) { + throw new InvalidArgumentException(sprintf('Argument "$beta" provided to "%s::get()" must be a positive number, %f given.', static::class, $beta)); + } + + static $setMetadata; + + $setMetadata ?? $setMetadata = \Closure::bind( + static function (CacheItem $item, float $startTime, ?array &$metadata) { + if ($item->expiry > $endTime = microtime(true)) { + $item->newMetadata[CacheItem::METADATA_EXPIRY] = $metadata[CacheItem::METADATA_EXPIRY] = $item->expiry; + $item->newMetadata[CacheItem::METADATA_CTIME] = $metadata[CacheItem::METADATA_CTIME] = (int) ceil(1000 * ($endTime - $startTime)); + } else { + unset($metadata[CacheItem::METADATA_EXPIRY], $metadata[CacheItem::METADATA_CTIME]); + } + }, + null, + CacheItem::class + ); + + $this->callbackWrapper ??= \Closure::fromCallable([LockRegistry::class, 'compute']); + + return $this->contractsGet($pool, $key, function (CacheItem $item, bool &$save) use ($pool, $callback, $setMetadata, &$metadata, $key) { + // don't wrap nor save recursive calls + if (isset($this->computing[$key])) { + $value = $callback($item, $save); + $save = false; + + return $value; + } + + $this->computing[$key] = $key; + $startTime = microtime(true); + + if (!isset($this->callbackWrapper)) { + $this->setCallbackWrapper($this->setCallbackWrapper(null)); + } + + try { + $value = ($this->callbackWrapper)($callback, $item, $save, $pool, function (CacheItem $item) use ($setMetadata, $startTime, &$metadata) { + $setMetadata($item, $startTime, $metadata); + }, $this->logger ?? null); + $setMetadata($item, $startTime, $metadata); + + return $value; + } finally { + unset($this->computing[$key]); + } + }, $beta, $metadata, $this->logger ?? null); + } +} diff --git a/vendor/symfony/cache/Traits/FilesystemCommonTrait.php b/vendor/symfony/cache/Traits/FilesystemCommonTrait.php new file mode 100644 index 0000000..8e30a55 --- /dev/null +++ b/vendor/symfony/cache/Traits/FilesystemCommonTrait.php @@ -0,0 +1,193 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Traits; + +use Symfony\Component\Cache\Exception\InvalidArgumentException; + +/** + * @author Nicolas Grekas <p@tchwork.com> + * + * @internal + */ +trait FilesystemCommonTrait +{ + private string $directory; + private string $tmp; + + private function init(string $namespace, ?string $directory) + { + if (!isset($directory[0])) { + $directory = sys_get_temp_dir().\DIRECTORY_SEPARATOR.'symfony-cache'; + } else { + $directory = realpath($directory) ?: $directory; + } + if (isset($namespace[0])) { + if (preg_match('#[^-+_.A-Za-z0-9]#', $namespace, $match)) { + throw new InvalidArgumentException(sprintf('Namespace contains "%s" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0])); + } + $directory .= \DIRECTORY_SEPARATOR.$namespace; + } else { + $directory .= \DIRECTORY_SEPARATOR.'@'; + } + if (!is_dir($directory)) { + @mkdir($directory, 0777, true); + } + $directory .= \DIRECTORY_SEPARATOR; + // On Windows the whole path is limited to 258 chars + if ('\\' === \DIRECTORY_SEPARATOR && \strlen($directory) > 234) { + throw new InvalidArgumentException(sprintf('Cache directory too long (%s).', $directory)); + } + + $this->directory = $directory; + } + + /** + * {@inheritdoc} + */ + protected function doClear(string $namespace): bool + { + $ok = true; + + foreach ($this->scanHashDir($this->directory) as $file) { + if ('' !== $namespace && !str_starts_with($this->getFileKey($file), $namespace)) { + continue; + } + + $ok = ($this->doUnlink($file) || !file_exists($file)) && $ok; + } + + return $ok; + } + + /** + * {@inheritdoc} + */ + protected function doDelete(array $ids): bool + { + $ok = true; + + foreach ($ids as $id) { + $file = $this->getFile($id); + $ok = (!is_file($file) || $this->doUnlink($file) || !file_exists($file)) && $ok; + } + + return $ok; + } + + protected function doUnlink(string $file) + { + return @unlink($file); + } + + private function write(string $file, string $data, int $expiresAt = null) + { + set_error_handler(__CLASS__.'::throwError'); + try { + if (!isset($this->tmp)) { + $this->tmp = $this->directory.bin2hex(random_bytes(6)); + } + try { + $h = fopen($this->tmp, 'x'); + } catch (\ErrorException $e) { + if (!str_contains($e->getMessage(), 'File exists')) { + throw $e; + } + + $this->tmp = $this->directory.bin2hex(random_bytes(6)); + $h = fopen($this->tmp, 'x'); + } + fwrite($h, $data); + fclose($h); + + if (null !== $expiresAt) { + touch($this->tmp, $expiresAt ?: time() + 31556952); // 1 year in seconds + } + + return rename($this->tmp, $file); + } finally { + restore_error_handler(); + } + } + + private function getFile(string $id, bool $mkdir = false, string $directory = null) + { + // Use MD5 to favor speed over security, which is not an issue here + $hash = str_replace('/', '-', base64_encode(hash('md5', static::class.$id, true))); + $dir = ($directory ?? $this->directory).strtoupper($hash[0].\DIRECTORY_SEPARATOR.$hash[1].\DIRECTORY_SEPARATOR); + + if ($mkdir && !is_dir($dir)) { + @mkdir($dir, 0777, true); + } + + return $dir.substr($hash, 2, 20); + } + + private function getFileKey(string $file): string + { + return ''; + } + + private function scanHashDir(string $directory): \Generator + { + if (!is_dir($directory)) { + return; + } + + $chars = '+-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + + for ($i = 0; $i < 38; ++$i) { + if (!is_dir($directory.$chars[$i])) { + continue; + } + + for ($j = 0; $j < 38; ++$j) { + if (!is_dir($dir = $directory.$chars[$i].\DIRECTORY_SEPARATOR.$chars[$j])) { + continue; + } + + foreach (@scandir($dir, \SCANDIR_SORT_NONE) ?: [] as $file) { + if ('.' !== $file && '..' !== $file) { + yield $dir.\DIRECTORY_SEPARATOR.$file; + } + } + } + } + } + + /** + * @internal + */ + public static function throwError(int $type, string $message, string $file, int $line) + { + throw new \ErrorException($message, 0, $type, $file, $line); + } + + public function __sleep(): array + { + throw new \BadMethodCallException('Cannot serialize '.__CLASS__); + } + + public function __wakeup() + { + throw new \BadMethodCallException('Cannot unserialize '.__CLASS__); + } + + public function __destruct() + { + if (method_exists(parent::class, '__destruct')) { + parent::__destruct(); + } + if (isset($this->tmp) && is_file($this->tmp)) { + unlink($this->tmp); + } + } +} diff --git a/vendor/symfony/cache/Traits/FilesystemTrait.php b/vendor/symfony/cache/Traits/FilesystemTrait.php new file mode 100644 index 0000000..b25c8d6 --- /dev/null +++ b/vendor/symfony/cache/Traits/FilesystemTrait.php @@ -0,0 +1,121 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Traits; + +use Symfony\Component\Cache\Exception\CacheException; + +/** + * @author Nicolas Grekas <p@tchwork.com> + * @author Rob Frawley 2nd <rmf@src.run> + * + * @internal + */ +trait FilesystemTrait +{ + use FilesystemCommonTrait; + + private $marshaller; + + public function prune(): bool + { + $time = time(); + $pruned = true; + + foreach ($this->scanHashDir($this->directory) as $file) { + if (!$h = @fopen($file, 'r')) { + continue; + } + + if (($expiresAt = (int) fgets($h)) && $time >= $expiresAt) { + fclose($h); + $pruned = @unlink($file) && !file_exists($file) && $pruned; + } else { + fclose($h); + } + } + + return $pruned; + } + + /** + * {@inheritdoc} + */ + protected function doFetch(array $ids): iterable + { + $values = []; + $now = time(); + + foreach ($ids as $id) { + $file = $this->getFile($id); + if (!is_file($file) || !$h = @fopen($file, 'r')) { + continue; + } + if (($expiresAt = (int) fgets($h)) && $now >= $expiresAt) { + fclose($h); + @unlink($file); + } else { + $i = rawurldecode(rtrim(fgets($h))); + $value = stream_get_contents($h); + fclose($h); + if ($i === $id) { + $values[$id] = $this->marshaller->unmarshall($value); + } + } + } + + return $values; + } + + /** + * {@inheritdoc} + */ + protected function doHave(string $id): bool + { + $file = $this->getFile($id); + + return is_file($file) && (@filemtime($file) > time() || $this->doFetch([$id])); + } + + /** + * {@inheritdoc} + */ + protected function doSave(array $values, int $lifetime): array|bool + { + $expiresAt = $lifetime ? (time() + $lifetime) : 0; + $values = $this->marshaller->marshall($values, $failed); + + foreach ($values as $id => $value) { + if (!$this->write($this->getFile($id, true), $expiresAt."\n".rawurlencode($id)."\n".$value, $expiresAt)) { + $failed[] = $id; + } + } + + if ($failed && !is_writable($this->directory)) { + throw new CacheException(sprintf('Cache directory is not writable (%s).', $this->directory)); + } + + return $failed; + } + + private function getFileKey(string $file): string + { + if (!$h = @fopen($file, 'r')) { + return ''; + } + + fgets($h); // expiry + $encodedKey = fgets($h); + fclose($h); + + return rawurldecode(rtrim($encodedKey)); + } +} diff --git a/vendor/symfony/cache/Traits/ProxyTrait.php b/vendor/symfony/cache/Traits/ProxyTrait.php new file mode 100644 index 0000000..ba6f8cb --- /dev/null +++ b/vendor/symfony/cache/Traits/ProxyTrait.php @@ -0,0 +1,43 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Traits; + +use Symfony\Component\Cache\PruneableInterface; +use Symfony\Contracts\Service\ResetInterface; + +/** + * @author Nicolas Grekas <p@tchwork.com> + * + * @internal + */ +trait ProxyTrait +{ + private object $pool; + + /** + * {@inheritdoc} + */ + public function prune(): bool + { + return $this->pool instanceof PruneableInterface && $this->pool->prune(); + } + + /** + * {@inheritdoc} + */ + public function reset() + { + if ($this->pool instanceof ResetInterface) { + $this->pool->reset(); + } + } +} diff --git a/vendor/symfony/cache/Traits/RedisClusterNodeProxy.php b/vendor/symfony/cache/Traits/RedisClusterNodeProxy.php new file mode 100644 index 0000000..8d738bb --- /dev/null +++ b/vendor/symfony/cache/Traits/RedisClusterNodeProxy.php @@ -0,0 +1,50 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Traits; + +/** + * This file acts as a wrapper to the \RedisCluster implementation so it can accept the same type of calls as + * individual \Redis objects. + * + * Calls are made to individual nodes via: RedisCluster->{method}($host, ...args)' + * according to https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#directed-node-commands + * + * @author Jack Thomas <jack.thomas@solidalpha.com> + * + * @internal + */ +class RedisClusterNodeProxy +{ + private array $host; + private $redis; + + public function __construct(array $host, \RedisCluster|RedisClusterProxy $redis) + { + $this->host = $host; + $this->redis = $redis; + } + + public function __call(string $method, array $args) + { + return $this->redis->{$method}($this->host, ...$args); + } + + public function scan(&$iIterator, $strPattern = null, $iCount = null) + { + return $this->redis->scan($iIterator, $this->host, $strPattern, $iCount); + } + + public function getOption($name) + { + return $this->redis->getOption($name); + } +} diff --git a/vendor/symfony/cache/Traits/RedisClusterProxy.php b/vendor/symfony/cache/Traits/RedisClusterProxy.php new file mode 100644 index 0000000..2a8fcc8 --- /dev/null +++ b/vendor/symfony/cache/Traits/RedisClusterProxy.php @@ -0,0 +1,63 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Traits; + +/** + * @author Alessandro Chitolina <alekitto@gmail.com> + * + * @internal + */ +class RedisClusterProxy +{ + private $redis; + private \Closure $initializer; + + public function __construct(\Closure $initializer) + { + $this->initializer = $initializer; + } + + public function __call(string $method, array $args) + { + $this->redis ??= ($this->initializer)(); + + return $this->redis->{$method}(...$args); + } + + public function hscan($strKey, &$iIterator, $strPattern = null, $iCount = null) + { + $this->redis ??= ($this->initializer)(); + + return $this->redis->hscan($strKey, $iIterator, $strPattern, $iCount); + } + + public function scan(&$iIterator, $strPattern = null, $iCount = null) + { + $this->redis ??= ($this->initializer)(); + + return $this->redis->scan($iIterator, $strPattern, $iCount); + } + + public function sscan($strKey, &$iIterator, $strPattern = null, $iCount = null) + { + $this->redis ??= ($this->initializer)(); + + return $this->redis->sscan($strKey, $iIterator, $strPattern, $iCount); + } + + public function zscan($strKey, &$iIterator, $strPattern = null, $iCount = null) + { + $this->redis ??= ($this->initializer)(); + + return $this->redis->zscan($strKey, $iIterator, $strPattern, $iCount); + } +} diff --git a/vendor/symfony/cache/Traits/RedisProxy.php b/vendor/symfony/cache/Traits/RedisProxy.php new file mode 100644 index 0000000..463e724 --- /dev/null +++ b/vendor/symfony/cache/Traits/RedisProxy.php @@ -0,0 +1,65 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Traits; + +/** + * @author Nicolas Grekas <p@tchwork.com> + * + * @internal + */ +class RedisProxy +{ + private $redis; + private \Closure $initializer; + private bool $ready = false; + + public function __construct(\Redis $redis, \Closure $initializer) + { + $this->redis = $redis; + $this->initializer = $initializer; + } + + public function __call(string $method, array $args) + { + $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis); + + return $this->redis->{$method}(...$args); + } + + public function hscan($strKey, &$iIterator, $strPattern = null, $iCount = null) + { + $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis); + + return $this->redis->hscan($strKey, $iIterator, $strPattern, $iCount); + } + + public function scan(&$iIterator, $strPattern = null, $iCount = null) + { + $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis); + + return $this->redis->scan($iIterator, $strPattern, $iCount); + } + + public function sscan($strKey, &$iIterator, $strPattern = null, $iCount = null) + { + $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis); + + return $this->redis->sscan($strKey, $iIterator, $strPattern, $iCount); + } + + public function zscan($strKey, &$iIterator, $strPattern = null, $iCount = null) + { + $this->ready ?: $this->ready = $this->initializer->__invoke($this->redis); + + return $this->redis->zscan($strKey, $iIterator, $strPattern, $iCount); + } +} diff --git a/vendor/symfony/cache/Traits/RedisTrait.php b/vendor/symfony/cache/Traits/RedisTrait.php new file mode 100644 index 0000000..16bc889 --- /dev/null +++ b/vendor/symfony/cache/Traits/RedisTrait.php @@ -0,0 +1,607 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Cache\Traits; + +use Predis\Command\Redis\UNLINK; +use Predis\Connection\Aggregate\ClusterInterface; +use Predis\Connection\Aggregate\RedisCluster; +use Predis\Connection\Aggregate\ReplicationInterface; +use Predis\Response\ErrorInterface; +use Predis\Response\Status; +use Symfony\Component\Cache\Exception\CacheException; +use Symfony\Component\Cache\Exception\InvalidArgumentException; +use Symfony\Component\Cache\Marshaller\DefaultMarshaller; +use Symfony\Component\Cache\Marshaller\MarshallerInterface; + +/** + * @author Aurimas Niekis <aurimas@niekis.lt> + * @author Nicolas Grekas <p@tchwork.com> + * + * @internal + */ +trait RedisTrait +{ + private static array $defaultConnectionOptions = [ + 'class' => null, + 'persistent' => 0, + 'persistent_id' => null, + 'timeout' => 30, + 'read_timeout' => 0, + 'retry_interval' => 0, + 'tcp_keepalive' => 0, + 'lazy' => null, + 'redis_cluster' => false, + 'redis_sentinel' => null, + 'dbindex' => 0, + 'failover' => 'none', + 'ssl' => null, // see https://php.net/context.ssl + ]; + private $redis; + private $marshaller; + + private function init(\Redis|\RedisArray|\RedisCluster|\Predis\ClientInterface|RedisProxy|RedisClusterProxy $redis, string $namespace, int $defaultLifetime, ?MarshallerInterface $marshaller) + { + parent::__construct($namespace, $defaultLifetime); + + if (preg_match('#[^-+_.A-Za-z0-9]#', $namespace, $match)) { + throw new InvalidArgumentException(sprintf('RedisAdapter namespace contains "%s" but only characters in [-+_.A-Za-z0-9] are allowed.', $match[0])); + } + + if ($redis instanceof \Predis\ClientInterface && $redis->getOptions()->exceptions) { + $options = clone $redis->getOptions(); + \Closure::bind(function () { $this->options['exceptions'] = false; }, $options, $options)(); + $redis = new $redis($redis->getConnection(), $options); + } + + $this->redis = $redis; + $this->marshaller = $marshaller ?? new DefaultMarshaller(); + } + + /** + * Creates a Redis connection using a DSN configuration. + * + * Example DSN: + * - redis://localhost + * - redis://example.com:1234 + * - redis://secret@example.com/13 + * - redis:///var/run/redis.sock + * - redis://secret@/var/run/redis.sock/13 + * + * @param array $options See self::$defaultConnectionOptions + * + * @throws InvalidArgumentException when the DSN is invalid + */ + public static function createConnection(string $dsn, array $options = []): \Redis|\RedisArray|\RedisCluster|RedisClusterProxy|RedisProxy|\Predis\ClientInterface + { + if (str_starts_with($dsn, 'redis:')) { + $scheme = 'redis'; + } elseif (str_starts_with($dsn, 'rediss:')) { + $scheme = 'rediss'; + } else { + throw new InvalidArgumentException(sprintf('Invalid Redis DSN: "%s" does not start with "redis:" or "rediss".', $dsn)); + } + + if (!\extension_loaded('redis') && !class_exists(\Predis\Client::class)) { + throw new CacheException(sprintf('Cannot find the "redis" extension nor the "predis/predis" package: "%s".', $dsn)); + } + + $params = preg_replace_callback('#^'.$scheme.':(//)?(?:(?:[^:@]*+:)?([^@]*+)@)?#', function ($m) use (&$auth) { + if (isset($m[2])) { + $auth = $m[2]; + + if ('' === $auth) { + $auth = null; + } + } + + return 'file:'.($m[1] ?? ''); + }, $dsn); + + if (false === $params = parse_url($params)) { + throw new InvalidArgumentException(sprintf('Invalid Redis DSN: "%s".', $dsn)); + } + + $query = $hosts = []; + + $tls = 'rediss' === $scheme; + $tcpScheme = $tls ? 'tls' : 'tcp'; + + if (isset($params['query'])) { + parse_str($params['query'], $query); + + if (isset($query['host'])) { + if (!\is_array($hosts = $query['host'])) { + throw new InvalidArgumentException(sprintf('Invalid Redis DSN: "%s".', $dsn)); + } + foreach ($hosts as $host => $parameters) { + if (\is_string($parameters)) { + parse_str($parameters, $parameters); + } + if (false === $i = strrpos($host, ':')) { + $hosts[$host] = ['scheme' => $tcpScheme, 'host' => $host, 'port' => 6379] + $parameters; + } elseif ($port = (int) substr($host, 1 + $i)) { + $hosts[$host] = ['scheme' => $tcpScheme, 'host' => substr($host, 0, $i), 'port' => $port] + $parameters; + } else { + $hosts[$host] = ['scheme' => 'unix', 'path' => substr($host, 0, $i)] + $parameters; + } + } + $hosts = array_values($hosts); + } + } + + if (isset($params['host']) || isset($params['path'])) { + if (!isset($params['dbindex']) && isset($params['path'])) { + if (preg_match('#/(\d+)$#', $params['path'], $m)) { + $params['dbindex'] = $m[1]; + $params['path'] = substr($params['path'], 0, -\strlen($m[0])); + } elseif (isset($params['host'])) { + throw new InvalidArgumentException(sprintf('Invalid Redis DSN: "%s", the "dbindex" parameter must be a number.', $dsn)); + } + } + + if (isset($params['host'])) { + array_unshift($hosts, ['scheme' => $tcpScheme, 'host' => $params['host'], 'port' => $params['port'] ?? 6379]); + } else { + array_unshift($hosts, ['scheme' => 'unix', 'path' => $params['path']]); + } + } + + if (!$hosts) { + throw new InvalidArgumentException(sprintf('Invalid Redis DSN: "%s".', $dsn)); + } + + $params += $query + $options + self::$defaultConnectionOptions; + + if (isset($params['redis_sentinel']) && !class_exists(\Predis\Client::class) && !class_exists(\RedisSentinel::class)) { + throw new CacheException(sprintf('Redis Sentinel support requires the "predis/predis" package or the "redis" extension v5.2 or higher: "%s".', $dsn)); + } + + if ($params['redis_cluster'] && isset($params['redis_sentinel'])) { + throw new InvalidArgumentException(sprintf('Cannot use both "redis_cluster" and "redis_sentinel" at the same time: "%s".', $dsn)); + } + + if (null === $params['class'] && \extension_loaded('redis')) { + $class = $params['redis_cluster'] ? \RedisCluster::class : (1 < \count($hosts) && !isset($params['redis_sentinel']) ? \RedisArray::class : \Redis::class); + } else { + $class = $params['class'] ?? \Predis\Client::class; + + if (isset($params['redis_sentinel']) && !is_a($class, \Predis\Client::class, true) && !class_exists(\RedisSentinel::class)) { + throw new CacheException(sprintf('Cannot use Redis Sentinel: class "%s" does not extend "Predis\Client" and ext-redis >= 5.2 not found: "%s".', $class, $dsn)); + } + } + + if (is_a($class, \Redis::class, true)) { + $connect = $params['persistent'] || $params['persistent_id'] ? 'pconnect' : 'connect'; + $redis = new $class(); + + $initializer = static function ($redis) use ($connect, $params, $dsn, $auth, $hosts, $tls) { + $hostIndex = 0; + do { + $host = $hosts[$hostIndex]['host'] ?? $hosts[$hostIndex]['path']; + $port = $hosts[$hostIndex]['port'] ?? 0; + $address = false; + + if (isset($hosts[$hostIndex]['host']) && $tls) { + $host = 'tls://'.$host; + } + + if (!isset($params['redis_sentinel'])) { + break; + } + $extra = []; + if (\defined('Redis::OPT_NULL_MULTIBULK_AS_NULL') && isset($params['auth'])) { + $extra = [$params['auth']]; + } + $sentinel = new \RedisSentinel($host, $port, $params['timeout'], (string) $params['persistent_id'], $params['retry_interval'], $params['read_timeout'], ...$extra); + + if ($address = $sentinel->getMasterAddrByName($params['redis_sentinel'])) { + [$host, $port] = $address; + } + } while (++$hostIndex < \count($hosts) && !$address); + + if (isset($params['redis_sentinel']) && !$address) { + throw new InvalidArgumentException(sprintf('Failed to retrieve master information from sentinel "%s" and dsn "%s".', $params['redis_sentinel'], $dsn)); + } + + try { + $extra = [ + 'stream' => $params['ssl'] ?? null, + ]; + if (isset($params['auth'])) { + $extra['auth'] = $params['auth']; + } + @$redis->{$connect}($host, $port, $params['timeout'], (string) $params['persistent_id'], $params['retry_interval'], $params['read_timeout'], ...\defined('Redis::SCAN_PREFIX') ? [$extra] : []); + + set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; }); + try { + $isConnected = $redis->isConnected(); + } finally { + restore_error_handler(); + } + if (!$isConnected) { + $error = preg_match('/^Redis::p?connect\(\): (.*)/', $error ?? '', $error) ? sprintf(' (%s)', $error[1]) : ''; + throw new InvalidArgumentException(sprintf('Redis connection "%s" failed: ', $dsn).$error.'.'); + } + + if ((null !== $auth && !$redis->auth($auth)) + || ($params['dbindex'] && !$redis->select($params['dbindex'])) + ) { + $e = preg_replace('/^ERR /', '', $redis->getLastError()); + throw new InvalidArgumentException(sprintf('Redis connection "%s" failed: ', $dsn).$e.'.'); + } + + if (0 < $params['tcp_keepalive'] && \defined('Redis::OPT_TCP_KEEPALIVE')) { + $redis->setOption(\Redis::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']); + } + } catch (\RedisException $e) { + throw new InvalidArgumentException(sprintf('Redis connection "%s" failed: ', $dsn).$e->getMessage()); + } + + return true; + }; + + if ($params['lazy']) { + $redis = new RedisProxy($redis, $initializer); + } else { + $initializer($redis); + } + } elseif (is_a($class, \RedisArray::class, true)) { + foreach ($hosts as $i => $host) { + switch ($host['scheme']) { + case 'tcp': $hosts[$i] = $host['host'].':'.$host['port']; break; + case 'tls': $hosts[$i] = 'tls://'.$host['host'].':'.$host['port']; break; + default: $hosts[$i] = $host['path']; + } + } + $params['lazy_connect'] = $params['lazy'] ?? true; + $params['connect_timeout'] = $params['timeout']; + + try { + $redis = new $class($hosts, $params); + } catch (\RedisClusterException $e) { + throw new InvalidArgumentException(sprintf('Redis connection "%s" failed: ', $dsn).$e->getMessage()); + } + + if (0 < $params['tcp_keepalive'] && \defined('Redis::OPT_TCP_KEEPALIVE')) { + $redis->setOption(\Redis::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']); + } + } elseif (is_a($class, \RedisCluster::class, true)) { + $initializer = static function () use ($class, $params, $dsn, $hosts) { + foreach ($hosts as $i => $host) { + switch ($host['scheme']) { + case 'tcp': $hosts[$i] = $host['host'].':'.$host['port']; break; + case 'tls': $hosts[$i] = 'tls://'.$host['host'].':'.$host['port']; break; + default: $hosts[$i] = $host['path']; + } + } + + try { + $redis = new $class(null, $hosts, $params['timeout'], $params['read_timeout'], (bool) $params['persistent'], $params['auth'] ?? '', ...\defined('Redis::SCAN_PREFIX') ? [$params['ssl'] ?? null] : []); + } catch (\RedisClusterException $e) { + throw new InvalidArgumentException(sprintf('Redis connection "%s" failed: ', $dsn).$e->getMessage()); + } + + if (0 < $params['tcp_keepalive'] && \defined('Redis::OPT_TCP_KEEPALIVE')) { + $redis->setOption(\Redis::OPT_TCP_KEEPALIVE, $params['tcp_keepalive']); + } + switch ($params['failover']) { + case 'error': $redis->setOption(\RedisCluster::OPT_SLAVE_FAILOVER, \RedisCluster::FAILOVER_ERROR); break; + case 'distribute': $redis->setOption(\RedisCluster::OPT_SLAVE_FAILOVER, \RedisCluster::FAILOVER_DISTRIBUTE); break; + case 'slaves': $redis->setOption(\RedisCluster::OPT_SLAVE_FAILOVER, \RedisCluster::FAILOVER_DISTRIBUTE_SLAVES); break; + } + + return $redis; + }; + + $redis = $params['lazy'] ? new RedisClusterProxy($initializer) : $initializer(); + } elseif (is_a($class, \Predis\ClientInterface::class, true)) { + if ($params['redis_cluster']) { + $params['cluster'] = 'redis'; + } elseif (isset($params['redis_sentinel'])) { + $params['replication'] = 'sentinel'; + $params['service'] = $params['redis_sentinel']; + } + $params += ['parameters' => []]; + $params['parameters'] += [ + 'persistent' => $params['persistent'], + 'timeout' => $params['timeout'], + 'read_write_timeout' => $params['read_timeout'], + 'tcp_nodelay' => true, + ]; + if ($params['dbindex']) { + $params['parameters']['database'] = $params['dbindex']; + } + if (null !== $auth) { + $params['parameters']['password'] = $auth; + } + if (1 === \count($hosts) && !($params['redis_cluster'] || $params['redis_sentinel'])) { + $hosts = $hosts[0]; + } elseif (\in_array($params['failover'], ['slaves', 'distribute'], true) && !isset($params['replication'])) { + $params['replication'] = true; + $hosts[0] += ['alias' => 'master']; + } + $params['exceptions'] = false; + + $redis = new $class($hosts, array_diff_key($params, array_diff_key(self::$defaultConnectionOptions, ['ssl' => null]))); + if (isset($params['redis_sentinel'])) { + $redis->getConnection()->setSentinelTimeout($params['timeout']); + } + } elseif (class_exists($class, false)) { + throw new InvalidArgumentException(sprintf('"%s" is not a subclass of "Redis", "RedisArray", "RedisCluster" nor "Predis\ClientInterface".', $class)); + } else { + throw new InvalidArgumentException(sprintf('Class "%s" does not exist.', $class)); + } + + return $redis; + } + + /** + * {@inheritdoc} + */ + protected function doFetch(array $ids): iterable + { + if (!$ids) { + return []; + } + + $result = []; + + if ($this->redis instanceof \Predis\ClientInterface && $this->redis->getConnection() instanceof ClusterInterface) { + $values = $this->pipeline(function () use ($ids) { + foreach ($ids as $id) { + yield 'get' => [$id]; + } + }); + } else { + $values = $this->redis->mget($ids); + + if (!\is_array($values) || \count($values) !== \count($ids)) { + return []; + } + + $values = array_combine($ids, $values); + } + + foreach ($values as $id => $v) { + if ($v) { + $result[$id] = $this->marshaller->unmarshall($v); + } + } + + return $result; + } + + /** + * {@inheritdoc} + */ + protected function doHave(string $id): bool + { + return (bool) $this->redis->exists($id); + } + + /** + * {@inheritdoc} + */ + protected function doClear(string $namespace): bool + { + if ($this->redis instanceof \Predis\ClientInterface) { + $prefix = $this->redis->getOptions()->prefix ? $this->redis->getOptions()->prefix->getPrefix() : ''; + $prefixLen = \strlen($prefix ?? ''); + } + + $cleared = true; + $hosts = $this->getHosts(); + $host = reset($hosts); + if ($host instanceof \Predis\Client && $host->getConnection() instanceof ReplicationInterface) { + // Predis supports info command only on the master in replication environments + $hosts = [$host->getClientFor('master')]; + } + + foreach ($hosts as $host) { + if (!isset($namespace[0])) { + $cleared = $host->flushDb() && $cleared; + continue; + } + + $info = $host->info('Server'); + $info = !$info instanceof ErrorInterface ? $info['Server'] ?? $info : ['redis_version' => '2.0']; + + if (!$host instanceof \Predis\ClientInterface) { + $prefix = \defined('Redis::SCAN_PREFIX') && (\Redis::SCAN_PREFIX & $host->getOption(\Redis::OPT_SCAN)) ? '' : $host->getOption(\Redis::OPT_PREFIX); + $prefixLen = \strlen($host->getOption(\Redis::OPT_PREFIX) ?? ''); + } + $pattern = $prefix.$namespace.'*'; + + if (!version_compare($info['redis_version'], '2.8', '>=')) { + // As documented in Redis documentation (http://redis.io/commands/keys) using KEYS + // can hang your server when it is executed against large databases (millions of items). + // Whenever you hit this scale, you should really consider upgrading to Redis 2.8 or above. + $unlink = version_compare($info['redis_version'], '4.0', '>=') ? 'UNLINK' : 'DEL'; + $args = $this->redis instanceof \Predis\ClientInterface ? [0, $pattern] : [[$pattern], 0]; + $cleared = $host->eval("local keys=redis.call('KEYS',ARGV[1]) for i=1,#keys,5000 do redis.call('$unlink',unpack(keys,i,math.min(i+4999,#keys))) end return 1", $args[0], $args[1]) && $cleared; + continue; + } + + $cursor = null; + do { + $keys = $host instanceof \Predis\ClientInterface ? $host->scan($cursor, 'MATCH', $pattern, 'COUNT', 1000) : $host->scan($cursor, $pattern, 1000); + if (isset($keys[1]) && \is_array($keys[1])) { + $cursor = $keys[0]; + $keys = $keys[1]; + } + if ($keys) { + if ($prefixLen) { + foreach ($keys as $i => $key) { + $keys[$i] = substr($key, $prefixLen); + } + } + $this->doDelete($keys); + } + } while ($cursor = (int) $cursor); + } + + return $cleared; + } + + /** + * {@inheritdoc} + */ + protected function doDelete(array $ids): bool + { + if (!$ids) { + return true; + } + + if ($this->redis instanceof \Predis\ClientInterface && $this->redis->getConnection() instanceof ClusterInterface) { + static $del; + $del = $del ?? (class_exists(UNLINK::class) ? 'unlink' : 'del'); + + $this->pipeline(function () use ($ids, $del) { + foreach ($ids as $id) { + yield $del => [$id]; + } + })->rewind(); + } else { + static $unlink = true; + + if ($unlink) { + try { + $unlink = false !== $this->redis->unlink($ids); + } catch (\Throwable $e) { + $unlink = false; + } + } + + if (!$unlink) { + $this->redis->del($ids); + } + } + + return true; + } + + /** + * {@inheritdoc} + */ + protected function doSave(array $values, int $lifetime): array|bool + { + if (!$values = $this->marshaller->marshall($values, $failed)) { + return $failed; + } + + $results = $this->pipeline(function () use ($values, $lifetime) { + foreach ($values as $id => $value) { + if (0 >= $lifetime) { + yield 'set' => [$id, $value]; + } else { + yield 'setEx' => [$id, $lifetime, $value]; + } + } + }); + + foreach ($results as $id => $result) { + if (true !== $result && (!$result instanceof Status || Status::get('OK') !== $result)) { + $failed[] = $id; + } + } + + return $failed; + } + + private function pipeline(\Closure $generator, object $redis = null): \Generator + { + $ids = []; + $redis = $redis ?? $this->redis; + + if ($redis instanceof RedisClusterProxy || $redis instanceof \RedisCluster || ($redis instanceof \Predis\ClientInterface && $redis->getConnection() instanceof RedisCluster)) { + // phpredis & predis don't support pipelining with RedisCluster + // see https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#pipelining + // see https://github.com/nrk/predis/issues/267#issuecomment-123781423 + $results = []; + foreach ($generator() as $command => $args) { + $results[] = $redis->{$command}(...$args); + $ids[] = 'eval' === $command ? ($redis instanceof \Predis\ClientInterface ? $args[2] : $args[1][0]) : $args[0]; + } + } elseif ($redis instanceof \Predis\ClientInterface) { + $results = $redis->pipeline(static function ($redis) use ($generator, &$ids) { + foreach ($generator() as $command => $args) { + $redis->{$command}(...$args); + $ids[] = 'eval' === $command ? $args[2] : $args[0]; + } + }); + } elseif ($redis instanceof \RedisArray) { + $connections = $results = $ids = []; + foreach ($generator() as $command => $args) { + $id = 'eval' === $command ? $args[1][0] : $args[0]; + if (!isset($connections[$h = $redis->_target($id)])) { + $connections[$h] = [$redis->_instance($h), -1]; + $connections[$h][0]->multi(\Redis::PIPELINE); + } + $connections[$h][0]->{$command}(...$args); + $results[] = [$h, ++$connections[$h][1]]; + $ids[] = $id; + } + foreach ($connections as $h => $c) { + $connections[$h] = $c[0]->exec(); + } + foreach ($results as $k => [$h, $c]) { + $results[$k] = $connections[$h][$c]; + } + } else { + $redis->multi(\Redis::PIPELINE); + foreach ($generator() as $command => $args) { + $redis->{$command}(...$args); + $ids[] = 'eval' === $command ? $args[1][0] : $args[0]; + } + $results = $redis->exec(); + } + + if (!$redis instanceof \Predis\ClientInterface && 'eval' === $command && $redis->getLastError()) { + $e = new \RedisException($redis->getLastError()); + $results = array_map(function ($v) use ($e) { return false === $v ? $e : $v; }, (array) $results); + } + + if (\is_bool($results)) { + return; + } + + foreach ($ids as $k => $id) { + yield $id => $results[$k]; + } + } + + private function getHosts(): array + { + $hosts = [$this->redis]; + if ($this->redis instanceof \Predis\ClientInterface) { + $connection = $this->redis->getConnection(); + if ($connection instanceof ClusterInterface && $connection instanceof \Traversable) { + $hosts = []; + foreach ($connection as $c) { + $hosts[] = new \Predis\Client($c); + } + } + } elseif ($this->redis instanceof \RedisArray) { + $hosts = []; + foreach ($this->redis->_hosts() as $host) { + $hosts[] = $this->redis->_instance($host); + } + } elseif ($this->redis instanceof RedisClusterProxy || $this->redis instanceof \RedisCluster) { + $hosts = []; + foreach ($this->redis->_masters() as $host) { + $hosts[] = new RedisClusterNodeProxy($host, $this->redis); + } + } + + return $hosts; + } +} diff --git a/vendor/symfony/cache/composer.json b/vendor/symfony/cache/composer.json new file mode 100644 index 0000000..63d27f6 --- /dev/null +++ b/vendor/symfony/cache/composer.json @@ -0,0 +1,56 @@ +{ + "name": "symfony/cache", + "type": "library", + "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "keywords": ["caching", "psr6"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "provide": { + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" + }, + "require": { + "php": ">=8.0.2", + "psr/cache": "^2.0|^3.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^1.1.7|^2|^3", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/var-exporter": "^5.4|^6.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/dbal": "^2.13.1|^3.0", + "predis/predis": "^1.1", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/messenger": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/var-dumper": "<5.4" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\Cache\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev" +} diff --git a/vendor/symfony/deprecation-contracts/.gitignore b/vendor/symfony/deprecation-contracts/.gitignore new file mode 100644 index 0000000..c49a5d8 --- /dev/null +++ b/vendor/symfony/deprecation-contracts/.gitignore @@ -0,0 +1,3 @@ +vendor/ +composer.lock +phpunit.xml diff --git a/vendor/symfony/deprecation-contracts/CHANGELOG.md b/vendor/symfony/deprecation-contracts/CHANGELOG.md new file mode 100644 index 0000000..7932e26 --- /dev/null +++ b/vendor/symfony/deprecation-contracts/CHANGELOG.md @@ -0,0 +1,5 @@ +CHANGELOG +========= + +The changelog is maintained for all Symfony contracts at the following URL: +https://github.com/symfony/contracts/blob/main/CHANGELOG.md diff --git a/vendor/symfony/deprecation-contracts/LICENSE b/vendor/symfony/deprecation-contracts/LICENSE new file mode 100644 index 0000000..406242f --- /dev/null +++ b/vendor/symfony/deprecation-contracts/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2020-2022 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/vendor/symfony/deprecation-contracts/README.md b/vendor/symfony/deprecation-contracts/README.md new file mode 100644 index 0000000..4957933 --- /dev/null +++ b/vendor/symfony/deprecation-contracts/README.md @@ -0,0 +1,26 @@ +Symfony Deprecation Contracts +============================= + +A generic function and convention to trigger deprecation notices. + +This package provides a single global function named `trigger_deprecation()` that triggers silenced deprecation notices. + +By using a custom PHP error handler such as the one provided by the Symfony ErrorHandler component, +the triggered deprecations can be caught and logged for later discovery, both on dev and prod environments. + +The function requires at least 3 arguments: + - the name of the Composer package that is triggering the deprecation + - the version of the package that introduced the deprecation + - the message of the deprecation + - more arguments can be provided: they will be inserted in the message using `printf()` formatting + +Example: +```php +trigger_deprecation('symfony/blockchain', '8.9', 'Using "%s" is deprecated, use "%s" instead.', 'bitcoin', 'fabcoin'); +``` + +This will generate the following message: +`Since symfony/blockchain 8.9: Using "bitcoin" is deprecated, use "fabcoin" instead.` + +While not necessarily recommended, the deprecation notices can be completely ignored by declaring an empty +`function trigger_deprecation() {}` in your application. diff --git a/vendor/symfony/deprecation-contracts/composer.json b/vendor/symfony/deprecation-contracts/composer.json new file mode 100644 index 0000000..1c1b4ba --- /dev/null +++ b/vendor/symfony/deprecation-contracts/composer.json @@ -0,0 +1,35 @@ +{ + "name": "symfony/deprecation-contracts", + "type": "library", + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=8.0.2" + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + } +} diff --git a/vendor/symfony/deprecation-contracts/function.php b/vendor/symfony/deprecation-contracts/function.php new file mode 100644 index 0000000..2d56512 --- /dev/null +++ b/vendor/symfony/deprecation-contracts/function.php @@ -0,0 +1,27 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (!function_exists('trigger_deprecation')) { + /** + * Triggers a silenced deprecation notice. + * + * @param string $package The name of the Composer package that is triggering the deprecation + * @param string $version The version of the package that introduced the deprecation + * @param string $message The message of the deprecation + * @param mixed ...$args Values to insert in the message using printf() formatting + * + * @author Nicolas Grekas <p@tchwork.com> + */ + function trigger_deprecation(string $package, string $version, string $message, mixed ...$args): void + { + @trigger_error(($package || $version ? "Since $package $version: " : '').($args ? vsprintf($message, $args) : $message), \E_USER_DEPRECATED); + } +} diff --git a/vendor/symfony/polyfill-ctype/Ctype.php b/vendor/symfony/polyfill-ctype/Ctype.php new file mode 100644 index 0000000..ba75a2c --- /dev/null +++ b/vendor/symfony/polyfill-ctype/Ctype.php @@ -0,0 +1,232 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Ctype; + +/** + * Ctype implementation through regex. + * + * @internal + * + * @author Gert de Pagter <BackEndTea@gmail.com> + */ +final class Ctype +{ + /** + * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise. + * + * @see https://php.net/ctype-alnum + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_alnum($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text); + } + + /** + * Returns TRUE if every character in text is a letter, FALSE otherwise. + * + * @see https://php.net/ctype-alpha + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_alpha($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text); + } + + /** + * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise. + * + * @see https://php.net/ctype-cntrl + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_cntrl($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text); + } + + /** + * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise. + * + * @see https://php.net/ctype-digit + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_digit($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text); + } + + /** + * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise. + * + * @see https://php.net/ctype-graph + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_graph($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text); + } + + /** + * Returns TRUE if every character in text is a lowercase letter. + * + * @see https://php.net/ctype-lower + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_lower($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text); + } + + /** + * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all. + * + * @see https://php.net/ctype-print + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_print($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text); + } + + /** + * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise. + * + * @see https://php.net/ctype-punct + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_punct($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text); + } + + /** + * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters. + * + * @see https://php.net/ctype-space + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_space($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text); + } + + /** + * Returns TRUE if every character in text is an uppercase letter. + * + * @see https://php.net/ctype-upper + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_upper($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text); + } + + /** + * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise. + * + * @see https://php.net/ctype-xdigit + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_xdigit($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text); + } + + /** + * Converts integers to their char versions according to normal ctype behaviour, if needed. + * + * If an integer between -128 and 255 inclusive is provided, + * it is interpreted as the ASCII value of a single character + * (negative values have 256 added in order to allow characters in the Extended ASCII range). + * Any other integer is interpreted as a string containing the decimal digits of the integer. + * + * @param mixed $int + * @param string $function + * + * @return mixed + */ + private static function convert_int_to_char_for_ctype($int, $function) + { + if (!\is_int($int)) { + return $int; + } + + if ($int < -128 || $int > 255) { + return (string) $int; + } + + if (\PHP_VERSION_ID >= 80100) { + @trigger_error($function.'(): Argument of type int will be interpreted as string in the future', \E_USER_DEPRECATED); + } + + if ($int < 0) { + $int += 256; + } + + return \chr($int); + } +} diff --git a/vendor/symfony/polyfill-ctype/LICENSE b/vendor/symfony/polyfill-ctype/LICENSE new file mode 100644 index 0000000..3f853aa --- /dev/null +++ b/vendor/symfony/polyfill-ctype/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-2019 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/vendor/symfony/polyfill-ctype/README.md b/vendor/symfony/polyfill-ctype/README.md new file mode 100644 index 0000000..b144d03 --- /dev/null +++ b/vendor/symfony/polyfill-ctype/README.md @@ -0,0 +1,12 @@ +Symfony Polyfill / Ctype +======================== + +This component provides `ctype_*` functions to users who run php versions without the ctype extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-ctype/bootstrap.php b/vendor/symfony/polyfill-ctype/bootstrap.php new file mode 100644 index 0000000..d54524b --- /dev/null +++ b/vendor/symfony/polyfill-ctype/bootstrap.php @@ -0,0 +1,50 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Ctype as p; + +if (\PHP_VERSION_ID >= 80000) { + return require __DIR__.'/bootstrap80.php'; +} + +if (!function_exists('ctype_alnum')) { + function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); } +} +if (!function_exists('ctype_alpha')) { + function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); } +} +if (!function_exists('ctype_cntrl')) { + function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); } +} +if (!function_exists('ctype_digit')) { + function ctype_digit($text) { return p\Ctype::ctype_digit($text); } +} +if (!function_exists('ctype_graph')) { + function ctype_graph($text) { return p\Ctype::ctype_graph($text); } +} +if (!function_exists('ctype_lower')) { + function ctype_lower($text) { return p\Ctype::ctype_lower($text); } +} +if (!function_exists('ctype_print')) { + function ctype_print($text) { return p\Ctype::ctype_print($text); } +} +if (!function_exists('ctype_punct')) { + function ctype_punct($text) { return p\Ctype::ctype_punct($text); } +} +if (!function_exists('ctype_space')) { + function ctype_space($text) { return p\Ctype::ctype_space($text); } +} +if (!function_exists('ctype_upper')) { + function ctype_upper($text) { return p\Ctype::ctype_upper($text); } +} +if (!function_exists('ctype_xdigit')) { + function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); } +} diff --git a/vendor/symfony/polyfill-ctype/bootstrap80.php b/vendor/symfony/polyfill-ctype/bootstrap80.php new file mode 100644 index 0000000..ab2f861 --- /dev/null +++ b/vendor/symfony/polyfill-ctype/bootstrap80.php @@ -0,0 +1,46 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Ctype as p; + +if (!function_exists('ctype_alnum')) { + function ctype_alnum(mixed $text): bool { return p\Ctype::ctype_alnum($text); } +} +if (!function_exists('ctype_alpha')) { + function ctype_alpha(mixed $text): bool { return p\Ctype::ctype_alpha($text); } +} +if (!function_exists('ctype_cntrl')) { + function ctype_cntrl(mixed $text): bool { return p\Ctype::ctype_cntrl($text); } +} +if (!function_exists('ctype_digit')) { + function ctype_digit(mixed $text): bool { return p\Ctype::ctype_digit($text); } +} +if (!function_exists('ctype_graph')) { + function ctype_graph(mixed $text): bool { return p\Ctype::ctype_graph($text); } +} +if (!function_exists('ctype_lower')) { + function ctype_lower(mixed $text): bool { return p\Ctype::ctype_lower($text); } +} +if (!function_exists('ctype_print')) { + function ctype_print(mixed $text): bool { return p\Ctype::ctype_print($text); } +} +if (!function_exists('ctype_punct')) { + function ctype_punct(mixed $text): bool { return p\Ctype::ctype_punct($text); } +} +if (!function_exists('ctype_space')) { + function ctype_space(mixed $text): bool { return p\Ctype::ctype_space($text); } +} +if (!function_exists('ctype_upper')) { + function ctype_upper(mixed $text): bool { return p\Ctype::ctype_upper($text); } +} +if (!function_exists('ctype_xdigit')) { + function ctype_xdigit(mixed $text): bool { return p\Ctype::ctype_xdigit($text); } +} diff --git a/vendor/symfony/polyfill-ctype/composer.json b/vendor/symfony/polyfill-ctype/composer.json new file mode 100644 index 0000000..1b3efff --- /dev/null +++ b/vendor/symfony/polyfill-ctype/composer.json @@ -0,0 +1,41 @@ +{ + "name": "symfony/polyfill-ctype", + "type": "library", + "description": "Symfony polyfill for ctype functions", + "keywords": ["polyfill", "compatibility", "portable", "ctype"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" }, + "files": [ "bootstrap.php" ] + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/vendor/symfony/polyfill-mbstring/LICENSE b/vendor/symfony/polyfill-mbstring/LICENSE new file mode 100644 index 0000000..4cd8bdd --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-2019 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/vendor/symfony/polyfill-mbstring/Mbstring.php b/vendor/symfony/polyfill-mbstring/Mbstring.php new file mode 100644 index 0000000..bce5c4a --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/Mbstring.php @@ -0,0 +1,874 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Mbstring; + +/** + * Partial mbstring implementation in PHP, iconv based, UTF-8 centric. + * + * Implemented: + * - mb_chr - Returns a specific character from its Unicode code point + * - mb_convert_encoding - Convert character encoding + * - mb_convert_variables - Convert character code in variable(s) + * - mb_decode_mimeheader - Decode string in MIME header field + * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED + * - mb_decode_numericentity - Decode HTML numeric string reference to character + * - mb_encode_numericentity - Encode character to HTML numeric string reference + * - mb_convert_case - Perform case folding on a string + * - mb_detect_encoding - Detect character encoding + * - mb_get_info - Get internal settings of mbstring + * - mb_http_input - Detect HTTP input character encoding + * - mb_http_output - Set/Get HTTP output character encoding + * - mb_internal_encoding - Set/Get internal character encoding + * - mb_list_encodings - Returns an array of all supported encodings + * - mb_ord - Returns the Unicode code point of a character + * - mb_output_handler - Callback function converts character encoding in output buffer + * - mb_scrub - Replaces ill-formed byte sequences with substitute characters + * - mb_strlen - Get string length + * - mb_strpos - Find position of first occurrence of string in a string + * - mb_strrpos - Find position of last occurrence of a string in a string + * - mb_str_split - Convert a string to an array + * - mb_strtolower - Make a string lowercase + * - mb_strtoupper - Make a string uppercase + * - mb_substitute_character - Set/Get substitution character + * - mb_substr - Get part of string + * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive + * - mb_stristr - Finds first occurrence of a string within another, case insensitive + * - mb_strrchr - Finds the last occurrence of a character in a string within another + * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive + * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive + * - mb_strstr - Finds first occurrence of a string within another + * - mb_strwidth - Return width of string + * - mb_substr_count - Count the number of substring occurrences + * + * Not implemented: + * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) + * - mb_ereg_* - Regular expression with multibyte support + * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable + * - mb_preferred_mime_name - Get MIME charset string + * - mb_regex_encoding - Returns current encoding for multibyte regex as string + * - mb_regex_set_options - Set/Get the default options for mbregex functions + * - mb_send_mail - Send encoded mail + * - mb_split - Split multibyte string using regular expression + * - mb_strcut - Get part of string + * - mb_strimwidth - Get truncated string with specified width + * + * @author Nicolas Grekas <p@tchwork.com> + * + * @internal + */ +final class Mbstring +{ + public const MB_CASE_FOLD = \PHP_INT_MAX; + + private const CASE_FOLD = [ + ['µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"], + ['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'], + ]; + + private static $encodingList = ['ASCII', 'UTF-8']; + private static $language = 'neutral'; + private static $internalEncoding = 'UTF-8'; + + public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) + { + if (\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) { + $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); + } else { + $fromEncoding = self::getEncoding($fromEncoding); + } + + $toEncoding = self::getEncoding($toEncoding); + + if ('BASE64' === $fromEncoding) { + $s = base64_decode($s); + $fromEncoding = $toEncoding; + } + + if ('BASE64' === $toEncoding) { + return base64_encode($s); + } + + if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) { + if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) { + $fromEncoding = 'Windows-1252'; + } + if ('UTF-8' !== $fromEncoding) { + $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s); + } + + return preg_replace_callback('/[\x80-\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s); + } + + if ('HTML-ENTITIES' === $fromEncoding) { + $s = html_entity_decode($s, \ENT_COMPAT, 'UTF-8'); + $fromEncoding = 'UTF-8'; + } + + return iconv($fromEncoding, $toEncoding.'//IGNORE', $s); + } + + public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars) + { + $ok = true; + array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) { + if (false === $v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding)) { + $ok = false; + } + }); + + return $ok ? $fromEncoding : false; + } + + public static function mb_decode_mimeheader($s) + { + return iconv_mime_decode($s, 2, self::$internalEncoding); + } + + public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) + { + trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING); + } + + public static function mb_decode_numericentity($s, $convmap, $encoding = null) + { + if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { + trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); + + return null; + } + + if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) { + return false; + } + + if (null !== $encoding && !\is_scalar($encoding)) { + trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); + + return ''; // Instead of null (cf. mb_encode_numericentity). + } + + $s = (string) $s; + if ('' === $s) { + return ''; + } + + $encoding = self::getEncoding($encoding); + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $s)) { + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + $cnt = floor(\count($convmap) / 4) * 4; + + for ($i = 0; $i < $cnt; $i += 4) { + // collector_decode_htmlnumericentity ignores $convmap[$i + 3] + $convmap[$i] += $convmap[$i + 2]; + $convmap[$i + 1] += $convmap[$i + 2]; + } + + $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) { + $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1]; + for ($i = 0; $i < $cnt; $i += 4) { + if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { + return self::mb_chr($c - $convmap[$i + 2]); + } + } + + return $m[0]; + }, $s); + + if (null === $encoding) { + return $s; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $s); + } + + public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false) + { + if (null !== $s && !\is_scalar($s) && !(\is_object($s) && method_exists($s, '__toString'))) { + trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', \E_USER_WARNING); + + return null; + } + + if (!\is_array($convmap) || (80000 > \PHP_VERSION_ID && !$convmap)) { + return false; + } + + if (null !== $encoding && !\is_scalar($encoding)) { + trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', \E_USER_WARNING); + + return null; // Instead of '' (cf. mb_decode_numericentity). + } + + if (null !== $is_hex && !\is_scalar($is_hex)) { + trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', \E_USER_WARNING); + + return null; + } + + $s = (string) $s; + if ('' === $s) { + return ''; + } + + $encoding = self::getEncoding($encoding); + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $s)) { + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; + + $cnt = floor(\count($convmap) / 4) * 4; + $i = 0; + $len = \strlen($s); + $result = ''; + + while ($i < $len) { + $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; + $uchr = substr($s, $i, $ulen); + $i += $ulen; + $c = self::mb_ord($uchr); + + for ($j = 0; $j < $cnt; $j += 4) { + if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { + $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3]; + $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';'; + continue 2; + } + } + $result .= $uchr; + } + + if (null === $encoding) { + return $result; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $result); + } + + public static function mb_convert_case($s, $mode, $encoding = null) + { + $s = (string) $s; + if ('' === $s) { + return ''; + } + + $encoding = self::getEncoding($encoding); + + if ('UTF-8' === $encoding) { + $encoding = null; + if (!preg_match('//u', $s)) { + $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + if (\MB_CASE_TITLE == $mode) { + static $titleRegexp = null; + if (null === $titleRegexp) { + $titleRegexp = self::getData('titleCaseRegexp'); + } + $s = preg_replace_callback($titleRegexp, [__CLASS__, 'title_case'], $s); + } else { + if (\MB_CASE_UPPER == $mode) { + static $upper = null; + if (null === $upper) { + $upper = self::getData('upperCase'); + } + $map = $upper; + } else { + if (self::MB_CASE_FOLD === $mode) { + $s = str_replace(self::CASE_FOLD[0], self::CASE_FOLD[1], $s); + } + + static $lower = null; + if (null === $lower) { + $lower = self::getData('lowerCase'); + } + $map = $lower; + } + + static $ulenMask = ["\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4]; + + $i = 0; + $len = \strlen($s); + + while ($i < $len) { + $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"]; + $uchr = substr($s, $i, $ulen); + $i += $ulen; + + if (isset($map[$uchr])) { + $uchr = $map[$uchr]; + $nlen = \strlen($uchr); + + if ($nlen == $ulen) { + $nlen = $i; + do { + $s[--$nlen] = $uchr[--$ulen]; + } while ($ulen); + } else { + $s = substr_replace($s, $uchr, $i - $ulen, $ulen); + $len += $nlen - $ulen; + $i += $nlen - $ulen; + } + } + } + } + + if (null === $encoding) { + return $s; + } + + return iconv('UTF-8', $encoding.'//IGNORE', $s); + } + + public static function mb_internal_encoding($encoding = null) + { + if (null === $encoding) { + return self::$internalEncoding; + } + + $normalizedEncoding = self::getEncoding($encoding); + + if ('UTF-8' === $normalizedEncoding || false !== @iconv($normalizedEncoding, $normalizedEncoding, ' ')) { + self::$internalEncoding = $normalizedEncoding; + + return true; + } + + if (80000 > \PHP_VERSION_ID) { + return false; + } + + throw new \ValueError(sprintf('Argument #1 ($encoding) must be a valid encoding, "%s" given', $encoding)); + } + + public static function mb_language($lang = null) + { + if (null === $lang) { + return self::$language; + } + + switch ($normalizedLang = strtolower($lang)) { + case 'uni': + case 'neutral': + self::$language = $normalizedLang; + + return true; + } + + if (80000 > \PHP_VERSION_ID) { + return false; + } + + throw new \ValueError(sprintf('Argument #1 ($language) must be a valid language, "%s" given', $lang)); + } + + public static function mb_list_encodings() + { + return ['UTF-8']; + } + + public static function mb_encoding_aliases($encoding) + { + switch (strtoupper($encoding)) { + case 'UTF8': + case 'UTF-8': + return ['utf8']; + } + + return false; + } + + public static function mb_check_encoding($var = null, $encoding = null) + { + if (null === $encoding) { + if (null === $var) { + return false; + } + $encoding = self::$internalEncoding; + } + + return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var); + } + + public static function mb_detect_encoding($str, $encodingList = null, $strict = false) + { + if (null === $encodingList) { + $encodingList = self::$encodingList; + } else { + if (!\is_array($encodingList)) { + $encodingList = array_map('trim', explode(',', $encodingList)); + } + $encodingList = array_map('strtoupper', $encodingList); + } + + foreach ($encodingList as $enc) { + switch ($enc) { + case 'ASCII': + if (!preg_match('/[\x80-\xFF]/', $str)) { + return $enc; + } + break; + + case 'UTF8': + case 'UTF-8': + if (preg_match('//u', $str)) { + return 'UTF-8'; + } + break; + + default: + if (0 === strncmp($enc, 'ISO-8859-', 9)) { + return $enc; + } + } + } + + return false; + } + + public static function mb_detect_order($encodingList = null) + { + if (null === $encodingList) { + return self::$encodingList; + } + + if (!\is_array($encodingList)) { + $encodingList = array_map('trim', explode(',', $encodingList)); + } + $encodingList = array_map('strtoupper', $encodingList); + + foreach ($encodingList as $enc) { + switch ($enc) { + default: + if (strncmp($enc, 'ISO-8859-', 9)) { + return false; + } + // no break + case 'ASCII': + case 'UTF8': + case 'UTF-8': + } + } + + self::$encodingList = $encodingList; + + return true; + } + + public static function mb_strlen($s, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return \strlen($s); + } + + return @iconv_strlen($s, $encoding); + } + + public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return strpos($haystack, $needle, $offset); + } + + $needle = (string) $needle; + if ('' === $needle) { + if (80000 > \PHP_VERSION_ID) { + trigger_error(__METHOD__.': Empty delimiter', \E_USER_WARNING); + + return false; + } + + return 0; + } + + return iconv_strpos($haystack, $needle, $offset, $encoding); + } + + public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return strrpos($haystack, $needle, $offset); + } + + if ($offset != (int) $offset) { + $offset = 0; + } elseif ($offset = (int) $offset) { + if ($offset < 0) { + if (0 > $offset += self::mb_strlen($needle)) { + $haystack = self::mb_substr($haystack, 0, $offset, $encoding); + } + $offset = 0; + } else { + $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); + } + } + + $pos = '' !== $needle || 80000 > \PHP_VERSION_ID + ? iconv_strrpos($haystack, $needle, $encoding) + : self::mb_strlen($haystack, $encoding); + + return false !== $pos ? $offset + $pos : false; + } + + public static function mb_str_split($string, $split_length = 1, $encoding = null) + { + if (null !== $string && !\is_scalar($string) && !(\is_object($string) && method_exists($string, '__toString'))) { + trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', \E_USER_WARNING); + + return null; + } + + if (1 > $split_length = (int) $split_length) { + if (80000 > \PHP_VERSION_ID) { + trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING); + + return false; + } + + throw new \ValueError('Argument #2 ($length) must be greater than 0'); + } + + if (null === $encoding) { + $encoding = mb_internal_encoding(); + } + + if ('UTF-8' === $encoding = self::getEncoding($encoding)) { + $rx = '/('; + while (65535 < $split_length) { + $rx .= '.{65535}'; + $split_length -= 65535; + } + $rx .= '.{'.$split_length.'})/us'; + + return preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); + } + + $result = []; + $length = mb_strlen($string, $encoding); + + for ($i = 0; $i < $length; $i += $split_length) { + $result[] = mb_substr($string, $i, $split_length, $encoding); + } + + return $result; + } + + public static function mb_strtolower($s, $encoding = null) + { + return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding); + } + + public static function mb_strtoupper($s, $encoding = null) + { + return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding); + } + + public static function mb_substitute_character($c = null) + { + if (null === $c) { + return 'none'; + } + if (0 === strcasecmp($c, 'none')) { + return true; + } + if (80000 > \PHP_VERSION_ID) { + return false; + } + if (\is_int($c) || 'long' === $c || 'entity' === $c) { + return false; + } + + throw new \ValueError('Argument #1 ($substitute_character) must be "none", "long", "entity" or a valid codepoint'); + } + + public static function mb_substr($s, $start, $length = null, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return (string) substr($s, $start, null === $length ? 2147483647 : $length); + } + + if ($start < 0) { + $start = iconv_strlen($s, $encoding) + $start; + if ($start < 0) { + $start = 0; + } + } + + if (null === $length) { + $length = 2147483647; + } elseif ($length < 0) { + $length = iconv_strlen($s, $encoding) + $length - $start; + if ($length < 0) { + return ''; + } + } + + return (string) iconv_substr($s, $start, $length, $encoding); + } + + public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) + { + $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); + $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); + + return self::mb_strpos($haystack, $needle, $offset, $encoding); + } + + public static function mb_stristr($haystack, $needle, $part = false, $encoding = null) + { + $pos = self::mb_stripos($haystack, $needle, 0, $encoding); + + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + $pos = strrpos($haystack, $needle); + } else { + $needle = self::mb_substr($needle, 0, 1, $encoding); + $pos = iconv_strrpos($haystack, $needle, $encoding); + } + + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null) + { + $needle = self::mb_substr($needle, 0, 1, $encoding); + $pos = self::mb_strripos($haystack, $needle, $encoding); + + return self::getSubpart($pos, $part, $haystack, $encoding); + } + + public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) + { + $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); + $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); + + return self::mb_strrpos($haystack, $needle, $offset, $encoding); + } + + public static function mb_strstr($haystack, $needle, $part = false, $encoding = null) + { + $pos = strpos($haystack, $needle); + if (false === $pos) { + return false; + } + if ($part) { + return substr($haystack, 0, $pos); + } + + return substr($haystack, $pos); + } + + public static function mb_get_info($type = 'all') + { + $info = [ + 'internal_encoding' => self::$internalEncoding, + 'http_output' => 'pass', + 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)', + 'func_overload' => 0, + 'func_overload_list' => 'no overload', + 'mail_charset' => 'UTF-8', + 'mail_header_encoding' => 'BASE64', + 'mail_body_encoding' => 'BASE64', + 'illegal_chars' => 0, + 'encoding_translation' => 'Off', + 'language' => self::$language, + 'detect_order' => self::$encodingList, + 'substitute_character' => 'none', + 'strict_detection' => 'Off', + ]; + + if ('all' === $type) { + return $info; + } + if (isset($info[$type])) { + return $info[$type]; + } + + return false; + } + + public static function mb_http_input($type = '') + { + return false; + } + + public static function mb_http_output($encoding = null) + { + return null !== $encoding ? 'pass' === $encoding : 'pass'; + } + + public static function mb_strwidth($s, $encoding = null) + { + $encoding = self::getEncoding($encoding); + + if ('UTF-8' !== $encoding) { + $s = iconv($encoding, 'UTF-8//IGNORE', $s); + } + + $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide); + + return ($wide << 1) + iconv_strlen($s, 'UTF-8'); + } + + public static function mb_substr_count($haystack, $needle, $encoding = null) + { + return substr_count($haystack, $needle); + } + + public static function mb_output_handler($contents, $status) + { + return $contents; + } + + public static function mb_chr($code, $encoding = null) + { + if (0x80 > $code %= 0x200000) { + $s = \chr($code); + } elseif (0x800 > $code) { + $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F); + } elseif (0x10000 > $code) { + $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } else { + $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F); + } + + if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { + $s = mb_convert_encoding($s, $encoding, 'UTF-8'); + } + + return $s; + } + + public static function mb_ord($s, $encoding = null) + { + if ('UTF-8' !== $encoding = self::getEncoding($encoding)) { + $s = mb_convert_encoding($s, 'UTF-8', $encoding); + } + + if (1 === \strlen($s)) { + return \ord($s); + } + + $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0; + if (0xF0 <= $code) { + return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80; + } + if (0xE0 <= $code) { + return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80; + } + if (0xC0 <= $code) { + return (($code - 0xC0) << 6) + $s[2] - 0x80; + } + + return $code; + } + + private static function getSubpart($pos, $part, $haystack, $encoding) + { + if (false === $pos) { + return false; + } + if ($part) { + return self::mb_substr($haystack, 0, $pos, $encoding); + } + + return self::mb_substr($haystack, $pos, null, $encoding); + } + + private static function html_encoding_callback(array $m) + { + $i = 1; + $entities = ''; + $m = unpack('C*', htmlentities($m[0], \ENT_COMPAT, 'UTF-8')); + + while (isset($m[$i])) { + if (0x80 > $m[$i]) { + $entities .= \chr($m[$i++]); + continue; + } + if (0xF0 <= $m[$i]) { + $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; + } elseif (0xE0 <= $m[$i]) { + $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80; + } else { + $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80; + } + + $entities .= '&#'.$c.';'; + } + + return $entities; + } + + private static function title_case(array $s) + { + return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8'); + } + + private static function getData($file) + { + if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) { + return require $file; + } + + return false; + } + + private static function getEncoding($encoding) + { + if (null === $encoding) { + return self::$internalEncoding; + } + + if ('UTF-8' === $encoding) { + return 'UTF-8'; + } + + $encoding = strtoupper($encoding); + + if ('8BIT' === $encoding || 'BINARY' === $encoding) { + return 'CP850'; + } + + if ('UTF8' === $encoding) { + return 'UTF-8'; + } + + return $encoding; + } +} diff --git a/vendor/symfony/polyfill-mbstring/README.md b/vendor/symfony/polyfill-mbstring/README.md new file mode 100644 index 0000000..478b40d --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/README.md @@ -0,0 +1,13 @@ +Symfony Polyfill / Mbstring +=========================== + +This component provides a partial, native PHP implementation for the +[Mbstring](https://php.net/mbstring) extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php new file mode 100644 index 0000000..fac60b0 --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php @@ -0,0 +1,1397 @@ +<?php + +return array ( + 'A' => 'a', + 'B' => 'b', + 'C' => 'c', + 'D' => 'd', + 'E' => 'e', + 'F' => 'f', + 'G' => 'g', + 'H' => 'h', + 'I' => 'i', + 'J' => 'j', + 'K' => 'k', + 'L' => 'l', + 'M' => 'm', + 'N' => 'n', + 'O' => 'o', + 'P' => 'p', + 'Q' => 'q', + 'R' => 'r', + 'S' => 's', + 'T' => 't', + 'U' => 'u', + 'V' => 'v', + 'W' => 'w', + 'X' => 'x', + 'Y' => 'y', + 'Z' => 'z', + 'À' => 'à', + 'Á' => 'á', + 'Â' => 'â', + 'Ã' => 'ã', + 'Ä' => 'ä', + 'Å' => 'å', + 'Æ' => 'æ', + 'Ç' => 'ç', + 'È' => 'è', + 'É' => 'é', + 'Ê' => 'ê', + 'Ë' => 'ë', + 'Ì' => 'ì', + 'Í' => 'í', + 'Î' => 'î', + 'Ï' => 'ï', + 'Ð' => 'ð', + 'Ñ' => 'ñ', + 'Ò' => 'ò', + 'Ó' => 'ó', + 'Ô' => 'ô', + 'Õ' => 'õ', + 'Ö' => 'ö', + 'Ø' => 'ø', + 'Ù' => 'ù', + 'Ú' => 'ú', + 'Û' => 'û', + 'Ü' => 'ü', + 'Ý' => 'ý', + 'Þ' => 'þ', + 'Ā' => 'ā', + 'Ă' => 'ă', + 'Ą' => 'ą', + 'Ć' => 'ć', + 'Ĉ' => 'ĉ', + 'Ċ' => 'ċ', + 'Č' => 'č', + 'Ď' => 'ď', + 'Đ' => 'đ', + 'Ē' => 'ē', + 'Ĕ' => 'ĕ', + 'Ė' => 'ė', + 'Ę' => 'ę', + 'Ě' => 'ě', + 'Ĝ' => 'ĝ', + 'Ğ' => 'ğ', + 'Ġ' => 'ġ', + 'Ģ' => 'ģ', + 'Ĥ' => 'ĥ', + 'Ħ' => 'ħ', + 'Ĩ' => 'ĩ', + 'Ī' => 'ī', + 'Ĭ' => 'ĭ', + 'Į' => 'į', + 'İ' => 'i̇', + 'IJ' => 'ij', + 'Ĵ' => 'ĵ', + 'Ķ' => 'ķ', + 'Ĺ' => 'ĺ', + 'Ļ' => 'ļ', + 'Ľ' => 'ľ', + 'Ŀ' => 'ŀ', + 'Ł' => 'ł', + 'Ń' => 'ń', + 'Ņ' => 'ņ', + 'Ň' => 'ň', + 'Ŋ' => 'ŋ', + 'Ō' => 'ō', + 'Ŏ' => 'ŏ', + 'Ő' => 'ő', + 'Œ' => 'œ', + 'Ŕ' => 'ŕ', + 'Ŗ' => 'ŗ', + 'Ř' => 'ř', + 'Ś' => 'ś', + 'Ŝ' => 'ŝ', + 'Ş' => 'ş', + 'Š' => 'š', + 'Ţ' => 'ţ', + 'Ť' => 'ť', + 'Ŧ' => 'ŧ', + 'Ũ' => 'ũ', + 'Ū' => 'ū', + 'Ŭ' => 'ŭ', + 'Ů' => 'ů', + 'Ű' => 'ű', + 'Ų' => 'ų', + 'Ŵ' => 'ŵ', + 'Ŷ' => 'ŷ', + 'Ÿ' => 'ÿ', + 'Ź' => 'ź', + 'Ż' => 'ż', + 'Ž' => 'ž', + 'Ɓ' => 'ɓ', + 'Ƃ' => 'ƃ', + 'Ƅ' => 'ƅ', + 'Ɔ' => 'ɔ', + 'Ƈ' => 'ƈ', + 'Ɖ' => 'ɖ', + 'Ɗ' => 'ɗ', + 'Ƌ' => 'ƌ', + 'Ǝ' => 'ǝ', + 'Ə' => 'ə', + 'Ɛ' => 'ɛ', + 'Ƒ' => 'ƒ', + 'Ɠ' => 'ɠ', + 'Ɣ' => 'ɣ', + 'Ɩ' => 'ɩ', + 'Ɨ' => 'ɨ', + 'Ƙ' => 'ƙ', + 'Ɯ' => 'ɯ', + 'Ɲ' => 'ɲ', + 'Ɵ' => 'ɵ', + 'Ơ' => 'ơ', + 'Ƣ' => 'ƣ', + 'Ƥ' => 'ƥ', + 'Ʀ' => 'ʀ', + 'Ƨ' => 'ƨ', + 'Ʃ' => 'ʃ', + 'Ƭ' => 'ƭ', + 'Ʈ' => 'ʈ', + 'Ư' => 'ư', + 'Ʊ' => 'ʊ', + 'Ʋ' => 'ʋ', + 'Ƴ' => 'ƴ', + 'Ƶ' => 'ƶ', + 'Ʒ' => 'ʒ', + 'Ƹ' => 'ƹ', + 'Ƽ' => 'ƽ', + 'DŽ' => 'dž', + 'Dž' => 'dž', + 'LJ' => 'lj', + 'Lj' => 'lj', + 'NJ' => 'nj', + 'Nj' => 'nj', + 'Ǎ' => 'ǎ', + 'Ǐ' => 'ǐ', + 'Ǒ' => 'ǒ', + 'Ǔ' => 'ǔ', + 'Ǖ' => 'ǖ', + 'Ǘ' => 'ǘ', + 'Ǚ' => 'ǚ', + 'Ǜ' => 'ǜ', + 'Ǟ' => 'ǟ', + 'Ǡ' => 'ǡ', + 'Ǣ' => 'ǣ', + 'Ǥ' => 'ǥ', + 'Ǧ' => 'ǧ', + 'Ǩ' => 'ǩ', + 'Ǫ' => 'ǫ', + 'Ǭ' => 'ǭ', + 'Ǯ' => 'ǯ', + 'DZ' => 'dz', + 'Dz' => 'dz', + 'Ǵ' => 'ǵ', + 'Ƕ' => 'ƕ', + 'Ƿ' => 'ƿ', + 'Ǹ' => 'ǹ', + 'Ǻ' => 'ǻ', + 'Ǽ' => 'ǽ', + 'Ǿ' => 'ǿ', + 'Ȁ' => 'ȁ', + 'Ȃ' => 'ȃ', + 'Ȅ' => 'ȅ', + 'Ȇ' => 'ȇ', + 'Ȉ' => 'ȉ', + 'Ȋ' => 'ȋ', + 'Ȍ' => 'ȍ', + 'Ȏ' => 'ȏ', + 'Ȑ' => 'ȑ', + 'Ȓ' => 'ȓ', + 'Ȕ' => 'ȕ', + 'Ȗ' => 'ȗ', + 'Ș' => 'ș', + 'Ț' => 'ț', + 'Ȝ' => 'ȝ', + 'Ȟ' => 'ȟ', + 'Ƞ' => 'ƞ', + 'Ȣ' => 'ȣ', + 'Ȥ' => 'ȥ', + 'Ȧ' => 'ȧ', + 'Ȩ' => 'ȩ', + 'Ȫ' => 'ȫ', + 'Ȭ' => 'ȭ', + 'Ȯ' => 'ȯ', + 'Ȱ' => 'ȱ', + 'Ȳ' => 'ȳ', + 'Ⱥ' => 'ⱥ', + 'Ȼ' => 'ȼ', + 'Ƚ' => 'ƚ', + 'Ⱦ' => 'ⱦ', + 'Ɂ' => 'ɂ', + 'Ƀ' => 'ƀ', + 'Ʉ' => 'ʉ', + 'Ʌ' => 'ʌ', + 'Ɇ' => 'ɇ', + 'Ɉ' => 'ɉ', + 'Ɋ' => 'ɋ', + 'Ɍ' => 'ɍ', + 'Ɏ' => 'ɏ', + 'Ͱ' => 'ͱ', + 'Ͳ' => 'ͳ', + 'Ͷ' => 'ͷ', + 'Ϳ' => 'ϳ', + 'Ά' => 'ά', + 'Έ' => 'έ', + 'Ή' => 'ή', + 'Ί' => 'ί', + 'Ό' => 'ό', + 'Ύ' => 'ύ', + 'Ώ' => 'ώ', + 'Α' => 'α', + 'Β' => 'β', + 'Γ' => 'γ', + 'Δ' => 'δ', + 'Ε' => 'ε', + 'Ζ' => 'ζ', + 'Η' => 'η', + 'Θ' => 'θ', + 'Ι' => 'ι', + 'Κ' => 'κ', + 'Λ' => 'λ', + 'Μ' => 'μ', + 'Ν' => 'ν', + 'Ξ' => 'ξ', + 'Ο' => 'ο', + 'Π' => 'π', + 'Ρ' => 'ρ', + 'Σ' => 'σ', + 'Τ' => 'τ', + 'Υ' => 'υ', + 'Φ' => 'φ', + 'Χ' => 'χ', + 'Ψ' => 'ψ', + 'Ω' => 'ω', + 'Ϊ' => 'ϊ', + 'Ϋ' => 'ϋ', + 'Ϗ' => 'ϗ', + 'Ϙ' => 'ϙ', + 'Ϛ' => 'ϛ', + 'Ϝ' => 'ϝ', + 'Ϟ' => 'ϟ', + 'Ϡ' => 'ϡ', + 'Ϣ' => 'ϣ', + 'Ϥ' => 'ϥ', + 'Ϧ' => 'ϧ', + 'Ϩ' => 'ϩ', + 'Ϫ' => 'ϫ', + 'Ϭ' => 'ϭ', + 'Ϯ' => 'ϯ', + 'ϴ' => 'θ', + 'Ϸ' => 'ϸ', + 'Ϲ' => 'ϲ', + 'Ϻ' => 'ϻ', + 'Ͻ' => 'ͻ', + 'Ͼ' => 'ͼ', + 'Ͽ' => 'ͽ', + 'Ѐ' => 'ѐ', + 'Ё' => 'ё', + 'Ђ' => 'ђ', + 'Ѓ' => 'ѓ', + 'Є' => 'є', + 'Ѕ' => 'ѕ', + 'І' => 'і', + 'Ї' => 'ї', + 'Ј' => 'ј', + 'Љ' => 'љ', + 'Њ' => 'њ', + 'Ћ' => 'ћ', + 'Ќ' => 'ќ', + 'Ѝ' => 'ѝ', + 'Ў' => 'ў', + 'Џ' => 'џ', + 'А' => 'а', + 'Б' => 'б', + 'В' => 'в', + 'Г' => 'г', + 'Д' => 'д', + 'Е' => 'е', + 'Ж' => 'ж', + 'З' => 'з', + 'И' => 'и', + 'Й' => 'й', + 'К' => 'к', + 'Л' => 'л', + 'М' => 'м', + 'Н' => 'н', + 'О' => 'о', + 'П' => 'п', + 'Р' => 'р', + 'С' => 'с', + 'Т' => 'т', + 'У' => 'у', + 'Ф' => 'ф', + 'Х' => 'х', + 'Ц' => 'ц', + 'Ч' => 'ч', + 'Ш' => 'ш', + 'Щ' => 'щ', + 'Ъ' => 'ъ', + 'Ы' => 'ы', + 'Ь' => 'ь', + 'Э' => 'э', + 'Ю' => 'ю', + 'Я' => 'я', + 'Ѡ' => 'ѡ', + 'Ѣ' => 'ѣ', + 'Ѥ' => 'ѥ', + 'Ѧ' => 'ѧ', + 'Ѩ' => 'ѩ', + 'Ѫ' => 'ѫ', + 'Ѭ' => 'ѭ', + 'Ѯ' => 'ѯ', + 'Ѱ' => 'ѱ', + 'Ѳ' => 'ѳ', + 'Ѵ' => 'ѵ', + 'Ѷ' => 'ѷ', + 'Ѹ' => 'ѹ', + 'Ѻ' => 'ѻ', + 'Ѽ' => 'ѽ', + 'Ѿ' => 'ѿ', + 'Ҁ' => 'ҁ', + 'Ҋ' => 'ҋ', + 'Ҍ' => 'ҍ', + 'Ҏ' => 'ҏ', + 'Ґ' => 'ґ', + 'Ғ' => 'ғ', + 'Ҕ' => 'ҕ', + 'Җ' => 'җ', + 'Ҙ' => 'ҙ', + 'Қ' => 'қ', + 'Ҝ' => 'ҝ', + 'Ҟ' => 'ҟ', + 'Ҡ' => 'ҡ', + 'Ң' => 'ң', + 'Ҥ' => 'ҥ', + 'Ҧ' => 'ҧ', + 'Ҩ' => 'ҩ', + 'Ҫ' => 'ҫ', + 'Ҭ' => 'ҭ', + 'Ү' => 'ү', + 'Ұ' => 'ұ', + 'Ҳ' => 'ҳ', + 'Ҵ' => 'ҵ', + 'Ҷ' => 'ҷ', + 'Ҹ' => 'ҹ', + 'Һ' => 'һ', + 'Ҽ' => 'ҽ', + 'Ҿ' => 'ҿ', + 'Ӏ' => 'ӏ', + 'Ӂ' => 'ӂ', + 'Ӄ' => 'ӄ', + 'Ӆ' => 'ӆ', + 'Ӈ' => 'ӈ', + 'Ӊ' => 'ӊ', + 'Ӌ' => 'ӌ', + 'Ӎ' => 'ӎ', + 'Ӑ' => 'ӑ', + 'Ӓ' => 'ӓ', + 'Ӕ' => 'ӕ', + 'Ӗ' => 'ӗ', + 'Ә' => 'ә', + 'Ӛ' => 'ӛ', + 'Ӝ' => 'ӝ', + 'Ӟ' => 'ӟ', + 'Ӡ' => 'ӡ', + 'Ӣ' => 'ӣ', + 'Ӥ' => 'ӥ', + 'Ӧ' => 'ӧ', + 'Ө' => 'ө', + 'Ӫ' => 'ӫ', + 'Ӭ' => 'ӭ', + 'Ӯ' => 'ӯ', + 'Ӱ' => 'ӱ', + 'Ӳ' => 'ӳ', + 'Ӵ' => 'ӵ', + 'Ӷ' => 'ӷ', + 'Ӹ' => 'ӹ', + 'Ӻ' => 'ӻ', + 'Ӽ' => 'ӽ', + 'Ӿ' => 'ӿ', + 'Ԁ' => 'ԁ', + 'Ԃ' => 'ԃ', + 'Ԅ' => 'ԅ', + 'Ԇ' => 'ԇ', + 'Ԉ' => 'ԉ', + 'Ԋ' => 'ԋ', + 'Ԍ' => 'ԍ', + 'Ԏ' => 'ԏ', + 'Ԑ' => 'ԑ', + 'Ԓ' => 'ԓ', + 'Ԕ' => 'ԕ', + 'Ԗ' => 'ԗ', + 'Ԙ' => 'ԙ', + 'Ԛ' => 'ԛ', + 'Ԝ' => 'ԝ', + 'Ԟ' => 'ԟ', + 'Ԡ' => 'ԡ', + 'Ԣ' => 'ԣ', + 'Ԥ' => 'ԥ', + 'Ԧ' => 'ԧ', + 'Ԩ' => 'ԩ', + 'Ԫ' => 'ԫ', + 'Ԭ' => 'ԭ', + 'Ԯ' => 'ԯ', + 'Ա' => 'ա', + 'Բ' => 'բ', + 'Գ' => 'գ', + 'Դ' => 'դ', + 'Ե' => 'ե', + 'Զ' => 'զ', + 'Է' => 'է', + 'Ը' => 'ը', + 'Թ' => 'թ', + 'Ժ' => 'ժ', + 'Ի' => 'ի', + 'Լ' => 'լ', + 'Խ' => 'խ', + 'Ծ' => 'ծ', + 'Կ' => 'կ', + 'Հ' => 'հ', + 'Ձ' => 'ձ', + 'Ղ' => 'ղ', + 'Ճ' => 'ճ', + 'Մ' => 'մ', + 'Յ' => 'յ', + 'Ն' => 'ն', + 'Շ' => 'շ', + 'Ո' => 'ո', + 'Չ' => 'չ', + 'Պ' => 'պ', + 'Ջ' => 'ջ', + 'Ռ' => 'ռ', + 'Ս' => 'ս', + 'Վ' => 'վ', + 'Տ' => 'տ', + 'Ր' => 'ր', + 'Ց' => 'ց', + 'Ւ' => 'ւ', + 'Փ' => 'փ', + 'Ք' => 'ք', + 'Օ' => 'օ', + 'Ֆ' => 'ֆ', + 'Ⴀ' => 'ⴀ', + 'Ⴁ' => 'ⴁ', + 'Ⴂ' => 'ⴂ', + 'Ⴃ' => 'ⴃ', + 'Ⴄ' => 'ⴄ', + 'Ⴅ' => 'ⴅ', + 'Ⴆ' => 'ⴆ', + 'Ⴇ' => 'ⴇ', + 'Ⴈ' => 'ⴈ', + 'Ⴉ' => 'ⴉ', + 'Ⴊ' => 'ⴊ', + 'Ⴋ' => 'ⴋ', + 'Ⴌ' => 'ⴌ', + 'Ⴍ' => 'ⴍ', + 'Ⴎ' => 'ⴎ', + 'Ⴏ' => 'ⴏ', + 'Ⴐ' => 'ⴐ', + 'Ⴑ' => 'ⴑ', + 'Ⴒ' => 'ⴒ', + 'Ⴓ' => 'ⴓ', + 'Ⴔ' => 'ⴔ', + 'Ⴕ' => 'ⴕ', + 'Ⴖ' => 'ⴖ', + 'Ⴗ' => 'ⴗ', + 'Ⴘ' => 'ⴘ', + 'Ⴙ' => 'ⴙ', + 'Ⴚ' => 'ⴚ', + 'Ⴛ' => 'ⴛ', + 'Ⴜ' => 'ⴜ', + 'Ⴝ' => 'ⴝ', + 'Ⴞ' => 'ⴞ', + 'Ⴟ' => 'ⴟ', + 'Ⴠ' => 'ⴠ', + 'Ⴡ' => 'ⴡ', + 'Ⴢ' => 'ⴢ', + 'Ⴣ' => 'ⴣ', + 'Ⴤ' => 'ⴤ', + 'Ⴥ' => 'ⴥ', + 'Ⴧ' => 'ⴧ', + 'Ⴭ' => 'ⴭ', + 'Ꭰ' => 'ꭰ', + 'Ꭱ' => 'ꭱ', + 'Ꭲ' => 'ꭲ', + 'Ꭳ' => 'ꭳ', + 'Ꭴ' => 'ꭴ', + 'Ꭵ' => 'ꭵ', + 'Ꭶ' => 'ꭶ', + 'Ꭷ' => 'ꭷ', + 'Ꭸ' => 'ꭸ', + 'Ꭹ' => 'ꭹ', + 'Ꭺ' => 'ꭺ', + 'Ꭻ' => 'ꭻ', + 'Ꭼ' => 'ꭼ', + 'Ꭽ' => 'ꭽ', + 'Ꭾ' => 'ꭾ', + 'Ꭿ' => 'ꭿ', + 'Ꮀ' => 'ꮀ', + 'Ꮁ' => 'ꮁ', + 'Ꮂ' => 'ꮂ', + 'Ꮃ' => 'ꮃ', + 'Ꮄ' => 'ꮄ', + 'Ꮅ' => 'ꮅ', + 'Ꮆ' => 'ꮆ', + 'Ꮇ' => 'ꮇ', + 'Ꮈ' => 'ꮈ', + 'Ꮉ' => 'ꮉ', + 'Ꮊ' => 'ꮊ', + 'Ꮋ' => 'ꮋ', + 'Ꮌ' => 'ꮌ', + 'Ꮍ' => 'ꮍ', + 'Ꮎ' => 'ꮎ', + 'Ꮏ' => 'ꮏ', + 'Ꮐ' => 'ꮐ', + 'Ꮑ' => 'ꮑ', + 'Ꮒ' => 'ꮒ', + 'Ꮓ' => 'ꮓ', + 'Ꮔ' => 'ꮔ', + 'Ꮕ' => 'ꮕ', + 'Ꮖ' => 'ꮖ', + 'Ꮗ' => 'ꮗ', + 'Ꮘ' => 'ꮘ', + 'Ꮙ' => 'ꮙ', + 'Ꮚ' => 'ꮚ', + 'Ꮛ' => 'ꮛ', + 'Ꮜ' => 'ꮜ', + 'Ꮝ' => 'ꮝ', + 'Ꮞ' => 'ꮞ', + 'Ꮟ' => 'ꮟ', + 'Ꮠ' => 'ꮠ', + 'Ꮡ' => 'ꮡ', + 'Ꮢ' => 'ꮢ', + 'Ꮣ' => 'ꮣ', + 'Ꮤ' => 'ꮤ', + 'Ꮥ' => 'ꮥ', + 'Ꮦ' => 'ꮦ', + 'Ꮧ' => 'ꮧ', + 'Ꮨ' => 'ꮨ', + 'Ꮩ' => 'ꮩ', + 'Ꮪ' => 'ꮪ', + 'Ꮫ' => 'ꮫ', + 'Ꮬ' => 'ꮬ', + 'Ꮭ' => 'ꮭ', + 'Ꮮ' => 'ꮮ', + 'Ꮯ' => 'ꮯ', + 'Ꮰ' => 'ꮰ', + 'Ꮱ' => 'ꮱ', + 'Ꮲ' => 'ꮲ', + 'Ꮳ' => 'ꮳ', + 'Ꮴ' => 'ꮴ', + 'Ꮵ' => 'ꮵ', + 'Ꮶ' => 'ꮶ', + 'Ꮷ' => 'ꮷ', + 'Ꮸ' => 'ꮸ', + 'Ꮹ' => 'ꮹ', + 'Ꮺ' => 'ꮺ', + 'Ꮻ' => 'ꮻ', + 'Ꮼ' => 'ꮼ', + 'Ꮽ' => 'ꮽ', + 'Ꮾ' => 'ꮾ', + 'Ꮿ' => 'ꮿ', + 'Ᏸ' => 'ᏸ', + 'Ᏹ' => 'ᏹ', + 'Ᏺ' => 'ᏺ', + 'Ᏻ' => 'ᏻ', + 'Ᏼ' => 'ᏼ', + 'Ᏽ' => 'ᏽ', + 'Ა' => 'ა', + 'Ბ' => 'ბ', + 'Გ' => 'გ', + 'Დ' => 'დ', + 'Ე' => 'ე', + 'Ვ' => 'ვ', + 'Ზ' => 'ზ', + 'Თ' => 'თ', + 'Ი' => 'ი', + 'Კ' => 'კ', + 'Ლ' => 'ლ', + 'Მ' => 'მ', + 'Ნ' => 'ნ', + 'Ო' => 'ო', + 'Პ' => 'პ', + 'Ჟ' => 'ჟ', + 'Რ' => 'რ', + 'Ს' => 'ს', + 'Ტ' => 'ტ', + 'Უ' => 'უ', + 'Ფ' => 'ფ', + 'Ქ' => 'ქ', + 'Ღ' => 'ღ', + 'Ყ' => 'ყ', + 'Შ' => 'შ', + 'Ჩ' => 'ჩ', + 'Ც' => 'ც', + 'Ძ' => 'ძ', + 'Წ' => 'წ', + 'Ჭ' => 'ჭ', + 'Ხ' => 'ხ', + 'Ჯ' => 'ჯ', + 'Ჰ' => 'ჰ', + 'Ჱ' => 'ჱ', + 'Ჲ' => 'ჲ', + 'Ჳ' => 'ჳ', + 'Ჴ' => 'ჴ', + 'Ჵ' => 'ჵ', + 'Ჶ' => 'ჶ', + 'Ჷ' => 'ჷ', + 'Ჸ' => 'ჸ', + 'Ჹ' => 'ჹ', + 'Ჺ' => 'ჺ', + 'Ჽ' => 'ჽ', + 'Ჾ' => 'ჾ', + 'Ჿ' => 'ჿ', + 'Ḁ' => 'ḁ', + 'Ḃ' => 'ḃ', + 'Ḅ' => 'ḅ', + 'Ḇ' => 'ḇ', + 'Ḉ' => 'ḉ', + 'Ḋ' => 'ḋ', + 'Ḍ' => 'ḍ', + 'Ḏ' => 'ḏ', + 'Ḑ' => 'ḑ', + 'Ḓ' => 'ḓ', + 'Ḕ' => 'ḕ', + 'Ḗ' => 'ḗ', + 'Ḙ' => 'ḙ', + 'Ḛ' => 'ḛ', + 'Ḝ' => 'ḝ', + 'Ḟ' => 'ḟ', + 'Ḡ' => 'ḡ', + 'Ḣ' => 'ḣ', + 'Ḥ' => 'ḥ', + 'Ḧ' => 'ḧ', + 'Ḩ' => 'ḩ', + 'Ḫ' => 'ḫ', + 'Ḭ' => 'ḭ', + 'Ḯ' => 'ḯ', + 'Ḱ' => 'ḱ', + 'Ḳ' => 'ḳ', + 'Ḵ' => 'ḵ', + 'Ḷ' => 'ḷ', + 'Ḹ' => 'ḹ', + 'Ḻ' => 'ḻ', + 'Ḽ' => 'ḽ', + 'Ḿ' => 'ḿ', + 'Ṁ' => 'ṁ', + 'Ṃ' => 'ṃ', + 'Ṅ' => 'ṅ', + 'Ṇ' => 'ṇ', + 'Ṉ' => 'ṉ', + 'Ṋ' => 'ṋ', + 'Ṍ' => 'ṍ', + 'Ṏ' => 'ṏ', + 'Ṑ' => 'ṑ', + 'Ṓ' => 'ṓ', + 'Ṕ' => 'ṕ', + 'Ṗ' => 'ṗ', + 'Ṙ' => 'ṙ', + 'Ṛ' => 'ṛ', + 'Ṝ' => 'ṝ', + 'Ṟ' => 'ṟ', + 'Ṡ' => 'ṡ', + 'Ṣ' => 'ṣ', + 'Ṥ' => 'ṥ', + 'Ṧ' => 'ṧ', + 'Ṩ' => 'ṩ', + 'Ṫ' => 'ṫ', + 'Ṭ' => 'ṭ', + 'Ṯ' => 'ṯ', + 'Ṱ' => 'ṱ', + 'Ṳ' => 'ṳ', + 'Ṵ' => 'ṵ', + 'Ṷ' => 'ṷ', + 'Ṹ' => 'ṹ', + 'Ṻ' => 'ṻ', + 'Ṽ' => 'ṽ', + 'Ṿ' => 'ṿ', + 'Ẁ' => 'ẁ', + 'Ẃ' => 'ẃ', + 'Ẅ' => 'ẅ', + 'Ẇ' => 'ẇ', + 'Ẉ' => 'ẉ', + 'Ẋ' => 'ẋ', + 'Ẍ' => 'ẍ', + 'Ẏ' => 'ẏ', + 'Ẑ' => 'ẑ', + 'Ẓ' => 'ẓ', + 'Ẕ' => 'ẕ', + 'ẞ' => 'ß', + 'Ạ' => 'ạ', + 'Ả' => 'ả', + 'Ấ' => 'ấ', + 'Ầ' => 'ầ', + 'Ẩ' => 'ẩ', + 'Ẫ' => 'ẫ', + 'Ậ' => 'ậ', + 'Ắ' => 'ắ', + 'Ằ' => 'ằ', + 'Ẳ' => 'ẳ', + 'Ẵ' => 'ẵ', + 'Ặ' => 'ặ', + 'Ẹ' => 'ẹ', + 'Ẻ' => 'ẻ', + 'Ẽ' => 'ẽ', + 'Ế' => 'ế', + 'Ề' => 'ề', + 'Ể' => 'ể', + 'Ễ' => 'ễ', + 'Ệ' => 'ệ', + 'Ỉ' => 'ỉ', + 'Ị' => 'ị', + 'Ọ' => 'ọ', + 'Ỏ' => 'ỏ', + 'Ố' => 'ố', + 'Ồ' => 'ồ', + 'Ổ' => 'ổ', + 'Ỗ' => 'ỗ', + 'Ộ' => 'ộ', + 'Ớ' => 'ớ', + 'Ờ' => 'ờ', + 'Ở' => 'ở', + 'Ỡ' => 'ỡ', + 'Ợ' => 'ợ', + 'Ụ' => 'ụ', + 'Ủ' => 'ủ', + 'Ứ' => 'ứ', + 'Ừ' => 'ừ', + 'Ử' => 'ử', + 'Ữ' => 'ữ', + 'Ự' => 'ự', + 'Ỳ' => 'ỳ', + 'Ỵ' => 'ỵ', + 'Ỷ' => 'ỷ', + 'Ỹ' => 'ỹ', + 'Ỻ' => 'ỻ', + 'Ỽ' => 'ỽ', + 'Ỿ' => 'ỿ', + 'Ἀ' => 'ἀ', + 'Ἁ' => 'ἁ', + 'Ἂ' => 'ἂ', + 'Ἃ' => 'ἃ', + 'Ἄ' => 'ἄ', + 'Ἅ' => 'ἅ', + 'Ἆ' => 'ἆ', + 'Ἇ' => 'ἇ', + 'Ἐ' => 'ἐ', + 'Ἑ' => 'ἑ', + 'Ἒ' => 'ἒ', + 'Ἓ' => 'ἓ', + 'Ἔ' => 'ἔ', + 'Ἕ' => 'ἕ', + 'Ἠ' => 'ἠ', + 'Ἡ' => 'ἡ', + 'Ἢ' => 'ἢ', + 'Ἣ' => 'ἣ', + 'Ἤ' => 'ἤ', + 'Ἥ' => 'ἥ', + 'Ἦ' => 'ἦ', + 'Ἧ' => 'ἧ', + 'Ἰ' => 'ἰ', + 'Ἱ' => 'ἱ', + 'Ἲ' => 'ἲ', + 'Ἳ' => 'ἳ', + 'Ἴ' => 'ἴ', + 'Ἵ' => 'ἵ', + 'Ἶ' => 'ἶ', + 'Ἷ' => 'ἷ', + 'Ὀ' => 'ὀ', + 'Ὁ' => 'ὁ', + 'Ὂ' => 'ὂ', + 'Ὃ' => 'ὃ', + 'Ὄ' => 'ὄ', + 'Ὅ' => 'ὅ', + 'Ὑ' => 'ὑ', + 'Ὓ' => 'ὓ', + 'Ὕ' => 'ὕ', + 'Ὗ' => 'ὗ', + 'Ὠ' => 'ὠ', + 'Ὡ' => 'ὡ', + 'Ὢ' => 'ὢ', + 'Ὣ' => 'ὣ', + 'Ὤ' => 'ὤ', + 'Ὥ' => 'ὥ', + 'Ὦ' => 'ὦ', + 'Ὧ' => 'ὧ', + 'ᾈ' => 'ᾀ', + 'ᾉ' => 'ᾁ', + 'ᾊ' => 'ᾂ', + 'ᾋ' => 'ᾃ', + 'ᾌ' => 'ᾄ', + 'ᾍ' => 'ᾅ', + 'ᾎ' => 'ᾆ', + 'ᾏ' => 'ᾇ', + 'ᾘ' => 'ᾐ', + 'ᾙ' => 'ᾑ', + 'ᾚ' => 'ᾒ', + 'ᾛ' => 'ᾓ', + 'ᾜ' => 'ᾔ', + 'ᾝ' => 'ᾕ', + 'ᾞ' => 'ᾖ', + 'ᾟ' => 'ᾗ', + 'ᾨ' => 'ᾠ', + 'ᾩ' => 'ᾡ', + 'ᾪ' => 'ᾢ', + 'ᾫ' => 'ᾣ', + 'ᾬ' => 'ᾤ', + 'ᾭ' => 'ᾥ', + 'ᾮ' => 'ᾦ', + 'ᾯ' => 'ᾧ', + 'Ᾰ' => 'ᾰ', + 'Ᾱ' => 'ᾱ', + 'Ὰ' => 'ὰ', + 'Ά' => 'ά', + 'ᾼ' => 'ᾳ', + 'Ὲ' => 'ὲ', + 'Έ' => 'έ', + 'Ὴ' => 'ὴ', + 'Ή' => 'ή', + 'ῌ' => 'ῃ', + 'Ῐ' => 'ῐ', + 'Ῑ' => 'ῑ', + 'Ὶ' => 'ὶ', + 'Ί' => 'ί', + 'Ῠ' => 'ῠ', + 'Ῡ' => 'ῡ', + 'Ὺ' => 'ὺ', + 'Ύ' => 'ύ', + 'Ῥ' => 'ῥ', + 'Ὸ' => 'ὸ', + 'Ό' => 'ό', + 'Ὼ' => 'ὼ', + 'Ώ' => 'ώ', + 'ῼ' => 'ῳ', + 'Ω' => 'ω', + 'K' => 'k', + 'Å' => 'å', + 'Ⅎ' => 'ⅎ', + 'Ⅰ' => 'ⅰ', + 'Ⅱ' => 'ⅱ', + 'Ⅲ' => 'ⅲ', + 'Ⅳ' => 'ⅳ', + 'Ⅴ' => 'ⅴ', + 'Ⅵ' => 'ⅵ', + 'Ⅶ' => 'ⅶ', + 'Ⅷ' => 'ⅷ', + 'Ⅸ' => 'ⅸ', + 'Ⅹ' => 'ⅹ', + 'Ⅺ' => 'ⅺ', + 'Ⅻ' => 'ⅻ', + 'Ⅼ' => 'ⅼ', + 'Ⅽ' => 'ⅽ', + 'Ⅾ' => 'ⅾ', + 'Ⅿ' => 'ⅿ', + 'Ↄ' => 'ↄ', + 'Ⓐ' => 'ⓐ', + 'Ⓑ' => 'ⓑ', + 'Ⓒ' => 'ⓒ', + 'Ⓓ' => 'ⓓ', + 'Ⓔ' => 'ⓔ', + 'Ⓕ' => 'ⓕ', + 'Ⓖ' => 'ⓖ', + 'Ⓗ' => 'ⓗ', + 'Ⓘ' => 'ⓘ', + 'Ⓙ' => 'ⓙ', + 'Ⓚ' => 'ⓚ', + 'Ⓛ' => 'ⓛ', + 'Ⓜ' => 'ⓜ', + 'Ⓝ' => 'ⓝ', + 'Ⓞ' => 'ⓞ', + 'Ⓟ' => 'ⓟ', + 'Ⓠ' => 'ⓠ', + 'Ⓡ' => 'ⓡ', + 'Ⓢ' => 'ⓢ', + 'Ⓣ' => 'ⓣ', + 'Ⓤ' => 'ⓤ', + 'Ⓥ' => 'ⓥ', + 'Ⓦ' => 'ⓦ', + 'Ⓧ' => 'ⓧ', + 'Ⓨ' => 'ⓨ', + 'Ⓩ' => 'ⓩ', + 'Ⰰ' => 'ⰰ', + 'Ⰱ' => 'ⰱ', + 'Ⰲ' => 'ⰲ', + 'Ⰳ' => 'ⰳ', + 'Ⰴ' => 'ⰴ', + 'Ⰵ' => 'ⰵ', + 'Ⰶ' => 'ⰶ', + 'Ⰷ' => 'ⰷ', + 'Ⰸ' => 'ⰸ', + 'Ⰹ' => 'ⰹ', + 'Ⰺ' => 'ⰺ', + 'Ⰻ' => 'ⰻ', + 'Ⰼ' => 'ⰼ', + 'Ⰽ' => 'ⰽ', + 'Ⰾ' => 'ⰾ', + 'Ⰿ' => 'ⰿ', + 'Ⱀ' => 'ⱀ', + 'Ⱁ' => 'ⱁ', + 'Ⱂ' => 'ⱂ', + 'Ⱃ' => 'ⱃ', + 'Ⱄ' => 'ⱄ', + 'Ⱅ' => 'ⱅ', + 'Ⱆ' => 'ⱆ', + 'Ⱇ' => 'ⱇ', + 'Ⱈ' => 'ⱈ', + 'Ⱉ' => 'ⱉ', + 'Ⱊ' => 'ⱊ', + 'Ⱋ' => 'ⱋ', + 'Ⱌ' => 'ⱌ', + 'Ⱍ' => 'ⱍ', + 'Ⱎ' => 'ⱎ', + 'Ⱏ' => 'ⱏ', + 'Ⱐ' => 'ⱐ', + 'Ⱑ' => 'ⱑ', + 'Ⱒ' => 'ⱒ', + 'Ⱓ' => 'ⱓ', + 'Ⱔ' => 'ⱔ', + 'Ⱕ' => 'ⱕ', + 'Ⱖ' => 'ⱖ', + 'Ⱗ' => 'ⱗ', + 'Ⱘ' => 'ⱘ', + 'Ⱙ' => 'ⱙ', + 'Ⱚ' => 'ⱚ', + 'Ⱛ' => 'ⱛ', + 'Ⱜ' => 'ⱜ', + 'Ⱝ' => 'ⱝ', + 'Ⱞ' => 'ⱞ', + 'Ⱡ' => 'ⱡ', + 'Ɫ' => 'ɫ', + 'Ᵽ' => 'ᵽ', + 'Ɽ' => 'ɽ', + 'Ⱨ' => 'ⱨ', + 'Ⱪ' => 'ⱪ', + 'Ⱬ' => 'ⱬ', + 'Ɑ' => 'ɑ', + 'Ɱ' => 'ɱ', + 'Ɐ' => 'ɐ', + 'Ɒ' => 'ɒ', + 'Ⱳ' => 'ⱳ', + 'Ⱶ' => 'ⱶ', + 'Ȿ' => 'ȿ', + 'Ɀ' => 'ɀ', + 'Ⲁ' => 'ⲁ', + 'Ⲃ' => 'ⲃ', + 'Ⲅ' => 'ⲅ', + 'Ⲇ' => 'ⲇ', + 'Ⲉ' => 'ⲉ', + 'Ⲋ' => 'ⲋ', + 'Ⲍ' => 'ⲍ', + 'Ⲏ' => 'ⲏ', + 'Ⲑ' => 'ⲑ', + 'Ⲓ' => 'ⲓ', + 'Ⲕ' => 'ⲕ', + 'Ⲗ' => 'ⲗ', + 'Ⲙ' => 'ⲙ', + 'Ⲛ' => 'ⲛ', + 'Ⲝ' => 'ⲝ', + 'Ⲟ' => 'ⲟ', + 'Ⲡ' => 'ⲡ', + 'Ⲣ' => 'ⲣ', + 'Ⲥ' => 'ⲥ', + 'Ⲧ' => 'ⲧ', + 'Ⲩ' => 'ⲩ', + 'Ⲫ' => 'ⲫ', + 'Ⲭ' => 'ⲭ', + 'Ⲯ' => 'ⲯ', + 'Ⲱ' => 'ⲱ', + 'Ⲳ' => 'ⲳ', + 'Ⲵ' => 'ⲵ', + 'Ⲷ' => 'ⲷ', + 'Ⲹ' => 'ⲹ', + 'Ⲻ' => 'ⲻ', + 'Ⲽ' => 'ⲽ', + 'Ⲿ' => 'ⲿ', + 'Ⳁ' => 'ⳁ', + 'Ⳃ' => 'ⳃ', + 'Ⳅ' => 'ⳅ', + 'Ⳇ' => 'ⳇ', + 'Ⳉ' => 'ⳉ', + 'Ⳋ' => 'ⳋ', + 'Ⳍ' => 'ⳍ', + 'Ⳏ' => 'ⳏ', + 'Ⳑ' => 'ⳑ', + 'Ⳓ' => 'ⳓ', + 'Ⳕ' => 'ⳕ', + 'Ⳗ' => 'ⳗ', + 'Ⳙ' => 'ⳙ', + 'Ⳛ' => 'ⳛ', + 'Ⳝ' => 'ⳝ', + 'Ⳟ' => 'ⳟ', + 'Ⳡ' => 'ⳡ', + 'Ⳣ' => 'ⳣ', + 'Ⳬ' => 'ⳬ', + 'Ⳮ' => 'ⳮ', + 'Ⳳ' => 'ⳳ', + 'Ꙁ' => 'ꙁ', + 'Ꙃ' => 'ꙃ', + 'Ꙅ' => 'ꙅ', + 'Ꙇ' => 'ꙇ', + 'Ꙉ' => 'ꙉ', + 'Ꙋ' => 'ꙋ', + 'Ꙍ' => 'ꙍ', + 'Ꙏ' => 'ꙏ', + 'Ꙑ' => 'ꙑ', + 'Ꙓ' => 'ꙓ', + 'Ꙕ' => 'ꙕ', + 'Ꙗ' => 'ꙗ', + 'Ꙙ' => 'ꙙ', + 'Ꙛ' => 'ꙛ', + 'Ꙝ' => 'ꙝ', + 'Ꙟ' => 'ꙟ', + 'Ꙡ' => 'ꙡ', + 'Ꙣ' => 'ꙣ', + 'Ꙥ' => 'ꙥ', + 'Ꙧ' => 'ꙧ', + 'Ꙩ' => 'ꙩ', + 'Ꙫ' => 'ꙫ', + 'Ꙭ' => 'ꙭ', + 'Ꚁ' => 'ꚁ', + 'Ꚃ' => 'ꚃ', + 'Ꚅ' => 'ꚅ', + 'Ꚇ' => 'ꚇ', + 'Ꚉ' => 'ꚉ', + 'Ꚋ' => 'ꚋ', + 'Ꚍ' => 'ꚍ', + 'Ꚏ' => 'ꚏ', + 'Ꚑ' => 'ꚑ', + 'Ꚓ' => 'ꚓ', + 'Ꚕ' => 'ꚕ', + 'Ꚗ' => 'ꚗ', + 'Ꚙ' => 'ꚙ', + 'Ꚛ' => 'ꚛ', + 'Ꜣ' => 'ꜣ', + 'Ꜥ' => 'ꜥ', + 'Ꜧ' => 'ꜧ', + 'Ꜩ' => 'ꜩ', + 'Ꜫ' => 'ꜫ', + 'Ꜭ' => 'ꜭ', + 'Ꜯ' => 'ꜯ', + 'Ꜳ' => 'ꜳ', + 'Ꜵ' => 'ꜵ', + 'Ꜷ' => 'ꜷ', + 'Ꜹ' => 'ꜹ', + 'Ꜻ' => 'ꜻ', + 'Ꜽ' => 'ꜽ', + 'Ꜿ' => 'ꜿ', + 'Ꝁ' => 'ꝁ', + 'Ꝃ' => 'ꝃ', + 'Ꝅ' => 'ꝅ', + 'Ꝇ' => 'ꝇ', + 'Ꝉ' => 'ꝉ', + 'Ꝋ' => 'ꝋ', + 'Ꝍ' => 'ꝍ', + 'Ꝏ' => 'ꝏ', + 'Ꝑ' => 'ꝑ', + 'Ꝓ' => 'ꝓ', + 'Ꝕ' => 'ꝕ', + 'Ꝗ' => 'ꝗ', + 'Ꝙ' => 'ꝙ', + 'Ꝛ' => 'ꝛ', + 'Ꝝ' => 'ꝝ', + 'Ꝟ' => 'ꝟ', + 'Ꝡ' => 'ꝡ', + 'Ꝣ' => 'ꝣ', + 'Ꝥ' => 'ꝥ', + 'Ꝧ' => 'ꝧ', + 'Ꝩ' => 'ꝩ', + 'Ꝫ' => 'ꝫ', + 'Ꝭ' => 'ꝭ', + 'Ꝯ' => 'ꝯ', + 'Ꝺ' => 'ꝺ', + 'Ꝼ' => 'ꝼ', + 'Ᵹ' => 'ᵹ', + 'Ꝿ' => 'ꝿ', + 'Ꞁ' => 'ꞁ', + 'Ꞃ' => 'ꞃ', + 'Ꞅ' => 'ꞅ', + 'Ꞇ' => 'ꞇ', + 'Ꞌ' => 'ꞌ', + 'Ɥ' => 'ɥ', + 'Ꞑ' => 'ꞑ', + 'Ꞓ' => 'ꞓ', + 'Ꞗ' => 'ꞗ', + 'Ꞙ' => 'ꞙ', + 'Ꞛ' => 'ꞛ', + 'Ꞝ' => 'ꞝ', + 'Ꞟ' => 'ꞟ', + 'Ꞡ' => 'ꞡ', + 'Ꞣ' => 'ꞣ', + 'Ꞥ' => 'ꞥ', + 'Ꞧ' => 'ꞧ', + 'Ꞩ' => 'ꞩ', + 'Ɦ' => 'ɦ', + 'Ɜ' => 'ɜ', + 'Ɡ' => 'ɡ', + 'Ɬ' => 'ɬ', + 'Ɪ' => 'ɪ', + 'Ʞ' => 'ʞ', + 'Ʇ' => 'ʇ', + 'Ʝ' => 'ʝ', + 'Ꭓ' => 'ꭓ', + 'Ꞵ' => 'ꞵ', + 'Ꞷ' => 'ꞷ', + 'Ꞹ' => 'ꞹ', + 'Ꞻ' => 'ꞻ', + 'Ꞽ' => 'ꞽ', + 'Ꞿ' => 'ꞿ', + 'Ꟃ' => 'ꟃ', + 'Ꞔ' => 'ꞔ', + 'Ʂ' => 'ʂ', + 'Ᶎ' => 'ᶎ', + 'Ꟈ' => 'ꟈ', + 'Ꟊ' => 'ꟊ', + 'Ꟶ' => 'ꟶ', + 'A' => 'a', + 'B' => 'b', + 'C' => 'c', + 'D' => 'd', + 'E' => 'e', + 'F' => 'f', + 'G' => 'g', + 'H' => 'h', + 'I' => 'i', + 'J' => 'j', + 'K' => 'k', + 'L' => 'l', + 'M' => 'm', + 'N' => 'n', + 'O' => 'o', + 'P' => 'p', + 'Q' => 'q', + 'R' => 'r', + 'S' => 's', + 'T' => 't', + 'U' => 'u', + 'V' => 'v', + 'W' => 'w', + 'X' => 'x', + 'Y' => 'y', + 'Z' => 'z', + '𐐀' => '𐐨', + '𐐁' => '𐐩', + '𐐂' => '𐐪', + '𐐃' => '𐐫', + '𐐄' => '𐐬', + '𐐅' => '𐐭', + '𐐆' => '𐐮', + '𐐇' => '𐐯', + '𐐈' => '𐐰', + '𐐉' => '𐐱', + '𐐊' => '𐐲', + '𐐋' => '𐐳', + '𐐌' => '𐐴', + '𐐍' => '𐐵', + '𐐎' => '𐐶', + '𐐏' => '𐐷', + '𐐐' => '𐐸', + '𐐑' => '𐐹', + '𐐒' => '𐐺', + '𐐓' => '𐐻', + '𐐔' => '𐐼', + '𐐕' => '𐐽', + '𐐖' => '𐐾', + '𐐗' => '𐐿', + '𐐘' => '𐑀', + '𐐙' => '𐑁', + '𐐚' => '𐑂', + '𐐛' => '𐑃', + '𐐜' => '𐑄', + '𐐝' => '𐑅', + '𐐞' => '𐑆', + '𐐟' => '𐑇', + '𐐠' => '𐑈', + '𐐡' => '𐑉', + '𐐢' => '𐑊', + '𐐣' => '𐑋', + '𐐤' => '𐑌', + '𐐥' => '𐑍', + '𐐦' => '𐑎', + '𐐧' => '𐑏', + '𐒰' => '𐓘', + '𐒱' => '𐓙', + '𐒲' => '𐓚', + '𐒳' => '𐓛', + '𐒴' => '𐓜', + '𐒵' => '𐓝', + '𐒶' => '𐓞', + '𐒷' => '𐓟', + '𐒸' => '𐓠', + '𐒹' => '𐓡', + '𐒺' => '𐓢', + '𐒻' => '𐓣', + '𐒼' => '𐓤', + '𐒽' => '𐓥', + '𐒾' => '𐓦', + '𐒿' => '𐓧', + '𐓀' => '𐓨', + '𐓁' => '𐓩', + '𐓂' => '𐓪', + '𐓃' => '𐓫', + '𐓄' => '𐓬', + '𐓅' => '𐓭', + '𐓆' => '𐓮', + '𐓇' => '𐓯', + '𐓈' => '𐓰', + '𐓉' => '𐓱', + '𐓊' => '𐓲', + '𐓋' => '𐓳', + '𐓌' => '𐓴', + '𐓍' => '𐓵', + '𐓎' => '𐓶', + '𐓏' => '𐓷', + '𐓐' => '𐓸', + '𐓑' => '𐓹', + '𐓒' => '𐓺', + '𐓓' => '𐓻', + '𐲀' => '𐳀', + '𐲁' => '𐳁', + '𐲂' => '𐳂', + '𐲃' => '𐳃', + '𐲄' => '𐳄', + '𐲅' => '𐳅', + '𐲆' => '𐳆', + '𐲇' => '𐳇', + '𐲈' => '𐳈', + '𐲉' => '𐳉', + '𐲊' => '𐳊', + '𐲋' => '𐳋', + '𐲌' => '𐳌', + '𐲍' => '𐳍', + '𐲎' => '𐳎', + '𐲏' => '𐳏', + '𐲐' => '𐳐', + '𐲑' => '𐳑', + '𐲒' => '𐳒', + '𐲓' => '𐳓', + '𐲔' => '𐳔', + '𐲕' => '𐳕', + '𐲖' => '𐳖', + '𐲗' => '𐳗', + '𐲘' => '𐳘', + '𐲙' => '𐳙', + '𐲚' => '𐳚', + '𐲛' => '𐳛', + '𐲜' => '𐳜', + '𐲝' => '𐳝', + '𐲞' => '𐳞', + '𐲟' => '𐳟', + '𐲠' => '𐳠', + '𐲡' => '𐳡', + '𐲢' => '𐳢', + '𐲣' => '𐳣', + '𐲤' => '𐳤', + '𐲥' => '𐳥', + '𐲦' => '𐳦', + '𐲧' => '𐳧', + '𐲨' => '𐳨', + '𐲩' => '𐳩', + '𐲪' => '𐳪', + '𐲫' => '𐳫', + '𐲬' => '𐳬', + '𐲭' => '𐳭', + '𐲮' => '𐳮', + '𐲯' => '𐳯', + '𐲰' => '𐳰', + '𐲱' => '𐳱', + '𐲲' => '𐳲', + '𑢠' => '𑣀', + '𑢡' => '𑣁', + '𑢢' => '𑣂', + '𑢣' => '𑣃', + '𑢤' => '𑣄', + '𑢥' => '𑣅', + '𑢦' => '𑣆', + '𑢧' => '𑣇', + '𑢨' => '𑣈', + '𑢩' => '𑣉', + '𑢪' => '𑣊', + '𑢫' => '𑣋', + '𑢬' => '𑣌', + '𑢭' => '𑣍', + '𑢮' => '𑣎', + '𑢯' => '𑣏', + '𑢰' => '𑣐', + '𑢱' => '𑣑', + '𑢲' => '𑣒', + '𑢳' => '𑣓', + '𑢴' => '𑣔', + '𑢵' => '𑣕', + '𑢶' => '𑣖', + '𑢷' => '𑣗', + '𑢸' => '𑣘', + '𑢹' => '𑣙', + '𑢺' => '𑣚', + '𑢻' => '𑣛', + '𑢼' => '𑣜', + '𑢽' => '𑣝', + '𑢾' => '𑣞', + '𑢿' => '𑣟', + '𖹀' => '𖹠', + '𖹁' => '𖹡', + '𖹂' => '𖹢', + '𖹃' => '𖹣', + '𖹄' => '𖹤', + '𖹅' => '𖹥', + '𖹆' => '𖹦', + '𖹇' => '𖹧', + '𖹈' => '𖹨', + '𖹉' => '𖹩', + '𖹊' => '𖹪', + '𖹋' => '𖹫', + '𖹌' => '𖹬', + '𖹍' => '𖹭', + '𖹎' => '𖹮', + '𖹏' => '𖹯', + '𖹐' => '𖹰', + '𖹑' => '𖹱', + '𖹒' => '𖹲', + '𖹓' => '𖹳', + '𖹔' => '𖹴', + '𖹕' => '𖹵', + '𖹖' => '𖹶', + '𖹗' => '𖹷', + '𖹘' => '𖹸', + '𖹙' => '𖹹', + '𖹚' => '𖹺', + '𖹛' => '𖹻', + '𖹜' => '𖹼', + '𖹝' => '𖹽', + '𖹞' => '𖹾', + '𖹟' => '𖹿', + '𞤀' => '𞤢', + '𞤁' => '𞤣', + '𞤂' => '𞤤', + '𞤃' => '𞤥', + '𞤄' => '𞤦', + '𞤅' => '𞤧', + '𞤆' => '𞤨', + '𞤇' => '𞤩', + '𞤈' => '𞤪', + '𞤉' => '𞤫', + '𞤊' => '𞤬', + '𞤋' => '𞤭', + '𞤌' => '𞤮', + '𞤍' => '𞤯', + '𞤎' => '𞤰', + '𞤏' => '𞤱', + '𞤐' => '𞤲', + '𞤑' => '𞤳', + '𞤒' => '𞤴', + '𞤓' => '𞤵', + '𞤔' => '𞤶', + '𞤕' => '𞤷', + '𞤖' => '𞤸', + '𞤗' => '𞤹', + '𞤘' => '𞤺', + '𞤙' => '𞤻', + '𞤚' => '𞤼', + '𞤛' => '𞤽', + '𞤜' => '𞤾', + '𞤝' => '𞤿', + '𞤞' => '𞥀', + '𞤟' => '𞥁', + '𞤠' => '𞥂', + '𞤡' => '𞥃', +); diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php new file mode 100644 index 0000000..2a8f6e7 --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php @@ -0,0 +1,5 @@ +<?php + +// from Case_Ignorable in https://unicode.org/Public/UNIDATA/DerivedCoreProperties.txt + +return '/(?<![\x{0027}\x{002E}\x{003A}\x{005E}\x{0060}\x{00A8}\x{00AD}\x{00AF}\x{00B4}\x{00B7}\x{00B8}\x{02B0}-\x{02C1}\x{02C2}-\x{02C5}\x{02C6}-\x{02D1}\x{02D2}-\x{02DF}\x{02E0}-\x{02E4}\x{02E5}-\x{02EB}\x{02EC}\x{02ED}\x{02EE}\x{02EF}-\x{02FF}\x{0300}-\x{036F}\x{0374}\x{0375}\x{037A}\x{0384}-\x{0385}\x{0387}\x{0483}-\x{0487}\x{0488}-\x{0489}\x{0559}\x{0591}-\x{05BD}\x{05BF}\x{05C1}-\x{05C2}\x{05C4}-\x{05C5}\x{05C7}\x{05F4}\x{0600}-\x{0605}\x{0610}-\x{061A}\x{061C}\x{0640}\x{064B}-\x{065F}\x{0670}\x{06D6}-\x{06DC}\x{06DD}\x{06DF}-\x{06E4}\x{06E5}-\x{06E6}\x{06E7}-\x{06E8}\x{06EA}-\x{06ED}\x{070F}\x{0711}\x{0730}-\x{074A}\x{07A6}-\x{07B0}\x{07EB}-\x{07F3}\x{07F4}-\x{07F5}\x{07FA}\x{07FD}\x{0816}-\x{0819}\x{081A}\x{081B}-\x{0823}\x{0824}\x{0825}-\x{0827}\x{0828}\x{0829}-\x{082D}\x{0859}-\x{085B}\x{08D3}-\x{08E1}\x{08E2}\x{08E3}-\x{0902}\x{093A}\x{093C}\x{0941}-\x{0948}\x{094D}\x{0951}-\x{0957}\x{0962}-\x{0963}\x{0971}\x{0981}\x{09BC}\x{09C1}-\x{09C4}\x{09CD}\x{09E2}-\x{09E3}\x{09FE}\x{0A01}-\x{0A02}\x{0A3C}\x{0A41}-\x{0A42}\x{0A47}-\x{0A48}\x{0A4B}-\x{0A4D}\x{0A51}\x{0A70}-\x{0A71}\x{0A75}\x{0A81}-\x{0A82}\x{0ABC}\x{0AC1}-\x{0AC5}\x{0AC7}-\x{0AC8}\x{0ACD}\x{0AE2}-\x{0AE3}\x{0AFA}-\x{0AFF}\x{0B01}\x{0B3C}\x{0B3F}\x{0B41}-\x{0B44}\x{0B4D}\x{0B56}\x{0B62}-\x{0B63}\x{0B82}\x{0BC0}\x{0BCD}\x{0C00}\x{0C04}\x{0C3E}-\x{0C40}\x{0C46}-\x{0C48}\x{0C4A}-\x{0C4D}\x{0C55}-\x{0C56}\x{0C62}-\x{0C63}\x{0C81}\x{0CBC}\x{0CBF}\x{0CC6}\x{0CCC}-\x{0CCD}\x{0CE2}-\x{0CE3}\x{0D00}-\x{0D01}\x{0D3B}-\x{0D3C}\x{0D41}-\x{0D44}\x{0D4D}\x{0D62}-\x{0D63}\x{0DCA}\x{0DD2}-\x{0DD4}\x{0DD6}\x{0E31}\x{0E34}-\x{0E3A}\x{0E46}\x{0E47}-\x{0E4E}\x{0EB1}\x{0EB4}-\x{0EB9}\x{0EBB}-\x{0EBC}\x{0EC6}\x{0EC8}-\x{0ECD}\x{0F18}-\x{0F19}\x{0F35}\x{0F37}\x{0F39}\x{0F71}-\x{0F7E}\x{0F80}-\x{0F84}\x{0F86}-\x{0F87}\x{0F8D}-\x{0F97}\x{0F99}-\x{0FBC}\x{0FC6}\x{102D}-\x{1030}\x{1032}-\x{1037}\x{1039}-\x{103A}\x{103D}-\x{103E}\x{1058}-\x{1059}\x{105E}-\x{1060}\x{1071}-\x{1074}\x{1082}\x{1085}-\x{1086}\x{108D}\x{109D}\x{10FC}\x{135D}-\x{135F}\x{1712}-\x{1714}\x{1732}-\x{1734}\x{1752}-\x{1753}\x{1772}-\x{1773}\x{17B4}-\x{17B5}\x{17B7}-\x{17BD}\x{17C6}\x{17C9}-\x{17D3}\x{17D7}\x{17DD}\x{180B}-\x{180D}\x{180E}\x{1843}\x{1885}-\x{1886}\x{18A9}\x{1920}-\x{1922}\x{1927}-\x{1928}\x{1932}\x{1939}-\x{193B}\x{1A17}-\x{1A18}\x{1A1B}\x{1A56}\x{1A58}-\x{1A5E}\x{1A60}\x{1A62}\x{1A65}-\x{1A6C}\x{1A73}-\x{1A7C}\x{1A7F}\x{1AA7}\x{1AB0}-\x{1ABD}\x{1ABE}\x{1B00}-\x{1B03}\x{1B34}\x{1B36}-\x{1B3A}\x{1B3C}\x{1B42}\x{1B6B}-\x{1B73}\x{1B80}-\x{1B81}\x{1BA2}-\x{1BA5}\x{1BA8}-\x{1BA9}\x{1BAB}-\x{1BAD}\x{1BE6}\x{1BE8}-\x{1BE9}\x{1BED}\x{1BEF}-\x{1BF1}\x{1C2C}-\x{1C33}\x{1C36}-\x{1C37}\x{1C78}-\x{1C7D}\x{1CD0}-\x{1CD2}\x{1CD4}-\x{1CE0}\x{1CE2}-\x{1CE8}\x{1CED}\x{1CF4}\x{1CF8}-\x{1CF9}\x{1D2C}-\x{1D6A}\x{1D78}\x{1D9B}-\x{1DBF}\x{1DC0}-\x{1DF9}\x{1DFB}-\x{1DFF}\x{1FBD}\x{1FBF}-\x{1FC1}\x{1FCD}-\x{1FCF}\x{1FDD}-\x{1FDF}\x{1FED}-\x{1FEF}\x{1FFD}-\x{1FFE}\x{200B}-\x{200F}\x{2018}\x{2019}\x{2024}\x{2027}\x{202A}-\x{202E}\x{2060}-\x{2064}\x{2066}-\x{206F}\x{2071}\x{207F}\x{2090}-\x{209C}\x{20D0}-\x{20DC}\x{20DD}-\x{20E0}\x{20E1}\x{20E2}-\x{20E4}\x{20E5}-\x{20F0}\x{2C7C}-\x{2C7D}\x{2CEF}-\x{2CF1}\x{2D6F}\x{2D7F}\x{2DE0}-\x{2DFF}\x{2E2F}\x{3005}\x{302A}-\x{302D}\x{3031}-\x{3035}\x{303B}\x{3099}-\x{309A}\x{309B}-\x{309C}\x{309D}-\x{309E}\x{30FC}-\x{30FE}\x{A015}\x{A4F8}-\x{A4FD}\x{A60C}\x{A66F}\x{A670}-\x{A672}\x{A674}-\x{A67D}\x{A67F}\x{A69C}-\x{A69D}\x{A69E}-\x{A69F}\x{A6F0}-\x{A6F1}\x{A700}-\x{A716}\x{A717}-\x{A71F}\x{A720}-\x{A721}\x{A770}\x{A788}\x{A789}-\x{A78A}\x{A7F8}-\x{A7F9}\x{A802}\x{A806}\x{A80B}\x{A825}-\x{A826}\x{A8C4}-\x{A8C5}\x{A8E0}-\x{A8F1}\x{A8FF}\x{A926}-\x{A92D}\x{A947}-\x{A951}\x{A980}-\x{A982}\x{A9B3}\x{A9B6}-\x{A9B9}\x{A9BC}\x{A9CF}\x{A9E5}\x{A9E6}\x{AA29}-\x{AA2E}\x{AA31}-\x{AA32}\x{AA35}-\x{AA36}\x{AA43}\x{AA4C}\x{AA70}\x{AA7C}\x{AAB0}\x{AAB2}-\x{AAB4}\x{AAB7}-\x{AAB8}\x{AABE}-\x{AABF}\x{AAC1}\x{AADD}\x{AAEC}-\x{AAED}\x{AAF3}-\x{AAF4}\x{AAF6}\x{AB5B}\x{AB5C}-\x{AB5F}\x{ABE5}\x{ABE8}\x{ABED}\x{FB1E}\x{FBB2}-\x{FBC1}\x{FE00}-\x{FE0F}\x{FE13}\x{FE20}-\x{FE2F}\x{FE52}\x{FE55}\x{FEFF}\x{FF07}\x{FF0E}\x{FF1A}\x{FF3E}\x{FF40}\x{FF70}\x{FF9E}-\x{FF9F}\x{FFE3}\x{FFF9}-\x{FFFB}\x{101FD}\x{102E0}\x{10376}-\x{1037A}\x{10A01}-\x{10A03}\x{10A05}-\x{10A06}\x{10A0C}-\x{10A0F}\x{10A38}-\x{10A3A}\x{10A3F}\x{10AE5}-\x{10AE6}\x{10D24}-\x{10D27}\x{10F46}-\x{10F50}\x{11001}\x{11038}-\x{11046}\x{1107F}-\x{11081}\x{110B3}-\x{110B6}\x{110B9}-\x{110BA}\x{110BD}\x{110CD}\x{11100}-\x{11102}\x{11127}-\x{1112B}\x{1112D}-\x{11134}\x{11173}\x{11180}-\x{11181}\x{111B6}-\x{111BE}\x{111C9}-\x{111CC}\x{1122F}-\x{11231}\x{11234}\x{11236}-\x{11237}\x{1123E}\x{112DF}\x{112E3}-\x{112EA}\x{11300}-\x{11301}\x{1133B}-\x{1133C}\x{11340}\x{11366}-\x{1136C}\x{11370}-\x{11374}\x{11438}-\x{1143F}\x{11442}-\x{11444}\x{11446}\x{1145E}\x{114B3}-\x{114B8}\x{114BA}\x{114BF}-\x{114C0}\x{114C2}-\x{114C3}\x{115B2}-\x{115B5}\x{115BC}-\x{115BD}\x{115BF}-\x{115C0}\x{115DC}-\x{115DD}\x{11633}-\x{1163A}\x{1163D}\x{1163F}-\x{11640}\x{116AB}\x{116AD}\x{116B0}-\x{116B5}\x{116B7}\x{1171D}-\x{1171F}\x{11722}-\x{11725}\x{11727}-\x{1172B}\x{1182F}-\x{11837}\x{11839}-\x{1183A}\x{11A01}-\x{11A0A}\x{11A33}-\x{11A38}\x{11A3B}-\x{11A3E}\x{11A47}\x{11A51}-\x{11A56}\x{11A59}-\x{11A5B}\x{11A8A}-\x{11A96}\x{11A98}-\x{11A99}\x{11C30}-\x{11C36}\x{11C38}-\x{11C3D}\x{11C3F}\x{11C92}-\x{11CA7}\x{11CAA}-\x{11CB0}\x{11CB2}-\x{11CB3}\x{11CB5}-\x{11CB6}\x{11D31}-\x{11D36}\x{11D3A}\x{11D3C}-\x{11D3D}\x{11D3F}-\x{11D45}\x{11D47}\x{11D90}-\x{11D91}\x{11D95}\x{11D97}\x{11EF3}-\x{11EF4}\x{16AF0}-\x{16AF4}\x{16B30}-\x{16B36}\x{16B40}-\x{16B43}\x{16F8F}-\x{16F92}\x{16F93}-\x{16F9F}\x{16FE0}-\x{16FE1}\x{1BC9D}-\x{1BC9E}\x{1BCA0}-\x{1BCA3}\x{1D167}-\x{1D169}\x{1D173}-\x{1D17A}\x{1D17B}-\x{1D182}\x{1D185}-\x{1D18B}\x{1D1AA}-\x{1D1AD}\x{1D242}-\x{1D244}\x{1DA00}-\x{1DA36}\x{1DA3B}-\x{1DA6C}\x{1DA75}\x{1DA84}\x{1DA9B}-\x{1DA9F}\x{1DAA1}-\x{1DAAF}\x{1E000}-\x{1E006}\x{1E008}-\x{1E018}\x{1E01B}-\x{1E021}\x{1E023}-\x{1E024}\x{1E026}-\x{1E02A}\x{1E8D0}-\x{1E8D6}\x{1E944}-\x{1E94A}\x{1F3FB}-\x{1F3FF}\x{E0001}\x{E0020}-\x{E007F}\x{E0100}-\x{E01EF}])(\pL)(\pL*+)/u'; diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php new file mode 100644 index 0000000..56b9cb8 --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php @@ -0,0 +1,1489 @@ +<?php + +return array ( + 'a' => 'A', + 'b' => 'B', + 'c' => 'C', + 'd' => 'D', + 'e' => 'E', + 'f' => 'F', + 'g' => 'G', + 'h' => 'H', + 'i' => 'I', + 'j' => 'J', + 'k' => 'K', + 'l' => 'L', + 'm' => 'M', + 'n' => 'N', + 'o' => 'O', + 'p' => 'P', + 'q' => 'Q', + 'r' => 'R', + 's' => 'S', + 't' => 'T', + 'u' => 'U', + 'v' => 'V', + 'w' => 'W', + 'x' => 'X', + 'y' => 'Y', + 'z' => 'Z', + 'µ' => 'Μ', + 'à' => 'À', + 'á' => 'Á', + 'â' => 'Â', + 'ã' => 'Ã', + 'ä' => 'Ä', + 'å' => 'Å', + 'æ' => 'Æ', + 'ç' => 'Ç', + 'è' => 'È', + 'é' => 'É', + 'ê' => 'Ê', + 'ë' => 'Ë', + 'ì' => 'Ì', + 'í' => 'Í', + 'î' => 'Î', + 'ï' => 'Ï', + 'ð' => 'Ð', + 'ñ' => 'Ñ', + 'ò' => 'Ò', + 'ó' => 'Ó', + 'ô' => 'Ô', + 'õ' => 'Õ', + 'ö' => 'Ö', + 'ø' => 'Ø', + 'ù' => 'Ù', + 'ú' => 'Ú', + 'û' => 'Û', + 'ü' => 'Ü', + 'ý' => 'Ý', + 'þ' => 'Þ', + 'ÿ' => 'Ÿ', + 'ā' => 'Ā', + 'ă' => 'Ă', + 'ą' => 'Ą', + 'ć' => 'Ć', + 'ĉ' => 'Ĉ', + 'ċ' => 'Ċ', + 'č' => 'Č', + 'ď' => 'Ď', + 'đ' => 'Đ', + 'ē' => 'Ē', + 'ĕ' => 'Ĕ', + 'ė' => 'Ė', + 'ę' => 'Ę', + 'ě' => 'Ě', + 'ĝ' => 'Ĝ', + 'ğ' => 'Ğ', + 'ġ' => 'Ġ', + 'ģ' => 'Ģ', + 'ĥ' => 'Ĥ', + 'ħ' => 'Ħ', + 'ĩ' => 'Ĩ', + 'ī' => 'Ī', + 'ĭ' => 'Ĭ', + 'į' => 'Į', + 'ı' => 'I', + 'ij' => 'IJ', + 'ĵ' => 'Ĵ', + 'ķ' => 'Ķ', + 'ĺ' => 'Ĺ', + 'ļ' => 'Ļ', + 'ľ' => 'Ľ', + 'ŀ' => 'Ŀ', + 'ł' => 'Ł', + 'ń' => 'Ń', + 'ņ' => 'Ņ', + 'ň' => 'Ň', + 'ŋ' => 'Ŋ', + 'ō' => 'Ō', + 'ŏ' => 'Ŏ', + 'ő' => 'Ő', + 'œ' => 'Œ', + 'ŕ' => 'Ŕ', + 'ŗ' => 'Ŗ', + 'ř' => 'Ř', + 'ś' => 'Ś', + 'ŝ' => 'Ŝ', + 'ş' => 'Ş', + 'š' => 'Š', + 'ţ' => 'Ţ', + 'ť' => 'Ť', + 'ŧ' => 'Ŧ', + 'ũ' => 'Ũ', + 'ū' => 'Ū', + 'ŭ' => 'Ŭ', + 'ů' => 'Ů', + 'ű' => 'Ű', + 'ų' => 'Ų', + 'ŵ' => 'Ŵ', + 'ŷ' => 'Ŷ', + 'ź' => 'Ź', + 'ż' => 'Ż', + 'ž' => 'Ž', + 'ſ' => 'S', + 'ƀ' => 'Ƀ', + 'ƃ' => 'Ƃ', + 'ƅ' => 'Ƅ', + 'ƈ' => 'Ƈ', + 'ƌ' => 'Ƌ', + 'ƒ' => 'Ƒ', + 'ƕ' => 'Ƕ', + 'ƙ' => 'Ƙ', + 'ƚ' => 'Ƚ', + 'ƞ' => 'Ƞ', + 'ơ' => 'Ơ', + 'ƣ' => 'Ƣ', + 'ƥ' => 'Ƥ', + 'ƨ' => 'Ƨ', + 'ƭ' => 'Ƭ', + 'ư' => 'Ư', + 'ƴ' => 'Ƴ', + 'ƶ' => 'Ƶ', + 'ƹ' => 'Ƹ', + 'ƽ' => 'Ƽ', + 'ƿ' => 'Ƿ', + 'Dž' => 'DŽ', + 'dž' => 'DŽ', + 'Lj' => 'LJ', + 'lj' => 'LJ', + 'Nj' => 'NJ', + 'nj' => 'NJ', + 'ǎ' => 'Ǎ', + 'ǐ' => 'Ǐ', + 'ǒ' => 'Ǒ', + 'ǔ' => 'Ǔ', + 'ǖ' => 'Ǖ', + 'ǘ' => 'Ǘ', + 'ǚ' => 'Ǚ', + 'ǜ' => 'Ǜ', + 'ǝ' => 'Ǝ', + 'ǟ' => 'Ǟ', + 'ǡ' => 'Ǡ', + 'ǣ' => 'Ǣ', + 'ǥ' => 'Ǥ', + 'ǧ' => 'Ǧ', + 'ǩ' => 'Ǩ', + 'ǫ' => 'Ǫ', + 'ǭ' => 'Ǭ', + 'ǯ' => 'Ǯ', + 'Dz' => 'DZ', + 'dz' => 'DZ', + 'ǵ' => 'Ǵ', + 'ǹ' => 'Ǹ', + 'ǻ' => 'Ǻ', + 'ǽ' => 'Ǽ', + 'ǿ' => 'Ǿ', + 'ȁ' => 'Ȁ', + 'ȃ' => 'Ȃ', + 'ȅ' => 'Ȅ', + 'ȇ' => 'Ȇ', + 'ȉ' => 'Ȉ', + 'ȋ' => 'Ȋ', + 'ȍ' => 'Ȍ', + 'ȏ' => 'Ȏ', + 'ȑ' => 'Ȑ', + 'ȓ' => 'Ȓ', + 'ȕ' => 'Ȕ', + 'ȗ' => 'Ȗ', + 'ș' => 'Ș', + 'ț' => 'Ț', + 'ȝ' => 'Ȝ', + 'ȟ' => 'Ȟ', + 'ȣ' => 'Ȣ', + 'ȥ' => 'Ȥ', + 'ȧ' => 'Ȧ', + 'ȩ' => 'Ȩ', + 'ȫ' => 'Ȫ', + 'ȭ' => 'Ȭ', + 'ȯ' => 'Ȯ', + 'ȱ' => 'Ȱ', + 'ȳ' => 'Ȳ', + 'ȼ' => 'Ȼ', + 'ȿ' => 'Ȿ', + 'ɀ' => 'Ɀ', + 'ɂ' => 'Ɂ', + 'ɇ' => 'Ɇ', + 'ɉ' => 'Ɉ', + 'ɋ' => 'Ɋ', + 'ɍ' => 'Ɍ', + 'ɏ' => 'Ɏ', + 'ɐ' => 'Ɐ', + 'ɑ' => 'Ɑ', + 'ɒ' => 'Ɒ', + 'ɓ' => 'Ɓ', + 'ɔ' => 'Ɔ', + 'ɖ' => 'Ɖ', + 'ɗ' => 'Ɗ', + 'ə' => 'Ə', + 'ɛ' => 'Ɛ', + 'ɜ' => 'Ɜ', + 'ɠ' => 'Ɠ', + 'ɡ' => 'Ɡ', + 'ɣ' => 'Ɣ', + 'ɥ' => 'Ɥ', + 'ɦ' => 'Ɦ', + 'ɨ' => 'Ɨ', + 'ɩ' => 'Ɩ', + 'ɪ' => 'Ɪ', + 'ɫ' => 'Ɫ', + 'ɬ' => 'Ɬ', + 'ɯ' => 'Ɯ', + 'ɱ' => 'Ɱ', + 'ɲ' => 'Ɲ', + 'ɵ' => 'Ɵ', + 'ɽ' => 'Ɽ', + 'ʀ' => 'Ʀ', + 'ʂ' => 'Ʂ', + 'ʃ' => 'Ʃ', + 'ʇ' => 'Ʇ', + 'ʈ' => 'Ʈ', + 'ʉ' => 'Ʉ', + 'ʊ' => 'Ʊ', + 'ʋ' => 'Ʋ', + 'ʌ' => 'Ʌ', + 'ʒ' => 'Ʒ', + 'ʝ' => 'Ʝ', + 'ʞ' => 'Ʞ', + 'ͅ' => 'Ι', + 'ͱ' => 'Ͱ', + 'ͳ' => 'Ͳ', + 'ͷ' => 'Ͷ', + 'ͻ' => 'Ͻ', + 'ͼ' => 'Ͼ', + 'ͽ' => 'Ͽ', + 'ά' => 'Ά', + 'έ' => 'Έ', + 'ή' => 'Ή', + 'ί' => 'Ί', + 'α' => 'Α', + 'β' => 'Β', + 'γ' => 'Γ', + 'δ' => 'Δ', + 'ε' => 'Ε', + 'ζ' => 'Ζ', + 'η' => 'Η', + 'θ' => 'Θ', + 'ι' => 'Ι', + 'κ' => 'Κ', + 'λ' => 'Λ', + 'μ' => 'Μ', + 'ν' => 'Ν', + 'ξ' => 'Ξ', + 'ο' => 'Ο', + 'π' => 'Π', + 'ρ' => 'Ρ', + 'ς' => 'Σ', + 'σ' => 'Σ', + 'τ' => 'Τ', + 'υ' => 'Υ', + 'φ' => 'Φ', + 'χ' => 'Χ', + 'ψ' => 'Ψ', + 'ω' => 'Ω', + 'ϊ' => 'Ϊ', + 'ϋ' => 'Ϋ', + 'ό' => 'Ό', + 'ύ' => 'Ύ', + 'ώ' => 'Ώ', + 'ϐ' => 'Β', + 'ϑ' => 'Θ', + 'ϕ' => 'Φ', + 'ϖ' => 'Π', + 'ϗ' => 'Ϗ', + 'ϙ' => 'Ϙ', + 'ϛ' => 'Ϛ', + 'ϝ' => 'Ϝ', + 'ϟ' => 'Ϟ', + 'ϡ' => 'Ϡ', + 'ϣ' => 'Ϣ', + 'ϥ' => 'Ϥ', + 'ϧ' => 'Ϧ', + 'ϩ' => 'Ϩ', + 'ϫ' => 'Ϫ', + 'ϭ' => 'Ϭ', + 'ϯ' => 'Ϯ', + 'ϰ' => 'Κ', + 'ϱ' => 'Ρ', + 'ϲ' => 'Ϲ', + 'ϳ' => 'Ϳ', + 'ϵ' => 'Ε', + 'ϸ' => 'Ϸ', + 'ϻ' => 'Ϻ', + 'а' => 'А', + 'б' => 'Б', + 'в' => 'В', + 'г' => 'Г', + 'д' => 'Д', + 'е' => 'Е', + 'ж' => 'Ж', + 'з' => 'З', + 'и' => 'И', + 'й' => 'Й', + 'к' => 'К', + 'л' => 'Л', + 'м' => 'М', + 'н' => 'Н', + 'о' => 'О', + 'п' => 'П', + 'р' => 'Р', + 'с' => 'С', + 'т' => 'Т', + 'у' => 'У', + 'ф' => 'Ф', + 'х' => 'Х', + 'ц' => 'Ц', + 'ч' => 'Ч', + 'ш' => 'Ш', + 'щ' => 'Щ', + 'ъ' => 'Ъ', + 'ы' => 'Ы', + 'ь' => 'Ь', + 'э' => 'Э', + 'ю' => 'Ю', + 'я' => 'Я', + 'ѐ' => 'Ѐ', + 'ё' => 'Ё', + 'ђ' => 'Ђ', + 'ѓ' => 'Ѓ', + 'є' => 'Є', + 'ѕ' => 'Ѕ', + 'і' => 'І', + 'ї' => 'Ї', + 'ј' => 'Ј', + 'љ' => 'Љ', + 'њ' => 'Њ', + 'ћ' => 'Ћ', + 'ќ' => 'Ќ', + 'ѝ' => 'Ѝ', + 'ў' => 'Ў', + 'џ' => 'Џ', + 'ѡ' => 'Ѡ', + 'ѣ' => 'Ѣ', + 'ѥ' => 'Ѥ', + 'ѧ' => 'Ѧ', + 'ѩ' => 'Ѩ', + 'ѫ' => 'Ѫ', + 'ѭ' => 'Ѭ', + 'ѯ' => 'Ѯ', + 'ѱ' => 'Ѱ', + 'ѳ' => 'Ѳ', + 'ѵ' => 'Ѵ', + 'ѷ' => 'Ѷ', + 'ѹ' => 'Ѹ', + 'ѻ' => 'Ѻ', + 'ѽ' => 'Ѽ', + 'ѿ' => 'Ѿ', + 'ҁ' => 'Ҁ', + 'ҋ' => 'Ҋ', + 'ҍ' => 'Ҍ', + 'ҏ' => 'Ҏ', + 'ґ' => 'Ґ', + 'ғ' => 'Ғ', + 'ҕ' => 'Ҕ', + 'җ' => 'Җ', + 'ҙ' => 'Ҙ', + 'қ' => 'Қ', + 'ҝ' => 'Ҝ', + 'ҟ' => 'Ҟ', + 'ҡ' => 'Ҡ', + 'ң' => 'Ң', + 'ҥ' => 'Ҥ', + 'ҧ' => 'Ҧ', + 'ҩ' => 'Ҩ', + 'ҫ' => 'Ҫ', + 'ҭ' => 'Ҭ', + 'ү' => 'Ү', + 'ұ' => 'Ұ', + 'ҳ' => 'Ҳ', + 'ҵ' => 'Ҵ', + 'ҷ' => 'Ҷ', + 'ҹ' => 'Ҹ', + 'һ' => 'Һ', + 'ҽ' => 'Ҽ', + 'ҿ' => 'Ҿ', + 'ӂ' => 'Ӂ', + 'ӄ' => 'Ӄ', + 'ӆ' => 'Ӆ', + 'ӈ' => 'Ӈ', + 'ӊ' => 'Ӊ', + 'ӌ' => 'Ӌ', + 'ӎ' => 'Ӎ', + 'ӏ' => 'Ӏ', + 'ӑ' => 'Ӑ', + 'ӓ' => 'Ӓ', + 'ӕ' => 'Ӕ', + 'ӗ' => 'Ӗ', + 'ә' => 'Ә', + 'ӛ' => 'Ӛ', + 'ӝ' => 'Ӝ', + 'ӟ' => 'Ӟ', + 'ӡ' => 'Ӡ', + 'ӣ' => 'Ӣ', + 'ӥ' => 'Ӥ', + 'ӧ' => 'Ӧ', + 'ө' => 'Ө', + 'ӫ' => 'Ӫ', + 'ӭ' => 'Ӭ', + 'ӯ' => 'Ӯ', + 'ӱ' => 'Ӱ', + 'ӳ' => 'Ӳ', + 'ӵ' => 'Ӵ', + 'ӷ' => 'Ӷ', + 'ӹ' => 'Ӹ', + 'ӻ' => 'Ӻ', + 'ӽ' => 'Ӽ', + 'ӿ' => 'Ӿ', + 'ԁ' => 'Ԁ', + 'ԃ' => 'Ԃ', + 'ԅ' => 'Ԅ', + 'ԇ' => 'Ԇ', + 'ԉ' => 'Ԉ', + 'ԋ' => 'Ԋ', + 'ԍ' => 'Ԍ', + 'ԏ' => 'Ԏ', + 'ԑ' => 'Ԑ', + 'ԓ' => 'Ԓ', + 'ԕ' => 'Ԕ', + 'ԗ' => 'Ԗ', + 'ԙ' => 'Ԙ', + 'ԛ' => 'Ԛ', + 'ԝ' => 'Ԝ', + 'ԟ' => 'Ԟ', + 'ԡ' => 'Ԡ', + 'ԣ' => 'Ԣ', + 'ԥ' => 'Ԥ', + 'ԧ' => 'Ԧ', + 'ԩ' => 'Ԩ', + 'ԫ' => 'Ԫ', + 'ԭ' => 'Ԭ', + 'ԯ' => 'Ԯ', + 'ա' => 'Ա', + 'բ' => 'Բ', + 'գ' => 'Գ', + 'դ' => 'Դ', + 'ե' => 'Ե', + 'զ' => 'Զ', + 'է' => 'Է', + 'ը' => 'Ը', + 'թ' => 'Թ', + 'ժ' => 'Ժ', + 'ի' => 'Ի', + 'լ' => 'Լ', + 'խ' => 'Խ', + 'ծ' => 'Ծ', + 'կ' => 'Կ', + 'հ' => 'Հ', + 'ձ' => 'Ձ', + 'ղ' => 'Ղ', + 'ճ' => 'Ճ', + 'մ' => 'Մ', + 'յ' => 'Յ', + 'ն' => 'Ն', + 'շ' => 'Շ', + 'ո' => 'Ո', + 'չ' => 'Չ', + 'պ' => 'Պ', + 'ջ' => 'Ջ', + 'ռ' => 'Ռ', + 'ս' => 'Ս', + 'վ' => 'Վ', + 'տ' => 'Տ', + 'ր' => 'Ր', + 'ց' => 'Ց', + 'ւ' => 'Ւ', + 'փ' => 'Փ', + 'ք' => 'Ք', + 'օ' => 'Օ', + 'ֆ' => 'Ֆ', + 'ა' => 'Ა', + 'ბ' => 'Ბ', + 'გ' => 'Გ', + 'დ' => 'Დ', + 'ე' => 'Ე', + 'ვ' => 'Ვ', + 'ზ' => 'Ზ', + 'თ' => 'Თ', + 'ი' => 'Ი', + 'კ' => 'Კ', + 'ლ' => 'Ლ', + 'მ' => 'Მ', + 'ნ' => 'Ნ', + 'ო' => 'Ო', + 'პ' => 'Პ', + 'ჟ' => 'Ჟ', + 'რ' => 'Რ', + 'ს' => 'Ს', + 'ტ' => 'Ტ', + 'უ' => 'Უ', + 'ფ' => 'Ფ', + 'ქ' => 'Ქ', + 'ღ' => 'Ღ', + 'ყ' => 'Ყ', + 'შ' => 'Შ', + 'ჩ' => 'Ჩ', + 'ც' => 'Ც', + 'ძ' => 'Ძ', + 'წ' => 'Წ', + 'ჭ' => 'Ჭ', + 'ხ' => 'Ხ', + 'ჯ' => 'Ჯ', + 'ჰ' => 'Ჰ', + 'ჱ' => 'Ჱ', + 'ჲ' => 'Ჲ', + 'ჳ' => 'Ჳ', + 'ჴ' => 'Ჴ', + 'ჵ' => 'Ჵ', + 'ჶ' => 'Ჶ', + 'ჷ' => 'Ჷ', + 'ჸ' => 'Ჸ', + 'ჹ' => 'Ჹ', + 'ჺ' => 'Ჺ', + 'ჽ' => 'Ჽ', + 'ჾ' => 'Ჾ', + 'ჿ' => 'Ჿ', + 'ᏸ' => 'Ᏸ', + 'ᏹ' => 'Ᏹ', + 'ᏺ' => 'Ᏺ', + 'ᏻ' => 'Ᏻ', + 'ᏼ' => 'Ᏼ', + 'ᏽ' => 'Ᏽ', + 'ᲀ' => 'В', + 'ᲁ' => 'Д', + 'ᲂ' => 'О', + 'ᲃ' => 'С', + 'ᲄ' => 'Т', + 'ᲅ' => 'Т', + 'ᲆ' => 'Ъ', + 'ᲇ' => 'Ѣ', + 'ᲈ' => 'Ꙋ', + 'ᵹ' => 'Ᵹ', + 'ᵽ' => 'Ᵽ', + 'ᶎ' => 'Ᶎ', + 'ḁ' => 'Ḁ', + 'ḃ' => 'Ḃ', + 'ḅ' => 'Ḅ', + 'ḇ' => 'Ḇ', + 'ḉ' => 'Ḉ', + 'ḋ' => 'Ḋ', + 'ḍ' => 'Ḍ', + 'ḏ' => 'Ḏ', + 'ḑ' => 'Ḑ', + 'ḓ' => 'Ḓ', + 'ḕ' => 'Ḕ', + 'ḗ' => 'Ḗ', + 'ḙ' => 'Ḙ', + 'ḛ' => 'Ḛ', + 'ḝ' => 'Ḝ', + 'ḟ' => 'Ḟ', + 'ḡ' => 'Ḡ', + 'ḣ' => 'Ḣ', + 'ḥ' => 'Ḥ', + 'ḧ' => 'Ḧ', + 'ḩ' => 'Ḩ', + 'ḫ' => 'Ḫ', + 'ḭ' => 'Ḭ', + 'ḯ' => 'Ḯ', + 'ḱ' => 'Ḱ', + 'ḳ' => 'Ḳ', + 'ḵ' => 'Ḵ', + 'ḷ' => 'Ḷ', + 'ḹ' => 'Ḹ', + 'ḻ' => 'Ḻ', + 'ḽ' => 'Ḽ', + 'ḿ' => 'Ḿ', + 'ṁ' => 'Ṁ', + 'ṃ' => 'Ṃ', + 'ṅ' => 'Ṅ', + 'ṇ' => 'Ṇ', + 'ṉ' => 'Ṉ', + 'ṋ' => 'Ṋ', + 'ṍ' => 'Ṍ', + 'ṏ' => 'Ṏ', + 'ṑ' => 'Ṑ', + 'ṓ' => 'Ṓ', + 'ṕ' => 'Ṕ', + 'ṗ' => 'Ṗ', + 'ṙ' => 'Ṙ', + 'ṛ' => 'Ṛ', + 'ṝ' => 'Ṝ', + 'ṟ' => 'Ṟ', + 'ṡ' => 'Ṡ', + 'ṣ' => 'Ṣ', + 'ṥ' => 'Ṥ', + 'ṧ' => 'Ṧ', + 'ṩ' => 'Ṩ', + 'ṫ' => 'Ṫ', + 'ṭ' => 'Ṭ', + 'ṯ' => 'Ṯ', + 'ṱ' => 'Ṱ', + 'ṳ' => 'Ṳ', + 'ṵ' => 'Ṵ', + 'ṷ' => 'Ṷ', + 'ṹ' => 'Ṹ', + 'ṻ' => 'Ṻ', + 'ṽ' => 'Ṽ', + 'ṿ' => 'Ṿ', + 'ẁ' => 'Ẁ', + 'ẃ' => 'Ẃ', + 'ẅ' => 'Ẅ', + 'ẇ' => 'Ẇ', + 'ẉ' => 'Ẉ', + 'ẋ' => 'Ẋ', + 'ẍ' => 'Ẍ', + 'ẏ' => 'Ẏ', + 'ẑ' => 'Ẑ', + 'ẓ' => 'Ẓ', + 'ẕ' => 'Ẕ', + 'ẛ' => 'Ṡ', + 'ạ' => 'Ạ', + 'ả' => 'Ả', + 'ấ' => 'Ấ', + 'ầ' => 'Ầ', + 'ẩ' => 'Ẩ', + 'ẫ' => 'Ẫ', + 'ậ' => 'Ậ', + 'ắ' => 'Ắ', + 'ằ' => 'Ằ', + 'ẳ' => 'Ẳ', + 'ẵ' => 'Ẵ', + 'ặ' => 'Ặ', + 'ẹ' => 'Ẹ', + 'ẻ' => 'Ẻ', + 'ẽ' => 'Ẽ', + 'ế' => 'Ế', + 'ề' => 'Ề', + 'ể' => 'Ể', + 'ễ' => 'Ễ', + 'ệ' => 'Ệ', + 'ỉ' => 'Ỉ', + 'ị' => 'Ị', + 'ọ' => 'Ọ', + 'ỏ' => 'Ỏ', + 'ố' => 'Ố', + 'ồ' => 'Ồ', + 'ổ' => 'Ổ', + 'ỗ' => 'Ỗ', + 'ộ' => 'Ộ', + 'ớ' => 'Ớ', + 'ờ' => 'Ờ', + 'ở' => 'Ở', + 'ỡ' => 'Ỡ', + 'ợ' => 'Ợ', + 'ụ' => 'Ụ', + 'ủ' => 'Ủ', + 'ứ' => 'Ứ', + 'ừ' => 'Ừ', + 'ử' => 'Ử', + 'ữ' => 'Ữ', + 'ự' => 'Ự', + 'ỳ' => 'Ỳ', + 'ỵ' => 'Ỵ', + 'ỷ' => 'Ỷ', + 'ỹ' => 'Ỹ', + 'ỻ' => 'Ỻ', + 'ỽ' => 'Ỽ', + 'ỿ' => 'Ỿ', + 'ἀ' => 'Ἀ', + 'ἁ' => 'Ἁ', + 'ἂ' => 'Ἂ', + 'ἃ' => 'Ἃ', + 'ἄ' => 'Ἄ', + 'ἅ' => 'Ἅ', + 'ἆ' => 'Ἆ', + 'ἇ' => 'Ἇ', + 'ἐ' => 'Ἐ', + 'ἑ' => 'Ἑ', + 'ἒ' => 'Ἒ', + 'ἓ' => 'Ἓ', + 'ἔ' => 'Ἔ', + 'ἕ' => 'Ἕ', + 'ἠ' => 'Ἠ', + 'ἡ' => 'Ἡ', + 'ἢ' => 'Ἢ', + 'ἣ' => 'Ἣ', + 'ἤ' => 'Ἤ', + 'ἥ' => 'Ἥ', + 'ἦ' => 'Ἦ', + 'ἧ' => 'Ἧ', + 'ἰ' => 'Ἰ', + 'ἱ' => 'Ἱ', + 'ἲ' => 'Ἲ', + 'ἳ' => 'Ἳ', + 'ἴ' => 'Ἴ', + 'ἵ' => 'Ἵ', + 'ἶ' => 'Ἶ', + 'ἷ' => 'Ἷ', + 'ὀ' => 'Ὀ', + 'ὁ' => 'Ὁ', + 'ὂ' => 'Ὂ', + 'ὃ' => 'Ὃ', + 'ὄ' => 'Ὄ', + 'ὅ' => 'Ὅ', + 'ὑ' => 'Ὑ', + 'ὓ' => 'Ὓ', + 'ὕ' => 'Ὕ', + 'ὗ' => 'Ὗ', + 'ὠ' => 'Ὠ', + 'ὡ' => 'Ὡ', + 'ὢ' => 'Ὢ', + 'ὣ' => 'Ὣ', + 'ὤ' => 'Ὤ', + 'ὥ' => 'Ὥ', + 'ὦ' => 'Ὦ', + 'ὧ' => 'Ὧ', + 'ὰ' => 'Ὰ', + 'ά' => 'Ά', + 'ὲ' => 'Ὲ', + 'έ' => 'Έ', + 'ὴ' => 'Ὴ', + 'ή' => 'Ή', + 'ὶ' => 'Ὶ', + 'ί' => 'Ί', + 'ὸ' => 'Ὸ', + 'ό' => 'Ό', + 'ὺ' => 'Ὺ', + 'ύ' => 'Ύ', + 'ὼ' => 'Ὼ', + 'ώ' => 'Ώ', + 'ᾀ' => 'ἈΙ', + 'ᾁ' => 'ἉΙ', + 'ᾂ' => 'ἊΙ', + 'ᾃ' => 'ἋΙ', + 'ᾄ' => 'ἌΙ', + 'ᾅ' => 'ἍΙ', + 'ᾆ' => 'ἎΙ', + 'ᾇ' => 'ἏΙ', + 'ᾐ' => 'ἨΙ', + 'ᾑ' => 'ἩΙ', + 'ᾒ' => 'ἪΙ', + 'ᾓ' => 'ἫΙ', + 'ᾔ' => 'ἬΙ', + 'ᾕ' => 'ἭΙ', + 'ᾖ' => 'ἮΙ', + 'ᾗ' => 'ἯΙ', + 'ᾠ' => 'ὨΙ', + 'ᾡ' => 'ὩΙ', + 'ᾢ' => 'ὪΙ', + 'ᾣ' => 'ὫΙ', + 'ᾤ' => 'ὬΙ', + 'ᾥ' => 'ὭΙ', + 'ᾦ' => 'ὮΙ', + 'ᾧ' => 'ὯΙ', + 'ᾰ' => 'Ᾰ', + 'ᾱ' => 'Ᾱ', + 'ᾳ' => 'ΑΙ', + 'ι' => 'Ι', + 'ῃ' => 'ΗΙ', + 'ῐ' => 'Ῐ', + 'ῑ' => 'Ῑ', + 'ῠ' => 'Ῠ', + 'ῡ' => 'Ῡ', + 'ῥ' => 'Ῥ', + 'ῳ' => 'ΩΙ', + 'ⅎ' => 'Ⅎ', + 'ⅰ' => 'Ⅰ', + 'ⅱ' => 'Ⅱ', + 'ⅲ' => 'Ⅲ', + 'ⅳ' => 'Ⅳ', + 'ⅴ' => 'Ⅴ', + 'ⅵ' => 'Ⅵ', + 'ⅶ' => 'Ⅶ', + 'ⅷ' => 'Ⅷ', + 'ⅸ' => 'Ⅸ', + 'ⅹ' => 'Ⅹ', + 'ⅺ' => 'Ⅺ', + 'ⅻ' => 'Ⅻ', + 'ⅼ' => 'Ⅼ', + 'ⅽ' => 'Ⅽ', + 'ⅾ' => 'Ⅾ', + 'ⅿ' => 'Ⅿ', + 'ↄ' => 'Ↄ', + 'ⓐ' => 'Ⓐ', + 'ⓑ' => 'Ⓑ', + 'ⓒ' => 'Ⓒ', + 'ⓓ' => 'Ⓓ', + 'ⓔ' => 'Ⓔ', + 'ⓕ' => 'Ⓕ', + 'ⓖ' => 'Ⓖ', + 'ⓗ' => 'Ⓗ', + 'ⓘ' => 'Ⓘ', + 'ⓙ' => 'Ⓙ', + 'ⓚ' => 'Ⓚ', + 'ⓛ' => 'Ⓛ', + 'ⓜ' => 'Ⓜ', + 'ⓝ' => 'Ⓝ', + 'ⓞ' => 'Ⓞ', + 'ⓟ' => 'Ⓟ', + 'ⓠ' => 'Ⓠ', + 'ⓡ' => 'Ⓡ', + 'ⓢ' => 'Ⓢ', + 'ⓣ' => 'Ⓣ', + 'ⓤ' => 'Ⓤ', + 'ⓥ' => 'Ⓥ', + 'ⓦ' => 'Ⓦ', + 'ⓧ' => 'Ⓧ', + 'ⓨ' => 'Ⓨ', + 'ⓩ' => 'Ⓩ', + 'ⰰ' => 'Ⰰ', + 'ⰱ' => 'Ⰱ', + 'ⰲ' => 'Ⰲ', + 'ⰳ' => 'Ⰳ', + 'ⰴ' => 'Ⰴ', + 'ⰵ' => 'Ⰵ', + 'ⰶ' => 'Ⰶ', + 'ⰷ' => 'Ⰷ', + 'ⰸ' => 'Ⰸ', + 'ⰹ' => 'Ⰹ', + 'ⰺ' => 'Ⰺ', + 'ⰻ' => 'Ⰻ', + 'ⰼ' => 'Ⰼ', + 'ⰽ' => 'Ⰽ', + 'ⰾ' => 'Ⰾ', + 'ⰿ' => 'Ⰿ', + 'ⱀ' => 'Ⱀ', + 'ⱁ' => 'Ⱁ', + 'ⱂ' => 'Ⱂ', + 'ⱃ' => 'Ⱃ', + 'ⱄ' => 'Ⱄ', + 'ⱅ' => 'Ⱅ', + 'ⱆ' => 'Ⱆ', + 'ⱇ' => 'Ⱇ', + 'ⱈ' => 'Ⱈ', + 'ⱉ' => 'Ⱉ', + 'ⱊ' => 'Ⱊ', + 'ⱋ' => 'Ⱋ', + 'ⱌ' => 'Ⱌ', + 'ⱍ' => 'Ⱍ', + 'ⱎ' => 'Ⱎ', + 'ⱏ' => 'Ⱏ', + 'ⱐ' => 'Ⱐ', + 'ⱑ' => 'Ⱑ', + 'ⱒ' => 'Ⱒ', + 'ⱓ' => 'Ⱓ', + 'ⱔ' => 'Ⱔ', + 'ⱕ' => 'Ⱕ', + 'ⱖ' => 'Ⱖ', + 'ⱗ' => 'Ⱗ', + 'ⱘ' => 'Ⱘ', + 'ⱙ' => 'Ⱙ', + 'ⱚ' => 'Ⱚ', + 'ⱛ' => 'Ⱛ', + 'ⱜ' => 'Ⱜ', + 'ⱝ' => 'Ⱝ', + 'ⱞ' => 'Ⱞ', + 'ⱡ' => 'Ⱡ', + 'ⱥ' => 'Ⱥ', + 'ⱦ' => 'Ⱦ', + 'ⱨ' => 'Ⱨ', + 'ⱪ' => 'Ⱪ', + 'ⱬ' => 'Ⱬ', + 'ⱳ' => 'Ⱳ', + 'ⱶ' => 'Ⱶ', + 'ⲁ' => 'Ⲁ', + 'ⲃ' => 'Ⲃ', + 'ⲅ' => 'Ⲅ', + 'ⲇ' => 'Ⲇ', + 'ⲉ' => 'Ⲉ', + 'ⲋ' => 'Ⲋ', + 'ⲍ' => 'Ⲍ', + 'ⲏ' => 'Ⲏ', + 'ⲑ' => 'Ⲑ', + 'ⲓ' => 'Ⲓ', + 'ⲕ' => 'Ⲕ', + 'ⲗ' => 'Ⲗ', + 'ⲙ' => 'Ⲙ', + 'ⲛ' => 'Ⲛ', + 'ⲝ' => 'Ⲝ', + 'ⲟ' => 'Ⲟ', + 'ⲡ' => 'Ⲡ', + 'ⲣ' => 'Ⲣ', + 'ⲥ' => 'Ⲥ', + 'ⲧ' => 'Ⲧ', + 'ⲩ' => 'Ⲩ', + 'ⲫ' => 'Ⲫ', + 'ⲭ' => 'Ⲭ', + 'ⲯ' => 'Ⲯ', + 'ⲱ' => 'Ⲱ', + 'ⲳ' => 'Ⲳ', + 'ⲵ' => 'Ⲵ', + 'ⲷ' => 'Ⲷ', + 'ⲹ' => 'Ⲹ', + 'ⲻ' => 'Ⲻ', + 'ⲽ' => 'Ⲽ', + 'ⲿ' => 'Ⲿ', + 'ⳁ' => 'Ⳁ', + 'ⳃ' => 'Ⳃ', + 'ⳅ' => 'Ⳅ', + 'ⳇ' => 'Ⳇ', + 'ⳉ' => 'Ⳉ', + 'ⳋ' => 'Ⳋ', + 'ⳍ' => 'Ⳍ', + 'ⳏ' => 'Ⳏ', + 'ⳑ' => 'Ⳑ', + 'ⳓ' => 'Ⳓ', + 'ⳕ' => 'Ⳕ', + 'ⳗ' => 'Ⳗ', + 'ⳙ' => 'Ⳙ', + 'ⳛ' => 'Ⳛ', + 'ⳝ' => 'Ⳝ', + 'ⳟ' => 'Ⳟ', + 'ⳡ' => 'Ⳡ', + 'ⳣ' => 'Ⳣ', + 'ⳬ' => 'Ⳬ', + 'ⳮ' => 'Ⳮ', + 'ⳳ' => 'Ⳳ', + 'ⴀ' => 'Ⴀ', + 'ⴁ' => 'Ⴁ', + 'ⴂ' => 'Ⴂ', + 'ⴃ' => 'Ⴃ', + 'ⴄ' => 'Ⴄ', + 'ⴅ' => 'Ⴅ', + 'ⴆ' => 'Ⴆ', + 'ⴇ' => 'Ⴇ', + 'ⴈ' => 'Ⴈ', + 'ⴉ' => 'Ⴉ', + 'ⴊ' => 'Ⴊ', + 'ⴋ' => 'Ⴋ', + 'ⴌ' => 'Ⴌ', + 'ⴍ' => 'Ⴍ', + 'ⴎ' => 'Ⴎ', + 'ⴏ' => 'Ⴏ', + 'ⴐ' => 'Ⴐ', + 'ⴑ' => 'Ⴑ', + 'ⴒ' => 'Ⴒ', + 'ⴓ' => 'Ⴓ', + 'ⴔ' => 'Ⴔ', + 'ⴕ' => 'Ⴕ', + 'ⴖ' => 'Ⴖ', + 'ⴗ' => 'Ⴗ', + 'ⴘ' => 'Ⴘ', + 'ⴙ' => 'Ⴙ', + 'ⴚ' => 'Ⴚ', + 'ⴛ' => 'Ⴛ', + 'ⴜ' => 'Ⴜ', + 'ⴝ' => 'Ⴝ', + 'ⴞ' => 'Ⴞ', + 'ⴟ' => 'Ⴟ', + 'ⴠ' => 'Ⴠ', + 'ⴡ' => 'Ⴡ', + 'ⴢ' => 'Ⴢ', + 'ⴣ' => 'Ⴣ', + 'ⴤ' => 'Ⴤ', + 'ⴥ' => 'Ⴥ', + 'ⴧ' => 'Ⴧ', + 'ⴭ' => 'Ⴭ', + 'ꙁ' => 'Ꙁ', + 'ꙃ' => 'Ꙃ', + 'ꙅ' => 'Ꙅ', + 'ꙇ' => 'Ꙇ', + 'ꙉ' => 'Ꙉ', + 'ꙋ' => 'Ꙋ', + 'ꙍ' => 'Ꙍ', + 'ꙏ' => 'Ꙏ', + 'ꙑ' => 'Ꙑ', + 'ꙓ' => 'Ꙓ', + 'ꙕ' => 'Ꙕ', + 'ꙗ' => 'Ꙗ', + 'ꙙ' => 'Ꙙ', + 'ꙛ' => 'Ꙛ', + 'ꙝ' => 'Ꙝ', + 'ꙟ' => 'Ꙟ', + 'ꙡ' => 'Ꙡ', + 'ꙣ' => 'Ꙣ', + 'ꙥ' => 'Ꙥ', + 'ꙧ' => 'Ꙧ', + 'ꙩ' => 'Ꙩ', + 'ꙫ' => 'Ꙫ', + 'ꙭ' => 'Ꙭ', + 'ꚁ' => 'Ꚁ', + 'ꚃ' => 'Ꚃ', + 'ꚅ' => 'Ꚅ', + 'ꚇ' => 'Ꚇ', + 'ꚉ' => 'Ꚉ', + 'ꚋ' => 'Ꚋ', + 'ꚍ' => 'Ꚍ', + 'ꚏ' => 'Ꚏ', + 'ꚑ' => 'Ꚑ', + 'ꚓ' => 'Ꚓ', + 'ꚕ' => 'Ꚕ', + 'ꚗ' => 'Ꚗ', + 'ꚙ' => 'Ꚙ', + 'ꚛ' => 'Ꚛ', + 'ꜣ' => 'Ꜣ', + 'ꜥ' => 'Ꜥ', + 'ꜧ' => 'Ꜧ', + 'ꜩ' => 'Ꜩ', + 'ꜫ' => 'Ꜫ', + 'ꜭ' => 'Ꜭ', + 'ꜯ' => 'Ꜯ', + 'ꜳ' => 'Ꜳ', + 'ꜵ' => 'Ꜵ', + 'ꜷ' => 'Ꜷ', + 'ꜹ' => 'Ꜹ', + 'ꜻ' => 'Ꜻ', + 'ꜽ' => 'Ꜽ', + 'ꜿ' => 'Ꜿ', + 'ꝁ' => 'Ꝁ', + 'ꝃ' => 'Ꝃ', + 'ꝅ' => 'Ꝅ', + 'ꝇ' => 'Ꝇ', + 'ꝉ' => 'Ꝉ', + 'ꝋ' => 'Ꝋ', + 'ꝍ' => 'Ꝍ', + 'ꝏ' => 'Ꝏ', + 'ꝑ' => 'Ꝑ', + 'ꝓ' => 'Ꝓ', + 'ꝕ' => 'Ꝕ', + 'ꝗ' => 'Ꝗ', + 'ꝙ' => 'Ꝙ', + 'ꝛ' => 'Ꝛ', + 'ꝝ' => 'Ꝝ', + 'ꝟ' => 'Ꝟ', + 'ꝡ' => 'Ꝡ', + 'ꝣ' => 'Ꝣ', + 'ꝥ' => 'Ꝥ', + 'ꝧ' => 'Ꝧ', + 'ꝩ' => 'Ꝩ', + 'ꝫ' => 'Ꝫ', + 'ꝭ' => 'Ꝭ', + 'ꝯ' => 'Ꝯ', + 'ꝺ' => 'Ꝺ', + 'ꝼ' => 'Ꝼ', + 'ꝿ' => 'Ꝿ', + 'ꞁ' => 'Ꞁ', + 'ꞃ' => 'Ꞃ', + 'ꞅ' => 'Ꞅ', + 'ꞇ' => 'Ꞇ', + 'ꞌ' => 'Ꞌ', + 'ꞑ' => 'Ꞑ', + 'ꞓ' => 'Ꞓ', + 'ꞔ' => 'Ꞔ', + 'ꞗ' => 'Ꞗ', + 'ꞙ' => 'Ꞙ', + 'ꞛ' => 'Ꞛ', + 'ꞝ' => 'Ꞝ', + 'ꞟ' => 'Ꞟ', + 'ꞡ' => 'Ꞡ', + 'ꞣ' => 'Ꞣ', + 'ꞥ' => 'Ꞥ', + 'ꞧ' => 'Ꞧ', + 'ꞩ' => 'Ꞩ', + 'ꞵ' => 'Ꞵ', + 'ꞷ' => 'Ꞷ', + 'ꞹ' => 'Ꞹ', + 'ꞻ' => 'Ꞻ', + 'ꞽ' => 'Ꞽ', + 'ꞿ' => 'Ꞿ', + 'ꟃ' => 'Ꟃ', + 'ꟈ' => 'Ꟈ', + 'ꟊ' => 'Ꟊ', + 'ꟶ' => 'Ꟶ', + 'ꭓ' => 'Ꭓ', + 'ꭰ' => 'Ꭰ', + 'ꭱ' => 'Ꭱ', + 'ꭲ' => 'Ꭲ', + 'ꭳ' => 'Ꭳ', + 'ꭴ' => 'Ꭴ', + 'ꭵ' => 'Ꭵ', + 'ꭶ' => 'Ꭶ', + 'ꭷ' => 'Ꭷ', + 'ꭸ' => 'Ꭸ', + 'ꭹ' => 'Ꭹ', + 'ꭺ' => 'Ꭺ', + 'ꭻ' => 'Ꭻ', + 'ꭼ' => 'Ꭼ', + 'ꭽ' => 'Ꭽ', + 'ꭾ' => 'Ꭾ', + 'ꭿ' => 'Ꭿ', + 'ꮀ' => 'Ꮀ', + 'ꮁ' => 'Ꮁ', + 'ꮂ' => 'Ꮂ', + 'ꮃ' => 'Ꮃ', + 'ꮄ' => 'Ꮄ', + 'ꮅ' => 'Ꮅ', + 'ꮆ' => 'Ꮆ', + 'ꮇ' => 'Ꮇ', + 'ꮈ' => 'Ꮈ', + 'ꮉ' => 'Ꮉ', + 'ꮊ' => 'Ꮊ', + 'ꮋ' => 'Ꮋ', + 'ꮌ' => 'Ꮌ', + 'ꮍ' => 'Ꮍ', + 'ꮎ' => 'Ꮎ', + 'ꮏ' => 'Ꮏ', + 'ꮐ' => 'Ꮐ', + 'ꮑ' => 'Ꮑ', + 'ꮒ' => 'Ꮒ', + 'ꮓ' => 'Ꮓ', + 'ꮔ' => 'Ꮔ', + 'ꮕ' => 'Ꮕ', + 'ꮖ' => 'Ꮖ', + 'ꮗ' => 'Ꮗ', + 'ꮘ' => 'Ꮘ', + 'ꮙ' => 'Ꮙ', + 'ꮚ' => 'Ꮚ', + 'ꮛ' => 'Ꮛ', + 'ꮜ' => 'Ꮜ', + 'ꮝ' => 'Ꮝ', + 'ꮞ' => 'Ꮞ', + 'ꮟ' => 'Ꮟ', + 'ꮠ' => 'Ꮠ', + 'ꮡ' => 'Ꮡ', + 'ꮢ' => 'Ꮢ', + 'ꮣ' => 'Ꮣ', + 'ꮤ' => 'Ꮤ', + 'ꮥ' => 'Ꮥ', + 'ꮦ' => 'Ꮦ', + 'ꮧ' => 'Ꮧ', + 'ꮨ' => 'Ꮨ', + 'ꮩ' => 'Ꮩ', + 'ꮪ' => 'Ꮪ', + 'ꮫ' => 'Ꮫ', + 'ꮬ' => 'Ꮬ', + 'ꮭ' => 'Ꮭ', + 'ꮮ' => 'Ꮮ', + 'ꮯ' => 'Ꮯ', + 'ꮰ' => 'Ꮰ', + 'ꮱ' => 'Ꮱ', + 'ꮲ' => 'Ꮲ', + 'ꮳ' => 'Ꮳ', + 'ꮴ' => 'Ꮴ', + 'ꮵ' => 'Ꮵ', + 'ꮶ' => 'Ꮶ', + 'ꮷ' => 'Ꮷ', + 'ꮸ' => 'Ꮸ', + 'ꮹ' => 'Ꮹ', + 'ꮺ' => 'Ꮺ', + 'ꮻ' => 'Ꮻ', + 'ꮼ' => 'Ꮼ', + 'ꮽ' => 'Ꮽ', + 'ꮾ' => 'Ꮾ', + 'ꮿ' => 'Ꮿ', + 'a' => 'A', + 'b' => 'B', + 'c' => 'C', + 'd' => 'D', + 'e' => 'E', + 'f' => 'F', + 'g' => 'G', + 'h' => 'H', + 'i' => 'I', + 'j' => 'J', + 'k' => 'K', + 'l' => 'L', + 'm' => 'M', + 'n' => 'N', + 'o' => 'O', + 'p' => 'P', + 'q' => 'Q', + 'r' => 'R', + 's' => 'S', + 't' => 'T', + 'u' => 'U', + 'v' => 'V', + 'w' => 'W', + 'x' => 'X', + 'y' => 'Y', + 'z' => 'Z', + '𐐨' => '𐐀', + '𐐩' => '𐐁', + '𐐪' => '𐐂', + '𐐫' => '𐐃', + '𐐬' => '𐐄', + '𐐭' => '𐐅', + '𐐮' => '𐐆', + '𐐯' => '𐐇', + '𐐰' => '𐐈', + '𐐱' => '𐐉', + '𐐲' => '𐐊', + '𐐳' => '𐐋', + '𐐴' => '𐐌', + '𐐵' => '𐐍', + '𐐶' => '𐐎', + '𐐷' => '𐐏', + '𐐸' => '𐐐', + '𐐹' => '𐐑', + '𐐺' => '𐐒', + '𐐻' => '𐐓', + '𐐼' => '𐐔', + '𐐽' => '𐐕', + '𐐾' => '𐐖', + '𐐿' => '𐐗', + '𐑀' => '𐐘', + '𐑁' => '𐐙', + '𐑂' => '𐐚', + '𐑃' => '𐐛', + '𐑄' => '𐐜', + '𐑅' => '𐐝', + '𐑆' => '𐐞', + '𐑇' => '𐐟', + '𐑈' => '𐐠', + '𐑉' => '𐐡', + '𐑊' => '𐐢', + '𐑋' => '𐐣', + '𐑌' => '𐐤', + '𐑍' => '𐐥', + '𐑎' => '𐐦', + '𐑏' => '𐐧', + '𐓘' => '𐒰', + '𐓙' => '𐒱', + '𐓚' => '𐒲', + '𐓛' => '𐒳', + '𐓜' => '𐒴', + '𐓝' => '𐒵', + '𐓞' => '𐒶', + '𐓟' => '𐒷', + '𐓠' => '𐒸', + '𐓡' => '𐒹', + '𐓢' => '𐒺', + '𐓣' => '𐒻', + '𐓤' => '𐒼', + '𐓥' => '𐒽', + '𐓦' => '𐒾', + '𐓧' => '𐒿', + '𐓨' => '𐓀', + '𐓩' => '𐓁', + '𐓪' => '𐓂', + '𐓫' => '𐓃', + '𐓬' => '𐓄', + '𐓭' => '𐓅', + '𐓮' => '𐓆', + '𐓯' => '𐓇', + '𐓰' => '𐓈', + '𐓱' => '𐓉', + '𐓲' => '𐓊', + '𐓳' => '𐓋', + '𐓴' => '𐓌', + '𐓵' => '𐓍', + '𐓶' => '𐓎', + '𐓷' => '𐓏', + '𐓸' => '𐓐', + '𐓹' => '𐓑', + '𐓺' => '𐓒', + '𐓻' => '𐓓', + '𐳀' => '𐲀', + '𐳁' => '𐲁', + '𐳂' => '𐲂', + '𐳃' => '𐲃', + '𐳄' => '𐲄', + '𐳅' => '𐲅', + '𐳆' => '𐲆', + '𐳇' => '𐲇', + '𐳈' => '𐲈', + '𐳉' => '𐲉', + '𐳊' => '𐲊', + '𐳋' => '𐲋', + '𐳌' => '𐲌', + '𐳍' => '𐲍', + '𐳎' => '𐲎', + '𐳏' => '𐲏', + '𐳐' => '𐲐', + '𐳑' => '𐲑', + '𐳒' => '𐲒', + '𐳓' => '𐲓', + '𐳔' => '𐲔', + '𐳕' => '𐲕', + '𐳖' => '𐲖', + '𐳗' => '𐲗', + '𐳘' => '𐲘', + '𐳙' => '𐲙', + '𐳚' => '𐲚', + '𐳛' => '𐲛', + '𐳜' => '𐲜', + '𐳝' => '𐲝', + '𐳞' => '𐲞', + '𐳟' => '𐲟', + '𐳠' => '𐲠', + '𐳡' => '𐲡', + '𐳢' => '𐲢', + '𐳣' => '𐲣', + '𐳤' => '𐲤', + '𐳥' => '𐲥', + '𐳦' => '𐲦', + '𐳧' => '𐲧', + '𐳨' => '𐲨', + '𐳩' => '𐲩', + '𐳪' => '𐲪', + '𐳫' => '𐲫', + '𐳬' => '𐲬', + '𐳭' => '𐲭', + '𐳮' => '𐲮', + '𐳯' => '𐲯', + '𐳰' => '𐲰', + '𐳱' => '𐲱', + '𐳲' => '𐲲', + '𑣀' => '𑢠', + '𑣁' => '𑢡', + '𑣂' => '𑢢', + '𑣃' => '𑢣', + '𑣄' => '𑢤', + '𑣅' => '𑢥', + '𑣆' => '𑢦', + '𑣇' => '𑢧', + '𑣈' => '𑢨', + '𑣉' => '𑢩', + '𑣊' => '𑢪', + '𑣋' => '𑢫', + '𑣌' => '𑢬', + '𑣍' => '𑢭', + '𑣎' => '𑢮', + '𑣏' => '𑢯', + '𑣐' => '𑢰', + '𑣑' => '𑢱', + '𑣒' => '𑢲', + '𑣓' => '𑢳', + '𑣔' => '𑢴', + '𑣕' => '𑢵', + '𑣖' => '𑢶', + '𑣗' => '𑢷', + '𑣘' => '𑢸', + '𑣙' => '𑢹', + '𑣚' => '𑢺', + '𑣛' => '𑢻', + '𑣜' => '𑢼', + '𑣝' => '𑢽', + '𑣞' => '𑢾', + '𑣟' => '𑢿', + '𖹠' => '𖹀', + '𖹡' => '𖹁', + '𖹢' => '𖹂', + '𖹣' => '𖹃', + '𖹤' => '𖹄', + '𖹥' => '𖹅', + '𖹦' => '𖹆', + '𖹧' => '𖹇', + '𖹨' => '𖹈', + '𖹩' => '𖹉', + '𖹪' => '𖹊', + '𖹫' => '𖹋', + '𖹬' => '𖹌', + '𖹭' => '𖹍', + '𖹮' => '𖹎', + '𖹯' => '𖹏', + '𖹰' => '𖹐', + '𖹱' => '𖹑', + '𖹲' => '𖹒', + '𖹳' => '𖹓', + '𖹴' => '𖹔', + '𖹵' => '𖹕', + '𖹶' => '𖹖', + '𖹷' => '𖹗', + '𖹸' => '𖹘', + '𖹹' => '𖹙', + '𖹺' => '𖹚', + '𖹻' => '𖹛', + '𖹼' => '𖹜', + '𖹽' => '𖹝', + '𖹾' => '𖹞', + '𖹿' => '𖹟', + '𞤢' => '𞤀', + '𞤣' => '𞤁', + '𞤤' => '𞤂', + '𞤥' => '𞤃', + '𞤦' => '𞤄', + '𞤧' => '𞤅', + '𞤨' => '𞤆', + '𞤩' => '𞤇', + '𞤪' => '𞤈', + '𞤫' => '𞤉', + '𞤬' => '𞤊', + '𞤭' => '𞤋', + '𞤮' => '𞤌', + '𞤯' => '𞤍', + '𞤰' => '𞤎', + '𞤱' => '𞤏', + '𞤲' => '𞤐', + '𞤳' => '𞤑', + '𞤴' => '𞤒', + '𞤵' => '𞤓', + '𞤶' => '𞤔', + '𞤷' => '𞤕', + '𞤸' => '𞤖', + '𞤹' => '𞤗', + '𞤺' => '𞤘', + '𞤻' => '𞤙', + '𞤼' => '𞤚', + '𞤽' => '𞤛', + '𞤾' => '𞤜', + '𞤿' => '𞤝', + '𞥀' => '𞤞', + '𞥁' => '𞤟', + '𞥂' => '𞤠', + '𞥃' => '𞤡', + 'ß' => 'SS', + 'ff' => 'FF', + 'fi' => 'FI', + 'fl' => 'FL', + 'ffi' => 'FFI', + 'ffl' => 'FFL', + 'ſt' => 'ST', + 'st' => 'ST', + 'և' => 'ԵՒ', + 'ﬓ' => 'ՄՆ', + 'ﬔ' => 'ՄԵ', + 'ﬕ' => 'ՄԻ', + 'ﬖ' => 'ՎՆ', + 'ﬗ' => 'ՄԽ', + 'ʼn' => 'ʼN', + 'ΐ' => 'Ϊ́', + 'ΰ' => 'Ϋ́', + 'ǰ' => 'J̌', + 'ẖ' => 'H̱', + 'ẗ' => 'T̈', + 'ẘ' => 'W̊', + 'ẙ' => 'Y̊', + 'ẚ' => 'Aʾ', + 'ὐ' => 'Υ̓', + 'ὒ' => 'Υ̓̀', + 'ὔ' => 'Υ̓́', + 'ὖ' => 'Υ̓͂', + 'ᾶ' => 'Α͂', + 'ῆ' => 'Η͂', + 'ῒ' => 'Ϊ̀', + 'ΐ' => 'Ϊ́', + 'ῖ' => 'Ι͂', + 'ῗ' => 'Ϊ͂', + 'ῢ' => 'Ϋ̀', + 'ΰ' => 'Ϋ́', + 'ῤ' => 'Ρ̓', + 'ῦ' => 'Υ͂', + 'ῧ' => 'Ϋ͂', + 'ῶ' => 'Ω͂', + 'ᾈ' => 'ἈΙ', + 'ᾉ' => 'ἉΙ', + 'ᾊ' => 'ἊΙ', + 'ᾋ' => 'ἋΙ', + 'ᾌ' => 'ἌΙ', + 'ᾍ' => 'ἍΙ', + 'ᾎ' => 'ἎΙ', + 'ᾏ' => 'ἏΙ', + 'ᾘ' => 'ἨΙ', + 'ᾙ' => 'ἩΙ', + 'ᾚ' => 'ἪΙ', + 'ᾛ' => 'ἫΙ', + 'ᾜ' => 'ἬΙ', + 'ᾝ' => 'ἭΙ', + 'ᾞ' => 'ἮΙ', + 'ᾟ' => 'ἯΙ', + 'ᾨ' => 'ὨΙ', + 'ᾩ' => 'ὩΙ', + 'ᾪ' => 'ὪΙ', + 'ᾫ' => 'ὫΙ', + 'ᾬ' => 'ὬΙ', + 'ᾭ' => 'ὭΙ', + 'ᾮ' => 'ὮΙ', + 'ᾯ' => 'ὯΙ', + 'ᾼ' => 'ΑΙ', + 'ῌ' => 'ΗΙ', + 'ῼ' => 'ΩΙ', + 'ᾲ' => 'ᾺΙ', + 'ᾴ' => 'ΆΙ', + 'ῂ' => 'ῊΙ', + 'ῄ' => 'ΉΙ', + 'ῲ' => 'ῺΙ', + 'ῴ' => 'ΏΙ', + 'ᾷ' => 'Α͂Ι', + 'ῇ' => 'Η͂Ι', + 'ῷ' => 'Ω͂Ι', +); diff --git a/vendor/symfony/polyfill-mbstring/bootstrap.php b/vendor/symfony/polyfill-mbstring/bootstrap.php new file mode 100644 index 0000000..1fedd1f --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/bootstrap.php @@ -0,0 +1,147 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Mbstring as p; + +if (\PHP_VERSION_ID >= 80000) { + return require __DIR__.'/bootstrap80.php'; +} + +if (!function_exists('mb_convert_encoding')) { + function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); } +} +if (!function_exists('mb_decode_mimeheader')) { + function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); } +} +if (!function_exists('mb_encode_mimeheader')) { + function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = "\r\n", $indent = 0) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); } +} +if (!function_exists('mb_decode_numericentity')) { + function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); } +} +if (!function_exists('mb_encode_numericentity')) { + function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); } +} +if (!function_exists('mb_convert_case')) { + function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); } +} +if (!function_exists('mb_internal_encoding')) { + function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); } +} +if (!function_exists('mb_language')) { + function mb_language($language = null) { return p\Mbstring::mb_language($language); } +} +if (!function_exists('mb_list_encodings')) { + function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); } +} +if (!function_exists('mb_encoding_aliases')) { + function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); } +} +if (!function_exists('mb_check_encoding')) { + function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); } +} +if (!function_exists('mb_detect_encoding')) { + function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); } +} +if (!function_exists('mb_detect_order')) { + function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); } +} +if (!function_exists('mb_parse_str')) { + function mb_parse_str($string, &$result = []) { parse_str($string, $result); return (bool) $result; } +} +if (!function_exists('mb_strlen')) { + function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); } +} +if (!function_exists('mb_strpos')) { + function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); } +} +if (!function_exists('mb_strtolower')) { + function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); } +} +if (!function_exists('mb_strtoupper')) { + function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); } +} +if (!function_exists('mb_substitute_character')) { + function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); } +} +if (!function_exists('mb_substr')) { + function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); } +} +if (!function_exists('mb_stripos')) { + function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); } +} +if (!function_exists('mb_stristr')) { + function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); } +} +if (!function_exists('mb_strrchr')) { + function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); } +} +if (!function_exists('mb_strrichr')) { + function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); } +} +if (!function_exists('mb_strripos')) { + function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); } +} +if (!function_exists('mb_strrpos')) { + function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); } +} +if (!function_exists('mb_strstr')) { + function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); } +} +if (!function_exists('mb_get_info')) { + function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); } +} +if (!function_exists('mb_http_output')) { + function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); } +} +if (!function_exists('mb_strwidth')) { + function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); } +} +if (!function_exists('mb_substr_count')) { + function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); } +} +if (!function_exists('mb_output_handler')) { + function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); } +} +if (!function_exists('mb_http_input')) { + function mb_http_input($type = null) { return p\Mbstring::mb_http_input($type); } +} + +if (!function_exists('mb_convert_variables')) { + function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); } +} + +if (!function_exists('mb_ord')) { + function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); } +} +if (!function_exists('mb_chr')) { + function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); } +} +if (!function_exists('mb_scrub')) { + function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); } +} +if (!function_exists('mb_str_split')) { + function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); } +} + +if (extension_loaded('mbstring')) { + return; +} + +if (!defined('MB_CASE_UPPER')) { + define('MB_CASE_UPPER', 0); +} +if (!defined('MB_CASE_LOWER')) { + define('MB_CASE_LOWER', 1); +} +if (!defined('MB_CASE_TITLE')) { + define('MB_CASE_TITLE', 2); +} diff --git a/vendor/symfony/polyfill-mbstring/bootstrap80.php b/vendor/symfony/polyfill-mbstring/bootstrap80.php new file mode 100644 index 0000000..82f5ac4 --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/bootstrap80.php @@ -0,0 +1,143 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Mbstring as p; + +if (!function_exists('mb_convert_encoding')) { + function mb_convert_encoding(array|string|null $string, ?string $to_encoding, array|string|null $from_encoding = null): array|string|false { return p\Mbstring::mb_convert_encoding($string ?? '', (string) $to_encoding, $from_encoding); } +} +if (!function_exists('mb_decode_mimeheader')) { + function mb_decode_mimeheader(?string $string): string { return p\Mbstring::mb_decode_mimeheader((string) $string); } +} +if (!function_exists('mb_encode_mimeheader')) { + function mb_encode_mimeheader(?string $string, ?string $charset = null, ?string $transfer_encoding = null, ?string $newline = "\r\n", ?int $indent = 0): string { return p\Mbstring::mb_encode_mimeheader((string) $string, $charset, $transfer_encoding, (string) $newline, (int) $indent); } +} +if (!function_exists('mb_decode_numericentity')) { + function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null): string { return p\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); } +} +if (!function_exists('mb_encode_numericentity')) { + function mb_encode_numericentity(?string $string, array $map, ?string $encoding = null, ?bool $hex = false): string { return p\Mbstring::mb_encode_numericentity((string) $string, $map, $encoding, (bool) $hex); } +} +if (!function_exists('mb_convert_case')) { + function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null): string { return p\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); } +} +if (!function_exists('mb_internal_encoding')) { + function mb_internal_encoding(?string $encoding = null): string|bool { return p\Mbstring::mb_internal_encoding($encoding); } +} +if (!function_exists('mb_language')) { + function mb_language(?string $language = null): string|bool { return p\Mbstring::mb_language($language); } +} +if (!function_exists('mb_list_encodings')) { + function mb_list_encodings(): array { return p\Mbstring::mb_list_encodings(); } +} +if (!function_exists('mb_encoding_aliases')) { + function mb_encoding_aliases(?string $encoding): array { return p\Mbstring::mb_encoding_aliases((string) $encoding); } +} +if (!function_exists('mb_check_encoding')) { + function mb_check_encoding(array|string|null $value = null, ?string $encoding = null): bool { return p\Mbstring::mb_check_encoding($value, $encoding); } +} +if (!function_exists('mb_detect_encoding')) { + function mb_detect_encoding(?string $string, array|string|null $encodings = null, ?bool $strict = false): string|false { return p\Mbstring::mb_detect_encoding((string) $string, $encodings, (bool) $strict); } +} +if (!function_exists('mb_detect_order')) { + function mb_detect_order(array|string|null $encoding = null): array|bool { return p\Mbstring::mb_detect_order($encoding); } +} +if (!function_exists('mb_parse_str')) { + function mb_parse_str(?string $string, &$result = []): bool { parse_str((string) $string, $result); return (bool) $result; } +} +if (!function_exists('mb_strlen')) { + function mb_strlen(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strlen((string) $string, $encoding); } +} +if (!function_exists('mb_strpos')) { + function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } +} +if (!function_exists('mb_strtolower')) { + function mb_strtolower(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtolower((string) $string, $encoding); } +} +if (!function_exists('mb_strtoupper')) { + function mb_strtoupper(?string $string, ?string $encoding = null): string { return p\Mbstring::mb_strtoupper((string) $string, $encoding); } +} +if (!function_exists('mb_substitute_character')) { + function mb_substitute_character(string|int|null $substitute_character = null): string|int|bool { return p\Mbstring::mb_substitute_character($substitute_character); } +} +if (!function_exists('mb_substr')) { + function mb_substr(?string $string, ?int $start, ?int $length = null, ?string $encoding = null): string { return p\Mbstring::mb_substr((string) $string, (int) $start, $length, $encoding); } +} +if (!function_exists('mb_stripos')) { + function mb_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_stripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } +} +if (!function_exists('mb_stristr')) { + function mb_stristr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_stristr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } +} +if (!function_exists('mb_strrchr')) { + function mb_strrchr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrchr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } +} +if (!function_exists('mb_strrichr')) { + function mb_strrichr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strrichr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } +} +if (!function_exists('mb_strripos')) { + function mb_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strripos((string) $haystack, (string) $needle, (int) $offset, $encoding); } +} +if (!function_exists('mb_strrpos')) { + function mb_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null): int|false { return p\Mbstring::mb_strrpos((string) $haystack, (string) $needle, (int) $offset, $encoding); } +} +if (!function_exists('mb_strstr')) { + function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = false, ?string $encoding = null): string|false { return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); } +} +if (!function_exists('mb_get_info')) { + function mb_get_info(?string $type = 'all'): array|string|int|false { return p\Mbstring::mb_get_info((string) $type); } +} +if (!function_exists('mb_http_output')) { + function mb_http_output(?string $encoding = null): string|bool { return p\Mbstring::mb_http_output($encoding); } +} +if (!function_exists('mb_strwidth')) { + function mb_strwidth(?string $string, ?string $encoding = null): int { return p\Mbstring::mb_strwidth((string) $string, $encoding); } +} +if (!function_exists('mb_substr_count')) { + function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null): int { return p\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); } +} +if (!function_exists('mb_output_handler')) { + function mb_output_handler(?string $string, ?int $status): string { return p\Mbstring::mb_output_handler((string) $string, (int) $status); } +} +if (!function_exists('mb_http_input')) { + function mb_http_input(?string $type = null): array|string|false { return p\Mbstring::mb_http_input($type); } +} + +if (!function_exists('mb_convert_variables')) { + function mb_convert_variables(?string $to_encoding, array|string|null $from_encoding, mixed &$var, mixed &...$vars): string|false { return p\Mbstring::mb_convert_variables((string) $to_encoding, $from_encoding ?? '', $var, ...$vars); } +} + +if (!function_exists('mb_ord')) { + function mb_ord(?string $string, ?string $encoding = null): int|false { return p\Mbstring::mb_ord((string) $string, $encoding); } +} +if (!function_exists('mb_chr')) { + function mb_chr(?int $codepoint, ?string $encoding = null): string|false { return p\Mbstring::mb_chr((int) $codepoint, $encoding); } +} +if (!function_exists('mb_scrub')) { + function mb_scrub(?string $string, ?string $encoding = null): string { $encoding ??= mb_internal_encoding(); return mb_convert_encoding((string) $string, $encoding, $encoding); } +} +if (!function_exists('mb_str_split')) { + function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null): array { return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); } +} + +if (extension_loaded('mbstring')) { + return; +} + +if (!defined('MB_CASE_UPPER')) { + define('MB_CASE_UPPER', 0); +} +if (!defined('MB_CASE_LOWER')) { + define('MB_CASE_LOWER', 1); +} +if (!defined('MB_CASE_TITLE')) { + define('MB_CASE_TITLE', 2); +} diff --git a/vendor/symfony/polyfill-mbstring/composer.json b/vendor/symfony/polyfill-mbstring/composer.json new file mode 100644 index 0000000..4489553 --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/composer.json @@ -0,0 +1,41 @@ +{ + "name": "symfony/polyfill-mbstring", + "type": "library", + "description": "Symfony polyfill for the Mbstring extension", + "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" }, + "files": [ "bootstrap.php" ] + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/vendor/symfony/polyfill-php80/LICENSE b/vendor/symfony/polyfill-php80/LICENSE new file mode 100644 index 0000000..5593b1d --- /dev/null +++ b/vendor/symfony/polyfill-php80/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2020 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/vendor/symfony/polyfill-php80/Php80.php b/vendor/symfony/polyfill-php80/Php80.php new file mode 100644 index 0000000..362dd1a --- /dev/null +++ b/vendor/symfony/polyfill-php80/Php80.php @@ -0,0 +1,115 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Php80; + +/** + * @author Ion Bazan <ion.bazan@gmail.com> + * @author Nico Oelgart <nicoswd@gmail.com> + * @author Nicolas Grekas <p@tchwork.com> + * + * @internal + */ +final class Php80 +{ + public static function fdiv(float $dividend, float $divisor): float + { + return @($dividend / $divisor); + } + + public static function get_debug_type($value): string + { + switch (true) { + case null === $value: return 'null'; + case \is_bool($value): return 'bool'; + case \is_string($value): return 'string'; + case \is_array($value): return 'array'; + case \is_int($value): return 'int'; + case \is_float($value): return 'float'; + case \is_object($value): break; + case $value instanceof \__PHP_Incomplete_Class: return '__PHP_Incomplete_Class'; + default: + if (null === $type = @get_resource_type($value)) { + return 'unknown'; + } + + if ('Unknown' === $type) { + $type = 'closed'; + } + + return "resource ($type)"; + } + + $class = \get_class($value); + + if (false === strpos($class, '@')) { + return $class; + } + + return (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous'; + } + + public static function get_resource_id($res): int + { + if (!\is_resource($res) && null === @get_resource_type($res)) { + throw new \TypeError(sprintf('Argument 1 passed to get_resource_id() must be of the type resource, %s given', get_debug_type($res))); + } + + return (int) $res; + } + + public static function preg_last_error_msg(): string + { + switch (preg_last_error()) { + case \PREG_INTERNAL_ERROR: + return 'Internal error'; + case \PREG_BAD_UTF8_ERROR: + return 'Malformed UTF-8 characters, possibly incorrectly encoded'; + case \PREG_BAD_UTF8_OFFSET_ERROR: + return 'The offset did not correspond to the beginning of a valid UTF-8 code point'; + case \PREG_BACKTRACK_LIMIT_ERROR: + return 'Backtrack limit exhausted'; + case \PREG_RECURSION_LIMIT_ERROR: + return 'Recursion limit exhausted'; + case \PREG_JIT_STACKLIMIT_ERROR: + return 'JIT stack limit exhausted'; + case \PREG_NO_ERROR: + return 'No error'; + default: + return 'Unknown error'; + } + } + + public static function str_contains(string $haystack, string $needle): bool + { + return '' === $needle || false !== strpos($haystack, $needle); + } + + public static function str_starts_with(string $haystack, string $needle): bool + { + return 0 === strncmp($haystack, $needle, \strlen($needle)); + } + + public static function str_ends_with(string $haystack, string $needle): bool + { + if ('' === $needle || $needle === $haystack) { + return true; + } + + if ('' === $haystack) { + return false; + } + + $needleLength = \strlen($needle); + + return $needleLength <= \strlen($haystack) && 0 === substr_compare($haystack, $needle, -$needleLength); + } +} diff --git a/vendor/symfony/polyfill-php80/PhpToken.php b/vendor/symfony/polyfill-php80/PhpToken.php new file mode 100644 index 0000000..fe6e691 --- /dev/null +++ b/vendor/symfony/polyfill-php80/PhpToken.php @@ -0,0 +1,103 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Php80; + +/** + * @author Fedonyuk Anton <info@ensostudio.ru> + * + * @internal + */ +class PhpToken implements \Stringable +{ + /** + * @var int + */ + public $id; + + /** + * @var string + */ + public $text; + + /** + * @var int + */ + public $line; + + /** + * @var int + */ + public $pos; + + public function __construct(int $id, string $text, int $line = -1, int $position = -1) + { + $this->id = $id; + $this->text = $text; + $this->line = $line; + $this->pos = $position; + } + + public function getTokenName(): ?string + { + if ('UNKNOWN' === $name = token_name($this->id)) { + $name = \strlen($this->text) > 1 || \ord($this->text) < 32 ? null : $this->text; + } + + return $name; + } + + /** + * @param int|string|array $kind + */ + public function is($kind): bool + { + foreach ((array) $kind as $value) { + if (\in_array($value, [$this->id, $this->text], true)) { + return true; + } + } + + return false; + } + + public function isIgnorable(): bool + { + return \in_array($this->id, [\T_WHITESPACE, \T_COMMENT, \T_DOC_COMMENT, \T_OPEN_TAG], true); + } + + public function __toString(): string + { + return (string) $this->text; + } + + /** + * @return static[] + */ + public static function tokenize(string $code, int $flags = 0): array + { + $line = 1; + $position = 0; + $tokens = token_get_all($code, $flags); + foreach ($tokens as $index => $token) { + if (\is_string($token)) { + $id = \ord($token); + $text = $token; + } else { + [$id, $text, $line] = $token; + } + $tokens[$index] = new static($id, $text, $line, $position); + $position += \strlen($text); + } + + return $tokens; + } +} diff --git a/vendor/symfony/polyfill-php80/README.md b/vendor/symfony/polyfill-php80/README.md new file mode 100644 index 0000000..3816c55 --- /dev/null +++ b/vendor/symfony/polyfill-php80/README.md @@ -0,0 +1,25 @@ +Symfony Polyfill / Php80 +======================== + +This component provides features added to PHP 8.0 core: + +- [`Stringable`](https://php.net/stringable) interface +- [`fdiv`](https://php.net/fdiv) +- [`ValueError`](https://php.net/valueerror) class +- [`UnhandledMatchError`](https://php.net/unhandledmatcherror) class +- `FILTER_VALIDATE_BOOL` constant +- [`get_debug_type`](https://php.net/get_debug_type) +- [`PhpToken`](https://php.net/phptoken) class +- [`preg_last_error_msg`](https://php.net/preg_last_error_msg) +- [`str_contains`](https://php.net/str_contains) +- [`str_starts_with`](https://php.net/str_starts_with) +- [`str_ends_with`](https://php.net/str_ends_with) +- [`get_resource_id`](https://php.net/get_resource_id) + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php b/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php new file mode 100644 index 0000000..2b95542 --- /dev/null +++ b/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php @@ -0,0 +1,31 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#[Attribute(Attribute::TARGET_CLASS)] +final class Attribute +{ + public const TARGET_CLASS = 1; + public const TARGET_FUNCTION = 2; + public const TARGET_METHOD = 4; + public const TARGET_PROPERTY = 8; + public const TARGET_CLASS_CONSTANT = 16; + public const TARGET_PARAMETER = 32; + public const TARGET_ALL = 63; + public const IS_REPEATABLE = 64; + + /** @var int */ + public $flags; + + public function __construct(int $flags = self::TARGET_ALL) + { + $this->flags = $flags; + } +} diff --git a/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php b/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php new file mode 100644 index 0000000..bd1212f --- /dev/null +++ b/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php @@ -0,0 +1,16 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000 && extension_loaded('tokenizer')) { + class PhpToken extends Symfony\Polyfill\Php80\PhpToken + { + } +} diff --git a/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php b/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php new file mode 100644 index 0000000..7c62d75 --- /dev/null +++ b/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php @@ -0,0 +1,20 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000) { + interface Stringable + { + /** + * @return string + */ + public function __toString(); + } +} diff --git a/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php b/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php new file mode 100644 index 0000000..01c6c6c --- /dev/null +++ b/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php @@ -0,0 +1,16 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000) { + class UnhandledMatchError extends Error + { + } +} diff --git a/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php b/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php new file mode 100644 index 0000000..783dbc2 --- /dev/null +++ b/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php @@ -0,0 +1,16 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID < 80000) { + class ValueError extends Error + { + } +} diff --git a/vendor/symfony/polyfill-php80/bootstrap.php b/vendor/symfony/polyfill-php80/bootstrap.php new file mode 100644 index 0000000..e5f7dbc --- /dev/null +++ b/vendor/symfony/polyfill-php80/bootstrap.php @@ -0,0 +1,42 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Php80 as p; + +if (\PHP_VERSION_ID >= 80000) { + return; +} + +if (!defined('FILTER_VALIDATE_BOOL') && defined('FILTER_VALIDATE_BOOLEAN')) { + define('FILTER_VALIDATE_BOOL', \FILTER_VALIDATE_BOOLEAN); +} + +if (!function_exists('fdiv')) { + function fdiv(float $num1, float $num2): float { return p\Php80::fdiv($num1, $num2); } +} +if (!function_exists('preg_last_error_msg')) { + function preg_last_error_msg(): string { return p\Php80::preg_last_error_msg(); } +} +if (!function_exists('str_contains')) { + function str_contains(?string $haystack, ?string $needle): bool { return p\Php80::str_contains($haystack ?? '', $needle ?? ''); } +} +if (!function_exists('str_starts_with')) { + function str_starts_with(?string $haystack, ?string $needle): bool { return p\Php80::str_starts_with($haystack ?? '', $needle ?? ''); } +} +if (!function_exists('str_ends_with')) { + function str_ends_with(?string $haystack, ?string $needle): bool { return p\Php80::str_ends_with($haystack ?? '', $needle ?? ''); } +} +if (!function_exists('get_debug_type')) { + function get_debug_type($value): string { return p\Php80::get_debug_type($value); } +} +if (!function_exists('get_resource_id')) { + function get_resource_id($resource): int { return p\Php80::get_resource_id($resource); } +} diff --git a/vendor/symfony/polyfill-php80/composer.json b/vendor/symfony/polyfill-php80/composer.json new file mode 100644 index 0000000..bd9a326 --- /dev/null +++ b/vendor/symfony/polyfill-php80/composer.json @@ -0,0 +1,40 @@ +{ + "name": "symfony/polyfill-php80", + "type": "library", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "keywords": ["polyfill", "shim", "compatibility", "portable"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.1" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Php80\\": "" }, + "files": [ "bootstrap.php" ], + "classmap": [ "Resources/stubs" ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/vendor/symfony/service-contracts/.gitignore b/vendor/symfony/service-contracts/.gitignore new file mode 100644 index 0000000..c49a5d8 --- /dev/null +++ b/vendor/symfony/service-contracts/.gitignore @@ -0,0 +1,3 @@ +vendor/ +composer.lock +phpunit.xml diff --git a/vendor/symfony/service-contracts/Attribute/Required.php b/vendor/symfony/service-contracts/Attribute/Required.php new file mode 100644 index 0000000..9df8511 --- /dev/null +++ b/vendor/symfony/service-contracts/Attribute/Required.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service\Attribute; + +/** + * A required dependency. + * + * This attribute indicates that a property holds a required dependency. The annotated property or method should be + * considered during the instantiation process of the containing class. + * + * @author Alexander M. Turek <me@derrabus.de> + */ +#[\Attribute(\Attribute::TARGET_METHOD | \Attribute::TARGET_PROPERTY)] +final class Required +{ +} diff --git a/vendor/symfony/service-contracts/Attribute/SubscribedService.php b/vendor/symfony/service-contracts/Attribute/SubscribedService.php new file mode 100644 index 0000000..10d1bc3 --- /dev/null +++ b/vendor/symfony/service-contracts/Attribute/SubscribedService.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service\Attribute; + +use Symfony\Contracts\Service\ServiceSubscriberTrait; + +/** + * Use with {@see ServiceSubscriberTrait} to mark a method's return type + * as a subscribed service. + * + * @author Kevin Bond <kevinbond@gmail.com> + */ +#[\Attribute(\Attribute::TARGET_METHOD)] +final class SubscribedService +{ + /** + * @param string|null $key The key to use for the service + * If null, use "ClassName::methodName" + */ + public function __construct( + public ?string $key = null + ) { + } +} diff --git a/vendor/symfony/service-contracts/CHANGELOG.md b/vendor/symfony/service-contracts/CHANGELOG.md new file mode 100644 index 0000000..7932e26 --- /dev/null +++ b/vendor/symfony/service-contracts/CHANGELOG.md @@ -0,0 +1,5 @@ +CHANGELOG +========= + +The changelog is maintained for all Symfony contracts at the following URL: +https://github.com/symfony/contracts/blob/main/CHANGELOG.md diff --git a/vendor/symfony/service-contracts/LICENSE b/vendor/symfony/service-contracts/LICENSE new file mode 100644 index 0000000..74cdc2d --- /dev/null +++ b/vendor/symfony/service-contracts/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-2022 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/vendor/symfony/service-contracts/README.md b/vendor/symfony/service-contracts/README.md new file mode 100644 index 0000000..41e054a --- /dev/null +++ b/vendor/symfony/service-contracts/README.md @@ -0,0 +1,9 @@ +Symfony Service Contracts +========================= + +A set of abstractions extracted out of the Symfony components. + +Can be used to build on semantics that the Symfony components proved useful - and +that already have battle tested implementations. + +See https://github.com/symfony/contracts/blob/main/README.md for more information. diff --git a/vendor/symfony/service-contracts/ResetInterface.php b/vendor/symfony/service-contracts/ResetInterface.php new file mode 100644 index 0000000..1af1075 --- /dev/null +++ b/vendor/symfony/service-contracts/ResetInterface.php @@ -0,0 +1,30 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service; + +/** + * Provides a way to reset an object to its initial state. + * + * When calling the "reset()" method on an object, it should be put back to its + * initial state. This usually means clearing any internal buffers and forwarding + * the call to internal dependencies. All properties of the object should be put + * back to the same state it had when it was first ready to use. + * + * This method could be called, for example, to recycle objects that are used as + * services, so that they can be used to handle several requests in the same + * process loop (note that we advise making your services stateless instead of + * implementing this interface when possible.) + */ +interface ResetInterface +{ + public function reset(); +} diff --git a/vendor/symfony/service-contracts/ServiceLocatorTrait.php b/vendor/symfony/service-contracts/ServiceLocatorTrait.php new file mode 100644 index 0000000..74dfa43 --- /dev/null +++ b/vendor/symfony/service-contracts/ServiceLocatorTrait.php @@ -0,0 +1,128 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service; + +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\NotFoundExceptionInterface; + +// Help opcache.preload discover always-needed symbols +class_exists(ContainerExceptionInterface::class); +class_exists(NotFoundExceptionInterface::class); + +/** + * A trait to help implement ServiceProviderInterface. + * + * @author Robin Chalas <robin.chalas@gmail.com> + * @author Nicolas Grekas <p@tchwork.com> + */ +trait ServiceLocatorTrait +{ + private $factories; + private $loading = []; + private $providedTypes; + + /** + * @param callable[] $factories + */ + public function __construct(array $factories) + { + $this->factories = $factories; + } + + /** + * {@inheritdoc} + * + * @return bool + */ + public function has(string $id) + { + return isset($this->factories[$id]); + } + + /** + * {@inheritdoc} + * + * @return mixed + */ + public function get(string $id) + { + if (!isset($this->factories[$id])) { + throw $this->createNotFoundException($id); + } + + if (isset($this->loading[$id])) { + $ids = array_values($this->loading); + $ids = \array_slice($this->loading, array_search($id, $ids)); + $ids[] = $id; + + throw $this->createCircularReferenceException($id, $ids); + } + + $this->loading[$id] = $id; + try { + return $this->factories[$id]($this); + } finally { + unset($this->loading[$id]); + } + } + + /** + * {@inheritdoc} + */ + public function getProvidedServices(): array + { + if (null === $this->providedTypes) { + $this->providedTypes = []; + + foreach ($this->factories as $name => $factory) { + if (!\is_callable($factory)) { + $this->providedTypes[$name] = '?'; + } else { + $type = (new \ReflectionFunction($factory))->getReturnType(); + + $this->providedTypes[$name] = $type ? ($type->allowsNull() ? '?' : '').($type instanceof \ReflectionNamedType ? $type->getName() : $type) : '?'; + } + } + } + + return $this->providedTypes; + } + + private function createNotFoundException(string $id): NotFoundExceptionInterface + { + if (!$alternatives = array_keys($this->factories)) { + $message = 'is empty...'; + } else { + $last = array_pop($alternatives); + if ($alternatives) { + $message = sprintf('only knows about the "%s" and "%s" services.', implode('", "', $alternatives), $last); + } else { + $message = sprintf('only knows about the "%s" service.', $last); + } + } + + if ($this->loading) { + $message = sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', end($this->loading), $id, $message); + } else { + $message = sprintf('Service "%s" not found: the current service locator %s', $id, $message); + } + + return new class($message) extends \InvalidArgumentException implements NotFoundExceptionInterface { + }; + } + + private function createCircularReferenceException(string $id, array $path): ContainerExceptionInterface + { + return new class(sprintf('Circular reference detected for service "%s", path: "%s".', $id, implode(' -> ', $path))) extends \RuntimeException implements ContainerExceptionInterface { + }; + } +} diff --git a/vendor/symfony/service-contracts/ServiceProviderInterface.php b/vendor/symfony/service-contracts/ServiceProviderInterface.php new file mode 100644 index 0000000..c60ad0b --- /dev/null +++ b/vendor/symfony/service-contracts/ServiceProviderInterface.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service; + +use Psr\Container\ContainerInterface; + +/** + * A ServiceProviderInterface exposes the identifiers and the types of services provided by a container. + * + * @author Nicolas Grekas <p@tchwork.com> + * @author Mateusz Sip <mateusz.sip@gmail.com> + */ +interface ServiceProviderInterface extends ContainerInterface +{ + /** + * Returns an associative array of service types keyed by the identifiers provided by the current container. + * + * Examples: + * + * * ['logger' => 'Psr\Log\LoggerInterface'] means the object provides a service named "logger" that implements Psr\Log\LoggerInterface + * * ['foo' => '?'] means the container provides service name "foo" of unspecified type + * * ['bar' => '?Bar\Baz'] means the container provides a service "bar" of type Bar\Baz|null + * + * @return string[] The provided service types, keyed by service names + */ + public function getProvidedServices(): array; +} diff --git a/vendor/symfony/service-contracts/ServiceSubscriberInterface.php b/vendor/symfony/service-contracts/ServiceSubscriberInterface.php new file mode 100644 index 0000000..098ab90 --- /dev/null +++ b/vendor/symfony/service-contracts/ServiceSubscriberInterface.php @@ -0,0 +1,53 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service; + +/** + * A ServiceSubscriber exposes its dependencies via the static {@link getSubscribedServices} method. + * + * The getSubscribedServices method returns an array of service types required by such instances, + * optionally keyed by the service names used internally. Service types that start with an interrogation + * mark "?" are optional, while the other ones are mandatory service dependencies. + * + * The injected service locators SHOULD NOT allow access to any other services not specified by the method. + * + * It is expected that ServiceSubscriber instances consume PSR-11-based service locators internally. + * This interface does not dictate any injection method for these service locators, although constructor + * injection is recommended. + * + * @author Nicolas Grekas <p@tchwork.com> + */ +interface ServiceSubscriberInterface +{ + /** + * Returns an array of service types required by such instances, optionally keyed by the service names used internally. + * + * For mandatory dependencies: + * + * * ['logger' => 'Psr\Log\LoggerInterface'] means the objects use the "logger" name + * internally to fetch a service which must implement Psr\Log\LoggerInterface. + * * ['loggers' => 'Psr\Log\LoggerInterface[]'] means the objects use the "loggers" name + * internally to fetch an iterable of Psr\Log\LoggerInterface instances. + * * ['Psr\Log\LoggerInterface'] is a shortcut for + * * ['Psr\Log\LoggerInterface' => 'Psr\Log\LoggerInterface'] + * + * otherwise: + * + * * ['logger' => '?Psr\Log\LoggerInterface'] denotes an optional dependency + * * ['loggers' => '?Psr\Log\LoggerInterface[]'] denotes an optional iterable dependency + * * ['?Psr\Log\LoggerInterface'] is a shortcut for + * * ['Psr\Log\LoggerInterface' => '?Psr\Log\LoggerInterface'] + * + * @return string[] The required service types, optionally keyed by service names + */ + public static function getSubscribedServices(); +} diff --git a/vendor/symfony/service-contracts/ServiceSubscriberTrait.php b/vendor/symfony/service-contracts/ServiceSubscriberTrait.php new file mode 100644 index 0000000..16e3eb2 --- /dev/null +++ b/vendor/symfony/service-contracts/ServiceSubscriberTrait.php @@ -0,0 +1,109 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service; + +use Psr\Container\ContainerInterface; +use Symfony\Contracts\Service\Attribute\SubscribedService; + +/** + * Implementation of ServiceSubscriberInterface that determines subscribed services from + * method return types. Service ids are available as "ClassName::methodName". + * + * @author Kevin Bond <kevinbond@gmail.com> + */ +trait ServiceSubscriberTrait +{ + /** @var ContainerInterface */ + protected $container; + + /** + * {@inheritdoc} + */ + public static function getSubscribedServices(): array + { + $services = method_exists(get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : []; + $attributeOptIn = false; + + if (\PHP_VERSION_ID >= 80000) { + foreach ((new \ReflectionClass(self::class))->getMethods() as $method) { + if (self::class !== $method->getDeclaringClass()->name) { + continue; + } + + if (!$attribute = $method->getAttributes(SubscribedService::class)[0] ?? null) { + continue; + } + + if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) { + throw new \LogicException(sprintf('Cannot use "%s" on method "%s::%s()" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $method->name)); + } + + if (!$returnType = $method->getReturnType()) { + throw new \LogicException(sprintf('Cannot use "%s" on methods without a return type in "%s::%s()".', SubscribedService::class, $method->name, self::class)); + } + + $serviceId = $returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType; + + if ($returnType->allowsNull()) { + $serviceId = '?'.$serviceId; + } + + $services[$attribute->newInstance()->key ?? self::class.'::'.$method->name] = $serviceId; + $attributeOptIn = true; + } + } + + if (!$attributeOptIn) { + foreach ((new \ReflectionClass(self::class))->getMethods() as $method) { + if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) { + continue; + } + + if (self::class !== $method->getDeclaringClass()->name) { + continue; + } + + if (!($returnType = $method->getReturnType()) instanceof \ReflectionNamedType) { + continue; + } + + if ($returnType->isBuiltin()) { + continue; + } + + if (\PHP_VERSION_ID >= 80000) { + trigger_deprecation('symfony/service-contracts', '2.5', 'Using "%s" in "%s" without using the "%s" attribute on any method is deprecated.', ServiceSubscriberTrait::class, self::class, SubscribedService::class); + } + + $services[self::class.'::'.$method->name] = '?'.($returnType instanceof \ReflectionNamedType ? $returnType->getName() : $returnType); + } + } + + return $services; + } + + /** + * @required + * + * @return ContainerInterface|null + */ + public function setContainer(ContainerInterface $container) + { + $this->container = $container; + + if (method_exists(get_parent_class(self::class) ?: '', __FUNCTION__)) { + return parent::setContainer($container); + } + + return null; + } +} diff --git a/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php b/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php new file mode 100644 index 0000000..2a1b565 --- /dev/null +++ b/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php @@ -0,0 +1,95 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service\Test; + +use PHPUnit\Framework\TestCase; +use Psr\Container\ContainerInterface; +use Symfony\Contracts\Service\ServiceLocatorTrait; + +abstract class ServiceLocatorTest extends TestCase +{ + /** + * @return ContainerInterface + */ + protected function getServiceLocator(array $factories) + { + return new class($factories) implements ContainerInterface { + use ServiceLocatorTrait; + }; + } + + public function testHas() + { + $locator = $this->getServiceLocator([ + 'foo' => function () { return 'bar'; }, + 'bar' => function () { return 'baz'; }, + function () { return 'dummy'; }, + ]); + + $this->assertTrue($locator->has('foo')); + $this->assertTrue($locator->has('bar')); + $this->assertFalse($locator->has('dummy')); + } + + public function testGet() + { + $locator = $this->getServiceLocator([ + 'foo' => function () { return 'bar'; }, + 'bar' => function () { return 'baz'; }, + ]); + + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame('baz', $locator->get('bar')); + } + + public function testGetDoesNotMemoize() + { + $i = 0; + $locator = $this->getServiceLocator([ + 'foo' => function () use (&$i) { + ++$i; + + return 'bar'; + }, + ]); + + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame(2, $i); + } + + public function testThrowsOnUndefinedInternalService() + { + if (!$this->getExpectedException()) { + $this->expectException(\Psr\Container\NotFoundExceptionInterface::class); + $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.'); + } + $locator = $this->getServiceLocator([ + 'foo' => function () use (&$locator) { return $locator->get('bar'); }, + ]); + + $locator->get('foo'); + } + + public function testThrowsOnCircularReference() + { + $this->expectException(\Psr\Container\ContainerExceptionInterface::class); + $this->expectExceptionMessage('Circular reference detected for service "bar", path: "bar -> baz -> bar".'); + $locator = $this->getServiceLocator([ + 'foo' => function () use (&$locator) { return $locator->get('bar'); }, + 'bar' => function () use (&$locator) { return $locator->get('baz'); }, + 'baz' => function () use (&$locator) { return $locator->get('bar'); }, + ]); + + $locator->get('foo'); + } +} diff --git a/vendor/symfony/service-contracts/composer.json b/vendor/symfony/service-contracts/composer.json new file mode 100644 index 0000000..f058637 --- /dev/null +++ b/vendor/symfony/service-contracts/composer.json @@ -0,0 +1,42 @@ +{ + "name": "symfony/service-contracts", + "type": "library", + "description": "Generic abstractions related to writing services", + "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "autoload": { + "psr-4": { "Symfony\\Contracts\\Service\\": "" } + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + } +} diff --git a/vendor/symfony/translation-contracts/.gitignore b/vendor/symfony/translation-contracts/.gitignore new file mode 100644 index 0000000..c49a5d8 --- /dev/null +++ b/vendor/symfony/translation-contracts/.gitignore @@ -0,0 +1,3 @@ +vendor/ +composer.lock +phpunit.xml diff --git a/vendor/symfony/translation-contracts/CHANGELOG.md b/vendor/symfony/translation-contracts/CHANGELOG.md new file mode 100644 index 0000000..7932e26 --- /dev/null +++ b/vendor/symfony/translation-contracts/CHANGELOG.md @@ -0,0 +1,5 @@ +CHANGELOG +========= + +The changelog is maintained for all Symfony contracts at the following URL: +https://github.com/symfony/contracts/blob/main/CHANGELOG.md diff --git a/vendor/symfony/translation-contracts/LICENSE b/vendor/symfony/translation-contracts/LICENSE new file mode 100644 index 0000000..74cdc2d --- /dev/null +++ b/vendor/symfony/translation-contracts/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-2022 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/vendor/symfony/translation-contracts/LocaleAwareInterface.php b/vendor/symfony/translation-contracts/LocaleAwareInterface.php new file mode 100644 index 0000000..6923b97 --- /dev/null +++ b/vendor/symfony/translation-contracts/LocaleAwareInterface.php @@ -0,0 +1,27 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Translation; + +interface LocaleAwareInterface +{ + /** + * Sets the current locale. + * + * @throws \InvalidArgumentException If the locale contains invalid characters + */ + public function setLocale(string $locale); + + /** + * Returns the current locale. + */ + public function getLocale(): string; +} diff --git a/vendor/symfony/translation-contracts/README.md b/vendor/symfony/translation-contracts/README.md new file mode 100644 index 0000000..42e5c51 --- /dev/null +++ b/vendor/symfony/translation-contracts/README.md @@ -0,0 +1,9 @@ +Symfony Translation Contracts +============================= + +A set of abstractions extracted out of the Symfony components. + +Can be used to build on semantics that the Symfony components proved useful - and +that already have battle tested implementations. + +See https://github.com/symfony/contracts/blob/main/README.md for more information. diff --git a/vendor/symfony/translation-contracts/Test/TranslatorTest.php b/vendor/symfony/translation-contracts/Test/TranslatorTest.php new file mode 100644 index 0000000..4e5999d --- /dev/null +++ b/vendor/symfony/translation-contracts/Test/TranslatorTest.php @@ -0,0 +1,384 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Translation\Test; + +use PHPUnit\Framework\TestCase; +use Symfony\Contracts\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorTrait; + +/** + * Test should cover all languages mentioned on http://translate.sourceforge.net/wiki/l10n/pluralforms + * and Plural forms mentioned on http://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms. + * + * See also https://developer.mozilla.org/en/Localization_and_Plurals which mentions 15 rules having a maximum of 6 forms. + * The mozilla code is also interesting to check for. + * + * As mentioned by chx http://drupal.org/node/1273968 we can cover all by testing number from 0 to 199 + * + * The goal to cover all languages is to far fetched so this test case is smaller. + * + * @author Clemens Tolboom clemens@build2be.nl + */ +class TranslatorTest extends TestCase +{ + private $defaultLocale; + + protected function setUp(): void + { + $this->defaultLocale = \Locale::getDefault(); + \Locale::setDefault('en'); + } + + protected function tearDown(): void + { + \Locale::setDefault($this->defaultLocale); + } + + public function getTranslator(): TranslatorInterface + { + return new class() implements TranslatorInterface { + use TranslatorTrait; + }; + } + + /** + * @dataProvider getTransTests + */ + public function testTrans($expected, $id, $parameters) + { + $translator = $this->getTranslator(); + + $this->assertEquals($expected, $translator->trans($id, $parameters)); + } + + /** + * @dataProvider getTransChoiceTests + */ + public function testTransChoiceWithExplicitLocale($expected, $id, $number) + { + $translator = $this->getTranslator(); + + $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number])); + } + + /** + * @requires extension intl + * + * @dataProvider getTransChoiceTests + */ + public function testTransChoiceWithDefaultLocale($expected, $id, $number) + { + $translator = $this->getTranslator(); + + $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number])); + } + + /** + * @dataProvider getTransChoiceTests + */ + public function testTransChoiceWithEnUsPosix($expected, $id, $number) + { + $translator = $this->getTranslator(); + $translator->setLocale('en_US_POSIX'); + + $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number])); + } + + public function testGetSetLocale() + { + $translator = $this->getTranslator(); + + $this->assertEquals('en', $translator->getLocale()); + } + + /** + * @requires extension intl + */ + public function testGetLocaleReturnsDefaultLocaleIfNotSet() + { + $translator = $this->getTranslator(); + + \Locale::setDefault('pt_BR'); + $this->assertEquals('pt_BR', $translator->getLocale()); + + \Locale::setDefault('en'); + $this->assertEquals('en', $translator->getLocale()); + } + + public function getTransTests() + { + return [ + ['Symfony is great!', 'Symfony is great!', []], + ['Symfony is awesome!', 'Symfony is %what%!', ['%what%' => 'awesome']], + ]; + } + + public function getTransChoiceTests() + { + return [ + ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], + ['There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1], + ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10], + ['There are 0 apples', 'There is 1 apple|There are %count% apples', 0], + ['There is 1 apple', 'There is 1 apple|There are %count% apples', 1], + ['There are 10 apples', 'There is 1 apple|There are %count% apples', 10], + // custom validation messages may be coded with a fixed value + ['There are 2 apples', 'There are 2 apples', 2], + ]; + } + + /** + * @dataProvider getInternal + */ + public function testInterval($expected, $number, $interval) + { + $translator = $this->getTranslator(); + + $this->assertEquals($expected, $translator->trans($interval.' foo|[1,Inf[ bar', ['%count%' => $number])); + } + + public function getInternal() + { + return [ + ['foo', 3, '{1,2, 3 ,4}'], + ['bar', 10, '{1,2, 3 ,4}'], + ['bar', 3, '[1,2]'], + ['foo', 1, '[1,2]'], + ['foo', 2, '[1,2]'], + ['bar', 1, ']1,2['], + ['bar', 2, ']1,2['], + ['foo', log(0), '[-Inf,2['], + ['foo', -log(0), '[-2,+Inf]'], + ]; + } + + /** + * @dataProvider getChooseTests + */ + public function testChoose($expected, $id, $number, $locale = null) + { + $translator = $this->getTranslator(); + + $this->assertEquals($expected, $translator->trans($id, ['%count%' => $number], null, $locale)); + } + + public function testReturnMessageIfExactlyOneStandardRuleIsGiven() + { + $translator = $this->getTranslator(); + + $this->assertEquals('There are two apples', $translator->trans('There are two apples', ['%count%' => 2])); + } + + /** + * @dataProvider getNonMatchingMessages + */ + public function testThrowExceptionIfMatchingMessageCannotBeFound($id, $number) + { + $this->expectException(\InvalidArgumentException::class); + $translator = $this->getTranslator(); + + $translator->trans($id, ['%count%' => $number]); + } + + public function getNonMatchingMessages() + { + return [ + ['{0} There are no apples|{1} There is one apple', 2], + ['{1} There is one apple|]1,Inf] There are %count% apples', 0], + ['{1} There is one apple|]2,Inf] There are %count% apples', 2], + ['{0} There are no apples|There is one apple', 2], + ]; + } + + public function getChooseTests() + { + return [ + ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], + ['There are no apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], + ['There are no apples', '{0}There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 0], + + ['There is one apple', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 1], + + ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10], + ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf]There are %count% apples', 10], + ['There are 10 apples', '{0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples', 10], + + ['There are 0 apples', 'There is one apple|There are %count% apples', 0], + ['There is one apple', 'There is one apple|There are %count% apples', 1], + ['There are 10 apples', 'There is one apple|There are %count% apples', 10], + + ['There are 0 apples', 'one: There is one apple|more: There are %count% apples', 0], + ['There is one apple', 'one: There is one apple|more: There are %count% apples', 1], + ['There are 10 apples', 'one: There is one apple|more: There are %count% apples', 10], + + ['There are no apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 0], + ['There is one apple', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 1], + ['There are 10 apples', '{0} There are no apples|one: There is one apple|more: There are %count% apples', 10], + + ['', '{0}|{1} There is one apple|]1,Inf] There are %count% apples', 0], + ['', '{0} There are no apples|{1}|]1,Inf] There are %count% apples', 1], + + // Indexed only tests which are Gettext PoFile* compatible strings. + ['There are 0 apples', 'There is one apple|There are %count% apples', 0], + ['There is one apple', 'There is one apple|There are %count% apples', 1], + ['There are 2 apples', 'There is one apple|There are %count% apples', 2], + + // Tests for float numbers + ['There is almost one apple', '{0} There are no apples|]0,1[ There is almost one apple|{1} There is one apple|[1,Inf] There is more than one apple', 0.7], + ['There is one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1], + ['There is more than one apple', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 1.7], + ['There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0], + ['There are no apples', '{0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0.0], + ['There are no apples', '{0.0} There are no apples|]0,1[There are %count% apples|{1} There is one apple|[1,Inf] There is more than one apple', 0], + + // Test texts with new-lines + // with double-quotes and \n in id & double-quotes and actual newlines in text + ["This is a text with a\n new-line in it. Selector = 0.", '{0}This is a text with a + new-line in it. Selector = 0.|{1}This is a text with a + new-line in it. Selector = 1.|[1,Inf]This is a text with a + new-line in it. Selector > 1.', 0], + // with double-quotes and \n in id and single-quotes and actual newlines in text + ["This is a text with a\n new-line in it. Selector = 1.", '{0}This is a text with a + new-line in it. Selector = 0.|{1}This is a text with a + new-line in it. Selector = 1.|[1,Inf]This is a text with a + new-line in it. Selector > 1.', 1], + ["This is a text with a\n new-line in it. Selector > 1.", '{0}This is a text with a + new-line in it. Selector = 0.|{1}This is a text with a + new-line in it. Selector = 1.|[1,Inf]This is a text with a + new-line in it. Selector > 1.', 5], + // with double-quotes and id split accros lines + ['This is a text with a + new-line in it. Selector = 1.', '{0}This is a text with a + new-line in it. Selector = 0.|{1}This is a text with a + new-line in it. Selector = 1.|[1,Inf]This is a text with a + new-line in it. Selector > 1.', 1], + // with single-quotes and id split accros lines + ['This is a text with a + new-line in it. Selector > 1.', '{0}This is a text with a + new-line in it. Selector = 0.|{1}This is a text with a + new-line in it. Selector = 1.|[1,Inf]This is a text with a + new-line in it. Selector > 1.', 5], + // with single-quotes and \n in text + ['This is a text with a\nnew-line in it. Selector = 0.', '{0}This is a text with a\nnew-line in it. Selector = 0.|{1}This is a text with a\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\nnew-line in it. Selector > 1.', 0], + // with double-quotes and id split accros lines + ["This is a text with a\nnew-line in it. Selector = 1.", "{0}This is a text with a\nnew-line in it. Selector = 0.|{1}This is a text with a\nnew-line in it. Selector = 1.|[1,Inf]This is a text with a\nnew-line in it. Selector > 1.", 1], + // esacape pipe + ['This is a text with | in it. Selector = 0.', '{0}This is a text with || in it. Selector = 0.|{1}This is a text with || in it. Selector = 1.', 0], + // Empty plural set (2 plural forms) from a .PO file + ['', '|', 1], + // Empty plural set (3 plural forms) from a .PO file + ['', '||', 1], + + // Floating values + ['1.5 liters', '%count% liter|%count% liters', 1.5], + ['1.5 litre', '%count% litre|%count% litres', 1.5, 'fr'], + + // Negative values + ['-1 degree', '%count% degree|%count% degrees', -1], + ['-1 degré', '%count% degré|%count% degrés', -1], + ['-1.5 degrees', '%count% degree|%count% degrees', -1.5], + ['-1.5 degré', '%count% degré|%count% degrés', -1.5, 'fr'], + ['-2 degrees', '%count% degree|%count% degrees', -2], + ['-2 degrés', '%count% degré|%count% degrés', -2], + ]; + } + + /** + * @dataProvider failingLangcodes + */ + public function testFailedLangcodes($nplural, $langCodes) + { + $matrix = $this->generateTestData($langCodes); + $this->validateMatrix($nplural, $matrix, false); + } + + /** + * @dataProvider successLangcodes + */ + public function testLangcodes($nplural, $langCodes) + { + $matrix = $this->generateTestData($langCodes); + $this->validateMatrix($nplural, $matrix); + } + + /** + * This array should contain all currently known langcodes. + * + * As it is impossible to have this ever complete we should try as hard as possible to have it almost complete. + */ + public function successLangcodes(): array + { + return [ + ['1', ['ay', 'bo', 'cgg', 'dz', 'id', 'ja', 'jbo', 'ka', 'kk', 'km', 'ko', 'ky']], + ['2', ['nl', 'fr', 'en', 'de', 'de_GE', 'hy', 'hy_AM', 'en_US_POSIX']], + ['3', ['be', 'bs', 'cs', 'hr']], + ['4', ['cy', 'mt', 'sl']], + ['6', ['ar']], + ]; + } + + /** + * This array should be at least empty within the near future. + * + * This both depends on a complete list trying to add above as understanding + * the plural rules of the current failing languages. + * + * @return array with nplural together with langcodes + */ + public function failingLangcodes(): array + { + return [ + ['1', ['fa']], + ['2', ['jbo']], + ['3', ['cbs']], + ['4', ['gd', 'kw']], + ['5', ['ga']], + ]; + } + + /** + * We validate only on the plural coverage. Thus the real rules is not tested. + * + * @param string $nplural Plural expected + * @param array $matrix Containing langcodes and their plural index values + */ + protected function validateMatrix(string $nplural, array $matrix, bool $expectSuccess = true) + { + foreach ($matrix as $langCode => $data) { + $indexes = array_flip($data); + if ($expectSuccess) { + $this->assertCount($nplural, $indexes, "Langcode '$langCode' has '$nplural' plural forms."); + } else { + $this->assertNotEquals((int) $nplural, \count($indexes), "Langcode '$langCode' has '$nplural' plural forms."); + } + } + } + + protected function generateTestData($langCodes) + { + $translator = new class() { + use TranslatorTrait { + getPluralizationRule as public; + } + }; + + $matrix = []; + foreach ($langCodes as $langCode) { + for ($count = 0; $count < 200; ++$count) { + $plural = $translator->getPluralizationRule($count, $langCode); + $matrix[$langCode][$count] = $plural; + } + } + + return $matrix; + } +} diff --git a/vendor/symfony/translation-contracts/TranslatableInterface.php b/vendor/symfony/translation-contracts/TranslatableInterface.php new file mode 100644 index 0000000..47fd6fa --- /dev/null +++ b/vendor/symfony/translation-contracts/TranslatableInterface.php @@ -0,0 +1,20 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Translation; + +/** + * @author Nicolas Grekas <p@tchwork.com> + */ +interface TranslatableInterface +{ + public function trans(TranslatorInterface $translator, string $locale = null): string; +} diff --git a/vendor/symfony/translation-contracts/TranslatorInterface.php b/vendor/symfony/translation-contracts/TranslatorInterface.php new file mode 100644 index 0000000..018db07 --- /dev/null +++ b/vendor/symfony/translation-contracts/TranslatorInterface.php @@ -0,0 +1,68 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Translation; + +/** + * @author Fabien Potencier <fabien@symfony.com> + */ +interface TranslatorInterface +{ + /** + * Translates the given message. + * + * When a number is provided as a parameter named "%count%", the message is parsed for plural + * forms and a translation is chosen according to this number using the following rules: + * + * Given a message with different plural translations separated by a + * pipe (|), this method returns the correct portion of the message based + * on the given number, locale and the pluralization rules in the message + * itself. + * + * The message supports two different types of pluralization rules: + * + * interval: {0} There are no apples|{1} There is one apple|]1,Inf] There are %count% apples + * indexed: There is one apple|There are %count% apples + * + * The indexed solution can also contain labels (e.g. one: There is one apple). + * This is purely for making the translations more clear - it does not + * affect the functionality. + * + * The two methods can also be mixed: + * {0} There are no apples|one: There is one apple|more: There are %count% apples + * + * An interval can represent a finite set of numbers: + * {1,2,3,4} + * + * An interval can represent numbers between two numbers: + * [1, +Inf] + * ]-1,2[ + * + * The left delimiter can be [ (inclusive) or ] (exclusive). + * The right delimiter can be [ (exclusive) or ] (inclusive). + * Beside numbers, you can use -Inf and +Inf for the infinite. + * + * @see https://en.wikipedia.org/wiki/ISO_31-11 + * + * @param string $id The message id (may also be an object that can be cast to string) + * @param array $parameters An array of parameters for the message + * @param string|null $domain The domain for the message or null to use the default + * @param string|null $locale The locale or null to use the default + * + * @throws \InvalidArgumentException If the locale contains invalid characters + */ + public function trans(string $id, array $parameters = [], string $domain = null, string $locale = null): string; + + /** + * Returns the default locale. + */ + public function getLocale(): string; +} diff --git a/vendor/symfony/translation-contracts/TranslatorTrait.php b/vendor/symfony/translation-contracts/TranslatorTrait.php new file mode 100644 index 0000000..9c264bd --- /dev/null +++ b/vendor/symfony/translation-contracts/TranslatorTrait.php @@ -0,0 +1,260 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Translation; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; + +/** + * A trait to help implement TranslatorInterface and LocaleAwareInterface. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +trait TranslatorTrait +{ + private ?string $locale = null; + + /** + * {@inheritdoc} + */ + public function setLocale(string $locale) + { + $this->locale = $locale; + } + + /** + * {@inheritdoc} + */ + public function getLocale(): string + { + return $this->locale ?: (class_exists(\Locale::class) ? \Locale::getDefault() : 'en'); + } + + /** + * {@inheritdoc} + */ + public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null): string + { + if (null === $id || '' === $id) { + return ''; + } + + if (!isset($parameters['%count%']) || !is_numeric($parameters['%count%'])) { + return strtr($id, $parameters); + } + + $number = (float) $parameters['%count%']; + $locale = $locale ?: $this->getLocale(); + + $parts = []; + if (preg_match('/^\|++$/', $id)) { + $parts = explode('|', $id); + } elseif (preg_match_all('/(?:\|\||[^\|])++/', $id, $matches)) { + $parts = $matches[0]; + } + + $intervalRegexp = <<<'EOF' +/^(?P<interval> + ({\s* + (\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*) + \s*}) + + | + + (?P<left_delimiter>[\[\]]) + \s* + (?P<left>-Inf|\-?\d+(\.\d+)?) + \s*,\s* + (?P<right>\+?Inf|\-?\d+(\.\d+)?) + \s* + (?P<right_delimiter>[\[\]]) +)\s*(?P<message>.*?)$/xs +EOF; + + $standardRules = []; + foreach ($parts as $part) { + $part = trim(str_replace('||', '|', $part)); + + // try to match an explicit rule, then fallback to the standard ones + if (preg_match($intervalRegexp, $part, $matches)) { + if ($matches[2]) { + foreach (explode(',', $matches[3]) as $n) { + if ($number == $n) { + return strtr($matches['message'], $parameters); + } + } + } else { + $leftNumber = '-Inf' === $matches['left'] ? -\INF : (float) $matches['left']; + $rightNumber = is_numeric($matches['right']) ? (float) $matches['right'] : \INF; + + if (('[' === $matches['left_delimiter'] ? $number >= $leftNumber : $number > $leftNumber) + && (']' === $matches['right_delimiter'] ? $number <= $rightNumber : $number < $rightNumber) + ) { + return strtr($matches['message'], $parameters); + } + } + } elseif (preg_match('/^\w+\:\s*(.*?)$/', $part, $matches)) { + $standardRules[] = $matches[1]; + } else { + $standardRules[] = $part; + } + } + + $position = $this->getPluralizationRule($number, $locale); + + if (!isset($standardRules[$position])) { + // when there's exactly one rule given, and that rule is a standard + // rule, use this rule + if (1 === \count($parts) && isset($standardRules[0])) { + return strtr($standardRules[0], $parameters); + } + + $message = sprintf('Unable to choose a translation for "%s" with locale "%s" for value "%d". Double check that this translation has the correct plural options (e.g. "There is one apple|There are %%count%% apples").', $id, $locale, $number); + + if (class_exists(InvalidArgumentException::class)) { + throw new InvalidArgumentException($message); + } + + throw new \InvalidArgumentException($message); + } + + return strtr($standardRules[$position], $parameters); + } + + /** + * Returns the plural position to use for the given locale and number. + * + * The plural rules are derived from code of the Zend Framework (2010-09-25), + * which is 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) + */ + private function getPluralizationRule(float $number, string $locale): int + { + $number = abs($number); + + switch ('pt_BR' !== $locale && 'en_US_POSIX' !== $locale && \strlen($locale) > 3 ? substr($locale, 0, strrpos($locale, '_')) : $locale) { + case 'af': + case 'bn': + case 'bg': + case 'ca': + case 'da': + case 'de': + case 'el': + case 'en': + case 'en_US_POSIX': + case 'eo': + case 'es': + case 'et': + case 'eu': + case 'fa': + case 'fi': + case 'fo': + case 'fur': + case 'fy': + case 'gl': + case 'gu': + case 'ha': + case 'he': + case 'hu': + case 'is': + case 'it': + case 'ku': + case 'lb': + case 'ml': + case 'mn': + case 'mr': + case 'nah': + case 'nb': + case 'ne': + case 'nl': + case 'nn': + case 'no': + case 'oc': + case 'om': + case 'or': + case 'pa': + case 'pap': + case 'ps': + case 'pt': + case 'so': + case 'sq': + case 'sv': + case 'sw': + case 'ta': + case 'te': + case 'tk': + case 'ur': + case 'zu': + return (1 == $number) ? 0 : 1; + + case 'am': + case 'bh': + case 'fil': + case 'fr': + case 'gun': + case 'hi': + case 'hy': + case 'ln': + case 'mg': + case 'nso': + case 'pt_BR': + case 'ti': + case 'wa': + return ($number < 2) ? 0 : 1; + + case 'be': + case 'bs': + case 'hr': + case 'ru': + case 'sh': + case 'sr': + case 'uk': + return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); + + case 'cs': + case 'sk': + return (1 == $number) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2); + + case 'ga': + return (1 == $number) ? 0 : ((2 == $number) ? 1 : 2); + + case 'lt': + return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); + + case 'sl': + return (1 == $number % 100) ? 0 : ((2 == $number % 100) ? 1 : (((3 == $number % 100) || (4 == $number % 100)) ? 2 : 3)); + + case 'mk': + return (1 == $number % 10) ? 0 : 1; + + case 'mt': + return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3)); + + case 'lv': + return (0 == $number) ? 0 : (((1 == $number % 10) && (11 != $number % 100)) ? 1 : 2); + + case 'pl': + return (1 == $number) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 1 : 2); + + case 'cy': + return (1 == $number) ? 0 : ((2 == $number) ? 1 : (((8 == $number) || (11 == $number)) ? 2 : 3)); + + case 'ro': + return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2); + + case 'ar': + return (0 == $number) ? 0 : ((1 == $number) ? 1 : ((2 == $number) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : 5)))); + + default: + return 0; + } + } +} diff --git a/vendor/symfony/translation-contracts/composer.json b/vendor/symfony/translation-contracts/composer.json new file mode 100644 index 0000000..875242f --- /dev/null +++ b/vendor/symfony/translation-contracts/composer.json @@ -0,0 +1,37 @@ +{ + "name": "symfony/translation-contracts", + "type": "library", + "description": "Generic abstractions related to translation", + "keywords": ["abstractions", "contracts", "decoupling", "interfaces", "interoperability", "standards"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=8.0.2" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "autoload": { + "psr-4": { "Symfony\\Contracts\\Translation\\": "" } + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + } +} diff --git a/vendor/symfony/translation/CHANGELOG.md b/vendor/symfony/translation/CHANGELOG.md new file mode 100644 index 0000000..160b5e6 --- /dev/null +++ b/vendor/symfony/translation/CHANGELOG.md @@ -0,0 +1,176 @@ +CHANGELOG +========= + +5.4 +--- + + * Add `github` format & autodetection to render errors as annotations when + running the XLIFF linter command in a Github Actions environment. + * Translation providers are not experimental anymore + +5.3 +--- + + * Add `translation:pull` and `translation:push` commands to manage translations with third-party providers + * Add `TranslatorBagInterface::getCatalogues` method + * Add support to load XLIFF string in `XliffFileLoader` + +5.2.0 +----- + + * added support for calling `trans` with ICU formatted messages + * added `PseudoLocalizationTranslator` + * added `TranslatableMessage` objects that represent a message that can be translated + * added the `t()` function to easily create `TranslatableMessage` objects + * Added support for extracting messages from `TranslatableMessage` objects + +5.1.0 +----- + + * added support for `name` attribute on `unit` element from xliff2 to be used as a translation key instead of always the `source` element + +5.0.0 +----- + + * removed support for using `null` as the locale in `Translator` + * removed `TranslatorInterface` + * removed `MessageSelector` + * removed `ChoiceMessageFormatterInterface` + * removed `PluralizationRule` + * removed `Interval` + * removed `transChoice()` methods, use the trans() method instead with a %count% parameter + * removed `FileDumper::setBackup()` and `TranslationWriter::disableBackup()` + * removed `MessageFormatter::choiceFormat()` + * added argument `$filename` to `PhpExtractor::parseTokens()` + * removed support for implicit STDIN usage in the `lint:xliff` command, use `lint:xliff -` (append a dash) instead to make it explicit. + +4.4.0 +----- + + * deprecated support for using `null` as the locale in `Translator` + * deprecated accepting STDIN implicitly when using the `lint:xliff` command, use `lint:xliff -` (append a dash) instead to make it explicit. + * Marked the `TranslationDataCollector` class as `@final`. + +4.3.0 +----- + + * Improved Xliff 1.2 loader to load the original file's metadata + * Added `TranslatorPathsPass` + +4.2.0 +----- + + * Started using ICU parent locales as fallback locales. + * allow using the ICU message format using domains with the "+intl-icu" suffix + * deprecated `Translator::transChoice()` in favor of using `Translator::trans()` with a `%count%` parameter + * deprecated `TranslatorInterface` in favor of `Symfony\Contracts\Translation\TranslatorInterface` + * deprecated `MessageSelector`, `Interval` and `PluralizationRules`; use `IdentityTranslator` instead + * Added `IntlFormatter` and `IntlFormatterInterface` + * added support for multiple files and directories in `XliffLintCommand` + * Marked `Translator::getFallbackLocales()` and `TranslationDataCollector::getFallbackLocales()` as internal + +4.1.0 +----- + + * The `FileDumper::setBackup()` method is deprecated. + * The `TranslationWriter::disableBackup()` method is deprecated. + * The `XliffFileDumper` will write "name" on the "unit" node when dumping XLIFF 2.0. + +4.0.0 +----- + + * removed the backup feature of the `FileDumper` class + * removed `TranslationWriter::writeTranslations()` method + * removed support for passing `MessageSelector` instances to the constructor of the `Translator` class + +3.4.0 +----- + + * Added `TranslationDumperPass` + * Added `TranslationExtractorPass` + * Added `TranslatorPass` + * Added `TranslationReader` and `TranslationReaderInterface` + * Added `<notes>` section to the Xliff 2.0 dumper. + * Improved Xliff 2.0 loader to load `<notes>` section. + * Added `TranslationWriterInterface` + * Deprecated `TranslationWriter::writeTranslations` in favor of `TranslationWriter::write` + * added support for adding custom message formatter and decoupling the default one. + * Added `PhpExtractor` + * Added `PhpStringTokenParser` + +3.2.0 +----- + + * Added support for escaping `|` in plural translations with double pipe. + +3.1.0 +----- + + * Deprecated the backup feature of the file dumper classes. + +3.0.0 +----- + + * removed `FileDumper::format()` method. + * Changed the visibility of the locale property in `Translator` from protected to private. + +2.8.0 +----- + + * deprecated FileDumper::format(), overwrite FileDumper::formatCatalogue() instead. + * deprecated Translator::getMessages(), rely on TranslatorBagInterface::getCatalogue() instead. + * added `FileDumper::formatCatalogue` which allows format the catalogue without dumping it into file. + * added option `json_encoding` to JsonFileDumper + * added options `as_tree`, `inline` to YamlFileDumper + * added support for XLIFF 2.0. + * added support for XLIFF target and tool attributes. + * added message parameters to DataCollectorTranslator. + * [DEPRECATION] The `DiffOperation` class has been deprecated and + will be removed in Symfony 3.0, since its operation has nothing to do with 'diff', + so the class name is misleading. The `TargetOperation` class should be used for + this use-case instead. + +2.7.0 +----- + + * added DataCollectorTranslator for collecting the translated messages. + +2.6.0 +----- + + * added possibility to cache catalogues + * added TranslatorBagInterface + * added LoggingTranslator + * added Translator::getMessages() for retrieving the message catalogue as an array + +2.5.0 +----- + + * added relative file path template to the file dumpers + * added optional backup to the file dumpers + * changed IcuResFileDumper to extend FileDumper + +2.3.0 +----- + + * added classes to make operations on catalogues (like making a diff or a merge on 2 catalogues) + * added Translator::getFallbackLocales() + * deprecated Translator::setFallbackLocale() in favor of the new Translator::setFallbackLocales() method + +2.2.0 +----- + + * QtTranslationsLoader class renamed to QtFileLoader. QtTranslationsLoader is deprecated and will be removed in 2.3. + * [BC BREAK] uniformized the exception thrown by the load() method when an error occurs. The load() method now + throws Symfony\Component\Translation\Exception\NotFoundResourceException when a resource cannot be found + and Symfony\Component\Translation\Exception\InvalidResourceException when a resource is invalid. + * changed the exception class thrown by some load() methods from \RuntimeException to \InvalidArgumentException + (IcuDatFileLoader, IcuResFileLoader and QtFileLoader) + +2.1.0 +----- + + * added support for more than one fallback locale + * added support for extracting translation messages from templates (Twig and PHP) + * added dumpers for translation catalogs + * added support for QT, gettext, and ResourceBundles diff --git a/vendor/symfony/translation/Catalogue/AbstractOperation.php b/vendor/symfony/translation/Catalogue/AbstractOperation.php new file mode 100644 index 0000000..43a52fa --- /dev/null +++ b/vendor/symfony/translation/Catalogue/AbstractOperation.php @@ -0,0 +1,203 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Catalogue; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Exception\LogicException; +use Symfony\Component\Translation\MessageCatalogue; +use Symfony\Component\Translation\MessageCatalogueInterface; + +/** + * Base catalogues binary operation class. + * + * A catalogue binary operation performs operation on + * source (the left argument) and target (the right argument) catalogues. + * + * @author Jean-François Simon <contact@jfsimon.fr> + */ +abstract class AbstractOperation implements OperationInterface +{ + public const OBSOLETE_BATCH = 'obsolete'; + public const NEW_BATCH = 'new'; + public const ALL_BATCH = 'all'; + + protected $source; + protected $target; + protected $result; + + /** + * @var array|null The domains affected by this operation + */ + private $domains; + + /** + * This array stores 'all', 'new' and 'obsolete' messages for all valid domains. + * + * The data structure of this array is as follows: + * + * [ + * 'domain 1' => [ + * 'all' => [...], + * 'new' => [...], + * 'obsolete' => [...] + * ], + * 'domain 2' => [ + * 'all' => [...], + * 'new' => [...], + * 'obsolete' => [...] + * ], + * ... + * ] + * + * @var array The array that stores 'all', 'new' and 'obsolete' messages + */ + protected $messages; + + /** + * @throws LogicException + */ + public function __construct(MessageCatalogueInterface $source, MessageCatalogueInterface $target) + { + if ($source->getLocale() !== $target->getLocale()) { + throw new LogicException('Operated catalogues must belong to the same locale.'); + } + + $this->source = $source; + $this->target = $target; + $this->result = new MessageCatalogue($source->getLocale()); + $this->messages = []; + } + + /** + * {@inheritdoc} + */ + public function getDomains(): array + { + if (null === $this->domains) { + $domains = []; + foreach ([$this->source, $this->target] as $catalogue) { + foreach ($catalogue->getDomains() as $domain) { + $domains[$domain] = $domain; + + if ($catalogue->all($domainIcu = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX)) { + $domains[$domainIcu] = $domainIcu; + } + } + } + + $this->domains = array_values($domains); + } + + return $this->domains; + } + + /** + * {@inheritdoc} + */ + public function getMessages(string $domain): array + { + if (!\in_array($domain, $this->getDomains())) { + throw new InvalidArgumentException(sprintf('Invalid domain: "%s".', $domain)); + } + + if (!isset($this->messages[$domain][self::ALL_BATCH])) { + $this->processDomain($domain); + } + + return $this->messages[$domain][self::ALL_BATCH]; + } + + /** + * {@inheritdoc} + */ + public function getNewMessages(string $domain): array + { + if (!\in_array($domain, $this->getDomains())) { + throw new InvalidArgumentException(sprintf('Invalid domain: "%s".', $domain)); + } + + if (!isset($this->messages[$domain][self::NEW_BATCH])) { + $this->processDomain($domain); + } + + return $this->messages[$domain][self::NEW_BATCH]; + } + + /** + * {@inheritdoc} + */ + public function getObsoleteMessages(string $domain): array + { + if (!\in_array($domain, $this->getDomains())) { + throw new InvalidArgumentException(sprintf('Invalid domain: "%s".', $domain)); + } + + if (!isset($this->messages[$domain][self::OBSOLETE_BATCH])) { + $this->processDomain($domain); + } + + return $this->messages[$domain][self::OBSOLETE_BATCH]; + } + + /** + * {@inheritdoc} + */ + public function getResult(): MessageCatalogueInterface + { + foreach ($this->getDomains() as $domain) { + if (!isset($this->messages[$domain])) { + $this->processDomain($domain); + } + } + + return $this->result; + } + + /** + * @param self::*_BATCH $batch + */ + public function moveMessagesToIntlDomainsIfPossible(string $batch = self::ALL_BATCH): void + { + // If MessageFormatter class does not exists, intl domains are not supported. + if (!class_exists(\MessageFormatter::class)) { + return; + } + + foreach ($this->getDomains() as $domain) { + $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; + switch ($batch) { + case self::OBSOLETE_BATCH: $messages = $this->getObsoleteMessages($domain); break; + case self::NEW_BATCH: $messages = $this->getNewMessages($domain); break; + case self::ALL_BATCH: $messages = $this->getMessages($domain); break; + default: throw new \InvalidArgumentException(sprintf('$batch argument must be one of ["%s", "%s", "%s"].', self::ALL_BATCH, self::NEW_BATCH, self::OBSOLETE_BATCH)); + } + + if (!$messages || (!$this->source->all($intlDomain) && $this->source->all($domain))) { + continue; + } + + $result = $this->getResult(); + $allIntlMessages = $result->all($intlDomain); + $currentMessages = array_diff_key($messages, $result->all($domain)); + $result->replace($currentMessages, $domain); + $result->replace($allIntlMessages + $messages, $intlDomain); + } + } + + /** + * Performs operation on source and target catalogues for the given domain and + * stores the results. + * + * @param string $domain The domain which the operation will be performed for + */ + abstract protected function processDomain(string $domain); +} diff --git a/vendor/symfony/translation/Catalogue/MergeOperation.php b/vendor/symfony/translation/Catalogue/MergeOperation.php new file mode 100644 index 0000000..87db2fb --- /dev/null +++ b/vendor/symfony/translation/Catalogue/MergeOperation.php @@ -0,0 +1,60 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Catalogue; + +use Symfony\Component\Translation\MessageCatalogueInterface; + +/** + * Merge operation between two catalogues as follows: + * all = source ∪ target = {x: x ∈ source ∨ x ∈ target} + * new = all ∖ source = {x: x ∈ target ∧ x ∉ source} + * obsolete = source ∖ all = {x: x ∈ source ∧ x ∉ source ∧ x ∉ target} = ∅ + * Basically, the result contains messages from both catalogues. + * + * @author Jean-François Simon <contact@jfsimon.fr> + */ +class MergeOperation extends AbstractOperation +{ + /** + * {@inheritdoc} + */ + protected function processDomain(string $domain) + { + $this->messages[$domain] = [ + 'all' => [], + 'new' => [], + 'obsolete' => [], + ]; + $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; + + foreach ($this->source->all($domain) as $id => $message) { + $this->messages[$domain]['all'][$id] = $message; + $d = $this->source->defines($id, $intlDomain) ? $intlDomain : $domain; + $this->result->add([$id => $message], $d); + if (null !== $keyMetadata = $this->source->getMetadata($id, $d)) { + $this->result->setMetadata($id, $keyMetadata, $d); + } + } + + foreach ($this->target->all($domain) as $id => $message) { + if (!$this->source->has($id, $domain)) { + $this->messages[$domain]['all'][$id] = $message; + $this->messages[$domain]['new'][$id] = $message; + $d = $this->target->defines($id, $intlDomain) ? $intlDomain : $domain; + $this->result->add([$id => $message], $d); + if (null !== $keyMetadata = $this->target->getMetadata($id, $d)) { + $this->result->setMetadata($id, $keyMetadata, $d); + } + } + } + } +} diff --git a/vendor/symfony/translation/Catalogue/OperationInterface.php b/vendor/symfony/translation/Catalogue/OperationInterface.php new file mode 100644 index 0000000..1fe9534 --- /dev/null +++ b/vendor/symfony/translation/Catalogue/OperationInterface.php @@ -0,0 +1,61 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Catalogue; + +use Symfony\Component\Translation\MessageCatalogueInterface; + +/** + * Represents an operation on catalogue(s). + * + * An instance of this interface performs an operation on one or more catalogues and + * stores intermediate and final results of the operation. + * + * The first catalogue in its argument(s) is called the 'source catalogue' or 'source' and + * the following results are stored: + * + * Messages: also called 'all', are valid messages for the given domain after the operation is performed. + * + * New Messages: also called 'new' (new = all ∖ source = {x: x ∈ all ∧ x ∉ source}). + * + * Obsolete Messages: also called 'obsolete' (obsolete = source ∖ all = {x: x ∈ source ∧ x ∉ all}). + * + * Result: also called 'result', is the resulting catalogue for the given domain that holds the same messages as 'all'. + * + * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com> + */ +interface OperationInterface +{ + /** + * Returns domains affected by operation. + */ + public function getDomains(): array; + + /** + * Returns all valid messages ('all') after operation. + */ + public function getMessages(string $domain): array; + + /** + * Returns new messages ('new') after operation. + */ + public function getNewMessages(string $domain): array; + + /** + * Returns obsolete messages ('obsolete') after operation. + */ + public function getObsoleteMessages(string $domain): array; + + /** + * Returns resulting catalogue ('result'). + */ + public function getResult(): MessageCatalogueInterface; +} diff --git a/vendor/symfony/translation/Catalogue/TargetOperation.php b/vendor/symfony/translation/Catalogue/TargetOperation.php new file mode 100644 index 0000000..682b575 --- /dev/null +++ b/vendor/symfony/translation/Catalogue/TargetOperation.php @@ -0,0 +1,74 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Catalogue; + +use Symfony\Component\Translation\MessageCatalogueInterface; + +/** + * Target operation between two catalogues: + * intersection = source ∩ target = {x: x ∈ source ∧ x ∈ target} + * all = intersection ∪ (target ∖ intersection) = target + * new = all ∖ source = {x: x ∈ target ∧ x ∉ source} + * obsolete = source ∖ all = source ∖ target = {x: x ∈ source ∧ x ∉ target} + * Basically, the result contains messages from the target catalogue. + * + * @author Michael Lee <michael.lee@zerustech.com> + */ +class TargetOperation extends AbstractOperation +{ + /** + * {@inheritdoc} + */ + protected function processDomain(string $domain) + { + $this->messages[$domain] = [ + 'all' => [], + 'new' => [], + 'obsolete' => [], + ]; + $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; + + // For 'all' messages, the code can't be simplified as ``$this->messages[$domain]['all'] = $target->all($domain);``, + // because doing so will drop messages like {x: x ∈ source ∧ x ∉ target.all ∧ x ∈ target.fallback} + // + // For 'new' messages, the code can't be simplified as ``array_diff_assoc($this->target->all($domain), $this->source->all($domain));`` + // because doing so will not exclude messages like {x: x ∈ target ∧ x ∉ source.all ∧ x ∈ source.fallback} + // + // For 'obsolete' messages, the code can't be simplified as ``array_diff_assoc($this->source->all($domain), $this->target->all($domain))`` + // because doing so will not exclude messages like {x: x ∈ source ∧ x ∉ target.all ∧ x ∈ target.fallback} + + foreach ($this->source->all($domain) as $id => $message) { + if ($this->target->has($id, $domain)) { + $this->messages[$domain]['all'][$id] = $message; + $d = $this->source->defines($id, $intlDomain) ? $intlDomain : $domain; + $this->result->add([$id => $message], $d); + if (null !== $keyMetadata = $this->source->getMetadata($id, $d)) { + $this->result->setMetadata($id, $keyMetadata, $d); + } + } else { + $this->messages[$domain]['obsolete'][$id] = $message; + } + } + + foreach ($this->target->all($domain) as $id => $message) { + if (!$this->source->has($id, $domain)) { + $this->messages[$domain]['all'][$id] = $message; + $this->messages[$domain]['new'][$id] = $message; + $d = $this->target->defines($id, $intlDomain) ? $intlDomain : $domain; + $this->result->add([$id => $message], $d); + if (null !== $keyMetadata = $this->target->getMetadata($id, $d)) { + $this->result->setMetadata($id, $keyMetadata, $d); + } + } + } + } +} diff --git a/vendor/symfony/translation/Command/TranslationPullCommand.php b/vendor/symfony/translation/Command/TranslationPullCommand.php new file mode 100644 index 0000000..f30e64d --- /dev/null +++ b/vendor/symfony/translation/Command/TranslationPullCommand.php @@ -0,0 +1,187 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Command; + +use Symfony\Component\Console\Attribute\AsCommand; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Translation\Catalogue\TargetOperation; +use Symfony\Component\Translation\MessageCatalogue; +use Symfony\Component\Translation\Provider\TranslationProviderCollection; +use Symfony\Component\Translation\Reader\TranslationReaderInterface; +use Symfony\Component\Translation\Writer\TranslationWriterInterface; + +/** + * @author Mathieu Santostefano <msantostefano@protonmail.com> + */ +#[AsCommand(name: 'translation:pull', description: 'Pull translations from a given provider.')] +final class TranslationPullCommand extends Command +{ + use TranslationTrait; + + private $providerCollection; + private $writer; + private $reader; + private string $defaultLocale; + private array $transPaths; + private array $enabledLocales; + + public function __construct(TranslationProviderCollection $providerCollection, TranslationWriterInterface $writer, TranslationReaderInterface $reader, string $defaultLocale, array $transPaths = [], array $enabledLocales = []) + { + $this->providerCollection = $providerCollection; + $this->writer = $writer; + $this->reader = $reader; + $this->defaultLocale = $defaultLocale; + $this->transPaths = $transPaths; + $this->enabledLocales = $enabledLocales; + + parent::__construct(); + } + + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + if ($input->mustSuggestArgumentValuesFor('provider')) { + $suggestions->suggestValues($this->providerCollection->keys()); + + return; + } + + if ($input->mustSuggestOptionValuesFor('domains')) { + $provider = $this->providerCollection->get($input->getArgument('provider')); + + if ($provider && method_exists($provider, 'getDomains')) { + $domains = $provider->getDomains(); + $suggestions->suggestValues($domains); + } + + return; + } + + if ($input->mustSuggestOptionValuesFor('locales')) { + $suggestions->suggestValues($this->enabledLocales); + + return; + } + + if ($input->mustSuggestOptionValuesFor('format')) { + $suggestions->suggestValues(['php', 'xlf', 'xlf12', 'xlf20', 'po', 'mo', 'yml', 'yaml', 'ts', 'csv', 'json', 'ini', 'res']); + } + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $keys = $this->providerCollection->keys(); + $defaultProvider = 1 === \count($keys) ? $keys[0] : null; + + $this + ->setDefinition([ + new InputArgument('provider', null !== $defaultProvider ? InputArgument::OPTIONAL : InputArgument::REQUIRED, 'The provider to pull translations from.', $defaultProvider), + new InputOption('force', null, InputOption::VALUE_NONE, 'Override existing translations with provider ones (it will delete not synchronized messages).'), + new InputOption('intl-icu', null, InputOption::VALUE_NONE, 'Associated to --force option, it will write messages in "%domain%+intl-icu.%locale%.xlf" files.'), + new InputOption('domains', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Specify the domains to pull.'), + new InputOption('locales', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Specify the locales to pull.'), + new InputOption('format', null, InputOption::VALUE_OPTIONAL, 'Override the default output format.', 'xlf12'), + ]) + ->setHelp(<<<'EOF' +The <info>%command.name%</> command pulls translations from the given provider. Only +new translations are pulled, existing ones are not overwritten. + +You can overwrite existing translations (and remove the missing ones on local side) by using the <comment>--force</> flag: + + <info>php %command.full_name% --force provider</> + +Full example: + + <info>php %command.full_name% provider --force --domains=messages --domains=validators --locales=en</> + +This command pulls all translations associated with the <comment>messages</> and <comment>validators</> domains for the <comment>en</> locale. +Local translations for the specified domains and locale are deleted if they're not present on the provider and overwritten if it's the case. +Local translations for others domains and locales are ignored. +EOF + ) + ; + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + + $provider = $this->providerCollection->get($input->getArgument('provider')); + $force = $input->getOption('force'); + $intlIcu = $input->getOption('intl-icu'); + $locales = $input->getOption('locales') ?: $this->enabledLocales; + $domains = $input->getOption('domains'); + $format = $input->getOption('format'); + $xliffVersion = '1.2'; + + if ($intlIcu && !$force) { + $io->note('--intl-icu option only has an effect when used with --force. Here, it will be ignored.'); + } + + switch ($format) { + case 'xlf20': $xliffVersion = '2.0'; + // no break + case 'xlf12': $format = 'xlf'; + } + + $writeOptions = [ + 'path' => end($this->transPaths), + 'xliff_version' => $xliffVersion, + 'default_locale' => $this->defaultLocale, + ]; + + if (!$domains) { + $domains = $provider->getDomains(); + } + + $providerTranslations = $provider->read($domains, $locales); + + if ($force) { + foreach ($providerTranslations->getCatalogues() as $catalogue) { + $operation = new TargetOperation(new MessageCatalogue($catalogue->getLocale()), $catalogue); + if ($intlIcu) { + $operation->moveMessagesToIntlDomainsIfPossible(); + } + $this->writer->write($operation->getResult(), $format, $writeOptions); + } + + $io->success(sprintf('Local translations has been updated from "%s" (for "%s" locale(s), and "%s" domain(s)).', parse_url($provider, \PHP_URL_SCHEME), implode(', ', $locales), implode(', ', $domains))); + + return 0; + } + + $localTranslations = $this->readLocalTranslations($locales, $domains, $this->transPaths); + + // Append pulled translations to local ones. + $localTranslations->addBag($providerTranslations->diff($localTranslations)); + + foreach ($localTranslations->getCatalogues() as $catalogue) { + $this->writer->write($catalogue, $format, $writeOptions); + } + + $io->success(sprintf('New translations from "%s" has been written locally (for "%s" locale(s), and "%s" domain(s)).', parse_url($provider, \PHP_URL_SCHEME), implode(', ', $locales), implode(', ', $domains))); + + return 0; + } +} diff --git a/vendor/symfony/translation/Command/TranslationPushCommand.php b/vendor/symfony/translation/Command/TranslationPushCommand.php new file mode 100644 index 0000000..795e68c --- /dev/null +++ b/vendor/symfony/translation/Command/TranslationPushCommand.php @@ -0,0 +1,188 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Command; + +use Symfony\Component\Console\Attribute\AsCommand; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Translation\Provider\FilteringProvider; +use Symfony\Component\Translation\Provider\TranslationProviderCollection; +use Symfony\Component\Translation\Reader\TranslationReaderInterface; +use Symfony\Component\Translation\TranslatorBag; + +/** + * @author Mathieu Santostefano <msantostefano@protonmail.com> + */ +#[AsCommand(name: 'translation:push', description: 'Push translations to a given provider.')] +final class TranslationPushCommand extends Command +{ + use TranslationTrait; + + private $providers; + private $reader; + private array $transPaths; + private array $enabledLocales; + + public function __construct(TranslationProviderCollection $providers, TranslationReaderInterface $reader, array $transPaths = [], array $enabledLocales = []) + { + $this->providers = $providers; + $this->reader = $reader; + $this->transPaths = $transPaths; + $this->enabledLocales = $enabledLocales; + + parent::__construct(); + } + + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + if ($input->mustSuggestArgumentValuesFor('provider')) { + $suggestions->suggestValues($this->providers->keys()); + + return; + } + + if ($input->mustSuggestOptionValuesFor('domains')) { + $provider = $this->providers->get($input->getArgument('provider')); + + if ($provider && method_exists($provider, 'getDomains')) { + $domains = $provider->getDomains(); + $suggestions->suggestValues($domains); + } + + return; + } + + if ($input->mustSuggestOptionValuesFor('locales')) { + $suggestions->suggestValues($this->enabledLocales); + } + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $keys = $this->providers->keys(); + $defaultProvider = 1 === \count($keys) ? $keys[0] : null; + + $this + ->setDefinition([ + new InputArgument('provider', null !== $defaultProvider ? InputArgument::OPTIONAL : InputArgument::REQUIRED, 'The provider to push translations to.', $defaultProvider), + new InputOption('force', null, InputOption::VALUE_NONE, 'Override existing translations with local ones (it will delete not synchronized messages).'), + new InputOption('delete-missing', null, InputOption::VALUE_NONE, 'Delete translations available on provider but not locally.'), + new InputOption('domains', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Specify the domains to push.'), + new InputOption('locales', null, InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY, 'Specify the locales to push.', $this->enabledLocales), + ]) + ->setHelp(<<<'EOF' +The <info>%command.name%</> command pushes translations to the given provider. Only new +translations are pushed, existing ones are not overwritten. + +You can overwrite existing translations by using the <comment>--force</> flag: + + <info>php %command.full_name% --force provider</> + +You can delete provider translations which are not present locally by using the <comment>--delete-missing</> flag: + + <info>php %command.full_name% --delete-missing provider</> + +Full example: + + <info>php %command.full_name% provider --force --delete-missing --domains=messages --domains=validators --locales=en</> + +This command pushes all translations associated with the <comment>messages</> and <comment>validators</> domains for the <comment>en</> locale. +Provider translations for the specified domains and locale are deleted if they're not present locally and overwritten if it's the case. +Provider translations for others domains and locales are ignored. +EOF + ) + ; + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output): int + { + $provider = $this->providers->get($input->getArgument('provider')); + + if (!$this->enabledLocales) { + throw new InvalidArgumentException(sprintf('You must define "framework.translator.enabled_locales" or "framework.translator.providers.%s.locales" config key in order to work with translation providers.', parse_url($provider, \PHP_URL_SCHEME))); + } + + $io = new SymfonyStyle($input, $output); + $domains = $input->getOption('domains'); + $locales = $input->getOption('locales'); + $force = $input->getOption('force'); + $deleteMissing = $input->getOption('delete-missing'); + + if (!$domains && $provider instanceof FilteringProvider) { + $domains = $provider->getDomains(); + } + + // Reading local translations must be done after retrieving the domains from the provider + // in order to manage only translations from configured domains + $localTranslations = $this->readLocalTranslations($locales, $domains, $this->transPaths); + + if (!$domains) { + $domains = $this->getDomainsFromTranslatorBag($localTranslations); + } + + if (!$deleteMissing && $force) { + $provider->write($localTranslations); + + $io->success(sprintf('All local translations has been sent to "%s" (for "%s" locale(s), and "%s" domain(s)).', parse_url($provider, \PHP_URL_SCHEME), implode(', ', $locales), implode(', ', $domains))); + + return 0; + } + + $providerTranslations = $provider->read($domains, $locales); + + if ($deleteMissing) { + $provider->delete($providerTranslations->diff($localTranslations)); + + $io->success(sprintf('Missing translations on "%s" has been deleted (for "%s" locale(s), and "%s" domain(s)).', parse_url($provider, \PHP_URL_SCHEME), implode(', ', $locales), implode(', ', $domains))); + + // Read provider translations again, after missing translations deletion, + // to avoid push freshly deleted translations. + $providerTranslations = $provider->read($domains, $locales); + } + + $translationsToWrite = $localTranslations->diff($providerTranslations); + + if ($force) { + $translationsToWrite->addBag($localTranslations->intersect($providerTranslations)); + } + + $provider->write($translationsToWrite); + + $io->success(sprintf('%s local translations has been sent to "%s" (for "%s" locale(s), and "%s" domain(s)).', $force ? 'All' : 'New', parse_url($provider, \PHP_URL_SCHEME), implode(', ', $locales), implode(', ', $domains))); + + return 0; + } + + private function getDomainsFromTranslatorBag(TranslatorBag $translatorBag): array + { + $domains = []; + + foreach ($translatorBag->getCatalogues() as $catalogue) { + $domains += $catalogue->getDomains(); + } + + return array_unique($domains); + } +} diff --git a/vendor/symfony/translation/Command/TranslationTrait.php b/vendor/symfony/translation/Command/TranslationTrait.php new file mode 100644 index 0000000..eafaffd --- /dev/null +++ b/vendor/symfony/translation/Command/TranslationTrait.php @@ -0,0 +1,77 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Command; + +use Symfony\Component\Translation\MessageCatalogue; +use Symfony\Component\Translation\MessageCatalogueInterface; +use Symfony\Component\Translation\TranslatorBag; + +/** + * @internal + */ +trait TranslationTrait +{ + private function readLocalTranslations(array $locales, array $domains, array $transPaths): TranslatorBag + { + $bag = new TranslatorBag(); + + foreach ($locales as $locale) { + $catalogue = new MessageCatalogue($locale); + foreach ($transPaths as $path) { + $this->reader->read($path, $catalogue); + } + + if ($domains) { + foreach ($domains as $domain) { + $bag->addCatalogue($this->filterCatalogue($catalogue, $domain)); + } + } else { + $bag->addCatalogue($catalogue); + } + } + + return $bag; + } + + private function filterCatalogue(MessageCatalogue $catalogue, string $domain): MessageCatalogue + { + $filteredCatalogue = new MessageCatalogue($catalogue->getLocale()); + + // extract intl-icu messages only + $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX; + if ($intlMessages = $catalogue->all($intlDomain)) { + $filteredCatalogue->add($intlMessages, $intlDomain); + } + + // extract all messages and subtract intl-icu messages + if ($messages = array_diff($catalogue->all($domain), $intlMessages)) { + $filteredCatalogue->add($messages, $domain); + } + foreach ($catalogue->getResources() as $resource) { + $filteredCatalogue->addResource($resource); + } + + if ($metadata = $catalogue->getMetadata('', $intlDomain)) { + foreach ($metadata as $k => $v) { + $filteredCatalogue->setMetadata($k, $v, $intlDomain); + } + } + + if ($metadata = $catalogue->getMetadata('', $domain)) { + foreach ($metadata as $k => $v) { + $filteredCatalogue->setMetadata($k, $v, $domain); + } + } + + return $filteredCatalogue; + } +} diff --git a/vendor/symfony/translation/Command/XliffLintCommand.php b/vendor/symfony/translation/Command/XliffLintCommand.php new file mode 100644 index 0000000..f062fb7 --- /dev/null +++ b/vendor/symfony/translation/Command/XliffLintCommand.php @@ -0,0 +1,284 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Command; + +use Symfony\Component\Console\Attribute\AsCommand; +use Symfony\Component\Console\CI\GithubActionReporter; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; +use Symfony\Component\Console\Exception\RuntimeException; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Util\XliffUtils; + +/** + * Validates XLIFF files syntax and outputs encountered errors. + * + * @author Grégoire Pineau <lyrixx@lyrixx.info> + * @author Robin Chalas <robin.chalas@gmail.com> + * @author Javier Eguiluz <javier.eguiluz@gmail.com> + */ +#[AsCommand(name: 'lint:xliff', description: 'Lint an XLIFF file and outputs encountered errors')] +class XliffLintCommand extends Command +{ + private string $format; + private bool $displayCorrectFiles; + private ?\Closure $directoryIteratorProvider; + private ?\Closure $isReadableProvider; + private bool $requireStrictFileNames; + + public function __construct(string $name = null, callable $directoryIteratorProvider = null, callable $isReadableProvider = null, bool $requireStrictFileNames = true) + { + parent::__construct($name); + + $this->directoryIteratorProvider = null === $directoryIteratorProvider || $directoryIteratorProvider instanceof \Closure ? $directoryIteratorProvider : \Closure::fromCallable($directoryIteratorProvider); + $this->isReadableProvider = null === $isReadableProvider || $isReadableProvider instanceof \Closure ? $isReadableProvider : \Closure::fromCallable($isReadableProvider); + $this->requireStrictFileNames = $requireStrictFileNames; + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this + ->addArgument('filename', InputArgument::IS_ARRAY, 'A file, a directory or "-" for reading from STDIN') + ->addOption('format', null, InputOption::VALUE_REQUIRED, 'The output format') + ->setHelp(<<<EOF +The <info>%command.name%</info> command lints an XLIFF file and outputs to STDOUT +the first encountered syntax error. + +You can validates XLIFF contents passed from STDIN: + + <info>cat filename | php %command.full_name% -</info> + +You can also validate the syntax of a file: + + <info>php %command.full_name% filename</info> + +Or of a whole directory: + + <info>php %command.full_name% dirname</info> + <info>php %command.full_name% dirname --format=json</info> + +EOF + ) + ; + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $io = new SymfonyStyle($input, $output); + $filenames = (array) $input->getArgument('filename'); + $this->format = $input->getOption('format') ?? (GithubActionReporter::isGithubActionEnvironment() ? 'github' : 'txt'); + $this->displayCorrectFiles = $output->isVerbose(); + + if (['-'] === $filenames) { + return $this->display($io, [$this->validate(file_get_contents('php://stdin'))]); + } + + if (!$filenames) { + throw new RuntimeException('Please provide a filename or pipe file content to STDIN.'); + } + + $filesInfo = []; + foreach ($filenames as $filename) { + if (!$this->isReadable($filename)) { + throw new RuntimeException(sprintf('File or directory "%s" is not readable.', $filename)); + } + + foreach ($this->getFiles($filename) as $file) { + $filesInfo[] = $this->validate(file_get_contents($file), $file); + } + } + + return $this->display($io, $filesInfo); + } + + private function validate(string $content, string $file = null): array + { + $errors = []; + + // Avoid: Warning DOMDocument::loadXML(): Empty string supplied as input + if ('' === trim($content)) { + return ['file' => $file, 'valid' => true]; + } + + $internal = libxml_use_internal_errors(true); + + $document = new \DOMDocument(); + $document->loadXML($content); + + if (null !== $targetLanguage = $this->getTargetLanguageFromFile($document)) { + $normalizedLocalePattern = sprintf('(%s|%s)', preg_quote($targetLanguage, '/'), preg_quote(str_replace('-', '_', $targetLanguage), '/')); + // strict file names require translation files to be named '____.locale.xlf' + // otherwise, both '____.locale.xlf' and 'locale.____.xlf' are allowed + // also, the regexp matching must be case-insensitive, as defined for 'target-language' values + // http://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html#target-language + $expectedFilenamePattern = $this->requireStrictFileNames ? sprintf('/^.*\.(?i:%s)\.(?:xlf|xliff)/', $normalizedLocalePattern) : sprintf('/^(?:.*\.(?i:%s)|(?i:%s)\..*)\.(?:xlf|xliff)/', $normalizedLocalePattern, $normalizedLocalePattern); + + if (0 === preg_match($expectedFilenamePattern, basename($file))) { + $errors[] = [ + 'line' => -1, + 'column' => -1, + 'message' => sprintf('There is a mismatch between the language included in the file name ("%s") and the "%s" value used in the "target-language" attribute of the file.', basename($file), $targetLanguage), + ]; + } + } + + foreach (XliffUtils::validateSchema($document) as $xmlError) { + $errors[] = [ + 'line' => $xmlError['line'], + 'column' => $xmlError['column'], + 'message' => $xmlError['message'], + ]; + } + + libxml_clear_errors(); + libxml_use_internal_errors($internal); + + return ['file' => $file, 'valid' => 0 === \count($errors), 'messages' => $errors]; + } + + private function display(SymfonyStyle $io, array $files) + { + switch ($this->format) { + case 'txt': + return $this->displayTxt($io, $files); + case 'json': + return $this->displayJson($io, $files); + case 'github': + return $this->displayTxt($io, $files, true); + default: + throw new InvalidArgumentException(sprintf('The format "%s" is not supported.', $this->format)); + } + } + + private function displayTxt(SymfonyStyle $io, array $filesInfo, bool $errorAsGithubAnnotations = false) + { + $countFiles = \count($filesInfo); + $erroredFiles = 0; + $githubReporter = $errorAsGithubAnnotations ? new GithubActionReporter($io) : null; + + foreach ($filesInfo as $info) { + if ($info['valid'] && $this->displayCorrectFiles) { + $io->comment('<info>OK</info>'.($info['file'] ? sprintf(' in %s', $info['file']) : '')); + } elseif (!$info['valid']) { + ++$erroredFiles; + $io->text('<error> ERROR </error>'.($info['file'] ? sprintf(' in %s', $info['file']) : '')); + $io->listing(array_map(function ($error) use ($info, $githubReporter) { + // general document errors have a '-1' line number + $line = -1 === $error['line'] ? null : $error['line']; + + if ($githubReporter) { + $githubReporter->error($error['message'], $info['file'], $line, null !== $line ? $error['column'] : null); + } + + return null === $line ? $error['message'] : sprintf('Line %d, Column %d: %s', $line, $error['column'], $error['message']); + }, $info['messages'])); + } + } + + if (0 === $erroredFiles) { + $io->success(sprintf('All %d XLIFF files contain valid syntax.', $countFiles)); + } else { + $io->warning(sprintf('%d XLIFF files have valid syntax and %d contain errors.', $countFiles - $erroredFiles, $erroredFiles)); + } + + return min($erroredFiles, 1); + } + + private function displayJson(SymfonyStyle $io, array $filesInfo) + { + $errors = 0; + + array_walk($filesInfo, function (&$v) use (&$errors) { + $v['file'] = (string) $v['file']; + if (!$v['valid']) { + ++$errors; + } + }); + + $io->writeln(json_encode($filesInfo, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES)); + + return min($errors, 1); + } + + private function getFiles(string $fileOrDirectory) + { + if (is_file($fileOrDirectory)) { + yield new \SplFileInfo($fileOrDirectory); + + return; + } + + foreach ($this->getDirectoryIterator($fileOrDirectory) as $file) { + if (!\in_array($file->getExtension(), ['xlf', 'xliff'])) { + continue; + } + + yield $file; + } + } + + private function getDirectoryIterator(string $directory) + { + $default = function ($directory) { + return new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($directory, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + }; + + if (null !== $this->directoryIteratorProvider) { + return ($this->directoryIteratorProvider)($directory, $default); + } + + return $default($directory); + } + + private function isReadable(string $fileOrDirectory) + { + $default = function ($fileOrDirectory) { + return is_readable($fileOrDirectory); + }; + + if (null !== $this->isReadableProvider) { + return ($this->isReadableProvider)($fileOrDirectory, $default); + } + + return $default($fileOrDirectory); + } + + private function getTargetLanguageFromFile(\DOMDocument $xliffContents): ?string + { + foreach ($xliffContents->getElementsByTagName('file')[0]->attributes ?? [] as $attribute) { + if ('target-language' === $attribute->nodeName) { + return $attribute->nodeValue; + } + } + + return null; + } + + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + if ($input->mustSuggestOptionValuesFor('format')) { + $suggestions->suggestValues(['txt', 'json', 'github']); + } + } +} diff --git a/vendor/symfony/translation/DataCollector/TranslationDataCollector.php b/vendor/symfony/translation/DataCollector/TranslationDataCollector.php new file mode 100644 index 0000000..0f7901d --- /dev/null +++ b/vendor/symfony/translation/DataCollector/TranslationDataCollector.php @@ -0,0 +1,160 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\DataCollector; + +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\DataCollector\DataCollector; +use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface; +use Symfony\Component\Translation\DataCollectorTranslator; +use Symfony\Component\VarDumper\Cloner\Data; + +/** + * @author Abdellatif Ait boudad <a.aitboudad@gmail.com> + * + * @final + */ +class TranslationDataCollector extends DataCollector implements LateDataCollectorInterface +{ + private $translator; + + public function __construct(DataCollectorTranslator $translator) + { + $this->translator = $translator; + } + + /** + * {@inheritdoc} + */ + public function lateCollect() + { + $messages = $this->sanitizeCollectedMessages($this->translator->getCollectedMessages()); + + $this->data += $this->computeCount($messages); + $this->data['messages'] = $messages; + + $this->data = $this->cloneVar($this->data); + } + + /** + * {@inheritdoc} + */ + public function collect(Request $request, Response $response, \Throwable $exception = null) + { + $this->data['locale'] = $this->translator->getLocale(); + $this->data['fallback_locales'] = $this->translator->getFallbackLocales(); + } + + /** + * {@inheritdoc} + */ + public function reset() + { + $this->data = []; + } + + public function getMessages(): array|Data + { + return $this->data['messages'] ?? []; + } + + public function getCountMissings(): int + { + return $this->data[DataCollectorTranslator::MESSAGE_MISSING] ?? 0; + } + + public function getCountFallbacks(): int + { + return $this->data[DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK] ?? 0; + } + + public function getCountDefines(): int + { + return $this->data[DataCollectorTranslator::MESSAGE_DEFINED] ?? 0; + } + + public function getLocale() + { + return !empty($this->data['locale']) ? $this->data['locale'] : null; + } + + /** + * @internal + */ + public function getFallbackLocales() + { + return (isset($this->data['fallback_locales']) && \count($this->data['fallback_locales']) > 0) ? $this->data['fallback_locales'] : []; + } + + /** + * {@inheritdoc} + */ + public function getName(): string + { + return 'translation'; + } + + private function sanitizeCollectedMessages(array $messages) + { + $result = []; + foreach ($messages as $key => $message) { + $messageId = $message['locale'].$message['domain'].$message['id']; + + if (!isset($result[$messageId])) { + $message['count'] = 1; + $message['parameters'] = !empty($message['parameters']) ? [$message['parameters']] : []; + $messages[$key]['translation'] = $this->sanitizeString($message['translation']); + $result[$messageId] = $message; + } else { + if (!empty($message['parameters'])) { + $result[$messageId]['parameters'][] = $message['parameters']; + } + + ++$result[$messageId]['count']; + } + + unset($messages[$key]); + } + + return $result; + } + + private function computeCount(array $messages) + { + $count = [ + DataCollectorTranslator::MESSAGE_DEFINED => 0, + DataCollectorTranslator::MESSAGE_MISSING => 0, + DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK => 0, + ]; + + foreach ($messages as $message) { + ++$count[$message['state']]; + } + + return $count; + } + + private function sanitizeString(string $string, int $length = 80) + { + $string = trim(preg_replace('/\s+/', ' ', $string)); + + if (false !== $encoding = mb_detect_encoding($string, null, true)) { + if (mb_strlen($string, $encoding) > $length) { + return mb_substr($string, 0, $length - 3, $encoding).'...'; + } + } elseif (\strlen($string) > $length) { + return substr($string, 0, $length - 3).'...'; + } + + return $string; + } +} diff --git a/vendor/symfony/translation/DataCollectorTranslator.php b/vendor/symfony/translation/DataCollectorTranslator.php new file mode 100644 index 0000000..2a08b09 --- /dev/null +++ b/vendor/symfony/translation/DataCollectorTranslator.php @@ -0,0 +1,162 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface; +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Contracts\Translation\LocaleAwareInterface; +use Symfony\Contracts\Translation\TranslatorInterface; + +/** + * @author Abdellatif Ait boudad <a.aitboudad@gmail.com> + */ +class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInterface, LocaleAwareInterface, WarmableInterface +{ + public const MESSAGE_DEFINED = 0; + public const MESSAGE_MISSING = 1; + public const MESSAGE_EQUALS_FALLBACK = 2; + + private $translator; + private array $messages = []; + + /** + * @param TranslatorInterface&TranslatorBagInterface&LocaleAwareInterface $translator + */ + public function __construct(TranslatorInterface $translator) + { + if (!$translator instanceof TranslatorBagInterface || !$translator instanceof LocaleAwareInterface) { + throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.', get_debug_type($translator))); + } + + $this->translator = $translator; + } + + /** + * {@inheritdoc} + */ + public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null): string + { + $trans = $this->translator->trans($id = (string) $id, $parameters, $domain, $locale); + $this->collectMessage($locale, $domain, $id, $trans, $parameters); + + return $trans; + } + + /** + * {@inheritdoc} + */ + public function setLocale(string $locale) + { + $this->translator->setLocale($locale); + } + + /** + * {@inheritdoc} + */ + public function getLocale(): string + { + return $this->translator->getLocale(); + } + + /** + * {@inheritdoc} + */ + public function getCatalogue(string $locale = null): MessageCatalogueInterface + { + return $this->translator->getCatalogue($locale); + } + + /** + * {@inheritdoc} + */ + public function getCatalogues(): array + { + return $this->translator->getCatalogues(); + } + + /** + * {@inheritdoc} + * + * @return string[] + */ + public function warmUp(string $cacheDir): array + { + if ($this->translator instanceof WarmableInterface) { + return (array) $this->translator->warmUp($cacheDir); + } + + return []; + } + + /** + * Gets the fallback locales. + */ + public function getFallbackLocales(): array + { + if ($this->translator instanceof Translator || method_exists($this->translator, 'getFallbackLocales')) { + return $this->translator->getFallbackLocales(); + } + + return []; + } + + /** + * Passes through all unknown calls onto the translator object. + */ + public function __call(string $method, array $args) + { + return $this->translator->{$method}(...$args); + } + + public function getCollectedMessages(): array + { + return $this->messages; + } + + private function collectMessage(?string $locale, ?string $domain, string $id, string $translation, ?array $parameters = []) + { + if (null === $domain) { + $domain = 'messages'; + } + + $catalogue = $this->translator->getCatalogue($locale); + $locale = $catalogue->getLocale(); + $fallbackLocale = null; + if ($catalogue->defines($id, $domain)) { + $state = self::MESSAGE_DEFINED; + } elseif ($catalogue->has($id, $domain)) { + $state = self::MESSAGE_EQUALS_FALLBACK; + + $fallbackCatalogue = $catalogue->getFallbackCatalogue(); + while ($fallbackCatalogue) { + if ($fallbackCatalogue->defines($id, $domain)) { + $fallbackLocale = $fallbackCatalogue->getLocale(); + break; + } + $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue(); + } + } else { + $state = self::MESSAGE_MISSING; + } + + $this->messages[] = [ + 'locale' => $locale, + 'fallbackLocale' => $fallbackLocale, + 'domain' => $domain, + 'id' => $id, + 'translation' => $translation, + 'parameters' => $parameters, + 'state' => $state, + 'transChoiceNumber' => isset($parameters['%count%']) && is_numeric($parameters['%count%']) ? $parameters['%count%'] : null, + ]; + } +} diff --git a/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php b/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php new file mode 100644 index 0000000..4020a07 --- /dev/null +++ b/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\DependencyInjection; + +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Reference; + +/** + * Adds tagged translation.formatter services to translation writer. + */ +class TranslationDumperPass implements CompilerPassInterface +{ + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition('translation.writer')) { + return; + } + + $definition = $container->getDefinition('translation.writer'); + + foreach ($container->findTaggedServiceIds('translation.dumper', true) as $id => $attributes) { + $definition->addMethodCall('addDumper', [$attributes[0]['alias'], new Reference($id)]); + } + } +} diff --git a/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php b/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php new file mode 100644 index 0000000..ee7c47a --- /dev/null +++ b/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php @@ -0,0 +1,40 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\DependencyInjection; + +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Exception\RuntimeException; +use Symfony\Component\DependencyInjection\Reference; + +/** + * Adds tagged translation.extractor services to translation extractor. + */ +class TranslationExtractorPass implements CompilerPassInterface +{ + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition('translation.extractor')) { + return; + } + + $definition = $container->getDefinition('translation.extractor'); + + foreach ($container->findTaggedServiceIds('translation.extractor', true) as $id => $attributes) { + if (!isset($attributes[0]['alias'])) { + throw new RuntimeException(sprintf('The alias for the tag "translation.extractor" of service "%s" must be set.', $id)); + } + + $definition->addMethodCall('addExtractor', [$attributes[0]['alias'], new Reference($id)]); + } + } +} diff --git a/vendor/symfony/translation/DependencyInjection/TranslatorPass.php b/vendor/symfony/translation/DependencyInjection/TranslatorPass.php new file mode 100644 index 0000000..be79cda --- /dev/null +++ b/vendor/symfony/translation/DependencyInjection/TranslatorPass.php @@ -0,0 +1,74 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\DependencyInjection; + +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Reference; + +class TranslatorPass implements CompilerPassInterface +{ + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition('translator.default')) { + return; + } + + $loaders = []; + $loaderRefs = []; + foreach ($container->findTaggedServiceIds('translation.loader', true) as $id => $attributes) { + $loaderRefs[$id] = new Reference($id); + $loaders[$id][] = $attributes[0]['alias']; + if (isset($attributes[0]['legacy-alias'])) { + $loaders[$id][] = $attributes[0]['legacy-alias']; + } + } + + if ($container->hasDefinition('translation.reader')) { + $definition = $container->getDefinition('translation.reader'); + foreach ($loaders as $id => $formats) { + foreach ($formats as $format) { + $definition->addMethodCall('addLoader', [$format, $loaderRefs[$id]]); + } + } + } + + $container + ->findDefinition('translator.default') + ->replaceArgument(0, ServiceLocatorTagPass::register($container, $loaderRefs)) + ->replaceArgument(3, $loaders) + ; + + if (!$container->hasParameter('twig.default_path')) { + return; + } + + $paths = array_keys($container->getDefinition('twig.template_iterator')->getArgument(1)); + if ($container->hasDefinition('console.command.translation_debug')) { + $definition = $container->getDefinition('console.command.translation_debug'); + $definition->replaceArgument(4, $container->getParameter('twig.default_path')); + + if (\count($definition->getArguments()) > 6) { + $definition->replaceArgument(6, $paths); + } + } + if ($container->hasDefinition('console.command.translation_extract')) { + $definition = $container->getDefinition('console.command.translation_extract'); + $definition->replaceArgument(5, $container->getParameter('twig.default_path')); + + if (\count($definition->getArguments()) > 7) { + $definition->replaceArgument(7, $paths); + } + } + } +} diff --git a/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php b/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php new file mode 100644 index 0000000..b85c066 --- /dev/null +++ b/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php @@ -0,0 +1,147 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\DependencyInjection; + +use Symfony\Component\DependencyInjection\Compiler\AbstractRecursivePass; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Definition; +use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\DependencyInjection\ServiceLocator; + +/** + * @author Yonel Ceruto <yonelceruto@gmail.com> + */ +class TranslatorPathsPass extends AbstractRecursivePass +{ + private int $level = 0; + + /** + * @var array<string, bool> + */ + private array $paths = []; + + /** + * @var array<int, Definition> + */ + private array $definitions = []; + + /** + * @var array<string, array<string, bool>> + */ + private array $controllers = []; + + public function process(ContainerBuilder $container) + { + if (!$container->hasDefinition('translator')) { + return; + } + + foreach ($this->findControllerArguments($container) as $controller => $argument) { + $id = substr($controller, 0, strpos($controller, ':') ?: \strlen($controller)); + if ($container->hasDefinition($id)) { + [$locatorRef] = $argument->getValues(); + $this->controllers[(string) $locatorRef][$container->getDefinition($id)->getClass()] = true; + } + } + + try { + parent::process($container); + + $paths = []; + foreach ($this->paths as $class => $_) { + if (($r = $container->getReflectionClass($class)) && !$r->isInterface()) { + $paths[] = $r->getFileName(); + foreach ($r->getTraits() as $trait) { + $paths[] = $trait->getFileName(); + } + } + } + if ($paths) { + if ($container->hasDefinition('console.command.translation_debug')) { + $definition = $container->getDefinition('console.command.translation_debug'); + $definition->replaceArgument(6, array_merge($definition->getArgument(6), $paths)); + } + if ($container->hasDefinition('console.command.translation_extract')) { + $definition = $container->getDefinition('console.command.translation_extract'); + $definition->replaceArgument(7, array_merge($definition->getArgument(7), $paths)); + } + } + } finally { + $this->level = 0; + $this->paths = []; + $this->definitions = []; + } + } + + protected function processValue(mixed $value, bool $isRoot = false): mixed + { + if ($value instanceof Reference) { + if ('translator' === (string) $value) { + for ($i = $this->level - 1; $i >= 0; --$i) { + $class = $this->definitions[$i]->getClass(); + + if (ServiceLocator::class === $class) { + if (!isset($this->controllers[$this->currentId])) { + continue; + } + foreach ($this->controllers[$this->currentId] as $class => $_) { + $this->paths[$class] = true; + } + } else { + $this->paths[$class] = true; + } + + break; + } + } + + return $value; + } + + if ($value instanceof Definition) { + $this->definitions[$this->level++] = $value; + $value = parent::processValue($value, $isRoot); + unset($this->definitions[--$this->level]); + + return $value; + } + + return parent::processValue($value, $isRoot); + } + + private function findControllerArguments(ContainerBuilder $container): array + { + if ($container->hasDefinition('argument_resolver.service')) { + $argument = $container->getDefinition('argument_resolver.service')->getArgument(0); + if ($argument instanceof Reference) { + $argument = $container->getDefinition($argument); + } + + return $argument->getArgument(0); + } + + if ($container->hasDefinition('debug.'.'argument_resolver.service')) { + $argument = $container->getDefinition('debug.'.'argument_resolver.service')->getArgument(0); + if ($argument instanceof Reference) { + $argument = $container->getDefinition($argument); + } + $argument = $argument->getArgument(0); + if ($argument instanceof Reference) { + $argument = $container->getDefinition($argument); + } + + return $argument->getArgument(0); + } + + return []; + } +} diff --git a/vendor/symfony/translation/Dumper/CsvFileDumper.php b/vendor/symfony/translation/Dumper/CsvFileDumper.php new file mode 100644 index 0000000..0bd3f5e --- /dev/null +++ b/vendor/symfony/translation/Dumper/CsvFileDumper.php @@ -0,0 +1,60 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * CsvFileDumper generates a csv formatted string representation of a message catalogue. + * + * @author Stealth35 + */ +class CsvFileDumper extends FileDumper +{ + private string $delimiter = ';'; + private string $enclosure = '"'; + + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + { + $handle = fopen('php://memory', 'r+'); + + foreach ($messages->all($domain) as $source => $target) { + fputcsv($handle, [$source, $target], $this->delimiter, $this->enclosure); + } + + rewind($handle); + $output = stream_get_contents($handle); + fclose($handle); + + return $output; + } + + /** + * Sets the delimiter and escape character for CSV. + */ + public function setCsvControl(string $delimiter = ';', string $enclosure = '"') + { + $this->delimiter = $delimiter; + $this->enclosure = $enclosure; + } + + /** + * {@inheritdoc} + */ + protected function getExtension(): string + { + return 'csv'; + } +} diff --git a/vendor/symfony/translation/Dumper/DumperInterface.php b/vendor/symfony/translation/Dumper/DumperInterface.php new file mode 100644 index 0000000..7cdaef5 --- /dev/null +++ b/vendor/symfony/translation/Dumper/DumperInterface.php @@ -0,0 +1,30 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * DumperInterface is the interface implemented by all translation dumpers. + * There is no common option. + * + * @author Michel Salib <michelsalib@hotmail.com> + */ +interface DumperInterface +{ + /** + * Dumps the message catalogue. + * + * @param array $options Options that are used by the dumper + */ + public function dump(MessageCatalogue $messages, array $options = []); +} diff --git a/vendor/symfony/translation/Dumper/FileDumper.php b/vendor/symfony/translation/Dumper/FileDumper.php new file mode 100644 index 0000000..6bad4ff --- /dev/null +++ b/vendor/symfony/translation/Dumper/FileDumper.php @@ -0,0 +1,108 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Exception\RuntimeException; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * FileDumper is an implementation of DumperInterface that dump a message catalogue to file(s). + * + * Options: + * - path (mandatory): the directory where the files should be saved + * + * @author Michel Salib <michelsalib@hotmail.com> + */ +abstract class FileDumper implements DumperInterface +{ + /** + * A template for the relative paths to files. + * + * @var string + */ + protected $relativePathTemplate = '%domain%.%locale%.%extension%'; + + /** + * Sets the template for the relative paths to files. + * + * @param string $relativePathTemplate A template for the relative paths to files + */ + public function setRelativePathTemplate(string $relativePathTemplate) + { + $this->relativePathTemplate = $relativePathTemplate; + } + + /** + * {@inheritdoc} + */ + public function dump(MessageCatalogue $messages, array $options = []) + { + if (!\array_key_exists('path', $options)) { + throw new InvalidArgumentException('The file dumper needs a path option.'); + } + + // save a file for each domain + foreach ($messages->getDomains() as $domain) { + $fullpath = $options['path'].'/'.$this->getRelativePath($domain, $messages->getLocale()); + if (!file_exists($fullpath)) { + $directory = \dirname($fullpath); + if (!file_exists($directory) && !@mkdir($directory, 0777, true)) { + throw new RuntimeException(sprintf('Unable to create directory "%s".', $directory)); + } + } + + $intlDomain = $domain.MessageCatalogue::INTL_DOMAIN_SUFFIX; + $intlMessages = $messages->all($intlDomain); + + if ($intlMessages) { + $intlPath = $options['path'].'/'.$this->getRelativePath($intlDomain, $messages->getLocale()); + file_put_contents($intlPath, $this->formatCatalogue($messages, $intlDomain, $options)); + + $messages->replace([], $intlDomain); + + try { + if ($messages->all($domain)) { + file_put_contents($fullpath, $this->formatCatalogue($messages, $domain, $options)); + } + continue; + } finally { + $messages->replace($intlMessages, $intlDomain); + } + } + + file_put_contents($fullpath, $this->formatCatalogue($messages, $domain, $options)); + } + } + + /** + * Transforms a domain of a message catalogue to its string representation. + */ + abstract public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string; + + /** + * Gets the file extension of the dumper. + */ + abstract protected function getExtension(): string; + + /** + * Gets the relative file path using the template. + */ + private function getRelativePath(string $domain, string $locale): string + { + return strtr($this->relativePathTemplate, [ + '%domain%' => $domain, + '%locale%' => $locale, + '%extension%' => $this->getExtension(), + ]); + } +} diff --git a/vendor/symfony/translation/Dumper/IcuResFileDumper.php b/vendor/symfony/translation/Dumper/IcuResFileDumper.php new file mode 100644 index 0000000..f13f86c --- /dev/null +++ b/vendor/symfony/translation/Dumper/IcuResFileDumper.php @@ -0,0 +1,104 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * IcuResDumper generates an ICU ResourceBundle formatted string representation of a message catalogue. + * + * @author Stealth35 + */ +class IcuResFileDumper extends FileDumper +{ + /** + * {@inheritdoc} + */ + protected $relativePathTemplate = '%domain%/%locale%.%extension%'; + + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + { + $data = $indexes = $resources = ''; + + foreach ($messages->all($domain) as $source => $target) { + $indexes .= pack('v', \strlen($data) + 28); + $data .= $source."\0"; + } + + $data .= $this->writePadding($data); + + $keyTop = $this->getPosition($data); + + foreach ($messages->all($domain) as $source => $target) { + $resources .= pack('V', $this->getPosition($data)); + + $data .= pack('V', \strlen($target)) + .mb_convert_encoding($target."\0", 'UTF-16LE', 'UTF-8') + .$this->writePadding($data) + ; + } + + $resOffset = $this->getPosition($data); + + $data .= pack('v', \count($messages->all($domain))) + .$indexes + .$this->writePadding($data) + .$resources + ; + + $bundleTop = $this->getPosition($data); + + $root = pack('V7', + $resOffset + (2 << 28), // Resource Offset + Resource Type + 6, // Index length + $keyTop, // Index keys top + $bundleTop, // Index resources top + $bundleTop, // Index bundle top + \count($messages->all($domain)), // Index max table length + 0 // Index attributes + ); + + $header = pack('vC2v4C12@32', + 32, // Header size + 0xDA, 0x27, // Magic number 1 and 2 + 20, 0, 0, 2, // Rest of the header, ..., Size of a char + 0x52, 0x65, 0x73, 0x42, // Data format identifier + 1, 2, 0, 0, // Data version + 1, 4, 0, 0 // Unicode version + ); + + return $header.$root.$data; + } + + private function writePadding(string $data): ?string + { + $padding = \strlen($data) % 4; + + return $padding ? str_repeat("\xAA", 4 - $padding) : null; + } + + private function getPosition(string $data) + { + return (\strlen($data) + 28) / 4; + } + + /** + * {@inheritdoc} + */ + protected function getExtension(): string + { + return 'res'; + } +} diff --git a/vendor/symfony/translation/Dumper/IniFileDumper.php b/vendor/symfony/translation/Dumper/IniFileDumper.php new file mode 100644 index 0000000..75032be --- /dev/null +++ b/vendor/symfony/translation/Dumper/IniFileDumper.php @@ -0,0 +1,45 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * IniFileDumper generates an ini formatted string representation of a message catalogue. + * + * @author Stealth35 + */ +class IniFileDumper extends FileDumper +{ + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + { + $output = ''; + + foreach ($messages->all($domain) as $source => $target) { + $escapeTarget = str_replace('"', '\"', $target); + $output .= $source.'="'.$escapeTarget."\"\n"; + } + + return $output; + } + + /** + * {@inheritdoc} + */ + protected function getExtension(): string + { + return 'ini'; + } +} diff --git a/vendor/symfony/translation/Dumper/JsonFileDumper.php b/vendor/symfony/translation/Dumper/JsonFileDumper.php new file mode 100644 index 0000000..1102730 --- /dev/null +++ b/vendor/symfony/translation/Dumper/JsonFileDumper.php @@ -0,0 +1,40 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * JsonFileDumper generates an json formatted string representation of a message catalogue. + * + * @author singles + */ +class JsonFileDumper extends FileDumper +{ + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + { + $flags = $options['json_encoding'] ?? \JSON_PRETTY_PRINT; + + return json_encode($messages->all($domain), $flags); + } + + /** + * {@inheritdoc} + */ + protected function getExtension(): string + { + return 'json'; + } +} diff --git a/vendor/symfony/translation/Dumper/MoFileDumper.php b/vendor/symfony/translation/Dumper/MoFileDumper.php new file mode 100644 index 0000000..1ea5462 --- /dev/null +++ b/vendor/symfony/translation/Dumper/MoFileDumper.php @@ -0,0 +1,82 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\Loader\MoFileLoader; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * MoFileDumper generates a gettext formatted string representation of a message catalogue. + * + * @author Stealth35 + */ +class MoFileDumper extends FileDumper +{ + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + { + $sources = $targets = $sourceOffsets = $targetOffsets = ''; + $offsets = []; + $size = 0; + + foreach ($messages->all($domain) as $source => $target) { + $offsets[] = array_map('strlen', [$sources, $source, $targets, $target]); + $sources .= "\0".$source; + $targets .= "\0".$target; + ++$size; + } + + $header = [ + 'magicNumber' => MoFileLoader::MO_LITTLE_ENDIAN_MAGIC, + 'formatRevision' => 0, + 'count' => $size, + 'offsetId' => MoFileLoader::MO_HEADER_SIZE, + 'offsetTranslated' => MoFileLoader::MO_HEADER_SIZE + (8 * $size), + 'sizeHashes' => 0, + 'offsetHashes' => MoFileLoader::MO_HEADER_SIZE + (16 * $size), + ]; + + $sourcesSize = \strlen($sources); + $sourcesStart = $header['offsetHashes'] + 1; + + foreach ($offsets as $offset) { + $sourceOffsets .= $this->writeLong($offset[1]) + .$this->writeLong($offset[0] + $sourcesStart); + $targetOffsets .= $this->writeLong($offset[3]) + .$this->writeLong($offset[2] + $sourcesStart + $sourcesSize); + } + + $output = implode('', array_map([$this, 'writeLong'], $header)) + .$sourceOffsets + .$targetOffsets + .$sources + .$targets + ; + + return $output; + } + + /** + * {@inheritdoc} + */ + protected function getExtension(): string + { + return 'mo'; + } + + private function writeLong(mixed $str): string + { + return pack('V*', $str); + } +} diff --git a/vendor/symfony/translation/Dumper/PhpFileDumper.php b/vendor/symfony/translation/Dumper/PhpFileDumper.php new file mode 100644 index 0000000..565d893 --- /dev/null +++ b/vendor/symfony/translation/Dumper/PhpFileDumper.php @@ -0,0 +1,38 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * PhpFileDumper generates PHP files from a message catalogue. + * + * @author Michel Salib <michelsalib@hotmail.com> + */ +class PhpFileDumper extends FileDumper +{ + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + { + return "<?php\n\nreturn ".var_export($messages->all($domain), true).";\n"; + } + + /** + * {@inheritdoc} + */ + protected function getExtension(): string + { + return 'php'; + } +} diff --git a/vendor/symfony/translation/Dumper/PoFileDumper.php b/vendor/symfony/translation/Dumper/PoFileDumper.php new file mode 100644 index 0000000..313e504 --- /dev/null +++ b/vendor/symfony/translation/Dumper/PoFileDumper.php @@ -0,0 +1,137 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * PoFileDumper generates a gettext formatted string representation of a message catalogue. + * + * @author Stealth35 + */ +class PoFileDumper extends FileDumper +{ + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + { + $output = 'msgid ""'."\n"; + $output .= 'msgstr ""'."\n"; + $output .= '"Content-Type: text/plain; charset=UTF-8\n"'."\n"; + $output .= '"Content-Transfer-Encoding: 8bit\n"'."\n"; + $output .= '"Language: '.$messages->getLocale().'\n"'."\n"; + $output .= "\n"; + + $newLine = false; + foreach ($messages->all($domain) as $source => $target) { + if ($newLine) { + $output .= "\n"; + } else { + $newLine = true; + } + $metadata = $messages->getMetadata($source, $domain); + + if (isset($metadata['comments'])) { + $output .= $this->formatComments($metadata['comments']); + } + if (isset($metadata['flags'])) { + $output .= $this->formatComments(implode(',', (array) $metadata['flags']), ','); + } + if (isset($metadata['sources'])) { + $output .= $this->formatComments(implode(' ', (array) $metadata['sources']), ':'); + } + + $sourceRules = $this->getStandardRules($source); + $targetRules = $this->getStandardRules($target); + if (2 == \count($sourceRules) && [] !== $targetRules) { + $output .= sprintf('msgid "%s"'."\n", $this->escape($sourceRules[0])); + $output .= sprintf('msgid_plural "%s"'."\n", $this->escape($sourceRules[1])); + foreach ($targetRules as $i => $targetRule) { + $output .= sprintf('msgstr[%d] "%s"'."\n", $i, $this->escape($targetRule)); + } + } else { + $output .= sprintf('msgid "%s"'."\n", $this->escape($source)); + $output .= sprintf('msgstr "%s"'."\n", $this->escape($target)); + } + } + + return $output; + } + + private function getStandardRules(string $id) + { + // Partly copied from TranslatorTrait::trans. + $parts = []; + if (preg_match('/^\|++$/', $id)) { + $parts = explode('|', $id); + } elseif (preg_match_all('/(?:\|\||[^\|])++/', $id, $matches)) { + $parts = $matches[0]; + } + + $intervalRegexp = <<<'EOF' +/^(?P<interval> + ({\s* + (\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*) + \s*}) + + | + + (?P<left_delimiter>[\[\]]) + \s* + (?P<left>-Inf|\-?\d+(\.\d+)?) + \s*,\s* + (?P<right>\+?Inf|\-?\d+(\.\d+)?) + \s* + (?P<right_delimiter>[\[\]]) +)\s*(?P<message>.*?)$/xs +EOF; + + $standardRules = []; + foreach ($parts as $part) { + $part = trim(str_replace('||', '|', $part)); + + if (preg_match($intervalRegexp, $part)) { + // Explicit rule is not a standard rule. + return []; + } else { + $standardRules[] = $part; + } + } + + return $standardRules; + } + + /** + * {@inheritdoc} + */ + protected function getExtension(): string + { + return 'po'; + } + + private function escape(string $str): string + { + return addcslashes($str, "\0..\37\42\134"); + } + + private function formatComments(string|array $comments, string $prefix = ''): ?string + { + $output = null; + + foreach ((array) $comments as $comment) { + $output .= sprintf('#%s %s'."\n", $prefix, $comment); + } + + return $output; + } +} diff --git a/vendor/symfony/translation/Dumper/QtFileDumper.php b/vendor/symfony/translation/Dumper/QtFileDumper.php new file mode 100644 index 0000000..819409f --- /dev/null +++ b/vendor/symfony/translation/Dumper/QtFileDumper.php @@ -0,0 +1,61 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * QtFileDumper generates ts files from a message catalogue. + * + * @author Benjamin Eberlei <kontakt@beberlei.de> + */ +class QtFileDumper extends FileDumper +{ + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + { + $dom = new \DOMDocument('1.0', 'utf-8'); + $dom->formatOutput = true; + $ts = $dom->appendChild($dom->createElement('TS')); + $context = $ts->appendChild($dom->createElement('context')); + $context->appendChild($dom->createElement('name', $domain)); + + foreach ($messages->all($domain) as $source => $target) { + $message = $context->appendChild($dom->createElement('message')); + $metadata = $messages->getMetadata($source, $domain); + if (isset($metadata['sources'])) { + foreach ((array) $metadata['sources'] as $location) { + $loc = explode(':', $location, 2); + $location = $message->appendChild($dom->createElement('location')); + $location->setAttribute('filename', $loc[0]); + if (isset($loc[1])) { + $location->setAttribute('line', $loc[1]); + } + } + } + $message->appendChild($dom->createElement('source', $source)); + $message->appendChild($dom->createElement('translation', $target)); + } + + return $dom->saveXML(); + } + + /** + * {@inheritdoc} + */ + protected function getExtension(): string + { + return 'ts'; + } +} diff --git a/vendor/symfony/translation/Dumper/XliffFileDumper.php b/vendor/symfony/translation/Dumper/XliffFileDumper.php new file mode 100644 index 0000000..b8a109a --- /dev/null +++ b/vendor/symfony/translation/Dumper/XliffFileDumper.php @@ -0,0 +1,203 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * XliffFileDumper generates xliff files from a message catalogue. + * + * @author Michel Salib <michelsalib@hotmail.com> + */ +class XliffFileDumper extends FileDumper +{ + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + { + $xliffVersion = '1.2'; + if (\array_key_exists('xliff_version', $options)) { + $xliffVersion = $options['xliff_version']; + } + + if (\array_key_exists('default_locale', $options)) { + $defaultLocale = $options['default_locale']; + } else { + $defaultLocale = \Locale::getDefault(); + } + + if ('1.2' === $xliffVersion) { + return $this->dumpXliff1($defaultLocale, $messages, $domain, $options); + } + if ('2.0' === $xliffVersion) { + return $this->dumpXliff2($defaultLocale, $messages, $domain); + } + + throw new InvalidArgumentException(sprintf('No support implemented for dumping XLIFF version "%s".', $xliffVersion)); + } + + /** + * {@inheritdoc} + */ + protected function getExtension(): string + { + return 'xlf'; + } + + private function dumpXliff1(string $defaultLocale, MessageCatalogue $messages, ?string $domain, array $options = []) + { + $toolInfo = ['tool-id' => 'symfony', 'tool-name' => 'Symfony']; + if (\array_key_exists('tool_info', $options)) { + $toolInfo = array_merge($toolInfo, $options['tool_info']); + } + + $dom = new \DOMDocument('1.0', 'utf-8'); + $dom->formatOutput = true; + + $xliff = $dom->appendChild($dom->createElement('xliff')); + $xliff->setAttribute('version', '1.2'); + $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:1.2'); + + $xliffFile = $xliff->appendChild($dom->createElement('file')); + $xliffFile->setAttribute('source-language', str_replace('_', '-', $defaultLocale)); + $xliffFile->setAttribute('target-language', str_replace('_', '-', $messages->getLocale())); + $xliffFile->setAttribute('datatype', 'plaintext'); + $xliffFile->setAttribute('original', 'file.ext'); + + $xliffHead = $xliffFile->appendChild($dom->createElement('header')); + $xliffTool = $xliffHead->appendChild($dom->createElement('tool')); + foreach ($toolInfo as $id => $value) { + $xliffTool->setAttribute($id, $value); + } + + $xliffBody = $xliffFile->appendChild($dom->createElement('body')); + foreach ($messages->all($domain) as $source => $target) { + $translation = $dom->createElement('trans-unit'); + + $translation->setAttribute('id', strtr(substr(base64_encode(hash('sha256', $source, true)), 0, 7), '/+', '._')); + $translation->setAttribute('resname', $source); + + $s = $translation->appendChild($dom->createElement('source')); + $s->appendChild($dom->createTextNode($source)); + + // Does the target contain characters requiring a CDATA section? + $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target); + + $targetElement = $dom->createElement('target'); + $metadata = $messages->getMetadata($source, $domain); + if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) { + foreach ($metadata['target-attributes'] as $name => $value) { + $targetElement->setAttribute($name, $value); + } + } + $t = $translation->appendChild($targetElement); + $t->appendChild($text); + + if ($this->hasMetadataArrayInfo('notes', $metadata)) { + foreach ($metadata['notes'] as $note) { + if (!isset($note['content'])) { + continue; + } + + $n = $translation->appendChild($dom->createElement('note')); + $n->appendChild($dom->createTextNode($note['content'])); + + if (isset($note['priority'])) { + $n->setAttribute('priority', $note['priority']); + } + + if (isset($note['from'])) { + $n->setAttribute('from', $note['from']); + } + } + } + + $xliffBody->appendChild($translation); + } + + return $dom->saveXML(); + } + + private function dumpXliff2(string $defaultLocale, MessageCatalogue $messages, ?string $domain) + { + $dom = new \DOMDocument('1.0', 'utf-8'); + $dom->formatOutput = true; + + $xliff = $dom->appendChild($dom->createElement('xliff')); + $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:2.0'); + $xliff->setAttribute('version', '2.0'); + $xliff->setAttribute('srcLang', str_replace('_', '-', $defaultLocale)); + $xliff->setAttribute('trgLang', str_replace('_', '-', $messages->getLocale())); + + $xliffFile = $xliff->appendChild($dom->createElement('file')); + if (str_ends_with($domain, MessageCatalogue::INTL_DOMAIN_SUFFIX)) { + $xliffFile->setAttribute('id', substr($domain, 0, -\strlen(MessageCatalogue::INTL_DOMAIN_SUFFIX)).'.'.$messages->getLocale()); + } else { + $xliffFile->setAttribute('id', $domain.'.'.$messages->getLocale()); + } + + foreach ($messages->all($domain) as $source => $target) { + $translation = $dom->createElement('unit'); + $translation->setAttribute('id', strtr(substr(base64_encode(hash('sha256', $source, true)), 0, 7), '/+', '._')); + + if (\strlen($source) <= 80) { + $translation->setAttribute('name', $source); + } + + $metadata = $messages->getMetadata($source, $domain); + + // Add notes section + if ($this->hasMetadataArrayInfo('notes', $metadata)) { + $notesElement = $dom->createElement('notes'); + foreach ($metadata['notes'] as $note) { + $n = $dom->createElement('note'); + $n->appendChild($dom->createTextNode($note['content'] ?? '')); + unset($note['content']); + + foreach ($note as $name => $value) { + $n->setAttribute($name, $value); + } + $notesElement->appendChild($n); + } + $translation->appendChild($notesElement); + } + + $segment = $translation->appendChild($dom->createElement('segment')); + + $s = $segment->appendChild($dom->createElement('source')); + $s->appendChild($dom->createTextNode($source)); + + // Does the target contain characters requiring a CDATA section? + $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target); + + $targetElement = $dom->createElement('target'); + if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) { + foreach ($metadata['target-attributes'] as $name => $value) { + $targetElement->setAttribute($name, $value); + } + } + $t = $segment->appendChild($targetElement); + $t->appendChild($text); + + $xliffFile->appendChild($translation); + } + + return $dom->saveXML(); + } + + private function hasMetadataArrayInfo(string $key, array $metadata = null): bool + { + return is_iterable($metadata[$key] ?? null); + } +} diff --git a/vendor/symfony/translation/Dumper/YamlFileDumper.php b/vendor/symfony/translation/Dumper/YamlFileDumper.php new file mode 100644 index 0000000..d0cfbef --- /dev/null +++ b/vendor/symfony/translation/Dumper/YamlFileDumper.php @@ -0,0 +1,62 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Dumper; + +use Symfony\Component\Translation\Exception\LogicException; +use Symfony\Component\Translation\MessageCatalogue; +use Symfony\Component\Translation\Util\ArrayConverter; +use Symfony\Component\Yaml\Yaml; + +/** + * YamlFileDumper generates yaml files from a message catalogue. + * + * @author Michel Salib <michelsalib@hotmail.com> + */ +class YamlFileDumper extends FileDumper +{ + private string $extension; + + public function __construct(string $extension = 'yml') + { + $this->extension = $extension; + } + + /** + * {@inheritdoc} + */ + public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string + { + if (!class_exists(Yaml::class)) { + throw new LogicException('Dumping translations in the YAML format requires the Symfony Yaml component.'); + } + + $data = $messages->all($domain); + + if (isset($options['as_tree']) && $options['as_tree']) { + $data = ArrayConverter::expandToTree($data); + } + + if (isset($options['inline']) && ($inline = (int) $options['inline']) > 0) { + return Yaml::dump($data, $inline); + } + + return Yaml::dump($data); + } + + /** + * {@inheritdoc} + */ + protected function getExtension(): string + { + return $this->extension; + } +} diff --git a/vendor/symfony/translation/Exception/ExceptionInterface.php b/vendor/symfony/translation/Exception/ExceptionInterface.php new file mode 100644 index 0000000..8f9c54e --- /dev/null +++ b/vendor/symfony/translation/Exception/ExceptionInterface.php @@ -0,0 +1,21 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Exception; + +/** + * Exception interface for all exceptions thrown by the component. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +interface ExceptionInterface extends \Throwable +{ +} diff --git a/vendor/symfony/translation/Exception/IncompleteDsnException.php b/vendor/symfony/translation/Exception/IncompleteDsnException.php new file mode 100644 index 0000000..cb0ce02 --- /dev/null +++ b/vendor/symfony/translation/Exception/IncompleteDsnException.php @@ -0,0 +1,24 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Exception; + +class IncompleteDsnException extends InvalidArgumentException +{ + public function __construct(string $message, string $dsn = null, \Throwable $previous = null) + { + if ($dsn) { + $message = sprintf('Invalid "%s" provider DSN: ', $dsn).$message; + } + + parent::__construct($message, 0, $previous); + } +} diff --git a/vendor/symfony/translation/Exception/InvalidArgumentException.php b/vendor/symfony/translation/Exception/InvalidArgumentException.php new file mode 100644 index 0000000..90d0669 --- /dev/null +++ b/vendor/symfony/translation/Exception/InvalidArgumentException.php @@ -0,0 +1,21 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Exception; + +/** + * Base InvalidArgumentException for the Translation component. + * + * @author Abdellatif Ait boudad <a.aitboudad@gmail.com> + */ +class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/translation/Exception/InvalidResourceException.php b/vendor/symfony/translation/Exception/InvalidResourceException.php new file mode 100644 index 0000000..cf07943 --- /dev/null +++ b/vendor/symfony/translation/Exception/InvalidResourceException.php @@ -0,0 +1,21 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Exception; + +/** + * Thrown when a resource cannot be loaded. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class InvalidResourceException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/translation/Exception/LogicException.php b/vendor/symfony/translation/Exception/LogicException.php new file mode 100644 index 0000000..9019c7e --- /dev/null +++ b/vendor/symfony/translation/Exception/LogicException.php @@ -0,0 +1,21 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Exception; + +/** + * Base LogicException for Translation component. + * + * @author Abdellatif Ait boudad <a.aitboudad@gmail.com> + */ +class LogicException extends \LogicException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/translation/Exception/MissingRequiredOptionException.php b/vendor/symfony/translation/Exception/MissingRequiredOptionException.php new file mode 100644 index 0000000..2b5f808 --- /dev/null +++ b/vendor/symfony/translation/Exception/MissingRequiredOptionException.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Exception; + +/** + * @author Oskar Stark <oskarstark@googlemail.com> + */ +class MissingRequiredOptionException extends IncompleteDsnException +{ + public function __construct(string $option, string $dsn = null, \Throwable $previous = null) + { + $message = sprintf('The option "%s" is required but missing.', $option); + + parent::__construct($message, $dsn, $previous); + } +} diff --git a/vendor/symfony/translation/Exception/NotFoundResourceException.php b/vendor/symfony/translation/Exception/NotFoundResourceException.php new file mode 100644 index 0000000..cff73ae --- /dev/null +++ b/vendor/symfony/translation/Exception/NotFoundResourceException.php @@ -0,0 +1,21 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Exception; + +/** + * Thrown when a resource does not exist. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class NotFoundResourceException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/translation/Exception/ProviderException.php b/vendor/symfony/translation/Exception/ProviderException.php new file mode 100644 index 0000000..331ff75 --- /dev/null +++ b/vendor/symfony/translation/Exception/ProviderException.php @@ -0,0 +1,41 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Exception; + +use Symfony\Contracts\HttpClient\ResponseInterface; + +/** + * @author Fabien Potencier <fabien@symfony.com> + */ +class ProviderException extends RuntimeException implements ProviderExceptionInterface +{ + private $response; + private string $debug; + + public function __construct(string $message, ResponseInterface $response, int $code = 0, \Exception $previous = null) + { + $this->response = $response; + $this->debug = $response->getInfo('debug') ?? ''; + + parent::__construct($message, $code, $previous); + } + + public function getResponse(): ResponseInterface + { + return $this->response; + } + + public function getDebug(): string + { + return $this->debug; + } +} diff --git a/vendor/symfony/translation/Exception/ProviderExceptionInterface.php b/vendor/symfony/translation/Exception/ProviderExceptionInterface.php new file mode 100644 index 0000000..922e827 --- /dev/null +++ b/vendor/symfony/translation/Exception/ProviderExceptionInterface.php @@ -0,0 +1,23 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Exception; + +/** + * @author Fabien Potencier <fabien@symfony.com> + */ +interface ProviderExceptionInterface extends ExceptionInterface +{ + /* + * Returns debug info coming from the Symfony\Contracts\HttpClient\ResponseInterface + */ + public function getDebug(): string; +} diff --git a/vendor/symfony/translation/Exception/RuntimeException.php b/vendor/symfony/translation/Exception/RuntimeException.php new file mode 100644 index 0000000..dcd7940 --- /dev/null +++ b/vendor/symfony/translation/Exception/RuntimeException.php @@ -0,0 +1,21 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Exception; + +/** + * Base RuntimeException for the Translation component. + * + * @author Abdellatif Ait boudad <a.aitboudad@gmail.com> + */ +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/translation/Exception/UnsupportedSchemeException.php b/vendor/symfony/translation/Exception/UnsupportedSchemeException.php new file mode 100644 index 0000000..7fbaa8f --- /dev/null +++ b/vendor/symfony/translation/Exception/UnsupportedSchemeException.php @@ -0,0 +1,54 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Exception; + +use Symfony\Component\Translation\Bridge; +use Symfony\Component\Translation\Provider\Dsn; + +class UnsupportedSchemeException extends LogicException +{ + private const SCHEME_TO_PACKAGE_MAP = [ + 'crowdin' => [ + 'class' => Bridge\Crowdin\CrowdinProviderFactory::class, + 'package' => 'symfony/crowdin-translation-provider', + ], + 'loco' => [ + 'class' => Bridge\Loco\LocoProviderFactory::class, + 'package' => 'symfony/loco-translation-provider', + ], + 'lokalise' => [ + 'class' => Bridge\Lokalise\LokaliseProviderFactory::class, + 'package' => 'symfony/lokalise-translation-provider', + ], + ]; + + public function __construct(Dsn $dsn, string $name = null, array $supported = []) + { + $provider = $dsn->getScheme(); + if (false !== $pos = strpos($provider, '+')) { + $provider = substr($provider, 0, $pos); + } + $package = self::SCHEME_TO_PACKAGE_MAP[$provider] ?? null; + if ($package && !class_exists($package['class'])) { + parent::__construct(sprintf('Unable to synchronize translations via "%s" as the provider is not installed; try running "composer require %s".', $provider, $package['package'])); + + return; + } + + $message = sprintf('The "%s" scheme is not supported', $dsn->getScheme()); + if ($name && $supported) { + $message .= sprintf('; supported schemes for translation provider "%s" are: "%s"', $name, implode('", "', $supported)); + } + + parent::__construct($message.'.'); + } +} diff --git a/vendor/symfony/translation/Extractor/AbstractFileExtractor.php b/vendor/symfony/translation/Extractor/AbstractFileExtractor.php new file mode 100644 index 0000000..4c088b9 --- /dev/null +++ b/vendor/symfony/translation/Extractor/AbstractFileExtractor.php @@ -0,0 +1,67 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Extractor; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; + +/** + * Base class used by classes that extract translation messages from files. + * + * @author Marcos D. Sánchez <marcosdsanchez@gmail.com> + */ +abstract class AbstractFileExtractor +{ + protected function extractFiles(string|iterable $resource): iterable + { + if (is_iterable($resource)) { + $files = []; + foreach ($resource as $file) { + if ($this->canBeExtracted($file)) { + $files[] = $this->toSplFileInfo($file); + } + } + } elseif (is_file($resource)) { + $files = $this->canBeExtracted($resource) ? [$this->toSplFileInfo($resource)] : []; + } else { + $files = $this->extractFromDirectory($resource); + } + + return $files; + } + + private function toSplFileInfo(string $file): \SplFileInfo + { + return new \SplFileInfo($file); + } + + /** + * @throws InvalidArgumentException + */ + protected function isFile(string $file): bool + { + if (!is_file($file)) { + throw new InvalidArgumentException(sprintf('The "%s" file does not exist.', $file)); + } + + return true; + } + + /** + * @return bool + */ + abstract protected function canBeExtracted(string $file); + + /** + * @return iterable + */ + abstract protected function extractFromDirectory(string|array $resource); +} diff --git a/vendor/symfony/translation/Extractor/ChainExtractor.php b/vendor/symfony/translation/Extractor/ChainExtractor.php new file mode 100644 index 0000000..e58e82f --- /dev/null +++ b/vendor/symfony/translation/Extractor/ChainExtractor.php @@ -0,0 +1,57 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Extractor; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * ChainExtractor extracts translation messages from template files. + * + * @author Michel Salib <michelsalib@hotmail.com> + */ +class ChainExtractor implements ExtractorInterface +{ + /** + * The extractors. + * + * @var ExtractorInterface[] + */ + private array $extractors = []; + + /** + * Adds a loader to the translation extractor. + */ + public function addExtractor(string $format, ExtractorInterface $extractor) + { + $this->extractors[$format] = $extractor; + } + + /** + * {@inheritdoc} + */ + public function setPrefix(string $prefix) + { + foreach ($this->extractors as $extractor) { + $extractor->setPrefix($prefix); + } + } + + /** + * {@inheritdoc} + */ + public function extract(string|iterable $directory, MessageCatalogue $catalogue) + { + foreach ($this->extractors as $extractor) { + $extractor->extract($directory, $catalogue); + } + } +} diff --git a/vendor/symfony/translation/Extractor/ExtractorInterface.php b/vendor/symfony/translation/Extractor/ExtractorInterface.php new file mode 100644 index 0000000..b76a7f2 --- /dev/null +++ b/vendor/symfony/translation/Extractor/ExtractorInterface.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Extractor; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * Extracts translation messages from a directory or files to the catalogue. + * New found messages are injected to the catalogue using the prefix. + * + * @author Michel Salib <michelsalib@hotmail.com> + */ +interface ExtractorInterface +{ + /** + * Extracts translation messages from files, a file or a directory to the catalogue. + * + * @param string|iterable<string> $resource Files, a file or a directory + */ + public function extract(string|iterable $resource, MessageCatalogue $catalogue); + + /** + * Sets the prefix that should be used for new found messages. + */ + public function setPrefix(string $prefix); +} diff --git a/vendor/symfony/translation/Extractor/PhpExtractor.php b/vendor/symfony/translation/Extractor/PhpExtractor.php new file mode 100644 index 0000000..1b86cc5 --- /dev/null +++ b/vendor/symfony/translation/Extractor/PhpExtractor.php @@ -0,0 +1,330 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Extractor; + +use Symfony\Component\Finder\Finder; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * PhpExtractor extracts translation messages from a PHP template. + * + * @author Michel Salib <michelsalib@hotmail.com> + */ +class PhpExtractor extends AbstractFileExtractor implements ExtractorInterface +{ + public const MESSAGE_TOKEN = 300; + public const METHOD_ARGUMENTS_TOKEN = 1000; + public const DOMAIN_TOKEN = 1001; + + /** + * Prefix for new found message. + */ + private string $prefix = ''; + + /** + * The sequence that captures translation messages. + */ + protected $sequences = [ + [ + '->', + 'trans', + '(', + self::MESSAGE_TOKEN, + ',', + self::METHOD_ARGUMENTS_TOKEN, + ',', + self::DOMAIN_TOKEN, + ], + [ + '->', + 'trans', + '(', + self::MESSAGE_TOKEN, + ], + [ + 'new', + 'TranslatableMessage', + '(', + self::MESSAGE_TOKEN, + ',', + self::METHOD_ARGUMENTS_TOKEN, + ',', + self::DOMAIN_TOKEN, + ], + [ + 'new', + 'TranslatableMessage', + '(', + self::MESSAGE_TOKEN, + ], + [ + 'new', + '\\', + 'Symfony', + '\\', + 'Component', + '\\', + 'Translation', + '\\', + 'TranslatableMessage', + '(', + self::MESSAGE_TOKEN, + ',', + self::METHOD_ARGUMENTS_TOKEN, + ',', + self::DOMAIN_TOKEN, + ], + [ + 'new', + '\Symfony\Component\Translation\TranslatableMessage', + '(', + self::MESSAGE_TOKEN, + ',', + self::METHOD_ARGUMENTS_TOKEN, + ',', + self::DOMAIN_TOKEN, + ], + [ + 'new', + '\\', + 'Symfony', + '\\', + 'Component', + '\\', + 'Translation', + '\\', + 'TranslatableMessage', + '(', + self::MESSAGE_TOKEN, + ], + [ + 'new', + '\Symfony\Component\Translation\TranslatableMessage', + '(', + self::MESSAGE_TOKEN, + ], + [ + 't', + '(', + self::MESSAGE_TOKEN, + ',', + self::METHOD_ARGUMENTS_TOKEN, + ',', + self::DOMAIN_TOKEN, + ], + [ + 't', + '(', + self::MESSAGE_TOKEN, + ], + ]; + + /** + * {@inheritdoc} + */ + public function extract(string|iterable $resource, MessageCatalogue $catalog) + { + $files = $this->extractFiles($resource); + foreach ($files as $file) { + $this->parseTokens(token_get_all(file_get_contents($file)), $catalog, $file); + + gc_mem_caches(); + } + } + + /** + * {@inheritdoc} + */ + public function setPrefix(string $prefix) + { + $this->prefix = $prefix; + } + + /** + * Normalizes a token. + */ + protected function normalizeToken(mixed $token): ?string + { + if (isset($token[1]) && 'b"' !== $token) { + return $token[1]; + } + + return $token; + } + + /** + * Seeks to a non-whitespace token. + */ + private function seekToNextRelevantToken(\Iterator $tokenIterator) + { + for (; $tokenIterator->valid(); $tokenIterator->next()) { + $t = $tokenIterator->current(); + if (\T_WHITESPACE !== $t[0]) { + break; + } + } + } + + private function skipMethodArgument(\Iterator $tokenIterator) + { + $openBraces = 0; + + for (; $tokenIterator->valid(); $tokenIterator->next()) { + $t = $tokenIterator->current(); + + if ('[' === $t[0] || '(' === $t[0]) { + ++$openBraces; + } + + if (']' === $t[0] || ')' === $t[0]) { + --$openBraces; + } + + if ((0 === $openBraces && ',' === $t[0]) || (-1 === $openBraces && ')' === $t[0])) { + break; + } + } + } + + /** + * Extracts the message from the iterator while the tokens + * match allowed message tokens. + */ + private function getValue(\Iterator $tokenIterator) + { + $message = ''; + $docToken = ''; + $docPart = ''; + + for (; $tokenIterator->valid(); $tokenIterator->next()) { + $t = $tokenIterator->current(); + if ('.' === $t) { + // Concatenate with next token + continue; + } + if (!isset($t[1])) { + break; + } + + switch ($t[0]) { + case \T_START_HEREDOC: + $docToken = $t[1]; + break; + case \T_ENCAPSED_AND_WHITESPACE: + case \T_CONSTANT_ENCAPSED_STRING: + if ('' === $docToken) { + $message .= PhpStringTokenParser::parse($t[1]); + } else { + $docPart = $t[1]; + } + break; + case \T_END_HEREDOC: + if ($indentation = strspn($t[1], ' ')) { + $docPartWithLineBreaks = $docPart; + $docPart = ''; + + foreach (preg_split('~(\r\n|\n|\r)~', $docPartWithLineBreaks, -1, \PREG_SPLIT_DELIM_CAPTURE) as $str) { + if (\in_array($str, ["\r\n", "\n", "\r"], true)) { + $docPart .= $str; + } else { + $docPart .= substr($str, $indentation); + } + } + } + + $message .= PhpStringTokenParser::parseDocString($docToken, $docPart); + $docToken = ''; + $docPart = ''; + break; + case \T_WHITESPACE: + break; + default: + break 2; + } + } + + return $message; + } + + /** + * Extracts trans message from PHP tokens. + */ + protected function parseTokens(array $tokens, MessageCatalogue $catalog, string $filename) + { + $tokenIterator = new \ArrayIterator($tokens); + + for ($key = 0; $key < $tokenIterator->count(); ++$key) { + foreach ($this->sequences as $sequence) { + $message = ''; + $domain = 'messages'; + $tokenIterator->seek($key); + + foreach ($sequence as $sequenceKey => $item) { + $this->seekToNextRelevantToken($tokenIterator); + + if ($this->normalizeToken($tokenIterator->current()) === $item) { + $tokenIterator->next(); + continue; + } elseif (self::MESSAGE_TOKEN === $item) { + $message = $this->getValue($tokenIterator); + + if (\count($sequence) === ($sequenceKey + 1)) { + break; + } + } elseif (self::METHOD_ARGUMENTS_TOKEN === $item) { + $this->skipMethodArgument($tokenIterator); + } elseif (self::DOMAIN_TOKEN === $item) { + $domainToken = $this->getValue($tokenIterator); + if ('' !== $domainToken) { + $domain = $domainToken; + } + + break; + } else { + break; + } + } + + if ($message) { + $catalog->set($message, $this->prefix.$message, $domain); + $metadata = $catalog->getMetadata($message, $domain) ?? []; + $normalizedFilename = preg_replace('{[\\\\/]+}', '/', $filename); + $metadata['sources'][] = $normalizedFilename.':'.$tokens[$key][2]; + $catalog->setMetadata($message, $metadata, $domain); + break; + } + } + } + } + + /** + * @throws \InvalidArgumentException + */ + protected function canBeExtracted(string $file): bool + { + return $this->isFile($file) && 'php' === pathinfo($file, \PATHINFO_EXTENSION); + } + + /** + * {@inheritdoc} + */ + protected function extractFromDirectory(string|array $directory): iterable + { + if (!class_exists(Finder::class)) { + throw new \LogicException(sprintf('You cannot use "%s" as the "symfony/finder" package is not installed. Try running "composer require symfony/finder".', static::class)); + } + + $finder = new Finder(); + + return $finder->files()->name('*.php')->in($directory); + } +} diff --git a/vendor/symfony/translation/Extractor/PhpStringTokenParser.php b/vendor/symfony/translation/Extractor/PhpStringTokenParser.php new file mode 100644 index 0000000..7fbd37c --- /dev/null +++ b/vendor/symfony/translation/Extractor/PhpStringTokenParser.php @@ -0,0 +1,136 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Extractor; + +/* + * The following is derived from code at http://github.com/nikic/PHP-Parser + * + * Copyright (c) 2011 by Nikita Popov + * + * Some 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. + * + * * The names of the contributors may not 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. + */ + +class PhpStringTokenParser +{ + protected static $replacements = [ + '\\' => '\\', + '$' => '$', + 'n' => "\n", + 'r' => "\r", + 't' => "\t", + 'f' => "\f", + 'v' => "\v", + 'e' => "\x1B", + ]; + + /** + * Parses a string token. + * + * @param string $str String token content + */ + public static function parse(string $str): string + { + $bLength = 0; + if ('b' === $str[0]) { + $bLength = 1; + } + + if ('\'' === $str[$bLength]) { + return str_replace( + ['\\\\', '\\\''], + ['\\', '\''], + substr($str, $bLength + 1, -1) + ); + } else { + return self::parseEscapeSequences(substr($str, $bLength + 1, -1), '"'); + } + } + + /** + * Parses escape sequences in strings (all string types apart from single quoted). + * + * @param string $str String without quotes + * @param string|null $quote Quote type + */ + public static function parseEscapeSequences(string $str, string $quote = null): string + { + if (null !== $quote) { + $str = str_replace('\\'.$quote, $quote, $str); + } + + return preg_replace_callback( + '~\\\\([\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3})~', + [__CLASS__, 'parseCallback'], + $str + ); + } + + private static function parseCallback(array $matches): string + { + $str = $matches[1]; + + if (isset(self::$replacements[$str])) { + return self::$replacements[$str]; + } elseif ('x' === $str[0] || 'X' === $str[0]) { + return \chr(hexdec($str)); + } else { + return \chr(octdec($str)); + } + } + + /** + * Parses a constant doc string. + * + * @param string $startToken Doc string start token content (<<<SMTHG) + * @param string $str String token content + */ + public static function parseDocString(string $startToken, string $str): string + { + // strip last newline (thanks tokenizer for sticking it into the string!) + $str = preg_replace('~(\r\n|\n|\r)$~', '', $str); + + // nowdoc string + if (str_contains($startToken, '\'')) { + return $str; + } + + return self::parseEscapeSequences($str, null); + } +} diff --git a/vendor/symfony/translation/Formatter/IntlFormatter.php b/vendor/symfony/translation/Formatter/IntlFormatter.php new file mode 100644 index 0000000..f7f1c36 --- /dev/null +++ b/vendor/symfony/translation/Formatter/IntlFormatter.php @@ -0,0 +1,60 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Formatter; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Exception\LogicException; + +/** + * @author Guilherme Blanco <guilhermeblanco@hotmail.com> + * @author Abdellatif Ait boudad <a.aitboudad@gmail.com> + */ +class IntlFormatter implements IntlFormatterInterface +{ + private $hasMessageFormatter; + private $cache = []; + + /** + * {@inheritdoc} + */ + public function formatIntl(string $message, string $locale, array $parameters = []): string + { + // MessageFormatter constructor throws an exception if the message is empty + if ('' === $message) { + return ''; + } + + if (!$formatter = $this->cache[$locale][$message] ?? null) { + if (!($this->hasMessageFormatter ?? $this->hasMessageFormatter = class_exists(\MessageFormatter::class))) { + throw new LogicException('Cannot parse message translation: please install the "intl" PHP extension or the "symfony/polyfill-intl-messageformatter" package.'); + } + try { + $this->cache[$locale][$message] = $formatter = new \MessageFormatter($locale, $message); + } catch (\IntlException $e) { + throw new InvalidArgumentException(sprintf('Invalid message format (error #%d): ', intl_get_error_code()).intl_get_error_message(), 0, $e); + } + } + + foreach ($parameters as $key => $value) { + if (\in_array($key[0] ?? null, ['%', '{'], true)) { + unset($parameters[$key]); + $parameters[trim($key, '%{ }')] = $value; + } + } + + if (false === $message = $formatter->format($parameters)) { + throw new InvalidArgumentException(sprintf('Unable to format message (error #%s): ', $formatter->getErrorCode()).$formatter->getErrorMessage()); + } + + return $message; + } +} diff --git a/vendor/symfony/translation/Formatter/IntlFormatterInterface.php b/vendor/symfony/translation/Formatter/IntlFormatterInterface.php new file mode 100644 index 0000000..02fc6ac --- /dev/null +++ b/vendor/symfony/translation/Formatter/IntlFormatterInterface.php @@ -0,0 +1,27 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Formatter; + +/** + * Formats ICU message patterns. + * + * @author Nicolas Grekas <p@tchwork.com> + */ +interface IntlFormatterInterface +{ + /** + * Formats a localized message using rules defined by ICU MessageFormat. + * + * @see http://icu-project.org/apiref/icu4c/classMessageFormat.html#details + */ + public function formatIntl(string $message, string $locale, array $parameters = []): string; +} diff --git a/vendor/symfony/translation/Formatter/MessageFormatter.php b/vendor/symfony/translation/Formatter/MessageFormatter.php new file mode 100644 index 0000000..68821b1 --- /dev/null +++ b/vendor/symfony/translation/Formatter/MessageFormatter.php @@ -0,0 +1,56 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Formatter; + +use Symfony\Component\Translation\IdentityTranslator; +use Symfony\Contracts\Translation\TranslatorInterface; + +// Help opcache.preload discover always-needed symbols +class_exists(IntlFormatter::class); + +/** + * @author Abdellatif Ait boudad <a.aitboudad@gmail.com> + */ +class MessageFormatter implements MessageFormatterInterface, IntlFormatterInterface +{ + private $translator; + private $intlFormatter; + + /** + * @param TranslatorInterface|null $translator An identity translator to use as selector for pluralization + */ + public function __construct(TranslatorInterface $translator = null, IntlFormatterInterface $intlFormatter = null) + { + $this->translator = $translator ?? new IdentityTranslator(); + $this->intlFormatter = $intlFormatter ?? new IntlFormatter(); + } + + /** + * {@inheritdoc} + */ + public function format(string $message, string $locale, array $parameters = []): string + { + if ($this->translator instanceof TranslatorInterface) { + return $this->translator->trans($message, $parameters, null, $locale); + } + + return strtr($message, $parameters); + } + + /** + * {@inheritdoc} + */ + public function formatIntl(string $message, string $locale, array $parameters = []): string + { + return $this->intlFormatter->formatIntl($message, $locale, $parameters); + } +} diff --git a/vendor/symfony/translation/Formatter/MessageFormatterInterface.php b/vendor/symfony/translation/Formatter/MessageFormatterInterface.php new file mode 100644 index 0000000..d5c41c1 --- /dev/null +++ b/vendor/symfony/translation/Formatter/MessageFormatterInterface.php @@ -0,0 +1,28 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Formatter; + +/** + * @author Guilherme Blanco <guilhermeblanco@hotmail.com> + * @author Abdellatif Ait boudad <a.aitboudad@gmail.com> + */ +interface MessageFormatterInterface +{ + /** + * Formats a localized message pattern with given arguments. + * + * @param string $message The message (may also be an object that can be cast to string) + * @param string $locale The message locale + * @param array $parameters An array of parameters for the message + */ + public function format(string $message, string $locale, array $parameters = []): string; +} diff --git a/vendor/symfony/translation/IdentityTranslator.php b/vendor/symfony/translation/IdentityTranslator.php new file mode 100644 index 0000000..46875ed --- /dev/null +++ b/vendor/symfony/translation/IdentityTranslator.php @@ -0,0 +1,26 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Symfony\Contracts\Translation\LocaleAwareInterface; +use Symfony\Contracts\Translation\TranslatorInterface; +use Symfony\Contracts\Translation\TranslatorTrait; + +/** + * IdentityTranslator does not translate anything. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class IdentityTranslator implements TranslatorInterface, LocaleAwareInterface +{ + use TranslatorTrait; +} diff --git a/vendor/symfony/translation/LICENSE b/vendor/symfony/translation/LICENSE new file mode 100644 index 0000000..88bf75b --- /dev/null +++ b/vendor/symfony/translation/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2022 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/vendor/symfony/translation/Loader/ArrayLoader.php b/vendor/symfony/translation/Loader/ArrayLoader.php new file mode 100644 index 0000000..35de9ef --- /dev/null +++ b/vendor/symfony/translation/Loader/ArrayLoader.php @@ -0,0 +1,58 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * ArrayLoader loads translations from a PHP array. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class ArrayLoader implements LoaderInterface +{ + /** + * {@inheritdoc} + */ + public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue + { + $resource = $this->flatten($resource); + $catalogue = new MessageCatalogue($locale); + $catalogue->add($resource, $domain); + + return $catalogue; + } + + /** + * Flattens an nested array of translations. + * + * The scheme used is: + * 'key' => ['key2' => ['key3' => 'value']] + * Becomes: + * 'key.key2.key3' => 'value' + */ + private function flatten(array $messages): array + { + $result = []; + foreach ($messages as $key => $value) { + if (\is_array($value)) { + foreach ($this->flatten($value) as $k => $v) { + $result[$key.'.'.$k] = $v; + } + } else { + $result[$key] = $value; + } + } + + return $result; + } +} diff --git a/vendor/symfony/translation/Loader/CsvFileLoader.php b/vendor/symfony/translation/Loader/CsvFileLoader.php new file mode 100644 index 0000000..76b00b1 --- /dev/null +++ b/vendor/symfony/translation/Loader/CsvFileLoader.php @@ -0,0 +1,65 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Translation\Exception\NotFoundResourceException; + +/** + * CsvFileLoader loads translations from CSV files. + * + * @author Saša Stamenković <umpirsky@gmail.com> + */ +class CsvFileLoader extends FileLoader +{ + private string $delimiter = ';'; + private string $enclosure = '"'; + private string $escape = '\\'; + + /** + * {@inheritdoc} + */ + protected function loadResource(string $resource): array + { + $messages = []; + + try { + $file = new \SplFileObject($resource, 'rb'); + } catch (\RuntimeException $e) { + throw new NotFoundResourceException(sprintf('Error opening file "%s".', $resource), 0, $e); + } + + $file->setFlags(\SplFileObject::READ_CSV | \SplFileObject::SKIP_EMPTY); + $file->setCsvControl($this->delimiter, $this->enclosure, $this->escape); + + foreach ($file as $data) { + if (false === $data) { + continue; + } + + if ('#' !== substr($data[0], 0, 1) && isset($data[1]) && 2 === \count($data)) { + $messages[$data[0]] = $data[1]; + } + } + + return $messages; + } + + /** + * Sets the delimiter, enclosure, and escape character for CSV. + */ + public function setCsvControl(string $delimiter = ';', string $enclosure = '"', string $escape = '\\') + { + $this->delimiter = $delimiter; + $this->enclosure = $enclosure; + $this->escape = $escape; + } +} diff --git a/vendor/symfony/translation/Loader/FileLoader.php b/vendor/symfony/translation/Loader/FileLoader.php new file mode 100644 index 0000000..e170d76 --- /dev/null +++ b/vendor/symfony/translation/Loader/FileLoader.php @@ -0,0 +1,62 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Translation\Exception\InvalidResourceException; +use Symfony\Component\Translation\Exception\NotFoundResourceException; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * @author Abdellatif Ait boudad <a.aitboudad@gmail.com> + */ +abstract class FileLoader extends ArrayLoader +{ + /** + * {@inheritdoc} + */ + public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue + { + if (!stream_is_local($resource)) { + throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource)); + } + + if (!file_exists($resource)) { + throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource)); + } + + $messages = $this->loadResource($resource); + + // empty resource + if (null === $messages) { + $messages = []; + } + + // not an array + if (!\is_array($messages)) { + throw new InvalidResourceException(sprintf('Unable to load file "%s".', $resource)); + } + + $catalogue = parent::load($messages, $locale, $domain); + + if (class_exists(FileResource::class)) { + $catalogue->addResource(new FileResource($resource)); + } + + return $catalogue; + } + + /** + * @throws InvalidResourceException if stream content has an invalid format + */ + abstract protected function loadResource(string $resource): array; +} diff --git a/vendor/symfony/translation/Loader/IcuDatFileLoader.php b/vendor/symfony/translation/Loader/IcuDatFileLoader.php new file mode 100644 index 0000000..c3ca5fd --- /dev/null +++ b/vendor/symfony/translation/Loader/IcuDatFileLoader.php @@ -0,0 +1,61 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Translation\Exception\InvalidResourceException; +use Symfony\Component\Translation\Exception\NotFoundResourceException; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * IcuResFileLoader loads translations from a resource bundle. + * + * @author stealth35 + */ +class IcuDatFileLoader extends IcuResFileLoader +{ + /** + * {@inheritdoc} + */ + public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue + { + if (!stream_is_local($resource.'.dat')) { + throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource)); + } + + if (!file_exists($resource.'.dat')) { + throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource)); + } + + try { + $rb = new \ResourceBundle($locale, $resource); + } catch (\Exception $e) { + $rb = null; + } + + if (!$rb) { + throw new InvalidResourceException(sprintf('Cannot load resource "%s".', $resource)); + } elseif (intl_is_failure($rb->getErrorCode())) { + throw new InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode()); + } + + $messages = $this->flatten($rb); + $catalogue = new MessageCatalogue($locale); + $catalogue->add($messages, $domain); + + if (class_exists(FileResource::class)) { + $catalogue->addResource(new FileResource($resource.'.dat')); + } + + return $catalogue; + } +} diff --git a/vendor/symfony/translation/Loader/IcuResFileLoader.php b/vendor/symfony/translation/Loader/IcuResFileLoader.php new file mode 100644 index 0000000..54c48f8 --- /dev/null +++ b/vendor/symfony/translation/Loader/IcuResFileLoader.php @@ -0,0 +1,89 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Config\Resource\DirectoryResource; +use Symfony\Component\Translation\Exception\InvalidResourceException; +use Symfony\Component\Translation\Exception\NotFoundResourceException; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * IcuResFileLoader loads translations from a resource bundle. + * + * @author stealth35 + */ +class IcuResFileLoader implements LoaderInterface +{ + /** + * {@inheritdoc} + */ + public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue + { + if (!stream_is_local($resource)) { + throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource)); + } + + if (!is_dir($resource)) { + throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource)); + } + + try { + $rb = new \ResourceBundle($locale, $resource); + } catch (\Exception $e) { + $rb = null; + } + + if (!$rb) { + throw new InvalidResourceException(sprintf('Cannot load resource "%s".', $resource)); + } elseif (intl_is_failure($rb->getErrorCode())) { + throw new InvalidResourceException($rb->getErrorMessage(), $rb->getErrorCode()); + } + + $messages = $this->flatten($rb); + $catalogue = new MessageCatalogue($locale); + $catalogue->add($messages, $domain); + + if (class_exists(DirectoryResource::class)) { + $catalogue->addResource(new DirectoryResource($resource)); + } + + return $catalogue; + } + + /** + * Flattens an ResourceBundle. + * + * The scheme used is: + * key { key2 { key3 { "value" } } } + * Becomes: + * 'key.key2.key3' => 'value' + * + * This function takes an array by reference and will modify it + * + * @param \ResourceBundle $rb The ResourceBundle that will be flattened + * @param array $messages Used internally for recursive calls + * @param string $path Current path being parsed, used internally for recursive calls + */ + protected function flatten(\ResourceBundle $rb, array &$messages = [], string $path = null): array + { + foreach ($rb as $key => $value) { + $nodePath = $path ? $path.'.'.$key : $key; + if ($value instanceof \ResourceBundle) { + $this->flatten($value, $messages, $nodePath); + } else { + $messages[$nodePath] = $value; + } + } + + return $messages; + } +} diff --git a/vendor/symfony/translation/Loader/IniFileLoader.php b/vendor/symfony/translation/Loader/IniFileLoader.php new file mode 100644 index 0000000..04e294d --- /dev/null +++ b/vendor/symfony/translation/Loader/IniFileLoader.php @@ -0,0 +1,28 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +/** + * IniFileLoader loads translations from an ini file. + * + * @author stealth35 + */ +class IniFileLoader extends FileLoader +{ + /** + * {@inheritdoc} + */ + protected function loadResource(string $resource): array + { + return parse_ini_file($resource, true); + } +} diff --git a/vendor/symfony/translation/Loader/JsonFileLoader.php b/vendor/symfony/translation/Loader/JsonFileLoader.php new file mode 100644 index 0000000..67a8d58 --- /dev/null +++ b/vendor/symfony/translation/Loader/JsonFileLoader.php @@ -0,0 +1,60 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Translation\Exception\InvalidResourceException; + +/** + * JsonFileLoader loads translations from an json file. + * + * @author singles + */ +class JsonFileLoader extends FileLoader +{ + /** + * {@inheritdoc} + */ + protected function loadResource(string $resource): array + { + $messages = []; + if ($data = file_get_contents($resource)) { + $messages = json_decode($data, true); + + if (0 < $errorCode = json_last_error()) { + throw new InvalidResourceException('Error parsing JSON: '.$this->getJSONErrorMessage($errorCode)); + } + } + + return $messages; + } + + /** + * Translates JSON_ERROR_* constant into meaningful message. + */ + private function getJSONErrorMessage(int $errorCode): string + { + switch ($errorCode) { + case \JSON_ERROR_DEPTH: + return 'Maximum stack depth exceeded'; + case \JSON_ERROR_STATE_MISMATCH: + return 'Underflow or the modes mismatch'; + case \JSON_ERROR_CTRL_CHAR: + return 'Unexpected control character found'; + case \JSON_ERROR_SYNTAX: + return 'Syntax error, malformed JSON'; + case \JSON_ERROR_UTF8: + return 'Malformed UTF-8 characters, possibly incorrectly encoded'; + default: + return 'Unknown error'; + } + } +} diff --git a/vendor/symfony/translation/Loader/LoaderInterface.php b/vendor/symfony/translation/Loader/LoaderInterface.php new file mode 100644 index 0000000..29d5560 --- /dev/null +++ b/vendor/symfony/translation/Loader/LoaderInterface.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Translation\Exception\InvalidResourceException; +use Symfony\Component\Translation\Exception\NotFoundResourceException; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * LoaderInterface is the interface implemented by all translation loaders. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +interface LoaderInterface +{ + /** + * Loads a locale. + * + * @throws NotFoundResourceException when the resource cannot be found + * @throws InvalidResourceException when the resource cannot be loaded + */ + public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue; +} diff --git a/vendor/symfony/translation/Loader/MoFileLoader.php b/vendor/symfony/translation/Loader/MoFileLoader.php new file mode 100644 index 0000000..b0c8913 --- /dev/null +++ b/vendor/symfony/translation/Loader/MoFileLoader.php @@ -0,0 +1,140 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Translation\Exception\InvalidResourceException; + +/** + * @copyright Copyright (c) 2010, Union of RAD http://union-of-rad.org (http://lithify.me/) + */ +class MoFileLoader extends FileLoader +{ + /** + * Magic used for validating the format of an MO file as well as + * detecting if the machine used to create that file was little endian. + */ + public const MO_LITTLE_ENDIAN_MAGIC = 0x950412DE; + + /** + * Magic used for validating the format of an MO file as well as + * detecting if the machine used to create that file was big endian. + */ + public const MO_BIG_ENDIAN_MAGIC = 0xDE120495; + + /** + * The size of the header of an MO file in bytes. + */ + public const MO_HEADER_SIZE = 28; + + /** + * Parses machine object (MO) format, independent of the machine's endian it + * was created on. Both 32bit and 64bit systems are supported. + * + * {@inheritdoc} + */ + protected function loadResource(string $resource): array + { + $stream = fopen($resource, 'r'); + + $stat = fstat($stream); + + if ($stat['size'] < self::MO_HEADER_SIZE) { + throw new InvalidResourceException('MO stream content has an invalid format.'); + } + $magic = unpack('V1', fread($stream, 4)); + $magic = hexdec(substr(dechex(current($magic)), -8)); + + if (self::MO_LITTLE_ENDIAN_MAGIC == $magic) { + $isBigEndian = false; + } elseif (self::MO_BIG_ENDIAN_MAGIC == $magic) { + $isBigEndian = true; + } else { + throw new InvalidResourceException('MO stream content has an invalid format.'); + } + + // formatRevision + $this->readLong($stream, $isBigEndian); + $count = $this->readLong($stream, $isBigEndian); + $offsetId = $this->readLong($stream, $isBigEndian); + $offsetTranslated = $this->readLong($stream, $isBigEndian); + // sizeHashes + $this->readLong($stream, $isBigEndian); + // offsetHashes + $this->readLong($stream, $isBigEndian); + + $messages = []; + + for ($i = 0; $i < $count; ++$i) { + $pluralId = null; + $translated = null; + + fseek($stream, $offsetId + $i * 8); + + $length = $this->readLong($stream, $isBigEndian); + $offset = $this->readLong($stream, $isBigEndian); + + if ($length < 1) { + continue; + } + + fseek($stream, $offset); + $singularId = fread($stream, $length); + + if (str_contains($singularId, "\000")) { + [$singularId, $pluralId] = explode("\000", $singularId); + } + + fseek($stream, $offsetTranslated + $i * 8); + $length = $this->readLong($stream, $isBigEndian); + $offset = $this->readLong($stream, $isBigEndian); + + if ($length < 1) { + continue; + } + + fseek($stream, $offset); + $translated = fread($stream, $length); + + if (str_contains($translated, "\000")) { + $translated = explode("\000", $translated); + } + + $ids = ['singular' => $singularId, 'plural' => $pluralId]; + $item = compact('ids', 'translated'); + + if (!empty($item['ids']['singular'])) { + $id = $item['ids']['singular']; + if (isset($item['ids']['plural'])) { + $id .= '|'.$item['ids']['plural']; + } + $messages[$id] = stripcslashes(implode('|', (array) $item['translated'])); + } + } + + fclose($stream); + + return array_filter($messages); + } + + /** + * Reads an unsigned long from stream respecting endianness. + * + * @param resource $stream + */ + private function readLong($stream, bool $isBigEndian): int + { + $result = unpack($isBigEndian ? 'N1' : 'V1', fread($stream, 4)); + $result = current($result); + + return (int) substr($result, -8); + } +} diff --git a/vendor/symfony/translation/Loader/PhpFileLoader.php b/vendor/symfony/translation/Loader/PhpFileLoader.php new file mode 100644 index 0000000..ae299c2 --- /dev/null +++ b/vendor/symfony/translation/Loader/PhpFileLoader.php @@ -0,0 +1,42 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +/** + * PhpFileLoader loads translations from PHP files returning an array of translations. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class PhpFileLoader extends FileLoader +{ + private static ?array $cache = []; + + /** + * {@inheritdoc} + */ + protected function loadResource(string $resource): array + { + if ([] === self::$cache && \function_exists('opcache_invalidate') && filter_var(\ini_get('opcache.enable'), \FILTER_VALIDATE_BOOLEAN) && (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) || filter_var(\ini_get('opcache.enable_cli'), \FILTER_VALIDATE_BOOLEAN))) { + self::$cache = null; + } + + if (null === self::$cache) { + return require $resource; + } + + if (isset(self::$cache[$resource])) { + return self::$cache[$resource]; + } + + return self::$cache[$resource] = require $resource; + } +} diff --git a/vendor/symfony/translation/Loader/PoFileLoader.php b/vendor/symfony/translation/Loader/PoFileLoader.php new file mode 100644 index 0000000..6df1614 --- /dev/null +++ b/vendor/symfony/translation/Loader/PoFileLoader.php @@ -0,0 +1,149 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +/** + * @copyright Copyright (c) 2010, Union of RAD https://github.com/UnionOfRAD/lithium + * @copyright Copyright (c) 2012, Clemens Tolboom + */ +class PoFileLoader extends FileLoader +{ + /** + * Parses portable object (PO) format. + * + * From https://www.gnu.org/software/gettext/manual/gettext.html#PO-Files + * we should be able to parse files having: + * + * white-space + * # translator-comments + * #. extracted-comments + * #: reference... + * #, flag... + * #| msgid previous-untranslated-string + * msgid untranslated-string + * msgstr translated-string + * + * extra or different lines are: + * + * #| msgctxt previous-context + * #| msgid previous-untranslated-string + * msgctxt context + * + * #| msgid previous-untranslated-string-singular + * #| msgid_plural previous-untranslated-string-plural + * msgid untranslated-string-singular + * msgid_plural untranslated-string-plural + * msgstr[0] translated-string-case-0 + * ... + * msgstr[N] translated-string-case-n + * + * The definition states: + * - white-space and comments are optional. + * - msgid "" that an empty singleline defines a header. + * + * This parser sacrifices some features of the reference implementation the + * differences to that implementation are as follows. + * - No support for comments spanning multiple lines. + * - Translator and extracted comments are treated as being the same type. + * - Message IDs are allowed to have other encodings as just US-ASCII. + * + * Items with an empty id are ignored. + * + * {@inheritdoc} + */ + protected function loadResource(string $resource): array + { + $stream = fopen($resource, 'r'); + + $defaults = [ + 'ids' => [], + 'translated' => null, + ]; + + $messages = []; + $item = $defaults; + $flags = []; + + while ($line = fgets($stream)) { + $line = trim($line); + + if ('' === $line) { + // Whitespace indicated current item is done + if (!\in_array('fuzzy', $flags)) { + $this->addMessage($messages, $item); + } + $item = $defaults; + $flags = []; + } elseif ('#,' === substr($line, 0, 2)) { + $flags = array_map('trim', explode(',', substr($line, 2))); + } elseif ('msgid "' === substr($line, 0, 7)) { + // We start a new msg so save previous + // TODO: this fails when comments or contexts are added + $this->addMessage($messages, $item); + $item = $defaults; + $item['ids']['singular'] = substr($line, 7, -1); + } elseif ('msgstr "' === substr($line, 0, 8)) { + $item['translated'] = substr($line, 8, -1); + } elseif ('"' === $line[0]) { + $continues = isset($item['translated']) ? 'translated' : 'ids'; + + if (\is_array($item[$continues])) { + end($item[$continues]); + $item[$continues][key($item[$continues])] .= substr($line, 1, -1); + } else { + $item[$continues] .= substr($line, 1, -1); + } + } elseif ('msgid_plural "' === substr($line, 0, 14)) { + $item['ids']['plural'] = substr($line, 14, -1); + } elseif ('msgstr[' === substr($line, 0, 7)) { + $size = strpos($line, ']'); + $item['translated'][(int) substr($line, 7, 1)] = substr($line, $size + 3, -1); + } + } + // save last item + if (!\in_array('fuzzy', $flags)) { + $this->addMessage($messages, $item); + } + fclose($stream); + + return $messages; + } + + /** + * Save a translation item to the messages. + * + * A .po file could contain by error missing plural indexes. We need to + * fix these before saving them. + */ + private function addMessage(array &$messages, array $item) + { + if (!empty($item['ids']['singular'])) { + $id = stripcslashes($item['ids']['singular']); + if (isset($item['ids']['plural'])) { + $id .= '|'.stripcslashes($item['ids']['plural']); + } + + $translated = (array) $item['translated']; + // PO are by definition indexed so sort by index. + ksort($translated); + // Make sure every index is filled. + end($translated); + $count = key($translated); + // Fill missing spots with '-'. + $empties = array_fill(0, $count + 1, '-'); + $translated += $empties; + ksort($translated); + + $messages[$id] = stripcslashes(implode('|', $translated)); + } + } +} diff --git a/vendor/symfony/translation/Loader/QtFileLoader.php b/vendor/symfony/translation/Loader/QtFileLoader.php new file mode 100644 index 0000000..6d5582d --- /dev/null +++ b/vendor/symfony/translation/Loader/QtFileLoader.php @@ -0,0 +1,82 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Config\Util\XmlUtils; +use Symfony\Component\Translation\Exception\InvalidResourceException; +use Symfony\Component\Translation\Exception\NotFoundResourceException; +use Symfony\Component\Translation\Exception\RuntimeException; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * QtFileLoader loads translations from QT Translations XML files. + * + * @author Benjamin Eberlei <kontakt@beberlei.de> + */ +class QtFileLoader implements LoaderInterface +{ + /** + * {@inheritdoc} + */ + public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue + { + if (!class_exists(XmlUtils::class)) { + throw new RuntimeException('Loading translations from the QT format requires the Symfony Config component.'); + } + + if (!stream_is_local($resource)) { + throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource)); + } + + if (!file_exists($resource)) { + throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource)); + } + + try { + $dom = XmlUtils::loadFile($resource); + } catch (\InvalidArgumentException $e) { + throw new InvalidResourceException(sprintf('Unable to load "%s".', $resource), $e->getCode(), $e); + } + + $internalErrors = libxml_use_internal_errors(true); + libxml_clear_errors(); + + $xpath = new \DOMXPath($dom); + $nodes = $xpath->evaluate('//TS/context/name[text()="'.$domain.'"]'); + + $catalogue = new MessageCatalogue($locale); + if (1 == $nodes->length) { + $translations = $nodes->item(0)->nextSibling->parentNode->parentNode->getElementsByTagName('message'); + foreach ($translations as $translation) { + $translationValue = (string) $translation->getElementsByTagName('translation')->item(0)->nodeValue; + + if (!empty($translationValue)) { + $catalogue->set( + (string) $translation->getElementsByTagName('source')->item(0)->nodeValue, + $translationValue, + $domain + ); + } + $translation = $translation->nextSibling; + } + + if (class_exists(FileResource::class)) { + $catalogue->addResource(new FileResource($resource)); + } + } + + libxml_use_internal_errors($internalErrors); + + return $catalogue; + } +} diff --git a/vendor/symfony/translation/Loader/XliffFileLoader.php b/vendor/symfony/translation/Loader/XliffFileLoader.php new file mode 100644 index 0000000..670e199 --- /dev/null +++ b/vendor/symfony/translation/Loader/XliffFileLoader.php @@ -0,0 +1,232 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Config\Resource\FileResource; +use Symfony\Component\Config\Util\Exception\InvalidXmlException; +use Symfony\Component\Config\Util\Exception\XmlParsingException; +use Symfony\Component\Config\Util\XmlUtils; +use Symfony\Component\Translation\Exception\InvalidResourceException; +use Symfony\Component\Translation\Exception\NotFoundResourceException; +use Symfony\Component\Translation\Exception\RuntimeException; +use Symfony\Component\Translation\MessageCatalogue; +use Symfony\Component\Translation\Util\XliffUtils; + +/** + * XliffFileLoader loads translations from XLIFF files. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class XliffFileLoader implements LoaderInterface +{ + /** + * {@inheritdoc} + */ + public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue + { + if (!class_exists(XmlUtils::class)) { + throw new RuntimeException('Loading translations from the Xliff format requires the Symfony Config component.'); + } + + if (!$this->isXmlString($resource)) { + if (!stream_is_local($resource)) { + throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource)); + } + + if (!file_exists($resource)) { + throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource)); + } + + if (!is_file($resource)) { + throw new InvalidResourceException(sprintf('This is neither a file nor an XLIFF string "%s".', $resource)); + } + } + + try { + if ($this->isXmlString($resource)) { + $dom = XmlUtils::parse($resource); + } else { + $dom = XmlUtils::loadFile($resource); + } + } catch (\InvalidArgumentException|XmlParsingException|InvalidXmlException $e) { + throw new InvalidResourceException(sprintf('Unable to load "%s": ', $resource).$e->getMessage(), $e->getCode(), $e); + } + + if ($errors = XliffUtils::validateSchema($dom)) { + throw new InvalidResourceException(sprintf('Invalid resource provided: "%s"; Errors: ', $resource).XliffUtils::getErrorsAsString($errors)); + } + + $catalogue = new MessageCatalogue($locale); + $this->extract($dom, $catalogue, $domain); + + if (is_file($resource) && class_exists(FileResource::class)) { + $catalogue->addResource(new FileResource($resource)); + } + + return $catalogue; + } + + private function extract(\DOMDocument $dom, MessageCatalogue $catalogue, string $domain) + { + $xliffVersion = XliffUtils::getVersionNumber($dom); + + if ('1.2' === $xliffVersion) { + $this->extractXliff1($dom, $catalogue, $domain); + } + + if ('2.0' === $xliffVersion) { + $this->extractXliff2($dom, $catalogue, $domain); + } + } + + /** + * Extract messages and metadata from DOMDocument into a MessageCatalogue. + */ + private function extractXliff1(\DOMDocument $dom, MessageCatalogue $catalogue, string $domain) + { + $xml = simplexml_import_dom($dom); + $encoding = $dom->encoding ? strtoupper($dom->encoding) : null; + + $namespace = 'urn:oasis:names:tc:xliff:document:1.2'; + $xml->registerXPathNamespace('xliff', $namespace); + + foreach ($xml->xpath('//xliff:file') as $file) { + $fileAttributes = $file->attributes(); + + $file->registerXPathNamespace('xliff', $namespace); + + foreach ($file->xpath('.//xliff:trans-unit') as $translation) { + $attributes = $translation->attributes(); + + if (!(isset($attributes['resname']) || isset($translation->source))) { + continue; + } + + $source = isset($attributes['resname']) && $attributes['resname'] ? $attributes['resname'] : $translation->source; + // If the xlf file has another encoding specified, try to convert it because + // simple_xml will always return utf-8 encoded values + $target = $this->utf8ToCharset((string) ($translation->target ?? $translation->source), $encoding); + + $catalogue->set((string) $source, $target, $domain); + + $metadata = [ + 'source' => (string) $translation->source, + 'file' => [ + 'original' => (string) $fileAttributes['original'], + ], + ]; + if ($notes = $this->parseNotesMetadata($translation->note, $encoding)) { + $metadata['notes'] = $notes; + } + + if (isset($translation->target) && $translation->target->attributes()) { + $metadata['target-attributes'] = []; + foreach ($translation->target->attributes() as $key => $value) { + $metadata['target-attributes'][$key] = (string) $value; + } + } + + if (isset($attributes['id'])) { + $metadata['id'] = (string) $attributes['id']; + } + + $catalogue->setMetadata((string) $source, $metadata, $domain); + } + } + } + + private function extractXliff2(\DOMDocument $dom, MessageCatalogue $catalogue, string $domain) + { + $xml = simplexml_import_dom($dom); + $encoding = $dom->encoding ? strtoupper($dom->encoding) : null; + + $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:2.0'); + + foreach ($xml->xpath('//xliff:unit') as $unit) { + foreach ($unit->segment as $segment) { + $attributes = $unit->attributes(); + $source = $attributes['name'] ?? $segment->source; + + // If the xlf file has another encoding specified, try to convert it because + // simple_xml will always return utf-8 encoded values + $target = $this->utf8ToCharset((string) ($segment->target ?? $segment->source), $encoding); + + $catalogue->set((string) $source, $target, $domain); + + $metadata = []; + if (isset($segment->target) && $segment->target->attributes()) { + $metadata['target-attributes'] = []; + foreach ($segment->target->attributes() as $key => $value) { + $metadata['target-attributes'][$key] = (string) $value; + } + } + + if (isset($unit->notes)) { + $metadata['notes'] = []; + foreach ($unit->notes->note as $noteNode) { + $note = []; + foreach ($noteNode->attributes() as $key => $value) { + $note[$key] = (string) $value; + } + $note['content'] = (string) $noteNode; + $metadata['notes'][] = $note; + } + } + + $catalogue->setMetadata((string) $source, $metadata, $domain); + } + } + } + + /** + * Convert a UTF8 string to the specified encoding. + */ + private function utf8ToCharset(string $content, string $encoding = null): string + { + if ('UTF-8' !== $encoding && !empty($encoding)) { + return mb_convert_encoding($content, $encoding, 'UTF-8'); + } + + return $content; + } + + private function parseNotesMetadata(\SimpleXMLElement $noteElement = null, string $encoding = null): array + { + $notes = []; + + if (null === $noteElement) { + return $notes; + } + + /** @var \SimpleXMLElement $xmlNote */ + foreach ($noteElement as $xmlNote) { + $noteAttributes = $xmlNote->attributes(); + $note = ['content' => $this->utf8ToCharset((string) $xmlNote, $encoding)]; + if (isset($noteAttributes['priority'])) { + $note['priority'] = (int) $noteAttributes['priority']; + } + + if (isset($noteAttributes['from'])) { + $note['from'] = (string) $noteAttributes['from']; + } + + $notes[] = $note; + } + + return $notes; + } + + private function isXmlString(string $resource): bool + { + return 0 === strpos($resource, '<?xml'); + } +} diff --git a/vendor/symfony/translation/Loader/YamlFileLoader.php b/vendor/symfony/translation/Loader/YamlFileLoader.php new file mode 100644 index 0000000..5eccf99 --- /dev/null +++ b/vendor/symfony/translation/Loader/YamlFileLoader.php @@ -0,0 +1,54 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Loader; + +use Symfony\Component\Translation\Exception\InvalidResourceException; +use Symfony\Component\Translation\Exception\LogicException; +use Symfony\Component\Yaml\Exception\ParseException; +use Symfony\Component\Yaml\Parser as YamlParser; +use Symfony\Component\Yaml\Yaml; + +/** + * YamlFileLoader loads translations from Yaml files. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class YamlFileLoader extends FileLoader +{ + private $yamlParser; + + /** + * {@inheritdoc} + */ + protected function loadResource(string $resource): array + { + if (null === $this->yamlParser) { + if (!class_exists(\Symfony\Component\Yaml\Parser::class)) { + throw new LogicException('Loading translations from the YAML format requires the Symfony Yaml component.'); + } + + $this->yamlParser = new YamlParser(); + } + + try { + $messages = $this->yamlParser->parseFile($resource, Yaml::PARSE_CONSTANT); + } catch (ParseException $e) { + throw new InvalidResourceException(sprintf('The file "%s" does not contain valid YAML: ', $resource).$e->getMessage(), 0, $e); + } + + if (null !== $messages && !\is_array($messages)) { + throw new InvalidResourceException(sprintf('Unable to load file "%s".', $resource)); + } + + return $messages ?: []; + } +} diff --git a/vendor/symfony/translation/LoggingTranslator.php b/vendor/symfony/translation/LoggingTranslator.php new file mode 100644 index 0000000..8c8441c --- /dev/null +++ b/vendor/symfony/translation/LoggingTranslator.php @@ -0,0 +1,129 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Psr\Log\LoggerInterface; +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Contracts\Translation\LocaleAwareInterface; +use Symfony\Contracts\Translation\TranslatorInterface; + +/** + * @author Abdellatif Ait boudad <a.aitboudad@gmail.com> + */ +class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface, LocaleAwareInterface +{ + private $translator; + private $logger; + + /** + * @param TranslatorInterface&TranslatorBagInterface&LocaleAwareInterface $translator The translator must implement TranslatorBagInterface + */ + public function __construct(TranslatorInterface $translator, LoggerInterface $logger) + { + if (!$translator instanceof TranslatorBagInterface || !$translator instanceof LocaleAwareInterface) { + throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.', get_debug_type($translator))); + } + + $this->translator = $translator; + $this->logger = $logger; + } + + /** + * {@inheritdoc} + */ + public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null): string + { + $trans = $this->translator->trans($id = (string) $id, $parameters, $domain, $locale); + $this->log($id, $domain, $locale); + + return $trans; + } + + /** + * {@inheritdoc} + */ + public function setLocale(string $locale) + { + $prev = $this->translator->getLocale(); + $this->translator->setLocale($locale); + if ($prev === $locale) { + return; + } + + $this->logger->debug(sprintf('The locale of the translator has changed from "%s" to "%s".', $prev, $locale)); + } + + /** + * {@inheritdoc} + */ + public function getLocale(): string + { + return $this->translator->getLocale(); + } + + /** + * {@inheritdoc} + */ + public function getCatalogue(string $locale = null): MessageCatalogueInterface + { + return $this->translator->getCatalogue($locale); + } + + /** + * {@inheritdoc} + */ + public function getCatalogues(): array + { + return $this->translator->getCatalogues(); + } + + /** + * Gets the fallback locales. + */ + public function getFallbackLocales(): array + { + if ($this->translator instanceof Translator || method_exists($this->translator, 'getFallbackLocales')) { + return $this->translator->getFallbackLocales(); + } + + return []; + } + + /** + * Passes through all unknown calls onto the translator object. + */ + public function __call(string $method, array $args) + { + return $this->translator->{$method}(...$args); + } + + /** + * Logs for missing translations. + */ + private function log(string $id, ?string $domain, ?string $locale) + { + if (null === $domain) { + $domain = 'messages'; + } + + $catalogue = $this->translator->getCatalogue($locale); + if ($catalogue->defines($id, $domain)) { + return; + } + + if ($catalogue->has($id, $domain)) { + $this->logger->debug('Translation use fallback catalogue.', ['id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()]); + } else { + $this->logger->warning('Translation not found.', ['id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()]); + } + } +} diff --git a/vendor/symfony/translation/MessageCatalogue.php b/vendor/symfony/translation/MessageCatalogue.php new file mode 100644 index 0000000..848594b --- /dev/null +++ b/vendor/symfony/translation/MessageCatalogue.php @@ -0,0 +1,309 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Symfony\Component\Config\Resource\ResourceInterface; +use Symfony\Component\Translation\Exception\LogicException; + +/** + * @author Fabien Potencier <fabien@symfony.com> + */ +class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterface +{ + private array $messages = []; + private array $metadata = []; + private array $resources = []; + private string $locale; + private $fallbackCatalogue = null; + private ?self $parent = null; + + /** + * @param array $messages An array of messages classified by domain + */ + public function __construct(string $locale, array $messages = []) + { + $this->locale = $locale; + $this->messages = $messages; + } + + /** + * {@inheritdoc} + */ + public function getLocale(): string + { + return $this->locale; + } + + /** + * {@inheritdoc} + */ + public function getDomains(): array + { + $domains = []; + + foreach ($this->messages as $domain => $messages) { + if (str_ends_with($domain, self::INTL_DOMAIN_SUFFIX)) { + $domain = substr($domain, 0, -\strlen(self::INTL_DOMAIN_SUFFIX)); + } + $domains[$domain] = $domain; + } + + return array_values($domains); + } + + /** + * {@inheritdoc} + */ + public function all(string $domain = null): array + { + if (null !== $domain) { + // skip messages merge if intl-icu requested explicitly + if (str_ends_with($domain, self::INTL_DOMAIN_SUFFIX)) { + return $this->messages[$domain] ?? []; + } + + return ($this->messages[$domain.self::INTL_DOMAIN_SUFFIX] ?? []) + ($this->messages[$domain] ?? []); + } + + $allMessages = []; + + foreach ($this->messages as $domain => $messages) { + if (str_ends_with($domain, self::INTL_DOMAIN_SUFFIX)) { + $domain = substr($domain, 0, -\strlen(self::INTL_DOMAIN_SUFFIX)); + $allMessages[$domain] = $messages + ($allMessages[$domain] ?? []); + } else { + $allMessages[$domain] = ($allMessages[$domain] ?? []) + $messages; + } + } + + return $allMessages; + } + + /** + * {@inheritdoc} + */ + public function set(string $id, string $translation, string $domain = 'messages') + { + $this->add([$id => $translation], $domain); + } + + /** + * {@inheritdoc} + */ + public function has(string $id, string $domain = 'messages'): bool + { + if (isset($this->messages[$domain][$id]) || isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id])) { + return true; + } + + if (null !== $this->fallbackCatalogue) { + return $this->fallbackCatalogue->has($id, $domain); + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function defines(string $id, string $domain = 'messages'): bool + { + return isset($this->messages[$domain][$id]) || isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id]); + } + + /** + * {@inheritdoc} + */ + public function get(string $id, string $domain = 'messages'): string + { + if (isset($this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id])) { + return $this->messages[$domain.self::INTL_DOMAIN_SUFFIX][$id]; + } + + if (isset($this->messages[$domain][$id])) { + return $this->messages[$domain][$id]; + } + + if (null !== $this->fallbackCatalogue) { + return $this->fallbackCatalogue->get($id, $domain); + } + + return $id; + } + + /** + * {@inheritdoc} + */ + public function replace(array $messages, string $domain = 'messages') + { + unset($this->messages[$domain], $this->messages[$domain.self::INTL_DOMAIN_SUFFIX]); + + $this->add($messages, $domain); + } + + /** + * {@inheritdoc} + */ + public function add(array $messages, string $domain = 'messages') + { + $altDomain = str_ends_with($domain, self::INTL_DOMAIN_SUFFIX) ? substr($domain, 0, -\strlen(self::INTL_DOMAIN_SUFFIX)) : $domain.self::INTL_DOMAIN_SUFFIX; + foreach ($messages as $id => $message) { + unset($this->messages[$altDomain][$id]); + $this->messages[$domain][$id] = $message; + } + + if ([] === ($this->messages[$altDomain] ?? null)) { + unset($this->messages[$altDomain]); + } + } + + /** + * {@inheritdoc} + */ + public function addCatalogue(MessageCatalogueInterface $catalogue) + { + if ($catalogue->getLocale() !== $this->locale) { + throw new LogicException(sprintf('Cannot add a catalogue for locale "%s" as the current locale for this catalogue is "%s".', $catalogue->getLocale(), $this->locale)); + } + + foreach ($catalogue->all() as $domain => $messages) { + if ($intlMessages = $catalogue->all($domain.self::INTL_DOMAIN_SUFFIX)) { + $this->add($intlMessages, $domain.self::INTL_DOMAIN_SUFFIX); + $messages = array_diff_key($messages, $intlMessages); + } + $this->add($messages, $domain); + } + + foreach ($catalogue->getResources() as $resource) { + $this->addResource($resource); + } + + if ($catalogue instanceof MetadataAwareInterface) { + $metadata = $catalogue->getMetadata('', ''); + $this->addMetadata($metadata); + } + } + + /** + * {@inheritdoc} + */ + public function addFallbackCatalogue(MessageCatalogueInterface $catalogue) + { + // detect circular references + $c = $catalogue; + while ($c = $c->getFallbackCatalogue()) { + if ($c->getLocale() === $this->getLocale()) { + throw new LogicException(sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale())); + } + } + + $c = $this; + do { + if ($c->getLocale() === $catalogue->getLocale()) { + throw new LogicException(sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale())); + } + + foreach ($catalogue->getResources() as $resource) { + $c->addResource($resource); + } + } while ($c = $c->parent); + + $catalogue->parent = $this; + $this->fallbackCatalogue = $catalogue; + + foreach ($catalogue->getResources() as $resource) { + $this->addResource($resource); + } + } + + /** + * {@inheritdoc} + */ + public function getFallbackCatalogue(): ?MessageCatalogueInterface + { + return $this->fallbackCatalogue; + } + + /** + * {@inheritdoc} + */ + public function getResources(): array + { + return array_values($this->resources); + } + + /** + * {@inheritdoc} + */ + public function addResource(ResourceInterface $resource) + { + $this->resources[$resource->__toString()] = $resource; + } + + /** + * {@inheritdoc} + */ + public function getMetadata(string $key = '', string $domain = 'messages'): mixed + { + if ('' == $domain) { + return $this->metadata; + } + + if (isset($this->metadata[$domain])) { + if ('' == $key) { + return $this->metadata[$domain]; + } + + if (isset($this->metadata[$domain][$key])) { + return $this->metadata[$domain][$key]; + } + } + + return null; + } + + /** + * {@inheritdoc} + */ + public function setMetadata(string $key, mixed $value, string $domain = 'messages') + { + $this->metadata[$domain][$key] = $value; + } + + /** + * {@inheritdoc} + */ + public function deleteMetadata(string $key = '', string $domain = 'messages') + { + if ('' == $domain) { + $this->metadata = []; + } elseif ('' == $key) { + unset($this->metadata[$domain]); + } else { + unset($this->metadata[$domain][$key]); + } + } + + /** + * Adds current values with the new values. + * + * @param array $values Values to add + */ + private function addMetadata(array $values) + { + foreach ($values as $domain => $keys) { + foreach ($keys as $key => $value) { + $this->setMetadata($key, $value, $domain); + } + } + } +} diff --git a/vendor/symfony/translation/MessageCatalogueInterface.php b/vendor/symfony/translation/MessageCatalogueInterface.php new file mode 100644 index 0000000..75e3a2f --- /dev/null +++ b/vendor/symfony/translation/MessageCatalogueInterface.php @@ -0,0 +1,124 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Symfony\Component\Config\Resource\ResourceInterface; + +/** + * MessageCatalogueInterface. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +interface MessageCatalogueInterface +{ + public const INTL_DOMAIN_SUFFIX = '+intl-icu'; + + /** + * Gets the catalogue locale. + */ + public function getLocale(): string; + + /** + * Gets the domains. + */ + public function getDomains(): array; + + /** + * Gets the messages within a given domain. + * + * If $domain is null, it returns all messages. + * + * @param string $domain The domain name + */ + public function all(string $domain = null): array; + + /** + * Sets a message translation. + * + * @param string $id The message id + * @param string $translation The messages translation + * @param string $domain The domain name + */ + public function set(string $id, string $translation, string $domain = 'messages'); + + /** + * Checks if a message has a translation. + * + * @param string $id The message id + * @param string $domain The domain name + */ + public function has(string $id, string $domain = 'messages'): bool; + + /** + * Checks if a message has a translation (it does not take into account the fallback mechanism). + * + * @param string $id The message id + * @param string $domain The domain name + */ + public function defines(string $id, string $domain = 'messages'): bool; + + /** + * Gets a message translation. + * + * @param string $id The message id + * @param string $domain The domain name + */ + public function get(string $id, string $domain = 'messages'): string; + + /** + * Sets translations for a given domain. + * + * @param array $messages An array of translations + * @param string $domain The domain name + */ + public function replace(array $messages, string $domain = 'messages'); + + /** + * Adds translations for a given domain. + * + * @param array $messages An array of translations + * @param string $domain The domain name + */ + public function add(array $messages, string $domain = 'messages'); + + /** + * Merges translations from the given Catalogue into the current one. + * + * The two catalogues must have the same locale. + */ + public function addCatalogue(self $catalogue); + + /** + * Merges translations from the given Catalogue into the current one + * only when the translation does not exist. + * + * This is used to provide default translations when they do not exist for the current locale. + */ + public function addFallbackCatalogue(self $catalogue); + + /** + * Gets the fallback catalogue. + */ + public function getFallbackCatalogue(): ?self; + + /** + * Returns an array of resources loaded to build this collection. + * + * @return ResourceInterface[] + */ + public function getResources(): array; + + /** + * Adds a resource for this collection. + */ + public function addResource(ResourceInterface $resource); +} diff --git a/vendor/symfony/translation/MetadataAwareInterface.php b/vendor/symfony/translation/MetadataAwareInterface.php new file mode 100644 index 0000000..2eaaceb --- /dev/null +++ b/vendor/symfony/translation/MetadataAwareInterface.php @@ -0,0 +1,44 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +/** + * MetadataAwareInterface. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +interface MetadataAwareInterface +{ + /** + * Gets metadata for the given domain and key. + * + * Passing an empty domain will return an array with all metadata indexed by + * domain and then by key. Passing an empty key will return an array with all + * metadata for the given domain. + * + * @return mixed The value that was set or an array with the domains/keys or null + */ + public function getMetadata(string $key = '', string $domain = 'messages'): mixed; + + /** + * Adds metadata to a message domain. + */ + public function setMetadata(string $key, mixed $value, string $domain = 'messages'); + + /** + * Deletes metadata for the given key and domain. + * + * Passing an empty domain will delete all metadata. Passing an empty key will + * delete all metadata for the given domain. + */ + public function deleteMetadata(string $key = '', string $domain = 'messages'); +} diff --git a/vendor/symfony/translation/Provider/AbstractProviderFactory.php b/vendor/symfony/translation/Provider/AbstractProviderFactory.php new file mode 100644 index 0000000..17442fd --- /dev/null +++ b/vendor/symfony/translation/Provider/AbstractProviderFactory.php @@ -0,0 +1,45 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Provider; + +use Symfony\Component\Translation\Exception\IncompleteDsnException; + +abstract class AbstractProviderFactory implements ProviderFactoryInterface +{ + public function supports(Dsn $dsn): bool + { + return \in_array($dsn->getScheme(), $this->getSupportedSchemes(), true); + } + + /** + * @return string[] + */ + abstract protected function getSupportedSchemes(): array; + + protected function getUser(Dsn $dsn): string + { + if (null === $user = $dsn->getUser()) { + throw new IncompleteDsnException('User is not set.', $dsn->getOriginalDsn()); + } + + return $user; + } + + protected function getPassword(Dsn $dsn): string + { + if (null === $password = $dsn->getPassword()) { + throw new IncompleteDsnException('Password is not set.', $dsn->getOriginalDsn()); + } + + return $password; + } +} diff --git a/vendor/symfony/translation/Provider/Dsn.php b/vendor/symfony/translation/Provider/Dsn.php new file mode 100644 index 0000000..0f74d17 --- /dev/null +++ b/vendor/symfony/translation/Provider/Dsn.php @@ -0,0 +1,110 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Provider; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Exception\MissingRequiredOptionException; + +/** + * @author Fabien Potencier <fabien@symfony.com> + * @author Oskar Stark <oskarstark@googlemail.com> + */ +final class Dsn +{ + private ?string $scheme; + private ?string $host; + private ?string $user; + private ?string $password; + private ?int $port; + private ?string $path; + private array $options = []; + private string $originalDsn; + + public function __construct(string $dsn) + { + $this->originalDsn = $dsn; + + if (false === $parsedDsn = parse_url($dsn)) { + throw new InvalidArgumentException(sprintf('The "%s" translation provider DSN is invalid.', $dsn)); + } + + if (!isset($parsedDsn['scheme'])) { + throw new InvalidArgumentException(sprintf('The "%s" translation provider DSN must contain a scheme.', $dsn)); + } + $this->scheme = $parsedDsn['scheme']; + + if (!isset($parsedDsn['host'])) { + throw new InvalidArgumentException(sprintf('The "%s" translation provider DSN must contain a host (use "default" by default).', $dsn)); + } + $this->host = $parsedDsn['host']; + + $this->user = '' !== ($parsedDsn['user'] ?? '') ? urldecode($parsedDsn['user']) : null; + $this->password = '' !== ($parsedDsn['pass'] ?? '') ? urldecode($parsedDsn['pass']) : null; + $this->port = $parsedDsn['port'] ?? null; + $this->path = $parsedDsn['path'] ?? null; + parse_str($parsedDsn['query'] ?? '', $this->options); + } + + public function getScheme(): string + { + return $this->scheme; + } + + public function getHost(): string + { + return $this->host; + } + + public function getUser(): ?string + { + return $this->user; + } + + public function getPassword(): ?string + { + return $this->password; + } + + public function getPort(int $default = null): ?int + { + return $this->port ?? $default; + } + + public function getOption(string $key, mixed $default = null) + { + return $this->options[$key] ?? $default; + } + + public function getRequiredOption(string $key) + { + if (!\array_key_exists($key, $this->options) || '' === trim($this->options[$key])) { + throw new MissingRequiredOptionException($key); + } + + return $this->options[$key]; + } + + public function getOptions(): array + { + return $this->options; + } + + public function getPath(): ?string + { + return $this->path; + } + + public function getOriginalDsn(): string + { + return $this->originalDsn; + } +} diff --git a/vendor/symfony/translation/Provider/FilteringProvider.php b/vendor/symfony/translation/Provider/FilteringProvider.php new file mode 100644 index 0000000..a43fedc --- /dev/null +++ b/vendor/symfony/translation/Provider/FilteringProvider.php @@ -0,0 +1,65 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Provider; + +use Symfony\Component\Translation\TranslatorBag; +use Symfony\Component\Translation\TranslatorBagInterface; + +/** + * Filters domains and locales between the Translator config values and those specific to each provider. + * + * @author Mathieu Santostefano <msantostefano@protonmail.com> + */ +class FilteringProvider implements ProviderInterface +{ + private $provider; + private array $locales; + private array $domains; + + public function __construct(ProviderInterface $provider, array $locales, array $domains = []) + { + $this->provider = $provider; + $this->locales = $locales; + $this->domains = $domains; + } + + public function __toString(): string + { + return (string) $this->provider; + } + + /** + * {@inheritdoc} + */ + public function write(TranslatorBagInterface $translatorBag): void + { + $this->provider->write($translatorBag); + } + + public function read(array $domains, array $locales): TranslatorBag + { + $domains = !$this->domains ? $domains : array_intersect($this->domains, $domains); + $locales = array_intersect($this->locales, $locales); + + return $this->provider->read($domains, $locales); + } + + public function delete(TranslatorBagInterface $translatorBag): void + { + $this->provider->delete($translatorBag); + } + + public function getDomains(): array + { + return $this->domains; + } +} diff --git a/vendor/symfony/translation/Provider/NullProvider.php b/vendor/symfony/translation/Provider/NullProvider.php new file mode 100644 index 0000000..f00392e --- /dev/null +++ b/vendor/symfony/translation/Provider/NullProvider.php @@ -0,0 +1,39 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Provider; + +use Symfony\Component\Translation\TranslatorBag; +use Symfony\Component\Translation\TranslatorBagInterface; + +/** + * @author Mathieu Santostefano <msantostefano@protonmail.com> + */ +class NullProvider implements ProviderInterface +{ + public function __toString(): string + { + return 'null'; + } + + public function write(TranslatorBagInterface $translatorBag, bool $override = false): void + { + } + + public function read(array $domains, array $locales): TranslatorBag + { + return new TranslatorBag(); + } + + public function delete(TranslatorBagInterface $translatorBag): void + { + } +} diff --git a/vendor/symfony/translation/Provider/NullProviderFactory.php b/vendor/symfony/translation/Provider/NullProviderFactory.php new file mode 100644 index 0000000..f350f16 --- /dev/null +++ b/vendor/symfony/translation/Provider/NullProviderFactory.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Provider; + +use Symfony\Component\Translation\Exception\UnsupportedSchemeException; + +/** + * @author Mathieu Santostefano <msantostefano@protonmail.com> + */ +final class NullProviderFactory extends AbstractProviderFactory +{ + public function create(Dsn $dsn): ProviderInterface + { + if ('null' === $dsn->getScheme()) { + return new NullProvider(); + } + + throw new UnsupportedSchemeException($dsn, 'null', $this->getSupportedSchemes()); + } + + protected function getSupportedSchemes(): array + { + return ['null']; + } +} diff --git a/vendor/symfony/translation/Provider/ProviderFactoryInterface.php b/vendor/symfony/translation/Provider/ProviderFactoryInterface.php new file mode 100644 index 0000000..3fd4494 --- /dev/null +++ b/vendor/symfony/translation/Provider/ProviderFactoryInterface.php @@ -0,0 +1,26 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Provider; + +use Symfony\Component\Translation\Exception\IncompleteDsnException; +use Symfony\Component\Translation\Exception\UnsupportedSchemeException; + +interface ProviderFactoryInterface +{ + /** + * @throws UnsupportedSchemeException + * @throws IncompleteDsnException + */ + public function create(Dsn $dsn): ProviderInterface; + + public function supports(Dsn $dsn): bool; +} diff --git a/vendor/symfony/translation/Provider/ProviderInterface.php b/vendor/symfony/translation/Provider/ProviderInterface.php new file mode 100644 index 0000000..a32193f --- /dev/null +++ b/vendor/symfony/translation/Provider/ProviderInterface.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Provider; + +use Symfony\Component\Translation\TranslatorBag; +use Symfony\Component\Translation\TranslatorBagInterface; + +interface ProviderInterface +{ + public function __toString(): string; + + /** + * Translations available in the TranslatorBag only must be created. + * Translations available in both the TranslatorBag and on the provider + * must be overwritten. + * Translations available on the provider only must be kept. + */ + public function write(TranslatorBagInterface $translatorBag): void; + + public function read(array $domains, array $locales): TranslatorBag; + + public function delete(TranslatorBagInterface $translatorBag): void; +} diff --git a/vendor/symfony/translation/Provider/TranslationProviderCollection.php b/vendor/symfony/translation/Provider/TranslationProviderCollection.php new file mode 100644 index 0000000..61ac641 --- /dev/null +++ b/vendor/symfony/translation/Provider/TranslationProviderCollection.php @@ -0,0 +1,57 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Provider; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; + +/** + * @author Mathieu Santostefano <msantostefano@protonmail.com> + */ +final class TranslationProviderCollection +{ + /** + * @var array<string, ProviderInterface> + */ + private $providers; + + /** + * @param array<string, ProviderInterface> $providers + */ + public function __construct(iterable $providers) + { + $this->providers = \is_array($providers) ? $providers : iterator_to_array($providers); + } + + public function __toString(): string + { + return '['.implode(',', array_keys($this->providers)).']'; + } + + public function has(string $name): bool + { + return isset($this->providers[$name]); + } + + public function get(string $name): ProviderInterface + { + if (!$this->has($name)) { + throw new InvalidArgumentException(sprintf('Provider "%s" not found. Available: "%s".', $name, (string) $this)); + } + + return $this->providers[$name]; + } + + public function keys(): array + { + return array_keys($this->providers); + } +} diff --git a/vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php b/vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php new file mode 100644 index 0000000..6300c87 --- /dev/null +++ b/vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php @@ -0,0 +1,57 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Provider; + +use Symfony\Component\Translation\Exception\UnsupportedSchemeException; + +/** + * @author Mathieu Santostefano <msantostefano@protonmail.com> + */ +class TranslationProviderCollectionFactory +{ + private iterable $factories; + private array $enabledLocales; + + /** + * @param iterable<mixed, ProviderFactoryInterface> $factories + */ + public function __construct(iterable $factories, array $enabledLocales) + { + $this->factories = $factories; + $this->enabledLocales = $enabledLocales; + } + + public function fromConfig(array $config): TranslationProviderCollection + { + $providers = []; + foreach ($config as $name => $currentConfig) { + $providers[$name] = $this->fromDsnObject( + new Dsn($currentConfig['dsn']), + !$currentConfig['locales'] ? $this->enabledLocales : $currentConfig['locales'], + !$currentConfig['domains'] ? [] : $currentConfig['domains'] + ); + } + + return new TranslationProviderCollection($providers); + } + + public function fromDsnObject(Dsn $dsn, array $locales, array $domains = []): ProviderInterface + { + foreach ($this->factories as $factory) { + if ($factory->supports($dsn)) { + return new FilteringProvider($factory->create($dsn), $locales, $domains); + } + } + + throw new UnsupportedSchemeException($dsn); + } +} diff --git a/vendor/symfony/translation/PseudoLocalizationTranslator.php b/vendor/symfony/translation/PseudoLocalizationTranslator.php new file mode 100644 index 0000000..ba7319d --- /dev/null +++ b/vendor/symfony/translation/PseudoLocalizationTranslator.php @@ -0,0 +1,368 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Symfony\Contracts\Translation\TranslatorInterface; + +/** + * This translator should only be used in a development environment. + */ +final class PseudoLocalizationTranslator implements TranslatorInterface +{ + private const EXPANSION_CHARACTER = '~'; + + private $translator; + private bool $accents; + private float $expansionFactor; + private bool $brackets; + private bool $parseHTML; + + /** + * @var string[] + */ + private array $localizableHTMLAttributes; + + /** + * Available options: + * * accents: + * type: boolean + * default: true + * description: replace ASCII characters of the translated string with accented versions or similar characters + * example: if true, "foo" => "ƒöö". + * + * * expansion_factor: + * type: float + * default: 1 + * validation: it must be greater than or equal to 1 + * description: expand the translated string by the given factor with spaces and tildes + * example: if 2, "foo" => "~foo ~" + * + * * brackets: + * type: boolean + * default: true + * description: wrap the translated string with brackets + * example: if true, "foo" => "[foo]" + * + * * parse_html: + * type: boolean + * default: false + * description: parse the translated string as HTML - looking for HTML tags has a performance impact but allows to preserve them from alterations - it also allows to compute the visible translated string length which is useful to correctly expand ot when it contains HTML + * warning: unclosed tags are unsupported, they will be fixed (closed) by the parser - eg, "foo <div>bar" => "foo <div>bar</div>" + * + * * localizable_html_attributes: + * type: string[] + * default: [] + * description: the list of HTML attributes whose values can be altered - it is only useful when the "parse_html" option is set to true + * example: if ["title"], and with the "accents" option set to true, "<a href="#" title="Go to your profile">Profile</a>" => "<a href="#" title="Ĝö ţö ýöûŕ þŕöƒîļé">Þŕöƒîļé</a>" - if "title" was not in the "localizable_html_attributes" list, the title attribute data would be left unchanged. + */ + public function __construct(TranslatorInterface $translator, array $options = []) + { + $this->translator = $translator; + $this->accents = $options['accents'] ?? true; + + if (1.0 > ($this->expansionFactor = $options['expansion_factor'] ?? 1.0)) { + throw new \InvalidArgumentException('The expansion factor must be greater than or equal to 1.'); + } + + $this->brackets = $options['brackets'] ?? true; + + $this->parseHTML = $options['parse_html'] ?? false; + if ($this->parseHTML && !$this->accents && 1.0 === $this->expansionFactor) { + $this->parseHTML = false; + } + + $this->localizableHTMLAttributes = $options['localizable_html_attributes'] ?? []; + } + + /** + * {@inheritdoc} + */ + public function trans(string $id, array $parameters = [], string $domain = null, string $locale = null): string + { + $trans = ''; + $visibleText = ''; + + foreach ($this->getParts($this->translator->trans($id, $parameters, $domain, $locale)) as [$visible, $localizable, $text]) { + if ($visible) { + $visibleText .= $text; + } + + if (!$localizable) { + $trans .= $text; + + continue; + } + + $this->addAccents($trans, $text); + } + + $this->expand($trans, $visibleText); + + $this->addBrackets($trans); + + return $trans; + } + + public function getLocale(): string + { + return $this->translator->getLocale(); + } + + private function getParts(string $originalTrans): array + { + if (!$this->parseHTML) { + return [[true, true, $originalTrans]]; + } + + $html = mb_encode_numericentity($originalTrans, [0x80, 0xFFFF, 0, 0xFFFF], mb_detect_encoding($originalTrans, null, true) ?: 'UTF-8'); + + $useInternalErrors = libxml_use_internal_errors(true); + + $dom = new \DOMDocument(); + $dom->loadHTML('<trans>'.$html.'</trans>'); + + libxml_clear_errors(); + libxml_use_internal_errors($useInternalErrors); + + return $this->parseNode($dom->childNodes->item(1)->childNodes->item(0)->childNodes->item(0)); + } + + private function parseNode(\DOMNode $node): array + { + $parts = []; + + foreach ($node->childNodes as $childNode) { + if (!$childNode instanceof \DOMElement) { + $parts[] = [true, true, $childNode->nodeValue]; + + continue; + } + + $parts[] = [false, false, '<'.$childNode->tagName]; + + /** @var \DOMAttr $attribute */ + foreach ($childNode->attributes as $attribute) { + $parts[] = [false, false, ' '.$attribute->nodeName.'="']; + + $localizableAttribute = \in_array($attribute->nodeName, $this->localizableHTMLAttributes, true); + foreach (preg_split('/(&(?:amp|quot|#039|lt|gt);+)/', htmlspecialchars($attribute->nodeValue, \ENT_QUOTES, 'UTF-8'), -1, \PREG_SPLIT_DELIM_CAPTURE) as $i => $match) { + if ('' === $match) { + continue; + } + + $parts[] = [false, $localizableAttribute && 0 === $i % 2, $match]; + } + + $parts[] = [false, false, '"']; + } + + $parts[] = [false, false, '>']; + + $parts = array_merge($parts, $this->parseNode($childNode, $parts)); + + $parts[] = [false, false, '</'.$childNode->tagName.'>']; + } + + return $parts; + } + + private function addAccents(string &$trans, string $text): void + { + $trans .= $this->accents ? strtr($text, [ + ' ' => ' ', + '!' => '¡', + '"' => '″', + '#' => '♯', + '$' => '€', + '%' => '‰', + '&' => '⅋', + '\'' => '´', + '(' => '{', + ')' => '}', + '*' => '⁎', + '+' => '⁺', + ',' => '،', + '-' => '‐', + '.' => '·', + '/' => '⁄', + '0' => '⓪', + '1' => '①', + '2' => '②', + '3' => '③', + '4' => '④', + '5' => '⑤', + '6' => '⑥', + '7' => '⑦', + '8' => '⑧', + '9' => '⑨', + ':' => '∶', + ';' => '⁏', + '<' => '≤', + '=' => '≂', + '>' => '≥', + '?' => '¿', + '@' => '՞', + 'A' => 'Å', + 'B' => 'Ɓ', + 'C' => 'Ç', + 'D' => 'Ð', + 'E' => 'É', + 'F' => 'Ƒ', + 'G' => 'Ĝ', + 'H' => 'Ĥ', + 'I' => 'Î', + 'J' => 'Ĵ', + 'K' => 'Ķ', + 'L' => 'Ļ', + 'M' => 'Ṁ', + 'N' => 'Ñ', + 'O' => 'Ö', + 'P' => 'Þ', + 'Q' => 'Ǫ', + 'R' => 'Ŕ', + 'S' => 'Š', + 'T' => 'Ţ', + 'U' => 'Û', + 'V' => 'Ṽ', + 'W' => 'Ŵ', + 'X' => 'Ẋ', + 'Y' => 'Ý', + 'Z' => 'Ž', + '[' => '⁅', + '\\' => '∖', + ']' => '⁆', + '^' => '˄', + '_' => '‿', + '`' => '‵', + 'a' => 'å', + 'b' => 'ƀ', + 'c' => 'ç', + 'd' => 'ð', + 'e' => 'é', + 'f' => 'ƒ', + 'g' => 'ĝ', + 'h' => 'ĥ', + 'i' => 'î', + 'j' => 'ĵ', + 'k' => 'ķ', + 'l' => 'ļ', + 'm' => 'ɱ', + 'n' => 'ñ', + 'o' => 'ö', + 'p' => 'þ', + 'q' => 'ǫ', + 'r' => 'ŕ', + 's' => 'š', + 't' => 'ţ', + 'u' => 'û', + 'v' => 'ṽ', + 'w' => 'ŵ', + 'x' => 'ẋ', + 'y' => 'ý', + 'z' => 'ž', + '{' => '(', + '|' => '¦', + '}' => ')', + '~' => '˞', + ]) : $text; + } + + private function expand(string &$trans, string $visibleText): void + { + if (1.0 >= $this->expansionFactor) { + return; + } + + $visibleLength = $this->strlen($visibleText); + $missingLength = (int) ceil($visibleLength * $this->expansionFactor) - $visibleLength; + if ($this->brackets) { + $missingLength -= 2; + } + + if (0 >= $missingLength) { + return; + } + + $words = []; + $wordsCount = 0; + foreach (preg_split('/ +/', $visibleText, -1, \PREG_SPLIT_NO_EMPTY) as $word) { + $wordLength = $this->strlen($word); + + if ($wordLength >= $missingLength) { + continue; + } + + if (!isset($words[$wordLength])) { + $words[$wordLength] = 0; + } + + ++$words[$wordLength]; + ++$wordsCount; + } + + if (!$words) { + $trans .= 1 === $missingLength ? self::EXPANSION_CHARACTER : ' '.str_repeat(self::EXPANSION_CHARACTER, $missingLength - 1); + + return; + } + + arsort($words, \SORT_NUMERIC); + + $longestWordLength = max(array_keys($words)); + + while (true) { + $r = mt_rand(1, $wordsCount); + + foreach ($words as $length => $count) { + $r -= $count; + if ($r <= 0) { + break; + } + } + + $trans .= ' '.str_repeat(self::EXPANSION_CHARACTER, $length); + + $missingLength -= $length + 1; + + if (0 === $missingLength) { + return; + } + + while ($longestWordLength >= $missingLength) { + $wordsCount -= $words[$longestWordLength]; + unset($words[$longestWordLength]); + + if (!$words) { + $trans .= 1 === $missingLength ? self::EXPANSION_CHARACTER : ' '.str_repeat(self::EXPANSION_CHARACTER, $missingLength - 1); + + return; + } + + $longestWordLength = max(array_keys($words)); + } + } + } + + private function addBrackets(string &$trans): void + { + if (!$this->brackets) { + return; + } + + $trans = '['.$trans.']'; + } + + private function strlen(string $s): int + { + return false === ($encoding = mb_detect_encoding($s, null, true)) ? \strlen($s) : mb_strlen($s, $encoding); + } +} diff --git a/vendor/symfony/translation/README.md b/vendor/symfony/translation/README.md new file mode 100644 index 0000000..adda9a5 --- /dev/null +++ b/vendor/symfony/translation/README.md @@ -0,0 +1,48 @@ +Translation Component +===================== + +The Translation component provides tools to internationalize your application. + +Getting Started +--------------- + +``` +$ composer require symfony/translation +``` + +```php +use Symfony\Component\Translation\Translator; +use Symfony\Component\Translation\Loader\ArrayLoader; + +$translator = new Translator('fr_FR'); +$translator->addLoader('array', new ArrayLoader()); +$translator->addResource('array', [ + 'Hello World!' => 'Bonjour !', +], 'fr_FR'); + +echo $translator->trans('Hello World!'); // outputs « Bonjour ! » +``` + +Sponsor +------- + +The Translation component for Symfony 5.4/6.0 is [backed][1] by: + + * [Crowdin][2], a cloud-based localization management software helping teams to go global and stay agile. + * [Lokalise][3], a continuous localization and translation management platform that integrates into your development workflow so you can ship localized products, faster. + +Help Symfony by [sponsoring][4] its development! + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/translation.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) + +[1]: https://symfony.com/backers +[2]: https://crowdin.com +[3]: https://lokalise.com +[4]: https://symfony.com/sponsor diff --git a/vendor/symfony/translation/Reader/TranslationReader.php b/vendor/symfony/translation/Reader/TranslationReader.php new file mode 100644 index 0000000..bbc687e --- /dev/null +++ b/vendor/symfony/translation/Reader/TranslationReader.php @@ -0,0 +1,62 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Reader; + +use Symfony\Component\Finder\Finder; +use Symfony\Component\Translation\Loader\LoaderInterface; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * TranslationReader reads translation messages from translation files. + * + * @author Michel Salib <michelsalib@hotmail.com> + */ +class TranslationReader implements TranslationReaderInterface +{ + /** + * Loaders used for import. + * + * @var array<string, LoaderInterface> + */ + private array $loaders = []; + + /** + * Adds a loader to the translation extractor. + * + * @param string $format The format of the loader + */ + public function addLoader(string $format, LoaderInterface $loader) + { + $this->loaders[$format] = $loader; + } + + /** + * {@inheritdoc} + */ + public function read(string $directory, MessageCatalogue $catalogue) + { + if (!is_dir($directory)) { + return; + } + + foreach ($this->loaders as $format => $loader) { + // load any existing translation files + $finder = new Finder(); + $extension = $catalogue->getLocale().'.'.$format; + $files = $finder->files()->name('*.'.$extension)->in($directory); + foreach ($files as $file) { + $domain = substr($file->getFilename(), 0, -1 * \strlen($extension) - 1); + $catalogue->addCatalogue($loader->load($file->getPathname(), $catalogue->getLocale(), $domain)); + } + } + } +} diff --git a/vendor/symfony/translation/Reader/TranslationReaderInterface.php b/vendor/symfony/translation/Reader/TranslationReaderInterface.php new file mode 100644 index 0000000..bc37204 --- /dev/null +++ b/vendor/symfony/translation/Reader/TranslationReaderInterface.php @@ -0,0 +1,27 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Reader; + +use Symfony\Component\Translation\MessageCatalogue; + +/** + * TranslationReader reads translation messages from translation files. + * + * @author Tobias Nyholm <tobias.nyholm@gmail.com> + */ +interface TranslationReaderInterface +{ + /** + * Reads translation messages from a directory to the catalogue. + */ + public function read(string $directory, MessageCatalogue $catalogue); +} diff --git a/vendor/symfony/translation/Resources/bin/translation-status.php b/vendor/symfony/translation/Resources/bin/translation-status.php new file mode 100644 index 0000000..4fe814c --- /dev/null +++ b/vendor/symfony/translation/Resources/bin/translation-status.php @@ -0,0 +1,278 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if ('cli' !== \PHP_SAPI) { + throw new Exception('This script must be run from the command line.'); +} + +$usageInstructions = <<<END + + Usage instructions + ------------------------------------------------------------------------------- + + $ cd symfony-code-root-directory/ + + # show the translation status of all locales + $ php translation-status.php + + # only show the translation status of incomplete or erroneous locales + $ php translation-status.php --incomplete + + # show the translation status of all locales, all their missing translations and mismatches between trans-unit id and source + $ php translation-status.php -v + + # show the status of a single locale + $ php translation-status.php fr + + # show the status of a single locale, missing translations and mismatches between trans-unit id and source + $ php translation-status.php fr -v + +END; + +$config = [ + // if TRUE, the full list of missing translations is displayed + 'verbose_output' => false, + // NULL = analyze all locales + 'locale_to_analyze' => null, + // append --incomplete to only show incomplete languages + 'include_completed_languages' => true, + // the reference files all the other translations are compared to + 'original_files' => [ + 'src/Symfony/Component/Form/Resources/translations/validators.en.xlf', + 'src/Symfony/Component/Security/Core/Resources/translations/security.en.xlf', + 'src/Symfony/Component/Validator/Resources/translations/validators.en.xlf', + ], +]; + +$argc = $_SERVER['argc']; +$argv = $_SERVER['argv']; + +if ($argc > 4) { + echo str_replace('translation-status.php', $argv[0], $usageInstructions); + exit(1); +} + +foreach (array_slice($argv, 1) as $argumentOrOption) { + if ('--incomplete' === $argumentOrOption) { + $config['include_completed_languages'] = false; + continue; + } + + if (str_starts_with($argumentOrOption, '-')) { + $config['verbose_output'] = true; + } else { + $config['locale_to_analyze'] = $argumentOrOption; + } +} + +foreach ($config['original_files'] as $originalFilePath) { + if (!file_exists($originalFilePath)) { + echo sprintf('The following file does not exist. Make sure that you execute this command at the root dir of the Symfony code repository.%s %s', \PHP_EOL, $originalFilePath); + exit(1); + } +} + +$totalMissingTranslations = 0; +$totalTranslationMismatches = 0; + +foreach ($config['original_files'] as $originalFilePath) { + $translationFilePaths = findTranslationFiles($originalFilePath, $config['locale_to_analyze']); + $translationStatus = calculateTranslationStatus($originalFilePath, $translationFilePaths); + + $totalMissingTranslations += array_sum(array_map(function ($translation) { + return count($translation['missingKeys']); + }, array_values($translationStatus))); + $totalTranslationMismatches += array_sum(array_map(function ($translation) { + return count($translation['mismatches']); + }, array_values($translationStatus))); + + printTranslationStatus($originalFilePath, $translationStatus, $config['verbose_output'], $config['include_completed_languages']); +} + +exit($totalTranslationMismatches > 0 ? 1 : 0); + +function findTranslationFiles($originalFilePath, $localeToAnalyze) +{ + $translations = []; + + $translationsDir = dirname($originalFilePath); + $originalFileName = basename($originalFilePath); + $translationFileNamePattern = str_replace('.en.', '.*.', $originalFileName); + + $translationFiles = glob($translationsDir.'/'.$translationFileNamePattern, \GLOB_NOSORT); + sort($translationFiles); + foreach ($translationFiles as $filePath) { + $locale = extractLocaleFromFilePath($filePath); + + if (null !== $localeToAnalyze && $locale !== $localeToAnalyze) { + continue; + } + + $translations[$locale] = $filePath; + } + + return $translations; +} + +function calculateTranslationStatus($originalFilePath, $translationFilePaths) +{ + $translationStatus = []; + $allTranslationKeys = extractTranslationKeys($originalFilePath); + + foreach ($translationFilePaths as $locale => $translationPath) { + $translatedKeys = extractTranslationKeys($translationPath); + $missingKeys = array_diff_key($allTranslationKeys, $translatedKeys); + $mismatches = findTransUnitMismatches($allTranslationKeys, $translatedKeys); + + $translationStatus[$locale] = [ + 'total' => count($allTranslationKeys), + 'translated' => count($translatedKeys), + 'missingKeys' => $missingKeys, + 'mismatches' => $mismatches, + ]; + $translationStatus[$locale]['is_completed'] = isTranslationCompleted($translationStatus[$locale]); + } + + return $translationStatus; +} + +function isTranslationCompleted(array $translationStatus): bool +{ + return $translationStatus['total'] === $translationStatus['translated'] && 0 === count($translationStatus['mismatches']); +} + +function printTranslationStatus($originalFilePath, $translationStatus, $verboseOutput, $includeCompletedLanguages) +{ + printTitle($originalFilePath); + printTable($translationStatus, $verboseOutput, $includeCompletedLanguages); + echo \PHP_EOL.\PHP_EOL; +} + +function extractLocaleFromFilePath($filePath) +{ + $parts = explode('.', $filePath); + + return $parts[count($parts) - 2]; +} + +function extractTranslationKeys($filePath) +{ + $translationKeys = []; + $contents = new \SimpleXMLElement(file_get_contents($filePath)); + + foreach ($contents->file->body->{'trans-unit'} as $translationKey) { + $translationId = (string) $translationKey['id']; + $translationKey = (string) $translationKey->source; + + $translationKeys[$translationId] = $translationKey; + } + + return $translationKeys; +} + +/** + * Check whether the trans-unit id and source match with the base translation. + */ +function findTransUnitMismatches(array $baseTranslationKeys, array $translatedKeys): array +{ + $mismatches = []; + + foreach ($baseTranslationKeys as $translationId => $translationKey) { + if (!isset($translatedKeys[$translationId])) { + continue; + } + if ($translatedKeys[$translationId] !== $translationKey) { + $mismatches[$translationId] = [ + 'found' => $translatedKeys[$translationId], + 'expected' => $translationKey, + ]; + } + } + + return $mismatches; +} + +function printTitle($title) +{ + echo $title.\PHP_EOL; + echo str_repeat('=', strlen($title)).\PHP_EOL.\PHP_EOL; +} + +function printTable($translations, $verboseOutput, bool $includeCompletedLanguages) +{ + if (0 === count($translations)) { + echo 'No translations found'; + + return; + } + $longestLocaleNameLength = max(array_map('strlen', array_keys($translations))); + + foreach ($translations as $locale => $translation) { + if (!$includeCompletedLanguages && $translation['is_completed']) { + continue; + } + + if ($translation['translated'] > $translation['total']) { + textColorRed(); + } elseif (count($translation['mismatches']) > 0) { + textColorRed(); + } elseif ($translation['is_completed']) { + textColorGreen(); + } + + echo sprintf( + '| Locale: %-'.$longestLocaleNameLength.'s | Translated: %2d/%2d | Mismatches: %d |', + $locale, + $translation['translated'], + $translation['total'], + count($translation['mismatches']) + ).\PHP_EOL; + + textColorNormal(); + + $shouldBeClosed = false; + if (true === $verboseOutput && count($translation['missingKeys']) > 0) { + echo '| Missing Translations:'.\PHP_EOL; + + foreach ($translation['missingKeys'] as $id => $content) { + echo sprintf('| (id=%s) %s', $id, $content).\PHP_EOL; + } + $shouldBeClosed = true; + } + if (true === $verboseOutput && count($translation['mismatches']) > 0) { + echo '| Mismatches between trans-unit id and source:'.\PHP_EOL; + + foreach ($translation['mismatches'] as $id => $content) { + echo sprintf('| (id=%s) Expected: %s', $id, $content['expected']).\PHP_EOL; + echo sprintf('| Found: %s', $content['found']).\PHP_EOL; + } + $shouldBeClosed = true; + } + if ($shouldBeClosed) { + echo str_repeat('-', 80).\PHP_EOL; + } + } +} + +function textColorGreen() +{ + echo "\033[32m"; +} + +function textColorRed() +{ + echo "\033[31m"; +} + +function textColorNormal() +{ + echo "\033[0m"; +} diff --git a/vendor/symfony/translation/Resources/data/parents.json b/vendor/symfony/translation/Resources/data/parents.json new file mode 100644 index 0000000..32a33cd --- /dev/null +++ b/vendor/symfony/translation/Resources/data/parents.json @@ -0,0 +1,141 @@ +{ + "az_Cyrl": "root", + "bs_Cyrl": "root", + "en_150": "en_001", + "en_AG": "en_001", + "en_AI": "en_001", + "en_AT": "en_150", + "en_AU": "en_001", + "en_BB": "en_001", + "en_BE": "en_150", + "en_BM": "en_001", + "en_BS": "en_001", + "en_BW": "en_001", + "en_BZ": "en_001", + "en_CC": "en_001", + "en_CH": "en_150", + "en_CK": "en_001", + "en_CM": "en_001", + "en_CX": "en_001", + "en_CY": "en_001", + "en_DE": "en_150", + "en_DG": "en_001", + "en_DK": "en_150", + "en_DM": "en_001", + "en_ER": "en_001", + "en_FI": "en_150", + "en_FJ": "en_001", + "en_FK": "en_001", + "en_FM": "en_001", + "en_GB": "en_001", + "en_GD": "en_001", + "en_GG": "en_001", + "en_GH": "en_001", + "en_GI": "en_001", + "en_GM": "en_001", + "en_GY": "en_001", + "en_HK": "en_001", + "en_IE": "en_001", + "en_IL": "en_001", + "en_IM": "en_001", + "en_IN": "en_001", + "en_IO": "en_001", + "en_JE": "en_001", + "en_JM": "en_001", + "en_KE": "en_001", + "en_KI": "en_001", + "en_KN": "en_001", + "en_KY": "en_001", + "en_LC": "en_001", + "en_LR": "en_001", + "en_LS": "en_001", + "en_MG": "en_001", + "en_MO": "en_001", + "en_MS": "en_001", + "en_MT": "en_001", + "en_MU": "en_001", + "en_MV": "en_001", + "en_MW": "en_001", + "en_MY": "en_001", + "en_NA": "en_001", + "en_NF": "en_001", + "en_NG": "en_001", + "en_NL": "en_150", + "en_NR": "en_001", + "en_NU": "en_001", + "en_NZ": "en_001", + "en_PG": "en_001", + "en_PK": "en_001", + "en_PN": "en_001", + "en_PW": "en_001", + "en_RW": "en_001", + "en_SB": "en_001", + "en_SC": "en_001", + "en_SD": "en_001", + "en_SE": "en_150", + "en_SG": "en_001", + "en_SH": "en_001", + "en_SI": "en_150", + "en_SL": "en_001", + "en_SS": "en_001", + "en_SX": "en_001", + "en_SZ": "en_001", + "en_TC": "en_001", + "en_TK": "en_001", + "en_TO": "en_001", + "en_TT": "en_001", + "en_TV": "en_001", + "en_TZ": "en_001", + "en_UG": "en_001", + "en_VC": "en_001", + "en_VG": "en_001", + "en_VU": "en_001", + "en_WS": "en_001", + "en_ZA": "en_001", + "en_ZM": "en_001", + "en_ZW": "en_001", + "es_AR": "es_419", + "es_BO": "es_419", + "es_BR": "es_419", + "es_BZ": "es_419", + "es_CL": "es_419", + "es_CO": "es_419", + "es_CR": "es_419", + "es_CU": "es_419", + "es_DO": "es_419", + "es_EC": "es_419", + "es_GT": "es_419", + "es_HN": "es_419", + "es_MX": "es_419", + "es_NI": "es_419", + "es_PA": "es_419", + "es_PE": "es_419", + "es_PR": "es_419", + "es_PY": "es_419", + "es_SV": "es_419", + "es_US": "es_419", + "es_UY": "es_419", + "es_VE": "es_419", + "ff_Adlm": "root", + "hi_Latn": "en_IN", + "ks_Deva": "root", + "nb": "no", + "nn": "no", + "pa_Arab": "root", + "pt_AO": "pt_PT", + "pt_CH": "pt_PT", + "pt_CV": "pt_PT", + "pt_GQ": "pt_PT", + "pt_GW": "pt_PT", + "pt_LU": "pt_PT", + "pt_MO": "pt_PT", + "pt_MZ": "pt_PT", + "pt_ST": "pt_PT", + "pt_TL": "pt_PT", + "sd_Deva": "root", + "sr_Latn": "root", + "uz_Arab": "root", + "uz_Cyrl": "root", + "zh_Hant": "root", + "zh_Hant_MO": "zh_Hant_HK" +} diff --git a/vendor/symfony/translation/Resources/functions.php b/vendor/symfony/translation/Resources/functions.php new file mode 100644 index 0000000..901d2f8 --- /dev/null +++ b/vendor/symfony/translation/Resources/functions.php @@ -0,0 +1,22 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +if (!\function_exists(t::class)) { + /** + * @author Nate Wiebe <nate@northern.co> + */ + function t(string $message, array $parameters = [], string $domain = null): TranslatableMessage + { + return new TranslatableMessage($message, $parameters, $domain); + } +} diff --git a/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd b/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd new file mode 100644 index 0000000..dface62 --- /dev/null +++ b/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-strict.xsd @@ -0,0 +1,2223 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- + +May-19-2004: +- Changed the <choice> for ElemType_header, moving minOccurs="0" maxOccurs="unbounded" from its elements +to <choice> itself. +- Added <choice> for ElemType_trans-unit to allow "any order" for <context-group>, <count-group>, <prop-group>, <note>, and +<alt-trans>. + +Oct-2005 +- updated version info to 1.2 +- equiv-trans attribute to <trans-unit> element +- merged-trans attribute for <group> element +- Add the <seg-source> element as optional in the <trans-unit> and <alt-trans> content models, at the same level as <source> +- Create a new value "seg" for the mtype attribute of the <mrk> element +- Add mid as an optional attribute for the <alt-trans> element + +Nov-14-2005 +- Changed name attribute for <context-group> from required to optional +- Added extension point at <xliff> + +Jan-9-2006 +- Added alttranstype type attribute to <alt-trans>, and values + +Jan-10-2006 +- Corrected error with overwritten purposeValueList +- Corrected name="AttrType_Version", attribute should have been "name" + +--> +<xsd:schema xmlns:xlf="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:oasis:names:tc:xliff:document:1.2" xml:lang="en"> + <!-- Import for xml:lang and xml:space --> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/> + <!-- Attributes Lists --> + <xsd:simpleType name="XTend"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="x-[^\s]+"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="context-typeValueList"> + <xsd:annotation> + <xsd:documentation>Values for the attribute 'context-type'.</xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="database"> + <xsd:annotation> + <xsd:documentation>Indicates a database content.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="element"> + <xsd:annotation> + <xsd:documentation>Indicates the content of an element within an XML document.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="elementtitle"> + <xsd:annotation> + <xsd:documentation>Indicates the name of an element within an XML document.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="linenumber"> + <xsd:annotation> + <xsd:documentation>Indicates the line number from the sourcefile (see context-type="sourcefile") where the <source> is found.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="numparams"> + <xsd:annotation> + <xsd:documentation>Indicates a the number of parameters contained within the <source>.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="paramnotes"> + <xsd:annotation> + <xsd:documentation>Indicates notes pertaining to the parameters in the <source>.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="record"> + <xsd:annotation> + <xsd:documentation>Indicates the content of a record within a database.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="recordtitle"> + <xsd:annotation> + <xsd:documentation>Indicates the name of a record within a database.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="sourcefile"> + <xsd:annotation> + <xsd:documentation>Indicates the original source file in the case that multiple files are merged to form the original file from which the XLIFF file is created. This differs from the original <file> attribute in that this sourcefile is one of many that make up that file.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="count-typeValueList"> + <xsd:annotation> + <xsd:documentation>Values for the attribute 'count-type'.</xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:NMTOKEN"> + <xsd:enumeration value="num-usages"> + <xsd:annotation> + <xsd:documentation>Indicates the count units are items that are used X times in a certain context; example: this is a reusable text unit which is used 42 times in other texts.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="repetition"> + <xsd:annotation> + <xsd:documentation>Indicates the count units are translation units existing already in the same document.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="total"> + <xsd:annotation> + <xsd:documentation>Indicates a total count.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="InlineDelimitersValueList"> + <xsd:annotation> + <xsd:documentation>Values for the attribute 'ctype' when used other elements than <ph> or <x>.</xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:NMTOKEN"> + <xsd:enumeration value="bold"> + <xsd:annotation> + <xsd:documentation>Indicates a run of bolded text.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="italic"> + <xsd:annotation> + <xsd:documentation>Indicates a run of text in italics.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="underlined"> + <xsd:annotation> + <xsd:documentation>Indicates a run of underlined text.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="link"> + <xsd:annotation> + <xsd:documentation>Indicates a run of hyper-text.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="InlinePlaceholdersValueList"> + <xsd:annotation> + <xsd:documentation>Values for the attribute 'ctype' when used with <ph> or <x>.</xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:NMTOKEN"> + <xsd:enumeration value="image"> + <xsd:annotation> + <xsd:documentation>Indicates a inline image.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="pb"> + <xsd:annotation> + <xsd:documentation>Indicates a page break.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="lb"> + <xsd:annotation> + <xsd:documentation>Indicates a line break.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="mime-typeValueList"> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="(text|multipart|message|application|image|audio|video|model)(/.+)*"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="datatypeValueList"> + <xsd:annotation> + <xsd:documentation>Values for the attribute 'datatype'.</xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:NMTOKEN"> + <xsd:enumeration value="asp"> + <xsd:annotation> + <xsd:documentation>Indicates Active Server Page data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="c"> + <xsd:annotation> + <xsd:documentation>Indicates C source file data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="cdf"> + <xsd:annotation> + <xsd:documentation>Indicates Channel Definition Format (CDF) data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="cfm"> + <xsd:annotation> + <xsd:documentation>Indicates ColdFusion data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="cpp"> + <xsd:annotation> + <xsd:documentation>Indicates C++ source file data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="csharp"> + <xsd:annotation> + <xsd:documentation>Indicates C-Sharp data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="cstring"> + <xsd:annotation> + <xsd:documentation>Indicates strings from C, ASM, and driver files data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="csv"> + <xsd:annotation> + <xsd:documentation>Indicates comma-separated values data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="database"> + <xsd:annotation> + <xsd:documentation>Indicates database data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="documentfooter"> + <xsd:annotation> + <xsd:documentation>Indicates portions of document that follows data and contains metadata.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="documentheader"> + <xsd:annotation> + <xsd:documentation>Indicates portions of document that precedes data and contains metadata.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="filedialog"> + <xsd:annotation> + <xsd:documentation>Indicates data from standard UI file operations dialogs (e.g., Open, Save, Save As, Export, Import).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="form"> + <xsd:annotation> + <xsd:documentation>Indicates standard user input screen data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="html"> + <xsd:annotation> + <xsd:documentation>Indicates HyperText Markup Language (HTML) data - document instance.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="htmlbody"> + <xsd:annotation> + <xsd:documentation>Indicates content within an HTML document’s <body> element.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="ini"> + <xsd:annotation> + <xsd:documentation>Indicates Windows INI file data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="interleaf"> + <xsd:annotation> + <xsd:documentation>Indicates Interleaf data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="javaclass"> + <xsd:annotation> + <xsd:documentation>Indicates Java source file data (extension '.java').</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="javapropertyresourcebundle"> + <xsd:annotation> + <xsd:documentation>Indicates Java property resource bundle data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="javalistresourcebundle"> + <xsd:annotation> + <xsd:documentation>Indicates Java list resource bundle data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="javascript"> + <xsd:annotation> + <xsd:documentation>Indicates JavaScript source file data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="jscript"> + <xsd:annotation> + <xsd:documentation>Indicates JScript source file data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="layout"> + <xsd:annotation> + <xsd:documentation>Indicates information relating to formatting.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="lisp"> + <xsd:annotation> + <xsd:documentation>Indicates LISP source file data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="margin"> + <xsd:annotation> + <xsd:documentation>Indicates information relating to margin formats.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="menufile"> + <xsd:annotation> + <xsd:documentation>Indicates a file containing menu.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="messagefile"> + <xsd:annotation> + <xsd:documentation>Indicates numerically identified string table.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="mif"> + <xsd:annotation> + <xsd:documentation>Indicates Maker Interchange Format (MIF) data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="mimetype"> + <xsd:annotation> + <xsd:documentation>Indicates that the datatype attribute value is a MIME Type value and is defined in the mime-type attribute.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="mo"> + <xsd:annotation> + <xsd:documentation>Indicates GNU Machine Object data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="msglib"> + <xsd:annotation> + <xsd:documentation>Indicates Message Librarian strings created by Novell's Message Librarian Tool.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="pagefooter"> + <xsd:annotation> + <xsd:documentation>Indicates information to be displayed at the bottom of each page of a document.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="pageheader"> + <xsd:annotation> + <xsd:documentation>Indicates information to be displayed at the top of each page of a document.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="parameters"> + <xsd:annotation> + <xsd:documentation>Indicates a list of property values (e.g., settings within INI files or preferences dialog).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="pascal"> + <xsd:annotation> + <xsd:documentation>Indicates Pascal source file data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="php"> + <xsd:annotation> + <xsd:documentation>Indicates Hypertext Preprocessor data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="plaintext"> + <xsd:annotation> + <xsd:documentation>Indicates plain text file (no formatting other than, possibly, wrapping).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="po"> + <xsd:annotation> + <xsd:documentation>Indicates GNU Portable Object file.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="report"> + <xsd:annotation> + <xsd:documentation>Indicates dynamically generated user defined document. e.g. Oracle Report, Crystal Report, etc.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="resources"> + <xsd:annotation> + <xsd:documentation>Indicates Windows .NET binary resources.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="resx"> + <xsd:annotation> + <xsd:documentation>Indicates Windows .NET Resources.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="rtf"> + <xsd:annotation> + <xsd:documentation>Indicates Rich Text Format (RTF) data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="sgml"> + <xsd:annotation> + <xsd:documentation>Indicates Standard Generalized Markup Language (SGML) data - document instance.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="sgmldtd"> + <xsd:annotation> + <xsd:documentation>Indicates Standard Generalized Markup Language (SGML) data - Document Type Definition (DTD).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="svg"> + <xsd:annotation> + <xsd:documentation>Indicates Scalable Vector Graphic (SVG) data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="vbscript"> + <xsd:annotation> + <xsd:documentation>Indicates VisualBasic Script source file.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="warning"> + <xsd:annotation> + <xsd:documentation>Indicates warning message.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="winres"> + <xsd:annotation> + <xsd:documentation>Indicates Windows (Win32) resources (i.e. resources extracted from an RC script, a message file, or a compiled file).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="xhtml"> + <xsd:annotation> + <xsd:documentation>Indicates Extensible HyperText Markup Language (XHTML) data - document instance.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="xml"> + <xsd:annotation> + <xsd:documentation>Indicates Extensible Markup Language (XML) data - document instance.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="xmldtd"> + <xsd:annotation> + <xsd:documentation>Indicates Extensible Markup Language (XML) data - Document Type Definition (DTD).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="xsl"> + <xsd:annotation> + <xsd:documentation>Indicates Extensible Stylesheet Language (XSL) data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="xul"> + <xsd:annotation> + <xsd:documentation>Indicates XUL elements.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="mtypeValueList"> + <xsd:annotation> + <xsd:documentation>Values for the attribute 'mtype'.</xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:NMTOKEN"> + <xsd:enumeration value="abbrev"> + <xsd:annotation> + <xsd:documentation>Indicates the marked text is an abbreviation.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="abbreviated-form"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.8: A term resulting from the omission of any part of the full term while designating the same concept.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="abbreviation"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.8.1: An abbreviated form of a simple term resulting from the omission of some of its letters (e.g. 'adj.' for 'adjective').</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="acronym"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.8.4: An abbreviated form of a term made up of letters from the full form of a multiword term strung together into a sequence pronounced only syllabically (e.g. 'radar' for 'radio detecting and ranging').</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="appellation"> + <xsd:annotation> + <xsd:documentation>ISO-12620: A proper-name term, such as the name of an agency or other proper entity.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="collocation"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.18.1: A recurrent word combination characterized by cohesion in that the components of the collocation must co-occur within an utterance or series of utterances, even though they do not necessarily have to maintain immediate proximity to one another.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="common-name"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.5: A synonym for an international scientific term that is used in general discourse in a given language.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="datetime"> + <xsd:annotation> + <xsd:documentation>Indicates the marked text is a date and/or time.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="equation"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.15: An expression used to represent a concept based on a statement that two mathematical expressions are, for instance, equal as identified by the equal sign (=), or assigned to one another by a similar sign.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="expanded-form"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.7: The complete representation of a term for which there is an abbreviated form.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="formula"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.14: Figures, symbols or the like used to express a concept briefly, such as a mathematical or chemical formula.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="head-term"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.1: The concept designation that has been chosen to head a terminological record.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="initialism"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.8.3: An abbreviated form of a term consisting of some of the initial letters of the words making up a multiword term or the term elements making up a compound term when these letters are pronounced individually (e.g. 'BSE' for 'bovine spongiform encephalopathy').</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="international-scientific-term"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.4: A term that is part of an international scientific nomenclature as adopted by an appropriate scientific body.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="internationalism"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.6: A term that has the same or nearly identical orthographic or phonemic form in many languages.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="logical-expression"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.16: An expression used to represent a concept based on mathematical or logical relations, such as statements of inequality, set relationships, Boolean operations, and the like.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="materials-management-unit"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.17: A unit to track object.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="name"> + <xsd:annotation> + <xsd:documentation>Indicates the marked text is a name.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="near-synonym"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.3: A term that represents the same or a very similar concept as another term in the same language, but for which interchangeability is limited to some contexts and inapplicable in others.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="part-number"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.17.2: A unique alphanumeric designation assigned to an object in a manufacturing system.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="phrase"> + <xsd:annotation> + <xsd:documentation>Indicates the marked text is a phrase.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="phraseological-unit"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.18: Any group of two or more words that form a unit, the meaning of which frequently cannot be deduced based on the combined sense of the words making up the phrase.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="protected"> + <xsd:annotation> + <xsd:documentation>Indicates the marked text should not be translated.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="romanized-form"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.12: A form of a term resulting from an operation whereby non-Latin writing systems are converted to the Latin alphabet.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="seg"> + <xsd:annotation> + <xsd:documentation>Indicates that the marked text represents a segment.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="set-phrase"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.18.2: A fixed, lexicalized phrase.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="short-form"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.8.2: A variant of a multiword term that includes fewer words than the full form of the term (e.g. 'Group of Twenty-four' for 'Intergovernmental Group of Twenty-four on International Monetary Affairs').</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="sku"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.17.1: Stock keeping unit, an inventory item identified by a unique alphanumeric designation assigned to an object in an inventory control system.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="standard-text"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.19: A fixed chunk of recurring text.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="symbol"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.13: A designation of a concept by letters, numerals, pictograms or any combination thereof.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="synonym"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.2: Any term that represents the same or a very similar concept as the main entry term in a term entry.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="synonymous-phrase"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.18.3: Phraseological unit in a language that expresses the same semantic content as another phrase in that same language.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="term"> + <xsd:annotation> + <xsd:documentation>Indicates the marked text is a term.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="transcribed-form"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.11: A form of a term resulting from an operation whereby the characters of one writing system are represented by characters from another writing system, taking into account the pronunciation of the characters converted.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="transliterated-form"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.10: A form of a term resulting from an operation whereby the characters of an alphabetic writing system are represented by characters from another alphabetic writing system.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="truncated-term"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.8.5: An abbreviated form of a term resulting from the omission of one or more term elements or syllables (e.g. 'flu' for 'influenza').</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="variant"> + <xsd:annotation> + <xsd:documentation>ISO-12620 2.1.9: One of the alternate forms of a term.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="restypeValueList"> + <xsd:annotation> + <xsd:documentation>Values for the attribute 'restype'.</xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:NMTOKEN"> + <xsd:enumeration value="auto3state"> + <xsd:annotation> + <xsd:documentation>Indicates a Windows RC AUTO3STATE control.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="autocheckbox"> + <xsd:annotation> + <xsd:documentation>Indicates a Windows RC AUTOCHECKBOX control.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="autoradiobutton"> + <xsd:annotation> + <xsd:documentation>Indicates a Windows RC AUTORADIOBUTTON control.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="bedit"> + <xsd:annotation> + <xsd:documentation>Indicates a Windows RC BEDIT control.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="bitmap"> + <xsd:annotation> + <xsd:documentation>Indicates a bitmap, for example a BITMAP resource in Windows.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="button"> + <xsd:annotation> + <xsd:documentation>Indicates a button object, for example a BUTTON control Windows.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="caption"> + <xsd:annotation> + <xsd:documentation>Indicates a caption, such as the caption of a dialog box.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="cell"> + <xsd:annotation> + <xsd:documentation>Indicates the cell in a table, for example the content of the <td> element in HTML.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="checkbox"> + <xsd:annotation> + <xsd:documentation>Indicates check box object, for example a CHECKBOX control in Windows.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="checkboxmenuitem"> + <xsd:annotation> + <xsd:documentation>Indicates a menu item with an associated checkbox.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="checkedlistbox"> + <xsd:annotation> + <xsd:documentation>Indicates a list box, but with a check-box for each item.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="colorchooser"> + <xsd:annotation> + <xsd:documentation>Indicates a color selection dialog.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="combobox"> + <xsd:annotation> + <xsd:documentation>Indicates a combination of edit box and listbox object, for example a COMBOBOX control in Windows.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="comboboxexitem"> + <xsd:annotation> + <xsd:documentation>Indicates an initialization entry of an extended combobox DLGINIT resource block. (code 0x1234).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="comboboxitem"> + <xsd:annotation> + <xsd:documentation>Indicates an initialization entry of a combobox DLGINIT resource block (code 0x0403).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="component"> + <xsd:annotation> + <xsd:documentation>Indicates a UI base class element that cannot be represented by any other element.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="contextmenu"> + <xsd:annotation> + <xsd:documentation>Indicates a context menu.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="ctext"> + <xsd:annotation> + <xsd:documentation>Indicates a Windows RC CTEXT control.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="cursor"> + <xsd:annotation> + <xsd:documentation>Indicates a cursor, for example a CURSOR resource in Windows.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="datetimepicker"> + <xsd:annotation> + <xsd:documentation>Indicates a date/time picker.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="defpushbutton"> + <xsd:annotation> + <xsd:documentation>Indicates a Windows RC DEFPUSHBUTTON control.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="dialog"> + <xsd:annotation> + <xsd:documentation>Indicates a dialog box.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="dlginit"> + <xsd:annotation> + <xsd:documentation>Indicates a Windows RC DLGINIT resource block.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="edit"> + <xsd:annotation> + <xsd:documentation>Indicates an edit box object, for example an EDIT control in Windows.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="file"> + <xsd:annotation> + <xsd:documentation>Indicates a filename.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="filechooser"> + <xsd:annotation> + <xsd:documentation>Indicates a file dialog.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="fn"> + <xsd:annotation> + <xsd:documentation>Indicates a footnote.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="font"> + <xsd:annotation> + <xsd:documentation>Indicates a font name.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="footer"> + <xsd:annotation> + <xsd:documentation>Indicates a footer.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="frame"> + <xsd:annotation> + <xsd:documentation>Indicates a frame object.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="grid"> + <xsd:annotation> + <xsd:documentation>Indicates a XUL grid element.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="groupbox"> + <xsd:annotation> + <xsd:documentation>Indicates a groupbox object, for example a GROUPBOX control in Windows.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="header"> + <xsd:annotation> + <xsd:documentation>Indicates a header item.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="heading"> + <xsd:annotation> + <xsd:documentation>Indicates a heading, such has the content of <h1>, <h2>, etc. in HTML.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="hedit"> + <xsd:annotation> + <xsd:documentation>Indicates a Windows RC HEDIT control.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="hscrollbar"> + <xsd:annotation> + <xsd:documentation>Indicates a horizontal scrollbar.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="icon"> + <xsd:annotation> + <xsd:documentation>Indicates an icon, for example an ICON resource in Windows.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="iedit"> + <xsd:annotation> + <xsd:documentation>Indicates a Windows RC IEDIT control.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="keywords"> + <xsd:annotation> + <xsd:documentation>Indicates keyword list, such as the content of the Keywords meta-data in HTML, or a K footnote in WinHelp RTF.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="label"> + <xsd:annotation> + <xsd:documentation>Indicates a label object.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="linklabel"> + <xsd:annotation> + <xsd:documentation>Indicates a label that is also a HTML link (not necessarily a URL).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="list"> + <xsd:annotation> + <xsd:documentation>Indicates a list (a group of list-items, for example an <ol> or <ul> element in HTML).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="listbox"> + <xsd:annotation> + <xsd:documentation>Indicates a listbox object, for example an LISTBOX control in Windows.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="listitem"> + <xsd:annotation> + <xsd:documentation>Indicates an list item (an entry in a list).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="ltext"> + <xsd:annotation> + <xsd:documentation>Indicates a Windows RC LTEXT control.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="menu"> + <xsd:annotation> + <xsd:documentation>Indicates a menu (a group of menu-items).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="menubar"> + <xsd:annotation> + <xsd:documentation>Indicates a toolbar containing one or more tope level menus.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="menuitem"> + <xsd:annotation> + <xsd:documentation>Indicates a menu item (an entry in a menu).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="menuseparator"> + <xsd:annotation> + <xsd:documentation>Indicates a XUL menuseparator element.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="message"> + <xsd:annotation> + <xsd:documentation>Indicates a message, for example an entry in a MESSAGETABLE resource in Windows.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="monthcalendar"> + <xsd:annotation> + <xsd:documentation>Indicates a calendar control.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="numericupdown"> + <xsd:annotation> + <xsd:documentation>Indicates an edit box beside a spin control.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="panel"> + <xsd:annotation> + <xsd:documentation>Indicates a catch all for rectangular areas.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="popupmenu"> + <xsd:annotation> + <xsd:documentation>Indicates a standalone menu not necessarily associated with a menubar.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="pushbox"> + <xsd:annotation> + <xsd:documentation>Indicates a pushbox object, for example a PUSHBOX control in Windows.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="pushbutton"> + <xsd:annotation> + <xsd:documentation>Indicates a Windows RC PUSHBUTTON control.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="radio"> + <xsd:annotation> + <xsd:documentation>Indicates a radio button object.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="radiobuttonmenuitem"> + <xsd:annotation> + <xsd:documentation>Indicates a menuitem with associated radio button.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="rcdata"> + <xsd:annotation> + <xsd:documentation>Indicates raw data resources for an application.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="row"> + <xsd:annotation> + <xsd:documentation>Indicates a row in a table.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="rtext"> + <xsd:annotation> + <xsd:documentation>Indicates a Windows RC RTEXT control.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="scrollpane"> + <xsd:annotation> + <xsd:documentation>Indicates a user navigable container used to show a portion of a document.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="separator"> + <xsd:annotation> + <xsd:documentation>Indicates a generic divider object (e.g. menu group separator).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="shortcut"> + <xsd:annotation> + <xsd:documentation>Windows accelerators, shortcuts in resource or property files.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="spinner"> + <xsd:annotation> + <xsd:documentation>Indicates a UI control to indicate process activity but not progress.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="splitter"> + <xsd:annotation> + <xsd:documentation>Indicates a splitter bar.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="state3"> + <xsd:annotation> + <xsd:documentation>Indicates a Windows RC STATE3 control.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="statusbar"> + <xsd:annotation> + <xsd:documentation>Indicates a window for providing feedback to the users, like 'read-only', etc.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="string"> + <xsd:annotation> + <xsd:documentation>Indicates a string, for example an entry in a STRINGTABLE resource in Windows.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="tabcontrol"> + <xsd:annotation> + <xsd:documentation>Indicates a layers of controls with a tab to select layers.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="table"> + <xsd:annotation> + <xsd:documentation>Indicates a display and edits regular two-dimensional tables of cells.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="textbox"> + <xsd:annotation> + <xsd:documentation>Indicates a XUL textbox element.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="togglebutton"> + <xsd:annotation> + <xsd:documentation>Indicates a UI button that can be toggled to on or off state.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="toolbar"> + <xsd:annotation> + <xsd:documentation>Indicates an array of controls, usually buttons.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="tooltip"> + <xsd:annotation> + <xsd:documentation>Indicates a pop up tool tip text.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="trackbar"> + <xsd:annotation> + <xsd:documentation>Indicates a bar with a pointer indicating a position within a certain range.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="tree"> + <xsd:annotation> + <xsd:documentation>Indicates a control that displays a set of hierarchical data.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="uri"> + <xsd:annotation> + <xsd:documentation>Indicates a URI (URN or URL).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="userbutton"> + <xsd:annotation> + <xsd:documentation>Indicates a Windows RC USERBUTTON control.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="usercontrol"> + <xsd:annotation> + <xsd:documentation>Indicates a user-defined control like CONTROL control in Windows.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="var"> + <xsd:annotation> + <xsd:documentation>Indicates the text of a variable.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="versioninfo"> + <xsd:annotation> + <xsd:documentation>Indicates version information about a resource like VERSIONINFO in Windows.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="vscrollbar"> + <xsd:annotation> + <xsd:documentation>Indicates a vertical scrollbar.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="window"> + <xsd:annotation> + <xsd:documentation>Indicates a graphical window.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="size-unitValueList"> + <xsd:annotation> + <xsd:documentation>Values for the attribute 'size-unit'.</xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:NMTOKEN"> + <xsd:enumeration value="byte"> + <xsd:annotation> + <xsd:documentation>Indicates a size in 8-bit bytes.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="char"> + <xsd:annotation> + <xsd:documentation>Indicates a size in Unicode characters.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="col"> + <xsd:annotation> + <xsd:documentation>Indicates a size in columns. Used for HTML text area.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="cm"> + <xsd:annotation> + <xsd:documentation>Indicates a size in centimeters.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="dlgunit"> + <xsd:annotation> + <xsd:documentation>Indicates a size in dialog units, as defined in Windows resources.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="em"> + <xsd:annotation> + <xsd:documentation>Indicates a size in 'font-size' units (as defined in CSS).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="ex"> + <xsd:annotation> + <xsd:documentation>Indicates a size in 'x-height' units (as defined in CSS).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="glyph"> + <xsd:annotation> + <xsd:documentation>Indicates a size in glyphs. A glyph is considered to be one or more combined Unicode characters that represent a single displayable text character. Sometimes referred to as a 'grapheme cluster'</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="in"> + <xsd:annotation> + <xsd:documentation>Indicates a size in inches.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="mm"> + <xsd:annotation> + <xsd:documentation>Indicates a size in millimeters.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="percent"> + <xsd:annotation> + <xsd:documentation>Indicates a size in percentage.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="pixel"> + <xsd:annotation> + <xsd:documentation>Indicates a size in pixels.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="point"> + <xsd:annotation> + <xsd:documentation>Indicates a size in point.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="row"> + <xsd:annotation> + <xsd:documentation>Indicates a size in rows. Used for HTML text area.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="stateValueList"> + <xsd:annotation> + <xsd:documentation>Values for the attribute 'state'.</xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:NMTOKEN"> + <xsd:enumeration value="final"> + <xsd:annotation> + <xsd:documentation>Indicates the terminating state.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="needs-adaptation"> + <xsd:annotation> + <xsd:documentation>Indicates only non-textual information needs adaptation.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="needs-l10n"> + <xsd:annotation> + <xsd:documentation>Indicates both text and non-textual information needs adaptation.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="needs-review-adaptation"> + <xsd:annotation> + <xsd:documentation>Indicates only non-textual information needs review.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="needs-review-l10n"> + <xsd:annotation> + <xsd:documentation>Indicates both text and non-textual information needs review.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="needs-review-translation"> + <xsd:annotation> + <xsd:documentation>Indicates that only the text of the item needs to be reviewed.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="needs-translation"> + <xsd:annotation> + <xsd:documentation>Indicates that the item needs to be translated.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="new"> + <xsd:annotation> + <xsd:documentation>Indicates that the item is new. For example, translation units that were not in a previous version of the document.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="signed-off"> + <xsd:annotation> + <xsd:documentation>Indicates that changes are reviewed and approved.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="translated"> + <xsd:annotation> + <xsd:documentation>Indicates that the item has been translated.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="state-qualifierValueList"> + <xsd:annotation> + <xsd:documentation>Values for the attribute 'state-qualifier'.</xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:NMTOKEN"> + <xsd:enumeration value="exact-match"> + <xsd:annotation> + <xsd:documentation>Indicates an exact match. An exact match occurs when a source text of a segment is exactly the same as the source text of a segment that was translated previously.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="fuzzy-match"> + <xsd:annotation> + <xsd:documentation>Indicates a fuzzy match. A fuzzy match occurs when a source text of a segment is very similar to the source text of a segment that was translated previously (e.g. when the difference is casing, a few changed words, white-space discripancy, etc.).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="id-match"> + <xsd:annotation> + <xsd:documentation>Indicates a match based on matching IDs (in addition to matching text).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="leveraged-glossary"> + <xsd:annotation> + <xsd:documentation>Indicates a translation derived from a glossary.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="leveraged-inherited"> + <xsd:annotation> + <xsd:documentation>Indicates a translation derived from existing translation.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="leveraged-mt"> + <xsd:annotation> + <xsd:documentation>Indicates a translation derived from machine translation.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="leveraged-repository"> + <xsd:annotation> + <xsd:documentation>Indicates a translation derived from a translation repository.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="leveraged-tm"> + <xsd:annotation> + <xsd:documentation>Indicates a translation derived from a translation memory.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="mt-suggestion"> + <xsd:annotation> + <xsd:documentation>Indicates the translation is suggested by machine translation.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="rejected-grammar"> + <xsd:annotation> + <xsd:documentation>Indicates that the item has been rejected because of incorrect grammar.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="rejected-inaccurate"> + <xsd:annotation> + <xsd:documentation>Indicates that the item has been rejected because it is incorrect.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="rejected-length"> + <xsd:annotation> + <xsd:documentation>Indicates that the item has been rejected because it is too long or too short.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="rejected-spelling"> + <xsd:annotation> + <xsd:documentation>Indicates that the item has been rejected because of incorrect spelling.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="tm-suggestion"> + <xsd:annotation> + <xsd:documentation>Indicates the translation is suggested by translation memory.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="unitValueList"> + <xsd:annotation> + <xsd:documentation>Values for the attribute 'unit'.</xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:NMTOKEN"> + <xsd:enumeration value="word"> + <xsd:annotation> + <xsd:documentation>Refers to words.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="page"> + <xsd:annotation> + <xsd:documentation>Refers to pages.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="trans-unit"> + <xsd:annotation> + <xsd:documentation>Refers to <trans-unit> elements.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="bin-unit"> + <xsd:annotation> + <xsd:documentation>Refers to <bin-unit> elements.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="glyph"> + <xsd:annotation> + <xsd:documentation>Refers to glyphs.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="item"> + <xsd:annotation> + <xsd:documentation>Refers to <trans-unit> and/or <bin-unit> elements.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="instance"> + <xsd:annotation> + <xsd:documentation>Refers to the occurrences of instances defined by the count-type value.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="character"> + <xsd:annotation> + <xsd:documentation>Refers to characters.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="line"> + <xsd:annotation> + <xsd:documentation>Refers to lines.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="sentence"> + <xsd:annotation> + <xsd:documentation>Refers to sentences.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="paragraph"> + <xsd:annotation> + <xsd:documentation>Refers to paragraphs.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="segment"> + <xsd:annotation> + <xsd:documentation>Refers to segments.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="placeable"> + <xsd:annotation> + <xsd:documentation>Refers to placeables (inline elements).</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="priorityValueList"> + <xsd:annotation> + <xsd:documentation>Values for the attribute 'priority'.</xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:positiveInteger"> + <xsd:enumeration value="1"> + <xsd:annotation> + <xsd:documentation>Highest priority.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="2"> + <xsd:annotation> + <xsd:documentation>High priority.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="3"> + <xsd:annotation> + <xsd:documentation>High priority, but not as important as 2.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="4"> + <xsd:annotation> + <xsd:documentation>High priority, but not as important as 3.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="5"> + <xsd:annotation> + <xsd:documentation>Medium priority, but more important than 6.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="6"> + <xsd:annotation> + <xsd:documentation>Medium priority, but less important than 5.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="7"> + <xsd:annotation> + <xsd:documentation>Low priority, but more important than 8.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="8"> + <xsd:annotation> + <xsd:documentation>Low priority, but more important than 9.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="9"> + <xsd:annotation> + <xsd:documentation>Low priority.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="10"> + <xsd:annotation> + <xsd:documentation>Lowest priority.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="reformatValueYesNo"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="yes"> + <xsd:annotation> + <xsd:documentation>This value indicates that all properties can be reformatted. This value must be used alone.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="no"> + <xsd:annotation> + <xsd:documentation>This value indicates that no properties should be reformatted. This value must be used alone.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="reformatValueList"> + <xsd:list> + <xsd:simpleType> + <xsd:union memberTypes="xlf:XTend"> + <xsd:simpleType> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="coord"> + <xsd:annotation> + <xsd:documentation>This value indicates that all information in the coord attribute can be modified.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="coord-x"> + <xsd:annotation> + <xsd:documentation>This value indicates that the x information in the coord attribute can be modified.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="coord-y"> + <xsd:annotation> + <xsd:documentation>This value indicates that the y information in the coord attribute can be modified.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="coord-cx"> + <xsd:annotation> + <xsd:documentation>This value indicates that the cx information in the coord attribute can be modified.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="coord-cy"> + <xsd:annotation> + <xsd:documentation>This value indicates that the cy information in the coord attribute can be modified.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="font"> + <xsd:annotation> + <xsd:documentation>This value indicates that all the information in the font attribute can be modified.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="font-name"> + <xsd:annotation> + <xsd:documentation>This value indicates that the name information in the font attribute can be modified.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="font-size"> + <xsd:annotation> + <xsd:documentation>This value indicates that the size information in the font attribute can be modified.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="font-weight"> + <xsd:annotation> + <xsd:documentation>This value indicates that the weight information in the font attribute can be modified.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="css-style"> + <xsd:annotation> + <xsd:documentation>This value indicates that the information in the css-style attribute can be modified.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="style"> + <xsd:annotation> + <xsd:documentation>This value indicates that the information in the style attribute can be modified.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="ex-style"> + <xsd:annotation> + <xsd:documentation>This value indicates that the information in the exstyle attribute can be modified.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + </xsd:restriction> + </xsd:simpleType> + </xsd:union> + </xsd:simpleType> + </xsd:list> + </xsd:simpleType> + <xsd:simpleType name="purposeValueList"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="information"> + <xsd:annotation> + <xsd:documentation>Indicates that the context is informational in nature, specifying for example, how a term should be translated. Thus, should be displayed to anyone editing the XLIFF document.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="location"> + <xsd:annotation> + <xsd:documentation>Indicates that the context-group is used to specify where the term was found in the translatable source. Thus, it is not displayed.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="match"> + <xsd:annotation> + <xsd:documentation>Indicates that the context information should be used during translation memory lookups. Thus, it is not displayed.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="alttranstypeValueList"> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="proposal"> + <xsd:annotation> + <xsd:documentation>Represents a translation proposal from a translation memory or other resource.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="previous-version"> + <xsd:annotation> + <xsd:documentation>Represents a previous version of the target element.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="rejected"> + <xsd:annotation> + <xsd:documentation>Represents a rejected version of the target element.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="reference"> + <xsd:annotation> + <xsd:documentation>Represents a translation to be used for reference purposes only, for example from a related product or a different language.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + <xsd:enumeration value="accepted"> + <xsd:annotation> + <xsd:documentation>Represents a proposed translation that was used for the translation of the trans-unit, possibly modified.</xsd:documentation> + </xsd:annotation> + </xsd:enumeration> + </xsd:restriction> + </xsd:simpleType> + <!-- Other Types --> + <xsd:complexType name="ElemType_ExternalReference"> + <xsd:choice> + <xsd:element ref="xlf:internal-file"/> + <xsd:element ref="xlf:external-file"/> + </xsd:choice> + </xsd:complexType> + <xsd:simpleType name="AttrType_purpose"> + <xsd:list> + <xsd:simpleType> + <xsd:union memberTypes="xlf:purposeValueList xlf:XTend"/> + </xsd:simpleType> + </xsd:list> + </xsd:simpleType> + <xsd:simpleType name="AttrType_datatype"> + <xsd:union memberTypes="xlf:datatypeValueList xlf:XTend"/> + </xsd:simpleType> + <xsd:simpleType name="AttrType_restype"> + <xsd:union memberTypes="xlf:restypeValueList xlf:XTend"/> + </xsd:simpleType> + <xsd:simpleType name="AttrType_alttranstype"> + <xsd:union memberTypes="xlf:alttranstypeValueList xlf:XTend"/> + </xsd:simpleType> + <xsd:simpleType name="AttrType_context-type"> + <xsd:union memberTypes="xlf:context-typeValueList xlf:XTend"/> + </xsd:simpleType> + <xsd:simpleType name="AttrType_state"> + <xsd:union memberTypes="xlf:stateValueList xlf:XTend"/> + </xsd:simpleType> + <xsd:simpleType name="AttrType_state-qualifier"> + <xsd:union memberTypes="xlf:state-qualifierValueList xlf:XTend"/> + </xsd:simpleType> + <xsd:simpleType name="AttrType_count-type"> + <xsd:union memberTypes="xlf:restypeValueList xlf:count-typeValueList xlf:datatypeValueList xlf:stateValueList xlf:state-qualifierValueList xlf:XTend"/> + </xsd:simpleType> + <xsd:simpleType name="AttrType_InlineDelimiters"> + <xsd:union memberTypes="xlf:InlineDelimitersValueList xlf:XTend"/> + </xsd:simpleType> + <xsd:simpleType name="AttrType_InlinePlaceholders"> + <xsd:union memberTypes="xlf:InlinePlaceholdersValueList xlf:XTend"/> + </xsd:simpleType> + <xsd:simpleType name="AttrType_size-unit"> + <xsd:union memberTypes="xlf:size-unitValueList xlf:XTend"/> + </xsd:simpleType> + <xsd:simpleType name="AttrType_mtype"> + <xsd:union memberTypes="xlf:mtypeValueList xlf:XTend"/> + </xsd:simpleType> + <xsd:simpleType name="AttrType_unit"> + <xsd:union memberTypes="xlf:unitValueList xlf:XTend"/> + </xsd:simpleType> + <xsd:simpleType name="AttrType_priority"> + <xsd:union memberTypes="xlf:priorityValueList"/> + </xsd:simpleType> + <xsd:simpleType name="AttrType_reformat"> + <xsd:union memberTypes="xlf:reformatValueYesNo xlf:reformatValueList"/> + </xsd:simpleType> + <xsd:simpleType name="AttrType_YesNo"> + <xsd:restriction base="xsd:NMTOKEN"> + <xsd:enumeration value="yes"/> + <xsd:enumeration value="no"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="AttrType_Position"> + <xsd:restriction base="xsd:NMTOKEN"> + <xsd:enumeration value="open"/> + <xsd:enumeration value="close"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="AttrType_assoc"> + <xsd:restriction base="xsd:NMTOKEN"> + <xsd:enumeration value="preceding"/> + <xsd:enumeration value="following"/> + <xsd:enumeration value="both"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="AttrType_annotates"> + <xsd:restriction base="xsd:NMTOKEN"> + <xsd:enumeration value="source"/> + <xsd:enumeration value="target"/> + <xsd:enumeration value="general"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="AttrType_Coordinates"> + <xsd:annotation> + <xsd:documentation>Values for the attribute 'coord'.</xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="(-?\d+|#);(-?\d+|#);(-?\d+|#);(-?\d+|#)"/> + </xsd:restriction> + </xsd:simpleType> + <xsd:simpleType name="AttrType_Version"> + <xsd:annotation> + <xsd:documentation>Version values: 1.0 and 1.1 are allowed for backward compatibility.</xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="1.2"/> + <xsd:enumeration value="1.1"/> + <xsd:enumeration value="1.0"/> + </xsd:restriction> + </xsd:simpleType> + <!-- Groups --> + <xsd:group name="ElemGroup_TextContent"> + <xsd:choice> + <xsd:element ref="xlf:g"/> + <xsd:element ref="xlf:bpt"/> + <xsd:element ref="xlf:ept"/> + <xsd:element ref="xlf:ph"/> + <xsd:element ref="xlf:it"/> + <xsd:element ref="xlf:mrk"/> + <xsd:element ref="xlf:x"/> + <xsd:element ref="xlf:bx"/> + <xsd:element ref="xlf:ex"/> + </xsd:choice> + </xsd:group> + <xsd:attributeGroup name="AttrGroup_TextContent"> + <xsd:attribute name="id" type="xsd:string" use="required"/> + <xsd:attribute name="xid" type="xsd:string" use="optional"/> + <xsd:attribute name="equiv-text" type="xsd:string" use="optional"/> + <xsd:anyAttribute namespace="##other" processContents="strict"/> + </xsd:attributeGroup> + <!-- XLIFF Structure --> + <xsd:element name="xliff"> + <xsd:complexType> + <xsd:sequence maxOccurs="unbounded"> + <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/> + <xsd:element ref="xlf:file"/> + </xsd:sequence> + <xsd:attribute name="version" type="xlf:AttrType_Version" use="required"/> + <xsd:attribute ref="xml:lang" use="optional"/> + <xsd:anyAttribute namespace="##other" processContents="strict"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="file"> + <xsd:complexType> + <xsd:sequence> + <xsd:element minOccurs="0" ref="xlf:header"/> + <xsd:element ref="xlf:body"/> + </xsd:sequence> + <xsd:attribute name="original" type="xsd:string" use="required"/> + <xsd:attribute name="source-language" type="xsd:language" use="required"/> + <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="required"/> + <xsd:attribute name="tool-id" type="xsd:string" use="optional"/> + <xsd:attribute name="date" type="xsd:dateTime" use="optional"/> + <xsd:attribute ref="xml:space" use="optional"/> + <xsd:attribute name="category" type="xsd:string" use="optional"/> + <xsd:attribute name="target-language" type="xsd:language" use="optional"/> + <xsd:attribute name="product-name" type="xsd:string" use="optional"/> + <xsd:attribute name="product-version" type="xsd:string" use="optional"/> + <xsd:attribute name="build-num" type="xsd:string" use="optional"/> + <xsd:anyAttribute namespace="##other" processContents="strict"/> + </xsd:complexType> + <xsd:unique name="U_group_id"> + <xsd:selector xpath=".//xlf:group"/> + <xsd:field xpath="@id"/> + </xsd:unique> + <xsd:key name="K_unit_id"> + <xsd:selector xpath=".//xlf:trans-unit|.//xlf:bin-unit"/> + <xsd:field xpath="@id"/> + </xsd:key> + <xsd:keyref name="KR_unit_id" refer="xlf:K_unit_id"> + <xsd:selector xpath=".//bpt|.//ept|.//it|.//ph|.//g|.//x|.//bx|.//ex|.//sub"/> + <xsd:field xpath="@xid"/> + </xsd:keyref> + <xsd:key name="K_tool-id"> + <xsd:selector xpath="xlf:header/xlf:tool"/> + <xsd:field xpath="@tool-id"/> + </xsd:key> + <xsd:keyref name="KR_file_tool-id" refer="xlf:K_tool-id"> + <xsd:selector xpath="."/> + <xsd:field xpath="@tool-id"/> + </xsd:keyref> + <xsd:keyref name="KR_phase_tool-id" refer="xlf:K_tool-id"> + <xsd:selector xpath="xlf:header/xlf:phase-group/xlf:phase"/> + <xsd:field xpath="@tool-id"/> + </xsd:keyref> + <xsd:keyref name="KR_alt-trans_tool-id" refer="xlf:K_tool-id"> + <xsd:selector xpath=".//xlf:trans-unit/xlf:alt-trans"/> + <xsd:field xpath="@tool-id"/> + </xsd:keyref> + <xsd:key name="K_count-group_name"> + <xsd:selector xpath=".//xlf:count-group"/> + <xsd:field xpath="@name"/> + </xsd:key> + <xsd:unique name="U_context-group_name"> + <xsd:selector xpath=".//xlf:context-group"/> + <xsd:field xpath="@name"/> + </xsd:unique> + <xsd:key name="K_phase-name"> + <xsd:selector xpath="xlf:header/xlf:phase-group/xlf:phase"/> + <xsd:field xpath="@phase-name"/> + </xsd:key> + <xsd:keyref name="KR_phase-name" refer="xlf:K_phase-name"> + <xsd:selector xpath=".//xlf:count|.//xlf:trans-unit|.//xlf:target|.//bin-unit|.//bin-target"/> + <xsd:field xpath="@phase-name"/> + </xsd:keyref> + <xsd:unique name="U_uid"> + <xsd:selector xpath=".//xlf:external-file"/> + <xsd:field xpath="@uid"/> + </xsd:unique> + </xsd:element> + <xsd:element name="header"> + <xsd:complexType> + <xsd:sequence> + <xsd:element minOccurs="0" name="skl" type="xlf:ElemType_ExternalReference"/> + <xsd:element minOccurs="0" ref="xlf:phase-group"/> + <xsd:choice maxOccurs="unbounded" minOccurs="0"> + <xsd:element name="glossary" type="xlf:ElemType_ExternalReference"/> + <xsd:element name="reference" type="xlf:ElemType_ExternalReference"/> + <xsd:element ref="xlf:count-group"/> + <xsd:element ref="xlf:note"/> + <xsd:element ref="xlf:tool"/> + </xsd:choice> + <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + <xsd:element name="internal-file"> + <xsd:complexType> + <xsd:simpleContent> + <xsd:extension base="xsd:string"> + <xsd:attribute name="form" type="xsd:string"/> + <xsd:attribute name="crc" type="xsd:NMTOKEN"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="external-file"> + <xsd:complexType> + <xsd:attribute name="href" type="xsd:string" use="required"/> + <xsd:attribute name="crc" type="xsd:NMTOKEN"/> + <xsd:attribute name="uid" type="xsd:NMTOKEN"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="note"> + <xsd:complexType> + <xsd:simpleContent> + <xsd:extension base="xsd:string"> + <xsd:attribute ref="xml:lang" use="optional"/> + <xsd:attribute default="1" name="priority" type="xlf:AttrType_priority" use="optional"/> + <xsd:attribute name="from" type="xsd:string" use="optional"/> + <xsd:attribute default="general" name="annotates" type="xlf:AttrType_annotates" use="optional"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="phase-group"> + <xsd:complexType> + <xsd:sequence maxOccurs="unbounded"> + <xsd:element ref="xlf:phase"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + <xsd:element name="phase"> + <xsd:complexType> + <xsd:sequence maxOccurs="unbounded" minOccurs="0"> + <xsd:element ref="xlf:note"/> + </xsd:sequence> + <xsd:attribute name="phase-name" type="xsd:string" use="required"/> + <xsd:attribute name="process-name" type="xsd:string" use="required"/> + <xsd:attribute name="company-name" type="xsd:string" use="optional"/> + <xsd:attribute name="tool-id" type="xsd:string" use="optional"/> + <xsd:attribute name="date" type="xsd:dateTime" use="optional"/> + <xsd:attribute name="job-id" type="xsd:string" use="optional"/> + <xsd:attribute name="contact-name" type="xsd:string" use="optional"/> + <xsd:attribute name="contact-email" type="xsd:string" use="optional"/> + <xsd:attribute name="contact-phone" type="xsd:string" use="optional"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="count-group"> + <xsd:complexType> + <xsd:sequence maxOccurs="unbounded" minOccurs="0"> + <xsd:element ref="xlf:count"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="count"> + <xsd:complexType> + <xsd:simpleContent> + <xsd:extension base="xsd:string"> + <xsd:attribute name="count-type" type="xlf:AttrType_count-type" use="optional"/> + <xsd:attribute name="phase-name" type="xsd:string" use="optional"/> + <xsd:attribute default="word" name="unit" type="xlf:AttrType_unit" use="optional"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="context-group"> + <xsd:complexType> + <xsd:sequence maxOccurs="unbounded"> + <xsd:element ref="xlf:context"/> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="optional"/> + <xsd:attribute name="crc" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="purpose" type="xlf:AttrType_purpose" use="optional"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="context"> + <xsd:complexType> + <xsd:simpleContent> + <xsd:extension base="xsd:string"> + <xsd:attribute name="context-type" type="xlf:AttrType_context-type" use="required"/> + <xsd:attribute default="no" name="match-mandatory" type="xlf:AttrType_YesNo" use="optional"/> + <xsd:attribute name="crc" type="xsd:NMTOKEN" use="optional"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + </xsd:element> + <xsd:element name="tool"> + <xsd:complexType mixed="true"> + <xsd:sequence> + <xsd:any namespace="##any" processContents="strict" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute name="tool-id" type="xsd:string" use="required"/> + <xsd:attribute name="tool-name" type="xsd:string" use="required"/> + <xsd:attribute name="tool-version" type="xsd:string" use="optional"/> + <xsd:attribute name="tool-company" type="xsd:string" use="optional"/> + <xsd:anyAttribute namespace="##other" processContents="strict"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="body"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded" minOccurs="0"> + <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:group"/> + <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:trans-unit"/> + <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:bin-unit"/> + </xsd:choice> + </xsd:complexType> + </xsd:element> + <xsd:element name="group"> + <xsd:complexType> + <xsd:sequence> + <xsd:sequence> + <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:context-group"/> + <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:count-group"/> + <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:note"/> + <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/> + </xsd:sequence> + <xsd:choice maxOccurs="unbounded"> + <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:group"/> + <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:trans-unit"/> + <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:bin-unit"/> + </xsd:choice> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:string" use="optional"/> + <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/> + <xsd:attribute default="default" ref="xml:space" use="optional"/> + <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/> + <xsd:attribute name="resname" type="xsd:string" use="optional"/> + <xsd:attribute name="extradata" type="xsd:string" use="optional"/> + <xsd:attribute name="extype" type="xsd:string" use="optional"/> + <xsd:attribute name="help-id" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="menu" type="xsd:string" use="optional"/> + <xsd:attribute name="menu-option" type="xsd:string" use="optional"/> + <xsd:attribute name="menu-name" type="xsd:string" use="optional"/> + <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/> + <xsd:attribute name="font" type="xsd:string" use="optional"/> + <xsd:attribute name="css-style" type="xsd:string" use="optional"/> + <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute default="yes" name="translate" type="xlf:AttrType_YesNo" use="optional"/> + <xsd:attribute default="yes" name="reformat" type="xlf:AttrType_reformat" use="optional"/> + <xsd:attribute default="pixel" name="size-unit" type="xlf:AttrType_size-unit" use="optional"/> + <xsd:attribute name="maxwidth" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="minwidth" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="maxheight" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="minheight" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="maxbytes" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="minbytes" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="charclass" type="xsd:string" use="optional"/> + <xsd:attribute default="no" name="merged-trans" type="xlf:AttrType_YesNo" use="optional"/> + <xsd:anyAttribute namespace="##other" processContents="strict"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="trans-unit"> + <xsd:complexType> + <xsd:sequence> + <xsd:element ref="xlf:source"/> + <xsd:element minOccurs="0" ref="xlf:seg-source"/> + <xsd:element minOccurs="0" ref="xlf:target"/> + <xsd:choice maxOccurs="unbounded" minOccurs="0"> + <xsd:element ref="xlf:context-group"/> + <xsd:element ref="xlf:count-group"/> + <xsd:element ref="xlf:note"/> + <xsd:element ref="xlf:alt-trans"/> + </xsd:choice> + <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:string" use="required"/> + <xsd:attribute name="approved" type="xlf:AttrType_YesNo" use="optional"/> + <xsd:attribute default="yes" name="translate" type="xlf:AttrType_YesNo" use="optional"/> + <xsd:attribute default="yes" name="reformat" type="xlf:AttrType_reformat" use="optional"/> + <xsd:attribute default="default" ref="xml:space" use="optional"/> + <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/> + <xsd:attribute name="phase-name" type="xsd:string" use="optional"/> + <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/> + <xsd:attribute name="resname" type="xsd:string" use="optional"/> + <xsd:attribute name="extradata" type="xsd:string" use="optional"/> + <xsd:attribute name="extype" type="xsd:string" use="optional"/> + <xsd:attribute name="help-id" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="menu" type="xsd:string" use="optional"/> + <xsd:attribute name="menu-option" type="xsd:string" use="optional"/> + <xsd:attribute name="menu-name" type="xsd:string" use="optional"/> + <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/> + <xsd:attribute name="font" type="xsd:string" use="optional"/> + <xsd:attribute name="css-style" type="xsd:string" use="optional"/> + <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute default="pixel" name="size-unit" type="xlf:AttrType_size-unit" use="optional"/> + <xsd:attribute name="maxwidth" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="minwidth" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="maxheight" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="minheight" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="maxbytes" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="minbytes" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="charclass" type="xsd:string" use="optional"/> + <xsd:attribute default="yes" name="merged-trans" type="xlf:AttrType_YesNo" use="optional"/> + <xsd:anyAttribute namespace="##other" processContents="strict"/> + </xsd:complexType> + <xsd:unique name="U_tu_segsrc_mid"> + <xsd:selector xpath="./xlf:seg-source/xlf:mrk"/> + <xsd:field xpath="@mid"/> + </xsd:unique> + <xsd:keyref name="KR_tu_segsrc_mid" refer="xlf:U_tu_segsrc_mid"> + <xsd:selector xpath="./xlf:target/xlf:mrk|./xlf:alt-trans"/> + <xsd:field xpath="@mid"/> + </xsd:keyref> + </xsd:element> + <xsd:element name="source"> + <xsd:complexType mixed="true"> + <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/> + <xsd:attribute ref="xml:lang" use="optional"/> + <xsd:anyAttribute namespace="##other" processContents="strict"/> + </xsd:complexType> + <xsd:unique name="U_source_bpt_rid"> + <xsd:selector xpath=".//xlf:bpt"/> + <xsd:field xpath="@rid"/> + </xsd:unique> + <xsd:keyref name="KR_source_ept_rid" refer="xlf:U_source_bpt_rid"> + <xsd:selector xpath=".//xlf:ept"/> + <xsd:field xpath="@rid"/> + </xsd:keyref> + <xsd:unique name="U_source_bx_rid"> + <xsd:selector xpath=".//xlf:bx"/> + <xsd:field xpath="@rid"/> + </xsd:unique> + <xsd:keyref name="KR_source_ex_rid" refer="xlf:U_source_bx_rid"> + <xsd:selector xpath=".//xlf:ex"/> + <xsd:field xpath="@rid"/> + </xsd:keyref> + </xsd:element> + <xsd:element name="seg-source"> + <xsd:complexType mixed="true"> + <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/> + <xsd:attribute ref="xml:lang" use="optional"/> + <xsd:anyAttribute namespace="##other" processContents="strict"/> + </xsd:complexType> + <xsd:unique name="U_segsrc_bpt_rid"> + <xsd:selector xpath=".//xlf:bpt"/> + <xsd:field xpath="@rid"/> + </xsd:unique> + <xsd:keyref name="KR_segsrc_ept_rid" refer="xlf:U_segsrc_bpt_rid"> + <xsd:selector xpath=".//xlf:ept"/> + <xsd:field xpath="@rid"/> + </xsd:keyref> + <xsd:unique name="U_segsrc_bx_rid"> + <xsd:selector xpath=".//xlf:bx"/> + <xsd:field xpath="@rid"/> + </xsd:unique> + <xsd:keyref name="KR_segsrc_ex_rid" refer="xlf:U_segsrc_bx_rid"> + <xsd:selector xpath=".//xlf:ex"/> + <xsd:field xpath="@rid"/> + </xsd:keyref> + </xsd:element> + <xsd:element name="target"> + <xsd:complexType mixed="true"> + <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/> + <xsd:attribute name="state" type="xlf:AttrType_state" use="optional"/> + <xsd:attribute name="state-qualifier" type="xlf:AttrType_state-qualifier" use="optional"/> + <xsd:attribute name="phase-name" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute ref="xml:lang" use="optional"/> + <xsd:attribute name="resname" type="xsd:string" use="optional"/> + <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/> + <xsd:attribute name="font" type="xsd:string" use="optional"/> + <xsd:attribute name="css-style" type="xsd:string" use="optional"/> + <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute default="yes" name="equiv-trans" type="xlf:AttrType_YesNo" use="optional"/> + <xsd:anyAttribute namespace="##other" processContents="strict"/> + </xsd:complexType> + <xsd:unique name="U_target_bpt_rid"> + <xsd:selector xpath=".//xlf:bpt"/> + <xsd:field xpath="@rid"/> + </xsd:unique> + <xsd:keyref name="KR_target_ept_rid" refer="xlf:U_target_bpt_rid"> + <xsd:selector xpath=".//xlf:ept"/> + <xsd:field xpath="@rid"/> + </xsd:keyref> + <xsd:unique name="U_target_bx_rid"> + <xsd:selector xpath=".//xlf:bx"/> + <xsd:field xpath="@rid"/> + </xsd:unique> + <xsd:keyref name="KR_target_ex_rid" refer="xlf:U_target_bx_rid"> + <xsd:selector xpath=".//xlf:ex"/> + <xsd:field xpath="@rid"/> + </xsd:keyref> + </xsd:element> + <xsd:element name="alt-trans"> + <xsd:complexType> + <xsd:sequence> + <xsd:element minOccurs="0" ref="xlf:source"/> + <xsd:element minOccurs="0" ref="xlf:seg-source"/> + <xsd:element maxOccurs="1" ref="xlf:target"/> + <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:context-group"/> + <xsd:element maxOccurs="unbounded" minOccurs="0" ref="xlf:note"/> + <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/> + </xsd:sequence> + <xsd:attribute name="match-quality" type="xsd:string" use="optional"/> + <xsd:attribute name="tool-id" type="xsd:string" use="optional"/> + <xsd:attribute name="crc" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute ref="xml:lang" use="optional"/> + <xsd:attribute name="origin" type="xsd:string" use="optional"/> + <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/> + <xsd:attribute default="default" ref="xml:space" use="optional"/> + <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/> + <xsd:attribute name="resname" type="xsd:string" use="optional"/> + <xsd:attribute name="extradata" type="xsd:string" use="optional"/> + <xsd:attribute name="extype" type="xsd:string" use="optional"/> + <xsd:attribute name="help-id" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="menu" type="xsd:string" use="optional"/> + <xsd:attribute name="menu-option" type="xsd:string" use="optional"/> + <xsd:attribute name="menu-name" type="xsd:string" use="optional"/> + <xsd:attribute name="mid" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="coord" type="xlf:AttrType_Coordinates" use="optional"/> + <xsd:attribute name="font" type="xsd:string" use="optional"/> + <xsd:attribute name="css-style" type="xsd:string" use="optional"/> + <xsd:attribute name="style" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="exstyle" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="phase-name" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute default="proposal" name="alttranstype" type="xlf:AttrType_alttranstype" use="optional"/> + <xsd:anyAttribute namespace="##other" processContents="strict"/> + </xsd:complexType> + <xsd:unique name="U_at_segsrc_mid"> + <xsd:selector xpath="./xlf:seg-source/xlf:mrk"/> + <xsd:field xpath="@mid"/> + </xsd:unique> + <xsd:keyref name="KR_at_segsrc_mid" refer="xlf:U_at_segsrc_mid"> + <xsd:selector xpath="./xlf:target/xlf:mrk"/> + <xsd:field xpath="@mid"/> + </xsd:keyref> + </xsd:element> + <xsd:element name="bin-unit"> + <xsd:complexType> + <xsd:sequence> + <xsd:element ref="xlf:bin-source"/> + <xsd:element minOccurs="0" ref="xlf:bin-target"/> + <xsd:choice maxOccurs="unbounded" minOccurs="0"> + <xsd:element ref="xlf:context-group"/> + <xsd:element ref="xlf:count-group"/> + <xsd:element ref="xlf:note"/> + <xsd:element ref="xlf:trans-unit"/> + </xsd:choice> + <xsd:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="strict"/> + </xsd:sequence> + <xsd:attribute name="id" type="xsd:string" use="required"/> + <xsd:attribute name="mime-type" type="xlf:mime-typeValueList" use="required"/> + <xsd:attribute name="approved" type="xlf:AttrType_YesNo" use="optional"/> + <xsd:attribute default="yes" name="translate" type="xlf:AttrType_YesNo" use="optional"/> + <xsd:attribute default="yes" name="reformat" type="xlf:AttrType_reformat" use="optional"/> + <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/> + <xsd:attribute name="resname" type="xsd:string" use="optional"/> + <xsd:attribute name="phase-name" type="xsd:string" use="optional"/> + <xsd:anyAttribute namespace="##other" processContents="strict"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="bin-source"> + <xsd:complexType> + <xsd:choice> + <xsd:element ref="xlf:internal-file"/> + <xsd:element ref="xlf:external-file"/> + </xsd:choice> + <xsd:anyAttribute namespace="##other" processContents="strict"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="bin-target"> + <xsd:complexType> + <xsd:choice> + <xsd:element ref="xlf:internal-file"/> + <xsd:element ref="xlf:external-file"/> + </xsd:choice> + <xsd:attribute name="mime-type" type="xlf:mime-typeValueList" use="optional"/> + <xsd:attribute name="state" type="xlf:AttrType_state" use="optional"/> + <xsd:attribute name="state-qualifier" type="xlf:AttrType_state-qualifier" use="optional"/> + <xsd:attribute name="phase-name" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="restype" type="xlf:AttrType_restype" use="optional"/> + <xsd:attribute name="resname" type="xsd:string" use="optional"/> + <xsd:anyAttribute namespace="##other" processContents="strict"/> + </xsd:complexType> + </xsd:element> + <!-- Element for inline codes --> + <xsd:element name="g"> + <xsd:complexType mixed="true"> + <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/> + <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/> + <xsd:attribute default="yes" name="clone" type="xlf:AttrType_YesNo" use="optional"/> + <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="x"> + <xsd:complexType> + <xsd:attribute name="ctype" type="xlf:AttrType_InlinePlaceholders" use="optional"/> + <xsd:attribute default="yes" name="clone" type="xlf:AttrType_YesNo" use="optional"/> + <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="bx"> + <xsd:complexType> + <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/> + <xsd:attribute default="yes" name="clone" type="xlf:AttrType_YesNo" use="optional"/> + <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="ex"> + <xsd:complexType> + <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/> + <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="ph"> + <xsd:complexType mixed="true"> + <xsd:sequence maxOccurs="unbounded" minOccurs="0"> + <xsd:element ref="xlf:sub"/> + </xsd:sequence> + <xsd:attribute name="ctype" type="xlf:AttrType_InlinePlaceholders" use="optional"/> + <xsd:attribute name="crc" type="xsd:string" use="optional"/> + <xsd:attribute name="assoc" type="xlf:AttrType_assoc" use="optional"/> + <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="bpt"> + <xsd:complexType mixed="true"> + <xsd:sequence maxOccurs="unbounded" minOccurs="0"> + <xsd:element ref="xlf:sub"/> + </xsd:sequence> + <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/> + <xsd:attribute name="crc" type="xsd:string" use="optional"/> + <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="ept"> + <xsd:complexType mixed="true"> + <xsd:sequence maxOccurs="unbounded" minOccurs="0"> + <xsd:element ref="xlf:sub"/> + </xsd:sequence> + <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="crc" type="xsd:string" use="optional"/> + <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="it"> + <xsd:complexType mixed="true"> + <xsd:sequence maxOccurs="unbounded" minOccurs="0"> + <xsd:element ref="xlf:sub"/> + </xsd:sequence> + <xsd:attribute name="pos" type="xlf:AttrType_Position" use="required"/> + <xsd:attribute name="rid" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/> + <xsd:attribute name="crc" type="xsd:string" use="optional"/> + <xsd:attributeGroup ref="xlf:AttrGroup_TextContent"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="sub"> + <xsd:complexType mixed="true"> + <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/> + <xsd:attribute name="datatype" type="xlf:AttrType_datatype" use="optional"/> + <xsd:attribute name="ctype" type="xlf:AttrType_InlineDelimiters" use="optional"/> + <xsd:attribute name="xid" type="xsd:string" use="optional"/> + </xsd:complexType> + </xsd:element> + <xsd:element name="mrk"> + <xsd:complexType mixed="true"> + <xsd:group maxOccurs="unbounded" minOccurs="0" ref="xlf:ElemGroup_TextContent"/> + <xsd:attribute name="mtype" type="xlf:AttrType_mtype" use="required"/> + <xsd:attribute name="mid" type="xsd:NMTOKEN" use="optional"/> + <xsd:attribute name="comment" type="xsd:string" use="optional"/> + <xsd:anyAttribute namespace="##other" processContents="strict"/> + </xsd:complexType> + </xsd:element> +</xsd:schema> diff --git a/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd b/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd new file mode 100644 index 0000000..963232f --- /dev/null +++ b/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd @@ -0,0 +1,411 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + XLIFF Version 2.0 + OASIS Standard + 05 August 2014 + Copyright (c) OASIS Open 2014. All rights reserved. + Source: http://docs.oasis-open.org/xliff/xliff-core/v2.0/os/schemas/ + --> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" + elementFormDefault="qualified" + xmlns:xlf="urn:oasis:names:tc:xliff:document:2.0" + targetNamespace="urn:oasis:names:tc:xliff:document:2.0"> + + <!-- Import --> + + <xs:import namespace="http://www.w3.org/XML/1998/namespace" + schemaLocation="informativeCopiesOf3rdPartySchemas/w3c/xml.xsd"/> + + <!-- Element Group --> + + <xs:group name="inline"> + <xs:choice> + <xs:element ref="xlf:cp"/> + <xs:element ref="xlf:ph"/> + <xs:element ref="xlf:pc"/> + <xs:element ref="xlf:sc"/> + <xs:element ref="xlf:ec"/> + <xs:element ref="xlf:mrk"/> + <xs:element ref="xlf:sm"/> + <xs:element ref="xlf:em"/> + </xs:choice> + </xs:group> + + <!-- Attribute Types --> + + <xs:simpleType name="yesNo"> + <xs:restriction base="xs:string"> + <xs:enumeration value="yes"/> + <xs:enumeration value="no"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="yesNoFirstNo"> + <xs:restriction base="xs:string"> + <xs:enumeration value="yes"/> + <xs:enumeration value="firstNo"/> + <xs:enumeration value="no"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="dirValue"> + <xs:restriction base="xs:string"> + <xs:enumeration value="ltr"/> + <xs:enumeration value="rtl"/> + <xs:enumeration value="auto"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="appliesTo"> + <xs:restriction base="xs:string"> + <xs:enumeration value="source"/> + <xs:enumeration value="target"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="userDefinedValue"> + <xs:restriction base="xs:string"> + <xs:pattern value="[^\s:]+:[^\s:]+"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="attrType_type"> + <xs:restriction base="xs:string"> + <xs:enumeration value="fmt"/> + <xs:enumeration value="ui"/> + <xs:enumeration value="quote"/> + <xs:enumeration value="link"/> + <xs:enumeration value="image"/> + <xs:enumeration value="other"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="typeForMrkValues"> + <xs:restriction base="xs:NMTOKEN"> + <xs:enumeration value="generic"/> + <xs:enumeration value="comment"/> + <xs:enumeration value="term"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="attrType_typeForMrk"> + <xs:union memberTypes="xlf:typeForMrkValues xlf:userDefinedValue"/> + </xs:simpleType> + + <xs:simpleType name="priorityValue"> + <xs:restriction base="xs:positiveInteger"> + <xs:minInclusive value="1"/> + <xs:maxInclusive value="10"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="stateType"> + <xs:restriction base="xs:string"> + <xs:enumeration value="initial"/> + <xs:enumeration value="translated"/> + <xs:enumeration value="reviewed"/> + <xs:enumeration value="final"/> + </xs:restriction> + </xs:simpleType> + + <!-- Structural Elements --> + + <xs:element name="xliff"> + <xs:complexType mixed="false"> + <xs:sequence> + <xs:element minOccurs="1" maxOccurs="unbounded" ref="xlf:file"/> + </xs:sequence> + <xs:attribute name="version" use="required"/> + <xs:attribute name="srcLang" use="required"/> + <xs:attribute name="trgLang" use="optional"/> + <xs:attribute ref="xml:space" use="optional" default="default"/> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:complexType> + </xs:element> + + <xs:element name="file"> + <xs:complexType mixed="false"> + <xs:sequence> + <xs:element minOccurs="0" maxOccurs="1" ref="xlf:skeleton"/> + <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" + processContents="lax"/> + <xs:element minOccurs="0" maxOccurs="1" ref="xlf:notes"/> + <xs:choice minOccurs="1" maxOccurs="unbounded"> + <xs:element ref="xlf:unit"/> + <xs:element ref="xlf:group"/> + </xs:choice> + </xs:sequence> + <xs:attribute name="id" use="required" type="xs:NMTOKEN"/> + <xs:attribute name="canResegment" use="optional" type="xlf:yesNo" default="yes"/> + <xs:attribute name="original" use="optional"/> + <xs:attribute name="translate" use="optional" type="xlf:yesNo" default="yes"/> + <xs:attribute name="srcDir" use="optional" type="xlf:dirValue" default="auto"/> + <xs:attribute name="trgDir" use="optional" type="xlf:dirValue" default="auto"/> + <xs:attribute ref="xml:space" use="optional"/> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:complexType> + </xs:element> + + <xs:element name="skeleton"> + <xs:complexType mixed="true"> + <xs:sequence> + <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" + processContents="lax"/> + </xs:sequence> + <xs:attribute name="href" use="optional"/> + </xs:complexType> + </xs:element> + + <xs:element name="group"> + <xs:complexType mixed="false"> + <xs:sequence> + <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" + processContents="lax"/> + <xs:element minOccurs="0" maxOccurs="1" ref="xlf:notes"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="xlf:unit"/> + <xs:element ref="xlf:group"/> + </xs:choice> + </xs:sequence> + <xs:attribute name="id" use="required" type="xs:NMTOKEN"/> + <xs:attribute name="name" use="optional"/> + <xs:attribute name="canResegment" use="optional" type="xlf:yesNo"/> + <xs:attribute name="translate" use="optional" type="xlf:yesNo"/> + <xs:attribute name="srcDir" use="optional" type="xlf:dirValue"/> + <xs:attribute name="trgDir" use="optional" type="xlf:dirValue"/> + <xs:attribute name="type" use="optional" type="xlf:userDefinedValue"/> + <xs:attribute ref="xml:space" use="optional"/> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:complexType> + </xs:element> + + <xs:element name="unit"> + <xs:complexType mixed="false"> + <xs:sequence> + <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" + processContents="lax"/> + <xs:element minOccurs="0" maxOccurs="1" ref="xlf:notes"/> + <xs:element minOccurs="0" maxOccurs="1" ref="xlf:originalData"/> + <xs:choice minOccurs="1" maxOccurs="unbounded"> + <xs:element ref="xlf:segment"/> + <xs:element ref="xlf:ignorable"/> + </xs:choice> + </xs:sequence> + <xs:attribute name="id" use="required" type="xs:NMTOKEN"/> + <xs:attribute name="name" use="optional"/> + <xs:attribute name="canResegment" use="optional" type="xlf:yesNo"/> + <xs:attribute name="translate" use="optional" type="xlf:yesNo"/> + <xs:attribute name="srcDir" use="optional" type="xlf:dirValue"/> + <xs:attribute name="trgDir" use="optional" type="xlf:dirValue"/> + <xs:attribute ref="xml:space" use="optional"/> + <xs:attribute name="type" use="optional" type="xlf:userDefinedValue"/> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:complexType> + </xs:element> + + <xs:element name="segment"> + <xs:complexType mixed="false"> + <xs:sequence> + <xs:element minOccurs="1" maxOccurs="1" ref="xlf:source"/> + <xs:element minOccurs="0" maxOccurs="1" ref="xlf:target"/> + </xs:sequence> + <xs:attribute name="id" use="optional" type="xs:NMTOKEN"/> + <xs:attribute name="canResegment" use="optional" type="xlf:yesNo"/> + <xs:attribute name="state" use="optional" type="xlf:stateType" default="initial"/> + <xs:attribute name="subState" use="optional"/> + </xs:complexType> + </xs:element> + + <xs:element name="ignorable"> + <xs:complexType mixed="false"> + <xs:sequence> + <xs:element minOccurs="1" maxOccurs="1" ref="xlf:source"/> + <xs:element minOccurs="0" maxOccurs="1" ref="xlf:target"/> + </xs:sequence> + <xs:attribute name="id" use="optional" type="xs:NMTOKEN"/> + </xs:complexType> + </xs:element> + + <xs:element name="notes"> + <xs:complexType mixed="false"> + <xs:sequence> + <xs:element minOccurs="1" maxOccurs="unbounded" ref="xlf:note"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="note"> + <xs:complexType mixed="true"> + <xs:attribute name="id" use="optional" type="xs:NMTOKEN"/> + <xs:attribute name="appliesTo" use="optional" type="xlf:appliesTo"/> + <xs:attribute name="category" use="optional"/> + <xs:attribute name="priority" use="optional" type="xlf:priorityValue" default="1"/> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:complexType> + </xs:element> + + <xs:element name="originalData"> + <xs:complexType mixed="false"> + <xs:sequence> + <xs:element minOccurs="1" maxOccurs="unbounded" ref="xlf:data"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="data"> + <xs:complexType mixed="true"> + <xs:sequence> + <xs:element minOccurs="0" maxOccurs="unbounded" ref="xlf:cp"/> + </xs:sequence> + <xs:attribute name="id" use="required" type="xs:NMTOKEN"/> + <xs:attribute name="dir" use="optional" type="xlf:dirValue" default="auto"/> + <xs:attribute ref="xml:space" use="optional" fixed="preserve"/> + </xs:complexType> + </xs:element> + + <xs:element name="source"> + <xs:complexType mixed="true"> + <xs:group ref="xlf:inline" minOccurs="0" maxOccurs="unbounded"/> + <xs:attribute ref="xml:lang" use="optional"/> + <xs:attribute ref="xml:space" use="optional"/> + </xs:complexType> + </xs:element> + + <xs:element name="target"> + <xs:complexType mixed="true"> + <xs:group ref="xlf:inline" minOccurs="0" maxOccurs="unbounded"/> + <xs:attribute ref="xml:lang" use="optional"/> + <xs:attribute ref="xml:space" use="optional"/> + <xs:attribute name="order" use="optional" type="xs:positiveInteger"/> + </xs:complexType> + </xs:element> + + <!-- Inline Elements --> + + <xs:element name="cp"> + <!-- Code Point --> + <xs:complexType mixed="false"> + <xs:attribute name="hex" use="required" type="xs:hexBinary"/> + </xs:complexType> + </xs:element> + + <xs:element name="ph"> + <!-- Placeholder --> + <xs:complexType mixed="false"> + <xs:attribute name="canCopy" use="optional" type="xlf:yesNo" default="yes"/> + <xs:attribute name="canDelete" use="optional" type="xlf:yesNo" default="yes"/> + <xs:attribute name="canReorder" use="optional" type="xlf:yesNoFirstNo" default="yes"/> + <xs:attribute name="copyOf" use="optional" type="xs:NMTOKEN"/> + <xs:attribute name="disp" use="optional"/> + <xs:attribute name="equiv" use="optional"/> + <xs:attribute name="id" use="required" type="xs:NMTOKEN"/> + <xs:attribute name="dataRef" use="optional" type="xs:NMTOKEN"/> + <xs:attribute name="subFlows" use="optional" type="xs:NMTOKENS"/> + <xs:attribute name="subType" use="optional" type="xlf:userDefinedValue"/> + <xs:attribute name="type" use="optional" type="xlf:attrType_type"/> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:complexType> + </xs:element> + + <xs:element name="pc"> + <!-- Paired Code --> + <xs:complexType mixed="true"> + <xs:group ref="xlf:inline" minOccurs="0" maxOccurs="unbounded"/> + <xs:attribute name="canCopy" use="optional" type="xlf:yesNo" default="yes"/> + <xs:attribute name="canDelete" use="optional" type="xlf:yesNo" default="yes"/> + <xs:attribute name="canOverlap" use="optional" type="xlf:yesNo"/> + <xs:attribute name="canReorder" use="optional" type="xlf:yesNoFirstNo" default="yes"/> + <xs:attribute name="copyOf" use="optional" type="xs:NMTOKEN"/> + <xs:attribute name="dispEnd" use="optional"/> + <xs:attribute name="dispStart" use="optional"/> + <xs:attribute name="equivEnd" use="optional"/> + <xs:attribute name="equivStart" use="optional"/> + <xs:attribute name="id" use="required" type="xs:NMTOKEN"/> + <xs:attribute name="dataRefEnd" use="optional" type="xs:NMTOKEN"/> + <xs:attribute name="dataRefStart" use="optional" type="xs:NMTOKEN"/> + <xs:attribute name="subFlowsEnd" use="optional" type="xs:NMTOKENS"/> + <xs:attribute name="subFlowsStart" use="optional" type="xs:NMTOKENS"/> + <xs:attribute name="subType" use="optional" type="xlf:userDefinedValue"/> + <xs:attribute name="type" use="optional" type="xlf:attrType_type"/> + <xs:attribute name="dir" use="optional" type="xlf:dirValue"/> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:complexType> + </xs:element> + + <xs:element name="sc"> + <!-- Start Code --> + <xs:complexType mixed="false"> + <xs:attribute name="canCopy" use="optional" type="xlf:yesNo" default="yes"/> + <xs:attribute name="canDelete" use="optional" type="xlf:yesNo" default="yes"/> + <xs:attribute name="canOverlap" use="optional" type="xlf:yesNo" default="yes"/> + <xs:attribute name="canReorder" use="optional" type="xlf:yesNoFirstNo" default="yes"/> + <xs:attribute name="copyOf" use="optional" type="xs:NMTOKEN"/> + <xs:attribute name="dataRef" use="optional" type="xs:NMTOKEN"/> + <xs:attribute name="dir" use="optional" type="xlf:dirValue"/> + <xs:attribute name="disp" use="optional"/> + <xs:attribute name="equiv" use="optional"/> + <xs:attribute name="id" use="required" type="xs:NMTOKEN"/> + <xs:attribute name="isolated" use="optional" type="xlf:yesNo" default="no"/> + <xs:attribute name="subFlows" use="optional" type="xs:NMTOKENS"/> + <xs:attribute name="subType" use="optional" type="xlf:userDefinedValue"/> + <xs:attribute name="type" use="optional" type="xlf:attrType_type"/> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:complexType> + </xs:element> + + <xs:element name="ec"> + <!-- End Code --> + <xs:complexType mixed="false"> + <xs:attribute name="canCopy" use="optional" type="xlf:yesNo" default="yes"/> + <xs:attribute name="canDelete" use="optional" type="xlf:yesNo" default="yes"/> + <xs:attribute name="canOverlap" use="optional" type="xlf:yesNo" default="yes"/> + <xs:attribute name="canReorder" use="optional" type="xlf:yesNoFirstNo" default="yes"/> + <xs:attribute name="copyOf" use="optional" type="xs:NMTOKEN"/> + <xs:attribute name="dataRef" use="optional" type="xs:NMTOKEN"/> + <xs:attribute name="dir" use="optional" type="xlf:dirValue"/> + <xs:attribute name="disp" use="optional"/> + <xs:attribute name="equiv" use="optional"/> + <xs:attribute name="id" use="optional" type="xs:NMTOKEN"/> + <xs:attribute name="isolated" use="optional" type="xlf:yesNo" default="no"/> + <xs:attribute name="startRef" use="optional" type="xs:NMTOKEN"/> + <xs:attribute name="subFlows" use="optional" type="xs:NMTOKENS"/> + <xs:attribute name="subType" use="optional" type="xlf:userDefinedValue"/> + <xs:attribute name="type" use="optional" type="xlf:attrType_type"/> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:complexType> + </xs:element> + + <xs:element name="mrk"> + <!-- Annotation Marker --> + <xs:complexType mixed="true"> + <xs:group ref="xlf:inline" minOccurs="0" maxOccurs="unbounded"/> + <xs:attribute name="id" use="required" type="xs:NMTOKEN"/> + <xs:attribute name="translate" use="optional" type="xlf:yesNo"/> + <xs:attribute name="type" use="optional" type="xlf:attrType_typeForMrk"/> + <xs:attribute name="ref" use="optional" type="xs:anyURI"/> + <xs:attribute name="value" use="optional"/> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:complexType> + </xs:element> + + <xs:element name="sm"> + <!-- Start Annotation Marker --> + <xs:complexType mixed="false"> + <xs:attribute name="id" use="required" type="xs:NMTOKEN"/> + <xs:attribute name="translate" use="optional" type="xlf:yesNo"/> + <xs:attribute name="type" use="optional" type="xlf:attrType_typeForMrk"/> + <xs:attribute name="ref" use="optional" type="xs:anyURI"/> + <xs:attribute name="value" use="optional"/> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:complexType> + </xs:element> + + <xs:element name="em"> + <!-- End Annotation Marker --> + <xs:complexType mixed="false"> + <xs:attribute name="startRef" use="required" type="xs:NMTOKEN"/> + </xs:complexType> + </xs:element> + +</xs:schema> diff --git a/vendor/symfony/translation/Resources/schemas/xml.xsd b/vendor/symfony/translation/Resources/schemas/xml.xsd new file mode 100644 index 0000000..a46162a --- /dev/null +++ b/vendor/symfony/translation/Resources/schemas/xml.xsd @@ -0,0 +1,309 @@ +<?xml version='1.0'?> +<?xml-stylesheet href="../2008/09/xsd.xsl" type="text/xsl"?> +<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns ="http://www.w3.org/1999/xhtml" + xml:lang="en"> + + <xs:annotation> + <xs:documentation> + <div> + <h1>About the XML namespace</h1> + + <div class="bodytext"> + <p> + + This schema document describes the XML namespace, in a form + suitable for import by other schema documents. + </p> + <p> + See <a href="http://www.w3.org/XML/1998/namespace.html"> + http://www.w3.org/XML/1998/namespace.html</a> and + <a href="http://www.w3.org/TR/REC-xml"> + http://www.w3.org/TR/REC-xml</a> for information + about this namespace. + </p> + + <p> + Note that local names in this namespace are intended to be + defined only by the World Wide Web Consortium or its subgroups. + The names currently defined in this namespace are listed below. + They should not be used with conflicting semantics by any Working + Group, specification, or document instance. + </p> + <p> + See further below in this document for more information about <a + href="#usage">how to refer to this schema document from your own + XSD schema documents</a> and about <a href="#nsversioning">the + namespace-versioning policy governing this schema document</a>. + </p> + </div> + </div> + + </xs:documentation> + </xs:annotation> + + <xs:attribute name="lang"> + <xs:annotation> + <xs:documentation> + <div> + + <h3>lang (as an attribute name)</h3> + <p> + + denotes an attribute whose value + is a language code for the natural language of the content of + any element; its value is inherited. This name is reserved + by virtue of its definition in the XML specification.</p> + + </div> + <div> + <h4>Notes</h4> + <p> + Attempting to install the relevant ISO 2- and 3-letter + codes as the enumerated possible values is probably never + going to be a realistic possibility. + </p> + <p> + + See BCP 47 at <a href="http://www.rfc-editor.org/rfc/bcp/bcp47.txt"> + http://www.rfc-editor.org/rfc/bcp/bcp47.txt</a> + and the IANA language subtag registry at + <a href="http://www.iana.org/assignments/language-subtag-registry"> + http://www.iana.org/assignments/language-subtag-registry</a> + for further information. + </p> + <p> + + The union allows for the 'un-declaration' of xml:lang with + the empty string. + </p> + </div> + </xs:documentation> + </xs:annotation> + <xs:simpleType> + <xs:union memberTypes="xs:language"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value=""/> + + </xs:restriction> + </xs:simpleType> + </xs:union> + </xs:simpleType> + </xs:attribute> + + <xs:attribute name="space"> + <xs:annotation> + <xs:documentation> + + <div> + + <h3>space (as an attribute name)</h3> + <p> + denotes an attribute whose + value is a keyword indicating what whitespace processing + discipline is intended for the content of the element; its + value is inherited. This name is reserved by virtue of its + definition in the XML specification.</p> + + </div> + </xs:documentation> + </xs:annotation> + <xs:simpleType> + + <xs:restriction base="xs:NCName"> + <xs:enumeration value="default"/> + <xs:enumeration value="preserve"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + + <xs:attribute name="base" type="xs:anyURI"> <xs:annotation> + <xs:documentation> + + <div> + + <h3>base (as an attribute name)</h3> + <p> + denotes an attribute whose value + provides a URI to be used as the base for interpreting any + relative URIs in the scope of the element on which it + appears; its value is inherited. This name is reserved + by virtue of its definition in the XML Base specification.</p> + + <p> + See <a + href="http://www.w3.org/TR/xmlbase/">http://www.w3.org/TR/xmlbase/</a> + for information about this attribute. + </p> + + </div> + </xs:documentation> + </xs:annotation> + </xs:attribute> + + <xs:attribute name="id" type="xs:ID"> + <xs:annotation> + <xs:documentation> + <div> + + <h3>id (as an attribute name)</h3> + <p> + + denotes an attribute whose value + should be interpreted as if declared to be of type ID. + This name is reserved by virtue of its definition in the + xml:id specification.</p> + + <p> + See <a + href="http://www.w3.org/TR/xml-id/">http://www.w3.org/TR/xml-id/</a> + for information about this attribute. + </p> + </div> + </xs:documentation> + </xs:annotation> + + </xs:attribute> + + <xs:attributeGroup name="specialAttrs"> + <xs:attribute ref="xml:base"/> + <xs:attribute ref="xml:lang"/> + <xs:attribute ref="xml:space"/> + <xs:attribute ref="xml:id"/> + </xs:attributeGroup> + + <xs:annotation> + + <xs:documentation> + <div> + + <h3>Father (in any context at all)</h3> + + <div class="bodytext"> + <p> + denotes Jon Bosak, the chair of + the original XML Working Group. This name is reserved by + the following decision of the W3C XML Plenary and + XML Coordination groups: + </p> + <blockquote> + <p> + + In appreciation for his vision, leadership and + dedication the W3C XML Plenary on this 10th day of + February, 2000, reserves for Jon Bosak in perpetuity + the XML name "xml:Father". + </p> + </blockquote> + </div> + </div> + </xs:documentation> + </xs:annotation> + + <xs:annotation> + <xs:documentation> + + <div xml:id="usage" id="usage"> + <h2><a name="usage">About this schema document</a></h2> + + <div class="bodytext"> + <p> + This schema defines attributes and an attribute group suitable + for use by schemas wishing to allow <code>xml:base</code>, + <code>xml:lang</code>, <code>xml:space</code> or + <code>xml:id</code> attributes on elements they define. + </p> + + <p> + To enable this, such a schema must import this schema for + the XML namespace, e.g. as follows: + </p> + <pre> + <schema.. .> + .. . + <import namespace="http://www.w3.org/XML/1998/namespace" + schemaLocation="http://www.w3.org/2001/xml.xsd"/> + </pre> + <p> + or + </p> + <pre> + + <import namespace="http://www.w3.org/XML/1998/namespace" + schemaLocation="http://www.w3.org/2009/01/xml.xsd"/> + </pre> + <p> + Subsequently, qualified reference to any of the attributes or the + group defined below will have the desired effect, e.g. + </p> + <pre> + <type.. .> + .. . + <attributeGroup ref="xml:specialAttrs"/> + </pre> + <p> + will define a type which will schema-validate an instance element + with any of those attributes. + </p> + + </div> + </div> + </xs:documentation> + </xs:annotation> + + <xs:annotation> + <xs:documentation> + <div id="nsversioning" xml:id="nsversioning"> + <h2><a name="nsversioning">Versioning policy for this schema document</a></h2> + + <div class="bodytext"> + <p> + In keeping with the XML Schema WG's standard versioning + policy, this schema document will persist at + <a href="http://www.w3.org/2009/01/xml.xsd"> + http://www.w3.org/2009/01/xml.xsd</a>. + </p> + <p> + At the date of issue it can also be found at + <a href="http://www.w3.org/2001/xml.xsd"> + http://www.w3.org/2001/xml.xsd</a>. + </p> + + <p> + The schema document at that URI may however change in the future, + in order to remain compatible with the latest version of XML + Schema itself, or with the XML namespace itself. In other words, + if the XML Schema or XML namespaces change, the version of this + document at <a href="http://www.w3.org/2001/xml.xsd"> + http://www.w3.org/2001/xml.xsd + </a> + will change accordingly; the version at + <a href="http://www.w3.org/2009/01/xml.xsd"> + http://www.w3.org/2009/01/xml.xsd + </a> + will not change. + </p> + <p> + + Previous dated (and unchanging) versions of this schema + document are at: + </p> + <ul> + <li><a href="http://www.w3.org/2009/01/xml.xsd"> + http://www.w3.org/2009/01/xml.xsd</a></li> + <li><a href="http://www.w3.org/2007/08/xml.xsd"> + http://www.w3.org/2007/08/xml.xsd</a></li> + <li><a href="http://www.w3.org/2004/10/xml.xsd"> + + http://www.w3.org/2004/10/xml.xsd</a></li> + <li><a href="http://www.w3.org/2001/03/xml.xsd"> + http://www.w3.org/2001/03/xml.xsd</a></li> + </ul> + </div> + </div> + </xs:documentation> + </xs:annotation> + +</xs:schema> diff --git a/vendor/symfony/translation/Test/ProviderFactoryTestCase.php b/vendor/symfony/translation/Test/ProviderFactoryTestCase.php new file mode 100644 index 0000000..d6510e0 --- /dev/null +++ b/vendor/symfony/translation/Test/ProviderFactoryTestCase.php @@ -0,0 +1,147 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Test; + +use PHPUnit\Framework\TestCase; +use Psr\Log\LoggerInterface; +use Symfony\Component\HttpClient\MockHttpClient; +use Symfony\Component\Translation\Dumper\XliffFileDumper; +use Symfony\Component\Translation\Exception\IncompleteDsnException; +use Symfony\Component\Translation\Exception\UnsupportedSchemeException; +use Symfony\Component\Translation\Loader\LoaderInterface; +use Symfony\Component\Translation\Provider\Dsn; +use Symfony\Component\Translation\Provider\ProviderFactoryInterface; +use Symfony\Contracts\HttpClient\HttpClientInterface; + +/** + * A test case to ease testing a translation provider factory. + * + * @author Mathieu Santostefano <msantostefano@protonmail.com> + * + * @internal + */ +abstract class ProviderFactoryTestCase extends TestCase +{ + protected $client; + protected $logger; + protected string $defaultLocale; + protected $loader; + protected $xliffFileDumper; + + abstract public function createFactory(): ProviderFactoryInterface; + + /** + * @return iterable<array{0: bool, 1: string}> + */ + abstract public function supportsProvider(): iterable; + + /** + * @return iterable<array{0: string, 1: string, 2: TransportInterface}> + */ + abstract public function createProvider(): iterable; + + /** + * @return iterable<array{0: string, 1: string|null}> + */ + public function unsupportedSchemeProvider(): iterable + { + return []; + } + + /** + * @return iterable<array{0: string, 1: string|null}> + */ + public function incompleteDsnProvider(): iterable + { + return []; + } + + /** + * @dataProvider supportsProvider + */ + public function testSupports(bool $expected, string $dsn) + { + $factory = $this->createFactory(); + + $this->assertSame($expected, $factory->supports(new Dsn($dsn))); + } + + /** + * @dataProvider createProvider + */ + public function testCreate(string $expected, string $dsn) + { + $factory = $this->createFactory(); + $provider = $factory->create(new Dsn($dsn)); + + $this->assertSame($expected, (string) $provider); + } + + /** + * @dataProvider unsupportedSchemeProvider + */ + public function testUnsupportedSchemeException(string $dsn, string $message = null) + { + $factory = $this->createFactory(); + + $dsn = new Dsn($dsn); + + $this->expectException(UnsupportedSchemeException::class); + if (null !== $message) { + $this->expectExceptionMessage($message); + } + + $factory->create($dsn); + } + + /** + * @dataProvider incompleteDsnProvider + */ + public function testIncompleteDsnException(string $dsn, string $message = null) + { + $factory = $this->createFactory(); + + $dsn = new Dsn($dsn); + + $this->expectException(IncompleteDsnException::class); + if (null !== $message) { + $this->expectExceptionMessage($message); + } + + $factory->create($dsn); + } + + protected function getClient(): HttpClientInterface + { + return $this->client ??= new MockHttpClient(); + } + + protected function getLogger(): LoggerInterface + { + return $this->logger ??= $this->createMock(LoggerInterface::class); + } + + protected function getDefaultLocale(): string + { + return $this->defaultLocale ??= 'en'; + } + + protected function getLoader(): LoaderInterface + { + return $this->loader ??= $this->createMock(LoaderInterface::class); + } + + protected function getXliffFileDumper(): XliffFileDumper + { + return $this->xliffFileDumper ??= $this->createMock(XliffFileDumper::class); + } +} diff --git a/vendor/symfony/translation/Test/ProviderTestCase.php b/vendor/symfony/translation/Test/ProviderTestCase.php new file mode 100644 index 0000000..5ae2682 --- /dev/null +++ b/vendor/symfony/translation/Test/ProviderTestCase.php @@ -0,0 +1,76 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Test; + +use PHPUnit\Framework\TestCase; +use Psr\Log\LoggerInterface; +use Symfony\Component\HttpClient\MockHttpClient; +use Symfony\Component\Translation\Dumper\XliffFileDumper; +use Symfony\Component\Translation\Loader\LoaderInterface; +use Symfony\Component\Translation\Provider\ProviderInterface; +use Symfony\Contracts\HttpClient\HttpClientInterface; + +/** + * A test case to ease testing a translation provider. + * + * @author Mathieu Santostefano <msantostefano@protonmail.com> + * + * @internal + */ +abstract class ProviderTestCase extends TestCase +{ + protected $client; + protected $logger; + protected string $defaultLocale; + protected $loader; + protected $xliffFileDumper; + + abstract public function createProvider(HttpClientInterface $client, LoaderInterface $loader, LoggerInterface $logger, string $defaultLocale, string $endpoint): ProviderInterface; + + /** + * @return iterable<array{0: string, 1: ProviderInterface}> + */ + abstract public function toStringProvider(): iterable; + + /** + * @dataProvider toStringProvider + */ + public function testToString(ProviderInterface $provider, string $expected) + { + $this->assertSame($expected, (string) $provider); + } + + protected function getClient(): MockHttpClient + { + return $this->client ??= new MockHttpClient(); + } + + protected function getLoader(): LoaderInterface + { + return $this->loader ??= $this->createMock(LoaderInterface::class); + } + + protected function getLogger(): LoggerInterface + { + return $this->logger ??= $this->createMock(LoggerInterface::class); + } + + protected function getDefaultLocale(): string + { + return $this->defaultLocale ??= 'en'; + } + + protected function getXliffFileDumper(): XliffFileDumper + { + return $this->xliffFileDumper ??= $this->createMock(XliffFileDumper::class); + } +} diff --git a/vendor/symfony/translation/TranslatableMessage.php b/vendor/symfony/translation/TranslatableMessage.php new file mode 100644 index 0000000..b1a3b6b --- /dev/null +++ b/vendor/symfony/translation/TranslatableMessage.php @@ -0,0 +1,62 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Symfony\Contracts\Translation\TranslatableInterface; +use Symfony\Contracts\Translation\TranslatorInterface; + +/** + * @author Nate Wiebe <nate@northern.co> + */ +class TranslatableMessage implements TranslatableInterface +{ + private string $message; + private array $parameters; + private ?string $domain; + + public function __construct(string $message, array $parameters = [], string $domain = null) + { + $this->message = $message; + $this->parameters = $parameters; + $this->domain = $domain; + } + + public function __toString(): string + { + return $this->getMessage(); + } + + public function getMessage(): string + { + return $this->message; + } + + public function getParameters(): array + { + return $this->parameters; + } + + public function getDomain(): ?string + { + return $this->domain; + } + + public function trans(TranslatorInterface $translator, string $locale = null): string + { + return $translator->trans($this->getMessage(), array_map( + static function ($parameter) use ($translator, $locale) { + return $parameter instanceof TranslatableInterface ? $parameter->trans($translator, $locale) : $parameter; + }, + $this->getParameters() + ), $this->getDomain(), $locale); + } +} diff --git a/vendor/symfony/translation/Translator.php b/vendor/symfony/translation/Translator.php new file mode 100644 index 0000000..05e84d0 --- /dev/null +++ b/vendor/symfony/translation/Translator.php @@ -0,0 +1,469 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Symfony\Component\Config\ConfigCacheFactory; +use Symfony\Component\Config\ConfigCacheFactoryInterface; +use Symfony\Component\Config\ConfigCacheInterface; +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Exception\NotFoundResourceException; +use Symfony\Component\Translation\Exception\RuntimeException; +use Symfony\Component\Translation\Formatter\IntlFormatterInterface; +use Symfony\Component\Translation\Formatter\MessageFormatter; +use Symfony\Component\Translation\Formatter\MessageFormatterInterface; +use Symfony\Component\Translation\Loader\LoaderInterface; +use Symfony\Contracts\Translation\LocaleAwareInterface; +use Symfony\Contracts\Translation\TranslatorInterface; + +// Help opcache.preload discover always-needed symbols +class_exists(MessageCatalogue::class); + +/** + * @author Fabien Potencier <fabien@symfony.com> + */ +class Translator implements TranslatorInterface, TranslatorBagInterface, LocaleAwareInterface +{ + /** + * @var MessageCatalogueInterface[] + */ + protected $catalogues = []; + + private string $locale; + + /** + * @var string[] + */ + private array $fallbackLocales = []; + + /** + * @var LoaderInterface[] + */ + private array $loaders = []; + + private array $resources = []; + + private $formatter; + + private ?string $cacheDir; + + private bool $debug; + + private array $cacheVary; + + private $configCacheFactory; + + private array $parentLocales; + + private bool $hasIntlFormatter; + + /** + * @throws InvalidArgumentException If a locale contains invalid characters + */ + public function __construct(string $locale, MessageFormatterInterface $formatter = null, string $cacheDir = null, bool $debug = false, array $cacheVary = []) + { + $this->setLocale($locale); + + if (null === $formatter) { + $formatter = new MessageFormatter(); + } + + $this->formatter = $formatter; + $this->cacheDir = $cacheDir; + $this->debug = $debug; + $this->cacheVary = $cacheVary; + $this->hasIntlFormatter = $formatter instanceof IntlFormatterInterface; + } + + public function setConfigCacheFactory(ConfigCacheFactoryInterface $configCacheFactory) + { + $this->configCacheFactory = $configCacheFactory; + } + + /** + * Adds a Loader. + * + * @param string $format The name of the loader (@see addResource()) + */ + public function addLoader(string $format, LoaderInterface $loader) + { + $this->loaders[$format] = $loader; + } + + /** + * Adds a Resource. + * + * @param string $format The name of the loader (@see addLoader()) + * @param mixed $resource The resource name + * + * @throws InvalidArgumentException If the locale contains invalid characters + */ + public function addResource(string $format, mixed $resource, string $locale, string $domain = null) + { + if (null === $domain) { + $domain = 'messages'; + } + + $this->assertValidLocale($locale); + $locale ?: $locale = class_exists(\Locale::class) ? \Locale::getDefault() : 'en'; + + $this->resources[$locale][] = [$format, $resource, $domain]; + + if (\in_array($locale, $this->fallbackLocales)) { + $this->catalogues = []; + } else { + unset($this->catalogues[$locale]); + } + } + + /** + * {@inheritdoc} + */ + public function setLocale(string $locale) + { + $this->assertValidLocale($locale); + $this->locale = $locale; + } + + /** + * {@inheritdoc} + */ + public function getLocale(): string + { + return $this->locale ?: (class_exists(\Locale::class) ? \Locale::getDefault() : 'en'); + } + + /** + * Sets the fallback locales. + * + * @param string[] $locales + * + * @throws InvalidArgumentException If a locale contains invalid characters + */ + public function setFallbackLocales(array $locales) + { + // needed as the fallback locales are linked to the already loaded catalogues + $this->catalogues = []; + + foreach ($locales as $locale) { + $this->assertValidLocale($locale); + } + + $this->fallbackLocales = $this->cacheVary['fallback_locales'] = $locales; + } + + /** + * Gets the fallback locales. + * + * @internal + */ + public function getFallbackLocales(): array + { + return $this->fallbackLocales; + } + + /** + * {@inheritdoc} + */ + public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null): string + { + if (null === $id || '' === $id) { + return ''; + } + + if (null === $domain) { + $domain = 'messages'; + } + + $catalogue = $this->getCatalogue($locale); + $locale = $catalogue->getLocale(); + while (!$catalogue->defines($id, $domain)) { + if ($cat = $catalogue->getFallbackCatalogue()) { + $catalogue = $cat; + $locale = $catalogue->getLocale(); + } else { + break; + } + } + + $len = \strlen(MessageCatalogue::INTL_DOMAIN_SUFFIX); + if ($this->hasIntlFormatter + && ($catalogue->defines($id, $domain.MessageCatalogue::INTL_DOMAIN_SUFFIX) + || (\strlen($domain) > $len && 0 === substr_compare($domain, MessageCatalogue::INTL_DOMAIN_SUFFIX, -$len, $len))) + ) { + return $this->formatter->formatIntl($catalogue->get($id, $domain), $locale, $parameters); + } + + return $this->formatter->format($catalogue->get($id, $domain), $locale, $parameters); + } + + /** + * {@inheritdoc} + */ + public function getCatalogue(string $locale = null): MessageCatalogueInterface + { + if (!$locale) { + $locale = $this->getLocale(); + } else { + $this->assertValidLocale($locale); + } + + if (!isset($this->catalogues[$locale])) { + $this->loadCatalogue($locale); + } + + return $this->catalogues[$locale]; + } + + /** + * {@inheritdoc} + */ + public function getCatalogues(): array + { + return array_values($this->catalogues); + } + + /** + * Gets the loaders. + * + * @return LoaderInterface[] + */ + protected function getLoaders(): array + { + return $this->loaders; + } + + protected function loadCatalogue(string $locale) + { + if (null === $this->cacheDir) { + $this->initializeCatalogue($locale); + } else { + $this->initializeCacheCatalogue($locale); + } + } + + protected function initializeCatalogue(string $locale) + { + $this->assertValidLocale($locale); + + try { + $this->doLoadCatalogue($locale); + } catch (NotFoundResourceException $e) { + if (!$this->computeFallbackLocales($locale)) { + throw $e; + } + } + $this->loadFallbackCatalogues($locale); + } + + private function initializeCacheCatalogue(string $locale): void + { + if (isset($this->catalogues[$locale])) { + /* Catalogue already initialized. */ + return; + } + + $this->assertValidLocale($locale); + $cache = $this->getConfigCacheFactory()->cache($this->getCatalogueCachePath($locale), + function (ConfigCacheInterface $cache) use ($locale) { + $this->dumpCatalogue($locale, $cache); + } + ); + + if (isset($this->catalogues[$locale])) { + /* Catalogue has been initialized as it was written out to cache. */ + return; + } + + /* Read catalogue from cache. */ + $this->catalogues[$locale] = include $cache->getPath(); + } + + private function dumpCatalogue(string $locale, ConfigCacheInterface $cache): void + { + $this->initializeCatalogue($locale); + $fallbackContent = $this->getFallbackContent($this->catalogues[$locale]); + + $content = sprintf(<<<EOF +<?php + +use Symfony\Component\Translation\MessageCatalogue; + +\$catalogue = new MessageCatalogue('%s', %s); + +%s +return \$catalogue; + +EOF + , + $locale, + var_export($this->getAllMessages($this->catalogues[$locale]), true), + $fallbackContent + ); + + $cache->write($content, $this->catalogues[$locale]->getResources()); + } + + private function getFallbackContent(MessageCatalogue $catalogue): string + { + $fallbackContent = ''; + $current = ''; + $replacementPattern = '/[^a-z0-9_]/i'; + $fallbackCatalogue = $catalogue->getFallbackCatalogue(); + while ($fallbackCatalogue) { + $fallback = $fallbackCatalogue->getLocale(); + $fallbackSuffix = ucfirst(preg_replace($replacementPattern, '_', $fallback)); + $currentSuffix = ucfirst(preg_replace($replacementPattern, '_', $current)); + + $fallbackContent .= sprintf(<<<'EOF' +$catalogue%s = new MessageCatalogue('%s', %s); +$catalogue%s->addFallbackCatalogue($catalogue%s); + +EOF + , + $fallbackSuffix, + $fallback, + var_export($this->getAllMessages($fallbackCatalogue), true), + $currentSuffix, + $fallbackSuffix + ); + $current = $fallbackCatalogue->getLocale(); + $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue(); + } + + return $fallbackContent; + } + + private function getCatalogueCachePath(string $locale): string + { + return $this->cacheDir.'/catalogue.'.$locale.'.'.strtr(substr(base64_encode(hash('sha256', serialize($this->cacheVary), true)), 0, 7), '/', '_').'.php'; + } + + /** + * @internal + */ + protected function doLoadCatalogue(string $locale): void + { + $this->catalogues[$locale] = new MessageCatalogue($locale); + + if (isset($this->resources[$locale])) { + foreach ($this->resources[$locale] as $resource) { + if (!isset($this->loaders[$resource[0]])) { + if (\is_string($resource[1])) { + throw new RuntimeException(sprintf('No loader is registered for the "%s" format when loading the "%s" resource.', $resource[0], $resource[1])); + } + + throw new RuntimeException(sprintf('No loader is registered for the "%s" format.', $resource[0])); + } + $this->catalogues[$locale]->addCatalogue($this->loaders[$resource[0]]->load($resource[1], $locale, $resource[2])); + } + } + } + + private function loadFallbackCatalogues(string $locale): void + { + $current = $this->catalogues[$locale]; + + foreach ($this->computeFallbackLocales($locale) as $fallback) { + if (!isset($this->catalogues[$fallback])) { + $this->initializeCatalogue($fallback); + } + + $fallbackCatalogue = new MessageCatalogue($fallback, $this->getAllMessages($this->catalogues[$fallback])); + foreach ($this->catalogues[$fallback]->getResources() as $resource) { + $fallbackCatalogue->addResource($resource); + } + $current->addFallbackCatalogue($fallbackCatalogue); + $current = $fallbackCatalogue; + } + } + + protected function computeFallbackLocales(string $locale) + { + $this->parentLocales ??= json_decode(file_get_contents(__DIR__.'/Resources/data/parents.json'), true); + + $originLocale = $locale; + $locales = []; + + while ($locale) { + $parent = $this->parentLocales[$locale] ?? null; + + if ($parent) { + $locale = 'root' !== $parent ? $parent : null; + } elseif (\function_exists('locale_parse')) { + $localeSubTags = locale_parse($locale); + $locale = null; + if (1 < \count($localeSubTags)) { + array_pop($localeSubTags); + $locale = locale_compose($localeSubTags) ?: null; + } + } elseif ($i = strrpos($locale, '_') ?: strrpos($locale, '-')) { + $locale = substr($locale, 0, $i); + } else { + $locale = null; + } + + if (null !== $locale) { + $locales[] = $locale; + } + } + + foreach ($this->fallbackLocales as $fallback) { + if ($fallback === $originLocale) { + continue; + } + + $locales[] = $fallback; + } + + return array_unique($locales); + } + + /** + * Asserts that the locale is valid, throws an Exception if not. + * + * @throws InvalidArgumentException If the locale contains invalid characters + */ + protected function assertValidLocale(string $locale) + { + if (!preg_match('/^[a-z0-9@_\\.\\-]*$/i', $locale)) { + throw new InvalidArgumentException(sprintf('Invalid "%s" locale.', $locale)); + } + } + + /** + * Provides the ConfigCache factory implementation, falling back to a + * default implementation if necessary. + */ + private function getConfigCacheFactory(): ConfigCacheFactoryInterface + { + $this->configCacheFactory ??= new ConfigCacheFactory($this->debug); + + return $this->configCacheFactory; + } + + private function getAllMessages(MessageCatalogueInterface $catalogue): array + { + $allMessages = []; + + foreach ($catalogue->all() as $domain => $messages) { + if ($intlMessages = $catalogue->all($domain.MessageCatalogue::INTL_DOMAIN_SUFFIX)) { + $allMessages[$domain.MessageCatalogue::INTL_DOMAIN_SUFFIX] = $intlMessages; + $messages = array_diff_key($messages, $intlMessages); + } + if ($messages) { + $allMessages[$domain] = $messages; + } + } + + return $allMessages; + } +} diff --git a/vendor/symfony/translation/TranslatorBag.php b/vendor/symfony/translation/TranslatorBag.php new file mode 100644 index 0000000..9be3458 --- /dev/null +++ b/vendor/symfony/translation/TranslatorBag.php @@ -0,0 +1,108 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Symfony\Component\Translation\Catalogue\AbstractOperation; +use Symfony\Component\Translation\Catalogue\TargetOperation; + +final class TranslatorBag implements TranslatorBagInterface +{ + /** @var MessageCatalogue[] */ + private array $catalogues = []; + + public function addCatalogue(MessageCatalogue $catalogue): void + { + if (null !== $existingCatalogue = $this->getCatalogue($catalogue->getLocale())) { + $catalogue->addCatalogue($existingCatalogue); + } + + $this->catalogues[$catalogue->getLocale()] = $catalogue; + } + + public function addBag(TranslatorBagInterface $bag): void + { + foreach ($bag->getCatalogues() as $catalogue) { + $this->addCatalogue($catalogue); + } + } + + /** + * {@inheritdoc} + */ + public function getCatalogue(string $locale = null): MessageCatalogueInterface + { + if (null === $locale || !isset($this->catalogues[$locale])) { + $this->catalogues[$locale] = new MessageCatalogue($locale); + } + + return $this->catalogues[$locale]; + } + + /** + * {@inheritdoc} + */ + public function getCatalogues(): array + { + return array_values($this->catalogues); + } + + public function diff(TranslatorBagInterface $diffBag): self + { + $diff = new self(); + + foreach ($this->catalogues as $locale => $catalogue) { + if (null === $diffCatalogue = $diffBag->getCatalogue($locale)) { + $diff->addCatalogue($catalogue); + + continue; + } + + $operation = new TargetOperation($diffCatalogue, $catalogue); + $operation->moveMessagesToIntlDomainsIfPossible(AbstractOperation::NEW_BATCH); + $newCatalogue = new MessageCatalogue($locale); + + foreach ($operation->getDomains() as $domain) { + $newCatalogue->add($operation->getNewMessages($domain), $domain); + } + + $diff->addCatalogue($newCatalogue); + } + + return $diff; + } + + public function intersect(TranslatorBagInterface $intersectBag): self + { + $diff = new self(); + + foreach ($this->catalogues as $locale => $catalogue) { + if (null === $intersectCatalogue = $intersectBag->getCatalogue($locale)) { + continue; + } + + $operation = new TargetOperation($catalogue, $intersectCatalogue); + $operation->moveMessagesToIntlDomainsIfPossible(AbstractOperation::OBSOLETE_BATCH); + $obsoleteCatalogue = new MessageCatalogue($locale); + + foreach ($operation->getDomains() as $domain) { + $obsoleteCatalogue->add( + array_diff($operation->getMessages($domain), $operation->getNewMessages($domain)), + $domain + ); + } + + $diff->addCatalogue($obsoleteCatalogue); + } + + return $diff; + } +} diff --git a/vendor/symfony/translation/TranslatorBagInterface.php b/vendor/symfony/translation/TranslatorBagInterface.php new file mode 100644 index 0000000..a787acf --- /dev/null +++ b/vendor/symfony/translation/TranslatorBagInterface.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; + +/** + * @author Abdellatif Ait boudad <a.aitboudad@gmail.com> + */ +interface TranslatorBagInterface +{ + /** + * Gets the catalogue by locale. + * + * @param string|null $locale The locale or null to use the default + * + * @throws InvalidArgumentException If the locale contains invalid characters + */ + public function getCatalogue(string $locale = null): MessageCatalogueInterface; + + /** + * Returns all catalogues of the instance. + * + * @return MessageCatalogueInterface[] + */ + public function getCatalogues(): array; +} diff --git a/vendor/symfony/translation/Util/ArrayConverter.php b/vendor/symfony/translation/Util/ArrayConverter.php new file mode 100644 index 0000000..60b8be6 --- /dev/null +++ b/vendor/symfony/translation/Util/ArrayConverter.php @@ -0,0 +1,97 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Util; + +/** + * ArrayConverter generates tree like structure from a message catalogue. + * e.g. this + * 'foo.bar1' => 'test1', + * 'foo.bar2' => 'test2' + * converts to follows: + * foo: + * bar1: test1 + * bar2: test2. + * + * @author Gennady Telegin <gtelegin@gmail.com> + */ +class ArrayConverter +{ + /** + * Converts linear messages array to tree-like array. + * For example this array('foo.bar' => 'value') will be converted to ['foo' => ['bar' => 'value']]. + * + * @param array $messages Linear messages array + */ + public static function expandToTree(array $messages): array + { + $tree = []; + + foreach ($messages as $id => $value) { + $referenceToElement = &self::getElementByPath($tree, explode('.', $id)); + + $referenceToElement = $value; + + unset($referenceToElement); + } + + return $tree; + } + + private static function &getElementByPath(array &$tree, array $parts) + { + $elem = &$tree; + $parentOfElem = null; + + foreach ($parts as $i => $part) { + if (isset($elem[$part]) && \is_string($elem[$part])) { + /* Process next case: + * 'foo': 'test1', + * 'foo.bar': 'test2' + * + * $tree['foo'] was string before we found array {bar: test2}. + * Treat new element as string too, e.g. add $tree['foo.bar'] = 'test2'; + */ + $elem = &$elem[implode('.', \array_slice($parts, $i))]; + break; + } + $parentOfElem = &$elem; + $elem = &$elem[$part]; + } + + if ($elem && \is_array($elem) && $parentOfElem) { + /* Process next case: + * 'foo.bar': 'test1' + * 'foo': 'test2' + * + * $tree['foo'] was array = {bar: 'test1'} before we found string constant `foo`. + * Cancel treating $tree['foo'] as array and cancel back it expansion, + * e.g. make it $tree['foo.bar'] = 'test1' again. + */ + self::cancelExpand($parentOfElem, $part, $elem); + } + + return $elem; + } + + private static function cancelExpand(array &$tree, string $prefix, array $node) + { + $prefix .= '.'; + + foreach ($node as $id => $value) { + if (\is_string($value)) { + $tree[$prefix.$id] = $value; + } else { + self::cancelExpand($tree, $prefix.$id, $value); + } + } + } +} diff --git a/vendor/symfony/translation/Util/XliffUtils.php b/vendor/symfony/translation/Util/XliffUtils.php new file mode 100644 index 0000000..85ecc85 --- /dev/null +++ b/vendor/symfony/translation/Util/XliffUtils.php @@ -0,0 +1,191 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Util; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Exception\InvalidResourceException; + +/** + * Provides some utility methods for XLIFF translation files, such as validating + * their contents according to the XSD schema. + * + * @author Fabien Potencier <fabien@symfony.com> + */ +class XliffUtils +{ + /** + * Gets xliff file version based on the root "version" attribute. + * + * Defaults to 1.2 for backwards compatibility. + * + * @throws InvalidArgumentException + */ + public static function getVersionNumber(\DOMDocument $dom): string + { + /** @var \DOMNode $xliff */ + foreach ($dom->getElementsByTagName('xliff') as $xliff) { + $version = $xliff->attributes->getNamedItem('version'); + if ($version) { + return $version->nodeValue; + } + + $namespace = $xliff->attributes->getNamedItem('xmlns'); + if ($namespace) { + if (0 !== substr_compare('urn:oasis:names:tc:xliff:document:', $namespace->nodeValue, 0, 34)) { + throw new InvalidArgumentException(sprintf('Not a valid XLIFF namespace "%s".', $namespace)); + } + + return substr($namespace, 34); + } + } + + // Falls back to v1.2 + return '1.2'; + } + + /** + * Validates and parses the given file into a DOMDocument. + * + * @throws InvalidResourceException + */ + public static function validateSchema(\DOMDocument $dom): array + { + $xliffVersion = static::getVersionNumber($dom); + $internalErrors = libxml_use_internal_errors(true); + if ($shouldEnable = self::shouldEnableEntityLoader()) { + $disableEntities = libxml_disable_entity_loader(false); + } + try { + $isValid = @$dom->schemaValidateSource(self::getSchema($xliffVersion)); + if (!$isValid) { + return self::getXmlErrors($internalErrors); + } + } finally { + if ($shouldEnable) { + libxml_disable_entity_loader($disableEntities); + } + } + + $dom->normalizeDocument(); + + libxml_clear_errors(); + libxml_use_internal_errors($internalErrors); + + return []; + } + + private static function shouldEnableEntityLoader(): bool + { + static $dom, $schema; + if (null === $dom) { + $dom = new \DOMDocument(); + $dom->loadXML('<?xml version="1.0"?><test/>'); + + $tmpfile = tempnam(sys_get_temp_dir(), 'symfony'); + register_shutdown_function(static function () use ($tmpfile) { + @unlink($tmpfile); + }); + $schema = '<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <xsd:include schemaLocation="file:///'.str_replace('\\', '/', $tmpfile).'" /> +</xsd:schema>'; + file_put_contents($tmpfile, '<?xml version="1.0" encoding="utf-8"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <xsd:element name="test" type="testType" /> + <xsd:complexType name="testType"/> +</xsd:schema>'); + } + + return !@$dom->schemaValidateSource($schema); + } + + public static function getErrorsAsString(array $xmlErrors): string + { + $errorsAsString = ''; + + foreach ($xmlErrors as $error) { + $errorsAsString .= sprintf("[%s %s] %s (in %s - line %d, column %d)\n", + \LIBXML_ERR_WARNING === $error['level'] ? 'WARNING' : 'ERROR', + $error['code'], + $error['message'], + $error['file'], + $error['line'], + $error['column'] + ); + } + + return $errorsAsString; + } + + private static function getSchema(string $xliffVersion): string + { + if ('1.2' === $xliffVersion) { + $schemaSource = file_get_contents(__DIR__.'/../Resources/schemas/xliff-core-1.2-strict.xsd'); + $xmlUri = 'http://www.w3.org/2001/xml.xsd'; + } elseif ('2.0' === $xliffVersion) { + $schemaSource = file_get_contents(__DIR__.'/../Resources/schemas/xliff-core-2.0.xsd'); + $xmlUri = 'informativeCopiesOf3rdPartySchemas/w3c/xml.xsd'; + } else { + throw new InvalidArgumentException(sprintf('No support implemented for loading XLIFF version "%s".', $xliffVersion)); + } + + return self::fixXmlLocation($schemaSource, $xmlUri); + } + + /** + * Internally changes the URI of a dependent xsd to be loaded locally. + */ + private static function fixXmlLocation(string $schemaSource, string $xmlUri): string + { + $newPath = str_replace('\\', '/', __DIR__).'/../Resources/schemas/xml.xsd'; + $parts = explode('/', $newPath); + $locationstart = 'file:///'; + if (0 === stripos($newPath, 'phar://')) { + $tmpfile = tempnam(sys_get_temp_dir(), 'symfony'); + if ($tmpfile) { + copy($newPath, $tmpfile); + $parts = explode('/', str_replace('\\', '/', $tmpfile)); + } else { + array_shift($parts); + $locationstart = 'phar:///'; + } + } + + $drive = '\\' === \DIRECTORY_SEPARATOR ? array_shift($parts).'/' : ''; + $newPath = $locationstart.$drive.implode('/', array_map('rawurlencode', $parts)); + + return str_replace($xmlUri, $newPath, $schemaSource); + } + + /** + * Returns the XML errors of the internal XML parser. + */ + private static function getXmlErrors(bool $internalErrors): array + { + $errors = []; + foreach (libxml_get_errors() as $error) { + $errors[] = [ + 'level' => \LIBXML_ERR_WARNING == $error->level ? 'WARNING' : 'ERROR', + 'code' => $error->code, + 'message' => trim($error->message), + 'file' => $error->file ?: 'n/a', + 'line' => $error->line, + 'column' => $error->column, + ]; + } + + libxml_clear_errors(); + libxml_use_internal_errors($internalErrors); + + return $errors; + } +} diff --git a/vendor/symfony/translation/Writer/TranslationWriter.php b/vendor/symfony/translation/Writer/TranslationWriter.php new file mode 100644 index 0000000..5dd3a5c --- /dev/null +++ b/vendor/symfony/translation/Writer/TranslationWriter.php @@ -0,0 +1,71 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Writer; + +use Symfony\Component\Translation\Dumper\DumperInterface; +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\Exception\RuntimeException; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * TranslationWriter writes translation messages. + * + * @author Michel Salib <michelsalib@hotmail.com> + */ +class TranslationWriter implements TranslationWriterInterface +{ + /** + * @var array<string, DumperInterface> + */ + private array $dumpers = []; + + /** + * Adds a dumper to the writer. + */ + public function addDumper(string $format, DumperInterface $dumper) + { + $this->dumpers[$format] = $dumper; + } + + /** + * Obtains the list of supported formats. + */ + public function getFormats(): array + { + return array_keys($this->dumpers); + } + + /** + * Writes translation from the catalogue according to the selected format. + * + * @param string $format The format to use to dump the messages + * @param array $options Options that are passed to the dumper + * + * @throws InvalidArgumentException + */ + public function write(MessageCatalogue $catalogue, string $format, array $options = []) + { + if (!isset($this->dumpers[$format])) { + throw new InvalidArgumentException(sprintf('There is no dumper associated with format "%s".', $format)); + } + + // get the right dumper + $dumper = $this->dumpers[$format]; + + if (isset($options['path']) && !is_dir($options['path']) && !@mkdir($options['path'], 0777, true) && !is_dir($options['path'])) { + throw new RuntimeException(sprintf('Translation Writer was not able to create directory "%s".', $options['path'])); + } + + // save + $dumper->dump($catalogue, $options); + } +} diff --git a/vendor/symfony/translation/Writer/TranslationWriterInterface.php b/vendor/symfony/translation/Writer/TranslationWriterInterface.php new file mode 100644 index 0000000..4321309 --- /dev/null +++ b/vendor/symfony/translation/Writer/TranslationWriterInterface.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Writer; + +use Symfony\Component\Translation\Exception\InvalidArgumentException; +use Symfony\Component\Translation\MessageCatalogue; + +/** + * TranslationWriter writes translation messages. + * + * @author Michel Salib <michelsalib@hotmail.com> + */ +interface TranslationWriterInterface +{ + /** + * Writes translation from the catalogue according to the selected format. + * + * @param string $format The format to use to dump the messages + * @param array $options Options that are passed to the dumper + * + * @throws InvalidArgumentException + */ + public function write(MessageCatalogue $catalogue, string $format, array $options = []); +} diff --git a/vendor/symfony/translation/composer.json b/vendor/symfony/translation/composer.json new file mode 100644 index 0000000..abe8b97 --- /dev/null +++ b/vendor/symfony/translation/composer.json @@ -0,0 +1,60 @@ +{ + "name": "symfony/translation", + "type": "library", + "description": "Provides tools to internationalize your application", + "keywords": [], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=8.0.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.3|^3.0" + }, + "require-dev": { + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "psr/log": "^1|^2|^3" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4", + "symfony/console": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "suggest": { + "symfony/config": "", + "symfony/yaml": "", + "psr/log-implementation": "To use logging capability in translator" + }, + "autoload": { + "files": [ "Resources/functions.php" ], + "psr-4": { "Symfony\\Component\\Translation\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev" +} diff --git a/vendor/symfony/var-exporter/CHANGELOG.md b/vendor/symfony/var-exporter/CHANGELOG.md new file mode 100644 index 0000000..3406c30 --- /dev/null +++ b/vendor/symfony/var-exporter/CHANGELOG.md @@ -0,0 +1,12 @@ +CHANGELOG +========= + +5.1.0 +----- + + * added argument `array &$foundClasses` to `VarExporter::export()` to ease with preloading exported values + +4.2.0 +----- + + * added the component diff --git a/vendor/symfony/var-exporter/Exception/ClassNotFoundException.php b/vendor/symfony/var-exporter/Exception/ClassNotFoundException.php new file mode 100644 index 0000000..4cebe44 --- /dev/null +++ b/vendor/symfony/var-exporter/Exception/ClassNotFoundException.php @@ -0,0 +1,20 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter\Exception; + +class ClassNotFoundException extends \Exception implements ExceptionInterface +{ + public function __construct(string $class, \Throwable $previous = null) + { + parent::__construct(sprintf('Class "%s" not found.', $class), 0, $previous); + } +} diff --git a/vendor/symfony/var-exporter/Exception/ExceptionInterface.php b/vendor/symfony/var-exporter/Exception/ExceptionInterface.php new file mode 100644 index 0000000..adfaed4 --- /dev/null +++ b/vendor/symfony/var-exporter/Exception/ExceptionInterface.php @@ -0,0 +1,16 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter\Exception; + +interface ExceptionInterface extends \Throwable +{ +} diff --git a/vendor/symfony/var-exporter/Exception/NotInstantiableTypeException.php b/vendor/symfony/var-exporter/Exception/NotInstantiableTypeException.php new file mode 100644 index 0000000..771ee61 --- /dev/null +++ b/vendor/symfony/var-exporter/Exception/NotInstantiableTypeException.php @@ -0,0 +1,20 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter\Exception; + +class NotInstantiableTypeException extends \Exception implements ExceptionInterface +{ + public function __construct(string $type, \Throwable $previous = null) + { + parent::__construct(sprintf('Type "%s" is not instantiable.', $type), 0, $previous); + } +} diff --git a/vendor/symfony/var-exporter/Instantiator.php b/vendor/symfony/var-exporter/Instantiator.php new file mode 100644 index 0000000..38fce27 --- /dev/null +++ b/vendor/symfony/var-exporter/Instantiator.php @@ -0,0 +1,92 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter; + +use Symfony\Component\VarExporter\Exception\ExceptionInterface; +use Symfony\Component\VarExporter\Exception\NotInstantiableTypeException; +use Symfony\Component\VarExporter\Internal\Hydrator; +use Symfony\Component\VarExporter\Internal\Registry; + +/** + * A utility class to create objects without calling their constructor. + * + * @author Nicolas Grekas <p@tchwork.com> + */ +final class Instantiator +{ + /** + * Creates an object and sets its properties without calling its constructor nor any other methods. + * + * For example: + * + * // creates an empty instance of Foo + * Instantiator::instantiate(Foo::class); + * + * // creates a Foo instance and sets one of its properties + * Instantiator::instantiate(Foo::class, ['propertyName' => $propertyValue]); + * + * // creates a Foo instance and sets a private property defined on its parent Bar class + * Instantiator::instantiate(Foo::class, [], [ + * Bar::class => ['privateBarProperty' => $propertyValue], + * ]); + * + * Instances of ArrayObject, ArrayIterator and SplObjectStorage can be created + * by using the special "\0" property name to define their internal value: + * + * // creates an SplObjectStorage where $info1 is attached to $obj1, etc. + * Instantiator::instantiate(SplObjectStorage::class, ["\0" => [$obj1, $info1, $obj2, $info2...]]); + * + * // creates an ArrayObject populated with $inputArray + * Instantiator::instantiate(ArrayObject::class, ["\0" => [$inputArray]]); + * + * @param string $class The class of the instance to create + * @param array $properties The properties to set on the instance + * @param array $privateProperties The private properties to set on the instance, + * keyed by their declaring class + * + * @throws ExceptionInterface When the instance cannot be created + */ + public static function instantiate(string $class, array $properties = [], array $privateProperties = []): object + { + $reflector = Registry::$reflectors[$class] ?? Registry::getClassReflector($class); + + if (Registry::$cloneable[$class]) { + $wrappedInstance = [clone Registry::$prototypes[$class]]; + } elseif (Registry::$instantiableWithoutConstructor[$class]) { + $wrappedInstance = [$reflector->newInstanceWithoutConstructor()]; + } elseif (null === Registry::$prototypes[$class]) { + throw new NotInstantiableTypeException($class); + } elseif ($reflector->implementsInterface('Serializable') && !method_exists($class, '__unserialize')) { + $wrappedInstance = [unserialize('C:'.\strlen($class).':"'.$class.'":0:{}')]; + } else { + $wrappedInstance = [unserialize('O:'.\strlen($class).':"'.$class.'":0:{}')]; + } + + if ($properties) { + $privateProperties[$class] = isset($privateProperties[$class]) ? $properties + $privateProperties[$class] : $properties; + } + + foreach ($privateProperties as $class => $properties) { + if (!$properties) { + continue; + } + foreach ($properties as $name => $value) { + // because they're also used for "unserialization", hydrators + // deal with array of instances, so we need to wrap values + $properties[$name] = [$value]; + } + (Hydrator::$hydrators[$class] ?? Hydrator::getHydrator($class))($properties, $wrappedInstance); + } + + return $wrappedInstance[0]; + } +} diff --git a/vendor/symfony/var-exporter/Internal/Exporter.php b/vendor/symfony/var-exporter/Internal/Exporter.php new file mode 100644 index 0000000..f4e5746 --- /dev/null +++ b/vendor/symfony/var-exporter/Internal/Exporter.php @@ -0,0 +1,410 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter\Internal; + +use Symfony\Component\VarExporter\Exception\NotInstantiableTypeException; + +/** + * @author Nicolas Grekas <p@tchwork.com> + * + * @internal + */ +class Exporter +{ + /** + * Prepares an array of values for VarExporter. + * + * For performance this method is public and has no type-hints. + * + * @param array &$values + * @param \SplObjectStorage $objectsPool + * @param array &$refsPool + * @param int &$objectsCount + * @param bool &$valuesAreStatic + * + * @throws NotInstantiableTypeException When a value cannot be serialized + */ + public static function prepare($values, $objectsPool, &$refsPool, &$objectsCount, &$valuesAreStatic): array + { + $refs = $values; + foreach ($values as $k => $value) { + if (\is_resource($value)) { + throw new NotInstantiableTypeException(get_resource_type($value).' resource'); + } + $refs[$k] = $objectsPool; + + if ($isRef = !$valueIsStatic = $values[$k] !== $objectsPool) { + $values[$k] = &$value; // Break hard references to make $values completely + unset($value); // independent from the original structure + $refs[$k] = $value = $values[$k]; + if ($value instanceof Reference && 0 > $value->id) { + $valuesAreStatic = false; + ++$value->count; + continue; + } + $refsPool[] = [&$refs[$k], $value, &$value]; + $refs[$k] = $values[$k] = new Reference(-\count($refsPool), $value); + } + + if (\is_array($value)) { + if ($value) { + $value = self::prepare($value, $objectsPool, $refsPool, $objectsCount, $valueIsStatic); + } + goto handle_value; + } elseif (!\is_object($value) || $value instanceof \UnitEnum) { + goto handle_value; + } + + $valueIsStatic = false; + if (isset($objectsPool[$value])) { + ++$objectsCount; + $value = new Reference($objectsPool[$value][0]); + goto handle_value; + } + + $class = \get_class($value); + $reflector = Registry::$reflectors[$class] ?? Registry::getClassReflector($class); + + if ($reflector->hasMethod('__serialize')) { + if (!$reflector->getMethod('__serialize')->isPublic()) { + throw new \Error(sprintf('Call to %s method "%s::__serialize()".', $reflector->getMethod('__serialize')->isProtected() ? 'protected' : 'private', $class)); + } + + if (!\is_array($properties = $value->__serialize())) { + throw new \TypeError($class.'::__serialize() must return an array'); + } + + goto prepare_value; + } + + $properties = []; + $sleep = null; + $proto = Registry::$prototypes[$class]; + + if (($value instanceof \ArrayIterator || $value instanceof \ArrayObject) && null !== $proto) { + // ArrayIterator and ArrayObject need special care because their "flags" + // option changes the behavior of the (array) casting operator. + [$arrayValue, $properties] = self::getArrayObjectProperties($value, $proto); + + // populates Registry::$prototypes[$class] with a new instance + Registry::getClassReflector($class, Registry::$instantiableWithoutConstructor[$class], Registry::$cloneable[$class]); + } elseif ($value instanceof \SplObjectStorage && Registry::$cloneable[$class] && null !== $proto) { + // By implementing Serializable, SplObjectStorage breaks + // internal references; let's deal with it on our own. + foreach (clone $value as $v) { + $properties[] = $v; + $properties[] = $value[$v]; + } + $properties = ['SplObjectStorage' => ["\0" => $properties]]; + $arrayValue = (array) $value; + } elseif ($value instanceof \Serializable + || $value instanceof \__PHP_Incomplete_Class + || \PHP_VERSION_ID < 80200 && $value instanceof \DatePeriod + ) { + ++$objectsCount; + $objectsPool[$value] = [$id = \count($objectsPool), serialize($value), [], 0]; + $value = new Reference($id); + goto handle_value; + } else { + if (method_exists($class, '__sleep')) { + if (!\is_array($sleep = $value->__sleep())) { + trigger_error('serialize(): __sleep should return an array only containing the names of instance-variables to serialize', \E_USER_NOTICE); + $value = null; + goto handle_value; + } + $sleep = array_flip($sleep); + } + + $arrayValue = (array) $value; + } + + $proto = (array) $proto; + + foreach ($arrayValue as $name => $v) { + $i = 0; + $n = (string) $name; + if ('' === $n || "\0" !== $n[0]) { + $c = \PHP_VERSION_ID >= 80100 && $reflector->hasProperty($n) && ($p = $reflector->getProperty($n))->isReadOnly() ? $p->class : 'stdClass'; + } elseif ('*' === $n[1]) { + $n = substr($n, 3); + $c = $reflector->getProperty($n)->class; + if ('Error' === $c) { + $c = 'TypeError'; + } elseif ('Exception' === $c) { + $c = 'ErrorException'; + } + } else { + $i = strpos($n, "\0", 2); + $c = substr($n, 1, $i - 1); + $n = substr($n, 1 + $i); + } + if (null !== $sleep) { + if (!isset($sleep[$n]) || ($i && $c !== $class)) { + unset($arrayValue[$name]); + continue; + } + $sleep[$n] = false; + } + if (!\array_key_exists($name, $proto) || $proto[$name] !== $v || "\x00Error\x00trace" === $name || "\x00Exception\x00trace" === $name) { + $properties[$c][$n] = $v; + } + } + if ($sleep) { + foreach ($sleep as $n => $v) { + if (false !== $v) { + trigger_error(sprintf('serialize(): "%s" returned as member variable from __sleep() but does not exist', $n), \E_USER_NOTICE); + } + } + } + if (method_exists($class, '__unserialize')) { + $properties = $arrayValue; + } + + prepare_value: + $objectsPool[$value] = [$id = \count($objectsPool)]; + $properties = self::prepare($properties, $objectsPool, $refsPool, $objectsCount, $valueIsStatic); + ++$objectsCount; + $objectsPool[$value] = [$id, $class, $properties, method_exists($class, '__unserialize') ? -$objectsCount : (method_exists($class, '__wakeup') ? $objectsCount : 0)]; + + $value = new Reference($id); + + handle_value: + if ($isRef) { + unset($value); // Break the hard reference created above + } elseif (!$valueIsStatic) { + $values[$k] = $value; + } + $valuesAreStatic = $valueIsStatic && $valuesAreStatic; + } + + return $values; + } + + public static function export($value, string $indent = '') + { + switch (true) { + case \is_int($value) || \is_float($value): return var_export($value, true); + case [] === $value: return '[]'; + case false === $value: return 'false'; + case true === $value: return 'true'; + case null === $value: return 'null'; + case '' === $value: return "''"; + case $value instanceof \UnitEnum: return ltrim(var_export($value, true), '\\'); + } + + if ($value instanceof Reference) { + if (0 <= $value->id) { + return '$o['.$value->id.']'; + } + if (!$value->count) { + return self::export($value->value, $indent); + } + $value = -$value->id; + + return '&$r['.$value.']'; + } + $subIndent = $indent.' '; + + if (\is_string($value)) { + $code = sprintf("'%s'", addcslashes($value, "'\\")); + + $code = preg_replace_callback("/((?:[\\0\\r\\n]|\u{202A}|\u{202B}|\u{202D}|\u{202E}|\u{2066}|\u{2067}|\u{2068}|\u{202C}|\u{2069})++)(.)/", function ($m) use ($subIndent) { + $m[1] = sprintf('\'."%s".\'', str_replace( + ["\0", "\r", "\n", "\u{202A}", "\u{202B}", "\u{202D}", "\u{202E}", "\u{2066}", "\u{2067}", "\u{2068}", "\u{202C}", "\u{2069}", '\n\\'], + ['\0', '\r', '\n', '\u{202A}', '\u{202B}', '\u{202D}', '\u{202E}', '\u{2066}', '\u{2067}', '\u{2068}', '\u{202C}', '\u{2069}', '\n"'."\n".$subIndent.'."\\'], + $m[1] + )); + + if ("'" === $m[2]) { + return substr($m[1], 0, -2); + } + + if ('n".\'' === substr($m[1], -4)) { + return substr_replace($m[1], "\n".$subIndent.".'".$m[2], -2); + } + + return $m[1].$m[2]; + }, $code, -1, $count); + + if ($count && str_starts_with($code, "''.")) { + $code = substr($code, 3); + } + + return $code; + } + + if (\is_array($value)) { + $j = -1; + $code = ''; + foreach ($value as $k => $v) { + $code .= $subIndent; + if (!\is_int($k) || 1 !== $k - $j) { + $code .= self::export($k, $subIndent).' => '; + } + if (\is_int($k) && $k > $j) { + $j = $k; + } + $code .= self::export($v, $subIndent).",\n"; + } + + return "[\n".$code.$indent.']'; + } + + if ($value instanceof Values) { + $code = $subIndent."\$r = [],\n"; + foreach ($value->values as $k => $v) { + $code .= $subIndent.'$r['.$k.'] = '.self::export($v, $subIndent).",\n"; + } + + return "[\n".$code.$indent.']'; + } + + if ($value instanceof Registry) { + return self::exportRegistry($value, $indent, $subIndent); + } + + if ($value instanceof Hydrator) { + return self::exportHydrator($value, $indent, $subIndent); + } + + throw new \UnexpectedValueException(sprintf('Cannot export value of type "%s".', get_debug_type($value))); + } + + private static function exportRegistry(Registry $value, string $indent, string $subIndent): string + { + $code = ''; + $serializables = []; + $seen = []; + $prototypesAccess = 0; + $factoriesAccess = 0; + $r = '\\'.Registry::class; + $j = -1; + + foreach ($value->classes as $k => $class) { + if (':' === ($class[1] ?? null)) { + $serializables[$k] = $class; + continue; + } + if (!Registry::$instantiableWithoutConstructor[$class]) { + if (is_subclass_of($class, 'Serializable') && !method_exists($class, '__unserialize')) { + $serializables[$k] = 'C:'.\strlen($class).':"'.$class.'":0:{}'; + } else { + $serializables[$k] = 'O:'.\strlen($class).':"'.$class.'":0:{}'; + } + if (is_subclass_of($class, 'Throwable')) { + $eol = is_subclass_of($class, 'Error') ? "\0Error\0" : "\0Exception\0"; + $serializables[$k] = substr_replace($serializables[$k], '1:{s:'.(5 + \strlen($eol)).':"'.$eol.'trace";a:0:{}}', -4); + } + continue; + } + $code .= $subIndent.(1 !== $k - $j ? $k.' => ' : ''); + $j = $k; + $eol = ",\n"; + $c = '['.self::export($class).']'; + + if ($seen[$class] ?? false) { + if (Registry::$cloneable[$class]) { + ++$prototypesAccess; + $code .= 'clone $p'.$c; + } else { + ++$factoriesAccess; + $code .= '$f'.$c.'()'; + } + } else { + $seen[$class] = true; + if (Registry::$cloneable[$class]) { + $code .= 'clone ('.($prototypesAccess++ ? '$p' : '($p = &'.$r.'::$prototypes)').$c.' ?? '.$r.'::p'; + } else { + $code .= '('.($factoriesAccess++ ? '$f' : '($f = &'.$r.'::$factories)').$c.' ?? '.$r.'::f'; + $eol = '()'.$eol; + } + $code .= '('.substr($c, 1, -1).'))'; + } + $code .= $eol; + } + + if (1 === $prototypesAccess) { + $code = str_replace('($p = &'.$r.'::$prototypes)', $r.'::$prototypes', $code); + } + if (1 === $factoriesAccess) { + $code = str_replace('($f = &'.$r.'::$factories)', $r.'::$factories', $code); + } + if ('' !== $code) { + $code = "\n".$code.$indent; + } + + if ($serializables) { + $code = $r.'::unserialize(['.$code.'], '.self::export($serializables, $indent).')'; + } else { + $code = '['.$code.']'; + } + + return '$o = '.$code; + } + + private static function exportHydrator(Hydrator $value, string $indent, string $subIndent): string + { + $code = ''; + foreach ($value->properties as $class => $properties) { + $code .= $subIndent.' '.self::export($class).' => '.self::export($properties, $subIndent.' ').",\n"; + } + + $code = [ + self::export($value->registry, $subIndent), + self::export($value->values, $subIndent), + '' !== $code ? "[\n".$code.$subIndent.']' : '[]', + self::export($value->value, $subIndent), + self::export($value->wakeups, $subIndent), + ]; + + return '\\'.\get_class($value)."::hydrate(\n".$subIndent.implode(",\n".$subIndent, $code)."\n".$indent.')'; + } + + /** + * @param \ArrayIterator|\ArrayObject $value + * @param \ArrayIterator|\ArrayObject $proto + */ + private static function getArrayObjectProperties($value, $proto): array + { + $reflector = $value instanceof \ArrayIterator ? 'ArrayIterator' : 'ArrayObject'; + $reflector = Registry::$reflectors[$reflector] ?? Registry::getClassReflector($reflector); + + $properties = [ + $arrayValue = (array) $value, + $reflector->getMethod('getFlags')->invoke($value), + $value instanceof \ArrayObject ? $reflector->getMethod('getIteratorClass')->invoke($value) : 'ArrayIterator', + ]; + + $reflector = $reflector->getMethod('setFlags'); + $reflector->invoke($proto, \ArrayObject::STD_PROP_LIST); + + if ($properties[1] & \ArrayObject::STD_PROP_LIST) { + $reflector->invoke($value, 0); + $properties[0] = (array) $value; + } else { + $reflector->invoke($value, \ArrayObject::STD_PROP_LIST); + $arrayValue = (array) $value; + } + $reflector->invoke($value, $properties[1]); + + if ([[], 0, 'ArrayIterator'] === $properties) { + $properties = []; + } else { + if ('ArrayIterator' === $properties[2]) { + unset($properties[2]); + } + $properties = [$reflector->class => ["\0" => $properties]]; + } + + return [$arrayValue, $properties]; + } +} diff --git a/vendor/symfony/var-exporter/Internal/Hydrator.php b/vendor/symfony/var-exporter/Internal/Hydrator.php new file mode 100644 index 0000000..5ed6bdc --- /dev/null +++ b/vendor/symfony/var-exporter/Internal/Hydrator.php @@ -0,0 +1,152 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter\Internal; + +use Symfony\Component\VarExporter\Exception\ClassNotFoundException; + +/** + * @author Nicolas Grekas <p@tchwork.com> + * + * @internal + */ +class Hydrator +{ + public static $hydrators = []; + + public $registry; + public $values; + public $properties; + public $value; + public $wakeups; + + public function __construct(?Registry $registry, ?Values $values, array $properties, $value, array $wakeups) + { + $this->registry = $registry; + $this->values = $values; + $this->properties = $properties; + $this->value = $value; + $this->wakeups = $wakeups; + } + + public static function hydrate($objects, $values, $properties, $value, $wakeups) + { + foreach ($properties as $class => $vars) { + (self::$hydrators[$class] ?? self::getHydrator($class))($vars, $objects); + } + foreach ($wakeups as $k => $v) { + if (\is_array($v)) { + $objects[-$k]->__unserialize($v); + } else { + $objects[$v]->__wakeup(); + } + } + + return $value; + } + + public static function getHydrator($class) + { + switch ($class) { + case 'stdClass': + return self::$hydrators[$class] = static function ($properties, $objects) { + foreach ($properties as $name => $values) { + foreach ($values as $i => $v) { + $objects[$i]->$name = $v; + } + } + }; + + case 'ErrorException': + return self::$hydrators[$class] = (self::$hydrators['stdClass'] ?? self::getHydrator('stdClass'))->bindTo(null, new class() extends \ErrorException { + }); + + case 'TypeError': + return self::$hydrators[$class] = (self::$hydrators['stdClass'] ?? self::getHydrator('stdClass'))->bindTo(null, new class() extends \Error { + }); + + case 'SplObjectStorage': + return self::$hydrators[$class] = static function ($properties, $objects) { + foreach ($properties as $name => $values) { + if ("\0" === $name) { + foreach ($values as $i => $v) { + for ($j = 0; $j < \count($v); ++$j) { + $objects[$i]->attach($v[$j], $v[++$j]); + } + } + continue; + } + foreach ($values as $i => $v) { + $objects[$i]->$name = $v; + } + } + }; + } + + if (!class_exists($class) && !interface_exists($class, false) && !trait_exists($class, false)) { + throw new ClassNotFoundException($class); + } + $classReflector = new \ReflectionClass($class); + + switch ($class) { + case 'ArrayIterator': + case 'ArrayObject': + $constructor = \Closure::fromCallable([$classReflector->getConstructor(), 'invokeArgs']); + + return self::$hydrators[$class] = static function ($properties, $objects) use ($constructor) { + foreach ($properties as $name => $values) { + if ("\0" !== $name) { + foreach ($values as $i => $v) { + $objects[$i]->$name = $v; + } + } + } + foreach ($properties["\0"] ?? [] as $i => $v) { + $constructor($objects[$i], $v); + } + }; + } + + if (!$classReflector->isInternal()) { + return self::$hydrators[$class] = (self::$hydrators['stdClass'] ?? self::getHydrator('stdClass'))->bindTo(null, $class); + } + + if ($classReflector->name !== $class) { + return self::$hydrators[$classReflector->name] ?? self::getHydrator($classReflector->name); + } + + $propertySetters = []; + foreach ($classReflector->getProperties() as $propertyReflector) { + if (!$propertyReflector->isStatic()) { + $propertyReflector->setAccessible(true); + $propertySetters[$propertyReflector->name] = \Closure::fromCallable([$propertyReflector, 'setValue']); + } + } + + if (!$propertySetters) { + return self::$hydrators[$class] = self::$hydrators['stdClass'] ?? self::getHydrator('stdClass'); + } + + return self::$hydrators[$class] = static function ($properties, $objects) use ($propertySetters) { + foreach ($properties as $name => $values) { + if ($setValue = $propertySetters[$name] ?? null) { + foreach ($values as $i => $v) { + $setValue($objects[$i], $v); + } + continue; + } + foreach ($values as $i => $v) { + $objects[$i]->$name = $v; + } + } + }; + } +} diff --git a/vendor/symfony/var-exporter/Internal/Reference.php b/vendor/symfony/var-exporter/Internal/Reference.php new file mode 100644 index 0000000..e371c07 --- /dev/null +++ b/vendor/symfony/var-exporter/Internal/Reference.php @@ -0,0 +1,30 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter\Internal; + +/** + * @author Nicolas Grekas <p@tchwork.com> + * + * @internal + */ +class Reference +{ + public $id; + public $value; + public $count = 0; + + public function __construct(int $id, $value = null) + { + $this->id = $id; + $this->value = $value; + } +} diff --git a/vendor/symfony/var-exporter/Internal/Registry.php b/vendor/symfony/var-exporter/Internal/Registry.php new file mode 100644 index 0000000..a9fb061 --- /dev/null +++ b/vendor/symfony/var-exporter/Internal/Registry.php @@ -0,0 +1,146 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter\Internal; + +use Symfony\Component\VarExporter\Exception\ClassNotFoundException; +use Symfony\Component\VarExporter\Exception\NotInstantiableTypeException; + +/** + * @author Nicolas Grekas <p@tchwork.com> + * + * @internal + */ +class Registry +{ + public static $reflectors = []; + public static $prototypes = []; + public static $factories = []; + public static $cloneable = []; + public static $instantiableWithoutConstructor = []; + + public $classes = []; + + public function __construct(array $classes) + { + $this->classes = $classes; + } + + public static function unserialize($objects, $serializables) + { + $unserializeCallback = ini_set('unserialize_callback_func', __CLASS__.'::getClassReflector'); + + try { + foreach ($serializables as $k => $v) { + $objects[$k] = unserialize($v); + } + } finally { + ini_set('unserialize_callback_func', $unserializeCallback); + } + + return $objects; + } + + public static function p($class) + { + self::getClassReflector($class, true, true); + + return self::$prototypes[$class]; + } + + public static function f($class) + { + $reflector = self::$reflectors[$class] ?? self::getClassReflector($class, true, false); + + return self::$factories[$class] = \Closure::fromCallable([$reflector, 'newInstanceWithoutConstructor']); + } + + public static function getClassReflector($class, $instantiableWithoutConstructor = false, $cloneable = null) + { + if (!($isClass = class_exists($class)) && !interface_exists($class, false) && !trait_exists($class, false)) { + throw new ClassNotFoundException($class); + } + $reflector = new \ReflectionClass($class); + + if ($instantiableWithoutConstructor) { + $proto = $reflector->newInstanceWithoutConstructor(); + } elseif (!$isClass || $reflector->isAbstract()) { + throw new NotInstantiableTypeException($class); + } elseif ($reflector->name !== $class) { + $reflector = self::$reflectors[$name = $reflector->name] ?? self::getClassReflector($name, false, $cloneable); + self::$cloneable[$class] = self::$cloneable[$name]; + self::$instantiableWithoutConstructor[$class] = self::$instantiableWithoutConstructor[$name]; + self::$prototypes[$class] = self::$prototypes[$name]; + + return self::$reflectors[$class] = $reflector; + } else { + try { + $proto = $reflector->newInstanceWithoutConstructor(); + $instantiableWithoutConstructor = true; + } catch (\ReflectionException $e) { + $proto = $reflector->implementsInterface('Serializable') && !method_exists($class, '__unserialize') ? 'C:' : 'O:'; + if ('C:' === $proto && !$reflector->getMethod('unserialize')->isInternal()) { + $proto = null; + } else { + try { + $proto = @unserialize($proto.\strlen($class).':"'.$class.'":0:{}'); + } catch (\Exception $e) { + if (__FILE__ !== $e->getFile()) { + throw $e; + } + throw new NotInstantiableTypeException($class, $e); + } + if (false === $proto) { + throw new NotInstantiableTypeException($class); + } + } + } + if (null !== $proto && !$proto instanceof \Throwable && !$proto instanceof \Serializable && !method_exists($class, '__sleep') && !method_exists($class, '__serialize')) { + try { + serialize($proto); + } catch (\Exception $e) { + throw new NotInstantiableTypeException($class, $e); + } + } + } + + if (null === $cloneable) { + if (($proto instanceof \Reflector || $proto instanceof \ReflectionGenerator || $proto instanceof \ReflectionType || $proto instanceof \IteratorIterator || $proto instanceof \RecursiveIteratorIterator) && (!$proto instanceof \Serializable && !method_exists($proto, '__wakeup') && !method_exists($class, '__unserialize'))) { + throw new NotInstantiableTypeException($class); + } + + $cloneable = $reflector->isCloneable() && !$reflector->hasMethod('__clone'); + } + + self::$cloneable[$class] = $cloneable; + self::$instantiableWithoutConstructor[$class] = $instantiableWithoutConstructor; + self::$prototypes[$class] = $proto; + + if ($proto instanceof \Throwable) { + static $setTrace; + + if (null === $setTrace) { + $setTrace = [ + new \ReflectionProperty(\Error::class, 'trace'), + new \ReflectionProperty(\Exception::class, 'trace'), + ]; + $setTrace[0]->setAccessible(true); + $setTrace[1]->setAccessible(true); + $setTrace[0] = \Closure::fromCallable([$setTrace[0], 'setValue']); + $setTrace[1] = \Closure::fromCallable([$setTrace[1], 'setValue']); + } + + $setTrace[$proto instanceof \Exception]($proto, []); + } + + return self::$reflectors[$class] = $reflector; + } +} diff --git a/vendor/symfony/var-exporter/Internal/Values.php b/vendor/symfony/var-exporter/Internal/Values.php new file mode 100644 index 0000000..21ae04e --- /dev/null +++ b/vendor/symfony/var-exporter/Internal/Values.php @@ -0,0 +1,27 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter\Internal; + +/** + * @author Nicolas Grekas <p@tchwork.com> + * + * @internal + */ +class Values +{ + public $values; + + public function __construct(array $values) + { + $this->values = $values; + } +} diff --git a/vendor/symfony/var-exporter/LICENSE b/vendor/symfony/var-exporter/LICENSE new file mode 100644 index 0000000..74cdc2d --- /dev/null +++ b/vendor/symfony/var-exporter/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-2022 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/vendor/symfony/var-exporter/README.md b/vendor/symfony/var-exporter/README.md new file mode 100644 index 0000000..a34e4c2 --- /dev/null +++ b/vendor/symfony/var-exporter/README.md @@ -0,0 +1,38 @@ +VarExporter Component +===================== + +The VarExporter component allows exporting any serializable PHP data structure to +plain PHP code. While doing so, it preserves all the semantics associated with +the serialization mechanism of PHP (`__wakeup`, `__sleep`, `Serializable`, +`__serialize`, `__unserialize`). + +It also provides an instantiator that allows creating and populating objects +without calling their constructor nor any other methods. + +The reason to use this component *vs* `serialize()` or +[igbinary](https://github.com/igbinary/igbinary) is performance: thanks to +OPcache, the resulting code is significantly faster and more memory efficient +than using `unserialize()` or `igbinary_unserialize()`. + +Unlike `var_export()`, this works on any serializable PHP value. + +It also provides a few improvements over `var_export()`/`serialize()`: + + * the output is PSR-2 compatible; + * the output can be re-indented without messing up with `\r` or `\n` in the data + * missing classes throw a `ClassNotFoundException` instead of being unserialized to + `PHP_Incomplete_Class` objects; + * references involving `SplObjectStorage`, `ArrayObject` or `ArrayIterator` + instances are preserved; + * `Reflection*`, `IteratorIterator` and `RecursiveIteratorIterator` classes + throw an exception when being serialized (their unserialized version is broken + anyway, see https://bugs.php.net/76737). + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/var_exporter.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/var-exporter/VarExporter.php b/vendor/symfony/var-exporter/VarExporter.php new file mode 100644 index 0000000..3e2a4cc --- /dev/null +++ b/vendor/symfony/var-exporter/VarExporter.php @@ -0,0 +1,114 @@ +<?php + +/* + * This file is part of the Symfony package. + * + * (c) Fabien Potencier <fabien@symfony.com> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarExporter; + +use Symfony\Component\VarExporter\Exception\ExceptionInterface; +use Symfony\Component\VarExporter\Internal\Exporter; +use Symfony\Component\VarExporter\Internal\Hydrator; +use Symfony\Component\VarExporter\Internal\Registry; +use Symfony\Component\VarExporter\Internal\Values; + +/** + * Exports serializable PHP values to PHP code. + * + * VarExporter allows serializing PHP data structures to plain PHP code (like var_export()) + * while preserving all the semantics associated with serialize() (unlike var_export()). + * + * By leveraging OPcache, the generated PHP code is faster than doing the same with unserialize(). + * + * @author Nicolas Grekas <p@tchwork.com> + */ +final class VarExporter +{ + /** + * Exports a serializable PHP value to PHP code. + * + * @param bool &$isStaticValue Set to true after execution if the provided value is static, false otherwise + * @param bool &$classes Classes found in the value are added to this list as both keys and values + * + * @throws ExceptionInterface When the provided value cannot be serialized + */ + public static function export(mixed $value, bool &$isStaticValue = null, array &$foundClasses = []): string + { + $isStaticValue = true; + + if (!\is_object($value) && !(\is_array($value) && $value) && !\is_resource($value) || $value instanceof \UnitEnum) { + return Exporter::export($value); + } + + $objectsPool = new \SplObjectStorage(); + $refsPool = []; + $objectsCount = 0; + + try { + $value = Exporter::prepare([$value], $objectsPool, $refsPool, $objectsCount, $isStaticValue)[0]; + } finally { + $references = []; + foreach ($refsPool as $i => $v) { + if ($v[0]->count) { + $references[1 + $i] = $v[2]; + } + $v[0] = $v[1]; + } + } + + if ($isStaticValue) { + return Exporter::export($value); + } + + $classes = []; + $values = []; + $states = []; + foreach ($objectsPool as $i => $v) { + [, $class, $values[], $wakeup] = $objectsPool[$v]; + $foundClasses[$class] = $classes[] = $class; + + if (0 < $wakeup) { + $states[$wakeup] = $i; + } elseif (0 > $wakeup) { + $states[-$wakeup] = [$i, array_pop($values)]; + $values[] = []; + } + } + ksort($states); + + $wakeups = [null]; + foreach ($states as $k => $v) { + if (\is_array($v)) { + $wakeups[-$v[0]] = $v[1]; + } else { + $wakeups[] = $v; + } + } + + if (null === $wakeups[0]) { + unset($wakeups[0]); + } + + $properties = []; + foreach ($values as $i => $vars) { + foreach ($vars as $class => $values) { + foreach ($values as $name => $v) { + $properties[$class][$name][$i] = $v; + } + } + } + + if ($classes || $references) { + $value = new Hydrator(new Registry($classes), $references ? new Values($references) : null, $properties, $value, $wakeups); + } else { + $isStaticValue = true; + } + + return Exporter::export($value); + } +} diff --git a/vendor/symfony/var-exporter/composer.json b/vendor/symfony/var-exporter/composer.json new file mode 100644 index 0000000..3bf21a6 --- /dev/null +++ b/vendor/symfony/var-exporter/composer.json @@ -0,0 +1,31 @@ +{ + "name": "symfony/var-exporter", + "type": "library", + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "keywords": ["export", "serialize", "instantiate", "hydrate", "construct", "clone"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=8.0.2" + }, + "require-dev": { + "symfony/var-dumper": "^5.4|^6.0" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\VarExporter\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "minimum-stability": "dev" +} diff --git a/vendor/vlucas/phpdotenv/LICENSE b/vendor/vlucas/phpdotenv/LICENSE new file mode 100644 index 0000000..922c552 --- /dev/null +++ b/vendor/vlucas/phpdotenv/LICENSE @@ -0,0 +1,30 @@ +BSD 3-Clause License + +Copyright (c) 2014, Graham Campbell. +Copyright (c) 2013, Vance Lucas. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. 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. + +3. Neither the name of the copyright holder 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 HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/vlucas/phpdotenv/composer.json b/vendor/vlucas/phpdotenv/composer.json new file mode 100644 index 0000000..74800f8 --- /dev/null +++ b/vendor/vlucas/phpdotenv/composer.json @@ -0,0 +1,53 @@ +{ + "name": "vlucas/phpdotenv", + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": ["env", "dotenv", "environment"], + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "require": { + "php": "^7.1.3 || ^8.0", + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" + }, + "require-dev": { + "ext-filter": "*", + "bamarni/composer-bin-plugin": "^1.4.1", + "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10" + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Dotenv\\Tests\\": "tests/Dotenv/" + } + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "config": { + "preferred-install": "dist" + }, + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + } +} diff --git a/vendor/vlucas/phpdotenv/src/Dotenv.php b/vendor/vlucas/phpdotenv/src/Dotenv.php new file mode 100644 index 0000000..0460ced --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Dotenv.php @@ -0,0 +1,267 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv; + +use Dotenv\Exception\InvalidPathException; +use Dotenv\Loader\Loader; +use Dotenv\Loader\LoaderInterface; +use Dotenv\Parser\Parser; +use Dotenv\Parser\ParserInterface; +use Dotenv\Repository\Adapter\ArrayAdapter; +use Dotenv\Repository\Adapter\PutenvAdapter; +use Dotenv\Repository\RepositoryBuilder; +use Dotenv\Repository\RepositoryInterface; +use Dotenv\Store\StoreBuilder; +use Dotenv\Store\StoreInterface; +use Dotenv\Store\StringStore; + +class Dotenv +{ + /** + * The store instance. + * + * @var \Dotenv\Store\StoreInterface + */ + private $store; + + /** + * The parser instance. + * + * @var \Dotenv\Parser\ParserInterface + */ + private $parser; + + /** + * The loader instance. + * + * @var \Dotenv\Loader\LoaderInterface + */ + private $loader; + + /** + * The repository instance. + * + * @var \Dotenv\Repository\RepositoryInterface + */ + private $repository; + + /** + * Create a new dotenv instance. + * + * @param \Dotenv\Store\StoreInterface $store + * @param \Dotenv\Parser\ParserInterface $parser + * @param \Dotenv\Loader\LoaderInterface $loader + * @param \Dotenv\Repository\RepositoryInterface $repository + * + * @return void + */ + public function __construct( + StoreInterface $store, + ParserInterface $parser, + LoaderInterface $loader, + RepositoryInterface $repository + ) { + $this->store = $store; + $this->parser = $parser; + $this->loader = $loader; + $this->repository = $repository; + } + + /** + * Create a new dotenv instance. + * + * @param \Dotenv\Repository\RepositoryInterface $repository + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function create(RepositoryInterface $repository, $paths, $names = null, bool $shortCircuit = true, string $fileEncoding = null) + { + $builder = $names === null ? StoreBuilder::createWithDefaultName() : StoreBuilder::createWithNoNames(); + + foreach ((array) $paths as $path) { + $builder = $builder->addPath($path); + } + + foreach ((array) $names as $name) { + $builder = $builder->addName($name); + } + + if ($shortCircuit) { + $builder = $builder->shortCircuit(); + } + + return new self($builder->fileEncoding($fileEncoding)->make(), new Parser(), new Loader(), $repository); + } + + /** + * Create a new mutable dotenv instance with default repository. + * + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function createMutable($paths, $names = null, bool $shortCircuit = true, string $fileEncoding = null) + { + $repository = RepositoryBuilder::createWithDefaultAdapters()->make(); + + return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding); + } + + /** + * Create a new mutable dotenv instance with default repository with the putenv adapter. + * + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function createUnsafeMutable($paths, $names = null, bool $shortCircuit = true, string $fileEncoding = null) + { + $repository = RepositoryBuilder::createWithDefaultAdapters() + ->addAdapter(PutenvAdapter::class) + ->make(); + + return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding); + } + + /** + * Create a new immutable dotenv instance with default repository. + * + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function createImmutable($paths, $names = null, bool $shortCircuit = true, string $fileEncoding = null) + { + $repository = RepositoryBuilder::createWithDefaultAdapters()->immutable()->make(); + + return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding); + } + + /** + * Create a new immutable dotenv instance with default repository with the putenv adapter. + * + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function createUnsafeImmutable($paths, $names = null, bool $shortCircuit = true, string $fileEncoding = null) + { + $repository = RepositoryBuilder::createWithDefaultAdapters() + ->addAdapter(PutenvAdapter::class) + ->immutable() + ->make(); + + return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding); + } + + /** + * Create a new dotenv instance with an array backed repository. + * + * @param string|string[] $paths + * @param string|string[]|null $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return \Dotenv\Dotenv + */ + public static function createArrayBacked($paths, $names = null, bool $shortCircuit = true, string $fileEncoding = null) + { + $repository = RepositoryBuilder::createWithNoAdapters()->addAdapter(ArrayAdapter::class)->make(); + + return self::create($repository, $paths, $names, $shortCircuit, $fileEncoding); + } + + /** + * Parse the given content and resolve nested variables. + * + * This method behaves just like load(), only without mutating your actual + * environment. We do this by using an array backed repository. + * + * @param string $content + * + * @throws \Dotenv\Exception\InvalidFileException + * + * @return array<string,string|null> + */ + public static function parse(string $content) + { + $repository = RepositoryBuilder::createWithNoAdapters()->addAdapter(ArrayAdapter::class)->make(); + + $phpdotenv = new self(new StringStore($content), new Parser(), new Loader(), $repository); + + return $phpdotenv->load(); + } + + /** + * Read and load environment file(s). + * + * @throws \Dotenv\Exception\InvalidPathException|\Dotenv\Exception\InvalidEncodingException|\Dotenv\Exception\InvalidFileException + * + * @return array<string,string|null> + */ + public function load() + { + $entries = $this->parser->parse($this->store->read()); + + return $this->loader->load($this->repository, $entries); + } + + /** + * Read and load environment file(s), silently failing if no files can be read. + * + * @throws \Dotenv\Exception\InvalidEncodingException|\Dotenv\Exception\InvalidFileException + * + * @return array<string,string|null> + */ + public function safeLoad() + { + try { + return $this->load(); + } catch (InvalidPathException $e) { + // suppressing exception + return []; + } + } + + /** + * Required ensures that the specified variables exist, and returns a new validator object. + * + * @param string|string[] $variables + * + * @return \Dotenv\Validator + */ + public function required($variables) + { + return (new Validator($this->repository, (array) $variables))->required(); + } + + /** + * Returns a new validator object that won't check if the specified variables exist. + * + * @param string|string[] $variables + * + * @return \Dotenv\Validator + */ + public function ifPresent($variables) + { + return new Validator($this->repository, (array) $variables); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php b/vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php new file mode 100644 index 0000000..1e80f53 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php @@ -0,0 +1,12 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Exception; + +use Throwable; + +interface ExceptionInterface extends Throwable +{ + // +} diff --git a/vendor/vlucas/phpdotenv/src/Exception/InvalidEncodingException.php b/vendor/vlucas/phpdotenv/src/Exception/InvalidEncodingException.php new file mode 100644 index 0000000..f02f8e4 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Exception/InvalidEncodingException.php @@ -0,0 +1,12 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Exception; + +use InvalidArgumentException; + +final class InvalidEncodingException extends InvalidArgumentException implements ExceptionInterface +{ + // +} diff --git a/vendor/vlucas/phpdotenv/src/Exception/InvalidFileException.php b/vendor/vlucas/phpdotenv/src/Exception/InvalidFileException.php new file mode 100644 index 0000000..6e878a5 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Exception/InvalidFileException.php @@ -0,0 +1,12 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Exception; + +use InvalidArgumentException; + +final class InvalidFileException extends InvalidArgumentException implements ExceptionInterface +{ + // +} diff --git a/vendor/vlucas/phpdotenv/src/Exception/InvalidPathException.php b/vendor/vlucas/phpdotenv/src/Exception/InvalidPathException.php new file mode 100644 index 0000000..ee836a7 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Exception/InvalidPathException.php @@ -0,0 +1,12 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Exception; + +use InvalidArgumentException; + +final class InvalidPathException extends InvalidArgumentException implements ExceptionInterface +{ + // +} diff --git a/vendor/vlucas/phpdotenv/src/Exception/ValidationException.php b/vendor/vlucas/phpdotenv/src/Exception/ValidationException.php new file mode 100644 index 0000000..3d6773a --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Exception/ValidationException.php @@ -0,0 +1,12 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Exception; + +use RuntimeException; + +final class ValidationException extends RuntimeException implements ExceptionInterface +{ + // +} diff --git a/vendor/vlucas/phpdotenv/src/Loader/Loader.php b/vendor/vlucas/phpdotenv/src/Loader/Loader.php new file mode 100644 index 0000000..d8e194c --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Loader/Loader.php @@ -0,0 +1,47 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Loader; + +use Dotenv\Parser\Entry; +use Dotenv\Parser\Value; +use Dotenv\Repository\RepositoryInterface; + +final class Loader implements LoaderInterface +{ + /** + * Load the given entries into the repository. + * + * We'll substitute any nested variables, and send each variable to the + * repository, with the effect of actually mutating the environment. + * + * @param \Dotenv\Repository\RepositoryInterface $repository + * @param \Dotenv\Parser\Entry[] $entries + * + * @return array<string,string|null> + */ + public function load(RepositoryInterface $repository, array $entries) + { + return \array_reduce($entries, static function (array $vars, Entry $entry) use ($repository) { + $name = $entry->getName(); + + $value = $entry->getValue()->map(static function (Value $value) use ($repository) { + return Resolver::resolve($repository, $value); + }); + + if ($value->isDefined()) { + $inner = $value->get(); + if ($repository->set($name, $inner)) { + return \array_merge($vars, [$name => $inner]); + } + } else { + if ($repository->clear($name)) { + return \array_merge($vars, [$name => null]); + } + } + + return $vars; + }, []); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Loader/LoaderInterface.php b/vendor/vlucas/phpdotenv/src/Loader/LoaderInterface.php new file mode 100644 index 0000000..275d98e --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Loader/LoaderInterface.php @@ -0,0 +1,20 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Loader; + +use Dotenv\Repository\RepositoryInterface; + +interface LoaderInterface +{ + /** + * Load the given entries into the repository. + * + * @param \Dotenv\Repository\RepositoryInterface $repository + * @param \Dotenv\Parser\Entry[] $entries + * + * @return array<string,string|null> + */ + public function load(RepositoryInterface $repository, array $entries); +} diff --git a/vendor/vlucas/phpdotenv/src/Loader/Resolver.php b/vendor/vlucas/phpdotenv/src/Loader/Resolver.php new file mode 100644 index 0000000..36d7a4b --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Loader/Resolver.php @@ -0,0 +1,65 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Loader; + +use Dotenv\Parser\Value; +use Dotenv\Repository\RepositoryInterface; +use Dotenv\Util\Regex; +use Dotenv\Util\Str; +use PhpOption\Option; + +final class Resolver +{ + /** + * This class is a singleton. + * + * @codeCoverageIgnore + * + * @return void + */ + private function __construct() + { + // + } + + /** + * Resolve the nested variables in the given value. + * + * Replaces ${varname} patterns in the allowed positions in the variable + * value by an existing environment variable. + * + * @param \Dotenv\Repository\RepositoryInterface $repository + * @param \Dotenv\Parser\Value $value + * + * @return string + */ + public static function resolve(RepositoryInterface $repository, Value $value) + { + return \array_reduce($value->getVars(), static function (string $s, int $i) use ($repository) { + return Str::substr($s, 0, $i).self::resolveVariable($repository, Str::substr($s, $i)); + }, $value->getChars()); + } + + /** + * Resolve a single nested variable. + * + * @param \Dotenv\Repository\RepositoryInterface $repository + * @param string $str + * + * @return string + */ + private static function resolveVariable(RepositoryInterface $repository, string $str) + { + return Regex::replaceCallback( + '/\A\${([a-zA-Z0-9_.]+)}/', + static function (array $matches) use ($repository) { + return Option::fromValue($repository->get($matches[1])) + ->getOrElse($matches[0]); + }, + $str, + 1 + )->success()->getOrElse($str); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Parser/Entry.php b/vendor/vlucas/phpdotenv/src/Parser/Entry.php new file mode 100644 index 0000000..7570f58 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Parser/Entry.php @@ -0,0 +1,59 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Parser; + +use PhpOption\Option; + +final class Entry +{ + /** + * The entry name. + * + * @var string + */ + private $name; + + /** + * The entry value. + * + * @var \Dotenv\Parser\Value|null + */ + private $value; + + /** + * Create a new entry instance. + * + * @param string $name + * @param \Dotenv\Parser\Value|null $value + * + * @return void + */ + public function __construct(string $name, Value $value = null) + { + $this->name = $name; + $this->value = $value; + } + + /** + * Get the entry name. + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Get the entry value. + * + * @return \PhpOption\Option<\Dotenv\Parser\Value> + */ + public function getValue() + { + /** @var \PhpOption\Option<\Dotenv\Parser\Value> */ + return Option::fromValue($this->value); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Parser/EntryParser.php b/vendor/vlucas/phpdotenv/src/Parser/EntryParser.php new file mode 100644 index 0000000..5cfa3ee --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Parser/EntryParser.php @@ -0,0 +1,293 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Parser; + +use Dotenv\Util\Regex; +use Dotenv\Util\Str; +use GrahamCampbell\ResultType\Error; +use GrahamCampbell\ResultType\Result; +use GrahamCampbell\ResultType\Success; + +final class EntryParser +{ + private const INITIAL_STATE = 0; + private const UNQUOTED_STATE = 1; + private const SINGLE_QUOTED_STATE = 2; + private const DOUBLE_QUOTED_STATE = 3; + private const ESCAPE_SEQUENCE_STATE = 4; + private const WHITESPACE_STATE = 5; + private const COMMENT_STATE = 6; + private const REJECT_STATES = [self::SINGLE_QUOTED_STATE, self::DOUBLE_QUOTED_STATE, self::ESCAPE_SEQUENCE_STATE]; + + /** + * This class is a singleton. + * + * @codeCoverageIgnore + * + * @return void + */ + private function __construct() + { + // + } + + /** + * Parse a raw entry into a proper entry. + * + * That is, turn a raw environment variable entry into a name and possibly + * a value. We wrap the answer in a result type. + * + * @param string $entry + * + * @return \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Entry,string> + */ + public static function parse(string $entry) + { + return self::splitStringIntoParts($entry)->flatMap(static function (array $parts) { + [$name, $value] = $parts; + + return self::parseName($name)->flatMap(static function (string $name) use ($value) { + /** @var Result<Value|null,string> */ + $parsedValue = $value === null ? Success::create(null) : self::parseValue($value); + + return $parsedValue->map(static function (?Value $value) use ($name) { + return new Entry($name, $value); + }); + }); + }); + } + + /** + * Split the compound string into parts. + * + * @param string $line + * + * @return \GrahamCampbell\ResultType\Result<array{string,string|null},string> + */ + private static function splitStringIntoParts(string $line) + { + /** @var array{string,string|null} */ + $result = Str::pos($line, '=')->map(static function () use ($line) { + return \array_map('trim', \explode('=', $line, 2)); + })->getOrElse([$line, null]); + + if ($result[0] === '') { + return Error::create(self::getErrorMessage('an unexpected equals', $line)); + } + + /** @var \GrahamCampbell\ResultType\Result<array{string,string|null},string> */ + return Success::create($result); + } + + /** + * Parse the given variable name. + * + * That is, strip the optional quotes and leading "export" from the + * variable name. We wrap the answer in a result type. + * + * @param string $name + * + * @return \GrahamCampbell\ResultType\Result<string,string> + */ + private static function parseName(string $name) + { + if (Str::len($name) > 8 && Str::substr($name, 0, 6) === 'export' && \ctype_space(Str::substr($name, 6, 1))) { + $name = \ltrim(Str::substr($name, 6)); + } + + if (self::isQuotedName($name)) { + $name = Str::substr($name, 1, -1); + } + + if (!self::isValidName($name)) { + return Error::create(self::getErrorMessage('an invalid name', $name)); + } + + return Success::create($name); + } + + /** + * Is the given variable name quoted? + * + * @param string $name + * + * @return bool + */ + private static function isQuotedName(string $name) + { + if (Str::len($name) < 3) { + return false; + } + + $first = Str::substr($name, 0, 1); + $last = Str::substr($name, -1, 1); + + return ($first === '"' && $last === '"') || ($first === '\'' && $last === '\''); + } + + /** + * Is the given variable name valid? + * + * @param string $name + * + * @return bool + */ + private static function isValidName(string $name) + { + return Regex::matches('~\A[a-zA-Z0-9_.]+\z~', $name)->success()->getOrElse(false); + } + + /** + * Parse the given variable value. + * + * This has the effect of stripping quotes and comments, dealing with + * special characters, and locating nested variables, but not resolving + * them. Formally, we run a finite state automaton with an output tape: a + * transducer. We wrap the answer in a result type. + * + * @param string $value + * + * @return \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Value,string> + */ + private static function parseValue(string $value) + { + if (\trim($value) === '') { + return Success::create(Value::blank()); + } + + return \array_reduce(\iterator_to_array(Lexer::lex($value)), static function (Result $data, string $token) { + return $data->flatMap(static function (array $data) use ($token) { + return self::processToken($data[1], $token)->map(static function (array $val) use ($data) { + return [$data[0]->append($val[0], $val[1]), $val[2]]; + }); + }); + }, Success::create([Value::blank(), self::INITIAL_STATE]))->flatMap(static function (array $result) { + if (in_array($result[1], self::REJECT_STATES, true)) { + return Error::create('a missing closing quote'); + } + + return Success::create($result[0]); + })->mapError(static function (string $err) use ($value) { + return self::getErrorMessage($err, $value); + }); + } + + /** + * Process the given token. + * + * @param int $state + * @param string $token + * + * @return \GrahamCampbell\ResultType\Result<array{string,bool,int},string> + */ + private static function processToken(int $state, string $token) + { + switch ($state) { + case self::INITIAL_STATE: + if ($token === '\'') { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create(['', false, self::SINGLE_QUOTED_STATE]); + } elseif ($token === '"') { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create(['', false, self::DOUBLE_QUOTED_STATE]); + } elseif ($token === '#') { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create(['', false, self::COMMENT_STATE]); + } elseif ($token === '$') { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create([$token, true, self::UNQUOTED_STATE]); + } else { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create([$token, false, self::UNQUOTED_STATE]); + } + case self::UNQUOTED_STATE: + if ($token === '#') { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create(['', false, self::COMMENT_STATE]); + } elseif (\ctype_space($token)) { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create(['', false, self::WHITESPACE_STATE]); + } elseif ($token === '$') { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create([$token, true, self::UNQUOTED_STATE]); + } else { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create([$token, false, self::UNQUOTED_STATE]); + } + case self::SINGLE_QUOTED_STATE: + if ($token === '\'') { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create(['', false, self::WHITESPACE_STATE]); + } else { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create([$token, false, self::SINGLE_QUOTED_STATE]); + } + case self::DOUBLE_QUOTED_STATE: + if ($token === '"') { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create(['', false, self::WHITESPACE_STATE]); + } elseif ($token === '\\') { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create(['', false, self::ESCAPE_SEQUENCE_STATE]); + } elseif ($token === '$') { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create([$token, true, self::DOUBLE_QUOTED_STATE]); + } else { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create([$token, false, self::DOUBLE_QUOTED_STATE]); + } + case self::ESCAPE_SEQUENCE_STATE: + if ($token === '"' || $token === '\\') { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create([$token, false, self::DOUBLE_QUOTED_STATE]); + } elseif ($token === '$') { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create([$token, false, self::DOUBLE_QUOTED_STATE]); + } else { + $first = Str::substr($token, 0, 1); + if (\in_array($first, ['f', 'n', 'r', 't', 'v'], true)) { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create([\stripcslashes('\\'.$first).Str::substr($token, 1), false, self::DOUBLE_QUOTED_STATE]); + } else { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Error::create('an unexpected escape sequence'); + } + } + case self::WHITESPACE_STATE: + if ($token === '#') { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create(['', false, self::COMMENT_STATE]); + } elseif (!\ctype_space($token)) { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Error::create('unexpected whitespace'); + } else { + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create(['', false, self::WHITESPACE_STATE]); + } + case self::COMMENT_STATE: + /** @var \GrahamCampbell\ResultType\Result<array{string,bool,int},string> */ + return Success::create(['', false, self::COMMENT_STATE]); + default: + throw new \Error('Parser entered invalid state.'); + } + } + + /** + * Generate a friendly error message. + * + * @param string $cause + * @param string $subject + * + * @return string + */ + private static function getErrorMessage(string $cause, string $subject) + { + return \sprintf( + 'Encountered %s at [%s].', + $cause, + \strtok($subject, "\n") + ); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Parser/Lexer.php b/vendor/vlucas/phpdotenv/src/Parser/Lexer.php new file mode 100644 index 0000000..981af24 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Parser/Lexer.php @@ -0,0 +1,58 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Parser; + +final class Lexer +{ + /** + * The regex for each type of token. + */ + private const PATTERNS = [ + '[\r\n]{1,1000}', '[^\S\r\n]{1,1000}', '\\\\', '\'', '"', '\\#', '\\$', '([^(\s\\\\\'"\\#\\$)]|\\(|\\)){1,1000}', + ]; + + /** + * This class is a singleton. + * + * @codeCoverageIgnore + * + * @return void + */ + private function __construct() + { + // + } + + /** + * Convert content into a token stream. + * + * Multibyte string processing is not needed here, and nether is error + * handling, for performance reasons. + * + * @param string $content + * + * @return \Generator<string> + */ + public static function lex(string $content) + { + static $regex; + + if ($regex === null) { + $regex = '(('.\implode(')|(', self::PATTERNS).'))A'; + } + + $offset = 0; + + while (isset($content[$offset])) { + if (!\preg_match($regex, $content, $matches, 0, $offset)) { + throw new \Error(\sprintf('Lexer encountered unexpected character [%s].', $content[$offset])); + } + + $offset += \strlen($matches[0]); + + yield $matches[0]; + } + } +} diff --git a/vendor/vlucas/phpdotenv/src/Parser/Lines.php b/vendor/vlucas/phpdotenv/src/Parser/Lines.php new file mode 100644 index 0000000..3839794 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Parser/Lines.php @@ -0,0 +1,125 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Parser; + +use Dotenv\Util\Regex; +use Dotenv\Util\Str; + +final class Lines +{ + /** + * This class is a singleton. + * + * @codeCoverageIgnore + * + * @return void + */ + private function __construct() + { + // + } + + /** + * Process the array of lines of environment variables. + * + * This will produce an array of raw entries, one per variable. + * + * @param string[] $lines + * + * @return string[] + */ + public static function process(array $lines) + { + $output = []; + $multiline = false; + $multilineBuffer = []; + + foreach ($lines as $line) { + [$multiline, $line, $multilineBuffer] = self::multilineProcess($multiline, $line, $multilineBuffer); + + if (!$multiline && !self::isCommentOrWhitespace($line)) { + $output[] = $line; + } + } + + return $output; + } + + /** + * Used to make all multiline variable process. + * + * @param bool $multiline + * @param string $line + * @param string[] $buffer + * + * @return array{bool,string,string[]} + */ + private static function multilineProcess(bool $multiline, string $line, array $buffer) + { + // check if $line can be multiline variable + if ($started = self::looksLikeMultilineStart($line)) { + $multiline = true; + } + + if ($multiline) { + \array_push($buffer, $line); + + if (self::looksLikeMultilineStop($line, $started)) { + $multiline = false; + $line = \implode("\n", $buffer); + $buffer = []; + } + } + + return [$multiline, $line, $buffer]; + } + + /** + * Determine if the given line can be the start of a multiline variable. + * + * @param string $line + * + * @return bool + */ + private static function looksLikeMultilineStart(string $line) + { + return Str::pos($line, '="')->map(static function () use ($line) { + return self::looksLikeMultilineStop($line, true) === false; + })->getOrElse(false); + } + + /** + * Determine if the given line can be the start of a multiline variable. + * + * @param string $line + * @param bool $started + * + * @return bool + */ + private static function looksLikeMultilineStop(string $line, bool $started) + { + if ($line === '"') { + return true; + } + + return Regex::occurences('/(?=([^\\\\]"))/', \str_replace('\\\\', '', $line))->map(static function (int $count) use ($started) { + return $started ? $count > 1 : $count >= 1; + })->success()->getOrElse(false); + } + + /** + * Determine if the line in the file is a comment or whitespace. + * + * @param string $line + * + * @return bool + */ + private static function isCommentOrWhitespace(string $line) + { + $line = \trim($line); + + return $line === '' || (isset($line[0]) && $line[0] === '#'); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Parser/Parser.php b/vendor/vlucas/phpdotenv/src/Parser/Parser.php new file mode 100644 index 0000000..3c115e5 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Parser/Parser.php @@ -0,0 +1,52 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Parser; + +use Dotenv\Exception\InvalidFileException; +use Dotenv\Util\Regex; +use GrahamCampbell\ResultType\Result; +use GrahamCampbell\ResultType\Success; + +final class Parser implements ParserInterface +{ + /** + * Parse content into an entry array. + * + * @param string $content + * + * @throws \Dotenv\Exception\InvalidFileException + * + * @return \Dotenv\Parser\Entry[] + */ + public function parse(string $content) + { + return Regex::split("/(\r\n|\n|\r)/", $content)->mapError(static function () { + return 'Could not split into separate lines.'; + })->flatMap(static function (array $lines) { + return self::process(Lines::process($lines)); + })->mapError(static function (string $error) { + throw new InvalidFileException(\sprintf('Failed to parse dotenv file. %s', $error)); + })->success()->get(); + } + + /** + * Convert the raw entries into proper entries. + * + * @param string[] $entries + * + * @return \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Entry[],string> + */ + private static function process(array $entries) + { + /** @var \GrahamCampbell\ResultType\Result<\Dotenv\Parser\Entry[],string> */ + return \array_reduce($entries, static function (Result $result, string $raw) { + return $result->flatMap(static function (array $entries) use ($raw) { + return EntryParser::parse($raw)->map(static function (Entry $entry) use ($entries) { + return \array_merge($entries, [$entry]); + }); + }); + }, Success::create([])); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Parser/ParserInterface.php b/vendor/vlucas/phpdotenv/src/Parser/ParserInterface.php new file mode 100644 index 0000000..17cc42a --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Parser/ParserInterface.php @@ -0,0 +1,19 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Parser; + +interface ParserInterface +{ + /** + * Parse content into an entry array. + * + * @param string $content + * + * @throws \Dotenv\Exception\InvalidFileException + * + * @return \Dotenv\Parser\Entry[] + */ + public function parse(string $content); +} diff --git a/vendor/vlucas/phpdotenv/src/Parser/Value.php b/vendor/vlucas/phpdotenv/src/Parser/Value.php new file mode 100644 index 0000000..9e495a1 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Parser/Value.php @@ -0,0 +1,88 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Parser; + +use Dotenv\Util\Str; + +final class Value +{ + /** + * The string representation of the parsed value. + * + * @var string + */ + private $chars; + + /** + * The locations of the variables in the value. + * + * @var int[] + */ + private $vars; + + /** + * Internal constructor for a value. + * + * @param string $chars + * @param int[] $vars + * + * @return void + */ + private function __construct(string $chars, array $vars) + { + $this->chars = $chars; + $this->vars = $vars; + } + + /** + * Create an empty value instance. + * + * @return \Dotenv\Parser\Value + */ + public static function blank() + { + return new self('', []); + } + + /** + * Create a new value instance, appending the characters. + * + * @param string $chars + * @param bool $var + * + * @return \Dotenv\Parser\Value + */ + public function append(string $chars, bool $var) + { + return new self( + $this->chars.$chars, + $var ? \array_merge($this->vars, [Str::len($this->chars)]) : $this->vars + ); + } + + /** + * Get the string representation of the parsed value. + * + * @return string + */ + public function getChars() + { + return $this->chars; + } + + /** + * Get the locations of the variables in the value. + * + * @return int[] + */ + public function getVars() + { + $vars = $this->vars; + + \rsort($vars); + + return $vars; + } +} diff --git a/vendor/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php b/vendor/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php new file mode 100644 index 0000000..5604398 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php @@ -0,0 +1,15 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Repository\Adapter; + +interface AdapterInterface extends ReaderInterface, WriterInterface +{ + /** + * Create a new instance of the adapter, if it is available. + * + * @return \PhpOption\Option<\Dotenv\Repository\Adapter\AdapterInterface> + */ + public static function create(); +} diff --git a/vendor/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php b/vendor/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php new file mode 100644 index 0000000..868033a --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php @@ -0,0 +1,89 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Repository\Adapter; + +use PhpOption\None; +use PhpOption\Option; +use PhpOption\Some; + +final class ApacheAdapter implements AdapterInterface +{ + /** + * Create a new apache adapter instance. + * + * @return void + */ + private function __construct() + { + // + } + + /** + * Create a new instance of the adapter, if it is available. + * + * @return \PhpOption\Option<\Dotenv\Repository\Adapter\AdapterInterface> + */ + public static function create() + { + if (self::isSupported()) { + /** @var \PhpOption\Option<AdapterInterface> */ + return Some::create(new self()); + } + + return None::create(); + } + + /** + * Determines if the adapter is supported. + * + * This happens if PHP is running as an Apache module. + * + * @return bool + */ + private static function isSupported() + { + return \function_exists('apache_getenv') && \function_exists('apache_setenv'); + } + + /** + * Read an environment variable, if it exists. + * + * @param string $name + * + * @return \PhpOption\Option<string> + */ + public function read(string $name) + { + /** @var \PhpOption\Option<string> */ + return Option::fromValue(apache_getenv($name))->filter(static function ($value) { + return \is_string($value) && $value !== ''; + }); + } + + /** + * Write to an environment variable, if possible. + * + * @param string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + return apache_setenv($name, $value); + } + + /** + * Delete an environment variable, if possible. + * + * @param string $name + * + * @return bool + */ + public function delete(string $name) + { + return apache_setenv($name, ''); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php b/vendor/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php new file mode 100644 index 0000000..2881a7e --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php @@ -0,0 +1,80 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Repository\Adapter; + +use PhpOption\Option; +use PhpOption\Some; + +final class ArrayAdapter implements AdapterInterface +{ + /** + * The variables and their values. + * + * @var array<string,string> + */ + private $variables; + + /** + * Create a new array adapter instance. + * + * @return void + */ + private function __construct() + { + $this->variables = []; + } + + /** + * Create a new instance of the adapter, if it is available. + * + * @return \PhpOption\Option<\Dotenv\Repository\Adapter\AdapterInterface> + */ + public static function create() + { + /** @var \PhpOption\Option<AdapterInterface> */ + return Some::create(new self()); + } + + /** + * Read an environment variable, if it exists. + * + * @param string $name + * + * @return \PhpOption\Option<string> + */ + public function read(string $name) + { + return Option::fromArraysValue($this->variables, $name); + } + + /** + * Write to an environment variable, if possible. + * + * @param string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + $this->variables[$name] = $value; + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param string $name + * + * @return bool + */ + public function delete(string $name) + { + unset($this->variables[$name]); + + return true; + } +} diff --git a/vendor/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php b/vendor/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php new file mode 100644 index 0000000..9ef7fb4 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php @@ -0,0 +1,87 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Repository\Adapter; + +use PhpOption\Option; +use PhpOption\Some; + +final class EnvConstAdapter implements AdapterInterface +{ + /** + * Create a new env const adapter instance. + * + * @return void + */ + private function __construct() + { + // + } + + /** + * Create a new instance of the adapter, if it is available. + * + * @return \PhpOption\Option<\Dotenv\Repository\Adapter\AdapterInterface> + */ + public static function create() + { + /** @var \PhpOption\Option<AdapterInterface> */ + return Some::create(new self()); + } + + /** + * Read an environment variable, if it exists. + * + * @param string $name + * + * @return \PhpOption\Option<string> + */ + public function read(string $name) + { + /** @var \PhpOption\Option<string> */ + return Option::fromArraysValue($_ENV, $name) + ->map(static function ($value) { + if ($value === false) { + return 'false'; + } + + if ($value === true) { + return 'true'; + } + + return $value; + })->filter(static function ($value) { + return \is_string($value); + }); + } + + /** + * Write to an environment variable, if possible. + * + * @param string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + $_ENV[$name] = $value; + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param string $name + * + * @return bool + */ + public function delete(string $name) + { + unset($_ENV[$name]); + + return true; + } +} diff --git a/vendor/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php b/vendor/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php new file mode 100644 index 0000000..7bb69e8 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php @@ -0,0 +1,85 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Repository\Adapter; + +final class GuardedWriter implements WriterInterface +{ + /** + * The inner writer to use. + * + * @var \Dotenv\Repository\Adapter\WriterInterface + */ + private $writer; + + /** + * The variable name allow list. + * + * @var string[] + */ + private $allowList; + + /** + * Create a new guarded writer instance. + * + * @param \Dotenv\Repository\Adapter\WriterInterface $writer + * @param string[] $allowList + * + * @return void + */ + public function __construct(WriterInterface $writer, array $allowList) + { + $this->writer = $writer; + $this->allowList = $allowList; + } + + /** + * Write to an environment variable, if possible. + * + * @param string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + // Don't set non-allowed variables + if (!$this->isAllowed($name)) { + return false; + } + + // Set the value on the inner writer + return $this->writer->write($name, $value); + } + + /** + * Delete an environment variable, if possible. + * + * @param string $name + * + * @return bool + */ + public function delete(string $name) + { + // Don't clear non-allowed variables + if (!$this->isAllowed($name)) { + return false; + } + + // Set the value on the inner writer + return $this->writer->delete($name); + } + + /** + * Determine if the given variable is allowed. + * + * @param string $name + * + * @return bool + */ + private function isAllowed(string $name) + { + return \in_array($name, $this->allowList, true); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php b/vendor/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php new file mode 100644 index 0000000..574fcd6 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php @@ -0,0 +1,110 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Repository\Adapter; + +final class ImmutableWriter implements WriterInterface +{ + /** + * The inner writer to use. + * + * @var \Dotenv\Repository\Adapter\WriterInterface + */ + private $writer; + + /** + * The inner reader to use. + * + * @var \Dotenv\Repository\Adapter\ReaderInterface + */ + private $reader; + + /** + * The record of loaded variables. + * + * @var array<string,string> + */ + private $loaded; + + /** + * Create a new immutable writer instance. + * + * @param \Dotenv\Repository\Adapter\WriterInterface $writer + * @param \Dotenv\Repository\Adapter\ReaderInterface $reader + * + * @return void + */ + public function __construct(WriterInterface $writer, ReaderInterface $reader) + { + $this->writer = $writer; + $this->reader = $reader; + $this->loaded = []; + } + + /** + * Write to an environment variable, if possible. + * + * @param string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + // Don't overwrite existing environment variables + // Ruby's dotenv does this with `ENV[key] ||= value` + if ($this->isExternallyDefined($name)) { + return false; + } + + // Set the value on the inner writer + if (!$this->writer->write($name, $value)) { + return false; + } + + // Record that we have loaded the variable + $this->loaded[$name] = ''; + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param string $name + * + * @return bool + */ + public function delete(string $name) + { + // Don't clear existing environment variables + if ($this->isExternallyDefined($name)) { + return false; + } + + // Clear the value on the inner writer + if (!$this->writer->delete($name)) { + return false; + } + + // Leave the variable as fair game + unset($this->loaded[$name]); + + return true; + } + + /** + * Determine if the given variable is externally defined. + * + * That is, is it an "existing" variable. + * + * @param string $name + * + * @return bool + */ + private function isExternallyDefined(string $name) + { + return $this->reader->read($name)->isDefined() && !isset($this->loaded[$name]); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php b/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php new file mode 100644 index 0000000..12b3bda --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php @@ -0,0 +1,48 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Repository\Adapter; + +use PhpOption\None; + +final class MultiReader implements ReaderInterface +{ + /** + * The set of readers to use. + * + * @var \Dotenv\Repository\Adapter\ReaderInterface[] + */ + private $readers; + + /** + * Create a new multi-reader instance. + * + * @param \Dotenv\Repository\Adapter\ReaderInterface[] $readers + * + * @return void + */ + public function __construct(array $readers) + { + $this->readers = $readers; + } + + /** + * Read an environment variable, if it exists. + * + * @param string $name + * + * @return \PhpOption\Option<string> + */ + public function read(string $name) + { + foreach ($this->readers as $reader) { + $result = $reader->read($name); + if ($result->isDefined()) { + return $result; + } + } + + return None::create(); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php b/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php new file mode 100644 index 0000000..e1dcf56 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php @@ -0,0 +1,64 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Repository\Adapter; + +final class MultiWriter implements WriterInterface +{ + /** + * The set of writers to use. + * + * @var \Dotenv\Repository\Adapter\WriterInterface[] + */ + private $writers; + + /** + * Create a new multi-writer instance. + * + * @param \Dotenv\Repository\Adapter\WriterInterface[] $writers + * + * @return void + */ + public function __construct(array $writers) + { + $this->writers = $writers; + } + + /** + * Write to an environment variable, if possible. + * + * @param string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + foreach ($this->writers as $writers) { + if (!$writers->write($name, $value)) { + return false; + } + } + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param string $name + * + * @return bool + */ + public function delete(string $name) + { + foreach ($this->writers as $writers) { + if (!$writers->delete($name)) { + return false; + } + } + + return true; + } +} diff --git a/vendor/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php b/vendor/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php new file mode 100644 index 0000000..126c465 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php @@ -0,0 +1,91 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Repository\Adapter; + +use PhpOption\None; +use PhpOption\Option; +use PhpOption\Some; + +final class PutenvAdapter implements AdapterInterface +{ + /** + * Create a new putenv adapter instance. + * + * @return void + */ + private function __construct() + { + // + } + + /** + * Create a new instance of the adapter, if it is available. + * + * @return \PhpOption\Option<\Dotenv\Repository\Adapter\AdapterInterface> + */ + public static function create() + { + if (self::isSupported()) { + /** @var \PhpOption\Option<AdapterInterface> */ + return Some::create(new self()); + } + + return None::create(); + } + + /** + * Determines if the adapter is supported. + * + * @return bool + */ + private static function isSupported() + { + return \function_exists('getenv') && \function_exists('putenv'); + } + + /** + * Read an environment variable, if it exists. + * + * @param string $name + * + * @return \PhpOption\Option<string> + */ + public function read(string $name) + { + /** @var \PhpOption\Option<string> */ + return Option::fromValue(\getenv($name), false)->filter(static function ($value) { + return \is_string($value); + }); + } + + /** + * Write to an environment variable, if possible. + * + * @param string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + \putenv("$name=$value"); + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param string $name + * + * @return bool + */ + public function delete(string $name) + { + \putenv($name); + + return true; + } +} diff --git a/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php b/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php new file mode 100644 index 0000000..5ece5ee --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php @@ -0,0 +1,17 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Repository\Adapter; + +interface ReaderInterface +{ + /** + * Read an environment variable, if it exists. + * + * @param string $name + * + * @return \PhpOption\Option<string> + */ + public function read(string $name); +} diff --git a/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.php b/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.php new file mode 100644 index 0000000..326cd18 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.php @@ -0,0 +1,104 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Repository\Adapter; + +final class ReplacingWriter implements WriterInterface +{ + /** + * The inner writer to use. + * + * @var \Dotenv\Repository\Adapter\WriterInterface + */ + private $writer; + + /** + * The inner reader to use. + * + * @var \Dotenv\Repository\Adapter\ReaderInterface + */ + private $reader; + + /** + * The record of seen variables. + * + * @var array<string,string> + */ + private $seen; + + /** + * Create a new replacement writer instance. + * + * @param \Dotenv\Repository\Adapter\WriterInterface $writer + * @param \Dotenv\Repository\Adapter\ReaderInterface $reader + * + * @return void + */ + public function __construct(WriterInterface $writer, ReaderInterface $reader) + { + $this->writer = $writer; + $this->reader = $reader; + $this->seen = []; + } + + /** + * Write to an environment variable, if possible. + * + * @param string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + if ($this->exists($name)) { + return $this->writer->write($name, $value); + } + + // succeed if nothing to do + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param string $name + * + * @return bool + */ + public function delete(string $name) + { + if ($this->exists($name)) { + return $this->writer->delete($name); + } + + // succeed if nothing to do + return true; + } + + /** + * Does the given environment variable exist. + * + * Returns true if it currently exists, or existed at any point in the past + * that we are aware of. + * + * @param string $name + * + * @return bool + */ + private function exists(string $name) + { + if (isset($this->seen[$name])) { + return true; + } + + if ($this->reader->read($name)->isDefined()) { + $this->seen[$name] = ''; + + return true; + } + + return false; + } +} diff --git a/vendor/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php b/vendor/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php new file mode 100644 index 0000000..8e3dc98 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php @@ -0,0 +1,87 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Repository\Adapter; + +use PhpOption\Option; +use PhpOption\Some; + +final class ServerConstAdapter implements AdapterInterface +{ + /** + * Create a new server const adapter instance. + * + * @return void + */ + private function __construct() + { + // + } + + /** + * Create a new instance of the adapter, if it is available. + * + * @return \PhpOption\Option<\Dotenv\Repository\Adapter\AdapterInterface> + */ + public static function create() + { + /** @var \PhpOption\Option<AdapterInterface> */ + return Some::create(new self()); + } + + /** + * Read an environment variable, if it exists. + * + * @param string $name + * + * @return \PhpOption\Option<string> + */ + public function read(string $name) + { + /** @var \PhpOption\Option<string> */ + return Option::fromArraysValue($_SERVER, $name) + ->map(static function ($value) { + if ($value === false) { + return 'false'; + } + + if ($value === true) { + return 'true'; + } + + return $value; + })->filter(static function ($value) { + return \is_string($value); + }); + } + + /** + * Write to an environment variable, if possible. + * + * @param string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value) + { + $_SERVER[$name] = $value; + + return true; + } + + /** + * Delete an environment variable, if possible. + * + * @param string $name + * + * @return bool + */ + public function delete(string $name) + { + unset($_SERVER[$name]); + + return true; + } +} diff --git a/vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php b/vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php new file mode 100644 index 0000000..8b3fa57 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php @@ -0,0 +1,27 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Repository\Adapter; + +interface WriterInterface +{ + /** + * Write to an environment variable, if possible. + * + * @param string $name + * @param string $value + * + * @return bool + */ + public function write(string $name, string $value); + + /** + * Delete an environment variable, if possible. + * + * @param string $name + * + * @return bool + */ + public function delete(string $name); +} diff --git a/vendor/vlucas/phpdotenv/src/Repository/AdapterRepository.php b/vendor/vlucas/phpdotenv/src/Repository/AdapterRepository.php new file mode 100644 index 0000000..ada1c45 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Repository/AdapterRepository.php @@ -0,0 +1,88 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Repository; + +use Dotenv\Repository\Adapter\ReaderInterface; +use Dotenv\Repository\Adapter\WriterInterface; + +final class AdapterRepository implements RepositoryInterface +{ + /** + * The reader to use. + * + * @var \Dotenv\Repository\Adapter\ReaderInterface + */ + private $reader; + + /** + * The writer to use. + * + * @var \Dotenv\Repository\Adapter\WriterInterface + */ + private $writer; + + /** + * Create a new adapter repository instance. + * + * @param \Dotenv\Repository\Adapter\ReaderInterface $reader + * @param \Dotenv\Repository\Adapter\WriterInterface $writer + * + * @return void + */ + public function __construct(ReaderInterface $reader, WriterInterface $writer) + { + $this->reader = $reader; + $this->writer = $writer; + } + + /** + * Determine if the given environment variable is defined. + * + * @param string $name + * + * @return bool + */ + public function has(string $name) + { + return $this->reader->read($name)->isDefined(); + } + + /** + * Get an environment variable. + * + * @param string $name + * + * @return string|null + */ + public function get(string $name) + { + return $this->reader->read($name)->getOrElse(null); + } + + /** + * Set an environment variable. + * + * @param string $name + * @param string $value + * + * @return bool + */ + public function set(string $name, string $value) + { + return $this->writer->write($name, $value); + } + + /** + * Clear an environment variable. + * + * @param string $name + * + * @return bool + */ + public function clear(string $name) + { + return $this->writer->delete($name); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php b/vendor/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php new file mode 100644 index 0000000..92f65e9 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php @@ -0,0 +1,272 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Repository; + +use Dotenv\Repository\Adapter\AdapterInterface; +use Dotenv\Repository\Adapter\EnvConstAdapter; +use Dotenv\Repository\Adapter\GuardedWriter; +use Dotenv\Repository\Adapter\ImmutableWriter; +use Dotenv\Repository\Adapter\MultiReader; +use Dotenv\Repository\Adapter\MultiWriter; +use Dotenv\Repository\Adapter\ReaderInterface; +use Dotenv\Repository\Adapter\ServerConstAdapter; +use Dotenv\Repository\Adapter\WriterInterface; +use InvalidArgumentException; +use PhpOption\Some; +use ReflectionClass; + +final class RepositoryBuilder +{ + /** + * The set of default adapters. + */ + private const DEFAULT_ADAPTERS = [ + ServerConstAdapter::class, + EnvConstAdapter::class, + ]; + + /** + * The set of readers to use. + * + * @var \Dotenv\Repository\Adapter\ReaderInterface[] + */ + private $readers; + + /** + * The set of writers to use. + * + * @var \Dotenv\Repository\Adapter\WriterInterface[] + */ + private $writers; + + /** + * Are we immutable? + * + * @var bool + */ + private $immutable; + + /** + * The variable name allow list. + * + * @var string[]|null + */ + private $allowList; + + /** + * Create a new repository builder instance. + * + * @param \Dotenv\Repository\Adapter\ReaderInterface[] $readers + * @param \Dotenv\Repository\Adapter\WriterInterface[] $writers + * @param bool $immutable + * @param string[]|null $allowList + * + * @return void + */ + private function __construct(array $readers = [], array $writers = [], bool $immutable = false, array $allowList = null) + { + $this->readers = $readers; + $this->writers = $writers; + $this->immutable = $immutable; + $this->allowList = $allowList; + } + + /** + * Create a new repository builder instance with no adapters added. + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public static function createWithNoAdapters() + { + return new self(); + } + + /** + * Create a new repository builder instance with the default adapters added. + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public static function createWithDefaultAdapters() + { + $adapters = \iterator_to_array(self::defaultAdapters()); + + return new self($adapters, $adapters); + } + + /** + * Return the array of default adapters. + * + * @return \Generator<\Dotenv\Repository\Adapter\AdapterInterface> + */ + private static function defaultAdapters() + { + foreach (self::DEFAULT_ADAPTERS as $adapter) { + $instance = $adapter::create(); + if ($instance->isDefined()) { + yield $instance->get(); + } + } + } + + /** + * Determine if the given name if of an adapaterclass. + * + * @param string $name + * + * @return bool + */ + private static function isAnAdapterClass(string $name) + { + if (!\class_exists($name)) { + return false; + } + + return (new ReflectionClass($name))->implementsInterface(AdapterInterface::class); + } + + /** + * Creates a repository builder with the given reader added. + * + * Accepts either a reader instance, or a class-string for an adapter. If + * the adapter is not supported, then we silently skip adding it. + * + * @param \Dotenv\Repository\Adapter\ReaderInterface|string $reader + * + * @throws \InvalidArgumentException + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public function addReader($reader) + { + if (!(\is_string($reader) && self::isAnAdapterClass($reader)) && !($reader instanceof ReaderInterface)) { + throw new InvalidArgumentException( + \sprintf( + 'Expected either an instance of %s or a class-string implementing %s', + ReaderInterface::class, + AdapterInterface::class + ) + ); + } + + $optional = Some::create($reader)->flatMap(static function ($reader) { + return \is_string($reader) ? $reader::create() : Some::create($reader); + }); + + $readers = \array_merge($this->readers, \iterator_to_array($optional)); + + return new self($readers, $this->writers, $this->immutable, $this->allowList); + } + + /** + * Creates a repository builder with the given writer added. + * + * Accepts either a writer instance, or a class-string for an adapter. If + * the adapter is not supported, then we silently skip adding it. + * + * @param \Dotenv\Repository\Adapter\WriterInterface|string $writer + * + * @throws \InvalidArgumentException + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public function addWriter($writer) + { + if (!(\is_string($writer) && self::isAnAdapterClass($writer)) && !($writer instanceof WriterInterface)) { + throw new InvalidArgumentException( + \sprintf( + 'Expected either an instance of %s or a class-string implementing %s', + WriterInterface::class, + AdapterInterface::class + ) + ); + } + + $optional = Some::create($writer)->flatMap(static function ($writer) { + return \is_string($writer) ? $writer::create() : Some::create($writer); + }); + + $writers = \array_merge($this->writers, \iterator_to_array($optional)); + + return new self($this->readers, $writers, $this->immutable, $this->allowList); + } + + /** + * Creates a repository builder with the given adapter added. + * + * Accepts either an adapter instance, or a class-string for an adapter. If + * the adapter is not supported, then we silently skip adding it. We will + * add the adapter as both a reader and a writer. + * + * @param \Dotenv\Repository\Adapter\WriterInterface|string $adapter + * + * @throws \InvalidArgumentException + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public function addAdapter($adapter) + { + if (!(\is_string($adapter) && self::isAnAdapterClass($adapter)) && !($adapter instanceof AdapterInterface)) { + throw new InvalidArgumentException( + \sprintf( + 'Expected either an instance of %s or a class-string implementing %s', + WriterInterface::class, + AdapterInterface::class + ) + ); + } + + $optional = Some::create($adapter)->flatMap(static function ($adapter) { + return \is_string($adapter) ? $adapter::create() : Some::create($adapter); + }); + + $readers = \array_merge($this->readers, \iterator_to_array($optional)); + $writers = \array_merge($this->writers, \iterator_to_array($optional)); + + return new self($readers, $writers, $this->immutable, $this->allowList); + } + + /** + * Creates a repository builder with mutability enabled. + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public function immutable() + { + return new self($this->readers, $this->writers, true, $this->allowList); + } + + /** + * Creates a repository builder with the given allow list. + * + * @param string[]|null $allowList + * + * @return \Dotenv\Repository\RepositoryBuilder + */ + public function allowList(array $allowList = null) + { + return new self($this->readers, $this->writers, $this->immutable, $allowList); + } + + /** + * Creates a new repository instance. + * + * @return \Dotenv\Repository\RepositoryInterface + */ + public function make() + { + $reader = new MultiReader($this->readers); + $writer = new MultiWriter($this->writers); + + if ($this->immutable) { + $writer = new ImmutableWriter($writer, $reader); + } + + if ($this->allowList !== null) { + $writer = new GuardedWriter($writer, $this->allowList); + } + + return new AdapterRepository($reader, $writer); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Repository/RepositoryInterface.php b/vendor/vlucas/phpdotenv/src/Repository/RepositoryInterface.php new file mode 100644 index 0000000..a2a7d32 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Repository/RepositoryInterface.php @@ -0,0 +1,45 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Repository; + +interface RepositoryInterface +{ + /** + * Determine if the given environment variable is defined. + * + * @param string $name + * + * @return bool + */ + public function has(string $name); + + /** + * Get an environment variable. + * + * @param string $name + * + * @return string|null + */ + public function get(string $name); + + /** + * Set an environment variable. + * + * @param string $name + * @param string $value + * + * @return bool + */ + public function set(string $name, string $value); + + /** + * Clear an environment variable. + * + * @param string $name + * + * @return bool + */ + public function clear(string $name); +} diff --git a/vendor/vlucas/phpdotenv/src/Store/File/Paths.php b/vendor/vlucas/phpdotenv/src/Store/File/Paths.php new file mode 100644 index 0000000..4f678a5 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Store/File/Paths.php @@ -0,0 +1,44 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Store\File; + +/** + * @internal + */ +final class Paths +{ + /** + * This class is a singleton. + * + * @codeCoverageIgnore + * + * @return void + */ + private function __construct() + { + // + } + + /** + * Returns the full paths to the files. + * + * @param string[] $paths + * @param string[] $names + * + * @return string[] + */ + public static function filePaths(array $paths, array $names) + { + $files = []; + + foreach ($paths as $path) { + foreach ($names as $name) { + $files[] = \rtrim($path, \DIRECTORY_SEPARATOR).\DIRECTORY_SEPARATOR.$name; + } + } + + return $files; + } +} diff --git a/vendor/vlucas/phpdotenv/src/Store/File/Reader.php b/vendor/vlucas/phpdotenv/src/Store/File/Reader.php new file mode 100644 index 0000000..bcbbf7a --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Store/File/Reader.php @@ -0,0 +1,81 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Store\File; + +use Dotenv\Exception\InvalidEncodingException; +use Dotenv\Util\Str; +use PhpOption\Option; + +/** + * @internal + */ +final class Reader +{ + /** + * This class is a singleton. + * + * @codeCoverageIgnore + * + * @return void + */ + private function __construct() + { + // + } + + /** + * Read the file(s), and return their raw content. + * + * We provide the file path as the key, and its content as the value. If + * short circuit mode is enabled, then the returned array with have length + * at most one. File paths that couldn't be read are omitted entirely. + * + * @param string[] $filePaths + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @throws \Dotenv\Exception\InvalidEncodingException + * + * @return array<string,string> + */ + public static function read(array $filePaths, bool $shortCircuit = true, string $fileEncoding = null) + { + $output = []; + + foreach ($filePaths as $filePath) { + $content = self::readFromFile($filePath, $fileEncoding); + if ($content->isDefined()) { + $output[$filePath] = $content->get(); + if ($shortCircuit) { + break; + } + } + } + + return $output; + } + + /** + * Read the given file. + * + * @param string $path + * @param string|null $encoding + * + * @throws \Dotenv\Exception\InvalidEncodingException + * + * @return \PhpOption\Option<string> + */ + private static function readFromFile(string $path, string $encoding = null) + { + /** @var Option<string> */ + $content = Option::fromValue(@\file_get_contents($path), false); + + return $content->flatMap(static function (string $content) use ($encoding) { + return Str::utf8($content, $encoding)->mapError(static function (string $error) { + throw new InvalidEncodingException($error); + })->success(); + }); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Store/FileStore.php b/vendor/vlucas/phpdotenv/src/Store/FileStore.php new file mode 100644 index 0000000..43f6135 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Store/FileStore.php @@ -0,0 +1,72 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Store; + +use Dotenv\Exception\InvalidPathException; +use Dotenv\Store\File\Reader; + +final class FileStore implements StoreInterface +{ + /** + * The file paths. + * + * @var string[] + */ + private $filePaths; + + /** + * Should file loading short circuit? + * + * @var bool + */ + private $shortCircuit; + + /** + * The file encoding. + * + * @var string|null + */ + private $fileEncoding; + + /** + * Create a new file store instance. + * + * @param string[] $filePaths + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return void + */ + public function __construct(array $filePaths, bool $shortCircuit, string $fileEncoding = null) + { + $this->filePaths = $filePaths; + $this->shortCircuit = $shortCircuit; + $this->fileEncoding = $fileEncoding; + } + + /** + * Read the content of the environment file(s). + * + * @throws \Dotenv\Exception\InvalidEncodingException|\Dotenv\Exception\InvalidPathException + * + * @return string + */ + public function read() + { + if ($this->filePaths === []) { + throw new InvalidPathException('At least one environment file path must be provided.'); + } + + $contents = Reader::read($this->filePaths, $this->shortCircuit, $this->fileEncoding); + + if (\count($contents) > 0) { + return \implode("\n", $contents); + } + + throw new InvalidPathException( + \sprintf('Unable to read any of the environment file(s) at [%s].', \implode(', ', $this->filePaths)) + ); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Store/StoreBuilder.php b/vendor/vlucas/phpdotenv/src/Store/StoreBuilder.php new file mode 100644 index 0000000..304117f --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Store/StoreBuilder.php @@ -0,0 +1,141 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Store; + +use Dotenv\Store\File\Paths; + +final class StoreBuilder +{ + /** + * The of default name. + */ + private const DEFAULT_NAME = '.env'; + + /** + * The paths to search within. + * + * @var string[] + */ + private $paths; + + /** + * The file names to search for. + * + * @var string[] + */ + private $names; + + /** + * Should file loading short circuit? + * + * @var bool + */ + private $shortCircuit; + + /** + * The file encoding. + * + * @var string|null + */ + private $fileEncoding; + + /** + * Create a new store builder instance. + * + * @param string[] $paths + * @param string[] $names + * @param bool $shortCircuit + * @param string|null $fileEncoding + * + * @return void + */ + private function __construct(array $paths = [], array $names = [], bool $shortCircuit = false, string $fileEncoding = null) + { + $this->paths = $paths; + $this->names = $names; + $this->shortCircuit = $shortCircuit; + $this->fileEncoding = $fileEncoding; + } + + /** + * Create a new store builder instance with no names. + * + * @return \Dotenv\Store\StoreBuilder + */ + public static function createWithNoNames() + { + return new self(); + } + + /** + * Create a new store builder instance with the default name. + * + * @return \Dotenv\Store\StoreBuilder + */ + public static function createWithDefaultName() + { + return new self([], [self::DEFAULT_NAME]); + } + + /** + * Creates a store builder with the given path added. + * + * @param string $path + * + * @return \Dotenv\Store\StoreBuilder + */ + public function addPath(string $path) + { + return new self(\array_merge($this->paths, [$path]), $this->names, $this->shortCircuit, $this->fileEncoding); + } + + /** + * Creates a store builder with the given name added. + * + * @param string $name + * + * @return \Dotenv\Store\StoreBuilder + */ + public function addName(string $name) + { + return new self($this->paths, \array_merge($this->names, [$name]), $this->shortCircuit, $this->fileEncoding); + } + + /** + * Creates a store builder with short circuit mode enabled. + * + * @return \Dotenv\Store\StoreBuilder + */ + public function shortCircuit() + { + return new self($this->paths, $this->names, true, $this->fileEncoding); + } + + /** + * Creates a store builder with the specified file encoding. + * + * @param string|null $fileEncoding + * + * @return \Dotenv\Store\StoreBuilder + */ + public function fileEncoding(string $fileEncoding = null) + { + return new self($this->paths, $this->names, $this->shortCircuit, $fileEncoding); + } + + /** + * Creates a new store instance. + * + * @return \Dotenv\Store\StoreInterface + */ + public function make() + { + return new FileStore( + Paths::filePaths($this->paths, $this->names), + $this->shortCircuit, + $this->fileEncoding + ); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Store/StoreInterface.php b/vendor/vlucas/phpdotenv/src/Store/StoreInterface.php new file mode 100644 index 0000000..6f5b986 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Store/StoreInterface.php @@ -0,0 +1,17 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Store; + +interface StoreInterface +{ + /** + * Read the content of the environment file(s). + * + * @throws \Dotenv\Exception\InvalidEncodingException|\Dotenv\Exception\InvalidPathException + * + * @return string + */ + public function read(); +} diff --git a/vendor/vlucas/phpdotenv/src/Store/StringStore.php b/vendor/vlucas/phpdotenv/src/Store/StringStore.php new file mode 100644 index 0000000..3f862a7 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Store/StringStore.php @@ -0,0 +1,37 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Store; + +final class StringStore implements StoreInterface +{ + /** + * The file content. + * + * @var string + */ + private $content; + + /** + * Create a new string store instance. + * + * @param string $content + * + * @return void + */ + public function __construct(string $content) + { + $this->content = $content; + } + + /** + * Read the content of the environment file(s). + * + * @return string + */ + public function read() + { + return $this->content; + } +} diff --git a/vendor/vlucas/phpdotenv/src/Util/Regex.php b/vendor/vlucas/phpdotenv/src/Util/Regex.php new file mode 100644 index 0000000..e558f40 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Util/Regex.php @@ -0,0 +1,110 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Util; + +use GrahamCampbell\ResultType\Error; +use GrahamCampbell\ResultType\Success; + +/** + * @internal + */ +final class Regex +{ + /** + * This class is a singleton. + * + * @codeCoverageIgnore + * + * @return void + */ + private function __construct() + { + // + } + + /** + * Perform a preg match, wrapping up the result. + * + * @param string $pattern + * @param string $subject + * + * @return \GrahamCampbell\ResultType\Result<bool,string> + */ + public static function matches(string $pattern, string $subject) + { + return self::pregAndWrap(static function (string $subject) use ($pattern) { + return @\preg_match($pattern, $subject) === 1; + }, $subject); + } + + /** + * Perform a preg match all, wrapping up the result. + * + * @param string $pattern + * @param string $subject + * + * @return \GrahamCampbell\ResultType\Result<int,string> + */ + public static function occurences(string $pattern, string $subject) + { + return self::pregAndWrap(static function (string $subject) use ($pattern) { + return (int) @\preg_match_all($pattern, $subject); + }, $subject); + } + + /** + * Perform a preg replace callback, wrapping up the result. + * + * @param string $pattern + * @param callable $callback + * @param string $subject + * @param int|null $limit + * + * @return \GrahamCampbell\ResultType\Result<string,string> + */ + public static function replaceCallback(string $pattern, callable $callback, string $subject, int $limit = null) + { + return self::pregAndWrap(static function (string $subject) use ($pattern, $callback, $limit) { + return (string) @\preg_replace_callback($pattern, $callback, $subject, $limit ?? -1); + }, $subject); + } + + /** + * Perform a preg split, wrapping up the result. + * + * @param string $pattern + * @param string $subject + * + * @return \GrahamCampbell\ResultType\Result<string[],string> + */ + public static function split(string $pattern, string $subject) + { + return self::pregAndWrap(static function (string $subject) use ($pattern) { + /** @var string[] */ + return (array) @\preg_split($pattern, $subject); + }, $subject); + } + + /** + * Perform a preg operation, wrapping up the result. + * + * @template V + * + * @param callable(string):V $operation + * @param string $subject + * + * @return \GrahamCampbell\ResultType\Result<V,string> + */ + private static function pregAndWrap(callable $operation, string $subject) + { + $result = $operation($subject); + + if (\preg_last_error() !== \PREG_NO_ERROR) { + return Error::create(\preg_last_error_msg()); + } + + return Success::create($result); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Util/Str.php b/vendor/vlucas/phpdotenv/src/Util/Str.php new file mode 100644 index 0000000..087e236 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Util/Str.php @@ -0,0 +1,98 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv\Util; + +use GrahamCampbell\ResultType\Error; +use GrahamCampbell\ResultType\Success; +use PhpOption\Option; + +/** + * @internal + */ +final class Str +{ + /** + * This class is a singleton. + * + * @codeCoverageIgnore + * + * @return void + */ + private function __construct() + { + // + } + + /** + * Convert a string to UTF-8 from the given encoding. + * + * @param string $input + * @param string|null $encoding + * + * @return \GrahamCampbell\ResultType\Result<string,string> + */ + public static function utf8(string $input, string $encoding = null) + { + if ($encoding !== null && !\in_array($encoding, \mb_list_encodings(), true)) { + /** @var \GrahamCampbell\ResultType\Result<string,string> */ + return Error::create( + \sprintf('Illegal character encoding [%s] specified.', $encoding) + ); + } + $converted = $encoding === null ? + @\mb_convert_encoding($input, 'UTF-8') : + @\mb_convert_encoding($input, 'UTF-8', $encoding); + /** + * this is for support UTF-8 with BOM encoding + * @see https://en.wikipedia.org/wiki/Byte_order_mark + * @see https://github.com/vlucas/phpdotenv/issues/500 + */ + if (\substr($converted, 0, 3) == "\xEF\xBB\xBF") { + $converted = \substr($converted, 3); + } + /** @var \GrahamCampbell\ResultType\Result<string,string> */ + return Success::create($converted); + } + + /** + * Search for a given substring of the input. + * + * @param string $haystack + * @param string $needle + * + * @return \PhpOption\Option<int> + */ + public static function pos(string $haystack, string $needle) + { + /** @var \PhpOption\Option<int> */ + return Option::fromValue(\mb_strpos($haystack, $needle, 0, 'UTF-8'), false); + } + + /** + * Grab the specified substring of the input. + * + * @param string $input + * @param int $start + * @param int|null $length + * + * @return string + */ + public static function substr(string $input, int $start, int $length = null) + { + return \mb_substr($input, $start, $length, 'UTF-8'); + } + + /** + * Compute the length of the given string. + * + * @param string $input + * + * @return int + */ + public static function len(string $input) + { + return \mb_strlen($input, 'UTF-8'); + } +} diff --git a/vendor/vlucas/phpdotenv/src/Validator.php b/vendor/vlucas/phpdotenv/src/Validator.php new file mode 100644 index 0000000..0c04ab6 --- /dev/null +++ b/vendor/vlucas/phpdotenv/src/Validator.php @@ -0,0 +1,209 @@ +<?php + +declare(strict_types=1); + +namespace Dotenv; + +use Dotenv\Exception\ValidationException; +use Dotenv\Repository\RepositoryInterface; +use Dotenv\Util\Regex; +use Dotenv\Util\Str; + +class Validator +{ + /** + * The environment repository instance. + * + * @var \Dotenv\Repository\RepositoryInterface + */ + private $repository; + + /** + * The variables to validate. + * + * @var string[] + */ + private $variables; + + /** + * Create a new validator instance. + * + * @param \Dotenv\Repository\RepositoryInterface $repository + * @param string[] $variables + * + * @throws \Dotenv\Exception\ValidationException + * + * @return void + */ + public function __construct(RepositoryInterface $repository, array $variables) + { + $this->repository = $repository; + $this->variables = $variables; + } + + /** + * Assert that each variable is present. + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function required() + { + return $this->assert( + static function (?string $value) { + return $value !== null; + }, + 'is missing' + ); + } + + /** + * Assert that each variable is not empty. + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function notEmpty() + { + return $this->assertNullable( + static function (string $value) { + return Str::len(\trim($value)) > 0; + }, + 'is empty' + ); + } + + /** + * Assert that each specified variable is an integer. + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function isInteger() + { + return $this->assertNullable( + static function (string $value) { + return \ctype_digit($value); + }, + 'is not an integer' + ); + } + + /** + * Assert that each specified variable is a boolean. + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function isBoolean() + { + return $this->assertNullable( + static function (string $value) { + if ($value === '') { + return false; + } + + return \filter_var($value, \FILTER_VALIDATE_BOOLEAN, \FILTER_NULL_ON_FAILURE) !== null; + }, + 'is not a boolean' + ); + } + + /** + * Assert that each variable is amongst the given choices. + * + * @param string[] $choices + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function allowedValues(array $choices) + { + return $this->assertNullable( + static function (string $value) use ($choices) { + return \in_array($value, $choices, true); + }, + \sprintf('is not one of [%s]', \implode(', ', $choices)) + ); + } + + /** + * Assert that each variable matches the given regular expression. + * + * @param string $regex + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function allowedRegexValues(string $regex) + { + return $this->assertNullable( + static function (string $value) use ($regex) { + return Regex::matches($regex, $value)->success()->getOrElse(false); + }, + \sprintf('does not match "%s"', $regex) + ); + } + + /** + * Assert that the callback returns true for each variable. + * + * @param callable(?string):bool $callback + * @param string $message + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function assert(callable $callback, string $message) + { + $failing = []; + + foreach ($this->variables as $variable) { + if ($callback($this->repository->get($variable)) === false) { + $failing[] = \sprintf('%s %s', $variable, $message); + } + } + + if (\count($failing) > 0) { + throw new ValidationException(\sprintf( + 'One or more environment variables failed assertions: %s.', + \implode(', ', $failing) + )); + } + + return $this; + } + + /** + * Assert that the callback returns true for each variable. + * + * Skip checking null variable values. + * + * @param callable(string):bool $callback + * @param string $message + * + * @throws \Dotenv\Exception\ValidationException + * + * @return \Dotenv\Validator + */ + public function assertNullable(callable $callback, string $message) + { + return $this->assert( + static function (?string $value) use ($callback) { + if ($value === null) { + return true; + } + + return $callback($value); + }, + $message + ); + } +} diff --git a/vendor/voku/portable-ascii/CHANGELOG.md b/vendor/voku/portable-ascii/CHANGELOG.md new file mode 100644 index 0000000..12fc393 --- /dev/null +++ b/vendor/voku/portable-ascii/CHANGELOG.md @@ -0,0 +1,202 @@ +# Changelog + +### 2.0.1 (2022-03-08) + +- "To people of Russia": There is a war in Ukraine right now. The forces of the Russian Federation are attacking civilians. +- optimize some phpdocs + +### 2.0.0 (2022-01-24) + +- prefer "Russian - Passport (2013), ICAO" instead of "Russian - GOST 7.79-2000(B)" +- fix "Ukrainian" char-mapping (thanks to @Andr1yk0) +- fix "Persian" char-mapping (thanks to @frost-cyber) + +### 1.6.1 (2022-01-24) + +- revert: prefer "Russian - Passport (2013), ICAO" instead of "Russian - GOST 7.79-2000(B)" +- revert: fix "Ukrainian" char-mapping (thanks to @Andr1yk0) +- revert: fix "Persian" char-mapping (thanks to @frost-cyber) + +### 1.6.0 (2022-01-24) + +- prefer "Russian - Passport (2013), ICAO" instead of "Russian - GOST 7.79-2000(B)" +- fix "Ukrainian" char-mapping (thanks to @Andr1yk0) +- fix "Persian" char-mapping (thanks to @frost-cyber) +- fix "ASCII::normalize_whitespace()" -> "CARRIAGE RETURN" is more like "<br>" and no "\n" +- add "ASCII::to_ascii_remap()" -> this method will return broken characters and is only for special cases + +### 1.5.6 (2020-11-12) + +- "ASCII::normalize_whitespace()" -> can now also remove "control characters" if needed v2 + +### 1.5.5 (2020-11-12) + +- fix "Greeklish" char-mapping (thanks @sebdesign) +- "ASCII::normalize_whitespace()" -> can now also remove "control characters" if needed + +### 1.5.4 (2020-11-08) + +- add some missing replacements in U+23xx page (thanks @marcoffee) +- fix "Russian" char-mapping (thanks @ilyahoilik) +- running test with PHP 8.0 rc3 + +### 1.5.3 (2020-07-23) + +- fix "Georgian" char-mapping (thanks @waska14) + +### 1.5.2 (2020-06-16) + +- add "Bengali" (bn) language support (thanks @eliyas5044) +- fix "Portuguese" char-mapping +- reduce the file size (removed extra comments from "avian2/unidecode") + +### 1.5.1 (2020-05-26) + +- fix merge ASCII transliterations from "avian2/unidecode" (python) + -> https://github.com/avian2/unidecode/ + +### 1.5.0 (2020-05-24) + +- merge ASCII transliterations from "avian2/unidecode" (python) + -> https://github.com/avian2/unidecode/ + +### 1.4.11 (2020-05-23) + +- "composer.json" -> remove "autoload-dev" stuff from "autoload" +- "voku/php-readme-helper" -> auto-generate the API documentation in the README + +### 1.4.10 (2020-03-13) + +- ASCII::to_ascii() -> fix extra symbol handling in the regex +- ASCII::to_ascii() -> fix for languages with multi-length-special-char (e.g. Greek -> 'ει' => 'i') + +### 1.4.9 (2020-03-06) + +- ASCII::to_slugify() -> fix php warning from empty "separator" + +### 1.4.8 (2020-02-06) + +- small optimization for "ASCII::to_ascii()" performance + +### 1.4.7 (2020-01-27) + +- fix possible wrong type from "getDataIfExists()" -> e.g. a bug reported where "/data/" was modified +- inline variables +- do not use "=== true" for "bool"-types + +### 1.4.6 (2019-12-23) + +- optimize "ASCII::to_ascii()" performance +- add "armenian" chars +- add "ASCII:getAllLanguages()" + +### 1.4.5 (2019-12-19) + +- use "@psalm-pure" v2 + +### 1.4.4 (2019-12-19) + +- use "@psalm-pure" + +### 1.4.3 (2019-12-19) + +- use "@psalm-immutable" + +### 1.4.2 (2019-12-13) + +- optimize the performance v2 +- more fixes for non-ascii regex + +### 1.4.1 (2019-12-13) + +- fix regex for non-ascii + +### 1.4.0 (2019-12-13) + +- optimize the performance, via single char replacements + +### 1.3.6 (2019-12-13) + +- "ascii_extras" -> convert the static content into ascii + -> e.g.: instead of replacing "+" with "più" we use "piu" (Italian), because we want to use ascii anyway + +### 1.3.5 (2019-11-11) + +- fix "ASCII::remove_invisible_characters()" -> do not remove invisible encoded url strings by default + +### 1.3.4 (2019-10-14) + +- fix static cache for "ASCII::charsArrayWithOneLanguage" + +### 1.3.3 (2019-10-14) + +- fix "Turkish" mapping -> 'ä' -> 'a' + +### 1.3.2 (2019-10-14) + +- fix language parameter usage with e.g. "de_DE" +- re-add missing "extra"-mapping chars + +### 1.3.1 (2019-10-13) + +- fix "ASCII::to_slugify" -> remove unicode chars +- add more test for ascii chars in the mapping +- fix non ascii chars in the mapping + +### 1.3.0 (2019-10-12) + +- add transliteration "fr" (was supported before, but with chars from other languages) +- add transliteration "ru" - Passport (2013), ICAO +- add transliteration "ru" - GOST 7.79-2000(B) +- add transliteration "el" - greeklish +- add transliteration "zh" +- add transliteration "nl" +- add transliteration "it" +- add transliteration "mk" +- add transliteration "pt" +- add constants -> ASCII::*LANGUAGE_CODES +- add more special latin chars / (currency) symbols +- add simple tests for all supported languages +- optimize "Russian" to ASCII (via "translit.ru") +- optimize performance of string replacement +- optimize performance of array merging +- optimize phpdoc comments +- "ASCII::to_transliterate" -> use "transliterator_create" + static cache +- "ASCII::to_ascii" -> fix "remove unsupported chars" +- "ASCII::to_ascii" -> add some more special chars +- run/fix static analyse via "pslam" + "phpstan" +- auto fix code style via "php-cs-fixer" +- fix transliteration for "german" +- fix transliteration for "persian" (thanks @mardep) +- fix transliteration for "polish" (thanks @dariusz.drobisz) +- fix transliteration for "bulgarian" (thanks @mkosturkov) +- fix transliteration for "croatian" (thanks @ludifonovac) +- fix transliteration for "serbian" (thanks @ludifonovac) +- fix transliteration for "swedish" (thanks @nicholasruunu) +- fix transliteration for "france" (thanks @sharptsa) +- fix transliteration for "serbian" (thanks @nikolaposa) +- fix transliteration for "czech" (thanks @slepic) + +### 1.2.3 (2019-09-10) + +- fix language depending ASCII chars (the order matters) + +### 1.2.2 (2019-09-10) + +- fix bulgarian ASCII chars | thanks @bgphp + +### 1.2.1 (2019-09-07) + +- "charsArray()" -> add access to "ASCII::$ASCII_MAPS*"" + +### 1.2.0 (2019-09-07) + +- "to_slugify()" -> use the extra ascii array + +### 1.1.0 (2019-09-07) + +- add + split extra ascii replacements + +### 1.0.0 (2019-09-05) + +- initial commit \ No newline at end of file diff --git a/vendor/voku/portable-ascii/LICENSE.txt b/vendor/voku/portable-ascii/LICENSE.txt new file mode 100644 index 0000000..b6ba47e --- /dev/null +++ b/vendor/voku/portable-ascii/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (C) 2019 Lars Moelleken + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/voku/portable-ascii/README.md b/vendor/voku/portable-ascii/README.md new file mode 100644 index 0000000..3ce36d6 --- /dev/null +++ b/vendor/voku/portable-ascii/README.md @@ -0,0 +1,451 @@ +[//]: # (AUTO-GENERATED BY "PHP README Helper": base file -> docs/base.md) +[![SWUbanner](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-direct.svg)](https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md) + +[![Build Status](https://github.com/voku/portable-ascii/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/voku/portable-ascii/actions) +[![Build status](https://ci.appveyor.com/api/projects/status/gnejjnk7qplr7f5t/branch/master?svg=true)](https://ci.appveyor.com/project/voku/portable-ascii/branch/master) +[![codecov.io](https://codecov.io/github/voku/portable-ascii/coverage.svg?branch=master)](https://codecov.io/github/voku/portable-ascii?branch=master) +[![Codacy Badge](https://api.codacy.com/project/badge/Grade/997c9bb10d1c4791967bdf2e42013e8e)](https://www.codacy.com/app/voku/portable-ascii) +[![Latest Stable Version](https://poser.pugx.org/voku/portable-ascii/v/stable)](https://packagist.org/packages/voku/portable-ascii) +[![Total Downloads](https://poser.pugx.org/voku/portable-ascii/downloads)](https://packagist.org/packages/voku/portable-ascii) +[![License](https://poser.pugx.org/voku/portable-ascii/license)](https://packagist.org/packages/voku/portable-ascii) +[![Donate to this project using Paypal](https://img.shields.io/badge/paypal-donate-yellow.svg)](https://www.paypal.me/moelleken) +[![Donate to this project using Patreon](https://img.shields.io/badge/patreon-donate-yellow.svg)](https://www.patreon.com/voku) + +# 🔡 Portable ASCII + +## Description + +It is written in PHP (PHP 7+) and can work without "mbstring", "iconv" or any other extra encoding php-extension on your server. + +The benefit of Portable ASCII is that it is easy to use, easy to bundle. + +The project based on ... ++ Sean M. Burke's work (https://metacpan.org/pod/Text::Unidecode) ++ Tomaz Solc's work (https://pypi.org/project/Unidecode/) ++ Portable UTF-8 work (https://github.com/voku/portable-utf8) ++ Daniel St. Jules's work (https://github.com/danielstjules/Stringy) ++ Johnny Broadway's work (https://github.com/jbroadway/urlify) ++ and many cherry-picks from "github"-gists and "Stack Overflow"-snippets ... + +## Index + +* [Alternative](#alternative) +* [Install](#install-portable-ascii-via-composer-require) +* [Why Portable ASCII?](#why-portable-ascii) +* [Requirements and Recommendations](#requirements-and-recommendations) +* [Usage](#usage) +* [Class methods](#class-methods) +* [Unit Test](#unit-test) +* [License and Copyright](#license-and-copyright) + +## Alternative + +If you like a more Object Oriented Way to edit strings, then you can take a look at [voku/Stringy](https://github.com/voku/Stringy), it's a fork of "danielstjules/Stringy" but it used the "Portable ASCII"-Class and some extra methods. + +```php +// Portable ASCII +use voku\helper\ASCII; +ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii' + +// voku/Stringy +use Stringy\Stringy as S; +$stringy = S::create('déjà σσς iıii'); +$stringy->toTransliterate(); // 'deja sss iiii' +``` + +## Install "Portable ASCII" via "composer require" +```shell +composer require voku/portable-ascii +``` + +## Why Portable ASCII?[]() +I need ASCII char handling in different classes and before I added this functions into "Portable UTF-8", +but this repo is more modular and portable, because it has no dependencies. + +## Requirements and Recommendations + +* No extensions are required to run this library. Portable ASCII only needs PCRE library that is available by default since PHP 4.2.0 and cannot be disabled since PHP 5.3.0. "\u" modifier support in PCRE for ASCII handling is not a must. +* PHP 7.0 is the minimum requirement +* PHP 8.0 is also supported + +## Usage + +Example: ASCII::to_ascii() +```php + echo ASCII::to_ascii('�Düsseldorf�', 'de'); + + // will output + // Duesseldorf + + echo ASCII::to_ascii('�Düsseldorf�', 'en'); + + // will output + // Dusseldorf +``` + +# Portable ASCII | API + +The API from the "ASCII"-Class is written as small static methods. + + +## Class methods + +<p id="voku-php-readme-class-methods"></p><table><tr><td><a href="#charsarraybool-replace_extra_symbols-array">charsArray</a> +</td><td><a href="#charsarraywithmultilanguagevaluesbool-replace_extra_symbols-array">charsArrayWithMultiLanguageValues</a> +</td><td><a href="#charsarraywithonelanguagestring-language-bool-replace_extra_symbols-bool-asorigreplacearray-array">charsArrayWithOneLanguage</a> +</td><td><a href="#charsarraywithsinglelanguagevaluesbool-replace_extra_symbols-bool-asorigreplacearray-array">charsArrayWithSingleLanguageValues</a> +</td></tr><tr><td><a href="#cleanstring-str-bool-normalize_whitespace-bool-keep_non_breaking_space-bool-normalize_msword-bool-remove_invisible_characters-string">clean</a> +</td><td><a href="#getalllanguages-string">getAllLanguages</a> +</td><td><a href="#is_asciistring-str-bool">is_ascii</a> +</td><td><a href="#normalize_mswordstring-str-string">normalize_msword</a> +</td></tr><tr><td><a href="#normalize_whitespacestring-str-bool-keepnonbreakingspace-bool-keepbidiunicodecontrols-bool-normalize_control_characters-string">normalize_whitespace</a> +</td><td><a href="#remove_invisible_charactersstring-str-bool-url_encoded-string-replacement-bool-keep_basic_control_characters-string">remove_invisible_characters</a> +</td><td><a href="#to_asciistring-str-string-language-bool-remove_unsupported_chars-bool-replace_extra_symbols-bool-use_transliterate-boolnull-replace_single_chars_only-string">to_ascii</a> +</td><td><a href="#to_ascii_remapstring-str1-string-str2-string">to_ascii_remap</a> +</td></tr><tr><td><a href="#to_filenamestring-str-bool-use_transliterate-string-fallback_char-string">to_filename</a> +</td><td><a href="#to_slugifystring-str-string-separator-string-language-string-replacements-bool-replace_extra_symbols-bool-use_str_to_lower-bool-use_transliterate-string">to_slugify</a> +</td><td><a href="#to_transliteratestring-str-stringnull-unknown-bool-strict-string">to_transliterate</a> +</td></tr></table> + +#### charsArray(bool $replace_extra_symbols): array +<a href="#voku-php-readme-class-methods">↑</a> +Returns an replacement array for ASCII methods. + +EXAMPLE: <code> +$array = ASCII::charsArray(); +var_dump($array['ru']['б']); // 'b' +</code> + +**Parameters:** +- `bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound ".</p>` + +**Return:** +- `array` + +-------- + +#### charsArrayWithMultiLanguageValues(bool $replace_extra_symbols): array +<a href="#voku-php-readme-class-methods">↑</a> +Returns an replacement array for ASCII methods with a mix of multiple languages. + +EXAMPLE: <code> +$array = ASCII::charsArrayWithMultiLanguageValues(); +var_dump($array['b']); // ['β', 'б', 'ဗ', 'ბ', 'ب'] +</code> + +**Parameters:** +- `bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound ".</p>` + +**Return:** +- `array <p>An array of replacements.</p>` + +-------- + +#### charsArrayWithOneLanguage(string $language, bool $replace_extra_symbols, bool $asOrigReplaceArray): array +<a href="#voku-php-readme-class-methods">↑</a> +Returns an replacement array for ASCII methods with one language. + +For example, German will map 'ä' to 'ae', while other languages +will simply return e.g. 'a'. + +EXAMPLE: <code> +$array = ASCII::charsArrayWithOneLanguage('ru'); +$tmpKey = \array_search('yo', $array['replace']); +echo $array['orig'][$tmpKey]; // 'ё' +</code> + +**Parameters:** +- `ASCII::* $language [optional] <p>Language of the source string e.g.: en, de_at, or de-ch. +(default is 'en') | ASCII::*_LANGUAGE_CODE</p>` +- `bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound ".</p>` +- `bool $asOrigReplaceArray [optional] <p>TRUE === return {orig: string[], replace: string[]} +array</p>` + +**Return:** +- `array <p>An array of replacements.</p>` + +-------- + +#### charsArrayWithSingleLanguageValues(bool $replace_extra_symbols, bool $asOrigReplaceArray): array +<a href="#voku-php-readme-class-methods">↑</a> +Returns an replacement array for ASCII methods with multiple languages. + +EXAMPLE: <code> +$array = ASCII::charsArrayWithSingleLanguageValues(); +$tmpKey = \array_search('hnaik', $array['replace']); +echo $array['orig'][$tmpKey]; // '၌' +</code> + +**Parameters:** +- `bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound ".</p>` +- `bool $asOrigReplaceArray [optional] <p>TRUE === return {orig: string[], replace: string[]} +array</p>` + +**Return:** +- `array <p>An array of replacements.</p>` + +-------- + +#### clean(string $str, bool $normalize_whitespace, bool $keep_non_breaking_space, bool $normalize_msword, bool $remove_invisible_characters): string +<a href="#voku-php-readme-class-methods">↑</a> +Accepts a string and removes all non-UTF-8 characters from it + extras if needed. + +**Parameters:** +- `string $str <p>The string to be sanitized.</p>` +- `bool $normalize_whitespace [optional] <p>Set to true, if you need to normalize the +whitespace.</p>` +- `bool $keep_non_breaking_space [optional] <p>Set to true, to keep non-breaking-spaces, in +combination with +$normalize_whitespace</p>` +- `bool $normalize_msword [optional] <p>Set to true, if you need to normalize MS Word chars +e.g.: "…" +=> "..."</p>` +- `bool $remove_invisible_characters [optional] <p>Set to false, if you not want to remove invisible +characters e.g.: "\0"</p>` + +**Return:** +- `string <p>A clean UTF-8 string.</p>` + +-------- + +#### getAllLanguages(): string[] +<a href="#voku-php-readme-class-methods">↑</a> +Get all languages from the constants "ASCII::.*LANGUAGE_CODE". + +**Parameters:** +__nothing__ + +**Return:** +- `string[]` + +-------- + +#### is_ascii(string $str): bool +<a href="#voku-php-readme-class-methods">↑</a> +Checks if a string is 7 bit ASCII. + +EXAMPLE: <code> +ASCII::is_ascii('白'); // false +</code> + +**Parameters:** +- `string $str <p>The string to check.</p>` + +**Return:** +- `bool <p> +<strong>true</strong> if it is ASCII<br> +<strong>false</strong> otherwise +</p>` + +-------- + +#### normalize_msword(string $str): string +<a href="#voku-php-readme-class-methods">↑</a> +Returns a string with smart quotes, ellipsis characters, and dashes from +Windows-1252 (commonly used in Word documents) replaced by their ASCII +equivalents. + +EXAMPLE: <code> +ASCII::normalize_msword('„Abcdef…”'); // '"Abcdef..."' +</code> + +**Parameters:** +- `string $str <p>The string to be normalized.</p>` + +**Return:** +- `string <p>A string with normalized characters for commonly used chars in Word documents.</p>` + +-------- + +#### normalize_whitespace(string $str, bool $keepNonBreakingSpace, bool $keepBidiUnicodeControls, bool $normalize_control_characters): string +<a href="#voku-php-readme-class-methods">↑</a> +Normalize the whitespace. + +EXAMPLE: <code> +ASCII::normalize_whitespace("abc-\xc2\xa0-öäü-\xe2\x80\xaf-\xE2\x80\xAC", true); // "abc-\xc2\xa0-öäü- -" +</code> + +**Parameters:** +- `string $str <p>The string to be normalized.</p>` +- `bool $keepNonBreakingSpace [optional] <p>Set to true, to keep non-breaking-spaces.</p>` +- `bool $keepBidiUnicodeControls [optional] <p>Set to true, to keep non-printable (for the web) +bidirectional text chars.</p>` +- `bool $normalize_control_characters [optional] <p>Set to true, to convert e.g. LINE-, PARAGRAPH-SEPARATOR with "\n" and LINE TABULATION with "\t".</p>` + +**Return:** +- `string <p>A string with normalized whitespace.</p>` + +-------- + +#### remove_invisible_characters(string $str, bool $url_encoded, string $replacement, bool $keep_basic_control_characters): string +<a href="#voku-php-readme-class-methods">↑</a> +Remove invisible characters from a string. + +e.g.: This prevents sandwiching null characters between ascii characters, like Java\0script. + +copy&past from https://github.com/bcit-ci/CodeIgniter/blob/develop/system/core/Common.php + +**Parameters:** +- `string $str` +- `bool $url_encoded` +- `string $replacement` +- `bool $keep_basic_control_characters` + +**Return:** +- `string` + +-------- + +#### to_ascii(string $str, string $language, bool $remove_unsupported_chars, bool $replace_extra_symbols, bool $use_transliterate, bool|null $replace_single_chars_only): string +<a href="#voku-php-readme-class-methods">↑</a> +Returns an ASCII version of the string. A set of non-ASCII characters are +replaced with their closest ASCII counterparts, and the rest are removed +by default. The language or locale of the source string can be supplied +for language-specific transliteration in any of the following formats: +en, en_GB, or en-GB. For example, passing "de" results in "äöü" mapping +to "aeoeue" rather than "aou" as in other languages. + +EXAMPLE: <code> +ASCII::to_ascii('�Düsseldorf�', 'en'); // Dusseldorf +</code> + +**Parameters:** +- `string $str <p>The input string.</p>` +- `ASCII::* $language [optional] <p>Language of the source string. +(default is 'en') | ASCII::*_LANGUAGE_CODE</p>` +- `bool $remove_unsupported_chars [optional] <p>Whether or not to remove the +unsupported characters.</p>` +- `bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound +".</p>` +- `bool $use_transliterate [optional] <p>Use ASCII::to_transliterate() for unknown chars.</p>` +- `bool|null $replace_single_chars_only [optional] <p>Single char replacement is better for the +performance, but some languages need to replace more then one char +at the same time. | NULL === auto-setting, depended on the +language</p>` + +**Return:** +- `string <p>A string that contains only ASCII characters.</p>` + +-------- + +#### to_ascii_remap(string $str1, string $str2): string[] +<a href="#voku-php-readme-class-methods">↑</a> +WARNING: This method will return broken characters and is only for special cases. + +Convert two UTF-8 encoded string to a single-byte strings suitable for +functions that need the same string length after the conversion. + +The function simply uses (and updates) a tailored dynamic encoding +(in/out map parameter) where non-ascii characters are remapped to +the range [128-255] in order of appearance. + +**Parameters:** +- `string $str1` +- `string $str2` + +**Return:** +- `string[]` + +-------- + +#### to_filename(string $str, bool $use_transliterate, string $fallback_char): string +<a href="#voku-php-readme-class-methods">↑</a> +Convert given string to safe filename (and keep string case). + +EXAMPLE: <code> +ASCII::to_filename('שדגשדג.png', true)); // 'shdgshdg.png' +</code> + +**Parameters:** +- `string $str` +- `bool $use_transliterate <p>ASCII::to_transliterate() is used by default - unsafe characters are +simply replaced with hyphen otherwise.</p>` +- `string $fallback_char` + +**Return:** +- `string <p>A string that contains only safe characters for a filename.</p>` + +-------- + +#### to_slugify(string $str, string $separator, string $language, string[] $replacements, bool $replace_extra_symbols, bool $use_str_to_lower, bool $use_transliterate): string +<a href="#voku-php-readme-class-methods">↑</a> +Converts the string into an URL slug. This includes replacing non-ASCII +characters with their closest ASCII equivalents, removing remaining +non-ASCII and non-alphanumeric characters, and replacing whitespace with +$separator. The separator defaults to a single dash, and the string +is also converted to lowercase. The language of the source string can +also be supplied for language-specific transliteration. + +**Parameters:** +- `string $str` +- `string $separator [optional] <p>The string used to replace whitespace.</p>` +- `ASCII::* $language [optional] <p>Language of the source string. +(default is 'en') | ASCII::*_LANGUAGE_CODE</p>` +- `array<string, string> $replacements [optional] <p>A map of replaceable strings.</p>` +- `bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " +pound ".</p>` +- `bool $use_str_to_lower [optional] <p>Use "string to lower" for the input.</p>` +- `bool $use_transliterate [optional] <p>Use ASCII::to_transliterate() for unknown +chars.</p>` + +**Return:** +- `string <p>A string that has been converted to an URL slug.</p>` + +-------- + +#### to_transliterate(string $str, string|null $unknown, bool $strict): string +<a href="#voku-php-readme-class-methods">↑</a> +Returns an ASCII version of the string. A set of non-ASCII characters are +replaced with their closest ASCII counterparts, and the rest are removed +unless instructed otherwise. + +EXAMPLE: <code> +ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii' +</code> + +**Parameters:** +- `string $str <p>The input string.</p>` +- `string|null $unknown [optional] <p>Character use if character unknown. (default is '?') +But you can also use NULL to keep the unknown chars.</p>` +- `bool $strict [optional] <p>Use "transliterator_transliterate()" from PHP-Intl` + +**Return:** +- `string <p>A String that contains only ASCII characters.</p>` + +-------- + + + +## Unit Test + +1) [Composer](https://getcomposer.org) is a prerequisite for running the tests. + +``` +composer install +``` + +2) The tests can be executed by running this command from the root directory: + +```bash +./vendor/bin/phpunit +``` + +### Support + +For support and donations please visit [Github](https://github.com/voku/portable-ascii/) | [Issues](https://github.com/voku/portable-ascii/issues) | [PayPal](https://paypal.me/moelleken) | [Patreon](https://www.patreon.com/voku). + +For status updates and release announcements please visit [Releases](https://github.com/voku/portable-ascii/releases) | [Twitter](https://twitter.com/suckup_de) | [Patreon](https://www.patreon.com/voku/posts). + +For professional support please contact [me](https://about.me/voku). + +### Thanks + +- Thanks to [GitHub](https://github.com) (Microsoft) for hosting the code and a good infrastructure including Issues-Managment, etc. +- Thanks to [IntelliJ](https://www.jetbrains.com) as they make the best IDEs for PHP and they gave me an open source license for PhpStorm! +- Thanks to [Travis CI](https://travis-ci.com/) for being the most awesome, easiest continous integration tool out there! +- Thanks to [StyleCI](https://styleci.io/) for the simple but powerful code style check. +- Thanks to [PHPStan](https://github.com/phpstan/phpstan) && [Psalm](https://github.com/vimeo/psalm) for really great Static analysis tools and for discover bugs in the code! + +### License and Copyright + +Released under the MIT License - see `LICENSE.txt` for details. diff --git a/vendor/voku/portable-ascii/composer.json b/vendor/voku/portable-ascii/composer.json new file mode 100644 index 0000000..99dee4f --- /dev/null +++ b/vendor/voku/portable-ascii/composer.json @@ -0,0 +1,37 @@ +{ + "name": "voku/portable-ascii", + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "type": "library", + "keywords": [ + "clean", + "php", + "ascii" + ], + "homepage": "https://github.com/voku/portable-ascii", + "license": "MIT", + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "autoload-dev": { + "psr-4": { + "voku\\tests\\": "tests/" + } + } +} diff --git a/vendor/voku/portable-ascii/src/voku/helper/ASCII.php b/vendor/voku/portable-ascii/src/voku/helper/ASCII.php new file mode 100644 index 0000000..7d8b66d --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/ASCII.php @@ -0,0 +1,1501 @@ +<?php + +declare(strict_types=1); + +namespace voku\helper; + +/** + * ## 🇷🇺 Русским гражданам + * В Украине сейчас идет война. Силами РФ наносятся удары по гражданской инфраструктуре в [Харькове][1], [Киеве][2], [Чернигове][3], [Сумах][4], [Ирпене][5] и десятках других городов. Гибнут люди - и гражданское население, и военные, в том числе российские призывники, которых бросили воевать. Чтобы лишить собственный народ доступа к информации, правительство РФ запретило называть войну войной, закрыло независимые СМИ и принимает сейчас ряд диктаторских законов. Эти законы призваны заткнуть рот всем, кто против войны. За обычный призыв к миру сейчас можно получить несколько лет тюрьмы. + * Не молчите! Молчание - знак вашего согласия с политикой российского правительства. + * **Вы можете сделать выбор НЕ МОЛЧАТЬ.** + * --- + * ## 🇺🇸 To people of Russia + * There is a war in Ukraine right now. The forces of the Russian Federation are attacking civilian infrastructure in [Kharkiv][1], [Kyiv][2], [Chernihiv][3], [Sumy][4], [Irpin][5] and dozens of other cities. People are dying – both civilians and military servicemen, including Russian conscripts who were thrown into the fighting. In order to deprive its own people of access to information, the government of the Russian Federation has forbidden calling a war a war, shut down independent media and is passing a number of dictatorial laws. These laws are meant to silence all those who are against war. You can be jailed for multiple years for simply calling for peace. + * Do not be silent! Silence is a sign that you accept the Russian government's policy. + * **You can choose NOT TO BE SILENT.** + * --- + * - [1] https://cloudfront-us-east-2.images.arcpublishing.com/reuters/P7K2MSZDGFMIJPDD7CI2GIROJI.jpg "Kharkiv under attack" + * - [2] https://gdb.voanews.com/01bd0000-0aff-0242-fad0-08d9fc92c5b3_cx0_cy5_cw0_w1023_r1_s.jpg "Kyiv under attack" + * - [3] https://ichef.bbci.co.uk/news/976/cpsprodpb/163DD/production/_123510119_hi074310744.jpg "Chernihiv under attack" + * - [4] https://www.youtube.com/watch?v=8K-bkqKKf2A "Sumy under attack" + * - [5] https://cloudfront-us-east-2.images.arcpublishing.com/reuters/K4MTMLEHTRKGFK3GSKAT4GR3NE.jpg "Irpin under attack" + * + * @psalm-immutable + */ +final class ASCII +{ + // + // INFO: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes + // + + const UZBEK_LANGUAGE_CODE = 'uz'; + + const TURKMEN_LANGUAGE_CODE = 'tk'; + + const THAI_LANGUAGE_CODE = 'th'; + + const PASHTO_LANGUAGE_CODE = 'ps'; + + const ORIYA_LANGUAGE_CODE = 'or'; + + const MONGOLIAN_LANGUAGE_CODE = 'mn'; + + const KOREAN_LANGUAGE_CODE = 'ko'; + + const KIRGHIZ_LANGUAGE_CODE = 'ky'; + + const ARMENIAN_LANGUAGE_CODE = 'hy'; + + const BENGALI_LANGUAGE_CODE = 'bn'; + + const BELARUSIAN_LANGUAGE_CODE = 'be'; + + const AMHARIC_LANGUAGE_CODE = 'am'; + + const JAPANESE_LANGUAGE_CODE = 'ja'; + + const CHINESE_LANGUAGE_CODE = 'zh'; + + const DUTCH_LANGUAGE_CODE = 'nl'; + + const ITALIAN_LANGUAGE_CODE = 'it'; + + const MACEDONIAN_LANGUAGE_CODE = 'mk'; + + const PORTUGUESE_LANGUAGE_CODE = 'pt'; + + const GREEKLISH_LANGUAGE_CODE = 'el__greeklish'; + + const GREEK_LANGUAGE_CODE = 'el'; + + const HINDI_LANGUAGE_CODE = 'hi'; + + const SWEDISH_LANGUAGE_CODE = 'sv'; + + const TURKISH_LANGUAGE_CODE = 'tr'; + + const BULGARIAN_LANGUAGE_CODE = 'bg'; + + const HUNGARIAN_LANGUAGE_CODE = 'hu'; + + const MYANMAR_LANGUAGE_CODE = 'my'; + + const CROATIAN_LANGUAGE_CODE = 'hr'; + + const FINNISH_LANGUAGE_CODE = 'fi'; + + const GEORGIAN_LANGUAGE_CODE = 'ka'; + + const RUSSIAN_LANGUAGE_CODE = 'ru'; + + const RUSSIAN_PASSPORT_2013_LANGUAGE_CODE = 'ru__passport_2013'; + + const RUSSIAN_GOST_2000_B_LANGUAGE_CODE = 'ru__gost_2000_b'; + + const UKRAINIAN_LANGUAGE_CODE = 'uk'; + + const KAZAKH_LANGUAGE_CODE = 'kk'; + + const CZECH_LANGUAGE_CODE = 'cs'; + + const DANISH_LANGUAGE_CODE = 'da'; + + const POLISH_LANGUAGE_CODE = 'pl'; + + const ROMANIAN_LANGUAGE_CODE = 'ro'; + + const ESPERANTO_LANGUAGE_CODE = 'eo'; + + const ESTONIAN_LANGUAGE_CODE = 'et'; + + const LATVIAN_LANGUAGE_CODE = 'lv'; + + const LITHUANIAN_LANGUAGE_CODE = 'lt'; + + const NORWEGIAN_LANGUAGE_CODE = 'no'; + + const VIETNAMESE_LANGUAGE_CODE = 'vi'; + + const ARABIC_LANGUAGE_CODE = 'ar'; + + const PERSIAN_LANGUAGE_CODE = 'fa'; + + const SERBIAN_LANGUAGE_CODE = 'sr'; + + const SERBIAN_CYRILLIC_LANGUAGE_CODE = 'sr__cyr'; + + const SERBIAN_LATIN_LANGUAGE_CODE = 'sr__lat'; + + const AZERBAIJANI_LANGUAGE_CODE = 'az'; + + const SLOVAK_LANGUAGE_CODE = 'sk'; + + const FRENCH_LANGUAGE_CODE = 'fr'; + + const FRENCH_AUSTRIAN_LANGUAGE_CODE = 'fr_at'; + + const FRENCH_SWITZERLAND_LANGUAGE_CODE = 'fr_ch'; + + const GERMAN_LANGUAGE_CODE = 'de'; + + const GERMAN_AUSTRIAN_LANGUAGE_CODE = 'de_at'; + + const GERMAN_SWITZERLAND_LANGUAGE_CODE = 'de_ch'; + + const ENGLISH_LANGUAGE_CODE = 'en'; + + const EXTRA_LATIN_CHARS_LANGUAGE_CODE = 'latin'; + + const EXTRA_WHITESPACE_CHARS_LANGUAGE_CODE = ' '; + + const EXTRA_MSWORD_CHARS_LANGUAGE_CODE = 'msword'; + + /** + * @var array<string, array<string, string>>|null + */ + private static $ASCII_MAPS; + + /** + * @var array<string, array<string, string>>|null + */ + private static $ASCII_MAPS_AND_EXTRAS; + + /** + * @var array<string, array<string, string>>|null + */ + private static $ASCII_EXTRAS; + + /** + * @var array<string, int>|null + */ + private static $ORD; + + /** + * @var array<string, int>|null + */ + private static $LANGUAGE_MAX_KEY; + + /** + * url: https://en.wikipedia.org/wiki/Wikipedia:ASCII#ASCII_printable_characters + * + * @var string + */ + private static $REGEX_ASCII = "[^\x09\x10\x13\x0A\x0D\x20-\x7E]"; + + /** + * bidirectional text chars + * + * url: https://www.w3.org/International/questions/qa-bidi-unicode-controls + * + * @var array<int, string> + */ + private static $BIDI_UNI_CODE_CONTROLS_TABLE = [ + // LEFT-TO-RIGHT EMBEDDING (use -> dir = "ltr") + 8234 => "\xE2\x80\xAA", + // RIGHT-TO-LEFT EMBEDDING (use -> dir = "rtl") + 8235 => "\xE2\x80\xAB", + // POP DIRECTIONAL FORMATTING // (use -> </bdo>) + 8236 => "\xE2\x80\xAC", + // LEFT-TO-RIGHT OVERRIDE // (use -> <bdo dir = "ltr">) + 8237 => "\xE2\x80\xAD", + // RIGHT-TO-LEFT OVERRIDE // (use -> <bdo dir = "rtl">) + 8238 => "\xE2\x80\xAE", + // LEFT-TO-RIGHT ISOLATE // (use -> dir = "ltr") + 8294 => "\xE2\x81\xA6", + // RIGHT-TO-LEFT ISOLATE // (use -> dir = "rtl") + 8295 => "\xE2\x81\xA7", + // FIRST STRONG ISOLATE // (use -> dir = "auto") + 8296 => "\xE2\x81\xA8", + // POP DIRECTIONAL ISOLATE + 8297 => "\xE2\x81\xA9", + ]; + + /** + * Get all languages from the constants "ASCII::.*LANGUAGE_CODE". + * + * @return string[] + * + * @phpstan-return array<string, string> + */ + public static function getAllLanguages(): array + { + // init + static $LANGUAGES = []; + + if ($LANGUAGES !== []) { + return $LANGUAGES; + } + + foreach ((new \ReflectionClass(__CLASS__))->getConstants() as $constant => $lang) { + if (\strpos($constant, 'EXTRA') !== false) { + $LANGUAGES[\strtolower($constant)] = $lang; + } else { + $LANGUAGES[\strtolower(\str_replace('_LANGUAGE_CODE', '', $constant))] = $lang; + } + } + + return $LANGUAGES; + } + + /** + * Returns an replacement array for ASCII methods. + * + * EXAMPLE: <code> + * $array = ASCII::charsArray(); + * var_dump($array['ru']['б']); // 'b' + * </code> + * + * @psalm-suppress InvalidNullableReturnType - we use the prepare* methods here, so we don't get NULL here + * + * @param bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound ".</p> + * + * @psalm-pure + * + * @return array + * + * @phpstan-return array<string, array<string , string>> + */ + public static function charsArray(bool $replace_extra_symbols = false): array + { + if ($replace_extra_symbols) { + self::prepareAsciiAndExtrasMaps(); + + return self::$ASCII_MAPS_AND_EXTRAS ?? []; + } + + self::prepareAsciiMaps(); + + return self::$ASCII_MAPS ?? []; + } + + /** + * Returns an replacement array for ASCII methods with a mix of multiple languages. + * + * EXAMPLE: <code> + * $array = ASCII::charsArrayWithMultiLanguageValues(); + * var_dump($array['b']); // ['β', 'б', 'ဗ', 'ბ', 'ب'] + * </code> + * + * @param bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound ".</p> + * + * @psalm-pure + * + * @return array + * <p>An array of replacements.</p> + * + * @phpstan-return array<string, array<int, string>> + */ + public static function charsArrayWithMultiLanguageValues(bool $replace_extra_symbols = false): array + { + /** @var array<string, array<string, array<int, string>>> */ + static $CHARS_ARRAY = []; + $cacheKey = '' . $replace_extra_symbols; + + if (isset($CHARS_ARRAY[$cacheKey])) { + return $CHARS_ARRAY[$cacheKey]; + } + + // init + $return = []; + $language_all_chars = self::charsArrayWithSingleLanguageValues( + $replace_extra_symbols, + false + ); + + /** @noinspection PhpSillyAssignmentInspection - hack for phpstan */ + /** @var array<string, string> $language_all_chars */ + $language_all_chars = $language_all_chars; + + /** @noinspection AlterInForeachInspection */ + foreach ($language_all_chars as $key => &$value) { + $return[$value][] = $key; + } + + $CHARS_ARRAY[$cacheKey] = $return; + + /** @var array<string, array<int, string>> $return - hack for phpstan */ + return $return; + } + + /** + * Returns an replacement array for ASCII methods with one language. + * + * For example, German will map 'ä' to 'ae', while other languages + * will simply return e.g. 'a'. + * + * EXAMPLE: <code> + * $array = ASCII::charsArrayWithOneLanguage('ru'); + * $tmpKey = \array_search('yo', $array['replace']); + * echo $array['orig'][$tmpKey]; // 'ё' + * </code> + * + * @psalm-suppress InvalidNullableReturnType - we use the prepare* methods here, so we don't get NULL here + * + * @param string $language [optional] <p>Language of the source string e.g.: en, de_at, or de-ch. + * (default is 'en') | ASCII::*_LANGUAGE_CODE</p> + * @param bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound ".</p> + * @param bool $asOrigReplaceArray [optional] <p>TRUE === return {orig: string[], replace: string[]} + * array</p> + * + * @psalm-pure + * + * @return array + * <p>An array of replacements.</p> + * + * @phpstan-param ASCII::*_LANGUAGE_CODE $language + * @phpstan-return array{orig: string[], replace: string[]}|array<string, string> + */ + public static function charsArrayWithOneLanguage( + string $language = self::ENGLISH_LANGUAGE_CODE, + bool $replace_extra_symbols = false, + bool $asOrigReplaceArray = true + ): array { + $language = self::get_language($language); + + // init + /** @var array<string, array<string, array<string, string>|array{orig: string[], replace: string[]}>> */ + static $CHARS_ARRAY = []; + $cacheKey = '' . $replace_extra_symbols . '-' . $asOrigReplaceArray; + + // check static cache + if (isset($CHARS_ARRAY[$cacheKey][$language])) { + return $CHARS_ARRAY[$cacheKey][$language]; + } + + if ($replace_extra_symbols) { + self::prepareAsciiAndExtrasMaps(); + + /** @noinspection DuplicatedCode */ + if (isset(self::$ASCII_MAPS_AND_EXTRAS[$language])) { + $tmpArray = self::$ASCII_MAPS_AND_EXTRAS[$language]; + + if ($asOrigReplaceArray) { + $CHARS_ARRAY[$cacheKey][$language] = [ + 'orig' => \array_keys($tmpArray), + 'replace' => \array_values($tmpArray), + ]; + } else { + $CHARS_ARRAY[$cacheKey][$language] = $tmpArray; + } + } else { + /** @noinspection NestedPositiveIfStatementsInspection */ + if ($asOrigReplaceArray) { + $CHARS_ARRAY[$cacheKey][$language] = [ + 'orig' => [], + 'replace' => [], + ]; + } else { + $CHARS_ARRAY[$cacheKey][$language] = []; + } + } + } else { + self::prepareAsciiMaps(); + + /** @noinspection DuplicatedCode */ + if (isset(self::$ASCII_MAPS[$language])) { + $tmpArray = self::$ASCII_MAPS[$language]; + + if ($asOrigReplaceArray) { + $CHARS_ARRAY[$cacheKey][$language] = [ + 'orig' => \array_keys($tmpArray), + 'replace' => \array_values($tmpArray), + ]; + } else { + $CHARS_ARRAY[$cacheKey][$language] = $tmpArray; + } + } else { + /** @noinspection NestedPositiveIfStatementsInspection */ + if ($asOrigReplaceArray) { + $CHARS_ARRAY[$cacheKey][$language] = [ + 'orig' => [], + 'replace' => [], + ]; + } else { + $CHARS_ARRAY[$cacheKey][$language] = []; + } + } + } + + return $CHARS_ARRAY[$cacheKey][$language] ?? ['orig' => [], 'replace' => []]; + } + + /** + * Returns an replacement array for ASCII methods with multiple languages. + * + * EXAMPLE: <code> + * $array = ASCII::charsArrayWithSingleLanguageValues(); + * $tmpKey = \array_search('hnaik', $array['replace']); + * echo $array['orig'][$tmpKey]; // '၌' + * </code> + * + * @param bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound ".</p> + * @param bool $asOrigReplaceArray [optional] <p>TRUE === return {orig: string[], replace: string[]} + * array</p> + * + * @psalm-pure + * + * @return array + * <p>An array of replacements.</p> + * + * @phpstan-return array{orig: string[], replace: string[]}|array<string, string> + */ + public static function charsArrayWithSingleLanguageValues( + bool $replace_extra_symbols = false, + bool $asOrigReplaceArray = true + ): array { + // init + /** @var array<string, array<string, string>|array{orig: string[], replace: string[]}> */ + static $CHARS_ARRAY = []; + $cacheKey = '' . $replace_extra_symbols . '-' . $asOrigReplaceArray; + + if (isset($CHARS_ARRAY[$cacheKey])) { + return $CHARS_ARRAY[$cacheKey]; + } + + if ($replace_extra_symbols) { + self::prepareAsciiAndExtrasMaps(); + + /** @noinspection AlterInForeachInspection */ + /** @psalm-suppress PossiblyNullIterator - we use the prepare* methods here, so we don't get NULL here */ + foreach (self::$ASCII_MAPS_AND_EXTRAS ?? [] as &$map) { + $CHARS_ARRAY[$cacheKey][] = $map; + } + } else { + self::prepareAsciiMaps(); + + /** @noinspection AlterInForeachInspection */ + /** @psalm-suppress PossiblyNullIterator - we use the prepare* methods here, so we don't get NULL here */ + foreach (self::$ASCII_MAPS ?? [] as &$map) { + $CHARS_ARRAY[$cacheKey][] = $map; + } + } + + /** @phpstan-ignore-next-line - ... error? */ + $CHARS_ARRAY[$cacheKey] = \array_merge([], ...$CHARS_ARRAY[$cacheKey]); + + if ($asOrigReplaceArray) { + $CHARS_ARRAY[$cacheKey] = [ + 'orig' => \array_keys($CHARS_ARRAY[$cacheKey]), + 'replace' => \array_values($CHARS_ARRAY[$cacheKey]), + ]; + } + + return $CHARS_ARRAY[$cacheKey]; + } + + /** + * Accepts a string and removes all non-UTF-8 characters from it + extras if needed. + * + * @param string $str <p>The string to be sanitized.</p> + * @param bool $normalize_whitespace [optional] <p>Set to true, if you need to normalize the + * whitespace.</p> + * @param bool $normalize_msword [optional] <p>Set to true, if you need to normalize MS Word chars + * e.g.: "…" + * => "..."</p> + * @param bool $keep_non_breaking_space [optional] <p>Set to true, to keep non-breaking-spaces, in + * combination with + * $normalize_whitespace</p> + * @param bool $remove_invisible_characters [optional] <p>Set to false, if you not want to remove invisible + * characters e.g.: "\0"</p> + * + * @psalm-pure + * + * @return string + * <p>A clean UTF-8 string.</p> + */ + public static function clean( + string $str, + bool $normalize_whitespace = true, + bool $keep_non_breaking_space = false, + bool $normalize_msword = true, + bool $remove_invisible_characters = true + ): string { + // http://stackoverflow.com/questions/1401317/remove-non-utf8-characters-from-string + // caused connection reset problem on larger strings + + $regex = '/ + ( + (?: [\x00-\x7F] # single-byte sequences 0xxxxxxx + | [\xC0-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx + | [\xE0-\xEF][\x80-\xBF]{2} # triple-byte sequences 1110xxxx 10xxxxxx * 2 + | [\xF0-\xF7][\x80-\xBF]{3} # quadruple-byte sequence 11110xxx 10xxxxxx * 3 + ){1,100} # ...one or more times + ) + | ( [\x80-\xBF] ) # invalid byte in range 10000000 - 10111111 + | ( [\xC0-\xFF] ) # invalid byte in range 11000000 - 11111111 + /x'; + $str = (string) \preg_replace($regex, '$1', $str); + + if ($normalize_whitespace) { + $str = self::normalize_whitespace($str, $keep_non_breaking_space); + } + + if ($normalize_msword) { + $str = self::normalize_msword($str); + } + + if ($remove_invisible_characters) { + $str = self::remove_invisible_characters($str); + } + + return $str; + } + + /** + * Checks if a string is 7 bit ASCII. + * + * EXAMPLE: <code> + * ASCII::is_ascii('白'); // false + * </code> + * + * @param string $str <p>The string to check.</p> + * + * @psalm-pure + * + * @return bool + * <p> + * <strong>true</strong> if it is ASCII<br> + * <strong>false</strong> otherwise + * </p> + */ + public static function is_ascii(string $str): bool + { + if ($str === '') { + return true; + } + + return !\preg_match('/' . self::$REGEX_ASCII . '/', $str); + } + + /** + * Returns a string with smart quotes, ellipsis characters, and dashes from + * Windows-1252 (commonly used in Word documents) replaced by their ASCII + * equivalents. + * + * EXAMPLE: <code> + * ASCII::normalize_msword('„Abcdef…”'); // '"Abcdef..."' + * </code> + * + * @param string $str <p>The string to be normalized.</p> + * + * @psalm-pure + * + * @return string + * <p>A string with normalized characters for commonly used chars in Word documents.</p> + */ + public static function normalize_msword(string $str): string + { + if ($str === '') { + return ''; + } + + /** @var array{orig: string[], replace: string[]} */ + static $MSWORD_CACHE = ['orig' => [], 'replace' => []]; + + if (empty($MSWORD_CACHE['orig'])) { + self::prepareAsciiMaps(); + + /** @var array<string, string> */ + $map = self::$ASCII_MAPS[self::EXTRA_MSWORD_CHARS_LANGUAGE_CODE] ?? []; + + $MSWORD_CACHE = [ + 'orig' => \array_keys($map), + 'replace' => \array_values($map), + ]; + } + + return \str_replace($MSWORD_CACHE['orig'], $MSWORD_CACHE['replace'], $str); + } + + /** + * Normalize the whitespace. + * + * EXAMPLE: <code> + * ASCII::normalize_whitespace("abc-\xc2\xa0-öäü-\xe2\x80\xaf-\xE2\x80\xAC", true); // "abc-\xc2\xa0-öäü- -" + * </code> + * + * @param string $str <p>The string to be normalized.</p> + * @param bool $keepNonBreakingSpace [optional] <p>Set to true, to keep non-breaking-spaces.</p> + * @param bool $keepBidiUnicodeControls [optional] <p>Set to true, to keep non-printable (for the web) + * bidirectional text chars.</p> + * @param bool $normalize_control_characters [optional] <p>Set to true, to convert e.g. LINE-, PARAGRAPH-SEPARATOR with "\n" and LINE TABULATION with "\t".</p> + * + * @psalm-pure + * + * @return string + * <p>A string with normalized whitespace.</p> + */ + public static function normalize_whitespace( + string $str, + bool $keepNonBreakingSpace = false, + bool $keepBidiUnicodeControls = false, + bool $normalize_control_characters = false + ): string { + if ($str === '') { + return ''; + } + + /** @var array<int,array<string,string>> */ + static $WHITESPACE_CACHE = []; + $cacheKey = (int) $keepNonBreakingSpace; + + if ($normalize_control_characters) { + $str = \str_replace( + [ + "\x0d\x0c", // 'END OF LINE' + "\xe2\x80\xa8", // 'LINE SEPARATOR' + "\xe2\x80\xa9", // 'PARAGRAPH SEPARATOR' + "\x0c", // 'FORM FEED' // "\f" + "\x0b", // 'VERTICAL TAB' // "\v" + ], + [ + "\n", + "\n", + "\n", + "\n", + "\t", + ], + $str + ); + } + + if (!isset($WHITESPACE_CACHE[$cacheKey])) { + self::prepareAsciiMaps(); + + $WHITESPACE_CACHE[$cacheKey] = self::$ASCII_MAPS[self::EXTRA_WHITESPACE_CHARS_LANGUAGE_CODE] ?? []; + + if ($keepNonBreakingSpace) { + unset($WHITESPACE_CACHE[$cacheKey]["\xc2\xa0"]); + } + + $WHITESPACE_CACHE[$cacheKey] = array_keys($WHITESPACE_CACHE[$cacheKey]); + } + + if (!$keepBidiUnicodeControls) { + /** @var array<int,string>|null */ + static $BIDI_UNICODE_CONTROLS_CACHE = null; + + if ($BIDI_UNICODE_CONTROLS_CACHE === null) { + $BIDI_UNICODE_CONTROLS_CACHE = self::$BIDI_UNI_CODE_CONTROLS_TABLE; + } + + $str = \str_replace($BIDI_UNICODE_CONTROLS_CACHE, '', $str); + } + + return \str_replace($WHITESPACE_CACHE[$cacheKey], ' ', $str); + } + + /** + * Remove invisible characters from a string. + * + * e.g.: This prevents sandwiching null characters between ascii characters, like Java\0script. + * + * copy&past from https://github.com/bcit-ci/CodeIgniter/blob/develop/system/core/Common.php + * + * @param string $str + * @param bool $url_encoded + * @param string $replacement + * @param bool $keep_basic_control_characters + * + * @psalm-pure + * + * @return string + */ + public static function remove_invisible_characters( + string $str, + bool $url_encoded = false, + string $replacement = '', + bool $keep_basic_control_characters = true + ): string { + // init + $non_displayables = []; + + // every control character except: + // - newline (dec 10), + // - carriage return (dec 13), + // - horizontal tab (dec 09) + if ($url_encoded) { + $non_displayables[] = '/%0[0-8bcefBCEF]/'; // url encoded 00-08, 11, 12, 14, 15 + $non_displayables[] = '/%1[0-9a-fA-F]/'; // url encoded 16-31 + } + + if ($keep_basic_control_characters) { + $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 + } else { + $str = self::normalize_whitespace($str, false, false, true); + $non_displayables[] = '/[^\P{C}\s]/u'; + } + + do { + $str = (string) \preg_replace($non_displayables, $replacement, $str, -1, $count); + } while ($count !== 0); + + return $str; + } + + /** + * WARNING: This method will return broken characters and is only for special cases. + * + * Convert two UTF-8 encoded string to a single-byte strings suitable for + * functions that need the same string length after the conversion. + * + * The function simply uses (and updates) a tailored dynamic encoding + * (in/out map parameter) where non-ascii characters are remapped to + * the range [128-255] in order of appearance. + * + * @param string $str1 + * @param string $str2 + * + * @return string[] + * + * @phpstan-return array{0: string, 1: string} + */ + public static function to_ascii_remap(string $str1, string $str2): array + { + $charMap = []; + $str1 = self::to_ascii_remap_intern($str1, $charMap); + $str2 = self::to_ascii_remap_intern($str2, $charMap); + + return [$str1, $str2]; + } + + /** + * Returns an ASCII version of the string. A set of non-ASCII characters are + * replaced with their closest ASCII counterparts, and the rest are removed + * by default. The language or locale of the source string can be supplied + * for language-specific transliteration in any of the following formats: + * en, en_GB, or en-GB. For example, passing "de" results in "äöü" mapping + * to "aeoeue" rather than "aou" as in other languages. + * + * EXAMPLE: <code> + * ASCII::to_ascii('�Düsseldorf�', 'en'); // Dusseldorf + * </code> + * + * @param string $str <p>The input string.</p> + * @param string $language [optional] <p>Language of the source string. + * (default is 'en') | ASCII::*_LANGUAGE_CODE</p> + * @param bool $remove_unsupported_chars [optional] <p>Whether or not to remove the + * unsupported characters.</p> + * @param bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " pound + * ".</p> + * @param bool $use_transliterate [optional] <p>Use ASCII::to_transliterate() for unknown chars.</p> + * @param bool|null $replace_single_chars_only [optional] <p>Single char replacement is better for the + * performance, but some languages need to replace more then one char + * at the same time. | NULL === auto-setting, depended on the + * language</p> + * + * @psalm-pure + * + * @return string + * <p>A string that contains only ASCII characters.</p> + * + * @phpstan-param ASCII::*_LANGUAGE_CODE $language + */ + public static function to_ascii( + string $str, + string $language = self::ENGLISH_LANGUAGE_CODE, + bool $remove_unsupported_chars = true, + bool $replace_extra_symbols = false, + bool $use_transliterate = false, + bool $replace_single_chars_only = null + ): string { + if ($str === '') { + return ''; + } + + /** @phpstan-var ASCII::*_LANGUAGE_CODE - hack for phpstan */ + $language = self::get_language($language); + + static $EXTRA_SYMBOLS_CACHE = null; + + /** @var array<string,array<string,string>> */ + static $REPLACE_HELPER_CACHE = []; + $cacheKey = $language . '-' . $replace_extra_symbols; + + if (!isset($REPLACE_HELPER_CACHE[$cacheKey])) { + $langAll = self::charsArrayWithSingleLanguageValues($replace_extra_symbols, false); + + $langSpecific = self::charsArrayWithOneLanguage($language, $replace_extra_symbols, false); + + if ($langSpecific === []) { + $REPLACE_HELPER_CACHE[$cacheKey] = $langAll; + } else { + $REPLACE_HELPER_CACHE[$cacheKey] = \array_merge([], $langAll, $langSpecific); + } + } + + if ( + $replace_extra_symbols + && + $EXTRA_SYMBOLS_CACHE === null + ) { + $EXTRA_SYMBOLS_CACHE = []; + foreach (self::$ASCII_EXTRAS ?? [] as $extrasDataTmp) { + foreach ($extrasDataTmp as $extrasDataKeyTmp => $extrasDataValueTmp) { + $EXTRA_SYMBOLS_CACHE[$extrasDataKeyTmp] = $extrasDataKeyTmp; + } + } + $EXTRA_SYMBOLS_CACHE = \implode('', $EXTRA_SYMBOLS_CACHE); + } + + $charDone = []; + if (\preg_match_all('/' . self::$REGEX_ASCII . ($replace_extra_symbols ? '|[' . $EXTRA_SYMBOLS_CACHE . ']' : '') . '/u', $str, $matches)) { + if (!$replace_single_chars_only) { + if (self::$LANGUAGE_MAX_KEY === null) { + self::$LANGUAGE_MAX_KEY = self::getData('ascii_language_max_key'); + } + + $maxKeyLength = self::$LANGUAGE_MAX_KEY[$language] ?? 0; + + if ($maxKeyLength >= 5) { + foreach ($matches[0] as $keyTmp => $char) { + if (isset($matches[0][$keyTmp + 4])) { + $fiveChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1] . $matches[0][$keyTmp + 2] . $matches[0][$keyTmp + 3] . $matches[0][$keyTmp + 4]; + } else { + $fiveChars = null; + } + if ( + $fiveChars + && + !isset($charDone[$fiveChars]) + && + isset($REPLACE_HELPER_CACHE[$cacheKey][$fiveChars]) + && + \strpos($str, $fiveChars) !== false + ) { + // DEBUG + //\var_dump($str, $fiveChars, $REPLACE_HELPER_CACHE[$cacheKey][$fiveChars]); + + $charDone[$fiveChars] = true; + $str = \str_replace($fiveChars, $REPLACE_HELPER_CACHE[$cacheKey][$fiveChars], $str); + + // DEBUG + //\var_dump($str, "\n"); + } + } + } + + if ($maxKeyLength >= 4) { + foreach ($matches[0] as $keyTmp => $char) { + if (isset($matches[0][$keyTmp + 3])) { + $fourChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1] . $matches[0][$keyTmp + 2] . $matches[0][$keyTmp + 3]; + } else { + $fourChars = null; + } + if ( + $fourChars + && + !isset($charDone[$fourChars]) + && + isset($REPLACE_HELPER_CACHE[$cacheKey][$fourChars]) + && + \strpos($str, $fourChars) !== false + ) { + // DEBUG + //\var_dump($str, $fourChars, $REPLACE_HELPER_CACHE[$cacheKey][$fourChars]); + + $charDone[$fourChars] = true; + $str = \str_replace($fourChars, $REPLACE_HELPER_CACHE[$cacheKey][$fourChars], $str); + + // DEBUG + //\var_dump($str, "\n"); + } + } + } + + foreach ($matches[0] as $keyTmp => $char) { + if (isset($matches[0][$keyTmp + 2])) { + $threeChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1] . $matches[0][$keyTmp + 2]; + } else { + $threeChars = null; + } + if ( + $threeChars + && + !isset($charDone[$threeChars]) + && + isset($REPLACE_HELPER_CACHE[$cacheKey][$threeChars]) + && + \strpos($str, $threeChars) !== false + ) { + // DEBUG + //\var_dump($str, $threeChars, $REPLACE_HELPER_CACHE[$cacheKey][$threeChars]); + + $charDone[$threeChars] = true; + $str = \str_replace($threeChars, $REPLACE_HELPER_CACHE[$cacheKey][$threeChars], $str); + + // DEBUG + //\var_dump($str, "\n"); + } + } + + foreach ($matches[0] as $keyTmp => $char) { + if (isset($matches[0][$keyTmp + 1])) { + $twoChars = $matches[0][$keyTmp + 0] . $matches[0][$keyTmp + 1]; + } else { + $twoChars = null; + } + if ( + $twoChars + && + !isset($charDone[$twoChars]) + && + isset($REPLACE_HELPER_CACHE[$cacheKey][$twoChars]) + && + \strpos($str, $twoChars) !== false + ) { + // DEBUG + //\var_dump($str, $twoChars, $REPLACE_HELPER_CACHE[$cacheKey][$twoChars]); + + $charDone[$twoChars] = true; + $str = \str_replace($twoChars, $REPLACE_HELPER_CACHE[$cacheKey][$twoChars], $str); + + // DEBUG + //\var_dump($str, "\n"); + } + } + } + + foreach ($matches[0] as $char) { + if ( + !isset($charDone[$char]) + && + isset($REPLACE_HELPER_CACHE[$cacheKey][$char]) + && + \strpos($str, $char) !== false + ) { + // DEBUG + //\var_dump($str, $char, $REPLACE_HELPER_CACHE[$cacheKey][$char]); + + $charDone[$char] = true; + $str = \str_replace($char, $REPLACE_HELPER_CACHE[$cacheKey][$char], $str); + + // DEBUG + //\var_dump($str, "\n"); + } + } + } + + /** @psalm-suppress PossiblyNullOperand - we use the prepare* methods here, so we don't get NULL here */ + if (!isset(self::$ASCII_MAPS[$language])) { + $use_transliterate = true; + } + + if ($use_transliterate) { + $str = self::to_transliterate($str, null, false); + } + + if ($remove_unsupported_chars) { + $str = (string) \str_replace(["\n\r", "\n", "\r", "\t"], ' ', $str); + $str = (string) \preg_replace('/' . self::$REGEX_ASCII . '/', '', $str); + } + + return $str; + } + + /** + * Convert given string to safe filename (and keep string case). + * + * EXAMPLE: <code> + * ASCII::to_filename('שדגשדג.png', true)); // 'shdgshdg.png' + * </code> + * + * @param string $str + * @param bool $use_transliterate <p>ASCII::to_transliterate() is used by default - unsafe characters are + * simply replaced with hyphen otherwise.</p> + * @param string $fallback_char + * + * @psalm-pure + * + * @return string + * <p>A string that contains only safe characters for a filename.</p> + */ + public static function to_filename( + string $str, + bool $use_transliterate = true, + string $fallback_char = '-' + ): string { + if ($use_transliterate) { + $str = self::to_transliterate($str, $fallback_char); + } + + $fallback_char_escaped = \preg_quote($fallback_char, '/'); + + $str = (string) \preg_replace( + [ + '/[^' . $fallback_char_escaped . '.\\-a-zA-Z\d\\s]/', // 1) remove un-needed chars + '/\s+/u', // 2) convert spaces to $fallback_char + '/[' . $fallback_char_escaped . ']+/u', // 3) remove double $fallback_char's + ], + [ + '', + $fallback_char, + $fallback_char, + ], + $str + ); + + return \trim($str, $fallback_char); + } + + /** + * Converts the string into an URL slug. This includes replacing non-ASCII + * characters with their closest ASCII equivalents, removing remaining + * non-ASCII and non-alphanumeric characters, and replacing whitespace with + * $separator. The separator defaults to a single dash, and the string + * is also converted to lowercase. The language of the source string can + * also be supplied for language-specific transliteration. + * + * @param string $str + * @param string $separator [optional] <p>The string used to replace whitespace.</p> + * @param string $language [optional] <p>Language of the source string. + * (default is 'en') | ASCII::*_LANGUAGE_CODE</p> + * @param array<string, string> $replacements [optional] <p>A map of replaceable strings.</p> + * @param bool $replace_extra_symbols [optional] <p>Add some more replacements e.g. "£" with " + * pound ".</p> + * @param bool $use_str_to_lower [optional] <p>Use "string to lower" for the input.</p> + * @param bool $use_transliterate [optional] <p>Use ASCII::to_transliterate() for unknown + * chars.</p> + * @psalm-pure + * + * @return string + * <p>A string that has been converted to an URL slug.</p> + * + * @phpstan-param ASCII::*_LANGUAGE_CODE $language + */ + public static function to_slugify( + string $str, + string $separator = '-', + string $language = self::ENGLISH_LANGUAGE_CODE, + array $replacements = [], + bool $replace_extra_symbols = false, + bool $use_str_to_lower = true, + bool $use_transliterate = false + ): string { + if ($str === '') { + return ''; + } + + foreach ($replacements as $from => $to) { + $str = \str_replace($from, $to, $str); + } + + $str = self::to_ascii( + $str, + $language, + false, + $replace_extra_symbols, + $use_transliterate + ); + + $str = \str_replace('@', $separator, $str); + + $str = (string) \preg_replace( + '/[^a-zA-Z\\d\\s\\-_' . \preg_quote($separator, '/') . ']/', + '', + $str + ); + + if ($use_str_to_lower) { + $str = \strtolower($str); + } + + $str = (string) \preg_replace('/^[\'\\s]+|[\'\\s]+$/', '', $str); + $str = (string) \preg_replace('/\\B([A-Z])/', '-\1', $str); + $str = (string) \preg_replace('/[\\-_\\s]+/', $separator, $str); + + $l = \strlen($separator); + if ($l && \strpos($str, $separator) === 0) { + $str = (string) \substr($str, $l); + } + + if (\substr($str, -$l) === $separator) { + $str = (string) \substr($str, 0, \strlen($str) - $l); + } + + return $str; + } + + /** + * Returns an ASCII version of the string. A set of non-ASCII characters are + * replaced with their closest ASCII counterparts, and the rest are removed + * unless instructed otherwise. + * + * EXAMPLE: <code> + * ASCII::to_transliterate('déjà σσς iıii'); // 'deja sss iiii' + * </code> + * + * @param string $str <p>The input string.</p> + * @param string|null $unknown [optional] <p>Character use if character unknown. (default is '?') + * But you can also use NULL to keep the unknown chars.</p> + * @param bool $strict [optional] <p>Use "transliterator_transliterate()" from PHP-Intl + * + * @psalm-pure + * + * @return string + * <p>A String that contains only ASCII characters.</p> + * + * @noinspection ParameterDefaultValueIsNotNullInspection + */ + public static function to_transliterate( + string $str, + $unknown = '?', + bool $strict = false + ): string { + /** @var array<int,string>|null */ + static $UTF8_TO_TRANSLIT = null; + + /** null|\Transliterator */ + static $TRANSLITERATOR = null; + + /** @var bool|null */ + static $SUPPORT_INTL = null; + + if ($str === '') { + return ''; + } + + if ($SUPPORT_INTL === null) { + $SUPPORT_INTL = \extension_loaded('intl'); + } + + // check if we only have ASCII, first (better performance) + $str_tmp = $str; + if (self::is_ascii($str)) { + return $str; + } + + $str = self::clean($str); + + // check again, if we only have ASCII, now ... + if ( + $str_tmp !== $str + && + self::is_ascii($str) + ) { + return $str; + } + + if ( + $strict + && + $SUPPORT_INTL === true + ) { + if (!isset($TRANSLITERATOR)) { + // INFO: see "*-Latin" rules via "transliterator_list_ids()" + /** @var \Transliterator */ + $TRANSLITERATOR = \transliterator_create('NFKC; [:Nonspacing Mark:] Remove; NFKC; Any-Latin; Latin-ASCII;'); + } + + // INFO: https://unicode.org/cldr/utility/character.jsp + $str_tmp = \transliterator_transliterate($TRANSLITERATOR, $str); + + if ($str_tmp !== false) { + + // check again, if we only have ASCII, now ... + if ( + $str_tmp !== $str + && + self::is_ascii($str_tmp) + ) { + return $str_tmp; + } + + $str = $str_tmp; + } + } + + if (self::$ORD === null) { + self::$ORD = self::getData('ascii_ord'); + } + + \preg_match_all('/.|[^\x00]$/us', $str, $array_tmp); + $chars = $array_tmp[0]; + $ord = null; + $str_tmp = ''; + foreach ($chars as &$c) { + $ordC0 = self::$ORD[$c[0]]; + + if ($ordC0 >= 0 && $ordC0 <= 127) { + $str_tmp .= $c; + + continue; + } + + $ordC1 = self::$ORD[$c[1]]; + + // ASCII - next please + if ($ordC0 >= 192 && $ordC0 <= 223) { + $ord = ($ordC0 - 192) * 64 + ($ordC1 - 128); + } + + if ($ordC0 >= 224) { + $ordC2 = self::$ORD[$c[2]]; + + if ($ordC0 <= 239) { + $ord = ($ordC0 - 224) * 4096 + ($ordC1 - 128) * 64 + ($ordC2 - 128); + } + + if ($ordC0 >= 240) { + $ordC3 = self::$ORD[$c[3]]; + + if ($ordC0 <= 247) { + $ord = ($ordC0 - 240) * 262144 + ($ordC1 - 128) * 4096 + ($ordC2 - 128) * 64 + ($ordC3 - 128); + } + + // We only process valid UTF-8 chars (<= 4 byte), so we don't need this code here ... + /* + if ($ordC0 >= 248) { + $ordC4 = self::$ORD[$c[4]]; + + if ($ordC0 <= 251) { + $ord = ($ordC0 - 248) * 16777216 + ($ordC1 - 128) * 262144 + ($ordC2 - 128) * 4096 + ($ordC3 - 128) * 64 + ($ordC4 - 128); + } + + if ($ordC0 >= 252) { + $ordC5 = self::$ORD[$c[5]]; + + if ($ordC0 <= 253) { + $ord = ($ordC0 - 252) * 1073741824 + ($ordC1 - 128) * 16777216 + ($ordC2 - 128) * 262144 + ($ordC3 - 128) * 4096 + ($ordC4 - 128) * 64 + ($ordC5 - 128); + } + } + } + */ + } + } + + if ( + $ordC0 === 254 + || + $ordC0 === 255 + || + $ord === null + ) { + $str_tmp .= $unknown ?? $c; + + continue; + } + + $bank = $ord >> 8; + if (!isset($UTF8_TO_TRANSLIT[$bank])) { + $UTF8_TO_TRANSLIT[$bank] = self::getDataIfExists(\sprintf('x%03x', $bank)); + } + + $new_char = $ord & 255; + + if (isset($UTF8_TO_TRANSLIT[$bank][$new_char])) { + + // keep for debugging + /* + echo "file: " . sprintf('x%02x', $bank) . "\n"; + echo "char: " . $c . "\n"; + echo "ord: " . $ord . "\n"; + echo "new_char: " . $new_char . "\n"; + echo "new_char: " . mb_chr($new_char) . "\n"; + echo "ascii: " . $UTF8_TO_TRANSLIT[$bank][$new_char] . "\n"; + echo "bank:" . $bank . "\n\n"; + */ + + $new_char = $UTF8_TO_TRANSLIT[$bank][$new_char]; + + /** @noinspection MissingOrEmptyGroupStatementInspection */ + /** @noinspection PhpStatementHasEmptyBodyInspection */ + if ($unknown === null && $new_char === '') { + // nothing + } elseif ( + $new_char === '[?]' + || + $new_char === '[?] ' + ) { + $c = $unknown ?? $c; + } else { + $c = $new_char; + } + } else { + + // keep for debugging missing chars + /* + echo "file: " . sprintf('x%02x', $bank) . "\n"; + echo "char: " . $c . "\n"; + echo "ord: " . $ord . "\n"; + echo "new_char: " . $new_char . "\n"; + echo "new_char: " . mb_chr($new_char) . "\n"; + echo "bank:" . $bank . "\n\n"; + */ + + $c = $unknown ?? $c; + } + + $str_tmp .= $c; + } + + return $str_tmp; + } + + /** + * WARNING: This method will return broken characters and is only for special cases. + * + * Convert a UTF-8 encoded string to a single-byte string suitable for + * functions that need the same string length after the conversion. + * + * The function simply uses (and updates) a tailored dynamic encoding + * (in/out map parameter) where non-ascii characters are remapped to + * the range [128-255] in order of appearance. + * + * Thus, it supports up to 128 different multibyte code points max over + * the whole set of strings sharing this encoding. + * + * Source: https://github.com/KEINOS/mb_levenshtein + * + * @param string $str <p>UTF-8 string to be converted to extended ASCII.</p> + * @param array $map <p>Internal-Map of code points to ASCII characters.</p> + * + * @return string + * <p>Mapped borken string.</p> + * + * @phpstan-param array<string, string> $map + */ + private static function to_ascii_remap_intern(string $str, array &$map): string + { + // find all utf-8 characters + $matches = []; + if (!\preg_match_all('/[\xC0-\xF7][\x80-\xBF]+/', $str, $matches)) { + return $str; // plain ascii string + } + + // update the encoding map with the characters not already met + $mapCount = \count($map); + foreach ($matches[0] as $mbc) { + if (!isset($map[$mbc])) { + $map[$mbc] = \chr(128 + $mapCount); + ++$mapCount; + } + } + + // finally, remap non-ascii characters + return \strtr($str, $map); + } + + /** + * Get the language from a string. + * + * e.g.: de_at -> de_at + * de_DE -> de + * DE_DE -> de + * de-de -> de + * + * @noinspection ReturnTypeCanBeDeclaredInspection + * + * @param string $language + * + * @psalm-pure + * + * @return string + */ + private static function get_language(string $language) + { + if ($language === '') { + return ''; + } + + if ( + \strpos($language, '_') === false + && + \strpos($language, '-') === false + ) { + return \strtolower($language); + } + + $language = \str_replace('-', '_', \strtolower($language)); + + $regex = '/(?<first>[a-z]+)_\g{first}/'; + + return (string) \preg_replace($regex, '$1', $language); + } + + /** + * Get data from "/data/*.php". + * + * @noinspection ReturnTypeCanBeDeclaredInspection + * + * @param string $file + * + * @psalm-pure + * + * @return array<mixed> + */ + private static function getData(string $file) + { + /** @noinspection PhpIncludeInspection */ + /** @noinspection UsingInclusionReturnValueInspection */ + /** @psalm-suppress UnresolvableInclude */ + return include __DIR__ . '/data/' . $file . '.php'; + } + + /** + * Get data from "/data/*.php". + * + * @param string $file + * + * @psalm-pure + * + * @return array<mixed> + */ + private static function getDataIfExists(string $file): array + { + $file = __DIR__ . '/data/' . $file . '.php'; + /** @psalm-suppress ImpureFunctionCall */ + if (\is_file($file)) { + /** @noinspection PhpIncludeInspection */ + /** @noinspection UsingInclusionReturnValueInspection */ + /** @psalm-suppress UnresolvableInclude */ + return include $file; + } + + return []; + } + + /** + * @psalm-pure + * + * @return void + */ + private static function prepareAsciiAndExtrasMaps() + { + if (self::$ASCII_MAPS_AND_EXTRAS === null) { + self::prepareAsciiMaps(); + self::prepareAsciiExtras(); + + /** @psalm-suppress PossiblyNullArgument - we use the prepare* methods here, so we don't get NULL here */ + self::$ASCII_MAPS_AND_EXTRAS = \array_merge_recursive( + self::$ASCII_MAPS ?? [], + self::$ASCII_EXTRAS ?? [] + ); + } + } + + /** + * @psalm-pure + * + * @return void + */ + private static function prepareAsciiMaps() + { + if (self::$ASCII_MAPS === null) { + self::$ASCII_MAPS = self::getData('ascii_by_languages'); + } + } + + /** + * @psalm-pure + * + * @return void + */ + private static function prepareAsciiExtras() + { + if (self::$ASCII_EXTRAS === null) { + self::$ASCII_EXTRAS = self::getData('ascii_extras_by_languages'); + } + } +} diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php new file mode 100644 index 0000000..68c3f9d --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_by_languages.php @@ -0,0 +1,2950 @@ +<?php + +// https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes + +return [ + // Dutch (Flemish) + 'nl' => [ + 'Á' => 'A', + 'á' => 'a', + 'Ä' => 'A', + 'ä' => 'a', + 'À' => 'A', + 'à' => 'a', + 'Â' => 'A', + 'â' => 'a', + 'É' => 'E', + 'é' => 'e', + 'Ë' => 'E', + 'ë' => 'e', + 'È' => 'E', + 'è' => 'e', + 'Ê' => 'E', + 'ê' => 'e', + 'Í' => 'I', + 'í' => 'i', + 'Ï' => 'I', + 'ï' => 'i', + 'Ì' => 'I', + 'ì' => 'i', + 'Î' => 'I', + 'î' => 'i', + 'Ó' => 'O', + 'ó' => 'o', + 'Ö' => 'O', + 'ö' => 'o', + 'Ò' => 'O', + 'ò' => 'o', + 'Ô' => 'O', + 'ô' => 'o', + 'Ú' => 'U', + 'ú' => 'u', + 'Ü' => 'U', + 'ü' => 'u', + 'Ù' => 'U', + 'ù' => 'u', + 'Û' => 'U', + 'û' => 'u', + 'Ý' => 'Y', + 'ý' => 'y', + 'Ÿ' => 'Y', + ], + // Italian + 'it' => [ + 'à' => 'a', + 'À' => 'A', + 'é' => 'e', + 'É' => 'E', + 'è' => 'e', + 'È' => 'E', + 'ì' => 'i', + 'Ì' => 'I', + 'Ò' => 'O', + 'ò' => 'o', + 'ù' => 'u', + 'Ù' => 'U', + ], + // Macedonian + 'mk' => [ + 'А' => 'A', + 'Б' => 'B', + 'В' => 'V', + 'Г' => 'G', + 'Д' => 'D', + 'Ѓ' => 'Gj', + 'Е' => 'E', + 'Ж' => 'Zh', + 'З' => 'Z', + 'Ѕ' => 'Dz', + 'И' => 'I', + 'Ј' => 'J', + 'К' => 'K', + 'Л' => 'L', + 'Љ' => 'Lj', + 'М' => 'M', + 'Н' => 'N', + 'Њ' => 'Nj', + 'О' => 'O', + 'П' => 'P', + 'Р' => 'R', + 'С' => 'S', + 'Т' => 'T', + 'Ќ' => 'Kj', + 'У' => 'U', + 'Ф' => 'F', + 'Х' => 'H', + 'Ц' => 'C', + 'Ч' => 'Ch', + 'Џ' => 'Dj', + 'Ш' => 'Sh', + 'а' => 'a', + 'б' => 'b', + 'в' => 'v', + 'г' => 'g', + 'д' => 'd', + 'ѓ' => 'gj', + 'е' => 'e', + 'ж' => 'zh', + 'з' => 'z', + 'ѕ' => 'dz', + 'и' => 'i', + 'ј' => 'j', + 'к' => 'k', + 'л' => 'l', + 'љ' => 'lj', + 'м' => 'm', + 'н' => 'n', + 'њ' => 'nj', + 'о' => 'o', + 'п' => 'p', + 'р' => 'r', + 'с' => 's', + 'т' => 't', + 'ќ' => 'kj', + 'у' => 'u', + 'ф' => 'f', + 'х' => 'h', + 'ц' => 'c', + 'ч' => 'ch', + 'џ' => 'dj', + 'ш' => 'sh', + ], + // Portuguese (Brazil) + 'pt' => [ + 'æ' => 'ae', + 'ǽ' => 'ae', + 'À' => 'A', + 'Á' => 'A', + 'Â' => 'A', + 'Ã' => 'A', + 'Å' => 'AA', + 'Ǻ' => 'A', + 'Ă' => 'A', + 'Ǎ' => 'A', + 'Æ' => 'AE', + 'Ǽ' => 'AE', + 'à' => 'a', + 'á' => 'a', + 'â' => 'a', + 'ã' => 'a', + 'å' => 'aa', + 'ǻ' => 'a', + 'ă' => 'a', + 'ǎ' => 'a', + 'ª' => 'a', + 'Ĉ' => 'C', + 'Ċ' => 'C', + 'Ç' => 'C', + 'ç' => 'c', + 'ĉ' => 'c', + 'ċ' => 'c', + 'Ð' => 'Dj', + 'Đ' => 'D', + 'ð' => 'dj', + 'đ' => 'd', + 'È' => 'E', + 'É' => 'E', + 'Ê' => 'E', + 'Ë' => 'E', + 'Ĕ' => 'E', + 'Ė' => 'E', + 'è' => 'e', + 'é' => 'e', + 'ê' => 'e', + 'ë' => 'e', + 'ĕ' => 'e', + 'ė' => 'e', + 'ƒ' => 'f', + 'Ĝ' => 'G', + 'Ġ' => 'G', + 'ĝ' => 'g', + 'ġ' => 'g', + 'Ĥ' => 'H', + 'Ħ' => 'H', + 'ĥ' => 'h', + 'ħ' => 'h', + 'Ì' => 'I', + 'Í' => 'I', + 'Î' => 'I', + 'Ï' => 'I', + 'Ĩ' => 'I', + 'Ĭ' => 'I', + 'Ǐ' => 'I', + 'Į' => 'I', + 'IJ' => 'IJ', + 'ì' => 'i', + 'í' => 'i', + 'î' => 'i', + 'ï' => 'i', + 'ĩ' => 'i', + 'ĭ' => 'i', + 'ǐ' => 'i', + 'į' => 'i', + 'ij' => 'ij', + 'Ĵ' => 'J', + 'ĵ' => 'j', + 'Ĺ' => 'L', + 'Ľ' => 'L', + 'Ŀ' => 'L', + 'ĺ' => 'l', + 'ľ' => 'l', + 'ŀ' => 'l', + 'Ñ' => 'N', + 'ñ' => 'n', + 'ʼn' => 'n', + 'Ò' => 'O', + 'Ó' => 'O', + 'Ô' => 'O', + 'Õ' => 'O', + 'Ō' => 'O', + 'Ŏ' => 'O', + 'Ǒ' => 'O', + 'Ő' => 'O', + 'Ơ' => 'O', + 'Ø' => 'OE', + 'Ǿ' => 'O', + 'Œ' => 'OE', + 'ò' => 'o', + 'ó' => 'o', + 'ô' => 'o', + 'õ' => 'o', + 'ō' => 'o', + 'ŏ' => 'o', + 'ǒ' => 'o', + 'ő' => 'o', + 'ơ' => 'o', + 'ø' => 'oe', + 'ǿ' => 'o', + 'º' => 'o', + 'œ' => 'oe', + 'Ŕ' => 'R', + 'Ŗ' => 'R', + 'ŕ' => 'r', + 'ŗ' => 'r', + 'Ŝ' => 'S', + 'Ș' => 'S', + 'ŝ' => 's', + 'ș' => 's', + 'ſ' => 's', + 'Ţ' => 'T', + 'Ț' => 'T', + 'Ŧ' => 'T', + 'Þ' => 'TH', + 'ţ' => 't', + 'ț' => 't', + 'ŧ' => 't', + 'þ' => 'th', + 'Ù' => 'U', + 'Ú' => 'U', + 'Û' => 'U', + 'Ü' => 'U', + 'Ũ' => 'U', + 'Ŭ' => 'U', + 'Ű' => 'U', + 'Ų' => 'U', + 'Ư' => 'U', + 'Ǔ' => 'U', + 'Ǖ' => 'U', + 'Ǘ' => 'U', + 'Ǚ' => 'U', + 'Ǜ' => 'U', + 'ù' => 'u', + 'ú' => 'u', + 'û' => 'u', + 'ü' => 'u', + 'ũ' => 'u', + 'ŭ' => 'u', + 'ű' => 'u', + 'ų' => 'u', + 'ư' => 'u', + 'ǔ' => 'u', + 'ǖ' => 'u', + 'ǘ' => 'u', + 'ǚ' => 'u', + 'ǜ' => 'u', + 'Ŵ' => 'W', + 'ŵ' => 'w', + 'Ý' => 'Y', + 'Ÿ' => 'Y', + 'Ŷ' => 'Y', + 'ý' => 'y', + 'ÿ' => 'y', + 'ŷ' => 'y', + ], + // Greek(lish) (Elláda) + 'el__greeklish' => [ + 'ΑΥ' => 'AU', + 'ΑΎ' => 'AU', + 'Αυ' => 'Au', + 'Αύ' => 'Au', + 'ΕΊ' => 'EI', + 'ΕΙ' => 'EI', + 'Ει' => 'EI', + 'ΕΥ' => 'EU', + 'ΕΎ' => 'EU', + 'Εί' => 'Ei', + 'Ευ' => 'Eu', + 'Εύ' => 'Eu', + 'ΟΙ' => 'OI', + 'ΟΊ' => 'OI', + 'ΟΥ' => 'OU', + 'ΟΎ' => 'OU', + 'Οι' => 'Oi', + 'Οί' => 'Oi', + 'Ου' => 'Ou', + 'Ού' => 'Ou', + 'ΥΙ' => 'YI', + 'ΎΙ' => 'YI', + 'Υι' => 'Yi', + 'Ύι' => 'Yi', + 'ΥΊ' => 'Yi', + 'Υί' => 'Yi', + 'αυ' => 'au', + 'αύ' => 'au', + 'εί' => 'ei', + 'ει' => 'ei', + 'ευ' => 'eu', + 'εύ' => 'eu', + 'οι' => 'oi', + 'οί' => 'oi', + 'ου' => 'ou', + 'ού' => 'ou', + 'υι' => 'yi', + 'ύι' => 'yi', + 'υί' => 'yi', + 'Α' => 'A', + 'Ά' => 'A', + 'Β' => 'B', + 'Δ' => 'D', + 'Ε' => 'E', + 'Έ' => 'E', + 'Φ' => 'F', + 'Γ' => 'G', + 'Η' => 'H', + 'Ή' => 'H', + 'Ι' => 'I', + 'Ί' => 'I', + 'Ϊ' => 'I', + 'Κ' => 'K', + 'Ξ' => 'Ks', + 'Λ' => 'L', + 'Μ' => 'M', + 'Ν' => 'N', + 'Π' => 'N', + 'Ο' => 'O', + 'Ό' => 'O', + 'Ψ' => 'Ps', + 'Ρ' => 'R', + 'Σ' => 'S', + 'Τ' => 'T', + 'Θ' => 'Th', + 'Ω' => 'W', + 'Ώ' => 'W', + 'Χ' => 'X', + 'ϒ' => 'Y', + 'Υ' => 'Y', + 'Ύ' => 'Y', + 'Ϋ' => 'Y', + 'Ζ' => 'Z', + 'α' => 'a', + 'ά' => 'a', + 'β' => 'b', + 'δ' => 'd', + 'ε' => 'e', + 'έ' => 'e', + 'φ' => 'f', + 'γ' => 'g', + 'η' => 'h', + 'ή' => 'h', + 'ι' => 'i', + 'ί' => 'i', + 'ϊ' => 'i', + 'ΐ' => 'i', + 'κ' => 'k', + 'ξ' => 'ks', + 'λ' => 'l', + 'μ' => 'm', + 'ν' => 'n', + 'ο' => 'o', + 'ό' => 'o', + 'π' => 'p', + 'ψ' => 'ps', + 'ρ' => 'r', + 'σ' => 's', + 'ς' => 's', + 'τ' => 't', + 'ϑ' => 'th', + 'θ' => 'th', + 'ϐ' => 'v', + 'ω' => 'w', + 'ώ' => 'w', + 'χ' => 'x', + 'υ' => 'y', + 'ύ' => 'y', + 'ΰ' => 'y', + 'ϋ' => 'y', + 'ζ' => 'z', + ], + // Greek (Elláda) + 'el' => [ + 'ΑΥ' => 'AU', + 'Αυ' => 'Au', + 'ΟΥ' => 'U', + 'Ου' => 'u', + 'ΕΥ' => 'EF', + 'Ευ' => 'Ef', + 'ΕΙ' => 'I', + 'Ει' => 'I', + 'ΟΙ' => 'I', + 'Οι' => 'I', + 'ΥΙ' => 'I', + 'Υι' => 'I', + 'ΑΎ' => 'AU', + 'Αύ' => 'Au', + 'ΟΎ' => 'OU', + 'Ού' => 'Ou', + 'ΕΎ' => 'EU', + 'Εύ' => 'Eu', + 'ΕΊ' => 'I', + 'Εί' => 'I', + 'ΟΊ' => 'I', + 'Οί' => 'I', + 'ΎΙ' => 'I', + 'Ύι' => 'I', + 'ΥΊ' => 'I', + 'Υί' => 'I', + 'αυ' => 'au', + 'ου' => 'u', + 'ευ' => 'ef', + 'ει' => 'i', + 'οι' => 'i', + 'υι' => 'i', + 'αύ' => 'au', + 'ού' => 'ou', + 'εύ' => 'eu', + 'εί' => 'i', + 'οί' => 'i', + 'ύι' => 'i', + 'υί' => 'i', + 'α' => 'a', + 'β' => 'v', + 'γ' => 'gh', + 'δ' => 'd', + 'ε' => 'e', + 'ζ' => 'z', + 'η' => 'i', + 'θ' => 'th', + 'ι' => 'i', + 'κ' => 'k', + 'λ' => 'l', + 'μ' => 'm', + 'ν' => 'n', + 'ξ' => 'ks', + 'ο' => 'o', + 'π' => 'p', + 'ρ' => 'r', + 'σ' => 's', + 'τ' => 't', + 'υ' => 'i', + 'φ' => 'f', + 'χ' => 'kh', + 'ψ' => 'ps', + 'ω' => 'o', + 'ά' => 'a', + 'έ' => 'e', + 'ί' => 'i', + 'ό' => 'o', + 'ϒ' => 'Y', + 'ύ' => 'y', + 'ή' => 'i', + 'ώ' => 'w', + 'ς' => 's', + 'ϊ' => 'i', + 'ΰ' => 'y', + 'ϋ' => 'y', + 'ΐ' => 'i', + 'Α' => 'A', + 'Β' => 'B', + 'Γ' => 'G', + 'Δ' => 'D', + 'Ε' => 'E', + 'Ζ' => 'Z', + 'Η' => 'H', + 'Θ' => 'Th', + 'Ι' => 'I', + 'Κ' => 'K', + 'Λ' => 'L', + 'Μ' => 'M', + 'Ν' => 'N', + 'Ξ' => 'Ks', + 'Ο' => 'O', + 'Π' => 'P', + 'Ρ' => 'R', + 'Σ' => 'S', + 'Τ' => 'T', + 'Υ' => 'Y', + 'Φ' => 'F', + 'Χ' => 'X', + 'Ψ' => 'Ps', + 'Ω' => 'O', + 'Ά' => 'A', + 'Έ' => 'E', + 'Ί' => 'I', + 'Ό' => 'O', + 'Ύ' => 'Y', + 'Ή' => 'I', + 'Ώ' => 'W', + 'Ϊ' => 'I', + 'Ϋ' => 'Y', + 'ϐ' => 'v', + 'ϑ' => 'th', + ], + // Hindi + 'hi' => [ + 'अ' => 'a', + 'आ' => 'aa', + 'ए' => 'e', + 'ई' => 'ii', + 'ऍ' => 'ei', + 'ऎ' => 'ae', + 'ऐ' => 'ai', + 'इ' => 'i', + 'ओ' => 'o', + 'ऑ' => 'oi', + 'ऒ' => 'oii', + 'ऊ' => 'uu', + 'औ' => 'ou', + 'उ' => 'u', + 'ब' => 'B', + 'भ' => 'Bha', + 'च' => 'Ca', + 'छ' => 'Chha', + 'ड' => 'Da', + 'ढ' => 'Dha', + 'फ' => 'Fa', + 'फ़' => 'Fi', + 'ग' => 'Ga', + 'घ' => 'Gha', + 'ग़' => 'Ghi', + 'ह' => 'Ha', + 'ज' => 'Ja', + 'झ' => 'Jha', + 'क' => 'Ka', + 'ख' => 'Kha', + 'ख़' => 'Khi', + 'ल' => 'L', + 'ळ' => 'Li', + 'ऌ' => 'Li', + 'ऴ' => 'Lii', + 'ॡ' => 'Lii', + 'म' => 'Ma', + 'न' => 'Na', + 'ङ' => 'Na', + 'ञ' => 'Nia', + 'ण' => 'Nae', + 'ऩ' => 'Ni', + 'ॐ' => 'oms', + 'प' => 'Pa', + 'क़' => 'Qi', + 'र' => 'Ra', + 'ऋ' => 'Ri', + 'ॠ' => 'Ri', + 'ऱ' => 'Ri', + 'स' => 'Sa', + 'श' => 'Sha', + 'ष' => 'Shha', + 'ट' => 'Ta', + 'त' => 'Ta', + 'ठ' => 'Tha', + 'द' => 'Tha', + 'थ' => 'Tha', + 'ध' => 'Thha', + 'ड़' => 'ugDha', + 'ढ़' => 'ugDhha', + 'व' => 'Va', + 'य' => 'Ya', + 'य़' => 'Yi', + 'ज़' => 'Za', + ], + // Armenian + 'hy' => [ + 'Ա' => 'A', + 'Բ' => 'B', + 'Գ' => 'G', + 'Դ' => 'D', + 'Ե' => 'E', + 'Զ' => 'Z', + 'Է' => 'E', + 'Ը' => 'Y', + 'Թ' => 'Th', + 'Ժ' => 'Zh', + 'Ի' => 'I', + 'Լ' => 'L', + 'Խ' => 'Kh', + 'Ծ' => 'Ts', + 'Կ' => 'K', + 'Հ' => 'H', + 'Ձ' => 'Dz', + 'Ղ' => 'Gh', + 'Ճ' => 'Tch', + 'Մ' => 'M', + 'Յ' => 'Y', + 'Ն' => 'N', + 'Շ' => 'Sh', + 'Ո' => 'Vo', + 'Չ' => 'Ch', + 'Պ' => 'P', + 'Ջ' => 'J', + 'Ռ' => 'R', + 'Ս' => 'S', + 'Վ' => 'V', + 'Տ' => 'T', + 'Ր' => 'R', + 'Ց' => 'C', + 'Ւ' => 'u', + 'Փ' => 'Ph', + 'Ք' => 'Q', + 'և' => 'ev', + 'Օ' => 'O', + 'Ֆ' => 'F', + 'ա' => 'a', + 'բ' => 'b', + 'գ' => 'g', + 'դ' => 'd', + 'ե' => 'e', + 'զ' => 'z', + 'է' => 'e', + 'ը' => 'y', + 'թ' => 'th', + 'ժ' => 'zh', + 'ի' => 'i', + 'լ' => 'l', + 'խ' => 'kh', + 'ծ' => 'ts', + 'կ' => 'k', + 'հ' => 'h', + 'ձ' => 'dz', + 'ղ' => 'gh', + 'ճ' => 'tch', + 'մ' => 'm', + 'յ' => 'y', + 'ն' => 'n', + 'շ' => 'sh', + 'ո' => 'vo', + 'չ' => 'ch', + 'պ' => 'p', + 'ջ' => 'j', + 'ռ' => 'r', + 'ս' => 's', + 'վ' => 'v', + 'տ' => 't', + 'ր' => 'r', + 'ց' => 'c', + 'ւ' => 'u', + 'փ' => 'ph', + 'ք' => 'q', + 'օ' => 'o', + 'ֆ' => 'f', + ], + // Swedish + 'sv' => [ + 'Ä' => 'A', + 'ä' => 'a', + 'Å' => 'A', + 'å' => 'a', + 'Ö' => 'O', + 'ö' => 'o', + ], + // Turkmen + 'tk' => [ + 'Ç' => 'C', + 'Ä' => 'A', + 'Ž' => 'Z', + 'Ň' => 'N', + 'Ö' => 'O', + 'Ş' => 'S', + 'Ü' => 'U', + 'Ý' => 'Y', + 'ç' => 'c', + 'ä' => 'a', + 'ž' => 'z', + 'ň' => 'n', + 'ö' => 'o', + 'ş' => 's', + 'ü' => 'u', + 'ý' => 'y', + ], + // Turkish + 'tr' => [ + 'ň' => 'n', + 'Ň' => 'N', + 'ş' => 's', + 'Ş' => 'S', + 'ı' => 'i', + 'İ' => 'I', + 'ç' => 'c', + 'Ç' => 'C', + 'ä' => 'a', + 'Ä' => 'A', + 'ü' => 'u', + 'Ü' => 'U', + 'ö' => 'o', + 'Ö' => 'O', + 'ğ' => 'g', + 'Ğ' => 'G', + 'ý' => 'y', + 'Ý' => 'Y', + 'ž' => 'z', + 'Ž' => 'Z', + ], + // Bulgarian + 'bg' => [ + 'ьо' => 'yo', + 'А' => 'A', + 'Б' => 'B', + 'В' => 'V', + 'Г' => 'G', + 'Д' => 'D', + 'Е' => 'E', + 'Ж' => 'Zh', + 'З' => 'Z', + 'И' => 'I', + 'Й' => 'Y', + 'К' => 'K', + 'Л' => 'L', + 'М' => 'M', + 'Н' => 'N', + 'О' => 'O', + 'П' => 'P', + 'Р' => 'R', + 'С' => 'S', + 'Т' => 'T', + 'У' => 'U', + 'Ф' => 'F', + 'Х' => 'H', + 'Ц' => 'C', + 'Ч' => 'Ch', + 'Ш' => 'Sh', + 'Щ' => 'Sht', + 'Ъ' => 'A', + 'Ь' => '', + 'Ю' => 'Yu', + 'Я' => 'Ya', + 'а' => 'a', + 'б' => 'b', + 'в' => 'v', + 'г' => 'g', + 'д' => 'd', + 'е' => 'e', + 'ж' => 'zh', + 'з' => 'z', + 'и' => 'i', + 'й' => 'y', + 'к' => 'k', + 'л' => 'l', + 'м' => 'm', + 'н' => 'n', + 'о' => 'o', + 'п' => 'p', + 'р' => 'r', + 'с' => 's', + 'т' => 't', + 'у' => 'u', + 'ф' => 'f', + 'х' => 'h', + 'ц' => 'c', + 'ч' => 'ch', + 'ш' => 'sh', + 'щ' => 'sht', + 'ъ' => 'a', + 'ь' => '', + 'ю' => 'yu', + 'я' => 'ya', + ], + // Hungarian + 'hu' => [ + 'Á' => 'A', + 'Ē' => 'E', + 'É' => 'E', + 'Í' => 'I', + 'Ó' => 'O', + 'Ö' => 'O', + 'Ő' => 'O', + 'Ú' => 'U', + 'Ü' => 'U', + 'Ű' => 'U', + 'á' => 'a', + 'ē' => 'e', + 'é' => 'e', + 'í' => 'i', + 'ó' => 'o', + 'ö' => 'o', + 'ő' => 'o', + 'ú' => 'u', + 'ü' => 'u', + 'ű' => 'u', + ], + // Myanmar (Burmese) + 'my' => [ + 'န်ုပ်' => 'nub', + 'ောင်' => 'aung', + 'ိုက်' => 'aik', + 'ိုဒ်' => 'ok', + 'ိုင်' => 'aing', + 'ိုလ်' => 'ol', + 'ေါင်' => 'aung', + 'သြော' => 'aw', + 'ောက်' => 'auk', + 'ိတ်' => 'eik', + 'ုတ်' => 'ok', + 'ုန်' => 'on', + 'ေတ်' => 'it', + 'ုဒ်' => 'ait', + 'ာန်' => 'an', + 'ိန်' => 'ein', + 'ွတ်' => 'ut', + 'ေါ်' => 'aw', + 'ွန်' => 'un', + 'ိပ်' => 'eik', + 'ုပ်' => 'ok', + 'ွပ်' => 'ut', + 'ိမ်' => 'ein', + 'ုမ်' => 'on', + 'ော်' => 'aw', + 'ွမ်' => 'un', + 'က်' => 'et', + 'ေါ' => 'aw', + 'ော' => 'aw', + 'ျွ' => 'ywa', + 'ြွ' => 'yw', + 'ို' => 'o', + 'ုံ' => 'on', + 'တ်' => 'at', + 'င်' => 'in', + 'ည်' => 'i', + 'ဒ်' => 'd', + 'န်' => 'an', + 'ပ်' => 'at', + 'မ်' => 'an', + 'စျ' => 'za', + 'ယ်' => 'e', + 'ဉ်' => 'in', + 'စ်' => 'it', + 'ိံ' => 'ein', + 'ဲ' => 'e', + 'း' => '', + 'ာ' => 'a', + 'ါ' => 'a', + 'ေ' => 'e', + 'ံ' => 'an', + 'ိ' => 'i', + 'ီ' => 'i', + 'ု' => 'u', + 'ူ' => 'u', + '်' => 'at', + '္' => '', + '့' => '', + 'က' => 'k', + '၉' => '9', + 'တ' => 't', + 'ရ' => 'ya', + 'ယ' => 'y', + 'မ' => 'm', + 'ဘ' => 'ba', + 'ဗ' => 'b', + 'ဖ' => 'pa', + 'ပ' => 'p', + 'န' => 'n', + 'ဓ' => 'da', + 'ဒ' => 'd', + 'ထ' => 'ta', + 'ဏ' => 'na', + 'ဝ' => 'w', + 'ဎ' => 'da', + 'ဍ' => 'd', + 'ဌ' => 'ta', + 'ဋ' => 't', + 'ည' => 'ny', + 'ဇ' => 'z', + 'ဆ' => 'sa', + 'စ' => 's', + 'င' => 'ng', + 'ဃ' => 'ga', + 'ဂ' => 'g', + 'လ' => 'l', + 'သ' => 'th', + '၈' => '8', + 'ဩ' => 'aw', + 'ခ' => 'kh', + '၆' => '6', + '၅' => '5', + '၄' => '4', + '၃' => '3', + '၂' => '2', + '၁' => '1', + '၀' => '0', + '၌' => 'hnaik', + '၍' => 'ywae', + 'ဪ' => 'aw', + 'ဦ' => '-u', + 'ဟ' => 'h', + 'ဉ' => 'u', + 'ဤ' => '-i', + 'ဣ' => 'i', + '၏' => '-e', + 'ဧ' => 'e', + 'ှ' => 'h', + 'ွ' => 'w', + 'ျ' => 'ya', + 'ြ' => 'y', + 'အ' => 'a', + 'ဠ' => 'la', + '၇' => '7', + ], + // Croatian (Hrvatska) + 'hr' => [ + 'DŽ' => 'DZ', + 'Dž' => 'Dz', + 'dž' => 'dz', + 'DZ' => 'DZ', + 'Dz' => 'Dz', + 'dz' => 'dz', + 'IJ' => 'IJ', + 'ij' => 'ij', + 'LJ' => 'LJ', + 'Lj' => 'Lj', + 'lj' => 'lj', + 'NJ' => 'NJ', + 'Nj' => 'Nj', + 'nj' => 'nj', + 'ž' => 'z', + 'Ž' => 'Z', + 'đ' => 'dj', + 'Đ' => 'Dj', + 'č' => 'c', + 'Č' => 'C', + 'ć' => 'c', + 'Ć' => 'C', + 'š' => 's', + 'Š' => 'S', + ], + // Finnish + 'fi' => [ + 'Ä' => 'A', + 'Ö' => 'O', + 'ä' => 'a', + 'ö' => 'o', + ], + // Georgian (Kartvelian) + 'ka' => [ + 'ა' => 'a', + 'ბ' => 'b', + 'გ' => 'g', + 'დ' => 'd', + 'ე' => 'e', + 'ვ' => 'v', + 'ზ' => 'z', + 'თ' => 't', + 'ი' => 'i', + 'კ' => 'k', + 'ლ' => 'l', + 'მ' => 'm', + 'ნ' => 'n', + 'ო' => 'o', + 'პ' => 'p', + 'ჟ' => 'zh', + 'რ' => 'r', + 'ს' => 's', + 'ტ' => 't', + 'უ' => 'u', + 'ფ' => 'f', + 'ქ' => 'q', + 'ღ' => 'gh', + 'ყ' => 'y', + 'შ' => 'sh', + 'ჩ' => 'ch', + 'ც' => 'ts', + 'ძ' => 'dz', + 'წ' => 'ts', + 'ჭ' => 'ch', + 'ხ' => 'kh', + 'ჯ' => 'j', + 'ჰ' => 'h', + ], + // Russian + 'ru' => [ + 'А' => 'A', + 'а' => 'a', + 'Б' => 'B', + 'б' => 'b', + 'В' => 'V', + 'в' => 'v', + 'Г' => 'G', + 'г' => 'g', + 'Д' => 'D', + 'д' => 'd', + 'Е' => 'E', + 'е' => 'e', + 'Ё' => 'Yo', + 'ё' => 'yo', + 'Ж' => 'Zh', + 'ж' => 'zh', + 'З' => 'Z', + 'з' => 'z', + 'И' => 'I', + 'и' => 'i', + 'Й' => 'Y', + 'й' => 'y', + 'К' => 'K', + 'к' => 'k', + 'Л' => 'L', + 'л' => 'l', + 'М' => 'M', + 'м' => 'm', + 'Н' => 'N', + 'н' => 'n', + 'О' => 'O', + 'о' => 'o', + 'П' => 'P', + 'п' => 'p', + 'Р' => 'R', + 'р' => 'r', + 'С' => 'S', + 'с' => 's', + 'Т' => 'T', + 'т' => 't', + 'У' => 'U', + 'у' => 'u', + 'Ф' => 'F', + 'ф' => 'f', + 'Х' => 'H', + 'х' => 'h', + 'Ц' => 'Ts', + 'ц' => 'ts', + 'Ч' => 'Ch', + 'ч' => 'ch', + 'ш' => 'sh', + 'Ш' => 'Sh', + 'Щ' => 'Sch', + 'щ' => 'sch', + 'Ъ' => '', + 'ъ' => '', + 'Ы' => 'Y', + 'ы' => 'y', + 'Ь' => '', + 'ь' => '', + 'Э' => 'E', + 'э' => 'e', + 'Ю' => 'Yu', + 'ю' => 'yu', + 'Я' => 'Ya', + 'я' => 'ya', + ], + // Russian - GOST 7.79-2000(B) + // -> https://en.m.wikipedia.org/wiki/Romanization_of_Russian#content-collapsible-block-1 + 'ru__gost_2000_b' => [ + 'А' => 'A', + 'а' => 'a', + 'Б' => 'B', + 'б' => 'b', + 'В' => 'V', + 'в' => 'v', + 'Г' => 'G', + 'г' => 'g', + 'Д' => 'D', + 'д' => 'd', + 'Е' => 'E', + 'е' => 'e', + 'Ё' => 'Yo', + 'ё' => 'yo', + 'Ж' => 'Zh', + 'ж' => 'zh', + 'З' => 'Z', + 'з' => 'z', + 'И' => 'i', + 'и' => 'i', + 'Й' => 'i', + 'й' => 'i', + 'К' => 'K', + 'к' => 'k', + 'Л' => 'L', + 'л' => 'l', + 'М' => 'M', + 'м' => 'm', + 'Н' => 'N', + 'н' => 'n', + 'О' => 'O', + 'о' => 'o', + 'П' => 'P', + 'п' => 'p', + 'Р' => 'R', + 'р' => 'r', + 'С' => 'S', + 'с' => 's', + 'Т' => 'T', + 'т' => 't', + 'У' => 'U', + 'у' => 'u', + 'Ф' => 'F', + 'ф' => 'f', + 'Х' => 'X', + 'х' => 'x', + 'Ц' => 'Cz', + 'ц' => 'cz', + 'Ч' => 'Ch', + 'ч' => 'ch', + 'ш' => 'sh', + 'Ш' => 'Sh', + 'Щ' => 'Shh', + 'щ' => 'shh', + 'Ъ' => '', + 'ъ' => '', + 'Ы' => 'Y\'', + 'ы' => 'y\'', + 'Ь' => '', + 'ь' => '', + 'Э' => 'E\'', + 'э' => 'e\'', + 'Ю' => 'Yu', + 'ю' => 'yu', + 'Я' => 'Ya', + 'я' => 'ya', + 'І' => 'I', + 'і' => 'i', + 'Ѳ' => 'Fh', + 'ѳ' => 'fh', + 'Ѣ' => 'Ye', + 'ѣ' => 'ye', + 'Ѵ' => 'Yh', + 'ѵ' => 'yh', + 'Є' => '', + 'є' => '', + 'Ѥ' => '', + 'ѥ' => '', + 'Ѕ' => 'Js', + 'ѕ' => 'js', + 'Ꙋ' => '', + 'ꙋ' => '', + 'Ѡ' => '', + 'ѡ' => '', + 'Ѿ' => '', + 'ѿ' => '', + 'Ѫ' => '', + 'ѫ' => '', + 'Ѧ' => '', + 'ѧ' => '', + 'Ѭ' => '', + 'ѭ' => '', + 'Ѩ' => '', + 'ѩ' => '', + 'Ѯ' => '', + 'ѯ' => '', + 'Ѱ' => '', + 'ѱ' => '', + ], + // Russian - Passport (2013), ICAO + // -> https://en.m.wikipedia.org/wiki/Romanization_of_Russian#content-collapsible-block-1 + 'ru__passport_2013' => [ + 'А' => 'A', + 'а' => 'a', + 'Б' => 'B', + 'б' => 'b', + 'В' => 'V', + 'в' => 'v', + 'Г' => 'G', + 'г' => 'g', + 'Д' => 'D', + 'д' => 'd', + 'Е' => 'E', + 'е' => 'e', + 'Ё' => 'E', + 'ё' => 'e', + 'Ж' => 'Zh', + 'ж' => 'zh', + 'З' => 'Z', + 'з' => 'z', + 'И' => 'i', + 'и' => 'i', + 'Й' => 'i', + 'й' => 'i', + 'К' => 'K', + 'к' => 'k', + 'Л' => 'L', + 'л' => 'l', + 'М' => 'M', + 'м' => 'm', + 'Н' => 'N', + 'н' => 'n', + 'О' => 'O', + 'о' => 'o', + 'П' => 'P', + 'п' => 'p', + 'Р' => 'R', + 'р' => 'r', + 'С' => 'S', + 'с' => 's', + 'Т' => 'T', + 'т' => 't', + 'У' => 'U', + 'у' => 'u', + 'Ф' => 'F', + 'ф' => 'f', + 'Х' => 'Kh', + 'х' => 'kh', + 'Ц' => 'Ts', + 'ц' => 'ts', + 'Ч' => 'Ch', + 'ч' => 'ch', + 'ш' => 'sh', + 'Ш' => 'Sh', + 'Щ' => 'Shch', + 'щ' => 'shch', + 'Ъ' => 'Ie', + 'ъ' => 'ie', + 'Ы' => 'Y', + 'ы' => 'y', + 'Ь' => '', + 'ь' => '', + 'Э' => 'E', + 'э' => 'e', + 'Ю' => 'Iu', + 'ю' => 'iu', + 'Я' => 'Ia', + 'я' => 'ia', + 'І' => '', + 'і' => '', + 'Ѳ' => '', + 'ѳ' => '', + 'Ѣ' => '', + 'ѣ' => '', + 'Ѵ' => '', + 'ѵ' => '', + 'Є' => '', + 'є' => '', + 'Ѥ' => '', + 'ѥ' => '', + 'Ѕ' => '', + 'ѕ' => '', + 'Ꙋ' => '', + 'ꙋ' => '', + 'Ѡ' => '', + 'ѡ' => '', + 'Ѿ' => '', + 'ѿ' => '', + 'Ѫ' => '', + 'ѫ' => '', + 'Ѧ' => '', + 'ѧ' => '', + 'Ѭ' => '', + 'ѭ' => '', + 'Ѩ' => '', + 'ѩ' => '', + 'Ѯ' => '', + 'ѯ' => '', + 'Ѱ' => '', + 'ѱ' => '', + ], + // Ukrainian + // -> https://zakon.rada.gov.ua/laws/show/55-2010-%D0%BF?lang=en + 'uk' => [ + 'Г' => 'H', + 'г' => 'h', + 'Ґ' => 'G', + 'ґ' => 'g', + 'Є' => 'Ye', + 'є' => 'ye', + 'И' => 'Y', + 'и' => 'y', + 'І' => 'I', + 'і' => 'i', + 'Ї' => 'Yi', + 'ї' => 'yi', + 'Й' => 'Y', + 'й' => 'y', + 'Х' => 'Kh', + 'х' => 'kh', + 'Ц' => 'Ts', + 'ц' => 'ts', + 'Ч' => 'Ch', + 'ч' => 'ch', + 'Ш' => 'Sh', + 'ш' => 'sh', + 'Щ' => 'Shch', + 'щ' => 'shch', + ], + // Kazakh + 'kk' => [ + 'Ә' => 'A', + 'Ғ' => 'G', + 'Қ' => 'Q', + 'Ң' => 'N', + 'Ө' => 'O', + 'Ұ' => 'U', + 'Ү' => 'U', + 'Һ' => 'H', + 'ә' => 'a', + 'ғ' => 'g', + 'қ' => 'q', + 'ң' => 'n', + 'ө' => 'o', + 'ұ' => 'u', + 'ү' => 'u', + 'һ' => 'h', + ], + // Czech + 'cs' => [ + 'á' => 'a', + 'Á' => 'A', + 'č' => 'c', + 'Č' => 'C', + 'ď' => 'd', + 'Ď' => 'D', + 'é' => 'e', + 'É' => 'E', + 'ě' => 'e', + 'Ě' => 'E', + 'í' => 'i', + 'Í' => 'I', + 'ň' => 'n', + 'Ň' => 'N', + 'ó' => 'o', + 'Ó' => 'O', + 'ř' => 'r', + 'Ř' => 'R', + 'š' => 's', + 'Š' => 'S', + 'ť' => 't', + 'Ť' => 'T', + 'ú' => 'u', + 'Ú' => 'U', + 'ů' => 'u', + 'Ů' => 'U', + 'ý' => 'y', + 'Ý' => 'Y', + 'ž' => 'z', + 'Ž' => 'Z', + ], + // Danish + 'da' => [ + 'Æ' => 'Ae', + 'æ' => 'ae', + 'Ø' => 'Oe', + 'ø' => 'oe', + 'Å' => 'Aa', + 'å' => 'aa', + 'É' => 'E', + 'é' => 'e', + ], + // Polish + 'pl' => [ + 'ą' => 'a', + 'ć' => 'c', + 'ę' => 'e', + 'ł' => 'l', + 'ń' => 'n', + 'ó' => 'o', + 'ś' => 's', + 'ź' => 'z', + 'ż' => 'z', + 'Ą' => 'A', + 'Ć' => 'C', + 'Ę' => 'E', + 'Ł' => 'L', + 'Ń' => 'N', + 'Ó' => 'O', + 'Ś' => 'S', + 'Ź' => 'Z', + 'Ż' => 'Z', + ], + // Romanian + 'ro' => [ + 'ă' => 'a', + 'â' => 'a', + 'Ă' => 'A', + 'Â' => 'A', + 'î' => 'i', + 'Î' => 'I', + 'ș' => 's', + 'ş' => 's', + 'Ş' => 'S', + 'Ș' => 'S', + 'ț' => 't', + 'ţ' => 't', + 'Ţ' => 'T', + 'Ț' => 'T', + ], + // Esperanto + 'eo' => [ + 'ĉ' => 'cx', + 'ĝ' => 'gx', + 'ĥ' => 'hx', + 'ĵ' => 'jx', + 'ŝ' => 'sx', + 'ŭ' => 'ux', + 'Ĉ' => 'CX', + 'Ĝ' => 'GX', + 'Ĥ' => 'HX', + 'Ĵ' => 'JX', + 'Ŝ' => 'SX', + 'Ŭ' => 'UX', + ], + // Estonian + 'et' => [ + 'Š' => 'S', + 'Ž' => 'Z', + 'Õ' => 'O', + 'Ä' => 'A', + 'Ö' => 'O', + 'Ü' => 'U', + 'š' => 's', + 'ž' => 'z', + 'õ' => 'o', + 'ä' => 'a', + 'ö' => 'o', + 'ü' => 'u', + ], + // Latvian + 'lv' => [ + 'ā' => 'a', + 'č' => 'c', + 'ē' => 'e', + 'ģ' => 'g', + 'ī' => 'i', + 'ķ' => 'k', + 'ļ' => 'l', + 'ņ' => 'n', + 'š' => 's', + 'ū' => 'u', + 'ž' => 'z', + 'Ā' => 'A', + 'Č' => 'C', + 'Ē' => 'E', + 'Ģ' => 'G', + 'Ī' => 'i', + 'Ķ' => 'k', + 'Ļ' => 'L', + 'Ņ' => 'N', + 'Š' => 'S', + 'Ū' => 'u', + 'Ž' => 'Z', + ], + // Lithuanian + 'lt' => [ + 'ą' => 'a', + 'č' => 'c', + 'ę' => 'e', + 'ė' => 'e', + 'į' => 'i', + 'š' => 's', + 'ų' => 'u', + 'ū' => 'u', + 'ž' => 'z', + 'Ą' => 'A', + 'Č' => 'C', + 'Ę' => 'E', + 'Ė' => 'E', + 'Į' => 'I', + 'Š' => 'S', + 'Ų' => 'U', + 'Ū' => 'U', + 'Ž' => 'Z', + ], + // Norwegian + 'no' => [ + 'Æ' => 'AE', + 'æ' => 'ae', + 'Ø' => 'OE', + 'ø' => 'oe', + 'Å' => 'AA', + 'å' => 'aa', + ], + // Vietnamese + 'vi' => [ + 'Á' => 'A', + 'À' => 'A', + 'Ả' => 'A', + 'Ã' => 'A', + 'Ạ' => 'A', + 'Ă' => 'A', + 'Ắ' => 'A', + 'Ằ' => 'A', + 'Ẳ' => 'A', + 'Ẵ' => 'A', + 'Ặ' => 'A', + 'Â' => 'A', + 'Ấ' => 'A', + 'Ầ' => 'A', + 'Ẩ' => 'A', + 'Ẫ' => 'A', + 'Ậ' => 'A', + 'á' => 'a', + 'à' => 'a', + 'ả' => 'a', + 'ã' => 'a', + 'ạ' => 'a', + 'ă' => 'a', + 'ắ' => 'a', + 'ằ' => 'a', + 'ẳ' => 'a', + 'ẵ' => 'a', + 'ặ' => 'a', + 'â' => 'a', + 'ấ' => 'a', + 'ầ' => 'a', + 'ẩ' => 'a', + 'ẫ' => 'a', + 'ậ' => 'a', + 'É' => 'E', + 'È' => 'E', + 'Ẻ' => 'E', + 'Ẽ' => 'E', + 'Ẹ' => 'E', + 'Ê' => 'E', + 'Ế' => 'E', + 'Ề' => 'E', + 'Ể' => 'E', + 'Ễ' => 'E', + 'Ệ' => 'E', + 'é' => 'e', + 'è' => 'e', + 'ẻ' => 'e', + 'ẽ' => 'e', + 'ẹ' => 'e', + 'ê' => 'e', + 'ế' => 'e', + 'ề' => 'e', + 'ể' => 'e', + 'ễ' => 'e', + 'ệ' => 'e', + 'Í' => 'I', + 'Ì' => 'I', + 'Ỉ' => 'I', + 'Ĩ' => 'I', + 'Ị' => 'I', + 'í' => 'i', + 'ì' => 'i', + 'ỉ' => 'i', + 'ĩ' => 'i', + 'ị' => 'i', + 'Ó' => 'O', + 'Ò' => 'O', + 'Ỏ' => 'O', + 'Õ' => 'O', + 'Ọ' => 'O', + 'Ô' => 'O', + 'Ố' => 'O', + 'Ồ' => 'O', + 'Ổ' => 'O', + 'Ỗ' => 'O', + 'Ộ' => 'O', + 'Ơ' => 'O', + 'Ớ' => 'O', + 'Ờ' => 'O', + 'Ở' => 'O', + 'Ỡ' => 'O', + 'Ợ' => 'O', + 'ó' => 'o', + 'ò' => 'o', + 'ỏ' => 'o', + 'õ' => 'o', + 'ọ' => 'o', + 'ô' => 'o', + 'ố' => 'o', + 'ồ' => 'o', + 'ổ' => 'o', + 'ỗ' => 'o', + 'ộ' => 'o', + 'ơ' => 'o', + 'ớ' => 'o', + 'ờ' => 'o', + 'ở' => 'o', + 'ỡ' => 'o', + 'ợ' => 'o', + 'Ú' => 'U', + 'Ù' => 'U', + 'Ủ' => 'U', + 'Ũ' => 'U', + 'Ụ' => 'U', + 'Ư' => 'U', + 'Ứ' => 'U', + 'Ừ' => 'U', + 'Ử' => 'U', + 'Ữ' => 'U', + 'Ự' => 'U', + 'ú' => 'u', + 'ù' => 'u', + 'ủ' => 'u', + 'ũ' => 'u', + 'ụ' => 'u', + 'ư' => 'u', + 'ứ' => 'u', + 'ừ' => 'u', + 'ử' => 'u', + 'ữ' => 'u', + 'ự' => 'u', + 'Ý' => 'Y', + 'Ỳ' => 'Y', + 'Ỷ' => 'Y', + 'Ỹ' => 'Y', + 'Ỵ' => 'Y', + 'ý' => 'y', + 'ỳ' => 'y', + 'ỷ' => 'y', + 'ỹ' => 'y', + 'ỵ' => 'y', + 'Đ' => 'D', + 'đ' => 'd', + ], + // Persian (Farsi) + 'fa' => [ + 'ا' => 'a', + 'ب' => 'b', + 'پ' => 'p', + 'ت' => 't', + 'ث' => 's', + 'ج' => 'j', + 'چ' => 'ch', + 'ح' => 'h', + 'خ' => 'kh', + 'د' => 'd', + 'ذ' => 'z', + 'ر' => 'r', + 'ز' => 'z', + 'س' => 's', + 'ش' => 'sh', + 'ص' => 's', + 'ض' => 'z', + 'ط' => 't', + 'ظ' => 'z', + 'ع' => 'a', + 'غ' => 'gh', + 'ف' => 'f', + 'ق' => 'gh', + 'ک' => 'k', + 'گ' => 'g', + 'ل' => 'l', + 'ژ' => 'zh', + 'ك' => 'k', + 'م' => 'm', + 'ن' => 'n', + 'ه' => 'h', + 'و' => 'o', + 'ی' => 'y', + 'آ' => 'a', + '٠' => '0', + '١' => '1', + '٢' => '2', + '٣' => '3', + '٤' => '4', + '٥' => '5', + '٦' => '6', + '٧' => '7', + '٨' => '8', + '٩' => '9', + ], + // Arabic + 'ar' => [ + 'أ' => 'a', + 'ب' => 'b', + 'ت' => 't', + 'ث' => 'th', + 'ج' => 'g', + 'ح' => 'h', + 'خ' => 'kh', + 'د' => 'd', + 'ذ' => 'th', + 'ر' => 'r', + 'ز' => 'z', + 'س' => 's', + 'ش' => 'sh', + 'ص' => 's', + 'ض' => 'd', + 'ط' => 't', + 'ظ' => 'th', + 'ع' => 'aa', + 'غ' => 'gh', + 'ف' => 'f', + 'ق' => 'k', + 'ك' => 'k', + 'ل' => 'l', + 'م' => 'm', + 'ن' => 'n', + 'ه' => 'h', + 'و' => 'o', + 'ي' => 'y', + 'ا' => 'a', + 'إ' => 'a', + 'آ' => 'a', + 'ؤ' => 'o', + 'ئ' => 'y', + 'ء' => 'aa', + '٠' => '0', + '١' => '1', + '٢' => '2', + '٣' => '3', + '٤' => '4', + '٥' => '5', + '٦' => '6', + '٧' => '7', + '٨' => '8', + '٩' => '9', + ], + // Serbian + 'sr' => [ + 'đ' => 'dj', + 'ž' => 'z', + 'ć' => 'c', + 'č' => 'c', + 'š' => 's', + 'Đ' => 'Dj', + 'Ž' => 'Z', + 'Ć' => 'C', + 'Č' => 'C', + 'Š' => 'S', + 'а' => 'a', + 'б' => 'b', + 'в' => 'v', + 'г' => 'g', + 'д' => 'd', + 'ђ' => 'dj', + 'е' => 'e', + 'ж' => 'z', + 'з' => 'z', + 'и' => 'i', + 'ј' => 'j', + 'к' => 'k', + 'л' => 'l', + 'љ' => 'lj', + 'м' => 'm', + 'н' => 'n', + 'њ' => 'nj', + 'о' => 'o', + 'п' => 'p', + 'р' => 'r', + 'с' => 's', + 'т' => 't', + 'ћ' => 'c', + 'у' => 'u', + 'ф' => 'f', + 'х' => 'h', + 'ц' => 'c', + 'ч' => 'c', + 'џ' => 'dz', + 'ш' => 's', + 'А' => 'A', + 'Б' => 'B', + 'В' => 'V', + 'Г' => 'G', + 'Д' => 'D', + 'Ђ' => 'Dj', + 'Е' => 'E', + 'Ж' => 'Z', + 'З' => 'Z', + 'И' => 'I', + 'Ј' => 'j', + 'К' => 'K', + 'Л' => 'L', + 'Љ' => 'Lj', + 'М' => 'M', + 'Н' => 'N', + 'Њ' => 'Nj', + 'О' => 'O', + 'П' => 'P', + 'Р' => 'R', + 'С' => 'S', + 'Т' => 'T', + 'Ћ' => 'C', + 'У' => 'U', + 'Ф' => 'F', + 'Х' => 'H', + 'Ц' => 'C', + 'Ч' => 'C', + 'Џ' => 'Dz', + 'Ш' => 'S', + ], + // Serbian - Cyrillic + 'sr__cyr' => [ + 'а' => 'a', + 'б' => 'b', + 'в' => 'v', + 'г' => 'g', + 'д' => 'd', + 'ђ' => 'dj', + 'е' => 'e', + 'ж' => 'z', + 'з' => 'z', + 'и' => 'i', + 'ј' => 'j', + 'к' => 'k', + 'л' => 'l', + 'љ' => 'lj', + 'м' => 'm', + 'н' => 'n', + 'њ' => 'nj', + 'о' => 'o', + 'п' => 'p', + 'р' => 'r', + 'с' => 's', + 'т' => 't', + 'ћ' => 'c', + 'у' => 'u', + 'ф' => 'f', + 'х' => 'h', + 'ц' => 'c', + 'ч' => 'c', + 'џ' => 'dz', + 'ш' => 's', + 'А' => 'A', + 'Б' => 'B', + 'В' => 'V', + 'Г' => 'G', + 'Д' => 'D', + 'Ђ' => 'Dj', + 'Е' => 'E', + 'Ж' => 'Z', + 'З' => 'Z', + 'И' => 'I', + 'Ј' => 'j', + 'К' => 'K', + 'Л' => 'L', + 'Љ' => 'Lj', + 'М' => 'M', + 'Н' => 'N', + 'Њ' => 'Nj', + 'О' => 'O', + 'П' => 'P', + 'Р' => 'R', + 'С' => 'S', + 'Т' => 'T', + 'Ћ' => 'C', + 'У' => 'U', + 'Ф' => 'F', + 'Х' => 'H', + 'Ц' => 'C', + 'Ч' => 'C', + 'Џ' => 'Dz', + 'Ш' => 'S', + ], + // Serbian - Latin + 'sr__lat' => [ + 'đ' => 'dj', + 'ž' => 'z', + 'ć' => 'c', + 'č' => 'c', + 'š' => 's', + 'Đ' => 'Dj', + 'Ž' => 'Z', + 'Ć' => 'C', + 'Č' => 'C', + 'Š' => 'S', + ], + // Azerbaijani + 'az' => [ + 'ç' => 'c', + 'ə' => 'e', + 'ğ' => 'g', + 'ı' => 'i', + 'ö' => 'o', + 'ş' => 's', + 'ü' => 'u', + 'Ç' => 'C', + 'Ə' => 'E', + 'Ğ' => 'G', + 'İ' => 'I', + 'Ö' => 'O', + 'Ş' => 'S', + 'Ü' => 'U', + ], + // Slovak + 'sk' => [ + 'á' => 'a', + 'ä' => 'a', + 'č' => 'c', + 'ď' => 'd', + 'é' => 'e', + 'í' => 'i', + 'ľ' => 'l', + 'ĺ' => 'l', + 'ň' => 'n', + 'ó' => 'o', + 'ô' => 'o', + 'ŕ' => 'r', + 'š' => 's', + 'ť' => 't', + 'ú' => 'u', + 'ý' => 'y', + 'ž' => 'z', + 'Á' => 'A', + 'Ä' => 'A', + 'Č' => 'C', + 'Ď' => 'D', + 'É' => 'E', + 'Í' => 'I', + 'Ľ' => 'L', + 'Ĺ' => 'L', + 'Ň' => 'N', + 'Ó' => 'O', + 'Ô' => 'O', + 'Ŕ' => 'R', + 'Š' => 'S', + 'Ť' => 'T', + 'Ú' => 'U', + 'Ý' => 'Y', + 'Ž' => 'Z', + ], + // French + 'fr' => [ + 'Æ' => 'AE', + 'æ' => 'ae', + 'Œ' => 'OE', + 'œ' => 'oe', + 'â' => 'a', + 'Â' => 'A', + 'à' => 'a', + 'À' => 'A', + 'ä' => 'a', + 'Ä' => 'A', + 'ç' => 'c', + 'Ç' => 'C', + 'é' => 'e', + 'É' => 'E', + 'ê' => 'e', + 'Ê' => 'E', + 'ë' => 'e', + 'Ë' => 'E', + 'è' => 'e', + 'È' => 'E', + 'ï' => 'i', + 'î' => 'i', + 'Ï' => 'I', + 'Î' => 'I', + 'ÿ' => 'y', + 'Ÿ' => 'Y', + 'ô' => 'o', + 'Ô' => 'O', + 'ö' => 'o', + 'Ö' => 'O', + 'û' => 'u', + 'Û' => 'U', + 'ù' => 'u', + 'Ù' => 'U', + 'ü' => 'u', + 'Ü' => 'U', + ], + // Austrian (French) + 'fr_at' => [ + 'ß' => 'sz', + 'ẞ' => 'SZ', + 'Æ' => 'AE', + 'æ' => 'ae', + 'Œ' => 'OE', + 'œ' => 'oe', + 'â' => 'a', + 'Â' => 'A', + 'à' => 'a', + 'À' => 'A', + 'ä' => 'a', + 'Ä' => 'A', + 'ç' => 'c', + 'Ç' => 'C', + 'é' => 'e', + 'É' => 'E', + 'ê' => 'e', + 'Ê' => 'E', + 'ë' => 'e', + 'Ë' => 'E', + 'è' => 'e', + 'È' => 'E', + 'ï' => 'i', + 'î' => 'i', + 'Ï' => 'I', + 'Î' => 'I', + 'ÿ' => 'y', + 'Ÿ' => 'Y', + 'ô' => 'o', + 'Ô' => 'O', + 'ö' => 'o', + 'Ö' => 'O', + 'û' => 'u', + 'Û' => 'U', + 'ù' => 'u', + 'Ù' => 'U', + 'ü' => 'u', + 'Ü' => 'U', + ], + // Switzerland (French) + 'fr_ch' => [ + 'ß' => 'ss', + 'ẞ' => 'SS', + 'Æ' => 'AE', + 'æ' => 'ae', + 'Œ' => 'OE', + 'œ' => 'oe', + 'â' => 'a', + 'Â' => 'A', + 'à' => 'a', + 'À' => 'A', + 'ä' => 'a', + 'Ä' => 'A', + 'ç' => 'c', + 'Ç' => 'C', + 'é' => 'e', + 'É' => 'E', + 'ê' => 'e', + 'Ê' => 'E', + 'ë' => 'e', + 'Ë' => 'E', + 'è' => 'e', + 'È' => 'E', + 'ï' => 'i', + 'î' => 'i', + 'Ï' => 'I', + 'Î' => 'I', + 'ÿ' => 'y', + 'Ÿ' => 'Y', + 'ô' => 'o', + 'Ô' => 'O', + 'ö' => 'o', + 'Ö' => 'O', + 'û' => 'u', + 'Û' => 'U', + 'ù' => 'u', + 'Ù' => 'U', + 'ü' => 'u', + 'Ü' => 'U', + ], + // German + 'de' => [ + 'Ä' => 'Ae', + 'Ö' => 'Oe', + 'Ü' => 'Ue', + 'ä' => 'ae', + 'ö' => 'oe', + 'ü' => 'ue', + 'ß' => 'ss', + 'ẞ' => 'SS', + ], + // Austrian (German) + 'de_at' => [ + 'Ä' => 'Ae', + 'Ö' => 'Oe', + 'Ü' => 'Ue', + 'ä' => 'ae', + 'ö' => 'oe', + 'ü' => 'ue', + 'ß' => 'sz', + 'ẞ' => 'SZ', + ], + // Switzerland (German) + 'de_ch' => [ + 'Ä' => 'Ae', + 'Ö' => 'Oe', + 'Ü' => 'Ue', + 'ä' => 'ae', + 'ö' => 'oe', + 'ü' => 'ue', + 'ß' => 'ss', + 'ẞ' => 'SS', + ], + // Bengali (Bangla) + 'bn' => [ + 'ভ্ল' => 'vl', + 'পশ' => 'psh', + 'ব্ধ' => 'bdh', + 'ব্জ' => 'bj', + 'ব্দ' => 'bd', + 'ব্ব' => 'bb', + 'ব্ল' => 'bl', + 'ভ' => 'v', + 'ব' => 'b', + 'চ্ঞ' => 'cNG', + 'চ্ছ' => 'cch', + 'চ্চ' => 'cc', + 'ছ' => 'ch', + 'চ' => 'c', + 'ধ্ন' => 'dhn', + 'ধ্ম' => 'dhm', + 'দ্ঘ' => 'dgh', + 'দ্ধ' => 'ddh', + 'দ্ভ' => 'dv', + 'দ্ম' => 'dm', + 'ড্ড' => 'DD', + 'ঢ' => 'Dh', + 'ধ' => 'dh', + 'দ্গ' => 'dg', + 'দ্দ' => 'dd', + 'ড' => 'D', + 'দ' => 'd', + '।' => '.', + 'ঘ্ন' => 'Ghn', + 'গ্ধ' => 'Gdh', + 'গ্ণ' => 'GN', + 'গ্ন' => 'Gn', + 'গ্ম' => 'Gm', + 'গ্ল' => 'Gl', + 'জ্ঞ' => 'jNG', + 'ঘ' => 'Gh', + 'গ' => 'g', + 'হ্ণ' => 'hN', + 'হ্ন' => 'hn', + 'হ্ম' => 'hm', + 'হ্ল' => 'hl', + 'হ' => 'h', + 'জ্ঝ' => 'jjh', + 'ঝ' => 'jh', + 'জ্জ' => 'jj', + 'জ' => 'j', + 'ক্ষ্ণ' => 'kxN', + 'ক্ষ্ম' => 'kxm', + 'ক্ষ' => 'ksh', + 'কশ' => 'ksh', + 'ক্ক' => 'kk', + 'ক্ট' => 'kT', + 'ক্ত' => 'kt', + 'ক্ল' => 'kl', + 'ক্স' => 'ks', + 'খ' => 'kh', + 'ক' => 'k', + 'ল্ভ' => 'lv', + 'ল্ধ' => 'ldh', + 'লখ' => 'lkh', + 'লঘ' => 'lgh', + 'লফ' => 'lph', + 'ল্ক' => 'lk', + 'ল্গ' => 'lg', + 'ল্ট' => 'lT', + 'ল্ড' => 'lD', + 'ল্প' => 'lp', + 'ল্ম' => 'lm', + 'ল্ল' => 'll', + 'ল্ব' => 'lb', + 'ল' => 'l', + 'ম্থ' => 'mth', + 'ম্ফ' => 'mf', + 'ম্ভ' => 'mv', + 'মপ্ল' => 'mpl', + 'ম্ন' => 'mn', + 'ম্প' => 'mp', + 'ম্ম' => 'mm', + 'ম্ল' => 'ml', + 'ম্ব' => 'mb', + 'ম' => 'm', + '০' => '0', + '১' => '1', + '২' => '2', + '৩' => '3', + '৪' => '4', + '৫' => '5', + '৬' => '6', + '৭' => '7', + '৮' => '8', + '৯' => '9', + 'ঙ্ক্ষ' => 'Ngkx', + 'ঞ্ছ' => 'nch', + 'ঙ্ঘ' => 'ngh', + 'ঙ্খ' => 'nkh', + 'ঞ্ঝ' => 'njh', + 'ঙ্গৌ' => 'ngOU', + 'ঙ্গৈ' => 'ngOI', + 'ঞ্চ' => 'nc', + 'ঙ্ক' => 'nk', + 'ঙ্ষ' => 'Ngx', + 'ঙ্গ' => 'ngo', + 'ঙ্ম' => 'Ngm', + 'ঞ্জ' => 'nj', + 'ন্ধ' => 'ndh', + 'ন্ঠ' => 'nTh', + 'ণ্ঠ' => 'NTh', + 'ন্থ' => 'nth', + 'ঙ্গা' => 'nga', + 'ঙ্গি' => 'ngi', + 'ঙ্গী' => 'ngI', + 'ঙ্গু' => 'ngu', + 'ঙ্গূ' => 'ngU', + 'ঙ্গে' => 'nge', + 'ঙ্গো' => 'ngO', + 'ণ্ঢ' => 'NDh', + 'নশ' => 'nsh', + 'ঙর' => 'Ngr', + 'ঞর' => 'NGr', + 'ংর' => 'ngr', + 'ঙ' => 'Ng', + 'ঞ' => 'NG', + 'ং' => 'ng', + 'ন্ন' => 'nn', + 'ণ্ণ' => 'NN', + 'ণ্ন' => 'Nn', + 'ন্ম' => 'nm', + 'ণ্ম' => 'Nm', + 'ন্দ' => 'nd', + 'ন্ট' => 'nT', + 'ণ্ট' => 'NT', + 'ন্ড' => 'nD', + 'ণ্ড' => 'ND', + 'ন্ত' => 'nt', + 'ন্স' => 'ns', + 'ন' => 'n', + 'ণ' => 'N', + 'ৈ' => 'OI', + 'ৌ' => 'OU', + 'ো' => 'O', + 'ঐ' => 'OI', + 'ঔ' => 'OU', + 'অ' => 'o', + 'ও' => 'oo', + 'ফ্ল' => 'fl', + 'প্ট' => 'pT', + 'প্ত' => 'pt', + 'প্ন' => 'pn', + 'প্প' => 'pp', + 'প্ল' => 'pl', + 'প্স' => 'ps', + 'ফ' => 'f', + 'প' => 'p', + 'ৃ' => 'rri', + 'ঋ' => 'rri', + 'রর‍্য' => 'rry', + '্র্য' => 'ry', + '্রর' => 'rr', + 'ড়্গ' => 'Rg', + 'ঢ়' => 'Rh', + 'ড়' => 'R', + 'র' => 'r', + '্র' => 'r', + 'শ্ছ' => 'Sch', + 'ষ্ঠ' => 'ShTh', + 'ষ্ফ' => 'Shf', + 'স্ক্ল' => 'skl', + 'স্খ' => 'skh', + 'স্থ' => 'sth', + 'স্ফ' => 'sf', + 'শ্চ' => 'Sc', + 'শ্ত' => 'St', + 'শ্ন' => 'Sn', + 'শ্ম' => 'Sm', + 'শ্ল' => 'Sl', + 'ষ্ক' => 'Shk', + 'ষ্ট' => 'ShT', + 'ষ্ণ' => 'ShN', + 'ষ্প' => 'Shp', + 'ষ্ম' => 'Shm', + 'স্প্ল' => 'spl', + 'স্ক' => 'sk', + 'স্ট' => 'sT', + 'স্ত' => 'st', + 'স্ন' => 'sn', + 'স্প' => 'sp', + 'স্ম' => 'sm', + 'স্ল' => 'sl', + 'শ' => 'S', + 'ষ' => 'Sh', + 'স' => 's', + 'ু' => 'u', + 'উ' => 'u', + 'অ্য' => 'oZ', + 'ত্থ' => 'tth', + 'ৎ' => 'tt', + 'ট্ট' => 'TT', + 'ট্ম' => 'Tm', + 'ঠ' => 'Th', + 'ত্ন' => 'tn', + 'ত্ম' => 'tm', + 'থ' => 'th', + 'ত্ত' => 'tt', + 'ট' => 'T', + 'ত' => 't', + 'অ্যা' => 'AZ', + 'া' => 'a', + 'আ' => 'a', + 'য়া' => 'ya', + 'য়' => 'y', + 'ি' => 'i', + 'ই' => 'i', + 'ী' => 'ee', + 'ঈ' => 'ee', + 'ূ' => 'uu', + 'ঊ' => 'uu', + 'ে' => 'e', + 'এ' => 'e', + 'য' => 'z', + '্য' => 'Z', + 'ইয়' => 'y', + 'ওয়' => 'w', + '্ব' => 'w', + 'এক্স' => 'x', + 'ঃ' => ':', + 'ঁ' => 'nn', + '্‌' => '', + ], + // English + 'en' => [ + ], + // Latin (+ Cyrillic ?) chars + // + // -> Mix of languages, but we need to keep this here, so that different languages can handle there own behavior. + 'latin' => [ + '˚' => '0', + '¹' => '1', + '²' => '2', + '³' => '3', + '⁴' => '4', + '⁵' => '5', + '⁶' => '6', + '⁷' => '7', + '⁸' => '8', + '⁹' => '9', + '₀' => '0', + '₁' => '1', + '₂' => '2', + '₃' => '3', + '₄' => '4', + '₅' => '5', + '₆' => '6', + '₇' => '7', + '₈' => '8', + '₉' => '9', + '௦' => '0', + '௧' => '1', + '௨' => '2', + '௩' => '3', + '௪' => '4', + '௫' => '5', + '௬' => '6', + '௭' => '7', + '௮' => '8', + '௯' => '9', + '௰' => '10', + '௱' => '100', + '௲' => '1000', + 'Ꜳ' => 'AA', + 'ꜳ' => 'aa', + 'Æ' => 'AE', + 'æ' => 'ae', + 'Ǽ' => 'AE', + 'ǽ' => 'ae', + 'Ꜵ' => 'AO', + 'ꜵ' => 'ao', + 'Ꜷ' => 'AU', + 'ꜷ' => 'au', + 'Ꜹ' => 'AV', + 'ꜹ' => 'av', + 'Ꜻ' => 'av', + 'ꜻ' => 'av', + 'Ꜽ' => 'AY', + 'ꜽ' => 'ay', + 'ȸ' => 'db', + 'ʣ' => 'dz', + 'ʥ' => 'dz', + 'ʤ' => 'dezh', + '🙰' => 'et', + 'ff' => 'ff', + 'ffi' => 'ffi', + 'ffl' => 'ffl', + 'fi' => 'fi', + 'fl' => 'fl', + 'ʩ' => 'feng', + 'IJ' => 'IJ', + 'ij' => 'ij', + 'ʪ' => 'ls', + 'ʫ' => 'lz', + 'ɮ' => 'lezh', + 'ȹ' => 'qp', + 'ʨ' => 'tc', + 'ʦ' => 'ts', + 'ʧ' => 'tesh', + 'Œ' => 'OE', + 'œ' => 'oe', + 'Ꝏ' => 'OO', + 'ꝏ' => 'oo', + 'ẞ' => 'SS', + 'ß' => 'ss', + 'st' => 'st', + 'ſt' => 'st', + 'Ꜩ' => 'TZ', + 'ꜩ' => 'tz', + 'ᵫ' => 'ue', + 'Aι' => 'Ai', + 'αι' => 'ai', + 'Ει' => 'Ei', + 'ει' => 'ei', + 'Οι' => 'Oi', + 'οι' => 'oi', + 'Ου' => 'Oy', + 'ου' => 'oy', + 'Υι' => 'Yi', + 'υι' => 'yi', + 'ἀ' => 'a', + 'ἁ' => 'a', + 'ἂ' => 'a', + 'ἃ' => 'a', + 'ἄ' => 'a', + 'ἅ' => 'a', + 'ἆ' => 'a', + 'ἇ' => 'a', + 'Ἀ' => 'A', + 'Ἁ' => 'A', + 'Ἂ' => 'A', + 'Ἃ' => 'A', + 'Ἄ' => 'A', + 'Ἅ' => 'A', + 'Ἆ' => 'A', + 'Ἇ' => 'A', + 'ᾰ' => 'a', + 'ᾱ' => 'a', + 'ᾲ' => 'a', + 'ᾳ' => 'a', + 'ᾴ' => 'a', + 'ᾶ' => 'a', + 'ᾷ' => 'a', + 'Ᾰ' => 'A', + 'Ᾱ' => 'A', + 'Ὰ' => 'A', + 'Ά' => 'A', + 'ᾼ' => 'A', + 'Ä' => 'A', + 'ä' => 'a', + 'À' => 'A', + 'à' => 'a', + 'Á' => 'A', + 'á' => 'a', + 'Â' => 'A', + 'â' => 'a', + 'Ã' => 'A', + 'ã' => 'a', + 'A̧' => 'A', + 'a̧' => 'a', + 'Ą' => 'A', + 'ą' => 'a', + 'Ⱥ' => 'A', + 'ⱥ' => 'a', + 'Å' => 'A', + 'å' => 'a', + 'Ǻ' => 'A', + 'ǻ' => 'a', + 'Ă' => 'A', + 'ă' => 'a', + 'Ǎ' => 'A', + 'ǎ' => 'a', + 'Ȧ' => 'A', + 'ȧ' => 'a', + 'Ạ' => 'A', + 'ạ' => 'a', + 'Ā' => 'A', + 'ā' => 'a', + 'ª' => 'a', + 'Ɓ' => 'B', + 'Ѣ' => 'E', + 'ѣ' => 'e', + 'Ç' => 'C', + 'ç' => 'c', + 'Ĉ' => 'C', + 'ĉ' => 'c', + 'C̈' => 'C', + 'c̈' => 'c', + 'C̨' => 'C', + 'c̨' => 'c', + 'Ȼ' => 'C', + 'ȼ' => 'c', + 'Č' => 'C', + 'č' => 'c', + 'Ć' => 'C', + 'ć' => 'c', + 'C̀' => 'C', + 'c̀' => 'c', + 'Ċ' => 'C', + 'ċ' => 'c', + 'C̣' => 'C', + 'c̣' => 'c', + 'C̄' => 'C', + 'c̄' => 'c', + 'C̃' => 'C', + 'c̃' => 'c', + 'Ð' => 'D', + 'Đ' => 'D', + 'ð' => 'd', + 'đ' => 'd', + 'È' => 'E', + 'É' => 'E', + 'Ê' => 'E', + 'Ë' => 'E', + 'Ĕ' => 'E', + 'Ė' => 'E', + 'Ȩ' => 'E', + 'ȩ' => 'e', + 'Ę' => 'E', + 'ę' => 'e', + 'Ɇ' => 'E', + 'ɇ' => 'e', + 'Ě' => 'E', + 'ě' => 'e', + 'Ẹ' => 'E', + 'ẹ' => 'e', + 'Ē' => 'E', + 'ē' => 'e', + 'Ẽ' => 'E', + 'ẽ' => 'e', + 'è' => 'e', + 'é' => 'e', + 'ê' => 'e', + 'ë' => 'e', + 'ĕ' => 'e', + 'ė' => 'e', + 'ƒ' => 'f', + 'Ѳ' => 'F', + 'ѳ' => 'f', + 'Ĝ' => 'G', + 'Ġ' => 'G', + 'ĝ' => 'g', + 'ġ' => 'g', + 'Ĥ' => 'H', + 'Ħ' => 'H', + 'ĥ' => 'h', + 'ħ' => 'h', + 'Ì' => 'I', + 'Í' => 'I', + 'Î' => 'I', + 'Ï' => 'I', + 'Ĩ' => 'I', + 'Ĭ' => 'I', + 'Ǐ' => 'I', + 'Į' => 'I', + 'ì' => 'i', + 'í' => 'i', + 'î' => 'i', + 'ï' => 'i', + 'ĩ' => 'i', + 'ĭ' => 'i', + 'ǐ' => 'i', + 'į' => 'i', + 'І' => 'I', + 'і' => 'i', + 'I̧' => 'I', + 'i̧' => 'i', + 'Ɨ' => 'I', + 'ɨ' => 'i', + 'İ' => 'I', + 'i' => 'i', + 'Ị' => 'I', + 'ị' => 'i', + 'Ī' => 'I', + 'ī' => 'i', + 'Ĵ' => 'J', + 'ĵ' => 'j', + 'J́́' => 'J', + 'j́' => 'j', + 'J̀̀' => 'J', + 'j̀' => 'j', + 'J̈' => 'J', + 'j̈' => 'j', + 'J̧' => 'J', + 'j̧' => 'j', + 'J̨' => 'J', + 'j̨' => 'j', + 'Ɉ' => 'J', + 'ɉ' => 'j', + 'J̌' => 'J', + 'ǰ' => 'j', + 'J̇' => 'J', + 'j' => 'j', + 'J̣' => 'J', + 'j̣' => 'j', + 'J̄' => 'J', + 'j̄' => 'j', + 'J̃' => 'J', + 'j̃' => 'j', + 'Й' => 'i', + 'й' => 'i', + 'ĸ' => 'k', + 'Ĺ' => 'L', + 'Ľ' => 'L', + 'Ŀ' => 'L', + 'ĺ' => 'l', + 'ľ' => 'l', + 'ŀ' => 'l', + 'L̀' => 'L', + 'l̀' => 'l', + 'L̂' => 'L', + 'l̂' => 'l', + 'L̈' => 'L', + 'l̈' => 'l', + 'Ļ' => 'L', + 'ļ' => 'l', + 'L̨' => 'L', + 'l̨' => 'l', + 'Ł' => 'L', + 'ł' => 'l', + 'Ƚ' => 'L', + 'ƚ' => 'l', + 'L̇' => 'L', + 'l̇' => 'l', + 'Ḷ' => 'L', + 'ḷ' => 'l', + 'L̄' => 'L', + 'l̄' => 'l', + 'L̃' => 'L', + 'l̃' => 'l', + 'Ñ' => 'N', + 'ñ' => 'n', + 'Ŋ' => 'N', + 'ŋ' => 'n', + 'ʼn' => 'n', + 'Ń' => 'N', + 'ń' => 'n', + 'Ǹ' => 'N', + 'ǹ' => 'n', + 'N̂' => 'N', + 'n̂' => 'n', + 'N̈' => 'N', + 'n̈' => 'n', + 'Ņ' => 'N', + 'ņ' => 'n', + 'N̨' => 'N', + 'n̨' => 'n', + 'Ꞥ' => 'N', + 'ꞥ' => 'n', + 'Ň' => 'N', + 'ň' => 'n', + 'Ṅ' => 'N', + 'ṅ' => 'n', + 'Ṇ' => 'N', + 'ṇ' => 'n', + 'N̄' => 'N', + 'n̄' => 'n', + 'Ö' => 'O', + 'Ò' => 'O', + 'Ó' => 'O', + 'Ô' => 'O', + 'Õ' => 'O', + 'Ō' => 'O', + 'Ŏ' => 'O', + 'Ǒ' => 'O', + 'Ő' => 'O', + 'Ơ' => 'O', + 'Ø' => 'O', + 'Ǿ' => 'O', + 'ö' => 'o', + 'ò' => 'o', + 'ó' => 'o', + 'ô' => 'o', + 'õ' => 'o', + 'ō' => 'o', + 'ŏ' => 'o', + 'ǒ' => 'o', + 'ő' => 'o', + 'ơ' => 'o', + 'ø' => 'o', + 'ǿ' => 'o', + 'º' => 'o', + 'O̧' => 'O', + 'o̧' => 'o', + 'Ǫ' => 'O', + 'ǫ' => 'o', + 'Ɵ' => 'O', + 'ɵ' => 'o', + 'Ȯ' => 'O', + 'ȯ' => 'o', + 'Ọ' => 'O', + 'ọ' => 'o', + 'Ŕ' => 'R', + 'Ŗ' => 'R', + 'ŕ' => 'r', + 'ŗ' => 'r', + 'Ŝ' => 'S', + 'Ș' => 'S', + 'ș' => 's', + 'Ś' => 'S', + 'ś' => 's', + 'S̀' => 'S', + 's̀' => 's', + 'Ŝ̀' => 'S', + 'ŝ' => 's', + 'S̈' => 'S', + 's̈' => 's', + 'Ş' => 'S', + 'ş' => 's', + 'S̨' => 'S', + 's̨' => 's', + 'Ꞩ' => 'S', + 'ꞩ' => 's', + 'Š' => 'S', + 'š' => 's', + 'Ṡ' => 'S', + 'ṡ' => 's', + 'Ṣ' => 'S', + 'ṣ' => 's', + 'S̄' => 'S', + 's̄' => 's', + 'S̃' => 'S', + 's̃' => 's', + 'ſ' => 's', + 'Ţ' => 'T', + 'Ț' => 'T', + 'Ŧ' => 'T', + 'Þ' => 'TH', + 'ţ' => 't', + 'ț' => 't', + 'ŧ' => 't', + 'þ' => 'th', + 'T́' => 'T', + 't́' => 't', + 'T̀' => 'T', + 't̀' => 't', + 'T̂' => 'T', + 't̂' => 't', + 'T̈' => 'T', + 'ẗ' => 't', + 'T̨' => 'T', + 't̨' => 't', + 'Ⱦ' => 'T', + 'ⱦ' => 't', + 'Ť' => 'T', + 'ť' => 't', + 'Ṫ' => 'T', + 'ṫ' => 't', + 'Ṭ' => 'T', + 'ṭ' => 't', + 'T̄' => 'T', + 't̄' => 't', + 'T̃' => 'T', + 't̃' => 't', + 'Ü' => 'U', + 'Ù' => 'U', + 'Ú' => 'U', + 'Û' => 'U', + 'Ũ' => 'U', + 'Ŭ' => 'U', + 'Ű' => 'U', + 'Ų' => 'U', + 'Ư' => 'U', + 'Ǔ' => 'U', + 'Ǖ' => 'U', + 'Ǘ' => 'U', + 'Ǚ' => 'U', + 'Ǜ' => 'U', + 'ü' => 'u', + 'ù' => 'u', + 'ú' => 'u', + 'û' => 'u', + 'ũ' => 'u', + 'ŭ' => 'u', + 'ű' => 'u', + 'ų' => 'u', + 'ư' => 'u', + 'ǔ' => 'u', + 'ǖ' => 'u', + 'ǘ' => 'u', + 'ǚ' => 'u', + 'ǜ' => 'u', + 'U̧' => 'U', + 'u̧' => 'u', + 'Ʉ' => 'U', + 'ʉ' => 'u', + 'U̇' => 'U', + 'u̇' => 'u', + 'Ụ' => 'U', + 'ụ' => 'u', + 'Ū' => 'U', + 'ū' => 'u', + 'Ʊ' => 'U', + 'ʊ' => 'u', + 'Ŵ' => 'W', + 'ŵ' => 'w', + 'Ẁ' => 'W', + 'ẁ' => 'w', + 'Ẃ' => 'W', + 'ẃ' => 'w', + 'Ẅ' => 'W', + 'ẅ' => 'w', + 'Ѵ' => 'I', + 'ѵ' => 'i', + 'Ꙗ' => 'Ja', + 'ꙗ' => 'ja', + 'Є' => 'Je', + 'є' => 'je', + 'Ѥ' => 'Je', + 'ѥ' => 'je', + 'Ѕ' => 'Dz', + 'ѕ' => 'dz', + 'Ꙋ' => 'U', + 'ꙋ' => 'u', + 'Ѡ' => 'O', + 'ѡ' => 'o', + 'Ѿ' => 'Ot', + 'ѿ' => 'ot', + 'Ѫ' => 'U', + 'ѫ' => 'u', + 'Ѧ' => 'Ja', + 'ѧ' => 'ja', + 'Ѭ' => 'Ju', + 'ѭ' => 'ju', + 'Ѩ' => 'Ja', + 'ѩ' => 'Ja', + 'Ѯ' => 'Ks', + 'ѯ' => 'ks', + 'Ѱ' => 'Ps', + 'ѱ' => 'ps', + 'Х' => 'X', + 'х' => 'x', + 'Ý' => 'Y', + 'Ÿ' => 'Y', + 'Ŷ' => 'Y', + 'ý' => 'y', + 'ÿ' => 'y', + 'ŷ' => 'y', + 'Ỳ' => 'Y', + 'ỳ' => 'y', + 'Y̧' => 'Y', + 'y̧' => 'y', + 'Y̨' => 'Y', + 'y̨' => 'y', + 'Ɏ' => 'Y', + 'ɏ' => 'y', + 'Y̌' => 'Y', + 'y̌' => 'y', + 'Ẏ' => 'Y', + 'ẏ' => 'y', + 'Ỵ' => 'Y', + 'ỵ' => 'y', + 'Ȳ' => 'Y', + 'ȳ' => 'y', + 'Ỹ' => 'Y', + 'ỹ' => 'y', + 'Щ' => 'Shh', + 'щ' => 'shh', + 'Ź' => 'Z', + 'ź' => 'z', + 'Z̀' => 'Z', + 'z̀' => 'z', + 'Ẑ' => 'Z', + 'ẑ' => 'z', + 'Z̈' => 'Z', + 'z̈' => 'z', + 'Z̧' => 'Z', + 'z̧' => 'z', + 'Z̨' => 'Z', + 'z̨' => 'z', + 'Ƶ' => 'Z', + 'ƶ' => 'z', + 'Ž' => 'Z', + 'ž' => 'z', + 'Ż' => 'Z', + 'ż' => 'z', + 'Ẓ' => 'Z', + 'ẓ' => 'z', + 'Z̄' => 'Z', + 'z̄' => 'z', + 'Z̃' => 'Z', + 'z̃' => 'z', + ], + // whitespace chars + ' ' => [ + "\xc2\xa0" => ' ', // 'NO-BREAK SPACE' + "\xe1\x9a\x80" => ' ', // 'OGHAM SPACE MARK' + "\xe2\x80\x80" => ' ', // 'EN QUAD' + "\xe2\x80\x81" => ' ', // 'EM QUAD' + "\xe2\x80\x82" => ' ', // 'EN SPACE' + "\xe2\x80\x83" => ' ', // 'EM SPACE' + "\xe2\x80\x84" => ' ', // 'THREE-PER-EM SPACE' + "\xe2\x80\x85" => ' ', // 'FOUR-PER-EM SPACE' + "\xe2\x80\x86" => ' ', // 'SIX-PER-EM SPACE' + "\xe2\x80\x87" => ' ', // 'FIGURE SPACE' + "\xe2\x80\x88" => ' ', // 'PUNCTUATION SPACE' + "\xe2\x80\x89" => ' ', // 'THIN SPACE' + "\xe2\x80\x8a" => ' ', // 'HAIR SPACE' + "\xe2\x80\xa8" => ' ', // 'LINE SEPARATOR' + "\xe2\x80\xa9" => ' ', // 'PARAGRAPH SEPARATOR' + "\xe2\x80\x8b" => ' ', // 'ZERO WIDTH SPACE' + "\xe2\x80\xaf" => ' ', // 'NARROW NO-BREAK SPACE' + "\xe2\x81\x9f" => ' ', // 'MEDIUM MATHEMATICAL SPACE' + "\xe3\x80\x80" => ' ', // 'IDEOGRAPHIC SPACE' + "\xef\xbe\xa0" => ' ', // 'HALFWIDTH HANGUL FILLER' + ], + // commonly used in Word documents + 'msword' => [ + "\xc2\xab" => '<<', // « (U+00AB) in UTF-8 + "\xc2\xbb" => '>>', // » (U+00BB) in UTF-8 + "\xe2\x80\x98" => "'", // ‘ (U+2018) in UTF-8 + "\xe2\x80\x99" => "'", // ’ (U+2019) in UTF-8 + "\xe2\x80\x9a" => "'", // ‚ (U+201A) in UTF-8 + "\xe2\x80\x9b" => "'", // ‛ (U+201B) in UTF-8 + "\xe2\x80\x9c" => '"', // “ (U+201C) in UTF-8 + "\xe2\x80\x9d" => '"', // ” (U+201D) in UTF-8 + "\xe2\x80\x9e" => '"', // „ (U+201E) in UTF-8 + "\xe2\x80\x9f" => '"', // ‟ (U+201F) in UTF-8 + "\xe2\x80\xb9" => "'", // ‹ (U+2039) in UTF-8 + "\xe2\x80\xba" => "'", // › (U+203A) in UTF-8 + "\xe2\x80\x93" => '-', // – (U+2013) in UTF-8 + "\xe2\x80\x94" => '-', // — (U+2014) in UTF-8 + "\xe2\x80\xa6" => '...', // … (U+2026) in UTF-8 + ], + // Currency + // + // url => https://en.wikipedia.org/wiki/Currency_symbol + 'currency_short' => [ + '€' => 'EUR', + '$' => '$', + '₢' => 'Cr', + '₣' => 'Fr.', + '£' => 'PS', + '₤' => 'L.', + 'ℳ' => 'M', + '₥' => 'mil', + '₦' => 'N', + '₧' => 'Pts', + '₨' => 'Rs', + 'රු' => 'LKR', + 'ரூ' => 'LKR', + '௹' => 'Rs', + 'रू' => 'NPR', + '₹' => 'Rs', + '૱' => 'Rs', + '₩' => 'W', + '₪' => 'NS', + '₸' => 'KZT', + '₫' => 'D', + '֏' => 'AMD', + '₭' => 'K', + '₺' => 'TL', + '₼' => 'AZN', + '₮' => 'T', + '₯' => 'Dr', + '₲' => 'PYG', + '₾' => 'GEL', + '₳' => 'ARA', + '₴' => 'UAH', + '₽' => 'RUB', + '₵' => 'GHS', + '₡' => 'CL', + '¢' => 'c', + '¥' => 'YEN', + '円' => 'JPY', + '৳' => 'BDT', + '元' => 'CNY', + '﷼' => 'SAR', + '៛' => 'KR', + '₠' => 'ECU', + '¤' => '$?', + '฿' => 'THB', + '؋' => 'AFN', + ], +]; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php new file mode 100644 index 0000000..afe31ae --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_extras_by_languages.php @@ -0,0 +1,759 @@ +<?php + +return [ + // Dutch (Flemish) + 'nl' => [ + '=' => ' gelijk ', + '%' => ' procent ', + '∑' => ' som ', + '∆' => ' delta ', + '∞' => ' oneindig ', + '♥' => ' love ', + '&' => ' en ', + '+' => ' plus ', + ], + // Italian + 'it' => [ + '=' => ' uguale ', + '%' => ' percent ', + '∑' => ' somma ', + '∆' => ' delta ', + '∞' => ' infinito ', + '♥' => ' amore ', + '&' => ' e ', + '+' => ' piu ', + ], + // Macedonian + 'mk' => [ + '=' => ' ednakva ', + '%' => ' procenti ', + '∑' => ' zbir ', + '∆' => ' delta ', + '∞' => ' beskonecnost ', + '♥' => ' loveubov ', + '&' => ' i ', + '+' => ' plus ', + ], + // Portuguese (Brazil) + 'pt' => [ + '=' => ' igual ', + '%' => ' por cento ', + '∑' => ' soma ', + '∆' => ' delta ', + '∞' => ' infinito ', + '♥' => ' amor ', + '&' => ' e ', + '+' => ' mais ', + ], + // Greek(lish) (Elláda) + 'el__greeklish' => [ + '=' => ' isos ', + '%' => ' tois ekato ', + '∑' => ' athroisma ', + '∆' => ' delta ', + '∞' => ' apeiro ', + '♥' => ' agape ', + '&' => ' kai ', + '+' => ' syn ', + ], + // Greek (Elláda) + 'el' => [ + '=' => ' isos ', + '%' => ' tois ekato ', + '∑' => ' athroisma ', + '∆' => ' delta ', + '∞' => ' apeiro ', + '♥' => ' agape ', + '&' => ' kai ', + '+' => ' syn ', + ], + // Hindi + 'hi' => [ + '=' => ' samana ', + '%' => ' paratisata ', + '∑' => ' yoga ', + '∆' => ' dalata ', + '∞' => ' anata ', + '♥' => ' payara ', + '&' => ' aura ', + '+' => ' palasa ', + ], + // Armenian + 'hy' => [ + '=' => ' havasar ', + '%' => ' tvokvos ', + '∑' => ' gvoumar ', + '∆' => ' delta ', + '∞' => ' ansahmanvouthyvoun ', + '♥' => ' ser ', + '&' => ' ev ', + '+' => ' gvoumarats ', + ], + // Swedish + 'sv' => [ + '=' => ' lika ', + '%' => ' procent ', + '∑' => ' summa ', + '∆' => ' delta ', + '∞' => ' oandlighet ', + '♥' => ' alskar ', + '&' => ' och ', + '+' => ' plus ', + ], + // Turkmen + 'tk' => [ + '=' => ' den ', + '%' => ' yuzde ', + '∑' => ' jem ', + '∆' => ' delta ', + '∞' => ' mudimilik ', + '♥' => ' soygi ', + '&' => ' we ', + '+' => ' yzy ', + ], + // Turkish + 'tr' => [ + '=' => ' esit ', + '%' => ' yuzde ', + '∑' => ' Toplam ', + '∆' => ' delta ', + '∞' => ' sonsuzluk ', + '♥' => ' ask ', + '&' => ' ve ', + '+' => ' arti ', + ], + // Bulgarian + 'bg' => [ + '=' => ' raven ', + '%' => ' na sto ', + '∑' => ' suma ', + '∆' => ' delta ', + '∞' => ' bezkrajnost ', + '♥' => ' obicam ', + '&' => ' i ', + '+' => ' plus ', + ], + // Hungarian + 'hu' => [ + '=' => ' Egyenlo ', + '%' => ' Szazalek ', + '∑' => ' osszeg ', + '∆' => ' delta ', + '∞' => ' vegtelenitett ', + '♥' => ' love ', + '&' => ' Es ', + '+' => ' Plusz ', + ], + // Myanmar (Burmese) + 'my' => [ + '=' => ' ttn:ttnnym? ', + '%' => ' raakhngnn:k ', + '∑' => ' ld ', + '∆' => ' m?cwk?n:pe? ', + '∞' => ' ach:m ', + '♥' => ' mettttaa ', + '&' => ' n ', + '+' => ' ape?ng: ', + ], + // Croatian (Hrvatska) + 'hr' => [ + '=' => ' Jednaki ', + '%' => ' Posto ', + '∑' => ' zbroj ', + '∆' => ' Delta ', + '∞' => ' beskonacno ', + '♥' => ' ljubav ', + '&' => ' I ', + '+' => ' Plus ', + ], + // Finnish + 'fi' => [ + '=' => ' Sama ', + '%' => ' Prosenttia ', + '∑' => ' sum ', + '∆' => ' delta ', + '∞' => ' aareton ', + '♥' => ' rakkautta ', + '&' => ' Ja ', + '+' => ' Plus ', + ], + // Georgian (Kartvelian) + 'ka' => [ + '=' => ' tanasts\'ori ', + '%' => ' p\'rotsent\'i ', + '∑' => ' tankha ', + '∆' => ' delt\'a ', + '∞' => ' usasrulo ', + '♥' => ' siq\'varuli ', + '&' => ' da ', + '+' => ' p\'lus ', + ], + // Russian + 'ru' => [ + '=' => ' ravnyj ', + '%' => ' procent ', + '∑' => ' summa ', + '∆' => ' del\'ta ', + '∞' => ' beskonecnost\' ', + '♥' => ' lublu ', + '&' => ' i ', + '+' => ' plus ', + ], + // Russian - GOST 7.79-2000(B) + 'ru__gost_2000_b' => [ + '=' => ' ravnyj ', + '%' => ' procent ', + '∑' => ' summa ', + '∆' => ' del\'ta ', + '∞' => ' beskonecnost\' ', + '♥' => ' lublu ', + '&' => ' i ', + '+' => ' plus ', + ], + // Russian - Passport (2013), ICAO + 'ru__passport_2013' => [ + '=' => ' ravnyj ', + '%' => ' procent ', + '∑' => ' summa ', + '∆' => ' del\'ta ', + '∞' => ' beskonecnost\' ', + '♥' => ' lublu ', + '&' => ' i ', + '+' => ' plus ', + ], + // Ukrainian + 'uk' => [ + '=' => ' rivnij ', + '%' => ' vidsotkiv ', + '∑' => ' suma ', + '∆' => ' del\'ta ', + '∞' => ' neskincennist\' ', + '♥' => ' lubov ', + '&' => ' i ', + '+' => ' plus ', + ], + // Kazakh + 'kk' => [ + '=' => ' ten\' ', + '%' => ' Pajyzdar ', + '∑' => ' zalpy ', + '∆' => ' ajyrmasylyk, ', + '∞' => ' seksiz ', + '♥' => ' mahabbat ', + '&' => ' z@ne ', + '+' => ' plus ', + ], + // Czech + 'cs' => [ + '=' => ' rovnat se ', + '%' => ' procento ', + '∑' => ' soucet ', + '∆' => ' delta ', + '∞' => ' nekonecno ', + '♥' => ' laska ', + '&' => ' a ', + '+' => ' plus ', + ], + // Danish + 'da' => [ + '=' => ' Lige ', + '%' => ' Prozent ', + '∑' => ' sum ', + '∆' => ' delta ', + '∞' => ' uendelig ', + '♥' => ' kaerlighed ', + '&' => ' Og ', + '+' => ' Plus ', + ], + // Polish + 'pl' => [ + '=' => ' rowny ', + '%' => ' procent ', + '∑' => ' suma ', + '∆' => ' delta ', + '∞' => ' nieskonczonosc ', + '♥' => ' milosc ', + '&' => ' i ', + '+' => ' plus ', + ], + // Romanian + 'ro' => [ + '=' => ' egal ', + '%' => ' la suta ', + '∑' => ' suma ', + '∆' => ' delta ', + '∞' => ' infinit ', + '♥' => ' dragoste ', + '&' => ' si ', + '+' => ' la care se adauga ', + ], + // Esperanto + 'eo' => [ + '=' => ' Egalaj ', + '%' => ' Procento ', + '∑' => ' sumo ', + '∆' => ' delto ', + '∞' => ' senfina ', + '♥' => ' amo ', + '&' => ' Kaj ', + '+' => ' Pli ', + ], + // Estonian + 'et' => [ + '=' => ' Vordsed ', + '%' => ' Protsenti ', + '∑' => ' summa ', + '∆' => ' o ', + '∞' => ' loputut ', + '♥' => ' armastus ', + '&' => ' Ja ', + '+' => ' Pluss ', + ], + // Latvian + 'lv' => [ + '=' => ' vienads ', + '%' => ' procents ', + '∑' => ' summa ', + '∆' => ' delta ', + '∞' => ' bezgaliba ', + '♥' => ' milestiba ', + '&' => ' un ', + '+' => ' pluss ', + ], + // Lithuanian + 'lt' => [ + '=' => ' lygus ', + '%' => ' procentu ', + '∑' => ' suma ', + '∆' => ' delta ', + '∞' => ' begalybe ', + '♥' => ' meile ', + '&' => ' ir ', + '+' => ' plius ', + ], + // Norwegian + 'no' => [ + '=' => ' Lik ', + '%' => ' Prosent ', + '∑' => ' sum ', + '∆' => ' delta ', + '∞' => ' uendelig ', + '♥' => ' kjaerlighet ', + '&' => ' Og ', + '+' => ' Pluss ', + ], + // Vietnamese + 'vi' => [ + '=' => ' cong bang ', + '%' => ' phan tram ', + '∑' => ' tong so ', + '∆' => ' dong bang ', + '∞' => ' vo cuc ', + '♥' => ' Yeu ', + '&' => ' va ', + '+' => ' them ', + ], + // Arabic + 'ar' => [ + '=' => ' mtsawy ', + '%' => ' nsbh mywyh ', + '∑' => ' mjmw\' ', + '∆' => ' dlta ', + '∞' => ' ma la nhayt ', + '♥' => ' hb ', + '&' => ' w ', + '+' => ' zayd ', + ], + // Persian (Farsi) + 'fa' => [ + '=' => ' brabr ', + '%' => ' dr sd ', + '∑' => ' mjmw\' ', + '∆' => ' dlta ', + '∞' => ' by nhayt ', + '♥' => ' \'shq ', + '&' => ' w ', + '+' => ' bh \'lawh ', + ], + // Serbian + 'sr' => [ + '=' => ' jednak ', + '%' => ' procenat ', + '∑' => ' zbir ', + '∆' => ' delta ', + '∞' => ' beskraj ', + '♥' => ' lubav ', + '&' => ' i ', + '+' => ' vise ', + ], + // Serbian - Cyrillic + 'sr__cyr' => [ + '=' => ' jednak ', + '%' => ' procenat ', + '∑' => ' zbir ', + '∆' => ' delta ', + '∞' => ' beskraj ', + '♥' => ' lubav ', + '&' => ' i ', + '+' => ' vise ', + ], + // Serbian - Latin + 'sr__lat' => [ + '=' => ' jednak ', + '%' => ' procenat ', + '∑' => ' zbir ', + '∆' => ' delta ', + '∞' => ' beskraj ', + '♥' => ' lubav ', + '&' => ' i ', + '+' => ' vise ', + ], + // Azerbaijani + 'az' => [ + '=' => ' b@rab@r ', + '%' => ' faiz ', + '∑' => ' m@bl@g ', + '∆' => ' delta ', + '∞' => ' sonsuzluq ', + '♥' => ' sevgi ', + '&' => ' v@ ', + '+' => ' plus ', + ], + // Slovak + 'sk' => [ + '=' => ' rovny ', + '%' => ' percento ', + '∑' => ' sucet ', + '∆' => ' delta ', + '∞' => ' infinity ', + '♥' => ' milovat ', + '&' => ' a ', + '+' => ' viac ', + ], + // French + 'fr' => [ + '=' => ' Egal ', + '%' => ' Pourcentage ', + '∑' => ' somme ', + '∆' => ' delta ', + '∞' => ' infini ', + '♥' => ' amour ', + '&' => ' Et ', + '+' => ' Plus ', + ], + // Austrian (French) + 'fr_at' => [ + '=' => ' Egal ', + '%' => ' Pourcentage ', + '∑' => ' somme ', + '∆' => ' delta ', + '∞' => ' infini ', + '♥' => ' amour ', + '&' => ' Et ', + '+' => ' Plus ', + ], + // Switzerland (French) + 'fr_ch' => [ + '=' => ' Egal ', + '%' => ' Pourcentage ', + '∑' => ' somme ', + '∆' => ' delta ', + '∞' => ' infini ', + '♥' => ' amour ', + '&' => ' Et ', + '+' => ' Plus ', + ], + // German + 'de' => [ + '=' => ' gleich ', + '%' => ' Prozent ', + '∑' => ' gesamt ', + '∆' => ' Unterschied ', + '∞' => ' undendlich ', + '♥' => ' liebe ', + '&' => ' und ', + '+' => ' plus ', + ], + // Austrian (German) + 'de_at' => [ + '=' => ' gleich ', + '%' => ' Prozent ', + '∑' => ' gesamt ', + '∆' => ' Unterschied ', + '∞' => ' undendlich ', + '♥' => ' liebe ', + '&' => ' und ', + '+' => ' plus ', + ], + // Switzerland (German) + 'de_ch' => [ + '=' => ' gleich ', + '%' => ' Prozent ', + '∑' => ' gesamt ', + '∆' => ' Unterschied ', + '∞' => ' undendlich ', + '♥' => ' liebe ', + '&' => ' und ', + '+' => ' plus ', + ], + // Bengali (Bangla) + 'bn' => [ + '=' => ' Saman ', + '%' => ' Satakora ', + '∑' => ' Samasti ', + '∆' => ' Badhip ', + '∞' => ' Ananta ', + '♥' => ' Valobasa ', + '&' => ' Abong ', + '+' => ' Songzojon ', + ], + // English + 'en' => [ + '=' => ' equal ', + '%' => ' percent ', + '∑' => ' sum ', + '∆' => ' delta ', + '∞' => ' infinity ', + '♥' => ' love ', + '&' => ' and ', + '+' => ' plus ', + ], + // Currency + // + // url: https://en.wikipedia.org/wiki/Currency_symbol + 'currency' => [ + '€' => ' Euro ', + '$' => ' Dollar ', + '₢' => ' cruzeiro ', + '₣' => ' French franc ', + '£' => ' pound ', + '₤' => ' lira ', // Italian + '₶' => ' livre tournois ', + 'ℳ' => ' mark ', + '₥' => ' mill ', + '₦' => ' naira ', + '₧' => ' peseta ', + '₨' => ' rupee ', + 'රු' => ' rupee ', // Sri Lankan + 'ரூ' => ' rupee ', // Sri Lankan + '௹' => ' rupee ', // Tamil + 'रू' => ' rupee ', // Nepalese + '₹' => ' rupee ', // Indian + '૱' => ' rupee ', // Gujarat + '₩' => ' won ', + '₪' => ' new shequel ', + '₸' => ' tenge ', + '₫' => ' dong ', + '֏' => ' dram ', + '₭' => ' kip ', + '₺' => ' lira ', // Turkish + '₼' => ' manat ', + '₮' => ' tugrik ', + '₯' => ' drachma ', + '₰' => ' pfennig ', + '₷' => ' spesmilo ', + '₱' => ' peso ', // Philippine + '﷼‎' => ' riyal ', + '₲' => ' guarani ', + '₾' => ' lari ', + '₳' => ' austral ', + '₴' => ' hryvnia ', + '₽' => ' ruble ', + '₵' => ' cedi ', + '₡' => ' colon ', + '¢' => ' cent ', + '¥' => ' yen ', + '円' => ' yen ', + '৳' => ' taka ', + '元' => ' yuan ', + '﷼' => ' riyal ', + '៛' => ' riel ', + '₠' => ' European Currency ', + '¤' => ' currency ', + '฿' => ' baht ', + '؋' => ' afghani ', + ], + // Temperature + // + // url: https://en.wikipedia.org/wiki/Conversion_of_units_of_temperature + 'temperature' => [ + '°De' => ' Delisle ', + '°Re' => ' Reaumur ', // Réaumur + '°Ro' => ' Romer ', // Rømer + '°R' => ' Rankine ', + '°C' => ' Celsius ', + '°F' => ' Fahrenheit ', + '°N' => ' Newton ', + ], + 'latin_symbols' => [ + '=' => '=', + '%' => '%', + '∑' => '∑', + '∆' => '∆', + '∞' => '∞', + '♥' => '♥', + '&' => '&', + '+' => '+', + // --- + '©' => ' (c) ', + '®' => ' (r) ', + '@' => ' (at) ', + '№' => ' No. ', + '℞' => ' Rx ', + '[' => '[', + '\' => '\\', + ']' => ']', + '^' => '^', + '_' => '_', + '`' => '`', + '‐' => '-', + '‑' => '-', + '‒' => '-', + '–' => '-', + '−' => '-', + '—' => '-', + '―' => '-', + '﹘' => '-', + '│' => '|', + '∖' => '\\', + '∕' => '/', + '⁄' => '/', + '←' => '<-', + '→' => '->', + '↑' => '|', + '↓' => '|', + '⁅' => '[', + '⁆' => ']', + '⁎' => '*', + '、' => ',', + '。' => '.', + '〈' => '<', + '〉' => '>', + '《' => '<<', + '》' => '>>', + '〔' => '[', + '〕' => ']', + '〘' => '[', + '〙' => ']', + '〚' => '[', + '〛' => ']', + '﹝' => '[', + '﹞' => ']', + '︹' => '[', + '︺' => ']', + '﹇' => '[', + '﹈' => ']', + '︐' => ',', + '︑' => ',', + '︒' => '.', + '︓' => ':', + '︔' => ';', + '︕' => '!', + '︖' => '?', + '︙' => '...', + '︰' => '..', + '︵' => '(', + '︶' => ')', + '﹙' => '(', + '﹚' => ')', + '︷' => '{', + '︸' => '}', + '﹛' => '{', + '﹜' => '}', + '︽' => '<<', + '︾' => '>>', + '︿' => '<', + '﹀' => '>', + '×' => '*', + '÷' => '/', + '≪' => '<<', + '≫' => '>>', + '⦅' => '((', + '⦆' => '))', + '〇' => '0', + '′' => '\'', + '〝' => '"', + '〞' => '"', + '«' => '<<', + '»' => '>>', + '‘' => "'", + '’' => "'", + '‚' => ',', + '‛' => "'", + '“' => '"', + '”' => '"', + '„' => '"', + '‟' => '"', + '‹' => '<', + '›' => '>', + '․' => '.', + '‥' => '..', + '…' => '...', + '″' => '"', + '‴' => '\'\'\'', + '‶' => '``', + '‷' => '```', + '‼' => '!!', + '⁇' => '??', + '⁈' => '?!', + '⁉' => '!?', + '⁗' => '````', + '⩴' => '::=', + '⩵' => '==', + '⩶' => '===', + '﹔' => ';', + '﹕' => ':', + '﹖' => '?', + '﹗' => '!', + '﹍' => '_', + '﹎' => '_', + '﹏' => '_', + '﹐' => ',', + '﹑' => ',', + '﹒' => '.', + '﹟' => '#', + '﹠' => '&', + '﹡' => '*', + '﹢' => '+', + '﹣' => '-', + '﹤' => '<', + '﹥' => '>', + '﹦' => '=', + '﹨' => '\\', + '﹩' => '$', + '﹪' => '%', + '﹫' => '@', + '!' => '!', + '"' => '"', + '#' => '#', + '$' => '$', + '%' => '%', + '&' => '&', + ''' => '\'', + '(' => '(', + ')' => ')', + '*' => '*', + '+' => '+', + ',' => ',', + '-' => '-', + '.' => '.', + '/' => '/', + ':' => ':', + ';' => ';', + '<' => '<', + '=' => '=', + '>' => '>', + '?' => '?', + '@' => '@', + '{' => '{', + '|' => '|', + '}' => '}', + '~' => '~', + '⦅' => '((', + '⦆' => '))', + '¬' => '!', + ' ̄' => '-', + '¦' => '|', + '■' => '#', + ], +]; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php new file mode 100644 index 0000000..da81ae2 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_language_max_key.php @@ -0,0 +1,65 @@ +<?php + +return [ + 'uz' => 0, + 'tk' => 1, + 'th' => 0, + 'ps' => 0, + 'or' => 0, + 'mn' => 0, + 'ko' => 0, + 'ky' => 0, + 'hy' => 1, + 'bn' => 5, + 'be' => 0, + 'am' => 0, + 'ja' => 0, + 'zh' => 0, + 'nl' => 1, + 'it' => 1, + 'mk' => 1, + 'pt' => 1, + 'el__greeklish' => 2, + 'el' => 2, + 'hi' => 2, + 'sv' => 1, + 'tr' => 1, + 'bg' => 2, + 'hu' => 1, + 'my' => 5, + 'hr' => 2, + 'fi' => 1, + 'ka' => 1, + 'ru' => 1, + 'ru__gost_2000_b' => 1, + 'ru__passport_2013' => 1, + 'uk' => 1, + 'kk' => 1, + 'cs' => 1, + 'da' => 1, + 'pl' => 1, + 'ro' => 1, + 'eo' => 1, + 'et' => 1, + 'lv' => 1, + 'lt' => 1, + 'no' => 1, + 'vi' => 1, + 'ar' => 1, + 'fa' => 1, + 'sr' => 1, + 'sr__cyr' => 1, + 'sr__lat' => 1, + 'az' => 1, + 'sk' => 1, + 'fr' => 1, + 'fr_at' => 1, + 'fr_ch' => 1, + 'de' => 1, + 'de_at' => 1, + 'de_ch' => 1, + 'en' => 0, + 'latin' => 3, + ' ' => 1, + 'msword' => 1, +]; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php new file mode 100644 index 0000000..142318c --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/ascii_ord.php @@ -0,0 +1 @@ +<?php return ['' => 0, "\x00" => 0, "\x01" => 1, "\x02" => 2, "\x03" => 3, "\x04" => 4, "\x05" => 5, "\x06" => 6, "\x07" => 7, "\x08" => 8, "\x09" => 9, "\x0A" => 10, "\x0B" => 11, "\x0C" => 12, "\x0D" => 13, "\x0E" => 14, "\x0F" => 15, "\x10" => 16, "\x11" => 17, "\x12" => 18, "\x13" => 19, "\x14" => 20, "\x15" => 21, "\x16" => 22, "\x17" => 23, "\x18" => 24, "\x19" => 25, "\x1A" => 26, "\x1B" => 27, "\x1C" => 28, "\x1D" => 29, "\x1E" => 30, "\x1F" => 31, "\x20" => 32, "\x21" => 33, "\x22" => 34, "\x23" => 35, "\x24" => 36, "\x25" => 37, "\x26" => 38, "\x27" => 39, "\x28" => 40, "\x29" => 41, "\x2A" => 42, "\x2B" => 43, "\x2C" => 44, "\x2D" => 45, "\x2E" => 46, "\x2F" => 47, "\x30" => 48, "\x31" => 49, "\x32" => 50, "\x33" => 51, "\x34" => 52, "\x35" => 53, "\x36" => 54, "\x37" => 55, "\x38" => 56, "\x39" => 57, "\x3A" => 58, "\x3B" => 59, "\x3C" => 60, "\x3D" => 61, "\x3E" => 62, "\x3F" => 63, "\x40" => 64, "\x41" => 65, "\x42" => 66, "\x43" => 67, "\x44" => 68, "\x45" => 69, "\x46" => 70, "\x47" => 71, "\x48" => 72, "\x49" => 73, "\x4A" => 74, "\x4B" => 75, "\x4C" => 76, "\x4D" => 77, "\x4E" => 78, "\x4F" => 79, "\x50" => 80, "\x51" => 81, "\x52" => 82, "\x53" => 83, "\x54" => 84, "\x55" => 85, "\x56" => 86, "\x57" => 87, "\x58" => 88, "\x59" => 89, "\x5A" => 90, "\x5B" => 91, "\x5C" => 92, "\x5D" => 93, "\x5E" => 94, "\x5F" => 95, "\x60" => 96, "\x61" => 97, "\x62" => 98, "\x63" => 99, "\x64" => 100, "\x65" => 101, "\x66" => 102, "\x67" => 103, "\x68" => 104, "\x69" => 105, "\x6A" => 106, "\x6B" => 107, "\x6C" => 108, "\x6D" => 109, "\x6E" => 110, "\x6F" => 111, "\x70" => 112, "\x71" => 113, "\x72" => 114, "\x73" => 115, "\x74" => 116, "\x75" => 117, "\x76" => 118, "\x77" => 119, "\x78" => 120, "\x79" => 121, "\x7A" => 122, "\x7B" => 123, "\x7C" => 124, "\x7D" => 125, "\x7E" => 126, "\x7F" => 127, "\x80" => 128, "\x81" => 129, "\x82" => 130, "\x83" => 131, "\x84" => 132, "\x85" => 133, "\x86" => 134, "\x87" => 135, "\x88" => 136, "\x89" => 137, "\x8A" => 138, "\x8B" => 139, "\x8C" => 140, "\x8D" => 141, "\x8E" => 142, "\x8F" => 143, "\x90" => 144, "\x91" => 145, "\x92" => 146, "\x93" => 147, "\x94" => 148, "\x95" => 149, "\x96" => 150, "\x97" => 151, "\x98" => 152, "\x99" => 153, "\x9A" => 154, "\x9B" => 155, "\x9C" => 156, "\x9D" => 157, "\x9E" => 158, "\x9F" => 159, "\xA0" => 160, "\xA1" => 161, "\xA2" => 162, "\xA3" => 163, "\xA4" => 164, "\xA5" => 165, "\xA6" => 166, "\xA7" => 167, "\xA8" => 168, "\xA9" => 169, "\xAA" => 170, "\xAB" => 171, "\xAC" => 172, "\xAD" => 173, "\xAE" => 174, "\xAF" => 175, "\xB0" => 176, "\xB1" => 177, "\xB2" => 178, "\xB3" => 179, "\xB4" => 180, "\xB5" => 181, "\xB6" => 182, "\xB7" => 183, "\xB8" => 184, "\xB9" => 185, "\xBA" => 186, "\xBB" => 187, "\xBC" => 188, "\xBD" => 189, "\xBE" => 190, "\xBF" => 191, "\xC0" => 192, "\xC1" => 193, "\xC2" => 194, "\xC3" => 195, "\xC4" => 196, "\xC5" => 197, "\xC6" => 198, "\xC7" => 199, "\xC8" => 200, "\xC9" => 201, "\xCA" => 202, "\xCB" => 203, "\xCC" => 204, "\xCD" => 205, "\xCE" => 206, "\xCF" => 207, "\xD0" => 208, "\xD1" => 209, "\xD2" => 210, "\xD3" => 211, "\xD4" => 212, "\xD5" => 213, "\xD6" => 214, "\xD7" => 215, "\xD8" => 216, "\xD9" => 217, "\xDA" => 218, "\xDB" => 219, "\xDC" => 220, "\xDD" => 221, "\xDE" => 222, "\xDF" => 223, "\xE0" => 224, "\xE1" => 225, "\xE2" => 226, "\xE3" => 227, "\xE4" => 228, "\xE5" => 229, "\xE6" => 230, "\xE7" => 231, "\xE8" => 232, "\xE9" => 233, "\xEA" => 234, "\xEB" => 235, "\xEC" => 236, "\xED" => 237, "\xEE" => 238, "\xEF" => 239, "\xF0" => 240, "\xF1" => 241, "\xF2" => 242, "\xF3" => 243, "\xF4" => 244, "\xF5" => 245, "\xF6" => 246, "\xF7" => 247, "\xF8" => 248, "\xF9" => 249, "\xFA" => 250, "\xFB" => 251, "\xFC" => 252, "\xFD" => 253, "\xFE" => 254, "\xFF" => 255]; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x000.php b/vendor/voku/portable-ascii/src/voku/helper/data/x000.php new file mode 100644 index 0000000..6c9d81f --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x000.php @@ -0,0 +1,16 @@ +<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', '', 'EUR', // "\xc2\x80" => "\xe2\x82\xac" => EURO SIGN + '', ',', 'f', ',,', // "\xc2\x84" => "\xe2\x80\x9e" => DOUBLE LOW-9 QUOTATION MARK + '...', // "\xc2\x85" => "\xe2\x80\xa6" => HORIZONTAL ELLIPSIS + '+', '++', // "\xc2\x87" => "\xe2\x80\xa1" => DOUBLE DAGGER + '^', '%0', // "\xc2\x89" => "\xe2\x80\xb0" => PER MILLE SIGN + 'S', '<', 'OE', // "\xc2\x8c" => "\xc5\x92" => LATIN CAPITAL LIGATURE OE + '', 'Z', '', '', '\'', // "\xc2\x91" => "\xe2\x80\x98" => LEFT SINGLE QUOTATION MARK + '\'', // "\xc2\x92" => "\xe2\x80\x99" => RIGHT SINGLE QUOTATION MARK + '"', '"', '*', '-', '--', // "\xc2\x97" => "\xe2\x80\x94" => EM DASH + '~', 'tm', 's', '>', 'oe', '', 'z', 'Y', ' ', '!', 'C/', 'PS', '$?', 'Y=', '|', 'SS', '"', '(c)', 'a', '<<', '!', '', '(r)', '-', 'deg', '+-', '2', '3', '\'', 'u', 'P', '*', ',', '1', 'o', '>>', '1/4', '1/2', '3/4', '?', 'A', 'A', 'A', 'A', // Not "AE" - used in languages other than German + 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', // Not "OE" - used in languages other than German + 'O', 'x', 'O', 'U', 'U', 'U', // Not "UE" - used in languages other than German + 'U', 'Y', 'Th', 'ss', 'a', 'a', 'a', 'a', // Not "ae" - used in languages other than German + 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'd', 'n', 'o', 'o', 'o', 'o', // Not "oe" - used in languages other than German + 'o', '/', 'o', 'u', 'u', 'u', // Not "ue" - used in languages other than German + 'u', 'y', 'th', 'y', ]; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x001.php b/vendor/voku/portable-ascii/src/voku/helper/data/x001.php new file mode 100644 index 0000000..87fb12f --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x001.php @@ -0,0 +1 @@ +<?php return ['A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'N', 'n', 'N', 'n', 'N', 'n', '\'n', 'ng', 'NG', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'b', 'B', 'B', 'b', '6', '6', 'O', 'C', 'c', 'D', 'D', 'D', 'd', 'd', '3', '@', 'E', 'F', 'f', 'G', 'G', 'hv', 'I', 'I', 'K', 'k', 'l', 'l', 'W', 'N', 'n', 'O', 'O', 'o', 'OI', 'oi', 'P', 'p', 'YR', '2', '2', 'SH', 'sh', 't', 'T', 't', 'T', 'U', 'u', 'Y', 'V', 'Y', 'y', 'Z', 'z', 'ZH', 'ZH', 'zh', 'zh', '2', '5', '5', 'ts', 'w', '|', '||', '|=', '!', 'DZ', 'Dz', 'dz', 'LJ', 'Lj', 'lj', 'NJ', 'Nj', 'nj', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', '@', 'A', 'a', 'A', 'a', 'AE', 'ae', 'G', 'g', 'G', 'g', 'K', 'k', 'O', 'o', 'O', 'o', 'ZH', 'zh', 'j', 'DZ', 'Dz', 'dz', 'G', 'g', 'HV', 'W', 'N', 'n', 'A', 'a', 'AE', 'ae', 'O', 'o']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x002.php b/vendor/voku/portable-ascii/src/voku/helper/data/x002.php new file mode 100644 index 0000000..680e869 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x002.php @@ -0,0 +1 @@ +<?php return ['A', 'a', 'A', 'a', 'E', 'e', 'E', 'e', 'I', 'i', 'I', 'i', 'O', 'o', 'O', 'o', 'R', 'r', 'R', 'r', 'U', 'u', 'U', 'u', 'S', 's', 'T', 't', 'Y', 'y', 'H', 'h', 'N', 'd', 'OU', 'ou', 'Z', 'z', 'A', 'a', 'E', 'e', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'Y', 'y', 'l', 'n', 't', 'j', 'db', 'qp', 'A', 'C', 'c', 'L', 'T', 's', 'z', '[?]', '[?]', 'B', 'U', '^', 'E', 'e', 'J', 'j', 'q', 'q', 'R', 'r', 'Y', 'y', 'a', 'a', 'a', 'b', 'o', 'c', 'd', 'd', 'e', '@', '@', 'e', 'e', 'e', 'e', 'j', 'g', 'g', 'g', 'g', 'u', 'Y', 'h', 'h', 'i', 'i', 'I', 'l', 'l', 'l', 'lZ', 'W', 'W', 'm', 'n', 'n', 'n', 'o', 'OE', 'O', 'F', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'R', 'R', 's', 'S', 'j', 'S', 'S', 't', 't', 'u', 'U', 'v', '^', 'w', 'y', 'Y', 'z', 'z', 'Z', 'Z', '?', '?', '?', 'C', '@', 'B', 'E', 'G', 'H', 'j', 'k', 'L', 'q', '?', '?', 'dz', 'dZ', 'dz', 'ts', 'tS', 'tC', 'fN', 'ls', 'lz', 'WW', ']]', 'h', 'h', 'h', 'h', 'j', 'r', 'r', 'r', 'r', 'w', 'y', '\'', '"', '`', '\'', '`', '`', '\'', '?', '?', '<', '>', '^', 'V', '^', 'V', '\'', '-', '/', '\\', ',', '_', '\\', '/', ':', '.', '`', '\'', '^', 'V', '+', '-', 'V', '.', '@', ',', '~', '"', 'R', 'X', 'G', 'l', 's', 'x', '?', '', '', '', '', '', '', '', 'V', '=', '"', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x003.php b/vendor/voku/portable-ascii/src/voku/helper/data/x003.php new file mode 100644 index 0000000..3d02b86 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x003.php @@ -0,0 +1 @@ +<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', 'a', 'e', 'i', 'o', 'u', 'c', 'd', 'h', 'm', 'r', 't', 'v', 'x', '[?]', '[?]', '[?]', '[?]', '\'', ',', '[?]', '[?]', '[?]', '[?]', '', '[?]', '[?]', '[?]', '?', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', 'A', ';', 'E', 'E', 'I', '[?]', 'O', '[?]', 'U', 'O', 'I', 'A', 'B', 'G', 'D', 'E', 'Z', 'E', 'Th', 'I', 'K', 'L', 'M', 'N', 'Ks', 'O', 'P', 'R', '[?]', 'S', 'T', 'U', 'Ph', 'Kh', 'Ps', 'O', 'I', 'U', 'a', 'e', 'e', 'i', 'u', 'a', 'b', 'g', 'd', 'e', 'z', 'e', 'th', 'i', 'k', 'l', 'm', 'n', 'x', 'o', 'p', 'r', 's', 's', 't', 'u', 'ph', 'kh', 'ps', 'o', 'i', 'u', 'o', 'u', 'o', '[?]', 'b', 'th', 'U', 'U', 'U', 'ph', 'p', '&', '[?]', '[?]', 'St', 'st', 'W', 'w', 'Q', 'q', 'Sp', 'sp', 'Sh', 'sh', 'F', 'f', 'Kh', 'kh', 'H', 'h', 'G', 'g', 'CH', 'ch', 'Ti', 'ti', 'k', 'r', 'c', 'j', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x004.php b/vendor/voku/portable-ascii/src/voku/helper/data/x004.php new file mode 100644 index 0000000..ee92a0c --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x004.php @@ -0,0 +1 @@ +<?php return ['Ie', 'Io', 'Dj', 'Gj', 'Ie', 'Dz', 'I', 'Yi', 'J', 'Lj', 'Nj', 'Tsh', 'Kj', 'I', 'U', 'Dzh', 'A', 'B', 'V', 'G', 'D', 'E', 'Zh', 'Z', 'I', 'I', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'Kh', 'Ts', 'Ch', 'Sh', 'Shch', '\'', 'Y', '\'', 'E', 'Iu', 'Ia', 'a', 'b', 'v', 'g', 'd', 'e', 'zh', 'z', 'i', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'kh', 'ts', 'ch', 'sh', 'shch', '\'', 'y', '\'', 'e', 'iu', 'ia', 'ie', 'io', 'dj', 'gj', 'ie', 'dz', 'i', 'yi', 'j', 'lj', 'nj', 'tsh', 'kj', 'i', 'u', 'dzh', 'O', 'o', 'E', 'e', 'Ie', 'ie', 'E', 'e', 'Ie', 'ie', 'O', 'o', 'Io', 'io', 'Ks', 'ks', 'Ps', 'ps', 'F', 'f', 'Y', 'y', 'Y', 'y', 'u', 'u', 'O', 'o', 'O', 'o', 'Ot', 'ot', 'Q', 'q', '*1000*', '', '', '', '', '[?]', '*100.000*', '*1.000.000*', '[?]', '[?]', '"', '"', 'R\'', 'r\'', 'G\'', 'g\'', 'G\'', 'g\'', 'G\'', 'g\'', 'Zh\'', 'zh\'', 'Z\'', 'z\'', 'K\'', 'k\'', 'K\'', 'k\'', 'K\'', 'k\'', 'K\'', 'k\'', 'N\'', 'n\'', 'Ng', 'ng', 'P\'', 'p\'', 'Kh', 'kh', 'S\'', 's\'', 'T\'', 't\'', 'U', 'u', 'U\'', 'u\'', 'Kh\'', 'kh\'', 'Tts', 'tts', 'Ch\'', 'ch\'', 'Ch\'', 'ch\'', 'H', 'h', 'Ch', 'ch', 'Ch\'', 'ch\'', '`', 'Zh', 'zh', 'K\'', 'k\'', '[?]', '[?]', 'N\'', 'n\'', '[?]', '[?]', 'Ch', 'ch', '[?]', '[?]', '[?]', 'a', 'a', 'A', 'a', 'Ae', 'ae', 'Ie', 'ie', '@', '@', '@', '@', 'Zh', 'zh', 'Z', 'z', 'Dz', 'dz', 'I', 'i', 'I', 'i', 'O', 'o', 'O', 'o', 'O', 'o', 'E', 'e', 'U', 'u', 'U', 'u', 'U', 'u', 'Ch', 'ch', '[?]', '[?]', 'Y', 'y', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x005.php b/vendor/voku/portable-ascii/src/voku/helper/data/x005.php new file mode 100644 index 0000000..2a2ccdf --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x005.php @@ -0,0 +1 @@ +<?php return ['[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'A', 'B', 'G', 'D', 'E', 'Z', 'E', 'E', 'T`', 'Zh', 'I', 'L', 'Kh', 'Ts', 'K', 'H', 'Dz', 'Gh', 'Ch', 'M', 'Y', 'N', 'Sh', 'O', 'Ch`', 'P', 'J', 'Rh', 'S', 'V', 'T', 'R', 'Ts`', 'W', 'P`', 'K`', 'O', 'F', '[?]', '[?]', '<', '\'', '/', '!', ',', '?', '.', '[?]', 'a', 'b', 'g', 'd', 'e', 'z', 'e', 'e', 't`', 'zh', 'i', 'l', 'kh', 'ts', 'k', 'h', 'dz', 'gh', 'ch', 'm', 'y', 'n', 'sh', 'o', 'ch`', 'p', 'j', 'rh', 's', 'v', 't', 'r', 'ts`', 'w', 'p`', 'k`', 'o', 'f', 'ew', '[?]', ':', '-', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '@', 'e', 'a', 'o', 'i', 'e', 'e', 'a', 'a', 'o', 'o', 'u', '\'', '', '-', '-', '|', '', '', ':', '', '', 'n', 'o', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'A', 'b', 'g', 'd', 'h', 'v', 'z', 'KH', 't', 'y', 'k', 'k', 'l', 'm', 'm', 'n', 'n', 's', '`', 'p', 'p', 'TS', 'TS', 'q', 'r', 'SH', 't', '[?]', '[?]', '[?]', '[?]', '[?]', 'V', 'OY', 'i', '\'', '"', 'v', 'n', 'q', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x006.php b/vendor/voku/portable-ascii/src/voku/helper/data/x006.php new file mode 100644 index 0000000..a49ed21 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x006.php @@ -0,0 +1 @@ +<?php return ['[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ',', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ';', '[?]', '[?]', '[?]', '?', '[?]', '', 'a', 'a', 'w\'', '', 'y\'', '', 'b', '@', 't', 'th', 'j', 'H', 'kh', 'd', 'dh', 'r', 'z', 's', 'sh', 'S', 'D', 'T', 'Z', '`', 'G', '[?]', '[?]', '[?]', '[?]', '[?]', '', 'f', 'q', 'k', 'l', 'm', 'n', 'h', 'w', '~', 'y', 'an', 'un', 'in', 'a', 'u', 'i', 'W', '', '', '\'', '\'', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '%', '.', ',', '*', '[?]', '[?]', '', '\'', '\'', '\'', '', '\'', '\'w', '\'u', '\'y', 'tt', 'tth', 'b', 't', 'T', 'p', 'th', 'bh', '\'h', 'H', 'ny', 'dy', 'H', 'ch', 'cch', 'dd', 'D', 'D', 'Dt', 'dh', 'ddh', 'd', 'D', 'D', 'rr', 'R', 'R', 'R', 'R', 'R', 'R', 'j', 'R', 'S', 'S', 'S', 'S', 'S', 'T', 'GH', 'F', 'F', 'F', 'v', 'f', 'ph', 'Q', 'Q', 'kh', 'k', 'K', 'K', 'ng', 'K', 'g', 'G', 'N', 'G', 'G', 'G', 'L', 'L', 'L', 'L', 'N', 'N', 'N', 'N', 'N', 'h', 'Ch', 'hy', 'h', 'H', '@', 'W', 'oe', 'oe', 'u', 'yu', 'yu', 'W', 'v', 'y', 'Y', 'Y', 'W', '', '', 'y', 'y\'', '.', 'ae', '', '', '', '', '', '', '', '@', '#', '', '', '', '', '', '', '', '', '', '', '^', '', '', '', '', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'Sh', 'D', 'Gh', '&', '+m', 'h']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x007.php b/vendor/voku/portable-ascii/src/voku/helper/data/x007.php new file mode 100644 index 0000000..7e6f3df --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x007.php @@ -0,0 +1 @@ +<?php return ['//', '/', ',', '!', '!', '-', ',', ',', ';', '?', '~', '{', '}', '*', '[?]', '', '\'', '', 'b', 'g', 'g', 'd', 'd', 'h', 'w', 'z', 'H', 't', 't', 'y', 'yh', 'k', 'l', 'm', 'n', 's', 's', '`', 'p', 'p', 'S', 'q', 'r', 'sh', 't', '[?]', '[?]', '[?]', 'a', 'a', 'a', 'A', 'A', 'A', 'e', 'e', 'e', 'E', 'i', 'i', 'u', 'u', 'u', 'o', '', '`', '\'', '', '', 'X', 'Q', '@', '@', '|', '+', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'h', 'sh', 'n', 'r', 'b', 'L', 'k', '\'', 'v', 'm', 'f', 'dh', 'th', 'l', 'g', 'ny', 's', 'd', 'z', 't', 'y', 'p', 'j', 'ch', 'tt', 'hh', 'kh', 'th', 'z', 'sh', 's', 'd', 't', 'z', '`', 'gh', 'q', 'w', 'a', 'aa', 'i', 'ee', 'u', 'oo', 'e', 'ey', 'o', 'oa', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x009.php b/vendor/voku/portable-ascii/src/voku/helper/data/x009.php new file mode 100644 index 0000000..47a9c49 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x009.php @@ -0,0 +1 @@ +<?php return ['[?]', 'N', 'N', 'H', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'L', 'eN', 'e', 'e', 'ai', 'oN', 'o', 'o', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', 'nnn', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', 'rr', 'l', 'l', 'lll', 'v', 'sh', 'ss', 's', 'h', '[?]', '[?]', '\'', '\'', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'RR', 'eN', 'e', 'e', 'ai', 'oN', 'o', 'o', 'au', '', '[?]', '[?]', 'AUM', '\'', '\'', '`', '\'', '[?]', '[?]', '[?]', 'q', 'khh', 'ghh', 'z', 'dddh', 'rh', 'f', 'yy', 'RR', 'LL', 'L', 'LL', ' / ', ' // ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'N', 'N', 'H', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'RR', '[?]', '[?]', 'e', 'ai', '[?]', '[?]', 'o', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', '[?]', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', '[?]', 'l', '[?]', '[?]', '[?]', 'sh', 'ss', 's', 'h', '[?]', '[?]', '\'', '[?]', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'RR', '[?]', '[?]', 'e', 'ai', '[?]', '[?]', 'o', 'au', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '+', '[?]', '[?]', '[?]', '[?]', 'rr', 'rh', '[?]', 'yy', 'RR', 'LL', 'L', 'LL', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'r\'', 'r`', 'Rs', 'Rs', '1/', '2/', '3/', '4/', ' 1 - 1/', '/16', '', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x00a.php b/vendor/voku/portable-ascii/src/voku/helper/data/x00a.php new file mode 100644 index 0000000..ed73cc6 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x00a.php @@ -0,0 +1 @@ +<?php return ['[?]', '[?]', 'N', '[?]', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', '[?]', '[?]', '[?]', '[?]', 'ee', 'ai', '[?]', '[?]', 'oo', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', '[?]', 'p', 'ph', 'b', 'bb', 'm', 'y', 'r', '[?]', 'l', 'll', '[?]', 'v', 'sh', '[?]', 's', 'h', '[?]', '[?]', '\'', '[?]', 'aa', 'i', 'ii', 'u', 'uu', '[?]', '[?]', '[?]', '[?]', 'ee', 'ai', '[?]', '[?]', 'oo', 'au', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'khh', 'ghh', 'z', 'rr', '[?]', 'f', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'N', 'H', '', '', 'G.E.O.', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'N', 'N', 'H', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', '[?]', 'eN', '[?]', 'e', 'ai', 'oN', '[?]', 'o', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', '[?]', 'p', 'ph', 'b', 'bh', 'm', 'ya', 'r', '[?]', 'l', 'll', '[?]', 'v', 'sh', 'ss', 's', 'h', '[?]', '[?]', '\'', '\'', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'RR', 'eN', '[?]', 'e', 'ai', 'oN', '[?]', 'o', 'au', '', '[?]', '[?]', 'AUM', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'RR', '[?]', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x00b.php b/vendor/voku/portable-ascii/src/voku/helper/data/x00b.php new file mode 100644 index 0000000..68d1ab7 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x00b.php @@ -0,0 +1 @@ +<?php return ['[?]', 'N', 'N', 'H', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'L', '[?]', '[?]', 'e', 'ai', '[?]', '[?]', 'o', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', '[?]', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', '[?]', 'l', 'll', '[?]', '', 'sh', 'ss', 's', 'h', '[?]', '[?]', '\'', '\'', 'aa', 'i', 'ii', 'u', 'uu', 'R', '[?]', '[?]', '[?]', 'e', 'ai', '[?]', '[?]', 'o', 'au', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '+', '+', '[?]', '[?]', '[?]', '[?]', 'rr', 'rh', '[?]', 'yy', 'RR', 'LL', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'N', 'H', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', '[?]', '[?]', '[?]', 'e', 'ee', 'ai', '[?]', 'o', 'oo', 'au', 'k', '[?]', '[?]', '[?]', 'ng', 'c', '[?]', 'j', '[?]', 'ny', 'tt', '[?]', '[?]', '[?]', 'nn', 't', '[?]', '[?]', '[?]', 'n', 'nnn', 'p', '[?]', '[?]', '[?]', 'm', 'y', 'r', 'rr', 'l', 'll', 'lll', 'v', '[?]', 'ss', 's', 'h', '[?]', '[?]', '[?]', '[?]', 'aa', 'i', 'ii', 'u', 'uu', '[?]', '[?]', '[?]', 'e', 'ee', 'ai', '[?]', 'o', 'oo', 'au', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '+', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+10+', '+100+', '+1000+', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x00c.php b/vendor/voku/portable-ascii/src/voku/helper/data/x00c.php new file mode 100644 index 0000000..96b0d1f --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x00c.php @@ -0,0 +1 @@ +<?php return ['[?]', 'N', 'N', 'H', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'L', '[?]', 'e', 'ee', 'ai', '[?]', 'o', 'oo', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', '[?]', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', 'rr', 'l', 'll', '[?]', 'v', 'sh', 'ss', 's', 'h', '[?]', '[?]', '[?]', '[?]', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'RR', '[?]', 'e', 'ee', 'ai', '[?]', 'o', 'oo', 'au', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '+', '+', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'RR', 'LL', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'N', 'H', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'L', '[?]', 'e', 'ee', 'ai', '[?]', 'o', 'oo', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', '[?]', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', 'rr', 'l', 'll', '[?]', 'v', 'sh', 'ss', 's', 'h', '[?]', '[?]', '[?]', '[?]', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'RR', '[?]', 'e', 'ee', 'ai', '[?]', 'o', 'oo', 'au', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '+', '+', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'lll', '[?]', 'RR', 'LL', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x00d.php b/vendor/voku/portable-ascii/src/voku/helper/data/x00d.php new file mode 100644 index 0000000..a8722bb --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x00d.php @@ -0,0 +1 @@ +<?php return ['[?]', '[?]', 'N', 'H', '[?]', 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'L', '[?]', 'e', 'ee', 'ai', '[?]', 'o', 'oo', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', '[?]', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', 'rr', 'l', 'll', 'lll', 'v', 'sh', 'ss', 's', 'h', '[?]', '[?]', '[?]', '[?]', 'aa', 'i', 'ii', 'u', 'uu', 'R', '[?]', '[?]', 'e', 'ee', 'ai', '', 'o', 'oo', 'au', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '+', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'RR', 'LL', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'N', 'H', '[?]', 'a', 'aa', 'ae', 'aae', 'i', 'ii', 'u', 'uu', 'R', 'RR', 'L', 'LL', 'e', 'ee', 'ai', 'o', 'oo', 'au', '[?]', '[?]', '[?]', 'k', 'kh', 'g', 'gh', 'ng', 'nng', 'c', 'ch', 'j', 'jh', 'ny', 'jny', 'nyj', 'tt', 'tth', 'dd', 'ddh', 'nn', 'nndd', 't', 'th', 'd', 'dh', 'n', '[?]', 'nd', 'p', 'ph', 'b', 'bh', 'm', 'mb', 'y', 'r', '[?]', 'l', '[?]', '[?]', 'v', 'sh', 'ss', 's', 'h', 'll', 'f', '[?]', '[?]', '[?]', '', '[?]', '[?]', '[?]', '[?]', 'aa', 'ae', 'aae', 'i', 'ii', 'u', '[?]', 'uu', '[?]', 'R', 'e', 'ee', 'ai', 'o', 'oo', 'au', 'L', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'RR', 'LL', ' . ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x00e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x00e.php new file mode 100644 index 0000000..d48ef5e --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x00e.php @@ -0,0 +1 @@ +<?php return ['[?]', 'k', 'kh', 'kh', 'kh', 'kh', 'kh', 'ng', 'cch', 'ch', 'ch', 'ch', 'ch', 'y', 'd', 't', 'th', 'th', 'th', 'n', 'd', 't', 'th', 'th', 'th', 'n', 'b', 'p', 'ph', 'f', 'ph', 'f', 'ph', 'm', 'y', 'r', 'R', 'l', 'L', 'w', 's', 's', 's', 'h', 'l', '`', 'h', '~', 'a', 'a', 'aa', 'am', 'i', 'ii', 'ue', 'uue', 'u', 'uu', '\'', '[?]', '[?]', '[?]', '[?]', 'Bh.', 'e', 'ae', 'o', 'ai', 'ai', 'ao', '+', '', '', '', '', '', '', 'M', '', ' * ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' // ', ' /// ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'k', 'kh', '[?]', 'kh', '[?]', '[?]', 'ng', 'ch', '[?]', 's', '[?]', '[?]', 'ny', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'd', 'h', 'th', 'th', '[?]', 'n', 'b', 'p', 'ph', 'f', 'ph', 'f', '[?]', 'm', 'y', 'r', '[?]', 'l', '[?]', 'w', '[?]', '[?]', 's', 'h', '[?]', '`', '', '~', 'a', '', 'aa', 'am', 'i', 'ii', 'y', 'yy', 'u', 'uu', '[?]', 'o', 'l', 'ny', '[?]', '[?]', 'e', 'ei', 'o', 'ay', 'ai', '[?]', '+', '[?]', '', '', '', '', '', 'M', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '[?]', '[?]', 'hn', 'hm', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x00f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x00f.php new file mode 100644 index 0000000..1b16ca7 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x00f.php @@ -0,0 +1 @@ +<?php return ['AUM', '', '', '', '', '', '', '', ' // ', ' * ', '', '-', ' / ', ' / ', ' // ', ' -/ ', ' +/ ', ' X/ ', ' /XX/ ', ' /X/ ', ', ', '', '', '', '', '', '', '', '', '', '', '', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.5', '1.5', '2.5', '3.5', '4.5', '5.5', '6.5', '7.5', '8.5', '-.5', '+', '*', '^', '_', '', '~', '[?]', ']', '[[', ']]', '', '', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', '[?]', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', 'p', 'ph', 'b', 'bh', 'm', 'ts', 'tsh', 'dz', 'dzh', 'w', 'zh', 'z', '\'', 'y', 'r', 'l', 'sh', 'ssh', 's', 'h', 'a', 'kss', 'r', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'RR', 'L', 'LL', 'e', 'ee', 'o', 'oo', 'M', 'H', 'i', 'ii', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', '[?]', 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', 'p', 'ph', 'b', 'bh', 'm', 'ts', 'tsh', 'dz', 'dzh', 'w', 'zh', 'z', '\'', 'y', 'r', 'l', 'sh', 'ss', 's', 'h', 'a', 'kss', 'w', 'y', 'r', '[?]', 'X', ' :X: ', ' /O/ ', ' /o/ ', ' \\o\\ ', ' (O) ', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x010.php b/vendor/voku/portable-ascii/src/voku/helper/data/x010.php new file mode 100644 index 0000000..b9c3a65 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x010.php @@ -0,0 +1 @@ +<?php return ['k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'nny', 'tt', 'tth', 'dd', 'ddh', 'nn', 'tt', 'th', 'd', 'dh', 'n', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', 'l', 'w', 's', 'h', 'll', 'a', '[?]', 'i', 'ii', 'u', 'uu', 'e', '[?]', 'o', 'au', '[?]', 'aa', 'i', 'ii', 'u', 'uu', 'e', 'ai', '[?]', '[?]', '[?]', 'N', '\'', ':', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' / ', ' // ', 'n*', 'r*', 'l*', 'e*', 'sh', 'ss', 'R', 'RR', 'L', 'LL', 'R', 'RR', 'L', 'LL', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'A', 'B', 'G', 'D', 'E', 'V', 'Z', 'T`', 'I', 'K', 'L', 'M', 'N', 'O', 'P', 'Zh', 'R', 'S', 'T', 'U', 'P`', 'K`', 'G\'', 'Q', 'Sh', 'Ch`', 'C`', 'Z\'', 'C', 'Ch', 'X', 'J', 'H', 'E', 'Y', 'W', 'Xh', 'OE', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'a', 'b', 'g', 'd', 'e', 'v', 'z', 't`', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'zh', 'r', 's', 't', 'u', 'p`', 'k`', 'g\'', 'q', 'sh', 'ch`', 'c`', 'z\'', 'c', 'ch', 'x', 'j', 'h', 'e', 'y', 'w', 'xh', 'oe', 'f', '[?]', '[?]', '[?]', '[?]', ' // ', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x011.php b/vendor/voku/portable-ascii/src/voku/helper/data/x011.php new file mode 100644 index 0000000..32bdb8c --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x011.php @@ -0,0 +1 @@ +<?php return ['g', 'gg', 'n', 'd', 'dd', 'r', 'm', 'b', 'bb', 's', 'ss', '', 'j', 'jj', 'c', 'k', 't', 'p', 'h', 'ng', 'nn', 'nd', 'nb', 'dg', 'rn', 'rr', 'rh', 'rN', 'mb', 'mN', 'bg', 'bn', '', 'bs', 'bsg', 'bst', 'bsb', 'bss', 'bsj', 'bj', 'bc', 'bt', 'bp', 'bN', 'bbN', 'sg', 'sn', 'sd', 'sr', 'sm', 'sb', 'sbg', 'sss', 's', 'sj', 'sc', 'sk', 'st', 'sp', 'sh', '', '', '', '', 'Z', 'g', 'd', 'm', 'b', 's', 'Z', '', 'j', 'c', 't', 'p', 'N', 'j', '', '', '', '', 'ck', 'ch', '', '', 'pb', 'pN', 'hh', 'Q', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', 'a', 'ae', 'ya', 'yae', 'eo', 'e', 'yeo', 'ye', 'o', 'wa', 'wae', 'oe', 'yo', 'u', 'weo', 'we', 'wi', 'yu', 'eu', 'yi', 'i', 'a-o', 'a-u', 'ya-o', 'ya-yo', 'eo-o', 'eo-u', 'eo-eu', 'yeo-o', 'yeo-u', 'o-eo', 'o-e', 'o-ye', 'o-o', 'o-u', 'yo-ya', 'yo-yae', 'yo-yeo', 'yo-o', 'yo-i', 'u-a', 'u-ae', 'u-eo-eu', 'u-ye', 'u-u', 'yu-a', 'yu-eo', 'yu-e', 'yu-yeo', 'yu-ye', 'yu-u', 'yu-i', 'eu-u', 'eu-eu', 'yi-u', 'i-a', 'i-ya', 'i-o', 'i-u', 'i-eu', 'i-U', 'U', 'U-eo', 'U-u', 'U-i', 'UU', '[?]', '[?]', '[?]', '[?]', '[?]', 'g', 'gg', 'gs', 'n', 'nj', 'nh', 'd', 'l', 'lg', 'lm', 'lb', 'ls', 'lt', 'lp', 'lh', 'm', 'b', 'bs', 's', 'ss', 'ng', 'j', 'c', 'k', 't', 'p', 'h', 'gl', 'gsg', 'ng', 'nd', 'ns', 'nZ', 'nt', 'dg', 'tl', 'lgs', 'ln', 'ld', 'lth', 'll', 'lmg', 'lms', 'lbs', 'lbh', 'rNp', 'lss', 'lZ', 'lk', 'lQ', 'mg', 'ml', 'mb', 'ms', 'mss', 'mZ', 'mc', 'mh', 'mN', 'bl', 'bp', 'ph', 'pN', 'sg', 'sd', 'sl', 'sb', 'Z', 'g', 'ss', '', 'kh', 'N', 'Ns', 'NZ', 'pb', 'pN', 'hn', 'hl', 'hm', 'hb', 'Q', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x012.php b/vendor/voku/portable-ascii/src/voku/helper/data/x012.php new file mode 100644 index 0000000..3eeb30a --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x012.php @@ -0,0 +1 @@ +<?php return ['ha', 'hu', 'hi', 'haa', 'hee', 'he', 'ho', '[?]', 'la', 'lu', 'li', 'laa', 'lee', 'le', 'lo', 'lwa', 'hha', 'hhu', 'hhi', 'hhaa', 'hhee', 'hhe', 'hho', 'hhwa', 'ma', 'mu', 'mi', 'maa', 'mee', 'me', 'mo', 'mwa', 'sza', 'szu', 'szi', 'szaa', 'szee', 'sze', 'szo', 'szwa', 'ra', 'ru', 'ri', 'raa', 'ree', 're', 'ro', 'rwa', 'sa', 'su', 'si', 'saa', 'see', 'se', 'so', 'swa', 'sha', 'shu', 'shi', 'shaa', 'shee', 'she', 'sho', 'shwa', 'qa', 'qu', 'qi', 'qaa', 'qee', 'qe', 'qo', '[?]', 'qwa', '[?]', 'qwi', 'qwaa', 'qwee', 'qwe', '[?]', '[?]', 'qha', 'qhu', 'qhi', 'qhaa', 'qhee', 'qhe', 'qho', '[?]', 'qhwa', '[?]', 'qhwi', 'qhwaa', 'qhwee', 'qhwe', '[?]', '[?]', 'ba', 'bu', 'bi', 'baa', 'bee', 'be', 'bo', 'bwa', 'va', 'vu', 'vi', 'vaa', 'vee', 've', 'vo', 'vwa', 'ta', 'tu', 'ti', 'taa', 'tee', 'te', 'to', 'twa', 'ca', 'cu', 'ci', 'caa', 'cee', 'ce', 'co', 'cwa', 'xa', 'xu', 'xi', 'xaa', 'xee', 'xe', 'xo', '[?]', 'xwa', '[?]', 'xwi', 'xwaa', 'xwee', 'xwe', '[?]', '[?]', 'na', 'nu', 'ni', 'naa', 'nee', 'ne', 'no', 'nwa', 'nya', 'nyu', 'nyi', 'nyaa', 'nyee', 'nye', 'nyo', 'nywa', '\'a', '\'u', '[?]', '\'aa', '\'ee', '\'e', '\'o', '\'wa', 'ka', 'ku', 'ki', 'kaa', 'kee', 'ke', 'ko', '[?]', 'kwa', '[?]', 'kwi', 'kwaa', 'kwee', 'kwe', '[?]', '[?]', 'kxa', 'kxu', 'kxi', 'kxaa', 'kxee', 'kxe', 'kxo', '[?]', 'kxwa', '[?]', 'kxwi', 'kxwaa', 'kxwee', 'kxwe', '[?]', '[?]', 'wa', 'wu', 'wi', 'waa', 'wee', 'we', 'wo', '[?]', '`a', '`u', '`i', '`aa', '`ee', '`e', '`o', '[?]', 'za', 'zu', 'zi', 'zaa', 'zee', 'ze', 'zo', 'zwa', 'zha', 'zhu', 'zhi', 'zhaa', 'zhee', 'zhe', 'zho', 'zhwa', 'ya', 'yu', 'yi', 'yaa', 'yee', 'ye', 'yo', '[?]', 'da', 'du', 'di', 'daa', 'dee', 'de', 'do', 'dwa', 'dda', 'ddu', 'ddi', 'ddaa', 'ddee', 'dde', 'ddo', 'ddwa']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x013.php b/vendor/voku/portable-ascii/src/voku/helper/data/x013.php new file mode 100644 index 0000000..67d5952 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x013.php @@ -0,0 +1 @@ +<?php return ['ja', 'ju', 'ji', 'jaa', 'jee', 'je', 'jo', 'jwa', 'ga', 'gu', 'gi', 'gaa', 'gee', 'ge', 'go', '[?]', 'gwa', '[?]', 'gwi', 'gwaa', 'gwee', 'gwe', '[?]', '[?]', 'gga', 'ggu', 'ggi', 'ggaa', 'ggee', 'gge', 'ggo', '[?]', 'tha', 'thu', 'thi', 'thaa', 'thee', 'the', 'tho', 'thwa', 'cha', 'chu', 'chi', 'chaa', 'chee', 'che', 'cho', 'chwa', 'pha', 'phu', 'phi', 'phaa', 'phee', 'phe', 'pho', 'phwa', 'tsa', 'tsu', 'tsi', 'tsaa', 'tsee', 'tse', 'tso', 'tswa', 'tza', 'tzu', 'tzi', 'tzaa', 'tzee', 'tze', 'tzo', '[?]', 'fa', 'fu', 'fi', 'faa', 'fee', 'fe', 'fo', 'fwa', 'pa', 'pu', 'pi', 'paa', 'pee', 'pe', 'po', 'pwa', 'rya', 'mya', 'fya', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ' ', '.', ',', ';', ':', ':: ', '?', '//', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10+', '20+', '30+', '40+', '50+', '60+', '70+', '80+', '90+', '100+', '10,000+', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'a', 'e', 'i', 'o', 'u', 'v', 'ga', 'ka', 'ge', 'gi', 'go', 'gu', 'gv', 'ha', 'he', 'hi', 'ho', 'hu', 'hv', 'la', 'le', 'li', 'lo', 'lu', 'lv', 'ma', 'me', 'mi', 'mo', 'mu', 'na', 'hna', 'nah', 'ne', 'ni', 'no', 'nu', 'nv', 'qua', 'que', 'qui', 'quo', 'quu', 'quv', 'sa', 's', 'se', 'si', 'so', 'su', 'sv', 'da', 'ta', 'de', 'te', 'di', 'ti', 'do', 'du', 'dv', 'dla', 'tla', 'tle', 'tli', 'tlo', 'tlu', 'tlv', 'tsa', 'tse', 'tsi', 'tso', 'tsu', 'tsv', 'wa', 'we', 'wi', 'wo', 'wu', 'wv', 'ya', 'ye', 'yi', 'yo', 'yu', 'yv', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x014.php b/vendor/voku/portable-ascii/src/voku/helper/data/x014.php new file mode 100644 index 0000000..6a9c886 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x014.php @@ -0,0 +1 @@ +<?php return ['[?]', 'e', 'aai', 'i', 'ii', 'o', 'oo', 'oo', 'ee', 'i', 'a', 'aa', 'we', 'we', 'wi', 'wi', 'wii', 'wii', 'wo', 'wo', 'woo', 'woo', 'woo', 'wa', 'wa', 'waa', 'waa', 'waa', 'ai', 'w', '\'', 't', 'k', 'sh', 's', 'n', 'w', 'n', '[?]', 'w', 'c', '?', 'l', 'en', 'in', 'on', 'an', 'pe', 'paai', 'pi', 'pii', 'po', 'poo', 'poo', 'hee', 'hi', 'pa', 'paa', 'pwe', 'pwe', 'pwi', 'pwi', 'pwii', 'pwii', 'pwo', 'pwo', 'pwoo', 'pwoo', 'pwa', 'pwa', 'pwaa', 'pwaa', 'pwaa', 'p', 'p', 'h', 'te', 'taai', 'ti', 'tii', 'to', 'too', 'too', 'dee', 'di', 'ta', 'taa', 'twe', 'twe', 'twi', 'twi', 'twii', 'twii', 'two', 'two', 'twoo', 'twoo', 'twa', 'twa', 'twaa', 'twaa', 'twaa', 't', 'tte', 'tti', 'tto', 'tta', 'ke', 'kaai', 'ki', 'kii', 'ko', 'koo', 'koo', 'ka', 'kaa', 'kwe', 'kwe', 'kwi', 'kwi', 'kwii', 'kwii', 'kwo', 'kwo', 'kwoo', 'kwoo', 'kwa', 'kwa', 'kwaa', 'kwaa', 'kwaa', 'k', 'kw', 'keh', 'kih', 'koh', 'kah', 'ce', 'caai', 'ci', 'cii', 'co', 'coo', 'coo', 'ca', 'caa', 'cwe', 'cwe', 'cwi', 'cwi', 'cwii', 'cwii', 'cwo', 'cwo', 'cwoo', 'cwoo', 'cwa', 'cwa', 'cwaa', 'cwaa', 'cwaa', 'c', 'th', 'me', 'maai', 'mi', 'mii', 'mo', 'moo', 'moo', 'ma', 'maa', 'mwe', 'mwe', 'mwi', 'mwi', 'mwii', 'mwii', 'mwo', 'mwo', 'mwoo', 'mwoo', 'mwa', 'mwa', 'mwaa', 'mwaa', 'mwaa', 'm', 'm', 'mh', 'm', 'm', 'ne', 'naai', 'ni', 'nii', 'no', 'noo', 'noo', 'na', 'naa', 'nwe', 'nwe', 'nwa', 'nwa', 'nwaa', 'nwaa', 'nwaa', 'n', 'ng', 'nh', 'le', 'laai', 'li', 'lii', 'lo', 'loo', 'loo', 'la', 'laa', 'lwe', 'lwe', 'lwi', 'lwi', 'lwii', 'lwii', 'lwo', 'lwo', 'lwoo', 'lwoo', 'lwa', 'lwa', 'lwaa', 'lwaa', 'l', 'l', 'l', 'se', 'saai', 'si', 'sii', 'so', 'soo', 'soo', 'sa', 'saa', 'swe', 'swe', 'swi', 'swi', 'swii', 'swii', 'swo', 'swo', 'swoo', 'swoo']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x015.php b/vendor/voku/portable-ascii/src/voku/helper/data/x015.php new file mode 100644 index 0000000..5a9b0bf --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x015.php @@ -0,0 +1 @@ +<?php return ['swa', 'swa', 'swaa', 'swaa', 'swaa', 's', 's', 'sw', 's', 'sk', 'skw', 'sW', 'spwa', 'stwa', 'skwa', 'scwa', 'she', 'shi', 'shii', 'sho', 'shoo', 'sha', 'shaa', 'shwe', 'shwe', 'shwi', 'shwi', 'shwii', 'shwii', 'shwo', 'shwo', 'shwoo', 'shwoo', 'shwa', 'shwa', 'shwaa', 'shwaa', 'sh', 'ye', 'yaai', 'yi', 'yii', 'yo', 'yoo', 'yoo', 'ya', 'yaa', 'ywe', 'ywe', 'ywi', 'ywi', 'ywii', 'ywii', 'ywo', 'ywo', 'ywoo', 'ywoo', 'ywa', 'ywa', 'ywaa', 'ywaa', 'ywaa', 'y', 'y', 'y', 'yi', 're', 're', 'le', 'raai', 'ri', 'rii', 'ro', 'roo', 'lo', 'ra', 'raa', 'la', 'rwaa', 'rwaa', 'r', 'r', 'r', 'fe', 'faai', 'fi', 'fii', 'fo', 'foo', 'fa', 'faa', 'fwaa', 'fwaa', 'f', 'the', 'the', 'thi', 'thi', 'thii', 'thii', 'tho', 'thoo', 'tha', 'thaa', 'thwaa', 'thwaa', 'th', 'tthe', 'tthi', 'ttho', 'ttha', 'tth', 'tye', 'tyi', 'tyo', 'tya', 'he', 'hi', 'hii', 'ho', 'hoo', 'ha', 'haa', 'h', 'h', 'hk', 'qaai', 'qi', 'qii', 'qo', 'qoo', 'qa', 'qaa', 'q', 'tlhe', 'tlhi', 'tlho', 'tlha', 're', 'ri', 'ro', 'ra', 'ngaai', 'ngi', 'ngii', 'ngo', 'ngoo', 'nga', 'ngaa', 'ng', 'nng', 'she', 'shi', 'sho', 'sha', 'the', 'thi', 'tho', 'tha', 'th', 'lhi', 'lhii', 'lho', 'lhoo', 'lha', 'lhaa', 'lh', 'the', 'thi', 'thii', 'tho', 'thoo', 'tha', 'thaa', 'th', 'b', 'e', 'i', 'o', 'a', 'we', 'wi', 'wo', 'wa', 'ne', 'ni', 'no', 'na', 'ke', 'ki', 'ko', 'ka', 'he', 'hi', 'ho', 'ha', 'ghu', 'gho', 'ghe', 'ghee', 'ghi', 'gha', 'ru', 'ro', 're', 'ree', 'ri', 'ra', 'wu', 'wo', 'we', 'wee', 'wi', 'wa', 'hwu', 'hwo', 'hwe', 'hwee', 'hwi', 'hwa', 'thu', 'tho', 'the', 'thee', 'thi', 'tha', 'ttu', 'tto', 'tte', 'ttee', 'tti', 'tta', 'pu', 'po', 'pe', 'pee', 'pi', 'pa', 'p', 'gu', 'go', 'ge', 'gee', 'gi', 'ga', 'khu', 'kho', 'khe', 'khee', 'khi', 'kha', 'kku', 'kko', 'kke', 'kkee', 'kki']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x016.php b/vendor/voku/portable-ascii/src/voku/helper/data/x016.php new file mode 100644 index 0000000..49b4b93 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x016.php @@ -0,0 +1 @@ +<?php return ['kka', 'kk', 'nu', 'no', 'ne', 'nee', 'ni', 'na', 'mu', 'mo', 'me', 'mee', 'mi', 'ma', 'yu', 'yo', 'ye', 'yee', 'yi', 'ya', 'ju', 'ju', 'jo', 'je', 'jee', 'ji', 'ji', 'ja', 'jju', 'jjo', 'jje', 'jjee', 'jji', 'jja', 'lu', 'lo', 'le', 'lee', 'li', 'la', 'dlu', 'dlo', 'dle', 'dlee', 'dli', 'dla', 'lhu', 'lho', 'lhe', 'lhee', 'lhi', 'lha', 'tlhu', 'tlho', 'tlhe', 'tlhee', 'tlhi', 'tlha', 'tlu', 'tlo', 'tle', 'tlee', 'tli', 'tla', 'zu', 'zo', 'ze', 'zee', 'zi', 'za', 'z', 'z', 'dzu', 'dzo', 'dze', 'dzee', 'dzi', 'dza', 'su', 'so', 'se', 'see', 'si', 'sa', 'shu', 'sho', 'she', 'shee', 'shi', 'sha', 'sh', 'tsu', 'tso', 'tse', 'tsee', 'tsi', 'tsa', 'chu', 'cho', 'che', 'chee', 'chi', 'cha', 'ttsu', 'ttso', 'ttse', 'ttsee', 'ttsi', 'ttsa', 'X', '.', 'qai', 'ngai', 'nngi', 'nngii', 'nngo', 'nngoo', 'nnga', 'nngaa', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ' ', 'b', 'l', 'f', 's', 'n', 'h', 'd', 't', 'c', 'q', 'm', 'g', 'ng', 'z', 'r', 'a', 'o', 'u', 'e', 'i', 'ch', 'th', 'ph', 'p', 'x', 'p', '<', '>', '[?]', '[?]', '[?]', 'f', 'v', 'u', 'yr', 'y', 'w', 'th', 'th', 'a', 'o', 'ac', 'ae', 'o', 'o', 'o', 'oe', 'on', 'r', 'k', 'c', 'k', 'g', 'ng', 'g', 'g', 'w', 'h', 'h', 'h', 'h', 'n', 'n', 'n', 'i', 'e', 'j', 'g', 'ae', 'a', 'eo', 'p', 'z', 's', 's', 's', 'c', 'z', 't', 't', 'd', 'b', 'b', 'p', 'p', 'e', 'm', 'm', 'm', 'l', 'l', 'ng', 'ng', 'd', 'o', 'ear', 'ior', 'qu', 'qu', 'qu', 's', 'yr', 'yr', 'yr', 'q', 'x', '.', ':', '+', '17', '18', '19', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x017.php b/vendor/voku/portable-ascii/src/voku/helper/data/x017.php new file mode 100644 index 0000000..8f2a7ca --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x017.php @@ -0,0 +1 @@ +<?php return ['[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 't', 'tth', 'd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', 'l', 'v', 'sh', 'ss', 's', 'h', 'l', 'q', 'a', 'aa', 'i', 'ii', 'u', 'uk', 'uu', 'uuv', 'ry', 'ryy', 'ly', 'lyy', 'e', 'ai', 'oo', 'oo', 'au', 'a', 'aa', 'aa', 'i', 'ii', 'y', 'yy', 'u', 'uu', 'ua', 'oe', 'ya', 'ie', 'e', 'ae', 'ai', 'oo', 'au', 'M', 'H', 'a`', '', '', '', 'r', '', '!', '', '', '', '', '', '.', ' // ', ':', '+', '++', ' * ', ' /// ', 'KR', '\'', '[?]', '[?]', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x018.php b/vendor/voku/portable-ascii/src/voku/helper/data/x018.php new file mode 100644 index 0000000..d4a1350 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x018.php @@ -0,0 +1 @@ +<?php return [' @ ', ' ... ', ', ', '. ', ': ', ' // ', '', '-', ', ', '. ', '', '', '', '', '', '[?]', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'a', 'e', 'i', 'o', 'u', 'O', 'U', 'ee', 'n', 'ng', 'b', 'p', 'q', 'g', 'm', 'l', 's', 'sh', 't', 'd', 'ch', 'j', 'y', 'r', 'w', 'f', 'k', 'kha', 'ts', 'z', 'h', 'zr', 'lh', 'zh', 'ch', '-', 'e', 'i', 'o', 'u', 'O', 'U', 'ng', 'b', 'p', 'q', 'g', 'm', 't', 'd', 'ch', 'j', 'ts', 'y', 'w', 'k', 'g', 'h', 'jy', 'ny', 'dz', 'e', 'i', 'iy', 'U', 'u', 'ng', 'k', 'g', 'h', 'p', 'sh', 't', 'd', 'j', 'f', 'g', 'h', 'ts', 'z', 'r', 'ch', 'zh', 'i', 'k', 'r', 'f', 'zh', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'H', 'X', 'W', 'M', ' 3 ', ' 333 ', 'a', 'i', 'k', 'ng', 'c', 'tt', 'tth', 'dd', 'nn', 't', 'd', 'p', 'ph', 'ss', 'zh', 'z', 'a', 't', 'zh', 'gh', 'ng', 'c', 'jh', 'tta', 'ddh', 't', 'dh', 'ss', 'cy', 'zh', 'z', 'u', 'y', 'bh', '\'', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x01d.php b/vendor/voku/portable-ascii/src/voku/helper/data/x01d.php new file mode 100644 index 0000000..2842a4d --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x01d.php @@ -0,0 +1 @@ +<?php return ['A', 'AE', 'ae', 'B', 'C', 'D', 'D', 'E', 'e', 'i', 'J', 'K', 'L', 'M', 'N', 'O', '', 'O', '', 'O', 'Oe', 'Ou', '', '', 'P', 'R', 'R', 'T', 'U', 'u', 'u', 'm', 'V', 'W', 'Z', '', '', '', '', '', '', '', '', '', 'A', 'AE', 'B', 'B', 'D', 'E', 'E', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'N', 'O', 'Ou', 'P', 'R', 'T', 'U', 'W', 'a', 'a', 'a', 'ae', 'b', 'd', 'e', '', 'e', 'e', 'g', 'i', 'k', 'm', '', 'o', '', '', '', 'p', 't', 'u', 'u', 'm', 'v', '', 'b', 'g', 'd', 'f', '', 'i', 'r', 'u', 'v', 'b', 'g', 'r', 'f', '', '', 'b', 'd', 'f', 'm', 'n', 'p', 'r', 'r', 's', 't', 'z', 'g', '', '', '', '', '', 'p', '', '', 'b', 'd', 'f', 'g', 'k', 'l', 'm', 'n', 'p', 'r', 's', '', 'v', 'x', 'z', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x01e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x01e.php new file mode 100644 index 0000000..24ca9f4 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x01e.php @@ -0,0 +1 @@ +<?php return ['A', 'a', 'B', 'b', 'B', 'b', 'B', 'b', 'C', 'c', 'D', 'd', 'D', 'd', 'D', 'd', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h', 'H', 'h', 'H', 'h', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'K', 'k', 'K', 'k', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'M', 'm', 'M', 'm', 'M', 'm', 'N', 'n', 'N', 'n', 'N', 'n', 'N', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'P', 'p', 'P', 'p', 'R', 'r', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'V', 'v', 'V', 'v', 'W', 'w', 'W', 'w', 'W', 'w', 'W', 'w', 'W', 'w', 'X', 'x', 'X', 'x', 'Y', 'y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 'h', 't', 'w', 'y', 'a', 's', 's', 's', 'Ss', 'd', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'I', 'i', 'I', 'i', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'Y', 'y', 'Y', 'y', 'Y', 'y', 'Y', 'y', 'LL', 'll', 'V', 'v', 'Y', 'y']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x01f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x01f.php new file mode 100644 index 0000000..490dd5d --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x01f.php @@ -0,0 +1 @@ +<?php return ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'e', 'e', 'e', 'e', 'e', 'e', '[?]', '[?]', 'E', 'E', 'E', 'E', 'E', 'E', '[?]', '[?]', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'o', 'o', 'o', 'o', 'o', 'o', '[?]', '[?]', 'O', 'O', 'O', 'O', 'O', 'O', '[?]', '[?]', 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', '[?]', 'U', '[?]', 'U', '[?]', 'U', '[?]', 'U', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'a', 'a', 'e', 'e', 'e', 'e', 'i', 'i', 'o', 'o', 'u', 'u', 'o', 'o', '[?]', '[?]', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'a', 'a', 'a', 'a', 'a', '[?]', 'a', 'a', 'A', 'A', 'A', 'A', 'A', '\'', 'i', '\'', '~', '"~', 'e', 'e', 'e', '[?]', 'e', 'e', 'E', 'E', 'E', 'E', 'E', '\'`', '\'\'', '\'~', 'i', 'i', 'i', 'i', '[?]', '[?]', 'i', 'i', 'I', 'I', 'I', 'I', '[?]', '`\'', '`\'', '`~', 'u', 'u', 'u', 'u', 'R', 'R', 'u', 'u', 'U', 'U', 'U', 'U', 'R', '"`', '"\'', '`', '[?]', '[?]', 'o', 'o', 'o', '[?]', 'o', 'o', 'O', 'O', 'O', 'O', 'O', '\'', '`', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x020.php b/vendor/voku/portable-ascii/src/voku/helper/data/x020.php new file mode 100644 index 0000000..3e84951 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x020.php @@ -0,0 +1,4 @@ +<?php return [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '', '', '', '', '-', '-', '-', '-', '--', '--', '||', '_', '\'', '\'', ',', '\'', '"', '"', ',,', '"', '+', '++', '*', '*>', '.', '..', '...', '.', "\n", + "\n\n", + '', '', '', '', '', ' ', '%0', '%00', '\'', '\'\'', '\'\'\'', '`', '``', '```', '^', '<', '>', '*', '!!', '!?', '-', '_', '-', '^', '***', '--', '/', '-[', ']-', '??', '?!', '!?', '7', 'PP', '(]', '[)', '*', '[?]', '[?]', '[?]', '%', '~', '[?]', '[?]', '[?]', "''''", // 0x57 + '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ' ', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '0', 'i', '', '', '4', '5', '6', '7', '8', '9', '+', '-', '=', '(', ')', 'n', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '-', '=', '(', ')', '[?]', 'a', 'e', 'o', 'x', '[?]', 'h', 'k', 'l', 'm', 'n', 'p', 's', 't', '[?]', '[?]', '[?]', 'ECU', 'CL', 'Cr', 'Fr.', 'L.', 'mil', 'N', 'Pts', 'Rs', 'W', 'NS', 'D', 'EUR', 'K', 'T', 'Dr', 'Pf', 'P', 'G', 'A', 'UAH', 'C|', 'L', 'Sm', 'T', 'Rs', 'L', 'M', 'm', 'R', 'l', 'BTC', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ]; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x021.php b/vendor/voku/portable-ascii/src/voku/helper/data/x021.php new file mode 100644 index 0000000..1643d67 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x021.php @@ -0,0 +1 @@ +<?php return [' a/c ', ' a/s ', 'C', '', '', ' c/o ', ' c/u ', '', '', '', 'g', 'H', 'H', 'H', 'h', '', 'I', 'I', 'L', 'l', '', 'N', 'No. ', '', '', 'P', 'Q', 'R', 'R', 'R', '', '', '(sm)', 'TEL', '(tm)', '', 'Z', '', '', '', 'Z', '', 'K', 'A', 'B', 'C', 'e', 'e', 'E', 'F', 'F', 'M', 'o', '', '', '', '', 'i', '', 'FAX', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', 'D', 'd', 'e', 'i', 'j', '[?]', '[?]', '[?]', '[?]', 'F', '[?]', ' 1/7 ', ' 1/9 ', ' 1/10 ', ' 1/3 ', ' 2/3 ', ' 1/5 ', ' 2/5 ', ' 3/5 ', ' 4/5 ', ' 1/6 ', ' 5/6 ', ' 1/8 ', ' 3/8 ', ' 5/8 ', ' 7/8 ', ' 1/', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII', 'L', 'C', 'D', 'M', 'i', 'ii', 'iii', 'iv', 'v', 'vi', 'vii', 'viii', 'ix', 'x', 'xi', 'xii', 'l', 'c', 'd', 'm', '(D', 'D)', '((|))', ')', '[?]', '[?]', '[?]', '[?]', '[?]', ' 0/3 ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '-', '|', '-', '|', '-', '|', '\\', '/', '\\', '/', '-', '-', '~', '~', '-', '|', '-', '|', '-', '-', '-', '|', '-', '|', '|', '-', '-', '-', '-', '-', '-', '|', '|', '|', '|', '|', '|', '|', '^', 'V', '\\', '=', 'V', '^', '-', '-', '|', '|', '-', '-', '|', '|', '=', '|', '=', '=', '|', '=', '|', '=', '=', '=', '=', '=', '=', '|', '=', '|', '=', '|', '\\', '/', '\\', '/', '=', '=', '~', '~', '|', '|', '-', '|', '-', '|', '-', '-', '-', '|', '-', '|', '|', '|', '|', '|', '|', '|', '-', '\\', '\\', '|', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x022.php b/vendor/voku/portable-ascii/src/voku/helper/data/x022.php new file mode 100644 index 0000000..4a6763e --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x022.php @@ -0,0 +1 @@ +<?php return ['[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '-', '[?]', '[?]', '/', '\\', '*', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '|', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', ':', '[?]', '[?]', '[?]', '[?]', '[?]', '~', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '<=', '>=', '<=', '>=', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x023.php b/vendor/voku/portable-ascii/src/voku/helper/data/x023.php new file mode 100644 index 0000000..b8f4ca0 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x023.php @@ -0,0 +1 @@ +<?php return ['[?]', '[?]', '[?]', '^', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '<', '> ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x024.php b/vendor/voku/portable-ascii/src/voku/helper/data/x024.php new file mode 100644 index 0000000..26abcc6 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x024.php @@ -0,0 +1 @@ +<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '(1)', '(2)', '(3)', '(4)', '(5)', '(6)', '(7)', '(8)', '(9)', '(10)', '(11)', '(12)', '(13)', '(14)', '(15)', '(16)', '(17)', '(18)', '(19)', '(20)', '1.', '2.', '3.', '4.', '5.', '6.', '7.', '8.', '9.', '10.', '11.', '12.', '13.', '14.', '15.', '16.', '17.', '18.', '19.', '20.', '(a)', '(b)', '(c)', '(d)', '(e)', '(f)', '(g)', '(h)', '(i)', '(j)', '(k)', '(l)', '(m)', '(n)', '(o)', '(p)', '(q)', '(r)', '(s)', '(t)', '(u)', '(v)', '(w)', '(x)', '(y)', '(z)', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '0']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x025.php b/vendor/voku/portable-ascii/src/voku/helper/data/x025.php new file mode 100644 index 0000000..7826f84 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x025.php @@ -0,0 +1 @@ +<?php return ['-', '-', '|', '|', '-', '-', '|', '|', '-', '-', '|', '|', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '-', '-', '|', '|', '-', '|', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '/', '\\', 'X', '-', '|', '-', '|', '-', '|', '-', '|', '-', '|', '-', '|', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '-', '|', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '^', '^', '^', '^', '>', '>', '>', '>', '>', '>', 'V', 'V', 'V', 'V', '<', '<', '<', '<', '<', '<', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '#', '#', '#', '#', '#', '^', '^', '^', 'O', '#', '#', '#', '#', 'O', 'O', 'O', 'O', '/', '\\\\', '\\\\', '#', '#', '#', '#', '/']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x026.php b/vendor/voku/portable-ascii/src/voku/helper/data/x026.php new file mode 100644 index 0000000..0c97de3 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x026.php @@ -0,0 +1 @@ +<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '#', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x027.php b/vendor/voku/portable-ascii/src/voku/helper/data/x027.php new file mode 100644 index 0000000..d24e440 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x027.php @@ -0,0 +1 @@ +<?php return ['[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '*', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '|', '', '', '', '', '', '', '[?]', '[?]', '', '!', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[', '[?]', '<', '> ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x028.php b/vendor/voku/portable-ascii/src/voku/helper/data/x028.php new file mode 100644 index 0000000..9585d91 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x028.php @@ -0,0 +1 @@ +<?php return [' ', 'a', '1', 'b', '\'', 'k', '2', 'l', '@', 'c', 'i', 'f', '/', 'm', 's', 'p', '"', 'e', '3', 'h', '9', 'o', '6', 'r', '^', 'd', 'j', 'g', '>', 'n', 't', 'q', ',', '*', '5', '<', '-', 'u', '8', 'v', '.', '%', '[', '$', '+', 'x', '!', '&', ';', ':', '4', '\\', '0', 'z', '7', '(', '_', '?', 'w', ']', '#', 'y', ')', '=', '[d7]', '[d17]', '[d27]', '[d127]', '[d37]', '[d137]', '[d237]', '[d1237]', '[d47]', '[d147]', '[d247]', '[d1247]', '[d347]', '[d1347]', '[d2347]', '[d12347]', '[d57]', '[d157]', '[d257]', '[d1257]', '[d357]', '[d1357]', '[d2357]', '[d12357]', '[d457]', '[d1457]', '[d2457]', '[d12457]', '[d3457]', '[d13457]', '[d23457]', '[d123457]', '[d67]', '[d167]', '[d267]', '[d1267]', '[d367]', '[d1367]', '[d2367]', '[d12367]', '[d467]', '[d1467]', '[d2467]', '[d12467]', '[d3467]', '[d13467]', '[d23467]', '[d123467]', '[d567]', '[d1567]', '[d2567]', '[d12567]', '[d3567]', '[d13567]', '[d23567]', '[d123567]', '[d4567]', '[d14567]', '[d24567]', '[d124567]', '[d34567]', '[d134567]', '[d234567]', '[d1234567]', '[d8]', '[d18]', '[d28]', '[d128]', '[d38]', '[d138]', '[d238]', '[d1238]', '[d48]', '[d148]', '[d248]', '[d1248]', '[d348]', '[d1348]', '[d2348]', '[d12348]', '[d58]', '[d158]', '[d258]', '[d1258]', '[d358]', '[d1358]', '[d2358]', '[d12358]', '[d458]', '[d1458]', '[d2458]', '[d12458]', '[d3458]', '[d13458]', '[d23458]', '[d123458]', '[d68]', '[d168]', '[d268]', '[d1268]', '[d368]', '[d1368]', '[d2368]', '[d12368]', '[d468]', '[d1468]', '[d2468]', '[d12468]', '[d3468]', '[d13468]', '[d23468]', '[d123468]', '[d568]', '[d1568]', '[d2568]', '[d12568]', '[d3568]', '[d13568]', '[d23568]', '[d123568]', '[d4568]', '[d14568]', '[d24568]', '[d124568]', '[d34568]', '[d134568]', '[d234568]', '[d1234568]', '[d78]', '[d178]', '[d278]', '[d1278]', '[d378]', '[d1378]', '[d2378]', '[d12378]', '[d478]', '[d1478]', '[d2478]', '[d12478]', '[d3478]', '[d13478]', '[d23478]', '[d123478]', '[d578]', '[d1578]', '[d2578]', '[d12578]', '[d3578]', '[d13578]', '[d23578]', '[d123578]', '[d4578]', '[d14578]', '[d24578]', '[d124578]', '[d34578]', '[d134578]', '[d234578]', '[d1234578]', '[d678]', '[d1678]', '[d2678]', '[d12678]', '[d3678]', '[d13678]', '[d23678]', '[d123678]', '[d4678]', '[d14678]', '[d24678]', '[d124678]', '[d34678]', '[d134678]', '[d234678]', '[d1234678]', '[d5678]', '[d15678]', '[d25678]', '[d125678]', '[d35678]', '[d135678]', '[d235678]', '[d1235678]', '[d45678]', '[d145678]', '[d245678]', '[d1245678]', '[d345678]', '[d1345678]', '[d2345678]', '[d12345678]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x029.php b/vendor/voku/portable-ascii/src/voku/helper/data/x029.php new file mode 100644 index 0000000..5162de3 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x029.php @@ -0,0 +1 @@ +<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '{', '} ', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x02a.php b/vendor/voku/portable-ascii/src/voku/helper/data/x02a.php new file mode 100644 index 0000000..e3ca552 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x02a.php @@ -0,0 +1 @@ +<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '::=', '==', '===', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x02c.php b/vendor/voku/portable-ascii/src/voku/helper/data/x02c.php new file mode 100644 index 0000000..31f84d8 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x02c.php @@ -0,0 +1 @@ +<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'L', 'l', 'L', 'P', 'R', 'a', 't', 'H', 'h', 'K', 'k', 'Z', 'z', '', 'M', 'A', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x02e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x02e.php new file mode 100644 index 0000000..b45c470 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x02e.php @@ -0,0 +1 @@ +<?php return ['r', 'r.', '[?]', '[?]', '[?]', '[?]', 'T', 'T.', '[?]', 's', '[?]', '[]', '\\', '/', '[?]', '__', '[?]', '[?]', '>', '%', '[?]', '[?]', '>', '=', '[?]', '/', '-', '~', '\\', '/', '~', '~', '|-', '-|', '[?]', '[?]', '[?]', '[?]', '<=', '=>', '((', '))', '[?]', '[?]', '::', '[?]', '?', '\'', 'o', '.', ',', '.', ',', ';', '[?]', '[?]', '[?]', '[?]', '----', '------', 'x', '|', '[?]', '[?]', '=', ',', '"', '`--', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x02f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x02f.php new file mode 100644 index 0000000..5147b57 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x02f.php @@ -0,0 +1 @@ +<?php return ['[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x030.php b/vendor/voku/portable-ascii/src/voku/helper/data/x030.php new file mode 100644 index 0000000..5880d76 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x030.php @@ -0,0 +1,9 @@ +<?php return [' ', ', ', '. ', '"', '[JIS]', '"', '/', '0', '<', '> ', '<<', '>> ', '[', '] ', '{', '} ', '[(', ')] ', '@', 'X ', '[', '] ', '[[', ']] ', '((', ')) ', '[[', ']] ', '~ ', '``', '\'\'', ',,', '@', '1', '2', '3', '4', '5', '6', '7', '8', '9', '', '', '', '', '', '', '~', '+', '+', '+', '+', '', '@', ' // ', '+10+', '+20+', '+30+', '[?]', '[?]', '[?]', '', '', '[?]', 'a', 'a', 'i', 'i', 'u', 'u', 'e', 'e', 'o', 'o', 'ka', 'ga', 'ki', 'gi', 'ku', 'gu', 'ke', 'ge', 'ko', 'go', 'sa', 'za', 'shi', // 0x57 + 'zi', 'su', 'zu', 'se', 'ze', 'so', 'zo', 'ta', 'da', 'chi', // 0x61 + 'di', 'tsu', // 0x63 + 'tsu', // 0x64 + 'du', 'te', 'de', 'to', 'do', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'ba', 'pa', 'hi', 'bi', 'pi', 'hu', 'bu', 'pu', 'he', 'be', 'pe', 'ho', 'bo', 'po', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'ya', 'yu', 'yu', 'yo', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wa', 'wi', 'we', 'wo', 'n', 'vu', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '"', '"', '[?]', '[?]', 'a', 'a', 'i', 'i', 'u', 'u', 'e', 'e', 'o', 'o', 'ka', 'ga', 'ki', 'gi', 'ku', 'gu', 'ke', 'ge', 'ko', 'go', 'sa', 'za', 'shi', // 0xb7 + 'zi', 'su', 'zu', 'se', 'ze', 'so', 'zo', 'ta', 'da', 'chi', // 0xc1 + 'di', 'tsu', // 0xc3 + 'tsu', // 0xc4 + 'du', 'te', 'de', 'to', 'do', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'ba', 'pa', 'hi', 'bi', 'pi', 'hu', 'bu', 'pu', 'he', 'be', 'pe', 'ho', 'bo', 'po', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'ya', 'yu', 'yu', 'yo', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wa', 'wi', 'we', 'wo', 'n', 'vu', 'ka', 'ke', 'va', 'vi', 've', 'vo', '', '', '"', '"', ]; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x031.php b/vendor/voku/portable-ascii/src/voku/helper/data/x031.php new file mode 100644 index 0000000..72c0260 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x031.php @@ -0,0 +1 @@ +<?php return ['[?]', '[?]', '[?]', '[?]', '[?]', 'B', 'P', 'M', 'F', 'D', 'T', 'N', 'L', 'G', 'K', 'H', 'J', 'Q', 'X', 'ZH', 'CH', 'SH', 'R', 'Z', 'C', 'S', 'A', 'O', 'E', 'EH', 'AI', 'EI', 'AU', 'OU', 'AN', 'EN', 'ANG', 'ENG', 'ER', 'I', 'U', 'IU', 'V', 'NG', 'GN', '[?]', '[?]', '[?]', '[?]', 'g', 'gg', 'gs', 'n', 'nj', 'nh', 'd', 'dd', 'r', 'lg', 'lm', 'lb', 'ls', 'lt', 'lp', 'rh', 'm', 'b', 'bb', 'bs', 's', 'ss', '', 'j', 'jj', 'c', 'k', 't', 'p', 'h', 'a', 'ae', 'ya', 'yae', 'eo', 'e', 'yeo', 'ye', 'o', 'wa', 'wae', 'oe', 'yo', 'u', 'weo', 'we', 'wi', 'yu', 'eu', 'yi', 'i', '', 'nn', 'nd', 'ns', 'nZ', 'lgs', 'ld', 'lbs', 'lZ', 'lQ', 'mb', 'ms', 'mZ', 'mN', 'bg', '', 'bsg', 'bst', 'bj', 'bt', 'bN', 'bbN', 'sg', 'sn', 'sd', 'sb', 'sj', 'Z', '', 'N', 'Ns', 'NZ', 'pN', 'hh', 'Q', 'yo-ya', 'yo-yae', 'yo-i', 'yu-yeo', 'yu-ye', 'yu-i', 'U', 'U-i', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'BU', 'ZI', 'JI', 'GU', 'EE', 'ENN', 'OO', 'ONN', 'IR', 'ANN', 'INN', 'UNN', 'IM', 'NGG', 'AINN', 'AUNN', 'AM', 'OM', 'ONG', 'INNN', 'P', 'T', 'K', 'H', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x032.php b/vendor/voku/portable-ascii/src/voku/helper/data/x032.php new file mode 100644 index 0000000..f5df8c8 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x032.php @@ -0,0 +1 @@ +<?php return ['(g)', '(n)', '(d)', '(r)', '(m)', '(b)', '(s)', '()', '(j)', '(c)', '(k)', '(t)', '(p)', '(h)', '(ga)', '(na)', '(da)', '(ra)', '(ma)', '(ba)', '(sa)', '(a)', '(ja)', '(ca)', '(ka)', '(ta)', '(pa)', '(ha)', '(ju)', '[?]', '[?]', '[?]', '(1) ', '(2) ', '(3) ', '(4) ', '(5) ', '(6) ', '(7) ', '(8) ', '(9) ', '(10) ', '(Yue) ', '(Huo) ', '(Shui) ', '(Mu) ', '(Jin) ', '(Tu) ', '(Ri) ', '(Zhu) ', '(You) ', '(She) ', '(Ming) ', '(Te) ', '(Cai) ', '(Zhu) ', '(Lao) ', '(Dai) ', '(Hu) ', '(Xue) ', '(Jian) ', '(Qi) ', '(Zi) ', '(Xie) ', '(Ji) ', '(Xiu) ', '<<', '>>', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '(g)', '(n)', '(d)', '(r)', '(m)', '(b)', '(s)', '()', '(j)', '(c)', '(k)', '(t)', '(p)', '(h)', '(ga)', '(na)', '(da)', '(ra)', '(ma)', '(ba)', '(sa)', '(a)', '(ja)', '(ca)', '(ka)', '(ta)', '(pa)', '(ha)', '[?]', '[?]', '[?]', 'KIS ', '(1) ', '(2) ', '(3) ', '(4) ', '(5) ', '(6) ', '(7) ', '(8) ', '(9) ', '(10) ', '(Yue) ', '(Huo) ', '(Shui) ', '(Mu) ', '(Jin) ', '(Tu) ', '(Ri) ', '(Zhu) ', '(You) ', '(She) ', '(Ming) ', '(Te) ', '(Cai) ', '(Zhu) ', '(Lao) ', '(Mi) ', '(Nan) ', '(Nu) ', '(Shi) ', '(You) ', '(Yin) ', '(Zhu) ', '(Xiang) ', '(Xiu) ', '(Xie) ', '(Zheng) ', '(Shang) ', '(Zhong) ', '(Xia) ', '(Zuo) ', '(You) ', '(Yi) ', '(Zong) ', '(Xue) ', '(Jian) ', '(Qi) ', '(Zi) ', '(Xie) ', '(Ye) ', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '1M', '2M', '3M', '4M', '5M', '6M', '7M', '8M', '9M', '10M', '11M', '12M', 'Hg', 'erg', 'eV', 'LTD', 'a', 'i', 'u', 'u', 'o', 'ka', 'ki', 'ku', 'ke', 'ko', 'sa', 'si', 'su', 'se', 'so', 'ta', 'ti', 'tu', 'te', 'to', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'hi', 'hu', 'he', 'ho', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'yu', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wi', 'we', 'wo']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x033.php b/vendor/voku/portable-ascii/src/voku/helper/data/x033.php new file mode 100644 index 0000000..8505337 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x033.php @@ -0,0 +1 @@ +<?php return ['apartment', 'alpha', 'ampere', 'are', 'inning', 'inch', 'won', 'escudo', 'acre', 'ounce', 'ohm', 'kai-ri', 'carat', 'calorie', 'gallon', 'gamma', 'giga', 'guinea', 'curie', 'guilder', 'kilo', 'kilogram', 'kilometer', 'kilowatt', 'gram', 'gram ton', 'cruzeiro', 'krone', 'case', 'koruna', 'co-op', 'cycle', 'centime', 'shilling', 'centi', 'cent', 'dozen', 'desi', 'dollar', 'ton', 'nano', 'knot', 'heights', 'percent', 'parts', 'barrel', 'piaster', 'picul', 'pico', 'building', 'farad', 'feet', 'bushel', 'franc', 'hectare', 'peso', 'pfennig', 'hertz', 'pence', 'page', 'beta', 'point', 'volt', 'hon', 'pound', 'hall', 'horn', 'micro', 'mile', 'mach', 'mark', 'mansion', 'micron', 'milli', 'millibar', 'mega', 'megaton', 'meter', 'yard', 'yard', 'yuan', 'liter', 'lira', 'rupee', 'ruble', 'rem', 'roentgen', 'watt', '0h', '1h', '2h', '3h', '4h', '5h', '6h', '7h', '8h', '9h', '10h', '11h', '12h', '13h', '14h', '15h', '16h', '17h', '18h', '19h', '20h', '21h', '22h', '23h', '24h', 'hPa', 'da', 'AU', 'bar', 'oV', 'pc', 'dm', 'dm^2', 'dm^3', 'IU', 'Heisei', 'Syouwa', 'Taisyou', 'Meiji', 'Inc.', 'pA', 'nA', 'microamp', 'mA', 'kA', 'kB', 'MB', 'GB', 'cal', 'kcal', 'pF', 'nF', 'microFarad', 'microgram', 'mg', 'kg', 'Hz', 'kHz', 'MHz', 'GHz', 'THz', 'microliter', 'ml', 'dl', 'kl', 'fm', 'nm', 'micrometer', 'mm', 'cm', 'km', 'mm^2', 'cm^2', 'm^2', 'km^2', 'mm^3', 'cm^3', 'm^3', 'km^3', 'm/s', 'm/s^2', 'Pa', 'kPa', 'MPa', 'GPa', 'rad', 'rad/s', 'rad/s^2', 'ps', 'ns', 'microsecond', 'ms', 'pV', 'nV', 'microvolt', 'mV', 'kV', 'MV', 'pW', 'nW', 'microwatt', 'mW', 'kW', 'MW', 'kOhm', 'MOhm', 'a.m.', 'Bq', 'cc', 'cd', 'C/kg', 'Co.', 'dB', 'Gy', 'ha', 'HP', 'in', 'K.K.', 'KM', 'kt', 'lm', 'ln', 'log', 'lx', 'mb', 'mil', 'mol', 'pH', 'p.m.', 'PPM', 'PR', 'sr', 'Sv', 'Wb', '[?]', '[?]', '1d', '2d', '3d', '4d', '5d', '6d', '7d', '8d', '9d', '10d', '11d', '12d', '13d', '14d', '15d', '16d', '17d', '18d', '19d', '20d', '21d', '22d', '23d', '24d', '25d', '26d', '27d', '28d', '29d', '30d', '31d', 'gal']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x04d.php b/vendor/voku/portable-ascii/src/voku/helper/data/x04d.php new file mode 100644 index 0000000..59b23f5 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x04d.php @@ -0,0 +1 @@ +<?php return ['[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?] ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x04e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x04e.php new file mode 100644 index 0000000..ae51afc --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x04e.php @@ -0,0 +1 @@ +<?php return ['Yi ', 'Ding ', 'Kao ', 'Qi ', 'Shang ', 'Xia ', '[?] ', 'Mo ', 'Zhang ', 'San ', 'Shang ', 'Xia ', 'Ji ', 'Bu ', 'Yu ', 'Mian ', 'Gai ', 'Chou ', 'Chou ', 'Zhuan ', 'Qie ', 'Pi ', 'Shi ', 'Shi ', 'Qiu ', 'Bing ', 'Ye ', 'Cong ', 'Dong ', 'Si ', 'Cheng ', 'Diu ', 'Qiu ', 'Liang ', 'Diu ', 'You ', 'Liang ', 'Yan ', 'Bing ', 'Sang ', 'Gun ', 'Jiu ', 'Ge ', 'Ya ', 'Qiang ', 'Zhong ', 'Ji ', 'Jie ', 'Feng ', 'Guan ', 'Chuan ', 'Chan ', 'Lin ', 'Zhuo ', 'Zhu ', 'Ha ', 'Wan ', 'Dan ', 'Wei ', 'Zhu ', 'Jing ', 'Li ', 'Ju ', 'Pie ', 'Fu ', 'Yi ', 'Yi ', 'Nai ', 'Shime ', 'Jiu ', 'Jiu ', 'Zhe ', 'Yao ', 'Yi ', '[?] ', 'Zhi ', 'Wu ', 'Zha ', 'Hu ', 'Fa ', 'Le ', 'Zhong ', 'Ping ', 'Pang ', 'Qiao ', 'Hu ', 'Guai ', 'Cheng ', 'Cheng ', 'Yi ', 'Yin ', '[?] ', 'Mie ', 'Jiu ', 'Qi ', 'Ye ', 'Xi ', 'Xiang ', 'Gai ', 'Diu ', 'Hal ', '[?] ', 'Shu ', 'Twul ', 'Shi ', 'Ji ', 'Nang ', 'Jia ', 'Kel ', 'Shi ', '[?] ', 'Ol ', 'Mai ', 'Luan ', 'Cal ', 'Ru ', 'Xue ', 'Yan ', 'Fu ', 'Sha ', 'Na ', 'Gan ', 'Sol ', 'El ', 'Cwul ', '[?] ', 'Gan ', 'Chi ', 'Gui ', 'Gan ', 'Luan ', 'Lin ', 'Yi ', 'Jue ', 'Liao ', 'Ma ', 'Yu ', 'Zheng ', 'Shi ', 'Shi ', 'Er ', 'Chu ', 'Yu ', 'Yu ', 'Yu ', 'Yun ', 'Hu ', 'Qi ', 'Wu ', 'Jing ', 'Si ', 'Sui ', 'Gen ', 'Gen ', 'Ya ', 'Xie ', 'Ya ', 'Qi ', 'Ya ', 'Ji ', 'Tou ', 'Wang ', 'Kang ', 'Ta ', 'Jiao ', 'Hai ', 'Yi ', 'Chan ', 'Heng ', 'Mu ', '[?] ', 'Xiang ', 'Jing ', 'Ting ', 'Liang ', 'Xiang ', 'Jing ', 'Ye ', 'Qin ', 'Bo ', 'You ', 'Xie ', 'Dan ', 'Lian ', 'Duo ', 'Wei ', 'Ren ', 'Ren ', 'Ji ', 'La ', 'Wang ', 'Yi ', 'Shi ', 'Ren ', 'Le ', 'Ding ', 'Ze ', 'Jin ', 'Pu ', 'Chou ', 'Ba ', 'Zhang ', 'Jin ', 'Jie ', 'Bing ', 'Reng ', 'Cong ', 'Fo ', 'San ', 'Lun ', 'Sya ', 'Cang ', 'Zi ', 'Shi ', 'Ta ', 'Zhang ', 'Fu ', 'Xian ', 'Xian ', 'Tuo ', 'Hong ', 'Tong ', 'Ren ', 'Qian ', 'Gan ', 'Yi ', 'Di ', 'Dai ', 'Ling ', 'Yi ', 'Chao ', 'Chang ', 'Sa ', '[?] ', 'Yi ', 'Mu ', 'Men ', 'Ren ', 'Jia ', 'Chao ', 'Yang ', 'Qian ', 'Zhong ', 'Pi ', 'Wan ', 'Wu ', 'Jian ', 'Jie ', 'Yao ', 'Feng ', 'Cang ', 'Ren ', 'Wang ', 'Fen ', 'Di ', 'Fang ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x04f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x04f.php new file mode 100644 index 0000000..a42bb3e --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x04f.php @@ -0,0 +1 @@ +<?php return ['Zhong ', 'Qi ', 'Pei ', 'Yu ', 'Diao ', 'Dun ', 'Wen ', 'Yi ', 'Xin ', 'Kang ', 'Yi ', 'Ji ', 'Ai ', 'Wu ', 'Ji ', 'Fu ', 'Fa ', 'Xiu ', 'Jin ', 'Bei ', 'Dan ', 'Fu ', 'Tang ', 'Zhong ', 'You ', 'Huo ', 'Hui ', 'Yu ', 'Cui ', 'Chuan ', 'San ', 'Wei ', 'Chuan ', 'Che ', 'Ya ', 'Xian ', 'Shang ', 'Chang ', 'Lun ', 'Cang ', 'Xun ', 'Xin ', 'Wei ', 'Zhu ', '[?] ', 'Xuan ', 'Nu ', 'Bo ', 'Gu ', 'Ni ', 'Ni ', 'Xie ', 'Ban ', 'Xu ', 'Ling ', 'Zhou ', 'Shen ', 'Qu ', 'Si ', 'Beng ', 'Si ', 'Jia ', 'Pi ', 'Yi ', 'Si ', 'Ai ', 'Zheng ', 'Dian ', 'Han ', 'Mai ', 'Dan ', 'Zhu ', 'Bu ', 'Qu ', 'Bi ', 'Shao ', 'Ci ', 'Wei ', 'Di ', 'Zhu ', 'Zuo ', 'You ', 'Yang ', 'Ti ', 'Zhan ', 'He ', 'Bi ', 'Tuo ', 'She ', 'Yu ', 'Yi ', 'Fo ', 'Zuo ', 'Kou ', 'Ning ', 'Tong ', 'Ni ', 'Xuan ', 'Qu ', 'Yong ', 'Wa ', 'Qian ', '[?] ', 'Ka ', '[?] ', 'Pei ', 'Huai ', 'He ', 'Lao ', 'Xiang ', 'Ge ', 'Yang ', 'Bai ', 'Fa ', 'Ming ', 'Jia ', 'Er ', 'Bing ', 'Ji ', 'Hen ', 'Huo ', 'Gui ', 'Quan ', 'Tiao ', 'Jiao ', 'Ci ', 'Yi ', 'Shi ', 'Xing ', 'Shen ', 'Tuo ', 'Kan ', 'Zhi ', 'Gai ', 'Lai ', 'Yi ', 'Chi ', 'Kua ', 'Guang ', 'Li ', 'Yin ', 'Shi ', 'Mi ', 'Zhu ', 'Xu ', 'You ', 'An ', 'Lu ', 'Mou ', 'Er ', 'Lun ', 'Tong ', 'Cha ', 'Chi ', 'Xun ', 'Gong ', 'Zhou ', 'Yi ', 'Ru ', 'Jian ', 'Xia ', 'Jia ', 'Zai ', 'Lu ', 'Ko ', 'Jiao ', 'Zhen ', 'Ce ', 'Qiao ', 'Kuai ', 'Chai ', 'Ning ', 'Nong ', 'Jin ', 'Wu ', 'Hou ', 'Jiong ', 'Cheng ', 'Zhen ', 'Zuo ', 'Chou ', 'Qin ', 'Lu ', 'Ju ', 'Shu ', 'Ting ', 'Shen ', 'Tuo ', 'Bo ', 'Nan ', 'Hao ', 'Bian ', 'Tui ', 'Yu ', 'Xi ', 'Cu ', 'E ', 'Qiu ', 'Xu ', 'Kuang ', 'Ku ', 'Wu ', 'Jun ', 'Yi ', 'Fu ', 'Lang ', 'Zu ', 'Qiao ', 'Li ', 'Yong ', 'Hun ', 'Jing ', 'Xian ', 'San ', 'Pai ', 'Su ', 'Fu ', 'Xi ', 'Li ', 'Fu ', 'Ping ', 'Bao ', 'Yu ', 'Si ', 'Xia ', 'Xin ', 'Xiu ', 'Yu ', 'Ti ', 'Che ', 'Chou ', '[?] ', 'Yan ', 'Lia ', 'Li ', 'Lai ', '[?] ', 'Jian ', 'Xiu ', 'Fu ', 'He ', 'Ju ', 'Xiao ', 'Pai ', 'Jian ', 'Biao ', 'Chu ', 'Fei ', 'Feng ', 'Ya ', 'An ', 'Bei ', 'Yu ', 'Xin ', 'Bi ', 'Jian ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x050.php b/vendor/voku/portable-ascii/src/voku/helper/data/x050.php new file mode 100644 index 0000000..14db069 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x050.php @@ -0,0 +1 @@ +<?php return ['Chang ', 'Chi ', 'Bing ', 'Zan ', 'Yao ', 'Cui ', 'Lia ', 'Wan ', 'Lai ', 'Cang ', 'Zong ', 'Ge ', 'Guan ', 'Bei ', 'Tian ', 'Shu ', 'Shu ', 'Men ', 'Dao ', 'Tan ', 'Jue ', 'Chui ', 'Xing ', 'Peng ', 'Tang ', 'Hou ', 'Yi ', 'Qi ', 'Ti ', 'Gan ', 'Jing ', 'Jie ', 'Sui ', 'Chang ', 'Jie ', 'Fang ', 'Zhi ', 'Kong ', 'Juan ', 'Zong ', 'Ju ', 'Qian ', 'Ni ', 'Lun ', 'Zhuo ', 'Wei ', 'Luo ', 'Song ', 'Leng ', 'Hun ', 'Dong ', 'Zi ', 'Ben ', 'Wu ', 'Ju ', 'Nai ', 'Cai ', 'Jian ', 'Zhai ', 'Ye ', 'Zhi ', 'Sha ', 'Qing ', '[?] ', 'Ying ', 'Cheng ', 'Jian ', 'Yan ', 'Nuan ', 'Zhong ', 'Chun ', 'Jia ', 'Jie ', 'Wei ', 'Yu ', 'Bing ', 'Ruo ', 'Ti ', 'Wei ', 'Pian ', 'Yan ', 'Feng ', 'Tang ', 'Wo ', 'E ', 'Xie ', 'Che ', 'Sheng ', 'Kan ', 'Di ', 'Zuo ', 'Cha ', 'Ting ', 'Bei ', 'Ye ', 'Huang ', 'Yao ', 'Zhan ', 'Chou ', 'Yan ', 'You ', 'Jian ', 'Xu ', 'Zha ', 'Ci ', 'Fu ', 'Bi ', 'Zhi ', 'Zong ', 'Mian ', 'Ji ', 'Yi ', 'Xie ', 'Xun ', 'Si ', 'Duan ', 'Ce ', 'Zhen ', 'Ou ', 'Tou ', 'Tou ', 'Bei ', 'Za ', 'Lu ', 'Jie ', 'Wei ', 'Fen ', 'Chang ', 'Gui ', 'Sou ', 'Zhi ', 'Su ', 'Xia ', 'Fu ', 'Yuan ', 'Rong ', 'Li ', 'Ru ', 'Yun ', 'Gou ', 'Ma ', 'Bang ', 'Dian ', 'Tang ', 'Hao ', 'Jie ', 'Xi ', 'Shan ', 'Qian ', 'Jue ', 'Cang ', 'Chu ', 'San ', 'Bei ', 'Xiao ', 'Yong ', 'Yao ', 'Tan ', 'Suo ', 'Yang ', 'Fa ', 'Bing ', 'Jia ', 'Dai ', 'Zai ', 'Tang ', '[?] ', 'Bin ', 'Chu ', 'Nuo ', 'Can ', 'Lei ', 'Cui ', 'Yong ', 'Zao ', 'Zong ', 'Peng ', 'Song ', 'Ao ', 'Chuan ', 'Yu ', 'Zhai ', 'Cou ', 'Shang ', 'Qiang ', 'Jing ', 'Chi ', 'Sha ', 'Han ', 'Zhang ', 'Qing ', 'Yan ', 'Di ', 'Xi ', 'Lu ', 'Bei ', 'Piao ', 'Jin ', 'Lian ', 'Lu ', 'Man ', 'Qian ', 'Xian ', 'Tan ', 'Ying ', 'Dong ', 'Zhuan ', 'Xiang ', 'Shan ', 'Qiao ', 'Jiong ', 'Tui ', 'Zun ', 'Pu ', 'Xi ', 'Lao ', 'Chang ', 'Guang ', 'Liao ', 'Qi ', 'Deng ', 'Chan ', 'Wei ', 'Ji ', 'Fan ', 'Hui ', 'Chuan ', 'Jian ', 'Dan ', 'Jiao ', 'Jiu ', 'Seng ', 'Fen ', 'Xian ', 'Jue ', 'E ', 'Jiao ', 'Jian ', 'Tong ', 'Lin ', 'Bo ', 'Gu ', '[?] ', 'Su ', 'Xian ', 'Jiang ', 'Min ', 'Ye ', 'Jin ', 'Jia ', 'Qiao ', 'Pi ', 'Feng ', 'Zhou ', 'Ai ', 'Sai ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x051.php b/vendor/voku/portable-ascii/src/voku/helper/data/x051.php new file mode 100644 index 0000000..a5dec81 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x051.php @@ -0,0 +1 @@ +<?php return ['Yi ', 'Jun ', 'Nong ', 'Chan ', 'Yi ', 'Dang ', 'Jing ', 'Xuan ', 'Kuai ', 'Jian ', 'Chu ', 'Dan ', 'Jiao ', 'Sha ', 'Zai ', '[?] ', 'Bin ', 'An ', 'Ru ', 'Tai ', 'Chou ', 'Chai ', 'Lan ', 'Ni ', 'Jin ', 'Qian ', 'Meng ', 'Wu ', 'Ning ', 'Qiong ', 'Ni ', 'Chang ', 'Lie ', 'Lei ', 'Lu ', 'Kuang ', 'Bao ', 'Du ', 'Biao ', 'Zan ', 'Zhi ', 'Si ', 'You ', 'Hao ', 'Chen ', 'Chen ', 'Li ', 'Teng ', 'Wei ', 'Long ', 'Chu ', 'Chan ', 'Rang ', 'Shu ', 'Hui ', 'Li ', 'Luo ', 'Zan ', 'Nuo ', 'Tang ', 'Yan ', 'Lei ', 'Nang ', 'Er ', 'Wu ', 'Yun ', 'Zan ', 'Yuan ', 'Xiong ', 'Chong ', 'Zhao ', 'Xiong ', 'Xian ', 'Guang ', 'Dui ', 'Ke ', 'Dui ', 'Mian ', 'Tu ', 'Chang ', 'Er ', 'Dui ', 'Er ', 'Xin ', 'Tu ', 'Si ', 'Yan ', 'Yan ', 'Shi ', 'Shi ', 'Dang ', 'Qian ', 'Dou ', 'Fen ', 'Mao ', 'Shen ', 'Dou ', 'Bai ', 'Jing ', 'Li ', 'Huang ', 'Ru ', 'Wang ', 'Nei ', 'Quan ', 'Liang ', 'Yu ', 'Ba ', 'Gong ', 'Liu ', 'Xi ', '[?] ', 'Lan ', 'Gong ', 'Tian ', 'Guan ', 'Xing ', 'Bing ', 'Qi ', 'Ju ', 'Dian ', 'Zi ', 'Ppwun ', 'Yang ', 'Jian ', 'Shou ', 'Ji ', 'Yi ', 'Ji ', 'Chan ', 'Jiong ', 'Mao ', 'Ran ', 'Nei ', 'Yuan ', 'Mao ', 'Gang ', 'Ran ', 'Ce ', 'Jiong ', 'Ce ', 'Zai ', 'Gua ', 'Jiong ', 'Mao ', 'Zhou ', 'Mou ', 'Gou ', 'Xu ', 'Mian ', 'Mi ', 'Rong ', 'Yin ', 'Xie ', 'Kan ', 'Jun ', 'Nong ', 'Yi ', 'Mi ', 'Shi ', 'Guan ', 'Meng ', 'Zhong ', 'Ju ', 'Yuan ', 'Ming ', 'Kou ', 'Lam ', 'Fu ', 'Xie ', 'Mi ', 'Bing ', 'Dong ', 'Tai ', 'Gang ', 'Feng ', 'Bing ', 'Hu ', 'Chong ', 'Jue ', 'Hu ', 'Kuang ', 'Ye ', 'Leng ', 'Pan ', 'Fu ', 'Min ', 'Dong ', 'Xian ', 'Lie ', 'Xia ', 'Jian ', 'Jing ', 'Shu ', 'Mei ', 'Tu ', 'Qi ', 'Gu ', 'Zhun ', 'Song ', 'Jing ', 'Liang ', 'Qing ', 'Diao ', 'Ling ', 'Dong ', 'Gan ', 'Jian ', 'Yin ', 'Cou ', 'Yi ', 'Li ', 'Cang ', 'Ming ', 'Zhuen ', 'Cui ', 'Si ', 'Duo ', 'Jin ', 'Lin ', 'Lin ', 'Ning ', 'Xi ', 'Du ', 'Ji ', 'Fan ', 'Fan ', 'Fan ', 'Feng ', 'Ju ', 'Chu ', 'Tako ', 'Feng ', 'Mok ', 'Ci ', 'Fu ', 'Feng ', 'Ping ', 'Feng ', 'Kai ', 'Huang ', 'Kai ', 'Gan ', 'Deng ', 'Ping ', 'Qu ', 'Xiong ', 'Kuai ', 'Tu ', 'Ao ', 'Chu ', 'Ji ', 'Dang ', 'Han ', 'Han ', 'Zao ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x052.php b/vendor/voku/portable-ascii/src/voku/helper/data/x052.php new file mode 100644 index 0000000..91d9045 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x052.php @@ -0,0 +1 @@ +<?php return ['Dao ', 'Diao ', 'Dao ', 'Ren ', 'Ren ', 'Chuang ', 'Fen ', 'Qie ', 'Yi ', 'Ji ', 'Kan ', 'Qian ', 'Cun ', 'Chu ', 'Wen ', 'Ji ', 'Dan ', 'Xing ', 'Hua ', 'Wan ', 'Jue ', 'Li ', 'Yue ', 'Lie ', 'Liu ', 'Ze ', 'Gang ', 'Chuang ', 'Fu ', 'Chu ', 'Qu ', 'Ju ', 'Shan ', 'Min ', 'Ling ', 'Zhong ', 'Pan ', 'Bie ', 'Jie ', 'Jie ', 'Bao ', 'Li ', 'Shan ', 'Bie ', 'Chan ', 'Jing ', 'Gua ', 'Gen ', 'Dao ', 'Chuang ', 'Kui ', 'Ku ', 'Duo ', 'Er ', 'Zhi ', 'Shua ', 'Quan ', 'Cha ', 'Ci ', 'Ke ', 'Jie ', 'Gui ', 'Ci ', 'Gui ', 'Kai ', 'Duo ', 'Ji ', 'Ti ', 'Jing ', 'Lou ', 'Gen ', 'Ze ', 'Yuan ', 'Cuo ', 'Xue ', 'Ke ', 'La ', 'Qian ', 'Cha ', 'Chuang ', 'Gua ', 'Jian ', 'Cuo ', 'Li ', 'Ti ', 'Fei ', 'Pou ', 'Chan ', 'Qi ', 'Chuang ', 'Zi ', 'Gang ', 'Wan ', 'Bo ', 'Ji ', 'Duo ', 'Qing ', 'Yan ', 'Zhuo ', 'Jian ', 'Ji ', 'Bo ', 'Yan ', 'Ju ', 'Huo ', 'Sheng ', 'Jian ', 'Duo ', 'Duan ', 'Wu ', 'Gua ', 'Fu ', 'Sheng ', 'Jian ', 'Ge ', 'Zha ', 'Kai ', 'Chuang ', 'Juan ', 'Chan ', 'Tuan ', 'Lu ', 'Li ', 'Fou ', 'Shan ', 'Piao ', 'Kou ', 'Jiao ', 'Gua ', 'Qiao ', 'Jue ', 'Hua ', 'Zha ', 'Zhuo ', 'Lian ', 'Ju ', 'Pi ', 'Liu ', 'Gui ', 'Jiao ', 'Gui ', 'Jian ', 'Jian ', 'Tang ', 'Huo ', 'Ji ', 'Jian ', 'Yi ', 'Jian ', 'Zhi ', 'Chan ', 'Cuan ', 'Mo ', 'Li ', 'Zhu ', 'Li ', 'Ya ', 'Quan ', 'Ban ', 'Gong ', 'Jia ', 'Wu ', 'Mai ', 'Lie ', 'Jin ', 'Keng ', 'Xie ', 'Zhi ', 'Dong ', 'Zhu ', 'Nu ', 'Jie ', 'Qu ', 'Shao ', 'Yi ', 'Zhu ', 'Miao ', 'Li ', 'Jing ', 'Lao ', 'Lao ', 'Juan ', 'Kou ', 'Yang ', 'Wa ', 'Xiao ', 'Mou ', 'Kuang ', 'Jie ', 'Lie ', 'He ', 'Shi ', 'Ke ', 'Jing ', 'Hao ', 'Bo ', 'Min ', 'Chi ', 'Lang ', 'Yong ', 'Yong ', 'Mian ', 'Ke ', 'Xun ', 'Juan ', 'Qing ', 'Lu ', 'Pou ', 'Meng ', 'Lai ', 'Le ', 'Kai ', 'Mian ', 'Dong ', 'Xu ', 'Xu ', 'Kan ', 'Wu ', 'Yi ', 'Xun ', 'Weng ', 'Sheng ', 'Lao ', 'Mu ', 'Lu ', 'Piao ', 'Shi ', 'Ji ', 'Qin ', 'Qiang ', 'Jiao ', 'Quan ', 'Yang ', 'Yi ', 'Jue ', 'Fan ', 'Juan ', 'Tong ', 'Ju ', 'Dan ', 'Xie ', 'Mai ', 'Xun ', 'Xun ', 'Lu ', 'Li ', 'Che ', 'Rang ', 'Quan ', 'Bao ', 'Shao ', 'Yun ', 'Jiu ', 'Bao ', 'Gou ', 'Wu ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x053.php b/vendor/voku/portable-ascii/src/voku/helper/data/x053.php new file mode 100644 index 0000000..ffb671f --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x053.php @@ -0,0 +1 @@ +<?php return ['Yun ', 'Mwun ', 'Nay ', 'Gai ', 'Gai ', 'Bao ', 'Cong ', '[?] ', 'Xiong ', 'Peng ', 'Ju ', 'Tao ', 'Ge ', 'Pu ', 'An ', 'Pao ', 'Fu ', 'Gong ', 'Da ', 'Jiu ', 'Qiong ', 'Bi ', 'Hua ', 'Bei ', 'Nao ', 'Chi ', 'Fang ', 'Jiu ', 'Yi ', 'Za ', 'Jiang ', 'Kang ', 'Jiang ', 'Kuang ', 'Hu ', 'Xia ', 'Qu ', 'Bian ', 'Gui ', 'Qie ', 'Zang ', 'Kuang ', 'Fei ', 'Hu ', 'Tou ', 'Gui ', 'Gui ', 'Hui ', 'Dan ', 'Gui ', 'Lian ', 'Lian ', 'Suan ', 'Du ', 'Jiu ', 'Qu ', 'Xi ', 'Pi ', 'Qu ', 'Yi ', 'Qia ', 'Yan ', 'Bian ', 'Ni ', 'Qu ', 'Shi ', 'Xin ', 'Qian ', 'Nian ', 'Sa ', 'Zu ', 'Sheng ', 'Wu ', 'Hui ', 'Ban ', 'Shi ', 'Xi ', 'Wan ', 'Hua ', 'Xie ', 'Wan ', 'Bei ', 'Zu ', 'Zhuo ', 'Xie ', 'Dan ', 'Mai ', 'Nan ', 'Dan ', 'Ji ', 'Bo ', 'Shuai ', 'Bu ', 'Kuang ', 'Bian ', 'Bu ', 'Zhan ', 'Qia ', 'Lu ', 'You ', 'Lu ', 'Xi ', 'Gua ', 'Wo ', 'Xie ', 'Jie ', 'Jie ', 'Wei ', 'Ang ', 'Qiong ', 'Zhi ', 'Mao ', 'Yin ', 'Wei ', 'Shao ', 'Ji ', 'Que ', 'Luan ', 'Shi ', 'Juan ', 'Xie ', 'Xu ', 'Jin ', 'Que ', 'Wu ', 'Ji ', 'E ', 'Qing ', 'Xi ', '[?] ', 'Han ', 'Zhan ', 'E ', 'Ting ', 'Li ', 'Zhe ', 'Han ', 'Li ', 'Ya ', 'Ya ', 'Yan ', 'She ', 'Zhi ', 'Zha ', 'Pang ', '[?] ', 'He ', 'Ya ', 'Zhi ', 'Ce ', 'Pang ', 'Ti ', 'Li ', 'She ', 'Hou ', 'Ting ', 'Zui ', 'Cuo ', 'Fei ', 'Yuan ', 'Ce ', 'Yuan ', 'Xiang ', 'Yan ', 'Li ', 'Jue ', 'Sha ', 'Dian ', 'Chu ', 'Jiu ', 'Qin ', 'Ao ', 'Gui ', 'Yan ', 'Si ', 'Li ', 'Chang ', 'Lan ', 'Li ', 'Yan ', 'Yan ', 'Yuan ', 'Si ', 'Gong ', 'Lin ', 'Qiu ', 'Qu ', 'Qu ', 'Uk ', 'Lei ', 'Du ', 'Xian ', 'Zhuan ', 'San ', 'Can ', 'Can ', 'Can ', 'Can ', 'Ai ', 'Dai ', 'You ', 'Cha ', 'Ji ', 'You ', 'Shuang ', 'Fan ', 'Shou ', 'Guai ', 'Ba ', 'Fa ', 'Ruo ', 'Shi ', 'Shu ', 'Zhuo ', 'Qu ', 'Shou ', 'Bian ', 'Xu ', 'Jia ', 'Pan ', 'Sou ', 'Gao ', 'Wei ', 'Sou ', 'Die ', 'Rui ', 'Cong ', 'Kou ', 'Gu ', 'Ju ', 'Ling ', 'Gua ', 'Tao ', 'Kou ', 'Zhi ', 'Jiao ', 'Zhao ', 'Ba ', 'Ding ', 'Ke ', 'Tai ', 'Chi ', 'Shi ', 'You ', 'Qiu ', 'Po ', 'Xie ', 'Hao ', 'Si ', 'Tan ', 'Chi ', 'Le ', 'Diao ', 'Ji ', '[?] ', 'Hong ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x054.php b/vendor/voku/portable-ascii/src/voku/helper/data/x054.php new file mode 100644 index 0000000..c90148f --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x054.php @@ -0,0 +1 @@ +<?php return ['Mie ', 'Xu ', 'Mang ', 'Chi ', 'Ge ', 'Xuan ', 'Yao ', 'Zi ', 'He ', 'Ji ', 'Diao ', 'Cun ', 'Tong ', 'Ming ', 'Hou ', 'Li ', 'Tu ', 'Xiang ', 'Zha ', 'Xia ', 'Ye ', 'Lu ', 'A ', 'Ma ', 'Ou ', 'Xue ', 'Yi ', 'Jun ', 'Chou ', 'Lin ', 'Tun ', 'Yin ', 'Fei ', 'Bi ', 'Qin ', 'Qin ', 'Jie ', 'Bu ', 'Fou ', 'Ba ', 'Dun ', 'Fen ', 'E ', 'Han ', 'Ting ', 'Hang ', 'Shun ', 'Qi ', 'Hong ', 'Zhi ', 'Shen ', 'Wu ', 'Wu ', 'Chao ', 'Ne ', 'Xue ', 'Xi ', 'Chui ', 'Dou ', 'Wen ', 'Hou ', 'Ou ', 'Wu ', 'Gao ', 'Ya ', 'Jun ', 'Lu ', 'E ', 'Ge ', 'Mei ', 'Ai ', 'Qi ', 'Cheng ', 'Wu ', 'Gao ', 'Fu ', 'Jiao ', 'Hong ', 'Chi ', 'Sheng ', 'Ne ', 'Tun ', 'Fu ', 'Yi ', 'Dai ', 'Ou ', 'Li ', 'Bai ', 'Yuan ', 'Kuai ', '[?] ', 'Qiang ', 'Wu ', 'E ', 'Shi ', 'Quan ', 'Pen ', 'Wen ', 'Ni ', 'M ', 'Ling ', 'Ran ', 'You ', 'Di ', 'Zhou ', 'Shi ', 'Zhou ', 'Tie ', 'Xi ', 'Yi ', 'Qi ', 'Ping ', 'Zi ', 'Gu ', 'Zi ', 'Wei ', 'Xu ', 'He ', 'Nao ', 'Xia ', 'Pei ', 'Yi ', 'Xiao ', 'Shen ', 'Hu ', 'Ming ', 'Da ', 'Qu ', 'Ju ', 'Gem ', 'Za ', 'Tuo ', 'Duo ', 'Pou ', 'Pao ', 'Bi ', 'Fu ', 'Yang ', 'He ', 'Zha ', 'He ', 'Hai ', 'Jiu ', 'Yong ', 'Fu ', 'Que ', 'Zhou ', 'Wa ', 'Ka ', 'Gu ', 'Ka ', 'Zuo ', 'Bu ', 'Long ', 'Dong ', 'Ning ', 'Tha ', 'Si ', 'Xian ', 'Huo ', 'Qi ', 'Er ', 'E ', 'Guang ', 'Zha ', 'Xi ', 'Yi ', 'Lie ', 'Zi ', 'Mie ', 'Mi ', 'Zhi ', 'Yao ', 'Ji ', 'Zhou ', 'Ge ', 'Shuai ', 'Zan ', 'Xiao ', 'Ke ', 'Hui ', 'Kua ', 'Huai ', 'Tao ', 'Xian ', 'E ', 'Xuan ', 'Xiu ', 'Wai ', 'Yan ', 'Lao ', 'Yi ', 'Ai ', 'Pin ', 'Shen ', 'Tong ', 'Hong ', 'Xiong ', 'Chi ', 'Wa ', 'Ha ', 'Zai ', 'Yu ', 'Di ', 'Pai ', 'Xiang ', 'Ai ', 'Hen ', 'Kuang ', 'Ya ', 'Da ', 'Xiao ', 'Bi ', 'Yue ', '[?] ', 'Hua ', 'Sasou ', 'Kuai ', 'Duo ', '[?] ', 'Ji ', 'Nong ', 'Mou ', 'Yo ', 'Hao ', 'Yuan ', 'Long ', 'Pou ', 'Mang ', 'Ge ', 'E ', 'Chi ', 'Shao ', 'Li ', 'Na ', 'Zu ', 'He ', 'Ku ', 'Xiao ', 'Xian ', 'Lao ', 'Bo ', 'Zhe ', 'Zha ', 'Liang ', 'Ba ', 'Mie ', 'Le ', 'Sui ', 'Fou ', 'Bu ', 'Han ', 'Heng ', 'Geng ', 'Shuo ', 'Ge ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x055.php b/vendor/voku/portable-ascii/src/voku/helper/data/x055.php new file mode 100644 index 0000000..0aa75ca --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x055.php @@ -0,0 +1 @@ +<?php return ['You ', 'Yan ', 'Gu ', 'Gu ', 'Bai ', 'Han ', 'Suo ', 'Chun ', 'Yi ', 'Ai ', 'Jia ', 'Tu ', 'Xian ', 'Huan ', 'Li ', 'Xi ', 'Tang ', 'Zuo ', 'Qiu ', 'Che ', 'Wu ', 'Zao ', 'Ya ', 'Dou ', 'Qi ', 'Di ', 'Qin ', 'Ma ', 'Mal ', 'Hong ', 'Dou ', 'Kes ', 'Lao ', 'Liang ', 'Suo ', 'Zao ', 'Huan ', 'Lang ', 'Sha ', 'Ji ', 'Zuo ', 'Wo ', 'Feng ', 'Yin ', 'Hu ', 'Qi ', 'Shou ', 'Wei ', 'Shua ', 'Chang ', 'Er ', 'Li ', 'Qiang ', 'An ', 'Jie ', 'Yo ', 'Nian ', 'Yu ', 'Tian ', 'Lai ', 'Sha ', 'Xi ', 'Tuo ', 'Hu ', 'Ai ', 'Zhou ', 'Nou ', 'Ken ', 'Zhuo ', 'Zhuo ', 'Shang ', 'Di ', 'Heng ', 'Lan ', 'A ', 'Xiao ', 'Xiang ', 'Tun ', 'Wu ', 'Wen ', 'Cui ', 'Sha ', 'Hu ', 'Qi ', 'Qi ', 'Tao ', 'Dan ', 'Dan ', 'Ye ', 'Zi ', 'Bi ', 'Cui ', 'Chuo ', 'He ', 'Ya ', 'Qi ', 'Zhe ', 'Pei ', 'Liang ', 'Xian ', 'Pi ', 'Sha ', 'La ', 'Ze ', 'Qing ', 'Gua ', 'Pa ', 'Zhe ', 'Se ', 'Zhuan ', 'Nie ', 'Guo ', 'Luo ', 'Yan ', 'Di ', 'Quan ', 'Tan ', 'Bo ', 'Ding ', 'Lang ', 'Xiao ', '[?] ', 'Tang ', 'Chi ', 'Ti ', 'An ', 'Jiu ', 'Dan ', 'Ke ', 'Yong ', 'Wei ', 'Nan ', 'Shan ', 'Yu ', 'Zhe ', 'La ', 'Jie ', 'Hou ', 'Han ', 'Die ', 'Zhou ', 'Chai ', 'Wai ', 'Re ', 'Yu ', 'Yin ', 'Zan ', 'Yao ', 'Wo ', 'Mian ', 'Hu ', 'Yun ', 'Chuan ', 'Hui ', 'Huan ', 'Huan ', 'Xi ', 'He ', 'Ji ', 'Kui ', 'Zhong ', 'Wei ', 'Sha ', 'Xu ', 'Huang ', 'Du ', 'Nie ', 'Xuan ', 'Liang ', 'Yu ', 'Sang ', 'Chi ', 'Qiao ', 'Yan ', 'Dan ', 'Pen ', 'Can ', 'Li ', 'Yo ', 'Zha ', 'Wei ', 'Miao ', 'Ying ', 'Pen ', 'Phos ', 'Kui ', 'Xi ', 'Yu ', 'Jie ', 'Lou ', 'Ku ', 'Sao ', 'Huo ', 'Ti ', 'Yao ', 'He ', 'A ', 'Xiu ', 'Qiang ', 'Se ', 'Yong ', 'Su ', 'Hong ', 'Xie ', 'Yi ', 'Suo ', 'Ma ', 'Cha ', 'Hai ', 'Ke ', 'Ta ', 'Sang ', 'Tian ', 'Ru ', 'Sou ', 'Wa ', 'Ji ', 'Pang ', 'Wu ', 'Xian ', 'Shi ', 'Ge ', 'Zi ', 'Jie ', 'Luo ', 'Weng ', 'Wa ', 'Si ', 'Chi ', 'Hao ', 'Suo ', 'Jia ', 'Hai ', 'Suo ', 'Qin ', 'Nie ', 'He ', 'Cis ', 'Sai ', 'Ng ', 'Ge ', 'Na ', 'Dia ', 'Ai ', '[?] ', 'Tong ', 'Bi ', 'Ao ', 'Ao ', 'Lian ', 'Cui ', 'Zhe ', 'Mo ', 'Sou ', 'Sou ', 'Tan ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x056.php b/vendor/voku/portable-ascii/src/voku/helper/data/x056.php new file mode 100644 index 0000000..157e4a0 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x056.php @@ -0,0 +1 @@ +<?php return ['Di ', 'Qi ', 'Jiao ', 'Chong ', 'Jiao ', 'Kai ', 'Tan ', 'San ', 'Cao ', 'Jia ', 'Ai ', 'Xiao ', 'Piao ', 'Lou ', 'Ga ', 'Gu ', 'Xiao ', 'Hu ', 'Hui ', 'Guo ', 'Ou ', 'Xian ', 'Ze ', 'Chang ', 'Xu ', 'Po ', 'De ', 'Ma ', 'Ma ', 'Hu ', 'Lei ', 'Du ', 'Ga ', 'Tang ', 'Ye ', 'Beng ', 'Ying ', 'Saai ', 'Jiao ', 'Mi ', 'Xiao ', 'Hua ', 'Mai ', 'Ran ', 'Zuo ', 'Peng ', 'Lao ', 'Xiao ', 'Ji ', 'Zhu ', 'Chao ', 'Kui ', 'Zui ', 'Xiao ', 'Si ', 'Hao ', 'Fu ', 'Liao ', 'Qiao ', 'Xi ', 'Xiu ', 'Tan ', 'Tan ', 'Mo ', 'Xun ', 'E ', 'Zun ', 'Fan ', 'Chi ', 'Hui ', 'Zan ', 'Chuang ', 'Cu ', 'Dan ', 'Yu ', 'Tun ', 'Cheng ', 'Jiao ', 'Ye ', 'Xi ', 'Qi ', 'Hao ', 'Lian ', 'Xu ', 'Deng ', 'Hui ', 'Yin ', 'Pu ', 'Jue ', 'Qin ', 'Xun ', 'Nie ', 'Lu ', 'Si ', 'Yan ', 'Ying ', 'Da ', 'Dan ', 'Yu ', 'Zhou ', 'Jin ', 'Nong ', 'Yue ', 'Hui ', 'Qi ', 'E ', 'Zao ', 'Yi ', 'Shi ', 'Jiao ', 'Yuan ', 'Ai ', 'Yong ', 'Jue ', 'Kuai ', 'Yu ', 'Pen ', 'Dao ', 'Ge ', 'Xin ', 'Dun ', 'Dang ', 'Sin ', 'Sai ', 'Pi ', 'Pi ', 'Yin ', 'Zui ', 'Ning ', 'Di ', 'Lan ', 'Ta ', 'Huo ', 'Ru ', 'Hao ', 'Xia ', 'Ya ', 'Duo ', 'Xi ', 'Chou ', 'Ji ', 'Jin ', 'Hao ', 'Ti ', 'Chang ', '[?] ', '[?] ', 'Ca ', 'Ti ', 'Lu ', 'Hui ', 'Bo ', 'You ', 'Nie ', 'Yin ', 'Hu ', 'Mo ', 'Huang ', 'Zhe ', 'Li ', 'Liu ', 'Haai ', 'Nang ', 'Xiao ', 'Mo ', 'Yan ', 'Li ', 'Lu ', 'Long ', 'Fu ', 'Dan ', 'Chen ', 'Pin ', 'Pi ', 'Xiang ', 'Huo ', 'Mo ', 'Xi ', 'Duo ', 'Ku ', 'Yan ', 'Chan ', 'Ying ', 'Rang ', 'Dian ', 'La ', 'Ta ', 'Xiao ', 'Jiao ', 'Chuo ', 'Huan ', 'Huo ', 'Zhuan ', 'Nie ', 'Xiao ', 'Ca ', 'Li ', 'Chan ', 'Chai ', 'Li ', 'Yi ', 'Luo ', 'Nang ', 'Zan ', 'Su ', 'Xi ', 'So ', 'Jian ', 'Za ', 'Zhu ', 'Lan ', 'Nie ', 'Nang ', '[?] ', '[?] ', 'Wei ', 'Hui ', 'Yin ', 'Qiu ', 'Si ', 'Nin ', 'Jian ', 'Hui ', 'Xin ', 'Yin ', 'Nan ', 'Tuan ', 'Tuan ', 'Dun ', 'Kang ', 'Yuan ', 'Jiong ', 'Pian ', 'Yun ', 'Cong ', 'Hu ', 'Hui ', 'Yuan ', 'You ', 'Guo ', 'Kun ', 'Cong ', 'Wei ', 'Tu ', 'Wei ', 'Lun ', 'Guo ', 'Qun ', 'Ri ', 'Ling ', 'Gu ', 'Guo ', 'Tai ', 'Guo ', 'Tu ', 'You ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x057.php b/vendor/voku/portable-ascii/src/voku/helper/data/x057.php new file mode 100644 index 0000000..ead2e2b --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x057.php @@ -0,0 +1 @@ +<?php return ['Guo ', 'Yin ', 'Hun ', 'Pu ', 'Yu ', 'Han ', 'Yuan ', 'Lun ', 'Quan ', 'Yu ', 'Qing ', 'Guo ', 'Chuan ', 'Wei ', 'Yuan ', 'Quan ', 'Ku ', 'Fu ', 'Yuan ', 'Yuan ', 'E ', 'Tu ', 'Tu ', 'Tu ', 'Tuan ', 'Lue ', 'Hui ', 'Yi ', 'Yuan ', 'Luan ', 'Luan ', 'Tu ', 'Ya ', 'Tu ', 'Ting ', 'Sheng ', 'Pu ', 'Lu ', 'Iri ', 'Ya ', 'Zai ', 'Wei ', 'Ge ', 'Yu ', 'Wu ', 'Gui ', 'Pi ', 'Yi ', 'Di ', 'Qian ', 'Qian ', 'Zhen ', 'Zhuo ', 'Dang ', 'Qia ', 'Akutsu ', 'Yama ', 'Kuang ', 'Chang ', 'Qi ', 'Nie ', 'Mo ', 'Ji ', 'Jia ', 'Zhi ', 'Zhi ', 'Ban ', 'Xun ', 'Tou ', 'Qin ', 'Fen ', 'Jun ', 'Keng ', 'Tun ', 'Fang ', 'Fen ', 'Ben ', 'Tan ', 'Kan ', 'Pi ', 'Zuo ', 'Keng ', 'Bi ', 'Xing ', 'Di ', 'Jing ', 'Ji ', 'Kuai ', 'Di ', 'Jing ', 'Jian ', 'Tan ', 'Li ', 'Ba ', 'Wu ', 'Fen ', 'Zhui ', 'Po ', 'Pan ', 'Tang ', 'Kun ', 'Qu ', 'Tan ', 'Zhi ', 'Tuo ', 'Gan ', 'Ping ', 'Dian ', 'Gua ', 'Ni ', 'Tai ', 'Pi ', 'Jiong ', 'Yang ', 'Fo ', 'Ao ', 'Liu ', 'Qiu ', 'Mu ', 'Ke ', 'Gou ', 'Xue ', 'Ba ', 'Chi ', 'Che ', 'Ling ', 'Zhu ', 'Fu ', 'Hu ', 'Zhi ', 'Chui ', 'La ', 'Long ', 'Long ', 'Lu ', 'Ao ', 'Tay ', 'Pao ', '[?] ', 'Xing ', 'Dong ', 'Ji ', 'Ke ', 'Lu ', 'Ci ', 'Chi ', 'Lei ', 'Gai ', 'Yin ', 'Hou ', 'Dui ', 'Zhao ', 'Fu ', 'Guang ', 'Yao ', 'Duo ', 'Duo ', 'Gui ', 'Cha ', 'Yang ', 'Yin ', 'Fa ', 'Gou ', 'Yuan ', 'Die ', 'Xie ', 'Ken ', 'Jiong ', 'Shou ', 'E ', 'Ha ', 'Dian ', 'Hong ', 'Wu ', 'Kua ', '[?] ', 'Tao ', 'Dang ', 'Kai ', 'Gake ', 'Nao ', 'An ', 'Xing ', 'Xian ', 'Huan ', 'Bang ', 'Pei ', 'Ba ', 'Yi ', 'Yin ', 'Han ', 'Xu ', 'Chui ', 'Cen ', 'Geng ', 'Ai ', 'Peng ', 'Fang ', 'Que ', 'Yong ', 'Xun ', 'Jia ', 'Di ', 'Mai ', 'Lang ', 'Xuan ', 'Cheng ', 'Yan ', 'Jin ', 'Zhe ', 'Lei ', 'Lie ', 'Bu ', 'Cheng ', 'Gomi ', 'Bu ', 'Shi ', 'Xun ', 'Guo ', 'Jiong ', 'Ye ', 'Nian ', 'Di ', 'Yu ', 'Bu ', 'Ya ', 'Juan ', 'Sui ', 'Pi ', 'Cheng ', 'Wan ', 'Ju ', 'Lun ', 'Zheng ', 'Kong ', 'Chong ', 'Dong ', 'Dai ', 'Tan ', 'An ', 'Cai ', 'Shu ', 'Beng ', 'Kan ', 'Zhi ', 'Duo ', 'Yi ', 'Zhi ', 'Yi ', 'Pei ', 'Ji ', 'Zhun ', 'Qi ', 'Sao ', 'Ju ', 'Ni ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x058.php b/vendor/voku/portable-ascii/src/voku/helper/data/x058.php new file mode 100644 index 0000000..00f2ac4 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x058.php @@ -0,0 +1 @@ +<?php return ['Ku ', 'Ke ', 'Tang ', 'Kun ', 'Ni ', 'Jian ', 'Dui ', 'Jin ', 'Gang ', 'Yu ', 'E ', 'Peng ', 'Gu ', 'Tu ', 'Leng ', '[?] ', 'Ya ', 'Qian ', '[?] ', 'An ', '[?] ', 'Duo ', 'Nao ', 'Tu ', 'Cheng ', 'Yin ', 'Hun ', 'Bi ', 'Lian ', 'Guo ', 'Die ', 'Zhuan ', 'Hou ', 'Bao ', 'Bao ', 'Yu ', 'Di ', 'Mao ', 'Jie ', 'Ruan ', 'E ', 'Geng ', 'Kan ', 'Zong ', 'Yu ', 'Huang ', 'E ', 'Yao ', 'Yan ', 'Bao ', 'Ji ', 'Mei ', 'Chang ', 'Du ', 'Tuo ', 'Yin ', 'Feng ', 'Zhong ', 'Jie ', 'Zhen ', 'Feng ', 'Gang ', 'Chuan ', 'Jian ', 'Pyeng ', 'Toride ', 'Xiang ', 'Huang ', 'Leng ', 'Duan ', '[?] ', 'Xuan ', 'Ji ', 'Ji ', 'Kuai ', 'Ying ', 'Ta ', 'Cheng ', 'Yong ', 'Kai ', 'Su ', 'Su ', 'Shi ', 'Mi ', 'Ta ', 'Weng ', 'Cheng ', 'Tu ', 'Tang ', 'Que ', 'Zhong ', 'Li ', 'Peng ', 'Bang ', 'Sai ', 'Zang ', 'Dui ', 'Tian ', 'Wu ', 'Cheng ', 'Xun ', 'Ge ', 'Zhen ', 'Ai ', 'Gong ', 'Yan ', 'Kan ', 'Tian ', 'Yuan ', 'Wen ', 'Xie ', 'Liu ', 'Ama ', 'Lang ', 'Chang ', 'Peng ', 'Beng ', 'Chen ', 'Cu ', 'Lu ', 'Ou ', 'Qian ', 'Mei ', 'Mo ', 'Zhuan ', 'Shuang ', 'Shu ', 'Lou ', 'Chi ', 'Man ', 'Biao ', 'Jing ', 'Qi ', 'Shu ', 'Di ', 'Zhang ', 'Kan ', 'Yong ', 'Dian ', 'Chen ', 'Zhi ', 'Xi ', 'Guo ', 'Qiang ', 'Jin ', 'Di ', 'Shang ', 'Mu ', 'Cui ', 'Yan ', 'Ta ', 'Zeng ', 'Qi ', 'Qiang ', 'Liang ', '[?] ', 'Zhui ', 'Qiao ', 'Zeng ', 'Xu ', 'Shan ', 'Shan ', 'Ba ', 'Pu ', 'Kuai ', 'Dong ', 'Fan ', 'Que ', 'Mo ', 'Dun ', 'Dun ', 'Dun ', 'Di ', 'Sheng ', 'Duo ', 'Duo ', 'Tan ', 'Deng ', 'Wu ', 'Fen ', 'Huang ', 'Tan ', 'Da ', 'Ye ', 'Sho ', 'Mama ', 'Yu ', 'Qiang ', 'Ji ', 'Qiao ', 'Ken ', 'Yi ', 'Pi ', 'Bi ', 'Dian ', 'Jiang ', 'Ye ', 'Yong ', 'Bo ', 'Tan ', 'Lan ', 'Ju ', 'Huai ', 'Dang ', 'Rang ', 'Qian ', 'Xun ', 'Lan ', 'Xi ', 'He ', 'Ai ', 'Ya ', 'Dao ', 'Hao ', 'Ruan ', 'Mama ', 'Lei ', 'Kuang ', 'Lu ', 'Yan ', 'Tan ', 'Wei ', 'Huai ', 'Long ', 'Long ', 'Rui ', 'Li ', 'Lin ', 'Rang ', 'Ten ', 'Xun ', 'Yan ', 'Lei ', 'Ba ', '[?] ', 'Shi ', 'Ren ', '[?] ', 'Zhuang ', 'Zhuang ', 'Sheng ', 'Yi ', 'Mai ', 'Ke ', 'Zhu ', 'Zhuang ', 'Hu ', 'Hu ', 'Kun ', 'Yi ', 'Hu ', 'Xu ', 'Kun ', 'Shou ', 'Mang ', 'Zun ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x059.php b/vendor/voku/portable-ascii/src/voku/helper/data/x059.php new file mode 100644 index 0000000..f093af0 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x059.php @@ -0,0 +1 @@ +<?php return ['Shou ', 'Yi ', 'Zhi ', 'Gu ', 'Chu ', 'Jiang ', 'Feng ', 'Bei ', 'Cay ', 'Bian ', 'Sui ', 'Qun ', 'Ling ', 'Fu ', 'Zuo ', 'Xia ', 'Xiong ', '[?] ', 'Nao ', 'Xia ', 'Kui ', 'Xi ', 'Wai ', 'Yuan ', 'Mao ', 'Su ', 'Duo ', 'Duo ', 'Ye ', 'Qing ', 'Uys ', 'Gou ', 'Gou ', 'Qi ', 'Meng ', 'Meng ', 'Yin ', 'Huo ', 'Chen ', 'Da ', 'Ze ', 'Tian ', 'Tai ', 'Fu ', 'Guai ', 'Yao ', 'Yang ', 'Hang ', 'Gao ', 'Shi ', 'Ben ', 'Tai ', 'Tou ', 'Yan ', 'Bi ', 'Yi ', 'Kua ', 'Jia ', 'Duo ', 'Kwu ', 'Kuang ', 'Yun ', 'Jia ', 'Pa ', 'En ', 'Lian ', 'Huan ', 'Di ', 'Yan ', 'Pao ', 'Quan ', 'Qi ', 'Nai ', 'Feng ', 'Xie ', 'Fen ', 'Dian ', '[?] ', 'Kui ', 'Zou ', 'Huan ', 'Qi ', 'Kai ', 'Zha ', 'Ben ', 'Yi ', 'Jiang ', 'Tao ', 'Zang ', 'Ben ', 'Xi ', 'Xiang ', 'Fei ', 'Diao ', 'Xun ', 'Keng ', 'Dian ', 'Ao ', 'She ', 'Weng ', 'Pan ', 'Ao ', 'Wu ', 'Ao ', 'Jiang ', 'Lian ', 'Duo ', 'Yun ', 'Jiang ', 'Shi ', 'Fen ', 'Huo ', 'Bi ', 'Lian ', 'Duo ', 'Nu ', 'Nu ', 'Ding ', 'Nai ', 'Qian ', 'Jian ', 'Ta ', 'Jiu ', 'Nan ', 'Cha ', 'Hao ', 'Xian ', 'Fan ', 'Ji ', 'Shuo ', 'Ru ', 'Fei ', 'Wang ', 'Hong ', 'Zhuang ', 'Fu ', 'Ma ', 'Dan ', 'Ren ', 'Fu ', 'Jing ', 'Yan ', 'Xie ', 'Wen ', 'Zhong ', 'Pa ', 'Du ', 'Ji ', 'Keng ', 'Zhong ', 'Yao ', 'Jin ', 'Yun ', 'Miao ', 'Pei ', 'Shi ', 'Yue ', 'Zhuang ', 'Niu ', 'Yan ', 'Na ', 'Xin ', 'Fen ', 'Bi ', 'Yu ', 'Tuo ', 'Feng ', 'Yuan ', 'Fang ', 'Wu ', 'Yu ', 'Gui ', 'Du ', 'Ba ', 'Ni ', 'Zhou ', 'Zhuo ', 'Zhao ', 'Da ', 'Nai ', 'Yuan ', 'Tou ', 'Xuan ', 'Zhi ', 'E ', 'Mei ', 'Mo ', 'Qi ', 'Bi ', 'Shen ', 'Qie ', 'E ', 'He ', 'Xu ', 'Fa ', 'Zheng ', 'Min ', 'Ban ', 'Mu ', 'Fu ', 'Ling ', 'Zi ', 'Zi ', 'Shi ', 'Ran ', 'Shan ', 'Yang ', 'Man ', 'Jie ', 'Gu ', 'Si ', 'Xing ', 'Wei ', 'Zi ', 'Ju ', 'Shan ', 'Pin ', 'Ren ', 'Yao ', 'Tong ', 'Jiang ', 'Shu ', 'Ji ', 'Gai ', 'Shang ', 'Kuo ', 'Juan ', 'Jiao ', 'Gou ', 'Mu ', 'Jian ', 'Jian ', 'Yi ', 'Nian ', 'Zhi ', 'Ji ', 'Ji ', 'Xian ', 'Heng ', 'Guang ', 'Jun ', 'Kua ', 'Yan ', 'Ming ', 'Lie ', 'Pei ', 'Yan ', 'You ', 'Yan ', 'Cha ', 'Shen ', 'Yin ', 'Chi ', 'Gui ', 'Quan ', 'Zi ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x05a.php b/vendor/voku/portable-ascii/src/voku/helper/data/x05a.php new file mode 100644 index 0000000..5652021 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x05a.php @@ -0,0 +1 @@ +<?php return ['Song ', 'Wei ', 'Hong ', 'Wa ', 'Lou ', 'Ya ', 'Rao ', 'Jiao ', 'Luan ', 'Ping ', 'Xian ', 'Shao ', 'Li ', 'Cheng ', 'Xiao ', 'Mang ', 'Fu ', 'Suo ', 'Wu ', 'Wei ', 'Ke ', 'Lai ', 'Chuo ', 'Ding ', 'Niang ', 'Xing ', 'Nan ', 'Yu ', 'Nuo ', 'Pei ', 'Nei ', 'Juan ', 'Shen ', 'Zhi ', 'Han ', 'Di ', 'Zhuang ', 'E ', 'Pin ', 'Tui ', 'Han ', 'Mian ', 'Wu ', 'Yan ', 'Wu ', 'Xi ', 'Yan ', 'Yu ', 'Si ', 'Yu ', 'Wa ', '[?] ', 'Xian ', 'Ju ', 'Qu ', 'Shui ', 'Qi ', 'Xian ', 'Zhui ', 'Dong ', 'Chang ', 'Lu ', 'Ai ', 'E ', 'E ', 'Lou ', 'Mian ', 'Cong ', 'Pou ', 'Ju ', 'Po ', 'Cai ', 'Ding ', 'Wan ', 'Biao ', 'Xiao ', 'Shu ', 'Qi ', 'Hui ', 'Fu ', 'E ', 'Wo ', 'Tan ', 'Fei ', 'Wei ', 'Jie ', 'Tian ', 'Ni ', 'Quan ', 'Jing ', 'Hun ', 'Jing ', 'Qian ', 'Dian ', 'Xing ', 'Hu ', 'Wa ', 'Lai ', 'Bi ', 'Yin ', 'Chou ', 'Chuo ', 'Fu ', 'Jing ', 'Lun ', 'Yan ', 'Lan ', 'Kun ', 'Yin ', 'Ya ', 'Ju ', 'Li ', 'Dian ', 'Xian ', 'Hwa ', 'Hua ', 'Ying ', 'Chan ', 'Shen ', 'Ting ', 'Dang ', 'Yao ', 'Wu ', 'Nan ', 'Ruo ', 'Jia ', 'Tou ', 'Xu ', 'Yu ', 'Wei ', 'Ti ', 'Rou ', 'Mei ', 'Dan ', 'Ruan ', 'Qin ', 'Hui ', 'Wu ', 'Qian ', 'Chun ', 'Mao ', 'Fu ', 'Jie ', 'Duan ', 'Xi ', 'Zhong ', 'Mei ', 'Huang ', 'Mian ', 'An ', 'Ying ', 'Xuan ', 'Jie ', 'Wei ', 'Mei ', 'Yuan ', 'Zhen ', 'Qiu ', 'Ti ', 'Xie ', 'Tuo ', 'Lian ', 'Mao ', 'Ran ', 'Si ', 'Pian ', 'Wei ', 'Wa ', 'Jiu ', 'Hu ', 'Ao ', '[?] ', 'Bou ', 'Xu ', 'Tou ', 'Gui ', 'Zou ', 'Yao ', 'Pi ', 'Xi ', 'Yuan ', 'Ying ', 'Rong ', 'Ru ', 'Chi ', 'Liu ', 'Mei ', 'Pan ', 'Ao ', 'Ma ', 'Gou ', 'Kui ', 'Qin ', 'Jia ', 'Sao ', 'Zhen ', 'Yuan ', 'Cha ', 'Yong ', 'Ming ', 'Ying ', 'Ji ', 'Su ', 'Niao ', 'Xian ', 'Tao ', 'Pang ', 'Lang ', 'Nao ', 'Bao ', 'Ai ', 'Pi ', 'Pin ', 'Yi ', 'Piao ', 'Yu ', 'Lei ', 'Xuan ', 'Man ', 'Yi ', 'Zhang ', 'Kang ', 'Yong ', 'Ni ', 'Li ', 'Di ', 'Gui ', 'Yan ', 'Jin ', 'Zhuan ', 'Chang ', 'Ce ', 'Han ', 'Nen ', 'Lao ', 'Mo ', 'Zhe ', 'Hu ', 'Hu ', 'Ao ', 'Nen ', 'Qiang ', 'Ma ', 'Pie ', 'Gu ', 'Wu ', 'Jiao ', 'Tuo ', 'Zhan ', 'Mao ', 'Xian ', 'Xian ', 'Mo ', 'Liao ', 'Lian ', 'Hua ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x05b.php b/vendor/voku/portable-ascii/src/voku/helper/data/x05b.php new file mode 100644 index 0000000..6d59d16 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x05b.php @@ -0,0 +1 @@ +<?php return ['Gui ', 'Deng ', 'Zhi ', 'Xu ', 'Yi ', 'Hua ', 'Xi ', 'Hui ', 'Rao ', 'Xi ', 'Yan ', 'Chan ', 'Jiao ', 'Mei ', 'Fan ', 'Fan ', 'Xian ', 'Yi ', 'Wei ', 'Jiao ', 'Fu ', 'Shi ', 'Bi ', 'Shan ', 'Sui ', 'Qiang ', 'Lian ', 'Huan ', 'Xin ', 'Niao ', 'Dong ', 'Yi ', 'Can ', 'Ai ', 'Niang ', 'Neng ', 'Ma ', 'Tiao ', 'Chou ', 'Jin ', 'Ci ', 'Yu ', 'Pin ', 'Yong ', 'Xu ', 'Nai ', 'Yan ', 'Tai ', 'Ying ', 'Can ', 'Niao ', 'Wo ', 'Ying ', 'Mian ', 'Kaka ', 'Ma ', 'Shen ', 'Xing ', 'Ni ', 'Du ', 'Liu ', 'Yuan ', 'Lan ', 'Yan ', 'Shuang ', 'Ling ', 'Jiao ', 'Niang ', 'Lan ', 'Xian ', 'Ying ', 'Shuang ', 'Shuai ', 'Quan ', 'Mi ', 'Li ', 'Luan ', 'Yan ', 'Zhu ', 'Lan ', 'Zi ', 'Jie ', 'Jue ', 'Jue ', 'Kong ', 'Yun ', 'Zi ', 'Zi ', 'Cun ', 'Sun ', 'Fu ', 'Bei ', 'Zi ', 'Xiao ', 'Xin ', 'Meng ', 'Si ', 'Tai ', 'Bao ', 'Ji ', 'Gu ', 'Nu ', 'Xue ', '[?] ', 'Zhuan ', 'Hai ', 'Luan ', 'Sun ', 'Huai ', 'Mie ', 'Cong ', 'Qian ', 'Shu ', 'Chan ', 'Ya ', 'Zi ', 'Ni ', 'Fu ', 'Zi ', 'Li ', 'Xue ', 'Bo ', 'Ru ', 'Lai ', 'Nie ', 'Nie ', 'Ying ', 'Luan ', 'Mian ', 'Zhu ', 'Rong ', 'Ta ', 'Gui ', 'Zhai ', 'Qiong ', 'Yu ', 'Shou ', 'An ', 'Tu ', 'Song ', 'Wan ', 'Rou ', 'Yao ', 'Hong ', 'Yi ', 'Jing ', 'Zhun ', 'Mi ', 'Zhu ', 'Dang ', 'Hong ', 'Zong ', 'Guan ', 'Zhou ', 'Ding ', 'Wan ', 'Yi ', 'Bao ', 'Shi ', 'Shi ', 'Chong ', 'Shen ', 'Ke ', 'Xuan ', 'Shi ', 'You ', 'Huan ', 'Yi ', 'Tiao ', 'Shi ', 'Xian ', 'Gong ', 'Cheng ', 'Qun ', 'Gong ', 'Xiao ', 'Zai ', 'Zha ', 'Bao ', 'Hai ', 'Yan ', 'Xiao ', 'Jia ', 'Shen ', 'Chen ', 'Rong ', 'Huang ', 'Mi ', 'Kou ', 'Kuan ', 'Bin ', 'Su ', 'Cai ', 'Zan ', 'Ji ', 'Yuan ', 'Ji ', 'Yin ', 'Mi ', 'Kou ', 'Qing ', 'Que ', 'Zhen ', 'Jian ', 'Fu ', 'Ning ', 'Bing ', 'Huan ', 'Mei ', 'Qin ', 'Han ', 'Yu ', 'Shi ', 'Ning ', 'Qin ', 'Ning ', 'Zhi ', 'Yu ', 'Bao ', 'Kuan ', 'Ning ', 'Qin ', 'Mo ', 'Cha ', 'Ju ', 'Gua ', 'Qin ', 'Hu ', 'Wu ', 'Liao ', 'Shi ', 'Zhu ', 'Zhai ', 'Shen ', 'Wei ', 'Xie ', 'Kuan ', 'Hui ', 'Liao ', 'Jun ', 'Huan ', 'Yi ', 'Yi ', 'Bao ', 'Qin ', 'Chong ', 'Bao ', 'Feng ', 'Cun ', 'Dui ', 'Si ', 'Xun ', 'Dao ', 'Lu ', 'Dui ', 'Shou ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x05c.php b/vendor/voku/portable-ascii/src/voku/helper/data/x05c.php new file mode 100644 index 0000000..f669962 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x05c.php @@ -0,0 +1 @@ +<?php return ['Po ', 'Feng ', 'Zhuan ', 'Fu ', 'She ', 'Ke ', 'Jiang ', 'Jiang ', 'Zhuan ', 'Wei ', 'Zun ', 'Xun ', 'Shu ', 'Dui ', 'Dao ', 'Xiao ', 'Ji ', 'Shao ', 'Er ', 'Er ', 'Er ', 'Ga ', 'Jian ', 'Shu ', 'Chen ', 'Shang ', 'Shang ', 'Mo ', 'Ga ', 'Chang ', 'Liao ', 'Xian ', 'Xian ', '[?] ', 'Wang ', 'Wang ', 'You ', 'Liao ', 'Liao ', 'Yao ', 'Mang ', 'Wang ', 'Wang ', 'Wang ', 'Ga ', 'Yao ', 'Duo ', 'Kui ', 'Zhong ', 'Jiu ', 'Gan ', 'Gu ', 'Gan ', 'Tui ', 'Gan ', 'Gan ', 'Shi ', 'Yin ', 'Chi ', 'Kao ', 'Ni ', 'Jin ', 'Wei ', 'Niao ', 'Ju ', 'Pi ', 'Ceng ', 'Xi ', 'Bi ', 'Ju ', 'Jie ', 'Tian ', 'Qu ', 'Ti ', 'Jie ', 'Wu ', 'Diao ', 'Shi ', 'Shi ', 'Ping ', 'Ji ', 'Xie ', 'Chen ', 'Xi ', 'Ni ', 'Zhan ', 'Xi ', '[?] ', 'Man ', 'E ', 'Lou ', 'Ping ', 'Ti ', 'Fei ', 'Shu ', 'Xie ', 'Tu ', 'Lu ', 'Lu ', 'Xi ', 'Ceng ', 'Lu ', 'Ju ', 'Xie ', 'Ju ', 'Jue ', 'Liao ', 'Jue ', 'Shu ', 'Xi ', 'Che ', 'Tun ', 'Ni ', 'Shan ', '[?] ', 'Xian ', 'Li ', 'Xue ', 'Nata ', '[?] ', 'Long ', 'Yi ', 'Qi ', 'Ren ', 'Wu ', 'Han ', 'Shen ', 'Yu ', 'Chu ', 'Sui ', 'Qi ', '[?] ', 'Yue ', 'Ban ', 'Yao ', 'Ang ', 'Ya ', 'Wu ', 'Jie ', 'E ', 'Ji ', 'Qian ', 'Fen ', 'Yuan ', 'Qi ', 'Cen ', 'Qian ', 'Qi ', 'Cha ', 'Jie ', 'Qu ', 'Gang ', 'Xian ', 'Ao ', 'Lan ', 'Dao ', 'Ba ', 'Zuo ', 'Zuo ', 'Yang ', 'Ju ', 'Gang ', 'Ke ', 'Gou ', 'Xue ', 'Bei ', 'Li ', 'Tiao ', 'Ju ', 'Yan ', 'Fu ', 'Xiu ', 'Jia ', 'Ling ', 'Tuo ', 'Pei ', 'You ', 'Dai ', 'Kuang ', 'Yue ', 'Qu ', 'Hu ', 'Po ', 'Min ', 'An ', 'Tiao ', 'Ling ', 'Chi ', 'Yuri ', 'Dong ', 'Cem ', 'Kui ', 'Xiu ', 'Mao ', 'Tong ', 'Xue ', 'Yi ', 'Kura ', 'He ', 'Ke ', 'Luo ', 'E ', 'Fu ', 'Xun ', 'Die ', 'Lu ', 'An ', 'Er ', 'Gai ', 'Quan ', 'Tong ', 'Yi ', 'Mu ', 'Shi ', 'An ', 'Wei ', 'Hu ', 'Zhi ', 'Mi ', 'Li ', 'Ji ', 'Tong ', 'Wei ', 'You ', 'Sang ', 'Xia ', 'Li ', 'Yao ', 'Jiao ', 'Zheng ', 'Luan ', 'Jiao ', 'E ', 'E ', 'Yu ', 'Ye ', 'Bu ', 'Qiao ', 'Qun ', 'Feng ', 'Feng ', 'Nao ', 'Li ', 'You ', 'Xian ', 'Hong ', 'Dao ', 'Shen ', 'Cheng ', 'Tu ', 'Geng ', 'Jun ', 'Hao ', 'Xia ', 'Yin ', 'Yu ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x05d.php b/vendor/voku/portable-ascii/src/voku/helper/data/x05d.php new file mode 100644 index 0000000..a0b7062 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x05d.php @@ -0,0 +1 @@ +<?php return ['Lang ', 'Kan ', 'Lao ', 'Lai ', 'Xian ', 'Que ', 'Kong ', 'Chong ', 'Chong ', 'Ta ', 'Lin ', 'Hua ', 'Ju ', 'Lai ', 'Qi ', 'Min ', 'Kun ', 'Kun ', 'Zu ', 'Gu ', 'Cui ', 'Ya ', 'Ya ', 'Gang ', 'Lun ', 'Lun ', 'Leng ', 'Jue ', 'Duo ', 'Zheng ', 'Guo ', 'Yin ', 'Dong ', 'Han ', 'Zheng ', 'Wei ', 'Yao ', 'Pi ', 'Yan ', 'Song ', 'Jie ', 'Beng ', 'Zu ', 'Jue ', 'Dong ', 'Zhan ', 'Gu ', 'Yin ', '[?] ', 'Ze ', 'Huang ', 'Yu ', 'Wei ', 'Yang ', 'Feng ', 'Qiu ', 'Dun ', 'Ti ', 'Yi ', 'Zhi ', 'Shi ', 'Zai ', 'Yao ', 'E ', 'Zhu ', 'Kan ', 'Lu ', 'Yan ', 'Mei ', 'Gan ', 'Ji ', 'Ji ', 'Huan ', 'Ting ', 'Sheng ', 'Mei ', 'Qian ', 'Wu ', 'Yu ', 'Zong ', 'Lan ', 'Jue ', 'Yan ', 'Yan ', 'Wei ', 'Zong ', 'Cha ', 'Sui ', 'Rong ', 'Yamashina ', 'Qin ', 'Yu ', 'Kewashii ', 'Lou ', 'Tu ', 'Dui ', 'Xi ', 'Weng ', 'Cang ', 'Dang ', 'Hong ', 'Jie ', 'Ai ', 'Liu ', 'Wu ', 'Song ', 'Qiao ', 'Zi ', 'Wei ', 'Beng ', 'Dian ', 'Cuo ', 'Qian ', 'Yong ', 'Nie ', 'Cuo ', 'Ji ', '[?] ', 'Tao ', 'Song ', 'Zong ', 'Jiang ', 'Liao ', 'Kang ', 'Chan ', 'Die ', 'Cen ', 'Ding ', 'Tu ', 'Lou ', 'Zhang ', 'Zhan ', 'Zhan ', 'Ao ', 'Cao ', 'Qu ', 'Qiang ', 'Zui ', 'Zui ', 'Dao ', 'Dao ', 'Xi ', 'Yu ', 'Bo ', 'Long ', 'Xiang ', 'Ceng ', 'Bo ', 'Qin ', 'Jiao ', 'Yan ', 'Lao ', 'Zhan ', 'Lin ', 'Liao ', 'Liao ', 'Jin ', 'Deng ', 'Duo ', 'Zun ', 'Jiao ', 'Gui ', 'Yao ', 'Qiao ', 'Yao ', 'Jue ', 'Zhan ', 'Yi ', 'Xue ', 'Nao ', 'Ye ', 'Ye ', 'Yi ', 'E ', 'Xian ', 'Ji ', 'Xie ', 'Ke ', 'Xi ', 'Di ', 'Ao ', 'Zui ', '[?] ', 'Ni ', 'Rong ', 'Dao ', 'Ling ', 'Za ', 'Yu ', 'Yue ', 'Yin ', '[?] ', 'Jie ', 'Li ', 'Sui ', 'Long ', 'Long ', 'Dian ', 'Ying ', 'Xi ', 'Ju ', 'Chan ', 'Ying ', 'Kui ', 'Yan ', 'Wei ', 'Nao ', 'Quan ', 'Chao ', 'Cuan ', 'Luan ', 'Dian ', 'Dian ', '[?] ', 'Yan ', 'Yan ', 'Yan ', 'Nao ', 'Yan ', 'Chuan ', 'Gui ', 'Chuan ', 'Zhou ', 'Huang ', 'Jing ', 'Xun ', 'Chao ', 'Chao ', 'Lie ', 'Gong ', 'Zuo ', 'Qiao ', 'Ju ', 'Gong ', 'Kek ', 'Wu ', 'Pwu ', 'Pwu ', 'Chai ', 'Qiu ', 'Qiu ', 'Ji ', 'Yi ', 'Si ', 'Ba ', 'Zhi ', 'Zhao ', 'Xiang ', 'Yi ', 'Jin ', 'Xun ', 'Juan ', 'Phas ', 'Xun ', 'Jin ', 'Fu ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x05e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x05e.php new file mode 100644 index 0000000..2ebbc34 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x05e.php @@ -0,0 +1 @@ +<?php return ['Za ', 'Bi ', 'Shi ', 'Bu ', 'Ding ', 'Shuai ', 'Fan ', 'Nie ', 'Shi ', 'Fen ', 'Pa ', 'Zhi ', 'Xi ', 'Hu ', 'Dan ', 'Wei ', 'Zhang ', 'Tang ', 'Dai ', 'Ma ', 'Pei ', 'Pa ', 'Tie ', 'Fu ', 'Lian ', 'Zhi ', 'Zhou ', 'Bo ', 'Zhi ', 'Di ', 'Mo ', 'Yi ', 'Yi ', 'Ping ', 'Qia ', 'Juan ', 'Ru ', 'Shuai ', 'Dai ', 'Zheng ', 'Shui ', 'Qiao ', 'Zhen ', 'Shi ', 'Qun ', 'Xi ', 'Bang ', 'Dai ', 'Gui ', 'Chou ', 'Ping ', 'Zhang ', 'Sha ', 'Wan ', 'Dai ', 'Wei ', 'Chang ', 'Sha ', 'Qi ', 'Ze ', 'Guo ', 'Mao ', 'Du ', 'Hou ', 'Zheng ', 'Xu ', 'Mi ', 'Wei ', 'Wo ', 'Fu ', 'Yi ', 'Bang ', 'Ping ', 'Tazuna ', 'Gong ', 'Pan ', 'Huang ', 'Dao ', 'Mi ', 'Jia ', 'Teng ', 'Hui ', 'Zhong ', 'Shan ', 'Man ', 'Mu ', 'Biao ', 'Guo ', 'Ze ', 'Mu ', 'Bang ', 'Zhang ', 'Jiong ', 'Chan ', 'Fu ', 'Zhi ', 'Hu ', 'Fan ', 'Chuang ', 'Bi ', 'Hei ', '[?] ', 'Mi ', 'Qiao ', 'Chan ', 'Fen ', 'Meng ', 'Bang ', 'Chou ', 'Mie ', 'Chu ', 'Jie ', 'Xian ', 'Lan ', 'Gan ', 'Ping ', 'Nian ', 'Qian ', 'Bing ', 'Bing ', 'Xing ', 'Gan ', 'Yao ', 'Huan ', 'You ', 'You ', 'Ji ', 'Yan ', 'Pi ', 'Ting ', 'Ze ', 'Guang ', 'Zhuang ', 'Mo ', 'Qing ', 'Bi ', 'Qin ', 'Dun ', 'Chuang ', 'Gui ', 'Ya ', 'Bai ', 'Jie ', 'Xu ', 'Lu ', 'Wu ', '[?] ', 'Ku ', 'Ying ', 'Di ', 'Pao ', 'Dian ', 'Ya ', 'Miao ', 'Geng ', 'Ci ', 'Fu ', 'Tong ', 'Pang ', 'Fei ', 'Xiang ', 'Yi ', 'Zhi ', 'Tiao ', 'Zhi ', 'Xiu ', 'Du ', 'Zuo ', 'Xiao ', 'Tu ', 'Gui ', 'Ku ', 'Pang ', 'Ting ', 'You ', 'Bu ', 'Ding ', 'Cheng ', 'Lai ', 'Bei ', 'Ji ', 'An ', 'Shu ', 'Kang ', 'Yong ', 'Tuo ', 'Song ', 'Shu ', 'Qing ', 'Yu ', 'Yu ', 'Miao ', 'Sou ', 'Ce ', 'Xiang ', 'Fei ', 'Jiu ', 'He ', 'Hui ', 'Liu ', 'Sha ', 'Lian ', 'Lang ', 'Sou ', 'Jian ', 'Pou ', 'Qing ', 'Jiu ', 'Jiu ', 'Qin ', 'Ao ', 'Kuo ', 'Lou ', 'Yin ', 'Liao ', 'Dai ', 'Lu ', 'Yi ', 'Chu ', 'Chan ', 'Tu ', 'Si ', 'Xin ', 'Miao ', 'Chang ', 'Wu ', 'Fei ', 'Guang ', 'Koc ', 'Kuai ', 'Bi ', 'Qiang ', 'Xie ', 'Lin ', 'Lin ', 'Liao ', 'Lu ', '[?] ', 'Ying ', 'Xian ', 'Ting ', 'Yong ', 'Li ', 'Ting ', 'Yin ', 'Xun ', 'Yan ', 'Ting ', 'Di ', 'Po ', 'Jian ', 'Hui ', 'Nai ', 'Hui ', 'Gong ', 'Nian ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x05f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x05f.php new file mode 100644 index 0000000..aee88ea --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x05f.php @@ -0,0 +1 @@ +<?php return ['Kai ', 'Bian ', 'Yi ', 'Qi ', 'Nong ', 'Fen ', 'Ju ', 'Yan ', 'Yi ', 'Zang ', 'Bi ', 'Yi ', 'Yi ', 'Er ', 'San ', 'Shi ', 'Er ', 'Shi ', 'Shi ', 'Gong ', 'Diao ', 'Yin ', 'Hu ', 'Fu ', 'Hong ', 'Wu ', 'Tui ', 'Chi ', 'Jiang ', 'Ba ', 'Shen ', 'Di ', 'Zhang ', 'Jue ', 'Tao ', 'Fu ', 'Di ', 'Mi ', 'Xian ', 'Hu ', 'Chao ', 'Nu ', 'Jing ', 'Zhen ', 'Yi ', 'Mi ', 'Quan ', 'Wan ', 'Shao ', 'Ruo ', 'Xuan ', 'Jing ', 'Dun ', 'Zhang ', 'Jiang ', 'Qiang ', 'Peng ', 'Dan ', 'Qiang ', 'Bi ', 'Bi ', 'She ', 'Dan ', 'Jian ', 'Gou ', 'Sei ', 'Fa ', 'Bi ', 'Kou ', 'Nagi ', 'Bie ', 'Xiao ', 'Dan ', 'Kuo ', 'Qiang ', 'Hong ', 'Mi ', 'Kuo ', 'Wan ', 'Jue ', 'Ji ', 'Ji ', 'Gui ', 'Dang ', 'Lu ', 'Lu ', 'Tuan ', 'Hui ', 'Zhi ', 'Hui ', 'Hui ', 'Yi ', 'Yi ', 'Yi ', 'Yi ', 'Huo ', 'Huo ', 'Shan ', 'Xing ', 'Wen ', 'Tong ', 'Yan ', 'Yan ', 'Yu ', 'Chi ', 'Cai ', 'Biao ', 'Diao ', 'Bin ', 'Peng ', 'Yong ', 'Piao ', 'Zhang ', 'Ying ', 'Chi ', 'Chi ', 'Zhuo ', 'Tuo ', 'Ji ', 'Pang ', 'Zhong ', 'Yi ', 'Wang ', 'Che ', 'Bi ', 'Chi ', 'Ling ', 'Fu ', 'Wang ', 'Zheng ', 'Cu ', 'Wang ', 'Jing ', 'Dai ', 'Xi ', 'Xun ', 'Hen ', 'Yang ', 'Huai ', 'Lu ', 'Hou ', 'Wa ', 'Cheng ', 'Zhi ', 'Xu ', 'Jing ', 'Tu ', 'Cong ', '[?] ', 'Lai ', 'Cong ', 'De ', 'Pai ', 'Xi ', '[?] ', 'Qi ', 'Chang ', 'Zhi ', 'Cong ', 'Zhou ', 'Lai ', 'Yu ', 'Xie ', 'Jie ', 'Jian ', 'Chi ', 'Jia ', 'Bian ', 'Huang ', 'Fu ', 'Xun ', 'Wei ', 'Pang ', 'Yao ', 'Wei ', 'Xi ', 'Zheng ', 'Piao ', 'Chi ', 'De ', 'Zheng ', 'Zheng ', 'Bie ', 'De ', 'Chong ', 'Che ', 'Jiao ', 'Wei ', 'Jiao ', 'Hui ', 'Mei ', 'Long ', 'Xiang ', 'Bao ', 'Qu ', 'Xin ', 'Shu ', 'Bi ', 'Yi ', 'Le ', 'Ren ', 'Dao ', 'Ding ', 'Gai ', 'Ji ', 'Ren ', 'Ren ', 'Chan ', 'Tan ', 'Te ', 'Te ', 'Gan ', 'Qi ', 'Shi ', 'Cun ', 'Zhi ', 'Wang ', 'Mang ', 'Xi ', 'Fan ', 'Ying ', 'Tian ', 'Min ', 'Min ', 'Zhong ', 'Chong ', 'Wu ', 'Ji ', 'Wu ', 'Xi ', 'Ye ', 'You ', 'Wan ', 'Cong ', 'Zhong ', 'Kuai ', 'Yu ', 'Bian ', 'Zhi ', 'Qi ', 'Cui ', 'Chen ', 'Tai ', 'Tun ', 'Qian ', 'Nian ', 'Hun ', 'Xiong ', 'Niu ', 'Wang ', 'Xian ', 'Xin ', 'Kang ', 'Hu ', 'Kai ', 'Fen ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x060.php b/vendor/voku/portable-ascii/src/voku/helper/data/x060.php new file mode 100644 index 0000000..91122b6 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x060.php @@ -0,0 +1 @@ +<?php return ['Huai ', 'Tai ', 'Song ', 'Wu ', 'Ou ', 'Chang ', 'Chuang ', 'Ju ', 'Yi ', 'Bao ', 'Chao ', 'Min ', 'Pei ', 'Zuo ', 'Zen ', 'Yang ', 'Kou ', 'Ban ', 'Nu ', 'Nao ', 'Zheng ', 'Pa ', 'Bu ', 'Tie ', 'Gu ', 'Hu ', 'Ju ', 'Da ', 'Lian ', 'Si ', 'Chou ', 'Di ', 'Dai ', 'Yi ', 'Tu ', 'You ', 'Fu ', 'Ji ', 'Peng ', 'Xing ', 'Yuan ', 'Ni ', 'Guai ', 'Fu ', 'Xi ', 'Bi ', 'You ', 'Qie ', 'Xuan ', 'Cong ', 'Bing ', 'Huang ', 'Xu ', 'Chu ', 'Pi ', 'Xi ', 'Xi ', 'Tan ', 'Koraeru ', 'Zong ', 'Dui ', '[?] ', 'Ki ', 'Yi ', 'Chi ', 'Ren ', 'Xun ', 'Shi ', 'Xi ', 'Lao ', 'Heng ', 'Kuang ', 'Mu ', 'Zhi ', 'Xie ', 'Lian ', 'Tiao ', 'Huang ', 'Die ', 'Hao ', 'Kong ', 'Gui ', 'Heng ', 'Xi ', 'Xiao ', 'Shu ', 'S ', 'Kua ', 'Qiu ', 'Yang ', 'Hui ', 'Hui ', 'Chi ', 'Jia ', 'Yi ', 'Xiong ', 'Guai ', 'Lin ', 'Hui ', 'Zi ', 'Xu ', 'Chi ', 'Xiang ', 'Nu ', 'Hen ', 'En ', 'Ke ', 'Tong ', 'Tian ', 'Gong ', 'Quan ', 'Xi ', 'Qia ', 'Yue ', 'Peng ', 'Ken ', 'De ', 'Hui ', 'E ', 'Kyuu ', 'Tong ', 'Yan ', 'Kai ', 'Ce ', 'Nao ', 'Yun ', 'Mang ', 'Yong ', 'Yong ', 'Yuan ', 'Pi ', 'Kun ', 'Qiao ', 'Yue ', 'Yu ', 'Yu ', 'Jie ', 'Xi ', 'Zhe ', 'Lin ', 'Ti ', 'Han ', 'Hao ', 'Qie ', 'Ti ', 'Bu ', 'Yi ', 'Qian ', 'Hui ', 'Xi ', 'Bei ', 'Man ', 'Yi ', 'Heng ', 'Song ', 'Quan ', 'Cheng ', 'Hui ', 'Wu ', 'Wu ', 'You ', 'Li ', 'Liang ', 'Huan ', 'Cong ', 'Yi ', 'Yue ', 'Li ', 'Nin ', 'Nao ', 'E ', 'Que ', 'Xuan ', 'Qian ', 'Wu ', 'Min ', 'Cong ', 'Fei ', 'Bei ', 'Duo ', 'Cui ', 'Chang ', 'Men ', 'Li ', 'Ji ', 'Guan ', 'Guan ', 'Xing ', 'Dao ', 'Qi ', 'Kong ', 'Tian ', 'Lun ', 'Xi ', 'Kan ', 'Kun ', 'Ni ', 'Qing ', 'Chou ', 'Dun ', 'Guo ', 'Chan ', 'Liang ', 'Wan ', 'Yuan ', 'Jin ', 'Ji ', 'Lin ', 'Yu ', 'Huo ', 'He ', 'Quan ', 'Tan ', 'Ti ', 'Ti ', 'Nie ', 'Wang ', 'Chuo ', 'Bu ', 'Hun ', 'Xi ', 'Tang ', 'Xin ', 'Wei ', 'Hui ', 'E ', 'Rui ', 'Zong ', 'Jian ', 'Yong ', 'Dian ', 'Ju ', 'Can ', 'Cheng ', 'De ', 'Bei ', 'Qie ', 'Can ', 'Dan ', 'Guan ', 'Duo ', 'Nao ', 'Yun ', 'Xiang ', 'Zhui ', 'Die ', 'Huang ', 'Chun ', 'Qiong ', 'Re ', 'Xing ', 'Ce ', 'Bian ', 'Hun ', 'Zong ', 'Ti ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x061.php b/vendor/voku/portable-ascii/src/voku/helper/data/x061.php new file mode 100644 index 0000000..b2d25d8 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x061.php @@ -0,0 +1 @@ +<?php return ['Qiao ', 'Chou ', 'Bei ', 'Xuan ', 'Wei ', 'Ge ', 'Qian ', 'Wei ', 'Yu ', 'Yu ', 'Bi ', 'Xuan ', 'Huan ', 'Min ', 'Bi ', 'Yi ', 'Mian ', 'Yong ', 'Kai ', 'Dang ', 'Yin ', 'E ', 'Chen ', 'Mou ', 'Ke ', 'Ke ', 'Yu ', 'Ai ', 'Qie ', 'Yan ', 'Nuo ', 'Gan ', 'Yun ', 'Zong ', 'Sai ', 'Leng ', 'Fen ', '[?] ', 'Kui ', 'Kui ', 'Que ', 'Gong ', 'Yun ', 'Su ', 'Su ', 'Qi ', 'Yao ', 'Song ', 'Huang ', 'Ji ', 'Gu ', 'Ju ', 'Chuang ', 'Ni ', 'Xie ', 'Kai ', 'Zheng ', 'Yong ', 'Cao ', 'Sun ', 'Shen ', 'Bo ', 'Kai ', 'Yuan ', 'Xie ', 'Hun ', 'Yong ', 'Yang ', 'Li ', 'Sao ', 'Tao ', 'Yin ', 'Ci ', 'Xu ', 'Qian ', 'Tai ', 'Huang ', 'Yun ', 'Shen ', 'Ming ', '[?] ', 'She ', 'Cong ', 'Piao ', 'Mo ', 'Mu ', 'Guo ', 'Chi ', 'Can ', 'Can ', 'Can ', 'Cui ', 'Min ', 'Te ', 'Zhang ', 'Tong ', 'Ao ', 'Shuang ', 'Man ', 'Guan ', 'Que ', 'Zao ', 'Jiu ', 'Hui ', 'Kai ', 'Lian ', 'Ou ', 'Song ', 'Jin ', 'Yin ', 'Lu ', 'Shang ', 'Wei ', 'Tuan ', 'Man ', 'Qian ', 'She ', 'Yong ', 'Qing ', 'Kang ', 'Di ', 'Zhi ', 'Lou ', 'Juan ', 'Qi ', 'Qi ', 'Yu ', 'Ping ', 'Liao ', 'Cong ', 'You ', 'Chong ', 'Zhi ', 'Tong ', 'Cheng ', 'Qi ', 'Qu ', 'Peng ', 'Bei ', 'Bie ', 'Chun ', 'Jiao ', 'Zeng ', 'Chi ', 'Lian ', 'Ping ', 'Kui ', 'Hui ', 'Qiao ', 'Cheng ', 'Yin ', 'Yin ', 'Xi ', 'Xi ', 'Dan ', 'Tan ', 'Duo ', 'Dui ', 'Dui ', 'Su ', 'Jue ', 'Ce ', 'Xiao ', 'Fan ', 'Fen ', 'Lao ', 'Lao ', 'Chong ', 'Han ', 'Qi ', 'Xian ', 'Min ', 'Jing ', 'Liao ', 'Wu ', 'Can ', 'Jue ', 'Cu ', 'Xian ', 'Tan ', 'Sheng ', 'Pi ', 'Yi ', 'Chu ', 'Xian ', 'Nao ', 'Dan ', 'Tan ', 'Jing ', 'Song ', 'Han ', 'Jiao ', 'Wai ', 'Huan ', 'Dong ', 'Qin ', 'Qin ', 'Qu ', 'Cao ', 'Ken ', 'Xie ', 'Ying ', 'Ao ', 'Mao ', 'Yi ', 'Lin ', 'Se ', 'Jun ', 'Huai ', 'Men ', 'Lan ', 'Ai ', 'Lin ', 'Yan ', 'Gua ', 'Xia ', 'Chi ', 'Yu ', 'Yin ', 'Dai ', 'Meng ', 'Ai ', 'Meng ', 'Dui ', 'Qi ', 'Mo ', 'Lan ', 'Men ', 'Chou ', 'Zhi ', 'Nuo ', 'Nuo ', 'Yan ', 'Yang ', 'Bo ', 'Zhi ', 'Kuang ', 'Kuang ', 'You ', 'Fu ', 'Liu ', 'Mie ', 'Cheng ', '[?] ', 'Chan ', 'Meng ', 'Lan ', 'Huai ', 'Xuan ', 'Rang ', 'Chan ', 'Ji ', 'Ju ', 'Huan ', 'She ', 'Yi ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x062.php b/vendor/voku/portable-ascii/src/voku/helper/data/x062.php new file mode 100644 index 0000000..b8808e7 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x062.php @@ -0,0 +1 @@ +<?php return ['Lian ', 'Nan ', 'Mi ', 'Tang ', 'Jue ', 'Gang ', 'Gang ', 'Gang ', 'Ge ', 'Yue ', 'Wu ', 'Jian ', 'Xu ', 'Shu ', 'Rong ', 'Xi ', 'Cheng ', 'Wo ', 'Jie ', 'Ge ', 'Jian ', 'Qiang ', 'Huo ', 'Qiang ', 'Zhan ', 'Dong ', 'Qi ', 'Jia ', 'Die ', 'Zei ', 'Jia ', 'Ji ', 'Shi ', 'Kan ', 'Ji ', 'Kui ', 'Gai ', 'Deng ', 'Zhan ', 'Chuang ', 'Ge ', 'Jian ', 'Jie ', 'Yu ', 'Jian ', 'Yan ', 'Lu ', 'Xi ', 'Zhan ', 'Xi ', 'Xi ', 'Chuo ', 'Dai ', 'Qu ', 'Hu ', 'Hu ', 'Hu ', 'E ', 'Shi ', 'Li ', 'Mao ', 'Hu ', 'Li ', 'Fang ', 'Suo ', 'Bian ', 'Dian ', 'Jiong ', 'Shang ', 'Yi ', 'Yi ', 'Shan ', 'Hu ', 'Fei ', 'Yan ', 'Shou ', 'T ', 'Cai ', 'Zha ', 'Qiu ', 'Le ', 'Bu ', 'Ba ', 'Da ', 'Reng ', 'Fu ', 'Hameru ', 'Zai ', 'Tuo ', 'Zhang ', 'Diao ', 'Kang ', 'Yu ', 'Ku ', 'Han ', 'Shen ', 'Cha ', 'Yi ', 'Gu ', 'Kou ', 'Wu ', 'Tuo ', 'Qian ', 'Zhi ', 'Ren ', 'Kuo ', 'Men ', 'Sao ', 'Yang ', 'Niu ', 'Ban ', 'Che ', 'Rao ', 'Xi ', 'Qian ', 'Ban ', 'Jia ', 'Yu ', 'Fu ', 'Ao ', 'Xi ', 'Pi ', 'Zhi ', 'Zi ', 'E ', 'Dun ', 'Zhao ', 'Cheng ', 'Ji ', 'Yan ', 'Kuang ', 'Bian ', 'Chao ', 'Ju ', 'Wen ', 'Hu ', 'Yue ', 'Jue ', 'Ba ', 'Qin ', 'Zhen ', 'Zheng ', 'Yun ', 'Wan ', 'Nu ', 'Yi ', 'Shu ', 'Zhua ', 'Pou ', 'Tou ', 'Dou ', 'Kang ', 'Zhe ', 'Pou ', 'Fu ', 'Pao ', 'Ba ', 'Ao ', 'Ze ', 'Tuan ', 'Kou ', 'Lun ', 'Qiang ', '[?] ', 'Hu ', 'Bao ', 'Bing ', 'Zhi ', 'Peng ', 'Tan ', 'Pu ', 'Pi ', 'Tai ', 'Yao ', 'Zhen ', 'Zha ', 'Yang ', 'Bao ', 'He ', 'Ni ', 'Yi ', 'Di ', 'Chi ', 'Pi ', 'Za ', 'Mo ', 'Mo ', 'Shen ', 'Ya ', 'Chou ', 'Qu ', 'Min ', 'Chu ', 'Jia ', 'Fu ', 'Zhan ', 'Zhu ', 'Dan ', 'Chai ', 'Mu ', 'Nian ', 'La ', 'Fu ', 'Pao ', 'Ban ', 'Pai ', 'Ling ', 'Na ', 'Guai ', 'Qian ', 'Ju ', 'Tuo ', 'Ba ', 'Tuo ', 'Tuo ', 'Ao ', 'Ju ', 'Zhuo ', 'Pan ', 'Zhao ', 'Bai ', 'Bai ', 'Di ', 'Ni ', 'Ju ', 'Kuo ', 'Long ', 'Jian ', '[?] ', 'Yong ', 'Lan ', 'Ning ', 'Bo ', 'Ze ', 'Qian ', 'Hen ', 'Gua ', 'Shi ', 'Jie ', 'Zheng ', 'Nin ', 'Gong ', 'Gong ', 'Quan ', 'Shuan ', 'Cun ', 'Zan ', 'Kao ', 'Chi ', 'Xie ', 'Ce ', 'Hui ', 'Pin ', 'Zhuai ', 'Shi ', 'Na ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x063.php b/vendor/voku/portable-ascii/src/voku/helper/data/x063.php new file mode 100644 index 0000000..5702c45 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x063.php @@ -0,0 +1 @@ +<?php return ['Bo ', 'Chi ', 'Gua ', 'Zhi ', 'Kuo ', 'Duo ', 'Duo ', 'Zhi ', 'Qie ', 'An ', 'Nong ', 'Zhen ', 'Ge ', 'Jiao ', 'Ku ', 'Dong ', 'Ru ', 'Tiao ', 'Lie ', 'Zha ', 'Lu ', 'Die ', 'Wa ', 'Jue ', 'Mushiru ', 'Ju ', 'Zhi ', 'Luan ', 'Ya ', 'Zhua ', 'Ta ', 'Xie ', 'Nao ', 'Dang ', 'Jiao ', 'Zheng ', 'Ji ', 'Hui ', 'Xun ', 'Ku ', 'Ai ', 'Tuo ', 'Nuo ', 'Cuo ', 'Bo ', 'Geng ', 'Ti ', 'Zhen ', 'Cheng ', 'Suo ', 'Suo ', 'Keng ', 'Mei ', 'Long ', 'Ju ', 'Peng ', 'Jian ', 'Yi ', 'Ting ', 'Shan ', 'Nuo ', 'Wan ', 'Xie ', 'Cha ', 'Feng ', 'Jiao ', 'Wu ', 'Jun ', 'Jiu ', 'Tong ', 'Kun ', 'Huo ', 'Tu ', 'Zhuo ', 'Pou ', 'Le ', 'Ba ', 'Han ', 'Shao ', 'Nie ', 'Juan ', 'Ze ', 'Song ', 'Ye ', 'Jue ', 'Bu ', 'Huan ', 'Bu ', 'Zun ', 'Yi ', 'Zhai ', 'Lu ', 'Sou ', 'Tuo ', 'Lao ', 'Sun ', 'Bang ', 'Jian ', 'Huan ', 'Dao ', '[?] ', 'Wan ', 'Qin ', 'Peng ', 'She ', 'Lie ', 'Min ', 'Men ', 'Fu ', 'Bai ', 'Ju ', 'Dao ', 'Wo ', 'Ai ', 'Juan ', 'Yue ', 'Zong ', 'Chen ', 'Chui ', 'Jie ', 'Tu ', 'Ben ', 'Na ', 'Nian ', 'Nuo ', 'Zu ', 'Wo ', 'Xi ', 'Xian ', 'Cheng ', 'Dian ', 'Sao ', 'Lun ', 'Qing ', 'Gang ', 'Duo ', 'Shou ', 'Diao ', 'Pou ', 'Di ', 'Zhang ', 'Gun ', 'Ji ', 'Tao ', 'Qia ', 'Qi ', 'Pai ', 'Shu ', 'Qian ', 'Ling ', 'Yi ', 'Ya ', 'Jue ', 'Zheng ', 'Liang ', 'Gua ', 'Yi ', 'Huo ', 'Shan ', 'Zheng ', 'Lue ', 'Cai ', 'Tan ', 'Che ', 'Bing ', 'Jie ', 'Ti ', 'Kong ', 'Tui ', 'Yan ', 'Cuo ', 'Zou ', 'Ju ', 'Tian ', 'Qian ', 'Ken ', 'Bai ', 'Shou ', 'Jie ', 'Lu ', 'Guo ', 'Haba ', '[?] ', 'Zhi ', 'Dan ', 'Mang ', 'Xian ', 'Sao ', 'Guan ', 'Peng ', 'Yuan ', 'Nuo ', 'Jian ', 'Zhen ', 'Jiu ', 'Jian ', 'Yu ', 'Yan ', 'Kui ', 'Nan ', 'Hong ', 'Rou ', 'Pi ', 'Wei ', 'Sai ', 'Zou ', 'Xuan ', 'Miao ', 'Ti ', 'Nie ', 'Cha ', 'Shi ', 'Zong ', 'Zhen ', 'Yi ', 'Shun ', 'Heng ', 'Bian ', 'Yang ', 'Huan ', 'Yan ', 'Zuan ', 'An ', 'Xu ', 'Ya ', 'Wo ', 'Ke ', 'Chuai ', 'Ji ', 'Ti ', 'La ', 'La ', 'Cheng ', 'Kai ', 'Jiu ', 'Jiu ', 'Tu ', 'Jie ', 'Hui ', 'Geng ', 'Chong ', 'Shuo ', 'She ', 'Xie ', 'Yuan ', 'Qian ', 'Ye ', 'Cha ', 'Zha ', 'Bei ', 'Yao ', '[?] ', '[?] ', 'Lan ', 'Wen ', 'Qin ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x064.php b/vendor/voku/portable-ascii/src/voku/helper/data/x064.php new file mode 100644 index 0000000..ceaefdc --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x064.php @@ -0,0 +1 @@ +<?php return ['Chan ', 'Ge ', 'Lou ', 'Zong ', 'Geng ', 'Jiao ', 'Gou ', 'Qin ', 'Yong ', 'Que ', 'Chou ', 'Chi ', 'Zhan ', 'Sun ', 'Sun ', 'Bo ', 'Chu ', 'Rong ', 'Beng ', 'Cuo ', 'Sao ', 'Ke ', 'Yao ', 'Dao ', 'Zhi ', 'Nu ', 'Xie ', 'Jian ', 'Sou ', 'Qiu ', 'Gao ', 'Xian ', 'Shuo ', 'Sang ', 'Jin ', 'Mie ', 'E ', 'Chui ', 'Nuo ', 'Shan ', 'Ta ', 'Jie ', 'Tang ', 'Pan ', 'Ban ', 'Da ', 'Li ', 'Tao ', 'Hu ', 'Zhi ', 'Wa ', 'Xia ', 'Qian ', 'Wen ', 'Qiang ', 'Tian ', 'Zhen ', 'E ', 'Xi ', 'Nuo ', 'Quan ', 'Cha ', 'Zha ', 'Ge ', 'Wu ', 'En ', 'She ', 'Kang ', 'She ', 'Shu ', 'Bai ', 'Yao ', 'Bin ', 'Sou ', 'Tan ', 'Sa ', 'Chan ', 'Suo ', 'Liao ', 'Chong ', 'Chuang ', 'Guo ', 'Bing ', 'Feng ', 'Shuai ', 'Di ', 'Qi ', 'Sou ', 'Zhai ', 'Lian ', 'Tang ', 'Chi ', 'Guan ', 'Lu ', 'Luo ', 'Lou ', 'Zong ', 'Gai ', 'Hu ', 'Zha ', 'Chuang ', 'Tang ', 'Hua ', 'Cui ', 'Nai ', 'Mo ', 'Jiang ', 'Gui ', 'Ying ', 'Zhi ', 'Ao ', 'Zhi ', 'Nie ', 'Man ', 'Shan ', 'Kou ', 'Shu ', 'Suo ', 'Tuan ', 'Jiao ', 'Mo ', 'Mo ', 'Zhe ', 'Xian ', 'Keng ', 'Piao ', 'Jiang ', 'Yin ', 'Gou ', 'Qian ', 'Lue ', 'Ji ', 'Ying ', 'Jue ', 'Pie ', 'Pie ', 'Lao ', 'Dun ', 'Xian ', 'Ruan ', 'Kui ', 'Zan ', 'Yi ', 'Xun ', 'Cheng ', 'Cheng ', 'Sa ', 'Nao ', 'Heng ', 'Si ', 'Qian ', 'Huang ', 'Da ', 'Zun ', 'Nian ', 'Lin ', 'Zheng ', 'Hui ', 'Zhuang ', 'Jiao ', 'Ji ', 'Cao ', 'Dan ', 'Dan ', 'Che ', 'Bo ', 'Che ', 'Jue ', 'Xiao ', 'Liao ', 'Ben ', 'Fu ', 'Qiao ', 'Bo ', 'Cuo ', 'Zhuo ', 'Zhuan ', 'Tuo ', 'Pu ', 'Qin ', 'Dun ', 'Nian ', '[?] ', 'Xie ', 'Lu ', 'Jiao ', 'Cuan ', 'Ta ', 'Han ', 'Qiao ', 'Zhua ', 'Jian ', 'Gan ', 'Yong ', 'Lei ', 'Kuo ', 'Lu ', 'Shan ', 'Zhuo ', 'Ze ', 'Pu ', 'Chuo ', 'Ji ', 'Dang ', 'Suo ', 'Cao ', 'Qing ', 'Jing ', 'Huan ', 'Jie ', 'Qin ', 'Kuai ', 'Dan ', 'Xi ', 'Ge ', 'Pi ', 'Bo ', 'Ao ', 'Ju ', 'Ye ', '[?] ', 'Mang ', 'Sou ', 'Mi ', 'Ji ', 'Tai ', 'Zhuo ', 'Dao ', 'Xing ', 'Lan ', 'Ca ', 'Ju ', 'Ye ', 'Ru ', 'Ye ', 'Ye ', 'Ni ', 'Hu ', 'Ji ', 'Bin ', 'Ning ', 'Ge ', 'Zhi ', 'Jie ', 'Kuo ', 'Mo ', 'Jian ', 'Xie ', 'Lie ', 'Tan ', 'Bai ', 'Sou ', 'Lu ', 'Lue ', 'Rao ', 'Zhi ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x065.php b/vendor/voku/portable-ascii/src/voku/helper/data/x065.php new file mode 100644 index 0000000..da92761 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x065.php @@ -0,0 +1 @@ +<?php return ['Pan ', 'Yang ', 'Lei ', 'Sa ', 'Shu ', 'Zan ', 'Nian ', 'Xian ', 'Jun ', 'Huo ', 'Li ', 'La ', 'Han ', 'Ying ', 'Lu ', 'Long ', 'Qian ', 'Qian ', 'Zan ', 'Qian ', 'Lan ', 'San ', 'Ying ', 'Mei ', 'Rang ', 'Chan ', '[?] ', 'Cuan ', 'Xi ', 'She ', 'Luo ', 'Jun ', 'Mi ', 'Li ', 'Zan ', 'Luan ', 'Tan ', 'Zuan ', 'Li ', 'Dian ', 'Wa ', 'Dang ', 'Jiao ', 'Jue ', 'Lan ', 'Li ', 'Nang ', 'Zhi ', 'Gui ', 'Gui ', 'Qi ', 'Xin ', 'Pu ', 'Sui ', 'Shou ', 'Kao ', 'You ', 'Gai ', 'Yi ', 'Gong ', 'Gan ', 'Ban ', 'Fang ', 'Zheng ', 'Bo ', 'Dian ', 'Kou ', 'Min ', 'Wu ', 'Gu ', 'He ', 'Ce ', 'Xiao ', 'Mi ', 'Chu ', 'Ge ', 'Di ', 'Xu ', 'Jiao ', 'Min ', 'Chen ', 'Jiu ', 'Zhen ', 'Duo ', 'Yu ', 'Chi ', 'Ao ', 'Bai ', 'Xu ', 'Jiao ', 'Duo ', 'Lian ', 'Nie ', 'Bi ', 'Chang ', 'Dian ', 'Duo ', 'Yi ', 'Gan ', 'San ', 'Ke ', 'Yan ', 'Dun ', 'Qi ', 'Dou ', 'Xiao ', 'Duo ', 'Jiao ', 'Jing ', 'Yang ', 'Xia ', 'Min ', 'Shu ', 'Ai ', 'Qiao ', 'Ai ', 'Zheng ', 'Di ', 'Zhen ', 'Fu ', 'Shu ', 'Liao ', 'Qu ', 'Xiong ', 'Xi ', 'Jiao ', 'Sen ', 'Jiao ', 'Zhuo ', 'Yi ', 'Lian ', 'Bi ', 'Li ', 'Xiao ', 'Xiao ', 'Wen ', 'Xue ', 'Qi ', 'Qi ', 'Zhai ', 'Bin ', 'Jue ', 'Zhai ', '[?] ', 'Fei ', 'Ban ', 'Ban ', 'Lan ', 'Yu ', 'Lan ', 'Wei ', 'Dou ', 'Sheng ', 'Liao ', 'Jia ', 'Hu ', 'Xie ', 'Jia ', 'Yu ', 'Zhen ', 'Jiao ', 'Wo ', 'Tou ', 'Chu ', 'Jin ', 'Chi ', 'Yin ', 'Fu ', 'Qiang ', 'Zhan ', 'Qu ', 'Zhuo ', 'Zhan ', 'Duan ', 'Zhuo ', 'Si ', 'Xin ', 'Zhuo ', 'Zhuo ', 'Qin ', 'Lin ', 'Zhuo ', 'Chu ', 'Duan ', 'Zhu ', 'Fang ', 'Xie ', 'Hang ', 'Yu ', 'Shi ', 'Pei ', 'You ', 'Mye ', 'Pang ', 'Qi ', 'Zhan ', 'Mao ', 'Lu ', 'Pei ', 'Pi ', 'Liu ', 'Fu ', 'Fang ', 'Xuan ', 'Jing ', 'Jing ', 'Ni ', 'Zu ', 'Zhao ', 'Yi ', 'Liu ', 'Shao ', 'Jian ', 'Es ', 'Yi ', 'Qi ', 'Zhi ', 'Fan ', 'Piao ', 'Fan ', 'Zhan ', 'Guai ', 'Sui ', 'Yu ', 'Wu ', 'Ji ', 'Ji ', 'Ji ', 'Huo ', 'Ri ', 'Dan ', 'Jiu ', 'Zhi ', 'Zao ', 'Xie ', 'Tiao ', 'Xun ', 'Xu ', 'Xu ', 'Xu ', 'Gan ', 'Han ', 'Tai ', 'Di ', 'Xu ', 'Chan ', 'Shi ', 'Kuang ', 'Yang ', 'Shi ', 'Wang ', 'Min ', 'Min ', 'Tun ', 'Chun ', 'Wu ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x066.php b/vendor/voku/portable-ascii/src/voku/helper/data/x066.php new file mode 100644 index 0000000..dfae09b --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x066.php @@ -0,0 +1 @@ +<?php return ['Yun ', 'Bei ', 'Ang ', 'Ze ', 'Ban ', 'Jie ', 'Kun ', 'Sheng ', 'Hu ', 'Fang ', 'Hao ', 'Gui ', 'Chang ', 'Xuan ', 'Ming ', 'Hun ', 'Fen ', 'Qin ', 'Hu ', 'Yi ', 'Xi ', 'Xin ', 'Yan ', 'Ze ', 'Fang ', 'Tan ', 'Shen ', 'Ju ', 'Yang ', 'Zan ', 'Bing ', 'Xing ', 'Ying ', 'Xuan ', 'Pei ', 'Zhen ', 'Ling ', 'Chun ', 'Hao ', 'Mei ', 'Zuo ', 'Mo ', 'Bian ', 'Xu ', 'Hun ', 'Zhao ', 'Zong ', 'Shi ', 'Shi ', 'Yu ', 'Fei ', 'Die ', 'Mao ', 'Ni ', 'Chang ', 'Wen ', 'Dong ', 'Ai ', 'Bing ', 'Ang ', 'Zhou ', 'Long ', 'Xian ', 'Kuang ', 'Tiao ', 'Chao ', 'Shi ', 'Huang ', 'Huang ', 'Xuan ', 'Kui ', 'Xu ', 'Jiao ', 'Jin ', 'Zhi ', 'Jin ', 'Shang ', 'Tong ', 'Hong ', 'Yan ', 'Gai ', 'Xiang ', 'Shai ', 'Xiao ', 'Ye ', 'Yun ', 'Hui ', 'Han ', 'Han ', 'Jun ', 'Wan ', 'Xian ', 'Kun ', 'Zhou ', 'Xi ', 'Cheng ', 'Sheng ', 'Bu ', 'Zhe ', 'Zhe ', 'Wu ', 'Han ', 'Hui ', 'Hao ', 'Chen ', 'Wan ', 'Tian ', 'Zhuo ', 'Zui ', 'Zhou ', 'Pu ', 'Jing ', 'Xi ', 'Shan ', 'Yi ', 'Xi ', 'Qing ', 'Qi ', 'Jing ', 'Gui ', 'Zhen ', 'Yi ', 'Zhi ', 'An ', 'Wan ', 'Lin ', 'Liang ', 'Chang ', 'Wang ', 'Xiao ', 'Zan ', 'Hi ', 'Xuan ', 'Xuan ', 'Yi ', 'Xia ', 'Yun ', 'Hui ', 'Fu ', 'Min ', 'Kui ', 'He ', 'Ying ', 'Du ', 'Wei ', 'Shu ', 'Qing ', 'Mao ', 'Nan ', 'Jian ', 'Nuan ', 'An ', 'Yang ', 'Chun ', 'Yao ', 'Suo ', 'Jin ', 'Ming ', 'Jiao ', 'Kai ', 'Gao ', 'Weng ', 'Chang ', 'Qi ', 'Hao ', 'Yan ', 'Li ', 'Ai ', 'Ji ', 'Gui ', 'Men ', 'Zan ', 'Xie ', 'Hao ', 'Mu ', 'Mo ', 'Cong ', 'Ni ', 'Zhang ', 'Hui ', 'Bao ', 'Han ', 'Xuan ', 'Chuan ', 'Liao ', 'Xian ', 'Dan ', 'Jing ', 'Pie ', 'Lin ', 'Tun ', 'Xi ', 'Yi ', 'Ji ', 'Huang ', 'Tai ', 'Ye ', 'Ye ', 'Li ', 'Tan ', 'Tong ', 'Xiao ', 'Fei ', 'Qin ', 'Zhao ', 'Hao ', 'Yi ', 'Xiang ', 'Xing ', 'Sen ', 'Jiao ', 'Bao ', 'Jing ', 'Yian ', 'Ai ', 'Ye ', 'Ru ', 'Shu ', 'Meng ', 'Xun ', 'Yao ', 'Pu ', 'Li ', 'Chen ', 'Kuang ', 'Die ', '[?] ', 'Yan ', 'Huo ', 'Lu ', 'Xi ', 'Rong ', 'Long ', 'Nang ', 'Luo ', 'Luan ', 'Shai ', 'Tang ', 'Yan ', 'Chu ', 'Yue ', 'Yue ', 'Qu ', 'Yi ', 'Geng ', 'Ye ', 'Hu ', 'He ', 'Shu ', 'Cao ', 'Cao ', 'Noboru ', 'Man ', 'Ceng ', 'Ceng ', 'Ti ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x067.php b/vendor/voku/portable-ascii/src/voku/helper/data/x067.php new file mode 100644 index 0000000..01bedf8 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x067.php @@ -0,0 +1 @@ +<?php return ['Zui ', 'Can ', 'Xu ', 'Hui ', 'Yin ', 'Qie ', 'Fen ', 'Pi ', 'Yue ', 'You ', 'Ruan ', 'Peng ', 'Ban ', 'Fu ', 'Ling ', 'Fei ', 'Qu ', '[?] ', 'Nu ', 'Tiao ', 'Shuo ', 'Zhen ', 'Lang ', 'Lang ', 'Juan ', 'Ming ', 'Huang ', 'Wang ', 'Tun ', 'Zhao ', 'Ji ', 'Qi ', 'Ying ', 'Zong ', 'Wang ', 'Tong ', 'Lang ', '[?] ', 'Meng ', 'Long ', 'Mu ', 'Deng ', 'Wei ', 'Mo ', 'Ben ', 'Zha ', 'Zhu ', 'Zhu ', '[?] ', 'Zhu ', 'Ren ', 'Ba ', 'Po ', 'Duo ', 'Duo ', 'Dao ', 'Li ', 'Qiu ', 'Ji ', 'Jiu ', 'Bi ', 'Xiu ', 'Ting ', 'Ci ', 'Sha ', 'Eburi ', 'Za ', 'Quan ', 'Qian ', 'Yu ', 'Gan ', 'Wu ', 'Cha ', 'Shan ', 'Xun ', 'Fan ', 'Wu ', 'Zi ', 'Li ', 'Xing ', 'Cai ', 'Cun ', 'Ren ', 'Shao ', 'Tuo ', 'Di ', 'Zhang ', 'Mang ', 'Chi ', 'Yi ', 'Gu ', 'Gong ', 'Du ', 'Yi ', 'Qi ', 'Shu ', 'Gang ', 'Tiao ', 'Moku ', 'Soma ', 'Tochi ', 'Lai ', 'Sugi ', 'Mang ', 'Yang ', 'Ma ', 'Miao ', 'Si ', 'Yuan ', 'Hang ', 'Fei ', 'Bei ', 'Jie ', 'Dong ', 'Gao ', 'Yao ', 'Xian ', 'Chu ', 'Qun ', 'Pa ', 'Shu ', 'Hua ', 'Xin ', 'Chou ', 'Zhu ', 'Chou ', 'Song ', 'Ban ', 'Song ', 'Ji ', 'Yue ', 'Jin ', 'Gou ', 'Ji ', 'Mao ', 'Pi ', 'Bi ', 'Wang ', 'Ang ', 'Fang ', 'Fen ', 'Yi ', 'Fu ', 'Nan ', 'Xi ', 'Hu ', 'Ya ', 'Dou ', 'Xun ', 'Zhen ', 'Yao ', 'Lin ', 'Rui ', 'E ', 'Mei ', 'Zhao ', 'Guo ', 'Zhi ', 'Cong ', 'Yun ', 'Waku ', 'Dou ', 'Shu ', 'Zao ', '[?] ', 'Li ', 'Haze ', 'Jian ', 'Cheng ', 'Matsu ', 'Qiang ', 'Feng ', 'Nan ', 'Xiao ', 'Xian ', 'Ku ', 'Ping ', 'Yi ', 'Xi ', 'Zhi ', 'Guai ', 'Xiao ', 'Jia ', 'Jia ', 'Gou ', 'Fu ', 'Mo ', 'Yi ', 'Ye ', 'Ye ', 'Shi ', 'Nie ', 'Bi ', 'Duo ', 'Yi ', 'Ling ', 'Bing ', 'Ni ', 'La ', 'He ', 'Pan ', 'Fan ', 'Zhong ', 'Dai ', 'Ci ', 'Yang ', 'Fu ', 'Bo ', 'Mou ', 'Gan ', 'Qi ', 'Ran ', 'Rou ', 'Mao ', 'Zhao ', 'Song ', 'Zhe ', 'Xia ', 'You ', 'Shen ', 'Ju ', 'Tuo ', 'Zuo ', 'Nan ', 'Ning ', 'Yong ', 'Di ', 'Zhi ', 'Zha ', 'Cha ', 'Dan ', 'Gu ', 'Pu ', 'Jiu ', 'Ao ', 'Fu ', 'Jian ', 'Bo ', 'Duo ', 'Ke ', 'Nai ', 'Zhu ', 'Bi ', 'Liu ', 'Chai ', 'Zha ', 'Si ', 'Zhu ', 'Pei ', 'Shi ', 'Guai ', 'Cha ', 'Yao ', 'Jue ', 'Jiu ', 'Shi ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x068.php b/vendor/voku/portable-ascii/src/voku/helper/data/x068.php new file mode 100644 index 0000000..eee5c80 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x068.php @@ -0,0 +1 @@ +<?php return ['Zhi ', 'Liu ', 'Mei ', 'Hoy ', 'Rong ', 'Zha ', '[?] ', 'Biao ', 'Zhan ', 'Jie ', 'Long ', 'Dong ', 'Lu ', 'Sayng ', 'Li ', 'Lan ', 'Yong ', 'Shu ', 'Xun ', 'Shuan ', 'Qi ', 'Zhen ', 'Qi ', 'Li ', 'Yi ', 'Xiang ', 'Zhen ', 'Li ', 'Su ', 'Gua ', 'Kan ', 'Bing ', 'Ren ', 'Xiao ', 'Bo ', 'Ren ', 'Bing ', 'Zi ', 'Chou ', 'Yi ', 'Jie ', 'Xu ', 'Zhu ', 'Jian ', 'Zui ', 'Er ', 'Er ', 'You ', 'Fa ', 'Gong ', 'Kao ', 'Lao ', 'Zhan ', 'Li ', 'Yin ', 'Yang ', 'He ', 'Gen ', 'Zhi ', 'Chi ', 'Ge ', 'Zai ', 'Luan ', 'Fu ', 'Jie ', 'Hang ', 'Gui ', 'Tao ', 'Guang ', 'Wei ', 'Kuang ', 'Ru ', 'An ', 'An ', 'Juan ', 'Yi ', 'Zhuo ', 'Ku ', 'Zhi ', 'Qiong ', 'Tong ', 'Sang ', 'Sang ', 'Huan ', 'Jie ', 'Jiu ', 'Xue ', 'Duo ', 'Zhui ', 'Yu ', 'Zan ', 'Kasei ', 'Ying ', 'Masu ', '[?] ', 'Zhan ', 'Ya ', 'Nao ', 'Zhen ', 'Dang ', 'Qi ', 'Qiao ', 'Hua ', 'Kuai ', 'Jiang ', 'Zhuang ', 'Xun ', 'Suo ', 'Sha ', 'Zhen ', 'Bei ', 'Ting ', 'Gua ', 'Jing ', 'Bo ', 'Ben ', 'Fu ', 'Rui ', 'Tong ', 'Jue ', 'Xi ', 'Lang ', 'Liu ', 'Feng ', 'Qi ', 'Wen ', 'Jun ', 'Gan ', 'Cu ', 'Liang ', 'Qiu ', 'Ting ', 'You ', 'Mei ', 'Bang ', 'Long ', 'Peng ', 'Zhuang ', 'Di ', 'Xuan ', 'Tu ', 'Zao ', 'Ao ', 'Gu ', 'Bi ', 'Di ', 'Han ', 'Zi ', 'Zhi ', 'Ren ', 'Bei ', 'Geng ', 'Jian ', 'Huan ', 'Wan ', 'Nuo ', 'Jia ', 'Tiao ', 'Ji ', 'Xiao ', 'Lu ', 'Huan ', 'Shao ', 'Cen ', 'Fen ', 'Song ', 'Meng ', 'Wu ', 'Li ', 'Li ', 'Dou ', 'Cen ', 'Ying ', 'Suo ', 'Ju ', 'Ti ', 'Jie ', 'Kun ', 'Zhuo ', 'Shu ', 'Chan ', 'Fan ', 'Wei ', 'Jing ', 'Li ', 'Bing ', 'Fumoto ', 'Shikimi ', 'Tao ', 'Zhi ', 'Lai ', 'Lian ', 'Jian ', 'Zhuo ', 'Ling ', 'Li ', 'Qi ', 'Bing ', 'Zhun ', 'Cong ', 'Qian ', 'Mian ', 'Qi ', 'Qi ', 'Cai ', 'Gun ', 'Chan ', 'Te ', 'Fei ', 'Pai ', 'Bang ', 'Pou ', 'Hun ', 'Zong ', 'Cheng ', 'Zao ', 'Ji ', 'Li ', 'Peng ', 'Yu ', 'Yu ', 'Gu ', 'Hun ', 'Dong ', 'Tang ', 'Gang ', 'Wang ', 'Di ', 'Xi ', 'Fan ', 'Cheng ', 'Zhan ', 'Qi ', 'Yuan ', 'Yan ', 'Yu ', 'Quan ', 'Yi ', 'Sen ', 'Ren ', 'Chui ', 'Leng ', 'Qi ', 'Zhuo ', 'Fu ', 'Ke ', 'Lai ', 'Zou ', 'Zou ', 'Zhuo ', 'Guan ', 'Fen ', 'Fen ', 'Chen ', 'Qiong ', 'Nie ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x069.php b/vendor/voku/portable-ascii/src/voku/helper/data/x069.php new file mode 100644 index 0000000..cf8d1d2 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x069.php @@ -0,0 +1 @@ +<?php return ['Wan ', 'Guo ', 'Lu ', 'Hao ', 'Jie ', 'Yi ', 'Chou ', 'Ju ', 'Ju ', 'Cheng ', 'Zuo ', 'Liang ', 'Qiang ', 'Zhi ', 'Zhui ', 'Ya ', 'Ju ', 'Bei ', 'Jiao ', 'Zhuo ', 'Zi ', 'Bin ', 'Peng ', 'Ding ', 'Chu ', 'Chang ', 'Kunugi ', 'Momiji ', 'Jian ', 'Gui ', 'Xi ', 'Du ', 'Qian ', 'Kunugi ', 'Soko ', 'Shide ', 'Luo ', 'Zhi ', 'Ken ', 'Myeng ', 'Tafu ', '[?] ', 'Peng ', 'Zhan ', '[?] ', 'Tuo ', 'Sen ', 'Duo ', 'Ye ', 'Fou ', 'Wei ', 'Wei ', 'Duan ', 'Jia ', 'Zong ', 'Jian ', 'Yi ', 'Shen ', 'Xi ', 'Yan ', 'Yan ', 'Chuan ', 'Zhan ', 'Chun ', 'Yu ', 'He ', 'Zha ', 'Wo ', 'Pian ', 'Bi ', 'Yao ', 'Huo ', 'Xu ', 'Ruo ', 'Yang ', 'La ', 'Yan ', 'Ben ', 'Hun ', 'Kui ', 'Jie ', 'Kui ', 'Si ', 'Feng ', 'Xie ', 'Tuo ', 'Zhi ', 'Jian ', 'Mu ', 'Mao ', 'Chu ', 'Hu ', 'Hu ', 'Lian ', 'Leng ', 'Ting ', 'Nan ', 'Yu ', 'You ', 'Mei ', 'Song ', 'Xuan ', 'Xuan ', 'Ying ', 'Zhen ', 'Pian ', 'Ye ', 'Ji ', 'Jie ', 'Ye ', 'Chu ', 'Shun ', 'Yu ', 'Cou ', 'Wei ', 'Mei ', 'Di ', 'Ji ', 'Jie ', 'Kai ', 'Qiu ', 'Ying ', 'Rou ', 'Heng ', 'Lou ', 'Le ', 'Hazou ', 'Katsura ', 'Pin ', 'Muro ', 'Gai ', 'Tan ', 'Lan ', 'Yun ', 'Yu ', 'Chen ', 'Lu ', 'Ju ', 'Sakaki ', '[?] ', 'Pi ', 'Xie ', 'Jia ', 'Yi ', 'Zhan ', 'Fu ', 'Nai ', 'Mi ', 'Lang ', 'Rong ', 'Gu ', 'Jian ', 'Ju ', 'Ta ', 'Yao ', 'Zhen ', 'Bang ', 'Sha ', 'Yuan ', 'Zi ', 'Ming ', 'Su ', 'Jia ', 'Yao ', 'Jie ', 'Huang ', 'Gan ', 'Fei ', 'Zha ', 'Qian ', 'Ma ', 'Sun ', 'Yuan ', 'Xie ', 'Rong ', 'Shi ', 'Zhi ', 'Cui ', 'Yun ', 'Ting ', 'Liu ', 'Rong ', 'Tang ', 'Que ', 'Zhai ', 'Si ', 'Sheng ', 'Ta ', 'Ke ', 'Xi ', 'Gu ', 'Qi ', 'Kao ', 'Gao ', 'Sun ', 'Pan ', 'Tao ', 'Ge ', 'Xun ', 'Dian ', 'Nou ', 'Ji ', 'Shuo ', 'Gou ', 'Chui ', 'Qiang ', 'Cha ', 'Qian ', 'Huai ', 'Mei ', 'Xu ', 'Gang ', 'Gao ', 'Zhuo ', 'Tuo ', 'Hashi ', 'Yang ', 'Dian ', 'Jia ', 'Jian ', 'Zui ', 'Kashi ', 'Ori ', 'Bin ', 'Zhu ', '[?] ', 'Xi ', 'Qi ', 'Lian ', 'Hui ', 'Yong ', 'Qian ', 'Guo ', 'Gai ', 'Gai ', 'Tuan ', 'Hua ', 'Cu ', 'Sen ', 'Cui ', 'Beng ', 'You ', 'Hu ', 'Jiang ', 'Hu ', 'Huan ', 'Kui ', 'Yi ', 'Nie ', 'Gao ', 'Kang ', 'Gui ', 'Gui ', 'Cao ', 'Man ', 'Jin ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x06a.php b/vendor/voku/portable-ascii/src/voku/helper/data/x06a.php new file mode 100644 index 0000000..07aa2ec --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x06a.php @@ -0,0 +1 @@ +<?php return ['Di ', 'Zhuang ', 'Le ', 'Lang ', 'Chen ', 'Cong ', 'Li ', 'Xiu ', 'Qing ', 'Shuang ', 'Fan ', 'Tong ', 'Guan ', 'Ji ', 'Suo ', 'Lei ', 'Lu ', 'Liang ', 'Mi ', 'Lou ', 'Chao ', 'Su ', 'Ke ', 'Shu ', 'Tang ', 'Biao ', 'Lu ', 'Jiu ', 'Shu ', 'Zha ', 'Shu ', 'Zhang ', 'Men ', 'Mo ', 'Niao ', 'Yang ', 'Tiao ', 'Peng ', 'Zhu ', 'Sha ', 'Xi ', 'Quan ', 'Heng ', 'Jian ', 'Cong ', '[?] ', 'Hokuso ', 'Qiang ', 'Tara ', 'Ying ', 'Er ', 'Xin ', 'Zhi ', 'Qiao ', 'Zui ', 'Cong ', 'Pu ', 'Shu ', 'Hua ', 'Kui ', 'Zhen ', 'Zun ', 'Yue ', 'Zhan ', 'Xi ', 'Xun ', 'Dian ', 'Fa ', 'Gan ', 'Mo ', 'Wu ', 'Qiao ', 'Nao ', 'Lin ', 'Liu ', 'Qiao ', 'Xian ', 'Run ', 'Fan ', 'Zhan ', 'Tuo ', 'Lao ', 'Yun ', 'Shun ', 'Tui ', 'Cheng ', 'Tang ', 'Meng ', 'Ju ', 'Cheng ', 'Su ', 'Jue ', 'Jue ', 'Tan ', 'Hui ', 'Ji ', 'Nuo ', 'Xiang ', 'Tuo ', 'Ning ', 'Rui ', 'Zhu ', 'Chuang ', 'Zeng ', 'Fen ', 'Qiong ', 'Ran ', 'Heng ', 'Cen ', 'Gu ', 'Liu ', 'Lao ', 'Gao ', 'Chu ', 'Zusa ', 'Nude ', 'Ca ', 'San ', 'Ji ', 'Dou ', 'Shou ', 'Lu ', '[?] ', '[?] ', 'Yuan ', 'Ta ', 'Shu ', 'Jiang ', 'Tan ', 'Lin ', 'Nong ', 'Yin ', 'Xi ', 'Sui ', 'Shan ', 'Zui ', 'Xuan ', 'Cheng ', 'Gan ', 'Ju ', 'Zui ', 'Yi ', 'Qin ', 'Pu ', 'Yan ', 'Lei ', 'Feng ', 'Hui ', 'Dang ', 'Ji ', 'Sui ', 'Bo ', 'Bi ', 'Ding ', 'Chu ', 'Zhua ', 'Kuai ', 'Ji ', 'Jie ', 'Jia ', 'Qing ', 'Zhe ', 'Jian ', 'Qiang ', 'Dao ', 'Yi ', 'Biao ', 'Song ', 'She ', 'Lin ', 'Kunugi ', 'Cha ', 'Meng ', 'Yin ', 'Tao ', 'Tai ', 'Mian ', 'Qi ', 'Toan ', 'Bin ', 'Huo ', 'Ji ', 'Qian ', 'Mi ', 'Ning ', 'Yi ', 'Gao ', 'Jian ', 'Yin ', 'Er ', 'Qing ', 'Yan ', 'Qi ', 'Mi ', 'Zhao ', 'Gui ', 'Chun ', 'Ji ', 'Kui ', 'Po ', 'Deng ', 'Chu ', '[?] ', 'Mian ', 'You ', 'Zhi ', 'Guang ', 'Qian ', 'Lei ', 'Lei ', 'Sa ', 'Lu ', 'Li ', 'Cuan ', 'Lu ', 'Mie ', 'Hui ', 'Ou ', 'Lu ', 'Jie ', 'Gao ', 'Du ', 'Yuan ', 'Li ', 'Fei ', 'Zhuo ', 'Sou ', 'Lian ', 'Tamo ', 'Chu ', '[?] ', 'Zhu ', 'Lu ', 'Yan ', 'Li ', 'Zhu ', 'Chen ', 'Jie ', 'E ', 'Su ', 'Huai ', 'Nie ', 'Yu ', 'Long ', 'Lai ', '[?] ', 'Xian ', 'Kwi ', 'Ju ', 'Xiao ', 'Ling ', 'Ying ', 'Jian ', 'Yin ', 'You ', 'Ying ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x06b.php b/vendor/voku/portable-ascii/src/voku/helper/data/x06b.php new file mode 100644 index 0000000..560afa3 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x06b.php @@ -0,0 +1 @@ +<?php return ['Xiang ', 'Nong ', 'Bo ', 'Chan ', 'Lan ', 'Ju ', 'Shuang ', 'She ', 'Wei ', 'Cong ', 'Quan ', 'Qu ', 'Cang ', '[?] ', 'Yu ', 'Luo ', 'Li ', 'Zan ', 'Luan ', 'Dang ', 'Jue ', 'Em ', 'Lan ', 'Lan ', 'Zhu ', 'Lei ', 'Li ', 'Ba ', 'Nang ', 'Yu ', 'Ling ', 'Tsuki ', 'Qian ', 'Ci ', 'Huan ', 'Xin ', 'Yu ', 'Yu ', 'Qian ', 'Ou ', 'Xu ', 'Chao ', 'Chu ', 'Chi ', 'Kai ', 'Yi ', 'Jue ', 'Xi ', 'Xu ', 'Xia ', 'Yu ', 'Kuai ', 'Lang ', 'Kuan ', 'Shuo ', 'Xi ', 'Ai ', 'Yi ', 'Qi ', 'Hu ', 'Chi ', 'Qin ', 'Kuan ', 'Kan ', 'Kuan ', 'Kan ', 'Chuan ', 'Sha ', 'Gua ', 'Yin ', 'Xin ', 'Xie ', 'Yu ', 'Qian ', 'Xiao ', 'Yi ', 'Ge ', 'Wu ', 'Tan ', 'Jin ', 'Ou ', 'Hu ', 'Ti ', 'Huan ', 'Xu ', 'Pen ', 'Xi ', 'Xiao ', 'Xu ', 'Xi ', 'Sen ', 'Lian ', 'Chu ', 'Yi ', 'Kan ', 'Yu ', 'Chuo ', 'Huan ', 'Zhi ', 'Zheng ', 'Ci ', 'Bu ', 'Wu ', 'Qi ', 'Bu ', 'Bu ', 'Wai ', 'Ju ', 'Qian ', 'Chi ', 'Se ', 'Chi ', 'Se ', 'Zhong ', 'Sui ', 'Sui ', 'Li ', 'Cuo ', 'Yu ', 'Li ', 'Gui ', 'Dai ', 'Dai ', 'Si ', 'Jian ', 'Zhe ', 'Mo ', 'Mo ', 'Yao ', 'Mo ', 'Cu ', 'Yang ', 'Tian ', 'Sheng ', 'Dai ', 'Shang ', 'Xu ', 'Xun ', 'Shu ', 'Can ', 'Jue ', 'Piao ', 'Qia ', 'Qiu ', 'Su ', 'Qing ', 'Yun ', 'Lian ', 'Yi ', 'Fou ', 'Zhi ', 'Ye ', 'Can ', 'Hun ', 'Dan ', 'Ji ', 'Ye ', 'Zhen ', 'Yun ', 'Wen ', 'Chou ', 'Bin ', 'Ti ', 'Jin ', 'Shang ', 'Yin ', 'Diao ', 'Cu ', 'Hui ', 'Cuan ', 'Yi ', 'Dan ', 'Du ', 'Jiang ', 'Lian ', 'Bin ', 'Du ', 'Tsukusu ', 'Jian ', 'Shu ', 'Ou ', 'Duan ', 'Zhu ', 'Yin ', 'Qing ', 'Yi ', 'Sha ', 'Que ', 'Ke ', 'Yao ', 'Jun ', 'Dian ', 'Hui ', 'Hui ', 'Gu ', 'Que ', 'Ji ', 'Yi ', 'Ou ', 'Hui ', 'Duan ', 'Yi ', 'Xiao ', 'Wu ', 'Guan ', 'Mu ', 'Mei ', 'Mei ', 'Ai ', 'Zuo ', 'Du ', 'Yu ', 'Bi ', 'Bi ', 'Bi ', 'Pi ', 'Pi ', 'Bi ', 'Chan ', 'Mao ', '[?] ', '[?] ', 'Pu ', 'Mushiru ', 'Jia ', 'Zhan ', 'Sai ', 'Mu ', 'Tuo ', 'Xun ', 'Er ', 'Rong ', 'Xian ', 'Ju ', 'Mu ', 'Hao ', 'Qiu ', 'Dou ', 'Mushiru ', 'Tan ', 'Pei ', 'Ju ', 'Duo ', 'Cui ', 'Bi ', 'San ', '[?] ', 'Mao ', 'Sui ', 'Yu ', 'Yu ', 'Tuo ', 'He ', 'Jian ', 'Ta ', 'San ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x06c.php b/vendor/voku/portable-ascii/src/voku/helper/data/x06c.php new file mode 100644 index 0000000..78f502c --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x06c.php @@ -0,0 +1 @@ +<?php return ['Lu ', 'Mu ', 'Li ', 'Tong ', 'Rong ', 'Chang ', 'Pu ', 'Luo ', 'Zhan ', 'Sao ', 'Zhan ', 'Meng ', 'Luo ', 'Qu ', 'Die ', 'Shi ', 'Di ', 'Min ', 'Jue ', 'Mang ', 'Qi ', 'Pie ', 'Nai ', 'Qi ', 'Dao ', 'Xian ', 'Chuan ', 'Fen ', 'Ri ', 'Nei ', '[?] ', 'Fu ', 'Shen ', 'Dong ', 'Qing ', 'Qi ', 'Yin ', 'Xi ', 'Hai ', 'Yang ', 'An ', 'Ya ', 'Ke ', 'Qing ', 'Ya ', 'Dong ', 'Dan ', 'Lu ', 'Qing ', 'Yang ', 'Yun ', 'Yun ', 'Shui ', 'San ', 'Zheng ', 'Bing ', 'Yong ', 'Dang ', 'Shitamizu ', 'Le ', 'Ni ', 'Tun ', 'Fan ', 'Gui ', 'Ting ', 'Zhi ', 'Qiu ', 'Bin ', 'Ze ', 'Mian ', 'Cuan ', 'Hui ', 'Diao ', 'Yi ', 'Cha ', 'Zhuo ', 'Chuan ', 'Wan ', 'Fan ', 'Dai ', 'Xi ', 'Tuo ', 'Mang ', 'Qiu ', 'Qi ', 'Shan ', 'Pai ', 'Han ', 'Qian ', 'Wu ', 'Wu ', 'Xun ', 'Si ', 'Ru ', 'Gong ', 'Jiang ', 'Chi ', 'Wu ', 'Tsuchi ', '[?] ', 'Tang ', 'Zhi ', 'Chi ', 'Qian ', 'Mi ', 'Yu ', 'Wang ', 'Qing ', 'Jing ', 'Rui ', 'Jun ', 'Hong ', 'Tai ', 'Quan ', 'Ji ', 'Bian ', 'Bian ', 'Gan ', 'Wen ', 'Zhong ', 'Fang ', 'Xiong ', 'Jue ', 'Hang ', 'Niou ', 'Qi ', 'Fen ', 'Xu ', 'Xu ', 'Qin ', 'Yi ', 'Wo ', 'Yun ', 'Yuan ', 'Hang ', 'Yan ', 'Chen ', 'Chen ', 'Dan ', 'You ', 'Dun ', 'Hu ', 'Huo ', 'Qie ', 'Mu ', 'Rou ', 'Mei ', 'Ta ', 'Mian ', 'Wu ', 'Chong ', 'Tian ', 'Bi ', 'Sha ', 'Zhi ', 'Pei ', 'Pan ', 'Zhui ', 'Za ', 'Gou ', 'Liu ', 'Mei ', 'Ze ', 'Feng ', 'Ou ', 'Li ', 'Lun ', 'Cang ', 'Feng ', 'Wei ', 'Hu ', 'Mo ', 'Mei ', 'Shu ', 'Ju ', 'Zan ', 'Tuo ', 'Tuo ', 'Tuo ', 'He ', 'Li ', 'Mi ', 'Yi ', 'Fa ', 'Fei ', 'You ', 'Tian ', 'Zhi ', 'Zhao ', 'Gu ', 'Zhan ', 'Yan ', 'Si ', 'Kuang ', 'Jiong ', 'Ju ', 'Xie ', 'Qiu ', 'Yi ', 'Jia ', 'Zhong ', 'Quan ', 'Bo ', 'Hui ', 'Mi ', 'Ben ', 'Zhuo ', 'Chu ', 'Le ', 'You ', 'Gu ', 'Hong ', 'Gan ', 'Fa ', 'Mao ', 'Si ', 'Hu ', 'Ping ', 'Ci ', 'Fan ', 'Chi ', 'Su ', 'Ning ', 'Cheng ', 'Ling ', 'Pao ', 'Bo ', 'Qi ', 'Si ', 'Ni ', 'Ju ', 'Yue ', 'Zhu ', 'Sheng ', 'Lei ', 'Xuan ', 'Xue ', 'Fu ', 'Pan ', 'Min ', 'Tai ', 'Yang ', 'Ji ', 'Yong ', 'Guan ', 'Beng ', 'Xue ', 'Long ', 'Lu ', '[?] ', 'Bo ', 'Xie ', 'Po ', 'Ze ', 'Jing ', 'Yin ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x06d.php b/vendor/voku/portable-ascii/src/voku/helper/data/x06d.php new file mode 100644 index 0000000..799cb25 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x06d.php @@ -0,0 +1 @@ +<?php return ['Zhou ', 'Ji ', 'Yi ', 'Hui ', 'Hui ', 'Zui ', 'Cheng ', 'Yin ', 'Wei ', 'Hou ', 'Jian ', 'Yang ', 'Lie ', 'Si ', 'Ji ', 'Er ', 'Xing ', 'Fu ', 'Sa ', 'Suo ', 'Zhi ', 'Yin ', 'Wu ', 'Xi ', 'Kao ', 'Zhu ', 'Jiang ', 'Luo ', '[?] ', 'An ', 'Dong ', 'Yi ', 'Mou ', 'Lei ', 'Yi ', 'Mi ', 'Quan ', 'Jin ', 'Mo ', 'Wei ', 'Xiao ', 'Xie ', 'Hong ', 'Xu ', 'Shuo ', 'Kuang ', 'Tao ', 'Qie ', 'Ju ', 'Er ', 'Zhou ', 'Ru ', 'Ping ', 'Xun ', 'Xiong ', 'Zhi ', 'Guang ', 'Huan ', 'Ming ', 'Huo ', 'Wa ', 'Qia ', 'Pai ', 'Wu ', 'Qu ', 'Liu ', 'Yi ', 'Jia ', 'Jing ', 'Qian ', 'Jiang ', 'Jiao ', 'Cheng ', 'Shi ', 'Zhuo ', 'Ce ', 'Pal ', 'Kuai ', 'Ji ', 'Liu ', 'Chan ', 'Hun ', 'Hu ', 'Nong ', 'Xun ', 'Jin ', 'Lie ', 'Qiu ', 'Wei ', 'Zhe ', 'Jun ', 'Han ', 'Bang ', 'Mang ', 'Zhuo ', 'You ', 'Xi ', 'Bo ', 'Dou ', 'Wan ', 'Hong ', 'Yi ', 'Pu ', 'Ying ', 'Lan ', 'Hao ', 'Lang ', 'Han ', 'Li ', 'Geng ', 'Fu ', 'Wu ', 'Lian ', 'Chun ', 'Feng ', 'Yi ', 'Yu ', 'Tong ', 'Lao ', 'Hai ', 'Jin ', 'Jia ', 'Chong ', 'Weng ', 'Mei ', 'Sui ', 'Cheng ', 'Pei ', 'Xian ', 'Shen ', 'Tu ', 'Kun ', 'Pin ', 'Nie ', 'Han ', 'Jing ', 'Xiao ', 'She ', 'Nian ', 'Tu ', 'Yong ', 'Xiao ', 'Xian ', 'Ting ', 'E ', 'Su ', 'Tun ', 'Juan ', 'Cen ', 'Ti ', 'Li ', 'Shui ', 'Si ', 'Lei ', 'Shui ', 'Tao ', 'Du ', 'Lao ', 'Lai ', 'Lian ', 'Wei ', 'Wo ', 'Yun ', 'Huan ', 'Di ', '[?] ', 'Run ', 'Jian ', 'Zhang ', 'Se ', 'Fu ', 'Guan ', 'Xing ', 'Shou ', 'Shuan ', 'Ya ', 'Chuo ', 'Zhang ', 'Ye ', 'Kong ', 'Wo ', 'Han ', 'Tuo ', 'Dong ', 'He ', 'Wo ', 'Ju ', 'Gan ', 'Liang ', 'Hun ', 'Ta ', 'Zhuo ', 'Dian ', 'Qie ', 'De ', 'Juan ', 'Zi ', 'Xi ', 'Yao ', 'Qi ', 'Gu ', 'Guo ', 'Han ', 'Lin ', 'Tang ', 'Zhou ', 'Peng ', 'Hao ', 'Chang ', 'Shu ', 'Qi ', 'Fang ', 'Chi ', 'Lu ', 'Nao ', 'Ju ', 'Tao ', 'Cong ', 'Lei ', 'Zhi ', 'Peng ', 'Fei ', 'Song ', 'Tian ', 'Pi ', 'Dan ', 'Yu ', 'Ni ', 'Yu ', 'Lu ', 'Gan ', 'Mi ', 'Jing ', 'Ling ', 'Lun ', 'Yin ', 'Cui ', 'Qu ', 'Huai ', 'Yu ', 'Nian ', 'Shen ', 'Piao ', 'Chun ', 'Wa ', 'Yuan ', 'Lai ', 'Hun ', 'Qing ', 'Yan ', 'Qian ', 'Tian ', 'Miao ', 'Zhi ', 'Yin ', 'Mi ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x06e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x06e.php new file mode 100644 index 0000000..3f0f401 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x06e.php @@ -0,0 +1 @@ +<?php return ['Ben ', 'Yuan ', 'Wen ', 'Re ', 'Fei ', 'Qing ', 'Yuan ', 'Ke ', 'Ji ', 'She ', 'Yuan ', 'Shibui ', 'Lu ', 'Zi ', 'Du ', '[?] ', 'Jian ', 'Min ', 'Pi ', 'Tani ', 'Yu ', 'Yuan ', 'Shen ', 'Shen ', 'Rou ', 'Huan ', 'Zhu ', 'Jian ', 'Nuan ', 'Yu ', 'Qiu ', 'Ting ', 'Qu ', 'Du ', 'Feng ', 'Zha ', 'Bo ', 'Wo ', 'Wo ', 'Di ', 'Wei ', 'Wen ', 'Ru ', 'Xie ', 'Ce ', 'Wei ', 'Ge ', 'Gang ', 'Yan ', 'Hong ', 'Xuan ', 'Mi ', 'Ke ', 'Mao ', 'Ying ', 'Yan ', 'You ', 'Hong ', 'Miao ', 'Xing ', 'Mei ', 'Zai ', 'Hun ', 'Nai ', 'Kui ', 'Shi ', 'E ', 'Pai ', 'Mei ', 'Lian ', 'Qi ', 'Qi ', 'Mei ', 'Tian ', 'Cou ', 'Wei ', 'Can ', 'Tuan ', 'Mian ', 'Hui ', 'Mo ', 'Xu ', 'Ji ', 'Pen ', 'Jian ', 'Jian ', 'Hu ', 'Feng ', 'Xiang ', 'Yi ', 'Yin ', 'Zhan ', 'Shi ', 'Jie ', 'Cheng ', 'Huang ', 'Tan ', 'Yu ', 'Bi ', 'Min ', 'Shi ', 'Tu ', 'Sheng ', 'Yong ', 'Qu ', 'Zhong ', 'Suei ', 'Jiu ', 'Jiao ', 'Qiou ', 'Yin ', 'Tang ', 'Long ', 'Huo ', 'Yuan ', 'Nan ', 'Ban ', 'You ', 'Quan ', 'Chui ', 'Liang ', 'Chan ', 'Yan ', 'Chun ', 'Nie ', 'Zi ', 'Wan ', 'Shi ', 'Man ', 'Ying ', 'Ratsu ', 'Kui ', '[?] ', 'Jian ', 'Xu ', 'Lu ', 'Gui ', 'Gai ', '[?] ', '[?] ', 'Po ', 'Jin ', 'Gui ', 'Tang ', 'Yuan ', 'Suo ', 'Yuan ', 'Lian ', 'Yao ', 'Meng ', 'Zhun ', 'Sheng ', 'Ke ', 'Tai ', 'Da ', 'Wa ', 'Liu ', 'Gou ', 'Sao ', 'Ming ', 'Zha ', 'Shi ', 'Yi ', 'Lun ', 'Ma ', 'Pu ', 'Wei ', 'Li ', 'Cai ', 'Wu ', 'Xi ', 'Wen ', 'Qiang ', 'Ze ', 'Shi ', 'Su ', 'Yi ', 'Zhen ', 'Sou ', 'Yun ', 'Xiu ', 'Yin ', 'Rong ', 'Hun ', 'Su ', 'Su ', 'Ni ', 'Ta ', 'Shi ', 'Ru ', 'Wei ', 'Pan ', 'Chu ', 'Chu ', 'Pang ', 'Weng ', 'Cang ', 'Mie ', 'He ', 'Dian ', 'Hao ', 'Huang ', 'Xi ', 'Zi ', 'Di ', 'Zhi ', 'Ying ', 'Fu ', 'Jie ', 'Hua ', 'Ge ', 'Zi ', 'Tao ', 'Teng ', 'Sui ', 'Bi ', 'Jiao ', 'Hui ', 'Gun ', 'Yin ', 'Gao ', 'Long ', 'Zhi ', 'Yan ', 'She ', 'Man ', 'Ying ', 'Chun ', 'Lu ', 'Lan ', 'Luan ', '[?] ', 'Bin ', 'Tan ', 'Yu ', 'Sou ', 'Hu ', 'Bi ', 'Biao ', 'Zhi ', 'Jiang ', 'Kou ', 'Shen ', 'Shang ', 'Di ', 'Mi ', 'Ao ', 'Lu ', 'Hu ', 'Hu ', 'You ', 'Chan ', 'Fan ', 'Yong ', 'Gun ', 'Man ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x06f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x06f.php new file mode 100644 index 0000000..8a824a2 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x06f.php @@ -0,0 +1 @@ +<?php return ['Qing ', 'Yu ', 'Piao ', 'Ji ', 'Ya ', 'Jiao ', 'Qi ', 'Xi ', 'Ji ', 'Lu ', 'Lu ', 'Long ', 'Jin ', 'Guo ', 'Cong ', 'Lou ', 'Zhi ', 'Gai ', 'Qiang ', 'Li ', 'Yan ', 'Cao ', 'Jiao ', 'Cong ', 'Qun ', 'Tuan ', 'Ou ', 'Teng ', 'Ye ', 'Xi ', 'Mi ', 'Tang ', 'Mo ', 'Shang ', 'Han ', 'Lian ', 'Lan ', 'Wa ', 'Li ', 'Qian ', 'Feng ', 'Xuan ', 'Yi ', 'Man ', 'Zi ', 'Mang ', 'Kang ', 'Lei ', 'Peng ', 'Shu ', 'Zhang ', 'Zhang ', 'Chong ', 'Xu ', 'Huan ', 'Kuo ', 'Jian ', 'Yan ', 'Chuang ', 'Liao ', 'Cui ', 'Ti ', 'Yang ', 'Jiang ', 'Cong ', 'Ying ', 'Hong ', 'Xun ', 'Shu ', 'Guan ', 'Ying ', 'Xiao ', '[?] ', '[?] ', 'Xu ', 'Lian ', 'Zhi ', 'Wei ', 'Pi ', 'Jue ', 'Jiao ', 'Po ', 'Dang ', 'Hui ', 'Jie ', 'Wu ', 'Pa ', 'Ji ', 'Pan ', 'Gui ', 'Xiao ', 'Qian ', 'Qian ', 'Xi ', 'Lu ', 'Xi ', 'Xuan ', 'Dun ', 'Huang ', 'Min ', 'Run ', 'Su ', 'Liao ', 'Zhen ', 'Zhong ', 'Yi ', 'Di ', 'Wan ', 'Dan ', 'Tan ', 'Chao ', 'Xun ', 'Kui ', 'Yie ', 'Shao ', 'Tu ', 'Zhu ', 'San ', 'Hei ', 'Bi ', 'Shan ', 'Chan ', 'Chan ', 'Shu ', 'Tong ', 'Pu ', 'Lin ', 'Wei ', 'Se ', 'Se ', 'Cheng ', 'Jiong ', 'Cheng ', 'Hua ', 'Jiao ', 'Lao ', 'Che ', 'Gan ', 'Cun ', 'Heng ', 'Si ', 'Shu ', 'Peng ', 'Han ', 'Yun ', 'Liu ', 'Hong ', 'Fu ', 'Hao ', 'He ', 'Xian ', 'Jian ', 'Shan ', 'Xi ', 'Oki ', '[?] ', 'Lan ', '[?] ', 'Yu ', 'Lin ', 'Min ', 'Zao ', 'Dang ', 'Wan ', 'Ze ', 'Xie ', 'Yu ', 'Li ', 'Shi ', 'Xue ', 'Ling ', 'Man ', 'Zi ', 'Yong ', 'Kuai ', 'Can ', 'Lian ', 'Dian ', 'Ye ', 'Ao ', 'Huan ', 'Zhen ', 'Chan ', 'Man ', 'Dan ', 'Dan ', 'Yi ', 'Sui ', 'Pi ', 'Ju ', 'Ta ', 'Qin ', 'Ji ', 'Zhuo ', 'Lian ', 'Nong ', 'Guo ', 'Jin ', 'Fen ', 'Se ', 'Ji ', 'Sui ', 'Hui ', 'Chu ', 'Ta ', 'Song ', 'Ding ', '[?] ', 'Zhu ', 'Lai ', 'Bin ', 'Lian ', 'Mi ', 'Shi ', 'Shu ', 'Mi ', 'Ning ', 'Ying ', 'Ying ', 'Meng ', 'Jin ', 'Qi ', 'Pi ', 'Ji ', 'Hao ', 'Ru ', 'Zui ', 'Wo ', 'Tao ', 'Yin ', 'Yin ', 'Dui ', 'Ci ', 'Huo ', 'Jing ', 'Lan ', 'Jun ', 'Ai ', 'Pu ', 'Zhuo ', 'Wei ', 'Bin ', 'Gu ', 'Qian ', 'Xing ', 'Hama ', 'Kuo ', 'Fei ', '[?] ', 'Boku ', 'Jian ', 'Wei ', 'Luo ', 'Zan ', 'Lu ', 'Li ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x070.php b/vendor/voku/portable-ascii/src/voku/helper/data/x070.php new file mode 100644 index 0000000..1c9e8d1 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x070.php @@ -0,0 +1 @@ +<?php return ['You ', 'Yang ', 'Lu ', 'Si ', 'Jie ', 'Ying ', 'Du ', 'Wang ', 'Hui ', 'Xie ', 'Pan ', 'Shen ', 'Biao ', 'Chan ', 'Mo ', 'Liu ', 'Jian ', 'Pu ', 'Se ', 'Cheng ', 'Gu ', 'Bin ', 'Huo ', 'Xian ', 'Lu ', 'Qin ', 'Han ', 'Ying ', 'Yong ', 'Li ', 'Jing ', 'Xiao ', 'Ying ', 'Sui ', 'Wei ', 'Xie ', 'Huai ', 'Hao ', 'Zhu ', 'Long ', 'Lai ', 'Dui ', 'Fan ', 'Hu ', 'Lai ', '[?] ', '[?] ', 'Ying ', 'Mi ', 'Ji ', 'Lian ', 'Jian ', 'Ying ', 'Fen ', 'Lin ', 'Yi ', 'Jian ', 'Yue ', 'Chan ', 'Dai ', 'Rang ', 'Jian ', 'Lan ', 'Fan ', 'Shuang ', 'Yuan ', 'Zhuo ', 'Feng ', 'She ', 'Lei ', 'Lan ', 'Cong ', 'Qu ', 'Yong ', 'Qian ', 'Fa ', 'Guan ', 'Que ', 'Yan ', 'Hao ', 'Hyeng ', 'Sa ', 'Zan ', 'Luan ', 'Yan ', 'Li ', 'Mi ', 'Shan ', 'Tan ', 'Dang ', 'Jiao ', 'Chan ', '[?] ', 'Hao ', 'Ba ', 'Zhu ', 'Lan ', 'Lan ', 'Nang ', 'Wan ', 'Luan ', 'Xun ', 'Xian ', 'Yan ', 'Gan ', 'Yan ', 'Yu ', 'Huo ', 'Si ', 'Mie ', 'Guang ', 'Deng ', 'Hui ', 'Xiao ', 'Xiao ', 'Hu ', 'Hong ', 'Ling ', 'Zao ', 'Zhuan ', 'Jiu ', 'Zha ', 'Xie ', 'Chi ', 'Zhuo ', 'Zai ', 'Zai ', 'Can ', 'Yang ', 'Qi ', 'Zhong ', 'Fen ', 'Niu ', 'Jiong ', 'Wen ', 'Po ', 'Yi ', 'Lu ', 'Chui ', 'Pi ', 'Kai ', 'Pan ', 'Yan ', 'Kai ', 'Pang ', 'Mu ', 'Chao ', 'Liao ', 'Gui ', 'Kang ', 'Tun ', 'Guang ', 'Xin ', 'Zhi ', 'Guang ', 'Guang ', 'Wei ', 'Qiang ', '[?] ', 'Da ', 'Xia ', 'Zheng ', 'Zhu ', 'Ke ', 'Zhao ', 'Fu ', 'Ba ', 'Duo ', 'Duo ', 'Ling ', 'Zhuo ', 'Xuan ', 'Ju ', 'Tan ', 'Pao ', 'Jiong ', 'Pao ', 'Tai ', 'Tai ', 'Bing ', 'Yang ', 'Tong ', 'Han ', 'Zhu ', 'Zha ', 'Dian ', 'Wei ', 'Shi ', 'Lian ', 'Chi ', 'Huang ', '[?] ', 'Hu ', 'Shuo ', 'Lan ', 'Jing ', 'Jiao ', 'Xu ', 'Xing ', 'Quan ', 'Lie ', 'Huan ', 'Yang ', 'Xiao ', 'Xiu ', 'Xian ', 'Yin ', 'Wu ', 'Zhou ', 'Yao ', 'Shi ', 'Wei ', 'Tong ', 'Xue ', 'Zai ', 'Kai ', 'Hong ', 'Luo ', 'Xia ', 'Zhu ', 'Xuan ', 'Zheng ', 'Po ', 'Yan ', 'Hui ', 'Guang ', 'Zhe ', 'Hui ', 'Kao ', '[?] ', 'Fan ', 'Shao ', 'Ye ', 'Hui ', '[?] ', 'Tang ', 'Jin ', 'Re ', '[?] ', 'Xi ', 'Fu ', 'Jiong ', 'Che ', 'Pu ', 'Jing ', 'Zhuo ', 'Ting ', 'Wan ', 'Hai ', 'Peng ', 'Lang ', 'Shan ', 'Hu ', 'Feng ', 'Chi ', 'Rong ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x071.php b/vendor/voku/portable-ascii/src/voku/helper/data/x071.php new file mode 100644 index 0000000..daadfe8 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x071.php @@ -0,0 +1 @@ +<?php return ['Hu ', 'Xi ', 'Shu ', 'He ', 'Xun ', 'Ku ', 'Jue ', 'Xiao ', 'Xi ', 'Yan ', 'Han ', 'Zhuang ', 'Jun ', 'Di ', 'Xie ', 'Ji ', 'Wu ', '[?] ', '[?] ', 'Han ', 'Yan ', 'Huan ', 'Men ', 'Ju ', 'Chou ', 'Bei ', 'Fen ', 'Lin ', 'Kun ', 'Hun ', 'Tun ', 'Xi ', 'Cui ', 'Wu ', 'Hong ', 'Ju ', 'Fu ', 'Wo ', 'Jiao ', 'Cong ', 'Feng ', 'Ping ', 'Qiong ', 'Ruo ', 'Xi ', 'Qiong ', 'Xin ', 'Zhuo ', 'Yan ', 'Yan ', 'Yi ', 'Jue ', 'Yu ', 'Gang ', 'Ran ', 'Pi ', 'Gu ', '[?] ', 'Sheng ', 'Chang ', 'Shao ', '[?] ', '[?] ', '[?] ', '[?] ', 'Chen ', 'He ', 'Kui ', 'Zhong ', 'Duan ', 'Xia ', 'Hui ', 'Feng ', 'Lian ', 'Xuan ', 'Xing ', 'Huang ', 'Jiao ', 'Jian ', 'Bi ', 'Ying ', 'Zhu ', 'Wei ', 'Tuan ', 'Tian ', 'Xi ', 'Nuan ', 'Nuan ', 'Chan ', 'Yan ', 'Jiong ', 'Jiong ', 'Yu ', 'Mei ', 'Sha ', 'Wei ', 'Ye ', 'Xin ', 'Qiong ', 'Rou ', 'Mei ', 'Huan ', 'Xu ', 'Zhao ', 'Wei ', 'Fan ', 'Qiu ', 'Sui ', 'Yang ', 'Lie ', 'Zhu ', 'Jie ', 'Gao ', 'Gua ', 'Bao ', 'Hu ', 'Yun ', 'Xia ', '[?] ', '[?] ', 'Bian ', 'Gou ', 'Tui ', 'Tang ', 'Chao ', 'Shan ', 'N ', 'Bo ', 'Huang ', 'Xie ', 'Xi ', 'Wu ', 'Xi ', 'Yun ', 'He ', 'He ', 'Xi ', 'Yun ', 'Xiong ', 'Nai ', 'Shan ', 'Qiong ', 'Yao ', 'Xun ', 'Mi ', 'Lian ', 'Ying ', 'Wen ', 'Rong ', 'Oozutsu ', '[?] ', 'Qiang ', 'Liu ', 'Xi ', 'Bi ', 'Biao ', 'Zong ', 'Lu ', 'Jian ', 'Shou ', 'Yi ', 'Lou ', 'Feng ', 'Sui ', 'Yi ', 'Tong ', 'Jue ', 'Zong ', 'Yun ', 'Hu ', 'Yi ', 'Zhi ', 'Ao ', 'Wei ', 'Liao ', 'Han ', 'Ou ', 'Re ', 'Jiong ', 'Man ', '[?] ', 'Shang ', 'Cuan ', 'Zeng ', 'Jian ', 'Xi ', 'Xi ', 'Xi ', 'Yi ', 'Xiao ', 'Chi ', 'Huang ', 'Chan ', 'Ye ', 'Qian ', 'Ran ', 'Yan ', 'Xian ', 'Qiao ', 'Zun ', 'Deng ', 'Dun ', 'Shen ', 'Jiao ', 'Fen ', 'Si ', 'Liao ', 'Yu ', 'Lin ', 'Tong ', 'Shao ', 'Fen ', 'Fan ', 'Yan ', 'Xun ', 'Lan ', 'Mei ', 'Tang ', 'Yi ', 'Jing ', 'Men ', '[?] ', '[?] ', 'Ying ', 'Yu ', 'Yi ', 'Xue ', 'Lan ', 'Tai ', 'Zao ', 'Can ', 'Sui ', 'Xi ', 'Que ', 'Cong ', 'Lian ', 'Hui ', 'Zhu ', 'Xie ', 'Ling ', 'Wei ', 'Yi ', 'Xie ', 'Zhao ', 'Hui ', 'Tatsu ', 'Nung ', 'Lan ', 'Ru ', 'Xian ', 'Kao ', 'Xun ', 'Jin ', 'Chou ', 'Chou ', 'Yao ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x072.php b/vendor/voku/portable-ascii/src/voku/helper/data/x072.php new file mode 100644 index 0000000..f62cfca --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x072.php @@ -0,0 +1 @@ +<?php return ['He ', 'Lan ', 'Biao ', 'Rong ', 'Li ', 'Mo ', 'Bao ', 'Ruo ', 'Lu ', 'La ', 'Ao ', 'Xun ', 'Kuang ', 'Shuo ', '[?] ', 'Li ', 'Lu ', 'Jue ', 'Liao ', 'Yan ', 'Xi ', 'Xie ', 'Long ', 'Ye ', '[?] ', 'Rang ', 'Yue ', 'Lan ', 'Cong ', 'Jue ', 'Tong ', 'Guan ', '[?] ', 'Che ', 'Mi ', 'Tang ', 'Lan ', 'Zhu ', '[?] ', 'Ling ', 'Cuan ', 'Yu ', 'Zhua ', 'Tsumekanmuri ', 'Pa ', 'Zheng ', 'Pao ', 'Cheng ', 'Yuan ', 'Ai ', 'Wei ', '[?] ', 'Jue ', 'Jue ', 'Fu ', 'Ye ', 'Ba ', 'Die ', 'Ye ', 'Yao ', 'Zu ', 'Shuang ', 'Er ', 'Qiang ', 'Chuang ', 'Ge ', 'Zang ', 'Die ', 'Qiang ', 'Yong ', 'Qiang ', 'Pian ', 'Ban ', 'Pan ', 'Shao ', 'Jian ', 'Pai ', 'Du ', 'Chuang ', 'Tou ', 'Zha ', 'Bian ', 'Die ', 'Bang ', 'Bo ', 'Chuang ', 'You ', '[?] ', 'Du ', 'Ya ', 'Cheng ', 'Niu ', 'Ushihen ', 'Pin ', 'Jiu ', 'Mou ', 'Tuo ', 'Mu ', 'Lao ', 'Ren ', 'Mang ', 'Fang ', 'Mao ', 'Mu ', 'Gang ', 'Wu ', 'Yan ', 'Ge ', 'Bei ', 'Si ', 'Jian ', 'Gu ', 'You ', 'Ge ', 'Sheng ', 'Mu ', 'Di ', 'Qian ', 'Quan ', 'Quan ', 'Zi ', 'Te ', 'Xi ', 'Mang ', 'Keng ', 'Qian ', 'Wu ', 'Gu ', 'Xi ', 'Li ', 'Li ', 'Pou ', 'Ji ', 'Gang ', 'Zhi ', 'Ben ', 'Quan ', 'Run ', 'Du ', 'Ju ', 'Jia ', 'Jian ', 'Feng ', 'Pian ', 'Ke ', 'Ju ', 'Kao ', 'Chu ', 'Xi ', 'Bei ', 'Luo ', 'Jie ', 'Ma ', 'San ', 'Wei ', 'Li ', 'Dun ', 'Tong ', '[?] ', 'Jiang ', 'Ikenie ', 'Li ', 'Du ', 'Lie ', 'Pi ', 'Piao ', 'Bao ', 'Xi ', 'Chou ', 'Wei ', 'Kui ', 'Chou ', 'Quan ', 'Fan ', 'Ba ', 'Fan ', 'Qiu ', 'Ji ', 'Cai ', 'Chuo ', 'An ', 'Jie ', 'Zhuang ', 'Guang ', 'Ma ', 'You ', 'Kang ', 'Bo ', 'Hou ', 'Ya ', 'Yin ', 'Huan ', 'Zhuang ', 'Yun ', 'Kuang ', 'Niu ', 'Di ', 'Qing ', 'Zhong ', 'Mu ', 'Bei ', 'Pi ', 'Ju ', 'Ni ', 'Sheng ', 'Pao ', 'Xia ', 'Tuo ', 'Hu ', 'Ling ', 'Fei ', 'Pi ', 'Ni ', 'Ao ', 'You ', 'Gou ', 'Yue ', 'Ju ', 'Dan ', 'Po ', 'Gu ', 'Xian ', 'Ning ', 'Huan ', 'Hen ', 'Jiao ', 'He ', 'Zhao ', 'Ji ', 'Xun ', 'Shan ', 'Ta ', 'Rong ', 'Shou ', 'Tong ', 'Lao ', 'Du ', 'Xia ', 'Shi ', 'Hua ', 'Zheng ', 'Yu ', 'Sun ', 'Yu ', 'Bi ', 'Mang ', 'Xi ', 'Juan ', 'Li ', 'Xia ', 'Yin ', 'Suan ', 'Lang ', 'Bei ', 'Zhi ', 'Yan ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x073.php b/vendor/voku/portable-ascii/src/voku/helper/data/x073.php new file mode 100644 index 0000000..d276c6c --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x073.php @@ -0,0 +1 @@ +<?php return ['Sha ', 'Li ', 'Han ', 'Xian ', 'Jing ', 'Pai ', 'Fei ', 'Yao ', 'Ba ', 'Qi ', 'Ni ', 'Biao ', 'Yin ', 'Lai ', 'Xi ', 'Jian ', 'Qiang ', 'Kun ', 'Yan ', 'Guo ', 'Zong ', 'Mi ', 'Chang ', 'Yi ', 'Zhi ', 'Zheng ', 'Ya ', 'Meng ', 'Cai ', 'Cu ', 'She ', 'Kari ', 'Cen ', 'Luo ', 'Hu ', 'Zong ', 'Ji ', 'Wei ', 'Feng ', 'Wo ', 'Yuan ', 'Xing ', 'Zhu ', 'Mao ', 'Wei ', 'Yuan ', 'Xian ', 'Tuan ', 'Ya ', 'Nao ', 'Xie ', 'Jia ', 'Hou ', 'Bian ', 'You ', 'You ', 'Mei ', 'Zha ', 'Yao ', 'Sun ', 'Bo ', 'Ming ', 'Hua ', 'Yuan ', 'Sou ', 'Ma ', 'Yuan ', 'Dai ', 'Yu ', 'Shi ', 'Hao ', '[?] ', 'Yi ', 'Zhen ', 'Chuang ', 'Hao ', 'Man ', 'Jing ', 'Jiang ', 'Mu ', 'Zhang ', 'Chan ', 'Ao ', 'Ao ', 'Hao ', 'Cui ', 'Fen ', 'Jue ', 'Bi ', 'Bi ', 'Huang ', 'Pu ', 'Lin ', 'Yu ', 'Tong ', 'Yao ', 'Liao ', 'Shuo ', 'Xiao ', 'Swu ', 'Ton ', 'Xi ', 'Ge ', 'Juan ', 'Du ', 'Hui ', 'Kuai ', 'Xian ', 'Xie ', 'Ta ', 'Xian ', 'Xun ', 'Ning ', 'Pin ', 'Huo ', 'Nou ', 'Meng ', 'Lie ', 'Nao ', 'Guang ', 'Shou ', 'Lu ', 'Ta ', 'Xian ', 'Mi ', 'Rang ', 'Huan ', 'Nao ', 'Luo ', 'Xian ', 'Qi ', 'Jue ', 'Xuan ', 'Miao ', 'Zi ', 'Lu ', 'Lu ', 'Yu ', 'Su ', 'Wang ', 'Qiu ', 'Ga ', 'Ding ', 'Le ', 'Ba ', 'Ji ', 'Hong ', 'Di ', 'Quan ', 'Gan ', 'Jiu ', 'Yu ', 'Ji ', 'Yu ', 'Yang ', 'Ma ', 'Gong ', 'Wu ', 'Fu ', 'Wen ', 'Jie ', 'Ya ', 'Fen ', 'Bian ', 'Beng ', 'Yue ', 'Jue ', 'Yun ', 'Jue ', 'Wan ', 'Jian ', 'Mei ', 'Dan ', 'Pi ', 'Wei ', 'Huan ', 'Xian ', 'Qiang ', 'Ling ', 'Dai ', 'Yi ', 'An ', 'Ping ', 'Dian ', 'Fu ', 'Xuan ', 'Xi ', 'Bo ', 'Ci ', 'Gou ', 'Jia ', 'Shao ', 'Po ', 'Ci ', 'Ke ', 'Ran ', 'Sheng ', 'Shen ', 'Yi ', 'Zu ', 'Jia ', 'Min ', 'Shan ', 'Liu ', 'Bi ', 'Zhen ', 'Zhen ', 'Jue ', 'Fa ', 'Long ', 'Jin ', 'Jiao ', 'Jian ', 'Li ', 'Guang ', 'Xian ', 'Zhou ', 'Gong ', 'Yan ', 'Xiu ', 'Yang ', 'Xu ', 'Luo ', 'Su ', 'Zhu ', 'Qin ', 'Ken ', 'Xun ', 'Bao ', 'Er ', 'Xiang ', 'Yao ', 'Xia ', 'Heng ', 'Gui ', 'Chong ', 'Xu ', 'Ban ', 'Pei ', '[?] ', 'Dang ', 'Ei ', 'Hun ', 'Wen ', 'E ', 'Cheng ', 'Ti ', 'Wu ', 'Wu ', 'Cheng ', 'Jun ', 'Mei ', 'Bei ', 'Ting ', 'Xian ', 'Chuo ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x074.php b/vendor/voku/portable-ascii/src/voku/helper/data/x074.php new file mode 100644 index 0000000..70ed068 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x074.php @@ -0,0 +1 @@ +<?php return ['Han ', 'Xuan ', 'Yan ', 'Qiu ', 'Quan ', 'Lang ', 'Li ', 'Xiu ', 'Fu ', 'Liu ', 'Ye ', 'Xi ', 'Ling ', 'Li ', 'Jin ', 'Lian ', 'Suo ', 'Chiisai ', '[?] ', 'Wan ', 'Dian ', 'Pin ', 'Zhan ', 'Cui ', 'Min ', 'Yu ', 'Ju ', 'Chen ', 'Lai ', 'Wen ', 'Sheng ', 'Wei ', 'Dian ', 'Chu ', 'Zhuo ', 'Pei ', 'Cheng ', 'Hu ', 'Qi ', 'E ', 'Kun ', 'Chang ', 'Qi ', 'Beng ', 'Wan ', 'Lu ', 'Cong ', 'Guan ', 'Yan ', 'Diao ', 'Bei ', 'Lin ', 'Qin ', 'Pi ', 'Pa ', 'Que ', 'Zhuo ', 'Qin ', 'Fa ', '[?] ', 'Qiong ', 'Du ', 'Jie ', 'Hun ', 'Yu ', 'Mao ', 'Mei ', 'Chun ', 'Xuan ', 'Ti ', 'Xing ', 'Dai ', 'Rou ', 'Min ', 'Zhen ', 'Wei ', 'Ruan ', 'Huan ', 'Jie ', 'Chuan ', 'Jian ', 'Zhuan ', 'Yang ', 'Lian ', 'Quan ', 'Xia ', 'Duan ', 'Yuan ', 'Ye ', 'Nao ', 'Hu ', 'Ying ', 'Yu ', 'Huang ', 'Rui ', 'Se ', 'Liu ', 'Shi ', 'Rong ', 'Suo ', 'Yao ', 'Wen ', 'Wu ', 'Jin ', 'Jin ', 'Ying ', 'Ma ', 'Tao ', 'Liu ', 'Tang ', 'Li ', 'Lang ', 'Gui ', 'Zhen ', 'Qiang ', 'Cuo ', 'Jue ', 'Zhao ', 'Yao ', 'Ai ', 'Bin ', 'Tu ', 'Chang ', 'Kun ', 'Zhuan ', 'Cong ', 'Jin ', 'Yi ', 'Cui ', 'Cong ', 'Qi ', 'Li ', 'Ying ', 'Suo ', 'Qiu ', 'Xuan ', 'Ao ', 'Lian ', 'Man ', 'Zhang ', 'Yin ', '[?] ', 'Ying ', 'Zhi ', 'Lu ', 'Wu ', 'Deng ', 'Xiou ', 'Zeng ', 'Xun ', 'Qu ', 'Dang ', 'Lin ', 'Liao ', 'Qiong ', 'Su ', 'Huang ', 'Gui ', 'Pu ', 'Jing ', 'Fan ', 'Jin ', 'Liu ', 'Ji ', '[?] ', 'Jing ', 'Ai ', 'Bi ', 'Can ', 'Qu ', 'Zao ', 'Dang ', 'Jiao ', 'Gun ', 'Tan ', 'Hui ', 'Huan ', 'Se ', 'Sui ', 'Tian ', '[?] ', 'Yu ', 'Jin ', 'Lu ', 'Bin ', 'Shou ', 'Wen ', 'Zui ', 'Lan ', 'Xi ', 'Ji ', 'Xuan ', 'Ruan ', 'Huo ', 'Gai ', 'Lei ', 'Du ', 'Li ', 'Zhi ', 'Rou ', 'Li ', 'Zan ', 'Qiong ', 'Zhe ', 'Gui ', 'Sui ', 'La ', 'Long ', 'Lu ', 'Li ', 'Zan ', 'Lan ', 'Ying ', 'Mi ', 'Xiang ', 'Xi ', 'Guan ', 'Dao ', 'Zan ', 'Huan ', 'Gua ', 'Bo ', 'Die ', 'Bao ', 'Hu ', 'Zhi ', 'Piao ', 'Ban ', 'Rang ', 'Li ', 'Wa ', 'Dekaguramu ', 'Jiang ', 'Qian ', 'Fan ', 'Pen ', 'Fang ', 'Dan ', 'Weng ', 'Ou ', 'Deshiguramu ', 'Miriguramu ', 'Thon ', 'Hu ', 'Ling ', 'Yi ', 'Ping ', 'Ci ', 'Hekutogura ', 'Juan ', 'Chang ', 'Chi ', 'Sarake ', 'Dang ', 'Meng ', 'Pou ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x075.php b/vendor/voku/portable-ascii/src/voku/helper/data/x075.php new file mode 100644 index 0000000..e204633 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x075.php @@ -0,0 +1 @@ +<?php return ['Zhui ', 'Ping ', 'Bian ', 'Zhou ', 'Zhen ', 'Senchigura ', 'Ci ', 'Ying ', 'Qi ', 'Xian ', 'Lou ', 'Di ', 'Ou ', 'Meng ', 'Zhuan ', 'Peng ', 'Lin ', 'Zeng ', 'Wu ', 'Pi ', 'Dan ', 'Weng ', 'Ying ', 'Yan ', 'Gan ', 'Dai ', 'Shen ', 'Tian ', 'Tian ', 'Han ', 'Chang ', 'Sheng ', 'Qing ', 'Sheng ', 'Chan ', 'Chan ', 'Rui ', 'Sheng ', 'Su ', 'Sen ', 'Yong ', 'Shuai ', 'Lu ', 'Fu ', 'Yong ', 'Beng ', 'Feng ', 'Ning ', 'Tian ', 'You ', 'Jia ', 'Shen ', 'Zha ', 'Dian ', 'Fu ', 'Nan ', 'Dian ', 'Ping ', 'Ting ', 'Hua ', 'Ting ', 'Quan ', 'Zi ', 'Meng ', 'Bi ', 'Qi ', 'Liu ', 'Xun ', 'Liu ', 'Chang ', 'Mu ', 'Yun ', 'Fan ', 'Fu ', 'Geng ', 'Tian ', 'Jie ', 'Jie ', 'Quan ', 'Wei ', 'Fu ', 'Tian ', 'Mu ', 'Tap ', 'Pan ', 'Jiang ', 'Wa ', 'Da ', 'Nan ', 'Liu ', 'Ben ', 'Zhen ', 'Chu ', 'Mu ', 'Mu ', 'Ce ', 'Cen ', 'Gai ', 'Bi ', 'Da ', 'Zhi ', 'Lue ', 'Qi ', 'Lue ', 'Pan ', 'Kesa ', 'Fan ', 'Hua ', 'Yu ', 'Yu ', 'Mu ', 'Jun ', 'Yi ', 'Liu ', 'Yu ', 'Die ', 'Chou ', 'Hua ', 'Dang ', 'Chuo ', 'Ji ', 'Wan ', 'Jiang ', 'Sheng ', 'Chang ', 'Tuan ', 'Lei ', 'Ji ', 'Cha ', 'Liu ', 'Tatamu ', 'Tuan ', 'Lin ', 'Jiang ', 'Jiang ', 'Chou ', 'Bo ', 'Die ', 'Die ', 'Pi ', 'Nie ', 'Dan ', 'Shu ', 'Shu ', 'Zhi ', 'Yi ', 'Chuang ', 'Nai ', 'Ding ', 'Bi ', 'Jie ', 'Liao ', 'Gong ', 'Ge ', 'Jiu ', 'Zhou ', 'Xia ', 'Shan ', 'Xu ', 'Nue ', 'Li ', 'Yang ', 'Chen ', 'You ', 'Ba ', 'Jie ', 'Jue ', 'Zhi ', 'Xia ', 'Cui ', 'Bi ', 'Yi ', 'Li ', 'Zong ', 'Chuang ', 'Feng ', 'Zhu ', 'Pao ', 'Pi ', 'Gan ', 'Ke ', 'Ci ', 'Xie ', 'Qi ', 'Dan ', 'Zhen ', 'Fa ', 'Zhi ', 'Teng ', 'Ju ', 'Ji ', 'Fei ', 'Qu ', 'Dian ', 'Jia ', 'Xian ', 'Cha ', 'Bing ', 'Ni ', 'Zheng ', 'Yong ', 'Jing ', 'Quan ', 'Chong ', 'Tong ', 'Yi ', 'Kai ', 'Wei ', 'Hui ', 'Duo ', 'Yang ', 'Chi ', 'Zhi ', 'Hen ', 'Ya ', 'Mei ', 'Dou ', 'Jing ', 'Xiao ', 'Tong ', 'Tu ', 'Mang ', 'Pi ', 'Xiao ', 'Suan ', 'Pu ', 'Li ', 'Zhi ', 'Cuo ', 'Duo ', 'Wu ', 'Sha ', 'Lao ', 'Shou ', 'Huan ', 'Xian ', 'Yi ', 'Peng ', 'Zhang ', 'Guan ', 'Tan ', 'Fei ', 'Ma ', 'Lin ', 'Chi ', 'Ji ', 'Dian ', 'An ', 'Chi ', 'Bi ', 'Bei ', 'Min ', 'Gu ', 'Dui ', 'E ', 'Wei ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x076.php b/vendor/voku/portable-ascii/src/voku/helper/data/x076.php new file mode 100644 index 0000000..f55cb58 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x076.php @@ -0,0 +1 @@ +<?php return ['Yu ', 'Cui ', 'Ya ', 'Zhu ', 'Cu ', 'Dan ', 'Shen ', 'Zhung ', 'Ji ', 'Yu ', 'Hou ', 'Feng ', 'La ', 'Yang ', 'Shen ', 'Tu ', 'Yu ', 'Gua ', 'Wen ', 'Huan ', 'Ku ', 'Jia ', 'Yin ', 'Yi ', 'Lu ', 'Sao ', 'Jue ', 'Chi ', 'Xi ', 'Guan ', 'Yi ', 'Wen ', 'Ji ', 'Chuang ', 'Ban ', 'Lei ', 'Liu ', 'Chai ', 'Shou ', 'Nue ', 'Dian ', 'Da ', 'Pie ', 'Tan ', 'Zhang ', 'Biao ', 'Shen ', 'Cu ', 'Luo ', 'Yi ', 'Zong ', 'Chou ', 'Zhang ', 'Zhai ', 'Sou ', 'Suo ', 'Que ', 'Diao ', 'Lou ', 'Lu ', 'Mo ', 'Jin ', 'Yin ', 'Ying ', 'Huang ', 'Fu ', 'Liao ', 'Long ', 'Qiao ', 'Liu ', 'Lao ', 'Xian ', 'Fei ', 'Dan ', 'Yin ', 'He ', 'Yan ', 'Ban ', 'Xian ', 'Guan ', 'Guai ', 'Nong ', 'Yu ', 'Wei ', 'Yi ', 'Yong ', 'Pi ', 'Lei ', 'Li ', 'Shu ', 'Dan ', 'Lin ', 'Dian ', 'Lin ', 'Lai ', 'Pie ', 'Ji ', 'Chi ', 'Yang ', 'Xian ', 'Jie ', 'Zheng ', '[?] ', 'Li ', 'Huo ', 'Lai ', 'Shaku ', 'Dian ', 'Xian ', 'Ying ', 'Yin ', 'Qu ', 'Yong ', 'Tan ', 'Dian ', 'Luo ', 'Luan ', 'Luan ', 'Bo ', '[?] ', 'Gui ', 'Po ', 'Fa ', 'Deng ', 'Fa ', 'Bai ', 'Bai ', 'Qie ', 'Bi ', 'Zao ', 'Zao ', 'Mao ', 'De ', 'Pa ', 'Jie ', 'Huang ', 'Gui ', 'Ci ', 'Ling ', 'Gao ', 'Mo ', 'Ji ', 'Jiao ', 'Peng ', 'Gao ', 'Ai ', 'E ', 'Hao ', 'Han ', 'Bi ', 'Wan ', 'Chou ', 'Qian ', 'Xi ', 'Ai ', 'Jiong ', 'Hao ', 'Huang ', 'Hao ', 'Ze ', 'Cui ', 'Hao ', 'Xiao ', 'Ye ', 'Po ', 'Hao ', 'Jiao ', 'Ai ', 'Xing ', 'Huang ', 'Li ', 'Piao ', 'He ', 'Jiao ', 'Pi ', 'Gan ', 'Pao ', 'Zhou ', 'Jun ', 'Qiu ', 'Cun ', 'Que ', 'Zha ', 'Gu ', 'Jun ', 'Jun ', 'Zhou ', 'Zha ', 'Gu ', 'Zhan ', 'Du ', 'Min ', 'Qi ', 'Ying ', 'Yu ', 'Bei ', 'Zhao ', 'Zhong ', 'Pen ', 'He ', 'Ying ', 'He ', 'Yi ', 'Bo ', 'Wan ', 'He ', 'Ang ', 'Zhan ', 'Yan ', 'Jian ', 'He ', 'Yu ', 'Kui ', 'Fan ', 'Gai ', 'Dao ', 'Pan ', 'Fu ', 'Qiu ', 'Sheng ', 'Dao ', 'Lu ', 'Zhan ', 'Meng ', 'Li ', 'Jin ', 'Xu ', 'Jian ', 'Pan ', 'Guan ', 'An ', 'Lu ', 'Shu ', 'Zhou ', 'Dang ', 'An ', 'Gu ', 'Li ', 'Mu ', 'Cheng ', 'Gan ', 'Xu ', 'Mang ', 'Mang ', 'Zhi ', 'Qi ', 'Ruan ', 'Tian ', 'Xiang ', 'Dun ', 'Xin ', 'Xi ', 'Pan ', 'Feng ', 'Dun ', 'Min ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x077.php b/vendor/voku/portable-ascii/src/voku/helper/data/x077.php new file mode 100644 index 0000000..4b3bdb4 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x077.php @@ -0,0 +1 @@ +<?php return ['Ming ', 'Sheng ', 'Shi ', 'Yun ', 'Mian ', 'Pan ', 'Fang ', 'Miao ', 'Dan ', 'Mei ', 'Mao ', 'Kan ', 'Xian ', 'Ou ', 'Shi ', 'Yang ', 'Zheng ', 'Yao ', 'Shen ', 'Huo ', 'Da ', 'Zhen ', 'Kuang ', 'Ju ', 'Shen ', 'Chi ', 'Sheng ', 'Mei ', 'Mo ', 'Zhu ', 'Zhen ', 'Zhen ', 'Mian ', 'Di ', 'Yuan ', 'Die ', 'Yi ', 'Zi ', 'Zi ', 'Chao ', 'Zha ', 'Xuan ', 'Bing ', 'Mi ', 'Long ', 'Sui ', 'Dong ', 'Mi ', 'Die ', 'Yi ', 'Er ', 'Ming ', 'Xuan ', 'Chi ', 'Kuang ', 'Juan ', 'Mou ', 'Zhen ', 'Tiao ', 'Yang ', 'Yan ', 'Mo ', 'Zhong ', 'Mai ', 'Zhao ', 'Zheng ', 'Mei ', 'Jun ', 'Shao ', 'Han ', 'Huan ', 'Di ', 'Cheng ', 'Cuo ', 'Juan ', 'E ', 'Wan ', 'Xian ', 'Xi ', 'Kun ', 'Lai ', 'Jian ', 'Shan ', 'Tian ', 'Hun ', 'Wan ', 'Ling ', 'Shi ', 'Qiong ', 'Lie ', 'Yai ', 'Jing ', 'Zheng ', 'Li ', 'Lai ', 'Sui ', 'Juan ', 'Shui ', 'Sui ', 'Du ', 'Bi ', 'Bi ', 'Mu ', 'Hun ', 'Ni ', 'Lu ', 'Yi ', 'Jie ', 'Cai ', 'Zhou ', 'Yu ', 'Hun ', 'Ma ', 'Xia ', 'Xing ', 'Xi ', 'Gun ', 'Cai ', 'Chun ', 'Jian ', 'Mei ', 'Du ', 'Hou ', 'Xuan ', 'Ti ', 'Kui ', 'Gao ', 'Rui ', 'Mou ', 'Xu ', 'Fa ', 'Wen ', 'Miao ', 'Chou ', 'Kui ', 'Mi ', 'Weng ', 'Kou ', 'Dang ', 'Chen ', 'Ke ', 'Sou ', 'Xia ', 'Qiong ', 'Mao ', 'Ming ', 'Man ', 'Shui ', 'Ze ', 'Zhang ', 'Yi ', 'Diao ', 'Ou ', 'Mo ', 'Shun ', 'Cong ', 'Lou ', 'Chi ', 'Man ', 'Piao ', 'Cheng ', 'Ji ', 'Meng ', '[?] ', 'Run ', 'Pie ', 'Xi ', 'Qiao ', 'Pu ', 'Zhu ', 'Deng ', 'Shen ', 'Shun ', 'Liao ', 'Che ', 'Xian ', 'Kan ', 'Ye ', 'Xu ', 'Tong ', 'Mou ', 'Lin ', 'Kui ', 'Xian ', 'Ye ', 'Ai ', 'Hui ', 'Zhan ', 'Jian ', 'Gu ', 'Zhao ', 'Qu ', 'Wei ', 'Chou ', 'Sao ', 'Ning ', 'Xun ', 'Yao ', 'Huo ', 'Meng ', 'Mian ', 'Bin ', 'Mian ', 'Li ', 'Kuang ', 'Jue ', 'Xuan ', 'Mian ', 'Huo ', 'Lu ', 'Meng ', 'Long ', 'Guan ', 'Man ', 'Xi ', 'Chu ', 'Tang ', 'Kan ', 'Zhu ', 'Mao ', 'Jin ', 'Lin ', 'Yu ', 'Shuo ', 'Ce ', 'Jue ', 'Shi ', 'Yi ', 'Shen ', 'Zhi ', 'Hou ', 'Shen ', 'Ying ', 'Ju ', 'Zhou ', 'Jiao ', 'Cuo ', 'Duan ', 'Ai ', 'Jiao ', 'Zeng ', 'Huo ', 'Bai ', 'Shi ', 'Ding ', 'Qi ', 'Ji ', 'Zi ', 'Gan ', 'Wu ', 'Tuo ', 'Ku ', 'Qiang ', 'Xi ', 'Fan ', 'Kuang ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x078.php b/vendor/voku/portable-ascii/src/voku/helper/data/x078.php new file mode 100644 index 0000000..27597fc --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x078.php @@ -0,0 +1 @@ +<?php return ['Dang ', 'Ma ', 'Sha ', 'Dan ', 'Jue ', 'Li ', 'Fu ', 'Min ', 'Nuo ', 'Huo ', 'Kang ', 'Zhi ', 'Qi ', 'Kan ', 'Jie ', 'Fen ', 'E ', 'Ya ', 'Pi ', 'Zhe ', 'Yan ', 'Sui ', 'Zhuan ', 'Che ', 'Dun ', 'Pan ', 'Yan ', '[?] ', 'Feng ', 'Fa ', 'Mo ', 'Zha ', 'Qu ', 'Yu ', 'Luo ', 'Tuo ', 'Tuo ', 'Di ', 'Zhai ', 'Zhen ', 'Ai ', 'Fei ', 'Mu ', 'Zhu ', 'Li ', 'Bian ', 'Nu ', 'Ping ', 'Peng ', 'Ling ', 'Pao ', 'Le ', 'Po ', 'Bo ', 'Po ', 'Shen ', 'Za ', 'Nuo ', 'Li ', 'Long ', 'Tong ', '[?] ', 'Li ', 'Aragane ', 'Chu ', 'Keng ', 'Quan ', 'Zhu ', 'Kuang ', 'Huo ', 'E ', 'Nao ', 'Jia ', 'Lu ', 'Wei ', 'Ai ', 'Luo ', 'Ken ', 'Xing ', 'Yan ', 'Tong ', 'Peng ', 'Xi ', '[?] ', 'Hong ', 'Shuo ', 'Xia ', 'Qiao ', '[?] ', 'Wei ', 'Qiao ', '[?] ', 'Keng ', 'Xiao ', 'Que ', 'Chan ', 'Lang ', 'Hong ', 'Yu ', 'Xiao ', 'Xia ', 'Mang ', 'Long ', 'Iong ', 'Che ', 'Che ', 'E ', 'Liu ', 'Ying ', 'Mang ', 'Que ', 'Yan ', 'Sha ', 'Kun ', 'Yu ', '[?] ', 'Kaki ', 'Lu ', 'Chen ', 'Jian ', 'Nue ', 'Song ', 'Zhuo ', 'Keng ', 'Peng ', 'Yan ', 'Zhui ', 'Kong ', 'Ceng ', 'Qi ', 'Zong ', 'Qing ', 'Lin ', 'Jun ', 'Bo ', 'Ding ', 'Min ', 'Diao ', 'Jian ', 'He ', 'Lu ', 'Ai ', 'Sui ', 'Que ', 'Ling ', 'Bei ', 'Yin ', 'Dui ', 'Wu ', 'Qi ', 'Lun ', 'Wan ', 'Dian ', 'Gang ', 'Pei ', 'Qi ', 'Chen ', 'Ruan ', 'Yan ', 'Die ', 'Ding ', 'Du ', 'Tuo ', 'Jie ', 'Ying ', 'Bian ', 'Ke ', 'Bi ', 'Wei ', 'Shuo ', 'Zhen ', 'Duan ', 'Xia ', 'Dang ', 'Ti ', 'Nao ', 'Peng ', 'Jian ', 'Di ', 'Tan ', 'Cha ', 'Seki ', 'Qi ', '[?] ', 'Feng ', 'Xuan ', 'Que ', 'Que ', 'Ma ', 'Gong ', 'Nian ', 'Su ', 'E ', 'Ci ', 'Liu ', 'Si ', 'Tang ', 'Bang ', 'Hua ', 'Pi ', 'Wei ', 'Sang ', 'Lei ', 'Cuo ', 'Zhen ', 'Xia ', 'Qi ', 'Lian ', 'Pan ', 'Wei ', 'Yun ', 'Dui ', 'Zhe ', 'Ke ', 'La ', '[?] ', 'Qing ', 'Gun ', 'Zhuan ', 'Chan ', 'Qi ', 'Ao ', 'Peng ', 'Lu ', 'Lu ', 'Kan ', 'Qiang ', 'Chen ', 'Yin ', 'Lei ', 'Biao ', 'Qi ', 'Mo ', 'Qi ', 'Cui ', 'Zong ', 'Qing ', 'Chuo ', '[?] ', 'Ji ', 'Shan ', 'Lao ', 'Qu ', 'Zeng ', 'Deng ', 'Jian ', 'Xi ', 'Lin ', 'Ding ', 'Dian ', 'Huang ', 'Pan ', 'Za ', 'Qiao ', 'Di ', 'Li ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x079.php b/vendor/voku/portable-ascii/src/voku/helper/data/x079.php new file mode 100644 index 0000000..f8beeec --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x079.php @@ -0,0 +1 @@ +<?php return ['Tani ', 'Jiao ', '[?] ', 'Zhang ', 'Qiao ', 'Dun ', 'Xian ', 'Yu ', 'Zhui ', 'He ', 'Huo ', 'Zhai ', 'Lei ', 'Ke ', 'Chu ', 'Ji ', 'Que ', 'Dang ', 'Yi ', 'Jiang ', 'Pi ', 'Pi ', 'Yu ', 'Pin ', 'Qi ', 'Ai ', 'Kai ', 'Jian ', 'Yu ', 'Ruan ', 'Meng ', 'Pao ', 'Ci ', '[?] ', '[?] ', 'Mie ', 'Ca ', 'Xian ', 'Kuang ', 'Lei ', 'Lei ', 'Zhi ', 'Li ', 'Li ', 'Fan ', 'Que ', 'Pao ', 'Ying ', 'Li ', 'Long ', 'Long ', 'Mo ', 'Bo ', 'Shuang ', 'Guan ', 'Lan ', 'Zan ', 'Yan ', 'Shi ', 'Shi ', 'Li ', 'Reng ', 'She ', 'Yue ', 'Si ', 'Qi ', 'Ta ', 'Ma ', 'Xie ', 'Xian ', 'Xian ', 'Zhi ', 'Qi ', 'Zhi ', 'Beng ', 'Dui ', 'Zhong ', '[?] ', 'Yi ', 'Shi ', 'You ', 'Zhi ', 'Tiao ', 'Fu ', 'Fu ', 'Mi ', 'Zu ', 'Zhi ', 'Suan ', 'Mei ', 'Zuo ', 'Qu ', 'Hu ', 'Zhu ', 'Shen ', 'Sui ', 'Ci ', 'Chai ', 'Mi ', 'Lu ', 'Yu ', 'Xiang ', 'Wu ', 'Tiao ', 'Piao ', 'Zhu ', 'Gui ', 'Xia ', 'Zhi ', 'Ji ', 'Gao ', 'Zhen ', 'Gao ', 'Shui ', 'Jin ', 'Chen ', 'Gai ', 'Kun ', 'Di ', 'Dao ', 'Huo ', 'Tao ', 'Qi ', 'Gu ', 'Guan ', 'Zui ', 'Ling ', 'Lu ', 'Bing ', 'Jin ', 'Dao ', 'Zhi ', 'Lu ', 'Shan ', 'Bei ', 'Zhe ', 'Hui ', 'You ', 'Xi ', 'Yin ', 'Zi ', 'Huo ', 'Zhen ', 'Fu ', 'Yuan ', 'Wu ', 'Xian ', 'Yang ', 'Ti ', 'Yi ', 'Mei ', 'Si ', 'Di ', '[?] ', 'Zhuo ', 'Zhen ', 'Yong ', 'Ji ', 'Gao ', 'Tang ', 'Si ', 'Ma ', 'Ta ', '[?] ', 'Xuan ', 'Qi ', 'Yu ', 'Xi ', 'Ji ', 'Si ', 'Chan ', 'Tan ', 'Kuai ', 'Sui ', 'Li ', 'Nong ', 'Ni ', 'Dao ', 'Li ', 'Rang ', 'Yue ', 'Ti ', 'Zan ', 'Lei ', 'Rou ', 'Yu ', 'Yu ', 'Chi ', 'Xie ', 'Qin ', 'He ', 'Tu ', 'Xiu ', 'Si ', 'Ren ', 'Tu ', 'Zi ', 'Cha ', 'Gan ', 'Yi ', 'Xian ', 'Bing ', 'Nian ', 'Qiu ', 'Qiu ', 'Chong ', 'Fen ', 'Hao ', 'Yun ', 'Ke ', 'Miao ', 'Zhi ', 'Geng ', 'Bi ', 'Zhi ', 'Yu ', 'Mi ', 'Ku ', 'Ban ', 'Pi ', 'Ni ', 'Li ', 'You ', 'Zu ', 'Pi ', 'Ba ', 'Ling ', 'Mo ', 'Cheng ', 'Nian ', 'Qin ', 'Yang ', 'Zuo ', 'Zhi ', 'Zhi ', 'Shu ', 'Ju ', 'Zi ', 'Huo ', 'Ji ', 'Cheng ', 'Tong ', 'Zhi ', 'Huo ', 'He ', 'Yin ', 'Zi ', 'Zhi ', 'Jie ', 'Ren ', 'Du ', 'Yi ', 'Zhu ', 'Hui ', 'Nong ', 'Fu ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x07a.php b/vendor/voku/portable-ascii/src/voku/helper/data/x07a.php new file mode 100644 index 0000000..0017baf --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x07a.php @@ -0,0 +1 @@ +<?php return ['Xi ', 'Kao ', 'Lang ', 'Fu ', 'Ze ', 'Shui ', 'Lu ', 'Kun ', 'Gan ', 'Geng ', 'Ti ', 'Cheng ', 'Tu ', 'Shao ', 'Shui ', 'Ya ', 'Lun ', 'Lu ', 'Gu ', 'Zuo ', 'Ren ', 'Zhun ', 'Bang ', 'Bai ', 'Ji ', 'Zhi ', 'Zhi ', 'Kun ', 'Leng ', 'Peng ', 'Ke ', 'Bing ', 'Chou ', 'Zu ', 'Yu ', 'Su ', 'Lue ', '[?] ', 'Yi ', 'Xi ', 'Bian ', 'Ji ', 'Fu ', 'Bi ', 'Nuo ', 'Jie ', 'Zhong ', 'Zong ', 'Xu ', 'Cheng ', 'Dao ', 'Wen ', 'Lian ', 'Zi ', 'Yu ', 'Ji ', 'Xu ', 'Zhen ', 'Zhi ', 'Dao ', 'Jia ', 'Ji ', 'Gao ', 'Gao ', 'Gu ', 'Rong ', 'Sui ', 'You ', 'Ji ', 'Kang ', 'Mu ', 'Shan ', 'Men ', 'Zhi ', 'Ji ', 'Lu ', 'Su ', 'Ji ', 'Ying ', 'Wen ', 'Qiu ', 'Se ', '[?] ', 'Yi ', 'Huang ', 'Qie ', 'Ji ', 'Sui ', 'Xiao ', 'Pu ', 'Jiao ', 'Zhuo ', 'Tong ', 'Sai ', 'Lu ', 'Sui ', 'Nong ', 'Se ', 'Hui ', 'Rang ', 'Nuo ', 'Yu ', 'Bin ', 'Ji ', 'Tui ', 'Wen ', 'Cheng ', 'Huo ', 'Gong ', 'Lu ', 'Biao ', '[?] ', 'Rang ', 'Zhuo ', 'Li ', 'Zan ', 'Xue ', 'Wa ', 'Jiu ', 'Qiong ', 'Xi ', 'Qiong ', 'Kong ', 'Yu ', 'Sen ', 'Jing ', 'Yao ', 'Chuan ', 'Zhun ', 'Tu ', 'Lao ', 'Qie ', 'Zhai ', 'Yao ', 'Bian ', 'Bao ', 'Yao ', 'Bing ', 'Wa ', 'Zhu ', 'Jiao ', 'Qiao ', 'Diao ', 'Wu ', 'Gui ', 'Yao ', 'Zhi ', 'Chuang ', 'Yao ', 'Tiao ', 'Jiao ', 'Chuang ', 'Jiong ', 'Xiao ', 'Cheng ', 'Kou ', 'Cuan ', 'Wo ', 'Dan ', 'Ku ', 'Ke ', 'Zhui ', 'Xu ', 'Su ', 'Guan ', 'Kui ', 'Dou ', '[?] ', 'Yin ', 'Wo ', 'Wa ', 'Ya ', 'Yu ', 'Ju ', 'Qiong ', 'Yao ', 'Yao ', 'Tiao ', 'Chao ', 'Yu ', 'Tian ', 'Diao ', 'Ju ', 'Liao ', 'Xi ', 'Wu ', 'Kui ', 'Chuang ', 'Zhao ', '[?] ', 'Kuan ', 'Long ', 'Cheng ', 'Cui ', 'Piao ', 'Zao ', 'Cuan ', 'Qiao ', 'Qiong ', 'Dou ', 'Zao ', 'Long ', 'Qie ', 'Li ', 'Chu ', 'Shi ', 'Fou ', 'Qian ', 'Chu ', 'Hong ', 'Qi ', 'Qian ', 'Gong ', 'Shi ', 'Shu ', 'Miao ', 'Ju ', 'Zhan ', 'Zhu ', 'Ling ', 'Long ', 'Bing ', 'Jing ', 'Jing ', 'Zhang ', 'Yi ', 'Si ', 'Jun ', 'Hong ', 'Tong ', 'Song ', 'Jing ', 'Diao ', 'Yi ', 'Shu ', 'Jing ', 'Qu ', 'Jie ', 'Ping ', 'Duan ', 'Shao ', 'Zhuan ', 'Ceng ', 'Deng ', 'Cui ', 'Huai ', 'Jing ', 'Kan ', 'Jing ', 'Zhu ', 'Zhu ', 'Le ', 'Peng ', 'Yu ', 'Chi ', 'Gan ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x07b.php b/vendor/voku/portable-ascii/src/voku/helper/data/x07b.php new file mode 100644 index 0000000..6f74b80 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x07b.php @@ -0,0 +1 @@ +<?php return ['Mang ', 'Zhu ', 'Utsubo ', 'Du ', 'Ji ', 'Xiao ', 'Ba ', 'Suan ', 'Ji ', 'Zhen ', 'Zhao ', 'Sun ', 'Ya ', 'Zhui ', 'Yuan ', 'Hu ', 'Gang ', 'Xiao ', 'Cen ', 'Pi ', 'Bi ', 'Jian ', 'Yi ', 'Dong ', 'Shan ', 'Sheng ', 'Xia ', 'Di ', 'Zhu ', 'Na ', 'Chi ', 'Gu ', 'Li ', 'Qie ', 'Min ', 'Bao ', 'Tiao ', 'Si ', 'Fu ', 'Ce ', 'Ben ', 'Pei ', 'Da ', 'Zi ', 'Di ', 'Ling ', 'Ze ', 'Nu ', 'Fu ', 'Gou ', 'Fan ', 'Jia ', 'Ge ', 'Fan ', 'Shi ', 'Mao ', 'Po ', 'Sey ', 'Jian ', 'Qiong ', 'Long ', 'Souke ', 'Bian ', 'Luo ', 'Gui ', 'Qu ', 'Chi ', 'Yin ', 'Yao ', 'Xian ', 'Bi ', 'Qiong ', 'Gua ', 'Deng ', 'Jiao ', 'Jin ', 'Quan ', 'Sun ', 'Ru ', 'Fa ', 'Kuang ', 'Zhu ', 'Tong ', 'Ji ', 'Da ', 'Xing ', 'Ce ', 'Zhong ', 'Kou ', 'Lai ', 'Bi ', 'Shai ', 'Dang ', 'Zheng ', 'Ce ', 'Fu ', 'Yun ', 'Tu ', 'Pa ', 'Li ', 'Lang ', 'Ju ', 'Guan ', 'Jian ', 'Han ', 'Tong ', 'Xia ', 'Zhi ', 'Cheng ', 'Suan ', 'Shi ', 'Zhu ', 'Zuo ', 'Xiao ', 'Shao ', 'Ting ', 'Ce ', 'Yan ', 'Gao ', 'Kuai ', 'Gan ', 'Chou ', 'Kago ', 'Gang ', 'Yun ', 'O ', 'Qian ', 'Xiao ', 'Jian ', 'Pu ', 'Lai ', 'Zou ', 'Bi ', 'Bi ', 'Bi ', 'Ge ', 'Chi ', 'Guai ', 'Yu ', 'Jian ', 'Zhao ', 'Gu ', 'Chi ', 'Zheng ', 'Jing ', 'Sha ', 'Zhou ', 'Lu ', 'Bo ', 'Ji ', 'Lin ', 'Suan ', 'Jun ', 'Fu ', 'Zha ', 'Gu ', 'Kong ', 'Qian ', 'Quan ', 'Jun ', 'Chui ', 'Guan ', 'Yuan ', 'Ce ', 'Ju ', 'Bo ', 'Ze ', 'Qie ', 'Tuo ', 'Luo ', 'Dan ', 'Xiao ', 'Ruo ', 'Jian ', 'Xuan ', 'Bian ', 'Sun ', 'Xiang ', 'Xian ', 'Ping ', 'Zhen ', 'Sheng ', 'Hu ', 'Shi ', 'Zhu ', 'Yue ', 'Chun ', 'Lu ', 'Wu ', 'Dong ', 'Xiao ', 'Ji ', 'Jie ', 'Huang ', 'Xing ', 'Mei ', 'Fan ', 'Chui ', 'Zhuan ', 'Pian ', 'Feng ', 'Zhu ', 'Hong ', 'Qie ', 'Hou ', 'Qiu ', 'Miao ', 'Qian ', '[?] ', 'Kui ', 'Sik ', 'Lou ', 'Yun ', 'He ', 'Tang ', 'Yue ', 'Chou ', 'Gao ', 'Fei ', 'Ruo ', 'Zheng ', 'Gou ', 'Nie ', 'Qian ', 'Xiao ', 'Cuan ', 'Gong ', 'Pang ', 'Du ', 'Li ', 'Bi ', 'Zhuo ', 'Chu ', 'Shai ', 'Chi ', 'Zhu ', 'Qiang ', 'Long ', 'Lan ', 'Jian ', 'Bu ', 'Li ', 'Hui ', 'Bi ', 'Di ', 'Cong ', 'Yan ', 'Peng ', 'Sen ', 'Zhuan ', 'Pai ', 'Piao ', 'Dou ', 'Yu ', 'Mie ', 'Zhuan ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x07c.php b/vendor/voku/portable-ascii/src/voku/helper/data/x07c.php new file mode 100644 index 0000000..93321f8 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x07c.php @@ -0,0 +1 @@ +<?php return ['Ze ', 'Xi ', 'Guo ', 'Yi ', 'Hu ', 'Chan ', 'Kou ', 'Cu ', 'Ping ', 'Chou ', 'Ji ', 'Gui ', 'Su ', 'Lou ', 'Zha ', 'Lu ', 'Nian ', 'Suo ', 'Cuan ', 'Sasara ', 'Suo ', 'Le ', 'Duan ', 'Yana ', 'Xiao ', 'Bo ', 'Mi ', 'Si ', 'Dang ', 'Liao ', 'Dan ', 'Dian ', 'Fu ', 'Jian ', 'Min ', 'Kui ', 'Dai ', 'Qiao ', 'Deng ', 'Huang ', 'Sun ', 'Lao ', 'Zan ', 'Xiao ', 'Du ', 'Shi ', 'Zan ', '[?] ', 'Pai ', 'Hata ', 'Pai ', 'Gan ', 'Ju ', 'Du ', 'Lu ', 'Yan ', 'Bo ', 'Dang ', 'Sai ', 'Ke ', 'Long ', 'Qian ', 'Lian ', 'Bo ', 'Zhou ', 'Lai ', '[?] ', 'Lan ', 'Kui ', 'Yu ', 'Yue ', 'Hao ', 'Zhen ', 'Tai ', 'Ti ', 'Mi ', 'Chou ', 'Ji ', '[?] ', 'Hata ', 'Teng ', 'Zhuan ', 'Zhou ', 'Fan ', 'Sou ', 'Zhou ', 'Kuji ', 'Zhuo ', 'Teng ', 'Lu ', 'Lu ', 'Jian ', 'Tuo ', 'Ying ', 'Yu ', 'Lai ', 'Long ', 'Shinshi ', 'Lian ', 'Lan ', 'Qian ', 'Yue ', 'Zhong ', 'Qu ', 'Lian ', 'Bian ', 'Duan ', 'Zuan ', 'Li ', 'Si ', 'Luo ', 'Ying ', 'Yue ', 'Zhuo ', 'Xu ', 'Mi ', 'Di ', 'Fan ', 'Shen ', 'Zhe ', 'Shen ', 'Nu ', 'Xie ', 'Lei ', 'Xian ', 'Zi ', 'Ni ', 'Cun ', '[?] ', 'Qian ', 'Kume ', 'Bi ', 'Ban ', 'Wu ', 'Sha ', 'Kang ', 'Rou ', 'Fen ', 'Bi ', 'Cui ', '[?] ', 'Li ', 'Chi ', 'Nukamiso ', 'Ro ', 'Ba ', 'Li ', 'Gan ', 'Ju ', 'Po ', 'Mo ', 'Cu ', 'Nian ', 'Zhou ', 'Li ', 'Su ', 'Tiao ', 'Li ', 'Qi ', 'Su ', 'Hong ', 'Tong ', 'Zi ', 'Ce ', 'Yue ', 'Zhou ', 'Lin ', 'Zhuang ', 'Bai ', '[?] ', 'Fen ', 'Ji ', '[?] ', 'Sukumo ', 'Liang ', 'Xian ', 'Fu ', 'Liang ', 'Can ', 'Geng ', 'Li ', 'Yue ', 'Lu ', 'Ju ', 'Qi ', 'Cui ', 'Bai ', 'Zhang ', 'Lin ', 'Zong ', 'Jing ', 'Guo ', 'Kouji ', 'San ', 'San ', 'Tang ', 'Bian ', 'Rou ', 'Mian ', 'Hou ', 'Xu ', 'Zong ', 'Hu ', 'Jian ', 'Zan ', 'Ci ', 'Li ', 'Xie ', 'Fu ', 'Ni ', 'Bei ', 'Gu ', 'Xiu ', 'Gao ', 'Tang ', 'Qiu ', 'Sukumo ', 'Cao ', 'Zhuang ', 'Tang ', 'Mi ', 'San ', 'Fen ', 'Zao ', 'Kang ', 'Jiang ', 'Mo ', 'San ', 'San ', 'Nuo ', 'Xi ', 'Liang ', 'Jiang ', 'Kuai ', 'Bo ', 'Huan ', '[?] ', 'Zong ', 'Xian ', 'Nuo ', 'Tuan ', 'Nie ', 'Li ', 'Zuo ', 'Di ', 'Nie ', 'Tiao ', 'Lan ', 'Mi ', 'Jiao ', 'Jiu ', 'Xi ', 'Gong ', 'Zheng ', 'Jiu ', 'You ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x07d.php b/vendor/voku/portable-ascii/src/voku/helper/data/x07d.php new file mode 100644 index 0000000..6d05a29 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x07d.php @@ -0,0 +1 @@ +<?php return ['Ji ', 'Cha ', 'Zhou ', 'Xun ', 'Yue ', 'Hong ', 'Yu ', 'He ', 'Wan ', 'Ren ', 'Wen ', 'Wen ', 'Qiu ', 'Na ', 'Zi ', 'Tou ', 'Niu ', 'Fou ', 'Jie ', 'Shu ', 'Chun ', 'Pi ', 'Yin ', 'Sha ', 'Hong ', 'Zhi ', 'Ji ', 'Fen ', 'Yun ', 'Ren ', 'Dan ', 'Jin ', 'Su ', 'Fang ', 'Suo ', 'Cui ', 'Jiu ', 'Zha ', 'Kinu ', 'Jin ', 'Fu ', 'Zhi ', 'Ci ', 'Zi ', 'Chou ', 'Hong ', 'Zha ', 'Lei ', 'Xi ', 'Fu ', 'Xie ', 'Shen ', 'Bei ', 'Zhu ', 'Qu ', 'Ling ', 'Zhu ', 'Shao ', 'Gan ', 'Yang ', 'Fu ', 'Tuo ', 'Zhen ', 'Dai ', 'Zhuo ', 'Shi ', 'Zhong ', 'Xian ', 'Zu ', 'Jiong ', 'Ban ', 'Ju ', 'Mo ', 'Shu ', 'Zui ', 'Wata ', 'Jing ', 'Ren ', 'Heng ', 'Xie ', 'Jie ', 'Zhu ', 'Chou ', 'Gua ', 'Bai ', 'Jue ', 'Kuang ', 'Hu ', 'Ci ', 'Geng ', 'Geng ', 'Tao ', 'Xie ', 'Ku ', 'Jiao ', 'Quan ', 'Gai ', 'Luo ', 'Xuan ', 'Bing ', 'Xian ', 'Fu ', 'Gei ', 'Tong ', 'Rong ', 'Tiao ', 'Yin ', 'Lei ', 'Xie ', 'Quan ', 'Xu ', 'Lun ', 'Die ', 'Tong ', 'Si ', 'Jiang ', 'Xiang ', 'Hui ', 'Jue ', 'Zhi ', 'Jian ', 'Juan ', 'Chi ', 'Mian ', 'Zhen ', 'Lu ', 'Cheng ', 'Qiu ', 'Shu ', 'Bang ', 'Tong ', 'Xiao ', 'Wan ', 'Qin ', 'Geng ', 'Xiu ', 'Ti ', 'Xiu ', 'Xie ', 'Hong ', 'Xi ', 'Fu ', 'Ting ', 'Sui ', 'Dui ', 'Kun ', 'Fu ', 'Jing ', 'Hu ', 'Zhi ', 'Yan ', 'Jiong ', 'Feng ', 'Ji ', 'Sok ', 'Kase ', 'Zong ', 'Lin ', 'Duo ', 'Li ', 'Lu ', 'Liang ', 'Chou ', 'Quan ', 'Shao ', 'Qi ', 'Qi ', 'Zhun ', 'Qi ', 'Wan ', 'Qian ', 'Xian ', 'Shou ', 'Wei ', 'Qi ', 'Tao ', 'Wan ', 'Gang ', 'Wang ', 'Beng ', 'Zhui ', 'Cai ', 'Guo ', 'Cui ', 'Lun ', 'Liu ', 'Qi ', 'Zhan ', 'Bei ', 'Chuo ', 'Ling ', 'Mian ', 'Qi ', 'Qie ', 'Tan ', 'Zong ', 'Gun ', 'Zou ', 'Yi ', 'Zi ', 'Xing ', 'Liang ', 'Jin ', 'Fei ', 'Rui ', 'Min ', 'Yu ', 'Zong ', 'Fan ', 'Lu ', 'Xu ', 'Yingl ', 'Zhang ', 'Kasuri ', 'Xu ', 'Xiang ', 'Jian ', 'Ke ', 'Xian ', 'Ruan ', 'Mian ', 'Qi ', 'Duan ', 'Zhong ', 'Di ', 'Min ', 'Miao ', 'Yuan ', 'Xie ', 'Bao ', 'Si ', 'Qiu ', 'Bian ', 'Huan ', 'Geng ', 'Cong ', 'Mian ', 'Wei ', 'Fu ', 'Wei ', 'Yu ', 'Gou ', 'Miao ', 'Xie ', 'Lian ', 'Zong ', 'Bian ', 'Yun ', 'Yin ', 'Ti ', 'Gua ', 'Zhi ', 'Yun ', 'Cheng ', 'Chan ', 'Dai ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x07e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x07e.php new file mode 100644 index 0000000..83a776f --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x07e.php @@ -0,0 +1 @@ +<?php return ['Xia ', 'Yuan ', 'Zong ', 'Xu ', 'Nawa ', 'Odoshi ', 'Geng ', 'Sen ', 'Ying ', 'Jin ', 'Yi ', 'Zhui ', 'Ni ', 'Bang ', 'Gu ', 'Pan ', 'Zhou ', 'Jian ', 'Cuo ', 'Quan ', 'Shuang ', 'Yun ', 'Xia ', 'Shuai ', 'Xi ', 'Rong ', 'Tao ', 'Fu ', 'Yun ', 'Zhen ', 'Gao ', 'Ru ', 'Hu ', 'Zai ', 'Teng ', 'Xian ', 'Su ', 'Zhen ', 'Zong ', 'Tao ', 'Horo ', 'Cai ', 'Bi ', 'Feng ', 'Cu ', 'Li ', 'Suo ', 'Yin ', 'Xi ', 'Zong ', 'Lei ', 'Zhuan ', 'Qian ', 'Man ', 'Zhi ', 'Lu ', 'Mo ', 'Piao ', 'Lian ', 'Mi ', 'Xuan ', 'Zong ', 'Ji ', 'Shan ', 'Sui ', 'Fan ', 'Shuai ', 'Beng ', 'Yi ', 'Sao ', 'Mou ', 'Zhou ', 'Qiang ', 'Hun ', 'Sem ', 'Xi ', 'Jung ', 'Xiu ', 'Ran ', 'Xuan ', 'Hui ', 'Qiao ', 'Zeng ', 'Zuo ', 'Zhi ', 'Shan ', 'San ', 'Lin ', 'Yu ', 'Fan ', 'Liao ', 'Chuo ', 'Zun ', 'Jian ', 'Rao ', 'Chan ', 'Rui ', 'Xiu ', 'Hui ', 'Hua ', 'Zuan ', 'Xi ', 'Qiang ', 'Un ', 'Da ', 'Sheng ', 'Hui ', 'Xi ', 'Se ', 'Jian ', 'Jiang ', 'Huan ', 'Zao ', 'Cong ', 'Jie ', 'Jiao ', 'Bo ', 'Chan ', 'Yi ', 'Nao ', 'Sui ', 'Yi ', 'Shai ', 'Xu ', 'Ji ', 'Bin ', 'Qian ', 'Lan ', 'Pu ', 'Xun ', 'Zuan ', 'Qi ', 'Peng ', 'Li ', 'Mo ', 'Lei ', 'Xie ', 'Zuan ', 'Kuang ', 'You ', 'Xu ', 'Lei ', 'Xian ', 'Chan ', 'Kou ', 'Lu ', 'Chan ', 'Ying ', 'Cai ', 'Xiang ', 'Xian ', 'Zui ', 'Zuan ', 'Luo ', 'Xi ', 'Dao ', 'Lan ', 'Lei ', 'Lian ', 'Si ', 'Jiu ', 'Yu ', 'Hong ', 'Zhou ', 'Xian ', 'He ', 'Yue ', 'Ji ', 'Wan ', 'Kuang ', 'Ji ', 'Ren ', 'Wei ', 'Yun ', 'Hong ', 'Chun ', 'Pi ', 'Sha ', 'Gang ', 'Na ', 'Ren ', 'Zong ', 'Lun ', 'Fen ', 'Zhi ', 'Wen ', 'Fang ', 'Zhu ', 'Yin ', 'Niu ', 'Shu ', 'Xian ', 'Gan ', 'Xie ', 'Fu ', 'Lian ', 'Zu ', 'Shen ', 'Xi ', 'Zhi ', 'Zhong ', 'Zhou ', 'Ban ', 'Fu ', 'Zhuo ', 'Shao ', 'Yi ', 'Jing ', 'Dai ', 'Bang ', 'Rong ', 'Jie ', 'Ku ', 'Rao ', 'Die ', 'Heng ', 'Hui ', 'Gei ', 'Xuan ', 'Jiang ', 'Luo ', 'Jue ', 'Jiao ', 'Tong ', 'Geng ', 'Xiao ', 'Juan ', 'Xiu ', 'Xi ', 'Sui ', 'Tao ', 'Ji ', 'Ti ', 'Ji ', 'Xu ', 'Ling ', '[?] ', 'Xu ', 'Qi ', 'Fei ', 'Chuo ', 'Zhang ', 'Gun ', 'Sheng ', 'Wei ', 'Mian ', 'Shou ', 'Beng ', 'Chou ', 'Tao ', 'Liu ', 'Quan ', 'Zong ', 'Zhan ', 'Wan ', 'Lu ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x07f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x07f.php new file mode 100644 index 0000000..22e58a9 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x07f.php @@ -0,0 +1 @@ +<?php return ['Zhui ', 'Zi ', 'Ke ', 'Xiang ', 'Jian ', 'Mian ', 'Lan ', 'Ti ', 'Miao ', 'Qi ', 'Yun ', 'Hui ', 'Si ', 'Duo ', 'Duan ', 'Bian ', 'Xian ', 'Gou ', 'Zhui ', 'Huan ', 'Di ', 'Lu ', 'Bian ', 'Min ', 'Yuan ', 'Jin ', 'Fu ', 'Ru ', 'Zhen ', 'Feng ', 'Shuai ', 'Gao ', 'Chan ', 'Li ', 'Yi ', 'Jian ', 'Bin ', 'Piao ', 'Man ', 'Lei ', 'Ying ', 'Suo ', 'Mou ', 'Sao ', 'Xie ', 'Liao ', 'Shan ', 'Zeng ', 'Jiang ', 'Qian ', 'Zao ', 'Huan ', 'Jiao ', 'Zuan ', 'Fou ', 'Xie ', 'Gang ', 'Fou ', 'Que ', 'Fou ', 'Kaakeru ', 'Bo ', 'Ping ', 'Hou ', '[?] ', 'Gang ', 'Ying ', 'Ying ', 'Qing ', 'Xia ', 'Guan ', 'Zun ', 'Tan ', 'Chang ', 'Qi ', 'Weng ', 'Ying ', 'Lei ', 'Tan ', 'Lu ', 'Guan ', 'Wang ', 'Wang ', 'Gang ', 'Wang ', 'Han ', '[?] ', 'Luo ', 'Fu ', 'Mi ', 'Fa ', 'Gu ', 'Zhu ', 'Ju ', 'Mao ', 'Gu ', 'Min ', 'Gang ', 'Ba ', 'Gua ', 'Ti ', 'Juan ', 'Fu ', 'Lin ', 'Yan ', 'Zhao ', 'Zui ', 'Gua ', 'Zhuo ', 'Yu ', 'Zhi ', 'An ', 'Fa ', 'Nan ', 'Shu ', 'Si ', 'Pi ', 'Ma ', 'Liu ', 'Ba ', 'Fa ', 'Li ', 'Chao ', 'Wei ', 'Bi ', 'Ji ', 'Zeng ', 'Tong ', 'Liu ', 'Ji ', 'Juan ', 'Mi ', 'Zhao ', 'Luo ', 'Pi ', 'Ji ', 'Ji ', 'Luan ', 'Yang ', 'Mie ', 'Qiang ', 'Ta ', 'Mei ', 'Yang ', 'You ', 'You ', 'Fen ', 'Ba ', 'Gao ', 'Yang ', 'Gu ', 'Qiang ', 'Zang ', 'Gao ', 'Ling ', 'Yi ', 'Zhu ', 'Di ', 'Xiu ', 'Qian ', 'Yi ', 'Xian ', 'Rong ', 'Qun ', 'Qun ', 'Qian ', 'Huan ', 'Zui ', 'Xian ', 'Yi ', 'Yashinau ', 'Qiang ', 'Xian ', 'Yu ', 'Geng ', 'Jie ', 'Tang ', 'Yuan ', 'Xi ', 'Fan ', 'Shan ', 'Fen ', 'Shan ', 'Lian ', 'Lei ', 'Geng ', 'Nou ', 'Qiang ', 'Chan ', 'Yu ', 'Gong ', 'Yi ', 'Chong ', 'Weng ', 'Fen ', 'Hong ', 'Chi ', 'Chi ', 'Cui ', 'Fu ', 'Xia ', 'Pen ', 'Yi ', 'La ', 'Yi ', 'Pi ', 'Ling ', 'Liu ', 'Zhi ', 'Qu ', 'Xi ', 'Xie ', 'Xiang ', 'Xi ', 'Xi ', 'Qi ', 'Qiao ', 'Hui ', 'Hui ', 'Xiao ', 'Se ', 'Hong ', 'Jiang ', 'Di ', 'Cui ', 'Fei ', 'Tao ', 'Sha ', 'Chi ', 'Zhu ', 'Jian ', 'Xuan ', 'Shi ', 'Pian ', 'Zong ', 'Wan ', 'Hui ', 'Hou ', 'He ', 'He ', 'Han ', 'Ao ', 'Piao ', 'Yi ', 'Lian ', 'Qu ', '[?] ', 'Lin ', 'Pen ', 'Qiao ', 'Ao ', 'Fan ', 'Yi ', 'Hui ', 'Xuan ', 'Dao ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x080.php b/vendor/voku/portable-ascii/src/voku/helper/data/x080.php new file mode 100644 index 0000000..8548ed8 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x080.php @@ -0,0 +1 @@ +<?php return ['Yao ', 'Lao ', '[?] ', 'Kao ', 'Mao ', 'Zhe ', 'Qi ', 'Gou ', 'Gou ', 'Gou ', 'Die ', 'Die ', 'Er ', 'Shua ', 'Ruan ', 'Er ', 'Nai ', 'Zhuan ', 'Lei ', 'Ting ', 'Zi ', 'Geng ', 'Chao ', 'Hao ', 'Yun ', 'Pa ', 'Pi ', 'Chi ', 'Si ', 'Chu ', 'Jia ', 'Ju ', 'He ', 'Chu ', 'Lao ', 'Lun ', 'Ji ', 'Tang ', 'Ou ', 'Lou ', 'Nou ', 'Gou ', 'Pang ', 'Ze ', 'Lou ', 'Ji ', 'Lao ', 'Huo ', 'You ', 'Mo ', 'Huai ', 'Er ', 'Zhe ', 'Ting ', 'Ye ', 'Da ', 'Song ', 'Qin ', 'Yun ', 'Chi ', 'Dan ', 'Dan ', 'Hong ', 'Geng ', 'Zhi ', '[?] ', 'Nie ', 'Dan ', 'Zhen ', 'Che ', 'Ling ', 'Zheng ', 'You ', 'Wa ', 'Liao ', 'Long ', 'Zhi ', 'Ning ', 'Tiao ', 'Er ', 'Ya ', 'Die ', 'Gua ', '[?] ', 'Lian ', 'Hao ', 'Sheng ', 'Lie ', 'Pin ', 'Jing ', 'Ju ', 'Bi ', 'Di ', 'Guo ', 'Wen ', 'Xu ', 'Ping ', 'Cong ', 'Shikato ', '[?] ', 'Ting ', 'Yu ', 'Cong ', 'Kui ', 'Tsuraneru ', 'Kui ', 'Cong ', 'Lian ', 'Weng ', 'Kui ', 'Lian ', 'Lian ', 'Cong ', 'Ao ', 'Sheng ', 'Song ', 'Ting ', 'Kui ', 'Nie ', 'Zhi ', 'Dan ', 'Ning ', 'Qie ', 'Ji ', 'Ting ', 'Ting ', 'Long ', 'Yu ', 'Yu ', 'Zhao ', 'Si ', 'Su ', 'Yi ', 'Su ', 'Si ', 'Zhao ', 'Zhao ', 'Rou ', 'Yi ', 'Le ', 'Ji ', 'Qiu ', 'Ken ', 'Cao ', 'Ge ', 'Di ', 'Huan ', 'Huang ', 'Yi ', 'Ren ', 'Xiao ', 'Ru ', 'Zhou ', 'Yuan ', 'Du ', 'Gang ', 'Rong ', 'Gan ', 'Cha ', 'Wo ', 'Chang ', 'Gu ', 'Zhi ', 'Han ', 'Fu ', 'Fei ', 'Fen ', 'Pei ', 'Pang ', 'Jian ', 'Fang ', 'Zhun ', 'You ', 'Na ', 'Hang ', 'Ken ', 'Ran ', 'Gong ', 'Yu ', 'Wen ', 'Yao ', 'Jin ', 'Pi ', 'Qian ', 'Xi ', 'Xi ', 'Fei ', 'Ken ', 'Jing ', 'Tai ', 'Shen ', 'Zhong ', 'Zhang ', 'Xie ', 'Shen ', 'Wei ', 'Zhou ', 'Die ', 'Dan ', 'Fei ', 'Ba ', 'Bo ', 'Qu ', 'Tian ', 'Bei ', 'Gua ', 'Tai ', 'Zi ', 'Ku ', 'Zhi ', 'Ni ', 'Ping ', 'Zi ', 'Fu ', 'Pang ', 'Zhen ', 'Xian ', 'Zuo ', 'Pei ', 'Jia ', 'Sheng ', 'Zhi ', 'Bao ', 'Mu ', 'Qu ', 'Hu ', 'Ke ', 'Yi ', 'Yin ', 'Xu ', 'Yang ', 'Long ', 'Dong ', 'Ka ', 'Lu ', 'Jing ', 'Nu ', 'Yan ', 'Pang ', 'Kua ', 'Yi ', 'Guang ', 'Gai ', 'Ge ', 'Dong ', 'Zhi ', 'Xiao ', 'Xiong ', 'Xiong ', 'Er ', 'E ', 'Xing ', 'Pian ', 'Neng ', 'Zi ', 'Gui ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x081.php b/vendor/voku/portable-ascii/src/voku/helper/data/x081.php new file mode 100644 index 0000000..daab08c --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x081.php @@ -0,0 +1 @@ +<?php return ['Cheng ', 'Tiao ', 'Zhi ', 'Cui ', 'Mei ', 'Xie ', 'Cui ', 'Xie ', 'Mo ', 'Mai ', 'Ji ', 'Obiyaakasu ', '[?] ', 'Kuai ', 'Sa ', 'Zang ', 'Qi ', 'Nao ', 'Mi ', 'Nong ', 'Luan ', 'Wan ', 'Bo ', 'Wen ', 'Guan ', 'Qiu ', 'Jiao ', 'Jing ', 'Rou ', 'Heng ', 'Cuo ', 'Lie ', 'Shan ', 'Ting ', 'Mei ', 'Chun ', 'Shen ', 'Xie ', 'De ', 'Zui ', 'Cu ', 'Xiu ', 'Xin ', 'Tuo ', 'Pao ', 'Cheng ', 'Nei ', 'Fu ', 'Dou ', 'Tuo ', 'Niao ', 'Noy ', 'Pi ', 'Gu ', 'Gua ', 'Li ', 'Lian ', 'Zhang ', 'Cui ', 'Jie ', 'Liang ', 'Zhou ', 'Pi ', 'Biao ', 'Lun ', 'Pian ', 'Guo ', 'Kui ', 'Chui ', 'Dan ', 'Tian ', 'Nei ', 'Jing ', 'Jie ', 'La ', 'Yi ', 'An ', 'Ren ', 'Shen ', 'Chuo ', 'Fu ', 'Fu ', 'Ju ', 'Fei ', 'Qiang ', 'Wan ', 'Dong ', 'Pi ', 'Guo ', 'Zong ', 'Ding ', 'Wu ', 'Mei ', 'Ruan ', 'Zhuan ', 'Zhi ', 'Cou ', 'Gua ', 'Ou ', 'Di ', 'An ', 'Xing ', 'Nao ', 'Yu ', 'Chuan ', 'Nan ', 'Yun ', 'Zhong ', 'Rou ', 'E ', 'Sai ', 'Tu ', 'Yao ', 'Jian ', 'Wei ', 'Jiao ', 'Yu ', 'Jia ', 'Duan ', 'Bi ', 'Chang ', 'Fu ', 'Xian ', 'Ni ', 'Mian ', 'Wa ', 'Teng ', 'Tui ', 'Bang ', 'Qian ', 'Lu ', 'Wa ', 'Sou ', 'Tang ', 'Su ', 'Zhui ', 'Ge ', 'Yi ', 'Bo ', 'Liao ', 'Ji ', 'Pi ', 'Xie ', 'Gao ', 'Lu ', 'Bin ', 'Ou ', 'Chang ', 'Lu ', 'Guo ', 'Pang ', 'Chuai ', 'Piao ', 'Jiang ', 'Fu ', 'Tang ', 'Mo ', 'Xi ', 'Zhuan ', 'Lu ', 'Jiao ', 'Ying ', 'Lu ', 'Zhi ', 'Tara ', 'Chun ', 'Lian ', 'Tong ', 'Peng ', 'Ni ', 'Zha ', 'Liao ', 'Cui ', 'Gui ', 'Xiao ', 'Teng ', 'Fan ', 'Zhi ', 'Jiao ', 'Shan ', 'Wu ', 'Cui ', 'Run ', 'Xiang ', 'Sui ', 'Fen ', 'Ying ', 'Tan ', 'Zhua ', 'Dan ', 'Kuai ', 'Nong ', 'Tun ', 'Lian ', 'Bi ', 'Yong ', 'Jue ', 'Chu ', 'Yi ', 'Juan ', 'La ', 'Lian ', 'Sao ', 'Tun ', 'Gu ', 'Qi ', 'Cui ', 'Bin ', 'Xun ', 'Ru ', 'Huo ', 'Zang ', 'Xian ', 'Biao ', 'Xing ', 'Kuan ', 'La ', 'Yan ', 'Lu ', 'Huo ', 'Zang ', 'Luo ', 'Qu ', 'Zang ', 'Luan ', 'Ni ', 'Zang ', 'Chen ', 'Qian ', 'Wo ', 'Guang ', 'Zang ', 'Lin ', 'Guang ', 'Zi ', 'Jiao ', 'Nie ', 'Chou ', 'Ji ', 'Gao ', 'Chou ', 'Mian ', 'Nie ', 'Zhi ', 'Zhi ', 'Ge ', 'Jian ', 'Die ', 'Zhi ', 'Xiu ', 'Tai ', 'Zhen ', 'Jiu ', 'Xian ', 'Yu ', 'Cha ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x082.php b/vendor/voku/portable-ascii/src/voku/helper/data/x082.php new file mode 100644 index 0000000..2ac2289 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x082.php @@ -0,0 +1 @@ +<?php return ['Yao ', 'Yu ', 'Chong ', 'Xi ', 'Xi ', 'Jiu ', 'Yu ', 'Yu ', 'Xing ', 'Ju ', 'Jiu ', 'Xin ', 'She ', 'She ', 'Yadoru ', 'Jiu ', 'Shi ', 'Tan ', 'Shu ', 'Shi ', 'Tian ', 'Dan ', 'Pu ', 'Pu ', 'Guan ', 'Hua ', 'Tan ', 'Chuan ', 'Shun ', 'Xia ', 'Wu ', 'Zhou ', 'Dao ', 'Gang ', 'Shan ', 'Yi ', '[?] ', 'Pa ', 'Tai ', 'Fan ', 'Ban ', 'Chuan ', 'Hang ', 'Fang ', 'Ban ', 'Que ', 'Hesaki ', 'Zhong ', 'Jian ', 'Cang ', 'Ling ', 'Zhu ', 'Ze ', 'Duo ', 'Bo ', 'Xian ', 'Ge ', 'Chuan ', 'Jia ', 'Lu ', 'Hong ', 'Pang ', 'Xi ', '[?] ', 'Fu ', 'Zao ', 'Feng ', 'Li ', 'Shao ', 'Yu ', 'Lang ', 'Ting ', '[?] ', 'Wei ', 'Bo ', 'Meng ', 'Nian ', 'Ju ', 'Huang ', 'Shou ', 'Zong ', 'Bian ', 'Mao ', 'Die ', '[?] ', 'Bang ', 'Cha ', 'Yi ', 'Sao ', 'Cang ', 'Cao ', 'Lou ', 'Dai ', 'Sori ', 'Yao ', 'Tong ', 'Yofune ', 'Dang ', 'Tan ', 'Lu ', 'Yi ', 'Jie ', 'Jian ', 'Huo ', 'Meng ', 'Qi ', 'Lu ', 'Lu ', 'Chan ', 'Shuang ', 'Gen ', 'Liang ', 'Jian ', 'Jian ', 'Se ', 'Yan ', 'Fu ', 'Ping ', 'Yan ', 'Yan ', 'Cao ', 'Cao ', 'Yi ', 'Le ', 'Ting ', 'Qiu ', 'Ai ', 'Nai ', 'Tiao ', 'Jiao ', 'Jie ', 'Peng ', 'Wan ', 'Yi ', 'Chai ', 'Mian ', 'Mie ', 'Gan ', 'Qian ', 'Yu ', 'Yu ', 'Shuo ', 'Qiong ', 'Tu ', 'Xia ', 'Qi ', 'Mang ', 'Zi ', 'Hui ', 'Sui ', 'Zhi ', 'Xiang ', 'Bi ', 'Fu ', 'Tun ', 'Wei ', 'Wu ', 'Zhi ', 'Qi ', 'Shan ', 'Wen ', 'Qian ', 'Ren ', 'Fou ', 'Kou ', 'Jie ', 'Lu ', 'Xu ', 'Ji ', 'Qin ', 'Qi ', 'Yuan ', 'Fen ', 'Ba ', 'Rui ', 'Xin ', 'Ji ', 'Hua ', 'Hua ', 'Fang ', 'Wu ', 'Jue ', 'Gou ', 'Zhi ', 'Yun ', 'Qin ', 'Ao ', 'Chu ', 'Mao ', 'Ya ', 'Fei ', 'Reng ', 'Hang ', 'Cong ', 'Yin ', 'You ', 'Bian ', 'Yi ', 'Susa ', 'Wei ', 'Li ', 'Pi ', 'E ', 'Xian ', 'Chang ', 'Cang ', 'Meng ', 'Su ', 'Yi ', 'Yuan ', 'Ran ', 'Ling ', 'Tai ', 'Tiao ', 'Di ', 'Miao ', 'Qiong ', 'Li ', 'Yong ', 'Ke ', 'Mu ', 'Pei ', 'Bao ', 'Gou ', 'Min ', 'Yi ', 'Yi ', 'Ju ', 'Pi ', 'Ruo ', 'Ku ', 'Zhu ', 'Ni ', 'Bo ', 'Bing ', 'Shan ', 'Qiu ', 'Yao ', 'Xian ', 'Ben ', 'Hong ', 'Ying ', 'Zha ', 'Dong ', 'Ju ', 'Die ', 'Nie ', 'Gan ', 'Hu ', 'Ping ', 'Mei ', 'Fu ', 'Sheng ', 'Gu ', 'Bi ', 'Wei ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x083.php b/vendor/voku/portable-ascii/src/voku/helper/data/x083.php new file mode 100644 index 0000000..747d587 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x083.php @@ -0,0 +1 @@ +<?php return ['Fu ', 'Zhuo ', 'Mao ', 'Fan ', 'Qie ', 'Mao ', 'Mao ', 'Ba ', 'Zi ', 'Mo ', 'Zi ', 'Di ', 'Chi ', 'Ji ', 'Jing ', 'Long ', '[?] ', 'Niao ', '[?] ', 'Xue ', 'Ying ', 'Qiong ', 'Ge ', 'Ming ', 'Li ', 'Rong ', 'Yin ', 'Gen ', 'Qian ', 'Chai ', 'Chen ', 'Yu ', 'Xiu ', 'Zi ', 'Lie ', 'Wu ', 'Ji ', 'Kui ', 'Ce ', 'Chong ', 'Ci ', 'Gou ', 'Guang ', 'Mang ', 'Chi ', 'Jiao ', 'Jiao ', 'Fu ', 'Yu ', 'Zhu ', 'Zi ', 'Jiang ', 'Hui ', 'Yin ', 'Cha ', 'Fa ', 'Rong ', 'Ru ', 'Chong ', 'Mang ', 'Tong ', 'Zhong ', '[?] ', 'Zhu ', 'Xun ', 'Huan ', 'Kua ', 'Quan ', 'Gai ', 'Da ', 'Jing ', 'Xing ', 'Quan ', 'Cao ', 'Jing ', 'Er ', 'An ', 'Shou ', 'Chi ', 'Ren ', 'Jian ', 'Ti ', 'Huang ', 'Ping ', 'Li ', 'Jin ', 'Lao ', 'Shu ', 'Zhuang ', 'Da ', 'Jia ', 'Rao ', 'Bi ', 'Ze ', 'Qiao ', 'Hui ', 'Qi ', 'Dang ', '[?] ', 'Rong ', 'Hun ', 'Ying ', 'Luo ', 'Ying ', 'Xun ', 'Jin ', 'Sun ', 'Yin ', 'Mai ', 'Hong ', 'Zhou ', 'Yao ', 'Du ', 'Wei ', 'Chu ', 'Dou ', 'Fu ', 'Ren ', 'Yin ', 'He ', 'Bi ', 'Bu ', 'Yun ', 'Di ', 'Tu ', 'Sui ', 'Sui ', 'Cheng ', 'Chen ', 'Wu ', 'Bie ', 'Xi ', 'Geng ', 'Li ', 'Fu ', 'Zhu ', 'Mo ', 'Li ', 'Zhuang ', 'Ji ', 'Duo ', 'Qiu ', 'Sha ', 'Suo ', 'Chen ', 'Feng ', 'Ju ', 'Mei ', 'Meng ', 'Xing ', 'Jing ', 'Che ', 'Xin ', 'Jun ', 'Yan ', 'Ting ', 'Diao ', 'Cuo ', 'Wan ', 'Han ', 'You ', 'Cuo ', 'Jia ', 'Wang ', 'You ', 'Niu ', 'Shao ', 'Xian ', 'Lang ', 'Fu ', 'E ', 'Mo ', 'Wen ', 'Jie ', 'Nan ', 'Mu ', 'Kan ', 'Lai ', 'Lian ', 'Shi ', 'Wo ', 'Usagi ', 'Lian ', 'Huo ', 'You ', 'Ying ', 'Ying ', 'Nuc ', 'Chun ', 'Mang ', 'Mang ', 'Ci ', 'Wan ', 'Jing ', 'Di ', 'Qu ', 'Dong ', 'Jian ', 'Zou ', 'Gu ', 'La ', 'Lu ', 'Ju ', 'Wei ', 'Jun ', 'Nie ', 'Kun ', 'He ', 'Pu ', 'Zi ', 'Gao ', 'Guo ', 'Fu ', 'Lun ', 'Chang ', 'Chou ', 'Song ', 'Chui ', 'Zhan ', 'Men ', 'Cai ', 'Ba ', 'Li ', 'Tu ', 'Bo ', 'Han ', 'Bao ', 'Qin ', 'Juan ', 'Xi ', 'Qin ', 'Di ', 'Jie ', 'Pu ', 'Dang ', 'Jin ', 'Zhao ', 'Tai ', 'Geng ', 'Hua ', 'Gu ', 'Ling ', 'Fei ', 'Jin ', 'An ', 'Wang ', 'Beng ', 'Zhou ', 'Yan ', 'Ju ', 'Jian ', 'Lin ', 'Tan ', 'Shu ', 'Tian ', 'Dao ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x084.php b/vendor/voku/portable-ascii/src/voku/helper/data/x084.php new file mode 100644 index 0000000..7fd1055 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x084.php @@ -0,0 +1 @@ +<?php return ['Hu ', 'Qi ', 'He ', 'Cui ', 'Tao ', 'Chun ', 'Bei ', 'Chang ', 'Huan ', 'Fei ', 'Lai ', 'Qi ', 'Meng ', 'Ping ', 'Wei ', 'Dan ', 'Sha ', 'Huan ', 'Yan ', 'Yi ', 'Tiao ', 'Qi ', 'Wan ', 'Ce ', 'Nai ', 'Kutabireru ', 'Tuo ', 'Jiu ', 'Tie ', 'Luo ', '[?] ', '[?] ', 'Meng ', '[?] ', 'Yaji ', '[?] ', 'Ying ', 'Ying ', 'Ying ', 'Xiao ', 'Sa ', 'Qiu ', 'Ke ', 'Xiang ', 'Wan ', 'Yu ', 'Yu ', 'Fu ', 'Lian ', 'Xuan ', 'Yuan ', 'Nan ', 'Ze ', 'Wo ', 'Chun ', 'Xiao ', 'Yu ', 'Pian ', 'Mao ', 'An ', 'E ', 'Luo ', 'Ying ', 'Huo ', 'Gua ', 'Jiang ', 'Mian ', 'Zuo ', 'Zuo ', 'Ju ', 'Bao ', 'Rou ', 'Xi ', 'Xie ', 'An ', 'Qu ', 'Jian ', 'Fu ', 'Lu ', 'Jing ', 'Pen ', 'Feng ', 'Hong ', 'Hong ', 'Hou ', 'Yan ', 'Tu ', 'Zhu ', 'Zi ', 'Xiang ', 'Shen ', 'Ge ', 'Jie ', 'Jing ', 'Mi ', 'Huang ', 'Shen ', 'Pu ', 'Gai ', 'Dong ', 'Zhou ', 'Qian ', 'Wei ', 'Bo ', 'Wei ', 'Pa ', 'Ji ', 'Hu ', 'Zang ', 'Jia ', 'Duan ', 'Yao ', 'Jun ', 'Cong ', 'Quan ', 'Wei ', 'Xian ', 'Kui ', 'Ting ', 'Hun ', 'Xi ', 'Shi ', 'Qi ', 'Lan ', 'Zong ', 'Yao ', 'Yuan ', 'Mei ', 'Yun ', 'Shu ', 'Di ', 'Zhuan ', 'Guan ', 'Sukumo ', 'Xue ', 'Chan ', 'Kai ', 'Kui ', '[?] ', 'Jiang ', 'Lou ', 'Wei ', 'Pai ', '[?] ', 'Sou ', 'Yin ', 'Shi ', 'Chun ', 'Shi ', 'Yun ', 'Zhen ', 'Lang ', 'Nu ', 'Meng ', 'He ', 'Que ', 'Suan ', 'Yuan ', 'Li ', 'Ju ', 'Xi ', 'Pang ', 'Chu ', 'Xu ', 'Tu ', 'Liu ', 'Wo ', 'Zhen ', 'Qian ', 'Zu ', 'Po ', 'Cuo ', 'Yuan ', 'Chu ', 'Yu ', 'Kuai ', 'Pan ', 'Pu ', 'Pu ', 'Na ', 'Shuo ', 'Xi ', 'Fen ', 'Yun ', 'Zheng ', 'Jian ', 'Ji ', 'Ruo ', 'Cang ', 'En ', 'Mi ', 'Hao ', 'Sun ', 'Zhen ', 'Ming ', 'Sou ', 'Xu ', 'Liu ', 'Xi ', 'Gu ', 'Lang ', 'Rong ', 'Weng ', 'Gai ', 'Cuo ', 'Shi ', 'Tang ', 'Luo ', 'Ru ', 'Suo ', 'Xian ', 'Bei ', 'Yao ', 'Gui ', 'Bi ', 'Zong ', 'Gun ', 'Za ', 'Xiu ', 'Ce ', 'Hai ', 'Lan ', '[?] ', 'Ji ', 'Li ', 'Can ', 'Lang ', 'Yu ', '[?] ', 'Ying ', 'Mo ', 'Diao ', 'Tiao ', 'Mao ', 'Tong ', 'Zhu ', 'Peng ', 'An ', 'Lian ', 'Cong ', 'Xi ', 'Ping ', 'Qiu ', 'Jin ', 'Chun ', 'Jie ', 'Wei ', 'Tui ', 'Cao ', 'Yu ', 'Yi ', 'Ji ', 'Liao ', 'Bi ', 'Lu ', 'Su ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x085.php b/vendor/voku/portable-ascii/src/voku/helper/data/x085.php new file mode 100644 index 0000000..46459eb --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x085.php @@ -0,0 +1 @@ +<?php return ['Bu ', 'Zhang ', 'Luo ', 'Jiang ', 'Man ', 'Yan ', 'Ling ', 'Ji ', 'Piao ', 'Gun ', 'Han ', 'Di ', 'Su ', 'Lu ', 'She ', 'Shang ', 'Di ', 'Mie ', 'Xun ', 'Man ', 'Bo ', 'Di ', 'Cuo ', 'Zhe ', 'Sen ', 'Xuan ', 'Wei ', 'Hu ', 'Ao ', 'Mi ', 'Lou ', 'Cu ', 'Zhong ', 'Cai ', 'Po ', 'Jiang ', 'Mi ', 'Cong ', 'Niao ', 'Hui ', 'Jun ', 'Yin ', 'Jian ', 'Yan ', 'Shu ', 'Yin ', 'Kui ', 'Chen ', 'Hu ', 'Sha ', 'Kou ', 'Qian ', 'Ma ', 'Zang ', 'Sonoko ', 'Qiang ', 'Dou ', 'Lian ', 'Lin ', 'Kou ', 'Ai ', 'Bi ', 'Li ', 'Wei ', 'Ji ', 'Xun ', 'Sheng ', 'Fan ', 'Meng ', 'Ou ', 'Chan ', 'Dian ', 'Xun ', 'Jiao ', 'Rui ', 'Rui ', 'Lei ', 'Yu ', 'Qiao ', 'Chu ', 'Hua ', 'Jian ', 'Mai ', 'Yun ', 'Bao ', 'You ', 'Qu ', 'Lu ', 'Rao ', 'Hui ', 'E ', 'Teng ', 'Fei ', 'Jue ', 'Zui ', 'Fa ', 'Ru ', 'Fen ', 'Kui ', 'Shun ', 'Rui ', 'Ya ', 'Xu ', 'Fu ', 'Jue ', 'Dang ', 'Wu ', 'Tong ', 'Si ', 'Xiao ', 'Xi ', 'Long ', 'Yun ', '[?] ', 'Qi ', 'Jian ', 'Yun ', 'Sun ', 'Ling ', 'Yu ', 'Xia ', 'Yong ', 'Ji ', 'Hong ', 'Si ', 'Nong ', 'Lei ', 'Xuan ', 'Yun ', 'Yu ', 'Xi ', 'Hao ', 'Bo ', 'Hao ', 'Ai ', 'Wei ', 'Hui ', 'Wei ', 'Ji ', 'Ci ', 'Xiang ', 'Luan ', 'Mie ', 'Yi ', 'Leng ', 'Jiang ', 'Can ', 'Shen ', 'Qiang ', 'Lian ', 'Ke ', 'Yuan ', 'Da ', 'Ti ', 'Tang ', 'Xie ', 'Bi ', 'Zhan ', 'Sun ', 'Lian ', 'Fan ', 'Ding ', 'Jie ', 'Gu ', 'Xie ', 'Shu ', 'Jian ', 'Kao ', 'Hong ', 'Sa ', 'Xin ', 'Xun ', 'Yao ', 'Hie ', 'Sou ', 'Shu ', 'Xun ', 'Dui ', 'Pin ', 'Wei ', 'Neng ', 'Chou ', 'Mai ', 'Ru ', 'Piao ', 'Tai ', 'Qi ', 'Zao ', 'Chen ', 'Zhen ', 'Er ', 'Ni ', 'Ying ', 'Gao ', 'Cong ', 'Xiao ', 'Qi ', 'Fa ', 'Jian ', 'Xu ', 'Kui ', 'Jie ', 'Bian ', 'Diao ', 'Mi ', 'Lan ', 'Jin ', 'Cang ', 'Miao ', 'Qiong ', 'Qie ', 'Xian ', '[?] ', 'Ou ', 'Xian ', 'Su ', 'Lu ', 'Yi ', 'Xu ', 'Xie ', 'Li ', 'Yi ', 'La ', 'Lei ', 'Xiao ', 'Di ', 'Zhi ', 'Bei ', 'Teng ', 'Yao ', 'Mo ', 'Huan ', 'Piao ', 'Fan ', 'Sou ', 'Tan ', 'Tui ', 'Qiong ', 'Qiao ', 'Wei ', 'Liu ', 'Hui ', '[?] ', 'Gao ', 'Yun ', '[?] ', 'Li ', 'Shu ', 'Chu ', 'Ai ', 'Lin ', 'Zao ', 'Xuan ', 'Chen ', 'Lai ', 'Huo ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x086.php b/vendor/voku/portable-ascii/src/voku/helper/data/x086.php new file mode 100644 index 0000000..159aa5c --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x086.php @@ -0,0 +1 @@ +<?php return ['Tuo ', 'Wu ', 'Rui ', 'Rui ', 'Qi ', 'Heng ', 'Lu ', 'Su ', 'Tui ', 'Mang ', 'Yun ', 'Pin ', 'Yu ', 'Xun ', 'Ji ', 'Jiong ', 'Xian ', 'Mo ', 'Hagi ', 'Su ', 'Jiong ', '[?] ', 'Nie ', 'Bo ', 'Rang ', 'Yi ', 'Xian ', 'Yu ', 'Ju ', 'Lian ', 'Lian ', 'Yin ', 'Qiang ', 'Ying ', 'Long ', 'Tong ', 'Wei ', 'Yue ', 'Ling ', 'Qu ', 'Yao ', 'Fan ', 'Mi ', 'Lan ', 'Kui ', 'Lan ', 'Ji ', 'Dang ', 'Katsura ', 'Lei ', 'Lei ', 'Hua ', 'Feng ', 'Zhi ', 'Wei ', 'Kui ', 'Zhan ', 'Huai ', 'Li ', 'Ji ', 'Mi ', 'Lei ', 'Huai ', 'Luo ', 'Ji ', 'Kui ', 'Lu ', 'Jian ', 'San ', '[?] ', 'Lei ', 'Quan ', 'Xiao ', 'Yi ', 'Luan ', 'Men ', 'Bie ', 'Hu ', 'Hu ', 'Lu ', 'Nue ', 'Lu ', 'Si ', 'Xiao ', 'Qian ', 'Chu ', 'Hu ', 'Xu ', 'Cuo ', 'Fu ', 'Xu ', 'Xu ', 'Lu ', 'Hu ', 'Yu ', 'Hao ', 'Jiao ', 'Ju ', 'Guo ', 'Bao ', 'Yan ', 'Zhan ', 'Zhan ', 'Kui ', 'Ban ', 'Xi ', 'Shu ', 'Chong ', 'Qiu ', 'Diao ', 'Ji ', 'Qiu ', 'Cheng ', 'Shi ', '[?] ', 'Di ', 'Zhe ', 'She ', 'Yu ', 'Gan ', 'Zi ', 'Hong ', 'Hui ', 'Meng ', 'Ge ', 'Sui ', 'Xia ', 'Chai ', 'Shi ', 'Yi ', 'Ma ', 'Xiang ', 'Fang ', 'E ', 'Pa ', 'Chi ', 'Qian ', 'Wen ', 'Wen ', 'Rui ', 'Bang ', 'Bi ', 'Yue ', 'Yue ', 'Jun ', 'Qi ', 'Ran ', 'Yin ', 'Qi ', 'Tian ', 'Yuan ', 'Jue ', 'Hui ', 'Qin ', 'Qi ', 'Zhong ', 'Ya ', 'Ci ', 'Mu ', 'Wang ', 'Fen ', 'Fen ', 'Hang ', 'Gong ', 'Zao ', 'Fu ', 'Ran ', 'Jie ', 'Fu ', 'Chi ', 'Dou ', 'Piao ', 'Xian ', 'Ni ', 'Te ', 'Qiu ', 'You ', 'Zha ', 'Ping ', 'Chi ', 'You ', 'He ', 'Han ', 'Ju ', 'Li ', 'Fu ', 'Ran ', 'Zha ', 'Gou ', 'Pi ', 'Bo ', 'Xian ', 'Zhu ', 'Diao ', 'Bie ', 'Bing ', 'Gu ', 'Ran ', 'Qu ', 'She ', 'Tie ', 'Ling ', 'Gu ', 'Dan ', 'Gu ', 'Ying ', 'Li ', 'Cheng ', 'Qu ', 'Mou ', 'Ge ', 'Ci ', 'Hui ', 'Hui ', 'Mang ', 'Fu ', 'Yang ', 'Wa ', 'Lie ', 'Zhu ', 'Yi ', 'Xian ', 'Kuo ', 'Jiao ', 'Li ', 'Yi ', 'Ping ', 'Ji ', 'Ha ', 'She ', 'Yi ', 'Wang ', 'Mo ', 'Qiong ', 'Qie ', 'Gui ', 'Gong ', 'Zhi ', 'Man ', 'Ebi ', 'Zhi ', 'Jia ', 'Rao ', 'Si ', 'Qi ', 'Xing ', 'Lie ', 'Qiu ', 'Shao ', 'Yong ', 'Jia ', 'Shui ', 'Che ', 'Bai ', 'E ', 'Han ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x087.php b/vendor/voku/portable-ascii/src/voku/helper/data/x087.php new file mode 100644 index 0000000..810bbbd --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x087.php @@ -0,0 +1 @@ +<?php return ['Shu ', 'Xuan ', 'Feng ', 'Shen ', 'Zhen ', 'Fu ', 'Xian ', 'Zhe ', 'Wu ', 'Fu ', 'Li ', 'Lang ', 'Bi ', 'Chu ', 'Yuan ', 'You ', 'Jie ', 'Dan ', 'Yan ', 'Ting ', 'Dian ', 'Shui ', 'Hui ', 'Gua ', 'Zhi ', 'Song ', 'Fei ', 'Ju ', 'Mi ', 'Qi ', 'Qi ', 'Yu ', 'Jun ', 'Zha ', 'Meng ', 'Qiang ', 'Si ', 'Xi ', 'Lun ', 'Li ', 'Die ', 'Tiao ', 'Tao ', 'Kun ', 'Gan ', 'Han ', 'Yu ', 'Bang ', 'Fei ', 'Pi ', 'Wei ', 'Dun ', 'Yi ', 'Yuan ', 'Su ', 'Quan ', 'Qian ', 'Rui ', 'Ni ', 'Qing ', 'Wei ', 'Liang ', 'Guo ', 'Wan ', 'Dong ', 'E ', 'Ban ', 'Di ', 'Wang ', 'Can ', 'Yang ', 'Ying ', 'Guo ', 'Chan ', '[?] ', 'La ', 'Ke ', 'Ji ', 'He ', 'Ting ', 'Mai ', 'Xu ', 'Mian ', 'Yu ', 'Jie ', 'Shi ', 'Xuan ', 'Huang ', 'Yan ', 'Bian ', 'Rou ', 'Wei ', 'Fu ', 'Yuan ', 'Mei ', 'Wei ', 'Fu ', 'Ruan ', 'Xie ', 'You ', 'Qiu ', 'Mao ', 'Xia ', 'Ying ', 'Shi ', 'Chong ', 'Tang ', 'Zhu ', 'Zong ', 'Ti ', 'Fu ', 'Yuan ', 'Hui ', 'Meng ', 'La ', 'Du ', 'Hu ', 'Qiu ', 'Die ', 'Li ', 'Gua ', 'Yun ', 'Ju ', 'Nan ', 'Lou ', 'Qun ', 'Rong ', 'Ying ', 'Jiang ', '[?] ', 'Lang ', 'Pang ', 'Si ', 'Xi ', 'Ci ', 'Xi ', 'Yuan ', 'Weng ', 'Lian ', 'Sou ', 'Ban ', 'Rong ', 'Rong ', 'Ji ', 'Wu ', 'Qiu ', 'Han ', 'Qin ', 'Yi ', 'Bi ', 'Hua ', 'Tang ', 'Yi ', 'Du ', 'Nai ', 'He ', 'Hu ', 'Hui ', 'Ma ', 'Ming ', 'Yi ', 'Wen ', 'Ying ', 'Teng ', 'Yu ', 'Cang ', 'So ', 'Ebi ', 'Man ', '[?] ', 'Shang ', 'Zhe ', 'Cao ', 'Chi ', 'Di ', 'Ao ', 'Lu ', 'Wei ', 'Zhi ', 'Tang ', 'Chen ', 'Piao ', 'Qu ', 'Pi ', 'Yu ', 'Jian ', 'Luo ', 'Lou ', 'Qin ', 'Zhong ', 'Yin ', 'Jiang ', 'Shuai ', 'Wen ', 'Jiao ', 'Wan ', 'Zhi ', 'Zhe ', 'Ma ', 'Ma ', 'Guo ', 'Liu ', 'Mao ', 'Xi ', 'Cong ', 'Li ', 'Man ', 'Xiao ', 'Kamakiri ', 'Zhang ', 'Mang ', 'Xiang ', 'Mo ', 'Zui ', 'Si ', 'Qiu ', 'Te ', 'Zhi ', 'Peng ', 'Peng ', 'Jiao ', 'Qu ', 'Bie ', 'Liao ', 'Pan ', 'Gui ', 'Xi ', 'Ji ', 'Zhuan ', 'Huang ', 'Fei ', 'Lao ', 'Jue ', 'Jue ', 'Hui ', 'Yin ', 'Chan ', 'Jiao ', 'Shan ', 'Rao ', 'Xiao ', 'Mou ', 'Chong ', 'Xun ', 'Si ', '[?] ', 'Cheng ', 'Dang ', 'Li ', 'Xie ', 'Shan ', 'Yi ', 'Jing ', 'Da ', 'Chan ', 'Qi ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x088.php b/vendor/voku/portable-ascii/src/voku/helper/data/x088.php new file mode 100644 index 0000000..1dfa032 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x088.php @@ -0,0 +1 @@ +<?php return ['Ci ', 'Xiang ', 'She ', 'Luo ', 'Qin ', 'Ying ', 'Chai ', 'Li ', 'Ze ', 'Xuan ', 'Lian ', 'Zhu ', 'Ze ', 'Xie ', 'Mang ', 'Xie ', 'Qi ', 'Rong ', 'Jian ', 'Meng ', 'Hao ', 'Ruan ', 'Huo ', 'Zhuo ', 'Jie ', 'Bin ', 'He ', 'Mie ', 'Fan ', 'Lei ', 'Jie ', 'La ', 'Mi ', 'Li ', 'Chun ', 'Li ', 'Qiu ', 'Nie ', 'Lu ', 'Du ', 'Xiao ', 'Zhu ', 'Long ', 'Li ', 'Long ', 'Feng ', 'Ye ', 'Beng ', 'Shang ', 'Gu ', 'Juan ', 'Ying ', '[?] ', 'Xi ', 'Can ', 'Qu ', 'Quan ', 'Du ', 'Can ', 'Man ', 'Jue ', 'Jie ', 'Zhu ', 'Zha ', 'Xie ', 'Huang ', 'Niu ', 'Pei ', 'Nu ', 'Xin ', 'Zhong ', 'Mo ', 'Er ', 'Ke ', 'Mie ', 'Xi ', 'Xing ', 'Yan ', 'Kan ', 'Yuan ', '[?] ', 'Ling ', 'Xuan ', 'Shu ', 'Xian ', 'Tong ', 'Long ', 'Jie ', 'Xian ', 'Ya ', 'Hu ', 'Wei ', 'Dao ', 'Chong ', 'Wei ', 'Dao ', 'Zhun ', 'Heng ', 'Qu ', 'Yi ', 'Yi ', 'Bu ', 'Gan ', 'Yu ', 'Biao ', 'Cha ', 'Yi ', 'Shan ', 'Chen ', 'Fu ', 'Gun ', 'Fen ', 'Shuai ', 'Jie ', 'Na ', 'Zhong ', 'Dan ', 'Ri ', 'Zhong ', 'Zhong ', 'Xie ', 'Qi ', 'Xie ', 'Ran ', 'Zhi ', 'Ren ', 'Qin ', 'Jin ', 'Jun ', 'Yuan ', 'Mei ', 'Chai ', 'Ao ', 'Niao ', 'Hui ', 'Ran ', 'Jia ', 'Tuo ', 'Ling ', 'Dai ', 'Bao ', 'Pao ', 'Yao ', 'Zuo ', 'Bi ', 'Shao ', 'Tan ', 'Ju ', 'He ', 'Shu ', 'Xiu ', 'Zhen ', 'Yi ', 'Pa ', 'Bo ', 'Di ', 'Wa ', 'Fu ', 'Gun ', 'Zhi ', 'Zhi ', 'Ran ', 'Pan ', 'Yi ', 'Mao ', 'Tuo ', 'Na ', 'Kou ', 'Xian ', 'Chan ', 'Qu ', 'Bei ', 'Gun ', 'Xi ', 'Ne ', 'Bo ', 'Horo ', 'Fu ', 'Yi ', 'Chi ', 'Ku ', 'Ren ', 'Jiang ', 'Jia ', 'Cun ', 'Mo ', 'Jie ', 'Er ', 'Luo ', 'Ru ', 'Zhu ', 'Gui ', 'Yin ', 'Cai ', 'Lie ', 'Kamishimo ', 'Yuki ', 'Zhuang ', 'Dang ', '[?] ', 'Kun ', 'Ken ', 'Niao ', 'Shu ', 'Jia ', 'Kun ', 'Cheng ', 'Li ', 'Juan ', 'Shen ', 'Pou ', 'Ge ', 'Yi ', 'Yu ', 'Zhen ', 'Liu ', 'Qiu ', 'Qun ', 'Ji ', 'Yi ', 'Bu ', 'Zhuang ', 'Shui ', 'Sha ', 'Qun ', 'Li ', 'Lian ', 'Lian ', 'Ku ', 'Jian ', 'Fou ', 'Chan ', 'Bi ', 'Gun ', 'Tao ', 'Yuan ', 'Ling ', 'Chi ', 'Chang ', 'Chou ', 'Duo ', 'Biao ', 'Liang ', 'Chang ', 'Pei ', 'Pei ', 'Fei ', 'Yuan ', 'Luo ', 'Guo ', 'Yan ', 'Du ', 'Xi ', 'Zhi ', 'Ju ', 'Qi ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x089.php b/vendor/voku/portable-ascii/src/voku/helper/data/x089.php new file mode 100644 index 0000000..5e2856d --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x089.php @@ -0,0 +1 @@ +<?php return ['Ji ', 'Zhi ', 'Gua ', 'Ken ', 'Che ', 'Ti ', 'Ti ', 'Fu ', 'Chong ', 'Xie ', 'Bian ', 'Die ', 'Kun ', 'Duan ', 'Xiu ', 'Xiu ', 'He ', 'Yuan ', 'Bao ', 'Bao ', 'Fu ', 'Yu ', 'Tuan ', 'Yan ', 'Hui ', 'Bei ', 'Chu ', 'Lu ', 'Ena ', 'Hitoe ', 'Yun ', 'Da ', 'Gou ', 'Da ', 'Huai ', 'Rong ', 'Yuan ', 'Ru ', 'Nai ', 'Jiong ', 'Suo ', 'Ban ', 'Tun ', 'Chi ', 'Sang ', 'Niao ', 'Ying ', 'Jie ', 'Qian ', 'Huai ', 'Ku ', 'Lian ', 'Bao ', 'Li ', 'Zhe ', 'Shi ', 'Lu ', 'Yi ', 'Die ', 'Xie ', 'Xian ', 'Wei ', 'Biao ', 'Cao ', 'Ji ', 'Jiang ', 'Sen ', 'Bao ', 'Xiang ', 'Chihaya ', 'Pu ', 'Jian ', 'Zhuan ', 'Jian ', 'Zui ', 'Ji ', 'Dan ', 'Za ', 'Fan ', 'Bo ', 'Xiang ', 'Xin ', 'Bie ', 'Rao ', 'Man ', 'Lan ', 'Ao ', 'Duo ', 'Gui ', 'Cao ', 'Sui ', 'Nong ', 'Chan ', 'Lian ', 'Bi ', 'Jin ', 'Dang ', 'Shu ', 'Tan ', 'Bi ', 'Lan ', 'Pu ', 'Ru ', 'Zhi ', '[?] ', 'Shu ', 'Wa ', 'Shi ', 'Bai ', 'Xie ', 'Bo ', 'Chen ', 'Lai ', 'Long ', 'Xi ', 'Xian ', 'Lan ', 'Zhe ', 'Dai ', 'Tasuki ', 'Zan ', 'Shi ', 'Jian ', 'Pan ', 'Yi ', 'Ran ', 'Ya ', 'Xi ', 'Xi ', 'Yao ', 'Feng ', 'Tan ', '[?] ', 'Biao ', 'Fu ', 'Ba ', 'He ', 'Ji ', 'Ji ', 'Jian ', 'Guan ', 'Bian ', 'Yan ', 'Gui ', 'Jue ', 'Pian ', 'Mao ', 'Mi ', 'Mi ', 'Mie ', 'Shi ', 'Si ', 'Zhan ', 'Luo ', 'Jue ', 'Mi ', 'Tiao ', 'Lian ', 'Yao ', 'Zhi ', 'Jun ', 'Xi ', 'Shan ', 'Wei ', 'Xi ', 'Tian ', 'Yu ', 'Lan ', 'E ', 'Du ', 'Qin ', 'Pang ', 'Ji ', 'Ming ', 'Ying ', 'Gou ', 'Qu ', 'Zhan ', 'Jin ', 'Guan ', 'Deng ', 'Jian ', 'Luo ', 'Qu ', 'Jian ', 'Wei ', 'Jue ', 'Qu ', 'Luo ', 'Lan ', 'Shen ', 'Di ', 'Guan ', 'Jian ', 'Guan ', 'Yan ', 'Gui ', 'Mi ', 'Shi ', 'Zhan ', 'Lan ', 'Jue ', 'Ji ', 'Xi ', 'Di ', 'Tian ', 'Yu ', 'Gou ', 'Jin ', 'Qu ', 'Jiao ', 'Jiu ', 'Jin ', 'Cu ', 'Jue ', 'Zhi ', 'Chao ', 'Ji ', 'Gu ', 'Dan ', 'Zui ', 'Di ', 'Shang ', 'Hua ', 'Quan ', 'Ge ', 'Chi ', 'Jie ', 'Gui ', 'Gong ', 'Hong ', 'Jie ', 'Hun ', 'Qiu ', 'Xing ', 'Su ', 'Ni ', 'Ji ', 'Lu ', 'Zhi ', 'Zha ', 'Bi ', 'Xing ', 'Hu ', 'Shang ', 'Gong ', 'Zhi ', 'Xue ', 'Chu ', 'Xi ', 'Yi ', 'Lu ', 'Jue ', 'Xi ', 'Yan ', 'Xi ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x08a.php b/vendor/voku/portable-ascii/src/voku/helper/data/x08a.php new file mode 100644 index 0000000..826fd75 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x08a.php @@ -0,0 +1 @@ +<?php return ['Yan ', 'Yan ', 'Ding ', 'Fu ', 'Qiu ', 'Qiu ', 'Jiao ', 'Hong ', 'Ji ', 'Fan ', 'Xun ', 'Diao ', 'Hong ', 'Cha ', 'Tao ', 'Xu ', 'Jie ', 'Yi ', 'Ren ', 'Xun ', 'Yin ', 'Shan ', 'Qi ', 'Tuo ', 'Ji ', 'Xun ', 'Yin ', 'E ', 'Fen ', 'Ya ', 'Yao ', 'Song ', 'Shen ', 'Yin ', 'Xin ', 'Jue ', 'Xiao ', 'Ne ', 'Chen ', 'You ', 'Zhi ', 'Xiong ', 'Fang ', 'Xin ', 'Chao ', 'She ', 'Xian ', 'Sha ', 'Tun ', 'Xu ', 'Yi ', 'Yi ', 'Su ', 'Chi ', 'He ', 'Shen ', 'He ', 'Xu ', 'Zhen ', 'Zhu ', 'Zheng ', 'Gou ', 'Zi ', 'Zi ', 'Zhan ', 'Gu ', 'Fu ', 'Quan ', 'Die ', 'Ling ', 'Di ', 'Yang ', 'Li ', 'Nao ', 'Pan ', 'Zhou ', 'Gan ', 'Yi ', 'Ju ', 'Ao ', 'Zha ', 'Tuo ', 'Yi ', 'Qu ', 'Zhao ', 'Ping ', 'Bi ', 'Xiong ', 'Qu ', 'Ba ', 'Da ', 'Zu ', 'Tao ', 'Zhu ', 'Ci ', 'Zhe ', 'Yong ', 'Xu ', 'Xun ', 'Yi ', 'Huang ', 'He ', 'Shi ', 'Cha ', 'Jiao ', 'Shi ', 'Hen ', 'Cha ', 'Gou ', 'Gui ', 'Quan ', 'Hui ', 'Jie ', 'Hua ', 'Gai ', 'Xiang ', 'Wei ', 'Shen ', 'Chou ', 'Tong ', 'Mi ', 'Zhan ', 'Ming ', 'E ', 'Hui ', 'Yan ', 'Xiong ', 'Gua ', 'Er ', 'Beng ', 'Tiao ', 'Chi ', 'Lei ', 'Zhu ', 'Kuang ', 'Kua ', 'Wu ', 'Yu ', 'Teng ', 'Ji ', 'Zhi ', 'Ren ', 'Su ', 'Lang ', 'E ', 'Kuang ', 'E ', 'Shi ', 'Ting ', 'Dan ', 'Bo ', 'Chan ', 'You ', 'Heng ', 'Qiao ', 'Qin ', 'Shua ', 'An ', 'Yu ', 'Xiao ', 'Cheng ', 'Jie ', 'Xian ', 'Wu ', 'Wu ', 'Gao ', 'Song ', 'Pu ', 'Hui ', 'Jing ', 'Shuo ', 'Zhen ', 'Shuo ', 'Du ', 'Yasashi ', 'Chang ', 'Shui ', 'Jie ', 'Ke ', 'Qu ', 'Cong ', 'Xiao ', 'Sui ', 'Wang ', 'Xuan ', 'Fei ', 'Chi ', 'Ta ', 'Yi ', 'Na ', 'Yin ', 'Diao ', 'Pi ', 'Chuo ', 'Chan ', 'Chen ', 'Zhun ', 'Ji ', 'Qi ', 'Tan ', 'Zhui ', 'Wei ', 'Ju ', 'Qing ', 'Jian ', 'Zheng ', 'Ze ', 'Zou ', 'Qian ', 'Zhuo ', 'Liang ', 'Jian ', 'Zhu ', 'Hao ', 'Lun ', 'Shen ', 'Biao ', 'Huai ', 'Pian ', 'Yu ', 'Die ', 'Xu ', 'Pian ', 'Shi ', 'Xuan ', 'Shi ', 'Hun ', 'Hua ', 'E ', 'Zhong ', 'Di ', 'Xie ', 'Fu ', 'Pu ', 'Ting ', 'Jian ', 'Qi ', 'Yu ', 'Zi ', 'Chuan ', 'Xi ', 'Hui ', 'Yin ', 'An ', 'Xian ', 'Nan ', 'Chen ', 'Feng ', 'Zhu ', 'Yang ', 'Yan ', 'Heng ', 'Xuan ', 'Ge ', 'Nuo ', 'Qi ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x08b.php b/vendor/voku/portable-ascii/src/voku/helper/data/x08b.php new file mode 100644 index 0000000..540258e --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x08b.php @@ -0,0 +1 @@ +<?php return ['Mou ', 'Ye ', 'Wei ', '[?] ', 'Teng ', 'Zou ', 'Shan ', 'Jian ', 'Bo ', 'Ku ', 'Huang ', 'Huo ', 'Ge ', 'Ying ', 'Mi ', 'Xiao ', 'Mi ', 'Xi ', 'Qiang ', 'Chen ', 'Nue ', 'Ti ', 'Su ', 'Bang ', 'Chi ', 'Qian ', 'Shi ', 'Jiang ', 'Yuan ', 'Xie ', 'Xue ', 'Tao ', 'Yao ', 'Yao ', '[?] ', 'Yu ', 'Biao ', 'Cong ', 'Qing ', 'Li ', 'Mo ', 'Mo ', 'Shang ', 'Zhe ', 'Miu ', 'Jian ', 'Ze ', 'Jie ', 'Lian ', 'Lou ', 'Can ', 'Ou ', 'Guan ', 'Xi ', 'Zhuo ', 'Ao ', 'Ao ', 'Jin ', 'Zhe ', 'Yi ', 'Hu ', 'Jiang ', 'Man ', 'Chao ', 'Han ', 'Hua ', 'Chan ', 'Xu ', 'Zeng ', 'Se ', 'Xi ', 'She ', 'Dui ', 'Zheng ', 'Nao ', 'Lan ', 'E ', 'Ying ', 'Jue ', 'Ji ', 'Zun ', 'Jiao ', 'Bo ', 'Hui ', 'Zhuan ', 'Mu ', 'Zen ', 'Zha ', 'Shi ', 'Qiao ', 'Tan ', 'Zen ', 'Pu ', 'Sheng ', 'Xuan ', 'Zao ', 'Tan ', 'Dang ', 'Sui ', 'Qian ', 'Ji ', 'Jiao ', 'Jing ', 'Lian ', 'Nou ', 'Yi ', 'Ai ', 'Zhan ', 'Pi ', 'Hui ', 'Hua ', 'Yi ', 'Yi ', 'Shan ', 'Rang ', 'Nou ', 'Qian ', 'Zhui ', 'Ta ', 'Hu ', 'Zhou ', 'Hao ', 'Ye ', 'Ying ', 'Jian ', 'Yu ', 'Jian ', 'Hui ', 'Du ', 'Zhe ', 'Xuan ', 'Zan ', 'Lei ', 'Shen ', 'Wei ', 'Chan ', 'Li ', 'Yi ', 'Bian ', 'Zhe ', 'Yan ', 'E ', 'Chou ', 'Wei ', 'Chou ', 'Yao ', 'Chan ', 'Rang ', 'Yin ', 'Lan ', 'Chen ', 'Huo ', 'Zhe ', 'Huan ', 'Zan ', 'Yi ', 'Dang ', 'Zhan ', 'Yan ', 'Du ', 'Yan ', 'Ji ', 'Ding ', 'Fu ', 'Ren ', 'Ji ', 'Jie ', 'Hong ', 'Tao ', 'Rang ', 'Shan ', 'Qi ', 'Tuo ', 'Xun ', 'Yi ', 'Xun ', 'Ji ', 'Ren ', 'Jiang ', 'Hui ', 'Ou ', 'Ju ', 'Ya ', 'Ne ', 'Xu ', 'E ', 'Lun ', 'Xiong ', 'Song ', 'Feng ', 'She ', 'Fang ', 'Jue ', 'Zheng ', 'Gu ', 'He ', 'Ping ', 'Zu ', 'Shi ', 'Xiong ', 'Zha ', 'Su ', 'Zhen ', 'Di ', 'Zou ', 'Ci ', 'Qu ', 'Zhao ', 'Bi ', 'Yi ', 'Yi ', 'Kuang ', 'Lei ', 'Shi ', 'Gua ', 'Shi ', 'Jie ', 'Hui ', 'Cheng ', 'Zhu ', 'Shen ', 'Hua ', 'Dan ', 'Gou ', 'Quan ', 'Gui ', 'Xun ', 'Yi ', 'Zheng ', 'Gai ', 'Xiang ', 'Cha ', 'Hun ', 'Xu ', 'Zhou ', 'Jie ', 'Wu ', 'Yu ', 'Qiao ', 'Wu ', 'Gao ', 'You ', 'Hui ', 'Kuang ', 'Shuo ', 'Song ', 'Ai ', 'Qing ', 'Zhu ', 'Zou ', 'Nuo ', 'Du ', 'Zhuo ', 'Fei ', 'Ke ', 'Wei ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x08c.php b/vendor/voku/portable-ascii/src/voku/helper/data/x08c.php new file mode 100644 index 0000000..1f4a849 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x08c.php @@ -0,0 +1 @@ +<?php return ['Yu ', 'Shui ', 'Shen ', 'Diao ', 'Chan ', 'Liang ', 'Zhun ', 'Sui ', 'Tan ', 'Shen ', 'Yi ', 'Mou ', 'Chen ', 'Die ', 'Huang ', 'Jian ', 'Xie ', 'Nue ', 'Ye ', 'Wei ', 'E ', 'Yu ', 'Xuan ', 'Chan ', 'Zi ', 'An ', 'Yan ', 'Di ', 'Mi ', 'Pian ', 'Xu ', 'Mo ', 'Dang ', 'Su ', 'Xie ', 'Yao ', 'Bang ', 'Shi ', 'Qian ', 'Mi ', 'Jin ', 'Man ', 'Zhe ', 'Jian ', 'Miu ', 'Tan ', 'Zen ', 'Qiao ', 'Lan ', 'Pu ', 'Jue ', 'Yan ', 'Qian ', 'Zhan ', 'Chen ', 'Gu ', 'Qian ', 'Hong ', 'Xia ', 'Jue ', 'Hong ', 'Han ', 'Hong ', 'Xi ', 'Xi ', 'Huo ', 'Liao ', 'Han ', 'Du ', 'Long ', 'Dou ', 'Jiang ', 'Qi ', 'Shi ', 'Li ', 'Deng ', 'Wan ', 'Bi ', 'Shu ', 'Xian ', 'Feng ', 'Zhi ', 'Zhi ', 'Yan ', 'Yan ', 'Shi ', 'Chu ', 'Hui ', 'Tun ', 'Yi ', 'Tun ', 'Yi ', 'Jian ', 'Ba ', 'Hou ', 'E ', 'Cu ', 'Xiang ', 'Huan ', 'Jian ', 'Ken ', 'Gai ', 'Qu ', 'Fu ', 'Xi ', 'Bin ', 'Hao ', 'Yu ', 'Zhu ', 'Jia ', '[?] ', 'Xi ', 'Bo ', 'Wen ', 'Huan ', 'Bin ', 'Di ', 'Zong ', 'Fen ', 'Yi ', 'Zhi ', 'Bao ', 'Chai ', 'Han ', 'Pi ', 'Na ', 'Pi ', 'Gou ', 'Na ', 'You ', 'Diao ', 'Mo ', 'Si ', 'Xiu ', 'Huan ', 'Kun ', 'He ', 'He ', 'Mo ', 'Han ', 'Mao ', 'Li ', 'Ni ', 'Bi ', 'Yu ', 'Jia ', 'Tuan ', 'Mao ', 'Pi ', 'Xi ', 'E ', 'Ju ', 'Mo ', 'Chu ', 'Tan ', 'Huan ', 'Jue ', 'Bei ', 'Zhen ', 'Yuan ', 'Fu ', 'Cai ', 'Gong ', 'Te ', 'Yi ', 'Hang ', 'Wan ', 'Pin ', 'Huo ', 'Fan ', 'Tan ', 'Guan ', 'Ze ', 'Zhi ', 'Er ', 'Zhu ', 'Shi ', 'Bi ', 'Zi ', 'Er ', 'Gui ', 'Pian ', 'Bian ', 'Mai ', 'Dai ', 'Sheng ', 'Kuang ', 'Fei ', 'Tie ', 'Yi ', 'Chi ', 'Mao ', 'He ', 'Bi ', 'Lu ', 'Ren ', 'Hui ', 'Gai ', 'Pian ', 'Zi ', 'Jia ', 'Xu ', 'Zei ', 'Jiao ', 'Gai ', 'Zang ', 'Jian ', 'Ying ', 'Xun ', 'Zhen ', 'She ', 'Bin ', 'Bin ', 'Qiu ', 'She ', 'Chuan ', 'Zang ', 'Zhou ', 'Lai ', 'Zan ', 'Si ', 'Chen ', 'Shang ', 'Tian ', 'Pei ', 'Geng ', 'Xian ', 'Mai ', 'Jian ', 'Sui ', 'Fu ', 'Tan ', 'Cong ', 'Cong ', 'Zhi ', 'Ji ', 'Zhang ', 'Du ', 'Jin ', 'Xiong ', 'Shun ', 'Yun ', 'Bao ', 'Zai ', 'Lai ', 'Feng ', 'Cang ', 'Ji ', 'Sheng ', 'Ai ', 'Zhuan ', 'Fu ', 'Gou ', 'Sai ', 'Ze ', 'Liao ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x08d.php b/vendor/voku/portable-ascii/src/voku/helper/data/x08d.php new file mode 100644 index 0000000..44b0c62 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x08d.php @@ -0,0 +1 @@ +<?php return ['Wei ', 'Bai ', 'Chen ', 'Zhuan ', 'Zhi ', 'Zhui ', 'Biao ', 'Yun ', 'Zeng ', 'Tan ', 'Zan ', 'Yan ', '[?] ', 'Shan ', 'Wan ', 'Ying ', 'Jin ', 'Gan ', 'Xian ', 'Zang ', 'Bi ', 'Du ', 'Shu ', 'Yan ', '[?] ', 'Xuan ', 'Long ', 'Gan ', 'Zang ', 'Bei ', 'Zhen ', 'Fu ', 'Yuan ', 'Gong ', 'Cai ', 'Ze ', 'Xian ', 'Bai ', 'Zhang ', 'Huo ', 'Zhi ', 'Fan ', 'Tan ', 'Pin ', 'Bian ', 'Gou ', 'Zhu ', 'Guan ', 'Er ', 'Jian ', 'Bi ', 'Shi ', 'Tie ', 'Gui ', 'Kuang ', 'Dai ', 'Mao ', 'Fei ', 'He ', 'Yi ', 'Zei ', 'Zhi ', 'Jia ', 'Hui ', 'Zi ', 'Ren ', 'Lu ', 'Zang ', 'Zi ', 'Gai ', 'Jin ', 'Qiu ', 'Zhen ', 'Lai ', 'She ', 'Fu ', 'Du ', 'Ji ', 'Shu ', 'Shang ', 'Si ', 'Bi ', 'Zhou ', 'Geng ', 'Pei ', 'Tan ', 'Lai ', 'Feng ', 'Zhui ', 'Fu ', 'Zhuan ', 'Sai ', 'Ze ', 'Yan ', 'Zan ', 'Yun ', 'Zeng ', 'Shan ', 'Ying ', 'Gan ', 'Chi ', 'Xi ', 'She ', 'Nan ', 'Xiong ', 'Xi ', 'Cheng ', 'He ', 'Cheng ', 'Zhe ', 'Xia ', 'Tang ', 'Zou ', 'Zou ', 'Li ', 'Jiu ', 'Fu ', 'Zhao ', 'Gan ', 'Qi ', 'Shan ', 'Qiong ', 'Qin ', 'Xian ', 'Ci ', 'Jue ', 'Qin ', 'Chi ', 'Ci ', 'Chen ', 'Chen ', 'Die ', 'Ju ', 'Chao ', 'Di ', 'Se ', 'Zhan ', 'Zhu ', 'Yue ', 'Qu ', 'Jie ', 'Chi ', 'Chu ', 'Gua ', 'Xue ', 'Ci ', 'Tiao ', 'Duo ', 'Lie ', 'Gan ', 'Suo ', 'Cu ', 'Xi ', 'Zhao ', 'Su ', 'Yin ', 'Ju ', 'Jian ', 'Que ', 'Tang ', 'Chuo ', 'Cui ', 'Lu ', 'Qu ', 'Dang ', 'Qiu ', 'Zi ', 'Ti ', 'Qu ', 'Chi ', 'Huang ', 'Qiao ', 'Qiao ', 'Yao ', 'Zao ', 'Ti ', '[?] ', 'Zan ', 'Zan ', 'Zu ', 'Pa ', 'Bao ', 'Ku ', 'Ke ', 'Dun ', 'Jue ', 'Fu ', 'Chen ', 'Jian ', 'Fang ', 'Zhi ', 'Sa ', 'Yue ', 'Pa ', 'Qi ', 'Yue ', 'Qiang ', 'Tuo ', 'Tai ', 'Yi ', 'Nian ', 'Ling ', 'Mei ', 'Ba ', 'Die ', 'Ku ', 'Tuo ', 'Jia ', 'Ci ', 'Pao ', 'Qia ', 'Zhu ', 'Ju ', 'Die ', 'Zhi ', 'Fu ', 'Pan ', 'Ju ', 'Shan ', 'Bo ', 'Ni ', 'Ju ', 'Li ', 'Gen ', 'Yi ', 'Ji ', 'Dai ', 'Xian ', 'Jiao ', 'Duo ', 'Zhu ', 'Zhuan ', 'Kua ', 'Zhuai ', 'Gui ', 'Qiong ', 'Kui ', 'Xiang ', 'Chi ', 'Lu ', 'Beng ', 'Zhi ', 'Jia ', 'Tiao ', 'Cai ', 'Jian ', 'Ta ', 'Qiao ', 'Bi ', 'Xian ', 'Duo ', 'Ji ', 'Ju ', 'Ji ', 'Shu ', 'Tu ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x08e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x08e.php new file mode 100644 index 0000000..be82e79 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x08e.php @@ -0,0 +1 @@ +<?php return ['Chu ', 'Jing ', 'Nie ', 'Xiao ', 'Bo ', 'Chi ', 'Qun ', 'Mou ', 'Shu ', 'Lang ', 'Yong ', 'Jiao ', 'Chou ', 'Qiao ', '[?] ', 'Ta ', 'Jian ', 'Qi ', 'Wo ', 'Wei ', 'Zhuo ', 'Jie ', 'Ji ', 'Nie ', 'Ju ', 'Ju ', 'Lun ', 'Lu ', 'Leng ', 'Huai ', 'Ju ', 'Chi ', 'Wan ', 'Quan ', 'Ti ', 'Bo ', 'Zu ', 'Qie ', 'Ji ', 'Cu ', 'Zong ', 'Cai ', 'Zong ', 'Peng ', 'Zhi ', 'Zheng ', 'Dian ', 'Zhi ', 'Yu ', 'Duo ', 'Dun ', 'Chun ', 'Yong ', 'Zhong ', 'Di ', 'Zhe ', 'Chen ', 'Chuai ', 'Jian ', 'Gua ', 'Tang ', 'Ju ', 'Fu ', 'Zu ', 'Die ', 'Pian ', 'Rou ', 'Nuo ', 'Ti ', 'Cha ', 'Tui ', 'Jian ', 'Dao ', 'Cuo ', 'Xi ', 'Ta ', 'Qiang ', 'Zhan ', 'Dian ', 'Ti ', 'Ji ', 'Nie ', 'Man ', 'Liu ', 'Zhan ', 'Bi ', 'Chong ', 'Lu ', 'Liao ', 'Cu ', 'Tang ', 'Dai ', 'Suo ', 'Xi ', 'Kui ', 'Ji ', 'Zhi ', 'Qiang ', 'Di ', 'Man ', 'Zong ', 'Lian ', 'Beng ', 'Zao ', 'Nian ', 'Bie ', 'Tui ', 'Ju ', 'Deng ', 'Ceng ', 'Xian ', 'Fan ', 'Chu ', 'Zhong ', 'Dun ', 'Bo ', 'Cu ', 'Zu ', 'Jue ', 'Jue ', 'Lin ', 'Ta ', 'Qiao ', 'Qiao ', 'Pu ', 'Liao ', 'Dun ', 'Cuan ', 'Kuang ', 'Zao ', 'Ta ', 'Bi ', 'Bi ', 'Zhu ', 'Ju ', 'Chu ', 'Qiao ', 'Dun ', 'Chou ', 'Ji ', 'Wu ', 'Yue ', 'Nian ', 'Lin ', 'Lie ', 'Zhi ', 'Li ', 'Zhi ', 'Chan ', 'Chu ', 'Duan ', 'Wei ', 'Long ', 'Lin ', 'Xian ', 'Wei ', 'Zuan ', 'Lan ', 'Xie ', 'Rang ', 'Xie ', 'Nie ', 'Ta ', 'Qu ', 'Jie ', 'Cuan ', 'Zuan ', 'Xi ', 'Kui ', 'Jue ', 'Lin ', 'Shen ', 'Gong ', 'Dan ', 'Segare ', 'Qu ', 'Ti ', 'Duo ', 'Duo ', 'Gong ', 'Lang ', 'Nerau ', 'Luo ', 'Ai ', 'Ji ', 'Ju ', 'Tang ', 'Utsuke ', '[?] ', 'Yan ', 'Shitsuke ', 'Kang ', 'Qu ', 'Lou ', 'Lao ', 'Tuo ', 'Zhi ', 'Yagate ', 'Ti ', 'Dao ', 'Yagate ', 'Yu ', 'Che ', 'Ya ', 'Gui ', 'Jun ', 'Wei ', 'Yue ', 'Xin ', 'Di ', 'Xuan ', 'Fan ', 'Ren ', 'Shan ', 'Qiang ', 'Shu ', 'Tun ', 'Chen ', 'Dai ', 'E ', 'Na ', 'Qi ', 'Mao ', 'Ruan ', 'Ren ', 'Fan ', 'Zhuan ', 'Hong ', 'Hu ', 'Qu ', 'Huang ', 'Di ', 'Ling ', 'Dai ', 'Ao ', 'Zhen ', 'Fan ', 'Kuang ', 'Ang ', 'Peng ', 'Bei ', 'Gu ', 'Ku ', 'Pao ', 'Zhu ', 'Rong ', 'E ', 'Ba ', 'Zhou ', 'Zhi ', 'Yao ', 'Ke ', 'Yi ', 'Qing ', 'Shi ', 'Ping ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x08f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x08f.php new file mode 100644 index 0000000..1587cab --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x08f.php @@ -0,0 +1 @@ +<?php return ['Er ', 'Qiong ', 'Ju ', 'Jiao ', 'Guang ', 'Lu ', 'Kai ', 'Quan ', 'Zhou ', 'Zai ', 'Zhi ', 'She ', 'Liang ', 'Yu ', 'Shao ', 'You ', 'Huan ', 'Yun ', 'Zhe ', 'Wan ', 'Fu ', 'Qing ', 'Zhou ', 'Ni ', 'Ling ', 'Zhe ', 'Zhan ', 'Liang ', 'Zi ', 'Hui ', 'Wang ', 'Chuo ', 'Guo ', 'Kan ', 'Yi ', 'Peng ', 'Qian ', 'Gun ', 'Nian ', 'Pian ', 'Guan ', 'Bei ', 'Lun ', 'Pai ', 'Liang ', 'Ruan ', 'Rou ', 'Ji ', 'Yang ', 'Xian ', 'Chuan ', 'Cou ', 'Qun ', 'Ge ', 'You ', 'Hong ', 'Shu ', 'Fu ', 'Zi ', 'Fu ', 'Wen ', 'Ben ', 'Zhan ', 'Yu ', 'Wen ', 'Tao ', 'Gu ', 'Zhen ', 'Xia ', 'Yuan ', 'Lu ', 'Jiu ', 'Chao ', 'Zhuan ', 'Wei ', 'Hun ', 'Sori ', 'Che ', 'Jiao ', 'Zhan ', 'Pu ', 'Lao ', 'Fen ', 'Fan ', 'Lin ', 'Ge ', 'Se ', 'Kan ', 'Huan ', 'Yi ', 'Ji ', 'Dui ', 'Er ', 'Yu ', 'Xian ', 'Hong ', 'Lei ', 'Pei ', 'Li ', 'Li ', 'Lu ', 'Lin ', 'Che ', 'Ya ', 'Gui ', 'Xuan ', 'Di ', 'Ren ', 'Zhuan ', 'E ', 'Lun ', 'Ruan ', 'Hong ', 'Ku ', 'Ke ', 'Lu ', 'Zhou ', 'Zhi ', 'Yi ', 'Hu ', 'Zhen ', 'Li ', 'Yao ', 'Qing ', 'Shi ', 'Zai ', 'Zhi ', 'Jiao ', 'Zhou ', 'Quan ', 'Lu ', 'Jiao ', 'Zhe ', 'Fu ', 'Liang ', 'Nian ', 'Bei ', 'Hui ', 'Gun ', 'Wang ', 'Liang ', 'Chuo ', 'Zi ', 'Cou ', 'Fu ', 'Ji ', 'Wen ', 'Shu ', 'Pei ', 'Yuan ', 'Xia ', 'Zhan ', 'Lu ', 'Che ', 'Lin ', 'Xin ', 'Gu ', 'Ci ', 'Ci ', 'Pi ', 'Zui ', 'Bian ', 'La ', 'La ', 'Ci ', 'Xue ', 'Ban ', 'Bian ', 'Bian ', 'Bian ', '[?] ', 'Bian ', 'Ban ', 'Ci ', 'Bian ', 'Bian ', 'Chen ', 'Ru ', 'Nong ', 'Nong ', 'Zhen ', 'Chuo ', 'Chuo ', 'Suberu ', 'Reng ', 'Bian ', 'Bian ', 'Sip ', 'Ip ', 'Liao ', 'Da ', 'Chan ', 'Gan ', 'Qian ', 'Yu ', 'Yu ', 'Qi ', 'Xun ', 'Yi ', 'Guo ', 'Mai ', 'Qi ', 'Za ', 'Wang ', 'Jia ', 'Zhun ', 'Ying ', 'Ti ', 'Yun ', 'Jin ', 'Hang ', 'Ya ', 'Fan ', 'Wu ', 'Da ', 'E ', 'Huan ', 'Zhe ', 'Totemo ', 'Jin ', 'Yuan ', 'Wei ', 'Lian ', 'Chi ', 'Che ', 'Ni ', 'Tiao ', 'Zhi ', 'Yi ', 'Jiong ', 'Jia ', 'Chen ', 'Dai ', 'Er ', 'Di ', 'Po ', 'Wang ', 'Die ', 'Ze ', 'Tao ', 'Shu ', 'Tuo ', 'Kep ', 'Jing ', 'Hui ', 'Tong ', 'You ', 'Mi ', 'Beng ', 'Ji ', 'Nai ', 'Yi ', 'Jie ', 'Zhui ', 'Lie ', 'Xun ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x090.php b/vendor/voku/portable-ascii/src/voku/helper/data/x090.php new file mode 100644 index 0000000..88735d0 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x090.php @@ -0,0 +1 @@ +<?php return ['Tui ', 'Song ', 'Gua ', 'Tao ', 'Pang ', 'Hou ', 'Ni ', 'Dun ', 'Jiong ', 'Xuan ', 'Xun ', 'Bu ', 'You ', 'Xiao ', 'Qiu ', 'Tou ', 'Zhu ', 'Qiu ', 'Di ', 'Di ', 'Tu ', 'Jing ', 'Ti ', 'Dou ', 'Yi ', 'Zhe ', 'Tong ', 'Guang ', 'Wu ', 'Shi ', 'Cheng ', 'Su ', 'Zao ', 'Qun ', 'Feng ', 'Lian ', 'Suo ', 'Hui ', 'Li ', 'Sako ', 'Lai ', 'Ben ', 'Cuo ', 'Jue ', 'Beng ', 'Huan ', 'Dai ', 'Lu ', 'You ', 'Zhou ', 'Jin ', 'Yu ', 'Chuo ', 'Kui ', 'Wei ', 'Ti ', 'Yi ', 'Da ', 'Yuan ', 'Luo ', 'Bi ', 'Nuo ', 'Yu ', 'Dang ', 'Sui ', 'Dun ', 'Sui ', 'Yan ', 'Chuan ', 'Chi ', 'Ti ', 'Yu ', 'Shi ', 'Zhen ', 'You ', 'Yun ', 'E ', 'Bian ', 'Guo ', 'E ', 'Xia ', 'Huang ', 'Qiu ', 'Dao ', 'Da ', 'Wei ', 'Appare ', 'Yi ', 'Gou ', 'Yao ', 'Chu ', 'Liu ', 'Xun ', 'Ta ', 'Di ', 'Chi ', 'Yuan ', 'Su ', 'Ta ', 'Qian ', '[?] ', 'Yao ', 'Guan ', 'Zhang ', 'Ao ', 'Shi ', 'Ce ', 'Chi ', 'Su ', 'Zao ', 'Zhe ', 'Dun ', 'Di ', 'Lou ', 'Chi ', 'Cuo ', 'Lin ', 'Zun ', 'Rao ', 'Qian ', 'Xuan ', 'Yu ', 'Yi ', 'Wu ', 'Liao ', 'Ju ', 'Shi ', 'Bi ', 'Yao ', 'Mai ', 'Xie ', 'Sui ', 'Huan ', 'Zhan ', 'Teng ', 'Er ', 'Miao ', 'Bian ', 'Bian ', 'La ', 'Li ', 'Yuan ', 'Yao ', 'Luo ', 'Li ', 'Yi ', 'Ting ', 'Deng ', 'Qi ', 'Yong ', 'Shan ', 'Han ', 'Yu ', 'Mang ', 'Ru ', 'Qiong ', '[?] ', 'Kuang ', 'Fu ', 'Kang ', 'Bin ', 'Fang ', 'Xing ', 'Na ', 'Xin ', 'Shen ', 'Bang ', 'Yuan ', 'Cun ', 'Huo ', 'Xie ', 'Bang ', 'Wu ', 'Ju ', 'You ', 'Han ', 'Tai ', 'Qiu ', 'Bi ', 'Pei ', 'Bing ', 'Shao ', 'Bei ', 'Wa ', 'Di ', 'Zou ', 'Ye ', 'Lin ', 'Kuang ', 'Gui ', 'Zhu ', 'Shi ', 'Ku ', 'Yu ', 'Gai ', 'Ge ', 'Xi ', 'Zhi ', 'Ji ', 'Xun ', 'Hou ', 'Xing ', 'Jiao ', 'Xi ', 'Gui ', 'Nuo ', 'Lang ', 'Jia ', 'Kuai ', 'Zheng ', 'Otoko ', 'Yun ', 'Yan ', 'Cheng ', 'Dou ', 'Chi ', 'Lu ', 'Fu ', 'Wu ', 'Fu ', 'Gao ', 'Hao ', 'Lang ', 'Jia ', 'Geng ', 'Jun ', 'Ying ', 'Bo ', 'Xi ', 'Bei ', 'Li ', 'Yun ', 'Bu ', 'Xiao ', 'Qi ', 'Pi ', 'Qing ', 'Guo ', 'Zhou ', 'Tan ', 'Zou ', 'Ping ', 'Lai ', 'Ni ', 'Chen ', 'You ', 'Bu ', 'Xiang ', 'Dan ', 'Ju ', 'Yong ', 'Qiao ', 'Yi ', 'Du ', 'Yan ', 'Mei ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x091.php b/vendor/voku/portable-ascii/src/voku/helper/data/x091.php new file mode 100644 index 0000000..372e972 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x091.php @@ -0,0 +1 @@ +<?php return ['Ruo ', 'Bei ', 'E ', 'Yu ', 'Juan ', 'Yu ', 'Yun ', 'Hou ', 'Kui ', 'Xiang ', 'Xiang ', 'Sou ', 'Tang ', 'Ming ', 'Xi ', 'Ru ', 'Chu ', 'Zi ', 'Zou ', 'Ju ', 'Wu ', 'Xiang ', 'Yun ', 'Hao ', 'Yong ', 'Bi ', 'Mo ', 'Chao ', 'Fu ', 'Liao ', 'Yin ', 'Zhuan ', 'Hu ', 'Qiao ', 'Yan ', 'Zhang ', 'Fan ', 'Qiao ', 'Xu ', 'Deng ', 'Bi ', 'Xin ', 'Bi ', 'Ceng ', 'Wei ', 'Zheng ', 'Mao ', 'Shan ', 'Lin ', 'Po ', 'Dan ', 'Meng ', 'Ye ', 'Cao ', 'Kuai ', 'Feng ', 'Meng ', 'Zou ', 'Kuang ', 'Lian ', 'Zan ', 'Chan ', 'You ', 'Qi ', 'Yan ', 'Chan ', 'Zan ', 'Ling ', 'Huan ', 'Xi ', 'Feng ', 'Zan ', 'Li ', 'You ', 'Ding ', 'Qiu ', 'Zhuo ', 'Pei ', 'Zhou ', 'Yi ', 'Hang ', 'Yu ', 'Jiu ', 'Yan ', 'Zui ', 'Mao ', 'Dan ', 'Xu ', 'Tou ', 'Zhen ', 'Fen ', 'Sakenomoto ', '[?] ', 'Yun ', 'Tai ', 'Tian ', 'Qia ', 'Tuo ', 'Zuo ', 'Han ', 'Gu ', 'Su ', 'Po ', 'Chou ', 'Zai ', 'Ming ', 'Luo ', 'Chuo ', 'Chou ', 'You ', 'Tong ', 'Zhi ', 'Xian ', 'Jiang ', 'Cheng ', 'Yin ', 'Tu ', 'Xiao ', 'Mei ', 'Ku ', 'Suan ', 'Lei ', 'Pu ', 'Zui ', 'Hai ', 'Yan ', 'Xi ', 'Niang ', 'Wei ', 'Lu ', 'Lan ', 'Yan ', 'Tao ', 'Pei ', 'Zhan ', 'Chun ', 'Tan ', 'Zui ', 'Chuo ', 'Cu ', 'Kun ', 'Ti ', 'Mian ', 'Du ', 'Hu ', 'Xu ', 'Xing ', 'Tan ', 'Jiu ', 'Chun ', 'Yun ', 'Po ', 'Ke ', 'Sou ', 'Mi ', 'Quan ', 'Chou ', 'Cuo ', 'Yun ', 'Yong ', 'Ang ', 'Zha ', 'Hai ', 'Tang ', 'Jiang ', 'Piao ', 'Shan ', 'Yu ', 'Li ', 'Zao ', 'Lao ', 'Yi ', 'Jiang ', 'Pu ', 'Jiao ', 'Xi ', 'Tan ', 'Po ', 'Nong ', 'Yi ', 'Li ', 'Ju ', 'Jiao ', 'Yi ', 'Niang ', 'Ru ', 'Xun ', 'Chou ', 'Yan ', 'Ling ', 'Mi ', 'Mi ', 'Niang ', 'Xin ', 'Jiao ', 'Xi ', 'Mi ', 'Yan ', 'Bian ', 'Cai ', 'Shi ', 'You ', 'Shi ', 'Shi ', 'Li ', 'Zhong ', 'Ye ', 'Liang ', 'Li ', 'Jin ', 'Jin ', 'Qiu ', 'Yi ', 'Diao ', 'Dao ', 'Zhao ', 'Ding ', 'Po ', 'Qiu ', 'He ', 'Fu ', 'Zhen ', 'Zhi ', 'Ba ', 'Luan ', 'Fu ', 'Nai ', 'Diao ', 'Shan ', 'Qiao ', 'Kou ', 'Chuan ', 'Zi ', 'Fan ', 'Yu ', 'Hua ', 'Han ', 'Gong ', 'Qi ', 'Mang ', 'Ri ', 'Di ', 'Si ', 'Xi ', 'Yi ', 'Chai ', 'Shi ', 'Tu ', 'Xi ', 'Nu ', 'Qian ', 'Ishiyumi ', 'Jian ', 'Pi ', 'Ye ', 'Yin ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x092.php b/vendor/voku/portable-ascii/src/voku/helper/data/x092.php new file mode 100644 index 0000000..e9528f7 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x092.php @@ -0,0 +1 @@ +<?php return ['Ba ', 'Fang ', 'Chen ', 'Xing ', 'Tou ', 'Yue ', 'Yan ', 'Fu ', 'Pi ', 'Na ', 'Xin ', 'E ', 'Jue ', 'Dun ', 'Gou ', 'Yin ', 'Qian ', 'Ban ', 'Ji ', 'Ren ', 'Chao ', 'Niu ', 'Fen ', 'Yun ', 'Ji ', 'Qin ', 'Pi ', 'Guo ', 'Hong ', 'Yin ', 'Jun ', 'Shi ', 'Yi ', 'Zhong ', 'Nie ', 'Gai ', 'Ri ', 'Huo ', 'Tai ', 'Kang ', 'Habaki ', 'Irori ', 'Ngaak ', '[?] ', 'Duo ', 'Zi ', 'Ni ', 'Tu ', 'Shi ', 'Min ', 'Gu ', 'E ', 'Ling ', 'Bing ', 'Yi ', 'Gu ', 'Ba ', 'Pi ', 'Yu ', 'Si ', 'Zuo ', 'Bu ', 'You ', 'Dian ', 'Jia ', 'Zhen ', 'Shi ', 'Shi ', 'Tie ', 'Ju ', 'Zhan ', 'Shi ', 'She ', 'Xuan ', 'Zhao ', 'Bao ', 'He ', 'Bi ', 'Sheng ', 'Chu ', 'Shi ', 'Bo ', 'Zhu ', 'Chi ', 'Za ', 'Po ', 'Tong ', 'Qian ', 'Fu ', 'Zhai ', 'Liu ', 'Qian ', 'Fu ', 'Li ', 'Yue ', 'Pi ', 'Yang ', 'Ban ', 'Bo ', 'Jie ', 'Gou ', 'Shu ', 'Zheng ', 'Mu ', 'Ni ', 'Nie ', 'Di ', 'Jia ', 'Mu ', 'Dan ', 'Shen ', 'Yi ', 'Si ', 'Kuang ', 'Ka ', 'Bei ', 'Jian ', 'Tong ', 'Xing ', 'Hong ', 'Jiao ', 'Chi ', 'Er ', 'Ge ', 'Bing ', 'Shi ', 'Mou ', 'Jia ', 'Yin ', 'Jun ', 'Zhou ', 'Chong ', 'Shang ', 'Tong ', 'Mo ', 'Lei ', 'Ji ', 'Yu ', 'Xu ', 'Ren ', 'Zun ', 'Zhi ', 'Qiong ', 'Shan ', 'Chi ', 'Xian ', 'Xing ', 'Quan ', 'Pi ', 'Tie ', 'Zhu ', 'Hou ', 'Ming ', 'Kua ', 'Yao ', 'Xian ', 'Xian ', 'Xiu ', 'Jun ', 'Cha ', 'Lao ', 'Ji ', 'Pi ', 'Ru ', 'Mi ', 'Yi ', 'Yin ', 'Guang ', 'An ', 'Diou ', 'You ', 'Se ', 'Kao ', 'Qian ', 'Luan ', 'Kasugai ', 'Ai ', 'Diao ', 'Han ', 'Rui ', 'Shi ', 'Keng ', 'Qiu ', 'Xiao ', 'Zhe ', 'Xiu ', 'Zang ', 'Ti ', 'Cuo ', 'Gua ', 'Gong ', 'Zhong ', 'Dou ', 'Lu ', 'Mei ', 'Lang ', 'Wan ', 'Xin ', 'Yun ', 'Bei ', 'Wu ', 'Su ', 'Yu ', 'Chan ', 'Ting ', 'Bo ', 'Han ', 'Jia ', 'Hong ', 'Cuan ', 'Feng ', 'Chan ', 'Wan ', 'Zhi ', 'Si ', 'Xuan ', 'Wu ', 'Wu ', 'Tiao ', 'Gong ', 'Zhuo ', 'Lue ', 'Xing ', 'Qian ', 'Shen ', 'Han ', 'Lue ', 'Xie ', 'Chu ', 'Zheng ', 'Ju ', 'Xian ', 'Tie ', 'Mang ', 'Pu ', 'Li ', 'Pan ', 'Rui ', 'Cheng ', 'Gao ', 'Li ', 'Te ', 'Pyeng ', 'Zhu ', '[?] ', 'Tu ', 'Liu ', 'Zui ', 'Ju ', 'Chang ', 'Yuan ', 'Jian ', 'Gang ', 'Diao ', 'Tao ', 'Chang ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x093.php b/vendor/voku/portable-ascii/src/voku/helper/data/x093.php new file mode 100644 index 0000000..564a43f --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x093.php @@ -0,0 +1 @@ +<?php return ['Lun ', 'Kua ', 'Ling ', 'Bei ', 'Lu ', 'Li ', 'Qiang ', 'Pou ', 'Juan ', 'Min ', 'Zui ', 'Peng ', 'An ', 'Pi ', 'Xian ', 'Ya ', 'Zhui ', 'Lei ', 'A ', 'Kong ', 'Ta ', 'Kun ', 'Du ', 'Wei ', 'Chui ', 'Zi ', 'Zheng ', 'Ben ', 'Nie ', 'Cong ', 'Qun ', 'Tan ', 'Ding ', 'Qi ', 'Qian ', 'Zhuo ', 'Qi ', 'Yu ', 'Jin ', 'Guan ', 'Mao ', 'Chang ', 'Tian ', 'Xi ', 'Lian ', 'Tao ', 'Gu ', 'Cuo ', 'Shu ', 'Zhen ', 'Lu ', 'Meng ', 'Lu ', 'Hua ', 'Biao ', 'Ga ', 'Lai ', 'Ken ', 'Kazari ', 'Bu ', 'Nai ', 'Wan ', 'Zan ', '[?] ', 'De ', 'Xian ', '[?] ', 'Huo ', 'Liang ', '[?] ', 'Men ', 'Kai ', 'Ying ', 'Di ', 'Lian ', 'Guo ', 'Xian ', 'Du ', 'Tu ', 'Wei ', 'Cong ', 'Fu ', 'Rou ', 'Ji ', 'E ', 'Rou ', 'Chen ', 'Ti ', 'Zha ', 'Hong ', 'Yang ', 'Duan ', 'Xia ', 'Yu ', 'Keng ', 'Xing ', 'Huang ', 'Wei ', 'Fu ', 'Zhao ', 'Cha ', 'Qie ', 'She ', 'Hong ', 'Kui ', 'Tian ', 'Mou ', 'Qiao ', 'Qiao ', 'Hou ', 'Tou ', 'Cong ', 'Huan ', 'Ye ', 'Min ', 'Jian ', 'Duan ', 'Jian ', 'Song ', 'Kui ', 'Hu ', 'Xuan ', 'Duo ', 'Jie ', 'Zhen ', 'Bian ', 'Zhong ', 'Zi ', 'Xiu ', 'Ye ', 'Mei ', 'Pai ', 'Ai ', 'Jie ', '[?] ', 'Mei ', 'Chuo ', 'Ta ', 'Bang ', 'Xia ', 'Lian ', 'Suo ', 'Xi ', 'Liu ', 'Zu ', 'Ye ', 'Nou ', 'Weng ', 'Rong ', 'Tang ', 'Suo ', 'Qiang ', 'Ge ', 'Shuo ', 'Chui ', 'Bo ', 'Pan ', 'Sa ', 'Bi ', 'Sang ', 'Gang ', 'Zi ', 'Wu ', 'Ying ', 'Huang ', 'Tiao ', 'Liu ', 'Kai ', 'Sun ', 'Sha ', 'Sou ', 'Wan ', 'Hao ', 'Zhen ', 'Zhen ', 'Luo ', 'Yi ', 'Yuan ', 'Tang ', 'Nie ', 'Xi ', 'Jia ', 'Ge ', 'Ma ', 'Juan ', 'Kasugai ', 'Habaki ', 'Suo ', '[?] ', '[?] ', '[?] ', 'Na ', 'Lu ', 'Suo ', 'Ou ', 'Zu ', 'Tuan ', 'Xiu ', 'Guan ', 'Xuan ', 'Lian ', 'Shou ', 'Ao ', 'Man ', 'Mo ', 'Luo ', 'Bi ', 'Wei ', 'Liu ', 'Di ', 'Qiao ', 'Cong ', 'Yi ', 'Lu ', 'Ao ', 'Keng ', 'Qiang ', 'Cui ', 'Qi ', 'Chang ', 'Tang ', 'Man ', 'Yong ', 'Chan ', 'Feng ', 'Jing ', 'Biao ', 'Shu ', 'Lou ', 'Xiu ', 'Cong ', 'Long ', 'Zan ', 'Jian ', 'Cao ', 'Li ', 'Xia ', 'Xi ', 'Kang ', '[?] ', 'Beng ', '[?] ', '[?] ', 'Zheng ', 'Lu ', 'Hua ', 'Ji ', 'Pu ', 'Hui ', 'Qiang ', 'Po ', 'Lin ', 'Suo ', 'Xiu ', 'San ', 'Cheng ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x094.php b/vendor/voku/portable-ascii/src/voku/helper/data/x094.php new file mode 100644 index 0000000..ee2bd6f --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x094.php @@ -0,0 +1 @@ +<?php return ['Kui ', 'Si ', 'Liu ', 'Nao ', 'Heng ', 'Pie ', 'Sui ', 'Fan ', 'Qiao ', 'Quan ', 'Yang ', 'Tang ', 'Xiang ', 'Jue ', 'Jiao ', 'Zun ', 'Liao ', 'Jie ', 'Lao ', 'Dui ', 'Tan ', 'Zan ', 'Ji ', 'Jian ', 'Zhong ', 'Deng ', 'Ya ', 'Ying ', 'Dui ', 'Jue ', 'Nou ', 'Ti ', 'Pu ', 'Tie ', '[?] ', '[?] ', 'Ding ', 'Shan ', 'Kai ', 'Jian ', 'Fei ', 'Sui ', 'Lu ', 'Juan ', 'Hui ', 'Yu ', 'Lian ', 'Zhuo ', 'Qiao ', 'Qian ', 'Zhuo ', 'Lei ', 'Bi ', 'Tie ', 'Huan ', 'Ye ', 'Duo ', 'Guo ', 'Dang ', 'Ju ', 'Fen ', 'Da ', 'Bei ', 'Yi ', 'Ai ', 'Zong ', 'Xun ', 'Diao ', 'Zhu ', 'Heng ', 'Zhui ', 'Ji ', 'Nie ', 'Ta ', 'Huo ', 'Qing ', 'Bin ', 'Ying ', 'Kui ', 'Ning ', 'Xu ', 'Jian ', 'Jian ', 'Yari ', 'Cha ', 'Zhi ', 'Mie ', 'Li ', 'Lei ', 'Ji ', 'Zuan ', 'Kuang ', 'Shang ', 'Peng ', 'La ', 'Du ', 'Shuo ', 'Chuo ', 'Lu ', 'Biao ', 'Bao ', 'Lu ', '[?] ', '[?] ', 'Long ', 'E ', 'Lu ', 'Xin ', 'Jian ', 'Lan ', 'Bo ', 'Jian ', 'Yao ', 'Chan ', 'Xiang ', 'Jian ', 'Xi ', 'Guan ', 'Cang ', 'Nie ', 'Lei ', 'Cuan ', 'Qu ', 'Pan ', 'Luo ', 'Zuan ', 'Luan ', 'Zao ', 'Nie ', 'Jue ', 'Tang ', 'Shu ', 'Lan ', 'Jin ', 'Qiu ', 'Yi ', 'Zhen ', 'Ding ', 'Zhao ', 'Po ', 'Diao ', 'Tu ', 'Qian ', 'Chuan ', 'Shan ', 'Ji ', 'Fan ', 'Diao ', 'Men ', 'Nu ', 'Xi ', 'Chai ', 'Xing ', 'Gai ', 'Bu ', 'Tai ', 'Ju ', 'Dun ', 'Chao ', 'Zhong ', 'Na ', 'Bei ', 'Gang ', 'Ban ', 'Qian ', 'Yao ', 'Qin ', 'Jun ', 'Wu ', 'Gou ', 'Kang ', 'Fang ', 'Huo ', 'Tou ', 'Niu ', 'Ba ', 'Yu ', 'Qian ', 'Zheng ', 'Qian ', 'Gu ', 'Bo ', 'E ', 'Po ', 'Bu ', 'Ba ', 'Yue ', 'Zuan ', 'Mu ', 'Dan ', 'Jia ', 'Dian ', 'You ', 'Tie ', 'Bo ', 'Ling ', 'Shuo ', 'Qian ', 'Liu ', 'Bao ', 'Shi ', 'Xuan ', 'She ', 'Bi ', 'Ni ', 'Pi ', 'Duo ', 'Xing ', 'Kao ', 'Lao ', 'Er ', 'Mang ', 'Ya ', 'You ', 'Cheng ', 'Jia ', 'Ye ', 'Nao ', 'Zhi ', 'Dang ', 'Tong ', 'Lu ', 'Diao ', 'Yin ', 'Kai ', 'Zha ', 'Zhu ', 'Xian ', 'Ting ', 'Diu ', 'Xian ', 'Hua ', 'Quan ', 'Sha ', 'Jia ', 'Yao ', 'Ge ', 'Ming ', 'Zheng ', 'Se ', 'Jiao ', 'Yi ', 'Chan ', 'Chong ', 'Tang ', 'An ', 'Yin ', 'Ru ', 'Zhu ', 'Lao ', 'Pu ', 'Wu ', 'Lai ', 'Te ', 'Lian ', 'Keng ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x095.php b/vendor/voku/portable-ascii/src/voku/helper/data/x095.php new file mode 100644 index 0000000..a14ab17 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x095.php @@ -0,0 +1 @@ +<?php return ['Xiao ', 'Suo ', 'Li ', 'Zheng ', 'Chu ', 'Guo ', 'Gao ', 'Tie ', 'Xiu ', 'Cuo ', 'Lue ', 'Feng ', 'Xin ', 'Liu ', 'Kai ', 'Jian ', 'Rui ', 'Ti ', 'Lang ', 'Qian ', 'Ju ', 'A ', 'Qiang ', 'Duo ', 'Tian ', 'Cuo ', 'Mao ', 'Ben ', 'Qi ', 'De ', 'Kua ', 'Kun ', 'Chang ', 'Xi ', 'Gu ', 'Luo ', 'Chui ', 'Zhui ', 'Jin ', 'Zhi ', 'Xian ', 'Juan ', 'Huo ', 'Pou ', 'Tan ', 'Ding ', 'Jian ', 'Ju ', 'Meng ', 'Zi ', 'Qie ', 'Ying ', 'Kai ', 'Qiang ', 'Song ', 'E ', 'Cha ', 'Qiao ', 'Zhong ', 'Duan ', 'Sou ', 'Huang ', 'Huan ', 'Ai ', 'Du ', 'Mei ', 'Lou ', 'Zi ', 'Fei ', 'Mei ', 'Mo ', 'Zhen ', 'Bo ', 'Ge ', 'Nie ', 'Tang ', 'Juan ', 'Nie ', 'Na ', 'Liu ', 'Hao ', 'Bang ', 'Yi ', 'Jia ', 'Bin ', 'Rong ', 'Biao ', 'Tang ', 'Man ', 'Luo ', 'Beng ', 'Yong ', 'Jing ', 'Di ', 'Zu ', 'Xuan ', 'Liu ', 'Tan ', 'Jue ', 'Liao ', 'Pu ', 'Lu ', 'Dui ', 'Lan ', 'Pu ', 'Cuan ', 'Qiang ', 'Deng ', 'Huo ', 'Lei ', 'Huan ', 'Zhuo ', 'Lian ', 'Yi ', 'Cha ', 'Biao ', 'La ', 'Chan ', 'Xiang ', 'Chang ', 'Chang ', 'Jiu ', 'Ao ', 'Die ', 'Qu ', 'Liao ', 'Mi ', 'Chang ', 'Men ', 'Ma ', 'Shuan ', 'Shan ', 'Huo ', 'Men ', 'Yan ', 'Bi ', 'Han ', 'Bi ', 'San ', 'Kai ', 'Kang ', 'Beng ', 'Hong ', 'Run ', 'San ', 'Xian ', 'Xian ', 'Jian ', 'Min ', 'Xia ', 'Yuru ', 'Dou ', 'Zha ', 'Nao ', 'Jian ', 'Peng ', 'Xia ', 'Ling ', 'Bian ', 'Bi ', 'Run ', 'He ', 'Guan ', 'Ge ', 'Ge ', 'Fa ', 'Chu ', 'Hong ', 'Gui ', 'Min ', 'Se ', 'Kun ', 'Lang ', 'Lu ', 'Ting ', 'Sha ', 'Ju ', 'Yue ', 'Yue ', 'Chan ', 'Qu ', 'Lin ', 'Chang ', 'Shai ', 'Kun ', 'Yan ', 'Min ', 'Yan ', 'E ', 'Hun ', 'Yu ', 'Wen ', 'Xiang ', 'Bao ', 'Xiang ', 'Qu ', 'Yao ', 'Wen ', 'Ban ', 'An ', 'Wei ', 'Yin ', 'Kuo ', 'Que ', 'Lan ', 'Du ', '[?] ', 'Phwung ', 'Tian ', 'Nie ', 'Ta ', 'Kai ', 'He ', 'Que ', 'Chuang ', 'Guan ', 'Dou ', 'Qi ', 'Kui ', 'Tang ', 'Guan ', 'Piao ', 'Kan ', 'Xi ', 'Hui ', 'Chan ', 'Pi ', 'Dang ', 'Huan ', 'Ta ', 'Wen ', '[?] ', 'Men ', 'Shuan ', 'Shan ', 'Yan ', 'Han ', 'Bi ', 'Wen ', 'Chuang ', 'Run ', 'Wei ', 'Xian ', 'Hong ', 'Jian ', 'Min ', 'Kang ', 'Men ', 'Zha ', 'Nao ', 'Gui ', 'Wen ', 'Ta ', 'Min ', 'Lu ', 'Kai ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x096.php b/vendor/voku/portable-ascii/src/voku/helper/data/x096.php new file mode 100644 index 0000000..43f58e7 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x096.php @@ -0,0 +1 @@ +<?php return ['Fa ', 'Ge ', 'He ', 'Kun ', 'Jiu ', 'Yue ', 'Lang ', 'Du ', 'Yu ', 'Yan ', 'Chang ', 'Xi ', 'Wen ', 'Hun ', 'Yan ', 'E ', 'Chan ', 'Lan ', 'Qu ', 'Hui ', 'Kuo ', 'Que ', 'Ge ', 'Tian ', 'Ta ', 'Que ', 'Kan ', 'Huan ', 'Fu ', 'Fu ', 'Le ', 'Dui ', 'Xin ', 'Qian ', 'Wu ', 'Yi ', 'Tuo ', 'Yin ', 'Yang ', 'Dou ', 'E ', 'Sheng ', 'Ban ', 'Pei ', 'Keng ', 'Yun ', 'Ruan ', 'Zhi ', 'Pi ', 'Jing ', 'Fang ', 'Yang ', 'Yin ', 'Zhen ', 'Jie ', 'Cheng ', 'E ', 'Qu ', 'Di ', 'Zu ', 'Zuo ', 'Dian ', 'Ling ', 'A ', 'Tuo ', 'Tuo ', 'Po ', 'Bing ', 'Fu ', 'Ji ', 'Lu ', 'Long ', 'Chen ', 'Xing ', 'Duo ', 'Lou ', 'Mo ', 'Jiang ', 'Shu ', 'Duo ', 'Xian ', 'Er ', 'Gui ', 'Yu ', 'Gai ', 'Shan ', 'Xun ', 'Qiao ', 'Xing ', 'Chun ', 'Fu ', 'Bi ', 'Xia ', 'Shan ', 'Sheng ', 'Zhi ', 'Pu ', 'Dou ', 'Yuan ', 'Zhen ', 'Chu ', 'Xian ', 'Tou ', 'Nie ', 'Yun ', 'Xian ', 'Pei ', 'Pei ', 'Zou ', 'Yi ', 'Dui ', 'Lun ', 'Yin ', 'Ju ', 'Chui ', 'Chen ', 'Pi ', 'Ling ', 'Tao ', 'Xian ', 'Lu ', 'Sheng ', 'Xian ', 'Yin ', 'Zhu ', 'Yang ', 'Reng ', 'Shan ', 'Chong ', 'Yan ', 'Yin ', 'Yu ', 'Ti ', 'Yu ', 'Long ', 'Wei ', 'Wei ', 'Nie ', 'Dui ', 'Sui ', 'An ', 'Huang ', 'Jie ', 'Sui ', 'Yin ', 'Gai ', 'Yan ', 'Hui ', 'Ge ', 'Yun ', 'Wu ', 'Wei ', 'Ai ', 'Xi ', 'Tang ', 'Ji ', 'Zhang ', 'Dao ', 'Ao ', 'Xi ', 'Yin ', '[?] ', 'Rao ', 'Lin ', 'Tui ', 'Deng ', 'Pi ', 'Sui ', 'Sui ', 'Yu ', 'Xian ', 'Fen ', 'Ni ', 'Er ', 'Ji ', 'Dao ', 'Xi ', 'Yin ', 'E ', 'Hui ', 'Long ', 'Xi ', 'Li ', 'Li ', 'Li ', 'Zhui ', 'He ', 'Zhi ', 'Zhun ', 'Jun ', 'Nan ', 'Yi ', 'Que ', 'Yan ', 'Qian ', 'Ya ', 'Xiong ', 'Ya ', 'Ji ', 'Gu ', 'Huan ', 'Zhi ', 'Gou ', 'Jun ', 'Ci ', 'Yong ', 'Ju ', 'Chu ', 'Hu ', 'Za ', 'Luo ', 'Yu ', 'Chou ', 'Diao ', 'Sui ', 'Han ', 'Huo ', 'Shuang ', 'Guan ', 'Chu ', 'Za ', 'Yong ', 'Ji ', 'Xi ', 'Chou ', 'Liu ', 'Li ', 'Nan ', 'Xue ', 'Za ', 'Ji ', 'Ji ', 'Yu ', 'Yu ', 'Xue ', 'Na ', 'Fou ', 'Se ', 'Mu ', 'Wen ', 'Fen ', 'Pang ', 'Yun ', 'Li ', 'Li ', 'Ang ', 'Ling ', 'Lei ', 'An ', 'Bao ', 'Meng ', 'Dian ', 'Dang ', 'Xing ', 'Wu ', 'Zhao ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x097.php b/vendor/voku/portable-ascii/src/voku/helper/data/x097.php new file mode 100644 index 0000000..8be6ac9 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x097.php @@ -0,0 +1 @@ +<?php return ['Xu ', 'Ji ', 'Mu ', 'Chen ', 'Xiao ', 'Zha ', 'Ting ', 'Zhen ', 'Pei ', 'Mei ', 'Ling ', 'Qi ', 'Chou ', 'Huo ', 'Sha ', 'Fei ', 'Weng ', 'Zhan ', 'Yin ', 'Ni ', 'Chou ', 'Tun ', 'Lin ', '[?] ', 'Dong ', 'Ying ', 'Wu ', 'Ling ', 'Shuang ', 'Ling ', 'Xia ', 'Hong ', 'Yin ', 'Mo ', 'Mai ', 'Yun ', 'Liu ', 'Meng ', 'Bin ', 'Wu ', 'Wei ', 'Huo ', 'Yin ', 'Xi ', 'Yi ', 'Ai ', 'Dan ', 'Deng ', 'Xian ', 'Yu ', 'Lu ', 'Long ', 'Dai ', 'Ji ', 'Pang ', 'Yang ', 'Ba ', 'Pi ', 'Wei ', '[?] ', 'Xi ', 'Ji ', 'Mai ', 'Meng ', 'Meng ', 'Lei ', 'Li ', 'Huo ', 'Ai ', 'Fei ', 'Dai ', 'Long ', 'Ling ', 'Ai ', 'Feng ', 'Li ', 'Bao ', '[?] ', 'He ', 'He ', 'Bing ', 'Qing ', 'Qing ', 'Jing ', 'Tian ', 'Zhen ', 'Jing ', 'Cheng ', 'Qing ', 'Jing ', 'Jing ', 'Dian ', 'Jing ', 'Tian ', 'Fei ', 'Fei ', 'Kao ', 'Mi ', 'Mian ', 'Mian ', 'Pao ', 'Ye ', 'Tian ', 'Hui ', 'Ye ', 'Ge ', 'Ding ', 'Cha ', 'Jian ', 'Ren ', 'Di ', 'Du ', 'Wu ', 'Ren ', 'Qin ', 'Jin ', 'Xue ', 'Niu ', 'Ba ', 'Yin ', 'Sa ', 'Na ', 'Mo ', 'Zu ', 'Da ', 'Ban ', 'Yi ', 'Yao ', 'Tao ', 'Tuo ', 'Jia ', 'Hong ', 'Pao ', 'Yang ', 'Tomo ', 'Yin ', 'Jia ', 'Tao ', 'Ji ', 'Xie ', 'An ', 'An ', 'Hen ', 'Gong ', 'Kohaze ', 'Da ', 'Qiao ', 'Ting ', 'Wan ', 'Ying ', 'Sui ', 'Tiao ', 'Qiao ', 'Xuan ', 'Kong ', 'Beng ', 'Ta ', 'Zhang ', 'Bing ', 'Kuo ', 'Ju ', 'La ', 'Xie ', 'Rou ', 'Bang ', 'Yi ', 'Qiu ', 'Qiu ', 'He ', 'Xiao ', 'Mu ', 'Ju ', 'Jian ', 'Bian ', 'Di ', 'Jian ', 'On ', 'Tao ', 'Gou ', 'Ta ', 'Bei ', 'Xie ', 'Pan ', 'Ge ', 'Bi ', 'Kuo ', 'Tang ', 'Lou ', 'Gui ', 'Qiao ', 'Xue ', 'Ji ', 'Jian ', 'Jiang ', 'Chan ', 'Da ', 'Huo ', 'Xian ', 'Qian ', 'Du ', 'Wa ', 'Jian ', 'Lan ', 'Wei ', 'Ren ', 'Fu ', 'Mei ', 'Juan ', 'Ge ', 'Wei ', 'Qiao ', 'Han ', 'Chang ', '[?] ', 'Rou ', 'Xun ', 'She ', 'Wei ', 'Ge ', 'Bei ', 'Tao ', 'Gou ', 'Yun ', '[?] ', 'Bi ', 'Wei ', 'Hui ', 'Du ', 'Wa ', 'Du ', 'Wei ', 'Ren ', 'Fu ', 'Han ', 'Wei ', 'Yun ', 'Tao ', 'Jiu ', 'Jiu ', 'Xian ', 'Xie ', 'Xian ', 'Ji ', 'Yin ', 'Za ', 'Yun ', 'Shao ', 'Le ', 'Peng ', 'Heng ', 'Ying ', 'Yun ', 'Peng ', 'Yin ', 'Yin ', 'Xiang ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x098.php b/vendor/voku/portable-ascii/src/voku/helper/data/x098.php new file mode 100644 index 0000000..9320a79 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x098.php @@ -0,0 +1 @@ +<?php return ['Hu ', 'Ye ', 'Ding ', 'Qing ', 'Pan ', 'Xiang ', 'Shun ', 'Han ', 'Xu ', 'Yi ', 'Xu ', 'Gu ', 'Song ', 'Kui ', 'Qi ', 'Hang ', 'Yu ', 'Wan ', 'Ban ', 'Dun ', 'Di ', 'Dan ', 'Pan ', 'Po ', 'Ling ', 'Ce ', 'Jing ', 'Lei ', 'He ', 'Qiao ', 'E ', 'E ', 'Wei ', 'Jie ', 'Gua ', 'Shen ', 'Yi ', 'Shen ', 'Hai ', 'Dui ', 'Pian ', 'Ping ', 'Lei ', 'Fu ', 'Jia ', 'Tou ', 'Hui ', 'Kui ', 'Jia ', 'Le ', 'Tian ', 'Cheng ', 'Ying ', 'Jun ', 'Hu ', 'Han ', 'Jing ', 'Tui ', 'Tui ', 'Pin ', 'Lai ', 'Tui ', 'Zi ', 'Zi ', 'Chui ', 'Ding ', 'Lai ', 'Yan ', 'Han ', 'Jian ', 'Ke ', 'Cui ', 'Jiong ', 'Qin ', 'Yi ', 'Sai ', 'Ti ', 'E ', 'E ', 'Yan ', 'Hun ', 'Kan ', 'Yong ', 'Zhuan ', 'Yan ', 'Xian ', 'Xin ', 'Yi ', 'Yuan ', 'Sang ', 'Dian ', 'Dian ', 'Jiang ', 'Ku ', 'Lei ', 'Liao ', 'Piao ', 'Yi ', 'Man ', 'Qi ', 'Rao ', 'Hao ', 'Qiao ', 'Gu ', 'Xun ', 'Qian ', 'Hui ', 'Zhan ', 'Ru ', 'Hong ', 'Bin ', 'Xian ', 'Pin ', 'Lu ', 'Lan ', 'Nie ', 'Quan ', 'Ye ', 'Ding ', 'Qing ', 'Han ', 'Xiang ', 'Shun ', 'Xu ', 'Xu ', 'Wan ', 'Gu ', 'Dun ', 'Qi ', 'Ban ', 'Song ', 'Hang ', 'Yu ', 'Lu ', 'Ling ', 'Po ', 'Jing ', 'Jie ', 'Jia ', 'Tian ', 'Han ', 'Ying ', 'Jiong ', 'Hai ', 'Yi ', 'Pin ', 'Hui ', 'Tui ', 'Han ', 'Ying ', 'Ying ', 'Ke ', 'Ti ', 'Yong ', 'E ', 'Zhuan ', 'Yan ', 'E ', 'Nie ', 'Man ', 'Dian ', 'Sang ', 'Hao ', 'Lei ', 'Zhan ', 'Ru ', 'Pin ', 'Quan ', 'Feng ', 'Biao ', 'Oroshi ', 'Fu ', 'Xia ', 'Zhan ', 'Biao ', 'Sa ', 'Ba ', 'Tai ', 'Lie ', 'Gua ', 'Xuan ', 'Shao ', 'Ju ', 'Bi ', 'Si ', 'Wei ', 'Yang ', 'Yao ', 'Sou ', 'Kai ', 'Sao ', 'Fan ', 'Liu ', 'Xi ', 'Liao ', 'Piao ', 'Piao ', 'Liu ', 'Biao ', 'Biao ', 'Biao ', 'Liao ', '[?] ', 'Se ', 'Feng ', 'Biao ', 'Feng ', 'Yang ', 'Zhan ', 'Biao ', 'Sa ', 'Ju ', 'Si ', 'Sou ', 'Yao ', 'Liu ', 'Piao ', 'Biao ', 'Biao ', 'Fei ', 'Fan ', 'Fei ', 'Fei ', 'Shi ', 'Shi ', 'Can ', 'Ji ', 'Ding ', 'Si ', 'Tuo ', 'Zhan ', 'Sun ', 'Xiang ', 'Tun ', 'Ren ', 'Yu ', 'Juan ', 'Chi ', 'Yin ', 'Fan ', 'Fan ', 'Sun ', 'Yin ', 'Zhu ', 'Yi ', 'Zhai ', 'Bi ', 'Jie ', 'Tao ', 'Liu ', 'Ci ', 'Tie ', 'Si ', 'Bao ', 'Shi ', 'Duo ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x099.php b/vendor/voku/portable-ascii/src/voku/helper/data/x099.php new file mode 100644 index 0000000..2ce5f71 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x099.php @@ -0,0 +1 @@ +<?php return ['Hai ', 'Ren ', 'Tian ', 'Jiao ', 'Jia ', 'Bing ', 'Yao ', 'Tong ', 'Ci ', 'Xiang ', 'Yang ', 'Yang ', 'Er ', 'Yan ', 'Le ', 'Yi ', 'Can ', 'Bo ', 'Nei ', 'E ', 'Bu ', 'Jun ', 'Dou ', 'Su ', 'Yu ', 'Shi ', 'Yao ', 'Hun ', 'Guo ', 'Shi ', 'Jian ', 'Zhui ', 'Bing ', 'Xian ', 'Bu ', 'Ye ', 'Tan ', 'Fei ', 'Zhang ', 'Wei ', 'Guan ', 'E ', 'Nuan ', 'Hun ', 'Hu ', 'Huang ', 'Tie ', 'Hui ', 'Jian ', 'Hou ', 'He ', 'Xing ', 'Fen ', 'Wei ', 'Gu ', 'Cha ', 'Song ', 'Tang ', 'Bo ', 'Gao ', 'Xi ', 'Kui ', 'Liu ', 'Sou ', 'Tao ', 'Ye ', 'Yun ', 'Mo ', 'Tang ', 'Man ', 'Bi ', 'Yu ', 'Xiu ', 'Jin ', 'San ', 'Kui ', 'Zhuan ', 'Shan ', 'Chi ', 'Dan ', 'Yi ', 'Ji ', 'Rao ', 'Cheng ', 'Yong ', 'Tao ', 'Hui ', 'Xiang ', 'Zhan ', 'Fen ', 'Hai ', 'Meng ', 'Yan ', 'Mo ', 'Chan ', 'Xiang ', 'Luo ', 'Zuan ', 'Nang ', 'Shi ', 'Ding ', 'Ji ', 'Tuo ', 'Xing ', 'Tun ', 'Xi ', 'Ren ', 'Yu ', 'Chi ', 'Fan ', 'Yin ', 'Jian ', 'Shi ', 'Bao ', 'Si ', 'Duo ', 'Yi ', 'Er ', 'Rao ', 'Xiang ', 'Jia ', 'Le ', 'Jiao ', 'Yi ', 'Bing ', 'Bo ', 'Dou ', 'E ', 'Yu ', 'Nei ', 'Jun ', 'Guo ', 'Hun ', 'Xian ', 'Guan ', 'Cha ', 'Kui ', 'Gu ', 'Sou ', 'Chan ', 'Ye ', 'Mo ', 'Bo ', 'Liu ', 'Xiu ', 'Jin ', 'Man ', 'San ', 'Zhuan ', 'Nang ', 'Shou ', 'Kui ', 'Guo ', 'Xiang ', 'Fen ', 'Ba ', 'Ni ', 'Bi ', 'Bo ', 'Tu ', 'Han ', 'Fei ', 'Jian ', 'An ', 'Ai ', 'Fu ', 'Xian ', 'Wen ', 'Xin ', 'Fen ', 'Bin ', 'Xing ', 'Ma ', 'Yu ', 'Feng ', 'Han ', 'Di ', 'Tuo ', 'Tuo ', 'Chi ', 'Xun ', 'Zhu ', 'Zhi ', 'Pei ', 'Xin ', 'Ri ', 'Sa ', 'Yin ', 'Wen ', 'Zhi ', 'Dan ', 'Lu ', 'You ', 'Bo ', 'Bao ', 'Kuai ', 'Tuo ', 'Yi ', 'Qu ', '[?] ', 'Qu ', 'Jiong ', 'Bo ', 'Zhao ', 'Yuan ', 'Peng ', 'Zhou ', 'Ju ', 'Zhu ', 'Nu ', 'Ju ', 'Pi ', 'Zang ', 'Jia ', 'Ling ', 'Zhen ', 'Tai ', 'Fu ', 'Yang ', 'Shi ', 'Bi ', 'Tuo ', 'Tuo ', 'Si ', 'Liu ', 'Ma ', 'Pian ', 'Tao ', 'Zhi ', 'Rong ', 'Teng ', 'Dong ', 'Xun ', 'Quan ', 'Shen ', 'Jiong ', 'Er ', 'Hai ', 'Bo ', 'Zhu ', 'Yin ', 'Luo ', 'Shuu ', 'Dan ', 'Xie ', 'Liu ', 'Ju ', 'Song ', 'Qin ', 'Mang ', 'Liang ', 'Han ', 'Tu ', 'Xuan ', 'Tui ', 'Jun ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x09a.php b/vendor/voku/portable-ascii/src/voku/helper/data/x09a.php new file mode 100644 index 0000000..08160b8 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x09a.php @@ -0,0 +1 @@ +<?php return ['E ', 'Cheng ', 'Xin ', 'Ai ', 'Lu ', 'Zhui ', 'Zhou ', 'She ', 'Pian ', 'Kun ', 'Tao ', 'Lai ', 'Zong ', 'Ke ', 'Qi ', 'Qi ', 'Yan ', 'Fei ', 'Sao ', 'Yan ', 'Jie ', 'Yao ', 'Wu ', 'Pian ', 'Cong ', 'Pian ', 'Qian ', 'Fei ', 'Huang ', 'Jian ', 'Huo ', 'Yu ', 'Ti ', 'Quan ', 'Xia ', 'Zong ', 'Kui ', 'Rou ', 'Si ', 'Gua ', 'Tuo ', 'Kui ', 'Sou ', 'Qian ', 'Cheng ', 'Zhi ', 'Liu ', 'Pang ', 'Teng ', 'Xi ', 'Cao ', 'Du ', 'Yan ', 'Yuan ', 'Zou ', 'Sao ', 'Shan ', 'Li ', 'Zhi ', 'Shuang ', 'Lu ', 'Xi ', 'Luo ', 'Zhang ', 'Mo ', 'Ao ', 'Can ', 'Piao ', 'Cong ', 'Qu ', 'Bi ', 'Zhi ', 'Yu ', 'Xu ', 'Hua ', 'Bo ', 'Su ', 'Xiao ', 'Lin ', 'Chan ', 'Dun ', 'Liu ', 'Tuo ', 'Zeng ', 'Tan ', 'Jiao ', 'Tie ', 'Yan ', 'Luo ', 'Zhan ', 'Jing ', 'Yi ', 'Ye ', 'Tuo ', 'Bin ', 'Zou ', 'Yan ', 'Peng ', 'Lu ', 'Teng ', 'Xiang ', 'Ji ', 'Shuang ', 'Ju ', 'Xi ', 'Huan ', 'Li ', 'Biao ', 'Ma ', 'Yu ', 'Tuo ', 'Xun ', 'Chi ', 'Qu ', 'Ri ', 'Bo ', 'Lu ', 'Zang ', 'Shi ', 'Si ', 'Fu ', 'Ju ', 'Zou ', 'Zhu ', 'Tuo ', 'Nu ', 'Jia ', 'Yi ', 'Tai ', 'Xiao ', 'Ma ', 'Yin ', 'Jiao ', 'Hua ', 'Luo ', 'Hai ', 'Pian ', 'Biao ', 'Li ', 'Cheng ', 'Yan ', 'Xin ', 'Qin ', 'Jun ', 'Qi ', 'Qi ', 'Ke ', 'Zhui ', 'Zong ', 'Su ', 'Can ', 'Pian ', 'Zhi ', 'Kui ', 'Sao ', 'Wu ', 'Ao ', 'Liu ', 'Qian ', 'Shan ', 'Piao ', 'Luo ', 'Cong ', 'Chan ', 'Zou ', 'Ji ', 'Shuang ', 'Xiang ', 'Gu ', 'Wei ', 'Wei ', 'Wei ', 'Yu ', 'Gan ', 'Yi ', 'Ang ', 'Tou ', 'Xie ', 'Bao ', 'Bi ', 'Chi ', 'Ti ', 'Di ', 'Ku ', 'Hai ', 'Qiao ', 'Gou ', 'Kua ', 'Ge ', 'Tui ', 'Geng ', 'Pian ', 'Bi ', 'Ke ', 'Ka ', 'Yu ', 'Sui ', 'Lou ', 'Bo ', 'Xiao ', 'Pang ', 'Bo ', 'Ci ', 'Kuan ', 'Bin ', 'Mo ', 'Liao ', 'Lou ', 'Nao ', 'Du ', 'Zang ', 'Sui ', 'Ti ', 'Bin ', 'Kuan ', 'Lu ', 'Gao ', 'Gao ', 'Qiao ', 'Kao ', 'Qiao ', 'Lao ', 'Zao ', 'Biao ', 'Kun ', 'Kun ', 'Ti ', 'Fang ', 'Xiu ', 'Ran ', 'Mao ', 'Dan ', 'Kun ', 'Bin ', 'Fa ', 'Tiao ', 'Peng ', 'Zi ', 'Fa ', 'Ran ', 'Ti ', 'Pao ', 'Pi ', 'Mao ', 'Fu ', 'Er ', 'Rong ', 'Qu ', 'Gong ', 'Xiu ', 'Gua ', 'Ji ', 'Peng ', 'Zhua ', 'Shao ', 'Sha ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x09b.php b/vendor/voku/portable-ascii/src/voku/helper/data/x09b.php new file mode 100644 index 0000000..1ce3769 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x09b.php @@ -0,0 +1 @@ +<?php return ['Ti ', 'Li ', 'Bin ', 'Zong ', 'Ti ', 'Peng ', 'Song ', 'Zheng ', 'Quan ', 'Zong ', 'Shun ', 'Jian ', 'Duo ', 'Hu ', 'La ', 'Jiu ', 'Qi ', 'Lian ', 'Zhen ', 'Bin ', 'Peng ', 'Mo ', 'San ', 'Man ', 'Man ', 'Seng ', 'Xu ', 'Lie ', 'Qian ', 'Qian ', 'Nong ', 'Huan ', 'Kuai ', 'Ning ', 'Bin ', 'Lie ', 'Rang ', 'Dou ', 'Dou ', 'Nao ', 'Hong ', 'Xi ', 'Dou ', 'Han ', 'Dou ', 'Dou ', 'Jiu ', 'Chang ', 'Yu ', 'Yu ', 'Li ', 'Juan ', 'Fu ', 'Qian ', 'Gui ', 'Zong ', 'Liu ', 'Gui ', 'Shang ', 'Yu ', 'Gui ', 'Mei ', 'Ji ', 'Qi ', 'Jie ', 'Kui ', 'Hun ', 'Ba ', 'Po ', 'Mei ', 'Xu ', 'Yan ', 'Xiao ', 'Liang ', 'Yu ', 'Tui ', 'Qi ', 'Wang ', 'Liang ', 'Wei ', 'Jian ', 'Chi ', 'Piao ', 'Bi ', 'Mo ', 'Ji ', 'Xu ', 'Chou ', 'Yan ', 'Zhan ', 'Yu ', 'Dao ', 'Ren ', 'Ji ', 'Eri ', 'Gong ', 'Tuo ', 'Diao ', 'Ji ', 'Xu ', 'E ', 'E ', 'Sha ', 'Hang ', 'Tun ', 'Mo ', 'Jie ', 'Shen ', 'Fan ', 'Yuan ', 'Bi ', 'Lu ', 'Wen ', 'Hu ', 'Lu ', 'Za ', 'Fang ', 'Fen ', 'Na ', 'You ', 'Namazu ', 'Todo ', 'He ', 'Xia ', 'Qu ', 'Han ', 'Pi ', 'Ling ', 'Tuo ', 'Bo ', 'Qiu ', 'Ping ', 'Fu ', 'Bi ', 'Ji ', 'Wei ', 'Ju ', 'Diao ', 'Bo ', 'You ', 'Gun ', 'Pi ', 'Nian ', 'Xing ', 'Tai ', 'Bao ', 'Fu ', 'Zha ', 'Ju ', 'Gu ', 'Kajika ', 'Tong ', '[?] ', 'Ta ', 'Jie ', 'Shu ', 'Hou ', 'Xiang ', 'Er ', 'An ', 'Wei ', 'Tiao ', 'Zhu ', 'Yin ', 'Lie ', 'Luo ', 'Tong ', 'Yi ', 'Qi ', 'Bing ', 'Wei ', 'Jiao ', 'Bu ', 'Gui ', 'Xian ', 'Ge ', 'Hui ', 'Bora ', 'Mate ', 'Kao ', 'Gori ', 'Duo ', 'Jun ', 'Ti ', 'Man ', 'Xiao ', 'Za ', 'Sha ', 'Qin ', 'Yu ', 'Nei ', 'Zhe ', 'Gun ', 'Geng ', 'Su ', 'Wu ', 'Qiu ', 'Ting ', 'Fu ', 'Wan ', 'You ', 'Li ', 'Sha ', 'Sha ', 'Gao ', 'Meng ', 'Ugui ', 'Asari ', 'Subashiri ', 'Kazunoko ', 'Yong ', 'Ni ', 'Zi ', 'Qi ', 'Qing ', 'Xiang ', 'Nei ', 'Chun ', 'Ji ', 'Diao ', 'Qie ', 'Gu ', 'Zhou ', 'Dong ', 'Lai ', 'Fei ', 'Ni ', 'Yi ', 'Kun ', 'Lu ', 'Jiu ', 'Chang ', 'Jing ', 'Lun ', 'Ling ', 'Zou ', 'Li ', 'Meng ', 'Zong ', 'Zhi ', 'Nian ', 'Shachi ', 'Dojou ', 'Sukesou ', 'Shi ', 'Shen ', 'Hun ', 'Shi ', 'Hou ', 'Xing ', 'Zhu ', 'La ', 'Zong ', 'Ji ', 'Bian ', 'Bian ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x09c.php b/vendor/voku/portable-ascii/src/voku/helper/data/x09c.php new file mode 100644 index 0000000..b5fcafc --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x09c.php @@ -0,0 +1 @@ +<?php return ['Huan ', 'Quan ', 'Ze ', 'Wei ', 'Wei ', 'Yu ', 'Qun ', 'Rou ', 'Die ', 'Huang ', 'Lian ', 'Yan ', 'Qiu ', 'Qiu ', 'Jian ', 'Bi ', 'E ', 'Yang ', 'Fu ', 'Sai ', 'Jian ', 'Xia ', 'Tuo ', 'Hu ', 'Muroaji ', 'Ruo ', 'Haraka ', 'Wen ', 'Jian ', 'Hao ', 'Wu ', 'Fang ', 'Sao ', 'Liu ', 'Ma ', 'Shi ', 'Shi ', 'Yin ', 'Z ', 'Teng ', 'Ta ', 'Yao ', 'Ge ', 'Rong ', 'Qian ', 'Qi ', 'Wen ', 'Ruo ', 'Hatahata ', 'Lian ', 'Ao ', 'Le ', 'Hui ', 'Min ', 'Ji ', 'Tiao ', 'Qu ', 'Jian ', 'Sao ', 'Man ', 'Xi ', 'Qiu ', 'Biao ', 'Ji ', 'Ji ', 'Zhu ', 'Jiang ', 'Qiu ', 'Zhuan ', 'Yong ', 'Zhang ', 'Kang ', 'Xue ', 'Bie ', 'Jue ', 'Qu ', 'Xiang ', 'Bo ', 'Jiao ', 'Xun ', 'Su ', 'Huang ', 'Zun ', 'Shan ', 'Shan ', 'Fan ', 'Jue ', 'Lin ', 'Xun ', 'Miao ', 'Xi ', 'Eso ', 'Kyou ', 'Fen ', 'Guan ', 'Hou ', 'Kuai ', 'Zei ', 'Sao ', 'Zhan ', 'Gan ', 'Gui ', 'Sheng ', 'Li ', 'Chang ', 'Hatahata ', 'Shiira ', 'Mutsu ', 'Ru ', 'Ji ', 'Xu ', 'Huo ', 'Shiira ', 'Li ', 'Lie ', 'Li ', 'Mie ', 'Zhen ', 'Xiang ', 'E ', 'Lu ', 'Guan ', 'Li ', 'Xian ', 'Yu ', 'Dao ', 'Ji ', 'You ', 'Tun ', 'Lu ', 'Fang ', 'Ba ', 'He ', 'Bo ', 'Ping ', 'Nian ', 'Lu ', 'You ', 'Zha ', 'Fu ', 'Bo ', 'Bao ', 'Hou ', 'Pi ', 'Tai ', 'Gui ', 'Jie ', 'Kao ', 'Wei ', 'Er ', 'Tong ', 'Ze ', 'Hou ', 'Kuai ', 'Ji ', 'Jiao ', 'Xian ', 'Za ', 'Xiang ', 'Xun ', 'Geng ', 'Li ', 'Lian ', 'Jian ', 'Li ', 'Shi ', 'Tiao ', 'Gun ', 'Sha ', 'Wan ', 'Jun ', 'Ji ', 'Yong ', 'Qing ', 'Ling ', 'Qi ', 'Zou ', 'Fei ', 'Kun ', 'Chang ', 'Gu ', 'Ni ', 'Nian ', 'Diao ', 'Jing ', 'Shen ', 'Shi ', 'Zi ', 'Fen ', 'Die ', 'Bi ', 'Chang ', 'Shi ', 'Wen ', 'Wei ', 'Sai ', 'E ', 'Qiu ', 'Fu ', 'Huang ', 'Quan ', 'Jiang ', 'Bian ', 'Sao ', 'Ao ', 'Qi ', 'Ta ', 'Yin ', 'Yao ', 'Fang ', 'Jian ', 'Le ', 'Biao ', 'Xue ', 'Bie ', 'Man ', 'Min ', 'Yong ', 'Wei ', 'Xi ', 'Jue ', 'Shan ', 'Lin ', 'Zun ', 'Huo ', 'Gan ', 'Li ', 'Zhan ', 'Guan ', 'Niao ', 'Yi ', 'Fu ', 'Li ', 'Jiu ', 'Bu ', 'Yan ', 'Fu ', 'Diao ', 'Ji ', 'Feng ', 'Nio ', 'Gan ', 'Shi ', 'Feng ', 'Ming ', 'Bao ', 'Yuan ', 'Zhi ', 'Hu ', 'Qin ', 'Fu ', 'Fen ', 'Wen ', 'Jian ', 'Shi ', 'Yu ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x09d.php b/vendor/voku/portable-ascii/src/voku/helper/data/x09d.php new file mode 100644 index 0000000..517da07 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x09d.php @@ -0,0 +1 @@ +<?php return ['Fou ', 'Yiao ', 'Jue ', 'Jue ', 'Pi ', 'Huan ', 'Zhen ', 'Bao ', 'Yan ', 'Ya ', 'Zheng ', 'Fang ', 'Feng ', 'Wen ', 'Ou ', 'Te ', 'Jia ', 'Nu ', 'Ling ', 'Mie ', 'Fu ', 'Tuo ', 'Wen ', 'Li ', 'Bian ', 'Zhi ', 'Ge ', 'Yuan ', 'Zi ', 'Qu ', 'Xiao ', 'Zhi ', 'Dan ', 'Ju ', 'You ', 'Gu ', 'Zhong ', 'Yu ', 'Yang ', 'Rong ', 'Ya ', 'Tie ', 'Yu ', 'Shigi ', 'Ying ', 'Zhui ', 'Wu ', 'Er ', 'Gua ', 'Ai ', 'Zhi ', 'Yan ', 'Heng ', 'Jiao ', 'Ji ', 'Lie ', 'Zhu ', 'Ren ', 'Yi ', 'Hong ', 'Luo ', 'Ru ', 'Mou ', 'Ge ', 'Ren ', 'Jiao ', 'Xiu ', 'Zhou ', 'Zhi ', 'Luo ', 'Chidori ', 'Toki ', 'Ten ', 'Luan ', 'Jia ', 'Ji ', 'Yu ', 'Huan ', 'Tuo ', 'Bu ', 'Wu ', 'Juan ', 'Yu ', 'Bo ', 'Xun ', 'Xun ', 'Bi ', 'Xi ', 'Jun ', 'Ju ', 'Tu ', 'Jing ', 'Ti ', 'E ', 'E ', 'Kuang ', 'Hu ', 'Wu ', 'Shen ', 'Lai ', 'Ikaruga ', 'Kakesu ', 'Lu ', 'Ping ', 'Shu ', 'Fu ', 'An ', 'Zhao ', 'Peng ', 'Qin ', 'Qian ', 'Bei ', 'Diao ', 'Lu ', 'Que ', 'Jian ', 'Ju ', 'Tu ', 'Ya ', 'Yuan ', 'Qi ', 'Li ', 'Ye ', 'Zhui ', 'Kong ', 'Zhui ', 'Kun ', 'Sheng ', 'Qi ', 'Jing ', 'Yi ', 'Yi ', 'Jing ', 'Zi ', 'Lai ', 'Dong ', 'Qi ', 'Chun ', 'Geng ', 'Ju ', 'Qu ', 'Isuka ', 'Kikuitadaki ', 'Ji ', 'Shu ', '[?] ', 'Chi ', 'Miao ', 'Rou ', 'An ', 'Qiu ', 'Ti ', 'Hu ', 'Ti ', 'E ', 'Jie ', 'Mao ', 'Fu ', 'Chun ', 'Tu ', 'Yan ', 'He ', 'Yuan ', 'Pian ', 'Yun ', 'Mei ', 'Hu ', 'Ying ', 'Dun ', 'Mu ', 'Ju ', 'Tsugumi ', 'Cang ', 'Fang ', 'Gu ', 'Ying ', 'Yuan ', 'Xuan ', 'Weng ', 'Shi ', 'He ', 'Chu ', 'Tang ', 'Xia ', 'Ruo ', 'Liu ', 'Ji ', 'Gu ', 'Jian ', 'Zhun ', 'Han ', 'Zi ', 'Zi ', 'Ni ', 'Yao ', 'Yan ', 'Ji ', 'Li ', 'Tian ', 'Kou ', 'Ti ', 'Ti ', 'Ni ', 'Tu ', 'Ma ', 'Jiao ', 'Gao ', 'Tian ', 'Chen ', 'Li ', 'Zhuan ', 'Zhe ', 'Ao ', 'Yao ', 'Yi ', 'Ou ', 'Chi ', 'Zhi ', 'Liao ', 'Rong ', 'Lou ', 'Bi ', 'Shuang ', 'Zhuo ', 'Yu ', 'Wu ', 'Jue ', 'Yin ', 'Quan ', 'Si ', 'Jiao ', 'Yi ', 'Hua ', 'Bi ', 'Ying ', 'Su ', 'Huang ', 'Fan ', 'Jiao ', 'Liao ', 'Yan ', 'Kao ', 'Jiu ', 'Xian ', 'Xian ', 'Tu ', 'Mai ', 'Zun ', 'Yu ', 'Ying ', 'Lu ', 'Tuan ', 'Xian ', 'Xue ', 'Yi ', 'Pi ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x09e.php b/vendor/voku/portable-ascii/src/voku/helper/data/x09e.php new file mode 100644 index 0000000..4301b06 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x09e.php @@ -0,0 +1 @@ +<?php return ['Shu ', 'Luo ', 'Qi ', 'Yi ', 'Ji ', 'Zhe ', 'Yu ', 'Zhan ', 'Ye ', 'Yang ', 'Pi ', 'Ning ', 'Huo ', 'Mi ', 'Ying ', 'Meng ', 'Di ', 'Yue ', 'Yu ', 'Lei ', 'Bao ', 'Lu ', 'He ', 'Long ', 'Shuang ', 'Yue ', 'Ying ', 'Guan ', 'Qu ', 'Li ', 'Luan ', 'Niao ', 'Jiu ', 'Ji ', 'Yuan ', 'Ming ', 'Shi ', 'Ou ', 'Ya ', 'Cang ', 'Bao ', 'Zhen ', 'Gu ', 'Dong ', 'Lu ', 'Ya ', 'Xiao ', 'Yang ', 'Ling ', 'Zhi ', 'Qu ', 'Yuan ', 'Xue ', 'Tuo ', 'Si ', 'Zhi ', 'Er ', 'Gua ', 'Xiu ', 'Heng ', 'Zhou ', 'Ge ', 'Luan ', 'Hong ', 'Wu ', 'Bo ', 'Li ', 'Juan ', 'Hu ', 'E ', 'Yu ', 'Xian ', 'Ti ', 'Wu ', 'Que ', 'Miao ', 'An ', 'Kun ', 'Bei ', 'Peng ', 'Qian ', 'Chun ', 'Geng ', 'Yuan ', 'Su ', 'Hu ', 'He ', 'E ', 'Gu ', 'Qiu ', 'Zi ', 'Mei ', 'Mu ', 'Ni ', 'Yao ', 'Weng ', 'Liu ', 'Ji ', 'Ni ', 'Jian ', 'He ', 'Yi ', 'Ying ', 'Zhe ', 'Liao ', 'Liao ', 'Jiao ', 'Jiu ', 'Yu ', 'Lu ', 'Xuan ', 'Zhan ', 'Ying ', 'Huo ', 'Meng ', 'Guan ', 'Shuang ', 'Lu ', 'Jin ', 'Ling ', 'Jian ', 'Xian ', 'Cuo ', 'Jian ', 'Jian ', 'Yan ', 'Cuo ', 'Lu ', 'You ', 'Cu ', 'Ji ', 'Biao ', 'Cu ', 'Biao ', 'Zhu ', 'Jun ', 'Zhu ', 'Jian ', 'Mi ', 'Mi ', 'Wu ', 'Liu ', 'Chen ', 'Jun ', 'Lin ', 'Ni ', 'Qi ', 'Lu ', 'Jiu ', 'Jun ', 'Jing ', 'Li ', 'Xiang ', 'Yan ', 'Jia ', 'Mi ', 'Li ', 'She ', 'Zhang ', 'Lin ', 'Jing ', 'Ji ', 'Ling ', 'Yan ', 'Cu ', 'Mai ', 'Mai ', 'Ge ', 'Chao ', 'Fu ', 'Mian ', 'Mian ', 'Fu ', 'Pao ', 'Qu ', 'Qu ', 'Mou ', 'Fu ', 'Xian ', 'Lai ', 'Qu ', 'Mian ', '[?] ', 'Feng ', 'Fu ', 'Qu ', 'Mian ', 'Ma ', 'Mo ', 'Mo ', 'Hui ', 'Ma ', 'Zou ', 'Nen ', 'Fen ', 'Huang ', 'Huang ', 'Jin ', 'Guang ', 'Tian ', 'Tou ', 'Heng ', 'Xi ', 'Kuang ', 'Heng ', 'Shu ', 'Li ', 'Nian ', 'Chi ', 'Hei ', 'Hei ', 'Yi ', 'Qian ', 'Dan ', 'Xi ', 'Tuan ', 'Mo ', 'Mo ', 'Qian ', 'Dai ', 'Chu ', 'You ', 'Dian ', 'Yi ', 'Xia ', 'Yan ', 'Qu ', 'Mei ', 'Yan ', 'Jing ', 'Yu ', 'Li ', 'Dang ', 'Du ', 'Can ', 'Yin ', 'An ', 'Yan ', 'Tan ', 'An ', 'Zhen ', 'Dai ', 'Can ', 'Yi ', 'Mei ', 'Dan ', 'Yan ', 'Du ', 'Lu ', 'Zhi ', 'Fen ', 'Fu ', 'Fu ', 'Min ', 'Min ', 'Yuan ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x09f.php b/vendor/voku/portable-ascii/src/voku/helper/data/x09f.php new file mode 100644 index 0000000..52ee6cf --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x09f.php @@ -0,0 +1 @@ +<?php return ['Cu ', 'Qu ', 'Chao ', 'Wa ', 'Zhu ', 'Zhi ', 'Mang ', 'Ao ', 'Bie ', 'Tuo ', 'Bi ', 'Yuan ', 'Chao ', 'Tuo ', 'Ding ', 'Mi ', 'Nai ', 'Ding ', 'Zi ', 'Gu ', 'Gu ', 'Dong ', 'Fen ', 'Tao ', 'Yuan ', 'Pi ', 'Chang ', 'Gao ', 'Qi ', 'Yuan ', 'Tang ', 'Teng ', 'Shu ', 'Shu ', 'Fen ', 'Fei ', 'Wen ', 'Ba ', 'Diao ', 'Tuo ', 'Tong ', 'Qu ', 'Sheng ', 'Shi ', 'You ', 'Shi ', 'Ting ', 'Wu ', 'Nian ', 'Jing ', 'Hun ', 'Ju ', 'Yan ', 'Tu ', 'Ti ', 'Xi ', 'Xian ', 'Yan ', 'Lei ', 'Bi ', 'Yao ', 'Qiu ', 'Han ', 'Wu ', 'Wu ', 'Hou ', 'Xi ', 'Ge ', 'Zha ', 'Xiu ', 'Weng ', 'Zha ', 'Nong ', 'Nang ', 'Qi ', 'Zhai ', 'Ji ', 'Zi ', 'Ji ', 'Ji ', 'Qi ', 'Ji ', 'Chi ', 'Chen ', 'Chen ', 'He ', 'Ya ', 'Ken ', 'Xie ', 'Pao ', 'Cuo ', 'Shi ', 'Zi ', 'Chi ', 'Nian ', 'Ju ', 'Tiao ', 'Ling ', 'Ling ', 'Chu ', 'Quan ', 'Xie ', 'Ken ', 'Nie ', 'Jiu ', 'Yao ', 'Chuo ', 'Kun ', 'Yu ', 'Chu ', 'Yi ', 'Ni ', 'Cuo ', 'Zou ', 'Qu ', 'Nen ', 'Xian ', 'Ou ', 'E ', 'Wo ', 'Yi ', 'Chuo ', 'Zou ', 'Dian ', 'Chu ', 'Jin ', 'Ya ', 'Chi ', 'Chen ', 'He ', 'Ken ', 'Ju ', 'Ling ', 'Pao ', 'Tiao ', 'Zi ', 'Ken ', 'Yu ', 'Chuo ', 'Qu ', 'Wo ', 'Long ', 'Pang ', 'Gong ', 'Pang ', 'Yan ', 'Long ', 'Long ', 'Gong ', 'Kan ', 'Ta ', 'Ling ', 'Ta ', 'Long ', 'Gong ', 'Kan ', 'Gui ', 'Qiu ', 'Bie ', 'Gui ', 'Yue ', 'Chui ', 'He ', 'Jue ', 'Xie ', 'Yu ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0a0.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0a0.php new file mode 100644 index 0000000..4b8afdd --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0a0.php @@ -0,0 +1 @@ +<?php return ['it', 'ix', 'i', 'ip', 'iet', 'iex', 'ie', 'iep', 'at', 'ax', 'a', 'ap', 'uox', 'uo', 'uop', 'ot', 'ox', 'o', 'op', 'ex', 'e', 'wu', 'bit', 'bix', 'bi', 'bip', 'biet', 'biex', 'bie', 'biep', 'bat', 'bax', 'ba', 'bap', 'buox', 'buo', 'buop', 'bot', 'box', 'bo', 'bop', 'bex', 'be', 'bep', 'but', 'bux', 'bu', 'bup', 'burx', 'bur', 'byt', 'byx', 'by', 'byp', 'byrx', 'byr', 'pit', 'pix', 'pi', 'pip', 'piex', 'pie', 'piep', 'pat', 'pax', 'pa', 'pap', 'puox', 'puo', 'puop', 'pot', 'pox', 'po', 'pop', 'put', 'pux', 'pu', 'pup', 'purx', 'pur', 'pyt', 'pyx', 'py', 'pyp', 'pyrx', 'pyr', 'bbit', 'bbix', 'bbi', 'bbip', 'bbiet', 'bbiex', 'bbie', 'bbiep', 'bbat', 'bbax', 'bba', 'bbap', 'bbuox', 'bbuo', 'bbuop', 'bbot', 'bbox', 'bbo', 'bbop', 'bbex', 'bbe', 'bbep', 'bbut', 'bbux', 'bbu', 'bbup', 'bburx', 'bbur', 'bbyt', 'bbyx', 'bby', 'bbyp', 'nbit', 'nbix', 'nbi', 'nbip', 'nbiex', 'nbie', 'nbiep', 'nbat', 'nbax', 'nba', 'nbap', 'nbot', 'nbox', 'nbo', 'nbop', 'nbut', 'nbux', 'nbu', 'nbup', 'nburx', 'nbur', 'nbyt', 'nbyx', 'nby', 'nbyp', 'nbyrx', 'nbyr', 'hmit', 'hmix', 'hmi', 'hmip', 'hmiex', 'hmie', 'hmiep', 'hmat', 'hmax', 'hma', 'hmap', 'hmuox', 'hmuo', 'hmuop', 'hmot', 'hmox', 'hmo', 'hmop', 'hmut', 'hmux', 'hmu', 'hmup', 'hmurx', 'hmur', 'hmyx', 'hmy', 'hmyp', 'hmyrx', 'hmyr', 'mit', 'mix', 'mi', 'mip', 'miex', 'mie', 'miep', 'mat', 'max', 'ma', 'map', 'muot', 'muox', 'muo', 'muop', 'mot', 'mox', 'mo', 'mop', 'mex', 'me', 'mut', 'mux', 'mu', 'mup', 'murx', 'mur', 'myt', 'myx', 'my', 'myp', 'fit', 'fix', 'fi', 'fip', 'fat', 'fax', 'fa', 'fap', 'fox', 'fo', 'fop', 'fut', 'fux', 'fu', 'fup', 'furx', 'fur', 'fyt', 'fyx', 'fy', 'fyp', 'vit', 'vix', 'vi', 'vip', 'viet', 'viex', 'vie', 'viep', 'vat', 'vax', 'va', 'vap', 'vot', 'vox', 'vo', 'vop', 'vex', 'vep', 'vut', 'vux', 'vu', 'vup', 'vurx', 'vur', 'vyt', 'vyx', 'vy', 'vyp', 'vyrx', 'vyr']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0a1.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0a1.php new file mode 100644 index 0000000..c2cf3a1 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0a1.php @@ -0,0 +1 @@ +<?php return ['dit', 'dix', 'di', 'dip', 'diex', 'die', 'diep', 'dat', 'dax', 'da', 'dap', 'duox', 'duo', 'dot', 'dox', 'do', 'dop', 'dex', 'de', 'dep', 'dut', 'dux', 'du', 'dup', 'durx', 'dur', 'tit', 'tix', 'ti', 'tip', 'tiex', 'tie', 'tiep', 'tat', 'tax', 'ta', 'tap', 'tuot', 'tuox', 'tuo', 'tuop', 'tot', 'tox', 'to', 'top', 'tex', 'te', 'tep', 'tut', 'tux', 'tu', 'tup', 'turx', 'tur', 'ddit', 'ddix', 'ddi', 'ddip', 'ddiex', 'ddie', 'ddiep', 'ddat', 'ddax', 'dda', 'ddap', 'dduox', 'dduo', 'dduop', 'ddot', 'ddox', 'ddo', 'ddop', 'ddex', 'dde', 'ddep', 'ddut', 'ddux', 'ddu', 'ddup', 'ddurx', 'ddur', 'ndit', 'ndix', 'ndi', 'ndip', 'ndiex', 'ndie', 'ndat', 'ndax', 'nda', 'ndap', 'ndot', 'ndox', 'ndo', 'ndop', 'ndex', 'nde', 'ndep', 'ndut', 'ndux', 'ndu', 'ndup', 'ndurx', 'ndur', 'hnit', 'hnix', 'hni', 'hnip', 'hniet', 'hniex', 'hnie', 'hniep', 'hnat', 'hnax', 'hna', 'hnap', 'hnuox', 'hnuo', 'hnot', 'hnox', 'hnop', 'hnex', 'hne', 'hnep', 'hnut', 'nit', 'nix', 'ni', 'nip', 'niex', 'nie', 'niep', 'nax', 'na', 'nap', 'nuox', 'nuo', 'nuop', 'not', 'nox', 'no', 'nop', 'nex', 'ne', 'nep', 'nut', 'nux', 'nu', 'nup', 'nurx', 'nur', 'hlit', 'hlix', 'hli', 'hlip', 'hliex', 'hlie', 'hliep', 'hlat', 'hlax', 'hla', 'hlap', 'hluox', 'hluo', 'hluop', 'hlox', 'hlo', 'hlop', 'hlex', 'hle', 'hlep', 'hlut', 'hlux', 'hlu', 'hlup', 'hlurx', 'hlur', 'hlyt', 'hlyx', 'hly', 'hlyp', 'hlyrx', 'hlyr', 'lit', 'lix', 'li', 'lip', 'liet', 'liex', 'lie', 'liep', 'lat', 'lax', 'la', 'lap', 'luot', 'luox', 'luo', 'luop', 'lot', 'lox', 'lo', 'lop', 'lex', 'le', 'lep', 'lut', 'lux', 'lu', 'lup', 'lurx', 'lur', 'lyt', 'lyx', 'ly', 'lyp', 'lyrx', 'lyr', 'git', 'gix', 'gi', 'gip', 'giet', 'giex', 'gie', 'giep', 'gat', 'gax', 'ga', 'gap', 'guot', 'guox', 'guo', 'guop', 'got', 'gox', 'go', 'gop', 'get', 'gex', 'ge', 'gep', 'gut', 'gux', 'gu', 'gup', 'gurx', 'gur', 'kit', 'kix', 'ki', 'kip', 'kiex', 'kie', 'kiep', 'kat']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0a2.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0a2.php new file mode 100644 index 0000000..ad32b84 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0a2.php @@ -0,0 +1 @@ +<?php return ['kax', 'ka', 'kap', 'kuox', 'kuo', 'kuop', 'kot', 'kox', 'ko', 'kop', 'ket', 'kex', 'ke', 'kep', 'kut', 'kux', 'ku', 'kup', 'kurx', 'kur', 'ggit', 'ggix', 'ggi', 'ggiex', 'ggie', 'ggiep', 'ggat', 'ggax', 'gga', 'ggap', 'gguot', 'gguox', 'gguo', 'gguop', 'ggot', 'ggox', 'ggo', 'ggop', 'gget', 'ggex', 'gge', 'ggep', 'ggut', 'ggux', 'ggu', 'ggup', 'ggurx', 'ggur', 'mgiex', 'mgie', 'mgat', 'mgax', 'mga', 'mgap', 'mguox', 'mguo', 'mguop', 'mgot', 'mgox', 'mgo', 'mgop', 'mgex', 'mge', 'mgep', 'mgut', 'mgux', 'mgu', 'mgup', 'mgurx', 'mgur', 'hxit', 'hxix', 'hxi', 'hxip', 'hxiet', 'hxiex', 'hxie', 'hxiep', 'hxat', 'hxax', 'hxa', 'hxap', 'hxuot', 'hxuox', 'hxuo', 'hxuop', 'hxot', 'hxox', 'hxo', 'hxop', 'hxex', 'hxe', 'hxep', 'ngiex', 'ngie', 'ngiep', 'ngat', 'ngax', 'nga', 'ngap', 'nguot', 'nguox', 'nguo', 'ngot', 'ngox', 'ngo', 'ngop', 'ngex', 'nge', 'ngep', 'hit', 'hiex', 'hie', 'hat', 'hax', 'ha', 'hap', 'huot', 'huox', 'huo', 'huop', 'hot', 'hox', 'ho', 'hop', 'hex', 'he', 'hep', 'wat', 'wax', 'wa', 'wap', 'wuox', 'wuo', 'wuop', 'wox', 'wo', 'wop', 'wex', 'we', 'wep', 'zit', 'zix', 'zi', 'zip', 'ziex', 'zie', 'ziep', 'zat', 'zax', 'za', 'zap', 'zuox', 'zuo', 'zuop', 'zot', 'zox', 'zo', 'zop', 'zex', 'ze', 'zep', 'zut', 'zux', 'zu', 'zup', 'zurx', 'zur', 'zyt', 'zyx', 'zy', 'zyp', 'zyrx', 'zyr', 'cit', 'cix', 'ci', 'cip', 'ciet', 'ciex', 'cie', 'ciep', 'cat', 'cax', 'ca', 'cap', 'cuox', 'cuo', 'cuop', 'cot', 'cox', 'co', 'cop', 'cex', 'ce', 'cep', 'cut', 'cux', 'cu', 'cup', 'curx', 'cur', 'cyt', 'cyx', 'cy', 'cyp', 'cyrx', 'cyr', 'zzit', 'zzix', 'zzi', 'zzip', 'zziet', 'zziex', 'zzie', 'zziep', 'zzat', 'zzax', 'zza', 'zzap', 'zzox', 'zzo', 'zzop', 'zzex', 'zze', 'zzep', 'zzux', 'zzu', 'zzup', 'zzurx', 'zzur', 'zzyt', 'zzyx', 'zzy', 'zzyp', 'zzyrx', 'zzyr', 'nzit', 'nzix', 'nzi', 'nzip', 'nziex', 'nzie', 'nziep', 'nzat', 'nzax', 'nza', 'nzap', 'nzuox', 'nzuo', 'nzox', 'nzop', 'nzex', 'nze', 'nzux', 'nzu']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0a3.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0a3.php new file mode 100644 index 0000000..a56a8ed --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0a3.php @@ -0,0 +1 @@ +<?php return ['nzup', 'nzurx', 'nzur', 'nzyt', 'nzyx', 'nzy', 'nzyp', 'nzyrx', 'nzyr', 'sit', 'six', 'si', 'sip', 'siex', 'sie', 'siep', 'sat', 'sax', 'sa', 'sap', 'suox', 'suo', 'suop', 'sot', 'sox', 'so', 'sop', 'sex', 'se', 'sep', 'sut', 'sux', 'su', 'sup', 'surx', 'sur', 'syt', 'syx', 'sy', 'syp', 'syrx', 'syr', 'ssit', 'ssix', 'ssi', 'ssip', 'ssiex', 'ssie', 'ssiep', 'ssat', 'ssax', 'ssa', 'ssap', 'ssot', 'ssox', 'sso', 'ssop', 'ssex', 'sse', 'ssep', 'ssut', 'ssux', 'ssu', 'ssup', 'ssyt', 'ssyx', 'ssy', 'ssyp', 'ssyrx', 'ssyr', 'zhat', 'zhax', 'zha', 'zhap', 'zhuox', 'zhuo', 'zhuop', 'zhot', 'zhox', 'zho', 'zhop', 'zhet', 'zhex', 'zhe', 'zhep', 'zhut', 'zhux', 'zhu', 'zhup', 'zhurx', 'zhur', 'zhyt', 'zhyx', 'zhy', 'zhyp', 'zhyrx', 'zhyr', 'chat', 'chax', 'cha', 'chap', 'chuot', 'chuox', 'chuo', 'chuop', 'chot', 'chox', 'cho', 'chop', 'chet', 'chex', 'che', 'chep', 'chux', 'chu', 'chup', 'churx', 'chur', 'chyt', 'chyx', 'chy', 'chyp', 'chyrx', 'chyr', 'rrax', 'rra', 'rruox', 'rruo', 'rrot', 'rrox', 'rro', 'rrop', 'rret', 'rrex', 'rre', 'rrep', 'rrut', 'rrux', 'rru', 'rrup', 'rrurx', 'rrur', 'rryt', 'rryx', 'rry', 'rryp', 'rryrx', 'rryr', 'nrat', 'nrax', 'nra', 'nrap', 'nrox', 'nro', 'nrop', 'nret', 'nrex', 'nre', 'nrep', 'nrut', 'nrux', 'nru', 'nrup', 'nrurx', 'nrur', 'nryt', 'nryx', 'nry', 'nryp', 'nryrx', 'nryr', 'shat', 'shax', 'sha', 'shap', 'shuox', 'shuo', 'shuop', 'shot', 'shox', 'sho', 'shop', 'shet', 'shex', 'she', 'shep', 'shut', 'shux', 'shu', 'shup', 'shurx', 'shur', 'shyt', 'shyx', 'shy', 'shyp', 'shyrx', 'shyr', 'rat', 'rax', 'ra', 'rap', 'ruox', 'ruo', 'ruop', 'rot', 'rox', 'ro', 'rop', 'rex', 're', 'rep', 'rut', 'rux', 'ru', 'rup', 'rurx', 'rur', 'ryt', 'ryx', 'ry', 'ryp', 'ryrx', 'ryr', 'jit', 'jix', 'ji', 'jip', 'jiet', 'jiex', 'jie', 'jiep', 'juot', 'juox', 'juo', 'juop', 'jot', 'jox', 'jo', 'jop', 'jut', 'jux', 'ju', 'jup', 'jurx', 'jur', 'jyt', 'jyx', 'jy', 'jyp', 'jyrx', 'jyr', 'qit', 'qix', 'qi', 'qip']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0a4.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0a4.php new file mode 100644 index 0000000..2fa5883 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0a4.php @@ -0,0 +1 @@ +<?php return ['qiet', 'qiex', 'qie', 'qiep', 'quot', 'quox', 'quo', 'quop', 'qot', 'qox', 'qo', 'qop', 'qut', 'qux', 'qu', 'qup', 'qurx', 'qur', 'qyt', 'qyx', 'qy', 'qyp', 'qyrx', 'qyr', 'jjit', 'jjix', 'jji', 'jjip', 'jjiet', 'jjiex', 'jjie', 'jjiep', 'jjuox', 'jjuo', 'jjuop', 'jjot', 'jjox', 'jjo', 'jjop', 'jjut', 'jjux', 'jju', 'jjup', 'jjurx', 'jjur', 'jjyt', 'jjyx', 'jjy', 'jjyp', 'njit', 'njix', 'nji', 'njip', 'njiet', 'njiex', 'njie', 'njiep', 'njuox', 'njuo', 'njot', 'njox', 'njo', 'njop', 'njux', 'nju', 'njup', 'njurx', 'njur', 'njyt', 'njyx', 'njy', 'njyp', 'njyrx', 'njyr', 'nyit', 'nyix', 'nyi', 'nyip', 'nyiet', 'nyiex', 'nyie', 'nyiep', 'nyuox', 'nyuo', 'nyuop', 'nyot', 'nyox', 'nyo', 'nyop', 'nyut', 'nyux', 'nyu', 'nyup', 'xit', 'xix', 'xi', 'xip', 'xiet', 'xiex', 'xie', 'xiep', 'xuox', 'xuo', 'xot', 'xox', 'xo', 'xop', 'xyt', 'xyx', 'xy', 'xyp', 'xyrx', 'xyr', 'yit', 'yix', 'yi', 'yip', 'yiet', 'yiex', 'yie', 'yiep', 'yuot', 'yuox', 'yuo', 'yuop', 'yot', 'yox', 'yo', 'yop', 'yut', 'yux', 'yu', 'yup', 'yurx', 'yur', 'yyt', 'yyx', 'yy', 'yyp', 'yyrx', 'yyr', '[?]', '[?]', '[?]', 'Qot', 'Li', 'Kit', 'Nyip', 'Cyp', 'Ssi', 'Ggop', 'Gep', 'Mi', 'Hxit', 'Lyr', 'Bbut', 'Mop', 'Yo', 'Put', 'Hxuo', 'Tat', 'Ga', '[?]', '[?]', 'Ddur', 'Bur', 'Gguo', 'Nyop', 'Tu', 'Op', 'Jjut', 'Zot', 'Pyt', 'Hmo', 'Yit', 'Vur', 'Shy', 'Vep', 'Za', 'Jo', '[?]', 'Jjy', 'Got', 'Jjie', 'Wo', 'Du', 'Shur', 'Lie', 'Cy', 'Cuop', 'Cip', 'Hxop', 'Shat', '[?]', 'Shop', 'Che', 'Zziet', '[?]', 'Ke', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0ac.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0ac.php new file mode 100644 index 0000000..98a9bfd --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0ac.php @@ -0,0 +1 @@ +<?php return ['ga', 'gag', 'gagg', 'gags', 'gan', 'ganj', 'ganh', 'gad', 'gal', 'galg', 'galm', 'galb', 'gals', 'galt', 'galp', 'galh', 'gam', 'gab', 'gabs', 'gas', 'gass', 'gang', 'gaj', 'gac', 'gak', 'gat', 'gap', 'gah', 'gae', 'gaeg', 'gaegg', 'gaegs', 'gaen', 'gaenj', 'gaenh', 'gaed', 'gael', 'gaelg', 'gaelm', 'gaelb', 'gaels', 'gaelt', 'gaelp', 'gaelh', 'gaem', 'gaeb', 'gaebs', 'gaes', 'gaess', 'gaeng', 'gaej', 'gaec', 'gaek', 'gaet', 'gaep', 'gaeh', 'gya', 'gyag', 'gyagg', 'gyags', 'gyan', 'gyanj', 'gyanh', 'gyad', 'gyal', 'gyalg', 'gyalm', 'gyalb', 'gyals', 'gyalt', 'gyalp', 'gyalh', 'gyam', 'gyab', 'gyabs', 'gyas', 'gyass', 'gyang', 'gyaj', 'gyac', 'gyak', 'gyat', 'gyap', 'gyah', 'gyae', 'gyaeg', 'gyaegg', 'gyaegs', 'gyaen', 'gyaenj', 'gyaenh', 'gyaed', 'gyael', 'gyaelg', 'gyaelm', 'gyaelb', 'gyaels', 'gyaelt', 'gyaelp', 'gyaelh', 'gyaem', 'gyaeb', 'gyaebs', 'gyaes', 'gyaess', 'gyaeng', 'gyaej', 'gyaec', 'gyaek', 'gyaet', 'gyaep', 'gyaeh', 'geo', 'geog', 'geogg', 'geogs', 'geon', 'geonj', 'geonh', 'geod', 'geol', 'geolg', 'geolm', 'geolb', 'geols', 'geolt', 'geolp', 'geolh', 'geom', 'geob', 'geobs', 'geos', 'geoss', 'geong', 'geoj', 'geoc', 'geok', 'geot', 'geop', 'geoh', 'ge', 'geg', 'gegg', 'gegs', 'gen', 'genj', 'genh', 'ged', 'gel', 'gelg', 'gelm', 'gelb', 'gels', 'gelt', 'gelp', 'gelh', 'gem', 'geb', 'gebs', 'ges', 'gess', 'geng', 'gej', 'gec', 'gek', 'get', 'gep', 'geh', 'gyeo', 'gyeog', 'gyeogg', 'gyeogs', 'gyeon', 'gyeonj', 'gyeonh', 'gyeod', 'gyeol', 'gyeolg', 'gyeolm', 'gyeolb', 'gyeols', 'gyeolt', 'gyeolp', 'gyeolh', 'gyeom', 'gyeob', 'gyeobs', 'gyeos', 'gyeoss', 'gyeong', 'gyeoj', 'gyeoc', 'gyeok', 'gyeot', 'gyeop', 'gyeoh', 'gye', 'gyeg', 'gyegg', 'gyegs', 'gyen', 'gyenj', 'gyenh', 'gyed', 'gyel', 'gyelg', 'gyelm', 'gyelb', 'gyels', 'gyelt', 'gyelp', 'gyelh', 'gyem', 'gyeb', 'gyebs', 'gyes', 'gyess', 'gyeng', 'gyej', 'gyec', 'gyek', 'gyet', 'gyep', 'gyeh', 'go', 'gog', 'gogg', 'gogs', 'gon', 'gonj', 'gonh', 'god', 'gol', 'golg', 'golm', 'golb', 'gols', 'golt', 'golp', 'golh', 'gom', 'gob', 'gobs', 'gos', 'goss', 'gong', 'goj', 'goc', 'gok', 'got', 'gop', 'goh', 'gwa', 'gwag', 'gwagg', 'gwags']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0ad.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0ad.php new file mode 100644 index 0000000..8e117c5 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0ad.php @@ -0,0 +1 @@ +<?php return ['gwan', 'gwanj', 'gwanh', 'gwad', 'gwal', 'gwalg', 'gwalm', 'gwalb', 'gwals', 'gwalt', 'gwalp', 'gwalh', 'gwam', 'gwab', 'gwabs', 'gwas', 'gwass', 'gwang', 'gwaj', 'gwac', 'gwak', 'gwat', 'gwap', 'gwah', 'gwae', 'gwaeg', 'gwaegg', 'gwaegs', 'gwaen', 'gwaenj', 'gwaenh', 'gwaed', 'gwael', 'gwaelg', 'gwaelm', 'gwaelb', 'gwaels', 'gwaelt', 'gwaelp', 'gwaelh', 'gwaem', 'gwaeb', 'gwaebs', 'gwaes', 'gwaess', 'gwaeng', 'gwaej', 'gwaec', 'gwaek', 'gwaet', 'gwaep', 'gwaeh', 'goe', 'goeg', 'goegg', 'goegs', 'goen', 'goenj', 'goenh', 'goed', 'goel', 'goelg', 'goelm', 'goelb', 'goels', 'goelt', 'goelp', 'goelh', 'goem', 'goeb', 'goebs', 'goes', 'goess', 'goeng', 'goej', 'goec', 'goek', 'goet', 'goep', 'goeh', 'gyo', 'gyog', 'gyogg', 'gyogs', 'gyon', 'gyonj', 'gyonh', 'gyod', 'gyol', 'gyolg', 'gyolm', 'gyolb', 'gyols', 'gyolt', 'gyolp', 'gyolh', 'gyom', 'gyob', 'gyobs', 'gyos', 'gyoss', 'gyong', 'gyoj', 'gyoc', 'gyok', 'gyot', 'gyop', 'gyoh', 'gu', 'gug', 'gugg', 'gugs', 'gun', 'gunj', 'gunh', 'gud', 'gul', 'gulg', 'gulm', 'gulb', 'guls', 'gult', 'gulp', 'gulh', 'gum', 'gub', 'gubs', 'gus', 'guss', 'gung', 'guj', 'guc', 'guk', 'gut', 'gup', 'guh', 'gweo', 'gweog', 'gweogg', 'gweogs', 'gweon', 'gweonj', 'gweonh', 'gweod', 'gweol', 'gweolg', 'gweolm', 'gweolb', 'gweols', 'gweolt', 'gweolp', 'gweolh', 'gweom', 'gweob', 'gweobs', 'gweos', 'gweoss', 'gweong', 'gweoj', 'gweoc', 'gweok', 'gweot', 'gweop', 'gweoh', 'gwe', 'gweg', 'gwegg', 'gwegs', 'gwen', 'gwenj', 'gwenh', 'gwed', 'gwel', 'gwelg', 'gwelm', 'gwelb', 'gwels', 'gwelt', 'gwelp', 'gwelh', 'gwem', 'gweb', 'gwebs', 'gwes', 'gwess', 'gweng', 'gwej', 'gwec', 'gwek', 'gwet', 'gwep', 'gweh', 'gwi', 'gwig', 'gwigg', 'gwigs', 'gwin', 'gwinj', 'gwinh', 'gwid', 'gwil', 'gwilg', 'gwilm', 'gwilb', 'gwils', 'gwilt', 'gwilp', 'gwilh', 'gwim', 'gwib', 'gwibs', 'gwis', 'gwiss', 'gwing', 'gwij', 'gwic', 'gwik', 'gwit', 'gwip', 'gwih', 'gyu', 'gyug', 'gyugg', 'gyugs', 'gyun', 'gyunj', 'gyunh', 'gyud', 'gyul', 'gyulg', 'gyulm', 'gyulb', 'gyuls', 'gyult', 'gyulp', 'gyulh', 'gyum', 'gyub', 'gyubs', 'gyus', 'gyuss', 'gyung', 'gyuj', 'gyuc', 'gyuk', 'gyut', 'gyup', 'gyuh', 'geu', 'geug', 'geugg', 'geugs', 'geun', 'geunj', 'geunh', 'geud']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0ae.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0ae.php new file mode 100644 index 0000000..05c2e20 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0ae.php @@ -0,0 +1 @@ +<?php return ['geul', 'geulg', 'geulm', 'geulb', 'geuls', 'geult', 'geulp', 'geulh', 'geum', 'geub', 'geubs', 'geus', 'geuss', 'geung', 'geuj', 'geuc', 'geuk', 'geut', 'geup', 'geuh', 'gyi', 'gyig', 'gyigg', 'gyigs', 'gyin', 'gyinj', 'gyinh', 'gyid', 'gyil', 'gyilg', 'gyilm', 'gyilb', 'gyils', 'gyilt', 'gyilp', 'gyilh', 'gyim', 'gyib', 'gyibs', 'gyis', 'gyiss', 'gying', 'gyij', 'gyic', 'gyik', 'gyit', 'gyip', 'gyih', 'gi', 'gig', 'gigg', 'gigs', 'gin', 'ginj', 'ginh', 'gid', 'gil', 'gilg', 'gilm', 'gilb', 'gils', 'gilt', 'gilp', 'gilh', 'gim', 'gib', 'gibs', 'gis', 'giss', 'ging', 'gij', 'gic', 'gik', 'git', 'gip', 'gih', 'gga', 'ggag', 'ggagg', 'ggags', 'ggan', 'gganj', 'gganh', 'ggad', 'ggal', 'ggalg', 'ggalm', 'ggalb', 'ggals', 'ggalt', 'ggalp', 'ggalh', 'ggam', 'ggab', 'ggabs', 'ggas', 'ggass', 'ggang', 'ggaj', 'ggac', 'ggak', 'ggat', 'ggap', 'ggah', 'ggae', 'ggaeg', 'ggaegg', 'ggaegs', 'ggaen', 'ggaenj', 'ggaenh', 'ggaed', 'ggael', 'ggaelg', 'ggaelm', 'ggaelb', 'ggaels', 'ggaelt', 'ggaelp', 'ggaelh', 'ggaem', 'ggaeb', 'ggaebs', 'ggaes', 'ggaess', 'ggaeng', 'ggaej', 'ggaec', 'ggaek', 'ggaet', 'ggaep', 'ggaeh', 'ggya', 'ggyag', 'ggyagg', 'ggyags', 'ggyan', 'ggyanj', 'ggyanh', 'ggyad', 'ggyal', 'ggyalg', 'ggyalm', 'ggyalb', 'ggyals', 'ggyalt', 'ggyalp', 'ggyalh', 'ggyam', 'ggyab', 'ggyabs', 'ggyas', 'ggyass', 'ggyang', 'ggyaj', 'ggyac', 'ggyak', 'ggyat', 'ggyap', 'ggyah', 'ggyae', 'ggyaeg', 'ggyaegg', 'ggyaegs', 'ggyaen', 'ggyaenj', 'ggyaenh', 'ggyaed', 'ggyael', 'ggyaelg', 'ggyaelm', 'ggyaelb', 'ggyaels', 'ggyaelt', 'ggyaelp', 'ggyaelh', 'ggyaem', 'ggyaeb', 'ggyaebs', 'ggyaes', 'ggyaess', 'ggyaeng', 'ggyaej', 'ggyaec', 'ggyaek', 'ggyaet', 'ggyaep', 'ggyaeh', 'ggeo', 'ggeog', 'ggeogg', 'ggeogs', 'ggeon', 'ggeonj', 'ggeonh', 'ggeod', 'ggeol', 'ggeolg', 'ggeolm', 'ggeolb', 'ggeols', 'ggeolt', 'ggeolp', 'ggeolh', 'ggeom', 'ggeob', 'ggeobs', 'ggeos', 'ggeoss', 'ggeong', 'ggeoj', 'ggeoc', 'ggeok', 'ggeot', 'ggeop', 'ggeoh', 'gge', 'ggeg', 'ggegg', 'ggegs', 'ggen', 'ggenj', 'ggenh', 'gged', 'ggel', 'ggelg', 'ggelm', 'ggelb', 'ggels', 'ggelt', 'ggelp', 'ggelh', 'ggem', 'ggeb', 'ggebs', 'gges', 'ggess', 'ggeng', 'ggej', 'ggec', 'ggek', 'gget', 'ggep', 'ggeh', 'ggyeo', 'ggyeog', 'ggyeogg', 'ggyeogs', 'ggyeon', 'ggyeonj', 'ggyeonh', 'ggyeod', 'ggyeol', 'ggyeolg', 'ggyeolm', 'ggyeolb']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0af.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0af.php new file mode 100644 index 0000000..80ac8cf --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0af.php @@ -0,0 +1 @@ +<?php return ['ggyeols', 'ggyeolt', 'ggyeolp', 'ggyeolh', 'ggyeom', 'ggyeob', 'ggyeobs', 'ggyeos', 'ggyeoss', 'ggyeong', 'ggyeoj', 'ggyeoc', 'ggyeok', 'ggyeot', 'ggyeop', 'ggyeoh', 'ggye', 'ggyeg', 'ggyegg', 'ggyegs', 'ggyen', 'ggyenj', 'ggyenh', 'ggyed', 'ggyel', 'ggyelg', 'ggyelm', 'ggyelb', 'ggyels', 'ggyelt', 'ggyelp', 'ggyelh', 'ggyem', 'ggyeb', 'ggyebs', 'ggyes', 'ggyess', 'ggyeng', 'ggyej', 'ggyec', 'ggyek', 'ggyet', 'ggyep', 'ggyeh', 'ggo', 'ggog', 'ggogg', 'ggogs', 'ggon', 'ggonj', 'ggonh', 'ggod', 'ggol', 'ggolg', 'ggolm', 'ggolb', 'ggols', 'ggolt', 'ggolp', 'ggolh', 'ggom', 'ggob', 'ggobs', 'ggos', 'ggoss', 'ggong', 'ggoj', 'ggoc', 'ggok', 'ggot', 'ggop', 'ggoh', 'ggwa', 'ggwag', 'ggwagg', 'ggwags', 'ggwan', 'ggwanj', 'ggwanh', 'ggwad', 'ggwal', 'ggwalg', 'ggwalm', 'ggwalb', 'ggwals', 'ggwalt', 'ggwalp', 'ggwalh', 'ggwam', 'ggwab', 'ggwabs', 'ggwas', 'ggwass', 'ggwang', 'ggwaj', 'ggwac', 'ggwak', 'ggwat', 'ggwap', 'ggwah', 'ggwae', 'ggwaeg', 'ggwaegg', 'ggwaegs', 'ggwaen', 'ggwaenj', 'ggwaenh', 'ggwaed', 'ggwael', 'ggwaelg', 'ggwaelm', 'ggwaelb', 'ggwaels', 'ggwaelt', 'ggwaelp', 'ggwaelh', 'ggwaem', 'ggwaeb', 'ggwaebs', 'ggwaes', 'ggwaess', 'ggwaeng', 'ggwaej', 'ggwaec', 'ggwaek', 'ggwaet', 'ggwaep', 'ggwaeh', 'ggoe', 'ggoeg', 'ggoegg', 'ggoegs', 'ggoen', 'ggoenj', 'ggoenh', 'ggoed', 'ggoel', 'ggoelg', 'ggoelm', 'ggoelb', 'ggoels', 'ggoelt', 'ggoelp', 'ggoelh', 'ggoem', 'ggoeb', 'ggoebs', 'ggoes', 'ggoess', 'ggoeng', 'ggoej', 'ggoec', 'ggoek', 'ggoet', 'ggoep', 'ggoeh', 'ggyo', 'ggyog', 'ggyogg', 'ggyogs', 'ggyon', 'ggyonj', 'ggyonh', 'ggyod', 'ggyol', 'ggyolg', 'ggyolm', 'ggyolb', 'ggyols', 'ggyolt', 'ggyolp', 'ggyolh', 'ggyom', 'ggyob', 'ggyobs', 'ggyos', 'ggyoss', 'ggyong', 'ggyoj', 'ggyoc', 'ggyok', 'ggyot', 'ggyop', 'ggyoh', 'ggu', 'ggug', 'ggugg', 'ggugs', 'ggun', 'ggunj', 'ggunh', 'ggud', 'ggul', 'ggulg', 'ggulm', 'ggulb', 'gguls', 'ggult', 'ggulp', 'ggulh', 'ggum', 'ggub', 'ggubs', 'ggus', 'gguss', 'ggung', 'gguj', 'gguc', 'gguk', 'ggut', 'ggup', 'gguh', 'ggweo', 'ggweog', 'ggweogg', 'ggweogs', 'ggweon', 'ggweonj', 'ggweonh', 'ggweod', 'ggweol', 'ggweolg', 'ggweolm', 'ggweolb', 'ggweols', 'ggweolt', 'ggweolp', 'ggweolh', 'ggweom', 'ggweob', 'ggweobs', 'ggweos', 'ggweoss', 'ggweong', 'ggweoj', 'ggweoc', 'ggweok', 'ggweot', 'ggweop', 'ggweoh', 'ggwe', 'ggweg', 'ggwegg', 'ggwegs', 'ggwen', 'ggwenj', 'ggwenh', 'ggwed', 'ggwel', 'ggwelg', 'ggwelm', 'ggwelb', 'ggwels', 'ggwelt', 'ggwelp', 'ggwelh']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b0.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b0.php new file mode 100644 index 0000000..916b5f8 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b0.php @@ -0,0 +1 @@ +<?php return ['ggwem', 'ggweb', 'ggwebs', 'ggwes', 'ggwess', 'ggweng', 'ggwej', 'ggwec', 'ggwek', 'ggwet', 'ggwep', 'ggweh', 'ggwi', 'ggwig', 'ggwigg', 'ggwigs', 'ggwin', 'ggwinj', 'ggwinh', 'ggwid', 'ggwil', 'ggwilg', 'ggwilm', 'ggwilb', 'ggwils', 'ggwilt', 'ggwilp', 'ggwilh', 'ggwim', 'ggwib', 'ggwibs', 'ggwis', 'ggwiss', 'ggwing', 'ggwij', 'ggwic', 'ggwik', 'ggwit', 'ggwip', 'ggwih', 'ggyu', 'ggyug', 'ggyugg', 'ggyugs', 'ggyun', 'ggyunj', 'ggyunh', 'ggyud', 'ggyul', 'ggyulg', 'ggyulm', 'ggyulb', 'ggyuls', 'ggyult', 'ggyulp', 'ggyulh', 'ggyum', 'ggyub', 'ggyubs', 'ggyus', 'ggyuss', 'ggyung', 'ggyuj', 'ggyuc', 'ggyuk', 'ggyut', 'ggyup', 'ggyuh', 'ggeu', 'ggeug', 'ggeugg', 'ggeugs', 'ggeun', 'ggeunj', 'ggeunh', 'ggeud', 'ggeul', 'ggeulg', 'ggeulm', 'ggeulb', 'ggeuls', 'ggeult', 'ggeulp', 'ggeulh', 'ggeum', 'ggeub', 'ggeubs', 'ggeus', 'ggeuss', 'ggeung', 'ggeuj', 'ggeuc', 'ggeuk', 'ggeut', 'ggeup', 'ggeuh', 'ggyi', 'ggyig', 'ggyigg', 'ggyigs', 'ggyin', 'ggyinj', 'ggyinh', 'ggyid', 'ggyil', 'ggyilg', 'ggyilm', 'ggyilb', 'ggyils', 'ggyilt', 'ggyilp', 'ggyilh', 'ggyim', 'ggyib', 'ggyibs', 'ggyis', 'ggyiss', 'ggying', 'ggyij', 'ggyic', 'ggyik', 'ggyit', 'ggyip', 'ggyih', 'ggi', 'ggig', 'ggigg', 'ggigs', 'ggin', 'gginj', 'gginh', 'ggid', 'ggil', 'ggilg', 'ggilm', 'ggilb', 'ggils', 'ggilt', 'ggilp', 'ggilh', 'ggim', 'ggib', 'ggibs', 'ggis', 'ggiss', 'gging', 'ggij', 'ggic', 'ggik', 'ggit', 'ggip', 'ggih', 'na', 'nag', 'nagg', 'nags', 'nan', 'nanj', 'nanh', 'nad', 'nal', 'nalg', 'nalm', 'nalb', 'nals', 'nalt', 'nalp', 'nalh', 'nam', 'nab', 'nabs', 'nas', 'nass', 'nang', 'naj', 'nac', 'nak', 'nat', 'nap', 'nah', 'nae', 'naeg', 'naegg', 'naegs', 'naen', 'naenj', 'naenh', 'naed', 'nael', 'naelg', 'naelm', 'naelb', 'naels', 'naelt', 'naelp', 'naelh', 'naem', 'naeb', 'naebs', 'naes', 'naess', 'naeng', 'naej', 'naec', 'naek', 'naet', 'naep', 'naeh', 'nya', 'nyag', 'nyagg', 'nyags', 'nyan', 'nyanj', 'nyanh', 'nyad', 'nyal', 'nyalg', 'nyalm', 'nyalb', 'nyals', 'nyalt', 'nyalp', 'nyalh', 'nyam', 'nyab', 'nyabs', 'nyas', 'nyass', 'nyang', 'nyaj', 'nyac', 'nyak', 'nyat', 'nyap', 'nyah', 'nyae', 'nyaeg', 'nyaegg', 'nyaegs', 'nyaen', 'nyaenj', 'nyaenh', 'nyaed', 'nyael', 'nyaelg', 'nyaelm', 'nyaelb', 'nyaels', 'nyaelt', 'nyaelp', 'nyaelh', 'nyaem', 'nyaeb', 'nyaebs', 'nyaes']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b1.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b1.php new file mode 100644 index 0000000..727993f --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b1.php @@ -0,0 +1 @@ +<?php return ['nyaess', 'nyaeng', 'nyaej', 'nyaec', 'nyaek', 'nyaet', 'nyaep', 'nyaeh', 'neo', 'neog', 'neogg', 'neogs', 'neon', 'neonj', 'neonh', 'neod', 'neol', 'neolg', 'neolm', 'neolb', 'neols', 'neolt', 'neolp', 'neolh', 'neom', 'neob', 'neobs', 'neos', 'neoss', 'neong', 'neoj', 'neoc', 'neok', 'neot', 'neop', 'neoh', 'ne', 'neg', 'negg', 'negs', 'nen', 'nenj', 'nenh', 'ned', 'nel', 'nelg', 'nelm', 'nelb', 'nels', 'nelt', 'nelp', 'nelh', 'nem', 'neb', 'nebs', 'nes', 'ness', 'neng', 'nej', 'nec', 'nek', 'net', 'nep', 'neh', 'nyeo', 'nyeog', 'nyeogg', 'nyeogs', 'nyeon', 'nyeonj', 'nyeonh', 'nyeod', 'nyeol', 'nyeolg', 'nyeolm', 'nyeolb', 'nyeols', 'nyeolt', 'nyeolp', 'nyeolh', 'nyeom', 'nyeob', 'nyeobs', 'nyeos', 'nyeoss', 'nyeong', 'nyeoj', 'nyeoc', 'nyeok', 'nyeot', 'nyeop', 'nyeoh', 'nye', 'nyeg', 'nyegg', 'nyegs', 'nyen', 'nyenj', 'nyenh', 'nyed', 'nyel', 'nyelg', 'nyelm', 'nyelb', 'nyels', 'nyelt', 'nyelp', 'nyelh', 'nyem', 'nyeb', 'nyebs', 'nyes', 'nyess', 'nyeng', 'nyej', 'nyec', 'nyek', 'nyet', 'nyep', 'nyeh', 'no', 'nog', 'nogg', 'nogs', 'non', 'nonj', 'nonh', 'nod', 'nol', 'nolg', 'nolm', 'nolb', 'nols', 'nolt', 'nolp', 'nolh', 'nom', 'nob', 'nobs', 'nos', 'noss', 'nong', 'noj', 'noc', 'nok', 'not', 'nop', 'noh', 'nwa', 'nwag', 'nwagg', 'nwags', 'nwan', 'nwanj', 'nwanh', 'nwad', 'nwal', 'nwalg', 'nwalm', 'nwalb', 'nwals', 'nwalt', 'nwalp', 'nwalh', 'nwam', 'nwab', 'nwabs', 'nwas', 'nwass', 'nwang', 'nwaj', 'nwac', 'nwak', 'nwat', 'nwap', 'nwah', 'nwae', 'nwaeg', 'nwaegg', 'nwaegs', 'nwaen', 'nwaenj', 'nwaenh', 'nwaed', 'nwael', 'nwaelg', 'nwaelm', 'nwaelb', 'nwaels', 'nwaelt', 'nwaelp', 'nwaelh', 'nwaem', 'nwaeb', 'nwaebs', 'nwaes', 'nwaess', 'nwaeng', 'nwaej', 'nwaec', 'nwaek', 'nwaet', 'nwaep', 'nwaeh', 'noe', 'noeg', 'noegg', 'noegs', 'noen', 'noenj', 'noenh', 'noed', 'noel', 'noelg', 'noelm', 'noelb', 'noels', 'noelt', 'noelp', 'noelh', 'noem', 'noeb', 'noebs', 'noes', 'noess', 'noeng', 'noej', 'noec', 'noek', 'noet', 'noep', 'noeh', 'nyo', 'nyog', 'nyogg', 'nyogs', 'nyon', 'nyonj', 'nyonh', 'nyod', 'nyol', 'nyolg', 'nyolm', 'nyolb', 'nyols', 'nyolt', 'nyolp', 'nyolh', 'nyom', 'nyob', 'nyobs', 'nyos', 'nyoss', 'nyong', 'nyoj', 'nyoc']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b2.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b2.php new file mode 100644 index 0000000..46bef0a --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b2.php @@ -0,0 +1 @@ +<?php return ['nyok', 'nyot', 'nyop', 'nyoh', 'nu', 'nug', 'nugg', 'nugs', 'nun', 'nunj', 'nunh', 'nud', 'nul', 'nulg', 'nulm', 'nulb', 'nuls', 'nult', 'nulp', 'nulh', 'num', 'nub', 'nubs', 'nus', 'nuss', 'nung', 'nuj', 'nuc', 'nuk', 'nut', 'nup', 'nuh', 'nweo', 'nweog', 'nweogg', 'nweogs', 'nweon', 'nweonj', 'nweonh', 'nweod', 'nweol', 'nweolg', 'nweolm', 'nweolb', 'nweols', 'nweolt', 'nweolp', 'nweolh', 'nweom', 'nweob', 'nweobs', 'nweos', 'nweoss', 'nweong', 'nweoj', 'nweoc', 'nweok', 'nweot', 'nweop', 'nweoh', 'nwe', 'nweg', 'nwegg', 'nwegs', 'nwen', 'nwenj', 'nwenh', 'nwed', 'nwel', 'nwelg', 'nwelm', 'nwelb', 'nwels', 'nwelt', 'nwelp', 'nwelh', 'nwem', 'nweb', 'nwebs', 'nwes', 'nwess', 'nweng', 'nwej', 'nwec', 'nwek', 'nwet', 'nwep', 'nweh', 'nwi', 'nwig', 'nwigg', 'nwigs', 'nwin', 'nwinj', 'nwinh', 'nwid', 'nwil', 'nwilg', 'nwilm', 'nwilb', 'nwils', 'nwilt', 'nwilp', 'nwilh', 'nwim', 'nwib', 'nwibs', 'nwis', 'nwiss', 'nwing', 'nwij', 'nwic', 'nwik', 'nwit', 'nwip', 'nwih', 'nyu', 'nyug', 'nyugg', 'nyugs', 'nyun', 'nyunj', 'nyunh', 'nyud', 'nyul', 'nyulg', 'nyulm', 'nyulb', 'nyuls', 'nyult', 'nyulp', 'nyulh', 'nyum', 'nyub', 'nyubs', 'nyus', 'nyuss', 'nyung', 'nyuj', 'nyuc', 'nyuk', 'nyut', 'nyup', 'nyuh', 'neu', 'neug', 'neugg', 'neugs', 'neun', 'neunj', 'neunh', 'neud', 'neul', 'neulg', 'neulm', 'neulb', 'neuls', 'neult', 'neulp', 'neulh', 'neum', 'neub', 'neubs', 'neus', 'neuss', 'neung', 'neuj', 'neuc', 'neuk', 'neut', 'neup', 'neuh', 'nyi', 'nyig', 'nyigg', 'nyigs', 'nyin', 'nyinj', 'nyinh', 'nyid', 'nyil', 'nyilg', 'nyilm', 'nyilb', 'nyils', 'nyilt', 'nyilp', 'nyilh', 'nyim', 'nyib', 'nyibs', 'nyis', 'nyiss', 'nying', 'nyij', 'nyic', 'nyik', 'nyit', 'nyip', 'nyih', 'ni', 'nig', 'nigg', 'nigs', 'nin', 'ninj', 'ninh', 'nid', 'nil', 'nilg', 'nilm', 'nilb', 'nils', 'nilt', 'nilp', 'nilh', 'nim', 'nib', 'nibs', 'nis', 'niss', 'ning', 'nij', 'nic', 'nik', 'nit', 'nip', 'nih', 'da', 'dag', 'dagg', 'dags', 'dan', 'danj', 'danh', 'dad', 'dal', 'dalg', 'dalm', 'dalb', 'dals', 'dalt', 'dalp', 'dalh', 'dam', 'dab', 'dabs', 'das', 'dass', 'dang', 'daj', 'dac', 'dak', 'dat', 'dap', 'dah']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b3.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b3.php new file mode 100644 index 0000000..3d3368a --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b3.php @@ -0,0 +1 @@ +<?php return ['dae', 'daeg', 'daegg', 'daegs', 'daen', 'daenj', 'daenh', 'daed', 'dael', 'daelg', 'daelm', 'daelb', 'daels', 'daelt', 'daelp', 'daelh', 'daem', 'daeb', 'daebs', 'daes', 'daess', 'daeng', 'daej', 'daec', 'daek', 'daet', 'daep', 'daeh', 'dya', 'dyag', 'dyagg', 'dyags', 'dyan', 'dyanj', 'dyanh', 'dyad', 'dyal', 'dyalg', 'dyalm', 'dyalb', 'dyals', 'dyalt', 'dyalp', 'dyalh', 'dyam', 'dyab', 'dyabs', 'dyas', 'dyass', 'dyang', 'dyaj', 'dyac', 'dyak', 'dyat', 'dyap', 'dyah', 'dyae', 'dyaeg', 'dyaegg', 'dyaegs', 'dyaen', 'dyaenj', 'dyaenh', 'dyaed', 'dyael', 'dyaelg', 'dyaelm', 'dyaelb', 'dyaels', 'dyaelt', 'dyaelp', 'dyaelh', 'dyaem', 'dyaeb', 'dyaebs', 'dyaes', 'dyaess', 'dyaeng', 'dyaej', 'dyaec', 'dyaek', 'dyaet', 'dyaep', 'dyaeh', 'deo', 'deog', 'deogg', 'deogs', 'deon', 'deonj', 'deonh', 'deod', 'deol', 'deolg', 'deolm', 'deolb', 'deols', 'deolt', 'deolp', 'deolh', 'deom', 'deob', 'deobs', 'deos', 'deoss', 'deong', 'deoj', 'deoc', 'deok', 'deot', 'deop', 'deoh', 'de', 'deg', 'degg', 'degs', 'den', 'denj', 'denh', 'ded', 'del', 'delg', 'delm', 'delb', 'dels', 'delt', 'delp', 'delh', 'dem', 'deb', 'debs', 'des', 'dess', 'deng', 'dej', 'dec', 'dek', 'det', 'dep', 'deh', 'dyeo', 'dyeog', 'dyeogg', 'dyeogs', 'dyeon', 'dyeonj', 'dyeonh', 'dyeod', 'dyeol', 'dyeolg', 'dyeolm', 'dyeolb', 'dyeols', 'dyeolt', 'dyeolp', 'dyeolh', 'dyeom', 'dyeob', 'dyeobs', 'dyeos', 'dyeoss', 'dyeong', 'dyeoj', 'dyeoc', 'dyeok', 'dyeot', 'dyeop', 'dyeoh', 'dye', 'dyeg', 'dyegg', 'dyegs', 'dyen', 'dyenj', 'dyenh', 'dyed', 'dyel', 'dyelg', 'dyelm', 'dyelb', 'dyels', 'dyelt', 'dyelp', 'dyelh', 'dyem', 'dyeb', 'dyebs', 'dyes', 'dyess', 'dyeng', 'dyej', 'dyec', 'dyek', 'dyet', 'dyep', 'dyeh', 'do', 'dog', 'dogg', 'dogs', 'don', 'donj', 'donh', 'dod', 'dol', 'dolg', 'dolm', 'dolb', 'dols', 'dolt', 'dolp', 'dolh', 'dom', 'dob', 'dobs', 'dos', 'doss', 'dong', 'doj', 'doc', 'dok', 'dot', 'dop', 'doh', 'dwa', 'dwag', 'dwagg', 'dwags', 'dwan', 'dwanj', 'dwanh', 'dwad', 'dwal', 'dwalg', 'dwalm', 'dwalb', 'dwals', 'dwalt', 'dwalp', 'dwalh', 'dwam', 'dwab', 'dwabs', 'dwas', 'dwass', 'dwang', 'dwaj', 'dwac', 'dwak', 'dwat', 'dwap', 'dwah', 'dwae', 'dwaeg', 'dwaegg', 'dwaegs']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b4.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b4.php new file mode 100644 index 0000000..07440d7 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b4.php @@ -0,0 +1 @@ +<?php return ['dwaen', 'dwaenj', 'dwaenh', 'dwaed', 'dwael', 'dwaelg', 'dwaelm', 'dwaelb', 'dwaels', 'dwaelt', 'dwaelp', 'dwaelh', 'dwaem', 'dwaeb', 'dwaebs', 'dwaes', 'dwaess', 'dwaeng', 'dwaej', 'dwaec', 'dwaek', 'dwaet', 'dwaep', 'dwaeh', 'doe', 'doeg', 'doegg', 'doegs', 'doen', 'doenj', 'doenh', 'doed', 'doel', 'doelg', 'doelm', 'doelb', 'doels', 'doelt', 'doelp', 'doelh', 'doem', 'doeb', 'doebs', 'does', 'doess', 'doeng', 'doej', 'doec', 'doek', 'doet', 'doep', 'doeh', 'dyo', 'dyog', 'dyogg', 'dyogs', 'dyon', 'dyonj', 'dyonh', 'dyod', 'dyol', 'dyolg', 'dyolm', 'dyolb', 'dyols', 'dyolt', 'dyolp', 'dyolh', 'dyom', 'dyob', 'dyobs', 'dyos', 'dyoss', 'dyong', 'dyoj', 'dyoc', 'dyok', 'dyot', 'dyop', 'dyoh', 'du', 'dug', 'dugg', 'dugs', 'dun', 'dunj', 'dunh', 'dud', 'dul', 'dulg', 'dulm', 'dulb', 'duls', 'dult', 'dulp', 'dulh', 'dum', 'dub', 'dubs', 'dus', 'duss', 'dung', 'duj', 'duc', 'duk', 'dut', 'dup', 'duh', 'dweo', 'dweog', 'dweogg', 'dweogs', 'dweon', 'dweonj', 'dweonh', 'dweod', 'dweol', 'dweolg', 'dweolm', 'dweolb', 'dweols', 'dweolt', 'dweolp', 'dweolh', 'dweom', 'dweob', 'dweobs', 'dweos', 'dweoss', 'dweong', 'dweoj', 'dweoc', 'dweok', 'dweot', 'dweop', 'dweoh', 'dwe', 'dweg', 'dwegg', 'dwegs', 'dwen', 'dwenj', 'dwenh', 'dwed', 'dwel', 'dwelg', 'dwelm', 'dwelb', 'dwels', 'dwelt', 'dwelp', 'dwelh', 'dwem', 'dweb', 'dwebs', 'dwes', 'dwess', 'dweng', 'dwej', 'dwec', 'dwek', 'dwet', 'dwep', 'dweh', 'dwi', 'dwig', 'dwigg', 'dwigs', 'dwin', 'dwinj', 'dwinh', 'dwid', 'dwil', 'dwilg', 'dwilm', 'dwilb', 'dwils', 'dwilt', 'dwilp', 'dwilh', 'dwim', 'dwib', 'dwibs', 'dwis', 'dwiss', 'dwing', 'dwij', 'dwic', 'dwik', 'dwit', 'dwip', 'dwih', 'dyu', 'dyug', 'dyugg', 'dyugs', 'dyun', 'dyunj', 'dyunh', 'dyud', 'dyul', 'dyulg', 'dyulm', 'dyulb', 'dyuls', 'dyult', 'dyulp', 'dyulh', 'dyum', 'dyub', 'dyubs', 'dyus', 'dyuss', 'dyung', 'dyuj', 'dyuc', 'dyuk', 'dyut', 'dyup', 'dyuh', 'deu', 'deug', 'deugg', 'deugs', 'deun', 'deunj', 'deunh', 'deud', 'deul', 'deulg', 'deulm', 'deulb', 'deuls', 'deult', 'deulp', 'deulh', 'deum', 'deub', 'deubs', 'deus', 'deuss', 'deung', 'deuj', 'deuc', 'deuk', 'deut', 'deup', 'deuh', 'dyi', 'dyig', 'dyigg', 'dyigs', 'dyin', 'dyinj', 'dyinh', 'dyid']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b5.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b5.php new file mode 100644 index 0000000..13b064e --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b5.php @@ -0,0 +1 @@ +<?php return ['dyil', 'dyilg', 'dyilm', 'dyilb', 'dyils', 'dyilt', 'dyilp', 'dyilh', 'dyim', 'dyib', 'dyibs', 'dyis', 'dyiss', 'dying', 'dyij', 'dyic', 'dyik', 'dyit', 'dyip', 'dyih', 'di', 'dig', 'digg', 'digs', 'din', 'dinj', 'dinh', 'did', 'dil', 'dilg', 'dilm', 'dilb', 'dils', 'dilt', 'dilp', 'dilh', 'dim', 'dib', 'dibs', 'dis', 'diss', 'ding', 'dij', 'dic', 'dik', 'dit', 'dip', 'dih', 'dda', 'ddag', 'ddagg', 'ddags', 'ddan', 'ddanj', 'ddanh', 'ddad', 'ddal', 'ddalg', 'ddalm', 'ddalb', 'ddals', 'ddalt', 'ddalp', 'ddalh', 'ddam', 'ddab', 'ddabs', 'ddas', 'ddass', 'ddang', 'ddaj', 'ddac', 'ddak', 'ddat', 'ddap', 'ddah', 'ddae', 'ddaeg', 'ddaegg', 'ddaegs', 'ddaen', 'ddaenj', 'ddaenh', 'ddaed', 'ddael', 'ddaelg', 'ddaelm', 'ddaelb', 'ddaels', 'ddaelt', 'ddaelp', 'ddaelh', 'ddaem', 'ddaeb', 'ddaebs', 'ddaes', 'ddaess', 'ddaeng', 'ddaej', 'ddaec', 'ddaek', 'ddaet', 'ddaep', 'ddaeh', 'ddya', 'ddyag', 'ddyagg', 'ddyags', 'ddyan', 'ddyanj', 'ddyanh', 'ddyad', 'ddyal', 'ddyalg', 'ddyalm', 'ddyalb', 'ddyals', 'ddyalt', 'ddyalp', 'ddyalh', 'ddyam', 'ddyab', 'ddyabs', 'ddyas', 'ddyass', 'ddyang', 'ddyaj', 'ddyac', 'ddyak', 'ddyat', 'ddyap', 'ddyah', 'ddyae', 'ddyaeg', 'ddyaegg', 'ddyaegs', 'ddyaen', 'ddyaenj', 'ddyaenh', 'ddyaed', 'ddyael', 'ddyaelg', 'ddyaelm', 'ddyaelb', 'ddyaels', 'ddyaelt', 'ddyaelp', 'ddyaelh', 'ddyaem', 'ddyaeb', 'ddyaebs', 'ddyaes', 'ddyaess', 'ddyaeng', 'ddyaej', 'ddyaec', 'ddyaek', 'ddyaet', 'ddyaep', 'ddyaeh', 'ddeo', 'ddeog', 'ddeogg', 'ddeogs', 'ddeon', 'ddeonj', 'ddeonh', 'ddeod', 'ddeol', 'ddeolg', 'ddeolm', 'ddeolb', 'ddeols', 'ddeolt', 'ddeolp', 'ddeolh', 'ddeom', 'ddeob', 'ddeobs', 'ddeos', 'ddeoss', 'ddeong', 'ddeoj', 'ddeoc', 'ddeok', 'ddeot', 'ddeop', 'ddeoh', 'dde', 'ddeg', 'ddegg', 'ddegs', 'dden', 'ddenj', 'ddenh', 'dded', 'ddel', 'ddelg', 'ddelm', 'ddelb', 'ddels', 'ddelt', 'ddelp', 'ddelh', 'ddem', 'ddeb', 'ddebs', 'ddes', 'ddess', 'ddeng', 'ddej', 'ddec', 'ddek', 'ddet', 'ddep', 'ddeh', 'ddyeo', 'ddyeog', 'ddyeogg', 'ddyeogs', 'ddyeon', 'ddyeonj', 'ddyeonh', 'ddyeod', 'ddyeol', 'ddyeolg', 'ddyeolm', 'ddyeolb', 'ddyeols', 'ddyeolt', 'ddyeolp', 'ddyeolh', 'ddyeom', 'ddyeob', 'ddyeobs', 'ddyeos', 'ddyeoss', 'ddyeong', 'ddyeoj', 'ddyeoc', 'ddyeok', 'ddyeot', 'ddyeop', 'ddyeoh', 'ddye', 'ddyeg', 'ddyegg', 'ddyegs', 'ddyen', 'ddyenj', 'ddyenh', 'ddyed', 'ddyel', 'ddyelg', 'ddyelm', 'ddyelb']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b6.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b6.php new file mode 100644 index 0000000..ebaa33d --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b6.php @@ -0,0 +1 @@ +<?php return ['ddyels', 'ddyelt', 'ddyelp', 'ddyelh', 'ddyem', 'ddyeb', 'ddyebs', 'ddyes', 'ddyess', 'ddyeng', 'ddyej', 'ddyec', 'ddyek', 'ddyet', 'ddyep', 'ddyeh', 'ddo', 'ddog', 'ddogg', 'ddogs', 'ddon', 'ddonj', 'ddonh', 'ddod', 'ddol', 'ddolg', 'ddolm', 'ddolb', 'ddols', 'ddolt', 'ddolp', 'ddolh', 'ddom', 'ddob', 'ddobs', 'ddos', 'ddoss', 'ddong', 'ddoj', 'ddoc', 'ddok', 'ddot', 'ddop', 'ddoh', 'ddwa', 'ddwag', 'ddwagg', 'ddwags', 'ddwan', 'ddwanj', 'ddwanh', 'ddwad', 'ddwal', 'ddwalg', 'ddwalm', 'ddwalb', 'ddwals', 'ddwalt', 'ddwalp', 'ddwalh', 'ddwam', 'ddwab', 'ddwabs', 'ddwas', 'ddwass', 'ddwang', 'ddwaj', 'ddwac', 'ddwak', 'ddwat', 'ddwap', 'ddwah', 'ddwae', 'ddwaeg', 'ddwaegg', 'ddwaegs', 'ddwaen', 'ddwaenj', 'ddwaenh', 'ddwaed', 'ddwael', 'ddwaelg', 'ddwaelm', 'ddwaelb', 'ddwaels', 'ddwaelt', 'ddwaelp', 'ddwaelh', 'ddwaem', 'ddwaeb', 'ddwaebs', 'ddwaes', 'ddwaess', 'ddwaeng', 'ddwaej', 'ddwaec', 'ddwaek', 'ddwaet', 'ddwaep', 'ddwaeh', 'ddoe', 'ddoeg', 'ddoegg', 'ddoegs', 'ddoen', 'ddoenj', 'ddoenh', 'ddoed', 'ddoel', 'ddoelg', 'ddoelm', 'ddoelb', 'ddoels', 'ddoelt', 'ddoelp', 'ddoelh', 'ddoem', 'ddoeb', 'ddoebs', 'ddoes', 'ddoess', 'ddoeng', 'ddoej', 'ddoec', 'ddoek', 'ddoet', 'ddoep', 'ddoeh', 'ddyo', 'ddyog', 'ddyogg', 'ddyogs', 'ddyon', 'ddyonj', 'ddyonh', 'ddyod', 'ddyol', 'ddyolg', 'ddyolm', 'ddyolb', 'ddyols', 'ddyolt', 'ddyolp', 'ddyolh', 'ddyom', 'ddyob', 'ddyobs', 'ddyos', 'ddyoss', 'ddyong', 'ddyoj', 'ddyoc', 'ddyok', 'ddyot', 'ddyop', 'ddyoh', 'ddu', 'ddug', 'ddugg', 'ddugs', 'ddun', 'ddunj', 'ddunh', 'ddud', 'ddul', 'ddulg', 'ddulm', 'ddulb', 'dduls', 'ddult', 'ddulp', 'ddulh', 'ddum', 'ddub', 'ddubs', 'ddus', 'dduss', 'ddung', 'dduj', 'dduc', 'dduk', 'ddut', 'ddup', 'dduh', 'ddweo', 'ddweog', 'ddweogg', 'ddweogs', 'ddweon', 'ddweonj', 'ddweonh', 'ddweod', 'ddweol', 'ddweolg', 'ddweolm', 'ddweolb', 'ddweols', 'ddweolt', 'ddweolp', 'ddweolh', 'ddweom', 'ddweob', 'ddweobs', 'ddweos', 'ddweoss', 'ddweong', 'ddweoj', 'ddweoc', 'ddweok', 'ddweot', 'ddweop', 'ddweoh', 'ddwe', 'ddweg', 'ddwegg', 'ddwegs', 'ddwen', 'ddwenj', 'ddwenh', 'ddwed', 'ddwel', 'ddwelg', 'ddwelm', 'ddwelb', 'ddwels', 'ddwelt', 'ddwelp', 'ddwelh', 'ddwem', 'ddweb', 'ddwebs', 'ddwes', 'ddwess', 'ddweng', 'ddwej', 'ddwec', 'ddwek', 'ddwet', 'ddwep', 'ddweh', 'ddwi', 'ddwig', 'ddwigg', 'ddwigs', 'ddwin', 'ddwinj', 'ddwinh', 'ddwid', 'ddwil', 'ddwilg', 'ddwilm', 'ddwilb', 'ddwils', 'ddwilt', 'ddwilp', 'ddwilh']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b7.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b7.php new file mode 100644 index 0000000..174de9d --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b7.php @@ -0,0 +1 @@ +<?php return ['ddwim', 'ddwib', 'ddwibs', 'ddwis', 'ddwiss', 'ddwing', 'ddwij', 'ddwic', 'ddwik', 'ddwit', 'ddwip', 'ddwih', 'ddyu', 'ddyug', 'ddyugg', 'ddyugs', 'ddyun', 'ddyunj', 'ddyunh', 'ddyud', 'ddyul', 'ddyulg', 'ddyulm', 'ddyulb', 'ddyuls', 'ddyult', 'ddyulp', 'ddyulh', 'ddyum', 'ddyub', 'ddyubs', 'ddyus', 'ddyuss', 'ddyung', 'ddyuj', 'ddyuc', 'ddyuk', 'ddyut', 'ddyup', 'ddyuh', 'ddeu', 'ddeug', 'ddeugg', 'ddeugs', 'ddeun', 'ddeunj', 'ddeunh', 'ddeud', 'ddeul', 'ddeulg', 'ddeulm', 'ddeulb', 'ddeuls', 'ddeult', 'ddeulp', 'ddeulh', 'ddeum', 'ddeub', 'ddeubs', 'ddeus', 'ddeuss', 'ddeung', 'ddeuj', 'ddeuc', 'ddeuk', 'ddeut', 'ddeup', 'ddeuh', 'ddyi', 'ddyig', 'ddyigg', 'ddyigs', 'ddyin', 'ddyinj', 'ddyinh', 'ddyid', 'ddyil', 'ddyilg', 'ddyilm', 'ddyilb', 'ddyils', 'ddyilt', 'ddyilp', 'ddyilh', 'ddyim', 'ddyib', 'ddyibs', 'ddyis', 'ddyiss', 'ddying', 'ddyij', 'ddyic', 'ddyik', 'ddyit', 'ddyip', 'ddyih', 'ddi', 'ddig', 'ddigg', 'ddigs', 'ddin', 'ddinj', 'ddinh', 'ddid', 'ddil', 'ddilg', 'ddilm', 'ddilb', 'ddils', 'ddilt', 'ddilp', 'ddilh', 'ddim', 'ddib', 'ddibs', 'ddis', 'ddiss', 'dding', 'ddij', 'ddic', 'ddik', 'ddit', 'ddip', 'ddih', 'ra', 'rag', 'ragg', 'rags', 'ran', 'ranj', 'ranh', 'rad', 'ral', 'ralg', 'ralm', 'ralb', 'rals', 'ralt', 'ralp', 'ralh', 'ram', 'rab', 'rabs', 'ras', 'rass', 'rang', 'raj', 'rac', 'rak', 'rat', 'rap', 'rah', 'rae', 'raeg', 'raegg', 'raegs', 'raen', 'raenj', 'raenh', 'raed', 'rael', 'raelg', 'raelm', 'raelb', 'raels', 'raelt', 'raelp', 'raelh', 'raem', 'raeb', 'raebs', 'raes', 'raess', 'raeng', 'raej', 'raec', 'raek', 'raet', 'raep', 'raeh', 'rya', 'ryag', 'ryagg', 'ryags', 'ryan', 'ryanj', 'ryanh', 'ryad', 'ryal', 'ryalg', 'ryalm', 'ryalb', 'ryals', 'ryalt', 'ryalp', 'ryalh', 'ryam', 'ryab', 'ryabs', 'ryas', 'ryass', 'ryang', 'ryaj', 'ryac', 'ryak', 'ryat', 'ryap', 'ryah', 'ryae', 'ryaeg', 'ryaegg', 'ryaegs', 'ryaen', 'ryaenj', 'ryaenh', 'ryaed', 'ryael', 'ryaelg', 'ryaelm', 'ryaelb', 'ryaels', 'ryaelt', 'ryaelp', 'ryaelh', 'ryaem', 'ryaeb', 'ryaebs', 'ryaes', 'ryaess', 'ryaeng', 'ryaej', 'ryaec', 'ryaek', 'ryaet', 'ryaep', 'ryaeh', 'reo', 'reog', 'reogg', 'reogs', 'reon', 'reonj', 'reonh', 'reod', 'reol', 'reolg', 'reolm', 'reolb', 'reols', 'reolt', 'reolp', 'reolh', 'reom', 'reob', 'reobs', 'reos']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b8.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b8.php new file mode 100644 index 0000000..8afbadc --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b8.php @@ -0,0 +1 @@ +<?php return ['reoss', 'reong', 'reoj', 'reoc', 'reok', 'reot', 'reop', 'reoh', 're', 'reg', 'regg', 'regs', 'ren', 'renj', 'renh', 'red', 'rel', 'relg', 'relm', 'relb', 'rels', 'relt', 'relp', 'relh', 'rem', 'reb', 'rebs', 'res', 'ress', 'reng', 'rej', 'rec', 'rek', 'ret', 'rep', 'reh', 'ryeo', 'ryeog', 'ryeogg', 'ryeogs', 'ryeon', 'ryeonj', 'ryeonh', 'ryeod', 'ryeol', 'ryeolg', 'ryeolm', 'ryeolb', 'ryeols', 'ryeolt', 'ryeolp', 'ryeolh', 'ryeom', 'ryeob', 'ryeobs', 'ryeos', 'ryeoss', 'ryeong', 'ryeoj', 'ryeoc', 'ryeok', 'ryeot', 'ryeop', 'ryeoh', 'rye', 'ryeg', 'ryegg', 'ryegs', 'ryen', 'ryenj', 'ryenh', 'ryed', 'ryel', 'ryelg', 'ryelm', 'ryelb', 'ryels', 'ryelt', 'ryelp', 'ryelh', 'ryem', 'ryeb', 'ryebs', 'ryes', 'ryess', 'ryeng', 'ryej', 'ryec', 'ryek', 'ryet', 'ryep', 'ryeh', 'ro', 'rog', 'rogg', 'rogs', 'ron', 'ronj', 'ronh', 'rod', 'rol', 'rolg', 'rolm', 'rolb', 'rols', 'rolt', 'rolp', 'rolh', 'rom', 'rob', 'robs', 'ros', 'ross', 'rong', 'roj', 'roc', 'rok', 'rot', 'rop', 'roh', 'rwa', 'rwag', 'rwagg', 'rwags', 'rwan', 'rwanj', 'rwanh', 'rwad', 'rwal', 'rwalg', 'rwalm', 'rwalb', 'rwals', 'rwalt', 'rwalp', 'rwalh', 'rwam', 'rwab', 'rwabs', 'rwas', 'rwass', 'rwang', 'rwaj', 'rwac', 'rwak', 'rwat', 'rwap', 'rwah', 'rwae', 'rwaeg', 'rwaegg', 'rwaegs', 'rwaen', 'rwaenj', 'rwaenh', 'rwaed', 'rwael', 'rwaelg', 'rwaelm', 'rwaelb', 'rwaels', 'rwaelt', 'rwaelp', 'rwaelh', 'rwaem', 'rwaeb', 'rwaebs', 'rwaes', 'rwaess', 'rwaeng', 'rwaej', 'rwaec', 'rwaek', 'rwaet', 'rwaep', 'rwaeh', 'roe', 'roeg', 'roegg', 'roegs', 'roen', 'roenj', 'roenh', 'roed', 'roel', 'roelg', 'roelm', 'roelb', 'roels', 'roelt', 'roelp', 'roelh', 'roem', 'roeb', 'roebs', 'roes', 'roess', 'roeng', 'roej', 'roec', 'roek', 'roet', 'roep', 'roeh', 'ryo', 'ryog', 'ryogg', 'ryogs', 'ryon', 'ryonj', 'ryonh', 'ryod', 'ryol', 'ryolg', 'ryolm', 'ryolb', 'ryols', 'ryolt', 'ryolp', 'ryolh', 'ryom', 'ryob', 'ryobs', 'ryos', 'ryoss', 'ryong', 'ryoj', 'ryoc', 'ryok', 'ryot', 'ryop', 'ryoh', 'ru', 'rug', 'rugg', 'rugs', 'run', 'runj', 'runh', 'rud', 'rul', 'rulg', 'rulm', 'rulb', 'ruls', 'rult', 'rulp', 'rulh', 'rum', 'rub', 'rubs', 'rus', 'russ', 'rung', 'ruj', 'ruc']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0b9.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0b9.php new file mode 100644 index 0000000..e5e4b1a --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0b9.php @@ -0,0 +1 @@ +<?php return ['ruk', 'rut', 'rup', 'ruh', 'rweo', 'rweog', 'rweogg', 'rweogs', 'rweon', 'rweonj', 'rweonh', 'rweod', 'rweol', 'rweolg', 'rweolm', 'rweolb', 'rweols', 'rweolt', 'rweolp', 'rweolh', 'rweom', 'rweob', 'rweobs', 'rweos', 'rweoss', 'rweong', 'rweoj', 'rweoc', 'rweok', 'rweot', 'rweop', 'rweoh', 'rwe', 'rweg', 'rwegg', 'rwegs', 'rwen', 'rwenj', 'rwenh', 'rwed', 'rwel', 'rwelg', 'rwelm', 'rwelb', 'rwels', 'rwelt', 'rwelp', 'rwelh', 'rwem', 'rweb', 'rwebs', 'rwes', 'rwess', 'rweng', 'rwej', 'rwec', 'rwek', 'rwet', 'rwep', 'rweh', 'rwi', 'rwig', 'rwigg', 'rwigs', 'rwin', 'rwinj', 'rwinh', 'rwid', 'rwil', 'rwilg', 'rwilm', 'rwilb', 'rwils', 'rwilt', 'rwilp', 'rwilh', 'rwim', 'rwib', 'rwibs', 'rwis', 'rwiss', 'rwing', 'rwij', 'rwic', 'rwik', 'rwit', 'rwip', 'rwih', 'ryu', 'ryug', 'ryugg', 'ryugs', 'ryun', 'ryunj', 'ryunh', 'ryud', 'ryul', 'ryulg', 'ryulm', 'ryulb', 'ryuls', 'ryult', 'ryulp', 'ryulh', 'ryum', 'ryub', 'ryubs', 'ryus', 'ryuss', 'ryung', 'ryuj', 'ryuc', 'ryuk', 'ryut', 'ryup', 'ryuh', 'reu', 'reug', 'reugg', 'reugs', 'reun', 'reunj', 'reunh', 'reud', 'reul', 'reulg', 'reulm', 'reulb', 'reuls', 'reult', 'reulp', 'reulh', 'reum', 'reub', 'reubs', 'reus', 'reuss', 'reung', 'reuj', 'reuc', 'reuk', 'reut', 'reup', 'reuh', 'ryi', 'ryig', 'ryigg', 'ryigs', 'ryin', 'ryinj', 'ryinh', 'ryid', 'ryil', 'ryilg', 'ryilm', 'ryilb', 'ryils', 'ryilt', 'ryilp', 'ryilh', 'ryim', 'ryib', 'ryibs', 'ryis', 'ryiss', 'rying', 'ryij', 'ryic', 'ryik', 'ryit', 'ryip', 'ryih', 'ri', 'rig', 'rigg', 'rigs', 'rin', 'rinj', 'rinh', 'rid', 'ril', 'rilg', 'rilm', 'rilb', 'rils', 'rilt', 'rilp', 'rilh', 'rim', 'rib', 'ribs', 'ris', 'riss', 'ring', 'rij', 'ric', 'rik', 'rit', 'rip', 'rih', 'ma', 'mag', 'magg', 'mags', 'man', 'manj', 'manh', 'mad', 'mal', 'malg', 'malm', 'malb', 'mals', 'malt', 'malp', 'malh', 'mam', 'mab', 'mabs', 'mas', 'mass', 'mang', 'maj', 'mac', 'mak', 'mat', 'map', 'mah', 'mae', 'maeg', 'maegg', 'maegs', 'maen', 'maenj', 'maenh', 'maed', 'mael', 'maelg', 'maelm', 'maelb', 'maels', 'maelt', 'maelp', 'maelh', 'maem', 'maeb', 'maebs', 'maes', 'maess', 'maeng', 'maej', 'maec', 'maek', 'maet', 'maep', 'maeh']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0ba.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0ba.php new file mode 100644 index 0000000..27148dd --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0ba.php @@ -0,0 +1 @@ +<?php return ['mya', 'myag', 'myagg', 'myags', 'myan', 'myanj', 'myanh', 'myad', 'myal', 'myalg', 'myalm', 'myalb', 'myals', 'myalt', 'myalp', 'myalh', 'myam', 'myab', 'myabs', 'myas', 'myass', 'myang', 'myaj', 'myac', 'myak', 'myat', 'myap', 'myah', 'myae', 'myaeg', 'myaegg', 'myaegs', 'myaen', 'myaenj', 'myaenh', 'myaed', 'myael', 'myaelg', 'myaelm', 'myaelb', 'myaels', 'myaelt', 'myaelp', 'myaelh', 'myaem', 'myaeb', 'myaebs', 'myaes', 'myaess', 'myaeng', 'myaej', 'myaec', 'myaek', 'myaet', 'myaep', 'myaeh', 'meo', 'meog', 'meogg', 'meogs', 'meon', 'meonj', 'meonh', 'meod', 'meol', 'meolg', 'meolm', 'meolb', 'meols', 'meolt', 'meolp', 'meolh', 'meom', 'meob', 'meobs', 'meos', 'meoss', 'meong', 'meoj', 'meoc', 'meok', 'meot', 'meop', 'meoh', 'me', 'meg', 'megg', 'megs', 'men', 'menj', 'menh', 'med', 'mel', 'melg', 'melm', 'melb', 'mels', 'melt', 'melp', 'melh', 'mem', 'meb', 'mebs', 'mes', 'mess', 'meng', 'mej', 'mec', 'mek', 'met', 'mep', 'meh', 'myeo', 'myeog', 'myeogg', 'myeogs', 'myeon', 'myeonj', 'myeonh', 'myeod', 'myeol', 'myeolg', 'myeolm', 'myeolb', 'myeols', 'myeolt', 'myeolp', 'myeolh', 'myeom', 'myeob', 'myeobs', 'myeos', 'myeoss', 'myeong', 'myeoj', 'myeoc', 'myeok', 'myeot', 'myeop', 'myeoh', 'mye', 'myeg', 'myegg', 'myegs', 'myen', 'myenj', 'myenh', 'myed', 'myel', 'myelg', 'myelm', 'myelb', 'myels', 'myelt', 'myelp', 'myelh', 'myem', 'myeb', 'myebs', 'myes', 'myess', 'myeng', 'myej', 'myec', 'myek', 'myet', 'myep', 'myeh', 'mo', 'mog', 'mogg', 'mogs', 'mon', 'monj', 'monh', 'mod', 'mol', 'molg', 'molm', 'molb', 'mols', 'molt', 'molp', 'molh', 'mom', 'mob', 'mobs', 'mos', 'moss', 'mong', 'moj', 'moc', 'mok', 'mot', 'mop', 'moh', 'mwa', 'mwag', 'mwagg', 'mwags', 'mwan', 'mwanj', 'mwanh', 'mwad', 'mwal', 'mwalg', 'mwalm', 'mwalb', 'mwals', 'mwalt', 'mwalp', 'mwalh', 'mwam', 'mwab', 'mwabs', 'mwas', 'mwass', 'mwang', 'mwaj', 'mwac', 'mwak', 'mwat', 'mwap', 'mwah', 'mwae', 'mwaeg', 'mwaegg', 'mwaegs', 'mwaen', 'mwaenj', 'mwaenh', 'mwaed', 'mwael', 'mwaelg', 'mwaelm', 'mwaelb', 'mwaels', 'mwaelt', 'mwaelp', 'mwaelh', 'mwaem', 'mwaeb', 'mwaebs', 'mwaes', 'mwaess', 'mwaeng', 'mwaej', 'mwaec', 'mwaek', 'mwaet', 'mwaep', 'mwaeh', 'moe', 'moeg', 'moegg', 'moegs']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0bb.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0bb.php new file mode 100644 index 0000000..f5786e6 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0bb.php @@ -0,0 +1 @@ +<?php return ['moen', 'moenj', 'moenh', 'moed', 'moel', 'moelg', 'moelm', 'moelb', 'moels', 'moelt', 'moelp', 'moelh', 'moem', 'moeb', 'moebs', 'moes', 'moess', 'moeng', 'moej', 'moec', 'moek', 'moet', 'moep', 'moeh', 'myo', 'myog', 'myogg', 'myogs', 'myon', 'myonj', 'myonh', 'myod', 'myol', 'myolg', 'myolm', 'myolb', 'myols', 'myolt', 'myolp', 'myolh', 'myom', 'myob', 'myobs', 'myos', 'myoss', 'myong', 'myoj', 'myoc', 'myok', 'myot', 'myop', 'myoh', 'mu', 'mug', 'mugg', 'mugs', 'mun', 'munj', 'munh', 'mud', 'mul', 'mulg', 'mulm', 'mulb', 'muls', 'mult', 'mulp', 'mulh', 'mum', 'mub', 'mubs', 'mus', 'muss', 'mung', 'muj', 'muc', 'muk', 'mut', 'mup', 'muh', 'mweo', 'mweog', 'mweogg', 'mweogs', 'mweon', 'mweonj', 'mweonh', 'mweod', 'mweol', 'mweolg', 'mweolm', 'mweolb', 'mweols', 'mweolt', 'mweolp', 'mweolh', 'mweom', 'mweob', 'mweobs', 'mweos', 'mweoss', 'mweong', 'mweoj', 'mweoc', 'mweok', 'mweot', 'mweop', 'mweoh', 'mwe', 'mweg', 'mwegg', 'mwegs', 'mwen', 'mwenj', 'mwenh', 'mwed', 'mwel', 'mwelg', 'mwelm', 'mwelb', 'mwels', 'mwelt', 'mwelp', 'mwelh', 'mwem', 'mweb', 'mwebs', 'mwes', 'mwess', 'mweng', 'mwej', 'mwec', 'mwek', 'mwet', 'mwep', 'mweh', 'mwi', 'mwig', 'mwigg', 'mwigs', 'mwin', 'mwinj', 'mwinh', 'mwid', 'mwil', 'mwilg', 'mwilm', 'mwilb', 'mwils', 'mwilt', 'mwilp', 'mwilh', 'mwim', 'mwib', 'mwibs', 'mwis', 'mwiss', 'mwing', 'mwij', 'mwic', 'mwik', 'mwit', 'mwip', 'mwih', 'myu', 'myug', 'myugg', 'myugs', 'myun', 'myunj', 'myunh', 'myud', 'myul', 'myulg', 'myulm', 'myulb', 'myuls', 'myult', 'myulp', 'myulh', 'myum', 'myub', 'myubs', 'myus', 'myuss', 'myung', 'myuj', 'myuc', 'myuk', 'myut', 'myup', 'myuh', 'meu', 'meug', 'meugg', 'meugs', 'meun', 'meunj', 'meunh', 'meud', 'meul', 'meulg', 'meulm', 'meulb', 'meuls', 'meult', 'meulp', 'meulh', 'meum', 'meub', 'meubs', 'meus', 'meuss', 'meung', 'meuj', 'meuc', 'meuk', 'meut', 'meup', 'meuh', 'myi', 'myig', 'myigg', 'myigs', 'myin', 'myinj', 'myinh', 'myid', 'myil', 'myilg', 'myilm', 'myilb', 'myils', 'myilt', 'myilp', 'myilh', 'myim', 'myib', 'myibs', 'myis', 'myiss', 'mying', 'myij', 'myic', 'myik', 'myit', 'myip', 'myih', 'mi', 'mig', 'migg', 'migs', 'min', 'minj', 'minh', 'mid']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0bc.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0bc.php new file mode 100644 index 0000000..d4df6a2 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0bc.php @@ -0,0 +1 @@ +<?php return ['mil', 'milg', 'milm', 'milb', 'mils', 'milt', 'milp', 'milh', 'mim', 'mib', 'mibs', 'mis', 'miss', 'ming', 'mij', 'mic', 'mik', 'mit', 'mip', 'mih', 'ba', 'bag', 'bagg', 'bags', 'ban', 'banj', 'banh', 'bad', 'bal', 'balg', 'balm', 'balb', 'bals', 'balt', 'balp', 'balh', 'bam', 'bab', 'babs', 'bas', 'bass', 'bang', 'baj', 'bac', 'bak', 'bat', 'bap', 'bah', 'bae', 'baeg', 'baegg', 'baegs', 'baen', 'baenj', 'baenh', 'baed', 'bael', 'baelg', 'baelm', 'baelb', 'baels', 'baelt', 'baelp', 'baelh', 'baem', 'baeb', 'baebs', 'baes', 'baess', 'baeng', 'baej', 'baec', 'baek', 'baet', 'baep', 'baeh', 'bya', 'byag', 'byagg', 'byags', 'byan', 'byanj', 'byanh', 'byad', 'byal', 'byalg', 'byalm', 'byalb', 'byals', 'byalt', 'byalp', 'byalh', 'byam', 'byab', 'byabs', 'byas', 'byass', 'byang', 'byaj', 'byac', 'byak', 'byat', 'byap', 'byah', 'byae', 'byaeg', 'byaegg', 'byaegs', 'byaen', 'byaenj', 'byaenh', 'byaed', 'byael', 'byaelg', 'byaelm', 'byaelb', 'byaels', 'byaelt', 'byaelp', 'byaelh', 'byaem', 'byaeb', 'byaebs', 'byaes', 'byaess', 'byaeng', 'byaej', 'byaec', 'byaek', 'byaet', 'byaep', 'byaeh', 'beo', 'beog', 'beogg', 'beogs', 'beon', 'beonj', 'beonh', 'beod', 'beol', 'beolg', 'beolm', 'beolb', 'beols', 'beolt', 'beolp', 'beolh', 'beom', 'beob', 'beobs', 'beos', 'beoss', 'beong', 'beoj', 'beoc', 'beok', 'beot', 'beop', 'beoh', 'be', 'beg', 'begg', 'begs', 'ben', 'benj', 'benh', 'bed', 'bel', 'belg', 'belm', 'belb', 'bels', 'belt', 'belp', 'belh', 'bem', 'beb', 'bebs', 'bes', 'bess', 'beng', 'bej', 'bec', 'bek', 'bet', 'bep', 'beh', 'byeo', 'byeog', 'byeogg', 'byeogs', 'byeon', 'byeonj', 'byeonh', 'byeod', 'byeol', 'byeolg', 'byeolm', 'byeolb', 'byeols', 'byeolt', 'byeolp', 'byeolh', 'byeom', 'byeob', 'byeobs', 'byeos', 'byeoss', 'byeong', 'byeoj', 'byeoc', 'byeok', 'byeot', 'byeop', 'byeoh', 'bye', 'byeg', 'byegg', 'byegs', 'byen', 'byenj', 'byenh', 'byed', 'byel', 'byelg', 'byelm', 'byelb', 'byels', 'byelt', 'byelp', 'byelh', 'byem', 'byeb', 'byebs', 'byes', 'byess', 'byeng', 'byej', 'byec', 'byek', 'byet', 'byep', 'byeh', 'bo', 'bog', 'bogg', 'bogs', 'bon', 'bonj', 'bonh', 'bod', 'bol', 'bolg', 'bolm', 'bolb']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0bd.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0bd.php new file mode 100644 index 0000000..b5f2762 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0bd.php @@ -0,0 +1 @@ +<?php return ['bols', 'bolt', 'bolp', 'bolh', 'bom', 'bob', 'bobs', 'bos', 'boss', 'bong', 'boj', 'boc', 'bok', 'bot', 'bop', 'boh', 'bwa', 'bwag', 'bwagg', 'bwags', 'bwan', 'bwanj', 'bwanh', 'bwad', 'bwal', 'bwalg', 'bwalm', 'bwalb', 'bwals', 'bwalt', 'bwalp', 'bwalh', 'bwam', 'bwab', 'bwabs', 'bwas', 'bwass', 'bwang', 'bwaj', 'bwac', 'bwak', 'bwat', 'bwap', 'bwah', 'bwae', 'bwaeg', 'bwaegg', 'bwaegs', 'bwaen', 'bwaenj', 'bwaenh', 'bwaed', 'bwael', 'bwaelg', 'bwaelm', 'bwaelb', 'bwaels', 'bwaelt', 'bwaelp', 'bwaelh', 'bwaem', 'bwaeb', 'bwaebs', 'bwaes', 'bwaess', 'bwaeng', 'bwaej', 'bwaec', 'bwaek', 'bwaet', 'bwaep', 'bwaeh', 'boe', 'boeg', 'boegg', 'boegs', 'boen', 'boenj', 'boenh', 'boed', 'boel', 'boelg', 'boelm', 'boelb', 'boels', 'boelt', 'boelp', 'boelh', 'boem', 'boeb', 'boebs', 'boes', 'boess', 'boeng', 'boej', 'boec', 'boek', 'boet', 'boep', 'boeh', 'byo', 'byog', 'byogg', 'byogs', 'byon', 'byonj', 'byonh', 'byod', 'byol', 'byolg', 'byolm', 'byolb', 'byols', 'byolt', 'byolp', 'byolh', 'byom', 'byob', 'byobs', 'byos', 'byoss', 'byong', 'byoj', 'byoc', 'byok', 'byot', 'byop', 'byoh', 'bu', 'bug', 'bugg', 'bugs', 'bun', 'bunj', 'bunh', 'bud', 'bul', 'bulg', 'bulm', 'bulb', 'buls', 'bult', 'bulp', 'bulh', 'bum', 'bub', 'bubs', 'bus', 'buss', 'bung', 'buj', 'buc', 'buk', 'but', 'bup', 'buh', 'bweo', 'bweog', 'bweogg', 'bweogs', 'bweon', 'bweonj', 'bweonh', 'bweod', 'bweol', 'bweolg', 'bweolm', 'bweolb', 'bweols', 'bweolt', 'bweolp', 'bweolh', 'bweom', 'bweob', 'bweobs', 'bweos', 'bweoss', 'bweong', 'bweoj', 'bweoc', 'bweok', 'bweot', 'bweop', 'bweoh', 'bwe', 'bweg', 'bwegg', 'bwegs', 'bwen', 'bwenj', 'bwenh', 'bwed', 'bwel', 'bwelg', 'bwelm', 'bwelb', 'bwels', 'bwelt', 'bwelp', 'bwelh', 'bwem', 'bweb', 'bwebs', 'bwes', 'bwess', 'bweng', 'bwej', 'bwec', 'bwek', 'bwet', 'bwep', 'bweh', 'bwi', 'bwig', 'bwigg', 'bwigs', 'bwin', 'bwinj', 'bwinh', 'bwid', 'bwil', 'bwilg', 'bwilm', 'bwilb', 'bwils', 'bwilt', 'bwilp', 'bwilh', 'bwim', 'bwib', 'bwibs', 'bwis', 'bwiss', 'bwing', 'bwij', 'bwic', 'bwik', 'bwit', 'bwip', 'bwih', 'byu', 'byug', 'byugg', 'byugs', 'byun', 'byunj', 'byunh', 'byud', 'byul', 'byulg', 'byulm', 'byulb', 'byuls', 'byult', 'byulp', 'byulh']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0be.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0be.php new file mode 100644 index 0000000..bd68ab0 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0be.php @@ -0,0 +1 @@ +<?php return ['byum', 'byub', 'byubs', 'byus', 'byuss', 'byung', 'byuj', 'byuc', 'byuk', 'byut', 'byup', 'byuh', 'beu', 'beug', 'beugg', 'beugs', 'beun', 'beunj', 'beunh', 'beud', 'beul', 'beulg', 'beulm', 'beulb', 'beuls', 'beult', 'beulp', 'beulh', 'beum', 'beub', 'beubs', 'beus', 'beuss', 'beung', 'beuj', 'beuc', 'beuk', 'beut', 'beup', 'beuh', 'byi', 'byig', 'byigg', 'byigs', 'byin', 'byinj', 'byinh', 'byid', 'byil', 'byilg', 'byilm', 'byilb', 'byils', 'byilt', 'byilp', 'byilh', 'byim', 'byib', 'byibs', 'byis', 'byiss', 'bying', 'byij', 'byic', 'byik', 'byit', 'byip', 'byih', 'bi', 'big', 'bigg', 'bigs', 'bin', 'binj', 'binh', 'bid', 'bil', 'bilg', 'bilm', 'bilb', 'bils', 'bilt', 'bilp', 'bilh', 'bim', 'bib', 'bibs', 'bis', 'biss', 'bing', 'bij', 'bic', 'bik', 'bit', 'bip', 'bih', 'bba', 'bbag', 'bbagg', 'bbags', 'bban', 'bbanj', 'bbanh', 'bbad', 'bbal', 'bbalg', 'bbalm', 'bbalb', 'bbals', 'bbalt', 'bbalp', 'bbalh', 'bbam', 'bbab', 'bbabs', 'bbas', 'bbass', 'bbang', 'bbaj', 'bbac', 'bbak', 'bbat', 'bbap', 'bbah', 'bbae', 'bbaeg', 'bbaegg', 'bbaegs', 'bbaen', 'bbaenj', 'bbaenh', 'bbaed', 'bbael', 'bbaelg', 'bbaelm', 'bbaelb', 'bbaels', 'bbaelt', 'bbaelp', 'bbaelh', 'bbaem', 'bbaeb', 'bbaebs', 'bbaes', 'bbaess', 'bbaeng', 'bbaej', 'bbaec', 'bbaek', 'bbaet', 'bbaep', 'bbaeh', 'bbya', 'bbyag', 'bbyagg', 'bbyags', 'bbyan', 'bbyanj', 'bbyanh', 'bbyad', 'bbyal', 'bbyalg', 'bbyalm', 'bbyalb', 'bbyals', 'bbyalt', 'bbyalp', 'bbyalh', 'bbyam', 'bbyab', 'bbyabs', 'bbyas', 'bbyass', 'bbyang', 'bbyaj', 'bbyac', 'bbyak', 'bbyat', 'bbyap', 'bbyah', 'bbyae', 'bbyaeg', 'bbyaegg', 'bbyaegs', 'bbyaen', 'bbyaenj', 'bbyaenh', 'bbyaed', 'bbyael', 'bbyaelg', 'bbyaelm', 'bbyaelb', 'bbyaels', 'bbyaelt', 'bbyaelp', 'bbyaelh', 'bbyaem', 'bbyaeb', 'bbyaebs', 'bbyaes', 'bbyaess', 'bbyaeng', 'bbyaej', 'bbyaec', 'bbyaek', 'bbyaet', 'bbyaep', 'bbyaeh', 'bbeo', 'bbeog', 'bbeogg', 'bbeogs', 'bbeon', 'bbeonj', 'bbeonh', 'bbeod', 'bbeol', 'bbeolg', 'bbeolm', 'bbeolb', 'bbeols', 'bbeolt', 'bbeolp', 'bbeolh', 'bbeom', 'bbeob', 'bbeobs', 'bbeos', 'bbeoss', 'bbeong', 'bbeoj', 'bbeoc', 'bbeok', 'bbeot', 'bbeop', 'bbeoh', 'bbe', 'bbeg', 'bbegg', 'bbegs', 'bben', 'bbenj', 'bbenh', 'bbed', 'bbel', 'bbelg', 'bbelm', 'bbelb', 'bbels', 'bbelt', 'bbelp', 'bbelh', 'bbem', 'bbeb', 'bbebs', 'bbes']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0bf.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0bf.php new file mode 100644 index 0000000..ddca88e --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0bf.php @@ -0,0 +1 @@ +<?php return ['bbess', 'bbeng', 'bbej', 'bbec', 'bbek', 'bbet', 'bbep', 'bbeh', 'bbyeo', 'bbyeog', 'bbyeogg', 'bbyeogs', 'bbyeon', 'bbyeonj', 'bbyeonh', 'bbyeod', 'bbyeol', 'bbyeolg', 'bbyeolm', 'bbyeolb', 'bbyeols', 'bbyeolt', 'bbyeolp', 'bbyeolh', 'bbyeom', 'bbyeob', 'bbyeobs', 'bbyeos', 'bbyeoss', 'bbyeong', 'bbyeoj', 'bbyeoc', 'bbyeok', 'bbyeot', 'bbyeop', 'bbyeoh', 'bbye', 'bbyeg', 'bbyegg', 'bbyegs', 'bbyen', 'bbyenj', 'bbyenh', 'bbyed', 'bbyel', 'bbyelg', 'bbyelm', 'bbyelb', 'bbyels', 'bbyelt', 'bbyelp', 'bbyelh', 'bbyem', 'bbyeb', 'bbyebs', 'bbyes', 'bbyess', 'bbyeng', 'bbyej', 'bbyec', 'bbyek', 'bbyet', 'bbyep', 'bbyeh', 'bbo', 'bbog', 'bbogg', 'bbogs', 'bbon', 'bbonj', 'bbonh', 'bbod', 'bbol', 'bbolg', 'bbolm', 'bbolb', 'bbols', 'bbolt', 'bbolp', 'bbolh', 'bbom', 'bbob', 'bbobs', 'bbos', 'bboss', 'bbong', 'bboj', 'bboc', 'bbok', 'bbot', 'bbop', 'bboh', 'bbwa', 'bbwag', 'bbwagg', 'bbwags', 'bbwan', 'bbwanj', 'bbwanh', 'bbwad', 'bbwal', 'bbwalg', 'bbwalm', 'bbwalb', 'bbwals', 'bbwalt', 'bbwalp', 'bbwalh', 'bbwam', 'bbwab', 'bbwabs', 'bbwas', 'bbwass', 'bbwang', 'bbwaj', 'bbwac', 'bbwak', 'bbwat', 'bbwap', 'bbwah', 'bbwae', 'bbwaeg', 'bbwaegg', 'bbwaegs', 'bbwaen', 'bbwaenj', 'bbwaenh', 'bbwaed', 'bbwael', 'bbwaelg', 'bbwaelm', 'bbwaelb', 'bbwaels', 'bbwaelt', 'bbwaelp', 'bbwaelh', 'bbwaem', 'bbwaeb', 'bbwaebs', 'bbwaes', 'bbwaess', 'bbwaeng', 'bbwaej', 'bbwaec', 'bbwaek', 'bbwaet', 'bbwaep', 'bbwaeh', 'bboe', 'bboeg', 'bboegg', 'bboegs', 'bboen', 'bboenj', 'bboenh', 'bboed', 'bboel', 'bboelg', 'bboelm', 'bboelb', 'bboels', 'bboelt', 'bboelp', 'bboelh', 'bboem', 'bboeb', 'bboebs', 'bboes', 'bboess', 'bboeng', 'bboej', 'bboec', 'bboek', 'bboet', 'bboep', 'bboeh', 'bbyo', 'bbyog', 'bbyogg', 'bbyogs', 'bbyon', 'bbyonj', 'bbyonh', 'bbyod', 'bbyol', 'bbyolg', 'bbyolm', 'bbyolb', 'bbyols', 'bbyolt', 'bbyolp', 'bbyolh', 'bbyom', 'bbyob', 'bbyobs', 'bbyos', 'bbyoss', 'bbyong', 'bbyoj', 'bbyoc', 'bbyok', 'bbyot', 'bbyop', 'bbyoh', 'bbu', 'bbug', 'bbugg', 'bbugs', 'bbun', 'bbunj', 'bbunh', 'bbud', 'bbul', 'bbulg', 'bbulm', 'bbulb', 'bbuls', 'bbult', 'bbulp', 'bbulh', 'bbum', 'bbub', 'bbubs', 'bbus', 'bbuss', 'bbung', 'bbuj', 'bbuc', 'bbuk', 'bbut', 'bbup', 'bbuh', 'bbweo', 'bbweog', 'bbweogg', 'bbweogs', 'bbweon', 'bbweonj', 'bbweonh', 'bbweod', 'bbweol', 'bbweolg', 'bbweolm', 'bbweolb', 'bbweols', 'bbweolt', 'bbweolp', 'bbweolh', 'bbweom', 'bbweob', 'bbweobs', 'bbweos', 'bbweoss', 'bbweong', 'bbweoj', 'bbweoc']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c0.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c0.php new file mode 100644 index 0000000..c664e3e --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c0.php @@ -0,0 +1 @@ +<?php return ['bbweok', 'bbweot', 'bbweop', 'bbweoh', 'bbwe', 'bbweg', 'bbwegg', 'bbwegs', 'bbwen', 'bbwenj', 'bbwenh', 'bbwed', 'bbwel', 'bbwelg', 'bbwelm', 'bbwelb', 'bbwels', 'bbwelt', 'bbwelp', 'bbwelh', 'bbwem', 'bbweb', 'bbwebs', 'bbwes', 'bbwess', 'bbweng', 'bbwej', 'bbwec', 'bbwek', 'bbwet', 'bbwep', 'bbweh', 'bbwi', 'bbwig', 'bbwigg', 'bbwigs', 'bbwin', 'bbwinj', 'bbwinh', 'bbwid', 'bbwil', 'bbwilg', 'bbwilm', 'bbwilb', 'bbwils', 'bbwilt', 'bbwilp', 'bbwilh', 'bbwim', 'bbwib', 'bbwibs', 'bbwis', 'bbwiss', 'bbwing', 'bbwij', 'bbwic', 'bbwik', 'bbwit', 'bbwip', 'bbwih', 'bbyu', 'bbyug', 'bbyugg', 'bbyugs', 'bbyun', 'bbyunj', 'bbyunh', 'bbyud', 'bbyul', 'bbyulg', 'bbyulm', 'bbyulb', 'bbyuls', 'bbyult', 'bbyulp', 'bbyulh', 'bbyum', 'bbyub', 'bbyubs', 'bbyus', 'bbyuss', 'bbyung', 'bbyuj', 'bbyuc', 'bbyuk', 'bbyut', 'bbyup', 'bbyuh', 'bbeu', 'bbeug', 'bbeugg', 'bbeugs', 'bbeun', 'bbeunj', 'bbeunh', 'bbeud', 'bbeul', 'bbeulg', 'bbeulm', 'bbeulb', 'bbeuls', 'bbeult', 'bbeulp', 'bbeulh', 'bbeum', 'bbeub', 'bbeubs', 'bbeus', 'bbeuss', 'bbeung', 'bbeuj', 'bbeuc', 'bbeuk', 'bbeut', 'bbeup', 'bbeuh', 'bbyi', 'bbyig', 'bbyigg', 'bbyigs', 'bbyin', 'bbyinj', 'bbyinh', 'bbyid', 'bbyil', 'bbyilg', 'bbyilm', 'bbyilb', 'bbyils', 'bbyilt', 'bbyilp', 'bbyilh', 'bbyim', 'bbyib', 'bbyibs', 'bbyis', 'bbyiss', 'bbying', 'bbyij', 'bbyic', 'bbyik', 'bbyit', 'bbyip', 'bbyih', 'bbi', 'bbig', 'bbigg', 'bbigs', 'bbin', 'bbinj', 'bbinh', 'bbid', 'bbil', 'bbilg', 'bbilm', 'bbilb', 'bbils', 'bbilt', 'bbilp', 'bbilh', 'bbim', 'bbib', 'bbibs', 'bbis', 'bbiss', 'bbing', 'bbij', 'bbic', 'bbik', 'bbit', 'bbip', 'bbih', 'sa', 'sag', 'sagg', 'sags', 'san', 'sanj', 'sanh', 'sad', 'sal', 'salg', 'salm', 'salb', 'sals', 'salt', 'salp', 'salh', 'sam', 'sab', 'sabs', 'sas', 'sass', 'sang', 'saj', 'sac', 'sak', 'sat', 'sap', 'sah', 'sae', 'saeg', 'saegg', 'saegs', 'saen', 'saenj', 'saenh', 'saed', 'sael', 'saelg', 'saelm', 'saelb', 'saels', 'saelt', 'saelp', 'saelh', 'saem', 'saeb', 'saebs', 'saes', 'saess', 'saeng', 'saej', 'saec', 'saek', 'saet', 'saep', 'saeh', 'sya', 'syag', 'syagg', 'syags', 'syan', 'syanj', 'syanh', 'syad', 'syal', 'syalg', 'syalm', 'syalb', 'syals', 'syalt', 'syalp', 'syalh', 'syam', 'syab', 'syabs', 'syas', 'syass', 'syang', 'syaj', 'syac', 'syak', 'syat', 'syap', 'syah']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c1.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c1.php new file mode 100644 index 0000000..03bf4af --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c1.php @@ -0,0 +1 @@ +<?php return ['syae', 'syaeg', 'syaegg', 'syaegs', 'syaen', 'syaenj', 'syaenh', 'syaed', 'syael', 'syaelg', 'syaelm', 'syaelb', 'syaels', 'syaelt', 'syaelp', 'syaelh', 'syaem', 'syaeb', 'syaebs', 'syaes', 'syaess', 'syaeng', 'syaej', 'syaec', 'syaek', 'syaet', 'syaep', 'syaeh', 'seo', 'seog', 'seogg', 'seogs', 'seon', 'seonj', 'seonh', 'seod', 'seol', 'seolg', 'seolm', 'seolb', 'seols', 'seolt', 'seolp', 'seolh', 'seom', 'seob', 'seobs', 'seos', 'seoss', 'seong', 'seoj', 'seoc', 'seok', 'seot', 'seop', 'seoh', 'se', 'seg', 'segg', 'segs', 'sen', 'senj', 'senh', 'sed', 'sel', 'selg', 'selm', 'selb', 'sels', 'selt', 'selp', 'selh', 'sem', 'seb', 'sebs', 'ses', 'sess', 'seng', 'sej', 'sec', 'sek', 'set', 'sep', 'seh', 'syeo', 'syeog', 'syeogg', 'syeogs', 'syeon', 'syeonj', 'syeonh', 'syeod', 'syeol', 'syeolg', 'syeolm', 'syeolb', 'syeols', 'syeolt', 'syeolp', 'syeolh', 'syeom', 'syeob', 'syeobs', 'syeos', 'syeoss', 'syeong', 'syeoj', 'syeoc', 'syeok', 'syeot', 'syeop', 'syeoh', 'sye', 'syeg', 'syegg', 'syegs', 'syen', 'syenj', 'syenh', 'syed', 'syel', 'syelg', 'syelm', 'syelb', 'syels', 'syelt', 'syelp', 'syelh', 'syem', 'syeb', 'syebs', 'syes', 'syess', 'syeng', 'syej', 'syec', 'syek', 'syet', 'syep', 'syeh', 'so', 'sog', 'sogg', 'sogs', 'son', 'sonj', 'sonh', 'sod', 'sol', 'solg', 'solm', 'solb', 'sols', 'solt', 'solp', 'solh', 'som', 'sob', 'sobs', 'sos', 'soss', 'song', 'soj', 'soc', 'sok', 'sot', 'sop', 'soh', 'swa', 'swag', 'swagg', 'swags', 'swan', 'swanj', 'swanh', 'swad', 'swal', 'swalg', 'swalm', 'swalb', 'swals', 'swalt', 'swalp', 'swalh', 'swam', 'swab', 'swabs', 'swas', 'swass', 'swang', 'swaj', 'swac', 'swak', 'swat', 'swap', 'swah', 'swae', 'swaeg', 'swaegg', 'swaegs', 'swaen', 'swaenj', 'swaenh', 'swaed', 'swael', 'swaelg', 'swaelm', 'swaelb', 'swaels', 'swaelt', 'swaelp', 'swaelh', 'swaem', 'swaeb', 'swaebs', 'swaes', 'swaess', 'swaeng', 'swaej', 'swaec', 'swaek', 'swaet', 'swaep', 'swaeh', 'soe', 'soeg', 'soegg', 'soegs', 'soen', 'soenj', 'soenh', 'soed', 'soel', 'soelg', 'soelm', 'soelb', 'soels', 'soelt', 'soelp', 'soelh', 'soem', 'soeb', 'soebs', 'soes', 'soess', 'soeng', 'soej', 'soec', 'soek', 'soet', 'soep', 'soeh', 'syo', 'syog', 'syogg', 'syogs']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c2.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c2.php new file mode 100644 index 0000000..5d87b6d --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c2.php @@ -0,0 +1 @@ +<?php return ['syon', 'syonj', 'syonh', 'syod', 'syol', 'syolg', 'syolm', 'syolb', 'syols', 'syolt', 'syolp', 'syolh', 'syom', 'syob', 'syobs', 'syos', 'syoss', 'syong', 'syoj', 'syoc', 'syok', 'syot', 'syop', 'syoh', 'su', 'sug', 'sugg', 'sugs', 'sun', 'sunj', 'sunh', 'sud', 'sul', 'sulg', 'sulm', 'sulb', 'suls', 'sult', 'sulp', 'sulh', 'sum', 'sub', 'subs', 'sus', 'suss', 'sung', 'suj', 'suc', 'suk', 'sut', 'sup', 'suh', 'sweo', 'sweog', 'sweogg', 'sweogs', 'sweon', 'sweonj', 'sweonh', 'sweod', 'sweol', 'sweolg', 'sweolm', 'sweolb', 'sweols', 'sweolt', 'sweolp', 'sweolh', 'sweom', 'sweob', 'sweobs', 'sweos', 'sweoss', 'sweong', 'sweoj', 'sweoc', 'sweok', 'sweot', 'sweop', 'sweoh', 'swe', 'sweg', 'swegg', 'swegs', 'swen', 'swenj', 'swenh', 'swed', 'swel', 'swelg', 'swelm', 'swelb', 'swels', 'swelt', 'swelp', 'swelh', 'swem', 'sweb', 'swebs', 'swes', 'swess', 'sweng', 'swej', 'swec', 'swek', 'swet', 'swep', 'sweh', 'swi', 'swig', 'swigg', 'swigs', 'swin', 'swinj', 'swinh', 'swid', 'swil', 'swilg', 'swilm', 'swilb', 'swils', 'swilt', 'swilp', 'swilh', 'swim', 'swib', 'swibs', 'swis', 'swiss', 'swing', 'swij', 'swic', 'swik', 'swit', 'swip', 'swih', 'syu', 'syug', 'syugg', 'syugs', 'syun', 'syunj', 'syunh', 'syud', 'syul', 'syulg', 'syulm', 'syulb', 'syuls', 'syult', 'syulp', 'syulh', 'syum', 'syub', 'syubs', 'syus', 'syuss', 'syung', 'syuj', 'syuc', 'syuk', 'syut', 'syup', 'syuh', 'seu', 'seug', 'seugg', 'seugs', 'seun', 'seunj', 'seunh', 'seud', 'seul', 'seulg', 'seulm', 'seulb', 'seuls', 'seult', 'seulp', 'seulh', 'seum', 'seub', 'seubs', 'seus', 'seuss', 'seung', 'seuj', 'seuc', 'seuk', 'seut', 'seup', 'seuh', 'syi', 'syig', 'syigg', 'syigs', 'syin', 'syinj', 'syinh', 'syid', 'syil', 'syilg', 'syilm', 'syilb', 'syils', 'syilt', 'syilp', 'syilh', 'syim', 'syib', 'syibs', 'syis', 'syiss', 'sying', 'syij', 'syic', 'syik', 'syit', 'syip', 'syih', 'si', 'sig', 'sigg', 'sigs', 'sin', 'sinj', 'sinh', 'sid', 'sil', 'silg', 'silm', 'silb', 'sils', 'silt', 'silp', 'silh', 'sim', 'sib', 'sibs', 'sis', 'siss', 'sing', 'sij', 'sic', 'sik', 'sit', 'sip', 'sih', 'ssa', 'ssag', 'ssagg', 'ssags', 'ssan', 'ssanj', 'ssanh', 'ssad']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c3.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c3.php new file mode 100644 index 0000000..d038f56 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c3.php @@ -0,0 +1 @@ +<?php return ['ssal', 'ssalg', 'ssalm', 'ssalb', 'ssals', 'ssalt', 'ssalp', 'ssalh', 'ssam', 'ssab', 'ssabs', 'ssas', 'ssass', 'ssang', 'ssaj', 'ssac', 'ssak', 'ssat', 'ssap', 'ssah', 'ssae', 'ssaeg', 'ssaegg', 'ssaegs', 'ssaen', 'ssaenj', 'ssaenh', 'ssaed', 'ssael', 'ssaelg', 'ssaelm', 'ssaelb', 'ssaels', 'ssaelt', 'ssaelp', 'ssaelh', 'ssaem', 'ssaeb', 'ssaebs', 'ssaes', 'ssaess', 'ssaeng', 'ssaej', 'ssaec', 'ssaek', 'ssaet', 'ssaep', 'ssaeh', 'ssya', 'ssyag', 'ssyagg', 'ssyags', 'ssyan', 'ssyanj', 'ssyanh', 'ssyad', 'ssyal', 'ssyalg', 'ssyalm', 'ssyalb', 'ssyals', 'ssyalt', 'ssyalp', 'ssyalh', 'ssyam', 'ssyab', 'ssyabs', 'ssyas', 'ssyass', 'ssyang', 'ssyaj', 'ssyac', 'ssyak', 'ssyat', 'ssyap', 'ssyah', 'ssyae', 'ssyaeg', 'ssyaegg', 'ssyaegs', 'ssyaen', 'ssyaenj', 'ssyaenh', 'ssyaed', 'ssyael', 'ssyaelg', 'ssyaelm', 'ssyaelb', 'ssyaels', 'ssyaelt', 'ssyaelp', 'ssyaelh', 'ssyaem', 'ssyaeb', 'ssyaebs', 'ssyaes', 'ssyaess', 'ssyaeng', 'ssyaej', 'ssyaec', 'ssyaek', 'ssyaet', 'ssyaep', 'ssyaeh', 'sseo', 'sseog', 'sseogg', 'sseogs', 'sseon', 'sseonj', 'sseonh', 'sseod', 'sseol', 'sseolg', 'sseolm', 'sseolb', 'sseols', 'sseolt', 'sseolp', 'sseolh', 'sseom', 'sseob', 'sseobs', 'sseos', 'sseoss', 'sseong', 'sseoj', 'sseoc', 'sseok', 'sseot', 'sseop', 'sseoh', 'sse', 'sseg', 'ssegg', 'ssegs', 'ssen', 'ssenj', 'ssenh', 'ssed', 'ssel', 'sselg', 'sselm', 'sselb', 'ssels', 'sselt', 'sselp', 'sselh', 'ssem', 'sseb', 'ssebs', 'sses', 'ssess', 'sseng', 'ssej', 'ssec', 'ssek', 'sset', 'ssep', 'sseh', 'ssyeo', 'ssyeog', 'ssyeogg', 'ssyeogs', 'ssyeon', 'ssyeonj', 'ssyeonh', 'ssyeod', 'ssyeol', 'ssyeolg', 'ssyeolm', 'ssyeolb', 'ssyeols', 'ssyeolt', 'ssyeolp', 'ssyeolh', 'ssyeom', 'ssyeob', 'ssyeobs', 'ssyeos', 'ssyeoss', 'ssyeong', 'ssyeoj', 'ssyeoc', 'ssyeok', 'ssyeot', 'ssyeop', 'ssyeoh', 'ssye', 'ssyeg', 'ssyegg', 'ssyegs', 'ssyen', 'ssyenj', 'ssyenh', 'ssyed', 'ssyel', 'ssyelg', 'ssyelm', 'ssyelb', 'ssyels', 'ssyelt', 'ssyelp', 'ssyelh', 'ssyem', 'ssyeb', 'ssyebs', 'ssyes', 'ssyess', 'ssyeng', 'ssyej', 'ssyec', 'ssyek', 'ssyet', 'ssyep', 'ssyeh', 'sso', 'ssog', 'ssogg', 'ssogs', 'sson', 'ssonj', 'ssonh', 'ssod', 'ssol', 'ssolg', 'ssolm', 'ssolb', 'ssols', 'ssolt', 'ssolp', 'ssolh', 'ssom', 'ssob', 'ssobs', 'ssos', 'ssoss', 'ssong', 'ssoj', 'ssoc', 'ssok', 'ssot', 'ssop', 'ssoh', 'sswa', 'sswag', 'sswagg', 'sswags', 'sswan', 'sswanj', 'sswanh', 'sswad', 'sswal', 'sswalg', 'sswalm', 'sswalb']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c4.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c4.php new file mode 100644 index 0000000..e234341 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c4.php @@ -0,0 +1 @@ +<?php return ['sswals', 'sswalt', 'sswalp', 'sswalh', 'sswam', 'sswab', 'sswabs', 'sswas', 'sswass', 'sswang', 'sswaj', 'sswac', 'sswak', 'sswat', 'sswap', 'sswah', 'sswae', 'sswaeg', 'sswaegg', 'sswaegs', 'sswaen', 'sswaenj', 'sswaenh', 'sswaed', 'sswael', 'sswaelg', 'sswaelm', 'sswaelb', 'sswaels', 'sswaelt', 'sswaelp', 'sswaelh', 'sswaem', 'sswaeb', 'sswaebs', 'sswaes', 'sswaess', 'sswaeng', 'sswaej', 'sswaec', 'sswaek', 'sswaet', 'sswaep', 'sswaeh', 'ssoe', 'ssoeg', 'ssoegg', 'ssoegs', 'ssoen', 'ssoenj', 'ssoenh', 'ssoed', 'ssoel', 'ssoelg', 'ssoelm', 'ssoelb', 'ssoels', 'ssoelt', 'ssoelp', 'ssoelh', 'ssoem', 'ssoeb', 'ssoebs', 'ssoes', 'ssoess', 'ssoeng', 'ssoej', 'ssoec', 'ssoek', 'ssoet', 'ssoep', 'ssoeh', 'ssyo', 'ssyog', 'ssyogg', 'ssyogs', 'ssyon', 'ssyonj', 'ssyonh', 'ssyod', 'ssyol', 'ssyolg', 'ssyolm', 'ssyolb', 'ssyols', 'ssyolt', 'ssyolp', 'ssyolh', 'ssyom', 'ssyob', 'ssyobs', 'ssyos', 'ssyoss', 'ssyong', 'ssyoj', 'ssyoc', 'ssyok', 'ssyot', 'ssyop', 'ssyoh', 'ssu', 'ssug', 'ssugg', 'ssugs', 'ssun', 'ssunj', 'ssunh', 'ssud', 'ssul', 'ssulg', 'ssulm', 'ssulb', 'ssuls', 'ssult', 'ssulp', 'ssulh', 'ssum', 'ssub', 'ssubs', 'ssus', 'ssuss', 'ssung', 'ssuj', 'ssuc', 'ssuk', 'ssut', 'ssup', 'ssuh', 'ssweo', 'ssweog', 'ssweogg', 'ssweogs', 'ssweon', 'ssweonj', 'ssweonh', 'ssweod', 'ssweol', 'ssweolg', 'ssweolm', 'ssweolb', 'ssweols', 'ssweolt', 'ssweolp', 'ssweolh', 'ssweom', 'ssweob', 'ssweobs', 'ssweos', 'ssweoss', 'ssweong', 'ssweoj', 'ssweoc', 'ssweok', 'ssweot', 'ssweop', 'ssweoh', 'sswe', 'ssweg', 'sswegg', 'sswegs', 'sswen', 'sswenj', 'sswenh', 'sswed', 'sswel', 'sswelg', 'sswelm', 'sswelb', 'sswels', 'sswelt', 'sswelp', 'sswelh', 'sswem', 'ssweb', 'sswebs', 'sswes', 'sswess', 'ssweng', 'sswej', 'sswec', 'sswek', 'sswet', 'sswep', 'ssweh', 'sswi', 'sswig', 'sswigg', 'sswigs', 'sswin', 'sswinj', 'sswinh', 'sswid', 'sswil', 'sswilg', 'sswilm', 'sswilb', 'sswils', 'sswilt', 'sswilp', 'sswilh', 'sswim', 'sswib', 'sswibs', 'sswis', 'sswiss', 'sswing', 'sswij', 'sswic', 'sswik', 'sswit', 'sswip', 'sswih', 'ssyu', 'ssyug', 'ssyugg', 'ssyugs', 'ssyun', 'ssyunj', 'ssyunh', 'ssyud', 'ssyul', 'ssyulg', 'ssyulm', 'ssyulb', 'ssyuls', 'ssyult', 'ssyulp', 'ssyulh', 'ssyum', 'ssyub', 'ssyubs', 'ssyus', 'ssyuss', 'ssyung', 'ssyuj', 'ssyuc', 'ssyuk', 'ssyut', 'ssyup', 'ssyuh', 'sseu', 'sseug', 'sseugg', 'sseugs', 'sseun', 'sseunj', 'sseunh', 'sseud', 'sseul', 'sseulg', 'sseulm', 'sseulb', 'sseuls', 'sseult', 'sseulp', 'sseulh']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c5.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c5.php new file mode 100644 index 0000000..90c8fbd --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c5.php @@ -0,0 +1 @@ +<?php return ['sseum', 'sseub', 'sseubs', 'sseus', 'sseuss', 'sseung', 'sseuj', 'sseuc', 'sseuk', 'sseut', 'sseup', 'sseuh', 'ssyi', 'ssyig', 'ssyigg', 'ssyigs', 'ssyin', 'ssyinj', 'ssyinh', 'ssyid', 'ssyil', 'ssyilg', 'ssyilm', 'ssyilb', 'ssyils', 'ssyilt', 'ssyilp', 'ssyilh', 'ssyim', 'ssyib', 'ssyibs', 'ssyis', 'ssyiss', 'ssying', 'ssyij', 'ssyic', 'ssyik', 'ssyit', 'ssyip', 'ssyih', 'ssi', 'ssig', 'ssigg', 'ssigs', 'ssin', 'ssinj', 'ssinh', 'ssid', 'ssil', 'ssilg', 'ssilm', 'ssilb', 'ssils', 'ssilt', 'ssilp', 'ssilh', 'ssim', 'ssib', 'ssibs', 'ssis', 'ssiss', 'ssing', 'ssij', 'ssic', 'ssik', 'ssit', 'ssip', 'ssih', 'a', 'ag', 'agg', 'ags', 'an', 'anj', 'anh', 'ad', 'al', 'alg', 'alm', 'alb', 'als', 'alt', 'alp', 'alh', 'am', 'ab', 'abs', 'as', 'ass', 'ang', 'aj', 'ac', 'ak', 'at', 'ap', 'ah', 'ae', 'aeg', 'aegg', 'aegs', 'aen', 'aenj', 'aenh', 'aed', 'ael', 'aelg', 'aelm', 'aelb', 'aels', 'aelt', 'aelp', 'aelh', 'aem', 'aeb', 'aebs', 'aes', 'aess', 'aeng', 'aej', 'aec', 'aek', 'aet', 'aep', 'aeh', 'ya', 'yag', 'yagg', 'yags', 'yan', 'yanj', 'yanh', 'yad', 'yal', 'yalg', 'yalm', 'yalb', 'yals', 'yalt', 'yalp', 'yalh', 'yam', 'yab', 'yabs', 'yas', 'yass', 'yang', 'yaj', 'yac', 'yak', 'yat', 'yap', 'yah', 'yae', 'yaeg', 'yaegg', 'yaegs', 'yaen', 'yaenj', 'yaenh', 'yaed', 'yael', 'yaelg', 'yaelm', 'yaelb', 'yaels', 'yaelt', 'yaelp', 'yaelh', 'yaem', 'yaeb', 'yaebs', 'yaes', 'yaess', 'yaeng', 'yaej', 'yaec', 'yaek', 'yaet', 'yaep', 'yaeh', 'eo', 'eog', 'eogg', 'eogs', 'eon', 'eonj', 'eonh', 'eod', 'eol', 'eolg', 'eolm', 'eolb', 'eols', 'eolt', 'eolp', 'eolh', 'eom', 'eob', 'eobs', 'eos', 'eoss', 'eong', 'eoj', 'eoc', 'eok', 'eot', 'eop', 'eoh', 'e', 'eg', 'egg', 'egs', 'en', 'enj', 'enh', 'ed', 'el', 'elg', 'elm', 'elb', 'els', 'elt', 'elp', 'elh', 'em', 'eb', 'ebs', 'es', 'ess', 'eng', 'ej', 'ec', 'ek', 'et', 'ep', 'eh', 'yeo', 'yeog', 'yeogg', 'yeogs', 'yeon', 'yeonj', 'yeonh', 'yeod', 'yeol', 'yeolg', 'yeolm', 'yeolb', 'yeols', 'yeolt', 'yeolp', 'yeolh', 'yeom', 'yeob', 'yeobs', 'yeos']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c6.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c6.php new file mode 100644 index 0000000..5e5993a --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c6.php @@ -0,0 +1 @@ +<?php return ['yeoss', 'yeong', 'yeoj', 'yeoc', 'yeok', 'yeot', 'yeop', 'yeoh', 'ye', 'yeg', 'yegg', 'yegs', 'yen', 'yenj', 'yenh', 'yed', 'yel', 'yelg', 'yelm', 'yelb', 'yels', 'yelt', 'yelp', 'yelh', 'yem', 'yeb', 'yebs', 'yes', 'yess', 'yeng', 'yej', 'yec', 'yek', 'yet', 'yep', 'yeh', 'o', 'og', 'ogg', 'ogs', 'on', 'onj', 'onh', 'od', 'ol', 'olg', 'olm', 'olb', 'ols', 'olt', 'olp', 'olh', 'om', 'ob', 'obs', 'os', 'oss', 'ong', 'oj', 'oc', 'ok', 'ot', 'op', 'oh', 'wa', 'wag', 'wagg', 'wags', 'wan', 'wanj', 'wanh', 'wad', 'wal', 'walg', 'walm', 'walb', 'wals', 'walt', 'walp', 'walh', 'wam', 'wab', 'wabs', 'was', 'wass', 'wang', 'waj', 'wac', 'wak', 'wat', 'wap', 'wah', 'wae', 'waeg', 'waegg', 'waegs', 'waen', 'waenj', 'waenh', 'waed', 'wael', 'waelg', 'waelm', 'waelb', 'waels', 'waelt', 'waelp', 'waelh', 'waem', 'waeb', 'waebs', 'waes', 'waess', 'waeng', 'waej', 'waec', 'waek', 'waet', 'waep', 'waeh', 'oe', 'oeg', 'oegg', 'oegs', 'oen', 'oenj', 'oenh', 'oed', 'oel', 'oelg', 'oelm', 'oelb', 'oels', 'oelt', 'oelp', 'oelh', 'oem', 'oeb', 'oebs', 'oes', 'oess', 'oeng', 'oej', 'oec', 'oek', 'oet', 'oep', 'oeh', 'yo', 'yog', 'yogg', 'yogs', 'yon', 'yonj', 'yonh', 'yod', 'yol', 'yolg', 'yolm', 'yolb', 'yols', 'yolt', 'yolp', 'yolh', 'yom', 'yob', 'yobs', 'yos', 'yoss', 'yong', 'yoj', 'yoc', 'yok', 'yot', 'yop', 'yoh', 'u', 'ug', 'ugg', 'ugs', 'un', 'unj', 'unh', 'ud', 'ul', 'ulg', 'ulm', 'ulb', 'uls', 'ult', 'ulp', 'ulh', 'um', 'ub', 'ubs', 'us', 'uss', 'ung', 'uj', 'uc', 'uk', 'ut', 'up', 'uh', 'weo', 'weog', 'weogg', 'weogs', 'weon', 'weonj', 'weonh', 'weod', 'weol', 'weolg', 'weolm', 'weolb', 'weols', 'weolt', 'weolp', 'weolh', 'weom', 'weob', 'weobs', 'weos', 'weoss', 'weong', 'weoj', 'weoc', 'weok', 'weot', 'weop', 'weoh', 'we', 'weg', 'wegg', 'wegs', 'wen', 'wenj', 'wenh', 'wed', 'wel', 'welg', 'welm', 'welb', 'wels', 'welt', 'welp', 'welh', 'wem', 'web', 'webs', 'wes', 'wess', 'weng', 'wej', 'wec']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c7.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c7.php new file mode 100644 index 0000000..3c006a4 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c7.php @@ -0,0 +1 @@ +<?php return ['wek', 'wet', 'wep', 'weh', 'wi', 'wig', 'wigg', 'wigs', 'win', 'winj', 'winh', 'wid', 'wil', 'wilg', 'wilm', 'wilb', 'wils', 'wilt', 'wilp', 'wilh', 'wim', 'wib', 'wibs', 'wis', 'wiss', 'wing', 'wij', 'wic', 'wik', 'wit', 'wip', 'wih', 'yu', 'yug', 'yugg', 'yugs', 'yun', 'yunj', 'yunh', 'yud', 'yul', 'yulg', 'yulm', 'yulb', 'yuls', 'yult', 'yulp', 'yulh', 'yum', 'yub', 'yubs', 'yus', 'yuss', 'yung', 'yuj', 'yuc', 'yuk', 'yut', 'yup', 'yuh', 'eu', 'eug', 'eugg', 'eugs', 'eun', 'eunj', 'eunh', 'eud', 'eul', 'eulg', 'eulm', 'eulb', 'euls', 'eult', 'eulp', 'eulh', 'eum', 'eub', 'eubs', 'eus', 'euss', 'eung', 'euj', 'euc', 'euk', 'eut', 'eup', 'euh', 'yi', 'yig', 'yigg', 'yigs', 'yin', 'yinj', 'yinh', 'yid', 'yil', 'yilg', 'yilm', 'yilb', 'yils', 'yilt', 'yilp', 'yilh', 'yim', 'yib', 'yibs', 'yis', 'yiss', 'ying', 'yij', 'yic', 'yik', 'yit', 'yip', 'yih', 'i', 'ig', 'igg', 'igs', 'in', 'inj', 'inh', 'id', 'il', 'ilg', 'ilm', 'ilb', 'ils', 'ilt', 'ilp', 'ilh', 'im', 'ib', 'ibs', 'is', 'iss', 'ing', 'ij', 'ic', 'ik', 'it', 'ip', 'ih', 'ja', 'jag', 'jagg', 'jags', 'jan', 'janj', 'janh', 'jad', 'jal', 'jalg', 'jalm', 'jalb', 'jals', 'jalt', 'jalp', 'jalh', 'jam', 'jab', 'jabs', 'jas', 'jass', 'jang', 'jaj', 'jac', 'jak', 'jat', 'jap', 'jah', 'jae', 'jaeg', 'jaegg', 'jaegs', 'jaen', 'jaenj', 'jaenh', 'jaed', 'jael', 'jaelg', 'jaelm', 'jaelb', 'jaels', 'jaelt', 'jaelp', 'jaelh', 'jaem', 'jaeb', 'jaebs', 'jaes', 'jaess', 'jaeng', 'jaej', 'jaec', 'jaek', 'jaet', 'jaep', 'jaeh', 'jya', 'jyag', 'jyagg', 'jyags', 'jyan', 'jyanj', 'jyanh', 'jyad', 'jyal', 'jyalg', 'jyalm', 'jyalb', 'jyals', 'jyalt', 'jyalp', 'jyalh', 'jyam', 'jyab', 'jyabs', 'jyas', 'jyass', 'jyang', 'jyaj', 'jyac', 'jyak', 'jyat', 'jyap', 'jyah', 'jyae', 'jyaeg', 'jyaegg', 'jyaegs', 'jyaen', 'jyaenj', 'jyaenh', 'jyaed', 'jyael', 'jyaelg', 'jyaelm', 'jyaelb', 'jyaels', 'jyaelt', 'jyaelp', 'jyaelh', 'jyaem', 'jyaeb', 'jyaebs', 'jyaes', 'jyaess', 'jyaeng', 'jyaej', 'jyaec', 'jyaek', 'jyaet', 'jyaep', 'jyaeh']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c8.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c8.php new file mode 100644 index 0000000..9111386 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c8.php @@ -0,0 +1 @@ +<?php return ['jeo', 'jeog', 'jeogg', 'jeogs', 'jeon', 'jeonj', 'jeonh', 'jeod', 'jeol', 'jeolg', 'jeolm', 'jeolb', 'jeols', 'jeolt', 'jeolp', 'jeolh', 'jeom', 'jeob', 'jeobs', 'jeos', 'jeoss', 'jeong', 'jeoj', 'jeoc', 'jeok', 'jeot', 'jeop', 'jeoh', 'je', 'jeg', 'jegg', 'jegs', 'jen', 'jenj', 'jenh', 'jed', 'jel', 'jelg', 'jelm', 'jelb', 'jels', 'jelt', 'jelp', 'jelh', 'jem', 'jeb', 'jebs', 'jes', 'jess', 'jeng', 'jej', 'jec', 'jek', 'jet', 'jep', 'jeh', 'jyeo', 'jyeog', 'jyeogg', 'jyeogs', 'jyeon', 'jyeonj', 'jyeonh', 'jyeod', 'jyeol', 'jyeolg', 'jyeolm', 'jyeolb', 'jyeols', 'jyeolt', 'jyeolp', 'jyeolh', 'jyeom', 'jyeob', 'jyeobs', 'jyeos', 'jyeoss', 'jyeong', 'jyeoj', 'jyeoc', 'jyeok', 'jyeot', 'jyeop', 'jyeoh', 'jye', 'jyeg', 'jyegg', 'jyegs', 'jyen', 'jyenj', 'jyenh', 'jyed', 'jyel', 'jyelg', 'jyelm', 'jyelb', 'jyels', 'jyelt', 'jyelp', 'jyelh', 'jyem', 'jyeb', 'jyebs', 'jyes', 'jyess', 'jyeng', 'jyej', 'jyec', 'jyek', 'jyet', 'jyep', 'jyeh', 'jo', 'jog', 'jogg', 'jogs', 'jon', 'jonj', 'jonh', 'jod', 'jol', 'jolg', 'jolm', 'jolb', 'jols', 'jolt', 'jolp', 'jolh', 'jom', 'job', 'jobs', 'jos', 'joss', 'jong', 'joj', 'joc', 'jok', 'jot', 'jop', 'joh', 'jwa', 'jwag', 'jwagg', 'jwags', 'jwan', 'jwanj', 'jwanh', 'jwad', 'jwal', 'jwalg', 'jwalm', 'jwalb', 'jwals', 'jwalt', 'jwalp', 'jwalh', 'jwam', 'jwab', 'jwabs', 'jwas', 'jwass', 'jwang', 'jwaj', 'jwac', 'jwak', 'jwat', 'jwap', 'jwah', 'jwae', 'jwaeg', 'jwaegg', 'jwaegs', 'jwaen', 'jwaenj', 'jwaenh', 'jwaed', 'jwael', 'jwaelg', 'jwaelm', 'jwaelb', 'jwaels', 'jwaelt', 'jwaelp', 'jwaelh', 'jwaem', 'jwaeb', 'jwaebs', 'jwaes', 'jwaess', 'jwaeng', 'jwaej', 'jwaec', 'jwaek', 'jwaet', 'jwaep', 'jwaeh', 'joe', 'joeg', 'joegg', 'joegs', 'joen', 'joenj', 'joenh', 'joed', 'joel', 'joelg', 'joelm', 'joelb', 'joels', 'joelt', 'joelp', 'joelh', 'joem', 'joeb', 'joebs', 'joes', 'joess', 'joeng', 'joej', 'joec', 'joek', 'joet', 'joep', 'joeh', 'jyo', 'jyog', 'jyogg', 'jyogs', 'jyon', 'jyonj', 'jyonh', 'jyod', 'jyol', 'jyolg', 'jyolm', 'jyolb', 'jyols', 'jyolt', 'jyolp', 'jyolh', 'jyom', 'jyob', 'jyobs', 'jyos', 'jyoss', 'jyong', 'jyoj', 'jyoc', 'jyok', 'jyot', 'jyop', 'jyoh', 'ju', 'jug', 'jugg', 'jugs']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0c9.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0c9.php new file mode 100644 index 0000000..31c8973 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0c9.php @@ -0,0 +1 @@ +<?php return ['jun', 'junj', 'junh', 'jud', 'jul', 'julg', 'julm', 'julb', 'juls', 'jult', 'julp', 'julh', 'jum', 'jub', 'jubs', 'jus', 'juss', 'jung', 'juj', 'juc', 'juk', 'jut', 'jup', 'juh', 'jweo', 'jweog', 'jweogg', 'jweogs', 'jweon', 'jweonj', 'jweonh', 'jweod', 'jweol', 'jweolg', 'jweolm', 'jweolb', 'jweols', 'jweolt', 'jweolp', 'jweolh', 'jweom', 'jweob', 'jweobs', 'jweos', 'jweoss', 'jweong', 'jweoj', 'jweoc', 'jweok', 'jweot', 'jweop', 'jweoh', 'jwe', 'jweg', 'jwegg', 'jwegs', 'jwen', 'jwenj', 'jwenh', 'jwed', 'jwel', 'jwelg', 'jwelm', 'jwelb', 'jwels', 'jwelt', 'jwelp', 'jwelh', 'jwem', 'jweb', 'jwebs', 'jwes', 'jwess', 'jweng', 'jwej', 'jwec', 'jwek', 'jwet', 'jwep', 'jweh', 'jwi', 'jwig', 'jwigg', 'jwigs', 'jwin', 'jwinj', 'jwinh', 'jwid', 'jwil', 'jwilg', 'jwilm', 'jwilb', 'jwils', 'jwilt', 'jwilp', 'jwilh', 'jwim', 'jwib', 'jwibs', 'jwis', 'jwiss', 'jwing', 'jwij', 'jwic', 'jwik', 'jwit', 'jwip', 'jwih', 'jyu', 'jyug', 'jyugg', 'jyugs', 'jyun', 'jyunj', 'jyunh', 'jyud', 'jyul', 'jyulg', 'jyulm', 'jyulb', 'jyuls', 'jyult', 'jyulp', 'jyulh', 'jyum', 'jyub', 'jyubs', 'jyus', 'jyuss', 'jyung', 'jyuj', 'jyuc', 'jyuk', 'jyut', 'jyup', 'jyuh', 'jeu', 'jeug', 'jeugg', 'jeugs', 'jeun', 'jeunj', 'jeunh', 'jeud', 'jeul', 'jeulg', 'jeulm', 'jeulb', 'jeuls', 'jeult', 'jeulp', 'jeulh', 'jeum', 'jeub', 'jeubs', 'jeus', 'jeuss', 'jeung', 'jeuj', 'jeuc', 'jeuk', 'jeut', 'jeup', 'jeuh', 'jyi', 'jyig', 'jyigg', 'jyigs', 'jyin', 'jyinj', 'jyinh', 'jyid', 'jyil', 'jyilg', 'jyilm', 'jyilb', 'jyils', 'jyilt', 'jyilp', 'jyilh', 'jyim', 'jyib', 'jyibs', 'jyis', 'jyiss', 'jying', 'jyij', 'jyic', 'jyik', 'jyit', 'jyip', 'jyih', 'ji', 'jig', 'jigg', 'jigs', 'jin', 'jinj', 'jinh', 'jid', 'jil', 'jilg', 'jilm', 'jilb', 'jils', 'jilt', 'jilp', 'jilh', 'jim', 'jib', 'jibs', 'jis', 'jiss', 'jing', 'jij', 'jic', 'jik', 'jit', 'jip', 'jih', 'jja', 'jjag', 'jjagg', 'jjags', 'jjan', 'jjanj', 'jjanh', 'jjad', 'jjal', 'jjalg', 'jjalm', 'jjalb', 'jjals', 'jjalt', 'jjalp', 'jjalh', 'jjam', 'jjab', 'jjabs', 'jjas', 'jjass', 'jjang', 'jjaj', 'jjac', 'jjak', 'jjat', 'jjap', 'jjah', 'jjae', 'jjaeg', 'jjaegg', 'jjaegs', 'jjaen', 'jjaenj', 'jjaenh', 'jjaed']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0ca.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0ca.php new file mode 100644 index 0000000..79bb944 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0ca.php @@ -0,0 +1 @@ +<?php return ['jjael', 'jjaelg', 'jjaelm', 'jjaelb', 'jjaels', 'jjaelt', 'jjaelp', 'jjaelh', 'jjaem', 'jjaeb', 'jjaebs', 'jjaes', 'jjaess', 'jjaeng', 'jjaej', 'jjaec', 'jjaek', 'jjaet', 'jjaep', 'jjaeh', 'jjya', 'jjyag', 'jjyagg', 'jjyags', 'jjyan', 'jjyanj', 'jjyanh', 'jjyad', 'jjyal', 'jjyalg', 'jjyalm', 'jjyalb', 'jjyals', 'jjyalt', 'jjyalp', 'jjyalh', 'jjyam', 'jjyab', 'jjyabs', 'jjyas', 'jjyass', 'jjyang', 'jjyaj', 'jjyac', 'jjyak', 'jjyat', 'jjyap', 'jjyah', 'jjyae', 'jjyaeg', 'jjyaegg', 'jjyaegs', 'jjyaen', 'jjyaenj', 'jjyaenh', 'jjyaed', 'jjyael', 'jjyaelg', 'jjyaelm', 'jjyaelb', 'jjyaels', 'jjyaelt', 'jjyaelp', 'jjyaelh', 'jjyaem', 'jjyaeb', 'jjyaebs', 'jjyaes', 'jjyaess', 'jjyaeng', 'jjyaej', 'jjyaec', 'jjyaek', 'jjyaet', 'jjyaep', 'jjyaeh', 'jjeo', 'jjeog', 'jjeogg', 'jjeogs', 'jjeon', 'jjeonj', 'jjeonh', 'jjeod', 'jjeol', 'jjeolg', 'jjeolm', 'jjeolb', 'jjeols', 'jjeolt', 'jjeolp', 'jjeolh', 'jjeom', 'jjeob', 'jjeobs', 'jjeos', 'jjeoss', 'jjeong', 'jjeoj', 'jjeoc', 'jjeok', 'jjeot', 'jjeop', 'jjeoh', 'jje', 'jjeg', 'jjegg', 'jjegs', 'jjen', 'jjenj', 'jjenh', 'jjed', 'jjel', 'jjelg', 'jjelm', 'jjelb', 'jjels', 'jjelt', 'jjelp', 'jjelh', 'jjem', 'jjeb', 'jjebs', 'jjes', 'jjess', 'jjeng', 'jjej', 'jjec', 'jjek', 'jjet', 'jjep', 'jjeh', 'jjyeo', 'jjyeog', 'jjyeogg', 'jjyeogs', 'jjyeon', 'jjyeonj', 'jjyeonh', 'jjyeod', 'jjyeol', 'jjyeolg', 'jjyeolm', 'jjyeolb', 'jjyeols', 'jjyeolt', 'jjyeolp', 'jjyeolh', 'jjyeom', 'jjyeob', 'jjyeobs', 'jjyeos', 'jjyeoss', 'jjyeong', 'jjyeoj', 'jjyeoc', 'jjyeok', 'jjyeot', 'jjyeop', 'jjyeoh', 'jjye', 'jjyeg', 'jjyegg', 'jjyegs', 'jjyen', 'jjyenj', 'jjyenh', 'jjyed', 'jjyel', 'jjyelg', 'jjyelm', 'jjyelb', 'jjyels', 'jjyelt', 'jjyelp', 'jjyelh', 'jjyem', 'jjyeb', 'jjyebs', 'jjyes', 'jjyess', 'jjyeng', 'jjyej', 'jjyec', 'jjyek', 'jjyet', 'jjyep', 'jjyeh', 'jjo', 'jjog', 'jjogg', 'jjogs', 'jjon', 'jjonj', 'jjonh', 'jjod', 'jjol', 'jjolg', 'jjolm', 'jjolb', 'jjols', 'jjolt', 'jjolp', 'jjolh', 'jjom', 'jjob', 'jjobs', 'jjos', 'jjoss', 'jjong', 'jjoj', 'jjoc', 'jjok', 'jjot', 'jjop', 'jjoh', 'jjwa', 'jjwag', 'jjwagg', 'jjwags', 'jjwan', 'jjwanj', 'jjwanh', 'jjwad', 'jjwal', 'jjwalg', 'jjwalm', 'jjwalb', 'jjwals', 'jjwalt', 'jjwalp', 'jjwalh', 'jjwam', 'jjwab', 'jjwabs', 'jjwas', 'jjwass', 'jjwang', 'jjwaj', 'jjwac', 'jjwak', 'jjwat', 'jjwap', 'jjwah', 'jjwae', 'jjwaeg', 'jjwaegg', 'jjwaegs', 'jjwaen', 'jjwaenj', 'jjwaenh', 'jjwaed', 'jjwael', 'jjwaelg', 'jjwaelm', 'jjwaelb']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0cb.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0cb.php new file mode 100644 index 0000000..117a8dd --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0cb.php @@ -0,0 +1 @@ +<?php return ['jjwaels', 'jjwaelt', 'jjwaelp', 'jjwaelh', 'jjwaem', 'jjwaeb', 'jjwaebs', 'jjwaes', 'jjwaess', 'jjwaeng', 'jjwaej', 'jjwaec', 'jjwaek', 'jjwaet', 'jjwaep', 'jjwaeh', 'jjoe', 'jjoeg', 'jjoegg', 'jjoegs', 'jjoen', 'jjoenj', 'jjoenh', 'jjoed', 'jjoel', 'jjoelg', 'jjoelm', 'jjoelb', 'jjoels', 'jjoelt', 'jjoelp', 'jjoelh', 'jjoem', 'jjoeb', 'jjoebs', 'jjoes', 'jjoess', 'jjoeng', 'jjoej', 'jjoec', 'jjoek', 'jjoet', 'jjoep', 'jjoeh', 'jjyo', 'jjyog', 'jjyogg', 'jjyogs', 'jjyon', 'jjyonj', 'jjyonh', 'jjyod', 'jjyol', 'jjyolg', 'jjyolm', 'jjyolb', 'jjyols', 'jjyolt', 'jjyolp', 'jjyolh', 'jjyom', 'jjyob', 'jjyobs', 'jjyos', 'jjyoss', 'jjyong', 'jjyoj', 'jjyoc', 'jjyok', 'jjyot', 'jjyop', 'jjyoh', 'jju', 'jjug', 'jjugg', 'jjugs', 'jjun', 'jjunj', 'jjunh', 'jjud', 'jjul', 'jjulg', 'jjulm', 'jjulb', 'jjuls', 'jjult', 'jjulp', 'jjulh', 'jjum', 'jjub', 'jjubs', 'jjus', 'jjuss', 'jjung', 'jjuj', 'jjuc', 'jjuk', 'jjut', 'jjup', 'jjuh', 'jjweo', 'jjweog', 'jjweogg', 'jjweogs', 'jjweon', 'jjweonj', 'jjweonh', 'jjweod', 'jjweol', 'jjweolg', 'jjweolm', 'jjweolb', 'jjweols', 'jjweolt', 'jjweolp', 'jjweolh', 'jjweom', 'jjweob', 'jjweobs', 'jjweos', 'jjweoss', 'jjweong', 'jjweoj', 'jjweoc', 'jjweok', 'jjweot', 'jjweop', 'jjweoh', 'jjwe', 'jjweg', 'jjwegg', 'jjwegs', 'jjwen', 'jjwenj', 'jjwenh', 'jjwed', 'jjwel', 'jjwelg', 'jjwelm', 'jjwelb', 'jjwels', 'jjwelt', 'jjwelp', 'jjwelh', 'jjwem', 'jjweb', 'jjwebs', 'jjwes', 'jjwess', 'jjweng', 'jjwej', 'jjwec', 'jjwek', 'jjwet', 'jjwep', 'jjweh', 'jjwi', 'jjwig', 'jjwigg', 'jjwigs', 'jjwin', 'jjwinj', 'jjwinh', 'jjwid', 'jjwil', 'jjwilg', 'jjwilm', 'jjwilb', 'jjwils', 'jjwilt', 'jjwilp', 'jjwilh', 'jjwim', 'jjwib', 'jjwibs', 'jjwis', 'jjwiss', 'jjwing', 'jjwij', 'jjwic', 'jjwik', 'jjwit', 'jjwip', 'jjwih', 'jjyu', 'jjyug', 'jjyugg', 'jjyugs', 'jjyun', 'jjyunj', 'jjyunh', 'jjyud', 'jjyul', 'jjyulg', 'jjyulm', 'jjyulb', 'jjyuls', 'jjyult', 'jjyulp', 'jjyulh', 'jjyum', 'jjyub', 'jjyubs', 'jjyus', 'jjyuss', 'jjyung', 'jjyuj', 'jjyuc', 'jjyuk', 'jjyut', 'jjyup', 'jjyuh', 'jjeu', 'jjeug', 'jjeugg', 'jjeugs', 'jjeun', 'jjeunj', 'jjeunh', 'jjeud', 'jjeul', 'jjeulg', 'jjeulm', 'jjeulb', 'jjeuls', 'jjeult', 'jjeulp', 'jjeulh', 'jjeum', 'jjeub', 'jjeubs', 'jjeus', 'jjeuss', 'jjeung', 'jjeuj', 'jjeuc', 'jjeuk', 'jjeut', 'jjeup', 'jjeuh', 'jjyi', 'jjyig', 'jjyigg', 'jjyigs', 'jjyin', 'jjyinj', 'jjyinh', 'jjyid', 'jjyil', 'jjyilg', 'jjyilm', 'jjyilb', 'jjyils', 'jjyilt', 'jjyilp', 'jjyilh']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0cc.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0cc.php new file mode 100644 index 0000000..7d38e9c --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0cc.php @@ -0,0 +1 @@ +<?php return ['jjyim', 'jjyib', 'jjyibs', 'jjyis', 'jjyiss', 'jjying', 'jjyij', 'jjyic', 'jjyik', 'jjyit', 'jjyip', 'jjyih', 'jji', 'jjig', 'jjigg', 'jjigs', 'jjin', 'jjinj', 'jjinh', 'jjid', 'jjil', 'jjilg', 'jjilm', 'jjilb', 'jjils', 'jjilt', 'jjilp', 'jjilh', 'jjim', 'jjib', 'jjibs', 'jjis', 'jjiss', 'jjing', 'jjij', 'jjic', 'jjik', 'jjit', 'jjip', 'jjih', 'ca', 'cag', 'cagg', 'cags', 'can', 'canj', 'canh', 'cad', 'cal', 'calg', 'calm', 'calb', 'cals', 'calt', 'calp', 'calh', 'cam', 'cab', 'cabs', 'cas', 'cass', 'cang', 'caj', 'cac', 'cak', 'cat', 'cap', 'cah', 'cae', 'caeg', 'caegg', 'caegs', 'caen', 'caenj', 'caenh', 'caed', 'cael', 'caelg', 'caelm', 'caelb', 'caels', 'caelt', 'caelp', 'caelh', 'caem', 'caeb', 'caebs', 'caes', 'caess', 'caeng', 'caej', 'caec', 'caek', 'caet', 'caep', 'caeh', 'cya', 'cyag', 'cyagg', 'cyags', 'cyan', 'cyanj', 'cyanh', 'cyad', 'cyal', 'cyalg', 'cyalm', 'cyalb', 'cyals', 'cyalt', 'cyalp', 'cyalh', 'cyam', 'cyab', 'cyabs', 'cyas', 'cyass', 'cyang', 'cyaj', 'cyac', 'cyak', 'cyat', 'cyap', 'cyah', 'cyae', 'cyaeg', 'cyaegg', 'cyaegs', 'cyaen', 'cyaenj', 'cyaenh', 'cyaed', 'cyael', 'cyaelg', 'cyaelm', 'cyaelb', 'cyaels', 'cyaelt', 'cyaelp', 'cyaelh', 'cyaem', 'cyaeb', 'cyaebs', 'cyaes', 'cyaess', 'cyaeng', 'cyaej', 'cyaec', 'cyaek', 'cyaet', 'cyaep', 'cyaeh', 'ceo', 'ceog', 'ceogg', 'ceogs', 'ceon', 'ceonj', 'ceonh', 'ceod', 'ceol', 'ceolg', 'ceolm', 'ceolb', 'ceols', 'ceolt', 'ceolp', 'ceolh', 'ceom', 'ceob', 'ceobs', 'ceos', 'ceoss', 'ceong', 'ceoj', 'ceoc', 'ceok', 'ceot', 'ceop', 'ceoh', 'ce', 'ceg', 'cegg', 'cegs', 'cen', 'cenj', 'cenh', 'ced', 'cel', 'celg', 'celm', 'celb', 'cels', 'celt', 'celp', 'celh', 'cem', 'ceb', 'cebs', 'ces', 'cess', 'ceng', 'cej', 'cec', 'cek', 'cet', 'cep', 'ceh', 'cyeo', 'cyeog', 'cyeogg', 'cyeogs', 'cyeon', 'cyeonj', 'cyeonh', 'cyeod', 'cyeol', 'cyeolg', 'cyeolm', 'cyeolb', 'cyeols', 'cyeolt', 'cyeolp', 'cyeolh', 'cyeom', 'cyeob', 'cyeobs', 'cyeos', 'cyeoss', 'cyeong', 'cyeoj', 'cyeoc', 'cyeok', 'cyeot', 'cyeop', 'cyeoh', 'cye', 'cyeg', 'cyegg', 'cyegs', 'cyen', 'cyenj', 'cyenh', 'cyed', 'cyel', 'cyelg', 'cyelm', 'cyelb', 'cyels', 'cyelt', 'cyelp', 'cyelh', 'cyem', 'cyeb', 'cyebs', 'cyes']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0cd.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0cd.php new file mode 100644 index 0000000..f40bb64 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0cd.php @@ -0,0 +1 @@ +<?php return ['cyess', 'cyeng', 'cyej', 'cyec', 'cyek', 'cyet', 'cyep', 'cyeh', 'co', 'cog', 'cogg', 'cogs', 'con', 'conj', 'conh', 'cod', 'col', 'colg', 'colm', 'colb', 'cols', 'colt', 'colp', 'colh', 'com', 'cob', 'cobs', 'cos', 'coss', 'cong', 'coj', 'coc', 'cok', 'cot', 'cop', 'coh', 'cwa', 'cwag', 'cwagg', 'cwags', 'cwan', 'cwanj', 'cwanh', 'cwad', 'cwal', 'cwalg', 'cwalm', 'cwalb', 'cwals', 'cwalt', 'cwalp', 'cwalh', 'cwam', 'cwab', 'cwabs', 'cwas', 'cwass', 'cwang', 'cwaj', 'cwac', 'cwak', 'cwat', 'cwap', 'cwah', 'cwae', 'cwaeg', 'cwaegg', 'cwaegs', 'cwaen', 'cwaenj', 'cwaenh', 'cwaed', 'cwael', 'cwaelg', 'cwaelm', 'cwaelb', 'cwaels', 'cwaelt', 'cwaelp', 'cwaelh', 'cwaem', 'cwaeb', 'cwaebs', 'cwaes', 'cwaess', 'cwaeng', 'cwaej', 'cwaec', 'cwaek', 'cwaet', 'cwaep', 'cwaeh', 'coe', 'coeg', 'coegg', 'coegs', 'coen', 'coenj', 'coenh', 'coed', 'coel', 'coelg', 'coelm', 'coelb', 'coels', 'coelt', 'coelp', 'coelh', 'coem', 'coeb', 'coebs', 'coes', 'coess', 'coeng', 'coej', 'coec', 'coek', 'coet', 'coep', 'coeh', 'cyo', 'cyog', 'cyogg', 'cyogs', 'cyon', 'cyonj', 'cyonh', 'cyod', 'cyol', 'cyolg', 'cyolm', 'cyolb', 'cyols', 'cyolt', 'cyolp', 'cyolh', 'cyom', 'cyob', 'cyobs', 'cyos', 'cyoss', 'cyong', 'cyoj', 'cyoc', 'cyok', 'cyot', 'cyop', 'cyoh', 'cu', 'cug', 'cugg', 'cugs', 'cun', 'cunj', 'cunh', 'cud', 'cul', 'culg', 'culm', 'culb', 'culs', 'cult', 'culp', 'culh', 'cum', 'cub', 'cubs', 'cus', 'cuss', 'cung', 'cuj', 'cuc', 'cuk', 'cut', 'cup', 'cuh', 'cweo', 'cweog', 'cweogg', 'cweogs', 'cweon', 'cweonj', 'cweonh', 'cweod', 'cweol', 'cweolg', 'cweolm', 'cweolb', 'cweols', 'cweolt', 'cweolp', 'cweolh', 'cweom', 'cweob', 'cweobs', 'cweos', 'cweoss', 'cweong', 'cweoj', 'cweoc', 'cweok', 'cweot', 'cweop', 'cweoh', 'cwe', 'cweg', 'cwegg', 'cwegs', 'cwen', 'cwenj', 'cwenh', 'cwed', 'cwel', 'cwelg', 'cwelm', 'cwelb', 'cwels', 'cwelt', 'cwelp', 'cwelh', 'cwem', 'cweb', 'cwebs', 'cwes', 'cwess', 'cweng', 'cwej', 'cwec', 'cwek', 'cwet', 'cwep', 'cweh', 'cwi', 'cwig', 'cwigg', 'cwigs', 'cwin', 'cwinj', 'cwinh', 'cwid', 'cwil', 'cwilg', 'cwilm', 'cwilb', 'cwils', 'cwilt', 'cwilp', 'cwilh', 'cwim', 'cwib', 'cwibs', 'cwis', 'cwiss', 'cwing', 'cwij', 'cwic']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0ce.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0ce.php new file mode 100644 index 0000000..92e8b2d --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0ce.php @@ -0,0 +1 @@ +<?php return ['cwik', 'cwit', 'cwip', 'cwih', 'cyu', 'cyug', 'cyugg', 'cyugs', 'cyun', 'cyunj', 'cyunh', 'cyud', 'cyul', 'cyulg', 'cyulm', 'cyulb', 'cyuls', 'cyult', 'cyulp', 'cyulh', 'cyum', 'cyub', 'cyubs', 'cyus', 'cyuss', 'cyung', 'cyuj', 'cyuc', 'cyuk', 'cyut', 'cyup', 'cyuh', 'ceu', 'ceug', 'ceugg', 'ceugs', 'ceun', 'ceunj', 'ceunh', 'ceud', 'ceul', 'ceulg', 'ceulm', 'ceulb', 'ceuls', 'ceult', 'ceulp', 'ceulh', 'ceum', 'ceub', 'ceubs', 'ceus', 'ceuss', 'ceung', 'ceuj', 'ceuc', 'ceuk', 'ceut', 'ceup', 'ceuh', 'cyi', 'cyig', 'cyigg', 'cyigs', 'cyin', 'cyinj', 'cyinh', 'cyid', 'cyil', 'cyilg', 'cyilm', 'cyilb', 'cyils', 'cyilt', 'cyilp', 'cyilh', 'cyim', 'cyib', 'cyibs', 'cyis', 'cyiss', 'cying', 'cyij', 'cyic', 'cyik', 'cyit', 'cyip', 'cyih', 'ci', 'cig', 'cigg', 'cigs', 'cin', 'cinj', 'cinh', 'cid', 'cil', 'cilg', 'cilm', 'cilb', 'cils', 'cilt', 'cilp', 'cilh', 'cim', 'cib', 'cibs', 'cis', 'ciss', 'cing', 'cij', 'cic', 'cik', 'cit', 'cip', 'cih', 'ka', 'kag', 'kagg', 'kags', 'kan', 'kanj', 'kanh', 'kad', 'kal', 'kalg', 'kalm', 'kalb', 'kals', 'kalt', 'kalp', 'kalh', 'kam', 'kab', 'kabs', 'kas', 'kass', 'kang', 'kaj', 'kac', 'kak', 'kat', 'kap', 'kah', 'kae', 'kaeg', 'kaegg', 'kaegs', 'kaen', 'kaenj', 'kaenh', 'kaed', 'kael', 'kaelg', 'kaelm', 'kaelb', 'kaels', 'kaelt', 'kaelp', 'kaelh', 'kaem', 'kaeb', 'kaebs', 'kaes', 'kaess', 'kaeng', 'kaej', 'kaec', 'kaek', 'kaet', 'kaep', 'kaeh', 'kya', 'kyag', 'kyagg', 'kyags', 'kyan', 'kyanj', 'kyanh', 'kyad', 'kyal', 'kyalg', 'kyalm', 'kyalb', 'kyals', 'kyalt', 'kyalp', 'kyalh', 'kyam', 'kyab', 'kyabs', 'kyas', 'kyass', 'kyang', 'kyaj', 'kyac', 'kyak', 'kyat', 'kyap', 'kyah', 'kyae', 'kyaeg', 'kyaegg', 'kyaegs', 'kyaen', 'kyaenj', 'kyaenh', 'kyaed', 'kyael', 'kyaelg', 'kyaelm', 'kyaelb', 'kyaels', 'kyaelt', 'kyaelp', 'kyaelh', 'kyaem', 'kyaeb', 'kyaebs', 'kyaes', 'kyaess', 'kyaeng', 'kyaej', 'kyaec', 'kyaek', 'kyaet', 'kyaep', 'kyaeh', 'keo', 'keog', 'keogg', 'keogs', 'keon', 'keonj', 'keonh', 'keod', 'keol', 'keolg', 'keolm', 'keolb', 'keols', 'keolt', 'keolp', 'keolh', 'keom', 'keob', 'keobs', 'keos', 'keoss', 'keong', 'keoj', 'keoc', 'keok', 'keot', 'keop', 'keoh']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0cf.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0cf.php new file mode 100644 index 0000000..607d1e1 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0cf.php @@ -0,0 +1 @@ +<?php return ['ke', 'keg', 'kegg', 'kegs', 'ken', 'kenj', 'kenh', 'ked', 'kel', 'kelg', 'kelm', 'kelb', 'kels', 'kelt', 'kelp', 'kelh', 'kem', 'keb', 'kebs', 'kes', 'kess', 'keng', 'kej', 'kec', 'kek', 'ket', 'kep', 'keh', 'kyeo', 'kyeog', 'kyeogg', 'kyeogs', 'kyeon', 'kyeonj', 'kyeonh', 'kyeod', 'kyeol', 'kyeolg', 'kyeolm', 'kyeolb', 'kyeols', 'kyeolt', 'kyeolp', 'kyeolh', 'kyeom', 'kyeob', 'kyeobs', 'kyeos', 'kyeoss', 'kyeong', 'kyeoj', 'kyeoc', 'kyeok', 'kyeot', 'kyeop', 'kyeoh', 'kye', 'kyeg', 'kyegg', 'kyegs', 'kyen', 'kyenj', 'kyenh', 'kyed', 'kyel', 'kyelg', 'kyelm', 'kyelb', 'kyels', 'kyelt', 'kyelp', 'kyelh', 'kyem', 'kyeb', 'kyebs', 'kyes', 'kyess', 'kyeng', 'kyej', 'kyec', 'kyek', 'kyet', 'kyep', 'kyeh', 'ko', 'kog', 'kogg', 'kogs', 'kon', 'konj', 'konh', 'kod', 'kol', 'kolg', 'kolm', 'kolb', 'kols', 'kolt', 'kolp', 'kolh', 'kom', 'kob', 'kobs', 'kos', 'koss', 'kong', 'koj', 'koc', 'kok', 'kot', 'kop', 'koh', 'kwa', 'kwag', 'kwagg', 'kwags', 'kwan', 'kwanj', 'kwanh', 'kwad', 'kwal', 'kwalg', 'kwalm', 'kwalb', 'kwals', 'kwalt', 'kwalp', 'kwalh', 'kwam', 'kwab', 'kwabs', 'kwas', 'kwass', 'kwang', 'kwaj', 'kwac', 'kwak', 'kwat', 'kwap', 'kwah', 'kwae', 'kwaeg', 'kwaegg', 'kwaegs', 'kwaen', 'kwaenj', 'kwaenh', 'kwaed', 'kwael', 'kwaelg', 'kwaelm', 'kwaelb', 'kwaels', 'kwaelt', 'kwaelp', 'kwaelh', 'kwaem', 'kwaeb', 'kwaebs', 'kwaes', 'kwaess', 'kwaeng', 'kwaej', 'kwaec', 'kwaek', 'kwaet', 'kwaep', 'kwaeh', 'koe', 'koeg', 'koegg', 'koegs', 'koen', 'koenj', 'koenh', 'koed', 'koel', 'koelg', 'koelm', 'koelb', 'koels', 'koelt', 'koelp', 'koelh', 'koem', 'koeb', 'koebs', 'koes', 'koess', 'koeng', 'koej', 'koec', 'koek', 'koet', 'koep', 'koeh', 'kyo', 'kyog', 'kyogg', 'kyogs', 'kyon', 'kyonj', 'kyonh', 'kyod', 'kyol', 'kyolg', 'kyolm', 'kyolb', 'kyols', 'kyolt', 'kyolp', 'kyolh', 'kyom', 'kyob', 'kyobs', 'kyos', 'kyoss', 'kyong', 'kyoj', 'kyoc', 'kyok', 'kyot', 'kyop', 'kyoh', 'ku', 'kug', 'kugg', 'kugs', 'kun', 'kunj', 'kunh', 'kud', 'kul', 'kulg', 'kulm', 'kulb', 'kuls', 'kult', 'kulp', 'kulh', 'kum', 'kub', 'kubs', 'kus', 'kuss', 'kung', 'kuj', 'kuc', 'kuk', 'kut', 'kup', 'kuh', 'kweo', 'kweog', 'kweogg', 'kweogs']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0d0.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0d0.php new file mode 100644 index 0000000..f921793 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0d0.php @@ -0,0 +1 @@ +<?php return ['kweon', 'kweonj', 'kweonh', 'kweod', 'kweol', 'kweolg', 'kweolm', 'kweolb', 'kweols', 'kweolt', 'kweolp', 'kweolh', 'kweom', 'kweob', 'kweobs', 'kweos', 'kweoss', 'kweong', 'kweoj', 'kweoc', 'kweok', 'kweot', 'kweop', 'kweoh', 'kwe', 'kweg', 'kwegg', 'kwegs', 'kwen', 'kwenj', 'kwenh', 'kwed', 'kwel', 'kwelg', 'kwelm', 'kwelb', 'kwels', 'kwelt', 'kwelp', 'kwelh', 'kwem', 'kweb', 'kwebs', 'kwes', 'kwess', 'kweng', 'kwej', 'kwec', 'kwek', 'kwet', 'kwep', 'kweh', 'kwi', 'kwig', 'kwigg', 'kwigs', 'kwin', 'kwinj', 'kwinh', 'kwid', 'kwil', 'kwilg', 'kwilm', 'kwilb', 'kwils', 'kwilt', 'kwilp', 'kwilh', 'kwim', 'kwib', 'kwibs', 'kwis', 'kwiss', 'kwing', 'kwij', 'kwic', 'kwik', 'kwit', 'kwip', 'kwih', 'kyu', 'kyug', 'kyugg', 'kyugs', 'kyun', 'kyunj', 'kyunh', 'kyud', 'kyul', 'kyulg', 'kyulm', 'kyulb', 'kyuls', 'kyult', 'kyulp', 'kyulh', 'kyum', 'kyub', 'kyubs', 'kyus', 'kyuss', 'kyung', 'kyuj', 'kyuc', 'kyuk', 'kyut', 'kyup', 'kyuh', 'keu', 'keug', 'keugg', 'keugs', 'keun', 'keunj', 'keunh', 'keud', 'keul', 'keulg', 'keulm', 'keulb', 'keuls', 'keult', 'keulp', 'keulh', 'keum', 'keub', 'keubs', 'keus', 'keuss', 'keung', 'keuj', 'keuc', 'keuk', 'keut', 'keup', 'keuh', 'kyi', 'kyig', 'kyigg', 'kyigs', 'kyin', 'kyinj', 'kyinh', 'kyid', 'kyil', 'kyilg', 'kyilm', 'kyilb', 'kyils', 'kyilt', 'kyilp', 'kyilh', 'kyim', 'kyib', 'kyibs', 'kyis', 'kyiss', 'kying', 'kyij', 'kyic', 'kyik', 'kyit', 'kyip', 'kyih', 'ki', 'kig', 'kigg', 'kigs', 'kin', 'kinj', 'kinh', 'kid', 'kil', 'kilg', 'kilm', 'kilb', 'kils', 'kilt', 'kilp', 'kilh', 'kim', 'kib', 'kibs', 'kis', 'kiss', 'king', 'kij', 'kic', 'kik', 'kit', 'kip', 'kih', 'ta', 'tag', 'tagg', 'tags', 'tan', 'tanj', 'tanh', 'tad', 'tal', 'talg', 'talm', 'talb', 'tals', 'talt', 'talp', 'talh', 'tam', 'tab', 'tabs', 'tas', 'tass', 'tang', 'taj', 'tac', 'tak', 'tat', 'tap', 'tah', 'tae', 'taeg', 'taegg', 'taegs', 'taen', 'taenj', 'taenh', 'taed', 'tael', 'taelg', 'taelm', 'taelb', 'taels', 'taelt', 'taelp', 'taelh', 'taem', 'taeb', 'taebs', 'taes', 'taess', 'taeng', 'taej', 'taec', 'taek', 'taet', 'taep', 'taeh', 'tya', 'tyag', 'tyagg', 'tyags', 'tyan', 'tyanj', 'tyanh', 'tyad']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0d1.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0d1.php new file mode 100644 index 0000000..ea8455a --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0d1.php @@ -0,0 +1 @@ +<?php return ['tyal', 'tyalg', 'tyalm', 'tyalb', 'tyals', 'tyalt', 'tyalp', 'tyalh', 'tyam', 'tyab', 'tyabs', 'tyas', 'tyass', 'tyang', 'tyaj', 'tyac', 'tyak', 'tyat', 'tyap', 'tyah', 'tyae', 'tyaeg', 'tyaegg', 'tyaegs', 'tyaen', 'tyaenj', 'tyaenh', 'tyaed', 'tyael', 'tyaelg', 'tyaelm', 'tyaelb', 'tyaels', 'tyaelt', 'tyaelp', 'tyaelh', 'tyaem', 'tyaeb', 'tyaebs', 'tyaes', 'tyaess', 'tyaeng', 'tyaej', 'tyaec', 'tyaek', 'tyaet', 'tyaep', 'tyaeh', 'teo', 'teog', 'teogg', 'teogs', 'teon', 'teonj', 'teonh', 'teod', 'teol', 'teolg', 'teolm', 'teolb', 'teols', 'teolt', 'teolp', 'teolh', 'teom', 'teob', 'teobs', 'teos', 'teoss', 'teong', 'teoj', 'teoc', 'teok', 'teot', 'teop', 'teoh', 'te', 'teg', 'tegg', 'tegs', 'ten', 'tenj', 'tenh', 'ted', 'tel', 'telg', 'telm', 'telb', 'tels', 'telt', 'telp', 'telh', 'tem', 'teb', 'tebs', 'tes', 'tess', 'teng', 'tej', 'tec', 'tek', 'tet', 'tep', 'teh', 'tyeo', 'tyeog', 'tyeogg', 'tyeogs', 'tyeon', 'tyeonj', 'tyeonh', 'tyeod', 'tyeol', 'tyeolg', 'tyeolm', 'tyeolb', 'tyeols', 'tyeolt', 'tyeolp', 'tyeolh', 'tyeom', 'tyeob', 'tyeobs', 'tyeos', 'tyeoss', 'tyeong', 'tyeoj', 'tyeoc', 'tyeok', 'tyeot', 'tyeop', 'tyeoh', 'tye', 'tyeg', 'tyegg', 'tyegs', 'tyen', 'tyenj', 'tyenh', 'tyed', 'tyel', 'tyelg', 'tyelm', 'tyelb', 'tyels', 'tyelt', 'tyelp', 'tyelh', 'tyem', 'tyeb', 'tyebs', 'tyes', 'tyess', 'tyeng', 'tyej', 'tyec', 'tyek', 'tyet', 'tyep', 'tyeh', 'to', 'tog', 'togg', 'togs', 'ton', 'tonj', 'tonh', 'tod', 'tol', 'tolg', 'tolm', 'tolb', 'tols', 'tolt', 'tolp', 'tolh', 'tom', 'tob', 'tobs', 'tos', 'toss', 'tong', 'toj', 'toc', 'tok', 'tot', 'top', 'toh', 'twa', 'twag', 'twagg', 'twags', 'twan', 'twanj', 'twanh', 'twad', 'twal', 'twalg', 'twalm', 'twalb', 'twals', 'twalt', 'twalp', 'twalh', 'twam', 'twab', 'twabs', 'twas', 'twass', 'twang', 'twaj', 'twac', 'twak', 'twat', 'twap', 'twah', 'twae', 'twaeg', 'twaegg', 'twaegs', 'twaen', 'twaenj', 'twaenh', 'twaed', 'twael', 'twaelg', 'twaelm', 'twaelb', 'twaels', 'twaelt', 'twaelp', 'twaelh', 'twaem', 'twaeb', 'twaebs', 'twaes', 'twaess', 'twaeng', 'twaej', 'twaec', 'twaek', 'twaet', 'twaep', 'twaeh', 'toe', 'toeg', 'toegg', 'toegs', 'toen', 'toenj', 'toenh', 'toed', 'toel', 'toelg', 'toelm', 'toelb']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0d2.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0d2.php new file mode 100644 index 0000000..f18334d --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0d2.php @@ -0,0 +1 @@ +<?php return ['toels', 'toelt', 'toelp', 'toelh', 'toem', 'toeb', 'toebs', 'toes', 'toess', 'toeng', 'toej', 'toec', 'toek', 'toet', 'toep', 'toeh', 'tyo', 'tyog', 'tyogg', 'tyogs', 'tyon', 'tyonj', 'tyonh', 'tyod', 'tyol', 'tyolg', 'tyolm', 'tyolb', 'tyols', 'tyolt', 'tyolp', 'tyolh', 'tyom', 'tyob', 'tyobs', 'tyos', 'tyoss', 'tyong', 'tyoj', 'tyoc', 'tyok', 'tyot', 'tyop', 'tyoh', 'tu', 'tug', 'tugg', 'tugs', 'tun', 'tunj', 'tunh', 'tud', 'tul', 'tulg', 'tulm', 'tulb', 'tuls', 'tult', 'tulp', 'tulh', 'tum', 'tub', 'tubs', 'tus', 'tuss', 'tung', 'tuj', 'tuc', 'tuk', 'tut', 'tup', 'tuh', 'tweo', 'tweog', 'tweogg', 'tweogs', 'tweon', 'tweonj', 'tweonh', 'tweod', 'tweol', 'tweolg', 'tweolm', 'tweolb', 'tweols', 'tweolt', 'tweolp', 'tweolh', 'tweom', 'tweob', 'tweobs', 'tweos', 'tweoss', 'tweong', 'tweoj', 'tweoc', 'tweok', 'tweot', 'tweop', 'tweoh', 'twe', 'tweg', 'twegg', 'twegs', 'twen', 'twenj', 'twenh', 'twed', 'twel', 'twelg', 'twelm', 'twelb', 'twels', 'twelt', 'twelp', 'twelh', 'twem', 'tweb', 'twebs', 'twes', 'twess', 'tweng', 'twej', 'twec', 'twek', 'twet', 'twep', 'tweh', 'twi', 'twig', 'twigg', 'twigs', 'twin', 'twinj', 'twinh', 'twid', 'twil', 'twilg', 'twilm', 'twilb', 'twils', 'twilt', 'twilp', 'twilh', 'twim', 'twib', 'twibs', 'twis', 'twiss', 'twing', 'twij', 'twic', 'twik', 'twit', 'twip', 'twih', 'tyu', 'tyug', 'tyugg', 'tyugs', 'tyun', 'tyunj', 'tyunh', 'tyud', 'tyul', 'tyulg', 'tyulm', 'tyulb', 'tyuls', 'tyult', 'tyulp', 'tyulh', 'tyum', 'tyub', 'tyubs', 'tyus', 'tyuss', 'tyung', 'tyuj', 'tyuc', 'tyuk', 'tyut', 'tyup', 'tyuh', 'teu', 'teug', 'teugg', 'teugs', 'teun', 'teunj', 'teunh', 'teud', 'teul', 'teulg', 'teulm', 'teulb', 'teuls', 'teult', 'teulp', 'teulh', 'teum', 'teub', 'teubs', 'teus', 'teuss', 'teung', 'teuj', 'teuc', 'teuk', 'teut', 'teup', 'teuh', 'tyi', 'tyig', 'tyigg', 'tyigs', 'tyin', 'tyinj', 'tyinh', 'tyid', 'tyil', 'tyilg', 'tyilm', 'tyilb', 'tyils', 'tyilt', 'tyilp', 'tyilh', 'tyim', 'tyib', 'tyibs', 'tyis', 'tyiss', 'tying', 'tyij', 'tyic', 'tyik', 'tyit', 'tyip', 'tyih', 'ti', 'tig', 'tigg', 'tigs', 'tin', 'tinj', 'tinh', 'tid', 'til', 'tilg', 'tilm', 'tilb', 'tils', 'tilt', 'tilp', 'tilh']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0d3.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0d3.php new file mode 100644 index 0000000..5f73d84 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0d3.php @@ -0,0 +1 @@ +<?php return ['tim', 'tib', 'tibs', 'tis', 'tiss', 'ting', 'tij', 'tic', 'tik', 'tit', 'tip', 'tih', 'pa', 'pag', 'pagg', 'pags', 'pan', 'panj', 'panh', 'pad', 'pal', 'palg', 'palm', 'palb', 'pals', 'palt', 'palp', 'palh', 'pam', 'pab', 'pabs', 'pas', 'pass', 'pang', 'paj', 'pac', 'pak', 'pat', 'pap', 'pah', 'pae', 'paeg', 'paegg', 'paegs', 'paen', 'paenj', 'paenh', 'paed', 'pael', 'paelg', 'paelm', 'paelb', 'paels', 'paelt', 'paelp', 'paelh', 'paem', 'paeb', 'paebs', 'paes', 'paess', 'paeng', 'paej', 'paec', 'paek', 'paet', 'paep', 'paeh', 'pya', 'pyag', 'pyagg', 'pyags', 'pyan', 'pyanj', 'pyanh', 'pyad', 'pyal', 'pyalg', 'pyalm', 'pyalb', 'pyals', 'pyalt', 'pyalp', 'pyalh', 'pyam', 'pyab', 'pyabs', 'pyas', 'pyass', 'pyang', 'pyaj', 'pyac', 'pyak', 'pyat', 'pyap', 'pyah', 'pyae', 'pyaeg', 'pyaegg', 'pyaegs', 'pyaen', 'pyaenj', 'pyaenh', 'pyaed', 'pyael', 'pyaelg', 'pyaelm', 'pyaelb', 'pyaels', 'pyaelt', 'pyaelp', 'pyaelh', 'pyaem', 'pyaeb', 'pyaebs', 'pyaes', 'pyaess', 'pyaeng', 'pyaej', 'pyaec', 'pyaek', 'pyaet', 'pyaep', 'pyaeh', 'peo', 'peog', 'peogg', 'peogs', 'peon', 'peonj', 'peonh', 'peod', 'peol', 'peolg', 'peolm', 'peolb', 'peols', 'peolt', 'peolp', 'peolh', 'peom', 'peob', 'peobs', 'peos', 'peoss', 'peong', 'peoj', 'peoc', 'peok', 'peot', 'peop', 'peoh', 'pe', 'peg', 'pegg', 'pegs', 'pen', 'penj', 'penh', 'ped', 'pel', 'pelg', 'pelm', 'pelb', 'pels', 'pelt', 'pelp', 'pelh', 'pem', 'peb', 'pebs', 'pes', 'pess', 'peng', 'pej', 'pec', 'pek', 'pet', 'pep', 'peh', 'pyeo', 'pyeog', 'pyeogg', 'pyeogs', 'pyeon', 'pyeonj', 'pyeonh', 'pyeod', 'pyeol', 'pyeolg', 'pyeolm', 'pyeolb', 'pyeols', 'pyeolt', 'pyeolp', 'pyeolh', 'pyeom', 'pyeob', 'pyeobs', 'pyeos', 'pyeoss', 'pyeong', 'pyeoj', 'pyeoc', 'pyeok', 'pyeot', 'pyeop', 'pyeoh', 'pye', 'pyeg', 'pyegg', 'pyegs', 'pyen', 'pyenj', 'pyenh', 'pyed', 'pyel', 'pyelg', 'pyelm', 'pyelb', 'pyels', 'pyelt', 'pyelp', 'pyelh', 'pyem', 'pyeb', 'pyebs', 'pyes', 'pyess', 'pyeng', 'pyej', 'pyec', 'pyek', 'pyet', 'pyep', 'pyeh', 'po', 'pog', 'pogg', 'pogs', 'pon', 'ponj', 'ponh', 'pod', 'pol', 'polg', 'polm', 'polb', 'pols', 'polt', 'polp', 'polh', 'pom', 'pob', 'pobs', 'pos']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0d4.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0d4.php new file mode 100644 index 0000000..21bdc35 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0d4.php @@ -0,0 +1 @@ +<?php return ['poss', 'pong', 'poj', 'poc', 'pok', 'pot', 'pop', 'poh', 'pwa', 'pwag', 'pwagg', 'pwags', 'pwan', 'pwanj', 'pwanh', 'pwad', 'pwal', 'pwalg', 'pwalm', 'pwalb', 'pwals', 'pwalt', 'pwalp', 'pwalh', 'pwam', 'pwab', 'pwabs', 'pwas', 'pwass', 'pwang', 'pwaj', 'pwac', 'pwak', 'pwat', 'pwap', 'pwah', 'pwae', 'pwaeg', 'pwaegg', 'pwaegs', 'pwaen', 'pwaenj', 'pwaenh', 'pwaed', 'pwael', 'pwaelg', 'pwaelm', 'pwaelb', 'pwaels', 'pwaelt', 'pwaelp', 'pwaelh', 'pwaem', 'pwaeb', 'pwaebs', 'pwaes', 'pwaess', 'pwaeng', 'pwaej', 'pwaec', 'pwaek', 'pwaet', 'pwaep', 'pwaeh', 'poe', 'poeg', 'poegg', 'poegs', 'poen', 'poenj', 'poenh', 'poed', 'poel', 'poelg', 'poelm', 'poelb', 'poels', 'poelt', 'poelp', 'poelh', 'poem', 'poeb', 'poebs', 'poes', 'poess', 'poeng', 'poej', 'poec', 'poek', 'poet', 'poep', 'poeh', 'pyo', 'pyog', 'pyogg', 'pyogs', 'pyon', 'pyonj', 'pyonh', 'pyod', 'pyol', 'pyolg', 'pyolm', 'pyolb', 'pyols', 'pyolt', 'pyolp', 'pyolh', 'pyom', 'pyob', 'pyobs', 'pyos', 'pyoss', 'pyong', 'pyoj', 'pyoc', 'pyok', 'pyot', 'pyop', 'pyoh', 'pu', 'pug', 'pugg', 'pugs', 'pun', 'punj', 'punh', 'pud', 'pul', 'pulg', 'pulm', 'pulb', 'puls', 'pult', 'pulp', 'pulh', 'pum', 'pub', 'pubs', 'pus', 'puss', 'pung', 'puj', 'puc', 'puk', 'put', 'pup', 'puh', 'pweo', 'pweog', 'pweogg', 'pweogs', 'pweon', 'pweonj', 'pweonh', 'pweod', 'pweol', 'pweolg', 'pweolm', 'pweolb', 'pweols', 'pweolt', 'pweolp', 'pweolh', 'pweom', 'pweob', 'pweobs', 'pweos', 'pweoss', 'pweong', 'pweoj', 'pweoc', 'pweok', 'pweot', 'pweop', 'pweoh', 'pwe', 'pweg', 'pwegg', 'pwegs', 'pwen', 'pwenj', 'pwenh', 'pwed', 'pwel', 'pwelg', 'pwelm', 'pwelb', 'pwels', 'pwelt', 'pwelp', 'pwelh', 'pwem', 'pweb', 'pwebs', 'pwes', 'pwess', 'pweng', 'pwej', 'pwec', 'pwek', 'pwet', 'pwep', 'pweh', 'pwi', 'pwig', 'pwigg', 'pwigs', 'pwin', 'pwinj', 'pwinh', 'pwid', 'pwil', 'pwilg', 'pwilm', 'pwilb', 'pwils', 'pwilt', 'pwilp', 'pwilh', 'pwim', 'pwib', 'pwibs', 'pwis', 'pwiss', 'pwing', 'pwij', 'pwic', 'pwik', 'pwit', 'pwip', 'pwih', 'pyu', 'pyug', 'pyugg', 'pyugs', 'pyun', 'pyunj', 'pyunh', 'pyud', 'pyul', 'pyulg', 'pyulm', 'pyulb', 'pyuls', 'pyult', 'pyulp', 'pyulh', 'pyum', 'pyub', 'pyubs', 'pyus', 'pyuss', 'pyung', 'pyuj', 'pyuc']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0d5.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0d5.php new file mode 100644 index 0000000..871f796 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0d5.php @@ -0,0 +1 @@ +<?php return ['pyuk', 'pyut', 'pyup', 'pyuh', 'peu', 'peug', 'peugg', 'peugs', 'peun', 'peunj', 'peunh', 'peud', 'peul', 'peulg', 'peulm', 'peulb', 'peuls', 'peult', 'peulp', 'peulh', 'peum', 'peub', 'peubs', 'peus', 'peuss', 'peung', 'peuj', 'peuc', 'peuk', 'peut', 'peup', 'peuh', 'pyi', 'pyig', 'pyigg', 'pyigs', 'pyin', 'pyinj', 'pyinh', 'pyid', 'pyil', 'pyilg', 'pyilm', 'pyilb', 'pyils', 'pyilt', 'pyilp', 'pyilh', 'pyim', 'pyib', 'pyibs', 'pyis', 'pyiss', 'pying', 'pyij', 'pyic', 'pyik', 'pyit', 'pyip', 'pyih', 'pi', 'pig', 'pigg', 'pigs', 'pin', 'pinj', 'pinh', 'pid', 'pil', 'pilg', 'pilm', 'pilb', 'pils', 'pilt', 'pilp', 'pilh', 'pim', 'pib', 'pibs', 'pis', 'piss', 'ping', 'pij', 'pic', 'pik', 'pit', 'pip', 'pih', 'ha', 'hag', 'hagg', 'hags', 'han', 'hanj', 'hanh', 'had', 'hal', 'halg', 'halm', 'halb', 'hals', 'halt', 'halp', 'halh', 'ham', 'hab', 'habs', 'has', 'hass', 'hang', 'haj', 'hac', 'hak', 'hat', 'hap', 'hah', 'hae', 'haeg', 'haegg', 'haegs', 'haen', 'haenj', 'haenh', 'haed', 'hael', 'haelg', 'haelm', 'haelb', 'haels', 'haelt', 'haelp', 'haelh', 'haem', 'haeb', 'haebs', 'haes', 'haess', 'haeng', 'haej', 'haec', 'haek', 'haet', 'haep', 'haeh', 'hya', 'hyag', 'hyagg', 'hyags', 'hyan', 'hyanj', 'hyanh', 'hyad', 'hyal', 'hyalg', 'hyalm', 'hyalb', 'hyals', 'hyalt', 'hyalp', 'hyalh', 'hyam', 'hyab', 'hyabs', 'hyas', 'hyass', 'hyang', 'hyaj', 'hyac', 'hyak', 'hyat', 'hyap', 'hyah', 'hyae', 'hyaeg', 'hyaegg', 'hyaegs', 'hyaen', 'hyaenj', 'hyaenh', 'hyaed', 'hyael', 'hyaelg', 'hyaelm', 'hyaelb', 'hyaels', 'hyaelt', 'hyaelp', 'hyaelh', 'hyaem', 'hyaeb', 'hyaebs', 'hyaes', 'hyaess', 'hyaeng', 'hyaej', 'hyaec', 'hyaek', 'hyaet', 'hyaep', 'hyaeh', 'heo', 'heog', 'heogg', 'heogs', 'heon', 'heonj', 'heonh', 'heod', 'heol', 'heolg', 'heolm', 'heolb', 'heols', 'heolt', 'heolp', 'heolh', 'heom', 'heob', 'heobs', 'heos', 'heoss', 'heong', 'heoj', 'heoc', 'heok', 'heot', 'heop', 'heoh', 'he', 'heg', 'hegg', 'hegs', 'hen', 'henj', 'henh', 'hed', 'hel', 'helg', 'helm', 'helb', 'hels', 'helt', 'help', 'helh', 'hem', 'heb', 'hebs', 'hes', 'hess', 'heng', 'hej', 'hec', 'hek', 'het', 'hep', 'heh']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0d6.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0d6.php new file mode 100644 index 0000000..6b6b6be --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0d6.php @@ -0,0 +1 @@ +<?php return ['hyeo', 'hyeog', 'hyeogg', 'hyeogs', 'hyeon', 'hyeonj', 'hyeonh', 'hyeod', 'hyeol', 'hyeolg', 'hyeolm', 'hyeolb', 'hyeols', 'hyeolt', 'hyeolp', 'hyeolh', 'hyeom', 'hyeob', 'hyeobs', 'hyeos', 'hyeoss', 'hyeong', 'hyeoj', 'hyeoc', 'hyeok', 'hyeot', 'hyeop', 'hyeoh', 'hye', 'hyeg', 'hyegg', 'hyegs', 'hyen', 'hyenj', 'hyenh', 'hyed', 'hyel', 'hyelg', 'hyelm', 'hyelb', 'hyels', 'hyelt', 'hyelp', 'hyelh', 'hyem', 'hyeb', 'hyebs', 'hyes', 'hyess', 'hyeng', 'hyej', 'hyec', 'hyek', 'hyet', 'hyep', 'hyeh', 'ho', 'hog', 'hogg', 'hogs', 'hon', 'honj', 'honh', 'hod', 'hol', 'holg', 'holm', 'holb', 'hols', 'holt', 'holp', 'holh', 'hom', 'hob', 'hobs', 'hos', 'hoss', 'hong', 'hoj', 'hoc', 'hok', 'hot', 'hop', 'hoh', 'hwa', 'hwag', 'hwagg', 'hwags', 'hwan', 'hwanj', 'hwanh', 'hwad', 'hwal', 'hwalg', 'hwalm', 'hwalb', 'hwals', 'hwalt', 'hwalp', 'hwalh', 'hwam', 'hwab', 'hwabs', 'hwas', 'hwass', 'hwang', 'hwaj', 'hwac', 'hwak', 'hwat', 'hwap', 'hwah', 'hwae', 'hwaeg', 'hwaegg', 'hwaegs', 'hwaen', 'hwaenj', 'hwaenh', 'hwaed', 'hwael', 'hwaelg', 'hwaelm', 'hwaelb', 'hwaels', 'hwaelt', 'hwaelp', 'hwaelh', 'hwaem', 'hwaeb', 'hwaebs', 'hwaes', 'hwaess', 'hwaeng', 'hwaej', 'hwaec', 'hwaek', 'hwaet', 'hwaep', 'hwaeh', 'hoe', 'hoeg', 'hoegg', 'hoegs', 'hoen', 'hoenj', 'hoenh', 'hoed', 'hoel', 'hoelg', 'hoelm', 'hoelb', 'hoels', 'hoelt', 'hoelp', 'hoelh', 'hoem', 'hoeb', 'hoebs', 'hoes', 'hoess', 'hoeng', 'hoej', 'hoec', 'hoek', 'hoet', 'hoep', 'hoeh', 'hyo', 'hyog', 'hyogg', 'hyogs', 'hyon', 'hyonj', 'hyonh', 'hyod', 'hyol', 'hyolg', 'hyolm', 'hyolb', 'hyols', 'hyolt', 'hyolp', 'hyolh', 'hyom', 'hyob', 'hyobs', 'hyos', 'hyoss', 'hyong', 'hyoj', 'hyoc', 'hyok', 'hyot', 'hyop', 'hyoh', 'hu', 'hug', 'hugg', 'hugs', 'hun', 'hunj', 'hunh', 'hud', 'hul', 'hulg', 'hulm', 'hulb', 'huls', 'hult', 'hulp', 'hulh', 'hum', 'hub', 'hubs', 'hus', 'huss', 'hung', 'huj', 'huc', 'huk', 'hut', 'hup', 'huh', 'hweo', 'hweog', 'hweogg', 'hweogs', 'hweon', 'hweonj', 'hweonh', 'hweod', 'hweol', 'hweolg', 'hweolm', 'hweolb', 'hweols', 'hweolt', 'hweolp', 'hweolh', 'hweom', 'hweob', 'hweobs', 'hweos', 'hweoss', 'hweong', 'hweoj', 'hweoc', 'hweok', 'hweot', 'hweop', 'hweoh', 'hwe', 'hweg', 'hwegg', 'hwegs']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0d7.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0d7.php new file mode 100644 index 0000000..97835b0 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0d7.php @@ -0,0 +1 @@ +<?php return ['hwen', 'hwenj', 'hwenh', 'hwed', 'hwel', 'hwelg', 'hwelm', 'hwelb', 'hwels', 'hwelt', 'hwelp', 'hwelh', 'hwem', 'hweb', 'hwebs', 'hwes', 'hwess', 'hweng', 'hwej', 'hwec', 'hwek', 'hwet', 'hwep', 'hweh', 'hwi', 'hwig', 'hwigg', 'hwigs', 'hwin', 'hwinj', 'hwinh', 'hwid', 'hwil', 'hwilg', 'hwilm', 'hwilb', 'hwils', 'hwilt', 'hwilp', 'hwilh', 'hwim', 'hwib', 'hwibs', 'hwis', 'hwiss', 'hwing', 'hwij', 'hwic', 'hwik', 'hwit', 'hwip', 'hwih', 'hyu', 'hyug', 'hyugg', 'hyugs', 'hyun', 'hyunj', 'hyunh', 'hyud', 'hyul', 'hyulg', 'hyulm', 'hyulb', 'hyuls', 'hyult', 'hyulp', 'hyulh', 'hyum', 'hyub', 'hyubs', 'hyus', 'hyuss', 'hyung', 'hyuj', 'hyuc', 'hyuk', 'hyut', 'hyup', 'hyuh', 'heu', 'heug', 'heugg', 'heugs', 'heun', 'heunj', 'heunh', 'heud', 'heul', 'heulg', 'heulm', 'heulb', 'heuls', 'heult', 'heulp', 'heulh', 'heum', 'heub', 'heubs', 'heus', 'heuss', 'heung', 'heuj', 'heuc', 'heuk', 'heut', 'heup', 'heuh', 'hyi', 'hyig', 'hyigg', 'hyigs', 'hyin', 'hyinj', 'hyinh', 'hyid', 'hyil', 'hyilg', 'hyilm', 'hyilb', 'hyils', 'hyilt', 'hyilp', 'hyilh', 'hyim', 'hyib', 'hyibs', 'hyis', 'hyiss', 'hying', 'hyij', 'hyic', 'hyik', 'hyit', 'hyip', 'hyih', 'hi', 'hig', 'higg', 'higs', 'hin', 'hinj', 'hinh', 'hid', 'hil', 'hilg', 'hilm', 'hilb', 'hils', 'hilt', 'hilp', 'hilh', 'him', 'hib', 'hibs', 'his', 'hiss', 'hing', 'hij', 'hic', 'hik', 'hit', 'hip', 'hih', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0f9.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0f9.php new file mode 100644 index 0000000..d0b4241 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0f9.php @@ -0,0 +1 @@ +<?php return ['Kay ', 'Kayng ', 'Ke ', 'Ko ', 'Kol ', 'Koc ', 'Kwi ', 'Kwi ', 'Kyun ', 'Kul ', 'Kum ', 'Na ', 'Na ', 'Na ', 'La ', 'Na ', 'Na ', 'Na ', 'Na ', 'Na ', 'Nak ', 'Nak ', 'Nak ', 'Nak ', 'Nak ', 'Nak ', 'Nak ', 'Nan ', 'Nan ', 'Nan ', 'Nan ', 'Nan ', 'Nan ', 'Nam ', 'Nam ', 'Nam ', 'Nam ', 'Nap ', 'Nap ', 'Nap ', 'Nang ', 'Nang ', 'Nang ', 'Nang ', 'Nang ', 'Nay ', 'Nayng ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'Nok ', 'Nok ', 'Nok ', 'Nok ', 'Nok ', 'Nok ', 'Non ', 'Nong ', 'Nong ', 'Nong ', 'Nong ', 'Noy ', 'Noy ', 'Noy ', 'Noy ', 'Nwu ', 'Nwu ', 'Nwu ', 'Nwu ', 'Nwu ', 'Nwu ', 'Nwu ', 'Nwu ', 'Nuk ', 'Nuk ', 'Num ', 'Nung ', 'Nung ', 'Nung ', 'Nung ', 'Nung ', 'Twu ', 'La ', 'Lak ', 'Lak ', 'Lan ', 'Lyeng ', 'Lo ', 'Lyul ', 'Li ', 'Pey ', 'Pen ', 'Pyen ', 'Pwu ', 'Pwul ', 'Pi ', 'Sak ', 'Sak ', 'Sam ', 'Sayk ', 'Sayng ', 'Sep ', 'Sey ', 'Sway ', 'Sin ', 'Sim ', 'Sip ', 'Ya ', 'Yak ', 'Yak ', 'Yang ', 'Yang ', 'Yang ', 'Yang ', 'Yang ', 'Yang ', 'Yang ', 'Yang ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Yek ', 'Yek ', 'Yek ', 'Yek ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yel ', 'Yel ', 'Yel ', 'Yel ', 'Yel ', 'Yel ', 'Yem ', 'Yem ', 'Yem ', 'Yem ', 'Yem ', 'Yep ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yey ', 'Yey ', 'Yey ', 'Yey ', 'O ', 'Yo ', 'Yo ', 'Yo ', 'Yo ', 'Yo ', 'Yo ', 'Yo ', 'Yo ', 'Yo ', 'Yo ', 'Yong ', 'Wun ', 'Wen ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yuk ', 'Yuk ', 'Yuk ', 'Yun ', 'Yun ', 'Yun ', 'Yun ', 'Yul ', 'Yul ', 'Yul ', 'Yul ', 'Yung ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'Ik ', 'Ik ', 'In ', 'In ', 'In ', 'In ', 'In ', 'In ', 'In ', 'Im ', 'Im ', 'Im ', 'Ip ', 'Ip ', 'Ip ', 'Cang ', 'Cek ', 'Ci ', 'Cip ', 'Cha ', 'Chek ']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0fa.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0fa.php new file mode 100644 index 0000000..c5afa60 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0fa.php @@ -0,0 +1 @@ +<?php return ['Chey ', 'Thak ', 'Thak ', 'Thang ', 'Thayk ', 'Thong ', 'Pho ', 'Phok ', 'Hang ', 'Hang ', 'Hyen ', 'Hwak ', 'Wu ', 'Huo ', '[?] ', '[?] ', 'Zhong ', '[?] ', 'Qing ', '[?] ', '[?] ', 'Xi ', 'Zhu ', 'Yi ', 'Li ', 'Shen ', 'Xiang ', 'Fu ', 'Jing ', 'Jing ', 'Yu ', '[?] ', 'Hagi ', '[?] ', 'Zhu ', '[?] ', '[?] ', 'Yi ', 'Du ', '[?] ', '[?] ', '[?] ', 'Fan ', 'Si ', 'Guan ', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0fb.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0fb.php new file mode 100644 index 0000000..af2ac33 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0fb.php @@ -0,0 +1 @@ +<?php return ['ff', 'fi', 'fl', 'ffi', 'ffl', 'st', 'st', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', 'mn', 'me', 'mi', 'vn', 'mkh', '[?]', '[?]', '[?]', '[?]', '[?]', 'yi', '', 'ay', '`', '', 'd', 'h', 'k', 'l', 'm', 'm', 't', '+', 'sh', 's', 'sh', 's', 'a', 'a', '', 'b', 'g', 'd', 'h', 'v', 'z', '[?]', 't', 'y', 'k', 'k', 'l', '[?]', 'l', '[?]', 'n', 'n', '[?]', 'p', 'p', '[?]', 'ts', 'ts', 'r', 'sh', 't', 'vo', 'b', 'k', 'p', 'l', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0fc.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0fc.php new file mode 100644 index 0000000..7023059 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0fc.php @@ -0,0 +1 @@ +<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0fd.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0fd.php new file mode 100644 index 0000000..09930de --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0fd.php @@ -0,0 +1 @@ +<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '{Salla}', '{Qala}', 'Allah', 'Akbar', 'Mohammed', 'SL`M', 'Rasul', '{Alayhi}', '{WaSallam}', '{Salla}', '{Salla Llahu Alayhi WaSallam}', '{Jalla Jalalahu}', 'Rial ', '{Bismillah Ar-Rahman Ar-Rahimi}', '[?]', '[?]']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0fe.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0fe.php new file mode 100644 index 0000000..33cfd88 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0fe.php @@ -0,0 +1 @@ +<?php return ['[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '', '', '', '~', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '..', '--', '-', '_', '_', '(', ') ', '{', '} ', '[', '] ', '[(', ')] ', '<<', '>> ', '<', '> ', '[', '] ', '{', '}', '[?]', '[?]', '[?]', '[?]', '', '', '', '', '', '', '', ',', ',', '.', '', ';', ':', '?', '!', '-', '(', ')', '{', '}', '{', '}', '#', '&', '*', '+', '-', '<', '>', '=', '', '\\', '$', '%', '@', '[?]', '[?]', '[?]', '[?]', '', '', '', '[?]', '', '[?]', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '[?]', '[?]', '']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php b/vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php new file mode 100644 index 0000000..b3a1539 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x0ff.php @@ -0,0 +1 @@ +<?php return ['[?]', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', '[?]', '[?]', '.', '[', ']', ',', '*', 'wo', 'a', 'i', 'u', 'e', 'o', 'ya', 'yu', 'yo', 'tu', '+', 'a', 'i', 'u', 'e', 'o', 'ka', 'ki', 'ku', 'ke', 'ko', 'sa', 'si', 'su', 'se', 'so', 'ta', 'ti', 'tu', 'te', 'to', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'hi', 'hu', 'he', 'ho', 'ma', 'mi', 'mu', 'me', 'mo', 'ya', 'yu', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'n', ':', ';', '', 'g', 'gg', 'gs', 'n', 'nj', 'nh', 'd', 'dd', 'r', 'lg', 'lm', 'lb', 'ls', 'lt', 'lp', 'rh', 'm', 'b', 'bb', 'bs', 's', 'ss', '', 'j', 'jj', 'c', 'k', 't', 'p', 'h', '[?]', '[?]', '[?]', 'a', 'ae', 'ya', 'yae', 'eo', 'e', '[?]', '[?]', 'yeo', 'ye', 'o', 'wa', 'wae', 'oe', '[?]', '[?]', 'yo', 'u', 'weo', 'we', 'wi', 'yu', '[?]', '[?]', 'eu', 'yi', 'i', '[?]', '[?]', '[?]', '/C', 'PS', '!', '-', '|', 'Y=', 'W=', '[?]', '|', '-', '|', '-', '|', '#', 'O', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '[?]', '{', '|', '}', '', '', '', '']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php b/vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php new file mode 100644 index 0000000..ad8d3b2 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x1d4.php @@ -0,0 +1 @@ +<?php return ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 26 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 52 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 78 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 104 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 130 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 156 => 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 181 => 'Z', 182 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 208 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 234 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php b/vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php new file mode 100644 index 0000000..a2a9b90 --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x1d5.php @@ -0,0 +1,4 @@ +<?php + +return [ + 0 => 'w', 'x', 'y', 'z', 4 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 30 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 56 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 82 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 108 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 134 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 160 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 186 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 212 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 238 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ]; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php b/vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php new file mode 100644 index 0000000..315ef5e --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x1d6.php @@ -0,0 +1 @@ +<?php return ['s', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'i', 'j', '', '', 'Alpha', 'Beta', 'Gamma', 'Delta', 'Epsilon', 'Zeta', 'Eta', 'Theta', 'Iota', 'Kappa', 'Lamda', 'Mu', 'Nu', 'Xi', 'Omicron', 'Pi', 'Rho', 'Theta', 'Sigma', 'Tau', 'Upsilon', 'Phi', 'Chi', 'Psi', 'Omega', 'nabla', 'alpha', 'beta', 'gamma', 'delta', 'epsilon', 'zeta', 'eta', 'theta', 'iota', 'kappa', 'lamda', 'mu', 'nu', 'xi', 'omicron', 'pi', 'rho', 'sigma', 'sigma', 'tai', 'upsilon', 'phi', 'chi', 'psi', 'omega', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x1d7.php b/vendor/voku/portable-ascii/src/voku/helper/data/x1d7.php new file mode 100644 index 0000000..d2b885c --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x1d7.php @@ -0,0 +1 @@ +<?php return ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; diff --git a/vendor/voku/portable-ascii/src/voku/helper/data/x1f1.php b/vendor/voku/portable-ascii/src/voku/helper/data/x1f1.php new file mode 100644 index 0000000..c0f4cfa --- /dev/null +++ b/vendor/voku/portable-ascii/src/voku/helper/data/x1f1.php @@ -0,0 +1,2 @@ +<?php return ['0.', '0,', '1,', '2,', '3,', '4,', '5,', '6,', '7,', '8,', '9,', '', '', '', '', '', '(A)', '(B)', '(C)', '(D)', '(E)', '(F)', '(G)', '(H)', '(I)', '(J)', '(K)', // 0x1a + '(L)', '(M)', '(N)', '(O)', '(P)', '(Q)', '(R)', '(S)', '(T)', '(U)', '(V)', '(W)', '(X)', '(Y)', '(Z)', 48 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 80 => 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 112 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 230 => 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ]; diff --git a/vendor/webman/captcha/.gitignore b/vendor/webman/captcha/.gitignore new file mode 100644 index 0000000..4383716 --- /dev/null +++ b/vendor/webman/captcha/.gitignore @@ -0,0 +1,5 @@ +.idea/ +demo/*.jpg +demo/*.pgm +demo/temp/ +vendor/ diff --git a/vendor/webman/captcha/.travis.yml b/vendor/webman/captcha/.travis.yml new file mode 100644 index 0000000..5d2dbf9 --- /dev/null +++ b/vendor/webman/captcha/.travis.yml @@ -0,0 +1,16 @@ +language: php + +php: + - 5.3.3 + - 5.3 + - 5.4 + - 5.5 + - 5.6 + - 7.0 + - 7.1 + - 7.2 + - hhvm + +script: + - composer install + - phpunit diff --git a/vendor/webman/captcha/LICENSE b/vendor/webman/captcha/LICENSE new file mode 100644 index 0000000..62f991a --- /dev/null +++ b/vendor/webman/captcha/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) <2012-2017> Grégoire Passault + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/webman/captcha/README.md b/vendor/webman/captcha/README.md new file mode 100644 index 0000000..58e1544 --- /dev/null +++ b/vendor/webman/captcha/README.md @@ -0,0 +1,142 @@ +Captcha +======= + +![Captchas examples](http://gregwar.com/captchas.png) + +This is a fork of [Gregwar/Captcha](https://github.com/Gregwar/Captcha) + +Installation +============ + +With composer : + +``` +composer require webman/captcha +``` + +Usage +===== + +You can create a captcha with the `CaptchaBuilder` : + +```php +<?php + +use Webman\Captcha\CaptchaBuilder; + +$builder = new CaptchaBuilder; +$builder->build(); +``` + +You can then save it to a file : + +```php +<?php + +$builder->save('out.jpg'); +``` + +Or output it directly : + +```php +<?php + +header('Content-type: image/jpeg'); +$builder->output(); +``` + +Or inline it directly in the HTML page: + +```php +<img src="<?php echo $builder->inline(); ?>" /> +``` + +You'll be able to get the code and compare it with a user input : + +```php +<?php + +// Example: storing the phrase in the session to test for the user +// input later +$_SESSION['phrase'] = $builder->getPhrase(); +``` + +You can compare the phrase with user input: +```php +if($builder->testPhrase($userInput)) { + // instructions if user phrase is good +} +else { + // user phrase is wrong +} +``` + +API +=== + +You can use theses functions : + +* **__construct($phrase = null)**, constructs the builder with the given phrase, if the phrase is null, a random one will be generated +* **getPhrase()**, allow you to get the phrase contents +* **setDistortion($distortion)**, enable or disable the distortion, call it before `build()` +* **isOCRReadable()**, returns `true` if the OCR can be read using the `ocrad` software, you'll need to have shell_exec enabled, imagemagick and ocrad installed +* **buildAgainstOCR($width = 150, $height = 40, $font = null)**, builds a code until it is not readable by `ocrad` +* **build($width = 150, $height = 40, $font = null)**, builds a code with the given $width, $height and $font. By default, a random font will be used from the library +* **save($filename, $quality = 80)**, saves the captcha into a jpeg in the $filename, with the given quality +* **get($quality = 80)**, returns the jpeg data +* **output($quality = 80)**, directly outputs the jpeg code to a browser +* **setBackgroundColor($r, $g, $b)**, sets the background color to force it (this will disable many effects and is not recommended) +* **setBackgroundImages(array($imagepath1, $imagePath2))**, Sets custom background images to be used as captcha background. It is recommended to disable image effects when passing custom images for background (ignore_all_effects). A random image is selected from the list passed, the full paths to the image files must be passed. +* **setInterpolation($interpolate)**, enable or disable the interpolation (enabled by default), disabling it will be quicker but the images will look uglier +* **setIgnoreAllEffects($ignoreAllEffects)**, disable all effects on the captcha image. Recommended to use when passing custom background images for the captcha. +* **testPhrase($phrase)**, returns true if the given phrase is good +* **setMaxBehindLines($lines)**, sets the maximum number of lines behind the code +* **setMaxFrontLines($lines)**, sets the maximum number of lines on the front of the code + +If you want to change the number of character, you can call the phrase builder directly using +extra parameters: + +```php +use Webman\Captcha\CaptchaBuilder; +use Webman\Captcha\PhraseBuilder; + +// Will build phrases of 3 characters +$phraseBuilder = new PhraseBuilder(4); + +// Will build phrases of 5 characters, only digits +$phraseBuilder = new PhraseBuilder(5, '0123456789'); + +// Pass it as first argument of CaptchaBuilder, passing it the phrase +// builder +$captcha = new CaptchaBuilder(null, $phraseBuilder); +``` + +You can also pass directly the wanted phrase to the builder: + +```php +// Building a Captcha with the "hello" phrase +$captcha = new CaptchaBuilder('hello'); +``` + +Complete example +================ + +If you want to see an example you can have a look at the ``demo/form.php``, which uses ``demo/session.php`` to +render a captcha and check it after the submission + +Symfony Bundle +================ + +You can have a look at the following repository to enjoy the Symfony 2 bundle packaging this captcha generator : +https://github.com/Gregwar/CaptchaBundle + +Yii2 Extension +=============== + +You can use the following extension for integrating with Yii2 Framework : +https://github.com/juliardi/yii2-captcha + +License +======= + +This library is under MIT license, have a look to the `LICENSE` file diff --git a/vendor/webman/captcha/composer.json b/vendor/webman/captcha/composer.json new file mode 100644 index 0000000..39ad53b --- /dev/null +++ b/vendor/webman/captcha/composer.json @@ -0,0 +1,35 @@ +{ + "name": "webman/captcha", + "type": "library", + "description": "Captcha generator", + "keywords": ["captcha", "spam", "bot"], + "license": "MIT", + "authors": [ + { + "name": "walkor", + "email": "walkor@workerman.net" + }, + { + "name": "Grégoire Passault", + "email": "g.passault@gmail.com", + "homepage": "http://www.gregwar.com/" + }, + { + "name": "Jeremy Livingston", + "email": "jeremy.j.livingston@gmail.com" + } + ], + "require": { + "php": ">=5.3.0", + "ext-gd": "*", + "ext-mbstring": "*" + }, + "autoload": { + "psr-4": { + "Webman\\Captcha\\": "src" + } + }, + "require-dev": { + "phpunit/phpunit": "^6.4" + } +} diff --git a/vendor/webman/captcha/demo/demo.php b/vendor/webman/captcha/demo/demo.php new file mode 100644 index 0000000..51e71ce --- /dev/null +++ b/vendor/webman/captcha/demo/demo.php @@ -0,0 +1,11 @@ +<?php + +require_once __DIR__.'/../vendor/autoload.php'; + +use Webman\Captcha\CaptchaBuilder; + +$captcha = new CaptchaBuilder; +$captcha + ->build() + ->save('out.jpg') +; diff --git a/vendor/webman/captcha/demo/fingerprint.php b/vendor/webman/captcha/demo/fingerprint.php new file mode 100644 index 0000000..17570d3 --- /dev/null +++ b/vendor/webman/captcha/demo/fingerprint.php @@ -0,0 +1,12 @@ +<?php + +require_once __DIR__.'/../vendor/autoload.php'; + +use Webman\Captcha\CaptchaBuilder; + +echo count(CaptchaBuilder::create() + ->build() + ->getFingerprint() +); + +echo "\n"; diff --git a/vendor/webman/captcha/demo/form.php b/vendor/webman/captcha/demo/form.php new file mode 100644 index 0000000..2957b7c --- /dev/null +++ b/vendor/webman/captcha/demo/form.php @@ -0,0 +1,32 @@ +<?php +require_once __DIR__.'/../vendor/autoload.php'; +use Webman\Captcha\PhraseBuilder; + +// We need the session to check the phrase after submitting +session_start(); +?> + +<html> +<?php + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + // Checking that the posted phrase match the phrase stored in the session + if (isset($_SESSION['phrase']) && PhraseBuilder::comparePhrases($_SESSION['phrase'], $_POST['phrase'])) { + echo "<h1>Captcha is valid !</h1>"; + } else { + echo "<h1>Captcha is not valid!</h1>"; + } + // The phrase can't be used twice + unset($_SESSION['phrase']); + } +?> + <form method="post"> + Copy the CAPTCHA: + <?php + // See session.php, where the captcha is actually rendered and the session phrase + // is set accordingly to the image displayed + ?> + <img src="session.php" /> + <input type="text" name="phrase" /> + <input type="submit" /> + </form> +</html> diff --git a/vendor/webman/captcha/demo/index.php b/vendor/webman/captcha/demo/index.php new file mode 100644 index 0000000..e543883 --- /dev/null +++ b/vendor/webman/captcha/demo/index.php @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<body> + <html> + <meta charset="utf-8" /> + </html> + <body> + <h1>Captchas gallery</h1> + <?php for ($x=0; $x<8; $x++) { ?> + <?php for ($y=0; $y<5; $y++) { ?> + <img src="output.php?n=<?php echo 5*$x+$y; ?>" /> + <?php } ?> + <br /> + <?php } ?> + </body> +</body> diff --git a/vendor/webman/captcha/demo/inline.php b/vendor/webman/captcha/demo/inline.php new file mode 100644 index 0000000..75d9382 --- /dev/null +++ b/vendor/webman/captcha/demo/inline.php @@ -0,0 +1,22 @@ +<?php +require_once __DIR__.'/../vendor/autoload.php'; + +use Webman\Captcha\CaptchaBuilder; + +$captcha = new CaptchaBuilder(); +$captcha->build(); + +?> +<!DOCTYPE html> +<body> + <html> + <meta charset="utf-8" /> + </html> + <body> + <h1>Inline Captcha</h1> + + <img src="<?php echo $captcha->inline(); ?>"/><br/> + Phrase: <?php echo $captcha->getPhrase(); ?> + + </body> +</body> diff --git a/vendor/webman/captcha/demo/ocr.php b/vendor/webman/captcha/demo/ocr.php new file mode 100644 index 0000000..3f766dc --- /dev/null +++ b/vendor/webman/captcha/demo/ocr.php @@ -0,0 +1,39 @@ +<?php + +require_once __DIR__.'/../vendor/autoload.php'; + +use Webman\Captcha\CaptchaBuilder; + +/** + * Generates 1000 captchas and try to read their code with the + * ocrad OCR + */ + +$tests = 10000; +$passed = 0; + +shell_exec('rm passed*.jpg'); + +for ($i=0; $i<$tests; $i++) { + echo "Captcha $i/$tests... "; + + $captcha = new CaptchaBuilder; + + $captcha + ->setDistortion(false) + ->build() + ; + + if ($captcha->isOCRReadable()) { + $passed++; + $captcha->save("passed$passed.jpg"); + echo "passed at ocr... "; + } else { + echo "failed... "; + } + + echo "pass rate: ".round(100*$passed/($i+1),2)."%\n"; +} + +echo "\n"; +echo "Over, $passed/$tests readed with OCR\n"; diff --git a/vendor/webman/captcha/demo/output.php b/vendor/webman/captcha/demo/output.php new file mode 100644 index 0000000..b6d628a --- /dev/null +++ b/vendor/webman/captcha/demo/output.php @@ -0,0 +1,12 @@ +<?php + +require_once __DIR__.'/../vendor/autoload.php'; + +use Webman\Captcha\CaptchaBuilder; + +header('Content-type: image/jpeg'); + +CaptchaBuilder::create() + ->build() + ->output() +; diff --git a/vendor/webman/captcha/demo/session.php b/vendor/webman/captcha/demo/session.php new file mode 100644 index 0000000..187a404 --- /dev/null +++ b/vendor/webman/captcha/demo/session.php @@ -0,0 +1,22 @@ +<?php +// We need the session to store the correct phrase for later check +session_start(); + +// Including the autoload (you need to composer install in the main directory) +require_once __DIR__.'/../vendor/autoload.php'; + +use Webman\Captcha\CaptchaBuilder; + +// Creating the captcha instance and setting the phrase in the session to store +// it for check when the form is submitted +$captcha = new CaptchaBuilder; +$_SESSION['phrase'] = $captcha->getPhrase(); + +// Setting the header to image jpeg because we here render an image +header('Content-Type: image/jpeg'); + +// Running the actual rendering of the captcha image +$captcha + ->build() + ->output() +; diff --git a/vendor/webman/captcha/phpunit.xml.dist b/vendor/webman/captcha/phpunit.xml.dist new file mode 100644 index 0000000..f17e3b4 --- /dev/null +++ b/vendor/webman/captcha/phpunit.xml.dist @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<phpunit colors="true" bootstrap="vendor/autoload.php"> + <testsuites> + <testsuite name="KnpMenu Test Suite"> + <directory suffix="Test.php">./tests/</directory> + </testsuite> + </testsuites> + + <filter> + <whitelist> + <directory>./src</directory> + </whitelist> + </filter> +</phpunit> diff --git a/vendor/webman/captcha/src/CaptchaBuilder.php b/vendor/webman/captcha/src/CaptchaBuilder.php new file mode 100644 index 0000000..ccfdef3 --- /dev/null +++ b/vendor/webman/captcha/src/CaptchaBuilder.php @@ -0,0 +1,760 @@ +<?php + +namespace Webman\Captcha; + +use \Exception; + +/** + * Builds a new captcha image + * Uses the fingerprint parameter, if one is passed, to generate the same image + * + * @author Gregwar <g.passault@gmail.com> + * @author Jeremy Livingston <jeremy.j.livingston@gmail.com> + */ +class CaptchaBuilder implements CaptchaBuilderInterface +{ + /** + * @var array + */ + protected $fingerprint = array(); + + /** + * @var bool + */ + protected $useFingerprint = false; + + /** + * @var array + */ + protected $textColor = array(); + + /** + * @var array + */ + protected $lineColor = null; + + /** + * @var array + */ + protected $backgroundColor = null; + + /** + * @var array + */ + protected $backgroundImages = array(); + + /** + * @var resource + */ + protected $contents = null; + + /** + * @var string + */ + protected $phrase = null; + + /** + * @var PhraseBuilderInterface + */ + protected $builder; + + /** + * @var bool + */ + protected $distortion = true; + + /** + * The maximum number of lines to draw in front of + * the image. null - use default algorithm + */ + protected $maxFrontLines = null; + + /** + * The maximum number of lines to draw behind + * the image. null - use default algorithm + */ + protected $maxBehindLines = null; + + /** + * The maximum angle of char + */ + protected $maxAngle = 8; + + /** + * The maximum offset of char + */ + protected $maxOffset = 5; + + /** + * Is the interpolation enabled ? + * + * @var bool + */ + protected $interpolation = true; + + /** + * Ignore all effects + * + * @var bool + */ + protected $ignoreAllEffects = false; + + /** + * Allowed image types for the background images + * + * @var array + */ + protected $allowedBackgroundImageTypes = array('image/png', 'image/jpeg', 'image/gif'); + + /** + * The image contents + */ + public function getContents() + { + return $this->contents; + } + + /** + * Enable/Disables the interpolation + * + * @param $interpolate bool True to enable, false to disable + * + * @return CaptchaBuilder + */ + public function setInterpolation($interpolate = true) + { + $this->interpolation = $interpolate; + + return $this; + } + + /** + * Temporary dir, for OCR check + */ + public $tempDir = 'temp/'; + + public function __construct($phrase = null, PhraseBuilderInterface $builder = null) + { + if ($builder === null) { + $this->builder = new PhraseBuilder; + } else { + $this->builder = $builder; + } + + $this->phrase = is_string($phrase) ? $phrase : $this->builder->build($phrase); + } + + /** + * Setting the phrase + */ + public function setPhrase($phrase) + { + $this->phrase = (string) $phrase; + } + + /** + * Enables/disable distortion + */ + public function setDistortion($distortion) + { + $this->distortion = (bool) $distortion; + + return $this; + } + + public function setMaxBehindLines($maxBehindLines) + { + $this->maxBehindLines = $maxBehindLines; + + return $this; + } + + public function setMaxFrontLines($maxFrontLines) + { + $this->maxFrontLines = $maxFrontLines; + + return $this; + } + + public function setMaxAngle($maxAngle) + { + $this->maxAngle = $maxAngle; + + return $this; + } + + public function setMaxOffset($maxOffset) + { + $this->maxOffset = $maxOffset; + + return $this; + } + + /** + * Gets the captcha phrase + */ + public function getPhrase() + { + return $this->phrase; + } + + /** + * Returns true if the given phrase is good + */ + public function testPhrase($phrase) + { + return ($this->builder->niceize($phrase) == $this->builder->niceize($this->getPhrase())); + } + + /** + * Instantiation + */ + public static function create($phrase = null) + { + return new self($phrase); + } + + /** + * Sets the text color to use + */ + public function setTextColor($r, $g, $b) + { + $this->textColor = array($r, $g, $b); + + return $this; + } + + /** + * Sets the background color to use + */ + public function setBackgroundColor($r, $g, $b) + { + $this->backgroundColor = array($r, $g, $b); + + return $this; + } + + public function setLineColor($r, $g, $b) + { + $this->lineColor = array($r, $g, $b); + + return $this; + } + + /** + * Sets the ignoreAllEffects value + * + * @param bool $ignoreAllEffects + * @return CaptchaBuilder + */ + public function setIgnoreAllEffects($ignoreAllEffects) + { + $this->ignoreAllEffects = $ignoreAllEffects; + + return $this; + } + + /** + * Sets the list of background images to use (one image is randomly selected) + */ + public function setBackgroundImages(array $backgroundImages) + { + $this->backgroundImages = $backgroundImages; + + return $this; + } + + /** + * Draw lines over the image + */ + protected function drawLine($image, $width, $height, $tcol = null) + { + if ($this->lineColor === null) { + $red = $this->rand(100, 255); + $green = $this->rand(100, 255); + $blue = $this->rand(100, 255); + } else { + $red = $this->lineColor[0]; + $green = $this->lineColor[1]; + $blue = $this->lineColor[2]; + } + + if ($tcol === null) { + $tcol = imagecolorallocate($image, $red, $green, $blue); + } + + if ($this->rand(0, 1)) { // Horizontal + $Xa = $this->rand(0, $width/2); + $Ya = $this->rand(0, $height); + $Xb = $this->rand($width/2, $width); + $Yb = $this->rand(0, $height); + } else { // Vertical + $Xa = $this->rand(0, $width); + $Ya = $this->rand(0, $height/2); + $Xb = $this->rand(0, $width); + $Yb = $this->rand($height/2, $height); + } + imagesetthickness($image, $this->rand(1, 3)); + imageline($image, $Xa, $Ya, $Xb, $Yb, $tcol); + } + + /** + * Apply some post effects + */ + protected function postEffect($image) + { + if (!function_exists('imagefilter')) { + return; + } + + if ($this->backgroundColor != null || $this->textColor != null) { + return; + } + + // Negate ? + if ($this->rand(0, 1) == 0) { + imagefilter($image, IMG_FILTER_NEGATE); + } + + // Edge ? + if ($this->rand(0, 10) == 0) { + imagefilter($image, IMG_FILTER_EDGEDETECT); + } + + // Contrast + imagefilter($image, IMG_FILTER_CONTRAST, $this->rand(-50, 10)); + + // Colorize + if ($this->rand(0, 5) == 0) { + imagefilter($image, IMG_FILTER_COLORIZE, $this->rand(-80, 50), $this->rand(-80, 50), $this->rand(-80, 50)); + } + } + + /** + * Writes the phrase on the image + */ + protected function writePhrase($image, $phrase, $font, $width, $height) + { + $length = mb_strlen($phrase); + if ($length === 0) { + return \imagecolorallocate($image, 0, 0, 0); + } + + // Gets the text size and start position + $size = intval($width / $length) - $this->rand(0, 3) - 1; + $box = \imagettfbbox($size, 0, $font, $phrase); + $textWidth = $box[2] - $box[0]; + $textHeight = $box[1] - $box[7]; + $x = intval(($width - $textWidth) / 2); + $y = intval(($height - $textHeight) / 2) + $size; + + if (!$this->textColor) { + $textColor = array($this->rand(0, 150), $this->rand(0, 150), $this->rand(0, 150)); + } else { + $textColor = $this->textColor; + } + $col = \imagecolorallocate($image, $textColor[0], $textColor[1], $textColor[2]); + + // Write the letters one by one, with random angle + for ($i=0; $i<$length; $i++) { + $symbol = mb_substr($phrase, $i, 1); + $box = \imagettfbbox($size, 0, $font, $symbol); + $w = $box[2] - $box[0]; + $angle = $this->rand(-$this->maxAngle, $this->maxAngle); + $offset = $this->rand(-$this->maxOffset, $this->maxOffset); + \imagettftext($image, $size, $angle, $x, $y + $offset, $col, $font, $symbol); + $x += $w; + } + + return $col; + } + + /** + * Try to read the code against an OCR + */ + public function isOCRReadable() + { + if (!is_dir($this->tempDir)) { + @mkdir($this->tempDir, 0755, true); + } + + $tempj = $this->tempDir . uniqid('captcha', true) . '.jpg'; + $tempp = $this->tempDir . uniqid('captcha', true) . '.pgm'; + + $this->save($tempj); + shell_exec("convert $tempj $tempp"); + $value = trim(strtolower(shell_exec("ocrad $tempp"))); + + @unlink($tempj); + @unlink($tempp); + + return $this->testPhrase($value); + } + + /** + * Builds while the code is readable against an OCR + */ + public function buildAgainstOCR($width = 150, $height = 40, $font = null, $fingerprint = null) + { + do { + $this->build($width, $height, $font, $fingerprint); + } while ($this->isOCRReadable()); + } + + /** + * Generate the image + */ + public function build($width = 150, $height = 40, $font = null, $fingerprint = null) + { + if (null !== $fingerprint) { + $this->fingerprint = $fingerprint; + $this->useFingerprint = true; + } else { + $this->fingerprint = array(); + $this->useFingerprint = false; + } + + if ($font === null) { + $font = $this->getFontPath(__DIR__ . '/Font/captcha'.$this->rand(0, 5).'.ttf'); + } + + if (empty($this->backgroundImages)) { + // if background images list is not set, use a color fill as a background + $image = imagecreatetruecolor($width, $height); + if ($this->backgroundColor == null) { + $bg = imagecolorallocate($image, $this->rand(200, 255), $this->rand(200, 255), $this->rand(200, 255)); + } else { + $color = $this->backgroundColor; + $bg = imagecolorallocate($image, $color[0], $color[1], $color[2]); + } + $this->background = $bg; + imagefill($image, 0, 0, $bg); + } else { + // use a random background image + $randomBackgroundImage = $this->backgroundImages[rand(0, count($this->backgroundImages)-1)]; + + $imageType = $this->validateBackgroundImage($randomBackgroundImage); + + $image = $this->createBackgroundImageFromType($randomBackgroundImage, $imageType); + } + + // Apply effects + if (!$this->ignoreAllEffects) { + $square = $width * $height; + $effects = $this->rand($square/3000, $square/2000); + + // set the maximum number of lines to draw in front of the text + if ($this->maxBehindLines != null && $this->maxBehindLines > 0) { + $effects = min($this->maxBehindLines, $effects); + } + + if ($this->maxBehindLines !== 0) { + for ($e = 0; $e < $effects; $e++) { + $this->drawLine($image, $width, $height); + } + } + } + + // Write CAPTCHA text + $color = $this->writePhrase($image, $this->phrase, $font, $width, $height); + + // Apply effects + if (!$this->ignoreAllEffects) { + $square = $width * $height; + $effects = $this->rand($square/3000, $square/2000); + + // set the maximum number of lines to draw in front of the text + if ($this->maxFrontLines != null && $this->maxFrontLines > 0) { + $effects = min($this->maxFrontLines, $effects); + } + + if ($this->maxFrontLines !== 0) { + for ($e = 0; $e < $effects; $e++) { + $this->drawLine($image, $width, $height, $color); + } + } + } + + // Distort the image + if ($this->distortion && !$this->ignoreAllEffects) { + $image = $this->distort($image, $width, $height, $bg); + } + + // Post effects + if (!$this->ignoreAllEffects) { + $this->postEffect($image); + } + + $this->contents = $image; + + return $this; + } + + /** + * @param $font + * @return string + */ + protected function getFontPath($font) + { + static $fontPathMap = []; + if (!\class_exists(\Phar::class, false) || !\Phar::running()) { + return $font; + } + + $tmpPath = sys_get_temp_dir() ?: '/tmp'; + $filePath = "$tmpPath/" . basename($font); + clearstatcache(); + if (!isset($fontPathMap[$font]) || !is_file($filePath)) { + file_put_contents($filePath, file_get_contents($font)); + $fontPathMap[$font] = $filePath; + } + return $fontPathMap[$font]; + } + + /** + * Distorts the image + */ + public function distort($image, $width, $height, $bg) + { + $contents = imagecreatetruecolor($width, $height); + $X = $this->rand(0, $width); + $Y = $this->rand(0, $height); + $phase = $this->rand(0, 10); + $scale = 1.1 + $this->rand(0, 10000) / 30000; + for ($x = 0; $x < $width; $x++) { + for ($y = 0; $y < $height; $y++) { + $Vx = $x - $X; + $Vy = $y - $Y; + $Vn = sqrt($Vx * $Vx + $Vy * $Vy); + + if ($Vn != 0) { + $Vn2 = $Vn + 4 * sin($Vn / 30); + $nX = $X + ($Vx * $Vn2 / $Vn); + $nY = $Y + ($Vy * $Vn2 / $Vn); + } else { + $nX = $X; + $nY = $Y; + } + $nY = $nY + $scale * sin($phase + $nX * 0.2); + + if ($this->interpolation) { + $p = $this->interpolate( + $nX - floor($nX), + $nY - floor($nY), + $this->getCol($image, floor($nX), floor($nY), $bg), + $this->getCol($image, ceil($nX), floor($nY), $bg), + $this->getCol($image, floor($nX), ceil($nY), $bg), + $this->getCol($image, ceil($nX), ceil($nY), $bg) + ); + } else { + $p = $this->getCol($image, round($nX), round($nY), $bg); + } + + if ($p == 0) { + $p = $bg; + } + + imagesetpixel($contents, $x, $y, $p); + } + } + + return $contents; + } + + /** + * Saves the Captcha to a jpeg file + */ + public function save($filename, $quality = 90) + { + imagejpeg($this->contents, $filename, $quality); + } + + /** + * Gets the image GD + */ + public function getGd() + { + return $this->contents; + } + + /** + * Gets the image contents + */ + public function get($quality = 90) + { + ob_start(); + $this->output($quality); + + return ob_get_clean(); + } + + /** + * Gets the HTML inline base64 + */ + public function inline($quality = 90) + { + return 'data:image/jpeg;base64,' . base64_encode($this->get($quality)); + } + + /** + * Outputs the image + */ + public function output($quality = 90) + { + imagejpeg($this->contents, null, $quality); + } + + /** + * @return array + */ + public function getFingerprint() + { + return $this->fingerprint; + } + + /** + * Returns a random number or the next number in the + * fingerprint + */ + protected function rand($min, $max) + { + if (!is_array($this->fingerprint)) { + $this->fingerprint = array(); + } + + if ($this->useFingerprint) { + $value = current($this->fingerprint); + next($this->fingerprint); + } else { + $value = mt_rand(intval($min), intval($max)); + $this->fingerprint[] = $value; + } + + return $value; + } + + /** + * @param $x + * @param $y + * @param $nw + * @param $ne + * @param $sw + * @param $se + * + * @return int + */ + protected function interpolate($x, $y, $nw, $ne, $sw, $se) + { + list($r0, $g0, $b0) = $this->getRGB($nw); + list($r1, $g1, $b1) = $this->getRGB($ne); + list($r2, $g2, $b2) = $this->getRGB($sw); + list($r3, $g3, $b3) = $this->getRGB($se); + + $cx = 1.0 - $x; + $cy = 1.0 - $y; + + $m0 = $cx * $r0 + $x * $r1; + $m1 = $cx * $r2 + $x * $r3; + $r = (int) ($cy * $m0 + $y * $m1); + + $m0 = $cx * $g0 + $x * $g1; + $m1 = $cx * $g2 + $x * $g3; + $g = (int) ($cy * $m0 + $y * $m1); + + $m0 = $cx * $b0 + $x * $b1; + $m1 = $cx * $b2 + $x * $b3; + $b = (int) ($cy * $m0 + $y * $m1); + + return ($r << 16) | ($g << 8) | $b; + } + + /** + * @param $image + * @param $x + * @param $y + * + * @return int + */ + protected function getCol($image, $x, $y, $background) + { + $L = imagesx($image); + $H = imagesy($image); + if ($x < 0 || $x >= $L || $y < 0 || $y >= $H) { + return $background; + } + + return imagecolorat($image, $x, $y); + } + + /** + * @param $col + * + * @return array + */ + protected function getRGB($col) + { + return array( + (int) ($col >> 16) & 0xff, + (int) ($col >> 8) & 0xff, + (int) ($col) & 0xff, + ); + } + + /** + * Validate the background image path. Return the image type if valid + * + * @param string $backgroundImage + * @return string + * @throws Exception + */ + protected function validateBackgroundImage($backgroundImage) + { + // check if file exists + if (!file_exists($backgroundImage)) { + $backgroundImageExploded = explode('/', $backgroundImage); + $imageFileName = count($backgroundImageExploded) > 1? $backgroundImageExploded[count($backgroundImageExploded)-1] : $backgroundImage; + + throw new Exception('Invalid background image: ' . $imageFileName); + } + + // check image type + $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension + $imageType = finfo_file($finfo, $backgroundImage); + finfo_close($finfo); + + if (!in_array($imageType, $this->allowedBackgroundImageTypes)) { + throw new Exception('Invalid background image type! Allowed types are: ' . join(', ', $this->allowedBackgroundImageTypes)); + } + + return $imageType; + } + + /** + * Create background image from type + * + * @param string $backgroundImage + * @param string $imageType + * @return resource + * @throws Exception + */ + protected function createBackgroundImageFromType($backgroundImage, $imageType) + { + switch ($imageType) { + case 'image/jpeg': + $image = imagecreatefromjpeg($backgroundImage); + break; + case 'image/png': + $image = imagecreatefrompng($backgroundImage); + break; + case 'image/gif': + $image = imagecreatefromgif($backgroundImage); + break; + + default: + throw new Exception('Not supported file type for background image!'); + break; + } + + return $image; + } +} diff --git a/vendor/webman/captcha/src/CaptchaBuilderInterface.php b/vendor/webman/captcha/src/CaptchaBuilderInterface.php new file mode 100644 index 0000000..420dbbb --- /dev/null +++ b/vendor/webman/captcha/src/CaptchaBuilderInterface.php @@ -0,0 +1,29 @@ +<?php + +namespace Webman\Captcha; + +/** + * A Captcha builder + */ +interface CaptchaBuilderInterface +{ + /** + * Builds the code + */ + public function build($width, $height, $font, $fingerprint); + + /** + * Saves the code to a file + */ + public function save($filename, $quality); + + /** + * Gets the image contents + */ + public function get($quality); + + /** + * Outputs the image + */ + public function output($quality); +} diff --git a/vendor/webman/captcha/src/Font/captcha0.ttf b/vendor/webman/captcha/src/Font/captcha0.ttf new file mode 100644 index 0000000000000000000000000000000000000000..139f0b4311ad2e0369a347b3be6c46e6c2b730d5 GIT binary patch literal 49224 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 literal 0 HcmV?d00001 diff --git a/vendor/webman/captcha/src/Font/captcha1.ttf b/vendor/webman/captcha/src/Font/captcha1.ttf new file mode 100644 index 0000000000000000000000000000000000000000..bb1abf6b6696261ffdfd5c17b74dfb03ce7c72b5 GIT binary patch literal 76232 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 E9p1;Cxc~qF literal 0 HcmV?d00001 diff --git a/vendor/webman/captcha/src/Font/captcha2.ttf b/vendor/webman/captcha/src/Font/captcha2.ttf new file mode 100644 index 0000000000000000000000000000000000000000..50dd77d237ee7b62a76a179604d23b52037794f8 GIT binary patch literal 24108 zcmeHv34ByV)^BxpdP&`+S&|N+6Vgq95E9miD7$PC0ohSu*aAsNNYV*OlZ8M8MU)T` zMP!wI4Lh>P8bDM=f&v2W2(Bo*3e}kk_WPgefQ;k#X5KjSd*AmP;yqorZq=z%r_SDe z?K5y-9~QtSGXs05OMJZZKv`NOW9^SH=1h6GZ=V70kF4uq%>EPZFFrhAQ0FiE|M&r8 zZ9ip9cd^faW^pr0J6}b+Ib&?(=!}G{3$Z_+X3V&fF+-b_q=dvD%HCLpXXUtBrJ%!< zYsklVKit<($#CbtV!yqfG0S<z^gpL1WxEa@Jk*APAjYgeWhCThv4efl)<pxDTnQOT zG41nu<9-%ne!*FpId0I6f7*EfC({AqiVIyZWJI-gH<`h35k2f^%)v%?KD|f15r!Ft zez-R<J@w)r<`|q_JK%ae|Isi*Ve&om!7|1`$3fia^$z_$W@LW)efnbDm-s$)pRqXh z7d&Q06G+lCzsZbk?#rA#Fh>20@7%u&8cwO#@B8_*ZkEBxzH#~<G2qw-`kjpUV%K%J zyM9~TgE|HMS=*|%o|#$Ks<weSSkJ1qANysDk!fsfRlf=S<Ez?c){qrdwJod~TUFKe zzo*SvG}~U)udxvJX;nKwwGB8ve^8XmegF@ttz$KHDOGJfv+5>PwGFI;?zyVAAI7{@ z)i$ya-G^0e(>?uW)?0VAs^7vQ^zEwJ{`a&w>#HA9)vvL}`qHX)0JXbhW))<oj!AJl zqenM##x-xz+&QYiIUqO5otcxKkn0?fnvt2?)Y&OL-KmD<IJ1*-lCpD?5}S6(OiXfi z&P-42pEPECdP4TyNor0T=iTRR6yC>@vU5^1UCtIwo70mfH1qBdXKIc!!RgLUNKDE| z$WC)+COhLZUGC(BQQ4`Zo8HCjBj-^}&vrQzT#3%4^rSHfF1Ir$!Ik3#U8%{=<m{v* zXEG)?O>w)k+B9oM?J7j0Gc%g8E-aH}u>zLOQrQ@m!rYLeXf~QP!e<<7&RXDdvQZe} zWCL(!Nf?pIa#%V`z#a9avJCX(vZlD}g#L7V{(>z>-6dg05_)NVB1Y1xiD)}nXSCAM z?vJ}MkTSxX{TnO&vQ8V!`rG-`dxzdTPn+Du{+L=l2ef7~7e=-K4b6W8ixVS=;sji7 z(2=01%uqC?p)Zpq1I8;XZnP7?8QSY;;QM{<Jc>EA<7~Bl0$?IAC1Jm`Z@MSW=cpD@ z;Nw@SS}z&1lJMum9ntT`YIIU=oLn2$41ag}|C*xF7@dKqWUJJri>%VbaFTkM2H0wy z3D55QLtoX1J3Z=Cr#HZ~7@N|K3C6?X&$WO+Yqjb%Y6hVznA!G+)C#R_4-2mo;c(WC zOsH4CK~%%&MlrE4eE1iaJSHV|Y+8DTD>G|cc8+^|ZeD)Dgu;oFiVmpf#WO~~ym0Bt z=SybJdf~;@YuBtR-LQV+rp;ToY}@|YuAQ&%R)c)tzE+QnN{VMadOpKCcJ9>nVaD3L zw4+61){S+4h_U9ar%hjyIJIhguf0z<X~)>3y%i6hoAc}|v**oUF!$BPY|-)+%UH|% zG4261)=wXb&x!0ISmt&tlGTTmYYZ;8WgQ_yePFx?vmtCGv|s{T2Aj7Q_H7p{V{fvz z*?a6P`;dLczG2tcEq0rEbpvz>x_n)c{w@8-`cDn(3<sT2&aTc4b%W|g)omK7k2FPA zi>w)Gi?l~ZM8-yTj~p49)Zm@-HKg9_1r<)L9;H@qj@3IsO8c^YYV`!HzVx2e53;w| zQFaomf5gtSZ`lpz!Rq~WBeD9V-(9^1R<C_`^+c@Bq|WR0Uhtl0%=@wTBkzaaGibff zYIskvBwR*#4CX!Wo#}njoA1r`zU5uyJ?4GK`#e0}25*`7fOo%lAMw(wc@4K+w};&x zT=`;U;d%b~cc0JtJm&Mz&u5-%f3D5BIL6L3Jr{c}`ds)q_Stuzee>~C&OXLoRZ<7v zUiB~gPNV8G`B(RUd)uAe^_747u&Sr=-+5xhS=-ot)*5_IWK-Fb>?xf4gHVPqz1MUj zG3z*djuYNH3fB|h##ygqi@dk>(cas-K<_bqkk_j>dvED$cz@J~pdI0@&`EEF-sb&_ zzP|ToHphFLm3WWpe)eA0_wt_6!<Xr2uo}A4EI@aN1?bP<{ytVs_l);1x|h8d^?`VH zmIdnHU_ts`th)Y|_h<dj%&4!%YUpDSJ%j+yqpYTWi1!1-0Ph$2!QQj_2fXjHcR*)6 z=zShEt^$rT%&ONz+i!XQ0_m)-dl2}CvT)rD7OAVn8pB^Az(K%q5ZBYVzVQB}`>yI9 zk(7QguD5Yzffs~#6+SCqOkg#1-{7L??Vd~Dhz0Afu<C~O%%*#vX?L$vRqbQgEB1*! zg{bQhX4C)r>gWAh-^Y7J=LYUISi2gt8oGPW>GvWcYY(1#uz%uV9QgA0_?YXxu3Loj zAU>YM8u#+i27D&)GU)etsrcN&`=y>P;yL)M*2kw>pJ=%E>hJyJukP<WLqE~4&YI5q z&Q<8WsUte8uDj<<XMOKQ=X~!)>w_0}@%*#+h=2Fuqc-8B>qXX3-v)fOdB602iSs7U z@%#VaGpyH{PG5+q+h6|$^vH(j!Nx+ow*YIYd%O2CKEqiIU>%0@W|7`Yfb|q?phiY{ zH=-xny9=<9_YhzV<AAZ=4S>mNZVK#^4gQw;U92Twrs~f|%f{RaPp*Om3PYi{9Q_l$ zX90`6hY^2<<7o)1<NW|I%6kDY8nlIA#hZY!peF?Wm;+|2c7cKuR8JY&*bipa0-m#g zb+Ae;;MoNj4cck}4~>aYV`8yNEtaf$GF4B3f`zJQBG#?NCaGCPs=o{{6qItnDENU; zL}Ju#gjhTj`*Z-ts&*Mh)n+E|en7K=H5Cj}(1u;t2LCSs+7+w=3Tv|lSg|%RI{+!Z ztF3rf8#t+_44CcM-6g<q1?ymsc0A*NQJ~X~ebLic@XC&T-2x;o*;#>lI!W~qm%`vf zZGh1V(y52zasY;4ZaApA02rxYJ<JUUZMOiU)W~Si=986hMO!$|nlNN4=vEkVv6pc8 zW5QXe`X_?^aO{F4%!V;_a5|R&iH16et2iKyi~tR10qr=Q2t`8#<dAxZh6t9T+GEwo zbk%lYl?bd(FdsN0unL_9os<LE4guQ1VF$1gtfycD%yocoLjW6Mrw&L6VQS=k8Zg#N zw3i`vs;elB#A$vAu9+3Ic|S)x9J3;otVROQA+)2hdZd!ENF`&Dz;hlwbQX~~g>t|N zpevG*j73872~JXYNXF_ZS*@q=)B~Pd=phXCK#2o!M<{kwAA7k8NK#iHPcN|s;O8ws zl8OevP!1T4F%5u$V2pyXz~2BgTm~${_$albD7B*~RulV*VnGVppy^TITRET|t4HD7 zG(gg(DDdzsU_I4t;5~*mNo*9jL}QZG+!U-8#nKf9isz#shlc^(YHqITFTfc^;lyd~ zMDQdEd8-X^T^-DgR<uPc+M*S0(TX<63eGMXv|R!u-H8TmI5|aIG-x}IHd(D`NXt#Y zC~zzqRM9N58_|#-!cP(#4XUW$t$K15q*HICR&S(MZ=_alq*jO3#P~*7{Q@9yrV$GR zKO157azN6TMp&I7>2f0_)s58Zjnul0z!RE9>o!vBHe$4HBPF*nz<d^5A<2(Xe2xLO z^Jq7~j$(kJ9FSx_M$sRmG%f~ssGlT17L@M?B%2cp$_bLqi3Q~w0O?F)75-T84YphH zEmo}+i?!$}tre@zF;=Y@3wy4iCmmG9V%-?POf}N2dh)^NSf%L+SmhA*OnQ+3%yR*w z@H9c$r3A<-wUaS7fsqwTR_B-uy$6plaw8!5mt@E-!C2Kp8C^0cIS-hM(@6#;w*WIh zf3l*7va6P8XQ`fX3X;c3MwUj9{7y1*SDKrv*3DD>M0qkag4QKZlni|&Sma#+S+PO) z$3Px6K+?o9cwz(0Rz2fYo4n5$XtaiWkE~e=c5wkP2IEtdZl++r)TWUsSmh=l`IHo_ zaufR@d!C9}X91%zG8Jo4PYlMS0s}$vP^rwNo{~LJMP^A}mh4HYvLva>lB5FjW%LxO zS;XP7;H?9YG;}N^-3dr`V=PXQdXg0+4IK*}63oV~$Ko_?fQ8VPv22oR7pZ=--f5t@ z9FXKE4ZHpTFbY`HfZqW~o-0k^PlH_0m}KlO4JSoUNpjL~3O51sv7<C4Icdrcq$xX) zh7~#bi`4isw9_F`w*X1Y(qS((z$n#2)-PRgI9>549r!P!hx~Xt&V}ZZbxl_mFC9{M z0df-psxm+!2c$F2z;kNTc(MzmU1VWg(3D$%;i|t5_T^HXbg7-Xuu~dO-qVGh(o^E6 zOKG|bQhEVx!sk+Yin;*K#ijJ!r8w+T{?4U#?NWSpDI4g5wWnGJ`Swh#r~wjhDVE}Z zu~<11=S=-XIaLt|lKf{X*~o;nQ@apjvXoWH!d}jz9gcI%f>hW5$zEkCJDCNV=_%=W z7HEtCBzedJ&D5W(An8jMo1h^1Bhs{BK(bonfd3L8NyRv&(c^&sGTKqz=K-VPRmVZL zHv$sR$0^$~PH|}*RwQh+zj12CaY{DE;T#LlGeKc4RCp$OXQHP_VIyhG1~v_FJUEb} z_>-fgE=R4BgD0Fgf}OgRe{_SMa<s`)yOplFp=)Q+CjW?<k%BJOLq5w58g>B|s($j< zZb%f3Cx7jRM4cyI1Lt@prQ?;fkB1yCN6$FO&v>Pk<CO%CR}z>Dj@?47jdU{?^c)5x zt<MDw<$xqJx!|-0NScxh8V&&#Vy#?gI>92)kf->Z2aO0uI|k>K2YuB52}2(E!~w|? z<^%IBK;lw9uw4cuTa*uM)K8INK5$+lxx^V2fWmS>yMlD41vpLWA@5M2w4eYo8G|-S zegSs99FU}_0B1@giG~93;Siu3dn~|S2$I$p;E$eCyjKAE4+bQyFHrJ70U8<%ZA7#S zNRjFUoF)fMQIKrl1n{1E#$&(00?dV=`2rxtu7yet3t=&ip-oXip_21L(0K@L@+O5! z_6il9g`ks0QY28Qq`eSy-b9<?fkOOoToi#%#9F%mX|0J$<|kqm>Y=!3B38KtNb$x* zta1sE?7&2<!U4(ePlQxZKdm)Utu+yAQBMKJOj4L9Da@0A^AdUp=Oo43Ns70V6t+o9 zQzijJIi3<%CxJpv9K<R`z;hOmxKRWO4*?P%iWIgYb%I5pb0d1_)QW)l13)^pBE^j& zMPU)}A43mOSOf~G3PZ8wekHMpEP#JMe4qwMR(C(->K5QcHHIYW0M@+)NEYmXvTS8) zk7bIsGG&p<lrEGZ0{H+V$ZM2=stbU`y)sZmu{cHeWuWR3AX%g`wd*pR4E2+rD#Hp6 zRjcC20va=2dV<@<Eb4m~hU%RTsj`l~he97(>hi<4In=f=opY=jIZ5ZIbLkf8&gm-k zt@J7ST>U})S%byU#_*6~nqiS)li{>q8^4GAUh%tV3^Aq~HyN*+;!JMSPSX+7$ENG% z5OX{8DD!jXO_l)5SWAiJFaFW~+5WHdNZyr?<s10-+JjoIR-%0$5FRijV0&OhU`gN? z)<o;_YN6GpRXbn3fAvMx&(#R1(YwaV8dqyRQS)$6<Dgf9S@784)3y$_wIMY_CWd@d zYiO+rwdU2@S?hFYL}*Irw$RGj`r6%V&#ZmgZnuxLC)?BQ+4g+<V*96I_OK_yUJ3gt zynpzXI@UVQI=OYqBO)X6Bi?n?cf>nV9L0_ej;qe<&Isp7rE?VF-a_tc!wFFq7lYGz z1gCfj=YtFb&nQ--NR8?M<ddidKotPeE6V;U_a|#kwuhoG%K6ELQItj5KIQtz2GL9L z1I0{~<x{po9-ZQJ(s7EJ$R|@IQyo%`oD_3a7J{`YpC_wHxjbd^6eUp>Pf|$P73J>~ zX_1{Kzi$RD9CA<JpKy3k4fG+;!zcL>tBRZ{Zl<W2VrH`G6a|o9BMqmBp5iEqZ^-9U zR!$Zn03$Cc-$MB~W#g2KQzlOFE=7O7y_{E8miA&$HjVOL!c!9$WvR&7K_&TQiuo0n z@q}WwJFAgyQjSd-Hs#ko+l2Z_)gFwX1bH=9Al#HulYPavdZ3GP3LoyX3ODKeSUja{ zg0zcti*%eaXY2@bDQ~8%nQ~^zm?>YTY?*Rp%9JTjrYxCqWSv^EhRT~LL#F(gvH;)d z9>Vxb_nZ|Xc_k0!I9*%SS;5X>Je`#htI+Avj9XaYJXUZ(FDdt>%$H7%q{JVqpeBJ9 zd33T#BtMkvl1(BXM_DdaVLnuu9A&ta-;#eL??(9><+UVFWV<P&_2sjaPio3Gk_{qn zMiH`#1~887E#<Ccb>IzP6>Zo*Wv#Z~SZf#7^2re8slK(4&!dm>Q_4=sSCGWhTIz&x zPriZjLOS8#zk~IH+5zRC6c_u>78yS7>EsEkkNWeV{1=RL#`w+``|wEw?VF?x*$J@t zq~VT~l`Dy$UF}yH<u97Cp^AeaC_noP2T^$dCh{tTjUrU?Dilvr+)w!;c~#mK^chrA z1VlPTQhu*S`r>Gcf$6(SiVh$r7*95yG7-|)|6=g*;jgWUQE8&G$>0%1+7to*cCWvR zvna|U>7_V}qAZHB$YN1^MbXv&ucK=H({f3Y_It8Pk<K0Y{P$wFzzQ9zvXFCOzsPRg z@fYRF--Y2c{xg1<bm^b-#Wn9*B+}u#b{@L=YtQ<7cAnP#V?2gk*;uL~{Sue#f)}8= zjuV!MViE@|(Jkc3l#Rn0AwHpOnKD?4QK(KtaSGLls6s^bAtedG;fq<y;Z0T`Mx>0F zYC`0jeA=a97P1)3qB@X2bcsCD1)L~(FS3Rd`&<H^n^p11O%=`1sI%}}x2injd5k8{ zh`Iy%d>Tl2%kS}!<kR2}F{awxb?(~Ed)8C_>W=OF)!M}OAjn^NmF-6S1<p})?u%?F zCW0jZZ7MFnILbkNSsUd-KCegF8dYd0<ERE1ph%8t+1lUi-M1S=D|k-P+`W9DxD3A* z!g^$}h@Vu?pivZkQazM>Cw=okzJlt=<SU3$j;9oZQEkvs<>{*YC;F+<;`5*6Hz-1~ zRrwCe5uAu{sJ23t6~gATmW_P=3Ye*yLefE1Hac6XqExH$nP)*uFleD~$jIBGo(E3d z^>V;X6%)!%NPehRLeUHDFt`c>Vny7Mv{HS9sv}ezp~?vD-{*yCC%$?QVN<+Eq(yZQ zs)A4rgeo9(lD{YWs7n4*vd@24_QQTt%Y4!QAFpXP#W9NR?&uR~-JPiLu5Muz)oLg< zqq^+9nn-d+^%`FefO7yZoJ#IVs+7dy49H^mFjF>DWi^2DH#vtIhq4-w$p4$wAX{+9 za!^&4Vo{QIk|XE}NgrtT<u7C>P<KW@#eb^q1KNH0(s}HGG6%|Iko(*{1FHGlYwf7| z^J|MowV*%3>izb~|9Z85btS4nk&T6};7oiGy3a;Y<%!}-pZ3%D572s?g-`P+I!D9` ze@ay*sxkR&)g8?bhUTlP2=q?b6O2~chtGRC_($)D_JZ6F^iZwH_l+t=TF0RG6me5- zcu2{auTo5VIEFn?<nOZ{zWfgPFU}FsE~L|k$(N5(&O%wDFVaUH95boPMA1G~n0~=T z6*~?bcV<&2PcwhvA8Mq)Mwt!qj%@m!^(arEJdSdtJ6Y+SDC&;gyO(l`pi~tR-2Hdt z4a8BZ1N>qa{!#z;SGEAuQQZ5ViLm~=(!WwC`rpYtvPA!hi1qj4gFiMl{_jfvN@nq& z<KCSZ;x{TUDh8!!`qvqguM(qTA6QMQ$o$=m3D2ogL*Jy|Tdn#1>g&JnDf|V+-|)8o zYIXI0H>N+bg8Rp0_5b^@_^QNz3;(g2!M~RA|IeNM@2v#<7rU>v{<k#}zpA>(FID7! zPfq?{tpAfZV7dF9!QcD7;6F3sU(Zi1Ro@v>-Ti|41%vOKWBh&t(E|N)0pF}38>R{& z)eNiOlgCp9kbXx@zlfxo9eqo9r)K9sE{)&vs2u*5s+Uq6M88YWtC}#?a`ec?DK267 zbuoPd-3M={g|I<vIDV6zfVye}_B7sd>B6S5m3VV%HQSB1UiRWIAHS?9LuCm6P}9_5 zKF3>i*>`{Ez?p8~p#JpBbo#Xey=|()TKH7IeK0U%LP9#;V@u9X7|o*6Q^zE*#tOE~ zp?<tiqHq$V_X_lCwhsqEykdsRX)x+2_35`2YIJ$kD!zAHb+8$}Ra;g)ABE4WxbW)= zJb4s2U1-r8r@o%v=oyE*6RO7#`w7M`H=-2vO)$nnEnL2qfuRp~2Gyg-+g6cm1RDwd z4FvZdV^6SQf7Kq2H?#WU-NgayalD~5nEi<j{f(aCpy9DU2$K%`NW<mZUnJ^%HE<fW zajtbyXN<*n?rEqm=b*-2gfpJaUS@OHD{LX&T3gOm;I!A^-L-YBlx=1^@dn%LIQhL` z98N-~<9FXgrMo7c>dezs=jj%}Jn?!@yulOfHzU9>BfxKf%>9d_;%lSlyJ{70*4P$a zeM3#WJgX=oYN+x-HScDu72aQq$C(TSR}%4^NFJNaN<h;qY(85II<~Px>|OT0dVB6$ zcA4G6wyNpEb#--3br0w|>bmQm)~(lVAMZ+S-n>(D`na!C>#Wpn<Fhl<Q{CA~eKPRA zYgR(GJ2fFaF*P~4Yf`#9AuBsGar|g^&iIUs1UFu>#k9D%7Wex;TH~GC)X@p)sjlQy zSE{=p)#Xkalbw*BkcDaaN#n*Rq`NZR>N7nlCr35LWG5xKld^rCnG=#+W0I0bq$ZC@ z@75GT-7R7Ccz2R&0a326H99qW^!SYA^rU?CATbrwb5e8YCZ0fd0=*S*r=};WNrUKi z&|PeU?qVDC*VqQ#i)}DX8hme0PEu}?i+WwDE`>KK$DImJB;obq|L2#R|Iv4h@4mrI z+N{I7><qt(VSx-%%4%q^aZmzQKY+zqpi_8h7T*QKxS)E-3jNsAIv66|vkmcbF2kGg zTN#^4ud%Vtq3j^TdzS1ghPN#7$|GbN;>0#FwqD1!Ft!nI$}@Hh@3HCdnjYSOqyJq1 z-tgbS*fu=`obA-JJq#9-L>(`r?q}=>V~6y3dlTZvPBHeL9`A6n_w@|_Z-P%4`;ZI> z`<Ovg*#*3>sApg3bXcMugM#CoP<D`{y%#J&A)5zjouez&y`vA)x79zTzibFM<QR?` zF8Ph{+wOPF@3QeR;}gaq#-YXp<7i`&af~tBINLbKxYD@VxYk&T-*#;^ZZ{q=zGXaW z{MPuL@scUTRNK_d)X6l$^k>r<(*@IIbC5aG9B=M!?rH9A?q}X=e$Bko{JMFMdB6Ff z`3>`1=A-6g=Huq~%qPw7o6lIHECcYXuw2Vj%VNuV%R82@{R8~%{sa6U^B?9v+5cJp zJ^tTt2YxG7pEu-<cr0(ioADOBC2z$a<n4J!-ideNy?6%C<VAcke~M4#&+-|3CV!DH z<16?oeuTfpkMehTIe(X*;HUU$4KD+0R;{{LQw!EYv{22ig=-O-Q;XE<Yf;*L+Wp!C zT5GMX)?VwVb<(<M-L!|bN3@>Wqgo%WpEf`nq&=<;){?apZLF5AxwI@TTXW+VZ28&* zZK77BP1c^$rfSo)=d@z{s_nY=qjpmhMKgrW(_94W#tEC4E^LMgA)W~p%_}FEJT+y8 zO-?dD{?Xk0#5XPL<V2f%*z}dCV-)@U?h|&S=w^~JvcT3}a-%3RTV;K#-1V$z?s+m# zw`Vh7U(wfAx$`H_PV>OZ&un9}vXe4aXKvWKYR$T><5ng)tTNHlN{rWS`oZvgMQ@ud zxhzV|J41Y*)<fc)2+|3s2zHCw29Z!P(AINGzl@|Ijimju>?iJDXpv*g!{-j$K4nL7 zNoZ8DajJQ4-OG=DS7_;d?Wp<Il52ZKUAwSFAC~Ne2r<&U{h4j)b4FgB6Iyh$<$<^b zmO~BA*D4ciqVb$uIabzs!6F~=jI_PFqICZH*%mp-+_re+x$Wf^>yJgE=A6U)1yQT5 z2r+nEo+CD4NNBgIWtcQcbG!_Fd{N&wQyuY{8IMjKJXxC0OOxm^(;{MLp8rG`?ZW@$ zHTjXb?YMpW9pxqOY$^}i{d!@)RSsEKj<<>C(rD`a_^4J=KjhDEybv*K@0POfp0ilx zrrDyU;Zi%>SE83u`kOk-UPi0D_?&32n<|10M??UzGdW{*`i3p5O4n@}w=&sbePfEK z;fX!W3viB;L8^GsbINw>pbVhD$E4<z>~W!q01;3Iz#NsQ{X~Zgq8<I+FWSovvSTaR zUbd6%&dYY9BhDvpUT%dWPxrxQE;2$Y2DCBDesb{#1HTi&#>$t>)=k^Er|w}cUdCcS zdQxp4&3*li3t{4c)v`@Hsdto^<Y#h&vAyTX%kqr*`sb@&z51C&go=J$#4h=2n2c)M zK-MU5SeJWhiZHiu>O`?<U=U5j5!+9uZ`Su6^@5|{tjBvxL)d-8_P_Czqsatg?7~wm zMNF7z_xX+MC61C4nMZnUu^iYq@5o`h2rrh}pQSOZY17B+W;?zaZ#*>b(7J<R$KOrs zHf&tKZjMNkb;G<|5dtRF%hQQ<n|YBauyqwTWZX3ocjQWcPv7=t`E+G}o5&O^jB<t9 zy4B+p)t@=cUlKtg5SuI(_u1-g|8$`64-*}}5LRI=b`*az<U-7A9ZDaZ-XYrpalL${ zvcJ4wJ~HmyzE5VKORas-z2=D__AVt)bgLH@KV<8XOow&%6cKbBj5wdC%NG&CC~6r* ziKn{l$Nk;9bsPL}z4}kQck<+clRr3QN=VkI!ofrAGT?#?5bZ^W^K^WlCVtjoSHzIj z@iQMU5FN!cp|ZNk`pVo~&yvGD*VDi-6?zvfD$VlK$}2`;F^MY`n(>6$x@EGcDJBZ* zp~HNI2x%umuF=ZHU)Z9aIC|*tfg{&{*x!HPpuxTCJ3OoX-YQS(K4kQO2Ob>##@=_2 zZF|ch+>+U@K6FJka!PYAS-Uu5)WR+wq(`(%P3ZopT^i0ui?*Wu`JaAzC;3F1(ugCg zN{=6~TgzU`6<>+a<Iv^l;JrcAHHg{b16#c(PMth;;KYwV9*FPS?TN1S93m}b^^S%6 z_t}NDr3jQAWykwvptQEx_Tb0EBlc#UeD2_4`H*}rRMaq8<uz!+HqlJ?^k#lg_^st) zmEX(UDm`K#I%jO=WgeUDWiDA|p6xU=NcfxLNQ35MnuiISPV^H&(?zI3EEajTHS6ZD zUlj4q#<QDe3e6(4=bH$FYz6IZ-=*0|$7e&0$Jdu_KM{86VDDbj9n<?H<t67?N=&`d z`en7Sx4vP1Jj0ffnU$EnX6&YIt2dNx%UYf2u%_{Np1`N`;oLd{Zs2L|+|QRU<3e=i z)@DzOI-Z>n!F+W5yoJk}z2tonQD%`QI({!OIiHW)#XZ~ebo0panU?Zw_>Oj5EN{h2 zN5J7&*K^MmG3G|)(gq@>@`~9yjz7m=<DLc2*v^{7q>4dvxtMf&knyZ(^Ua+?drg=u z){*>4F89pK^*jw5GH)|4ea7b5`BUXi^I*?swhgOSZe5qPW^B^9%#5T}*;}Fd9jsC) z>-?0cVVG6X59aw2%(GQ~E~bIUb6|x|dpMYE%_6Jxq6ii-bZzD*g%JnRcnufL)^O{q z(?l>>-dwj(gg%E!BEhrEcB8eaMZc_GX%Qu+<h-Q3>3uA{rXTEmDeOeq_T%e`<IP64 z?;=fMvK5X32jalNoZbA+M$7s|>*lYq9}ouHrZua#m1b^8Nz59Xp13+|8%UnHT*Mp1 zaL=u_T+UoUZG-35G%kCs7Da|1D*}db8NEjAFns9|wl!zoYP|2&RdZe~UAUvi+RzCd zhMwy))itfal{ds<jjGU#7~Lu1FnnDx{!d(Hc)k_>F5$0RB`o+b?5cRwHhfFs?mb(# z?AgGDC1fU_Zk7A2BGD=uTE#Tj;m<^kv7&~Ul&AX$I`*Wfux)wDRG8d(uX*94>j!Qh zY3X_N!szc|E5S1+?t9Hqz;jmSt$T8#MYKCDdo47*EP9=goy>E$E!((yt>qy;V(8eu z6T4f6o2*l5oio;-tRl@Sg4IcVZhhG*O083@)2sfDEXu98FHh&m7Z+^uaq)$*lSw`< zzq}&bT$XK&XG}@LW|Nv2v2OqJ*VgQ-z3uq=L2C!E8@y(4ZP{EdvYjr@*<Q57C~AxG zwxZm5xkjsa5u#I9)R=LYuZA(~Kqu*+$35RH;Igptx(sP7ZhtRBJS8H;WcBo!@hZp2 z&DdNA_zo)u4qeJ!i+E602@l#bn_JPIEgpV_i<TAEY25V^ueneJ2W1K4b({Fe6trbE z7ms=lx8)g&;CPE(;ioFB!)Vx-q8g1{Ae=!H?+o6zny;-0kK@U(?zLa#x<y2sQFOG4 z4L9Tl@zFePeRpoIu*2|2<mr}zd^?D;tmN0RkA1Skjfy@EDm%%2ChNE4?@Bp6pU-`F zc{P`bplM=<j1fUW7w2<1Wr1z|`v)8CU%2|^#cN;P(QAEZZikT<`aEk1I^lXQ&o%x} z7HfZw|HSsq)A$6wfZwS6)-+ZeFDYIh;raH)?Iz~p-j%OBTYTIiKCI~5mSbev=3)FR z_|j)YjI@>VQsEf2nJ@jlne8h|<M`#dxfONubj6-HLl!K)m{mC~Mh-U$Ka=>jqOVb! zOtNRCO%C$djMnclRs;IrJl#{CIGG9AzD#olRoX;P3=kOn?QKl*GhG(L<t)!MBfMa> zI4-MOJ6lV~@;>|l-Wnlp8b99S*S2jA*UekTyL0OUcP!iFW!z(eWebRhWot~9t#y@U zEAUyirDWNxcP!hMv0Rk4;+yUmx0_<jca=+<z_{JKYupw+Ydd8UPgV?oaeMOi0OKhb zx7UULUE|i2C*rRue;8yg=DN4J;fff6NKKBoAx7LhE%m1PD~*><JZ2K3#b=Yb)J$TO z{LI)d{<>*iHZjZkIDd>k!n+}IZ_n>-_dyIloo^8F!(rAc{HO6z2<tPsi;w1y@<IH5 zg#7m*^l!|E@WH$v!u~Pf)jv3;$vu-E=HmV*w~A$3#iT8|ZE)2eBjl*iiM=+_aayFP zBYTF)?oub~AX4if{A7gaDr%f~>zkvFCtrGU_LDDJS`Y5=c)hTmgO=|c;SeLt;^VD0 z`LSqg+O_NOvSVR?eskQYoet}n9!N!=;zjc+n!RF@LuZ&HmUej|z<)^q-_H+f`?mxH z9Gn#pSWz78nQGe>#MV-V#*uMuLK^rX`yADTVY*Seak_=NZMqx!3HmAeo%lcGoY7Yr zxS_V8iDACs1H(DLo_>S<lKe9LcKdzlS822(bIUZIF@9nSFvTDrOEl%0-ZOn=c9@6Y z{hOWU1IW9+Gha7XSRSzSune}0vSeAFwyd(0S~gj>TW<Nc@h|d!*?*P)G5?SKzwp1o z{dqNrTYsJkr#6eP;iY^Rzrt_fQ2n%8T0O15mVoT10Qt^y+DvV(wo2Qe9oK#e@DB(G zs2NZzpku(p0lfmA2uKOY4wxG7Qo!PXl>wyzTLa1hjszSJxEydRFgP$Y&=D9F*d#D6 z@PWXG0=ouw59|{-C~$b-*uY7FvjXP?E(}~9xFv9V;O@Zvf$s#q8+a=4lfVms-vnL? zycYOlpa}enRd4mT23l)c!>vwheQUI}i8appfVG{qljo-Rp&`;n?FlaS%R@H7w(^R> z#!g%L?ZGX$_9jeioTw!bdBfM%HF&0Zme@paf%JPrvamJ}r1c)^$Vhy0=nF$FCFWOT zlnBldy2&S}zW>zR$1Kl3Rr2&ydzaP;5A|rbv3zR8v*zLj4W^gm8)c1oqE=7A!XQ}o zk3`t~>5HCQ;K+g;X)9yrKJ-$%m#4iyeZ{Qh^Iu)FxoqK{lA|T>WzFwp(ZpKM>vg&I z`mnXVy4Wj4Nc8r&cX~uTa_sBTSHiA-_1f`r$2;ZQzq;CpYobojMJLyG^7mcu4Bs8G zXK0VL@nP{jT|<XCh7EJ|>}v12w&(6)5kq$$a~<Jp_v~@JzI*LE?-S0e+rN6JJfi&A z*V_r_s2;%CWBXftR9r8t)FW>6oBXxoJsrKuM}2kGuGw;U4;LX`y9bDOyEgH)$99kB zC(2zz_c*km>-D&1zdGuxUO?C*ZhLea5Vmfr4RLeC84>C56g8-vWbW`_V&_f|Zv8OA zcPs0O@J^yygjT>u?9Tl2N&EY2{=92<#6!GK&(Zfq+pWobuL!RBI)_)Ovk==n9mRv9 z#Zu2WTY64jM$U?y(v2%ttXP+`B-J5$g`{VrZ)Hwt>1y=3m+awUQ8L%Pu!0+2IK+MI zD={z6?<lQCVKD7@*O<TK&y)6sUH$sC<Hvl=v|mZS)Z(Lv<2R*W@z^Jf%ZCk~Gq4T! zh>#rK)733(Y{tw*DUPe6>BqwQy=Y|F`=|Afbh69YVvcS7re`Lvb;#wF9gHQ@o-eVN zn1}DqI9A4YA6t7O%o@p?iW9j|n=@iZ4E9l7Y^}(#t$FvYR{IvMdHK~fi?%+pA~gTu z;b(eJbv>ImE^oNSW2=m9$b&9saof&qdlQX<nWX-j@qUwL6gtzgH#dF0`j|z$VA8;e ze3yHLyL997<;&N)7lRW$LehMF>({M9-+1&{Q~3{~sA~f*PIzi|1tIXj@vR$hPaRKi zU)=s6;wO?Afxp!~tvt52e6k4jJhYro5#eHyh%k665AgvL`lTmCAbep)=`@MQWG81& z8N9IN7qzk1@-n`M_ImP|Yv^vr>%-PT?nI>g)Fv%LXWVmi?b&mUc=XPeN4rM|y|jwa z`J(v`$NPo~y~!#@&}xVCbR{qF1A|T^e>i1q$57FKHuC(q);IeVgf46?{M<*kTzNB7 z80)_{XLYEEog?^9TScrT7Ewdc#TW?Ng()IbS`Tm_57iZ~;G#a9VbVct`G!0phKUcZ zS6WRo^Cy(#hsogxw_@aIIU0q47%_b5^5<tRad^zv<wsz%XRd8_<#N;X88eE*X3Ur| zO*W7QVG&WH0fJ(G(ct+AYgnTeqk2FydW?#ThGulRWt8D2VRRZHvbyPzI48GWnOnp? z^@V@Eyzddh7J1spNxm>vJXSHwmcA%+<-`cN>UMk!{<$2b4tPz)BgW+m7OYxl-@w0= z>9A53&uH6BPI@G($?!9xp2IWgMrDz?!?~n0r_XJJ9;sUyDI+?`fC#NOe;<KbKGvEn z!h$Z=<3YhP%_HOZ?p;UMz8m(#g~uYdIIfvQ+-O<znrs=?`2JD7dONg9m}alJSlAbc zh<xz#bO-2J^NNpb8QHmM*(<ZxZCbH%<@%hZDGt#a!iByS+3QPJqtCr`4?-<@yP*iF zoF+q}#BIc+o@t0iHBo?5eHjOPf1Yk8#3%{@c||+VAe-o&EL)wB_Aog}#>!|M!zd9g zqs0@55bIwM_Pvf`^UKR;ZJYI$r7|!|%r!MgXg2!(Fj=Rr(1~c#@a8R1=PSWRN#h!a zwK*iVm=EA`y4Vq95yLAoZR<}RY5~2Py=3{K?L84Db{zdlpJ!dqy4|^dvIJd+kR(6D z#n>v5oB0C&bxIJ6IHp|0)O?%EYQhn8;=}?j2FSO?0P(g_1eoN!$~dFk+CXeI%ekI7 zBP>#qi1-s1S2}YIguEn*qPgtiSpw25#e7b#r?m*#$QL3It|Od~B+oUQ7+@0m>9U8^ zhsl1XhN9GVyN@_w7WNZ2e>(0u({`id<o=gG$vj~xA2(qCePMDyrPU_VP48_SFmPaM z|A!qi-DDjMvgRsMZh#aq&l5M9Yi=(3irO`I^9dq6=;A6KbiI&o@T|c>j!(~_gIvCH zMX7rk4zg!Rdd~PAytH%`dd4r?!{<N<LTk<w_Be>n32`L_G9Z^CVM)))#kh@X=F%$r zf*x2Gnu#9kw<PK<@-%UI7h-`TE*ip(hUL{P_OvCh7gXd)6VKbk$?Ni@cwT&Xz48%L zWjLZ<M87-E9=`PYM-~Xc^QNH1o{rb$$0j)lqi=}pDKgt=9f$+&0>zrhi^13j`JXD> zT@l}JvXwmIdF6$Yqn3&$4JyAim!!$##T)FNZyT7Q1*8I+O&FD4YTwRVLV1oo59vfT zkW*b`RE)K)J#(bl{za?iEMBv4=OdJg4m$_)JFOryZ?I+b?Wb+&Fu%9^nXNcd7|Uqh z#<L2vScn#M&8My)OIy$Cw%m3>&M?Z(CT$`=CgLS~kgu+A_vI5&?TLSw%oEh9`o|U7 z7@3}(lajfQui2Ed0%y=CB#rJ@W<r_Ptl8vVv4;np@6NU6yqFu3P`1_<@<ouF>PQ<z zQ}MP<%$AVBS|&M8EQBmBJ^I~MyD)S_Fwr<d&c5CEn&*4b%yfQ7?>@Z~dbe^&ZnFL~ zKewU_Oe?aLga!OqoG{7z&eoSN%Il$`x=HjG3n1JJjG~&U`$gEf#t;1<UKBru%4#Nw zeu?MELYqN~_b%tJf|gn&!~D99vL>@=^_i?8tIO)G0kGZ+p6^MLUoeXTVHTZ57tuwU zaiQAi=8(#<qA2J@5;p~%f0lnhm4P{&B(A<F8p@?xgmmTQvp8^gYMLsWS8m%r!01_Y zy|TW^6XPjOJ!Y(&VG{3&@LVoTu<IvpK%53coHST|Pe&1|E#^?#0dMf0T#PU6%RQHD z5@tz+M9JIN1<aB}<?XgfOXi3vz}orPPBm<2J~Fb~eQ$_KqN!QLegIqVFZ??Se;MnL zO)CvH@hTpi-|<NIM-m=s<*@eVI*6B{9=CcXnZ-AilZ>BK^lex<#U#J;Ole<Ygc4$_ zxgtL31QhUmAs78U-P%@dHA}=}s}Ul!FPHu=@|s|&WN&cs1Jtd$3|iY3@u_tZ*TEPI z`!XKGtzryv$c}mFsV%ZmxeD-1LGCD58jqMnPqETiIprGiS+gvZ7iFQiXl#AE?{$;4 zi>udg#C$`w%o$U-hNw_QBARV@;*f1d$zXn>zbY2SYep+Lsq*!~^SHKl?h@qj%lM)N z{C1yf6@AQ$E1^b9<cCHPYLa`!PhyF<W|ToD`5gMJ(Wbg%TJ)|P*1h-I-6I?t<<bj~ z#@moZYtM5zSe$GiPnzIf$hT-0r;2dY-?Us*Yir@GC|B&stwsr(3i~R_zG{%KQas%P zG5FEu;ik&y%Dp58Pkvo#H+h_%9V7-W6IB*aCaWdF^K=WqDkm7DDho$YSvW$K1-aK( zS-^(K^hRNTe@HqfjjqdKRY;H5@!4Fv2?YUr^E^!rVx8z}!?z<#j7VF>#@qc+vJo3A z`VqsdnKKS>-EOW)V?(2L==@wy%e@Fp^Kd};J_g3^Dx~r3c5c!tJ681Zbcm84YK27; z^9m;}Sh#4x!i7ub6;6n-iaLgw;<_#7wfo-g8KEI3Z?c>hdLj)a8mQ=yr)}dX;b>$A zKQd|Q+3pnAKE8HS&hiw8Cao`WEhry_oYz6Mv99THd0%fCKTx*C7at#ow!xPo@)OzC z^Sm(<&iBOi%KLBkxo*-ty*wjq@`iZY7=OF>4bK}UaYCjT<+W=Sy&Iafias{1?Af)P zYp4aiDuOgr&lZUq+Nt?VxRzV-P@cAudpcj2pCL@M8*n^24ZeJ_sG}|5QMdbO!bFv$ zD3cb213xQHM$40C4Q9;^v*udAY57{1HKHDtPj!`UT7fRLp~?=JpQl5eN87rPe}e<s z{hUqPow#k-u;j#H5!wt8b?lV=lqP}<SWWJ1DEi?{r9(5xjoJ(lDa3w0+4B|1`tbTX zuBGR!$kseJ4{<!KrA-&%+FXcTio+^uZRB&8acyNLmS3a2$aUHjq^=r}uRHcSltU9` hHckA1s|NNLA9P+j5q6?ni$<KMA;OE+@YRl8`#)HSEk^(V literal 0 HcmV?d00001 diff --git a/vendor/webman/captcha/src/Font/captcha3.ttf b/vendor/webman/captcha/src/Font/captcha3.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d232902cf89aca63cb9a92ad4893ffddcf2eb63d GIT binary patch literal 15976 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 E3yqV3z5oCK literal 0 HcmV?d00001 diff --git a/vendor/webman/captcha/src/Font/captcha4.ttf b/vendor/webman/captcha/src/Font/captcha4.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ab154440d796a815274ff79060759b5d1668b430 GIT binary patch literal 906980 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�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�|BK&3aVf8@N}hxP6gWk0;uk`#e^ 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­OEh0~5CBkL<Y*tx27U#Hj_I28Gg zkbQgUexY1Om589idITe1kCwX4ki^0A;+N+j47e9_wHc0*vXjv}RE@PU{1J?uo${xA zk!L5-LK$j5KM?ldGi|D|sy>}!Yw>s*kiN#Ueyt)RrZO6X0@odOZ7hgt<*^-5&Xna3 zl0ak#H<fPh?C)$UU5&rRrDGn7Gzi@X<PJ8isq_v}8<}x{{ZpQg=Vu`Yau8<-I#Iz) z_G$us5<fpWKVN=WBB&2#gis;^I}v|Ak>tmgu!k43hn9%Wf%nDD1Ivk)EaVjqimQ~* zBJS{tDQ=d=K1)Mh0?#f5_$LL}X*KI!BF|qeFI+N9OdnV-ZsvQx5ofy_xO6M>|9tOz z^?^QhRH^ZZG6D>PqCm~f4dA+h@Z|7LBtR)N1O5a&+y_DY1}_w)_36UB$B#a=z;jdg zu3K2&JD-1cQf^^=D|RkALc+fhbaac$lxK6jqC~NIogm+F1y33sP=of}2=n$UiiSU% z8fGZZW&v*Z=LNARb_E_Ue6fHYzAy(5Um-4&r@r&g|2@f`mZz?Gc+oHVh>t3{QuqUE z{XCSN(U28{=TlxfiF$#kl4wQ=lGtwLO*bF*?M7)Bha-z8!VctVEM<KTN-C)w@X`82 z2fY-L=vGkFNpA9SIXVKWJ7_U`xi!gaWGr^8i<t%7VRU^_A8;$nlGwE3+Mw4{<!sk= zY+6)WU0QublCRX?_I4XH3MbhZue)TTyw@*(QU95IOuql#vb?O~8gxXVa|3#$r#L;6 zRF9~5bt0s!Kfu?IC}CfKkJb&023^Lo-YR|>Hz+@Km-RK!;9OP1MEo=p3KaE3z7ydJ z&=@T1tMJj!DvCj)uYz9sYVm6oN|I_sK3oB<5e_s!rKv2rL4KWo6;^ze-w{5SSZi_3 zh3t|G{#`z9ygZ{t;<M(XD4!Rr-atol$WB;O2sA7Th#)}WqyYL2T-8F1x~d(*U_|FS zG`tR{R^fLRD!=1y!0#-)o_=THeEd!(qIax!iNANsiSV`H`qgE9*G{3IUW<ChzA4wz z%PDif^=r)>P4KmMW-0B=RSU`fz|Ks*`WxMwud;vY0PSCGImA7g#C>sTby-!D$yXZr z=o0%Ut1j__%N~%+ZtP`$0Y?lsWSd+meuBLpg?xX#>RHA52v@=0FGeJUbTJiZQ;>`l ziH*;!x0$hl8t7CQzu~d?)j%0Rb_<o?DdetGVLs^<glXX(qDqhKm1sLcl?K^`a+Ik$ zQXy4kz2#<V0NbCT7z`AVt)=?M94{h@<>)OzQ*$sF6HdF0hf2a@;cbO8P$d$!!PvxD zQ`i)gU9m<hQ7K>ovl2l?yOT0|N=Z>nDV0;#Q>6D$`eBE)X-;;MA{)=j*@-9q{9jL) zX52F?b_5xF{M286lKtrIq_&z&o|1>w@Bh&{iS7FKkDgpFv7~gye!P!KX$StXJgUbM zGczn1a^%UM%ChsrUvXXb=JC{H-`)7zj4cyB+bb+e`<?vJvDC@Ou4G1gzE>r%gQ{i1 zHgOZ~KB^R=EE)32#4Us%VMF3ov|b4bkp4u2%7q_Eu~%WF^l?!kbOc9RlOsgGvV*mq zH8q{J{BPk?{yH+izsH_4)pE91+$J1QrBJ<rndh>B@jw!Yo=C3@IJl{PYN?EP3Au09 zim*s<J~eVd$hB0XUdssuPo=sP8S!C&0NT1Ox9{kzyQ*t!aAj7i-nD3or>=8mRp`zf z8{5BN*M$1|2IHKS>GgH2eFDiI)^To|xJ}xKd2baw;(??jJw1JJ9R#Av_J`fH4g+u< zVFy|RhefKGSL-kaVQ?+z)f~SZ(P!iLwX&q~ZQ+*Z%Y1{YDs6ae>VIU9%ZRP4LNMDS zZ@HA^6-J&(6?z=W${G<9Wj^s^@iQR6O35p>lO-|8C8YjnHYvpoGkM7oy+T)wL7ox< zLP3C<JzygetXhKcT!xwC62-+kD_IVUi{5S~F3%(`XQmoli<&)kSI?{tt??k7>$MI1 zH{yVTO-$u4M2{;^IKAMpy88OY#5pU|Cf2prDd=^%F)r@AOtnYcA)JCdl%kGmX!XM+ zqPNITcwX8dgaMEerB_~TP>jM01ck=qrJ~hAZ;lnU{ozbMHZa>qn}#EJQ30~$poHim zKUp?hu$prqSVXcFm@|bNA=+JoYjITO*6ce^;8>Av*gMln{+2=hc0m4WRZCPLqrX5Q zYW$%5jVc2onVc}96_`i_mFSfVR8R1S>qsmM%0N{)L@_LmC$Y>cA#LTcgcG2wdef|7 z4fI&pj9^@!-HGbgLFz-wnTZmNrgtJY^I|7TJM6nW-;hWXGYZN_chJd-lCRhOq@~a7 zG7U1p8yH<MAu}rR#4e4ns^wc&kCm7P-elZYi&ID}(Q4R$J@OB&RuTWyEw0SyIaM?H zp;WdS_4X5RPpoEM@ndN<P|>M43)w0<rP+$;LuVm#0?{8tJi_Epc51W)ROQp7<Hc8u z6J^2Qyv?4zvTJ!yy7ke?xd0fD_>$CG2VY66SMPOcnrAH!X<Yl4>mr{kf-CQj2{2Qw z#y)<GeIz6a<qv^c1~i$@qOOemX4s6;rK+%V(TYH<F?z;gXALZlt}PV(YI6z?v#}Io zf4P<Ygub@i-Lh8xh+^%YR(TbDeQ-;Qa0-X&WBieCNM)<Au8;AD?E}O^L_G2jVy|!- zue7QJOo5MPRmrPYP(<_!fQ(qYU?^eZa0k`VKVt8|AH)LXk8rxP^JHh|JDn6fV3<k1 zP3#5j>FCGRYXZEO1Agd3wPl1|SM#oJ^u1U{wJAUkA)rIw6E8CS<e`%<=x|eBpZ*XV z6mT{NXgfu*SN_c?HcMV##GaJLEp3@A|1T>VCI6VM7$slFUjAOo2CQj)=ekb$5D<a* zy1tX`w#&C*eS&I}$|=4pc7Xn*Xk-K^ms;gki(X%$pxeRJNDu<p$na&8m=)P6Y_!`4 z-gUXeEW6#=-Oc{~cW0x4d5VL~ZD>rU`-6YBWVrlii(YhR1p*LpkPtpQ7+Gm&4l&c^ z8u%}~pb!7>V`qawK3N=;PZ=7W{IfTxHfvJFO6(cFXKFxiXm$9KNK1^aR9uZ^GDmcs z%yHHkzijsI-<=H!gKPe8d}m-e#pNv9(0~sW5Pz#wABJow&xl)PF)cN^V&RS9>y=I` z-)CX{@8aQXJAJPF=i+ktFZkT|&L;)Wc?vS}E@Z^cY0(m^z1U@MUdRizL#f$B<`iC; z&aSiD<!|5B@*VjnE*E=yN6Uuy@y0g!zyB=U^2N9Cl<&&RQ`wd~ipzh(4r7Dc@VvVg zT*>+MhjZH`1D+x9XB0EhM)auh`4r#5(@?1&Vi9(m{PxrH(UlVm4?fiLF#EpC75R^w zr(Syxy>rbyOXSlmFb|Kqk-ch{%O5HZ{)hb2ROT#;?aQWfm7t{*IE^g)L8PrWCD5;k z6aYGd<^t{*$Z(WGFDO(iWOE_+g=|{qCT41pkAThtD_VM(4ut-83R{gY^BdR;a_$u^ zb%(!r)!F^Gn~Q^wv1{$}+ue}68{Yjc#PGr2bpL1SVPR4y$816l&rJsHRbORIfe`pm z!-g>@wx(jX=}^uZ@Zs@=@~6a(;+tD;VUL4BuapRhk>iam)xT!z<zvq7`6XaSC99kb zM%}<>*yX)Di-W)YZugrh&$8>j2UG=m7O7^6C&eP1In+TwzaTh`KsE|`DVu~>91)Gl zxk^P}pN(SyYy`YYDpM*UEClE!_^KBes}eCd2JOzE9<pIq2Smg@TGy_d8LF7MVKpKk za*MqFX#Z0k=CWzu?dn+9Tx9By2cB4ib+lp~@5a`Fn*vuTtpkxtY+7s`K=A6g`G2u> zsK@}Nb=ZLI$rL#N6bcG6Ao4t|tZ!%;6pCSMj`j<0#jk@&SO?<!=azvVXJF&FRn<Im z2+fFFf);}=_P8aG1CB1v4mm={0>g=Zm*SN0rUmIVkb=r>!4Jgz6pjo6x;!=yIFl)W zGxMgkOul;4>WQ2;&rfQp`QgilIu1Q5uOBn#)~7m7r~FRxwmz_sbLmaza~+Yl1)n_7 zc1tz-qfo!5W#HEtM1pgH+@gXJfX$-o%qSyyPv`QEbw}%Sy@auiA=~qy&BH2Msj;G$ zSz>$}jS*nTF%a(tQASQtnWF(7YA3bSPXG2zReZ%er?pIa^)H8Jyl@9wlO39V4cPgn z^94=8m0RZUHJ?s7)&T%Q<Q*o}Twhy=TaJ2=EJqC6EUs7SRTjt`p{RgIVdOvZ;9F`o zQv)`I#*nG-7aa<N;TonYu3>grZz}IH3)?ChI))QMoo4|vqIjkv9(-W1ld$m&13@eZ zmGwHvsz!ruVDC_}igsWXz1c)|uNuQY4N8XzDVv~zWq^JH%vvIegi#VLs2xtW5u8ns z<@NHX%zWrYW|L>L3F_R+=2?Mn^(V?Nb;-|J@11(hUC$=6$#!(YSjEipCqI8t7%TsD z%=N9+1(9US3*VN*Y+CR2V}#SDm%jsEh;h8I!CJx`G2#P<G!ZW-nbvPN5I@3p%6z5~ z`XANhu``g$&tfXD72$N+PCJ_C(imw2r^~G1-G*pF1Px7UKu9LbE)T^MGw_n|zP6_4 zt}Cwp;cUI>81uYkiX-CvNo%hOUi0YB?mK+=z6<v-1@)V`s#(#sW3mR{M`gi~IBcCV zYzF`t%G<^^2=W&;!9S}7v_@@AusSodJUkC%N93^9Ac#7H)tHj%BCPJ{(jg*5t+U*R zAgkg@I=$4VH6&tEUC0+t(Ub4~t&v$h*U!GQ`bPg><UdZWKfQPEUEi6H`($u)*pL76 z*V(s^YHwONh2`bG`|$j`R`>i>exr@G|83abSRtjD`ONo*dbshu;i+iky+9vkRFfZ` zXeM<Sqc0Qmr63vH5Aw`PqTK*|Uq1*-$~ccEMkzigu5uW|l-mV$@wCYPUB90y*h+7g zkI&uk=sQ+VY8(+l<*8kF%@b_-qat0?*`L2Zs(nf}Hi>NA)0iu<8`fm?5SkYV2ufdR zdEJ;6eN1?6K^nwOYs&gWj-(VBgi6WJGY2ZP5nWcNpZ(>61;X;K$nT_QBgg3(0rZ_Y z9(#rcvKv*`^bE!UJPg9gpP@N{zD-d`LZ61`$~3q{qR)WF#uM-qDYS5*;Or8L&t4&v za5@U0FHT7m_W&KV2Lwccp^hR7JcfVvV3Z!Qbp#7*RlupoJ%1=ig4@917M@!Wd0RRV zdD|{c?4qO`awNdJoZ@r<1Iy#_Ku6)zsnyibTKTiIC!%rqK7qrTDB%~!<~m?l0&T zS{DeuvrU3e+I{vAJ&g9{Bk>#E7co6T`?9hta!l%v{DJO<PG(d;Av^~io28l_yBm;v zCa@+-odA!dR{)Fvw8a6w+#Ui@l9JKcxG;Di#es}$Zz`eo0OrvoL1+n-nug=3;@Mc_ z-^;w^&S+rY=cZ^H$0j-1&g$Z#%Bl`wckt1f>(+EVQ6vlAeVwb<%xqm|W(PW|s|$)N zckO0tI%lrgwQJ>}RUKDgA1+uost|yyg~LOu1;`Z6BfSDF9G(fS+p4Tvb0U^lRsukj zPD-ojwOgKMDrMbzA_VKE-dxl_C`V0;<*kF9ZX$t)0)5gvW!;hP*t(fKxNgDJQB_q? zJbu@1TK4yMv0Hz>szd3EvX$*&%Y?O%(SH~FQbd@SdbTHqeG!2=Y-V-pZhU4EEM?S$ zVdH?u=9-4%vFVkXTSq+hhwd9rG;}v1?Q7%FKY$B|Uc=vl^JeAIzq~Q$e|?fde#8E+ z?&e`Z+0EaVJv>5)JraRG0s@!QO6!`cf~AP5@QCgM=8T1eB_p1yyyjJ4Fxi|O^@A?( zG#RKrN%<~`r%+;0AZ2|qD3BC|1Py*&M(mj=yOb}f@ysI35PlYA9NnoKCA)YGe9J)m zVPSOIST^*wiSAStU8KO}C7kHZ7|e76QwGbe-=QdS<UI*>$A{sjQ;6nSjm~7YrKGv& z2*8d22r;b6rXogNg4vcvl}T`n6(ybrHO>o0I9gjv)gl1(dwGxsoydgxUGJ@6f14vu zs&8S|mma$PI~5zg!{m=&+`RIE3e~xi#TC2WUo2Lfdh`b?gyx1wSzWmM5KFrH2c<u_ z`{0Z62h+oW7qW9c`u_GC_<7lm0YV+>B4FM0gx=Sa^}s->25?@66GJt`Loie-9FCet zG@*&t^=m+ihD;(!jRI_tVY9d`de}Uls7;Z(BNpKw!m%^8VqHWM2H5TLGwh(;H~=ev zsoodfmzJt`q5fT^SF*Oklk)D_Y-b1CF<V^}IVe0InS|dfWoD^a48rm&r@BT$P#~y) zOO!OV8rKZRQ79@Lswbwx<8Txn!cpvACZ!LwBW>vASO~^YoGN^#^<tONQ3224VQGZK zDf?ijDHbX_N1Eb}MvK@Cl#|hwoIy!jiITQ%i`hnr0N$LEAfuEDpuR~$Dn8t09%oKT zan!CZsx9^wl?Ckul2w%8HoU@~W73=qce2?Z@Op~tNBed?EuWGPMA}sB+*@GG0jw#V zdY#2E!^6`dPuJRj6^m9_(X>0twxfc910Y0{Qz@%s7PCm{h-g>SasXT?ie4VFVs!^H z%;TKdnYDKm)nIX@L3^QO6(p?}&Q%SDgAL5h&rMcV=lAXEM}1C{@D$`lts;3jjJz|| zBPJpHoJQ+RC8<e58&^Sxyc}=pYQlFaGiBwJg41YA6~c;yO-aaT8mx|FF7<i=BV~aS zaqC5o1%JbWacD%hMVcueWx-8*-~Mb<1XV`zfc!8E%13sINs<3ydcpet-Z}Qk*$2b| zd9%Fb;B&`zM_ep~e{myQ9&rip;nkYYceZRjr@~^Db*ls7O}HUw<tAVmu2%IW(z>;@ z(j=^#A8u+!tK;iNy%6x7QE&s04M~vwXiYEGBP5}C{~2IJb$Tnvz!9Kge!)Noz&l6^ zP6Ddv^^CpC3D^k&j_v@o;eVJ;XgNDun))Eo*ce^-ib%TfzI=qO9k@@tY2Yoq-Xw2P zG1iXxK^>@<NkG)Gk8C846QP4?Q0cJmsPqdnx@qB^P<TxvCfginWFIOQJ8pXa^{oR( zYHE(E4UZg`-+xbj|54Vzr@G?TkoU%Or-jLCBR)4zk$?WVsuL*S?AH%{G~6um1Mtz# zV7V<%3|g}wRE_+Te^FceOXs7<S^9e{{Smo&Pt~|zLrlPLKut9Z!0%yll1%(Y%|KX} z0De;?2<e(|VoXj@eWxf;jwuQ=0-5S9DN2h$=Al*=0lnyknWq=MZi`z$BNO4tjXU0d zqjwW(K!T8w0b%i;-SScS7fi>r1Mf>q&OY$TvA4vcr(S>RHFl%Cg;-6DWh=nw3Me9` z+S&r4#<4qBBzFsMojVSGv{P3Rf}v3e9vCg94l)+W<kgq426yOJ3oS$ymsABp01pMa z1CNk?z^!1V6jSYh8nU2n1(8<at-i>?zAxCp;!gPkmfCsd4DQ9wb00_nX#jP{nXo7C zRrPtnFG|iKpfUjqN%QxkoieQgp%rizuNY9L6g*Hen!OnufD<;Q;sRBc5iTN?MU}WV z^d!X;u4hzQOBRZ@IX>A7wVjoNJV`}wvgK(}?WQ(I$Rr^45VjBw)kdX_%6#H7U{iuo zo2L>mU+Pqf=C9?zRl<z3S(#HMdIW}o!QxXr6^mQD*7YoHs%&jbUECO&*}SK`b3OA+ zkl%TzW3PO&i4{l#1M(|*{_CdCoLx~Lm>HDQr_S#z@<)n+UAwbbzDfQSt3z{hc@5ti zs_hb1KrcEFRq1o^Gk^%Q1A|)8k&+tT;NCIY%B|(Vd6~4Nfjymd-aGGKm1UGBTWejx ztlT93KITW!an})6czBiI(R8`y)ULi|PZz)-9rEeH=P>9&>_&!C<HGS=K*KRShyEx? zF6xcJq<vcN7w_Pgah8Uy&m3DHt_^W$eeh4rwoEOu6(wk1Cv@)fo4i>;SFLrjWXxK1 z|DE1C_2<klpT=sAb?v!jb?qEim&PNkdX*I&VNvW~D)<nH@qy}u8AaNo>r?nZYcq=_ z*c~*fvpTIpAo`#h+a!9>*0tUVc+4>{8Vrel&|&$lU&wpuEHGf3_;bDjAMp7@d>FPq zMOX2%c{J^g?GrPL=$nUZO|_QpqJR*X;9YzFZP=(uwi;}d*W}-){v5I3y+`D?UX9-< zY~MbJ8S(oh*0%$EFsM{;ln^U72@cCi26&o&>q@s4-8pfAxAc4|E5FO;@jX=mQRz9k zaU-o)+3%sx0kV*+A1Y@7hPzM0&ow!iRAo<R4B#ocWvSjC!p5;uPCVFsa-)0YRy<d3 z(R#m>ds>PTbj3PaV;%k)P}b<?ur8V&;${Q<_jL@g2K=(YP-p<Z37kg13xo`ptpUD9 zyfN%^fWPCl;ef=`8lx5vN~!r86;q9B8TH(W)sqFJEEmBjKE)(xVFPlDPRDul#XDH2 zVN^>G@D=o&Q!vgw;&SLe@YGC^Y+~vuVZ2T^E4-1V3w6l`m%+LEAKPUzQ>fmT9l{dH zL*%%?z9dRnBeKbBm;hKtfu*gCjsPs>ULDY*h<t{%0O+KYk%JgEQsID#H|kBoOX`(u zw(vK=;Y^ggq5H81XbS>Spp8dxj8Me_&^Gvi_LGiVEA|F%zWeT*1A8lO?GQJ6d)Kx9 z--?x+<}p{(ycY~vhJ*8)SjPNKD_8tq`?_$hvfptuMz;`T=8C8GZtT5Ir;EJK#O3l^ z+yAlJsdMX`!h{%K*n03qMBP)L2pNfjcLDSSl1+eJs3-*zu2XyWipvK$K9KB7c7Xr8 zC~onBe>e1R0mAbzYwRBjsuijakjr}q&$J*i7R}mGni1ClqUr<=H}U9!3A+!J2BQQV zgmeh+2fRkC?W+x}PQV?|C+Y>#_2}=R#a$4?|KUDDNDJ00wSgiVk>>!j498wN@=IOF z{Olw5y`IQg=FexFSMA@ws(#LVVhirelejNExG%Mo55&4)m*c*SMKvhCPwPV2#$d#w zS5RCw#0bdIQ=&t_=DUM9#GXcWurYG5_{<rZ_$Q(d$GhsEs0(1NrK^zsQ0L?dW@~P? z1e}dY5UIQ#k=9%Yhe{+Ie-g_n5ek{75X3;ka`261jF0;KQf9c!0cjSs&&o&p`+>k& z#>PIg_?fdCzm)f|YtQUqjy>`Zep=X+sF#wmoM}#1Qfe@}$|Q-RG<8h6!IAE9TEyp@ zb$|nB9bjYe&qMwF^3i9%d-lL$DI)*ii!<_LKVZpw&#-F;j!yGQi78sf|C6jXQ7mX- z;i<S+67@!BhhL*FZ_YoDK4i8=ppT8I#>VgiL35?J9ZyMb)QDnM(HK;RQb+>M2Ng8f z9m+h1ypf5O3o34EteD+U(|C8!-*fXVDM_NMs_3*WWV4R%n!R*Vaa|n($3-@W`*H-! z+X`n?`>v~RxPIcgp4y5@>V&S9B8acOb=LLER(CXy$<(Bvrqpb3WTOIN_`WV2k#0bJ zu-6g~v{b7JtwCu8t&^u0lujMw*Eln^O2c#vbMRFoeRLVp&lPlFGZL%`=+R<HD=2Hs zpA{(7*|JBwnY*geQ#yS~W!;?~hc(^E^iqP(l$30AlvQ}2DsXE3Z2?!!<rwnYl91M9 zNi=F*7DHN2c2<fhP*|Jn^}5|jf+o%1I;M6}W8N6AIm>1iOzK3nUKFi`oi+QJP^c{| zuS^?19`Y{@lm9GL$B3K~HCogV)5aG;ZQ?YbXS^NffP{iZ9+ZWubydur<Fkg!E18q( zV@DQ`|D64Z{QCrbs;Mh`v|bXhpQ6weEV!abqY*Vmqdmc_Pf&~U|KuBgv(soO6fb`+ z<fC_gk&uv>aeKZ4pC)K^dc78(D`>Jc5EemHYYYiy!|h|)gqM;;?Su;Xj`L&%6<8yj z5s{muwq%g%<c+<3S{!=iD3nM_ppMIlI5OcYW;C>SluT)8`JUcU(2!YjLt1Fcl5g+2 z!&X$_b6L^E#w{2$23=yJS)Ve>o1SzzVTk0-pPkLtYFUz|Q<99Q9Bj+nJ0I62T9eZf z?U_ZQNt>wEsYOSAu;IKtFG0+1B#LRmTqXu$P`n?9!Nh!Y7)Uvyju0S4`1;9k21itR z@=Xb8{$S3S22=LL5_5)MTV1<$xohm~>QPs=mEN(e-~8TX>HB$kS=)^j$x9cw#!tu> zl02^4uPg4pYHa$1d%F9!tSdL95+WmBmya2lD#|Zud?1Q<ly_r01(95h%Mfxb%~N2q zInxA5os-V2V*-w?4_{;GIeNME%l|Z%mkF9D{18fOl3Cs*ha~+w>~p%~)Pw6bpuVF- zRfT?bDjufG;u_a!*W#q{$PZ_?PYDPoi?k<x+(YCUjc{%0LXC5CZ>qn4>y#e0cKN*3 zlZ-9)<*R0OEj(T^`=+YN)pN&<bX|$>Px4Q$O=-QNw0UiNcW}bu_Kgc>b=DfIjm_On zb7n@CUeVsu=<zQrXr3Ye@-mm!`TC~#ayM?YVG{0CE`!i0ik7B(3hyBbRw4$=N8YnK zjk=>LwJ67Ca!)L&@wgh(*Dm+3XdBhqR=RrGGZF@(|M%r~FY=>|F)81_B`q*L=&GtM zuqGz0x~}Gq>!ZRK6twyTO?%uv79vK{sOmyBnu^7Y29~4P3}hiQbPVu8WtK=WlVODY z)55k;$fqEnZ;Y>mi8=Tys%-ExlSWv<jS5?7W??cnDKr`w6t*$Nl3ER=shAY^kF?Dx zX`_nM^r@AjjA>qXf|E@(W+hJ>TVC_<g6k)^3LK^scYfih0`?=t>cB<I7*uN1=18&% z8m(3@MXip3rI(R|-)2w!;fm1gTPNv~gL%_m`f@^oap0e0%MUGn@&9%BX0M!3F}I~| zv?m#E*U<gsRb7cX#-)QC%^Sf41Jq;~+cnDd6vub8{UxNYV+6iS>71uqti;eHTu$QD zAZ)aZ9K}Wx1bJ}*S#q{gS5dMfFV9tMBCe;|f}<c*lJNW#9o2QM8;R>Nev%<`F&i#% z(RexVjj(*!U7ydf@#_b9nNvd2DVW$$p9>PtL4$S#E{TfKsD>2MxJ#Hwi2hz+HI~4- zBC`?cW96>Q6V?t%ti_Y=PRUJ-$*fsY<n^ABIQNgSH#ek|jLOeRN%Z;s-|1n)tV^qP z{57+e8m!Lr)Wo_8urNp29N95uUm(0D$5$0xc`J-it=Z`=7?U}=qrCVcmS|QWC)K1K zZjHvvvBG-<1BZ#|zr}lK2CZ@t<3<3OsSJ?<`d%?zHC$EVvPMg=Ol?^;tP_f+kxDHQ zzApPs8k5axvzQY!lHO@fPD%2XUlW=YaM}{HL;1`-zB2b`YwFf`>;{V|K?D2Npi4?} zq-EuKGOa%=aB8|%ShIcKz<&G@2Aw`3$(CX=+MOns1(jF@>0_K_*%`&73T&b#6=v|- zhsX$q*{4&?U`f=O-Ng-s`-Q^9TgPUN&cJYwINh!6&t%oNzlj|hG?-0@qJ9O78LfA| z?#`$clNwLf>(!Sst1Y@=X0`YYY=vTYOM1OtBYh>~+qhzw?M-~Y?Hk~^Z<tw521AL& zbrkpC6c1L*4S2*yzm^hu+&W~rPg>WenC?l=#5mi%sv~OWw|;B-AHOb>Kly1(%(S1r zVG6hH)10P3+y2g3Q5PVwwetdbz6z6fzX6Q{sk+b^;7W)144;^L118<qW32pxXA@Yw z!%(8DuI;#S)aVsg=1iD0CWkx*SFpGsC)4Rj`np_2EG6>7`OZbnwN<e1l8PEuw!pgx z8d4H6GCjHZzCs%CGUR6zBPO*Vj;~5!=;GD}1%@ttkNOnvgTvn7mY|-TqGZ(itwb%% z$5m+%ld_Z3of&4bG)5)GSsG$AVzm3x*X4cpJk*(R{jWYw%PC9*J^;3c+LOj?DPD7W zRo&#~)))`Ts{6O?x<CI&?vraI{oCw|IA2GS(o1}qc0_xTfsgrTil1|pY96<c$ufxZ zbd((TB|RO?ty7|K|Gvrcd8l!YcX|Dm`&+u#-aPM)$<B%Jhq^oA5B1zwJ-KSG{My&E zO`<MS+a$$hs#~PEOxCf+mRWHw(@nnS8TVeoxcllRN&MYKG0b|^OmtQq(WC!r97J1# zsLLPkeUab6!-V8_z=ehnb2$f0zVou|6kHm0sz2ySEppqF5F_AjTE|UA{#&nvpH`M$ zk-zL2QH`!~mvz-*anVZ~c^|-+YrAo*Gv>`%63x}uR@ba1cka62vK#&Df`S^}jC#f} zo7n{aV+nQIxJY!!SuMr~M;(LSI$2-1_i5DoFv}P@=HzHp**WCiA(u|>o%Ve94!YqY zXL~(M%pPCTv$T<7sA@(Q?mhE)s8z9sttloRYb_qT`~T8YmDsZ_=H*$u0TY}&QLE8u zb%>G0xq5*s+b`}9|Ne1Tpt{M=qpg7~L|g4T#9AE_Z>Okicm2Aanz2aqBPuJr<Pf4^ z>OoJ>SXoAn9yXDO`G&cB%l37R;(GO#bKROU>2qX2iXq1;e$<E0Q$_4G&zDQnkR1&5 zvFOh)Al<1!awX48mM`*sV$duiDXA9Us9BE2dd2NW4ThDi1)<fc8kV)(s2TXt^V<^5 z(uW`FQsw_H)Tmz!T(fdgiavX6R|s!Sy{*33qCOMfZ?ATx@aRewF#9%4Hu&F@m;8?1 zww5I&%3sJ`@^$k6BqN`?ylm8>-#zn4m5`P@egBy)Xfc(Pte*JDgWtLnK~`YoKvyB? z@&m^LsX{DW389h4<RB%_JtmJEjnan8k)jJPq?8jXMG0kRjy<;Nx7Cv;y}5%e4OOT4 z98&SDI{D#!*KU63$t8{R=2~?18SYZ~hB&&5)aqBCe;`GdQqVl6@Izh7)Kx^b_~N{u ze}8Aw`u2t+JGwiT>1_A)OH$8)Ef4N{X~XgszricGOj&^vdCSFF@H_eLJB76L;9cMQ z<BH)d01s{h55|HA6L5~^fd>e{A%H{RMjE&4%#=VY92dN)MB>4sSj64zj`=O@608{9 z^JZ^LYpXlg*Y<;jTU(NnO$PD0RpRoW%AdY8@8wWdsZTIzl8nizZmYX_W`+D&O|IeI z{?ev_NE~Y*5-&f$?L2{yb~>6X7qOC*tk$lo)}+iVx7*&au0pat`rzTy)5fKi1chY1 zRhOiZTs7b8W;&_P{>)W1GrW;)BeCj2VUf^tqg&GqK8ZL3)s*pPh_Wzh7Dyfhe7R&; z27Jaa>W?5fz98c5DqFcT;Dq<!r9&YMI}|(#9+MUE#YaD6ceBPUpJTJ3C>0?K<doNU zE&H~CCESqiV)Au07FPAKHEDt*4fvmXKyTEG%1MF598OF{z1sLXPl`UJuz5@Y9T$=t zNiw}9-{ZEH9CG`t67t2R%GhCDvUBvI4)!VYI1%0GkL**9jxIre-q|T%GPmcN8B-fF zFDgBX>`Vqvih%e*d|ttY*q}iXgom5!!&uO03_gmL&D0<caT!^Wiq|h*x4v=Zyj6cN zWv`vtxUZmn#S_2$-<M{+?#~L9k#aMqrdejKADA*+IDX58qv9GxTQrQaN^Je^hf0MO zL$Yp@(JJqApM3Q2z;%^b#dQ*b?}jAlFsu02q=4cDw?@y43Fy!uj|fu$WiSp;fkT8+ zlps6?#(I-sV5%=riNiFau-EdP8(SAUOXp4Q30{Bw;l9@o)URIK{L(&_oVxDtg2)es z6Z+}}r$AWI*79lJle>$%dTP^0u@|=Ol1~@RJ+_Tm|9s?1vv>5qpMCK!5-O@@fzD;v zTc^qg?a1{40`pc3Fy;oZ5|_8?FWgK;+s6c3_}mw&wP$&Jf=*Xnz#eaFcAxxslX(Xl zbN0-04<sh3V^XZKDEfX-g1N$%CfnMkN`OL6(g<nEDUtUg)!HQ1CJK@FFHTWZ-Cs=E zsZqn)ts!|eVDC!N*KsD%6=&sAh$b2b8)oOSxQIR{IChdtL@&BN#9wZU+L!FCcxwJ% zirOlQZ{2aEch|vX?IF)o&pohdul(H1oxNSlx*m+I9y-7`Z7)w!zjA@-O3Ri_UOFdl z?F~&U4;QyL7iG51`O(_rd+y)Z-Q-JNv2FRz?+zr~xNgUyu}%9cSFRU~oEgIoaL<Q- zy17Kr{1>V-$not_eP%-S%@}@q6(1bzptKS~g>(mC_yGd?X01k@7c94OEjIjWAEw2m zd6o?~wJu67oj-{Sa`?4p>u)DPmj9Oe^OFNt4VUBJT}o{U9Wim9U89IIOD>pmY@7V? zpO3Ve^CmIfD;MAVk@b~Ywc%X1z7_j#0nK&5`BBuG%sjJ``sJ2e%)UGkF;^d&e3(JG zGudKC0FVa+FK+HYwa4TE05r;a43`JJrqkC@UvS)7Fcz(3SNf{*Cr@;>U-#ke?Q=G@ ztXUr^qyEEW3h8u%rqInsrWttkxow!&Bz(yJrc1r)!SW>Cub+cekUjRA(BE_^{^{cb zIq69TiAg)lZXM{0e8P;L*70jGZD8$O&)GJs&o!N8KMqv&oDI*(NB7BJZl1_Ymo=Tf zg7_3%bM?%bEiL0JQ9=kA+6sQo06$&O|IL^NK9Xe!ff|vK+F_dHLPj2}z0hhTR<THN z?ZuhM2KEgK933;=Yh+m|_9S>%RmOQJj9^nnDlW^kczg5WNA40l^P~1*7LWdXWvf%k zHGUl~s_n;iZ+f$8^5ox;Nm`ZevvZSl=f19cA9`|W!@Rj>9jkZ2CO!W3c={C$*2uO0 z|M9mG9Y$6FNBeJBv>Ga*`#NmaEK|(gytX}xxvQ71TO}-iip<?t#%99YP12YWlT)*8 z?kQI*=5FD%noz#WRCYz=im%7|f88S1q<f3YV5q??9_aptH$*+CBgk%^g52v0><G7< z(ExeSas~_!SQUb*z;fnDl|jo{O;M4-AM;dU%-JNB5^q^us5G98TGh;FhgqFcY=Tn_ zt9re`0Ha!-6}74BU{n9_YjXW7TG~gxVg3&3;37<p>*R5}C=}*0R`>``{AKy7ZH$`e ztKTxYVWR)Ip#7F7j(+wcH_=N4ht6(ENjJ~Bi@17$tIw78z>{A^HDA_%*L=h5M0`GW zr;%M$2W;ySlGl+fe62?KI@&`0U2Zjz`G0+R)cl9l^divCsqE(`<@B#7nwN17Cdpq! z9{Hx(2;1Ne*ao%Se+UA}be*DyFX}-I9dLNg!w&exqe)Vn!L3oh;u~AzKp6x4i(mnJ zLh&ywJ6LdFZ`8Q@C0yy1)8Yb6KOU4l3N-0na~6$nn&C%eL2(`@E}2-CViGRtdJOda zOYGuNsLA)PU%j+De^?x9+}$hh>YndM{5>XfieEAfc#2iTFU2znjmdNJ<Z&`ICeIy1 zN&519+-!*VOuo*E*0i@T-HApH3r~^bvT8f~#Z$X}4$mdKm%XqRuFDHEA0pRfd*pw< zo-juJnsrMC{hE1?uX!u#*DQbVJiq4ce~Hmw!TiGch7YK3f?O)+yIr*ioJM#T*Uw0v z58Xo1@J<XU6uX6DLK^22qQ)UkM%CI*3)^s^gFofPs9*F8Od4VOH%9S@=(POM9jR)T zbu%KO`-c08y2HO8TRSMGQ*UcPh-XA!$&?RY>E_Ea@j}C2J|utMP(DmrV^LGeYiu6$ zqr8Zl&Q;yXPxpm>6mW>~e$>Be=*HjeJdhmkYU?#mo#$FzQRfO>SrqfF&K6(F)ZM&e zn5heAJT45OJN&OXTA?TZW9cwQOZ?q85UY*z*oV0f(5tarT?hDn3+5Q97#vtlau!ui zYT>*>j*~FK8oWmL5nely6AFfSOb&5flVEq+C|Jn{4so!&2ftjys!?8p7V=O!aENX6 z8R!NKP;t4R!6&{X_FkB3$Z@KjUbGnz^{z?D_J-6H(V+I^C%%|on8efzuUPVwpwICp zip#WV?rgm%-7q?_z?YklAnJ`}c8y!e$k}Ex*)dsgo5OCHnvjxmPinf_m*l)iW@Qkn zFI1=9FrC@W8c8jA03t?mRLqj}Qo5VHKMhj@4Q>(tp_)|G8ZE}i$DUlHC~7<+!MQ|_ zRuHsl1<xA+=NHv%L#j*G>cr%f-!%@TT?QW)pVQN$7Offc+$hgXn0!L<Xe<bx00RmC z0qX*H1y2c*3L#*8(AZf3I1r#*fYtFU2s0r~M}PBB;iWUsD&bdaTbsUrWl>Tv_=?u- z${*)_$>GgQFG-R_N%Xkg2CWty@71EH-dvD9wbr)h*6i}^A7@XzwIyqEuzcxAd=&5a zRs9v;N|*omxjWnXxHCV`m28yn0+Xa9Gd^CE<Ss2@J;CxU9hz$;tHJ4>wycRElkbWA zNmaS{J^9_sax6YC??VmuL_`TtY(fxaM28V-0!kT-L53Zf28yFn4Ihw{mlQeC)VZn5 z7jXXP-ceVL9dEZeGLmlTc2`uE<l66De&vF3iMGmb&mD>C)1ymrd*+pg|4V1k&AdHP zH*>Zzt!(n5iR*t8te0HVCd*%3o~WU7Xa+@X+`frLfjOqmH@M3J0Fgjw$4P^pq=6~Y zFw(}~U)HhZyZYqfx&;%*1Sce3(`|kIc>VHqSLD|F3p|MquQ#JONy2|tdupOZYe0Ru zy>KiNdFsulMxvkH>dU!vufOH0x{xc`HIE5z@1MW@N-wq(|4AlGlEeU`)*CGLjBE$% zX&h&f`0k(m=jHh_gu%EPCxd)F8nXdCG6+5d@+a<0C|q#5$FXV=*+Xb10NE8i<YEE5 zSB^-eBZDD|jyC>C!lLx&(vnedZI<Jnb)%h5XWEjwfyBa|tidxvoWT(}z^3a=fSehT z4lyQ*24_NAMdO`L*R`XHk_7<>5tRJcY!YMovW}5>C@lJCs=rTTy!#p)3eL0GX&Gb} zflQfNGr2QeEwQ!<srJ)M?Xr6{nl_IkYn+~nizKZ(%@J97dA7!3Te?-tRCj={Q4xZ6 zK`Of}xvWwd`UM`Mz(b7k&|!)35cnYG)Z`Eg(U}W-Lgq|P9-0=!38plXG`4_+ByFbL zoE%p&T<_^dyTJ||bF!p1Bp5YmW5LMGSqdZFTB`D3U?_NCFUg;k-=bwY%lOQ))FHX` zWV;iz&yU1r_NpR(Tpw}y6q#DTwLrjNY0gtwjxjaIkv&eY(Ma0V<W&9r*B7g``C7Ud z6p7}$BR5@^(?jw*4*oQ%ZjjT$4d~-HXgQjjQ8v`XTnw;A=qx3z1tkW-)%b>NNL0~{ zAf~@|d)+!gSYK+dwmU?%+MVWXIneggKYw;0YkFOs87G-JGDaQ0bxT(5&6A6-&U|eo z773~}2c%q+OOyMAT*#W*k+C|-Szi06#}54&D$dhfm1okw@ce`2H!rEr&Xm_*jtN6N zn1gu2w@B7Vcrr!G>>x@*UYZ&~8byd;=|<n<mmHm5Zf#^T;*{uOZi=SSyCkOwO7PDy z3GC7gl4e5G1mNRwK?|D;N;X1tGBeypqbP64Z&7YK{-%cn$X*n}&*|4lI*YtnTDICz zNbhlRE7=(Pq_G7K`DY`sQY?{o(eXvyfZm`(d6GynBpEF^qjDd6tfxfH)gZkYf7t0; zkqfA#%?<`PZ>Epn!iNqVfL)@_No^T7aKq);9(TrzRO6@u1AHImbwn8q2P8Q#j+Nu8 z%mjXgsv$3}5~uKk$C;@0Wak*PV69fWxj;FEbXkBc^&@g6SKbBMIhk6YZW!tK7AH)d z?39Sa+b&CD9E~2##6e!sTb9bk!0fDo)Hp}e`O<oT<VOjK;_9NlFWGr%`h=a`lZy>F zN_!=Pqmj+3tgo3-n(h{)EhCY17^6L24(M~}u&8r%7~(tgz0S(~f+|*&n)zRsqhjcM zbfP~HFkNg+iJGdr$;eiA#6=e#eDtWnhj+Cmi9jU;6tE3$DwPT4;ey2JiVJZH!4b{| zi-_u^#H`dbt@gVm=FM~%M!C(?u3c-_=kb%_OS>AP@6686&M|Gy6R^Xd=1jsnttEAy z)B{<KX7?!Uzq#bQTJ6|EJ2Q;LCowm(Alsg(#fiX9!v^I0+;IQGEiRK{5z=8`lHQbJ z*^}>(G&;3felK6E&C>~@)0^>M1v?rl`C-6O^6Av(agFlDF-$`RwDI=hDCCtULq^<C zGSTuJ%FdlH|1{PUCI*f7a*n_{DN)|K<Vvk}hI{Y~kQuGUJq%8`)0;}KC@?vlsOue} zO8AVxK#5d1U%8lwFGDAwL7tT2E^7*E5@lE#Bi0FXTvg1M%L9_&ddQK83!2%;j&vzd z5)MZL)>QClmD#Z6!Hb=CXK)O8Ak?Uo4w5q+e`v0t#$h9O#Ko#%ZL7qOK9O9Sb1F@G zz$mno7S-?l(q_Hu^o+#98vFMJgD2f=eE%Y(-<MeG^OhQ=xBhYJ4aroIY7%^9rs5ip z`~z`mWSh|_bjyZfyTJqHdnk!5>4w&pB#*(KCFlq4xF{F?@?*Eb_5ZQ<HGoZ(=l<tC z=j0^KS5Lm1rfHg{Nt%X`CTSYd(ho{0rIb=@t+m!#5wL)OhzwcBy55e<kRc+9%A8}& z%N*D1lF%{7oI1VEaUC+QR~_Rz=k>bj?&db<oML<U|K5{+;k4}U=0<vQ&U;SI`@GNl ze1C*kzg@4wUE`0k%{=ean_T0+2-(zy@xd>*AozDC9!yEtlnsI8QI10qf{Pn~55+z@ zXOv8qZHHN2Gqn|YAO|8*h_85-C|`yRTLQ9txS~3Fy;4b;h~7U3skv{Ftwx)M&+?NM z$?6r9Vp6svc+1?<khAb-9|N%|J(WB~(VuP`8UHzDQDvO`&~8Wemmle~tlgYrHj$Xj zFeWz`rLWPl@wexcu*9Dnd-G!<ICHzqun8DZJ0=9)L497x{Gon)>eL4(o)lHAv+NH} z>8L0VmgMV8n^#qD-1z{R^WQ)G=BvMc_+S1{S~1%!xu5C^O6N6P9$xx|t7G53`_NO; zcfR%JOGl2q{_<GnQg1)4M`@<=$P82qM6EMKqRD~>NaKW{3URVn@XTeg)3Yiy)f^!K z;|8iz(^xfGohJU-1lj)y)if`<+aDBVGGLhRir8}t@@)=_OGhmP9962393v=m^#yh- z)gbl+jJ1vV^RBKA0zYfFw3)rGT<@$P*?565_V)Y>5na-}rYfT>NKj#v)97>>*dnr; zwZrQ&iz<O-v-&n+jV@m}XbW6^Sxli)jvu)c^k(KS85uWnR6#8-Ui;Z(1BxFB8*sxf zU=zvuxNMgAC?ecE+f-|EO@RWJ*_5ojrnxkf#h2&}e}xlchD%IltlFM$(dPMkmFSNG z+&Q}Z%bRA-PX{ggItF#?<R~*e2h}E8$;pE0RM=e>DJDhGX)_CSA{U`jI-wRY>;>4m zpaso>B;3C(SY-F*>4kaySN)N)Oh}mGw9J{M2YX5#4N39Pt?}-JZ-F=uwwXdyAXj_c zx$~BI=BUlS>Qdd(*<i=TS{nHrU2cx_Uc2=BnXGaWLncWBVXs=1xFW1zxdnkiuivOL z=+z1(yQuYgo6Bn+zw;8nogsI{5y6Xk6DaylH&52+oh_+A^%?LCSgtEUWvLYl0!%h{ zzHnB9%x@6ck!S4xe50q{?eI0U&8@z%dFkhQjYp*wij9_4OZIeJ>nNS?ciwev)m4@M zH7i7Z5gOL0S}(7QJ7Q%9t>~M7S*U3sS)gK*kEn%#YxmSInWMFomDLsZtu-3QxW9eg z3lQT3rb5k{RM?U!3e{z(c}^i4WFUn?!=cINm5@2J;lB{TDVXF-mf7}F{WLL|dmE)0 zh0Y?aj@1-e7Z;Q`&AL3Z&Ms=)tlo$YGA4z};IN}swwRx*O3nrk^3)Xd;AAtyggQbV zFqahQd==%aa@l^4vk<*X5bD=fsufqy7xSI^v46T0WM=Z$CRp)T(493QU7;FsR()fk z=z>1LST|vAfRH|^!9le%({7@*!ff&?Z;}DCqN;iYg$e|%J)_C%dnzV((A?W5)icU; zm3e`dSZUpyBC`fvLEfDWGModD;br-Y=W`9Y95j%o6F+>SaN!ra37Nh&sm$>zS7rPc z6|I+5xb?2WO8-KiXZ*k=fix}a*D-Cd_A&(Ft(6H=Eemrl6-1{%#Va{I2T-An54KH~ z2GNUhArAd)w1)lSHx-<~e>+D-RF*=UQn{_P1QHQ4bV}`cI?XRt8oj8|=j&82vwU7@ zElANeTg7JqHvGRyJxh8KB(yqdiJDWA?^>PqT<|nyDa2J7Ts*56OY$A#Z<;JdB`Te> z`HGzRK4o?Qt5$2&Ih+t08@MEdX5vvfG`f|5kpnauTV~Q~;zQXUrLBrsqgMJMTT$qa zA{GZ^HrT>1-dM0pLBXcs!{}TyaU^d+e_XIlR{i0+_6=(7#cIO#SBhok%cT#c|CGi% z6oNvp%GKm*b;2X8Rx}#;U43SU!)#de5nLj}Iqmub=19V{R?rFRK4a9cKO*=YdXcOm z69ODpBSl%2GaphaOSbO5Z7b#AJnvTPE#mn5WUwt^8T%`13U``Kj2~)fAVY3aAZ>4` zW3RUR)CKn(pOD!O&7j4D%x%m)fLAe0N?=eV3O@`>?M)D9VH(du3U($vE9;JM@<4r@ z_VXyI>xO0~_~|_$-87v=&rbM)e6r4f3Z>c91?t}M(+69#RxHmf+>cH3f|D;?BPi9H z%{q+$OR!GKX+1@yxqEn}QdJU|Tf85<=xe@&tHj3gn&QhHu3l#$+@6-XxkAwmuz4s| z8wsn;Q5Z~l8p2*(HKMRPopr@`LEXC7KYxy$?}<FEP$_1waq%6(86scJQE3kuO;!!8 zeo%6$6vg=z0?Xz4%O2CP*gCJpBRQNxT>@JyOE{k(!0}V4owG-$Qh$|jM$v*%MC+qY zp<*4Zu5;%+t`vAd@oH7M{79&_C4zFS^wP*aO%K{(^QW;Pl|D)bCT&~L^RWsuG<qtq zQdLD+L%6xBtnNBtCBTx$F2?+e%UT_F=Py($_3`|mrKB0V-c)E8O*s~R?}YlAk77i* zN~JZ=sWT{)<d8BqN2}K7n(ZP;2q*+K2P{_kKg-Se2<~50_KI6t4daeq1;A0Gl`>aT zp!KW9zc9gf08)C9RVqcZ%j?)i1dUxZYxF9WV%jJmR8;)Oc>krKHx0XN9S(*lDiLIh zCN~0A-+{;oJfaPeAl?I~<(x~Ja*1L_v*Btz8LG3EkRoZVPF3)9LtT+&PMLcAc{@^? z$RoD=-{*(R4P{mq6`$<Cm=zGeWp!fiobhiP@~W1EHFqo*6>3EGtScst#q$)OU8Mjz ztNs=r$fQnFhT3RhrXF#gPcfM!N-C!ppe03lIK3Eu&_PKRquuTAMOimAIk$#Ky>iF% zjMYnv4_oDSscqp@#Y>}&*}Bq=BJE?8DxRwDX)i!mL)4x|zvz@XI$A2%UQd;Z>7}Ut zR+Fu=wj9;pI0Fjpx#pqvo6<0<_m(eMObdOM8Z#;l3c@8*OAYA|x`{Dqg&t-2=F)PY z^(Z)N@Xx83U(>i0gHc$PrUg-T0lvEl%Xb~Ape6>nAm5~Z37G(cAX`$zrYS^4g{(*| zlr!tKtsL&_O|*7<<|yOMk%p^Z_{@gbd{w@~R=Bt6tW&SHv1Pxd3$=FiJTZOvopm2A z)W+_1*F`!P?uZtK-R<>*ao16o-DnW?PNy|_&2R48qE^{M(sp3uqqluP?>;a6?yu{# z$??mR_7^9Utu7$z7XIQmP2#Yj`XJCVn-1U?P=hFLq8(|dSnMgD4Ix(;EkPAKm=p=$ zzPNYezUzAuDz}qgwJ12UBwC}G6$giF{H(G>ZP&-Uw#FW~adRf3_N!d2q+R+;bIr?Z zKRb5mQa&^I%cM1c&O(XWG*Er8UN%`>hT@l1`evC5C-$z1#g(i!;7#<o!%MxjMGk-0 zw(TQ(Zkcr!Lmi1~5_WoATQ_&d+MES0_crpCt=m##D=tMNCihMNIT{gp?=U1zSsO*Z z${9Wvn7n)*e{mQdb((ZYE#<&EOwt$k%|=w48tW35Z+BnE*;khKt>1oAXO+nsL?pmq zmB_o}Dt>)JjdYXR*`~(|FSKvH@tMB5aMg}=Bct)Yno?Hqs`IdB(xPe)@6ziXT6>FG z3SVlrGxb|LDrwH8m6KsQMhP6Mj6sadD&^TWB~}yNZ_3%$%ej7$QyUm*ig!9oeYbDl z*2_wJS$Fu6Ex|U`=VzM}Ik3Da-jJVPvT5<)BYU^=s@$H~B2sd&uXa3esaZ_Z^(e9k z+b{zIHA7aQPB5kK6FUft2#;=5Ht-veSB@jt@u*po2A|9_DRx_zP*6YAT^9}%n7l?? ztY^2HIJd=vko`7BhIzH!WxajYxosn8>1W@4x5rs*bovu#QS(zI(#g1jS9@6e=TWh| zV3T%SYNDVS(>1}O@cS=E1phiJzxgpc8q6V3TZ&94qtjCd`}ZaAPhLwK%?~rfx`cfQ zQX=075usRKTY6_Lh~+1`b9mk*<P;e7$)T>Mps|JZ3N_koRq^L`b#7bTK$@C{yPCq0 z1>S&D+8Dg|wPd2%V^Dhp$LU*Q(Jf}DN4#z}IB~n}#)7(ruIufNU>z^S!}I!A)ZM#4 zY;6xUv~;d^C5Q_Tb_eQKlU3d#7euX_4<wuK&&f-Uoxc?5rg5YiIdfM6W)=Vl+=2?L zP6)3`n6MH23A6zuv73P)GfvB<?Fqtc5oSY{qrDvmtuC#)EwV#nb(vR3T5Sb3bw_-= z3XM@s=AeqBJN=qj;c)-M1CL2gvyx?1UY7N$S=Q!yYj>~orpv~%NVcV?c$1sFK1HlQ z{Qac>a1p;zBBxG{gkdHcYQW|X^5uh7I|~CJ4IuI%&XYzz%z_W>I}wj3;@KRk7R8z$ z)EJEoWxSrXvtC}yZ>J2XdbWx3O}N(+86Qr%d6$!Aoi4s`{;Ot}MXy3izvuuPO3WMg zUutU8G&={C%jeO$h1lI_6HGCl7G|8{s36m{Ljt`(2?K3bG|S|;WDV;7dW!VZ{L~%@ z)r8uEevvl>i$5;;e#-RDC#!A6#Ws7fG&o6~6A9_X9h*Wi;&;ZX&1B1+(vnL}Z3ZuG zLC*l1A5EPsGx!dqR;X-n^&vvQCc7`G7DfwaU`3}$oUERqCX~F&)Omqro(+o|r<qbq zET$H6ELKpvnz<vq77UdahW!h%xUG>k-r4JQsI<-m*1x5%76=f0dbTA;_lZmv9`;<Y ztDh8BRH!vZEz9PV!r#tuun(vcoxDyhJf2Xpsu1vick2TqA%0_xlXn#WNeX$FwDMAb zo8Iq}G6>)XVkhJDB)^`K)iE0|UbL5~6<T3!lgK;cf)MKJK^fAxGdk-$pCPHHLPE4I zl|vivkixBQUU0+GE;t3=D_zp8G5!9NdLG2Vi<S?R3KNpIC<s680%D`KjE^jGmYx9- zKDxnYl_2#-Yb6%6A-kXuOSnyOwL-0K>)&86y0-j5;;A<pYp$rP6~&lsb9gZ!1reMW zs=;?_XvMMFAj1hZ>!~`&)LK@bt1f}aBHDHKC8B=QfUn^PFHbEs>#Tcvcc;Pla<yyX z270EoZfxhJ5a1&J=433*C15Dqf<6Y!ka}jrk4HZNTHZ~`=EXB16^gifX2lxz4->GN zB!=f?aZa>rDQx1^-796#$XD5d`lnj!BV*5B5)#w&QG<?!Uc^0sK4yglN+D%`h9CzI z&PEK`ksbTCZQZ+z=zA6<TlyO#OKzKWnRg!@T>s4n*KW&5quUPM_^aU+<CkR87x5@R z-ZLxB%|u<wh$pe$W(F0T)Q~^`WqN)o5tV&r2CpiroD{g#uGPVwmAm@gJ!a=Eq1HA2 zo74@nO^-Ari>FX{K6!Oo?AB}jwOa<ZK4TZx^pcH3$GZY!FI;koX82H5Q#{N7^CP6R zN)z@rRWN2sDwT;igtiHhZnkA>Zmb#FTXl;~Q0u+9>ek3kwKYZ>st0Zx+}IzU)j7nv zh_{{m$Lp|ny(${Vm$*erzWiC~BX%yabMwYj<yhOL=Qd5trfS$Kr*`7B$T7LBSz?yO zPio|zZFb$BknykA6O^j@8n4f5RU6cLHs|`;7LxPU+pIsCxtQ5KC#z64%chXsF-NVo zu&S}gE;ZBXc~07wV&Jz~Uo!Rc#G+_jlXZC^0*Ce}&3e3)zS*ctG9;7*lY!*c&Luau zZA_TTjcpxqZ#))jbhdQ{-Tfwg9+^Er&(Rw2`u%MY&w`<D&wXrrb<poce+5TqUP*FU zUIE`M#V$3q8FGjdy~mSO4lyUP&f7S&tvJduM3Fd|KqR^ap;NQ1nL60wb~mkG-2n?| zBG~qznrHL(&9+4B+tN=rlf2^Q?PMz-5t^3T98asf`msM<@~vn324cvjTaNdp^aFkq zD7hAjgm95iKjX|(R7lEd@)dH;z{G6J<9CGxp|3%!;%`W_OdU^Y@*4Zq759=~&N{sp zn}WRHL1|dkz?^^IMY{el<NGU9ge5NO-PMnczjEnGPvha_extLaW-;o0hMNdx82C0I zGfss{PT2opsh@Sbbz-VcM^X@60i)?CLbR18?KjX3*bUE4pE1yfKViMC%P5-qZKhfE zeJ&u+n0~n2e(5%?PE|-g*P_*-u^}KqKZ22;%^`vRjs!2g^JcE|GUWK8u0Nr3#^TPL zvxX)_OiX>oW!d#n2j|2DL?-T<I9=(RC1iy+PeG*AWc*h^L@;Y_ycM-a1(WVDAXAL% zCIChV>#bczgK3G;Wy~$0;8MwFwdPi|al6iDmY$joM>uHqN(2ki&q5hqdUV0nN`KMP zzk@A09Y8iYAQ*Xh4jcGps8y%=tFsiGXD*FGGxmEMyw)^Fjn-hIj%y!PAK-AHeh0r& zz-Gyw11`}T7KusUBk+wz9RiAptczk21NqsA!{K%7{DF`lv;-QK2!az8(h}+py9NSx zOUS+iaB~*he5-`bWrbz<(o)z=&jq!XC7m`E9aLs-5d@PBHsM(#ZP|BkyJwz*gG3Ho za|?QlwaajWqkx?}!HTxfR^h?<wy7bk-F3??PRG;;BB-o+WB+w2P)_f~8f5ES1vr{% z$0|g~RVF6GPGfS|DZnboTXTY`Q*dF7pPLIVA$u|tw%G{Luk|s0=N^Gn3Tn19+|6p^ z{_1bp^AbUOUBGA;jk!h`tZerg3w?URCriK17R`!qTh%tTLHZ#{>J4_an|g!Y>b4>2 z=0wQjb=eC=+eU}pR!&xhoY|{m|3A9yMC>huH>j`F3ZtAjoN&M-Fl9LqA~9P5dv@y| z#d3pD%$HudCsA(AwOO57=|(4dL*Cz3U^g4Jh9Ay4#mxxt7Fcbm)ZvbKRDErFwShdo znpJJAX2riDTzZDgW@9EfKCR}GjY^PfvQrYvO%-L&HV&B${jIbPA8#m#dnU@Q2aBib ztw%enN-ZeDS25e9cs(tlUbbv?b2M8+{qu(kri-YTFGCS^T2)W_#ibBe)}L0Q2hKz2 zK#dOgn2_Toj1K~z9}fGGt&boeL|FopZ6ENbuwN?WCSmTTl~HbQnuTgG3IZs978 zYHwbPesEb@m$VhQHx64Gq|X_3^xU>(DQ&{$Dq25mTBHa{o5xQ}w~#NBJmTo^#H5q% zpe6`o0q{BKX046kg!|*qeq;`FXmr}t9C$f25oMNSRR|2<4cdh%$#K50u~3u0_ivmF zd(!JyZ}2wPE<HiW5w$ZCYdo^E_v$b9tluC#Yt(q{m}Xl_TV*SBum6Iv>EbCp;IN|I zQ#F}i*Va3K|K|Sdw7a_c8*Xas?pPN$hCX3t95cN(Nm@H_YF-LjE)TM%TwfBDBRdmN z6B>z0-I+K+eQAZ*a<cw3+hSg{V9#_kDcnkTecjqfi_=~py0_JAe`Iy-0J(N~$L4@w zGe&r}+21*SzftYUZx-c+HM`scU$T5;#vL_nnh3A2kN38EoesS#G_t0nS4egw>#J+6 zyg{t?ct2*H8zKoe_|o*e%Ry0R%o~~?R?*@C7xDuHNDrAn(AWfmqI*}uLp9$|LfwmI zdp6(f){_(Z>(>Tq4&ARJexuU~{pk*k+hJVCZyY~zDO4Ra2hE1Bm~a0|z46@Z_SG(9 zPLO2-YGQV+Y$nX#u&$-F*5%Z?%7IW9uO=p(aK{sF&Q@uQ{;jym{i1e3*za<R&XL-I zUE4O)`OrXBEj=4l$LkM{@4XbZO8w0}e)v1xp<R7FU$7iu8>LrNPIB-Q=EKieFC)C1 z7taWm*cv!FD{U2XIZUR~8%JEFY>D`rm+61j#XD=}4c#mh%;`$BR-^67rhmOYa<FgX zhVkH~R!HjHPj0xyA0~I{{k36F{rlm7s$<JY!`|VY<lax15LRR+4(6eD+4LGIVgeU4 znh--kNntJdo41zd)X4g#-e;t*1WQ<ZNc2c|7`0hKnARmI)fhH?WDj}YlD>uf=*zUp z+l1!8Cy@#Gi>CLB30x{pV=t$0%1h1UO1La5umo8`;mY=nk;w&|n{qw6tfAp=MzE~| zq@p0uQ~l27=FVGhvNx{W(>1t#W&6;X>fW89t_~@2sdeFdgRLf8q$wEcO}2M7u83>B zYhpcZ+v@t}1zR?`!u?xoYr<<@`=k}R80WmOB2CX&LFv7dK)>+I;pquMVL{lwJo)Jf zDlH%7Y8R0P=Ro3$nyT%abN&4bTk2!dpU%GW)$2g&&txY?wzZ*!sm#7UO6%{ML^yNh zk|@PD@tr$?ZTu%q1v19;`q|KdcP0m;*d@oC8xZGUlIgq5wXAYc4lL?ytj&7Sj1D!{ zsO-t$kYK6yuReI!>Vdm%AI}(P@HCY(9BX<IJZ+?B{l?;p85nzLWmEt4F=9%#Zm1gH z`^eFU4?VMY$8+Sxiy2$@8p_xjZ)%{7&5QzW3g#-v7q2LKF|SH^Z7zd1Q?5lX$A0?! z*-Ss=SRgDE)PXWDS{9Hif=#Fbr2$J~QQnGnd@M8yDs~z9q7tLXmO$V_sxFWmE&6Z; zybhiE7@B}`rLTd;VBMM@*`gqV*W=dknjCj?F8j@eO2Uy^>9wCcr+$nyK6wWb9>3{v z>BN&e-%SmqNI6+e%F`+7r=#zF>ktw@$ysuR^l!i4`_3K`JNI)kPx>+WpT!=I(`Yr+ zi=ik~u!1G%B|EJJrb4x?Eg<Co^VqdNeum`hG*6I*?{ECRG`{x<=?6bhv<;-**^!q1 zGxcqR$E_lvZ-1CfJ@l*JkUHsyzj<3q@e9BF$J@_J&yk9s|BS?d$I~#YLR?SpM2@qZ z$&Pu_I6XiDn^#VEMlfiQOw|sa;QHv$M_VKb*wm&^4N3O$!D}kIYeiqNYn#p)ezC}# zYt?c2f+b@3&y|&zU$vtCvUy0$MJf(kYA`u}^yvZ14b9(Baz(8>QCZ@;MOU=c9$mnz zJJ%vJvubT;_sWfJ3++WBk8%!#RVY-vv9Mrl%Rd0n({R2F5v7|^-}}qJO&QJ54F`Lx zmZ!x7U@4+y6l7~2AWDl0(0(g0@2RLKJzjwTQn@GKT=wrkTeH5nG+$x$TXM`L<%`Q~ zrA7H_AF(9MNnvHY=&Lt5YGTELT8pOOb~RD*N<ppG8`P#ytoW;5ix6BA&NmczazFhV z@CudD=g7^oA%@pk;&vL8I)mDmbXUY|tRk<hIehb%v}Tt<&}vi)gPw(_NTEbIZ_(E= z?<<7$3BE{0UO|~%_u+s416GFi3z(!E3Rog(4U8L5iG<c6p<M{+E|BZG!CFBRE>ILx zrXHY%Fi^mwOGBiMI7A~tv`zmzmZieiQ|Ei*38SFa36~r5P^5zX=cy}Nunbx03Rhvl zy9RW?JF%PNRlE;`;WM9p3Ak^^cdV!}DRdgu2D=^gzGPZM3y2gVE>Mwg-(WWAi03Hn z>!n#E9UkBP_k((R4@5zoJ14qq$;22@KvbikWtLI%1=)d6IAmrt>5`BOE&m;`y~kHm z>Rmjiw6QjL&HNnm(x^FT3#;-Xi>}+^U3l$=%>~9HC#z9t)jC5?V%g_EJz&|2x=xQ) zBv&CYKyewk04x01G<@~E>lXPF9%H_b6_q;hoJ|t>`vD62J&n71NW(N1rHi>9xC>=7 ztD?~uIrL(p#6>33l%zmSgDnklC!d~PA5bq_7_QYhYXV7EeqCPml@Z&`>q?tjLN`@> zwp*z>mHay(_;@6=XU&Sf{K_h?sMWjXHJ0{%Bd=<(>+8ew+wyr)vuw=s4}sk@K04%X zh}rrGU~9D5I4uiJb8y*gVQBpQ^w`J#$yVgm`D{eN7v;StI&HaX(?8wTq4up<o=AOq zKyfc>%0t}UL7s@nQ04T}Q_@O4r|VZw?;6woBLJkFqKj(e;)P(bSw2x8h}tq-(>)`z z+@A)%Q9+4r-HTdAerhb^9Fh8N&+3|yk%iqi-_X0EuEV&RtncdRdm?uAnt0v3?#jOd zc)zU=HYClhHNmD$t=-||^{t=n>uOInXq&nku4)^9xUsdn#vNSgX=;-O{{g_9-lsPB zp{J=I<>}Obf=o}Ey;w`@#ekzsWT`=U1wllm>Q9e*-1DdjwX7l6VK?hlI_La=+T<wY z^6T?T7lb_)_2zZ1<bt`bjVr&QKeg`DLz5jfxSjevYtR%qFt3R2Tvnm=X!W@c&zy2c z?>BV*+8Y;refXC09BZpI_a6YyY25T7N2d!Onp>GKGW$Lv@58S^bE>oQ{#=d<{D{@@ zW|N6&suy)IAZBrfNmW7PI}zahsgaib7w<yKx1kh#MxmfO0Y`NLv}#26vqqGWY18KA zTg`g3=C+p?X>9Jo95ZRMl`M`%=I!d!=jU0?#$08`+$F6ae){#8MSbAVs#uUUh+RsH zJF$3Gt#8rQ3+5`#<;5-k_RDJX_`+!9TmAp~QyytrxrUq@kFUJ1qg2}e4_LFAb`CS5 zgJ)>bQ<|p;y;ICu4ldFt*~3|la(HO<!TmR^z4P`@P#H;Rd{2sWLSfu_5<kEY1|1N2 zf!hQt3uAH{+y}Uu#_r%YjqPO^cE&X&t{U71FGjq<o*Db4JSsTuVBct>L-Cv*riB~B zb68rxfpBAEedKft=f^b`*IFm8DR4E1C@|oVv|HNEHDTD9A$G_3V2tx--{->H++*Bc z`W%~q9N>IL?&}glXy|k9ow|nSBv9_nK%UFqThc;qAzQ}2kFjAomcCCjesd#z4njA3 zxWiI}+c<Vse$GYjW6B|T;p1cr?mvNHVXkI;klj%+b}svz3-55l+<y8TVj$e`*jaA> z*tO)eJTF`ulCR-?a#$0tx6*rKW9PVp^kvL%5r&?TpHqEdi6W2p$#BkLtJw|g#_@gR zQFg=lo#XrP^y%vq);Yq1td5M2zdL^4#K<Sc-zDR$Zv4ZEJ0|R6yqkM~(J&@-oPw`C zD;82+bHe5X|A8P{iz-F3{<B@(gP*;s>$Bu5(q`!`Vk3KqT{<Iu?Js{J*PSO%cMlGB zcMT50@NdTzoAj2nnceUg>1!W+K(3>6-6{Q=Kgw^!`{Vs`l!PG%$vx7V@!zo~RzyYm zqvNl!F4jH%D*McM^>~d8XV_BY_fs;t$mULw@TgACc}eAjX)4SjG-FJO;S~4Ms3x28 zq7l=%$YoJxb6Jr6lFro_jK|O?jX_ollg`oM8?w$=IY))h`bVbb$f-VNX0DH&k8J0e zcsG&Bhed>$ej2<kFks-Z)KFIhddFsg7_YeK7tR5L#|Z!ZM~NW4F8$zte?{uvd{;Vq z<_z(_F!NV;Nav-!(s{y@E#pu9>hPhTo&DNjmOUe#ec{Z3{W5M$!)fX*X8zKQhhaF@ zVtTx8`n?r0Wte%N<W8MGpPF&^>sZUb;QkdCUgurhA*>|spTrbzF)$@Y1}9fv`Zf7w z>ih?3?9^XR!u9nJfG^p1SaIPGc*euoXBerU3ja7Wa4o)K8szdX5*4|fSf$@cH%o7l zSLr*+b9fQ(-#76N6Ze}cd_{tVcTfM~|00d@FYLC-7a)1rNqrO!;xrtP<4!R??*0fU z-lupjb<F_B1b(MK0#n2Evv}+rpT|(*H_v?7_)U1y`IPj^ju{V=XDW5EBt_qi&^2Nk zus1;&6vY&y*oJ56wtIHs9y;d0h1c25SO<(TQH1jxcouMa>qnCym)DwknO)1iial<F z?oD@2u9De~Br;2Qlv6U-(LIzGPBAZyYO{MtE2fRuLqc{B*|CS<nKh<!IGXWg$;F|- zB$44|nn5iR6WS2vEGzF{J#hcN&1>(i-LkxE)7JLZTgj^f_ujXD<pcL^?7ZbOt({wF znLnoe!n^!_9;5(Yylw|^D@<Mm*&{to_TDi}z9Aj`XXzW#U1ZOjWVf{CZE53}MB%~_ zhS|yQ;zi8If<6*k<rx{3OetpM43FBCj0HzJd2TpIQibx|a<g;G71K7%&7o#o808St z=INQbFjE_yp3Z<AH-|x<ams8=YmIc~b|*-OkZY!d1nF%R*y6BdG9HwJ0?NsFTftXU z$^rTyZv4|HKak!#{;VXi-O}0TPLkkBsb+phb#({ZdV;8>-=-du{z7tD^QnD%Pd|Uh zp5ye=d|-1#5>-bPk1}S|A6SWu(ZkFm<RG{ntp|#19#Ckg12oJqQ7I=w+o<8#Uu-km z0Q~G_ECS8!g;fiBDXr_{r@CrF)>-LjO5eToG_FH_gPW0FLfM&U0?&Z49jQb)*@qjU z$RaMCdcq+o#}ZzP(q{4c(HKvUo^w=qhQ}P`UzJuwn9#y)CTdYgWZwgCKs93!K>A1z z75s=YM$Pv$wHW^sSS5Z?nM3e?(3$BA(|OVV#VfoXEA0BX9q&H%5I=rN&P|i2O<e=D z@{1h(RYPAqjLMJluf>s0G?#;iQC8IHZ~Cz|S<v|?1pKwMYYi;%GF;@Fs9GvVd(fZ6 zOJESC;1q^RIba)ZI~)Byj20er`Tau7YjhOEyIm`)^y3Q$zSt58x>_wq2)nYP!xgqC z7CJlZ`Ry)Gpr*aDF78C1&cLvfU(w&<2t``AlNXZERg2<WiO+T80%!M!8{>(F>YA!W z?8?5r!Sl`15E*R#)3(*?2VWO9B|27xFJB(sEY4>;iDUB?>Gh7|$gk<DsU3;0Ry^G8 z=>G3`Q>>#u*5s&J<S5|d-UT~U!%fB}t=sQ+izW{n^J@b`JIi_(e!I4*rsJr$@6OXt zVz(`N<To`9NxSU}w$%}PTixwLHPzDFq4k8<uzFr^66x*wR<Uu2-%%5Yvk7yl*{IfS zUR2%F7V=lJc@|^5+a2;&7CF&wQJbSdYuh|euYN0W``b6W11&*Egg3_m+Frj_FtEg8 zWRs$KX}%*8im4o7dx%X&YTM>GQZ9$t>>W#Vc)WViqpovp4TW1AE1V>+z0u+itiFvu zY*RNx^r7mI)zX{eMlNS{P;fREi2Al8+qZdr#sw$qR1USuU$(TgV}-db5ZrQilFSQ@ zpABqiBsY@HO}oNGJ=*YXchsd1Em~7IvK|pO9nHbel3wl5(T3GE35P8bU;U+l&wC$a zZ*qH^NW!ElaFR1<V4us^j5zaMy+(ID=nS~Ew&ePdDt2#oq<dL@V|nt6jgr(?{iO8o z(y0dxMLE4^JgbU2yBni(lF6aR*R33}@vJ9g55~R5Ek3uno7D0uF-cq=t)oCy!IJjI zPHi&CYK&Hg-<zy1uQBOFw@Z)y^r~FmVRzSA?bV4##f|O~mo^w)SZNJAZFPkXC#%j4 zg}hovL(p@hp!fI@T&rV)`3DH^cDSv%o&qZ4MHr*<B-aPZBKzMf5%`IGG7r*C%-El1 zgrm`|4OFLl5?gm7%7C}=R8vF6WD#fJnfJ!&ma9xC;$G|s8#aEiaKB%)T1Eb*0dh^8 zwDQ5m{ik<4YWz80*JB)M={w~#lijOGcTejx(%ujM88OY~xoYW!^UdK9%5cu-RRJVu zkea4lwWd51c{Q1+DG!9I?Sj=&V{cfmva>yhPOK}5GzSEO!&(w|lK+%Wu^yvS?0jM1 znXt}eWdppPj8U4&h{AhZH~gh@VfVZa6;HP@yTMoFq`FuUEr%bZgh8eq*`}U;A&yB? zQ>en=RTvTmh(B3V0r41M%!?%`Fg(RFsfdFhB>W(S3eX4C<&%RkDwXsOIF6|=%StNH z+>nM37b&vIrzM~h6SRoz?s~U5S@S--mbC2K+Bf9QZL-A3w^w)g^#O0+p2nVtNjgG0 zq~E;7K4M=uwj}YnU5gv9t9@u#Xj7{;kwi)J(%#rrm#+{#PY`#7AW2SEQS52|;dfeg z`yF%R>;2X2k?}X%MpndkcR&ew)?K%>jj(Z{wc30w`}jfE*8-Jh!Ryt#U3DI}E8g5w zg)E(5B)F=8P3aepziwo0@7wd8QhSHA9jEhzR<&cBw#MRY-(c~K+#S1tSD9`0WzQ@K zgw?1WtkK&G*{%V;zezO|aWvl$cX)EeU?@WQGs`qxkofhA5Tj-8#0pH*=Au?oQcR6n z20##iub~AGr;Mh41LDdk_@~NEAXG`IplnV-Q~l-Yb`urtXbnV*`6DN5(82bvPU4Y? zxX<tP;bACgZll>&?Cy|%$DqG$VZ2=Wfg^N7hpGx>?%Z(e`umz)-#Hx#@rK6`RS>%B z7QUGGth&IUX_m8JU;{#DJR?|HTid2um7Z@~{1C4fS{{tJSR+c~ZC3et{SD`7X<zB} zeii2>!p=uk{EJexs{hNKYeTu?J4{-C2m8Ygh0d#1C3?EccRgv8GOTWo*C-OLlg8^g zwaq^iv^;;VMT>+HmUXE`p`o+0T~90J@g9Bqy6t|QQH?xGmUZY`9^+Uw$Gy=!c{7Ag z=zy>CZ}EGO3tb3nb-65u#${#1V3zS4;tHdTp;Z|$vyk=45*%fhC1z{1vcgx)9T@*m zItn5GJn5C57`$70;(y<kex_%=udh8izqi{RcDW-Fw`=@Rs39C~aFgEmQM9*PdPtJa z=RbJs8>C7)^FDFjxwGvvRrzBJLZJoW0Xi@QJNkCW`zro0Q;c02MZfJH>OF?eL}`l8 z58fa1Cv5P<K@Py{xgft#p<`10oRq98r(Ri!wxU$Hz({{F0$U+r#QhLTz}IccgrAk9 zoznZK?k_*y{<Roe8V{q;M))2($`)$0>FDCYE2GjY()ZqclPrF7JmU%!76$(8w3%Hl zvu&qYBX)_bTc<LY*jyZ6=kjuThcjQz^OcJNtVJUd^<&>S@80n>^(~p7gg#(N?Jm}? z)32&Aciy~r*<)<;o6@7d{xxa#hMdk&K|#og$KT8Hkaltr$&hUF<aYs4kW9?_J)M0# znhH`s!z6rM$n^}vPqrMCY!W^o&6Nol%n>IB7mf{n90*dBaDOs*xF`nE5~4C(0ASn= zuz0d?dG=oC=NANRto^RASsjiC*w~?tt3Knn>+w$l%C?OQ1A;EUpv=n409oEJ$Gs@Y zT5?nr8i(HZxUcla2-#Un-VZ%bj(tYmx_7z%&-Z^kFfK3y4z<OZm#1oI@;Do9H{~U( zD>@a+0SCnt95~4L73iGW1lbpP7zxOvN-Q>2H0Z|m3&u&@$$|#79<Yf4HozPT8d)Ww z#$SE{x!Jf%W8tftissZ@&U;;TJlhiqEbOLu^6Y)_hbTDi4)bQdJPVH#<@=u)-w1># z0s|pzQNZmEyv8n3e5pE_w=u8L>1k?oT<I8)Ud{rbdPR(|U#el>51r0zRUh8vfA{{! z$UvyDFywN{pP-E$7v4}f`A4AhP+~cyHXv&ilk;O6c;c7<_5lc24Be+OA?yna4Ng)* z$mLqHn#7N#=Q{SS+%kW2mw5QFw)@7!O>6J$*t>31_2#bJ2Oku#+LGM5_RHMS3C&_$ z`=EHmrsU@JyE^x5+%SJrkM__ZZSSV4%>(<}_uQ~Gxupk6Jj(<wtmIzcCFoVK1lbTZ zTETeaXbl8>(HK$&?P)7%RK`0*Bm>fICy%`Rf70jHt|ASH5bcsq4Y!^qEz(mxWG`XI z$j(0L;WMvEqx@Ni)F-_ly&<)GB4p(JJ7gDrs~W%c#^i4iJRK1q=%H9)1iEH_3xOkY zIEYjFgLDts`r{)n|CWrbT_rs(Z6!xZ#qiS8(sxM>|CqE%lE$QMeWdfuYozr<zk?hm zA=Hyfc_PyG^Y2Jo0cV!kDjne&#Xi72%>0bW%q2`P<%^AmluQHEz|v?YG#52g>O;Yt zV5UI8MN@3lD+CL4L0V*ms+Q{LC=^F}!X}>}sLPVly)?>Y^-5FGONLQ%_80|L5a^l; zMn}Eb6M<;PtESKQmg4zpTCSyD9m)x&ykc4f{j)eb%t4<~ARnhA&_&f|gE2!CBCWXM zHKb61#bL}af(zf7G!dwxT8v9JLt4bS^2iK)qOe32SQ3xXO#tO52Dduh6o@wgI-w2} z5RE-Osh6%ierCt!l{c);46V4UcJ;dc%_C=1!r61me*WB9o;kI5-|6S?+%ukW5Y+?2 zXOoFD9qS)kKa%WvzB2jh;1Nl(zupIHZ5GZ)d4^w&ti>YcK_+Dmr*dPXmMoNY(Tv$b zr*1}IWr_)>w6RgAlBox9^TMOT1XSI!H7`F4k$l+_k+Mcd4f2VM!AKuq$ORaU26|{T z<5>nV4c&b-Ckwh_YOu%$=$O0$3Oa)!B_vZW<1wwy=9G<qdC=r#<-R=PrI5;M@-snW zoZgz!@iT;f>g4%ph@6@L+v^k_Cx}XVJ4J!;THpEeeVjA_EubCnZu5l~xG}|E86NjD z83RQvAv~HlWv<X>0l-9QeIHAVnr0RNAf_lu0TMYcjk>asaEWOha7v7hTC+uajM0o$ zM<HOf02n$eJ=Ey|46B&V2QadDnWn(dxiDRu6QHolpvX6-DP)+mGj9qGgzj_*2XqhC zfgHsWF-mt>n89R=nwi~l{ERdPn}!Srp<i+C>?z`Z?xghMNv_Kwz5mq{ux1$3M+mXM zcI^irTsy{|x?|tz)BE;h_uqvV_~VNGh)ee{JD5y9g@aaJbh`gw)-@=Z0FInt)HO=m zly8w#NjRmS+FsaFbfZkHuosh3aR%dYjn;tL*lsLpD#wsE7fo%99KF2oX_GsdOk1(s zslsGB-v*>GJ1}a-W)V>!j`9)UfDQdv;mJ?H+yT=BS4gHd$ZF{wm}<`x_TSqp{&?iU znu9;u8FcmZH0Hm$b}Rdb(|7JYeVVxLI8H~Lc$_Fj@@SuTQK+-iJa%5S@0iq-cwV;W ziTqi9H|iaHmq`V}sp8nEHM=vMsOBW5%IWqmo4|+gsHkK<%Lg-zh?Qj+bq*|9NlJ0j zoa(KVQZD0E36PjnOcKK?O%wqtDN!+rX&+F<9!-~EWI;4j;-l9}igJSKDnO2d2|S}N zi_pDM3EE)=h<ql1C;*fw58$9EnP#j&4O1nCh=xqQgKi|)yr^O$D}_|1pn@2X266b& zxFKOP&<nZ5p!6Fm{0dsmr4lkaA|c{Xa7S9|1i>Hhh90`@z_->fB73!~Lfb^`_CcF= z+@>nZW!sl`U%QS^6b6lUmD3&!dHaT?KV)|PA*SULHh%0V#5R|Tmv+~C$%u-WEJ3Z= z?R{os577g^U`v!9<eo*3u5$G6OnJhi`YagBu!Uly;p`VKnhBRtNQ4OmW+a>nyp&?1 z)N|0p2h*%K8qH_|bbv;{mI`R-VPFm*3a3H=Ky8showA7OB76fy0^rk8K-5wI%b-5L z&;vwF8;Ss4Q=T0VV_+kN&LJD@g2XUk3R9vcp%v_$s+ZY5VoC}$<YZEaonH}t+T}GJ z4IXXXa%4>-Nj4cqwp`mvRwPnuwpn+(T*htuYZmtV`R1r}G}*O#aO+dUN7@GFTg8Dp zR-C+lU*p<)#y_a@a<6*r#aSBEexZp!#BTv#U(WoQN!7}hQELBf4yU5A(blX(B@|69 z3a2V#lr~Y4To}#dEus*}a{vPHv4CBgWovP&2*jy9oLc_UXj2v<wrFN~6CJypQuZa$ zRFjxq01#ojoA4+`OfQrXa&%sHJn(&<m=-XiIy<6TCg7=fbhJz!ktuW0$CZ`iah_=U zGQhZLIS_MkGCgl0z{};-0=(%m5VlkWu(lb*U^Hi5^@4?z6to&rkz`t=#4R6G4@6#; z1ZCx3$QGK+s+oqE0b~xJvSz4+UW!ZuAZ@k^hrwf@98-{SJ%MkYNd=U()kK1|RgrLw z^mwFJ5c$2$$us^2|BtF(<_$tkWP^ZO8+%%+e$=phq_cfw*O}zYyeMpB6OE0DKw~49 z2?tGnUSOqeveM;}?k5ki0`G^-Jv_dvN2FKCeyP@YWli^rl^r|1<Vk5g&wIrlx}Joo zmW~K@(61|)?=u+%m1MAre3p_h(To#y<3?3B-l+rZVxy|;az?Ob@o-A>5*1Q_w<)uj z&I4GBRc{^Rit|*#v|x+H=!z8qsXY<w1%{(*z*Jx_a11@<cq~V;m<IVBohv^j4GNSt z!@-s^BvW~YQ~?MFmLla$roF}ZTbNAEHKa-@s{!pjt}*47md%-qH7buNvNDK2UIIbW zkDyBeDk7rRZ3T{V2uj;nxDq=E2o7PA6&ZyxX5qF9*Fz*>rFSkcE_bq#REiJ3tdBP| z5)EOR8$w1h0@x)M$6QWHlHO&{Qn}<_)<Lcz{%X=7kTtAyH=JoNi=4i-Lm*!1oY2ua z_KutNla;J=P}xu|y(;a`KiCJ}z4F3#?tcDh^!_eH+(Rax1*8?>QKDq(06zg<1$nbj zwgpcL7&(qe$`wwjUrMV$d9BfuN=z$&`FYV%A`_XEBbp+zOq0%4y+z4LnkWD#3m_yP zaLJTl$f$DEK<`wZ5dcl)8&ZyB%3{nIb3v(-DXk%;p|sfGwZU@br=)|%!J7rRzB~$p z4R#I$$g^RxGRGuY9_p(g4?p<a6M?;5(mM|g1Ud#-|M;UiM~j+$L>PZ1=;Sko2kv~} zKgjBVRif0aeAc7-Up+kfGEIG5c!56;i`sPzCY}n!D3|tQx`jZdFlEp3JTXZI6A59; zA({20-I!ZBPN`^hKy5O`7&2-Nd@9LQ$e6a;@YiQZ7nb0!+nDlDGO4Ig!$3s2OE$Ry zYJEPj#cCBe5Ye43YnfAnyKqhQ8;)Mz+|w1>(D~TlrsLaMtQM^&(XsZfuI-O>hSzm= zFBv|)X88U0$h+h|!fs!=V~@db{}*<B?;))0)8AY9{a^p!aPRk}_r78>9r&lUpOY4k z@05N}Pi3{07aWSW__tv@i6hbl;yqpJ5_zdd9ob!E4AU)T%6@SJ3YFnh>?JCeVArH_ z#59Mk5z6kN1OSi|0}ayWVxpX36xF55$|-#U5PYRnR1pX+hhn%4XOpH3e~re`T)ov* zDsK_^4zo1NVm8f1w>_T{av4ezz{m*O8P$Oyp%o*5e8Lm}(+*e&yMr{IJ9qejR}Z)L zSB1LPTB`OB)i*3?dSy{_b;HoUq<QU?p+sN%;6dpeq_?vNH=R59z`3)B4ziu@-ZdTf zlIwnX<EB6`7+QbhtK_<SI#yoiZv4f8XQlrpCC?uCMHWsOMGyZRA_koBO=Uz-AS%d! zX&f_JMHPH+GNMo>qK~E=;WSZ$vOvCvs0Y`(10zt#5(KLjBa{H5?4V1VRc~b&vrKY0 z&>2H?l0<26L6b)>XjHhMi&9}fZDxR5Vlu4(nNQ^cm{ud0u!b?`0d{H50m$03#NU8Q zBYY9!s+9(m)hQ`b#4BY3wgHsgPquG)kg)7Kgnekk&b`u$<NeZ$cap-@s|K#W{MId9 zt=t>h;Povn*N60DE@NqbTU&o=fm+SIAPCqahyh@#g*N_i@YW(!S*T}z!lWv~qg7eF z(T39u3U|80RL_JgN4>21Vai2;RV1|l%8`salt)hBPGOcG7K-UwU{Xo;TZx!1!?$wz zTe^Yb6}*(0$^;5@Qp`$gA)cjc3o(Clenl0Xe_08|togWHZb;{WZZK(W6|Va$=gp@m z$QX{5l$F=gp&>WU=j0Z0^h-XVnXw8J;@*r56;$!08fB%sNRdlQsHGbeN0tYnUs5#n zQyQcY+(ll0f_KA@h~eac-t8mZz1xQRhn^l9euJzb5z>QVN=Kz9&fW1$iv3;h_MvOK zw}0V^p+_$;Z%JQ)ncxU0aW|<ucgM3oVEx10J=+I+`nGqBj`ZKYXy_~crUUc)4-KCn z%y3Wl(6+wbq0Wbg9=&b&{$S(1)hmt-J&ZMBAqzgD7~tQ+KAz9~C)GizH0TA41Cv@N zlus%YQp#Nz9<7vdm!xXKsW~$hju-$9N|thGbq`;5llx=`avDfEAr_{SpmtcTbc}L7 z1!$UKRA2((2!*Flg>xmqQn0^tAr+?!49E0ldo^8zBxRdSIshtp3_R3EZ(yL-kJ|Hn zbL0_WL%IZVdaBTP%;AnDF<?Rnhp`qgmu+Fx-jx+mYRP0^*F`cq_1YlwhOvlBf$T(t zPHJ!~Io}kkTU8g@JF?}T*V`Aoym!~rp@#mGJ4Q|%AC7qjNa6Q?OROipOUAbM^bHR7 z_6&_b)pA9!+Mn99?%Y^chIn54>fo09+qc|2^vrj6jXbK_IrPx$()&lG*Z%8yc@0)d z8x<$`Bd}`LF@p>wk8~x~>FUEN!%LL)rQnCp0nC&*REn}%!r;&wrNSbM3qb%CB4j$3 zR-(1$0R}lTA5<DM1r(0SRFxrJ6vto2m~qGCoxmE7m4?bG+*3hWn}Ot43E={r=VYY> z1VH{<2MP-E2{jL&g{WAMKURx~a@y3XMGLpW5GUWqx1X-<jZ1?gw#fFHVS95=d7VAp z9ctXBci*%LG%{GdYfw5YRMvS8EL!`3Y42yWBr=?IohGW?!<&vu74=?@eX(=T$?+x} zH68dT7vH&eN1s=JaMR{tTXn;x$SZ@FdmcX{JtO_PZ(DOg*TXgTg~8UArR)<AckTQw za2XvD6+`?GwB|5#F9V%;G@xXBz+0G4ta3GAir8Y5Mm}gJBoNr8R4<JdshAM-LRAqZ zoGKp(CmT%_Wo-lc>@|Hpy{3nTlgZc9!+aZ5L~3~|qG$`FNxmVYDfUok>nX8Cy<bq> zbRM-jISm<oepZz>QOzahM#)NOgrEXY2&veN44_H&WmA&u82Q3Zm)k@Zt|xCjaPakw zq}$~+O2wL?dsh$KyIm)_agl!t=g12ldu-En`+k1r?tzUS^Sss753K##1MBuRua*vb z?ByO~0y0XEbWmaD4>Ad4{D9Sr7AToAN?YfJQ}LJ5F`!gTOoy`glnTnC>m>R?`W>}r zNoo=UVsXrjXEC#oY$OT7LZrku7~V9=RIV|jb;y9oGh_;i003FJo4_O)k!Y4O%+nx; zP%donXVAjGVA_a|1x{r#Z{lxHceu_GyJCNvHL&XLK4%~%>dY?jk8YJdU~JhD8?G3( z#s;fKtbCt~?;9EEv-kYl)~)vKkBmo#clj&Ch^gq$dJn238(M~5W%rFX@Bg3i>w#dZ zGo3qM7;nZ=A_dqqU3h~(2V0yIT5-xI!=`Z}9tQX^VIQKbl*_I*lP&<2O4%umfe9U= z7}Zd*C;SBeL%$>%WRXCa2Y*~=CZVo4KQ6u7@vd~BoebbF%ZD6WZxT1(zk=`7uWujT zZP`3x_e#ur9q&u`b&wnW)bVE`@g&gYMFbC})7viCg&zJ8RE{Miz+?hcj!-I@ejs!- zJQ~XiSzLJ3lRW|*hapj3-4@w2glHuybs<`bU=ltM3{<gBRpy^~^36XtGM1oPpK2CU zbx)>UWgn!9p2U}9_04sr;IRerXM_B?Q2uO`KNrcLP4eer`kBFJ(QQSyc?6K?WU48d zT9iyRCQ}W`)WT$HK{8dJWa_m=jjp=-1q}-qH7#zQJL5m{$(K^~`6R8S(s4dos2jec zDDVWLl)N)(PH8ZHN2}BOg7kaZ>;YQl<O2~cRJ{UqqYe!Ykvgb^VNv=kSn9T?z8$Lx zhC8cqM!=0<kL8BMhzOUtIcUtH_~F${P_7_TGrqn1zD`#=iZIj}n+C0kxsCVSQ@u=| zIJau(?&I4|Z1ncDtVjgc#oBw?V{;J)VB)oc8kKT*3ncoJsqNBpYYF$tfHeG`-F}qp zncpzi5n^M3wbJj2KjYdt{+YzuyN-?w9o@9zON%^0f8O=mMg+gwEqdLt>Xxwg{+bn4 zSpS_&o8aP|$b0B!w=$VB=vQfL5ky4<rR75j&B=ulS|%%@WnR!P2P_g8lPRVjrBoa1 z4yUdNrxz~8J(27^i5lE<MT8QwE820-;%F)qCaJ4v2v}-vG~FX(NXiHBch8-Bl1b0) zo_mtwjDPK^{aKuuE2hFvrn<${l~2m!LJS?pgeJx{o!Xim$A~HNBs8AXoF`BGr03`H z?Ago3RL7I)nB#*~1x_n}{!MyXkt&_5Pc3;et(fycs_MxTrFTC+LeHmT6{=K)s87Y8 zOt)!2NG+Sbq(~Lx7SEGuCC&?YRN2obez#CeEqF4m!7per{HxF3CO=70rAk%dN!3rL zn{daX=}U@K9-d@>GOa86Ag$4=a9dhXs!|H^n4qXK1yB6M`g1yUO{!2l<}6%bf<Ht& z<}Y1>1B^-1G4xWy<fRsR3FYalrng20!|4ubNoFvN9yzfyTqu8})M#~fXQ9VGCmgGY zC#$L#G%RXb(z2|r<MJzK?3Ir@B=yA;56Ht4iaq|)|Nm#;xpc2F=_|Ui+3F$fM)22^ zOqCf@M(idNlqhIaiK$PU2?{7xsvuLzHCU&Q(5Z=(f6VCOT$T=<agS25lk{m7f^gsi zy+Tmk^=EAkuYIEDE;Xyt{2qA<%3Xp=$oV5Z+6|X@jwHoNuR%qJbG-J>KkIV@)ekXT zrTe{_&DkwzbN+~e)5<-lzowKVbZr(@MDvrMsEO`Beyk<A(&@x=TJ<x$@PuAC$qP@b zg)@?xh&dk}qJ3IWJ)u`UE2!uY&|t#syznA_gnt;>N1Y4|@@dYAy@U{JsA_4mBMRlL zm>P|s$fbEOQ!^~2Jl$LxEjAY~>$@pSG+l^m*q(**W-W9=itvyiRqNqh@lc<W-)Nu? zC)jeWrWojyjpd-bipYIsR^R@+p)EUH(tGde|IpNZ*8Mxzxz^5i^zXe#m`>*w5<9d@ z`q2)x8d`2uA29+Wgx^XplEB+qElfQB*9Y0@Pgxr<YKthgD@4Q>Ff`J{W^u<6&WFX+ z!?fTN6A%(6Vgr%eJ5aY$dT4-nEskh#O-uLP17zj12s+MNe^+12>R^~`8Gh6d3>v>z zS6{odc7zBU$(BD$4@&Q>y?x7WoT0GWgx`CIKS!$-z`!{1bNDr+7lCog#$LIxJ4>Y_ zDi_INLUJtQWU3%XhjSal5$UOZ;&FEG>D|01FtoDuOuo0NYtaK=J@EC#oy|7U_VUt> z%@NCOpQ&Ee7>`)AdbQL#s0{|qKiJxP?SX9#pIvu@$DW99T-<+P?+wj2#S<32ZB64q zmw($`kY)Y333;vCFT4U-@)^hj*=nK)mEhp#po$veaA>j)$9HTSO*HT5Y<>TYm)gJd z=%%ib#!#Ms?g&jg_-F2Vpyg}ZkMy=(VBY`LmLETGXz%<^8nW6sUzRmq;a`XS9g+P6 zE_}p<Fzo#>S>#F2!gV4&L>l<_q}A_8rx51ULKc!@3~RseTXvIT7b3{3m<;T9@L3_8 z95O3(Ylv|0hbdkfRml=sMxmlur(l3t2=51%q&7zdHn1#nQWLIhr)@veu{M6~sZHIx zxAm+w^Zg$-_3c<fUkSg(Yw=r!%qk{RKz|GN2l`t|`L|%S6JDB-22-kNMzGVL6Yz5> zyO=gXQq*OQI@DrkvO`B!i?TgSN2Nn1&BFme<z*$@DbQ8uYti+`d(nti2*Yy1BjwZ+ z@40n2xH@@l-O1L)gSS}r5@+~(#ius)?Alg$tq-p~a%1qeSlceA+rK>#ZtC%lx%+l3 z&90%eU9nnm03P~{Oh!fL0o|6)L-s79B?wkPONG3Ga7uh>RFQ=q`jTKeq6X7Z$m$jK z8o}z2VP&roYX?}J6s*+ilVX!;J(UPW>N?GEJc6GwBL!xI5|SW`S%jJSjql%>7+*&x zaHef-lIwhaQ}52_!#3_t(moc$t2fZaSTFT{xS?-H%fg=Zm<srR`@~#0WGaFGYw2td z$4zHrq5eUbO0Y=sY>L7u^OUIsHg0ncosb!BU}`vlBOyiLp3lxnu*qvjiIAJliH9o~ zYa_?7r_5B20-h0-RaT~RNIVDj{!g44yNSJfd>#4y$IOq9OW(eSw0|hr*e6NnIQgV` z5|B9dJ^p&gxp}Ziq?EEfLXJ$g!{z%DH4V!aAlWp`1HlXsW#Ph26ARuPZ_FD~da7<v z4-(a=1P)EwC&H?s(AE;tx_4K^ySkT6^tE+u{LLF4zMhO;U=m+i8E7P|WBhP$+q&fk zN9X5ozvo#Q_U|+IvV;5zM2BjiS!R?R-EmskKQIx{ppZR`(9x-jEV~P-2b#V{TxsEA z1}{7!3O4rc;>Bcsv-AwR@W)r3M4H9vFOI!VLjNqwcOmvg{uFT4g*ti}Sj+GmSjpU% z(k5FpItncm^G@3fA+qJl`e!b6A6eiE7t^Q-muAqdW>lRWg~~ip7?J7Hs;L!_i^{8u zw}B7GqO{;2I1K(7l<`Cy{|qrp!hknror^c&zs0{?yb=E`{^c+EQ_^dpq0sYlheFaj zf9yfUyy7{7p`XqfnnN^i_ejT{@A)akPZiTC?cw_Pqo5gH=5q9IS_9AZE}8-9g(8Ga z;0D2@hOYz-Q=?QLJVyh0f-4rF@X0)Yh5M7%mH-J*`fUjp5}uW|Fgm|u7s=*sM3tIQ zC}omEaB>sgIGoUa7<Dm<@(~CpblnjqPsJ4Q5e1h(V*=U?0x^|`s(lStl7J_$z~gLK z$i|zOdT$(RICTeaX-^8~Hg{uPZ+qMJo9Bg&hn!mToScY-HJXenHSZL)T2IK;pIrHF zmwnN`hRgH;U&O0rgI-psG&wJ`IDIxpNNlP}Y+Rt8!#bStPU#Kn%13k5>KvCyuC05T zRht9Okc;i*4JECKhHht1JBvp54;Wdgoqa$gYZlgB8@KbUF~ABgy;`Nxq92#WXciPo zqphi>%|u#q+v)-h4T~0hxU`3F2zIhIwK}2^5hw1@SKG}k{<wCbnlvW2s^Qp??&Z;F z1>RcVR^-B2PUIeijjs~qy*OJ88;ilAz3(J2p=<+qv|SW9oteUNE|euMUKz8J!{O%U zaIm$ZwPnSoj@DaNHpd=Xr&izS*%Az}W?Lve;ATT^mn!#n+?LkWt&8VXH;x}A`TY8} z_M2|(Y+s!t{c6`EthxOL_p;E)`aoddi;*@TJEyqbZKV5)N4(Kd!4KV=_GNEoI!F!m z_-A07jzPYHk00_?#+Y9m1yToOpLD<vq=v_c38xKijEQEI-kNA?PB^ttHlNcdBn>38 z%jF1}aF%L>#k3!L6tPCIPg0WZ^V2=zD}hnRFZ=!d0X!L2%X#2pOS3mE71QnbwmAE3 zv24+V{6<4d=p(E$1+^lwCS#N1N^D>dG_Ir`H%;u?PV7&A81#vu&YX-eCrYhE^NeXX zH4ZH`r105pJcbsEvLSP^fvV0n*`Z~HuVW!D*BjH&6u>>1GCT*KuBaj9N~Y!*NA+Cw zk~V6_6AUR8c+X^zj;z}v<NyLCq{j&dBA6<YU8cSx6=fpfBLSJuXM(*VYlfm0YmQ!{ z2^>C>4ePo8Gs)ZAX2$mLwKs;Yy>&A7DY^f-lXv@;)Hw%MUG?@=n+}|O?ye12tx7NT zmn`*9M*s8#!!rYbUdsu2nhi5zfpQ(@A=31@n(=?CBZ#6pUHkb%50b%aZ>`xhxBqk1 z8z`+&0AEtVHpIvHfY0^FbnGVzCX+|GAPgW^%lJYQw<hA%E)S13X3f`rIhl(Zvd!VN zg_>BeLtNEM)QwJgN|{LgaHCb(Z&hNt4&ScGe!D_U_u(4|9i_r6u%6{uhjfkwOH*Yy zmaFt5`ZbxVGafTkT-HqwuP_|vj0+lD+OMYH`i#f(93@RlT9?spj3Mn=OcyhhgNJlq zgNIyh_%2hXEl<q9qK}SfG-fJFnkbg|4QV$lhcK$84VU4s*>Kze6>;$r`lNIoxL(F+ zZ<nPGFO5l}D=hoAE{@TG;d?SrC+mo)hOv#(OXMKY8dAU(*srRn95xZyg9o9ND)4~D z!a)#+xm@wI^v4s|{_A#^KKH~&0(=S<?s+&H<@3w6w~pOPQGw;#_g@=$_>b#v<2LMC zhBlDxv3C#-lt0%}RHS=#|5EPJ+x?GhJn-Y^_OCxKebDm7F4R-HI3VcFf3H|;89Se| zFN3I{Q)G<B4iyw3@Xm3~Ez+st?`=Ui(}`PbyX6p~CY4UPWbi7fsTC3b?)|?l>%SFo zMrUODVi#P38NS&C(A)-ykICp5Y8#<V<J`)(GGS^TSt2{ADcvZDj^>KGJcI<m^)?Y> zhKNS4Q9c)!Z7x*jQyQtxw?>vrqFFqNis|{llkV&{*hRE7P6_fbMKB!<`mu?;!Hiap zN7EuyDWlU;Duh18Fw%(WRiIF4LU&pAp3B7a;%UTN3&hjS2LXW5pxcni3&W<LOs_)1 zVSSE5m7l0@Sa!t<ia(bbj&TJ`<XEr8@TDNLh9aFSNRh5_!u1k1e8<8pp12{;n8~NZ zs7EGU8lXZfq3CoGx$sZK|Iq@RlV~!9R!C@-X-NWHgCdp>j)QFWJaxGu=>y7}T$z)W z4x~A4iUH}J6FrwzFPtPGyc|5(-+4v9j48DTpUno2IS@ED_5wvIZ?SiN(B^F_hqa`* zn4*rxYE?%Um-w2$(RMYj))}q#f+FMctIL+LA|lM(`8luA_`25+eE8K9B*z0ST8=im z;_~Tev!Bt}J7r<(mDk4_zi?wf7;g~>#T+CK1UGH3Z}|KMwkQ1cK1;ywD{;FD^3>tO zeYKl=DJ^1|?UJ2;Op!qpdW888$Ze3zQ%*Tn77p7C@|=SiEo8a0252S#%|=V*XvR^m z&l3WI6(Vvr%e-iuP*i4C!R*Sz0AG?7DBW4xtuvZ&mrzV`BRDNn;--fs)Yb=|TNpT! z4FgS6Ph3e5I5LN><uQ$*r4I5`82t!sA-cf%hO{+@B0^~h)F&T_s$d;y6^%5|AdJl{ zD=`0$wzrRusyg?@_u8}PC6mcy-Y1jEWHOmdhGCctGs9#EA>@S+LPQ8LjWL7>7!gsx zlu}A5MNBDD4n>M0MQUkFIhJd6_GF}hXtACiwN|a=ia+b6UXN|Pw!I!}&pGvlZ0`42 zdjdi2IrskYYd?~iz4z?B_OqV#tmpOnOw9B|mLGhkYMS5G8wxfMUi~|xR@5E+Jrkeq zYWT~MAI(1ev%6!KL}sv~?82HYzdt6u_PTC`?)BGZ?R$|bJD+vCnRFbfe|C0iATl4R zf35>B>@yrXuFTE6u;aM$f%Ek8e15s+jbA7i&Yj!0_XW^-)8(AVC~y*Tl_c#yD<=|p zpyhGdOTrzxz~9S>q#y_7M79(mDbii;4NZv<jgS^uhD3`(zHlKeGG`BCIZ*ZmPecIu z^4J!uLnMAH5joG5`SBa9mx+wx$w`uwojyTARsJGE0D1bE$D<gtI4oG>|hCh}zB zvy&!=`}+Esa8=^u_|m??l}MiCd>K(ZI*-;58>)kK3OO_Jr6!ec<B0@0R1rsW0q|uu zk;+%A@%HJ-T$C8Ji8E-<jnCY1oQM0W4Xi4qC}>8B3Ocar{CL)TKI=;sxDHu6S>zvE z!G<j=`?jcg-6hEaya0@loSx@(>nUN-s3-O{l9i2+X8UCkM<GopU)fp7d`7)dIw^Nz zy2>d@p`sEKVYQAq-JTknFla@N5DpowKLIRhZFowgl@9A|a<mDD+pT$oI2+q&s%BC! z4sAFavKgy913^(iZfdjIeqyx?E^nsMNxzF)^W_l-8b{!BwQZ~{R7?2*BoS-yOOl9J zDO0pYGGSCAgk7b~rq+z;V7XAu2?Qk5#ZeWEfU`YZn_(_q@XwP}r2qH>UlPl)B&4H% z_-faImIKc@%KJT`@SzvKAAThFtHUkd?p}ZQU8`At?$PkEmkx$PWqm%Ua^@eDhJ7z! z2|fEPd*t#uIYX=I@zLvccJ6#D_niQ<ydR7sb}GeQ-`%;Zw__H&HHL4#c;J2Iy};4` zrhIGrzRL@X^GesHKWpC5Y=<|b6xcPnQt~apyM(PUS4<p%I1{(Pk=KYE>w*Q2%q(PU z6}C2-czi`@-Uyf$&`gl^SYBg>B2x*zO;6Z3Dn{*P1c~f97Cd(j<ulK~Rk@j&;rH4p zcG7ak@$ok%4k_=GeSq<4pTYP_;dza~MtDfbRS`c|@ST`;?07O~$4Im86uEfl$PDmk zBL&bWjhB+5uVjft@U1~*u?7oercMY@Y~aYB#=_Q^?cf(Vg7lCRMrWnAdTKphMou>1 z%_`jS8T>spRS>mE-7{MsvsgXl)nOdX+9^wozcp-DGO{vM(nqiasEFoZ7qqj6Q9MrB zt@RcSc@#O)4AmXDvgh_)x3Fp6U1c*e75j)pXTEmF9bY>G=k;F-pRyyYF+Jk7)rO}! z_d!NpcTE$V7ev6?=A%nbecfa&QmHt9K9N>=zhgcVU%2gH*VmJ`vA8m|$ZXUSscV~m zxb!5|y>?wXr0>=|1%GD<F{THEoRcVAoXQ7OdZOyX$#)#56{{CNKp31TuHzdRQG6OG zUKh`nP0qpxTaZV@qLP^<$L!Xi8MY8S;1-J<1<ead>e#>JAZ6Z{L!*|XVSFmq(HaE= zj_oIgqEef?%%{STz=uJ#=!D-u$}XH3<WAtUb-ASipH2ML99$LIbYKaQ?)@j09M}|D zHRr`Iol)KgNjJUNJYH5{L-9d;`1P-q3!0~t-?iP8QE8UBsZIGc3$NUu^5_><-c(>v zFfM0QPPac7W%$~mO0+C?CZZeoP+dUK<oFuO+ERsOl&wwXz2?ed)W#rBj<2gJpRumI zD#<7(jHe-FOOtu%0i;G^yQid5Bv_Lz0ygF=PcA0e=(T1`kWLDs$!=~gda(>2W0Juc zAb~0C5k`Fso?%B7?O#`|OTf*#1ND^qLX@ouqj?08mC$Tzt0u44GdX4`WzQfUkvl^x z_sqk}$1Wx9R>psPMw+<r6N~x%Z1#PXsK0;cq2G&x69k0(VZs*po13Kr@Ewt_9Rsjq zjlk{@G*}|&z0O_k%soeB4$Dldn=RNK-kaF39Dc;n)-`M{30ZVjmqBux*)z|e8+%EY z+w$J{lgi6Mmb>8wZ>!0v(?#s`oK=@DNc$xqCm~BU7r;ER>@{(Dq3WlDQy*Ap$VmXG zCR`w-um)jBh0S7hofiL+D;M8kH1P#Z3NFMy1`5pxBm23<W-n`rvb`}cW4<a^TmP}4 zhFd~i{z@@!@HkPNWbrrxrE3mEjV7nX<f!$Fj$JupY!IU_brnmFQfZ*9rDuOP+mY~; ziNT03(ea&IH$RlNEbQ^>oF<bm(2(j6u6{H<+hk}mi!-IL(Q(&4<64$#^tKvZct;z( z<8sLIKWld&-}&1@PQp9pd{C9Rbj-O!Q^=zN30aNg!r~ZZU18B8)7f}F>rUoj!%&Vu zD49$0jXF7%HtHnbsIls?T~l_u(K1$L)MFJ>4pJb=vzm>F!^=e;EL|aqPeEj93bI+k zM**5<)^4SgXP-@`tPsjDC+K?e<JmF@1kxur$e4mnKsXdU`ooZx3t>qv^g0%F*j(Z! zdwD0^a3$ilkrA&WX1w9MH<p-UI8<WV`nn;;>}AHKM}`nU_1Y{x+mr03m$W*2po2-e zP3N{*Vm7aN>noc@!#uxJFTJIF_Yu;Q&_NvdArBSsLvBL1+3yKIX5R)OQSS@uh0576 zOw^_WyaQ4I`~ZVkPu|2Zd?o5>NN!3mC1?-28l$d-yHd}?X>>LDAqkk<jq^OJ#eFI; z0FW1$N}^s6PR}Cs=As@F4L5=X1@|S2?bDfXTI&Xk;T#PP)Mv;&3N%9k9)Yz*pXmu1 zcu?_+%dNxdmMPV|50c4+99aAx)P_X{9IskEp-R$t>9y$paFeEL(Q^%sSloCbYJs0n zW+GmQ-Wo@N83IoM?vA@T@y8ET=h>JudY;n}WtAwSRsBb}Ovh)K2nD!tv|Ppt3L~ng zrwjN`(0kQEF+U0+(<tb+dYW*&3b}L1kAVR?+_+jyUxgpiP%1ug89ziEPEEjvlzTn} zAHr@b;D;!&0)9xtbb=3&_7&hm#t(D&5Vl>}@tN=;%I`O9WIh!>WKPp0_>dVrD^l~y z|5Nyon};W%hp;B)@lT_NFx&qPdI%f17VsgAar}^~SWN*xq)cn_5PC?Uwg4V7U3&#Q z#KEycy1axPQsiYScu3Qt7{Eiy9n4uHzHk{nB(NzOU*KI?p}gHa*8%vDUDEdeAHoPf zB<gYx8Up?Teu&Rf%JD-`f6?|_GXsK%e%AHro)rWj@`VEpnV1-kte>mwSH21S5amA} zYlDO!{E*cxqqp0p6)%||jdgMSkelaZyskw3s-3I1hK`QkQx)m}e2A|?i3i<Av(&`C z#_>a{>!ZFYRVEkkLyCYOa?Mx6?TLm_XgWiU>?y<tW*lXffB^s^!-1;-M3`6|D~r~L z>>GjRvb#w#SQ{qrL%Q3qBlr+Wuh&bL5kyRuYJbU8!Vf76G`oQxa>~LA03z*aSG>aA z>_`73qj?g5NKLpphSsi8?*T30hnRy16;odPm7X$!pz6EUt2@d}H0&sJl$nfFFWyw> z8nX!7xVs|Qf56#yHMHPBFs=L|I0YSIL^OzrREzG0S!n_<yz1F8e82K+b;V7<<vRn2 zazg-5?gVo+xS`H6#c+G5YtEw6?3me;h<8%Am%9em-VwZdELXL5Ik*n3U3T|Rw00o` z{Hw<_Yx0=jR3tf4C>i1sfIE+9sEER=i3lX%pg+?_a21i>>qe&*ZIC*(bOw+M7}(TI zomy70Ws93`PI+}6wN*>c)ua9Fwk(a^4K2Y$40{#zW%=Zor%xU;0!Y-@@xSW8GN}oW zc(L3(#eCYl^0vsF>@FP(TYP@B&fa6BCM&v;tH(E~p~`zNexjkuC&x8q(zyPs&MA{g zrxBal&>f}R=H1@3`Wu_qwFT7fC^1u_{r;<m^LIL-kgafq$L+Aku5cO}U2*-WKJ{5G zPbSetW4|rkCpOHcz9!MWnbg;$bmZZc$wNbH@A$+hcn=ew@iUs3?81{LueY*EBl%>f zlF2j>dtVs6eIB}z97gcY6SaMUsV8?H=?deXlY3OCJw~p)@&8kYk*fxA^grn$67TE1 znhO7S9YZkI$#Y|aJ#uBFpV=9NBC^<fuNqk7)^s1be|+8?9_r|7PAUIB^2p7J2bZs1 zclD4y)#_uSwaiuYs)5hFVe%-TCm<~X+TW);YpHcv!D{Q@16^g?KHXVGOtd$pySHx} zKD7VlPr<N$Mwcb(rZsS6c>j->{nOa2;AQCziEtV_)LOwj>Tu>lBNmb5!m~ms$%SPN z@vQ!QUgY*yPUMa(5!HS<y-2FEUW;UkBGsr!Sp!I{3W(h(B>T8a3`<8oJ~If<u_!#J ztkU#rM=@i?!Xjk!KuOPwdSMx!hGYUGFFQp7GB5c-s)3Q`Ad_~E;%*d>ky8!da(Z5C zs4s$EE+r>Y4qy^9C!k~TAIonPJ<2(}>xlA{Zq0`WbU*9=@W4_%->b~ZD)GpbF-SB9 zxcF!cNPkD_1<E053<8V<i~+tM#J}jNMf|Bndj3@M*deEw5D;;0Vhky3kkD(>_>bi_ zZd3-vZ;h{GF%+#}82ul-wN!_$ivklomo7?1)MsW;=goZ%vJswgHyP2klw6L_(<n+4 zL1|D5#o6R?5K?jwUy;O8<#*S>GpS9<RXCu*Fp<jcJ1+-Noh<8(@5o|3V#a#k#I)c| zFh5C5m5<Mw&yP0<;+T(Owo~!W7TJtfQT-J%WxDGL{lE$D9~?Z{=_v4~*oz?hjW}Ei zun9N?ogg$w?I7qS=;+7>uMGz958q%ZlP^vGVPB)BoY>E(XD1^6VwUDbIhTqZIB;Ju zSmg*jkx>>N8#Wp@G(U|0HE%E)UubN5)?nDstXbbZ+O4dKXZCE<S#n3wHr|jhO0&1H z9vnZrrBN~@fwyB!6iJO+&T_i?FI^M`<UZA*#ye*PIb{b(WJCm=%)!b69epYt%RSag zm5v}dWs8I(ma4OH3QcgpOO!9V&&ysvQ5ESnVvMND<KCRvg<^bnbBa>%TekUdA(b@h zsgS1>-g7|?hj>JS$Q5)V{tR-tue94lKxl$cfX5c$FNMiKHE8UEd+)t>#&QEPe;Xb) z8kf&FivQ_jWi#EyCvNo`kPb+Md1OnY)|fD$#q1TTFk@S*UzFUn=Bdt}9m>xIb}3)r zwKm}~A(tYWOaXtTiPxs5<eB(vB3>&34eZH$wI^+YlLp>#Sj&0M9R3Yn9ehKCkY(q_ zvyJDmSmltB%2#utMq;xNvT|~b9JHj7oZIzD!Y!Ewra}=g`D@_nmP3u8i<wFpry&Q9 z{5EwqFqa@#Pl0O@+0)#M?XglZlx7aDb>o`p2@N-iKgmf>6zYNR3KrJiW5ZfP!>nHD zI5<#Zp3GSd(ex(2$LL$LFgRt#XR)Hgp4l3-i<#9AivM;sqbWZQvi6RW;Z5EOW$C9` z^XFRD+Xh|~`5HHCGlCf%As!WS38MTA5P51cR}O*$$%DdUSz9t+qfL~TAbh2NCqJu! zK4w`;o`rKHf@a6Fne*_2$zfXACE&SmhDaU;LP0JQrjMBha#Lgo<|LWShIuU-*6KTQ z6Q~}}5GCWFw!u19UK5RR|E(6@-E3`xJPTf3*#KymY_XMcp35nljI*m1i&nL2eJp%= z8I$%(K}|AiKa-iom2ZSL9sKs;ZMjEOg2!HQ?>IXYPON@r$Eub^qgdSoZO^K!UGr|Y z@>k=5@8#|q-QHTDvU%Rf>iW)I+ZQ{OqnjJ`llWUa+Rf>jR+^;E+D2f<wFpO$0Rg(^ zQS||w=Ufvpat4IMW)h1N69dB_R~-Y9glgdG<b8&+CQupzfY(+g&-1ioAZ4JMlDvy5 zv;gHqP`PpmRy~zchEO({(|UOrktc<tpbS+Rs8~lHf?STY7SNW0(;3?sk`q(p3vaS! z8;Ouu*HECX5P<a=@&njiDN5}^t7ZrTQuN_c15v3M3Xz;zR07qay%T!F)@!TWE=^bc z;81F$b=6y4ZO7&e^@U&SS#Jm@jxRrFek#^HD^gKnv-sP-zPSIPNYE29H(3xuSjlv2 z*J{r7ZEf;d#=m#l^34l(^rcIcWe-NoS+>igEPnGZ?V%>Cqp73)$i1U4X<muPbmowk ztzHH4a^LQD%~8!u;M#e@HNp=I_yMz0`DVTF6)ffHR6o&7ih<Ca0uNGBCf}kcxg_VL zSgqj17Q?a&<JrJ@xdIL|#K|fw*)C)S$Y#h5b6oDip9&88AWs9CuLYUA;J-yA#cv{) z?OdeG{zNFU*=uHZ%qN0EX4G<->TIS6CNtZG+DJP;2j5x{n@eyi1434imz6e)aQBeg z1|AwvR!srUr1YeS5!FF*oWXB&A^HmcjaAR=1iK;jOOf`zc?PS+FsEn!-KP&O@AYkO zUnS`hkxur?*83Os_ihX6!XZzMh<0Fou`SAfFR3W)yxliN`TeP~r`gJ?bbzt7TjPgU z9S*zi{Q-+ceZ?k^JJ#8|cku&nEdG-6QsbO-Rhdy2jj|!F_67%HS4QOs>(D2%X+ga7 z+@<Z}Ug;rJn9oH0OKvLhcMY#j&DHQcuo?@f4gteONJ9UPT$#a)2)v?2KzSYqfr+1& znI0Pw)!Exf9|*)rR0JyU+c*zt#4&lisxp8at+8Uu)M;EYBp?~`wWy<@s1MR7c(Ioq zUP{VuK(Zo&5Y%HG;6Hko-suPjk=Y1Q0Vf-0>mXts1nj~x!Tup8ip*jU7)`b1I*Z}Q z^}QKAONi%u;h`?ScJl+@G(XV$zc(9MXxlc;`sSrm%S>85s)!`5!({9E`r_p)HHL_n zDSP%0-!MxI>^z3rq3^ScCT~Rf)&C@3g&w86p<Rn!wu^;lg`5kNBEW@mRTyZ^3n+Ka z#VZ(H*W$fHT&HS;GZ^6=k{7Z1He8ZV7_SXMDu9$6v;?XYmF`YQ41?=X#guXisqN#b zr9My?+7ngwBC-a7D|evyyn`p7ceLOs1`cy#5OEnWPQcjth3X!-1Uzm)Qu+y|vq$P0 zDCteUwgYl_0pXFLMhP0j^h6*S=I-DyIw5f7isM>p)q@ZZup&4z$@CBsLGi_n>qus( z?W79_sm>6NMSHLgL6C<eYkGu@-;`>qw}`oJ<par*9vMm7q+B;MNS68$CVnT?l(sQ` zK#Pmxp$4rf<JlvIEdyfd_+R2tAdcXF_$q0EK7t$(I;9M-V|1$U^`b5^JEFX_`5|>~ z!pcX;r#~Px2`7bIkmd$BJ7JaZni3R_By&N&eFdRW=Q5<AHG-*0mbXC6q%vF?n_f`H z=ESqn^Ku#HWhQF8qQuK(5Hh(aulkQ7moZz$Bk|;*&sn*uZbh0A>FIjR0rYgzLy+7i zmr<HXh9c^6RU@4Ddc?@H990A50zfaPFkAxy>EyBp6`g=ZMvWY~=piM@bkt9pm;&C5 zdItXJFbVpU74pTZ*&6jXm{N_W_F2M-@VtS+L-=Enc6XnX%=lCuXg5ls)lJi5#~-?I zI94B3{>*d{3kpk~+uVCV5v~wD8kaP^tp;PtZg!3@IIcXwc|Qo=w}JPsqqrs2Mr0TA zye%-cteFSu7MBv0iWh)Nq;SZU6b1nb195(J-7HK1%l5{zw(~ruf%u2Ok<$b+aQw-f zjnmLZRXh;iAmaj%u~Q}E=Rn2<AlnH;Wi*j$nMb0c)0&$#KZDRQa29|)AlF`3AR!3% zU+}QgTA$(2t`lrbD6H_|>$&HhGO9Q$N1=#>A>-M$)SR?M%JzW6%$fD;GnN7?r$_4N zvu&AhSrp(phkJf*ba#HfLpjx5!T#7CX^_x<`p)$UF{12l?%02YyjSydop~->o$(so z6MSt*wkpqed2NC5KMykS_xhZ9ppM-)*9iFo9@o4I9v`3>C~bt<Yg2^EMROpvV-8FN z&DCP+#2f^P!xO~eNYR9W0Y;YnLC)kTNu~o7mRd?>3^D_s*Cca{V_h&Lv*#R)ZsaJz zY#;{#sUd~bTzL>v!4PNzND8JPUo>N8b30APe4sycP@)|2EiKSrLR0%FtnbIZnst$8 z^4Uy`hy;Z~Cis}N6Er*|kq#@4riCDoQ1FJW6|ic2UNl%8h*v_<nTq;fwkVvCEYj)% zmp2A%Qi*6#8NGF5U!<|fqFdSdQ-j+a*%*GnVEotSS&a}jCQqVoR!R!rXLE+#8l7HZ zN0ooQGDoxo09h@Hd=Xq+R5g5KBphJYf>>e=k%tYXCbRM&P0=6IUHx%$PyMgG?lQ(` zpXgQIkY3jIp++8ARCdf0x3}#)-e)JIK;+j(<qG{fWByXXfE^Uba#iP1XHdY_%NvY> z6*B~gJ!&0NNN|S6DEpBJk+ZvjAxBD}ERb1KirBNJ*jDDDd4K_3f;lh}dK$j^k#mL+ zf40IVYYDOd8?1(AgX-ZqyJrF_vj@>|7^T(qGw=bmLH0_<Y?}5&eB5A3X><+D4Ea2A z@q@5M<FvWP|1!MZkdCBd+Nj6f`tfT%lb5xSDE50?Qm?z}#E``H=*ZE_gf{T3L30@0 z-@l>C4Kh4(#XQHZ7+xHn;UHUatenFqmb*x$2vNQ#fK?^{EP)N>0wvUfnygz*i;-06 z0BAYcO=Uu;iq~4lj216XTas)!5%FB&NGp^K*+FT<fG!G<q(w9kyOjnno55SFuZ*Z) zDga4JN}QgFC;dSYjN(r9HY(rkM4jJT%5O7^%hSyX(OSm7wXob#Bn6ddcf_syG1EB^ z^8h0Gjc(Kh%q(&j>vU47B|T1MZcv@NFTJCA8a;Iq$c-Hmat>OR04}0MSe_h9I;;j{ zJ@aMEvTgBf{CqyGLSm)W{OCeu{9L?f8roB?b_zERn!x~Cyp#sTUse1~F|#~Y>F{eZ zcC4f@tt2cYT1T)35dREoVEL<n5{US@xzajE2XmM0Yg+KQ&Dt9Xowj8HrnPgw<u(O^ zA&c^crNgpO3<Si$VA)_KwsRnua_Z2k0mzwg&Hje)@V(O1sn4!m#eSZ!dst~qk|Guc zCtYNGPK-rZM7-fTt*5D`v1aY!MeEY@XLY7^0eiLAUs39*A)V@yqFIA|rBV2A>b_mr zw5fVCiDi<n<AljJ0I|v)OhR#D;1xHQPi{(+VcbVTQj1%!Q`K!7C0S)$eWh(XTaU7B zzH?8doqKwcHgBrYf(HWC8<g(>i<it-9nfY}5RYQ3TmsjVAiJ?a1I`CU@mN{pLr}4< z0u+!YXnJ%P12BPFoBN;ZPz7xXU6}%@h|yfSz+kcHt^wAzrB8X|@2N|7NC%a^XdJdy z5mGTmb>^0V@jqRWRFiiTzTO%^Pm5*)P>PYkRS(%i*gx1HP-_m~DYgux8^OUsyoYQT zd$e8;lG;JiD6hOD)h1`>3Xi><NZK6F&N)v;6I=(mX>({>m<H!w)|AZ6nMU8{Wbh3Z z@H7tJMwvH0m88{4D$kJ1rh%lz<cIM=143?sAV&fGlda|{3sqQ+cG5D#X-NF(1(6Sh zUyb*JygYH9)0bKiPeQ{}b=3Ow^ZjA$zq>nsE7`;SuO+6LOj5}LooKd5*O;|NV=Vbv zKO(8po+albD-<E|!oX!YKJZpF(P(2v$K7GeW4hAjcvN|V;O@Bc8AaDEQCNt2<cE-Z zWIz-Kd3#=3yYN_pqAW{bj^||?(MFX|s_T}t7pj^=4Kk%)aU3Y_$0YGvgX%dO@Y4j@ z3t$~E7NijznrRE1@>;dF%B{1)l60dbH^@MCqXzjI8Zp0b(a6i&#t#nnw;80!o^_q~ zg*Gfd{#?(N2X{6u+IMLEe2e4ey*~o-@k9O%*}2tPF}hay+jBd6tW4RwYr{v!H=P+- z;PuX5k5n|QyCKaedt3VqYF(#7m!P)-R~YE6Q09uxJB2DY>_0L#BdWoKwP3eqV8B9} zXsy_|A>{{cZlm&=+vU|9VLJ?mbm3x~eN=hWhHVhf=)yD3O*})SXTbA4@eGN3x=Bl> zX9&n+0WcdC^Fbc~fE=YSWVCK}&f;~ul-G<dI~$ZVM|^g+WYlIiPSG7g*%jtz;yuu0 z2X#$^?+c$gUZsp)#l?YVY$`uujtG`R3r`hrlQC_0qOpPJb@7r}J=7Z6fP^k&85f%7 zpb5jI_hs=^M=I5!T%7dYQk)K@20!ukqR>%zcN*8V0)h>n7#BMakQ^Ee6~LOXw-qWH zX=s$>DN|mgY(UikTx7`fBwx6}M1!+U4DKpIb)@Fam@$tHOeWXF;I1YbaJ4lLirciO zvE_u(lNumk<l4`{NdR9;70Ohv43)|$EOFUDwkk5{s?QfP;&Ro5n=Di#S82@Vtj7Ko zQi&Xj=T&m&Y~-I6Y~-H>KIsJIkx8c_ipWkX%PO(THp(rA$DhRN1l@VY4Lnp-!Kk`a zc#4dRGFgZ**f~BEn>q)g=C<g<nS)&&D^rH<Q2WfG!aK7k<FV+huJEB~$90W?SYvD8 zk#N%hc#_^dfp_<#TAp653~ye>5pBx=TTG~e1`d+O3q#A#7jkcN<y1)`l-u#X#*%Wp zZ$Zcb<w#vAIU`x`f)Pk@YL%~+fXj>}Kz!r=I<9unYW~k&Ywu^gkoNRvz6q_bEAO(J zzYC@*XW;K*AhLUrD0<~x?B@$sX--FyUeH0gA9LyKco$W_$hinCL2zBJQ}$wo03Ody zg~^1a>B9`!=@qc!Wyq(cx)CuSRQE}0{EYhN7Y@yA4|N+-D?7RdXD*DknWF>R(*sT6 zM*?lEF&1d-ofkb6?wS>i@t%gFkYPdb=i=`nhdja_A!`La5pSc#TTaFzB5wIIqo9YF z@M6OTE{c>s8zg`cGtl_5&a-l9*@s#4*~^EsI!ji6R%Wpev%*=#yI>=jOC8P$I1l!z zBOLjr3{ZVs2pFwcXBw1gKo9{d1Zff>N-u|TSolWZX5u1cRePm3wvZh`v5ViGiYcqQ z%DnL|cBIK22#ZK2Oqq5Rm5KH$L;Kt}y}E>Pr_L)T4BH{H;PdQ5{$NzwjymUz&@S9B z<RCBMlOSyeAVUy|xf)*n4EWo!^KvWpmsYh}GGP>a*tn-9$Ep)EF>z{zWj3LPE0N|) zz{>)aq9e)*M(ltvnb`^to3k9PdTAP~t$A;%epVBGuC>WFg1k%s0B%Y$gF}K`1476% zRd)oE#xSEa&2V?3r3|@@d7d>T$)SraPU&4XswJKyiVmcrK`<eFf|JNJbHni|9w{*= z0==utyP}5LDbDKIC13vL^Sv%}kw(%;9z^Gy21BeeUVdxyKugQO_r+;2Ny;kMGEd!` z0gKt^4|WeMboh&q0#p~ZeQo)%9hn+Wd9Y=w6!DsrKP;X1w?#%@K$<~6Zuz*U{co+N zl-Dz`EznlbyM31~8k#_79r|OVo_`8iV%BR@DLIPRhq)}!)r;KBT$+rrB;5G3leu=9 z17FLOc0@%G0;SO1jWCmk<Jmem?;)(4lexM|(6^-yd7FrqQYD#OSqGxk!WkjR$rj=t z5mZfEfyzXtmL{mtxin@Z?o9;a>KO8EGH6YT_*^ANlbr};UXFZZa2%Qs0=vMQz4A*$ zH<NR8wP6jJEYdl)=B(-0y0XVbL!~`Y;V~EvuJhlIisVHDHD4Y7V$0_ZtcaqU6#uv! zk77j|n#G4%BG%51nSxFJn9+D}$;N}Ig`VOFSlkAkC~Z=@L*+$cyBHgP*HWwuIs8tO zQPfOCM|3m#S>%#%bv#g${zTx)E5020`1VlDC0!01YS6P9I~p9}OVP9rYacZSA8AIh z_HSd;R7*L#CPe}Op8xD}#GXihjjH-9d_+brxQsVJMa_^lfyF|4?3`ro27HyfApW{; zAm;DtMf9bu!hQp$QA){ew0+%9hL!B2#RTUncTf9*n8QYZaC66N93dM3K4*Ovxet@N z1Xo_0%r1dAp+JHQlMf(x1iW#G0`RiX32*EmbiB2yV6xoyvl<diQdX!#>;tezR)Ree z#soI6gX9m(sUNt+AqaT6W)?XF`|!!zi%%s>;N#L3neB7CZs4o20=xd0xzsg?Z*mHi zG;-%sE}GysK?@FSjucC9@^A!Y1;Jwurh*4d#fzTMkhvR|E7+Iy>j0(GlF~`mi@L>9 z)S}8$Xe4zxU?Dy7{c?}Ad*R;OeLPaJagV)bMwODfN~fNzfs3o1?yTw9l^6y~PmW)( z3sJq1HQt+9icrLDh+eGOP}NwUa4LTtoKU=Daj|QXj{bpO7nR5%btST)9Ge{0;Cf&$ zHn9(MhoRF{LaQlgFdo`R0Hxw1Sat4ZM*@cyQ&z=OM<z5W8`rW)#PO6^r0kNI>y3BB z;~ipK!syf)j9O8$*tDWWhYq0`IuY00n@ofk+!|@#(4_O)jHepI$I=Omg$Wr=Ov<9i zLJ^QA(H;Xv7t{*iACneX#D_v?%!mUP(3o{9mXRh&07j%K0c!$V9S8do8G(H<Q3d;Y zzxk<c#A8{Jb~&U{jA`^D0OZg<)*cme@MKNkOJS?l>O;<88mJf<X|r$qqx+TD4{7%* z4}AXNm)ex&e4I)Y%u3_jDC7W;L#ZxUM|evlCh*bfRc|c}8X6V>E@6bQoF|V^tD_O> zwCV^;zVOsKK0>Vp8!$|vF~IL&glKj`BSaU<Nh1uQrA)}ptf`k-=zdY>`*`Oe<-O*Y zAK7^Lk{}M#yk2@s326QUK2MvlhO$?hNroeNAa@;&v=8!mVUqVp$;~8*0B0zQhI7kE z94xcYYslpl-02ArdB_Tuy)B--;XDj~c>x^vLKWQ7$=m`G8Z8SJL9X1efIi;vIf#M< zTrZa!VK3Z{H(qc9mR|)`hnuV?iY&g!%=X26krp9BD7VkU2{a~1*Tct;lJS{XxPhAF z0It9uKv6(98n{u2o9AI_E+=46wj*{-oP{<;Y4}Li$G$*OS}aRFiZjA>B2vkHfL5K@ zKMGkd5CX_!N9s5aF*c*sk)g!wZ3;T}fBCjVN81Ar>LzkHm|-+EGXM>y#NzRnn2H}V zxo^L7-}Cow`p51zAn6rL;><gY#%yQ9!v@3h)ar&Al{V%yl>5!PV%=_NJ6ozkHj~?< zeeK8_w<R{Q=O<@<R5W{P<`$V<h&7d#YP*%+1+-=BE*|^y{!OeLAo2!_`GqaBbQ60A z@@b@V32&eyRO+=_HJZ5sBI`cowDtq-QLJ4XuvtQ=J{uIi09=!w3U9I?JD`Jxv=<7| zNwz<Jl1)kF@8zhA`G4YnPBLJSUQ{8_bMgEVy$}QkEXmP4F1fxa`Z#MBmS7n|U3!K8 zV61UT4qqPSU$Q6TXBhAQ3_DoDBLM3774^)fcz%!iNsMP}IN$}a9sxB@%eah#X3+N) z$?Q7Z<0gz=KvfTT>?FG%<D7Lq|AuN4y<s`Unkk>`H|qD_Sk3@`gUnYue<Waje}hXF z(IxNj1h4En7WrQw1KvuWVO5i^tiokOxa=fbmdx+scRP&(yAV5hTxelKYy|;C?Xt*I zaH}h3FV*A$1DyO^z(YqB9#!9u@B@U(isNI#ND?$rJ*rs=s7>nSBNq8a{CHUXHjKxk zk8CvmxcdEZeAm<W0*XghG7BIN_|eX=kx8S*O^(vByDlF)#SY?Uq|G-P-kz^+ns3#a zPqH#g_AT7hCpbQo=-Vl_3?EO2-u>kl=qht|t0lYb>?vj!;vb%5*0ZOdi~aUve&!@A zvSfdBR$k!4i8}!{IPb+a^(O}`*$45H-NJO7*>zUJ!hRg(NekGW0<Z>a%YLb14Q{oJ zeRb<LAPXL_jNO0WL5Qq_{NF?T-v{`=hxxzXp?^;|{`8$vJfIi@eq8vS@D@fo>2@cX z-SRk`#&%|<!-dx@KFNGIT#nUThQstzHaPLq=f3jW&HRQKAKNxDzNtrkHJ6T_WV><r z8*DeaRpEx}6R+SMo@9d!r_~z+!X$?`xpMBbIu0B^t={*_sT|()%D3#nhU}q+>;nzi z!wuQ*;A;N3E9ZsQ3gN55HsJmqVnyg2Z)0Wrk-LNiAm{;DG7kuch3^Ot3O^Fw5`M=9 z*)q0`-AT70{paufkF|RK?rpEWDc$nFx*=&-w3vQlwLK}k3B2vI!YizvwX-hB;_N%t zGs08CuK@d<VoT`2zt|oZe#WM=UiLYBJ;|!9*%$F=$ktjU{FCqk@YDYwyeIrc_&uA# zILgQ_YcBJ*56P;ZV#{s@K)$uL1gJkIAf-%27Da>b&%!gv5BRI_Z_LGNaZmIifN>e; zXfjA{tO8WTCj45mJ}!Jk__}bB5vqxN<A~LETG+s9*iCfrVe3y^%gR@+Ubk^C9~QGc z0l25zgzdt&;KjcW$Fh%GPqJbRRgY8ik&|#j=wuqUhE82$eL`r1+i8h#J$j$*r$bG+ zsu9*^j;&+s**E!3N35rWN7)8E?kK46WA;V1m3^I`xeNFHYJ+e}xR>p>+D@{)4X0R* z@K09TPtij2XTm?TT97P-7U+B=7p+f%sPxuvfYP)0J+e7lYcbIH&wzq22>(O)o1m~J z*1|TiyJ$GCU><%foEHAV82ciBWV<c<>xS&3*3-g^!g~zJEe+X5TlNIOY@EaxPcjYY zvzTdF7fwM=TU*Ttr_AT?*(>}C)ASA^xMo((7UC60a8G&DSFE;EXbtDWj=Xn|)piDY z&UQ%4&5Yx}h}K-g>RahSIuNHqsKOL36IQ7tG+F`f?~KKhnHz^kHV{?hbwH!Zrt$2X zFrpQ-ufv&>o{@BgscL~rEzlk>=}y6Ih30tJmude-2^e6g)y<rOn>Y!LyB=m8*?PQC zi?9m#rH+aGENBCS9E0AII1bgJo)>G7s*WafaF5c4Px|`|D5?b&9z|!B%<h7DNa_SC z+2$aFhHJ9W5%5s@89s!oeWJ@rjkR5rheTt5ei4R!j|+GoAnx9Ap_6(BM^POj!WE7G z^P({){}s955GLb~*QD_bt~FD28Mz7Y8+R?kz2LMa{iIIf4kG*p<3bK4h6betpYc%( zJD5Cr=;w>)R7&JaaOgos*u@6Q`=fgrXyoF1MK*)|7C$`m8jZogUNh-R&{9T{PLzu# z(V&|dU=f>F1c+E5<2Q?M7+7s&YS7meHpDZPA-_)4m*~6|*HxC7rSU%+67I^d!D%+L zy2?P<Qhe>m+@_4VH`Lgh@`$Em0sqF5cw^f-QTj%Be)$}CK%=!eswzrc4PJ*gWwJQ+ zjOmI^OQTIrv%yvpli0=kS1ef_Y@DXE+RYus*UShc+>#@lE_O5X)VB9q{H2}+qRw1g z(={jJV=;$l3$K6bb}?hI8`6eKi`hNJn(k?8oUIWxzN)f{P)rK5qZ^vT3yW+{o4eFq z<YZF@49PI6txEmoNJUwR&LHY^IyTkjao8lY$yw~tOi$Y{2D%1Yfkk5QWfBW}Ep|(h zF{!cWN_E9ro#^n)aYq-3<@&N>SE<upyvny-^S-W3XGz3F6SJAo5>hnvJ0zV&WX#|Q zH$*B7TCK6dlU^PO7hQbTV2PPbth=purO{;GkV)TYN*VMPt=C!PDb@5?N;+7~1>;w* zi$xMM!oG-qxH}bWZ3>&c2CZrC+@Qe}XWgRl<K=D4Z>tcsrIvEL-c)WXv)apCMW%QS z(yxZX4&+iSvvmY)ovTX%Q&YCOhM;G8>78+du}d@>Y+-YoJ=Er~1jN#&Lp4Rd<Czkx z%VnxfMB)L5B_f3q55`=^5mT!DJN+fm^1AZaU?AMo=+PP)n+G%V_f0YRe2UJOL9bI} zRZ9kDaf$|`$!+$|cNzvtl5Qi@=*><;vEJmJGOu!a_<C!=RZ&u*slO>=d9;rS_QdVo z@tv~<dmD#NZEH`|Os_9Tx`9Dk1lSFo+h?vYdzwYJ)}bra8Z--05lu0QkxM5GFK9i& za$y}qv}Fa^Fw}=b%RyAeuJvl6djUVo1_kYwxIBPUy>ZIIE5!j9fg1rJiL|#mjzaE* zep{C!{kE=&LUikS>4J(JpYu?bf#9JeG601RLpfWfDr?I)#G2e{d?(l4N<Z$Nk89vq zB!qx^o^T-F0Xt_HV4^1kO-*nAz-=V;x|fl8Qwu5Cif#sV&D1bPu18W+E=7Jq_`J03 zxMJBbuDI4Jx88=o=n6Ui8ZKFHv5xr`baSw-0b9128vf;s9&RI*_TpzY^hwCpP)8<& zR&&wmypcl63NZ_SPxu=VW~vh*IwnG4s<?ybB3}n2E(s)6s_OYA97v1HNY$x9VrP=! z1$jbZnsPD26Tjmg5Y3L<>p+!lxMg`m-2c@;G~w`;b@jgK_sm`29o=_f_j7%T#+%d8 zKs2y!PXD&ywOjHVPJe4O9{6T+_b#((My)TL*mB^vXKv0}pSf?}w?+?MJMx3ux3B*1 z;_TtBKW>tkGd|R^@w)V;p>!~4=xTaUH}dr8eD8qIoJpqAmPG@jhxhmrhjw&2JJ&5A zS+^}1HO_Qp0)1;oXAb7N4-YKgGqZEc!sV+L864Z^aJyL8d+Cf}7jTkq64nzk+hW*9 z`FY4KgD!u|yv69AMGS_%a|4`n#>xhQ;4zrTPB71;cn3O=%+w3SQIVO%6cNOBS@sTU zR*;XWStu|WR)9s;sBE-GWhymfK!q}J%TI(ryqx#E;5~T+oD@R?gItm`Np^+xvD)dg zT05^J?ipT#6GCtqZM|p~qeT{rAP?|(i5IEk4cUk_R~w^jBH;JswUx_;*5PN_#Xx&& z?YeHoFzGn5a0}RHPA9IJXU#UzZmjN>ND!rsh({wZ)hc_S3v;k~8p^&2-WYB(;t;R~ zF%b4I+HbHUshc#iLijbb@zH*T9TFF!N!!FmTd(~ff58@5a7$}nb9864ErxQ#P*dl@ zbn5WY?Wx_sTY1M7PefBC3p2eddpF#(ChYFNCHDOGkw`4Pw}0b8$z_lEETOQk^&5jn z*DZWF{p!x#5qA3cu8k`n82XpE6#9?vw@)|K%pIQ9cyG*~=!>ri3?{nP8rK}|@NYQ< zgiE03q{N;bz5P3MD_=Wio|BIB4sF`fy?T+MEm&>J#KO03-yZE^^9M~Wy+_yFqdeT7 z-!gA~SH#sdNfzBG+|F8s-0}%ov@|YvAR)=ou@roQCa5HfR>R*3E-Hx=UJ=QnYe*LL zsIn*(r_>DMoD}a=n?mLQ%dX`uYgBQPt>=9SWh+FEwTigQij)HCjf&{_)%=t#N|Kza z!ZX^FS%@l1IlG>7T(0wal4zZa!By+PRrQolfP_}HuOR{<ybBG~Y1v2VmBd>}i#PHJ z$1-bn2zhF@>{2k;Qu4S;YrrrLBqETw>ab;3HDp&?$E@zMBH}PTPfNH4+}C+MxKHju zV@f%)7?&c!9{;8wq7qz0)mZ`kMIwqkg~Uc&x1u6{a2!-H7e`ef=>rKyEj;Tu!iI~( z7VwL>^a4;TuIE}|;YQ#^o+(}p?TfNIRfiFNp*_)jaP;1N`=2rA)|`6dz?MYV7fzYX z?C!;FdxEJu4?H%K|MHq!wk>U1TNSQ}*5BNi=zC%3o8OG~+}`e~e6x4Hr`(;02DbSV zw~lrLLi@Mh+q}F{eChUgk9N)6vwYxicXlYlM%VTQGA;;$;I?<QeW+V4XV-C474h zkM?(4(y7Euvv0sVfAr}Q-GfbChF~x~^u_v~FZSLR)NcA?=Wx?q4#T2<UbqE&o(8IY zPUqKj;*%cLcL9ok^8yr|%2Ohc-N`Etgm?JTDeR9LzKQ>I{)@j5&wZq5Z@%~oO=nM! za-qAM{-gV%j!&DLeBWXoo`%C$mcXl;LcsI#eeD5fz>WX(_-~OWeewB~TJa-gC4IuJ zU+z9fWghU^CfM7CUL-k`3T}Zyz@^A^$A64s#6Z}g5dyo#SuG)FtR|RF)}*wlgt&eE zs_}IZ#oso5YiGB(t5a;K5=(-?lIp@e-?D5H+i}n7bWhsFTTtet{uwis8qjzQcwtD2 zAV-pfK-1rSm@&Ovt9j#vk1q6FoU`MjU+p=pb=@PjhsDxJq!cBU8ey~Yc49~y0e$X* zFZVhjr=d{RwFvR!)=r9GRMa9NcMfmXBTq{wlVc^$IT!$X9%J7KA;8++fqI^QjAy@_ z%8#o3sdgvFel+@z5D0LVp~p||M~~7{{L%eb#fRhhy&PI+><4=f<BFZ?FYb(Iznsc1 zQ!BV`O6Hc`NxxXO4!^k5lKle4k?l$4Z{@ekUZ2cvjb}Hd^2^oltCHEpBw?^;QAeS! zxIDcLV=hu3ZnOsAtj*4%E8xw=6)Zazm-DJ4$@uiycgWw9HP&T25Pva3hD1NqQc}Dr z`r+yKr$2QUKiyuJwc>O;QY#ZU4Pn%l`0(^!{^hBA>9iT$d9sPKa%J+vY}MJ*MZY=w zG&x@gkEPgXg5TvYFFtjUA1SqrSxT*HBMN_I6+WaaW64wkAKEQrbKBc+vGJp`f8`gW z(aZeK4)mzNO|H08(98w-_zgMSXVO9Zln&ya^appuAM|u7F11wps}jl7+)ws&u^Ed^ zr53AtwrwtoRIY0JqIzA_o)e=#f(83SxOc4b!!jAgKfw204f3sbLeBMm4o8Y8HESk9 zQP<)xa+RFcoK`>~3}hWlLUJ{mSgL9o>`w_sXjM(1N(%6=CV01};Xkf+Rhh8=PD8-h zBnELdh>NiM2CC6tB2ZNmf_aDo2p8i9sVa&7P0|VaoUAFRdbpw{i0i8OztuHNeGF3{ zClxGGZUFNk;9)oyDu_`N+Z=G1MxJ3NcJM8BK&)mvUwxB(^_TChW(jQ&eyNz|BuldZ zyU1Sq=yi4hE#B_^_EY$~Lo~nZuJpT<*T>h7@4t9VxmC$3k=LGAwxdgD@4qQ;kH4!J z{-&J#=sD%Zt>_-mrM#6_9)DMHC{HMR#-CT73l#t5jf-gP=&lO5SVj~61CunjD{P~r zJD_Mzvk22^P9I=`^xpSgW@1a!;qfacl(WY_mj1NsVzcsZ$_p3g|GW94zbfyXzW8m; z|6~ir?}$bFUl0T0m)J~nkw43}J%56kHh5T-+idN9<=M9{UO*qo{P>RX_nz6O7{*sA z4~@S$e$ibKaEa(|_kr}Drz+Land<6{&5XUA9U7Y7-`U<fH{ftrtzX~S-#KgktQ-1X zn%@~q$JXt%Ui@fVRbAEA<@@&@dcq&}2i*O0&m6kv!L{RihHt)kxMN;yk=gIAGBzf^ zb@TA>&2vOQZd2ih{0u7H!03zu3lY_aRU~_mW=?sB;UwV%OR9K4IuXL^aR};qBp(*i z=-~fG<ttJQbJKV(=QQAL=G;8F(2e3F^0*_p5HT^HsE!CNv*c5%vXF}B7`KGjET{+6 z^KKf-VF6B01%|-}88~LPY!Np966BYm$qYC=PN~sOYI`S_L&bz#N4NzB1*wD?YamRu zFU`Odq~Z%SQQ?{Bl(|V=Eve9j3NvsJHFgNe1T{}phC91zHtssWl<yxwYM5nCTWxCg zl^TI26ns80(6{j|bDT-a=HdQ^(2nQXJBWk>?@Eh?n&RJL5v?Se!@RD=j1$wM<KcLw zZ+SSPd}NAvv6Ub~zDn^JcWIx54{t8=5ck8=dI~<)KM4vvu~XoTTZF!_x!KU>NI%1N zk{iNjjzL+VeeNSN5q`%{=I{JU(d?3FZpHV0OjR0pst4z<x^?szG9n<U^Pl5$BR|$d z!L#h%RQ`mzN!^pow_V%wJN$O(w@%V;+tlA~<k#m*>gZfHosvs1$LJwnVkt~>{(<}H zRQ>_Z2xs8-s{*R@?}QRWE`B5YEBv0QP)gxAkE2j5=5gT_#DD4;kR_A(aejX|JL5TT z_>Xw-8CK4(oX4+x3SQTLXFzLCo@9W?d{O_-Dd9=hl}y5$hzm*geDN1xr56!;x#sc{ zvOmS;dJFaQ0;is2(-Fs+#?OXu*OSbQ@7Bv#pN7ZVT!^$-5rKfZdy*~Yyo=s|xhUt| zDCb?CKRdy@z?cQ^7W(a;5@xW5Bp%y=ZR`x2aXBP%lEspzSqF}&v78QsjEXRZ85r?Y zepMA8)6_Vze*r}-3HImEVGK37IDU#vp>WJ4t~j4$Xk2i~BFi}PUDbFyn9O}wCSrW| zhgf3rcj=>i96$Z8C4Zl~qV9`lWy?t>@!|O{4-Z$!@8d=vsW<vvGW(H5-i-raQV(38 z%zbG$-R?`<aOd4$qK~`3hC6@BBEOBx{-$2`Hw#&Y`5XDS+>Il2*^M{j7b7>)$B{Mo z#f=vEG_E<P{^IFm?({i2clxKuSL-@=8oEXgKPAup|DX<>Q&Z#@^FyatH{M^4sxsgt zn+h*;5NjFEe|8NN{8K_P!<KsriNw>P&L^#>*fa)<6J&;y`&vr!J}nf1=g2{UP^0aX zATcYhyktF%P);=?5Zdg0wpJse`g%k;9z~V=3GlKWagZu{0D5c4kTee*z;)lX=I%dq z62CYlywAw^_}(!b{m42tdiUOY$lTaXn{W0@*8C0M`s2U;I~{r3Cf_-Zi~eREyLH{h zKhvQRo4o#i<Is)Pu_rJ5_Fr&FK6e^6&Wcq}{hZGCSabh;{x>wPW?LRe)6c#@M;BYs z7EX}wq_kRnL-s4^0J?hZT|4R2=WO})U*7e|qw0^x=5@8-NFQh0vWpwCk6Fk1Z`efP z0r}b!`0e2a*$yKJtyfNA!QPLTNX;P9Fp#bmeGnS5<DeXJxj#b4;eQM73x5_aF^T!; z1~2~3im<}Z5k`5Nk$Hu+2J${3Jj+mug8P-TYbdsmXvhWu{)(z_q(Wbj#c9am$>nYn zIpT#BmO@n=iDI;~CsB;f%-l_mR)G`7J+dtWB;1)k1>ds^SNRLoVRUDb@~9n!VNW;1 znaf!-1^FKr@vE9bx-F2@te^ThHVJ+aEBtlhL2&zXUprjjxbNf#rZV+VoVc}j)gbkJ zkRc4T;L1V;d@zivC_LVc`~c`(syB<=VK_LECi|%&rO2ON7>edqZ@6P#aO2j!O8(#n zlC_~JoM=cPQ~vlu)Ul=3utapMZ^`;s%`xebS1oLI?dMrl*}^Yx*tloulMdyVw>4gW z@voB9zp4|2Gm486cSuHy&rum$xX9tN7@61=-z*xPK9@HkZiwlW_NrJg7+WMI+(vO> zVvA^W`y8H>xFw<!kC)95H$~yA?;K5e9mZ1kR5L1VjN)JnP=W4*;(yiB7#?AM&%!Mm zzOZKiPk&*}?7nd!7Vf_8n)=SVeyc5{6IW%-Ols=s-g;ztXUbtU7fVd}W#I2U^kHT9 zP*1vg`_I_R*il24KuUZ)7AXy36jI2{`o^K}^bCf=9~mQ_oTV+J9I&t6wPxF)=N+52 zvX^dM&6fB7TO5EhF4~n{1|~@k&&9UPQsoaG*W|;Z%fo^lOy_l2x5fg2SYYL%M&-g) zzvP#+qs_F#DyDI<s4I6^rPZs`35Su*wz)3}xZL2T2e}QB$l}(vdOn=nwtf2-4z_7) zIKBPW-p?ogBNLP)pTT8{FMPXs`|#+|sL!JFw2G0do_pm+?lKl^mvrTBG$SiU*INNu zmpg&VS%o^JHpB}D5l;NFaJO&>l_CNPFsPw7(hI?C<bntS%m^R#6v6`6)oRJX!95+^ zLlLZ1&%2xzRGmk8Dxm`8AbuRyX}MPf3y#(zPv%z_Df}g2t=gBBqDpjWhzElT(Xwhi zeWMtbdVq3H;YFb_@ljQ?eSQ<-KP&)JL@X%IJ{w3_gUsPBH`+~Z_P-36UAI|R5-K;> zn8qK|5QL{F89hO9i|90aEWz;j4!b!F26Bp9MJN1l2D45xe%!}wc8|$uHid1XWGXdU z+`*`&G<4Rea~S<aW<w~PaGP8|cSj7RaNY&Onnp>q>h(Uf!IJ{Pgu@ez*h-9LM&^_Z z9;40TlpJ1jX^1`8U=CVJMU%%IFt}Nh6cNqNP^5#gv%MxyWRbyXl?=T`cXXjoZ;+k{ zyG<US+h!>ZG8QtG*gU?Fqs78njb>zcA?6eGnJsS7<O=ExlFlE7-QOX^r3+FXn8INp zg&iqpq&z58HIoi##b;_L4M*KUsN!fx3q71tCa3W50^lkbx`P8YA%6uApDGR~dMT*I z%w?)(fSRcU&Z#-aavJ+=DWU+ffRY}{;}>b4)Z0!-cBi*;N*!$}$QiG}CS=4W)M6CG zlG3t3s5VONkfC)0XLCZ{kyNYYwf?G@tF=?#crdC(&{PXf2N0d<J3DN1c6@%-+Krt( z*ZI6=smzq@Y2Nkt<2x4J`Rn(Ue?)G;8*ETH`rfO`Z&}SN=U7;Iot^gRR*ims*WF!< z4E>#=)pUIO*5?)}$64RI@3AGyBT7JdSZY^Zef1T>33}yKw0#A()&xz9&@E@KuuwRU z$~2-Xybk23L9gysm7wu>zDp%2^43um#0h#WZ!j=NRbS><s8;}0&muKDJD)p5^H+MR z6A)6N@M94OngR|DfIPDEVRbu^8%o&%Ek>(L0809_c<VwUYNd5d=QZ+n17=&Uc<NkS zCdhGQd8<uqy2vw`4cc0Y^#-H4Qd5<hHHVkzmLZ81ZPc^4&<Xtpo9z`UyD1I}L}CPR z-B@`DIlB<RrQoujCJJy%<WZ-UNby^^Ci$df$Ry&%lellv1i07qtx#TnC3@Y$nlH>- z)O<t6BuQqk|C;WmY0O#WblBau`P%|p`qp<zMTR2n=Z9{?bnX74@<o&B^L<kz@yV0J zuK!-=OPeq+W?;qmO;)jMxuJJajk45RsVl2lWU+M)-n+F&LMtcfk@>G~#WZ$^{S^yh zBi{y6@8r3xfoH5=7#5xsvWw&S8`b%XVyaU4Yt$(WB&i!X61!$_a{v`?=+a7t5TDhX z<Jq3``9XD72i2v}uFfiaNq{1wS*1A!whLO<6r9)cD$Ht8JHSOk(HV`4dv73BOI`_t zm%PR#*eT^ikgp+xfa?LYZ*3_N>_yICDACw-ZO`CJn(i5BNkfcqgEiYn%ZBCwGL&Kx zJZMg#44NnN1Tcoy3`ptEyaIDo2?tBY_1Viyik0<e{LQoMtzWw_IJ3M;SHg@o-}FRj zh1YJHIs3XAv+}tjcU8?a_rygRFTco+i^`)_I+Mdw?Z9P`NxX2?V!SYArp52<Sh-?{ zzNkc;H&xd#rMNuYGNrGtL2EB9FSiwc@^t0rS}WqUK8LYEt29sMi%%?Cjj;YwUb9W> z!%i2%{&tgEAJ4I;T+|u_(J)4>KkVlxYOdm#nE-M-sg;KoK7ky3Xhi6^HE%GvJe0YE zb`%_VM*w2fV?gz;2$1YT2s7)UsX!Y~<T?N$pjJ~IMu&o0yTt}g&5hm!w1BJ*5iWcP zIf_)G<u>~$+%Y%eVx10WxarG%jjao|vp*e4^oJ5HjauYcF4{W!Kk9F_MKUui!H9Gy z`NfO5A8gdPt8KxLd-}fVfl*YAY{+51_lxemNPak}Ja=6AaL?Rx|6mGs&)&vrU*1Wv z=Jlv8*(SY-eZHEqeW<d8f;hSI%Tx$*leJKJ1_4BM4b%liHftdoZ0PKa23UkOtpZ~4 z*R;6Rx3KVc1t>SYY2g*s_d2Hzd=tG|?~Q*ta$uNVNPUg*_gG<!Y}?KBHrKJLAJV(* zn0N_Vt4!ztp4w6A0`@YD+(;uQF9Ld6crbW|jSL+mIpBuCaSjA63`Yw$?k&KLko|ZE z0pJ6&!Gm{zeEU?!><m3x+l6aLtJbr3S~eIAFT{GEGa5H_M>1PHI_CepiRsu!lPeoq zHi?Hfv6Lmeqth6FOC9H$OBXc@LF2e^PXQ6CL@)TU-)e}+)u47YFQuxEQAlh$)l<qL z<W83Wz>E(!gyNB$zyZtzLd64m84X^C;sSdT6-;@nDrc;5+H&O(6=0T8HGke%T%qB{ zmClM|PE1ub%(F3_&0Yc4EI4Vgi<%jsCZI@p0xM5HgEIcfu%MKGqyVYKTU%c~viqeu z^E+QU$kt}&l!u*CY^Y87_VHzV4nD+g?^rc#G0gP^5}GGhJ@K7GU8BA8o;kR@Z@t03 zH!n#mPuz3g@t^M4uqbW}i9WMGRfjno0RJrlZJLBpwXdlh13h9DFyVz*HD23XV8nc; zzQPQLP=<?QmIdSra^wAKDm=2xk)|qpKoIixQ;jVLQ<2ciiz<g_S$|@7x+=o48EV;5 zeGJp?0W_8@WQZI^HY!@<YZOwCBc>9R5UG#=#icAG2uW3jx+?*SjcO)KpjwYW9VJb% zlc8(7y91$c&-YjFTikNvW^uzK%3q#b^;E`>`r%TY+2k$@*aO$}&r<%{95jA2pX`zj zITtprVRdEx?!l(+))jr*8zkG|`<{Mh@hneWT67_MsZ=NVn*U)rKyca|k6qvVxe%C1 z6gt35he0n5Izp@va)65E$PiR*Jq47?SBsu0yo!bJ#aghx6d_E677)OTD3mk+E2yfN zJS0`9#-t`iaxp>&vKwA|K^Ch)F!=GOSkV^`^w4P{jOzBHv>716ow`zg1Xc;B1Jz-4 z25<v4%xM)fhyTQOvJQXPxyKmw#LPOB7L5+BA2k@(Rrr{4W3!bty=ybK!KO05qTC&@ z)tw21ZIV`;$o4k4+|$qWvG-XJ?Ne;|@#E_HSp__VM(HhRSC1Fo7|@fs2(`EsA_TKz zz?)Oo3!vy%Vp-8w%3YwuZeHKmVld*WVmfTsc#Pm8_>$4)A*Z1Vp%x7U18+@)b%(kg zIi`k)n*ZU0l@#R3YU{EV#DGwEYc(MTgf1C6(}x-qAJ(xkt<GYlkO=}NvJ2}DEk03o z3rcDtprorowwUqPM6~3d13Lsf1U}51um(GFVOgm$;YuAeTye+fn(bff*tBZPE9R=L z10BaBy&I1```4ci{d_u*v_yx&Y4Ma>hep}xk^2+kBBRT&+hkLY2QD0b`r?g^{#ct- zUIL>T?p@9=D?z(epq&|r8Uq3c@szcYk|hXJ;!kxvU&YlIj-gR;UKX*0L=~gY0aDb0 zJq#k)qZBocJP?jDT)4+c^gFnAXyrBOWYpo!;Ey0gIdVkc&F~4yIF?L($mP_bv8Hv$ zNcS37;+FX<(<@dyE&tPr_AT2M{`5F=d7ii+ZtPj~e(s?ovB8xs-f8Ud{SPYdL~ee0 zKePSznI)FceB}d`7rHO~9<uZuL|vok7)LV-#~R5}B-LUnOEA%l%2+*!!OA5h2(5*6 z4V%-3%u0lz0+<0&qeqoLYY)$CcKWNsq5%LU>{!pjz=d~rTMx3d)M@Xz7Tr39`8u)O zRW|<C_#AyH>(Pi<c`G5ahOh>ULDT6-vsE!tLnOyBAXRrrP%S3mOOlS~rx+wsU^?)* zj%V9*6o4W+Y~q)2@l`~9K}ww!)uAY)5q4GJb3Udw*~<L%oum^{+0U_vkT0O;;)%;8 z*uVu9&qX*;GvcbI&ED!C&h)n&z2Sd7IJED`E2ob=vuXa&jQo>__CKT?A3B&@vEllC z(xICcG~C<}-u&f7x1Q?1FW$fWsnH8RJhbQ5Imy7t(aqo6`|+E%?mT+?tcAJutrV(< z3|fBaZOt&=-wfSpSnc~m(gr^9oSO&${>ocRs@y<|0FSY3Ek_M9fU{7*B!Z(Vz*%A9 zER@jas;J>+Ll)V!0x=nJ7wuJm(9l{rkKx5HZ$y-vh0T~`F*FJk!C3S<_y<r>dfdu( z+|hlTJF%*hvsdot#9r4td0ctN!?r)YTI`!(u$!7y24k+s@XPy^cYpg#k9o@U<B#Iq zm|#TTlh^TXDdCuqi;#4sT6ZnI7Q*}aSY1R5@mkKi$q@`ODkD%>O~+iRJgOU(;+O*> z7iRLb^MLG?eRyq0GMk`niS{Ry3kD%yfK^i{fiF&S<2VS9?+HVx*5&l_c10m84@6aw z7zsCIV`xu_%6EVtVC9jB0d;TzcJNH99tJOIkZxTVOAcAE$X?Jn-1ryFjxC)i28W9f z4rHhUMJAmZi?N!g2fn$@<+FLFtorkeJMOsNCI+S}I`lpNWn8%<_{`|RebYnbzVwru zK2R=HDSu172z;Ys1Ftik%`feE+F@XA(+2)=?SQArKltch5AU>{_?n+F;~Rrk+f)P< z1PQpV&C)q^9R{Y+WZf(RQf6CIGA)<H>}wFB&jS=90s{7@sC)L8LBJujF!S?c-5fA) zIga&#sLQ!VSB5GqSpX>!L?~!>sNc*k1!nMM6%SZ~AUx%w6|}qz@m2^8jR3E9mA1$0 zYnxaA;5RcG8TK^(H;hIa1!O763upyA6C2+C@MXj)Iu3spw}XL^gp0yKC{g$uW#YzW z(ia;57EC3y$^~QMBK`A$U3o8p7G`4T!QC;*>`OSHdWjy^;4?{yjf+~5Um8kzD}g3x zu&~rcR!RR}rDD$BQdU|X{f5aOt!BsD8m(~&@If&ftMUhwe)dqr6JVw4F`cBZ3a6BK zNzBK-VT$@NFI7rNDgoY0D{2pNB8uV&P}+l)>mlC{0&y<POI30<=7qq8WPk_(F%1<7 za<qj<KgmJIw=3GnNCzN<ph+moBIiVVC7k8J6ru`na@=HqD-4&EM#ql#Y>Z^$QDd;Q zqblL|)W2O>8;=(i_4Ib%UsO~RaY#ia8g@cgQc|pY-aWgih#3!72UZmoEuTI5c2qgJ zKN0Yyb&bRQ9a}{2yqRTE5#WWTqGXY#q%`RD=_RGF)XYjs*ei*UZsMF_i}LRHi$D++ zsc)HPH)@EDh>ZTVP(uue8#rT7L(IXq^7XtpEEgjeP9?YXbCn#VwGtJ-6QDt)pTh$X zvSc;1vR(L!a$gPpKsh%O&!P9XoWl2%T8po?HKS@Ls$;sk_*XnDms>x~dd_0&9b+O2 zc5?XlN|FcF1bfO!%|J~s|G;a4HB?|Qr9n1gpBU4b?F62iMKWx0gWQ0E!t5;Ydu2WL z5R?QbXEvyN2v6FlsY|=zE4^F_tk(AekQgSas+4e4Qb^cBh{epr-tRxdmUIA2bTr+m z<JG+*d-8`+yxX?A06_Ycrke(nmOw^I8TwJVn>w1g8D+a~E{Ij717BJ{d~cX4b1f`h zcNuilH}9U+%B!opRvFjylKiE<Q@3D#=A!OG#SN@VkrxsO&$(t|(dntYn|~dvYjz{J zH?5$)v=iJ2$I$U0U`lQk3rGzCFc-GKJWNO>R9ksEJXxr_lq;I?cdm-zAQj_81wwUM zxAla+sMJ&6IF~3n%_dLf5&sZKQjnw2ZE7?2*)ZZsIB4t+7vUU$|LfBl81_g2AWt-v z>BFRQqN}QEMQFZ{ZeNzxiW>W^-|Q_dhU*>%U(K?^D8MNyclVp{9Z`bNb(N*RNIJ^3 z<lASOxodA|*jZbotZ<-IAo%3m>3i7xU}{Rqv`Qp!JZx_9N30oZd4q{5efC<7E>Pxm zIgS1Z#%C9A-xxj`{sQ>jf9Y-Zx@dx~;-XwQ2X?dxJSU`CAhnEFxw?7JWkhc&YaG?P zDA_I8lyVtJr-L3Pm!b)&Ad`+Fo8bAFp2!q5J~9zuE|LSDgu~8R)!nzvuIk*d`nzkh zdpGtkKi=8={K}5Z)2*9-aeDLncdI%C*?k{io{OQ$P52#j5IqDfq-s!Qgy|-0Am@=a z42PLq3atTZU110S-hqY$OeDF~$psTvj<^b18&2A|_K8ezn;6-3?~$#$zje=^H{QE= z?q$HsC0_W!vERNt_Wc)oE(t$-27TvTKRw9^FR>r~guR+ws0fFqJlV1$AGvHW^1@(9 z3QjVViNjndMI^tJYo4XlZCv1>mI4`8RWxFvn-NNl09ZXNNQw3x6{M596@UeX)pb>w zF3VUv;V(M0%+cf1@f{@A43EQx=8xEp?u5xx+vs(y{)%$zWS_%qjC~dC!sVc6HE^f- zx*?4WS$eq&5@Yc1Los1U@FqY_0^f!M2fhGsJ|(|6t&iz!lH23wA|gasTI9n8WIk+M ziV<?tr55Hcw^)F7H`td6dBc{Nt7D_`@}7wMcgKbnb)IZY*?nhr?Z4-^^2d?zlG&nZ z|J{-lfAzuL{oQ>Bjn2NUn}@d@Q{JO>KBVl?^kBTRg{|m>TA1`~Mf?-yf3`kO7C(2X zBJbxvxA-Za=Mxrx?f)MZe=R%n83zCRKV9|I%*qLa-%~Z&;9sd}bdbFt^Y|ApyJGJj zc>0}gZtuGd1$%$@3fTLtjuU;$3cZXQl*5|6z!M{Tf3=XS#`-0sT2VFbC0PBSUDgvP zct|(_K5gq4SCL&*Ox*eZX!fIo>$2H@r7Zxqd{ULj>~BO=8fJgAVD_`H19pE|%#7NW zg4yr&DMPB&Uka;VeB>2nXTTPN)o;hQPg(udZpro-H~N{7Qg#6cauinH!)lC54OE%* z|A)M{k8i5V^T+QwxlM1=G)>a<A%rwd(=>!MO_R`;^nsSPlmexcQY#j$2o(WA6a++u zK^7Tw6(0s=d|()tbs5KXoO{#g6hy~|ah=h1T-O!Xbsg7n9M>7wopD{)aUk=1f6h%q zi#j{s*X#HF=lAn9LvQXq_a^t8&-tA5d7saDzoqFgYEo^cm!66PkktGa0(<b2(G&-` z0HTi!D)4_R*hlZ4669l@>MMf$fqhr(-G?B5=j)b=Jr{L<PXzg&JUQ}Q#M2lB&rK%C z_nnLJSrLN#pWpZFnUNL>@?B;}zC{H29P#M?w_^O2=>vx4hMO@mG$F<(|CNdH6>4^C zoC18+csjHFT#N}axmN{#_J0rg`vZ;b4v&vQ{ss#97g5M>y_?PAAJ_-_DCF;%2>DyV zB|BhXlrR1N_n3bW{c$<^BgOpSBrQWr2pq{9$)v-ncBJNKqJ50plcIe@z<RU~J%XgS z66?Pr+Ap+IS`S)`xU}?Wzt~M9xnIv}!Aw*{`?P{}Ubx?2=ik=Bq}bY?OB-r71)rsG z|GGWBdbt0@Tc07=*B<;%_~O-V(;a0e?>s7k{X5eiy@g;uFrR@<fk|PE_itgmuct96 zLa{#4Izd%e=oTw+g2ue?HWh>tN)<rf#|)t8I!EZ(K>MBqRBr-QUr&x!K=t(ks;`e? z8qkO_$&ZaqngR}1NvnVqCuo-~cyrB&sgyvcim<H~VG;s$A_py@e1-{RkYX#^X#0hE zLj6n8L8BpOeAoq!Bx7*r+~)RXzr}4SMM&wK7j3+n_&Hj?uPCFl_)UWmMVYBMD=n)! zkO*Mv9&Pgl+6yf%*)qDYE&cAU#=Hq%Y-|!3k4*7<&VJ+7=y-)-TI)yNhv36fn*<wH z(%U$fm{6i((|~nG6p$+R4p5w4h^{I2C}8Ip@DHXgrC~c&U=nNL1%eqSl_NfB1E`z= zK=fn9NZzI?H?xh|iy~sxEXSU*&1n;B*pe2dWg0s&@6K`lP2^b>3Bs&$gJCjbmS8+- z{1aSQhQ_9WL}DP_*|NB$WpN0^SOu>bu;;euAGqSN$1>blcbiOo!+!S4WbUhhZQla- zRiM~wEy>GpUt!1U`+Y4fea+3{-!pd;5th+pM8?sVaAC;{|1{5)3=Yu`a|VrDMcunG z?(fu@ZUy&X2sN%*VWwZGXMp_G;9Jz|85D}N#{6ZqPB=Dg!YkL?fEEB4tqEDnd^+rC z#m+jd96LC_SlOkthG_-dWVcx*2JB7tRY*1~8El1Q@HbNxq&pH+wJ$EbdB;NLc|P@C z`q%8uJwxgL{w~CZ58g6#_Auxyw&%P*&?K6G{#AQ!{^XwYd+A328kkua=~fT?QA+JP zz}B$<D|~AE4e3MVgUzUywoJYBf~g_dNYM<UK?>bFQ88+DTx&-V;R_>`H}=IULaIf} zX?=fL3w2f-vCp>%9_f}2z(v^I@uzCdjaow{En=i(Oi+NuYH+_>WYoI-=<Jk}VQWFJ zo|jPbgknvBU7HUA0%8Mh1Y`#pUfLP!wt>-AjZyF}Y3-$`?pVv0RkuM90fERIoAY%I zrgLgl6qr-&34|RH#bgAA8GNDz(p{oGb}6yQhMPuj?+csE^$qiYNmVF6Rg{JCityF1 z+}nTGk&)&#I2q{0$z2^&+9kdB>}NxpZws$w?JK`|?Ew3%qtkCPPUu=G_TIsC_>R{f z84j&|^$_pf2}#ea<Q4f>{>S%~1a!nM#VkJ=qnT?>T&UnA4W&zwlT9i@k4Yv+c~>8H z{K8eNj%aHrE@^_794n0UT&zPD=O85Hn;5_&0a$4g;*^&Q(#Fa_p7>Wp=990oQWh^V zP=bSAcY-L-1E~;JEg!`K)!liK%T1=9WwnQyF^}yJ`bJEqr%l!e6vg3lO|uo}73Da1 z+EqHuV@-dU{ztpVZBKXRD8c&0Cgo{|?`cID@dVip(|g}<nB8UqaZ=zAo;pVkUzWGg zXP+j2Fi|J@!xyFBJ^Ks8f`K7r;vDv<JM!K6)%oF^KYSQrb$sCLBlshi<rl4LFq-Og z0Wnj@g=ZdOudpk(U?D4WF0b>#m-Ak1>k1&o5C8G~oR4zuMSlDx()&_!F^y#Xa1q_m zRiRoB#<k_>6?S44v&6M}91Cja=D5aD4E%P2rg$V1Bm!lXPOFMQPSmDYvQxyjooyKY z+B<tF%I&1iLyVDXr<GRAv?1VJ0J(>(+6sK41Ob9wJ8Ai45n<O!OK1TN`$P6IyU!XV zSHHrhxj;fLY0DQQyTv!7$KOY%`)%5M+Ca(eV`b$-f<a}3@+Y)<7aj&a6uS+{#Q-04 zAs4{4*x8LW0SumEloap_vW)=B)WRUhFi8CZ^38;d6H&B4X}=J5V}vD)M?|_$|D`E% z+2UO{ca8M+gq>L0TD#}q&(rTcbZv{-W-}F5dMpZeRTejfJgq&Uw*Y7Ts9_`2&^kg; zLt9?Uf8*=xK6q&V$mr+X4>_3STgR_#nq{phhT_=)chSmslJBM8iJ5Z1Z0L1{)*Ajj zfr)55=$dzA^K}JKlsWt6u0&Q@%Gku$c^cEws&{{Q=taUW{otq^%()-=8uv3~t=xe2 zO$O#(LA~k5+z%f0)wW)~Wj8ug5>oBR(~lG9Su&S~>3j4Qn%sM+@p4I@s}!e`gY?fK zn$B5P;32o7c*CVTXmA%s0WcJ+$V~mKh<eLu_0E{K6HSf8gq^q0V|HGT$K0}$4sW>~ z=CISMZ3pTGcJwtUHXKW?*-qEiTtc?92HE<_?Q7`7_RT1~#!5QxS^^~@)t2a`3yF4= z=}pjK?>v-A=nMNEz$_l&XFb&@5c5!hSO_ln7@n|wC)|a6<=%V9fY#WOOgciw)@x68 zUGW_{N+2Tu=oLI}(lv7~&PdvgH^7{F66&qCWVw?lVzgWs*q9{u9l=wydqA=X%`7ZE zflvUxL#T5jwc1<XfCM+1r;&&X=`~?J4vFHxN+wdo$sJFmh?ks~B3>_2tq3|K9ygKV z8X(!dFFpgjj9+q=)+4Y)0kRc=GSWPee{2lbRJsFRN4yK!MF(<ud2hYb_|U0M!__gY zt{)_+i(oX+F@N*7XVg^_^?Cnu+)@hCepk>^XzliIuCTmgjXve87xFK!$)pF9-sz8L zKgRtBO_6mg)^#o3e48_Rr0p*GCb?x9*!xRH7WSk{mLFtho4>ecf7<)dy?>n^4*QKc z+!CSG=?Lvv3WV8RyS5%q7lndY>pyqF<OTVEiN{s$2|YZpbBnP3-RIqG^oRMrvtN1^ zKmW=1=L8l;dIzarq?>b|gb%bydzeQ`_LAR&Il~PmYnz}q12%i=1eazy!KGwC)Cs_e zD7Kkum!sr0m*cc_4U99nLiC91@CbAuE!c(!e4V0Cfc&%|SW!YHE3n4I)axVa;AwSb zOfc`FYs?*_htDNXIVhMj1|jc6%o)I^sB2*NkGeCK3<+}l5C{~KbHoN9!HkdHKP23t zlf<hVX@z);NuU>7BB_nyNZX47bCAF}CO0g&lx#jkHjf?Z33ZEotil<;oK9i^5t%O= z?doQjd+yf}cStgo`BIz4R8B0a!mJ4EMt%!fv2KLt?{oOGO;aS!5F{*k6ySW3U)0RL zXt4isSMQa+o?vmkA9*s>g>rEqeQPi>7p8i=|4YoV-Z#k{BM**@4zykn_e5vg9eX@; z=7re4;8vyLd=ou$bJ}rj8;b><RblVSr}u5+(>j7@cZGsH$C@=&qc6<&pWPMqO)+3` zmaOg9&9JuCi)RO}s`o?}4Q+Ol%bup=+2oh4f_GA5wNmmD^2^h^kC9(q1HWA6>sY+} z+vJybl3(5}HZ|%dd5thhbr&r3nhC2+UI|-E7B<{W_pgTmwhX`k>167VUi=%FE+r%C z<)_unF>MeQWr-yR$$Z-fSHPk!7dCkL6)?O(tF{z|XN_rdP^=z03`?ol9PEI^zi_h2 zrNR=IE<|DEAJf9T10}zXF+?a}IRIxT0}i?=Pyv@ah5}1L#xf=^Sa}Uu+8i>!9b|q1 z`<SPD=Po+wu&KLYcxx_!BR!r_*V|J5JvZF_2rg;4S7OAM<Y0IQK20`9PF|5*tnU2I zcb<AMOx#odFZfQfbkf42y#rsWA><$lA?#=<&iM8T4WX?4TKtiSMR?pF1Y*@B839*o z4aEJ<fW_kL_cV5!g=3xKNz*$g`PnI!-23)uS93Hxcl%JVMX?%JEqpQ$DnvW{M@*)V zJC+-rOkUf+#~3*b38E51ZY~Tw(GMStOv!|B!e>{eKMV(^cvyH(L%M`}$~@gg1Dyj~ z|BrmEFT(ec)xQHD8@@MaE;%z)F**|RPtrAN4m@mfTGGcym^Ew!4iO4<y+Eo)VxID$ z@oDr2hqQ}TOUdozk1vU9JK;N5uH8)j_yU|tEzuV#mRvyAwFFa4p@mCK&DemDgzO2t zY`hMq6?kuvDydXbQ4+8dOB+dRV;6OjQapI!g&Xi-rhZMR0l8z^MwoG7EV+@y2iiAY zja!O0(qS<rQEs$q>(MW4G3_E0gXGIa>*?A>BPh21B05}u8H!z$nc<=+B(Zu?v@@3M z9ir>KaPiu1^oET<w$y9L$j6M8YqpU2Ut}NSj%wkZk-8DQ1QU#2B5rQQ!Xrdtmf&#d zGMrSV<46+0HYF0!TtlRA7;`~z0j;5lX|6uxV{M(r{E5ULEWDw=fFgDdgKL}GEojZX z)L4OSap+7_mYBZe6#rPxcUD>p0?V!5XvBiVs6DQ;KfcKn8NCFf{-Ry&g|&atv8l7( z=kKeS)7Qoh$xJC`J6ufp)Ea$FC?*<rq<@^=RKJNP!ljr9_XN{>!@c<A6w~6cyiayb zca506eTl^5WvfSf&+HV_<5Ta>3CxJP7WK}FL_CoPpZoF3AJt$d0&8$UWKqlsKGy{n zU*PMfPK{gefU|E-l3_JAkuPR6M>Zy4dsl*qF}Vz8rdejdL@q@Bj;XjRf^8A8<a%<$ zn?wkjTulRedtAF%kC`~RSy0-Dc`wMaR-9JX#Izo?JlNcOR#40LbdmEUj+x|&9y+lC zGhDStY~Ii+P!f7V6=I`#MF3^uVhtt^v_P$}3cT8g39Zpdcap9`(rKhaV&M{;TJau? z)}j9O<WfN}c|}5XLY>Ms1D_@B;tSzDbEHxa!DLz!lJnFCGCdTdOsPL-R(k$?6<f80 z)lCkMzBnb#Og^&#SKP4s!6!EjPjYYdzPUY{zOCyB4(Ps+`yGMhp0=LwJBX8>1--OY zzDW$~`lPaV*G*lc-BHZ)-k`bT&=;qF?4I3MA5Is3@q#Q_6?4s~tMlGW-1JqmL<C?P zn(FMOx^1MJ4M$-c1H=wpMYaLGY1JJ|Ho+jY`S2q1o6r{0eBeRJI2p#`xK@iI*yk=s zGz$t?WGY}0nTE?mn%AtD=0u}|TG}aS2%H!ulQp7wiJX9#)r#OIp#6x&b+wHqb@NP= zwW!XEq}s%hHi!cAz@;{3$@L;VNT?lIX_GEw0VHichzYc%z|{bc|H--9c}+XD%_x!i z3-d9<(ZiFbUjYl42-63>ja^pxLD5i=AWgTrckG!rx~z2|?ujI9&g&@h#YAhH;&~(O z+Bs!jHN9=-+1(MpJZWAf2SZ{ksk-f-u8hqNUe(~KT{L*Ls}s|w@=SjvUG%-uPo?B6 zYLmRJ=&!TEFO_2rUrF7yhq^0T!iD<pM5}1tVU(DIb_oEWpbooQpBG&K|Nj>R^MM#j z3!=g+Ag?aKz93oxgk?0Cw9vTH-hx<D4O%q^YMvww`(j@%X{hZ(0SEH%lIAG*!vvVO z5N$FCIW{T#l4a|zr;h0AL`Ouk_1M&f)DgcleuJz2Kk8{TNx=jKik+EB%4Aml38BMs zHlbmO)q2YPq!e7k?n&LS(L1#pdK<IdFdCrNO&=cZwlvzpoBul4tk@YO5T7<WY{6^% zM-|h@t_uQ2mt4QMqt#eP0*EE~?2+_G=XXe7B-0^jR(y>f%tg+dNK-I}DaDev{!nLh z8_x{XYv)fV%y|~fCxQ)`Ik`Tc(AR1{l#jzk2EiID@*Aitf&(eJl%^5bl0~@=i^R-! zQ8Sv@L*02MtYs!)1=37{4aA~Vyd8!E0W(bkeGyYHh^V&Hsxu}m0J9P%&|pA;*bNB{ z0bs-=^TYI{T_3E(XVsQrE`TmSF(NFZVl*NM9SBCrt9g_`pUm}ub}XUwEQ9GJnwJXi zU9<=tc`*<!-9*kCm?yfcK-4kJ3sx|)7}`+h0M3vd?1jp47R%BHdm<!ZYXufHH}rkN zqHZ-s)-U$$h;E(R%mVI4XJEdo-i+Xe-72$O8o-tRwzAkiO()4?<IW>TnZYx4jBVN_ z2I&E2S{H7Jh3mb+rjd}(Iw!Hscg<Ii)0qEZ4a4{n+RKgnXdv~YXeB7XQk1PNxES@! zso9`~j2znJ478O{=nx9@kmsOvUR|%7go~wO3+lFdhDg7u%B0_Hh^RS`?n8DE_L(Bn zOUuV02t*)!T#iq}XsMc*b_EW_a)yF!O2qLp9UCI;WB%&Vwd7)lZQ6|0G^SoYibh+O z&}K~|GRvIO>ETXN)Ieg4Ru9rjwb8CM0HN2akO+yW8crDbwECi?o-8NuMWYp=b7M)P z4%KJY^U!tYaP;~ta(}MdPBcD&I_R~`hs8g{%(-aqT#=J%u<Us9*%#h_@ZkMzzP3DW zb|pfiSKq&3+gkqv#;~)oH2<-6E~S6mTx9l#Am-wCeamFJZ5hdydipy|rd{FYWlH2O zcibQ71SYMTLI?1t*?;n7_Mb1m%8bxEjV|;C<7H2!)%Om`KEs~LMEz%5N?$O$s$5)& z=F74vrWgkwhF}0xOd}qBz0l+hb^T+=Gd^hwrnF?*J}ugQH8#jX#~E#39j66CN)h*k zFQn=JWCLg>0}%g+75;f~(fD*sJ1;R0OBM?SYheh9W?=}(3KDr(Yrf17U<I@vs0~(7 z4mo&%9Jay#Cu42YS!vxyZPUSO(sfuMCUpzMbWR95tQdmDfedwu@g%2%d=$n26j7Rq zWMT}?upde&Tw(vAueznRW8NU`*Oauy{TRoqYWjxAhM*x@3px&Lu$A(2Y^BpH=XNX* z+~UPHwKJhLl1UML>7Ozwj3$&;>ky_vi<^YcP&iCR2He|FLQ8PuFupk1$CyKK<5$?y zj!{306xTH6<vr{v{9ayOjlX!33<Tr$p>GXst8ZkHVNB(Neh5AchMfNSTX*@s)Qawq z*|xNL;ewK!yl5Wsa-(^MlD@&IhLw(&l&tFR?s)+cu!%f{@^`WPtTgRpjhmticUFse zT0QbWPstBS9nyECWII_<G@eQbH;;~;Ote!wCg2$GFR8{;MvzwIg>Q%6rxut+zP&S| zcASQ8iq-%-u*Z@e4RlinB-e;)G7c|Zd~S{)X6rOZ(7Mp>4IMPxTafZh8MRs=If0-Z z;vnQLSOU#kTi4u*=0yVj1SmTx46BI$89|wF+LYZ;KfcrChdN>=q+<I+<emAH@G56V z`nhz!JJ3JZsRR!!JZkV@AblvDo14!Xu(Htn)z0{=h@af8eJ{{B+KaWKyU{lngJE6o zgBUwW1BK?ol<rL9s1^N@VsPrNlm@L9#l<w)nQ_hYFs{xMJ#yY0LO}aOAMAk#MhFCc z##DozNs3x-M`c11g<Ny9Rct46iN;V})>NHdstz1Yb<{F0h}S3UTy$7B6AiHh_qHQ{ zd5q`HBRU?n*#;8f#ndLyBC{f)LUYw&I4wf%uB6StF6kdiITe-7b9=z-1Rni)xJF$T zY1nAZ0zno`{Y=j%X~sN>64@(?fbxKOLICj-18Kb;cZ1$StO!w7bY}9bdwQ|ksnKBB zb&~wE$rrS~rn0Tp{CBO<XNcj;X$HmDev>jXbo8Fx>am4O!rnneci>x(ZP>l`<g1^M z2d-MWq;A_o>HD6^2D&Ea0R*~Ao5HsD9z42ld2+RLRZA!$-1IZYAN=4D{44TSWQuQR zfw2E0Nnhi`S|07Fm^QnEoU4ImKgbeDTE)gvE9Ct|Fe4(FTC2K%LJ%}OHSl6IFjEI2 zYEWzuL?(N(M9hy#*-tG&GnoXLEB2+9SVbmvJ&M%Nqh_iHh?txw5?|)cMd^C0s?eh? zdUQjncY1V#DU%jNTd97rADTgV+WwfKybZ39T2@o2t@5dtK?iLyT5|z%+LL7gnlx!v ztPpBUqB&EMaC1}Rn9L%~d1&FRYQX>mDv&QK;m~@y7@i%uPg?%vwv_{|%c7oWlhwJ! z)7%yG$BFjlZV~(>JSNAmiA4tZFQcpB0pkhGt5(M%LuTd4VV7cf<+rb8;~Dq-Bb(2h zI3I!ojJDBHU@8ipy?N5Qo-%tEyKN|}_)3wLWB8ShTTr{cgLWO2K9!Qw$mh+Er%Loz z@^<!R8&(9NqG2frO(tkzV~t)cA(qz?^*FtfI&PhSJ=7q)p<pDSAu-uDKyBC7Ee65V zMSAmI6j2w&X;8$#srqA@4Fzpt;IsiPOUA^!I985(kR<^DQY{yG^+Z=Na1mOkZzY-z z!{G>kE)0+<cTMB`HPmHo*wz(C7CmH;AP#9Mo`#c>c3}zbade<<6D!fqQXIFTb&>v& z1-HbkS8rPMP7HjL*VoXrm@^?d0$(nr-xFl^Rcmn*W`GfrR?Q3!>kY$eyXt*aeKu=- ze^($XB3%;ujr&c=#V>IVITX3u;TrbTC%l2E+bZwP1j4#4^yirdhuiudl+Q%h3(#t? z|GB5myb_+elz>=Aw7bRi<9>Nyoqy$1H=PZKz;rWd1&rci-8fd?k(?bMJ)pzsfbxcM z194&r(Tv%wgRKEC<34^lKgy5uB!8O!1OMmzOC`v(z@JN@lUQ#Me>oP2@%a>g3YkL^ z)J4#_^T{?qh)V1(v;da;Z~CW*wzGNQ9$v*k>Swv65}EYjI2omX8t9+j;GdJ+jkFsm zDe-VTxt90<m+OzZ6vrpoVR7*!_htUx2;W47ZShn5hU{-RA)Vs4!6&Vu5qbr_^l2O< zpT|EZd4ag&B(D>HPw+?hi!`}A#gAuiKgF-)TlkB3*@Dmsex;QA!8mJ(K?jG<L#62y z8_JeF2~L+GWGg(5k!~d$mOzNduLL1pB3t4FTg~j^E7+xzPF78v3`{!NH*s=a_T))6 z4^lBY<K8^hgD*G%o6S5ho-GFMvx$>BKOnUQ5twC4=4MNh1`pV$#V>};4?U2-k}1Yt z%N9Gqel~IM&g{ukd^^7j^|AsrGtTcrrEkw(J0ac00fvwB?bcKLYuVGMpto~8b4%)o z-j+v>lQ%f>ojg?KaY*509?1R$oQZlfRN>d3WZz>CgAyYKiK(=BUI)&Ovoy&6K8MR6 zXP=<_TjC0pKf&YD3cW2AagvA^Q;Qd@DZ;MM#Xw?Pntq1E$Jq_+FZo4$704V@E#e1h zHG}je48z;cAT@`Lfz?xZ9x;^|=f_|p4`yF$oc|D?pUr+|<NS@tIDh%{DSj$TNjT0= zSx;~cgny^_1C!1^VAY<%l;y|zWaP(I?IC>HseeK~!z=jon)o!f=e1Xm{JB@Z^co)a zs(9GzlOFcE5aK!^EoEic*a&qlB#V*U6?OriV)@yEC#7HDlW2Av8PV*J@XG3cML_$? zck*vwUE>t1%-)0|Cm8TDJgGK&a-7xThg^@d<E%M$iXX~eImr*<ys%Xq9i+~{)}!jK zM~A4-mU^5;ML94#ci`LFvlqtsA$*;#9@dHW7(91{^@DnH1ZQ-+9bwDy@W-=)V&e=; zjxv4_zXm_(igWkzd-3&Gz##9QbnfoRNqz;+=s)xdzK(t<N}b>#QM-|B*^@lPBbjm` z-hy&)Al$)SFv@Wr!LNNsRL+~?4x+z&98>~t;w*WI|H(dQoc(8Poc#}~;Wv}c{U-7_ z$bBbDe>UmLXQ1^wGwJi2_@;lN3g?%gUf_e^Y)P5z1p5ZN1r(y}pKwyV4vzjo)cY2^ z^xAB}alRIUZ#c&eoIA%3pxF;(?>xY%QmNDlh;UJx-!ZA|Pw)bF;L0g+<+1FQ$Jrz7 zF`T6r{%-c{IQuSM;gRg;lPLAw%rAU|K>!%N`@6WV|K{(q2gEl&h9<b5p3na_d*?X+ zTbxaavwxR8dxHN9&YX~*;ST^2ec%VjQb`*6e{4%W{MdJB=zqwbI&%Dn<3FOaJ8j7a zPn@E&uYjv++lE~SZo2E<lh6NzuI;fsx@Gse8@?$Ns9v)t*Dn7V72In}ZhYbIaWu|f zwWl_1zWw!oM(J_>x-Ge4&8<}87bG6l4RCM>icG7dH(3GbH;ef({x?*R0r>gXg!(oF zq2A)x@*C+%tkQOZe~sUOn?Jz$_oT%vAkLRVoN595cMa&?_VFL_XT%d~?I-wm`6DR3 z$fmxJ+w1Kh%mf)F7%JOXg3S^4wu1n)fny~cod*|YOD!4osS#*N{f_mpJ~kkIDjqm! zQ~wL1UiP_#pavx=u!t1Hc88Cp--8fy30uo==C|`7@)yO6-fhz?h4j=b@EjX<^7;4{ zNl;|+5b0V?!!|mP<l;772I6NwpTn=>5AyHxr}(qt{)qhv9^f;$i6{79ad7s6P4hSG z9bz{96-R`G-e7x@ZNMP25ow0M1l@34{K(Jj<LtL6`zAYMLk+Vl**3P5{Ub!V-r_Q^ z=MB7*6Ia+c`zPCzoMG2uH=ob@`4A@|OPIO+alVAF;1_dR2pwk!Kw*2BFW?J#FQ?fd zOq*>XPS0C$@eWXg-o?<&<Ls3EB)gj(WiN_a{VpyXV<(6L^fC4b6(57t7%Cl8$8k1_ z@43?UI0V^7*jlz;e9xsge>tAB8g~xxtLTvdoSKEdRkm@y8Gq;D-7BeeP9UGOk7^>y zz<`3`kAYO}1amN`j1b*x1$5S6PT0*Ue#|sHGM@-ZPoO4#MnB*c{DAFXGrd*19o6%X z{5$*s@$z4@tKY(<yYPiS1BE)MP4DJ^%T+#xtLkx^`XGMATV%JpA^Um&+g*=I4@ft_ zWxUSs;rEL7IAMdT++OJ+wgnaS4Eu@n1AdDCow)QlSq`>FLB?$yDNj#;==&YC+<&m& z!smU)&TuY@rA6J1Q4Jg?8rmJw7Iu%6LU(@%P9Vu1WsgxguHXeWN}Hu^><Bw5kzmR= zk3$geq_hdLnm<8nKg2b0_D0)D*inkVOx3~N^w4Lxg%|P?VSE7|A;UmXZ83;A=bF(W ze+<L9gWbhv!~DoV7V`V~U!#QjGuw}(7o>lN<!xlQk}YwPNL3fuwSm{s)tYR$eJ1+# z5FFzzyakrETv*c@K1$_0kYRIysqz)+O@0X%i0-R4ROmEm2D;O1U`Jixg#K6Q=hA=j zIk<t;C}+V#SqeY+-5==z`L;2`FFsDwVV+%k?|pisV>a#ge-Ob4bU88<m8IZRpuH%x z90ME<iKQaF6pK0F#KAFbh==e-B^5gN(Fj^E;0b!!hH3)gpjC!5pi>gdaN-Q2lF1(( z*fKon1mVHN4_i%wYzTQoR3yHTcGZ_w*W<Ccf**j@{t_g#Kw2*I89z;|8tGSQV@WBv z_)vm=E$*c=_#MS41ez!P9NrU`%27?3I1C&kanRKWq9b~8=`68BJl2p4B|8+w0~&G4 zfx5}96g$STYp@Yjfggc|V!S^XLGd+Ur-kqxk=X_yhEZBsj~q$~%61Sm0g(v~kaI=? zbi6U<K}xS6^AuSQ#l~DLd(1IlS=&Pzcd^o0@lyI?`hV`6%z`HPPV(@@SS0aPlK2xq z8wkw-Pp6Cu)D0>Mx6w=LPXRp*XjJfkhEihAsIDjeD^kv#g|A1mPW%zP8ndeDqo_A( zf3gEo`60p;{3_HsY8tIrYXGPKLR9@{mJn|*y)qSJ;Dac3K(!aO60rFK6v{SIw(*40 zb}1@ZXP6Lj+&W2dv1}EbmK9P3gvS)7|BC|%BS_eWA<p0=h~p&e!$28{p_-{_b6h5? z(HwC3E4(v2ip2pkP)DBAj@*5-x!7neHWgXB;&Q3C+*|JU7rRD#E#9Ed9d=bK{()X& zx6@H-X(_c>3uTi<Dd=dh2JAr}4|@C+CUZgDBX9LsLOy3DcNCggp3)dFh9YHVPmWbl zoW}bc*8bvYxeklDi2HrsaDHeBo@DgMKD#&UaP|94MsG0^+)HOhxj$+Q_88sXX}!h} zch#4BWh<)-d5j)E=c_Jvv1x(nUYFNxHd?&yxI1mJ7Ubo3$;BMHeU^~Yl@H#F&9>=A zliTZbTb-^eYz`wRhD%wQ&B>fsC{UME<U++op_ALJ<l3#qvVN1v#NJTC?QP+W9h{qk z4dL=|Th}*@IXSY4yRbdV*JH8gC`MCJUY=r>6{x-$jo2%w<as^TB91*m5IF{$sxenK za?{<zT<%`U9ql||_t|nR78#YGa1P~)9LBg6iMH7JZ;qBi4A1DbdkPhEzSYW<0yD(% zu;ri1TMBtTw-g$SEZpKLay9z{F1LAW3Dm>gQM1u4LohDi<U(mhu_zY&YXgUD`Zu2K zLy?l63x?V2tM8Xhfq<(UG8%IG$T8XE?QYq!spn=BGG@llymWS)_ZZ@52f3fU%q-Z1 z6FvK8I-353nT?;O-%oqe@4c4Zlm7K_=#TyajKlBz;g@_ad!M-;O#dpq{dI5+xYEBu znA&JInHiHmLA91bRVu{GL*N(T*ts0E$t<V97?dsC822mgfXnQG@;OpuOQS)%;^cPb zj&qNKx_1>><oX`P&27j{ODKICxFZ~}cxG0WbhLS*iYFWh1bji8+dtQGfn8CIfhyB1 zb2#F&dg8`~OG4$rO0OqTWVCF$0E`^&FyI+~;i`U9fiqmvYAdyR7T8=N2N-W{#&WMG zXvChpBBNZu!-a~2du;A%hoz?8gzEc4b8)T-TWIMg8w<Ur0=wB<uSCrXtDEh1_@~)t zy37%GU4z%*FL%s{nwbrfkV=tRk&8UcBAcgKnGtst$VX)!?A!Rr<@?_)mAPl`(Ef#^ zV^<CAFLD$sVQXHclF#k3y>4i)+v3cVK^y7FMJt-jcBA4%-?6tBn@mbszTIfXUMiWJ zo2<J}$=vnUh|!T_Y&Ax_<+2gQa%IJ=7+F397L5ukFd9n>?H!=vQPvKC-<P+^g(iqE zn$0;}$+Hy59D0x7kOPk}zMapoI`c!kwb*=N)Z_{kTRnCsRR4-CaxrY#Wx-=j0WQ08 zz*}9BpKp}U?6Q8ml~p<hce606s>H-fyzKSH{4&h%I2el?(`{{=%Us8lt%f-7(Jd_Z zWk`|ecJ(plN-vYGoxv25{eqPoPyaf-=QV8a@}%Eq&fMuRt7++fdp*59{i_F|Q1U*k z?N^_FW-^;iz>zZem((cDmzJ}9DY+Do5-AQ5g5?Ehr2671m-vXCnkkcUsTY8P34lVa zg$`97C;DQP)*M&_Qd=Xb9`TWZomIWybZV|1z9StQ%oeE{@hMqTMi@wqND>ekJY_b7 z<hqauu+9mg>o{_Ntf{E}glHrwN9i^h;S%ZGCs43gT+@bui<S|^uC)U5m>OHMu(b>G zC19Y*svd!9%TeH-rWVM+)Aj_hb=g8>7P$&eKrPHhs)&!pXD8a{_7d$Yz|sG85UKmp zQKZVsrK$>y7*@L^S5!$fj%0@n8%7ah<j-*>M~<gINbgP$30FbBVlSqU`&j9jJD`el z&Re{bb_#FtJ~RE9Ry2U;?1hyGGr{wBr$0D;9LxgO!cNN4zc^<n_#O|wi4v|0{%3i5 z_>YaoM(js+W0F3P^|N6>dmGt7c8GnS-^%aG+XjTRNg$)iAfccEVFpP*j!yz<%Yj`b z(*QYBzZdxD*p=zuLk4jRl8!DBM+>ioT#1f%BJkkX!<f=mHBQSLt%9a1*+Dqz68dM5 zz*1;@$av^U-YM|VaXt`F-b|pWE)bvmh5${U$$+H`#NXtNFlp`j+z%e-v!v^>%NCJ4 z(9kS?`x{(N{to|~<P90D^aAl$EsbP^z#w0a=>8kodrks|&~YCLM>mLAehu)3TLJH^ z%9c9CzL`CSRydw;%cRds@wso(=gs(hZT9m?C_-PGK?^nmu^^n{Vw6~yEpdV^U`;yA zdJdgE0Vq3jGLkKM5+`*~N5auOJnIC%EmI6&)<i{|V4qCfdn|kM6vQH4MjPJ<kTCU} z-n`GfOkMK1pAee)4*ON+>NuD1_V0*0y8zXU^J?HUxSn~7ci1cR&FnSy28pe_V;$#S z0yVh{s47X)Nuc^8P;<F-qYi4;ijxFto{|RG4Dgo*=vU}sI><dkvLLbRzz+e8JRDJ7 zr&GDQ-^jIUAHq|7q<{Lzs=bO&NA*uft=bvFdZaA2GFEivmzI$FWL&#b0rG8#sdrja zpX#MQjXW+rfU*FmLaF28+&Gf}(A*&an!B<OK@<wGC|`gy+gLlntG4XL)KwXHGL}7c z5+QC(RE>nATG7BZz*S1N#5hx6Qp-@Oy_3$_@Gaf+-9Q8<P_c2g9A_^RXD^v__7a?3 zfwSsm_%$0QUD$vNH{!xL+k`7$pLFFqwAqa~qr;9jvcJF&BiQjq*e==N*YWDPbSJj~ zcx2f-Pw|rM@#EYHpdwfFvvYDak8@x4tS4J`oO=K(`zC!R$(+x{H|)Z1yYJi;Hjdx+ zInL-9+UM+3@r&+5rKKj7N}<xU_&B={&v_8fImMosboC>c-V?a;_u|UCldk+63m$K< zcX5S~z0;GfoJPNUW76k$t%Pu=igXJB)7ZZR{(h8LOfBQA6<B@CQzwA_#($4Rl&4NU zGxi@x=$edQRf_^Yc<KbdnJ)5Mp28>V<4k2gU>f+yPU=UKD9L^VIkX1W0!0*+X+W!P zA$l_Uk3D(r%B1sxvFt<eM5kVS>7U<xi(>ANY{}Q&{t1nMuiD3+d->l!pp!>!W3RmP zi(k><FYRMT?*9QnSn3(uqxU|1+o|7uOdlSwr@nRU;P+1881`;U-u$)S(?dSBkKOUf zXB5qAcOJ)5^EVOA-(iC!Jj~yoy#B@%3K16gB!n!kg_Ol#Nc-6=l99sM7=WA{{8g}! zVFXZMW4%Cu0G42|hWHYM@2_M-0DYvZ7*LIIR*18g*wpp-vjXtpYOK+%6OZ3uQwMSK zMnDro%qd;M%GovSYvMb;j%T~@V{+|t?EvgZIZ_5nu^8+M7h!CxX1B9LypA{V3-}0M zBk+uIUIJk5F#A5--~Rw(S<Ww}M*(&j=k(VHc;|kO^oMcIfW)wG0W>?tJ_DQBOg;># z<O;q~d^OZ|0RLUdH)F|Y52t+9ah9?_!Jgq)V{z>oegi)s&fSNfi27m=;uTNg?-O|b z)9hoagTJ>w&VCGZ@Yn2jq9`r-{0cSoE_;J2<ZXiFzR6Y*T6QD7iKvZRQ0Qy8c_|RJ z5q24&W}69ZJIQ(h`douDC)ma8T6(|=95%6abl8o<A+~@H39{?JkBBj(;t&k@37!3) zg!-KAaVZ5YrK9XK{2cXVyGl5mfdI2(()~cjejvRly(E1Po${>sy}z;pD1{U)5Tm2u z_IwpC{WW$Udf`8_k9aOOQ6cUnH1$pCZRs62)?ag^+@aEocqyEQhgWe@QNZW`5cXT_ zIrjI^k9b$yR!czD9nzi9MmZwA#eTwGU@uFzu~*r@vY(3r%V7@hO23jmkUr)!rElWg z3BX;zqJAWO2w03jvBi9lnhck;Enfq0W`ccwga&<zJq`SHL^R$OTvdNh@AwIr<L(rO zL8~Vlx!8wwrCr^gP?yv79ujL|DU3baA!M?L@1r|gfkDoeR!e92jr1{1zq%3d+G4=w zmw{bsJ(E}tQ&_36JrV~)*7@U7jTB~1R!z4Afogj(B)HIW*z9!zQ+?pl5Ys&Y0|v26 zUDQDM1aU&pALy>oWHWP2lo3-gHGnV^m|C@fjId{WDyW9j0M(jVuEij5EK0`-VPChv z(SWAZf(t;vXh35AG_r;ap2^4>V5JFYO(14~hJZ~W%K#4rVxyyLlhHPTuGN1LUPF2T zl^1B5AW_t@v{GYf7G5JXN{8GEX@5p(tc3720^bN;1BvKld=1Z|Y@?}o+62NT9wRWf zNeCN&BP0rc0b!ffP>dih1F+>fCIGfT0}v|uK^cq<DaPk8wo?59VQjNv#WCdd10n-d zC*aD6*iZlGplkwOqgo-DjlPI*wk*mfzFP;z1llHGG;C@XFdNks2x})$wpvb<id0)! zoJ|04I!s7KflrEC2)C=(@vq|7)1Rgr0d%ZA3xAK!NbvnnndyuN=zazQNq?07ZMru7 zF)(G>WHXwp+<vb&=uw;n27p)sDzkFbjJ4QowROd0htK2nxT_qzY;>{W54r&gL1@M7 z3MlphrGF8h?{buy+wEQpHx(Mq9gRjMWD8dE84$&sz|73S3}$9jnyPa{5vRq&<swAh z#-pW{0mbApmU3%eiQNv=%oOS`DYP1Z{!|uw!=<jpUW?J|;BLhkigRB~33nRpCa=3s z2`_B6StCJjl^@G5tJb<)0l;Ztdy&-}spaOhrN~q=k3*t}=gEa(rP~C^Y$FgQkJ0S% zma^#p%3N1ifrU7xxtvy)^NKvs)+n+?aTQsa*Il5<4v0oAF%`2{dAO}TylF0oDb2xp zh?oa1T`*42SdN)b1BM`bdn`qO#T+icHaTF=;M|~?6ezfs6Kv)#0_HJ+ml=SURoknq zGT~+T!aM<($&4u`0A@TGb%YB5m$h=)!L3#$AOCT=#K3JzA*dGsmDw!@v)Arwwz$pa zd?%Y`-d1Wg3b@QAn;k9zm2ueyw2lr9hCduLnH9be<T5WZ)7kO#<uH!M^nb%Rek%U~ z$VCLk@KL%BT#&#nuylAoUz~noGSFo-vU5O}&vYKpWenk^^DT-1yNm^%s8<07`Xx}8 z*FjKMTZeIB7V0XrSe9q7E@PQdZZemY>Tp-jQi8kOJ{|5d`G9wYe1vzcU8oc~BaY@G zdol2?Zl6gh{wlN!y&hEnu&c=Q6<Akk<z%d@!cqNISeKar>{0@~8`SmZu&&mN58lze zs>s0$WdU~?3ns%|4RR4-mL{{6^K)=lWV$_X0_S>r<)4FdRa`w^pj_r+87R>N#%28? z!X>+lOG@jFlR+*&G`tAm;@o4DT?Sqz%T_B;u0K41M*$t6oIBckv_N_)qXCmQ3voZx z11L8#r>>c@?tDhzPJy^ad9URZusez9Y$4H_V}B8C9hulUlnW?`SyL`Or_M#<n?i^} zsMU(x^O`ua>DmOy)HWMQu8RN_If&Z?o4vpiluui}l6gLnUtVL=0wDdCG^-f}aLH*) z%C*RnOlb3v?V9uoG7HEdBCYZ(w;W~jAnQeTonWuf1q{#Ut*D1<rA#_DG-;n+y-&}2 z8#I1+aJ0KC4B3-FEMnz{mpsiaMRC8+iT!<za|4EV+5TvDb*qmx>#OymvQMDFA0 zYai8t0cF7re|Q`Dk)jOPAy9@J17SI@%v3w-ntz1&P0$|3ZnVcb=>S_KB^MzJQgdxa zi(scPS|n9c*|l*y?FhrNxzKyjiT|Yn1=ZR_IM1lwbWNiK1T;0^^u=g0q>mE`jtcdQ zz4URpRozWc&K^;ksW(Q{Wv8`vv}C*3&(l61E!l2O4eKpA9Kr4td=^>b)iL5{NZLip zxP2PFA#SHHi+ga7-Kt%OCOv>G=L1$XhrT0UCveD*5bqg?D7BkVVA(Lxz9ko9_SA0E zE?I@YaeJyfJiA9MZQ5<gSq*DxmX%LhXayy%t=qQm{`wwF!nB<0aHn!Lt{t$cdtn{B zv730Ts&nZTboJsrFqIpyF?26Nt@x}<R?)gBjDuD#^>JKp<o^q)l~@I%T-(VzScpa< zvr7RPnsNtHZ3n^C&{*WyL8-R?OY)^Zo=v`-FvE%D%eBo1+0T%Y%kq$u`!Ke(td5GL z+!Zb?yX52?o|=`bA~_RV^NEsVieXMp&a8sm%p}W{jmX^9tyd&x?ilF#!{}FK@D@hD z7DhlJ?Du_n6YRH68et_;@<Ph02Zs(h6E|h_u860+;v;e1h%{|8oQhdw^P0(qJ7Ap| zmAGVtd<{0SG4+y&>KEzR!teyWpq)0c+pVb@-9l?X?JInZ8jYnE3kkjqS=pFraT}0L zQVUwFqtwfE&52boLw^m-#Vcr)kdzJAV=!Z@R03MJ>ct7wWLH-t)WtTf^&*@z+EYqH zOaFxw2_$UEj)jC|tII&M(>)(Yk~Y(8v$y9tqOn9<_x#1n$Q&aJ@%*lYX2yn!$vNDZ z{hpV&`_=i|jhOt=YAH-9BiD|}Aa+P$;;!$QBK;!$X}Q%;T3)z$@5Aj2qpqtw_02v= z9%PfbqtJE~$=q!JY->|}U*o#L?Yk~HvSa^hYi^@^XSD5trh$WpH}7s7?01{&9%gvu z<5$12xcgv_$m~|Jr*(>bWWC#2mGA3lUOBgWWLEv!O{;H;5A5NahkJV3y2|TsylQxN zU8xM#I)l{z$B%M)4F{zJIGPto&qzsytOG%55Y}O%<N3P&L4Aa1?7)Vsw#HL4#YQK! zHkO<|6JAD|jy)=3@Cks)8D6F`raItdv@RTbtl9!VYGpBOEBZifv}#Rg;#o-4rctIV zfTr*#v;~krNZMvnlc|liWPz!Mj+#Kpq14y5Q{&EpJfndcv>pszkAbVaz|pmUF0|X! zxsXD)Yh}0xTPYB`P+*2W1^FmFKx@k+Dd^b+lm$Q`5B`rx#7pgki9Q;x5Hl@&K=dP9 zAG+M<iVSROdw;!bb{Eg>-?!to2algj#Jf5+m_z=7=l8zYzx(*W*ZQJGXCL8z#R_-y zjP5i)`1av}^*vjLHW&M&o&Ik@5!D(=>{++tu3+S$rg(kW1*zHK%H_LnyDdJrbxXV5 zeC$Q`=Aj!NSzlkje@*KuBsPk%CLqR||JHY@X^vWqG=rjlrmU`+^?2!6@^Tved0cBl zM_o-ll6V4qv1A_gR9}WCV0}bgep(%kY4b2L%v(;w!Mt8{(0SI>C3*)%7oI1&pH_{w z!OqocL333N(XV8pnr=vd3rMZjwY|)Ej9JiJnTt@sW2OS0GE5jYpedIVtI8m<=V{wS z6gy(nYBU*kNFXOBnO92NPC*nv94+~|jXl&4+lXc}r+M@;YR1bm>Q0%t02-(0OBq)t z5m}v=f<G};_}`N5Y0go?-|L8A+VIfvw^;QQqLl98mG=hgzGN~nX@fG7@<pem`Nz7P zwU$aEnhHIXej>eiV!Cn8tFxc(96X$c67ad63NcBuH<X=YY(Aq#D)m{)x!caoQh=r# zq~3Hi@57uf=mNG$JJ}q4|5<8C->lk>eoDlJV^<Be19sn}`*vcB7jiMlEp$|gi3pL& zCNG1Hs0-sMaO+_RQ0K?Q{82SUh=kuS=u%U4f;g3_*F{wKX{`}%8XXrp5t<)|P?Mnj zXag{ZF0pN+3!IhefR&aQ)$K8D11=12AmbQbg$u)0Z5N8SHlp7~&5p`o*hvlUw+Y{? zcEP`!i0uqA;96fV{tnw8Gq&drjr3nj<u=%oYcAU&tjA!2X_<>qq|i1d<rX;TdYxT0 z3NJ7-p=}~MlkL}{z=*9q&)?YE>F&As5~B1`FSCy==wC%FRCUoDN`j))7bvK~eG9M# z`cRZG!$=$o210NVWPFIN51(WMZRW_5i~?Pm#BWJyOE6Wq4N9KD)I#4@D+t;2sRv2j z0Aav#`k^}>zq<eJ)xOo~x9<P+-KT$cd8EF=Gca<Sv)*;zr*}>ek?y%O{rS$Xn@rYn z8!LNf5^1Td9NZP}HJR>C#2v`k7;PKg>W%hcn{6VF+?&P`Og$c6RBA0PJN$VfG<UXt z_==IfmYM#V;NEqB0UXDfdyMJarRf*JX8Mmayu-N)H?W-B&u2UR{G)I0WH+svV-!1W z3l6uYZ`nD#+8t*%uWpyK=XUhBLK-H|(P}g<tSv3Rj^-OoGJ<!iH)k(W_uk9s>@*Ky z6C{|JQ-;|c%K#V0k^wldWI0R{Yv;)dGR<Omuq$H8I`Uvpqzw?m-&ML?q6wSEu!=F( zP8x}%1p#$ZZ3#S9D3)BZnl3E401j#O5;|PH5@nWr*{(3{YTQQZidfoKS3{rHI80`@ z#I6OF<L^A%qruv`wz)%OF36>Ag}+(|7TRREb{5KM#k8-lj5ck9{{+SsK)9m@X~;P@ z!K8h#jI4klGvav!PE_KBX#nSgLF8gnEIb>s$R_QH72B$D56yuEU*yznwSs0<HVO=m zzcg<z=9Mok83Hlt-tJJt=!P4ohg?BZ9v~!DeYaudYVHEU$?b>#4m)HcE3iFmrvGnY z7PLdQ=jL5LeOqn$Y;3EIhpY2S<Ke;R8hf}tc%Gb(!7+OI>K!I^r_q|nr`JLHVSjpl zNy+hvEwX}~dCC^qx~Y3?k^a-wVHoj7TuAre>(;|Ag3$Rf$`4C(q!VCn#<H{)hdZ*< z@Kxs44Mc5?rE+s-xUp=RD^@B~l?nPpG)qivi>UcRJrm3)Nl6F>N{DWgv~2-;0)@gj zQpLK~b8%!WB;{k0SqDRb%`~9#p^zhXf7THTD0V<M*v4j5wzN`%`|X<BLqk+90Om)P zJb$QGWQ-<qP!xK`l{U47VipHcTac_(<+=Ts$c?jk0V50el4WG((BY}6g{#3d5p5d) zlHG4Ewwmp%!+v<b0!oV=oV(^C&n%q&%}qajPu=l|ue`g&d_ki3(7ILj%Y7`K_Auw@ z6&`!BlV$c`UbQ<AOh0QhnyuaG*0=9Xra#}4@PxX9i=MpW-jgL>U@O!Id(uwBi<n2u z#u`8}O5+14R<Y+UiBttt81+7?cv9qm3WuiT(-LwjM+^x}O?-*oC-$dL=zS8RfI)!t zK8sPKG@&DXPc1)!&fx)H_B0pi{(vJJ+y&q_&`?(()b?0O>5_O-Q5~p1WN=ca$k0}j z)NC%cK-%eQ<zzHKP>8f)Q`6hiy&Yz`?U8`Xcxd-cCkAf+o6AaBQr*+PdapkkwaPD* z*k9t7Xxx9q@ZLxVc5utSLZUbw-v9b%KTSXW=E0EFyPNH2>rVY>|Jjev+Z8DXsNMp9 zd|zITdK*I8dlIZ+p;VQa>n1y?4l&(Q7sirRl$s+|VdG&^MomrxQx}jW_rs(qMq=uP zg0r?SrZr(aY!W8gL<~L>k@>Vs6wD9A)F!J|i^WmMm6Ix;i(>N%-GISMj{V@YL?6Z# zEYX7nkBl3iwB@LBR}-py4z#niidr0%H=yz%VqQ~+zlhuO%BqA;xteR!NETSq`r9x9 z7h40ht#fFDt9pS=EkGZ@UdLP$92|DCLKhL}HNbm}cI4D36IP!>!;*EyArcoAArCn^ z(Nbdc!>UPkIu;i`P~-;3W6%HR(AFb=eIL>;2X@xaUhI4Lw%vDBy4si}G0?HGb7A-9 zjr)2NSM}Z78w$q4R{79{@5`3@#_GeS=w`z!%zJH!-7<9bbsm44KYGa`Z>WE?ee1)! zI!eoXUG_xpaK}}NaL=yZ-D_J1oBB80F}V56oz$!usun8|eF}OP5eKivK65X)^=pvD zRjJ3pYABxcqh-~l@r?0fJ6UoL+E2B`Q{8%)<HSx?Bx*IEhPqp-M{k@kH58;2Nt_59 z%poP8>Jv>k*3nmwIasHDsWX!5(2x488ib0mQ7koGJRyb51-f~<5VlNJ>NgixD!92s zzf=;T=0+iryVZk6P9~OJKtoo&?XlSGIo*qTm!ciD4x;&KPiV}7zahjzwxl_LjROf) zu|JxVZ*x}osaP>KxT;04gB-ARX+b<l?Y6Z8aD)tPWw^Gvqf@XQ&%x$(ENsHn{TVSX ztV0Z2v;1FOSXh#d^N6z5{F6oz>aHK$v1{a>9s4e~%JmfL4ki%lKEHBc&}p%H&aRqm zP1IkM7+th=*U0@>?ON?HG`hA%4mA(leCu<oh6mjy2VfP?c~S1lZIhzhz2Bf9SLHW1 zH4k_8jKmNKuev$DZas?JjyO1e;}*RHVI+-z{4jSA^Xmrb8Y!Kz4Od)Sg$`d8OI}SA zm05AE6CX*uc3VWf^0d~id@wfBeI*)fLQ_4G8qu4s+e)nA+JNbUv6g`~DAA;!$0Rw5 z^N6IzD$P-xM_(r^sECjS(2-eZyM*TJm|PM-2`<hPhp~1gc9*Eb32jX`hN#ZI3s<eb zni{sL1*aPmTC@Ux%P}zlGW%$r-BlHyMVGPYV25(9q^+WMFUOom?L@m{^`gQXZE6`< zc`@j$66)39`~$*^b|;-B;-*GqTrTSnomhhORR<bM?I28r50EEdj}lC#seDehyhxuX zw{c#1E(XMMX8h0TN@3hSqie(bi*5|Jtm<5C-h21Di#FbV>1$0MQ-!ac1$OQCg_q49 zwg2VO_x@_z_s(2kEi@L+$}jVUTl(uRI#APcX~*h<mW!9wtXsbEj`Qwnyv%;lwHLnk zSIaLO$T8n~T|R3XSQ@<b!nz9*vt89Wjo<yorOC$5$lk|n`RTXz?wWmZqP{Gkw0w8p z(dTB#1Dh7)v+Aa{+Ulb09n+dGxTgEd?g?CQ`|#1{9Oe3)Hx7N6-^ve3Jy_ruyz-=$ z2RV`!%xi#_sSPpJnxW|>;cuw|6i!TCKw=%3^Ju{0;Tn?l0)wwlU}&hZYIZo4X}Y_a zCKNig0*tl`;YE-`Gwani-xf;1Ga&;Ud`io6{a!U;y&%sNq=c6-{GCauFCxdK2IFrs z)<OB6+B9gJB#Y;DlYj7GXehy7NCM>K(hxBdEcaRgR?P|b&n08X&T9;W)goXLt%!{c zB!z+r4nbgIZsWz2RtV2!=0#XN&9aXav*qlkuC^d|1wU1frhotKk3y~v=CB7`aby3{ zyLZGx78Xp8K!3?qva&#D9?2~cWR8Z-M%k?NrN3={?!fEmm)&5Lt}n1Vkxcx~jXS=l z6tU#lYs{VQkhSqDehc_V&XJA?pWhFkzb9t|fYx%BCnbkyL=WnMO+v*7AumLi$2zgZ z8cHqIiG4bWvP<e*gjOifsqwTZM)fGIl}J(0OQ^*W%}Wzfj0(!>lu_@wMnUtGD$_rK z0;&b=7Z;zBaiV*Z;*H>jvBz8RRaJT^2r(j*rlA9UKiSnsrMh~6s34Tq%8`7VVg-Sq zh)Bvv)mUvI#dIQ^_a?NiD)jT(NVIL~AUd$5Ed?Lkm{AEx)SV3=z>R>-6K;Wqhq>_o z82*K(U|lp1k_6Pfb9JJ6vD-#RE{k)q(*(^*lK@si3-pa>-mCzlKBuLPBoxr<<!B7x zAh)kZs)pIuy870QBZt4!S6X&UfQ8FL5gwM=n!$K${OoT>Zrgft$6!DnUDN9Gh26lw z)_tQRTxj=C^Mtm>yQ>`OYtl#G#fs?b_3XK;H|N~^`i_L@cMCnP>gEX6?PRy5f4DK= zUwLNL+QEH~JT%nr^Oksg-uU{JyZZfBi_`D&2ZR2#SC^z8POl^a3obdambTUKJhXG0 zpx>CRp|RefGacJp)wGaipmf-ZrWymHj0$Sh<_NVMba5i6FAU2G%|J6PhWQodu0*w7 z%F6R5mJ~$97h&E?ppC$UL5EbCOXm!JLv^mf5r2iXIzz3+%qLsrLZj7O41HU~V|P#Q zfM(0`0)I>Tn9r2(c?J>14};Js*cdG0<~vRDy}{S{$$B>HY=;swd6Z(=A{!0oG;tQ* zRkEkAK1<3k7e#%avz@XrecVlWQ3tg5P8pKetZv7<AI#`Mm%$T(l(`bGOk4|UE|h{z z#g%w-Fcb-aVAp9aU-v~W5nmDi4b~Hh!;BcsY61Vy`Vr9>3W?x+EE6V+d`R~q_1~nW zI!Z@YyIKQ-G?k&=oIw7_o74~xDB@*SEZhbR&WW{|cq}l>XV5E6gw6s$p&T5MjY9vB zZSB2(bmfmnXE$E@G5g@RSY0u#jz(8QP-yJ~&KD02&3QF-s_j{W>&)QF`@QLd>6cn- zUVaJTCYYRv*5u^GBFV0`%{$%Emp6S&##|qKaE7}L&w>vQ>QVR{5<;`NR5?N;x;&!F zr?n!ya*>$4kuEk3(XN;XeJt2IfvGe6Cz9xGn#oBH)P_k`$}AT+UDOG4ZK?@IlY>c8 z{VYh-l*B1=1maX-b3iM)0h1<ZnAX3w=ODAcwDL7<6LMABzqvF0eDb!@8+xqHg%3Ec z+4t{nF_(AKJyz4^>(Z+pNT<67jlR{xux+%l+=@0Xz>F4efGu+1phT-0K;%v@K`f&A zn5~2(YLy6^lT{)Lsj5Jm24fTyLsU~EO?8AIngn;ES->Wx8f}_Qyv+<Oo~RDI0U!?1 zW<=vy9H7RLu)u*2<omOrhiEyrw{=tM;c0yj?AkYA|Hbsrm~rrq`&W*fESl74N1`=H zUs`$a*1q;Va{A-f_dYQSzVq|iN*`Crj`tZJ!>-9!rDP#_Z^Wn|S%b7k(nBv<gO_y0 zQgy7*1JD4tC3G2+OmH``c0^lsf-$iULn;Hasags-dDwR(mMrCPw(X@rvPoQiE=JYH zSZa>m!k`>i;Fe9|(^$2MCgn5qOEV&=YH_4>qt19KDyR@#K{H?r=1S@Ym|qv-q@9c& zqi`|p@+6S5MQpmL4m6RypeML#bS0q$Fl9D2U<w6pd;Bv2AW>bGdSeKXb(0bJk4-q_ z2C-4H)Cj8zRI^XF1zZo^-|C+3t~fA|{_$-?6J6t7_Mj_aw3NE0d%Kr^+wI>Lj(VW# zsst6(HU6<oV=tv&^0fS$VtsHcFq-q~Uol3XHS@It<*xKw`Np6<peSoYo*jzPZJVyQ zO*h(RIohU8dO}Jzk@dBrG2$TPqJ|+nPmZM`&L#y76VchTBZ7c75=6r|BUJy+N@|#P zfj1CPQw9W37-=2x1xcbEr53bNomHEOHmZoF0(wIPteOpNRH!!w+D{Xx&g_Ib)222+ zm7GW~^U)lUR@ij_yWx?lKwMA7_GF<IQyhdxHbBQZ9`WZ^H*K2K-TZ{%ze6NU|7%@4 zS8t21fxDWO0A1bc=;v9NG^v_@WIC^!AKQ6Obw!ztN(Zh34muZnR-JT@lq{t>uf^2F zO%+}Zd=*Phgq_Kvk1#bFQKy~Og79GAl&wP*6`_hNAtop4wForNaBUNFk*Y|ts)*X8 z3QVJdtFVqH6nG-#S%T3F^;v=XlnHGhfm^D-X~cV$tn`U+6B<$#WYx1sbQqu*?b9VN z0lYyD+Gi?Fa)Q-f5no{EYNH_#j0Da6f!2HFf?&n;*Is`k{UM9K+xA;$slip*nEve0 zqk;b0hWGTb9`7`)qU47;{tKH7Mpxy%cK0D>ef~q{5H9kA_aE=NZU0c8s4Li~d<6b+ zK2mRmcT{uZ<RFu>rIbc~a+2yCK_i!pHIpDms-dVngwe2pM#CQAHc55>0tJpLsu>5Z zZ`T0;63PP;e$*i>5$;1|-DD_Qscu_hwDhSt$gxfbH5{0y#`32{ghya@Ee~O~1cE@+ zYh^;4(SX0*RDFaEXA%~KJ7{Iz^NnuuLIdU;RKs3ci$-}k>P8_bB}?aW5inY&15s#d zkpWIP2x1O{F~-;%VkAY*0wyM_qdb-Fo)|B6pYZ(iQ$J^oH{-Kab;@<J(}mD6^rP;* z;DejOjaxS18$1}9Dv9Y<&sEBD+!FEiq&h5#X+G2;QP^sE0N<rd1<_1vq6>bZHrRp5 zoozBp+81B$yqA&KACIN)<=x`9FOiZ)`n?ADvVs_<{V9)F7)yGHzF+b{g+jc97Yc3w z`MlyKygBGT^qXzevLpa%!0NV8RYcF2(nQ6y$Rt=>F`|~1G{$U9NnD0jnv-dZ)bhQ7 z!FXwNz&U+CPfaE@oxLk<OFwe^LY4@-gR^{$JtS-%^)83;+ZTYqL130@ZCvXH{bZ;G z7EdpuPK(p~BnvRQz~XJQJB_e-G2ub>*n-nS{KyJAOTjvt0GT2t5y=H&VR*qje3D~g z={|vEcuj$Fk)+KA9-+?1Jegc>HB7kZ+<RuM6GI%0R=RoO92VOVf0P1i$TTD(3PUw^ z$7fFn)31Mz8t>tRLsOK#!0K&x7v{}^7ma#1V-c)NjTEs+XgLHWn+C$3cLU1<SPMgZ zBwQ>{P12CWB=E6)56>teR!@DV(f4B1WiCx0iRPQa*nR7cR5Dlm$*H&Kc5EP9@X-tl zTn&iIU<<|=SPXHDB`qvPFtv*GBsH)|CS7^tCtM{Myz&HVWFD*mb8exa<HCZs#_UvO z<qTCN3&57tN9&?NWHRfoJZTM4R35Dr>2m~wlCD26swf+RlTAA4TY0S6?G^*L+_3jN zd){^S4bP0X6y&)}QN+R)yvuxPtCWO<ES3Q9k2+hYw#~1Hpb!@3$V6twwJO+5MJ-X5 z_C!Pi2QY`H>i$qJ_U)+it!npETGao0HTIM=7L9e!C#->Gj|g>;v?^#&ASsT<28uap zL5%qfnJ_8Sc{xef*BX#D@5Afo<T1Z^>C&R9t6*|<z+iYaebQ*P=ceD1o2})8CKGgW zFISXswa3(H%ma&n-DOr3xI!ZfGR)Zq{4ydZn8eNg@coKX;VI9{#d?dua^}}oW-};f zKf8MFqyVaKkoQ9&(<o!B3Yp1SAAgG+oYC2G_TR6Mn<h-hkW*ARt0vCv<mWoDUT_=g zG=U8sI_?9pUfnP-4KJn2^y}Q-l{HkEO|+s(+pj3zmk0`KmtZ01t#5)ZI;As_ChN+n zOkD_N%EhQ%UIq8k4EHjzl35Ogk1{_&eKgGsz_<!%oxBc<mTHl0%oVBEmtAO?GSk^I zh6WG-qjV1T1L=#FllmtzVQda+FA$3qv(^|wtz8RyuA{k&ce!0=KK5Gabc;*_$F81* z;(Rz>llHi#7kxgd6G6L`M_Y5vQKNizpJ$rcS;qEE87p?3y`m9Yy8psk;*L_hj+jht z#QY{7JCVBd8NX(Pw<@OYCeg4Aon`378!)Fa2x&~sjQGWg`p7fjt!Z8&X%dhV&5VwQ z!9pZt={OZ54L*GmBJt?%$DTZV^MlW`o#~H0eg%S{-q&AdRfaupK6mPqHy?lgztXE; zP5+#kUw)gp)BgqE$|aibZa`b-Nwv~`De0hwhQ<p<hNPE%9(e{t)HMbN?f*t#!qkYE zfSE9d0J>+IMonqLGG%g_i4Ld1O{kujYO-oMcmd4Q#3apxRWr>_ARHoUYc-`pNm>m> z8fAp*(86VTCX%*cv=<vdXwERTakDNMLyI0n2iU$uuX?g4{>8!3`K{n{_dPPcu+d;o zKVACEmuH@RbZRr5^D1{;w(W&7Q6IhOq`XeFRSc-P9&@6JphuRn2_#LOCe$gI8jq+m zrnDJw1Z@^x*?_o-B*F4*kC`ncUcbI#RZF9#9!qQ9O4P$Nn^xoi5F=rQBW3i@sExwf zr?xGLn#-8_&^(h;I<T0C|Ird-HGpTt-UwKs<&<sqm(4k=n5%Q7Zu-hQhL0VbW3)K( z997oNz#W56eWu&O-;G^!&K%B^v2U~#AL#Eh<mMF3EUB1%T`l+)o)y;dnwI{rAQrS? zBMX5kyen*EuJpH3ayEHcG8DBz=mBX3AOJ{K!&)fWhSG1!W2w2u+0`(ZxnwXMS%b;> z(*}bbmBL^;@%Nm;NVXIVCQKU$i5t2OXpE%Ih3Sly)y2eF#P&6W$QZER4abZmE!9I+ zNhoeH;>(6Fr=}GHcgB)(i_5X=9ShqfVp)L19YTz!`j_wT-f>m>)yadfK2C*hE&1tP zH*bgxIJ!NFMu*~C*1a+`+wNQ0X5-JT9BNNLI+}iHlGm65*<872?e!R-2jcg3MV(dl zp;fyAakvWjUSPZYHQ3(_={_l0LN#rrE;$|Uf@)aHr3wv3RNv`Tp1!<VMyqy!)CtAO z(^>fesgLo3as>FYejb~oGfOUrH??U#^u=Pr$aV4Da{HskeCu?t2#K;QE7SF*HQ+su zazjCx(?|7RO{*@b*^**{e8>%z$~u?@<O?us17(nkNxP1u@?(m#ymaS%Lx0EI$8H)q z3O<>9t1(m(eO6t&<C7EHSN)CQaN}QFOsg*M>s+;Bm%9Im&&0dmG%KH}fJLu9vSXjf z_oZ?EjA7jHB4Wg^W%6%mo`T`1f@+20@*0dpA~u|aRujCZtHEeN3_p65EyBPueHCA| z+L9(SD9943BvNRCltLo{=>R2hN?I{#Han*UXiwslw3vw$7d<V;h_o1bd7v8&SXHLl z(X(6nF`Te`N}d*hNFcbpE8%s6*Tmy6h4~%fe0PZzo1U;z83=to)jx4#ux-IsuB<u% znAoi-4_<9HUcG2;P#>c|l=q-dHiBwQ_u6$Z5vmNxf@^LZ8wvuL`!IEOM0K7fF~p=Z zL=M_X+4GP;gkpNirjOaSM!H}_A`+2nXd$QWz#45Sqob-ihZ-JdXx8thd?CWoMDM~& ziqK5VZV(TXo8prL7ZI~z(4}o=bL4u%K2aIF<}chuF`D{L&#tRFGSfaix7-?8-`BA! z;lqxF)YQuO;N$<O8oYlqn>+P%`qu+nuTHq<&e_o3O!eZ$+@%BcG7I>j;C4>>sZPvs zA!?Ragb54k1c|>$osqOkvH}CW3^eFsjYSRF>Ad*mxk#SHLckZaj^%RBcDzCxxZbRA zF9XOO4G*Jrm&~b5f8cPtLf-U$8FI=+5}Sa;%e-ZIph&Xw_s;$+_V@6rK8OxyChfU% z`_Hb9_y+j>M)RUbc0$IL99yo(T$_0(BVnS8(b_r-c}YAulk7gP150rMU?fIsw2hKz zi6fr)+$Al5KrQL2Cl+_S-W*OlKC_VuMiB!VD`2R_fmq<e(Uj|@E=Iu(k!?-7tF$O5 zk#A(BjWu}b*5F!2S+L0YTX&+v{jkMS_^@L2I{g)Ccgq6I=NGo#4P33b{Dtq^j0V7m zm32PcG`${Ymz28xfxlbstSKtWqW|)O`DaH42H3v^<v@BGB+UBxBmFUDqMGF9MQ4A? z-k9acH3xj*bGI357o7bL+PxJqVgz-xf!&;05t%PQ5G~$`!AZ<n*XXiF)=PBtx+@~; z@M+Bp%zvZ4`WXAk8)iKcxX`MapVH>If3KE5b@IhiZ~i~*y?K0F<&`&nH!YTB`D(W; z%d#xXvaHC8B+IhA+wm4BIF1P>H6etMCLuIrC{1aarkRwXG=!xT8kP@qXi6z%7~Xqj zCD62!CZ&|=Fd549M<}JVr5)ZbL;KD!{Y_aC@%x_V%3DZ67Ut9Uk6#yCx{?*$^PK0L z^PKZN-y>_6SIJ82VO0vht<)W!(n)n_*H0dPna7Kz%BAvD$)#p{bjrkjmeNm5d7Sch zRpV{XJ@bmh-X_UYLHa{wl{}SQ)k>f6{L3!(65iZNZ>Eo0Nq>IuxnKSC74{O|d>Oqt zhwHP{05tu^gvOO@4u5AwZq}d8;akmlLol1e-_c8OnLRd1S7NI62kTn1on4o%ylhpe znGQJf|HGf%+gJrQFbNe~zhM)L<r=8L;bO4qSo4PF_CBiKLGLU)I#aQ=fOHZlfi^o= ziJ0KXeb~Y3Hn%~lCC%PPr6)K2Ekocm;)9|*vAJ~#-Fyp<)ugVOG^`KH#_@+j7QOFA zONrj{McJZvV8$MA+}N+^yxqfHPwDl~#s|VNzjVXWUrVw#CZu+mN+o$ugV7N1TZHR} zZShF3wAA1ag+`-K>5YdHBdva3x~}t2daJlel0wn%JNWW{#Mi`_UBMg&gA`5Nl@=^{ zgNVxtzwPTb=>!>5cC|^o28Uxnk$Ly`+sn<xIgx0*jLMQ!n$7&tXa&*JaA)y@^f3#= zwngCI4ncoAL9UvsA(tP7Ps1RHMA4*EN>ntrGV|3HSL%<cY=Qs-w7ZbAVeN0OdQ?xV z)0tL=|KrpqczO-uSF~&xn}f`n-T*wqOl-{@Stl<7|4`iP%=r2Fl#q`Ea3n<y&t$5o z_d6;~Uft9@d;O25u%#}>Ha2R1e91>l$$KT?^^w^euTbJBtCbg;3Qs>Y-*Vr>56gYF zfLS-a#f?3E$5{+Cf@0rB`1(5T5-w*aS%7zn)iiUc0s<sf^mM!uiYwK}@;>Ip*w70f z;a4f4YeFH5#)NsT`wiuCg|C{N7+ky#T4~oI=%ZS&9w`X)lA}%$0I4F%puqrec`d-V zR`b8(e>qwe3m2qd&!5J}!j+k{`9v=`$po)2P<U}`ro|^1O>yxFL3Y?$Pk2*{Cp#?p zs~l#xsE;1j-@8*Uc*%B;^ZSIgpm#3?Z;iso^LhhUi}pJ07q6J(iik+g#2JBz!bA_s z1O^x!Apk~4y$~%7`U5uph>s8P`!HE5;^=~iAO%(f)~#bT;Ni2a0xyme(&EFa0(-Hs z$>qlx-~R>Fgde)Y%-hX!^!HNtVEOqLh{f*|3Z4q1rQw&Z_>6p3{w3vOhnD#<L>C1` z7_JMD&$rBScT)fFVYkU%ao*wqQIh)?VXMgznxjACe^L1mCaXTojt!ZX3z5&#yByvd zR$af=YkOcQblwtrV*A5B{nFLfXY{_uuQ$%<ki=xPlKY#pL0X_$nGiSBanhBXYF|Er zGgzO2tH<+;5S#&9({(K0quDEh!}N5)O!;81P65nNN2r%?Xc=+@%iHm`9+<9khHAjT zQ6UzAIU+d&&S*HOP>-0~bpZnB1Hp(R;Evp4uJqe$OS<FXupG9=x7z$6IigFQ?+OTi zigpW@=k!){r4Bfov|j$9(Qc|1>%rf{?49%$TZ?{fl>5S2tp+AjEluUS44e}SFoXqI zMvzyv2Z^>Gt(#&5Nt-cR2uOIUKGGT{KQUm%$fh(M3P)`D3ZLIYiO5r~(Rr+h*xbT$ zSGDz_nMW6}7N5wDW;5d%eiFa&zw?&;n~`i=L%6LCAY1l(TIRYHOy&dJGH&l#$$T`P z?`4PufR6HuS&5ui#^TD*u{lTtWO!&?19BELG+kYUZLl9AA70Ghx=XD23hx=DuD16g z@*Esm!VWj*yeI4|eacXN`r;A<YcF64_QsoACe!KHK6c0EO(VnSy8`01o$**tPb|@% zyLIFG;lYit(*kFD@3_u{xbSjx>Z5zofM`ewuo22RKSf3*wdkY-Pba0_kh5*3_^1c* z5k1In(5^Qn^H<sZ%^>akNQwp+0Zl@~we4(%k^N$%Zm(iB@~beJo>$OeiAkO4u)GWz z-agbV+0Z^KCLk%7$?7o9N|&(4XUaD%Pg1KhdL{B%Z80}tF)yQvnE|}y!!TdV#$mp) zZP;8ou|?0ek(Vlm^;zX|&~;XZX_wh;IZ0$q&R1ELQ8d2U@(Z$U7ZI5~HNR3<n<21p zb}$jjEaIHg0i$__nX}sn!pCa#fedS17LkK7Py!H#1`t7`S;^rxP{cyn8LK13i#UR` z^H$IeNv4TOZ#p6roX-iSU_A7Cto$yywzS@979I_67s^)F_T99%-z?=H;47Y&1YgSJ zjt<7}Xy<o?14ff*3hIfuBV+{cY#_X&qwt+=QsmiKU~tV!{UhU&6f=US!RO~YD+@3C z%XOIaXpGW%A!-tgT^o6UkG2Jkf*z0|Nt%4X7)tfj#0y9KwNW##zpX5~Rx-tcRfQud z;TMJ983hv`o}f4oc(1~GhWBa#9ak<$8c~VW*Wp2~lyre*#^U*;1~B3P^eOJh48c5A zH!PuBgZf7_R4zajgwd7RdLogpwqi-s$hP*Ba#E>NtPIxGFKEKbs4_ses>Mgy*d!hP zkirK^oESl`27sB!tl&eeK0n?{6G1IlN*$tWqV%2vnV5$ggLh)gO~uqc5)U*Ot_76U z4dx{Wu00K)Z0mi&P}Eb^J-%c0@R)Nn63_C_n9Wm`b*Ds`J?PQ#TlIt4zKLMK;p3y> zA-2yLCQG*s^_g*yl3g$=3-hW!L{t{dtR_@eu6z{HKvwCs=7yKhe)$Vxv_xdgW~2WL zL2P|)Zuo!R@GbFC7XOz=e&LS8Zfff}&eroc|M#xvMPu4}sso@2P|&8b7+u4E$yJ?q zX1S169WYyQXn7;-!lC8-7j@U{sbzXi$Jm<w?*HO7o!+AZ+8%8{aH9?_#`+r3#PpZI zQ;PFWS{JgaJ@bxQ=fAEuo_y9~`&D`eYrB+N0oL3Lw7|+z@C>DhlAI#{Wr+MSfZTmd z8AzT2DhmgQW5D|mvs3ooQ48yLLL&Dpu(K00R(hBMQ?+*#7CW_U1w9@o9T-FF!e4N2 za}?`3^tE-x-xs0>g)g&X2e>Hd)N$T=AnZeUINsXIelkCdJiZXpO#ovT=Po@1$_`Uf zHIyA@XwDfX|9+qywWbl!ZmOiRmTGusg|&loV^vKpwRL*r-M%lHZDmMY>AD9kABe&e zf^$5SR#&Hc9cTB7tZykrZx&>I!C5j7Q8;t2XMLk}XMLmd?fq#XhM`$&?*8B#_0L*u zx=$ZlQ|&&H(fyF_GfxXjf#}(-=zJ4++8Z61XW%~gR)g~m8FW}g4f43q4qF!BBH%W; z{j_&Xb^L{?d`L4=RKHGAVP6fy7!eY@6q<{&Eq{6#=@d>eU;~IFiGj9i6{D5GL}PJQ zP|O{*GHj_D2P$vMP_=;IC1)k7_t}Zl3afCxw*3Rl7<{0x_@24DU0^jks%u(Nt-X=U z)sp^)p#MN3rs(W~iZ)P&`Nn8%3TIbNYdQo)G0L}q-k{*Gia4UmXm@I$`nAa8B-=m? zUp);NYdsC6s(^5aCxKu&s;vfYxWuYD*|DV&!;h(o7PSI}gv`5>S{G(}LagGcnnF7H zU^+F8OXh#K@r<1z`}Q#yGXKt4;mw);kiv6({^S-BWo){i2P(wkS77jT68d;9<^EG+ zP0BTpfT9pe09}<3kg_O6O?+z42xcZ203k~e$rW;qQ{|iiiARhyrbMI&iLHz)O~>-p z>`<4hZXy{~2O+K|hQw<kaaC*0eZ{uDQEKk%83hSWu7f)GdOFbNKcyR`K0i@A8;amo z&`$jyfq1Kdpr=#4Xgy$X)V1_1B3d$P?HkXkqr^8cfOBG$)?gG`pd_qQ*^4fwi5qG; z$jVhSL7`kkVL=s|(`PN;kK{R9z@NxXCoR3z_Mq|Pq-Eg~=Yj{6?mbPa^7z_0n4fb* z3X<($SV7$?)Qj9)2&h&T2c3i#tUnc65JU<LEjU%~^ag0FpABFTu!lK*ZU#p-A3k{E zw|AIrW_iKys5~<Z9-D_H6!sN;8&zLs?_>Oe?!!lrqqDn@d2Z}9_fhDB6HBl<ip_nx z`?z<m>zY}Qkqf$y%G$HOk9l6|boUWkdbgwMhRaazus<+-I&`OS_eq{<TDK&2FKO=c zr_e1W9H*&1WHr3Wsfs4*)kk*#l`k4$MOx-6o)=jnt@5h)W<je!6{%i;R`+xIa;Ja6 z{2N!pNd2jG0Dr1YXrt8H#ZH4|J-rDyomh4TBhG*;vfJ$S+pxbE&K4!C5h-<=1?PWt znvIP7H`|M-InZ7Va8ZnCeE)6)%YhPM8CW`K)Imr@5IKVj#q1;12X_t$)#72%vzOo@ zA$()_UF(B;=F0WX`J#diJe^=>ss^+5gVTuQc%kj0w$|mX{A3%2>20Tz!7oqF{R><> z^3ECfW-~X!y~^cM<a*HapKHMb3R>W3kaEuTke^1(n(H8c)R!WLBV5m0!z~@?*#cyi zS{G4vga-)+;7qJxdT0f~9<MBkE7@bJ3E}}*ScEJZm^)V*WYvW<b1<3rPG=z%uT0WX z29whSB{<0~#h(y;TCSx7op4#z3&f)8gNIj}VtBL=bMJwJYQ!7-F~CEqRVinJ<HsWl zuu+UIfaRA7vZl3)6K`5EUkq#jczlZa;(CNuNE8E#Th61Wk;X38u`DJKqtm%&p)VEa zTDoiBlfr}l(#=0iX<^BTw6GajVGIQ9f4JxM-QiS3+SXaPH~J;>i-kY%sCF;9qK2QG zNhoJ9lJ8*DedMJVUJ?`W!gKy$)I6R4?dA*l#N+xmkRg8S$1m|9{+>w{Q_Mj7dmnJ- zZ(?bxfj0P9G42G*RL(`q#E|9<am7BPogoO&2t5QgQWXK1VAF3wV)vxJv`ltY`f8w) z;9F6>XrKjHt`u7q<T{*nzs@Mzwal)|hIYB4vbr%_gV5-hy9m;`qIle(-FJnk?VeZ_ zNKwc61DEl)0-*l+EmyR!o>&85a?|7`^~>9r?=KVzBOm$no<|!=Q=j;xuxXNcnf9B) zf7A2*PXd=L`&=InfBaVeiF;PO^6iy->Aop11S}+cW`-LebST5HpAHQ<cur`@Aqa-h zkZLV@f|LvdLwLycu09eBq;cVpNCF<trcuuYAX(U_<xMred>(MgnT)CCv!~@a&g8i5 ze?*Q1i_cgOFe!E}`p|?(IQdzm#kmOanb~t~#rcTvE3@IkwETwuNA(akZAK5<dip;+ z5zdP|&P9Z;opfTJkMcST*sgf*Ns$WKGPbATdox@ww}hKIqc&2j_2N{%T{}nj!v`b# z_dd+?RBP0OvvMcgO(;nK=ss-jAv_y89Txf`yrEUYLaUuoxRJUxbhl=eKC9|LkxLl@ z%cow4E2=f~;TVHcxb|~diW9HG-{XJG-)F{K&qJey|NZ`0fMFBCH&cd{nBa0v6bs<o zsf3fcZgTtJ9_fISu~rT;bRvY`d`zuF=Ay2doP8ZS<5iMn9R~3{X)Il^Xkc)J$l5ry zBLTUMkpGysgQs!W=ZIEZKW8)l_Pmgbx=AVS`Xxh26?R?#h*9gSx(V@96T0XgE>1is zhs@9c;~{74!ejLPa|_KL<TjElprX2bESV3s(luf{#s$`0hj<cQ3~DeAC^N?>@QET4 zZ8kX@;}x)3@XXD~FF@L+Ho~Q|W;!a+nlM8M+-g%sUr6IG<cP@uLl72Pl|)u)wW*Cj zx*!Z9OwgJ7kJ-d(Q0O7_5v{B+OF<JxQ<gTw&`3DV0#Jm9{=Lcck+g1IV#_^?eFuMd zd2PiNH*8$Be(|d<?KLH{4Xbl$Owg5RXdIWCS1ez+@p1l#h0huJRiE5E0b9WI54NBL zQ>B(;;8d=eG%y1R#*(=K(m=HT_CW*PHA|s^iV?Zt6!jueNN$EX7>_G$$J9n>WFzA# zY>ZPbqp=O<fP(?x;;Ih6K!V8WNMX5th_g{vO$aza@m&saUJS9eAv=LjZEj&06`fUG zOvJv8AfXy#wb*imqEk+9Y#~$aJ~9boq}r$0)aR$*ynq-Ukvz6H!us*d%Jb53Y41rp zyzt2j&~%o^F5E9|hpq>JLw%6T#b|XXcUPaxwbAOJAq9(thLm1fol`fQ_s5mgF*S%K z3bJtz!3L~BHxhwCT9FhMOleIjL0Ju8C8#gm8ej(r>RB1UrC<uW9__$_1kkmjtB5c{ zf}&N<plfBOSAA~J$|-u)&(L(pu+zNQo?S;BJ)K$T_}b*$ZuY{`_je&`@A{xVccJoR zeuCNNM8;P@awgudH&}1jatw>ib<<G{ogi8IEwia9N)^b1N#yk@wgUR(RAkvgBPCDs zQ4D3neh{?%u=E&BEg*W%Ug{q!QadJPl|tSY^p8bbhH&_gX$P=aJRj8_wJ_4Q^XomM zO|)n!)~Tx->x9V%ppO}{?T<HS2S%1*)2LA#+rXxDmJMnH#QkNbC68KrETUA3CbhtV zSaVBn-w4G;3sLh4CYRzNHX*{BvuaoioNZ^D?kOYh@w-3uz{IoDt!)cTvH_#GpH?<} z@=s6Qu;$_8f4bo2x3lVv3*h{dg<f=VFM->EcAv)Wz<Pz)soepcP}|Wb<V^+~@GaV4 zXGT6OYb;8qZQI5faSl5TWh|;;4}0)?x>p;d=X#I?VNRVIgey^E)+Zg_KxK1FD{IcI zw&g0S+=!CE#D^B<oUW9$*NIkDGLstE4p^+A>Try@4*}O#E5S*ow1btp6~7%;fcUkx zySdJ(6Gk<FS!GU94_*-FlW6)07)EBY_n_Sc9E=_7`8DBDI4E!^5KG9<d13Hhx_)M{ z-}vAYd$v#bO1+hi!Op%lu9i=Z>z!ulh3gZ0_Rj71M(5@qUjMV-SyT9DH?Mza%k^sK z;3k`8a>a&Eco$8yfp~>?SINQ0pJiw8Lc$bcoc339H}K_LZjjbvEv(_k;ra167oi`F zxPB9i;yCSAuoW!B<8=2&$UvTwwEj~>TA$xyqDi;P7FpejWeI7|z*<aWCoYFkynG26 z#miU1T3#-zSK~d}#?CFenqF80;)~qXi|FCipzTw);m@{iIW>j-65Et$T0TyTayiY~ zRIaw6YoT?J@%AmUDs5QLGjP`rGCJ{PYmo^I`4%nNvXyPab0?{v!!AOdE5y2k0HoMu zINy{{cNy|?dF{`KonH44vC4n~U^^N3=`O|TE>5rour9?b+R&x=_Rcv>_UFb=FP=n5 zb2cZX(UU3dS>9))aM1WQ?Ee(EhWi+gX*jHBhDgLVBy;VgZbS5=s_2U`R13a12vy7V zl3lnGZ(J2uFUGItxOx$OT?!wunV{<GI>bfmWHt+<9}oLw)d`&mL)F5>7Sj_3)fLq$ ziPU+znUwi&Y9`I4Sl%y1+%ebU&(;yx9b8tMtOqi^LrX5Yg4u_Do4R}zwz|`r^HveL zBMb=`UzHU6xV`4mm85}1KYsBlJjl@8lw9lbE9k8k*_4%8)dTq9eyg*qf88c}_m!C5 zWk!oVO;CZk3E&ZhVKcp*MMaVWH6FTpIxW(_uhZTlP!P<9CZY!)G<Tp5Z4xv%v6kO5 zJd(Joq=Zzbq-1Rpv+tfxtS#Y9)c%VLa}?(tvv<hd9lrD8Bk%AvKLJU@KOG2mek3TF zM`NFU>Y6JiUU?)^*>I@vr%zq+4?FG{D$+Wz^IS=yM3V3WX6bi@0Dm*<h@EqBZb$5i zhvJFq)=$UEdBgX$uKuaQf7X|}8Y_5n%|-r}exIZ9vPJRMxD=nJh(Me{y_EldT~?!s znqQZl?z<XBUL0)am_(~ZUqEEj3Anl;MZ1b<bn>yGtPBE#7`9Uhn?h1YhdJ<XnWw2z zl;&j4%+7D-cI+ZB7lJUONW988wm35aoD{i39VUO2Sjt274GVe)NX7LwOl#oOSO?zW zEJFrD9>OEbBBtrpR6BuoqVXs!0{DDR+@Ab(^7e;!STeSKYc}8I+<5*>pSt1k4OdNg zc7FNJ8{d8Oyjedf?)4PXjPG<9JqUlrvH4!AA&buE8pz!2ZXuaBka5F7ZV`eU>oQ-% zH2o7A571zTj+>fdt3eNnQ)sv|%QR>S4eg5%l8CGnpjyE-t%ks9rZz0Yqk5pYU^iIz zR!gSHWOOQ4)OigEV3VAlxP&DD^)eBrikTIgwl*y20^i`N=}~Rqqd66&sy$vOf9&qw z^hkdo__@Dh4623ns_{=;6RZ??;_+!a1!rpPl+xyT-tdi!Q-dSc{sD2z46Q2U%Q!=I z8<F3M!h_^2a27<Br18^$Qgynf6@Ui_$Z8d|w8%FRNwOMN6?)C{I*YTEa7RRJQUO>$ zr~1JWm#?&W!x6gdEP^cNXL`=eBHBNv^X=9%FpBEdA#d}GuxxVFzq|dk?4qPg+P!vj zCNOM3mlzg_=<`HkLpP*yHu8vI+h8Oc<;N)4C1eD+c=B%T1ca%Cjc{h3YTTT$)Fx1| zU2y|af*6=nnJC=l6?H6}1*b8XjX_JoAx#Kfst<!5m9;a7XS{L#zejgP?i?PyBfNV! ze1`j$ygT<)ZW<liSb6_nz5BxHZ=CX}u<1Iw?+WBp!5KkeC?gsLckcAfx6sXFehFsg zG2VzcBhJmm8EbAFbWJc>#F`6^O4W~30FgzM#*y_91rKYSvRd<;&RE6ZXKIR?0{mc5 z0}0?M1TYtA^8xIuZ_P^M)ic6v7}#d6P>%1KLEW5*l@**<g*4-2UCB$uE*oT&(YZ&o ztY(csfcAu9N0yDnO8JJa#cmv>8nhB;7lR;mVbW->p^GA;h6I&3(eMW)>PB5NoK(75 zl`}u4HCl|ZA!T4~&9}@Pt&z#d53y%c)k6a~f6r3sYuFveq1{axJT%y3$6&j-sGcI7 z7ArO1*VxpHF2S<_Fv3(VUP7@thQC})Chn36dRrfn_X1}=Rn{^%M2g#BMdD7Wv*oJ& zNqU2uG`48<S~BND-b#%%GyJcOQ29CLP#9lv&Bre*yl@VLt{@qm;er**>Z}`X?Msgg z_yW7g4vsvOIwy|T8ERObw|s4xW(%ilh~VVaWw1Y%ac^tPAvBzpmft_SK^W-<B_8XO z`F3+<Bi0{P2P$!!+iB6w;8)MJvl(*jNFuVnx7uSwaj&$2qPmRUQ;QKR;9#ffHQKB4 zi?zjHEUR`bzBU_UD&e$a@im@x5KZM1>`kmyuB?_;QvhpZR#|GzaVA!PND*<N!H8>i zYt9|R%o;4bOzb8;B66N`IBUq?;am+)Lj}_a6UhPkghrdvK$xvl?9UH@#`oFTeVdtG z#dBr!m25k2EgHG&PJDZ23D1??SI~H7bridGatFCw9a%smMKmfEn7zE!Sw~9>)B>&h zoUjdq3z!1g0$+gqml^A%k=+$zHZ<N9!?v8BC6M))RjYtHAK2r3Tw7l#QG$^JCqT~3 zxEgdwC+{!8znG$9kQ%2_NDQlHMJK9SMGRr^m|+@wlZ!7z5Xd-yW3)Ht#&<ZtoD(nY z{P2$d<5{xQ&I#s@d(NJ)mbk-?i-Wo~h%FM_l|}pvolG5=&_~_|Tn;G5G2|;6roh0S zi@0f*M8F7`b4Tc*o9L{ok__P*K^N4NvAmR!3E+<-LkM;gWQ~Xw45FDAT<|BGFBiDf z*x_%Mev*G|4k(O&`wU!^x>Yl^p?B~7AYw`w6`l*yy(2Fk<u-7+GSW7%{wcO1XB9Y_ z;1pPF<va$a4+dt%*kq9%ti^iVzmtJkomSj`wH9fKV4qaWpd6g42Qd}ZaeUS(Q>n`h zf#Ck#G-IkrtT}!6ouG`%OaoS@CE())edysL&1Tp1ZU1fXd$aYMwMpTz&MOPM7}aLs z_32xly1euHlen2KnYN*XSzU{@9-^985AK+an_`P>O=?U`2-^{FsSDePhY80a@ON0) z7Rgx{7S)2)&Q)7z;j3vIS!8tqwvk3+p6g=6M7qFyo?F1&>;la4WQQdS;xWZVeB}G3 zQb&D?K{U`%r9(=RQ@zC6-$ljqfORU;xrh!?v+BawYBLuAE!C3}8CbKEyYR2)0wmR~ zW?ID~bPXN<;)P&G34cKHCm+_&<+)rZ$=^w8R~(Tr9p=%f1Yo#`+fj{WXdOTz?>&|; z)z+bualDqwknx;(2?+a$LakkUPdnS0?KJf}!aQFD6&l7KPs0;1kx7YI_ZtOkaA7wj zO>QTNRj45CZKvcv_&w{}dT5PQ5f1JB?&tg$Lr800=ZlD)3tv5#wV3N@j{o*T)`H^6 z`x%GoFz~CnGts9a=SBntYY;<pQMsJ!!Y~##Md!odR2@NtKAoqpMnbJ3l<B1fnM<nL zi>v`7RbALW$hO5fld7IX_}qdX-*ezt&8_@g_~MkSy}?t}ves%SIS;~B&_+Lg`wVUL zr@o>$PP4Ca(>PAucFqDceS}McM_Q{<(ixXE8ek(ZaO*<wfoW%4LQ_*2o#3p*q_&?c zcNt<ShzB&sM19@}00<0-12k1EK|o|LE*(8JfW8Mza(F792Ei%ru>4+<ox($wpg&%C zv-AbM$tV1cITDC<osz#*7xGwMlVp=#;C-IB)lv3mJ@1v!GVY5OX7YCP;Mio3MUA(U z`Cd1oT1Bfxur>>&KSiAus<#iR6Gjz)m<PB`^i<@RIR-%$Km`dFzJlYl0^zG2JxT0{ zQ{ls&Z=hj;Jq_^DD8VZj3j}&DnyAYn)Cz$7r;MdF)NrC$tOqz<b#q%g3qLbj?T=HJ zq4Q#@zN?2_byzX(3pxm~Mlr1m>0Jauv({PT&q1Jbfn=VRIq(p^=e(Fb=fnVo%g>YK zb9!CKPCL-;__W4p&gdMJUdB_XR)Ds8=2T7$V0nwSK9OX8sdZ5T>$8;B=OP+cPxC4j zIhk{^arI6(&0L7Z5Fr3=f!kJ`vRaDuX~z1D;<ppB&xt;Uh%L1~3Cx2xk!hu^uQa1m z$k^V&)O;!I@>H<Blf7WIs#qDq&8iK=!JMG-&M6Zcph>^5b>bhLJvBUXUaK_Mju)oR zbD5AUVqC0j|Fm#l*Uk&tK$=Dv4#u<rb_HGmlS1McWrwJmUQgBZ;#d{*l_GQ@3iT=3 zy8s6|n|2nk#f$U`j9Z}rfxk+_hUn}aKmcRwDG`j0QcrbboDpE#P$|VBj|LD~V1625 ze&~Hp>wX#Ip2BRKHPdS+ZyDX$*0TAR=fp4kx(}*a&)Eh4`oRTiaM~8uGfvw+?iX6d z4TuniBFlN{2tX}gt;`A1sS6YpAgj2SlI39UsW?W(XA*1~30517LIo!rmWk7JDjlVh za<7(B>5b>p?9o&WyIdSUSQ{_qQP_y@atZ}ar4VS?sv0r5M(MTnm;q_>f?7SkFxg7# z4}YlCWz`z&0o0;6wF@kYD0wo1i!^LiRt*6Soi|q01fukIuN7}A5?s(cp;K|;rsgll zDY-71`Mc6#^Kfb+RrWrnT+{5je6j1IsK+;l@dAVwPl(pCleu%}uFiqQe&M>4h%csf zJPlivq6x+UiW$8WGlErgo&{2Er0dPBkIbPhNsyK#r0F!~g%FAyu41aJB7!9;E>(G) z#=sKK4<XY+XcEiS1OzfAu=*m1cR}ggQ^J|7I+r)hdK57S9my>k-&cx!hDKyc^+20- zf0?BsSVt|NN`l7VoHB2LIn-x|^x!9F?99+>v!XpUOR*%+<{&;jSE{EbECydOcv*<A zc$mZdLc(MyIQW!6(-$ULA(n<yC=E%aE1vJy(hX4j)}rELgre(M9#SU24kU|=gBpWm zhhk<(79lu_8A?p1`3w1=CS3~j9K_fRI(4)4fS@;ul`Os{gbgR9TUrSarG|*+%D*s4 zkqjm!!j5oiKb2*BG~I5;5eaZs%ygJ?x`LF)Eh=@bfzd=#rv&jD6OGs@`Hl%b1^USP zAXQ3F;&I{MOoz+H6L)+t5i+9*-dB?<vbrpDOtZQ?Q=HCnI%?z-$BXde-6v@}oyVs+ zq+7Xf7SH1{76IL+G#`SJ{+RQWcR9<#KxFbM2GQhjILgMAz_GkvTMa)mJpfy><9Y^O zno%dQ-czvBA}X?D3MTcQVl+{)SA`9e_9Kc^f-FB*Rvw}aATk|ZXw4Z*8tFM0;%UGf z@orDm1e)SZ_~=O`s!k@-;u=ghpq^<RaJ)bMIFsTG^Yl|sosoN5h>yKKAG-be*bArT zpMHKCpRL<ejA8z%SWg&$(cn-?p>Tz=qO405BWIJiUQvr_Ey=uHpR^#yW-qEbBA6x+ zvLWx&)I-v1YKHW{%|=PK={{49e4)rlB(uzEab8)jekuJ?JpvsT+VoHpY6c_=DDpj7 zX0b=I?H#OM3YzbVN+4mgYCQmGjBzhH06$QVD2O#m=1R>nUWN-j6*<_+FoAg}l)0p- zvs~B0Xgrl>tYBaK7+Ash9c(quiuzg?>0B7=?v5ooa(fsPSmBZRD{~f5kr@nq@!WF> zw^N(tp^joLx+nusmtxt^K$NCL@ybM8$sAJ`V<j?+NvN4ltOU~1mtZBdBxWvt3B3?U zx3GFC?9F0=xWaH;V(l?W=5p8zjAJ#BWr;(w92xKSQ3yG%jo>}wS&63W%mrecg@ncD zPjQU8(cBn_A&CXF&e_TO^k=IR>&`>!3=a$8Z)Ek<Br({MPo)%0&I+mLEM#jUc-Djm zY>LE!V?}T!n;sFRs#z06S3w2?qur25ar&z3qtr`@_#3&EljA(Y+3?v4b8}RmJ1cVA zIaSrC&q#BNSebG5>SE}XT*&R>G;TUz+*t^bFEMZqSc7u9e>2@b1s4n0{e!W;@mL<* zW8~_<J%$kwdA*6NM!=ASibc@9M^iRIEM|5%u|YZ2Mf7nnq+#oRySJ(?(nxYK6TVk1 zp?q)?$!B(qYyDYChu=9^7w+hbggW=0m1v~rLY@8f!JhvAKBHi!<wAAWICph%o+VBV zGocl!gT~ZWkE=AjjaR_;5jj>oM6l7?4H4W|6!-3=Bqw^P>aF{2mEK?jE3B7N8dw!A z2(36B&<k|`vxVj|%87pv*)eG2S-ts-^}B}(|9W;3m{WS*d?q0jYXH)EP6p4zevS=j zQseNp?m07N8j`9ZAlDpb49SFXG{>pOw2ICFpnJf?Ka7*kEnw4T7KCxctz?<t>1i{V zEDf}N(PQL5$A?6k30)D4`C$R-VA|{%lQpL|6rHbXMZpu36wxF>MS9E-N#SIRq$r+8 zC{Ik4Qs@;M51`F$#pD$lOoP!D_UYvM+-V0Vl@^2pnf`09GPMu-R>yZtXV~Ya*NfSA zY5in--)*L#d1WLz>TP`Y{^?BnNf7XvsaIrUSS+KXxV@cwVE!cB=`=4X6G3D!#E(}x zC{s`j770d=?rk;{7inG0tRXBo#ps>58bo@4>P{eX7oBdQsA3SO&Q3e68T{@>*~+5u zq)k}}5!T>DHB}d4L8U69QEES@3pd264`QAw+D{5(J}{W%UziEehduM7nKQ;RbEEa+ zzn^c#PZv3oObZDXvs<}7($gxk+cZ(wnam|gmatl2^;PuoywSjLxMfU7J;k#s?0BPQ z$Iv@M-QG5Y?4`C^gzQ=*gMChVS&CsvicO{#ooU)k%*$3AHN&seB28<oswU|v*xHp@ zwH?vSl+#_2rb}5X0vwFPGGdj)EbFMBih?bZ30tS>X+2X^HqH9nWnRb*Zd)Vs!{gl( z*`4Pg^c8EyCN@~)fZXMe>n(ku6hC^Fk|%v0D<q0@Z`!z@oNn?BMo;Avn&?~NH1eE@ zzWof-a7ecoutmu=lfmGcfzY5i^q59QW%<*M$-%Jf_jMsO+nzMAF*$LTa#=uwR@Iqt zIW1JbU65trJJmlfXlxE&T*ovS9JY=hJV>YT=j`C8u9SzDW8FS*sLpZM$*V;^obfb~ z507!5E>2<vn<(WL$)-%Z@jBWIsNpG5*p(*2rIRFcWj+cH%WRNuB$@Lutb>nci`FIq zcbKX!(_2tCXRe)+JVhrTr*$9-gc8w7kSQ<}+2=TKJDn$CSCLaRAkIF;NVn$)LYm`# z>U6y~GrqbYe^8SR&rP6)c1YTb`M;>3vDwTxloKCDJg#!3;MxV=XBD36lEnNFj1%1| zoAqm(X{bRHjT>r*iOO_Lub0&tJexf}!p0VdZmTrlw;mO3@;^1mZdEqMTWOE`Z8^cm z!;>qWR?J%>FH}aZijq($cLTFSf57G&1g)yS9&fCiX4A+(dTe$8##f;iA6%;_$7sWt zQXn&+F=Ajf02waE3$O`Aj%pFZc`#3`UR)R8Yu$W+e(rJ?{`V_~{%zM}=MNr@f8OD3 zb$@E*x+|_b65xZbSBAHiMS8a`U9)dZDk|LNb2NC};lf>oBTqlF@!7$#$t_PU7{A9f zv2A<TJ|3^!H69yZI~?Eg)qNeIM%wEZV9_|##RtH(iq2jdaHXVEd51<RQIeo@BAe%) zA7rT!wW<LJ$Nr@<hPqR>gtbLp99Kb$s$hcSk;~uwImV=zEXs0O={c;%>~AYghw)^p zcX<ycvW(Hs9DdH3jMAIs_Q#rfddHS)<4^c`&$LO8{SLM=>L5;xU;%)TYpsfxTpF8Q zLi56A2bW}!4xxUNa4j2g0-^|~1N{Ls--Mqx-=vENUL(ruff@%g6s7tW%n0R2&5Z^O z@~p1$Sfq75k4yIPs`R&lDI0INan;Q)W2$$|uG?cyby%d`UEh(+mQJrRA}xJtLh)9Z zuN-;IAJivp{EaocE0<XvrI=5mkqd_{f^qmJ!5a111apL_g(DbPVs(_CxVp1Z!l%-u zXo)Bo1I@qj@cd8xp~BN{FOm%_X`R~n-w2aB53nu~?hZ`XlwbqG+9E~p7*h+2jYPmS zD1ms9`-4{+X~-~fLy`XLn61UAz>~`S4#aT9GCz!j8pT$q)<Mt#Ku1wELI}pG0o0P& z^ma5f;gO$p8CkIxum)BtGdNO7JMhf}=U|J0v{SknT+f}nUQ>Ob_4&v8J9pmE_6fJ% zWDQzOOA|Mn+^N3yjkj#yvL-IB<wIl7{hI%U%-c_l1Z)5m8Nz}PGKzwfdL?u7^;`Z| zny?&&zZ2#6ZWG_(oR}*`5ddOS8~J?~19Xcfid0q642?m<FUu$(C|{UBPc8NtbqRn< zuuGr(<wr~SGNWiTnM=MVO1jcgS#~(YKkv6%^(N6!YJ5NzMWfCjiS%!NQ?#*vvm9N- zXlkALH|4le2Kj3LrVcO=RbrV^j$#6d{#Ath8Xp20WtuZTEh$|Pl)mnjC4)|~ihmXZ z@&jH`hsjTs?A~q^D>32kUDQW0qogFRNU3}oYZl~{^0-oZEH9WivxK=JWylL6H;aFO z*a9$ur#QPoNpC2(MV8cz4cN*yCo9EwCqC|!DmwyWVad5|nV#<DDzWLkH^m>IM-<i9 zN_Y@Om!gz%4tfUSDl(!NoQ!n8OADb~8XDf9#icsr#I#AtDu?f&x-00EBf@MIhZ|sY z4I7U*Gu_}*W~;T#=$5OlG|CoRsY4g5v3X>J*Blr(yFKPAF(iK4Ap6`x>Fqkb$!HP1 z<y9V?`Bq(-(aCGG;0rF{z4vYvhj4BQpn4it&G31qq*_W})*4s!Fys~!R|?7Cy9BVt z>E<p0#uxo)_Y}U1RTOk3W*xuCfe+FdOC-H)F?lQjk~tTHuRW^U3uVD+nMT$!rfv)+ zuGix+y6bZZ8tua+V%R5s$cXsw$QkS5bTM$X;uzY;F+i9N;WV;xtWiQ&bB_^2x^opq z^2HTZ@V-VF41kC((LYW-;YP&jgc^!lbC!BQV;Ci1Dv5LpG2EQ&YlE1j+T6~kWq4j1 z=FF%{NYr|?VmVw+e*Mqo_;*`Ah6%;JQMALZY`WbPzxtx!4T<Y}+j-2Z@q~xGX|rA@ zh+E1cUjD=@b3#I5M+=#~k#XL%G1iidr2~<+)zP5bmE9VIj07$W4x%t*WW&k%$6Ril z{6sdDpU_NDbI%g;6K;|hW+ml<gd5|6Kv(9B6s>6F_c`MR5`|H~<ts_m$|Fd`uR`rR zj<grAY@#V(%G#tl1W^JCJv2#g9~#BmCx__a<Z1{J6cGr~5eTUXysZIPzJ7X*76(5G z^xL1H3;oEMsn<Zv{b<LSk~)@cAa|a?I0?>9vQ~{(vQs)efenLUpaIeb8tkd3Y3Fbv z`0tFMnX@+N-Okws^7B|LghR7r_yK18PQF@PIXHiYMDQAQ?ICY<B<M~LIX(PW4BcjV z>DFxn-F(EK^}3T$Z=%f2|4~jo7fuh#(i1CyH;81yg|*?<h%DW8$!n6mAydECl-RQR z+TrmncS$!&<DGU7?^-=F`nYZUw(mHcYk6%66R~Kp@6}JR<^Du0B1m$W+)UUkN%~Ms zxb?&*Vs(a-FG39tz19`(!MaPFgmu47Z-j|0=UiZ%_>sm9sq`?=LeAScL<`@HMa~)U zL$S;>`<s&ai{)Ao`FjumT+C24$~ac}(zwDii%FRUc%%|+-7?lasjk$5h^KvTEY^Yu zo2)E9thO}2tz-`Ca88@D+Lj}V7^j~iH)U(du$Y10Z>5LhTKs^B0o^-TbBDKzjhZS! zcB*kf{{RD7m)VqMSo~%gdoPNGe;>nUKn#iwm#CjVADTyF3AMFmx)7nc`Dzi0F%t?W zyY%Sp0TY#h-<Ks`P5wyxXnXr;A<J*yUw+JT*b?nZVBp@h{(DWP(UoET5u3&B3;Eo2 zcAMVl=C_-Ijy_Wq?^w0<9;4A5cKc;liC&PdE3|uTM%@nj%;Nt}a6<gV8|L!D>QHQU zUYEXQLVP@8^BRp#OF%B`diODZ)M1$!=LHWc8BJD~g}<!Kg>@B+>v{*`iD5*3!y2ax zxG!knaIP$#rBw~n)*av+sKMk1*aGs37V2^8077Nei&}{q26i?lRB1!Fc}Nc%=>77; z7;YP&NX;ZcGGCD3sRihA>-1rybuxmU-*%{E@o<mjz+CaAJNhb*98K7qQoCJ_lk^_8 z1Ur4Pxx%wKN-%|eM_~xU<M*u$7hcZ#{C=TdFh2PAUprZJlC`g$Kg2(?HtjSDW`jNe z;f3N3X}<7~QfI=Gz8~qm!NXU(9T4M;9B*K9oWLv`Z5Zzd$x&GzS1wA?ULc+SAC)GB z1;x<d!;<LO<TjK0rWI?pyY(x!hdvy!KE8P}VCw7{%vgNgUvSTr?RqBL^;9!qgO2CR zb_^~@xhzG)ZHR1j<>E1<c&^ZniAztd!W%G%=vZFkR#i8iR{ZMXF_?(Uv&t1T2L&GD zf>j%xfGyMGpU7<^KytJ3PaoF8Jbp&j#Sdqp;?o?BUMU=F(OZAW8*L`P5I)IQRB$V~ zdo-L5s0dk+!PmW*tV-t8zTy(O4!$CPNzu-rS?6?Kf@XD*eb2jm)itaVQ(~R6*<)Gq z?`5{Ub#Q1ojlAU4OTsWxQNT*n49tDb2C_@?^`|oV7iP3}Wyjmv#`(uPnAKnRp%|`{ zt^S4EE{fxrKL;m*o*N|AQHpj6eoSSMQo<i6b9H3(7jd>aR(a1a(mZz`JoiwXjU2); zf7U|_veJ84t%rvW!$S-56fg9`L-)~7cxa(M+)G}W-_O&-z8MeAsdexh+7bSOJgy*r zC_WaO<HFr4<m-9wO=+919epi}xW}|uiN^d8p0g66D#V>{)?(%|k~88eqUem4B+7sz z1fMjofPJUun5si;i{Pjc5fP3#fb!%j8Y!x+pqRRmoiQ3g8qN52bUlz{hI&%+Wwmj} z^nn0}pxo7<_fVr4M4F3dK;glLjJKnLXTyGR^sxP6Rm#b@5l@2yhl-T7K3qfjk}&0_ z7|*8Li5ORhfv=PxNn6=@1Hm%J0bv3x$R#N!nrRU>rB<&>_l~@Fb>AevWs{}H9ICiB zBlFUcp~4Btn(l1A?e1*$fgP!kacsvDZ)DwI_TJDPo3`jUU+0dA?W;EN!WD9RC1%IQ z;_tpYSqxO=Xq;EK-hJm&mdL)xvi;*OeMi*|kL=xufn5B1ufF$&A*hQ2xA}c8x0p1U zPvuG>)~WK^dLYMAR2u+}EpMxiv;yA_6}~7=*aXT{b(#NTR0}davf@3ga;~?PrH2o8 zrvJb$D+yUi9ae|ZZ!3d`6^}es>G5J7a6+C+CQ?XY;puD&D~D^C?926-I8UWFkxUH^ zE!8xg>HeuNYl$u6Vk}b(hd&Uj=rP{9iAI%&)2`IQkkf&O&V^t!$=Go;p;H7dXV_&T zL#6A)<B50CE5#QK>?FerIm<+OVMLB5q7HuhC~vlmX2967IJ$4KcXPyc=lGkJj-X5C zL)osEjTM10^Uevy8HrTe3lE$95xMZ3Cl-@FnQoM0f)KTZT26SMdrTO8Y85X>1tDfB zb6FOga4OFUFFHbwa!W)I!g4V4?v7|oTm<LMzxNh$w{M~bouo=@1=c1P#KNeidZcZ^ zVhp9v>8y>gH&k|~vKOsM$186%X={>{74ER=ioLBk4<j$>bS0T2XC7(7^V0zu#AyIe zg-D6JH1V;iW0drxoGRpDn3n6@7c>EizcKTkK&@StHje#+WUWrL*b2Mlpx;r*%57O> zX&xFop|hq}oA^L)k92RK&Pt~xy<Q5-k;J<@<NQMDGw}ts5M2t{VwRc{;e&a~DFokp zRA+*2F6OoubJsxGkQFeX*$R@#)wZ;yAd5;(7WIiP$Rgh;mRG|GHX683Q$lNmuxCgp z{f@Hul8g4gREi^TFquPw63<*{454-`aL#}M#tv0lj8wH+NtOCOl89JeY(ioO)#4^b zt&iypCN?h&X<~9(lQ`g{XRjB<XDC638)d46qdyK!q`K0wq>LBdkt~@lTQahg8{>_V zoW5>igl}IO>yxE@V=qe9x`{6oHuEFHKOMC_@+yzOsgEykiRko}UM1<Uy#@RyEKe4e z0WCKi_fKEgQMjQnu<rR_O4<iKLe~5}zpfkhv=od=K#H}}E^kidJ2YX&letPVqZr{! zvXzrWnq9}T()k4?t(CB;XmDfPO6Fq(+f$6mT+B?Oi=|*l%`tjtMhg=`_<-V9eXz7X zWMij#d?A=u;#LyCgf&$eh-iZ+>kv~w+tdZ1d!X8M2?Gl2!F~lcWAxjj?+J2;C@D1q z{^Ax)w8Nuv+SQZ*r~weqpf}iUDX?JGf|EcaGiK|vu(&{?t#8H1P3xDg|8>Dy5i;pI zWxoB}D{trZFMp|T;P;Px&zS9e`N(UQBia%a-l8QCj<31l{v{*wiLde}-jj5Rn4q_W zG3NT8?|*n(+EwT*9Ec#RypDg=TexV|w6rPC=DC%?N5&Bo3~*0@$qe!&iZayppo6(Y zH)O#jNJ2=n0hgDnA|e^C%8e^#6tYwKQcd{v*veq^?KqZiE*AM{YysB{awDZfRvZAR zs+CxQW>$njyPawwABSuYWLyb4O4W_NLDXKRtX1`_Q^{h>`=d>L#7)bo<|@3S3|VJ2 z0krRwF3heg-PT!9fWavPoQGtqRR-)=E3{M#=(1}On=y(o&WBLL%Y>2X!Ggeo(n?If zjdwS<2rtCLSC>kWjIilwZv5t&KrB^O<DKjnG)TuKUJ`5p!Q{^TDebQtZ;MB_ZjY?n z=}+kTBi_{bNa3wvze7ry3QrWiQuzDPR&Qe@5xM#XUg!9k{~zrUi|2to*BXtt`<>=N zG>HyJMz+RA$`jPAheTMxBOVub1C`Rk?dEbNoE9YbAbvMx8)K=w%|Ho!hHp2s;ub-4 zP~5^W4I0ZKX^C1%ror3AhS*#^@tJV-pbB8v_Ld|R76UdUt11xIx8BBvbK4;K17^YD ztd6iUH`o)nD9eaBXr{D9lVnB^NuBAy0sy4o?$SfSiB}rHQW#j|{?p>|!j~<)$=emp zBpw=n+Mn)g&raMsIa-|xcgVI&YI`b!WeYuxt5U;-72UiuDtZb9VfdQRn(fO!-gU=I z{Cd78b))@FestoF>;CH||L5A)w~w?{Bs|7!aH9A4uFW?k-hr&T3w|jAS(S2aR2Rhn zW!A}=vyz}Psl403d9_%Jt`K}ZKypJ}8Ze&uAV#2dAybvg%Y;$P>CJRLAZOx-zPZ7V zwx2WmgAsPb07D*n^Pz$c=BstZM*47b6OY6Or8G2vElCMy2_$cwj&LnWs3p@RP+pN3 zjFN5?e=1A;)(CHMS6z2``=zmHCgOEBnh-Qx+hw(+9}Z<4{+60cRxAj12co4bwzrwT zCNCNPNOpYEKmKukEARX2`u<qR+hiPGa^lgB)<2HF!H=yBjePO0tA6#&>Ji@5DR)#B zKF9X8435I<#p@xdFKcKgr6QFJLoB({@+di<APbLjdOOHWv3uL&Bn)!I-}}!uUeFwI zKvrrFtIaKMD`^BrJO4PWUFKy)fPb!K{`pB>aJp&&&FSfwhkxG{&0hxzGUX+>n8Gy7 zTXZ?BOt+9+4#Xs4e}+q06hk`4e75!)6`9;#c==RPj6QvzakA3J>vt@@U+``Uy<ql* zEU)}t_J_<bhQ~e9#APo^_Ub;<1Bc`eXGAof$P0F#rL&w>-oi4!<HX8nM7Z(9E@VX? z*~KpFLoy$+1y8&x1kw8qyGZie2Ki;VJ2j>o#eGKkwZ$o|Px5<OeB(Y%P&KmRhy21! zejP8oVVftvhFSUfYfhHm+$%--p*XK*K{o&o1KDNBU7sYo8PQR``u(zNNwtX4{1Zn0 zvKiT}3;*8IYk%%Xj;f&L|2P)LXJz-qRIni?+*_!dFS@@vu>_)voOlJId!{`+Uv~V9 zt9X(f_ug*|0mMJu<WoZAwY{m_LJ9%PtkAp#TG(TB(vg#D_EdjonwS5>{hEjxWE?5g z4&&QOCp0hqhc>#bc61t*PT8V#9ae*g*lQ0T{9g6{d0hL8YFY6eRt3mfJk0f!3Zk#N zHW+T`=<J$SO#J3g_kt$k1wdS>9Of24#7VcEIdbS@nqsBtn21G`%pQuTjx90SmbbTv zhl2K3_^h!rE%W-VD~?DWVOOxQ3xQ+#zgR#}`(Ku(gr)F=r6XMFkv5I~QIcb6zKnPL zIwfsfa{PPZ6F?d9mN3eo2$VLwduyCeineU(_;2yer1kNB_L77t-^QlnW5U0EmF@Xe z1;6+k@h+~O`rM7MjyV@Lyy|c<JRf3EWZij0Ns0+)O!QZ3CE;n8QO#UNHHhTY2AD-1 zSafrunXuZNYDYzL3QyP|0teVGY-oKaF*yWLvwf7b73n+(KLLB_cG+8OGhRac&ENjm z)R)S1MmMHfYulF_C)-x9@0zUKxIgZRUY;5fgL?~m3$Jdve&pcyZ~H9L?Y3Q`R*yRo z-Sx<C3ctIP-*J`8+)_8u3m*``J-!YfU;vN7dM<|{H&InWWa6Yd^#!0_<wdiP8D2(| zOf~N)$gE7LL68`OfnLC3mx7=Jo$9KG@g$W?aEF|+)anT{yAR$68*WmEZ~;E9*?@{R zT%l&ok;b;UsYv8PjDaF7w1J8Si~_Tse=8ObKN`ubdN|M<hysC8<+U8>Sw9#zg}Wl1 zrr|{|1}X)UknUX3-QRxW@Se#vog3HgLXdLVv=N_pv2bX|3X4se*jZTB-DQfHesSe> zpWcOKh78=0!4b$Hf|vpGy6Q*<O^|_^ydJ_~c)eT&9<z`ke5?q(BD56|VFWaZfI!ND zXI0D*<{VWNFE|j`v3MZ?3>=a)5Kh3VTK%K~`X&g+Xm$DnVGZeP&6T*Sm==WU!^IFm zt4=~NSbHS=5imF%f}toCa)&HjK!DsN3gGY@e?8G|Ycs9<gxh2J^u7ffJ{#`j$J>{D z<AJ8}@oazdwafT6hadBrO{F?JpW-K$n%d<K?@NV8zxg0v@qjDP)yEGtf3mRk^;dg0 ze|AM;*_R_XerB{IA_o^NY=a$&K~8tVhF`=zs`dWls|;KZgwsJ18-c`RNJ$B&)G`!w zX=co5Tq!xGdT<UX@jxIwB?J-lXhAENR2SlfnuYX24QL_MW!NSjl)<NLj&4SCP-8uy zlU!9{t=9p(xBf_!z=Dw82;SD5?q*HjRSZmoY^78pGIXXQTXEi{4HbgikQ+v1ijzaQ z*wH}qPf%Q>U^e`|%NAWZa4=fPn?!Vmt>?xYg*Qti$KIW{ZBH#lbtIc|%Eom)tF8<1 z2~e<V&y9MgF`#!iGdFx<^4sZ<-|UkFsW0(`OlL4sVUxG>4{qakuj$eo6PS`+wzsoz z>$b_Yz7)S_Z4bJCiq|?;+;+vvaMoDi?(5FBd$VR^0H4w!O<bYr>U7SLYE5TfX<8gt zaWwp&tBrg}N%s#Wt4?wfxx2-urTcXc0oM}YI=CE{!^}Cftj1x`VC!6nRb9xK<m|Yb z3)2rGH&lZeysot*^GYYNs~0JXatR_>XQ&0_tyHwp7iUD}d^GrnV}L*mLn5vtlXhe? zQ3Dlc5~0{#Q0y?Z!?vJf1czHZszo-DQ!PlPD{10E%mot2ty4Nt^)St4P)UPD1p6zn zHZ1rJ(e^jMdXi-{5G<pG0b^$`QHU%B;$4$+h09#IpufJ<dDUGbg{N?3q;W;E)Y*OQ z;*r94W}f0j-TiIRCFMBaR@62vY%B@bY+qczYKuO*U`e?#<L>D;2W;m4>jzeCG12>` zFR?d~ocBP^cLK{`<$_=!_*+;{!Yyz%$PuSrl5?3Ka%Kcm`U+e{v;w!O8Y?MQ!Qibp z>x9J-EEi{zj3bvojj$MDUSy5R`Karg^HJBg*7E&++%Y3G@KK4P0wJARN`xGG1|A~Q z3+@>>Bo>B{?L-xC27d~+<qy0fnL0=ASZm`)t{Iu^EIe_lCz}>ecIx(SS+)L)Hk;qJ zIg~M4mPXq?=sA4PAQzWjmGYPY;N->#jYI5Q=n^KjWVjv%2?Q1kT#s72DKTu3k{Owj z5g=2w11Xi$>ET_VQ6?(R7>uIkNNPDuE2;s|N37+X4lb3X=fa(D7QVr+;(x)fDm?rj zFBN{y*S+{-K3sSu&QJXDKltT1b_WWNOZ|nHUV5?cV?OrcOMC=-O5oPN_iNqbh(k+& zTv-YaKoKZFLj)m0!y&KOPx_v=+3yM0sM_X!&(gWyQ&+=TW%fOV8v362#-ge4o5EK9 zRw2RfE^PG`%!PgYYW`3BY9D_)@8UiDp2F4>&lf%+6$%f%^H$*@dXa+`?nSP26yH&Y zN~ak&?f@@f6+W;Iyod|X!_&;Q!XET+1N^5neuBK9h0nc|`;ypWRbIp*Jb=Zhpitpl z)T<#cD%b^ZM&!Mf?3#~FNTYO_Kbda`v1<W_rKM{a^c8Jn*N}ApO+8%$EnYIkuHk@< z6E$5+C-a>>>{@#&->F^8Ci4c4t`*UTs;QTKCoMt5vO@zigsY%fB`mHp6ias^HJ|sJ zxN>}PSAA0px?_`5lD`I(Tp&*<(*cm5mg1O_+2vwGGa5jN0Mi<XBvAar9kS2ZZ?e@k zCIP}v(xfsZ^@_yXlxU(OM&s%q8R@{F^fpP#z+qLNd0VF#4vX;612`Y322`wY7*MNd zK%Th-8VVe=HGuzy4XI4P84y#>ApH)V!~gB{_b-X*g0=6Zm#*X26&|o(bIlceRpH+X zd*~-l_UHZhbz$)Mu=vB{6Vi)?7mq))Cw;s<^Kd4Ud8D<qb^5o8$4}sz5Pj!6;&Jjf zM$$XISNw1I78B5hSK!2O9a!ssrbA5qQ=HgnY6q4&2LNO=|FX8kKS`=T`YBt~ZOkU- zpZn}jU&ewz$6n6o|BgL_8sHD}eM9USm>WrByvcmHo?XyztBR9a)-|B9as@rUoPFff zEkAwP7@cao#bg2RTWWfWU1mA`tumI%XSC152#SoXwBZj4h&Iap7SqM^$xGN9w=h*D zj1d53*St*MS=p2#BpN#by&6}3b}Y|p>cwkat<%cJ#@pp5HJ3QaQpA&2z>rVM>TcMC zAMnxK=WhEx<?D}V7VW`@Kox&PCNM$%O6?=pB$X>=^`p43S-Y@VBb@xH_7^`ds^UFA zYG<nW6R6_P4#UGh6-y2uJbL9%UeeCAwJd*N@xQIehYxyw^~?=)S*K+2{@sUl>N5Y^ z7R7T|sjuYKTXr}7kW+Wx()2^p@@I0dKcIcYZdtkMu%z4~E4Lj!*m3v2e?+@{o2=Y^ zSpACsZAp3X@WHVD=%Dt|o0=@jm+;XW=%epDe9*h(2R`jD_Q}fE53AqBclp-ggVCSA zuwJ|T4O#i-Vf86oK7el?c^T#~S_-bPsd9^Kj~=YlKXWs?f+AXlXBn>i^MAd(fnBMU zr)p~bC>IClr%u@|PqpsOqRfW3j?r5s<vw|8&3zm2N6*~%`oFS2!ka$7`zHL+&FtqF z=qGM&YR@gV;o`0I^I-kYkA~Tsza&rH^`%XC13qUjea_T9?9;rBKPY2w*e6eYZQs{% z{bBlfu<@oJHL~m9kf$E~#y9bYPsvkHK6L;uRc-mfW9+5x%2Nlw`z`#*x7p9{u%G|H zejcKqIox;6Ej70U^%fKbbGSGBLasH3yPtC%-*@(za%(n+JE1pzKC9fE&EZ?mzM8|A zrkD0+bNI5e*OiB}IsC))(xI&KoviZhta31$!xx`@PY&N6Z{T_s808Aj7jC<K?>+ZD z_?3NM|Hf0_{?2!QW-0gA1ZvmZ^!c0j-1?=vzV`5=-#qZ-w+{Zpp*abY4}8e?#7pR- z>652F_$S&2w`P}(ZP;`{pN@Z?GBc_Xh>!i8tNzn39HY9m-kNhbKZA%ti6M|U`Y(8- z{$LUZtn|g7eU9F61S~nr@$yES(nU1%>fhz@?4vgInk{&%xEZ!xQ7QV^_9Oh&)8GFW z_OZ`d^Pf5V?9rF#6FzIpeeR*J(m#>6;;qWx*%XBh9DCw_;S(H}BMi1@RRh(7_^fh^ zRlWPmxIT)U3Fu$dHfqR5n2f~n=B%>8Hg)B?jUU6us?s%hL65-BZXl;(Ag^LbA!0^x z2=f{BL|cW7Q<D@G(mMR+I|WoN2=NPA`*xJ$eA-zLaX%{XNVf!QDPxK<F!IjCPmpqQ z4p*|JxxN<jk&-Tgyw}srM^_STgbag<k7|+tf=5h_>_u}I-;EldJ_tloIdcB($gmPj zPe`@23vNTWmSJM4&w~DsXg&-~KMtlW(;Y>+2mjCT<lkNexcK;lt?$sGha`8<Z1L%h ztx`NB84RLeF-fH+lf@uZ@Hd+ES&wmDmp+=6gZgN|Jif(pQ=eoMBvWdGQ5fwpx$B*Q zXslX@FBPZ&eN9Ec>kTYQ03}=-NFD!p1ZZx_VU=U1?3aQWcLg3t%$1(FrOje8`kaYs zO!<_ARLE9Z?K21l$ze?U<IyX#(TreNQ92$^Bvu6C=7im5wo49ON{ZMbk!=x6zooNG zcI(lv?v}WBwhMRZPkc%ITU+5bzj|z|;I=p_^ioRjNunr}OR~Alm|AV@kJgr&0xR`? zvrQW7)^}eaB!;7*tl+SDr9rvGU6oGoD+3i3fy!twkr+rMPuz}to@|{c)dxpYYrHMU z_V28z@dSm6s9hh@OTL8LwQ_V+FzOuM7zU176Xj*0s;Joq%sK?5w>6d6aC4He(_JG; z6-hDi?tcpV$)B4M-*UP=;sKm+45*KkV?vjk^KyQ!7TG|G9<ShX1LW6He@C=FWtJTn zPM^&6k$*=)m5>tE-2;7PIJihg^qQvf)y&mSS!~WqdS^Fdh3rPlZ$7qw-k1Zbo(c&u z_P$&q&2XbJ)(#va7Qz(ryC|(H0rKyl*2BN6*7vahBE<e?Iw~yoWTB-~3+hlG%vWfh zvmrTETTz8zuv2>uiZf7vtBp-?z#0#@s$Yonnun2<dKSP_gYAi;cZqzo##NEyg3WlA zbI3TC^*B)5Rlr_B<k@@+-elI?vZ)nc*DR}LxNZb1X1-s$P9;hT2f@*zb`t2I4~Am_ zakcbj)ehimVBV1lO{If|bkG^V|E+ken|@yWZ8xMs&S08PIdK7V>*@FO|FM0XsSxcV z@#dpP(?^9DjvhT)D9}Ug=YK!@tRNpRJe@weZe1Ez(?^d_6kf!O{DAn*J4g6+e`NnD z{QTc%{v#S+da<>&pxph(OkZCY{`1Ge!K1(8|LQmh0x15Q))xV~6T&&84K?<a+~xf9 zT<&txlS|op<$DJfU$mT-f07hsh1LevbUBNt0PRj`fnaOo@<{}O=+L8>OGoRCOdB5O zon`cjvMiN%Y8Prv?5(xhTg#Jqeu7=#wSTXxlRbmBAZ+B7)p6zWWBE(9wZBwW{fMdN z7xFyXYsk@2uz!j6>=LaOs<Aaw{sX1b>A_i1nP9iXR7Ho2UN(L*KcGDukcm2T4iz+# zQ2C3r*DjI?J(ORrJzFlT<9N1;JyWlMiuf;uCh!{N383m#wd6)TjJ@g-q?(mUVhf<L zy$MFk*<#&a9%+(085>aVN_eD>cJfFmq*<xAu+^&6XH_RUvG$8bkH5PJ*i!9o_@r9a zIx=BZ7xm*AZ&N-(9g6CbrFaIa)uCbhUO`Dl=p`Hsve!tt!c}CDs^-IXDqPIwWXZd* zR!`O-RiBx8Hz;q?_LTMg|0Q!DC?S32Z+Q0En=9NAzo+K#ig2XxTI5fupr=mgN(7@l ziHJEi*4YAhNFo^PcKd3p+(Ewd_$!%?OnYm4rYk)`S}g21F{-JtIPy{<HV}+1>Wz2{ z*SYyg2XEJxWmaZ_i80w-cr`V)B>Rz!H$GSwT_iX%nZmaU5A%O0*oB);Y!{ZDQ27VZ z-IOjIELa7psOSQB13Ib>0N>!iDW|{KpKn6u*H6iS=}F90GxZP|D;WeoA8}~O)CT8d z$#3vtfeRWbFbEV)B7n;gwt!rvwHXCo5yjqcy^xk|BuuMAz+1f0k&&1jy=utUvBDJ| z$%OkCj4t-C_~<*2?OT7>_>Fs{Kc#jQ{(NZVV?W&PTs^*rU-}#`#e?s>WslaZ<Od$- z)BI;{f4Z>$K;iYTT!dWqW^fqmaUVXqi@7|e9^448RL2z>AZ9`z7c+7kX8q)3s_68{ zG@1_^hw+c9Mh`pFzMs|=`hh%C9h&&`Rw1!;r^)ns^WbYH)6U^o=dE5HAH2_^=jGjt zbf&mTlITbOZsD1mvbN~WSCqyJ$MGH4;yYf4?-(Z}1I^f?)Fc>0Sl6=F8^jv#gJ{=b z>>AuLwH`PSwEGnC3ShL!anx_s!x87O*0ZbXQLA#G-(Q|3?qhTuH88$YCeh=g&`MAI z5iabYAR_N6z1=}qXPcO{5XKom*aRFlK#c(eNa#=mh7KEp;E!7AX4?<Haqk;_OGjT0 ze3svp?XQa3rR2K7!WW+0@a28E-J_c(jiyu}oR%!tJ@e?k(c4yz{5Wu^Z}nEAeAAC5 zY4g9{`%wP5J=@1qw%Uj(5=oG)<+)YR!JUvxhWqOxn?VCKuz{6a8c=V`$wg(%ClggP ztOhhqZ0>{U81gg>0|s;ljePS!5^0!M6y&t24-!S3AR<XypOl@hs=9_m61UB%32=Y1 z#H`8z`Y~lN*<DN=q`lgWqDKzhEVyd}a5GK^CMap38EvW(bXmtx3y=^0e0ar*Xe1PJ zcdpz!dGCF%2sh*kul>{Jqa8KbdWU5&6&zpPRrp;dWV-p#$E3I1W8LAAxYyG=))%{b z#lbx~+oSuQe|LG8H_;k!1pUKb{wShYY0&ZV<m$^wK5WjB_!8tJ!Vh6udL=YRC01^5 zokl6k6%s0=a3W}jMBLB-t6hRrEC_3Y$I#Bo*fTJHv@}R+Qwq|rT#(Jl2%_tbao3av zA&Uy&J2+K9g_k%rqDA8<h!IServ_}6q;7E~Q?s2tT~a3>s10*GB5yY;Fv7&4-|~;} zYXTA1{lQ2(hCfM0;~iIRy~AXRx%wUMLg%2&uK?=DG6+QAn!-DU-L;N|FT`Ue9WR;^ z6u2c!f@pC>d@rm5bh*!?^Bg*{UDJ`x(2>oML6rL4Y40#@q6k%?xQHJ&MZI+3Yoskj z;2_pohtw<8`b>C<{m7dc0w!-4Jtp{LRD8p<`!r@WSOi9Lj!ox+g@Za#s-XMEx4byn zniO4=BIERrny|GMi3kKp`qsBaPO&!eQ#w6}Mzq72>Y|n(Q>hteBft(LY}3Ii(l#>K zSuqr+iQ2G8Xd$FVXVpp%FC-|pU4P?ki|-wM<ZyZLy6Z>svC-Yi|5JGP2kTx)Rkt?_ zZllXu;g{EbiB}$dI4ykK>^6MaWGn0q@V|NF`NFT(b_WtelFx*@)Bi%#ok_^;e#p%R z-2tzCHAzl~-PK5n<0`Ah904MbWBO8e43qMHN1Sj*Z7(tPVE7-q3$Q5i*P#EP8!IE* z@1Z_tmz7u~FrQ%o8Gq~^Sx4TK$R#Zz^73pC5mKs2Og9r6DC2TkM83jk<h>KuyHlH& zTD=P!o5h7UwH!ULaPq4k&0h1Vl^s{FS^dgB&!)$(Un1NY9jhx0;)dfJJ~k*A%c}aS z0?&VC<i6V`UBlNN*}0pKT({+xg>pl9$36FIx-$OW>*5aGQpERROf;q&MbJ-5!MgCu z(OXm%SHR*AK3XbEAcaZW-VnBBnp4$08e>tg7W6_nA8x5cv3(+%8FURs1*54o${$+S zADp;<d{@O@x&O{LYo&+mE64S`X}MAGxjoMpR{y_+k1sKl?d8`At0$<QvJvwC3glmg zymbqAt%moY?}HNsYYm(!Pl2AbfpMD?i)ez37{<ra6dMVPQHzHziW?En#c)n&#Wj}| z<Z(u>+8>HFY4}SEbZ@`W;i+vP+8b0$;euhH;<PLd7n}d)XC@ukHPJ9_(y8u@WkClY zBedY(YQJvn+O=12+w|zh)tevgJFw-y!_kRw?CwYZ?FY)w`g;O@?d&+hKlil<o`^<v zts8$N+qL58qMPoPUfZ^O*ENwFZ(4EV%i;0NaHW6srenALd;a16`!e29Ik4#;c0I<{ zN8l#k`yJECGOm$yG6<c_xv@+HRLEP+L5!;*+DTrC#udjg)c~C|6cMP{m_$`;0ObJ) zfS`T?`h%^A`Jj_l*fAm^Gh4wit4M&O0d<PCZOO<Xa$yvbXw$}^h$%D|QSBY;UZ3ug zgkP5Oh1XYJ=T3cW>0kH9_hgP9IQqTpHQS~&apgUmR-}ada5w)Q{wt5h*KZyyt*(9k z!H0RLXYj9}goPh(*-T0pSa;pcpCy}(x$xo^@kUk$LPSE`5p3U?P*K<7DpY~&^EO-= zZjS0dwBb<qp<Ci;o0XvpmsC^_2q(6d9A+gh&2aE9ZTa|XyVkva<fUI7$o=}?#rE$X zC|u7UJ;Hx__zy3>^3K~od-h#zPrQWK!vai1H5j%v`$;^Kwq%ZdA)|>MJ5iv5TJnlN zuD}YGqncmNLZot#AW%g@Er)`sCWspy!oUEsCjJn^@J`1@REVE$USv$1`~le${-i_4 zJH~zb?(2=lqp=nL2-dqBmc7H@G?p-X>f61Jjh`u8y}f;=t5E8}m*%;3_|B^#!&;os z*#xXSjzuBtn<@yA4osKPmkq`h%pIpOPjyrhuLS~@)*rOPdYk0-_=`IM!3>cBAh3bo zhQ71FhE)zVFV72;6Pb`VEXQ1fTMIAT7IFXEBdbS;pK4Fpec#!A*B2iv{QkP|@(#g# z*B2xy{?b?WtQ?!T*W{eov2ESXM+*Nz-*<K4HgO!^w}ab(>14%)hOMFDdbt=2XJRym z5}ZKD)3Z__YSJZhgBaqHqacP-_r%M@O3e~56cog?S)a5Zh^deLf3&>|V3XDPKmMNc zp7*?Inx;v5O-q`lX&OpN(=@c9Ev2QDa<O8qSPKFImU5B%MMTCJGR7F9b1L31W6U|` zToUSK&KvVS=hUwg=Qie?+nk$oZgZO=g#YI`Nue;e-{t@RyV1VQ^*zry=Q+>i^L(Ch zF=fOw0(_lt*CVi|A)t0hX1PWhF$%tmKou-*%7~tA#h8jr#X-_g!eEaE&h6>(1%kc% zmtJ>X`z4$C`ukIVdt&hL__9cl=Sn;12+H$(=kzzH{@&)dUNf{vZ^`d&S<XUk?|JiD zdnPUH+ukHxx9@xEy`E-wZ3E6Kmn9cLo3=d*0fe8F|6t#|xwIC!)|t9pU#o8?0#0qI zmMq8Kh-XJBSqJb5@tjsccJU&`Srd1_mKjU!H^`O&e-Bl)=crf<QTQaw6n{?{QFD+1 zm;)4Lf|A2pLX@Ya2Cq^%dT5Gy+L$@DMgbv##j6Y%SK5#<o!qx**={de&m!Jn!RFvB zi)F{u)jO=#Ri&QPx;DpkY-fJXBttNM|IX`w-{W(I9_=iZ!v>6{u&D0QKBQwGE)uQ> zP8`I#See?bcVJ!AX!pT4!PwLfGDbkgk(4x8cla!OCa#CcK7lni!aj-H6{Qzk2GAu? zV%bj{0Ma?jX1V&~MQ7VAwv5eU``@=&0%zDP@QI18BjX0(%)r7bQ#Q+<9m}`xn6hbb z^BcLot#i5#R?pga&kG+tG5_gsS*)JtXXQKGrH=VK{CD3J;WMp;mOVC>mpbVC)oo85 zpFhDH>JX*2{A{~;O0A7WI2#7VJK*@J)aGQkonWuTbHa*=m?*L{v5!DF4!@LRvjDtC z21`Cv03hB8wDWK!aw!e~>gI9)@iOL0KG0ZkXQrkL=K+kdjG+RKU>X=1DKP9~jR9~o zqlbZW=h~j-g^?vw7d0$g_*CNQ2RpZH>we-OD|A10lyB^v`M2b~cZcRKYA+qjesKMr zsrRZEzj{4${pz{%9f7H-k7=zlZF6duzER(UXya&b`C_W+?Dt|;Ei~;8*doPY3fbWv zp<C0<-^mz}Bdrmx!#H7VWpI33fwv;aEtZCAc294&@8}16oHw%u{+_FMrhwNwP4be$ z;uG(jXhpQTS7&q&x;7tY(H!wM;+~bT0+GQ~%~n8Xo~$4cjq>v0E`ZdeHcgoACGDeQ zuhlvf))9&*o<-INLV>VOlv$XCQ|f`-f>9L#A{NI{1=ryL)8;B3MSrKyD`LAL4-#}7 zBdiT<xFEo9w3w)9Zd}GZVQ=*h#QNJ0%>Kij^RK)6^+)b`ZqwBH<A&H1w_N}2)WP{T zA6l@!|7+sbOQ$z2ZVGO`a^|w{_um-qUvPNG(Qn?mciF^x-`WG4zkcnfZ!g<*U`2Cx zvU4ju2jXknt<S>Vvm?$s7u8mfI-SEr1LRi=DeejryiMUg3yvf#SWloLQROaJPlWWe z5ctH0;075Rxh_z;(262=I+u_>i2`M21ZbejRX*F!;05SAV!+Da{Fd~Rsvn%TuyO3l z>Zg)VKh$~Uw(iFdrrvXJe|qW1SW}66?+VRZ)HW)=_>mj#WQElOuilXQ;OKL`_F&z2 z?x*?W+8ZaUvmC}&70Vv4#m(>#qJ#6G6o58?5>=<7B^)<L=5Q(cm(Jl5sRWt42vP+o zL=`c2e(bX}{p&fye{8<7f6gcOjr@)*M9T3Uphq{--@%k#Qs0qJO#_KPi6Vt?j3mAz z-6M&*FVlB`_MrgZ1E?PM7hN<)&3BIZ`nH-oxAbp~|LeK<R>Qxw@6(8Qxo_*7_|{`@ z8o{mck>8(-7(Kq<87AB+jS>7pfNiMn2eDcHkxY1+BGWp)-;<6w`qcN6CqmYVx()1i z!>53QL_CJu!J>Spf6JDBx}U9m##_gHTjRK&xA1e@)_(mMJ$hXBZ|#q7)sN9r$0gkx z(|Xwpd=c-&egY2><N>p(0<qlmFGiI=fcIosH4C;1qUC8pkj7MeXS^oW<@LGPVGj$i z7r;GJoj;N0)zo@V-ec~Cui(W#4FTEG47;aOVKd2xK?6UE9)rvZUOrt_hliTeS54ue zN$N^<NCF8s_Aw!_e6{5B`!v`b*vX*RIn|y@wRoEd^rq^CRO^G!S{xvn3J~s4|A2`u zR3T`IYHaFc2|>Qe`k-zOO+;K9pX7{(saw*6mfX5=6%#wvj*r2;b7{VM)a?sc9NgrZ zL9Q-5zZi2up_W(13@OaQJm$n<Oqn!9Nl^#Js+g}aulMS!p5e1t_Zv@hrvwR$vupf~ zCyu6)E9d_0abAE&LhR;iKV;j175d4o$8RZ59q>Hz0sHHwzihMVJAHRdJaH}Hth4Sp z%>VFkit!mMOC0yGZ^oIGg(pgA%pA*@J*g9GQ?I60#2hUa-RcOiQr^2OH8r*QxjiiZ z!@?N5p3UK&z>a}}6E_q+y)hNnU#vgzPtKc9#NT3y(*oImlXf2FrHC_**1oI}tyW2t z%u+&epuP@gGA!u0P$XlRq@<~85zQ<LE>sf-;V{D<D3m;2njVjd=|N%#*6UDSy6gs( z%?U41g~=>JzoG4=GvO$t`KTa%sbXNxsZ0cJw`#RPLA)w|up&$?lncPmbLyA|xka$C zfw&2QjV0~0)RkXjVSG!oL-b6YyZX9I=fo^Nk61jVW(S)QnaBoPN2A@E)t%eWw<&tZ z%Js>JHJIf+hxMR@tM!fLn`xagEe07#HUqxI#TqOZD!?LyTef2UQh5nD5TjJTG!zk0 zXEYOILtcXZ0wX<n5+<UMfXTaQcsdmZYKd&9)FIs{EE<(QK<G$@)uGx{PykW|l!+sP z0&%Qk?$T(3<T=%W*nD5OJJ9MY3HEK?y5kx)qc_&V!XAIw<?H*SGd-iczRkC9+Kin` zdL@E;UyAv&0v~^+27@YL!D)a72Qa8mT1xv0mRAOOQyQi$A0A_Ipyi!MNQ2TCq+-oa zXobjv1=0#9iZRu}B}&@!Riq>U(?dl{EMss`*l3Uspg6BEm}Z+b8q#M4Opsxh6th-D zM+gXB$R0^!nt=<YYy?Kk?(1xe^=|bo5blBM`75`soz>(js<H4bO%CB}u!xn7Ry4?Y zt!LAUXXdwsn|3bWG1M^s^mL}WS}KLtZZFMoPtR9#Sc=+-Qq&+X*WhOlh0|lNtdH|> z+^dj9w2<BPSmK!~#$+MI4Yfj;-HH!fJA#VQVYqxTIFgmG=tJKn=p3Rx)_k<SHPC%g z5i`_ak(26fP%E#j$FwO)xpEJpL}2zZQSLdCtFR3!;`%=6Y1`J{R#)wD1zbhZIeV<5 zHaFB*`Rcl>M0T;aa5IaUquhJ;`8|G@Cm4G(pGuWdFEj|jvnnt|USZLN1hJ2<c~frQ z!<J&qli>w_fVw5%+{qQAk#?jF%))wF$LFM_fs#!GRnyC2s8((AWEbgFz&uF^J=AWK zV1b$DsO4lMp|cB}he5}1YY}kMcVhjg5uRjRG-VGrrdEBZavR9LpkT&yXCfzx-<__9 zoQ0k-vDS`kY=yYRnG_O>iP$s2&_xZAv_uEFeBSaBMYfB!M?QKZcz9uxoTKt+T|msz zhmLWkLvvU~2tj73(O~{UCDhZJ%UJZ|Vu=6HKY9%RfQ?}3SEZ|U2}qGgNiupTOc|e7 zW{q;?HnDAeT{W)hJRm39Ha9i=X!oqmgB@&27u(*~RU7FDRC`jZYi@d*HOHp;9ag_A zeR*RvvN7M|2mOKD<!S5aTjVaSX%n&`JbuBVwwot8x_d$$GiD8XV`X@+ueyD3AmH<I z&erW~o_ag-GfD^LpDb1TxJA1|qmrGR;dx40^L$8V$4kN>V??Kn@KB?g%w%JfR%0Vb z&=kvb?U9VF0KYQnQ3s_5q!GzlMGsp$8cG@XZz4!dn@vfnQs@%dB5=9UM-`#prDCG? zP)>5Z>WidfW~jnEX)u~FsOAF55^MVm-p7dyy8x2`#jJSJGIWse!^v7Xr2t-^+k0!F z*Jhm=*_mDF%^!?(7mX^i_BL#_IQ-5$XmXttIop2U(nnJs9JoBIlJiO{<Gj%O$31gX z?|KV4&(1t1Tt4>BDSe=HVeF)bt>*o(Jc95F;tr+B=^)Dn(jYwKOUuotPAMN`6E~El zshrNy;dsH3;Wf>b`UD3eDMu5oY{qH^&pXU!h{S+_p=bzPw5}?u#u43fp;?8L8bUD; zM%B1l;U@|)(t8g^{Qii4eQ1Ki(fZg#m#d>j<nm%35H_(D+K%_*S%2ij_9mb3j^f-? zCcG`b&iCf$0@%VGr8vG~G1B!~s+)zN<FZgQfK}oN6Wa(K%2hPSS{21&;88o%4?0yZ zPbb=X(l{X$HBNAZmLD0aOz-K+bZ^NF_JY?Zs}<QuH8nmhc7ShuSOCNlYNG!Y$c90B z+mt9q9st5XAP>T@BQ2+xArl57xS+_zDxoBcI@eH*eflU@HY)ZV)IX8!k-z$3tG~hT zv(xOS&vAEks5R76gK~Cfjh~lJD5~%my8Wpwt-<t3jy&+|JJ*Jy!BJ5*A%DZyp!+5E z&PK>(2F*HjTwQc%no@3wvF+G7MT#z!)&b;@W)Md@g;u=9N}J~#iZ=`cPHgqmAUe^i z0)xo5Yl&%H7!>M(i{LC(Pz?m>{gKPMz=>GgL{Q#TsnS7J+Dgc-0#g2{&M82Uj%WkH zKZ`v=s4c7%T+vclpI4Y!_A{bUt7$1H#By(~-63o^>V@1MoD8+n9hoUSa|5Lon<s`P zG-JM6L)|QSYWer2eq1(goYk6V1BX2bIykSkaBFOq$g#>NVlWp&SV^MXK4wQqtZwz3 zT4rQJF!0#8)w(JJA|zg*b`9ALqef7!CoM`vqy?tJshQJYL_{^I<&sdfQmBzLgR5zY zL0=E=h!H_m#V)<pU4u?0aycjvJq=QZ`sUO~+2EN0#E_RUo7YmB)6km=cb5z4gI<uM zOo1vmy7$tP9{nxYZavyP8a$OmZ6_c~$eCffhve9C9n%RK4&Ki5q6sv5NVuU((_rKx zwM!VWv%wI`fJ{8~lr6#n7-~!JkTwTZZe;po5CkNlV~r=QZX872PV5k0*EBlP+Ei<d znDc?E`e?K2avQHslk^wBFnqvM=Jk)J{$_O%l*FC61V~#1m0++|@&OF2FQP0H>DUnq zC9Pn=dwjN{sW|RpMGaUM9rIhETE>v=w6?*D=!tdaf>rMF`E>{UZ7vr|4<|Yt(W3R? zsmv3>-`mump+)hc!k5}gPpycSUnslE;f7u1u&-TKHTkhOPAwSjX?tqVET`*@7H{Sa z^hkFb=D~l`!ym^yG;3GUJj82;XCW!8BXoX^4<{;ce!&1!Sny%-qgelJ@x!*tv>8(M z`lki1S|C)UE9k&zKux<zx`!a$0A!me8jqby;H&_ghO?zNQpPHa_ZcsNHNb?caD+6= z8&63yu%>z1)RCeLMSOGqtMnQs^e;YBc-?Ig=y3_VZ6;(Dgyr_Nbmi`lHSKcg_3_Fu zS!krL!jO%^<-wjymMIsvjGA199TZAcW_(mp5(D1_6D{EeT{pExN8p&uSR7uevyFzj z79uVWIS&b0M!m%{%?yzk4?7<Ki;-`1h!%04D?W;p_sAudu1lnYj0`JitWzOVA}*qE z7ldZM9%{h~d{pVBQ^vd1J6JPk@$QAbIr*Lqq3)%@wboQ}<Qd1_I&H(-ZNb(J%Qih- z>|8o`^|lB5sv)Nq$Y~DbL_FA6Bi2RMZK)dg8N}D*;H1k8{(qyuPI@a<FacgFkzgDD zHze4(fwM`lSDwLv?SNu4t6=b)&4I1ez^-{0a;Qb!1_H+vIilrZ!DNFpNV)5X9}(x6 zRzZe<M#i4zptzD+Bv?ma$<M^K(9j$m(h>&6`%179H1zICmU$^8f{jx_e7Ga$f24N8 z{6jmX?Q7z>U~~N;mzw#<NcGfU=Jk~^xNX*!c>y#PusW@Fp7minG|b3pPiq+ExfK<x z4Y^B0+17jxCKS@=O(*T_MT~U}b_Q()MCoX(aN5$NR!P*HBOpl{hKy?Dq_DKQ23!=8 zbLu)tmYb_SUXHDjekw1lGOfjcmM5}_>)hfTvLfC~`yo*dIwi!aVc5aQNdz(1zyUnK zv>aESDuK^UN3x5eP|5Hz6dwvX7T}+$r9>tqM(I~omrEymQ%H`fX{v78G;8|0nX6-Y zb*`Dc4S|Mew9_+lR*i2#p1qg_x~l_#R?m$1JGS-vZ{<A`YJ$Mr016xnG<CZ@Vk*hQ z3wc}%)6WAwUc?HO4*>NF(jJ(3BpG5l0~*YFDmV&{k2y{?F$^bJKAp-8_$oq$0mDIT z<x-`U4chHa@|-9P(Ex9@0g!=uq>o~tJ}v;T<IS2GzVfaWgS}G7Sk24>R>4adPrbU{ z?Vq-lZ4wdL)m>QnlqF!ty?PLf*u>h<(Gqiq0Q~4E)!m`c8t9UYsfxWyD;A+evM}7Z zcXYOlo@zxORW@rB&=rcZpgxZpBSV#ucB4L)c2KV+%q&cg3ytO65iHuc4-vglqj9Ar z9I!+wkf%EjjSbbRUW*`W%0>VK=WeFH8eSsBlxWb1P5^QrD;$1^&RZ3o2#!M@-Cq$~ zi;gOCeuvE>24geI!jhTuC*@cK9ST_Ibi}&nMsH@fca0H1)C2FcwC0)JeIJha^XMrJ zH_l=AwLGTQxb0-Fl2Zt)9Py^4X7v-WIt`(X>ktaMd$^AbS*@Chfg{dIA=gZCIPgjc zHtK{x3F-tx92bKgj?u%QLn;Hjzp;w#$8CE`o22wsyYdbiS=ll#XMcG`01xL?&zCZ6 zFTBX*$Xfu?3x~RMSz(GYUoiC*n;pCcTV|A`2Sg9oM1D4wRsS+lqwd{)GFQJHb9@eB zy6D7##v)^=v$^7z!IUO+AgNirJDfQ8Gw&Kw4Q8|da`P~v@xRX)6MydXnDSf)E%vN@ z+hv>o<Itv~%r$ou-eOVXwdHp^@;+<4uG}(aOa1FV4f|W6?wsuZB#UaCPuD{h9gs%) zbVA^ih_oumjnXPW-w1y_spquP^rqc*#UqafyIAue!lvm(ECn#&3M}mWNlFJdo*@8^ zB`Njcihqi40M$zxNUyb=A*iCf82g~8pnh0Po=Qiq&a$8P_q4j(Ko@N*vUyu9`Fli; zu*z(!!)ZIU8gh#^X2l~lr^cz5jPhGVX=+?gf2G%5<|tx&iyWRXYmr`SfwZGIfuCA6 zp>XOL^b_f-5d1L7W}?#iLgh!G7L+WPY}FJyo9OEhfP^DTYRkYXsYGP%2o%_Gk^^m3 z6COg|S70wwiF6!BNvSjGDg!8&R25WH8<<)UMui!oE~V)s{%9;KV%P;F;@ZDC>YPpo zD@`4}ITkLmqX&pBwbEl{HMh<5xbt1i=0K4RXC}7=Q@y^Z-!gxu-RfkI4|2=u7Vf0D zS`&YtzinKvur5B;vlKPs<T=uf=Y=!1k{AqJaL_DKOqC*Tg<$(r!IrXeax2kR;j~gl z)nO^L8LDtg(#H{ATvAGkxuh5Ym{QeWtrVfgcu6|%l&)k*_#u)KbmKT=$;s1|<>sN@ z90r*G;$?`UTk+e1z!-|F>mn|d0)}f^q0`}%34{eu!3t!zDni(JV8f;Z2R3bd>xDgg zpL_P2Juk40@p#*zLv3Q{y?gF???CF^Juf_e_1<Tny}u2QC(n|FTe}Q7-_Mi<d~8@7 zkOD)X>dbLd7A-RxhyY17j3y_qut<%jh_FG-z$l9UH%H@Z@cr8;cpx>O?LT`AtKpZN zxK~_va*nYJ@$oXSEYQ8<>~Ye4W)oCpNVjTM)ktEP%q19TOm+Ut>&o#qrJiXwcHLK$ zZ_9IUZ^dWr$7i(~d$2BsKMU50`Yfx;PNH2$=Cg>{och(pQjdd?{O80-ZtNj4ac`PS zoSir(A}8NB{J_z<G=``R$qet$N;kDo$R1=ns;JxVyJt{v8~(G{v)PHg_^j=QM^*Mx z&J?x0=#c{UNi|50uvYqm6FQ~j>Chk1r!X~l#!las`5OnlgG)qY?vm<;X}vYoGdE(q zcZ)eEUotvykCo|adYBz#Y{ORp&Q#sCM2)vf4B~`JE2$ts4uQIkS`J*c{x(aKZR@O_ z9af`b=@+(M*3>z<S>q>a#B(Pj#xYbal_3|Z`rE_{)cI$Jx-gN$SCFlu;m=NJMOY;k zg&-S+1*2?mo!XkJP!di&EOsOPw`xO!KVP=Li1s3Rmd$owbxrCc`vcDGQe%xB{C&p$ zQu}>?|76+Ua!2w?ZQsl-wq?KV4v`K!^WN$-ik-vN!fj<hWJ87NG$^5B6Q;VOJOH#3 zx|=qj$^#(iqbe&9?g^xAL~KOLW>uZ2sj2oluCy>$mQ}uJXSOKdS!;|E8(L5q`#ll& zTlOrQUEXI8_(JZttvPO%`%N3>;ZDrMi)tRmLRyqNP0v8O-(tI!5^mHm8LJ3^EHwB+ zqLwTM<*XI?YoQ&bdE!pXf#vIOw=}0GM9fJ~NGFA#@f}-?eJ8ib^_m-XK}kF96Lxw( zJB|?51>rcsZ$Vk<>@;pdhmKBaId(F`vYj9t#J6f>9;cz@nHXSN6BXpAW-RL96~68p z-n_osSHX?fYf7byy91rw=bqc$8E|u#ELHc?C*;X4aU3>pOd~C80jdNhu5o0zb7C=6 zX?}e|1D-4!h(fSJLVdt~2Rlie(@p4^=;QEL!$P7XGksfykKFLmwIRPRU^ItnT0nX0 z2~>-RdlxL~@dW*)R+|;7(r=T(S{eZ5pvI4XWZZYMMXtrkl}mSo-aNo%<8Uj0KzM!T ziXq-i3MJj%f@m-p1chcnu!=}5>GI5q%FOT7Ce`I3)v20C81K%Up!me;C&?fs4g1L+ z*#^un&Qh#GcgB|k(ibht)2M``ooHe;JB4duE*tp1G;=~6<pV%PWSG7Zf>4(xR;X&? zGb|z46@GxlVCz;$VuPmIQ3Zo4jCXeGjpO`mdZ}01nAaVf+uhe~ycDhpjR*MOGmW_l zq|4@V$AZ((rE~wV7-IVj;^=C?`lPjErW?<WxMpx(GA!>vE|XmFD+AqdWn^-=t*^bk zPkhwZh6`}aZ%<i_Y7;#tU{TBhdP>V{XraE`bf85GYH*Inq6I}U)YbVL0B$zJc+za} z)j3-j*cv?C7cIc=0)RpaqWDLpdUWlhsy$rbUxSkY#Zlng9+;{A3xJX_8VJ--j4>Rz zovn0uSv=LlBHL0ux;TEE?F=J#91o|qu%T3UICVW+N&oQ27Mb*V!`=!n{y)=RJH~bY z#!8q;mf#iL5$267sCzilQlHvXeEeX&+nrh%c1GC!^=x-o$YULPYidh4wF&dCYdt52 z^aar6*}(VIYm0#QCZz2cV4Dh0VVe;20n#?Z=mv_fL<NvNh?*q~Vg=51VmC&dLl#?M z$!H4epn9y79DSs59z>ct&r=bkhXHgiA)S?G1E(Tiy&?!GX_b@8ny6g3NKu@r@}@j0 zDyFVa&T;G)!6}{9MQmz*L9q48zUGb@+y8X8uf4%t*WO}e%RMtc_r>+8MB_47_4ug6 zFK(^B{CM&k8}*_Jm;ck=zH8ixM_2{(vw>W<>++&&Wsc?H)C&hwpX{BipFIB4t8M<C z3ENoJtF*4>oV=XJj7QLmCJ$$1k%9&0VyM{u*im`oTwr4>vV#d0Rn(eZHD}|KTTz?q z8DHB}Q<cx6+2yG_C+F~6?qbou&*dIx`J`zJ*X_7-R;niTO0i@Xwnx=QLcS-jKn?Dr zz_ii#6jNt0Dy>p5HV6o)YWP_b1*rWRV`T`Y|Mf7iHr~d8&c@VB+2t4Qoju9x()lg# zr)FQn9QLx-8}9h~4)!{$E0&XP`qGUnHZ))?M^EnJw-^cRXP|#z1{Y?`;BbcDMPc}% zy|J^QXOni7d$t1x3V$#I>MwHo&>_wa1X6yP0r+daG>@`m7PGd^>I{woKUa2Xu=7G> z9t~r&9Al}p2&=8AI8+n(^v8jkP!Uc!A#!tb1?d-U(#hTIxN!*g)1)Cqo{6(04Mm4+ zsBAD)4ftmfS)m)UF)~(d$bA#yAyZ}G^ilNQK#Z_f0M~%x@)$dwnwga~WA4<70z(v3 zOq)AHr__UP9Qx#lC15eK3JdG%YQ(s);kv>itAUPe*;b2=Tf#kgP7d-C<KZ-lHb{CT zgA77W0zecfQj(k}qX_{MMKi97`a~Ace8_obsoYf-@?8o!n}yQdM2U~W0;S;cK?5#q z3y%}Z5Wj=21W#A@<rN|x53!;Lkbva^nO0QA@~Hg}S~KcZjnP7ITtN@W%hs)3Assxc z&|6hgXyCtlZZ>V^%Wn6yc{nWYy|K8ss<zoJzLomrswJb$(N``>9jlx)uDUc=WJB<u z`v$8yR9H|T+s><FoqNAfP>@v+o`W$Lo*dv_<3Vu$06A=<F{eYj6#E*T9y9WM!`eTj z_J9uqhX0U(BfzgpfJr{#gGq8I%UVnUD=p!nf-nxSDAl+a0>5pL0YEp1gkV^)1_VCx z8ms*2S*tIE0I;N}y;uQ60-FIf6#7%n^st@gz|{0KrUz{?4ePQ?Xw+D165}q}$SPMY z@tC7GFJW@|Rk~?fEGFObjnq#M6`DDAOV;Y{)T4X9U^pB`Rzclt#C9J!`8#&K(TcrY zhWbH8lTQ5T2=pjROFu#!G6m|CAP+HpMQJ7Md_f6BtToa{0PS)G1$U@CY-2s^?d!-b z$+Fo%OBXS?#cq++ZFAb&=akOqZdrThqy_h1VyP~*?YO_I?O1QOc$uDRqxHvuEB&4B zG1?H94-<=Sm@KUtbx+AsltWW`iJFC15vRCTrRuBd2r@_&q}1CPdTFRkxp#;1ibLqS zTAjZCvUGcO048WBY1AVQsvgrux;x~D4ON~GWCIy7hYD;pRO^zc2JkysH3oc@w16qD zMXehEVa|AVRCGmBfCvcgjeII%S~Pn^2f;J4;MWyLyuRqNx%+Q_G|<}+?JMw9_^xdo zxAML<tr&INoSOsX9l`4Gz=b^ruWnj2D->uO9h;9j+=BVf?Pyvub?}CEanrDXxOTI) zNFUOdqJrFw?V9#cz;liZm=ENvr2k-To3FNvdG*@|U#ZTz`s2-eEY+_bJosw0We@w^ z?$`X{?S1ZjzZMlg-97RTC4Y|3_n!KE@_mpzRZb9MLZ|=Wn?`)*S)cz?zy9`(?tO0y z|7*K<kN89B7u-MZRG;sIp3i|9r+hB>Y(NMk?3fHLA!uksX#KNCWF7tD_u@YaW?!8i z#nD^cxBe2NAid?+7O|H{es1;=vI|Y+4yw;JsfZ)}xg$ryf}8hPgD=M8F9xk79o+EI zTimxE#og2A_JVJ45q})E!2erZChx5B#73uane619sTjKswKIO|VFgqpd@cfSgYz9- z%ai4b^Szun-{I?}<L@d~15kc8N@z5Nn$oC*1_2wylgpuLs6LR6WLOcDD+1#mc-b>+ z6y8~xplrXZ;oWeb&GJ-VDYJB+JL{UjIboNzz@BGu@S^Ij(R_Db$l@<@SJ-zfN%f@O zPyMB>D-4HCO1tR-eQ54+?9o18zaKZQgVR|{U81tdIs)KZwId`1G=Qt|63PgaD;D+S zD5z9MnKZk?LLbV9LKsdj5_SpROkym~ddi9D*k%uEGTT*Dt|(7I6gvvBV>DWaY8{ex zR~6C3s{YjRGTM#G)d@<pkSnSnw!=1-sX2=xNT-l}@Vr!V0Q(XUqk-K!?s%8&A9&%< zn|9AR%<kV7y*oUsyhz3lG(A)ui)|i!?eSFf2lwCl^vngRzuf=Nsm%4v_HWLNu8yz1 zrGl3f@2IISZ}>uV<=aobok~F#0rcyOf!pw0*okjsSgU1JO`@IyEMI-H0i#c}Lp<#b zq;%R_5NqluwFY<`f?3Ial~nBS!NX$+N#1n{nlu7PpKx|l823_Db6ZnS<;U^)V53wu zw|Nw?@~a|KKVWh3JVyd$^zjACA&XDJ!IUmZpFzO6vkTJ)Am==&Jfa47I1gFfVQSw* zU1}`#Gket0)lYb%`k5C(^+Cpzj5^hPj}S%Fck!%;GAKM$I>6ym+4D^73y=f2zBu7C zjU0(@oMPr6T~$R1s`sOQeY%lm(S26ywCdE-5ExYB?i&2nAKGmV54_qrYxVWTksCTz zf2q1G5G?SXSJUCLvtKzPkL|SxcfesQ^#m*P8>i)a*v<0T$WEIRHuJ!VUu<qMhpTCZ zdvCIV&A}O=?wJ=&@>W+@cXbZ*ZeBs18`*#;9aWm?@Hppgba;dwK+jS!AM<>U_RTb} zZG2Re5<$rvx1VM?O0(RCzuO2BrnNO=enPaPJEI9yp2Jm6PQ{-TmIs|>ysADi8S`0C zpPa0we=-0Y$?#;nwLOf2{P<)wpX6P~W2YvQQZh&_BdVX69LDsO(eyoFwYf)4Q2iS; zSJKivl}@WO=1i5$r7`ROaoVUth0@C^YJ!9e#d0w*$jYD!TYoCD2-6V_-)CW2bHcuG z>bl4ht2I7e%}?!Dtl`DWH{Q4Rvh}RNx4ghI*uJ1M#BSI&DW6%+n2F{s?E0RL&+LO* z#>CcLtYccgFS@g#aZ}Gd8%k_DdNOivQ2Pt~tklj4et%*d<gDjVH=E>S$UQzinsDQx zi6n1tG|>ck2e5U(EF3!$Z>vuPA;z-$WH3hZ4FYwBpP;Qt#)wU{J%$}gY@)<N0f7&1 z9Y}j5n*$LK2Z4{I+?E4r%R+aE8f9SD3|aE>rvT#uCFLfHn*65tWM_QJXKoz$`jqcN z9W$DoBawip)PHF`OLj&P%nJgr>32rwViLmM`z)3of)@qyU6({WtsT{GJ6QOM$UHn* zdul?K{pp6iUHPGarIa5VvGm1+E&8tFV%;`2+~A+Nf7OC?W7^G4S!ZvK*7s9&BCk*{ z=-sL80_Zup1M}e0u3(K?GDbSTd^I#xGwN$S!MYWf6Jrf^2TWXyskpd@cEQCLL55Ty zJv1Y&>&zJ>aFgTVPSSO`3-JlqHHqRH%;kXEAe+PS)+111s(lP-DnhOFo=`pB)2g@u zTPI<@Lg`*zj(XMOWC0@is$EwJmF<sFk^C{Bi>63Em{1eTFs;j!wp_LfFUVU)ADOoi zFIeV?&!VGhHiFYQwq}QiW~r;hm3UjI71Ie$F*N!z%*yBtn(q?VA+A-NOP8~qhst}_ zW8h7RS>*L!v=;W`GG}}ME1|6!Z(RbqvH?7yovR{~WG<36MDCC_R|B=G!CLqXW%?Np zokBUER<N-6C}5QS$l={e0MIj3vyLQbAYk{;byQDiuotmAC7&q@N>f+W^kd2Ri?E)c zaR<-RxJxfy+IHF6y~W{g&);<Z_1M_+OI<g3TRKOxz1t>Rm|)}PLIYqmTCF|RVyCDM zF17o6o2K1g+<VpWhuEVLU(uNx{XeSV$I<(CTDW!I_<_rO;r(kpQ*U3rp+s(OO@+=_ zxaqT2F2@?o#Tv}glCx+H79y{gxCm=7&(qwAS*cI1B#p2ks%jq<{p=E~$4yv-=^n^7 z&^xOh$PLrzc*SZ<_duQj9fA6Z8L9{JjPtNc=BUN0dLYkmC^FNW`a}#bt3^}AskDM( z;33A(33%~TrCX*>#*&IDrqzT4YtB(lFLMw<M!7nW%ZVU^meve#=f!)Q;!~Z6^hrIc zRdNh*+_vT9gP<o*Nmc7gT4N5^P_e&q%?4b9FLfbK<;ozvCb5KQAl5+1K$$3wqRv=a zRA<e9gY%Tq!Aml*_|MWh|7FpoF-PfB{ggto3N*{@Z;tjCqK@!Z$=`^MSQ2RkwKy8S z%<eeqh&=jV7u!H%^<4{B-d5tduebG9Z(41MZ7reB{{E)JuHJRWpF3kIoYrA;XU<)% z&g}oqwRUu%XZ^H5bY5w}Y28LKkN3q~tgC6-3up5DG-8Df)urphD@e6X!BT1?#pMa4 zRbQeAii^dk6BQ8g#(ehq0o+HL6Nrv)qFJEMSe5n3@k*bK$NGUjBi39(%uEg^L&^{c zRb#Dy4J$(;1auG>st(DD_9>)sLX$E7jaU@Tb%;6Sjj1QPhQyRMJgVS#|F#Oofj}eO z><;h}n$U9Rut^4$LGT5#mSgF13gS9cu(AR+C%O<jeOwdt#DXZd+2)}7X{NCMYB!7i z#t}K}2~L~tl^b{OLsw<X{A%|LT|17AEW4kuh1<Dqvr21T^`Z~nNWJneb><u!nBB~M zyMDx%S=uaY)-C_M|FH587oi7C59VSS>(`R!L;lHgXq(T0;0tLsfVc_3XjV~eM5f4q zRvqGD6;OwGTYYkn=BEX(ZyBV`*V2H^N0ylCcYf&+Dp%`*m@go$-<M7VPfP~~MyLN8 z?MTdn)VnP29g23%gQwD%ejFwCQFWD!Hqs|Y>o9L!D&&x9t%VH0P(}L172%|vfMD%* z;G2^b3R6=-o1Z$QUwQ!!h4W`&Li?QY3#l?LdG2`&X;+V?oYtHLcxImSP)p}IN-;DN z&N3cV^>L`c(5V6gxfX9z!Vbs+a73sN03x<MJ1;-lII-)3S$*>^rN!WF!H0$G@UekG zD2@t^5IRs8Fe}RQicVV}n0tf{6!u6(F(`SYoF*04!5LG4PKmX8`XRKD2FQw#FL;eP zE{Nz4&KtE{$g+V4)`G5ptmE}K+vu>q1=~a|k-(;1`*vc1^xbjm)}(86XQZgtX|vW^ zt>N}?VQh9`Y5Ul^4?CAHi464FOY^<C*0EN9C^XQqV%F9zgZFLBY7U7_8xN*#`=MGr z{}||Rs@TO|<SS|QT;9Fs?j8NrQ#)Hn38!9qW3|=N+UvJXo!}ei^Skmceqh>VvEo7@ zmnW>2>&8ZAOzG^6MmMcou(M%3)|`%>75mI2@?JVHjuB)yviNZB9xxw-bYk@+mQzwm z4>nkZRDV6Oeung?^dBCd_`v$!SsS;swp&ZQ+uwWm?t7k&`TPy`+>Vys2@`sGzy8$m z*5eb6b)l|1=WkmZ+u754Nf9f&`1bSnJ-PS3Z!M05s{Niq*YRw6waN#op5by3wVSP| z*qny!OVW-VK&>-CWOB%?tnH%XPW9uPqN0>T%@gft!ABLG3n+#++|i*qT@sL(0_!yC zDQu@B295I+n~Qz8F*ryYD3Hw2mM~VPs7i;QAut_cTc>)i$Ebg-M8##4aWBvE=0!%i z(eEOapl<68Xcx|&%PVvoy1;arnO@=OesTWBo6%@}bfMQ(U{Sro`vN6dE7`!a;wQ3b zb;`1weYig#-P%CbG;E3rXWK+k9rAF-ZB^O-xk-3#{$^fr;uA+UfBn-+@k>l8@>U-B z<sS6ItVE2W3Hj9LHKjiQ<|S8w2p{rDoq&dOGN}`o2XTKi(TJzY>%p>#r%)S<+TfwO zKq2}hC+eu2yG_vpOaSBCDC)J>J_=rV+*co;;2=(o3}71c?L?wR<r+5Ydxs2LjRm}% zQ26M(i7vCM#o+{MuBYW=XGRh4IHYGeE$V;|Ou*wdw1bP+ITIGb*tGy?f-0;8Z^TZo zpxs+v3C)cdIU?rijaZqUpme2=f+I0!KC!xB7wgVwx!TQk@YaGKiiJaLrJp^#w)fia zMpnOe-C*i2U&r%S>-x5~^;YXktmohxw><mY-kX^J?xp?R_VL?T>lC9}q@L-yp;}ZA z?U}Z1{ba?dMV>^%mKI^Dw~7<nQoh~nYuood$=*#}@~6GqU0%<pyBL@PbTtpxVIC}q zpEV<TneHj>j#Bd+R5v7xXchqL!Gcw^O7W^_B8I2Xax)9FK=eJTo17P%Jus-eCdu6k zZ<!#CVDQl(_c3XeJ0{(0Cs(C=6>MEIA<itYHY6g5XC!P8I5<3jy-engA>3jjiyXQD zd1{~(^yga<cqj2{D&OX>_zcPB6KNT=9V~aH5IGWzI~YSDlzS?$e+!lly|8gh>Nf?q zo)YQ;_JnQLocDfPFlpuE+h(-(U8nC@x$?xDsS;DXCQ@rtZw{qC-34Yd5S5J->ZjX< zCEzW7iv^b7_k(TchfsY)@o^jC5N{e0;N33L-c9qIP&4WHIrYg3(hi79Aa<0DknCWs z#9QlC44v9?BC!NncepAHtmh8=?dl+5x=?+_;{C)Fm6#3@kDgACj;@4=QDsQ{n;G=( zq<RW7q4*r>uuKD!xYdzp#w*6BXJC9f{+@<cC1zs><iIaNoFXxv+#wY3;Mf|4IdB2A zfVfi$XigQwv!xeH-5?(4_!MVyd=rjF%o)0JpfH@4JmTvVh{!LZgNWB)eWUI@uTgRD zRQQF`TnI~L;H98sp;!j`eJX<oaZtU%U*y5N3ZmnJ6U+ww*4AbvZ$Y}o**oiz8LaTB z=>fkxdSKCqH>IxKVzI1mZzp0Qq$odV2wRxL<MRjmmcQW-HhqC@=lq?>#a8Q<#sG-u zVs(L(tDo5{uKh#Evz;}M7TNWVLv9&}22+FV_WrAxJpQO<fBwy}9oxV3xwQ*A3r^4L zYRsz*n*Oacn-cIi)BqF^>hvzjO7D`<G_@R$M?q>s*M3Z8D@|?8?rz1@V*4cR${n$H z($vB@P46BA#7Ax*>>eBDF4Nngu|Aor8nqHJQ#{u}ov!08^+O%$sqIkZ$wOiFm$FJt zLJ5+|3Gg~f8(?VQcMT@jPSipjP4SpB-VVhDA3AM>jHZwyZ8p~6uk&!|D9i@pkpFI} z!b>LfsR}<8Qa4=m-2=n#S<8UEe-+!oKY3gcK>fMnh2c5d{~Vv!IL1Wwpq*xH#^adm z(`QPr*mimn*bS+HGmX_#O3flKKV;nk8p_@?W}5aOc({zEIG0WEDa6w~#}mYFT1~S7 z9?2m`UPUz~f`Hd0@D3W#w)GS%7b&dMWxJSwL>bPLG9`MV97@_05s?iQ(T8fwY%o95 zGDrM8L%~4Ix(OS!*dcrkQBM-T0%}WYi7yWTY%BB|TnRem^QcjCydEX+Y;2eu1ZX;^ zMD7~>f?)LxZx}NEDRBi`r%3vs{>Hf~qxAwvd&nNA3)^>VepSoh-e(RkowmSYIo#T^ z#cGX&d~c;52KT|HSJ=d%z03%?O1r`@ym<SDf9gxYY}K%4<?=OKFJ+M?pT*jMytlOx zS)S<cy(N#cD_QQFZ05c54qs`z^ARvoaylpYF`N@#U@m5(Co6PW!iK<*9zbBIkOZ5D zzebglw}sMNB>XC&t8yzzSLITVW{{PlloDJ$!@cz~oTd~sEvYBcmD5pClvt3hb6R6W z18V#Q=`$e8+i35n9)9G7QzzpPn?dWV6}o=cS^mwbC4*I#C0e%Jzw*Q@DflU*uTO4F z-K_^PF0w4Y0)35<#4DqUYBLCxjX$XeQig;C^kc9_fVWQ;s03w!o%Szi0^COuV=!E| zigCFS<BH?3!?wuOTqK#QHD=TxjYtD(>9ngriztwiDtH*9`tC#p=pPbZcn{cuPT26K zB<>OlGN#wVNP%Qlgzhja^Q!Xv=%hF^5*|qXFtlQlyQtirCrU%rQ`)<>Lq#UHV(TrM z@bouWb_wTS6yf6smfpQSR^8tk@isZ^ei3MR@u0ptV=O2kwH|Lut?nCOs|WQv)B2C> zwdWwGK46T{Uys;!<L9U*aY=pJY>M;}n_oN}P2|J)EgRc-5sY6JzgThb&W3CpvuP<1 z@h+n3@!5{VoKs5yCR$QcaUIHpQ2*|^5YlXgNN|&oa<FCM=M%S6vf{!%i0X{^`B_UP zBN<ej#!ztzCJCjh)T3xc3l0)Gr(io%A%ICf5)fTMKzm>`XBO5=AB`}%T8=5jb<q^o z?{-<rvnFw?^>7tGYz08Pp=AO1ox9!a$^0?lLU%DJ?hfa~F0fXolFiFockut!N=)5s zPG?I?D+}x}FJP#V?76f>Yf>-v=DABwyzlloEE$8_Hn*PLI79G(Pgl}@bi>Yg3iA<! z{rpue8KnJ4{IFns<uo^esG=UsrJYIpv=DV~D#vFzk{FBWuqaM?3t?4q>ZuJPt=6<* zkStNFwS>y(5T6CD&X7NStWW}QEEHQp1AZ#uE5WRQkVJKxM?-2_y%h>E;zL6E%>8?6 zQu5JrfzAnK8Zc$jMOo;cfm0hfBkysccbBgW_<i{mkHu2UXjlK+$(`BG$9IKeyLU)O z@_-OWGg})yF;9ME?uUG)A|v!s#;R?OCW@f_b7GUGBUD_EdVPd1e6(y)g;RzDV(heY zu#$&MGZYo<p-)~>v})7A16%4Ki>ss(v}$OiG_CTJN7^3x<ZtTf8F)I&5l0-->c`Vr zj>I|sPab))?6{krwxil8u05Fu=X?^cfAUaWxE|e7BJ?wf>(jkS;t}*Ev1%;KT2dOW zi`1WPHNx6aJd}QT+VmOcjC?9XLd̒dz(ZXuWiHi+(LXqp&g<O>4*p_aOu6~eU8 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 literal 0 HcmV?d00001 diff --git a/vendor/webman/captcha/src/Font/captcha5.ttf b/vendor/webman/captcha/src/Font/captcha5.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f7cd998656b6ca8b1fb2e82fe63fa19f97c4c2c0 GIT binary patch literal 49724 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 M!`$=T<I8#f3*$4osQ>@~ literal 0 HcmV?d00001 diff --git a/vendor/webman/captcha/src/ImageFileHandler.php b/vendor/webman/captcha/src/ImageFileHandler.php new file mode 100644 index 0000000..488b8b2 --- /dev/null +++ b/vendor/webman/captcha/src/ImageFileHandler.php @@ -0,0 +1,78 @@ +<?php + +namespace Webman\Captcha; + +/** + * Handles actions related to captcha image files including saving and garbage collection + * + * @author Gregwar <g.passault@gmail.com> + * @author Jeremy Livingston <jeremy@quizzle.com> + */ +class ImageFileHandler +{ + /** + * Name of folder for captcha images + * @var string + */ + protected $imageFolder; + + /** + * Absolute path to public web folder + * @var string + */ + protected $webPath; + + /** + * Frequency of garbage collection in fractions of 1 + * @var int + */ + protected $gcFreq; + + /** + * Maximum age of images in minutes + * @var int + */ + protected $expiration; + + /** + * @param $imageFolder + * @param $webPath + * @param $gcFreq + * @param $expiration + */ + public function __construct($imageFolder, $webPath, $gcFreq, $expiration) + { + $this->imageFolder = $imageFolder; + $this->webPath = $webPath; + $this->gcFreq = $gcFreq; + $this->expiration = $expiration; + } + + /** + * Saves the provided image content as a file + * + * @param string $contents + * + * @return string + */ + public function saveAsFile($contents) + { + $this->createFolderIfMissing(); + + $filename = md5(uniqid()) . '.jpg'; + $filePath = $this->webPath . '/' . $this->imageFolder . '/' . $filename; + imagejpeg($contents, $filePath, 15); + + return '/' . $this->imageFolder . '/' . $filename; + } + + /** + * Creates the folder if it doesn't exist + */ + protected function createFolderIfMissing() + { + if (!file_exists($this->webPath . '/' . $this->imageFolder)) { + mkdir($this->webPath . '/' . $this->imageFolder, 0755); + } + } +} diff --git a/vendor/webman/captcha/src/PhraseBuilder.php b/vendor/webman/captcha/src/PhraseBuilder.php new file mode 100644 index 0000000..b96f6c5 --- /dev/null +++ b/vendor/webman/captcha/src/PhraseBuilder.php @@ -0,0 +1,75 @@ +<?php + +namespace Webman\Captcha; + +/** + * Generates random phrase + * + * @author Gregwar <g.passault@gmail.com> + */ +class PhraseBuilder implements PhraseBuilderInterface +{ + /** + * @var int + */ + public $length; + + /** + * @var string + */ + public $charset; + /** + * Constructs a PhraseBuilder with given parameters + */ + public function __construct($length = 5, $charset = 'abcdefghijklmnpqrstuvwxyz123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') + { + $this->length = $length; + $this->charset = $charset; + } + + /** + * Generates random phrase of given length with given charset + */ + public function build($length = null, $charset = null) + { + if ($length !== null) { + $this->length = $length; + } + if ($charset !== null) { + $this->charset = $charset; + } + + $phrase = ''; + $chars = str_split($this->charset); + + for ($i = 0; $i < $this->length; $i++) { + $phrase .= $chars[array_rand($chars)]; + } + + return $phrase; + } + + /** + * "Niceize" a code + */ + public function niceize($str) + { + return self::doNiceize($str); + } + + /** + * A static helper to niceize + */ + public static function doNiceize($str) + { + return strtr(strtolower($str), '01', 'ol'); + } + + /** + * A static helper to compare + */ + public static function comparePhrases($str1, $str2) + { + return self::doNiceize($str1) === self::doNiceize($str2); + } +} diff --git a/vendor/webman/captcha/src/PhraseBuilderInterface.php b/vendor/webman/captcha/src/PhraseBuilderInterface.php new file mode 100644 index 0000000..e6ca680 --- /dev/null +++ b/vendor/webman/captcha/src/PhraseBuilderInterface.php @@ -0,0 +1,21 @@ +<?php + +namespace Webman\Captcha; + +/** + * Interface for the PhraseBuilder + * + * @author Gregwar <g.passault@gmail.com> + */ +interface PhraseBuilderInterface +{ + /** + * Generates random phrase of given length with given charset + */ + public function build(); + + /** + * "Niceize" a code + */ + public function niceize($str); +} diff --git a/vendor/webman/captcha/tests/CaptchaBuilderTest.php b/vendor/webman/captcha/tests/CaptchaBuilderTest.php new file mode 100644 index 0000000..c6eaeb2 --- /dev/null +++ b/vendor/webman/captcha/tests/CaptchaBuilderTest.php @@ -0,0 +1,30 @@ +<?php + +namespace Test; + +use Webman\Captcha\CaptchaBuilder; +use PHPUnit\Framework\TestCase; + +class CaptchaBuilderTest extends TestCase +{ + public function testDemo() + { + $captcha = new CaptchaBuilder(); + $captcha + ->build() + ->save('out.jpg') + ; + + $this->assertTrue(file_exists(__DIR__.'/../out.jpg')); + } + + public function testFingerPrint() + { + $int = count(CaptchaBuilder::create() + ->build() + ->getFingerprint() + ); + + $this->assertTrue(is_int($int)); + } +} \ No newline at end of file diff --git a/vendor/workerman/validation/CHANGELOG.md b/vendor/workerman/validation/CHANGELOG.md new file mode 100644 index 0000000..c2e8de2 --- /dev/null +++ b/vendor/workerman/validation/CHANGELOG.md @@ -0,0 +1,99 @@ +# Changes in Respect\Validation 1.0 + +All notable changes of the Respect\Validation releases are documented in this file. + +## 1.1.0 - 2016-04-24 + +### Added + +- Create "Fibonacci" rule (#637) +- Create "IdentityCard" rule (#632) +- Create "Image" rule (#621) +- Create "LanguageCode" rule (#597) +- Create "Pesel" rule (#616) +- Create "PhpLabel" rule (#652) + +### Changed + +- Allow the define brands for credit card validation (#661) +- Define names for the child of Not rule (#641) +- Ensure namespace separator on appended prefixes (#666) +- Length gets length of integers (#643) +- Set template for the only rule in the chain (#663) +- Throw an exception when age is not an integer (#667) +- Use "{less/greater} than or equal to" phrasing (#604) + +## 1.0.0 - 2015-10-24 + +### Added + +- Add "alpha-3" and "numeric" formats for "CountryCode" rule (#530) +- Add support for PHP 7 (#426) +- Create "BoolVal" rule (#583) +- Create "Bsn" rule (#450) +- Create "CallableType" rule (#397) +- Create "Countable" rule (#566) +- Create "CurrencyCode" rule (#567) +- Create "Extension" rule (#360) +- Create "Factor" rule (#405) +- Create "Finite" rule (#397) +- Create "FloatType" rule (#565) +- Create "Identical" rule (#442) +- Create "Imei" rule (#590) +- Create "Infinite" rule (#397) +- Create "IntType" rule (#451) +- Create "Iterable" rule (#570) +- Create "KeyNested" rule (#429) +- Create "KeySet" rule (#374) +- Create "KeyValue" rule (#441) +- Create "Mimetype" rule (#361) +- Create "NotBlank" rule (#443) +- Create "NotOptional" rule (#448) +- Create "Optional" rule (#423) +- Create "ResourceType" rule (#397) +- Create "ScalarVal" rule (#397) +- Create "Size" rule (#359) +- Create "SubdivisionCode" rule for 252 countries (#411) +- Create "VideoUrl" rule (#410) +- Create method `getMessages()` for nested exceptions (#406) + +### Changed + +- Add country code to the message of "PostalCode" exception rule (#413) +- Make "ArrayVal" validate only if the input can be used as an array (#574) +- Make "Between" rule inclusive (#445) +- Make "Max" rule inclusive (#445) +- Make "Min" rule inclusive (#445) +- New generic top-level domains (#368) +- On `AbstractRelated` (`Attribute`, `Call` and `Key`) define names for child rules (#365) +- On exceptions, convert `Array` to string (#387) +- On exceptions, convert `Exception` to string (#399) +- On exceptions, convert `Traversable` to string (#399) +- On exceptions, convert resources to string (#399) +- On exceptions, do not display parent message then rule has only one child (#407) +- On exceptions, improve `Object` conversion to string (#399) +- On exceptions, improve conversion of all values by using JSON (#399) +- On exceptions, nested messages are displayed in a Markdown list (#588) +- Rename exception class "AbstractGroupedException" to "GroupedValidationException" (#591) +- Rename exception class "AbstractNestedException" to "NestedValidationException" (#591) +- Rename rule "Arr" to "ArrayVal" +- Rename rule "Bool" to "BoolType" (#426) +- Rename rule "False" to "FalseVal" (#426) +- Rename rule "Float" to "FloatVal" (#426) +- Rename rule "Int" to "IntVal" (#426) +- Rename rule "NullValue" to "NullType" +- Rename rule "Object" to "ObjectType" +- Rename rule "String" to "StringType" (#426) +- Rename rule "True" to "TrueVal" (#426) +- Use `filter_var()` on "TrueVal" and "FalseVal" rules (#409) + +### Removed + +- Drop support for PHP 5.3 (#466) +- Remove `addOr()` shortcut (#444) +- Remove `NestedValidationExceptionInterface` interface (#591) +- Remove `not()` shortcut (#444) +- Remove `ValidationExceptionInterface` interface (#591) +- Remove identical checking from "Equals" rule (#442) +- Removed Deprecated Rules (#277) +- Validation rules do not accept an empty string by default (#422) diff --git a/vendor/workerman/validation/CONTRIBUTING.md b/vendor/workerman/validation/CONTRIBUTING.md new file mode 100644 index 0000000..bd208bc --- /dev/null +++ b/vendor/workerman/validation/CONTRIBUTING.md @@ -0,0 +1,256 @@ +# Contributing + +Contributions to Respect\Validation are always welcome. You make our lives +easier by sending us your contributions through [pull requests][]. + +Pull requests for bug fixes must be based on the oldest stable version's branch +whereas pull requests for new features must be based on the `master` branch. + +Due to time constraints, we are not always able to respond as quickly as we +would like. Please do not take delays personal and feel free to remind us here, +on IRC, or on Gitter if you feel that we forgot to respond. + +Please see the [project documentation][] before proceeding. You should also know +about [PHP-FIG][]'s standards and basic unit testing, but we're sure you can +learn that just by looking at other rules. Pick the simple ones like `ArrayType` +to begin. + +Before writing anything, feature or bug fix: +- Check if there is already an issue related to it (opened or closed) and if + someone is already working on that; + - If there is not, [open an issue][] and notify everybody that you're going + to work on that; + - If there is, create a comment to notify everybody that you're going to + work on that. +- Make sure that what you need is not done yet + +## Adding a new validator + +A common validator (rule) on Respect\Validation is composed of three classes: + + * `library/Rules/YourRuleName.php`: the rule itself + * `library/Exceptions/YourRuleNameException.php`: the exception thrown by the rule + * `tests/unit/Rules/YourRuleNameTest.php`: tests for the rule + +The classes are pretty straightforward. In the sample below, we're going to +create a validator that validates if a string is equal to "Hello World". + +- Classes should be `final` unless they are used in a different scope; +- Properties should be `private` unless they are used in a different scope; +- Classes should use strict typing; +- Some docblocks are required. + +### Creating the rule + +The rule itself needs to implement the `Validatable` interface but, it is +convenient to just extend the `AbstractRule` class. +Doing that, you'll only need to declare one method: `validate($input)`. +This method must return `true` or `false`. + +If your validator class is `HelloWorld`, it will be available as `v::helloWorld()` +and will natively have support for chaining and everything else. + +```php +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +/** + * Explain in one sentence what this rule does. + * + * @author Your Name <youremail@yourdomain.tld> + */ +final class HelloWorld extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return $input === 'Hello World'; + } +} +``` + +### Creating the rule exception + +Just that and we're done with the rule code. The Exception requires you to +declare messages used by `assert()` and `check()`. Messages are declared in +affirmative and negative moods, so if anyone calls `v::not(v::helloWorld())` the +library will show the appropriate message. + +```php +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Your Name <youremail@yourdomain.tld> + */ +final class HelloWorldException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} must be a Hello World', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} must not be a Hello World', + ] + ]; +} +``` + +### Creating unit tests + +Finally, we need to test if everything is running smooth. We have `RuleTestCase` +that allows us to make easier to test rules, but you fell free to use the +`PHPUnit\Framework\TestCase` if you want or you need it's necessary. + +The `RuleTestCase` extends PHPUnit's `PHPUnit\Framework\TestCase` class, so you +are able to use any methods of it. By extending `RuleTestCase` you should +implement two methods that should return a [data provider][] with the rule as +first item of the arrays: + +- `providerForValidInput`: Will test when `validate()` should return `true` +- `providerForInvalidInput`: Will test when `validate()` should return `false` + +```php +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Test\RuleTestCase; + +/** + * @group rule + * + * @covers \Respect\Validation\Rules\HelloWorld + * + * @author Your Name <youremail@yourdomain.tld> + */ +final class HelloWorldTest extends RuleTestCase +{ + /** + * {@inheritDoc} + */ + public function providerForValidInput(): array + { + $rule = new HelloWorld(); + + return [ + [$rule, 'Hello World'], + ]; + } + + /** + * {@inheritDoc} + */ + public function providerForInvalidInput(): array + { + $rule = new HelloWorld(); + + return [ + [$rule, 'Not a hello'], + [$rule, 'Hello darkness, my old friend'], + [$rule, 'Hello is it me you\'re looking for?'], + ]; + } +} +``` + +If the constructor of your rule accepts arguments you may create specific tests +for it other than what is covered by `RuleTestCase`. + +### Helping us a little bit more + +You rule will be accepted only with these 3 files (rule, exception and unit test), +but if you really want to help us, you can follow the example of [ArrayType][] by: + +- Adding your new rule on the `Validator`'s class docblock; +- Writing a documentation for your new rule; +- Creating integration tests with PHPT. + +As we already said, none of them are required but you will help us a lot. + +## Documentation + +Our docs at https://respect-validation.readthedocs.io are generated from our +Markdown files. Add your brand new rule and it should be soon available. + +## Running Tests + +After run `composer install` on the library's root directory you must run PHPUnit. + +### Linux + +You can test the project using the commands: +```sh +$ vendor/bin/phpunit +``` + +or + +```sh +$ composer phpunit +``` + +### Windows + +You can test the project using the commands: +```sh +> vendor\bin\phpunit +``` + +or + +```sh +> composer phpunit +``` + +No test should fail. + +You can tweak the PHPUnit's settings by copying `phpunit.xml.dist` to `phpunit.xml` +and changing it according to your needs. + +[ArrayType]: https://github.com/Respect/Validation/commit/f08a1fa +[data provider]: https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.data-providers "PHPUnit Data Providers" +[open an issue]: http://github.com/Respect/Validation/issues +[PHP-FIG]: http://www.php-fig.org "PHP Framework Interop Group" +[project documentation]: https://respect-validation.readthedocs.io/ "Respect\Validation documentation" +[pull requests]: http://help.github.com/pull-requests "GitHub pull requests" diff --git a/vendor/workerman/validation/LICENSE b/vendor/workerman/validation/LICENSE new file mode 100644 index 0000000..12abe60 --- /dev/null +++ b/vendor/workerman/validation/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/workerman/validation/README.md b/vendor/workerman/validation/README.md new file mode 100644 index 0000000..2ff210d --- /dev/null +++ b/vendor/workerman/validation/README.md @@ -0,0 +1,14 @@ +# [Respect\Validation 验证器](https://github.com/Respect/Validation) 汉化版 +# Respect\Validation + +[![Build Status](https://img.shields.io/travis/Respect/Validation/master.svg?style=flat-square)](http://travis-ci.org/Respect/Validation) +[![Scrutinizer Code Quality](https://img.shields.io/scrutinizer/g/Respect/Validation/master.svg?style=flat-square)](https://scrutinizer-ci.com/g/Respect/Validation/?branch=master) +[![Code Coverage](https://img.shields.io/scrutinizer/coverage/g/Respect/Validation/master.svg?style=flat-square)](https://scrutinizer-ci.com/g/Respect/Validation/?branch=master) +[![Latest Stable Version](https://img.shields.io/packagist/v/respect/validation.svg?style=flat-square)](https://packagist.org/packages/respect/validation) +[![Total Downloads](https://img.shields.io/packagist/dt/respect/validation.svg?style=flat-square)](https://packagist.org/packages/respect/validation) +[![License](https://img.shields.io/packagist/l/respect/validation.svg?style=flat-square)](https://packagist.org/packages/respect/validation) + +[The most awesome validation engine ever created for PHP.](http://bit.ly/1a1oeQv) + +* [Documentation](https://respect-validation.readthedocs.io) +* [How to contribute](CONTRIBUTING.md) diff --git a/vendor/workerman/validation/composer.json b/vendor/workerman/validation/composer.json new file mode 100644 index 0000000..8c0bd13 --- /dev/null +++ b/vendor/workerman/validation/composer.json @@ -0,0 +1,68 @@ +{ + "name": "workerman/validation", + "description": "The most awesome validation engine ever created for PHP. Respect/Validation 汉化版本", + "keywords": ["respect", "validation", "validator"], + "type": "library", + "homepage": "http://respect.github.io/Validation/", + "license": "MIT", + "authors": [ + { + "name": "Respect/Validation Contributors", + "homepage": "https://github.com/Respect/Validation/graphs/contributors" + } + ], + "config": { + "sort-packages": true + }, + "require": { + "php": ">=7.2", + "respect/stringifier": "^0.2.0", + "symfony/polyfill-mbstring": "^1.2" + }, + "require-dev": { + "egulias/email-validator": "^2.1", + "malukenho/docheader": "^0.1", + "mikey179/vfsstream": "^1.6", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.5", + "respect/coding-standard": "^2.1", + "squizlabs/php_codesniffer": "^3.5", + "symfony/validator": "^3.0||^4.0", + "zendframework/zend-validator": "^2.1" + }, + "suggest": { + "ext-bcmath": "Arbitrary Precision Mathematics", + "ext-fileinfo": "File Information", + "ext-mbstring": "Multibyte String Functions", + "egulias/email-validator": "Strict (RFC compliant) email validation", + "symfony/validator": "Use Symfony validator through Respect\\Validation", + "zendframework/zend-validator": "Use Zend Framework validator through Respect\\Validation" + }, + "autoload": { + "psr-4": { + "Respect\\Validation\\": "library/" + } + }, + "autoload-dev": { + "psr-4": { + "Respect\\Validation\\": "tests/unit/", + "Respect\\Validation\\Test\\": "tests/library/" + } + }, + "scripts": { + "docheader": "vendor/bin/docheader check library/ tests/", + "phpcs": "vendor/bin/phpcs", + "phpstan": "vendor/bin/phpstan analyze", + "phpunit": "vendor/bin/phpunit", + "phpunit-integration": "vendor/bin/phpunit --testsuite=integration", + "phpunit-unit": "vendor/bin/phpunit --testsuite=unit", + "qa": [ + "@docheader", + "@phpcs", + "@phpstan", + "@phpunit" + ] + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/AD.json b/vendor/workerman/validation/data/iso_3166-2/AD.json new file mode 100644 index 0000000..76ade06 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/AD.json @@ -0,0 +1,13 @@ +{ + "source": "http://www.geonames.org/AD/administrative-division-andorra.html", + "country": "Andorra", + "subdivisions": { + "02": "Canillo", + "03": "Encamp", + "04": "La Massana", + "05": "Ordino", + "06": "Sant Julia de Lòria", + "07": "Andorra la Vella", + "08": "Escaldes-Engordany" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/AE.json b/vendor/workerman/validation/data/iso_3166-2/AE.json new file mode 100644 index 0000000..c4580c9 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/AE.json @@ -0,0 +1,13 @@ +{ + "source": "http://www.geonames.org/AE/administrative-division-united-arab-emirates.html", + "country": "United Arab Emirates", + "subdivisions": { + "AJ": "'Ajman", + "AZ": "Abu Zaby", + "DU": "Dubayy", + "FU": "Al Fujayrah", + "RK": "R'as al Khaymah", + "SH": "Ash Shariqah", + "UQ": "Umm al Qaywayn" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/AF.json b/vendor/workerman/validation/data/iso_3166-2/AF.json new file mode 100644 index 0000000..43a164c --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/AF.json @@ -0,0 +1,40 @@ +{ + "source": "http://www.geonames.org/AF/administrative-division-afghanistan.html", + "country": "Afghanistan", + "subdivisions": { + "BAL": "Balkh province", + "BAM": "Bamian province", + "BDG": "Badghis province", + "BDS": "Badakhshan province", + "BGL": "Baghlan province", + "DAY": "Dāykundī", + "FRA": "Farah province", + "FYB": "Faryab province", + "GHA": "Ghazni province", + "GHO": "Ghowr province", + "HEL": "Helmand province", + "HER": "Herat province", + "JOW": "Jowzjan province", + "KAB": "Kabul province", + "KAN": "Kandahar province", + "KAP": "Kapisa province", + "KDZ": "Kondoz province", + "KHO": "Khost province", + "KNR": "Konar province", + "LAG": "Laghman province", + "LOG": "Lowgar province", + "NAN": "Nangrahar province", + "NIM": "Nimruz province", + "NUR": "Nurestan province", + "PAN": "Panjshir", + "PAR": "Parwan province", + "PIA": "Paktia province", + "PKA": "Paktika province", + "SAM": "Samangan province", + "SAR": "Sar-e Pol province", + "TAK": "Takhar province", + "URU": "Uruzgān province", + "WAR": "Wardak province", + "ZAB": "Zabol province" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/AG.json b/vendor/workerman/validation/data/iso_3166-2/AG.json new file mode 100644 index 0000000..fc86785 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/AG.json @@ -0,0 +1,14 @@ +{ + "source": "http://www.geonames.org/AG/administrative-division-antigua-and-barbuda.html", + "country": "Antigua and Barbuda", + "subdivisions": { + "03": "Saint George", + "04": "Saint John", + "05": "Saint Mary", + "06": "Saint Paul", + "07": "Saint Peter", + "08": "Saint Philip", + "10": "Barbuda", + "11": "Redonda" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/AI.json b/vendor/workerman/validation/data/iso_3166-2/AI.json new file mode 100644 index 0000000..e6e2c40 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/AI.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/AI/administrative-division-anguilla.html", + "country": "Anguilla", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/AL.json b/vendor/workerman/validation/data/iso_3166-2/AL.json new file mode 100644 index 0000000..da27641 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/AL.json @@ -0,0 +1,54 @@ +{ + "source": "http://www.geonames.org/AL/administrative-division-albania.html", + "country": "Albania", + "subdivisions": { + "01": "Berat", + "02": "Durres", + "03": "Elbasan", + "04": "Fier", + "05": "Gjirokaster", + "06": "Korce", + "07": "Kukes", + "08": "Lezhe", + "09": "Diber", + "10": "Shkoder", + "11": "Tirane", + "12": "Vlore", + "BR": "Berat", + "BU": "Bulqize", + "DI": "Diber", + "DL": "Delvine", + "DR": "Durres", + "DV": "Devoll", + "EL": "Elbasan", + "ER": "Kolonje", + "FR": "Fier", + "GJ": "Gjirokaster", + "GR": "Gramsh", + "HA": "Has", + "KA": "Kavaje", + "KB": "Kurbin", + "KC": "Kucove", + "KO": "Korce", + "KR": "Kruje", + "KU": "Kukes", + "LB": "Librazhd", + "LE": "Lezhe", + "LU": "Lushnje", + "MK": "Mallakaster", + "MM": "Malesi e Madhe", + "MR": "Mirdite", + "MT": "Mat", + "PG": "Pogradec", + "PQ": "Peqin", + "PR": "Permet", + "PU": "Puke", + "SH": "Shkoder", + "SK": "Skrapar", + "SR": "Sarande", + "TE": "Tepelene", + "TP": "Tropoje", + "TR": "Tirane", + "VL": "Vlore" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/AM.json b/vendor/workerman/validation/data/iso_3166-2/AM.json new file mode 100644 index 0000000..00eebd9 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/AM.json @@ -0,0 +1,17 @@ +{ + "source": "http://www.geonames.org/AM/administrative-division-armenia.html", + "country": "Armenia", + "subdivisions": { + "AG": "Aragatsotn", + "AR": "Ararat", + "AV": "Armavir", + "ER": "Yerevan", + "GR": "Geghark'unik'", + "KT": "Kotayk'", + "LO": "Lorri", + "SH": "Shirak", + "SU": "Syunik'", + "TV": "Tavush", + "VD": "Vayots' Dzor" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/AN.json b/vendor/workerman/validation/data/iso_3166-2/AN.json new file mode 100644 index 0000000..acecdba --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/AN.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/AN/administrative-division-netherlands-antilles.html", + "country": "Netherlands Antilles", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/AO.json b/vendor/workerman/validation/data/iso_3166-2/AO.json new file mode 100644 index 0000000..f789db6 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/AO.json @@ -0,0 +1,24 @@ +{ + "source": "http://www.geonames.org/AO/administrative-division-angola.html", + "country": "Angola", + "subdivisions": { + "BGO": "Bengo", + "BGU": "Benguela province", + "BIE": "Bie", + "CAB": "Cabinda", + "CCU": "Cuando-Cubango", + "CNN": "Cunene", + "CNO": "Cuanza Norte", + "CUS": "Cuanza Sul", + "HUA": "Huambo province", + "HUI": "Huila province", + "LNO": "Lunda Norte", + "LSU": "Lunda Sul", + "LUA": "Luanda", + "MAL": "Malange", + "MOX": "Moxico", + "NAM": "Namibe", + "UIG": "Uige", + "ZAI": "Zaire" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/AQ.json b/vendor/workerman/validation/data/iso_3166-2/AQ.json new file mode 100644 index 0000000..68c05eb --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/AQ.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/AQ/administrative-division-antarctica.html", + "country": "Antarctica", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/AR.json b/vendor/workerman/validation/data/iso_3166-2/AR.json new file mode 100644 index 0000000..b7e48a5 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/AR.json @@ -0,0 +1,30 @@ +{ + "source": "http://www.geonames.org/AR/administrative-division-argentina.html", + "country": "Argentina", + "subdivisions": { + "A": "Salta", + "B": "Buenos Aires Province", + "C": "Ciudad Autónoma de Buenos Aires", + "D": "San Luis", + "E": "Entre Rios", + "F": "La Rioja", + "G": "Santiago del Estero", + "H": "Chaco", + "J": "San Juan", + "K": "Catamarca", + "L": "La Pampa", + "M": "Mendoza", + "N": "Misiones", + "P": "Formosa", + "Q": "Neuquen", + "R": "Rio Negro", + "S": "Santa Fe", + "T": "Tucuman", + "U": "Chubut", + "V": "Tierra del Fuego", + "W": "Corrientes", + "X": "Cordoba", + "Y": "Jujuy", + "Z": "Santa Cruz" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/AS.json b/vendor/workerman/validation/data/iso_3166-2/AS.json new file mode 100644 index 0000000..bcac778 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/AS.json @@ -0,0 +1,11 @@ +{ + "source": "http://www.geonames.org/AS/administrative-division-american-samoa.html", + "country": "American Samoa", + "subdivisions": { + "E": "Eastern", + "M": "Manu'a", + "R": "Rose Island", + "S": "Swains Island", + "W": "Western" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/AT.json b/vendor/workerman/validation/data/iso_3166-2/AT.json new file mode 100644 index 0000000..fffcd3c --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/AT.json @@ -0,0 +1,15 @@ +{ + "source": "http://www.geonames.org/AT/administrative-division-austria.html", + "country": "Austria", + "subdivisions": { + "1": "Burgenland", + "2": "Karnten", + "3": "Niederosterreich", + "4": "Oberosterreich", + "5": "Salzburg", + "6": "Steiermark", + "7": "Tirol", + "8": "Vorarlberg", + "9": "Wien" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/AU.json b/vendor/workerman/validation/data/iso_3166-2/AU.json new file mode 100644 index 0000000..c79ca78 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/AU.json @@ -0,0 +1,14 @@ +{ + "source": "http://www.geonames.org/AU/administrative-division-australia.html", + "country": "Australia", + "subdivisions": { + "ACT": "Australian Capital Territory", + "NSW": "New South Wales", + "NT": "Northern Territory", + "QLD": "Queensland", + "SA": "South Australia", + "TAS": "Tasmania", + "VIC": "Victoria", + "WA": "Western Australia" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/AW.json b/vendor/workerman/validation/data/iso_3166-2/AW.json new file mode 100644 index 0000000..0cb5aff --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/AW.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/AW/administrative-division-aruba.html", + "country": "Aruba", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/AX.json b/vendor/workerman/validation/data/iso_3166-2/AX.json new file mode 100644 index 0000000..932364a --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/AX.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/AX/administrative-division-aland.html", + "country": "Åland", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/AZ.json b/vendor/workerman/validation/data/iso_3166-2/AZ.json new file mode 100644 index 0000000..fccdf00 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/AZ.json @@ -0,0 +1,84 @@ +{ + "source": "http://www.geonames.org/AZ/administrative-division-azerbaijan.html", + "country": "Azerbaijan", + "subdivisions": { + "ABS": "Abseron", + "AGA": "Agstafa", + "AGC": "AgcabAdi", + "AGM": "Agdam", + "AGS": "Agdas", + "AGU": "Agsu", + "AST": "Astara", + "BA": "Baki", + "BAB": "Babek", + "BAL": "BalakAn", + "BAR": "Barda", + "BEY": "Beylaqan", + "BIL": "Bilasuvar", + "CAB": "Cabrayil", + "CAL": "Calilabab", + "CUL": "Culfa", + "DAS": "Daskasan", + "FUZ": "Fuzuli", + "GA": "Ganca", + "GAD": "Gadabay", + "GOR": "Goranboy", + "GOY": "Goycay", + "GYG": "Göygöl", + "HAC": "Haciqabul", + "IMI": "Imisli", + "ISM": "Ismayilli", + "KAL": "Kalbacar", + "KAN": "Kangarli", + "KUR": "Kurdamir", + "LA": "Lankaran", + "LAC": "Lacin", + "LAN": "Lankaran Sahari", + "LER": "Lerik", + "MAS": "Masalli", + "MI": "Mingəçevir", + "NA": "Naftalan", + "NEF": "Neftcala", + "NV": "Naxçivan", + "NX": "Naxcivan", + "OGU": "Oguz", + "ORD": "Ordubad", + "QAB": "Qabala", + "QAX": "Qax", + "QAZ": "Qazax", + "QBA": "Quba", + "QBI": "Qubadli", + "QOB": "Qobustan", + "QUS": "Qusar", + "SA": "Saki", + "SAB": "Sabirabad", + "SAD": "Sadarak", + "SAH": "Sahbuz", + "SAK": "Saki Sahari", + "SAL": "Salyan", + "SAR": "Sarur", + "SAT": "Saatli", + "SBN": "Şabran", + "SIY": "Siyazan", + "SKR": "Samkir", + "SM": "Sumqayit", + "SMI": "Samaxi", + "SMX": "Samux", + "SR": "Şirvan", + "SUS": "Susa", + "TAR": "Tartar", + "TOV": "Tovuz", + "UCA": "Ucar", + "XA": "Xankandi", + "XAC": "Xacmaz", + "XCI": "Xocali", + "XIZ": "Xizi", + "XVD": "Xocavand", + "YAR": "Yardimli", + "YE": "Yevlax Sahari", + "YEV": "Yevlax", + "ZAN": "Zangilan", + "ZAQ": "Zaqatala", + "ZAR": "Zardab" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BA.json b/vendor/workerman/validation/data/iso_3166-2/BA.json new file mode 100644 index 0000000..ccc3a25 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BA.json @@ -0,0 +1,19 @@ +{ + "source": "http://www.geonames.org/BA/administrative-division-bosnia-and-herzegovina.html", + "country": "Bosnia and Herzegovina", + "subdivisions": { + "01": "Unsko-sanski kanton", + "02": "Posavski kanton", + "03": "Tuzlanski kanton", + "04": "Zeničko-dobojski kanton", + "05": "Bosansko-podrinjski kanton", + "06": "Srednjobosanski kantonn", + "07": "Hercegovačko-neretvanski kanton", + "08": "Zapadnohercegovački kanton", + "09": "Kanton Sarajevo", + "10": "Kanton br. 10 (Livanjski kanton)", + "BIH": "Federacija Bosna i Hercegovina", + "BRC": "Brcko District", + "SRP": "Republika Srpska" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BB.json b/vendor/workerman/validation/data/iso_3166-2/BB.json new file mode 100644 index 0000000..247ecf0 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BB.json @@ -0,0 +1,17 @@ +{ + "source": "http://www.geonames.org/BB/administrative-division-barbados.html", + "country": "Barbados", + "subdivisions": { + "01": "Christ Church", + "02": "Saint Andrew", + "03": "Saint George", + "04": "Saint James", + "05": "Saint John", + "06": "Saint Joseph", + "07": "Saint Lucy", + "08": "Saint Michael", + "09": "Saint Peter", + "10": "Saint Philip", + "11": "Saint Thomas" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BD.json b/vendor/workerman/validation/data/iso_3166-2/BD.json new file mode 100644 index 0000000..f78a82e --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BD.json @@ -0,0 +1,78 @@ +{ + "source": "http://www.geonames.org/BD/administrative-division-bangladesh.html", + "country": "Bangladesh", + "subdivisions": { + "01": "Bandarban zila", + "02": "Barguna zila", + "03": "Bogra zila", + "04": "Brahmanbaria zila", + "05": "Bagerhat zila", + "06": "Barisal zila", + "07": "Bhola zila", + "08": "Comilla zila", + "09": "Chandpur zila", + "10": "Chittagong zila", + "11": "Cox's Bazar zila", + "12": "Chuadanga zila", + "13": "Dhaka zila", + "14": "Dinajpur zila", + "15": "Faridpur zila", + "16": "Feni zila", + "17": "Gopalganj zila", + "18": "Gazipur zila", + "19": "Gaibandha zila", + "20": "Habiganj zila", + "21": "Jamalpur zila", + "22": "Jessore zila", + "23": "Jhenaidah zila", + "24": "Jaipurhat zila", + "25": "Jhalakati zila", + "26": "Kishoreganj zila", + "27": "Khulna zila", + "28": "Kurigram zila", + "29": "Khagrachari zila", + "30": "Kushtia zila", + "31": "Lakshmipur zila", + "32": "Lalmonirhat zila", + "33": "Manikganj zila", + "34": "Mymensingh zila", + "35": "Munshiganj zila", + "36": "Madaripur zila", + "37": "Magura zila", + "38": "Moulvibazar zila", + "39": "Meherpur zila", + "40": "Narayanganj zila", + "41": "Netrakona zila", + "42": "Narsingdi zila", + "43": "Narail zila", + "44": "Natore zila", + "45": "Nawabganj zila", + "46": "Nilphamari zila", + "47": "Noakhali zila", + "48": "Naogaon zila", + "49": "Pabna zila", + "50": "Pirojpur zila", + "51": "Patuakhali zila", + "52": "Panchagarh zila", + "53": "Rajbari zila", + "54": "Rajshahi zila", + "55": "Rangpur zila", + "56": "Rangamati zila", + "57": "Sherpur zila", + "58": "Satkhira zila", + "59": "Sirajganj zila", + "60": "Sylhet zila", + "61": "Sunamganj zila", + "62": "Shariatpur zila", + "63": "Tangail zila", + "64": "Thakurgaon zila", + "A": "Barisal", + "B": "Chittagong", + "C": "Dhaka", + "D": "Khulna", + "E": "Rajshahi", + "F": "Rangpur", + "G": "Sylhet", + "H": "Mymensingh Division" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BE.json b/vendor/workerman/validation/data/iso_3166-2/BE.json new file mode 100644 index 0000000..0e9c84d --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BE.json @@ -0,0 +1,19 @@ +{ + "source": "http://www.geonames.org/BE/administrative-division-belgium.html", + "country": "Belgium", + "subdivisions": { + "BRU": "Brussels", + "VAN": "Antwerpen", + "VBR": "Vlaams Brabant", + "VLG": "Flemish Region", + "VLI": "Limburg", + "VOV": "Oost-Vlaanderen", + "VWV": "West-Vlaanderen", + "WAL": "Wallonia", + "WBR": "Brabant Wallon", + "WHT": "Hainaut", + "WLG": "Liege", + "WLX": "Luxembourg", + "WNA": "Namur" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BF.json b/vendor/workerman/validation/data/iso_3166-2/BF.json new file mode 100644 index 0000000..cdaa721 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BF.json @@ -0,0 +1,64 @@ +{ + "source": "http://www.geonames.org/BF/administrative-division-burkina-faso.html", + "country": "Burkina Faso", + "subdivisions": { + "01": "Boucle du Mouhoun", + "02": "Cascades", + "03": "Centre", + "04": "Centre-Est", + "05": "Centre-Nord", + "06": "Centre-Ouest", + "07": "Centre-Sud", + "08": "Est", + "09": "Hauts-Bassins", + "10": "Nord", + "11": "Plateau-Central", + "12": "Sahel", + "13": "Sud-Ouest", + "BAL": "Bale", + "BAM": "Bam", + "BAN": "Banwa", + "BAZ": "Bazega", + "BGR": "Bougouriba", + "BLG": "Boulgou", + "BLK": "Boulkiemde", + "COM": "Comoe", + "GAN": "Ganzourgou", + "GNA": "Gnagna", + "GOU": "Gourma", + "HOU": "Houet", + "IOB": "Ioba", + "KAD": "Kadiogo", + "KEN": "Kenedougou", + "KMD": "Komondjari", + "KMP": "Kompienga", + "KOP": "Koulpelogo", + "KOS": "Kossi", + "KOT": "Kouritenga", + "KOW": "Kourweogo", + "LER": "Leraba", + "LOR": "Loroum", + "MOU": "Mouhoun", + "NAM": "Namentenga", + "NAO": "Nahouri", + "NAY": "Nayala", + "NOU": "Noumbiel", + "OUB": "Oubritenga", + "OUD": "Oudalan", + "PAS": "Passore", + "PON": "Poni", + "SEN": "Seno", + "SIS": "Sissili", + "SMT": "Sanmatenga", + "SNG": "Sanguie", + "SOM": "Soum", + "SOR": "Sourou", + "TAP": "Tapoa", + "TUI": "Tuy", + "YAG": "Yagha", + "YAT": "Yatenga", + "ZIR": "Ziro", + "ZON": "Zondoma", + "ZOU": "Zoundweogo" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BG.json b/vendor/workerman/validation/data/iso_3166-2/BG.json new file mode 100644 index 0000000..bc3de7f --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BG.json @@ -0,0 +1,34 @@ +{ + "source": "http://www.geonames.org/BG/administrative-division-bulgaria.html", + "country": "Bulgaria", + "subdivisions": { + "01": "Blagoevgrad", + "02": "Burgas", + "03": "Varna", + "04": "Veliko Turnovo", + "05": "Vidin", + "06": "Vratsa", + "07": "Gabrovo", + "08": "Dobrich", + "09": "Kurdzhali", + "10": "Kyustendil", + "11": "Lovech", + "12": "Montana", + "13": "Pazardzhik", + "14": "Pernik", + "15": "Pleven", + "16": "Plovdiv", + "17": "Razgrad", + "18": "Ruse", + "19": "Silistra", + "20": "Sliven", + "21": "Smolyan", + "22": "Sofia Region", + "23": "Sofia", + "24": "Stara Zagora", + "25": "Turgovishte", + "26": "Khaskovo", + "27": "Shumen", + "28": "Yambol" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BH.json b/vendor/workerman/validation/data/iso_3166-2/BH.json new file mode 100644 index 0000000..46a1f97 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BH.json @@ -0,0 +1,10 @@ +{ + "source": "http://www.geonames.org/BH/administrative-division-bahrain.html", + "country": "Bahrain", + "subdivisions": { + "13": "Capital", + "14": "Southern", + "15": "Muharraq", + "17": "Northern" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BI.json b/vendor/workerman/validation/data/iso_3166-2/BI.json new file mode 100644 index 0000000..bb61349 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BI.json @@ -0,0 +1,24 @@ +{ + "source": "http://www.geonames.org/BI/administrative-division-burundi.html", + "country": "Burundi", + "subdivisions": { + "BB": "Bubanza", + "BL": "Bujumbura Rural", + "BM": "Bujumbura Mairie", + "BR": "Bururi", + "CA": "Cankuzo", + "CI": "Cibitoke", + "GI": "Gitega", + "KI": "Kirundo", + "KR": "Karuzi", + "KY": "Kayanza", + "MA": "Makamba", + "MU": "Muramvya", + "MW": "Mwaro", + "MY": "Muyinga", + "NG": "Ngozi", + "RM": "Rumonge", + "RT": "Rutana", + "RY": "Ruyigi" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BJ.json b/vendor/workerman/validation/data/iso_3166-2/BJ.json new file mode 100644 index 0000000..c009a78 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BJ.json @@ -0,0 +1,18 @@ +{ + "source": "http://www.geonames.org/BJ/administrative-division-benin.html", + "country": "Benin", + "subdivisions": { + "AK": "Atakora", + "AL": "Alibori", + "AQ": "Atlantique", + "BO": "Borgou", + "CO": "Collines", + "DO": "Donga", + "KO": "Kouffo", + "LI": "Littoral", + "MO": "Mono", + "OU": "Oueme", + "PL": "Plateau", + "ZO": "Zou" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BL.json b/vendor/workerman/validation/data/iso_3166-2/BL.json new file mode 100644 index 0000000..1e9ca69 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BL.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/BL/administrative-division-saint-barthelemy.html", + "country": "Saint Barthélemy", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BM.json b/vendor/workerman/validation/data/iso_3166-2/BM.json new file mode 100644 index 0000000..c0b7bf5 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BM.json @@ -0,0 +1,17 @@ +{ + "source": "http://www.geonames.org/BM/administrative-division-bermuda.html", + "country": "Bermuda", + "subdivisions": { + "DS": "Devonshire", + "GC": "Saint George", + "HA": "Hamilton", + "HC": "Hamilton City", + "PB": "Pembroke", + "PG": "Paget", + "SA": "Sandys", + "SG": "Saint George's", + "SH": "Southampton", + "SM": "Smith's", + "WA": "Warwick" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BN.json b/vendor/workerman/validation/data/iso_3166-2/BN.json new file mode 100644 index 0000000..2c92053 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BN.json @@ -0,0 +1,10 @@ +{ + "source": "http://www.geonames.org/BN/administrative-division-brunei.html", + "country": "Brunei", + "subdivisions": { + "BE": "Belait", + "BM": "Brunei and Muara", + "TE": "Temburong", + "TU": "Tutong" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BO.json b/vendor/workerman/validation/data/iso_3166-2/BO.json new file mode 100644 index 0000000..2bb9c4a --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BO.json @@ -0,0 +1,15 @@ +{ + "source": "http://www.geonames.org/BO/administrative-division-bolivia.html", + "country": "Bolivia", + "subdivisions": { + "B": "Departmento Beni", + "C": "Departmento Cochabamba", + "H": "Departmento Chuquisaca", + "L": "Departmento La Paz", + "N": "Departmento Pando", + "O": "Departmento Oruro", + "P": "Departmento Potosi", + "S": "Departmento Santa Cruz", + "T": "Departmento Tarija" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BQ.json b/vendor/workerman/validation/data/iso_3166-2/BQ.json new file mode 100644 index 0000000..76822ed --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BQ.json @@ -0,0 +1,9 @@ +{ + "source": "http://www.geonames.org/BQ/administrative-division-bonaire.html", + "country": "Bonaire", + "subdivisions": { + "BO": "Bonaire", + "SA": "Saba", + "SE": "Sint Eustatius" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BR.json b/vendor/workerman/validation/data/iso_3166-2/BR.json new file mode 100644 index 0000000..cf3d74c --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BR.json @@ -0,0 +1,33 @@ +{ + "source": "http://www.geonames.org/BR/administrative-division-brazil.html", + "country": "Brazil", + "subdivisions": { + "AC": "Acre", + "AL": "Alagoas", + "AM": "Amazonas", + "AP": "Amapa", + "BA": "Bahia", + "CE": "Ceara", + "DF": "Distrito Federal", + "ES": "Espirito Santo", + "GO": "Goias", + "MA": "Maranhao", + "MG": "Minas Gerais", + "MS": "Mato Grosso do Sul", + "MT": "Mato Grosso", + "PA": "Para", + "PB": "Paraiba", + "PE": "Pernambuco", + "PI": "Piaui", + "PR": "Parana", + "RJ": "Rio de Janeiro", + "RN": "Rio Grande do Norte", + "RO": "Rondonia", + "RR": "Roraima", + "RS": "Rio Grande do Sul", + "SC": "Santa Catarina", + "SE": "Sergipe", + "SP": "Sao Paulo", + "TO": "Tocantins" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BS.json b/vendor/workerman/validation/data/iso_3166-2/BS.json new file mode 100644 index 0000000..25426fb --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BS.json @@ -0,0 +1,38 @@ +{ + "source": "http://www.geonames.org/BS/administrative-division-bahamas.html", + "country": "Bahamas", + "subdivisions": { + "AK": "Acklins Islands", + "BI": "Bimini and Cat Cay", + "BP": "Black Point", + "BY": "Berry Islands", + "CE": "Central Eleuthera", + "CI": "Cat Island", + "CK": "Crooked Island and Long Cay", + "CO": "Central Abaco", + "CS": "Central Andros", + "EG": "East Grand Bahama", + "EX": "Exuma", + "FP": "City of Freeport", + "GC": "Grand Cay", + "HI": "Harbour Island", + "HT": "Hope Town", + "IN": "Inagua", + "LI": "Long Island", + "MC": "Mangrove Cay", + "MG": "Mayaguana", + "MI": "Moore's Island", + "NE": "North Eleuthera", + "NO": "North Abaco", + "NP": "New Providence", + "NS": "North Andros", + "RC": "Rum Cay", + "RI": "Ragged Island", + "SA": "South Andros", + "SE": "South Eleuthera", + "SO": "South Abaco", + "SS": "San Salvador", + "SW": "Spanish Wells", + "WG": "West Grand Bahama" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BT.json b/vendor/workerman/validation/data/iso_3166-2/BT.json new file mode 100644 index 0000000..e0b071a --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BT.json @@ -0,0 +1,26 @@ +{ + "source": "http://www.geonames.org/BT/administrative-division-bhutan.html", + "country": "Bhutan", + "subdivisions": { + "11": "Paro", + "12": "Chukha", + "13": "Haa", + "14": "Samtse", + "15": "Thimphu", + "21": "Tsirang", + "22": "Dagana", + "23": "Punakha", + "24": "Wangdue Phodrang", + "31": "Sarpang", + "32": "Trongsa", + "33": "Bumthang", + "34": "Zhemgang", + "41": "Trashigang", + "42": "Mongar", + "43": "Pemagatshel", + "44": "Lhuntse", + "45": "Samdrup Jongkhar", + "GA": "Gasa", + "TY": "Trashi Yangste" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BV.json b/vendor/workerman/validation/data/iso_3166-2/BV.json new file mode 100644 index 0000000..d44bb48 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BV.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/BV/administrative-division-bouvet-island.html", + "country": "Bouvet Island", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BW.json b/vendor/workerman/validation/data/iso_3166-2/BW.json new file mode 100644 index 0000000..dd8e913 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BW.json @@ -0,0 +1,22 @@ +{ + "source": "http://www.geonames.org/BW/administrative-division-botswana.html", + "country": "Botswana", + "subdivisions": { + "CE": "Central", + "CH": "Chobe", + "FR": "Francistown", + "GA": "Gaborone", + "GH": "Ghanzi", + "JW": "Jwaneng", + "KG": "Kgalagadi", + "KL": "Kgatleng", + "KW": "Kweneng", + "LO": "Lobatse", + "NE": "North East", + "NW": "North West", + "SE": "South East", + "SO": "Southern", + "SP": "Selibe Phikwe", + "ST": "Sowa Town" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BY.json b/vendor/workerman/validation/data/iso_3166-2/BY.json new file mode 100644 index 0000000..e8b6c54 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BY.json @@ -0,0 +1,13 @@ +{ + "source": "http://www.geonames.org/BY/administrative-division-belarus.html", + "country": "Belarus", + "subdivisions": { + "BR": "Brest voblast", + "HM": "Horad Minsk", + "HO": "Homyel voblast", + "HR": "Hrodna voblast", + "MA": "Mahilyow voblast", + "MI": "Minsk voblast", + "VI": "Vitsebsk voblast" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/BZ.json b/vendor/workerman/validation/data/iso_3166-2/BZ.json new file mode 100644 index 0000000..fffadfd --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/BZ.json @@ -0,0 +1,12 @@ +{ + "source": "http://www.geonames.org/BZ/administrative-division-belize.html", + "country": "Belize", + "subdivisions": { + "BZ": "Belize District", + "CY": "Cayo District", + "CZL": "Corozal District", + "OW": "Orange Walk District", + "SC": "Stann Creek District", + "TOL": "Toledo District" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CA.json b/vendor/workerman/validation/data/iso_3166-2/CA.json new file mode 100644 index 0000000..1b6847a --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CA.json @@ -0,0 +1,19 @@ +{ + "source": "http://www.geonames.org/CA/administrative-division-canada.html", + "country": "Canada", + "subdivisions": { + "AB": "Alberta", + "BC": "British Columbia", + "MB": "Manitoba", + "NB": "New Brunswick", + "NL": "Newfoundland and Labrador", + "NS": "Nova Scotia", + "NT": "Northwest Territories", + "NU": "Nunavut", + "ON": "Ontario", + "PE": "Prince Edward Island", + "QC": "Quebec", + "SK": "Saskatchewan", + "YT": "Yukon Territory" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CC.json b/vendor/workerman/validation/data/iso_3166-2/CC.json new file mode 100644 index 0000000..e17dc1e --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CC.json @@ -0,0 +1,11 @@ +{ + "source": "http://www.geonames.org/CC/administrative-division-cocos-islands.html", + "country": "Cocos [Keeling] Islands", + "subdivisions": { + "D": "Direction Island", + "H": "Home Island", + "O": "Horsburgh Island", + "S": "South Island", + "W": "West Island" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CD.json b/vendor/workerman/validation/data/iso_3166-2/CD.json new file mode 100644 index 0000000..9fcc419 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CD.json @@ -0,0 +1,32 @@ +{ + "source": "http://www.geonames.org/CD/administrative-division-democratic-republic-of-the-congo.html", + "country": "Democratic Republic of the Congo", + "subdivisions": { + "BC": "Kongo Central", + "BU": "Bas-Uélé", + "EQ": "Équateur ", + "HK": "Haut-Katanga", + "HL": "Haut-Lomami", + "HU": "Haut-Uélé", + "IT": "Ituri", + "KC": "Kasaï Central", + "KE": "Kasai-Oriental", + "KG": "Kwango", + "KL": "Kwilu", + "KN": "Kinshasa", + "KS": "Kasaï", + "LO": "Lomami", + "LU": "Lualaba", + "MA": "Maniema", + "MN": "Mai-Ndombe", + "MO": "Mongala", + "NK": "Nord-Kivu", + "NU": "Nord-Ubangi", + "SA": "Sankuru", + "SK": "Sud-Kivu", + "SU": "Sud-Ubangi", + "TA": "Tanganyika", + "TO": "Tshopo", + "TU": "Tshuapa" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CF.json b/vendor/workerman/validation/data/iso_3166-2/CF.json new file mode 100644 index 0000000..2ddf5b8 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CF.json @@ -0,0 +1,23 @@ +{ + "source": "http://www.geonames.org/CF/administrative-division-central-african-republic.html", + "country": "Central African Republic", + "subdivisions": { + "AC": "Ouham", + "BB": "Bamingui-Bangoran", + "BGF": "Bangui", + "BK": "Basse-Kotto", + "HK": "Haute-Kotto", + "HM": "Haut-Mbomou", + "HS": "Mambere-Kadeï", + "KB": "Nana-Grebizi", + "KG": "Kemo", + "LB": "Lobaye", + "MB": "Mbomou", + "MP": "Ombella-M'Poko", + "NM": "Nana-Mambere", + "OP": "Ouham-Pende", + "SE": "Sangha-Mbaere", + "UK": "Ouaka", + "VK": "Vakaga" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CG.json b/vendor/workerman/validation/data/iso_3166-2/CG.json new file mode 100644 index 0000000..dd51871 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CG.json @@ -0,0 +1,18 @@ +{ + "source": "http://www.geonames.org/CG/administrative-division-republic-of-the-congo.html", + "country": "Republic of the Congo", + "subdivisions": { + "11": "Bouenza", + "12": "Pool", + "13": "Sangha", + "14": "Plateaux", + "15": "Cuvette-Ouest", + "16": "Pointe-Noire", + "2": "Lekoumou", + "5": "Kouilou", + "7": "Likouala", + "8": "Cuvette", + "9": "Niari", + "BZV": "Brazzaville" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CH.json b/vendor/workerman/validation/data/iso_3166-2/CH.json new file mode 100644 index 0000000..3f0ff76 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CH.json @@ -0,0 +1,32 @@ +{ + "source": "http://www.geonames.org/CH/administrative-division-switzerland.html", + "country": "Switzerland", + "subdivisions": { + "AG": "Aargau", + "AI": "Appenzell Innerhoden", + "AR": "Appenzell Ausserrhoden", + "BE": "Bern", + "BL": "Basel-Landschaft", + "BS": "Basel-Stadt", + "FR": "Fribourg", + "GE": "Geneva", + "GL": "Glarus", + "GR": "Graubunden", + "JU": "Jura", + "LU": "Lucerne", + "NE": "Neuchâtel", + "NW": "Nidwalden", + "OW": "Obwalden", + "SG": "St. Gallen", + "SH": "Schaffhausen", + "SO": "Solothurn", + "SZ": "Schwyz", + "TG": "Thurgau", + "TI": "Ticino", + "UR": "Uri", + "VD": "Vaud", + "VS": "Valais", + "ZG": "Zug", + "ZH": "Zurich" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CI.json b/vendor/workerman/validation/data/iso_3166-2/CI.json new file mode 100644 index 0000000..2995cd0 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CI.json @@ -0,0 +1,20 @@ +{ + "source": "http://www.geonames.org/CI/administrative-division-ivory-coast.html", + "country": "Ivory Coast", + "subdivisions": { + "AB": "Abidjan", + "BS": "Bas-Sassandra", + "CM": "Comoé", + "DN": "Denguélé", + "GD": "Gôh-Djiboua", + "LC": "Lacs", + "LG": "Lagunes", + "MG": "Montagnes", + "SM": "Sassandra-Marahoué", + "SV": "Savanes", + "VB": "Vallée du Bandama", + "WR": "Woroba", + "YM": "Yamoussoukro Autonomous District", + "ZZ": "Zanzan" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CK.json b/vendor/workerman/validation/data/iso_3166-2/CK.json new file mode 100644 index 0000000..7983116 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CK.json @@ -0,0 +1,21 @@ +{ + "source": "http://www.geonames.org/CK/administrative-division-cook-islands.html", + "country": "Cook Islands", + "subdivisions": { + "AI": "Aitutaki", + "AT": "Atiu", + "MA": "Manuae", + "MG": "Mangaia", + "MK": "Manihiki", + "MT": "Mitiaro", + "MU": "Mauke", + "NI": "Nassau Island", + "PA": "Palmerston", + "PE": "Penrhyn", + "PU": "Pukapuka", + "RK": "Rakahanga", + "RR": "Rarotonga", + "SU": "Surwarrow", + "TA": "Takutea" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CL.json b/vendor/workerman/validation/data/iso_3166-2/CL.json new file mode 100644 index 0000000..6ea68dc --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CL.json @@ -0,0 +1,22 @@ +{ + "source": "http://www.geonames.org/CL/administrative-division-chile.html", + "country": "Chile", + "subdivisions": { + "AI": "Aisen del General Carlos Ibanez del Campo (XI)", + "AN": "Antofagasta (II)", + "AP": "Arica y Parinacota", + "AR": "Araucania (IX)", + "AT": "Atacama (III)", + "BI": "Bio-Bio (VIII)", + "CO": "Coquimbo (IV)", + "LI": "Libertador General Bernardo O'Higgins (VI)", + "LL": "Los Lagos (X)", + "LR": "Los Ríos", + "MA": "Magallanes (XII)", + "ML": "Maule (VII)", + "NB": "Ñuble", + "RM": "Region Metropolitana (RM)", + "TA": "Tarapaca (I)", + "VS": "Valparaiso (V)" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CM.json b/vendor/workerman/validation/data/iso_3166-2/CM.json new file mode 100644 index 0000000..940f29d --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CM.json @@ -0,0 +1,16 @@ +{ + "source": "http://www.geonames.org/CM/administrative-division-cameroon.html", + "country": "Cameroon", + "subdivisions": { + "AD": "Adamawa Province (Adamaoua)", + "CE": "Centre Province", + "EN": "Extreme North Province (Extrême-Nord)", + "ES": "East Province (Est)", + "LT": "Littoral Province", + "NO": "North Province (Nord)", + "NW": "Northwest Province (Nord-Ouest)", + "OU": "West Province (Ouest)", + "SU": "South Province (Sud)", + "SW": "Southwest Province (Sud-Ouest)." + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CN.json b/vendor/workerman/validation/data/iso_3166-2/CN.json new file mode 100644 index 0000000..d84573c --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CN.json @@ -0,0 +1,40 @@ +{ + "source": "http://www.geonames.org/CN/administrative-division-china.html", + "country": "China", + "subdivisions": { + "AH": "Anhui", + "BJ": "Beijing", + "CQ": "Chongqìng", + "FJ": "Fujian", + "GD": "Guangdong", + "GS": "Gansu", + "GX": "Guangxi", + "GZ": "Guizhou", + "HA": "Henan", + "HB": "Hubei", + "HE": "Hebei", + "HI": "Hainan", + "HK": "Xianggang", + "HL": "Heilongjiang", + "HN": "Hunan", + "JL": "Jilin", + "JS": "Jiangsu", + "JX": "Jiangxi", + "LN": "Liaoning", + "MO": "Aomen", + "NM": "Nei Mongol", + "NX": "Ningxia", + "QH": "Qinghai", + "SC": "Sichuan", + "SD": "Shandong", + "SH": "Shanghai", + "SN": "Shaanxi", + "SX": "Shanxi", + "TJ": "Tianjin", + "TW": "Taiwan", + "XJ": "Xinjiang", + "XZ": "Xizang Zìzhìqu (Tibet)", + "YN": "Yunnan", + "ZJ": "Zhejiang" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CO.json b/vendor/workerman/validation/data/iso_3166-2/CO.json new file mode 100644 index 0000000..8e7ce85 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CO.json @@ -0,0 +1,39 @@ +{ + "source": "http://www.geonames.org/CO/administrative-division-colombia.html", + "country": "Colombia", + "subdivisions": { + "AMA": "Amazonas", + "ANT": "Antioquia", + "ARA": "Arauca", + "ATL": "Atlantico", + "BOL": "Bolivar", + "BOY": "Boyaca", + "CAL": "Caldas", + "CAQ": "Caqueta", + "CAS": "Casanare", + "CAU": "Cauca", + "CES": "Cesar", + "CHO": "Choco", + "COR": "Cordoba", + "CUN": "Cundinamarca", + "DC": "Bogota D.C.", + "GUA": "Guainia", + "GUV": "Guaviare", + "HUI": "Huila", + "LAG": "La Guajira", + "MAG": "Magdalena", + "MET": "Meta", + "NAR": "Narino", + "NSA": "Norte de Santander", + "PUT": "Putumayo", + "QUI": "Quindio", + "RIS": "Risaralda", + "SAN": "Santander", + "SAP": "San Andres y Providencia", + "SUC": "Sucre", + "TOL": "Tolima", + "VAC": "Valle del Cauca", + "VAU": "Vaupes", + "VID": "Vichada" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CR.json b/vendor/workerman/validation/data/iso_3166-2/CR.json new file mode 100644 index 0000000..68cea06 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CR.json @@ -0,0 +1,13 @@ +{ + "source": "http://www.geonames.org/CR/administrative-division-costa-rica.html", + "country": "Costa Rica", + "subdivisions": { + "A": "Alajuela", + "C": "Cartago", + "G": "Guanacaste", + "H": "Heredia", + "L": "Limon", + "P": "Puntarenas", + "SJ": "San Jose" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CS.json b/vendor/workerman/validation/data/iso_3166-2/CS.json new file mode 100644 index 0000000..85f4efc --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CS.json @@ -0,0 +1,10 @@ +{ + "source": "http://www.geonames.org/CS/administrative-division-serbia-and-montenegro.html", + "country": "Serbia And Montenegro", + "subdivisions": { + "KOS": "Kosovo", + "MON": "Montenegro", + "SER": "Serbia", + "VOJ": "Vojvodina" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CU.json b/vendor/workerman/validation/data/iso_3166-2/CU.json new file mode 100644 index 0000000..ea8ae21 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CU.json @@ -0,0 +1,22 @@ +{ + "source": "http://www.geonames.org/CU/administrative-division-cuba.html", + "country": "Cuba", + "subdivisions": { + "01": "Pinar del Rio", + "03": "La Habana", + "04": "Matanzas", + "05": "Villa Clara", + "06": "Cienfuegos", + "07": "Sancti Spiritus", + "08": "Ciego de Avila", + "09": "Camaguey", + "10": "Las Tunas", + "11": "Holguin", + "12": "Granma", + "13": "Santiago de Cuba", + "14": "Guantanamo", + "15": "Artemisa", + "16": "Mayabeque", + "99": "Isla de la Juventud" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CV.json b/vendor/workerman/validation/data/iso_3166-2/CV.json new file mode 100644 index 0000000..a39d9c0 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CV.json @@ -0,0 +1,30 @@ +{ + "source": "http://www.geonames.org/CV/administrative-division-cape-verde.html", + "country": "Cape Verde", + "subdivisions": { + "B": "Ilhas de Barlavento", + "BR": "Brava", + "BV": "Boa Vista", + "CA": "Santa Catarina", + "CF": "Santa Catarina do Fogo", + "CR": "Santa Cruz", + "MA": "Maio", + "MO": "Mosteiros", + "PA": "Paul", + "PN": "Porto Novo", + "PR": "Praia", + "RB": "Ribeira Brava", + "RG": "Ribeira Grande", + "RS": "Ribeira Grande de Santiago", + "S": "Ilhas de Sotavento", + "SD": "Sao Domingos", + "SF": "Sao Filipe", + "SL": "Sal", + "SM": "São Miguel", + "SO": "São Lourenço dos Orgãos", + "SS": "São Salvador do Mundo", + "SV": "Sao Vicente", + "TA": "Tarrafal", + "TS": "Tarrafal de São Nicolau" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CW.json b/vendor/workerman/validation/data/iso_3166-2/CW.json new file mode 100644 index 0000000..da02771 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CW.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/CW/administrative-division-curacao.html", + "country": "Curacao", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CX.json b/vendor/workerman/validation/data/iso_3166-2/CX.json new file mode 100644 index 0000000..c89f4ce --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CX.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/CX/administrative-division-christmas-island.html", + "country": "Christmas Island", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CY.json b/vendor/workerman/validation/data/iso_3166-2/CY.json new file mode 100644 index 0000000..c776e62 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CY.json @@ -0,0 +1,12 @@ +{ + "source": "http://www.geonames.org/CY/administrative-division-cyprus.html", + "country": "Cyprus", + "subdivisions": { + "01": "Lefkosía", + "02": "Lemesós", + "03": "Lárnaka", + "04": "Ammóchostos", + "05": "Páfos", + "06": "Kerýneia" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/CZ.json b/vendor/workerman/validation/data/iso_3166-2/CZ.json new file mode 100644 index 0000000..2929c53 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/CZ.json @@ -0,0 +1,118 @@ +{ + "source": "http://www.geonames.org/CZ/administrative-division-czech-republic.html", + "country": "Czechia", + "subdivisions": { + "10": "Prague - the Capital (Praha - hlavni mesto)", + "101": "Praha 1", + "102": "Praha 2", + "103": "Praha 3", + "104": "Praha 4", + "105": "Praha 5", + "106": "Praha 6", + "107": "Praha 7", + "108": "Praha 8", + "109": "Praha 9", + "110": "Praha 10", + "111": "Praha 11", + "112": "Praha 12", + "113": "Praha 13", + "114": "Praha 14", + "115": "Praha 15", + "116": "Praha 16", + "117": "Praha 17", + "118": "Praha 18", + "119": "Praha 19", + "120": "Praha 20", + "121": "Praha 21", + "122": "Praha 22", + "20": "Central Bohemian Region (Stredocesky kraj)", + "201": "Benešov", + "202": "Beroun", + "203": "Kladno", + "204": "Kolín", + "205": "Kutná Hora", + "206": "Mělník", + "207": "Mladá Boleslav", + "208": "Nymburk", + "209": "Praha-východ", + "20A": "Praha-západ", + "20B": "Příbram", + "20C": "Rakovník", + "31": "South Bohemian Region (Jihocesky kraj)", + "311": "České Budějovice", + "312": "Český Krumlov", + "313": "Jindřichův Hradec", + "314": "Písek", + "315": "Prachatice", + "316": "Strakonice", + "317": "Tábor", + "32": "Plzen( Region Plzensky kraj)", + "321": "Domažlice", + "322": "Klatovy", + "323": "Plzeň-město", + "324": "Plzeň-jih", + "325": "Plzeň-sever", + "326": "Rokycany", + "327": "Tachov", + "41": "Carlsbad Region (Karlovarsky kraj)", + "411": "Cheb", + "412": "Karlovy Vary", + "413": "Sokolov", + "42": "Usti nad Labem Region (Ustecky kraj)", + "421": "Děčín", + "422": "Chomutov", + "423": "Litoměřice", + "424": "Louny", + "425": "Most", + "426": "Teplice", + "427": "Ústí nad Labem", + "51": "Liberec Region (Liberecky kraj)", + "511": "Česká Lípa", + "512": "Jablonec nad Nisou", + "513": "Liberec", + "514": "Semily", + "52": "Hradec Kralove Region (Kralovehradecky kraj)", + "521": "Hradec Králové", + "522": "Jičín", + "523": "Náchod", + "524": "Rychnov nad Kněžnou", + "525": "Trutnov", + "53": "Pardubice Region (Pardubicky kraj)", + "531": "Chrudim", + "532": "Pardubice", + "533": "Svitavy", + "534": "Ústí nad Orlicí", + "63": "Vysocina Region (kraj Vysocina)", + "631": "Havlíčkův Brod", + "632": "Jihlava", + "633": "Pelhřimov", + "634": "Třebíč", + "635": "Žd’ár nad Sázavou", + "64": "South Moravian Region (Jihomoravsky kraj)", + "641": "Blansko", + "642": "Brno-město", + "643": "Brno-venkov", + "644": "Břeclav", + "645": "Hodonín", + "646": "Vyškov", + "647": "Znojmo", + "71": "Olomouc Region (Olomoucky kraj)", + "711": "Jeseník", + "712": "Olomouc", + "713": "Prostĕjov", + "714": "Přerov", + "715": "Šumperk", + "72": "Zlin Region (Zlinsky kraj)", + "721": "Kromĕříž", + "722": "Uherské Hradištĕ", + "723": "Vsetín", + "724": "Zlín", + "80": "Moravian-Silesian Region (Moravskoslezsky kraj)", + "801": "Bruntál", + "802": "Frýdek - Místek", + "803": "Karviná", + "804": "Nový Jičín", + "805": "Opava", + "806": "Ostrava - město" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/DE.json b/vendor/workerman/validation/data/iso_3166-2/DE.json new file mode 100644 index 0000000..a5650f4 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/DE.json @@ -0,0 +1,22 @@ +{ + "source": "http://www.geonames.org/DE/administrative-division-germany.html", + "country": "Germany", + "subdivisions": { + "BB": "Brandenburg", + "BE": "Berlin", + "BW": "Baden-Württemberg", + "BY": "Bayern", + "HB": "Bremen", + "HE": "Hessen", + "HH": "Hamburg", + "MV": "Mecklenburg-Vorpommern", + "NI": "Niedersachsen", + "NW": "Nordrhein-Westfalen", + "RP": "Rheinland-Pfalz", + "SH": "Schleswig-Holstein", + "SL": "Saarland", + "SN": "Sachsen", + "ST": "Sachsen-Anhalt", + "TH": "Thüringen" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/DJ.json b/vendor/workerman/validation/data/iso_3166-2/DJ.json new file mode 100644 index 0000000..e4578be --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/DJ.json @@ -0,0 +1,12 @@ +{ + "source": "http://www.geonames.org/DJ/administrative-division-djibouti.html", + "country": "Djibouti", + "subdivisions": { + "AR": "Arta", + "AS": "'Ali Sabih", + "DI": "Dikhil", + "DJ": "Djibouti", + "OB": "Obock", + "TA": "Tadjoura" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/DK.json b/vendor/workerman/validation/data/iso_3166-2/DK.json new file mode 100644 index 0000000..20e6a3d --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/DK.json @@ -0,0 +1,11 @@ +{ + "source": "http://www.geonames.org/DK/administrative-division-denmark.html", + "country": "Denmark", + "subdivisions": { + "81": "Region Nordjylland", + "82": "Region Midtjylland", + "83": "Region Syddanmark", + "84": "Region Hovedstaden", + "85": "Region Sjæland" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/DM.json b/vendor/workerman/validation/data/iso_3166-2/DM.json new file mode 100644 index 0000000..ddf9064 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/DM.json @@ -0,0 +1,16 @@ +{ + "source": "http://www.geonames.org/DM/administrative-division-dominica.html", + "country": "Dominica", + "subdivisions": { + "02": "Saint Andrew Parish", + "03": "Saint David Parish", + "04": "Saint George Parish", + "05": "Saint John Parish", + "06": "Saint Joseph Parish", + "07": "Saint Luke Parish", + "08": "Saint Mark Parish", + "09": "Saint Patrick Parish", + "10": "Saint Paul Parish", + "11": "Saint Peter Parish" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/DO.json b/vendor/workerman/validation/data/iso_3166-2/DO.json new file mode 100644 index 0000000..5b9717d --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/DO.json @@ -0,0 +1,38 @@ +{ + "source": "http://www.geonames.org/DO/administrative-division-dominican-republic.html", + "country": "Dominican Republic", + "subdivisions": { + "01": "Distrito Nacional", + "02": "Azua", + "03": "Baoruco", + "04": "Barahona", + "05": "Dajabon", + "06": "Duarte", + "07": "Elias Pina", + "08": "El Seybo", + "09": "Espaillat", + "10": "Independencia", + "11": "La Altagracia", + "12": "La Romana", + "13": "La Vega", + "14": "Maria Trinidad Sanchez", + "15": "Monte Cristi", + "16": "Pedernales", + "17": "Peravia (Bani)", + "18": "Puerto Plata", + "19": "Salcedo", + "20": "Samana", + "21": "San Cristobal", + "22": "San Juan", + "23": "San Pedro de Macoris", + "24": "Sanchez Ramirez", + "25": "Santiago", + "26": "Santiago Rodriguez", + "27": "Valverde", + "28": "Monsenor Nouel", + "29": "Monte Plata", + "30": "Hato Mayor", + "31": "San Jose de Ocoa", + "32": "Santo Domingo" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/DZ.json b/vendor/workerman/validation/data/iso_3166-2/DZ.json new file mode 100644 index 0000000..6ae08b4 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/DZ.json @@ -0,0 +1,54 @@ +{ + "source": "http://www.geonames.org/DZ/administrative-division-algeria.html", + "country": "Algeria", + "subdivisions": { + "01": "Adrar", + "02": "Chlef", + "03": "Laghouat", + "04": "Oum el-Bouaghi", + "05": "Batna", + "06": "Bejaia", + "07": "Biskra", + "08": "Bechar", + "09": "Blida", + "10": "Bouira", + "11": "Tamanghasset", + "12": "Tebessa", + "13": "Tlemcen", + "14": "Tiaret", + "15": "Tizi Ouzou", + "16": "Alger", + "17": "Djelfa", + "18": "Jijel", + "19": "Setif", + "20": "Saida", + "21": "Skikda", + "22": "Sidi Bel Abbes", + "23": "Annaba", + "24": "Guelma", + "25": "Constantine", + "26": "Medea", + "27": "Mostaganem", + "28": "M'Sila", + "29": "Muaskar", + "30": "Ouargla", + "31": "Oran", + "32": "El Bayadh", + "33": "Illizi", + "34": "Bordj Bou Arreridj", + "35": "Boumerdes", + "36": "El Tarf", + "37": "Tindouf", + "38": "Tissemsilt", + "39": "El Oued", + "40": "Khenchela", + "41": "Souk Ahras", + "42": "Tipaza", + "43": "Mila", + "44": "Ain Defla", + "45": "Naama", + "46": "Ain Temouchent", + "47": "Ghardaia", + "48": "Relizane" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/EC.json b/vendor/workerman/validation/data/iso_3166-2/EC.json new file mode 100644 index 0000000..95007c0 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/EC.json @@ -0,0 +1,30 @@ +{ + "source": "http://www.geonames.org/EC/administrative-division-ecuador.html", + "country": "Ecuador", + "subdivisions": { + "A": "Azuay", + "B": "Bolivar", + "C": "Carchi", + "D": "Orellana", + "E": "Esmeraldas", + "F": "Canar", + "G": "Guayas", + "H": "Chimborazo", + "I": "Imbabura", + "L": "Loja", + "M": "Manabi", + "N": "Napo", + "O": "El Oro", + "P": "Pichincha", + "R": "Los Rios", + "S": "Morona-Santiago", + "SD": "Santo Domingo de los Tsáchilas", + "SE": "Santa Elena", + "T": "Tungurahua", + "U": "Sucumbios", + "W": "Galapagos", + "X": "Cotopaxi", + "Y": "Pastaza", + "Z": "Zamora-Chinchipe" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/EE.json b/vendor/workerman/validation/data/iso_3166-2/EE.json new file mode 100644 index 0000000..97fa151 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/EE.json @@ -0,0 +1,21 @@ +{ + "source": "http://www.geonames.org/EE/administrative-division-estonia.html", + "country": "Estonia", + "subdivisions": { + "37": "Harju County", + "39": "Hiiu County", + "44": "Ida-Viru County", + "49": "Jõgeva County", + "51": "Järva County", + "57": "Lääne County", + "59": "Lääne-Viru County", + "65": "Põlva County", + "67": "Pärnu County", + "70": "Rapla County", + "74": "Saare County", + "78": "Tartu County", + "82": "Valga County", + "84": "Viljandi County", + "86": "Võru County" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/EG.json b/vendor/workerman/validation/data/iso_3166-2/EG.json new file mode 100644 index 0000000..1744627 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/EG.json @@ -0,0 +1,33 @@ +{ + "source": "http://www.geonames.org/EG/administrative-division-egypt.html", + "country": "Egypt", + "subdivisions": { + "ALX": "Al Iskandariyah", + "ASN": "Aswan", + "AST": "Asyut", + "BA": "Al Bahr al Ahmar", + "BH": "Al Buhayrah", + "BNS": "Bani Suwayf", + "C": "Al Qahirah", + "DK": "Ad Daqahliyah", + "DT": "Dumyat", + "FYM": "Al Fayyum", + "GH": "Al Gharbiyah", + "GZ": "Al Jizah", + "IS": "Al Isma'iliyah", + "JS": "Janub Sina'", + "KB": "Al Qalyubiyah", + "KFS": "Kafr ash Shaykh", + "KN": "Qina", + "LX": "Al Uqşur", + "MN": "Al Minya", + "MNF": "Al Minufiyah", + "MT": "Matruh", + "PTS": "Bur Sa'id", + "SHG": "Suhaj", + "SHR": "Ash Sharqiyah", + "SIN": "Shamal Sina'", + "SUZ": "As Suways", + "WAD": "Al Wadi al Jadid" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/EH.json b/vendor/workerman/validation/data/iso_3166-2/EH.json new file mode 100644 index 0000000..0cdd11a --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/EH.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/EH/administrative-division-western-sahara.html", + "country": "Western Sahara", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/ER.json b/vendor/workerman/validation/data/iso_3166-2/ER.json new file mode 100644 index 0000000..1e569c3 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/ER.json @@ -0,0 +1,12 @@ +{ + "source": "http://www.geonames.org/ER/administrative-division-eritrea.html", + "country": "Eritrea", + "subdivisions": { + "AN": "Anseba (Keren)", + "DK": "Southern Red Sea (Debub-Keih-Bahri)", + "DU": "Southern (Debub)", + "GB": "Gash-Barka (Barentu)", + "MA": "Central (Maekel)", + "SK": "Northern Red Sea (Semien-Keih-Bahri)" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/ES.json b/vendor/workerman/validation/data/iso_3166-2/ES.json new file mode 100644 index 0000000..1f2503b --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/ES.json @@ -0,0 +1,75 @@ +{ + "source": "http://www.geonames.org/ES/administrative-division-spain.html", + "country": "Spain", + "subdivisions": { + "A": "Alicante", + "AB": "Albacete", + "AL": "Almería", + "AN": "Comunidad Autónoma de Andalucía", + "AR": "Comunidad Autónoma de Aragón", + "AS": "Comunidad Autónoma del Principado de Asturias", + "AV": "Ávila", + "B": "Barcelona", + "BA": "Badajoz", + "BI": "Vizcaya", + "BU": "Burgos", + "C": "A Coruña", + "CA": "Cádiz", + "CB": "Comunidad Autónoma de Cantabria", + "CC": "Cáceres", + "CE": "Ceuta", + "CL": "Comunidad Autónoma de Castilla y León", + "CM": "Comunidad Autónoma de Castilla-La Mancha", + "CN": "Comunidad Autónoma de Canarias", + "CO": "Córdoba", + "CR": "Ciudad Real", + "CS": "Castellón", + "CT": "Catalunya", + "CU": "Cuenca", + "EX": "Comunidad Autónoma de Extremadura", + "GA": "Comunidad Autónoma de Galicia", + "GC": "Las Palmas", + "GI": "Girona", + "GR": "Granada", + "GU": "Guadalajara", + "H": "Huelva", + "HU": "Huesca", + "IB": "Comunidad Autónoma de las Islas Baleares", + "J": "Jaén", + "L": "Lleida", + "LE": "León", + "LO": "La Rioja", + "LU": "Lugo", + "M": "Madrid", + "MA": "Málaga", + "MC": "Comunidad Autónoma de la Región de Murcia", + "MD": "Comunidad de Madrid", + "ML": "Melilla", + "MU": "Murcia", + "NA": "Navarra", + "NC": "Comunidad Foral de Navarra", + "O": "Asturias", + "OR": "Ourense", + "P": "Palencia", + "PM": "Baleares", + "PO": "Pontevedra", + "PV": "Euskal Autonomia Erkidegoa", + "RI": "Comunidad Autónoma de La Rioja", + "S": "Cantabria", + "SA": "Salamanca", + "SE": "Sevilla", + "SG": "Segovia", + "SO": "Soria", + "SS": "Guipúzcoa", + "T": "Tarragona", + "TE": "Teruel", + "TF": "Santa Cruz de Tenerife", + "TO": "Toledo", + "V": "Valencia", + "VA": "Valladolid", + "VC": "Comunidad Valenciana", + "VI": "Álava", + "Z": "Zaragoza", + "ZA": "Zamora" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/ET.json b/vendor/workerman/validation/data/iso_3166-2/ET.json new file mode 100644 index 0000000..b003e04 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/ET.json @@ -0,0 +1,17 @@ +{ + "source": "http://www.geonames.org/ET/administrative-division-ethiopia.html", + "country": "Ethiopia", + "subdivisions": { + "AA": "Addis Ababa", + "AF": "Afar", + "AM": "Amhara", + "BE": "Benishangul-Gumaz", + "DD": "Dire Dawa", + "GA": "Gambela", + "HA": "Hariai", + "OR": "Oromia", + "SN": "Southern Nations - Nationalities and Peoples Region", + "SO": "Somali", + "TI": "Tigray" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/FI.json b/vendor/workerman/validation/data/iso_3166-2/FI.json new file mode 100644 index 0000000..034d58f --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/FI.json @@ -0,0 +1,25 @@ +{ + "source": "http://www.geonames.org/FI/administrative-division-finland.html", + "country": "Finland", + "subdivisions": { + "01": "Ahvenanmaa [Finnish] / Åland [Swedish]", + "02": "Etelä-Karjala [Finnish] / Södra Karelen [Swedish]", + "03": "Etelä-Pohjanmaa [Finnish] / Södra Österbotten [Swedish]", + "04": "Etelä-Savo [Finnish] / Södra Savolax [Swedish]", + "05": "Kainuu [Finnish] / Kajanaland [Swedish]", + "06": "Kanta-Häme [Finnish] / Egentliga Tavastland [Swedish]", + "07": "Keski-Pohjanmaa [Finnish] / Mellersta Österbotten [Swedish]", + "08": "Keski-Suomi [Finnish] / Mellersta Finland [Swedish]", + "09": "Kymenlaakso [Finnish] / Kymmenedalen [Swedish]", + "10": "Lappi [Finnish] / Lappland [Swedish]", + "11": "Pirkanmaa [Finnish] / Birkaland [Swedish]", + "12": "Pohjanmaa [Finnish] / Österbotten [Swedish]", + "13": "Pohjois-Karjala [Finnish] / Norra Karelen [Swedish]", + "14": "Pohjois-Pohjanmaa [Finnish] / Norra Österbotten [Swedish]", + "15": "Pohjois-Savo [Finnish] / Norra Savolax [Swedish]", + "16": "Päijät-Häme [Finnish] / Päijänne-Tavastland [Swedish]", + "17": "Satakunta [Finnish and Swedish]", + "18": "Uusimaa [Finnish] / Nyland [Swedish]", + "19": "Varsinais-Suomi [Finnish] / Egentliga Finland [Swedish]" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/FJ.json b/vendor/workerman/validation/data/iso_3166-2/FJ.json new file mode 100644 index 0000000..9c34149 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/FJ.json @@ -0,0 +1,25 @@ +{ + "source": "http://www.geonames.org/FJ/administrative-division-fiji.html", + "country": "Fiji", + "subdivisions": { + "01": "Ba Province", + "02": "Bua Province", + "03": "Cakaudrove Province", + "04": "Kadavu Province", + "05": "Lau Province", + "06": "Lomaiviti Province", + "07": "Mathuata Province", + "08": "Nandronga and Navosa Province", + "09": "Naitasiri Province", + "10": "Namosi Province", + "11": "Ra Province", + "12": "Rewa Province", + "13": "Serua Province", + "14": "Tailevu Province", + "C": "Central Division", + "E": "Eastern Division", + "N": "Northern Division", + "R": "Rotuma", + "W": "Western Division" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/FK.json b/vendor/workerman/validation/data/iso_3166-2/FK.json new file mode 100644 index 0000000..9a40421 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/FK.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/FK/administrative-division-falkland-islands.html", + "country": "Falkland Islands", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/FM.json b/vendor/workerman/validation/data/iso_3166-2/FM.json new file mode 100644 index 0000000..b1c6e5c --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/FM.json @@ -0,0 +1,10 @@ +{ + "source": "http://www.geonames.org/FM/administrative-division-micronesia.html", + "country": "Micronesia", + "subdivisions": { + "KSA": "Kosrae", + "PNI": "Pohnpei", + "TRK": "Chuuk", + "YAP": "Yap" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/FO.json b/vendor/workerman/validation/data/iso_3166-2/FO.json new file mode 100644 index 0000000..df0e10e --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/FO.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/FO/administrative-division-faroe-islands.html", + "country": "Faroe Islands", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/FR.json b/vendor/workerman/validation/data/iso_3166-2/FR.json new file mode 100644 index 0000000..375632d --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/FR.json @@ -0,0 +1,124 @@ +{ + "source": "http://www.geonames.org/FR/administrative-division-france.html", + "country": "France", + "subdivisions": { + "01": "Ain", + "02": "Aisne", + "03": "Allier", + "04": "Alpes-de-Haute-Provence", + "05": "Hautes-Alpes", + "06": "Alpes-Maritimes", + "07": "Ardèche", + "08": "Ardennes", + "09": "Ariège", + "10": "Aube", + "11": "Aude", + "12": "Aveyron", + "13": "Bouches-du-Rhône", + "14": "Calvados", + "15": "Cantal", + "16": "Charente", + "17": "Charente-Maritime", + "18": "Cher", + "19": "Corrèze", + "21": "Côte-d'Or", + "22": "Côtes-d'Armor", + "23": "Creuse", + "24": "Dordogne", + "25": "Doubs", + "26": "Drôme", + "27": "Eure", + "28": "Eure-et-Loir", + "29": "Finistère", + "2A": "Corse-du-Sud", + "2B": "Haute-Corse", + "30": "Gard", + "31": "Haute-Garonne", + "32": "Gers", + "33": "Gironde", + "34": "Hérault", + "35": "Ille-et-Vilaine", + "36": "Indre", + "37": "Indre-et-Loire", + "38": "Isère", + "39": "Jura", + "40": "Landes", + "41": "Loir-et-Cher", + "42": "Loire", + "43": "Haute-Loire", + "44": "Loire-Atlantique", + "45": "Loiret", + "46": "Lot", + "47": "Lot-et-Garonne", + "48": "Lozère", + "49": "Maine-et-Loire", + "50": "Manche", + "51": "Marne", + "52": "Haute-Marne", + "53": "Mayenne", + "54": "Meurthe-et-Moselle", + "55": "Meuse", + "56": "Morbihan", + "57": "Moselle", + "58": "Nièvre", + "59": "Nord", + "60": "Oise", + "61": "Orne", + "62": "Pas-de-Calais", + "63": "Puy-de-Dôme", + "64": "Pyrénées-Atlantiques", + "65": "Hautes-Pyrénées", + "66": "Pyrénées-Orientales", + "67": "Bas-Rhin", + "68": "Haut-Rhin", + "69": "Rhône", + "70": "Haute-Saône", + "71": "Saône-et-Loire", + "72": "Sarthe", + "73": "Savoie", + "74": "Haute-Savoie", + "75": "Paris", + "76": "Seine-Maritime", + "77": "Seine-et-Marne", + "78": "Yvelines", + "79": "Deux-Sèvres", + "80": "Somme", + "81": "Tarn", + "82": "Tarn-et-Garonne", + "83": "Var", + "84": "Vaucluse", + "85": "Vendée", + "86": "Vienne", + "87": "Haute-Vienne", + "88": "Vosges", + "89": "Yonne", + "90": "Territoire de Belfort", + "91": "Essonne", + "92": "Hauts-de-Seine", + "93": "Seine-Saint-Denis", + "94": "Val-de-Marne", + "95": "Val-d'Oise", + "ARA": "Auvergne-Rhône-Alpes", + "BFC": "Bourgogne-Franche-Comté", + "BL": "Saint Barthélemy (see also separate ISO 3166-1 entry under BL)", + "BRE": "Bretagne", + "COR": "Corse", + "CP": "Clipperton", + "CVL": "Centre-Val de Loire", + "GES": "Grand Est", + "HDF": "Hauts-de-France", + "IDF": "Île-de-France", + "MF": "Saint Martin (see also separate ISO 3166-1 entry under MF)", + "NAQ": "Nouvelle-Aquitaine", + "NC": "Nouvelle-Calédonie (see also separate ISO 3166-1 entry under NC)", + "NOR": "Normandy", + "OCC": "Occitanie", + "PAC": "Provence-Alpes-Côte d'Azur", + "PDL": "Pays de la Loire", + "PF": "Polynésie française (see also separate ISO 3166-1 entry under PF)", + "PM": "Saint-Pierre-et-Miquelon (see also separate ISO 3166-1 entry under PM)", + "TF": "Terres Australes Françaises (see also separate ISO 3166-1 entry under TF)", + "WF": "Wallis et Futuna (see also separate ISO 3166-1 entry under WF)", + "YT": "Mayotte (see also separate ISO 3166-1 entry under YT)" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GA.json b/vendor/workerman/validation/data/iso_3166-2/GA.json new file mode 100644 index 0000000..b4a7248 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GA.json @@ -0,0 +1,15 @@ +{ + "source": "http://www.geonames.org/GA/administrative-division-gabon.html", + "country": "Gabon", + "subdivisions": { + "1": "Estuaire", + "2": "Haut-Ogooue", + "3": "Moyen-Ogooue", + "4": "Ngounie", + "5": "Nyanga", + "6": "Ogooue-Ivindo", + "7": "Ogooue-Lolo", + "8": "Ogooue-Maritime", + "9": "Woleu-Ntem" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GB.json b/vendor/workerman/validation/data/iso_3166-2/GB.json new file mode 100644 index 0000000..24cd95f --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GB.json @@ -0,0 +1,227 @@ +{ + "source": "http://www.geonames.org/GB/administrative-division-united-kingdom.html", + "country": "United Kingdom", + "subdivisions": { + "ABC": "Armagh City Banbridge and Craigavon", + "ABD": "Aberdeenshire", + "ABE": "Aberdeen", + "AGB": "Argyll and Bute", + "AGY": "Isle of Anglesey", + "AND": "Ards and North Down", + "ANN": "Antrim and Newtownabbey", + "ANS": "Angus", + "BAS": "Bath and North East Somerset", + "BBD": "Blackburn with Darwen", + "BDF": "Bedford", + "BDG": "Barking and Dagenham", + "BEN": "Brent", + "BEX": "Bexley", + "BFS": "Belfast", + "BGE": "Bridgend", + "BGW": "Blaenau Gwent", + "BIR": "Birmingham", + "BKM": "Buckinghamshire", + "BMH": "Bournemouth", + "BNE": "Barnet", + "BNH": "Brighton and Hove", + "BNS": "Barnsley", + "BOL": "Bolton", + "BPL": "Blackpool", + "BRC": "Bracknell Forest", + "BRD": "Bradford", + "BRY": "Bromley", + "BST": "Bristol City of", + "BUR": "Bury", + "CAM": "Cambridgeshire", + "CAY": "Caerphilly", + "CBF": "Central Bedfordshire", + "CCG": "Causeway Coast and Glens", + "CGN": "Ceredigion", + "CHE": "Cheshire East", + "CHW": "Cheshire West and Chester", + "CLD": "Calderdale", + "CLK": "Clackmannanshire", + "CMA": "Cumbria", + "CMD": "Camden", + "CMN": "Carmarthenshire", + "CON": "Cornwall", + "COV": "Coventry (West Midlands district)", + "CRF": "Cardiff", + "CRY": "Croydon", + "CWY": "Conwy", + "DAL": "Darlington", + "DBY": "Derbyshire", + "DEN": "Denbighshire", + "DER": "Derby", + "DEV": "Devon", + "DGY": "Dumfries and Galloway", + "DNC": "Doncaster", + "DND": "Dundee", + "DOR": "Dorset", + "DRS": "Derry City and Strabane", + "DUD": "Dudley (West Midlands district)", + "DUR": "Durham", + "EAL": "Ealing", + "EAY": "East Ayrshire", + "EDH": "Edinburgh", + "EDU": "East Dunbartonshire", + "ELN": "East Lothian", + "ELS": "Eilean Siar", + "ENF": "Enfield", + "ENG": "England", + "ERW": "East Renfrewshire", + "ERY": "East Riding of Yorkshire", + "ESS": "Essex", + "ESX": "East Sussex", + "FAL": "Falkirk", + "FIF": "Fife", + "FLN": "Flintshire", + "FMO": "Fermanagh and Omagh", + "GAT": "Gateshead (Tyne", + "GLG": "Glasgow", + "GLS": "Gloucestershire", + "GRE": "Greenwich", + "GWN": "Gwynedd", + "HAL": "Halton", + "HAM": "Hampshire", + "HAV": "Havering", + "HCK": "Hackney", + "HEF": "Herefordshire County of", + "HIL": "Hillingdon", + "HLD": "Highland", + "HMF": "Hammersmith and Fulham", + "HNS": "Hounslow", + "HPL": "Hartlepool", + "HRT": "Hertfordshire", + "HRW": "Harrow", + "HRY": "Haringey", + "IOS": "Isles of Scilly", + "IOW": "Isle of Wight", + "ISL": "Islington", + "IVC": "Inverclyde", + "KEC": "Kensington and Chelsea", + "KEN": "Kent", + "KHL": "Kingston upon Hull City of", + "KIR": "Kirklees", + "KTT": "Kingston upon Thames", + "KWL": "Knowsley", + "LAN": "Lancashire", + "LBC": "Lisburn and Castlereagh", + "LBH": "Lambeth", + "LCE": "Leicester", + "LDS": "Leeds", + "LEC": "Leicestershire", + "LEW": "Lewisham", + "LIN": "Lincolnshire", + "LIV": "Liverpool", + "LND": "London City of", + "LUT": "Luton", + "MAN": "Manchester", + "MDB": "Middlesbrough", + "MDW": "Medway", + "MEA": "Mid and East Antrim", + "MIK": "Milton Keynes", + "MLN": "Midlothian", + "MON": "Monmouthshire", + "MRT": "Merton", + "MRY": "Moray", + "MTY": "Merthyr Tydfil", + "MUL": "Mid Ulster", + "NAY": "North Ayrshire", + "NBL": "Northumberland", + "NEL": "North East Lincolnshire", + "NET": "Newcastle upon Tyne", + "NFK": "Norfolk", + "NGM": "Nottingham", + "NIR": "Northern Ireland", + "NLK": "North Lanarkshire", + "NLN": "North Lincolnshire", + "NMD": "Newry Mourne and Down", + "NSM": "North Somerset", + "NTH": "Northamptonshire", + "NTL": "Neath Port Talbot", + "NTT": "Nottinghamshire", + "NTY": "North Tyneside", + "NWM": "Newham", + "NWP": "Newport", + "NYK": "North Yorkshire", + "OLD": "Oldham", + "ORK": "Orkney Islands", + "OXF": "Oxfordshire", + "PEM": "Pembrokeshire", + "PKN": "Perth and Kinross", + "PLY": "Plymouth", + "POL": "Poole", + "POR": "Portsmouth", + "POW": "Powys", + "PTE": "Peterborough", + "RCC": "Redcar and Cleveland", + "RCH": "Rochdale", + "RCT": "Rhondda Cynon Taf", + "RDB": "Redbridge", + "RDG": "Reading", + "RFW": "Renfrewshire", + "RIC": "Richmond upon Thames", + "ROT": "Rotherham", + "RUT": "Rutland", + "SAW": "Sandwell", + "SAY": "South Ayrshire", + "SCB": "Scottish Borders The", + "SCT": "Scotland", + "SFK": "Suffolk", + "SFT": "Sefton", + "SGC": "South Gloucestershire", + "SHF": "Sheffield", + "SHN": "St Helens", + "SHR": "Shropshire", + "SKP": "Stockport", + "SLF": "Salford", + "SLG": "Slough", + "SLK": "South Lanarkshire", + "SND": "Sunderland", + "SOL": "Solihull", + "SOM": "Somerset", + "SOS": "Southend-on-Sea", + "SRY": "Surrey", + "STE": "Stoke-on-Trent", + "STG": "Stirling", + "STH": "Southampton", + "STN": "Sutton", + "STS": "Staffordshire", + "STT": "Stockton-on-Tees", + "STY": "South Tyneside", + "SWA": "Swansea", + "SWD": "Swindon", + "SWK": "Southwark", + "TAM": "Tameside", + "TFW": "Telford and Wrekin", + "THR": "Thurrock", + "TOB": "Torbay", + "TOF": "Torfaen", + "TRF": "Trafford", + "TWH": "Tower Hamlets", + "VGL": "Vale of Glamorgan", + "WAR": "Warwickshire", + "WBK": "West Berkshire", + "WDU": "West Dunbartonshire", + "WFT": "Waltham Forest", + "WGN": "Wigan", + "WIL": "Wiltshire", + "WKF": "Wakefield", + "WLL": "Walsall", + "WLN": "West Lothian", + "WLS": "Wales", + "WLV": "Wolverhampton", + "WND": "Wandsworth", + "WNM": "Windsor and Maidenhead", + "WOK": "Wokingham", + "WOR": "Worcestershire", + "WRL": "Wirral", + "WRT": "Warrington", + "WRX": "Wrexham", + "WSM": "Westminster", + "WSX": "West Sussex", + "YOR": "York", + "ZET": "Shetland Islands" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GD.json b/vendor/workerman/validation/data/iso_3166-2/GD.json new file mode 100644 index 0000000..4825c10 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GD.json @@ -0,0 +1,13 @@ +{ + "source": "http://www.geonames.org/GD/administrative-division-grenada.html", + "country": "Grenada", + "subdivisions": { + "01": "Saint Andrew", + "02": "Saint David", + "03": "Saint George", + "04": "Saint John", + "05": "Saint Mark", + "06": "Saint Patrick", + "10": "Southern Grenadine Islands" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GE.json b/vendor/workerman/validation/data/iso_3166-2/GE.json new file mode 100644 index 0000000..7a1c2a4 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GE.json @@ -0,0 +1,18 @@ +{ + "source": "http://www.geonames.org/GE/administrative-division-georgia.html", + "country": "Georgia", + "subdivisions": { + "AB": "Abkhazia", + "AJ": "Ajaria", + "GU": "Guria", + "IM": "Imereti", + "KA": "Kakheti", + "KK": "Kvemo Kartli", + "MM": "Mtskheta-Mtianeti", + "RL": "Racha Lechkhumi and Kvemo Svaneti", + "SJ": "Samtskhe-Javakheti", + "SK": "Shida Kartli", + "SZ": "Samegrelo-Zemo Svaneti", + "TB": "Tbilisi" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GF.json b/vendor/workerman/validation/data/iso_3166-2/GF.json new file mode 100644 index 0000000..1486940 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GF.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/GF/administrative-division-french-guiana.html", + "country": "French Guiana", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GG.json b/vendor/workerman/validation/data/iso_3166-2/GG.json new file mode 100644 index 0000000..2b92525 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GG.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/GG/administrative-division-guernsey.html", + "country": "Guernsey", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GH.json b/vendor/workerman/validation/data/iso_3166-2/GH.json new file mode 100644 index 0000000..a70b9cc --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GH.json @@ -0,0 +1,16 @@ +{ + "source": "http://www.geonames.org/GH/administrative-division-ghana.html", + "country": "Ghana", + "subdivisions": { + "AA": "Greater Accra Region", + "AH": "Ashanti Region", + "BA": "Brong-Ahafo Region", + "CP": "Central Region", + "EP": "Eastern Region", + "NP": "Northern Region", + "TV": "Volta Region", + "UE": "Upper East Region", + "UW": "Upper West Region", + "WP": "Western Region" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GI.json b/vendor/workerman/validation/data/iso_3166-2/GI.json new file mode 100644 index 0000000..dc340d3 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GI.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/GI/administrative-division-gibraltar.html", + "country": "Gibraltar", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GL.json b/vendor/workerman/validation/data/iso_3166-2/GL.json new file mode 100644 index 0000000..6095030 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GL.json @@ -0,0 +1,11 @@ +{ + "source": "http://www.geonames.org/GL/administrative-division-greenland.html", + "country": "Greenland", + "subdivisions": { + "AV": "Avannaata", + "KU": "Kujalleq", + "QE": "Qeqqata", + "QT": "Qeqertalik", + "SM": "Sermersooq" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GM.json b/vendor/workerman/validation/data/iso_3166-2/GM.json new file mode 100644 index 0000000..62d4a3a --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GM.json @@ -0,0 +1,12 @@ +{ + "source": "http://www.geonames.org/GM/administrative-division-gambia.html", + "country": "Gambia", + "subdivisions": { + "B": "Banjul", + "L": "Lower River", + "M": "Central River", + "N": "North Bank", + "U": "Upper River", + "W": "Western" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GN.json b/vendor/workerman/validation/data/iso_3166-2/GN.json new file mode 100644 index 0000000..d0ad670 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GN.json @@ -0,0 +1,47 @@ +{ + "source": "http://www.geonames.org/GN/administrative-division-guinea.html", + "country": "Guinea", + "subdivisions": { + "B": "Boké", + "BE": "Beyla", + "BF": "Boffa", + "BK": "Boke", + "C": "Conakry", + "CO": "Coyah", + "D": "Kindia", + "DB": "Dabola", + "DI": "Dinguiraye", + "DL": "Dalaba", + "DU": "Dubreka", + "F": "Faranah", + "FA": "Faranah", + "FO": "Forecariah", + "FR": "Fria", + "GA": "Gaoual", + "GU": "Gueckedou", + "K": "Kankan", + "KA": "Kankan", + "KB": "Koubia", + "KD": "Kindia", + "KE": "Kerouane", + "KN": "Koundara", + "KO": "Kouroussa", + "KS": "Kissidougou", + "L": "Labé", + "LA": "Labe", + "LE": "Lelouma", + "LO": "Lola", + "M": "Mamou", + "MC": "Macenta", + "MD": "Mandiana", + "ML": "Mali", + "MM": "Mamou", + "N": "Nzérékoré", + "NZ": "Nzerekore", + "PI": "Pita", + "SI": "Siguiri", + "TE": "Telimele", + "TO": "Tougue", + "YO": "Yomou" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GP.json b/vendor/workerman/validation/data/iso_3166-2/GP.json new file mode 100644 index 0000000..e2e45a8 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GP.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/GP/administrative-division-guadeloupe.html", + "country": "Guadeloupe", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GQ.json b/vendor/workerman/validation/data/iso_3166-2/GQ.json new file mode 100644 index 0000000..7bbec39 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GQ.json @@ -0,0 +1,15 @@ +{ + "source": "http://www.geonames.org/GQ/administrative-division-equatorial-guinea.html", + "country": "Equatorial Guinea", + "subdivisions": { + "AN": "Provincia Annobon", + "BN": "Provincia Bioko Norte", + "BS": "Provincia Bioko Sur", + "C": "Región Continental", + "CS": "Provincia Centro Sur", + "I": "Región Insular", + "KN": "Provincia Kie-Ntem", + "LI": "Provincia Litoral", + "WN": "Provincia Wele-Nzas" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GR.json b/vendor/workerman/validation/data/iso_3166-2/GR.json new file mode 100644 index 0000000..e5b6d3f --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GR.json @@ -0,0 +1,71 @@ +{ + "source": "http://www.geonames.org/GR/administrative-division-greece.html", + "country": "Greece", + "subdivisions": { + "01": "Nomós Aitolías kai Akarnanías", + "03": "Nomós Voiotías", + "04": "Nomós Evvoías", + "05": "Nomós Evrytanías", + "06": "Nomós Fthiótidos", + "07": "Nomós Fokídos", + "11": "Nomós Argolídos", + "12": "Nomós Arkadías", + "13": "Nomós Achaḯas", + "14": "Nomós Ileías", + "15": "Nomós Korinthías", + "16": "Nomós Lakonías", + "17": "Nomós Messinías", + "21": "Nomós Zakýnthou", + "22": "Nomós Kerkýras", + "23": "Nomós Kefallinías", + "24": "Nomós Lefkádas", + "31": "Nomós Ártis", + "32": "Nomós Thesprotías", + "33": "Nomós Ioannínon", + "34": "Nomós Prevézis", + "41": "Nomós Kardhítsas", + "42": "Nomós Larísis", + "43": "Nomós Magnisías", + "44": "Nomós Trikálon", + "51": "Nomós Grevenón", + "52": "Nomós Drámas", + "53": "Nomós Imathías", + "54": "Nomós Thessaloníkis", + "55": "Nomós Kaválas", + "56": "Nomós Kastoriás", + "57": "Nomós Kilkís", + "58": "Nomós Kozánis", + "59": "Nomós Péllis", + "61": "Nomós Pierías", + "62": "Nomós Serrón", + "63": "Nomós Florínis", + "64": "Nomós Chalkidikís", + "69": "Agio Oros", + "71": "Nomós Évrou", + "72": "Nomós Xánthis", + "73": "Nomós Rodópis", + "81": "Nomós Dodekanísou", + "82": "Nomós Kykládon", + "83": "Nomós Lésvou", + "84": "Nomós Sámou", + "85": "Nomós Chíou", + "91": "Nomós Irakleíou", + "92": "Nomós Lasithíou", + "93": "Nomós Rethýmnis", + "94": "Nomós Chaniás", + "A": "Anatoliki Makedonia kai Thraki", + "A1": "Nomós Attikís", + "B": "Kentriki Makedonia", + "C": "Dytiki Makedonia", + "D": "Ipeiros", + "E": "Thessalia", + "F": "Ionia Nisia", + "G": "Dytiki Ellada", + "H": "Sterea Ellada", + "I": "Attiki", + "J": "Peloponnisos", + "K": "Voreio Aigaio", + "L": "Notio Aigaio", + "M": "Kriti" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GS.json b/vendor/workerman/validation/data/iso_3166-2/GS.json new file mode 100644 index 0000000..9fcb0bb --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GS.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/GS/administrative-division-south-georgia-and-the-south-sandwich-islands.html", + "country": "South Georgia and the South Sandwich Islands", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GT.json b/vendor/workerman/validation/data/iso_3166-2/GT.json new file mode 100644 index 0000000..e5f8d7b --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GT.json @@ -0,0 +1,28 @@ +{ + "source": "http://www.geonames.org/GT/administrative-division-guatemala.html", + "country": "Guatemala", + "subdivisions": { + "AV": "Alta Verapaz", + "BV": "Baja Verapaz", + "CM": "Chimaltenango", + "CQ": "Chiquimula", + "ES": "Escuintla", + "GU": "Guatemala", + "HU": "Huehuetenango", + "IZ": "Izabal", + "JA": "Jalapa", + "JU": "Jutiapa", + "PE": "El Peten", + "PR": "El Progreso", + "QC": "El Quiche", + "QZ": "Quetzaltenango", + "RE": "Retalhuleu", + "SA": "Sacatepequez", + "SM": "San Marcos", + "SO": "Solola", + "SR": "Santa Rosa", + "SU": "Suchitepequez", + "TO": "Totonicapan", + "ZA": "Zacapa" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GU.json b/vendor/workerman/validation/data/iso_3166-2/GU.json new file mode 100644 index 0000000..461d6a2 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GU.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/GU/administrative-division-guam.html", + "country": "Guam", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GW.json b/vendor/workerman/validation/data/iso_3166-2/GW.json new file mode 100644 index 0000000..a922e77 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GW.json @@ -0,0 +1,18 @@ +{ + "source": "http://www.geonames.org/GW/administrative-division-guinea-bissau.html", + "country": "Guinea-Bissau", + "subdivisions": { + "BA": "Bafata Region", + "BL": "Bolama Region", + "BM": "Biombo Region", + "BS": "Bissau Region", + "CA": "Cacheu Region", + "GA": "Gabu Region", + "L": "Leste", + "N": "Norte", + "OI": "Oio Region", + "QU": "Quinara Region", + "S": "Sul", + "TO": "Tombali Region" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/GY.json b/vendor/workerman/validation/data/iso_3166-2/GY.json new file mode 100644 index 0000000..9ff647c --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/GY.json @@ -0,0 +1,16 @@ +{ + "source": "http://www.geonames.org/GY/administrative-division-guyana.html", + "country": "Guyana", + "subdivisions": { + "BA": "Barima-Waini", + "CU": "Cuyuni-Mazaruni", + "DE": "Demerara-Mahaica", + "EB": "East Berbice-Corentyne", + "ES": "Essequibo Islands-West Demerara", + "MA": "Mahaica-Berbice", + "PM": "Pomeroon-Supenaam", + "PT": "Potaro-Siparuni", + "UD": "Upper Demerara-Berbice", + "UT": "Upper Takutu-Upper Essequibo" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/HK.json b/vendor/workerman/validation/data/iso_3166-2/HK.json new file mode 100644 index 0000000..2f6a72c --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/HK.json @@ -0,0 +1,24 @@ +{ + "source": "http://www.geonames.org/HK/administrative-division-hong-kong.html", + "country": "Hong Kong", + "subdivisions": { + "HCW": "Central and Western Hong Kong Island", + "HEA": "Eastern Hong Kong Island", + "HSO": "Southern Hong Kong Island", + "HWC": "Wan Chai Hong Kong Island", + "KKC": "Kowloon City Kowloon", + "KKT": "Kwun Tong Kowloon", + "KSS": "Sham Shui Po Kowloon", + "KWT": "Wong Tai Sin Kowloon", + "KYT": "Yau Tsim Mong Kowloon", + "NIS": "Islands New Territories", + "NKT": "Kwai Tsing New Territories", + "NNO": "North New Territories", + "NSK": "Sai Kung New Territories", + "NST": "Sha Tin New Territories", + "NTM": "Tuen Mun New Territories", + "NTP": "Tai Po New Territories", + "NTW": "Tsuen Wan New Territories", + "NYL": "Yuen Long New Territories" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/HM.json b/vendor/workerman/validation/data/iso_3166-2/HM.json new file mode 100644 index 0000000..e05fa77 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/HM.json @@ -0,0 +1,10 @@ +{ + "source": "http://www.geonames.org/HM/administrative-division-heard-island-and-mcdonald-islands.html", + "country": "Heard Island and McDonald Islands", + "subdivisions": { + "F": "Flat Island", + "H": "Heard Island", + "M": "McDonald Island", + "S": "Shag Island" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/HN.json b/vendor/workerman/validation/data/iso_3166-2/HN.json new file mode 100644 index 0000000..9b277a3 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/HN.json @@ -0,0 +1,24 @@ +{ + "source": "http://www.geonames.org/HN/administrative-division-honduras.html", + "country": "Honduras", + "subdivisions": { + "AT": "Atlantida", + "CH": "Choluteca", + "CL": "Colon", + "CM": "Comayagua", + "CP": "Copan", + "CR": "Cortes", + "EP": "El Paraiso", + "FM": "Francisco Morazan", + "GD": "Gracias a Dios", + "IB": "Islas de la Bahia (Bay Islands)", + "IN": "Intibuca", + "LE": "Lempira", + "LP": "La Paz", + "OC": "Ocotepeque", + "OL": "Olancho", + "SB": "Santa Barbara", + "VA": "Valle", + "YO": "Yoro" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/HR.json b/vendor/workerman/validation/data/iso_3166-2/HR.json new file mode 100644 index 0000000..77a1184 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/HR.json @@ -0,0 +1,27 @@ +{ + "source": "http://www.geonames.org/HR/administrative-division-croatia.html", + "country": "Croatia", + "subdivisions": { + "01": "Zagreb county", + "02": "Krapina-Zagorje county", + "03": "Sisak-Moslavina county", + "04": "Karlovac county", + "05": "Varazdin county", + "06": "Koprivnica-Krizevci county", + "07": "Bjelovar-Bilogora county", + "08": "Primorje-Gorski Kotar county", + "09": "Lika-Senj county", + "10": "Virovitica-Podravina county", + "11": "Pozega-Slavonia county", + "12": "Brod-Posavina county", + "13": "Zadar county", + "14": "Osijek-Baranja county", + "15": "Sibenik-Knin county", + "16": "Vukovar-Srijem county", + "17": "Split-Dalmatia county", + "18": "Istria county", + "19": "Dubrovnik-Neretva county", + "20": "Medjimurje county", + "21": "Zagreb (city)" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/HT.json b/vendor/workerman/validation/data/iso_3166-2/HT.json new file mode 100644 index 0000000..0be1024 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/HT.json @@ -0,0 +1,16 @@ +{ + "source": "http://www.geonames.org/HT/administrative-division-haiti.html", + "country": "Haiti", + "subdivisions": { + "AR": "Artibonite", + "CE": "Centre", + "GA": "Grand'Anse", + "ND": "Nord", + "NE": "Nord-Est", + "NI": "Nippes", + "NO": "Nord-Ouest", + "OU": "Ouest", + "SD": "Sud", + "SE": "Sud-Est" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/HU.json b/vendor/workerman/validation/data/iso_3166-2/HU.json new file mode 100644 index 0000000..56e49dd --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/HU.json @@ -0,0 +1,49 @@ +{ + "source": "http://www.geonames.org/HU/administrative-division-hungary.html", + "country": "Hungary", + "subdivisions": { + "BA": "Baranya megye", + "BC": "Békéscsaba", + "BE": "Békés megye", + "BK": "Bács-Kiskun megye", + "BU": "Budapest főváros", + "BZ": "Borsod-Abaúj-Zemplén megye", + "CS": "Csongrád megye", + "DE": "Debrecen", + "DU": "Dunaújváros", + "EG": "Eger", + "ER": "Erd", + "FE": "Fejér megye", + "GS": "Győr-Moson-Sopron megye", + "GY": "Győr", + "HB": "Hajdú-Bihar megye", + "HE": "Heves megye", + "HV": "Hódmezővásárhely", + "JN": "Jász-Nagykun-Szolnok megye", + "KE": "Komárom-Esztergom megye", + "KM": "Kecskemét", + "KV": "Kaposvár", + "MI": "Miskolc", + "NK": "Nagykanizsa", + "NO": "Nógrád megye", + "NY": "Nyíregyháza", + "PE": "Pest megye", + "PS": "Pécs", + "SD": "Szeged", + "SF": "Székesfehérvár", + "SH": "Szombathely", + "SK": "Szolnok", + "SN": "Sopron", + "SO": "Somogy megye", + "SS": "Szekszárd", + "ST": "Salgótarján", + "SZ": "Szabolcs-Szatmár-Bereg megye", + "TB": "Tatabánya", + "TO": "Tolna megye", + "VA": "Vas megye", + "VE": "Veszprém megye", + "VM": "Veszprém", + "ZA": "Zala megye", + "ZE": "Zalaegerszeg" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/ID.json b/vendor/workerman/validation/data/iso_3166-2/ID.json new file mode 100644 index 0000000..439a893 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/ID.json @@ -0,0 +1,47 @@ +{ + "source": "http://www.geonames.org/ID/administrative-division-indonesia.html", + "country": "Indonesia", + "subdivisions": { + "AC": "Aceh", + "BA": "Bali", + "BB": "Bangka-Belitung", + "BE": "Bengkulu", + "BT": "Banten", + "GO": "Gorontalo", + "JA": "Jambi", + "JB": "Jawa Barat", + "JI": "Jawa Timur", + "JK": "Jakarta Raya", + "JT": "Jawa Tengah", + "JW": "Java", + "KA": "Kalimantan", + "KB": "Kalimantan Barat", + "KI": "Kalimantan Timur", + "KR": "Kepulauan Riau", + "KS": "Kalimantan Selatan", + "KT": "Kalimantan Tengah", + "KU": "Kalimantan Utara", + "LA": "Lampung", + "MA": "Maluku", + "ML": "Maluku", + "MU": "Maluku Utara", + "NB": "Nusa Tenggara Barat", + "NT": "Nusa Tenggara Timur", + "NU": "Nusa Tenggara", + "PA": "Papua", + "PB": "Papua Barat", + "PP": "Papua", + "RI": "Riau", + "SA": "Sulawesi Utara", + "SB": "Sumatera Barat", + "SG": "Sulawesi Tenggara", + "SL": "Sulawesi", + "SM": "Sumatera", + "SN": "Sulawesi Selatan", + "SR": "Sulawesi Barat", + "SS": "Sumatera Selatan", + "ST": "Sulawesi Tengah", + "SU": "Sumatera Utara", + "YO": "Yogyakarta" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/IE.json b/vendor/workerman/validation/data/iso_3166-2/IE.json new file mode 100644 index 0000000..a8a85b8 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/IE.json @@ -0,0 +1,35 @@ +{ + "source": "http://www.geonames.org/IE/administrative-division-ireland.html", + "country": "Ireland", + "subdivisions": { + "C": "Connaught", + "CE": "Clare", + "CN": "Cavan", + "CO": "Cork", + "CW": "Carlow", + "DL": "Donegal", + "G": "Galway", + "KE": "Kildare", + "KK": "Kilkenny", + "KY": "Kerry", + "L": "Leinster", + "LD": "Longford", + "LH": "Louth", + "LK": "Limerick, City and County", + "LM": "Leitrim", + "LS": "Laois", + "M": "Munster", + "MH": "Meath", + "MN": "Monaghan", + "MO": "Mayo", + "OY": "Offaly", + "RN": "Roscommon", + "SO": "Sligo", + "TA": "Tipperary", + "U": "Ulster", + "WD": "Waterford, City and County", + "WH": "Westmeath", + "WW": "Wicklow", + "WX": "Wexford" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/IL.json b/vendor/workerman/validation/data/iso_3166-2/IL.json new file mode 100644 index 0000000..24e657a --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/IL.json @@ -0,0 +1,12 @@ +{ + "source": "http://www.geonames.org/IL/administrative-division-israel.html", + "country": "Israel", + "subdivisions": { + "D": "Southern", + "HA": "Haifa", + "JM": "Jerusalem", + "M": "Central", + "TA": "Tel Aviv", + "Z": "Northern" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/IM.json b/vendor/workerman/validation/data/iso_3166-2/IM.json new file mode 100644 index 0000000..50e4abb --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/IM.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/IM/administrative-division-isle-of-man.html", + "country": "Isle of Man", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/IN.json b/vendor/workerman/validation/data/iso_3166-2/IN.json new file mode 100644 index 0000000..ce7119b --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/IN.json @@ -0,0 +1,42 @@ +{ + "source": "http://www.geonames.org/IN/administrative-division-india.html", + "country": "India", + "subdivisions": { + "AN": "Andaman and Nicobar Islands", + "AP": "Andhra Pradesh", + "AR": "Arunachal Pradesh", + "AS": "Assam", + "BR": "Bihar", + "CH": "Chandigarh", + "CT": "Chhattisgarh", + "DD": "Daman and Diu", + "DL": "Delhi", + "DN": "Dadra and Nagar Haveli", + "GA": "Goa", + "GJ": "Gujarat", + "HP": "Himachal Pradesh", + "HR": "Haryana", + "JH": "Jharkhand", + "JK": "Jammu and Kashmir", + "KA": "Karnataka", + "KL": "Kerala", + "LD": "Lakshadweep", + "MH": "Maharashtra", + "ML": "Meghalaya", + "MN": "Manipur", + "MP": "Madhya Pradesh", + "MZ": "Mizoram", + "NL": "Nagaland", + "OR": "Orissa", + "PB": "Punjab", + "PY": "Pondicherry", + "RJ": "Rajasthan", + "SK": "Sikkim", + "TG": "Telangana", + "TN": "Tamil Nadu", + "TR": "Tripura", + "UP": "Uttar Pradesh", + "UT": "Uttarakhand", + "WB": "West Bengal" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/IO.json b/vendor/workerman/validation/data/iso_3166-2/IO.json new file mode 100644 index 0000000..d7aca55 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/IO.json @@ -0,0 +1,14 @@ +{ + "source": "http://www.geonames.org/IO/administrative-division-british-indian-ocean-territory.html", + "country": "British Indian Ocean Territory", + "subdivisions": { + "DG": "Diego Garcia", + "DI": "Danger Island", + "EA": "Eagle Islands", + "EG": "Egmont Islands", + "NI": "Nelsons Island", + "PB": "Peros Banhos", + "SI": "Salomon Islands", + "TB": "Three Brothers" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/IQ.json b/vendor/workerman/validation/data/iso_3166-2/IQ.json new file mode 100644 index 0000000..248bcce --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/IQ.json @@ -0,0 +1,24 @@ +{ + "source": "http://www.geonames.org/IQ/administrative-division-iraq.html", + "country": "Iraq", + "subdivisions": { + "AN": "Al Anbar", + "AR": "Arbīl", + "BA": "Al Basrah", + "BB": "Babil", + "BG": "Baghdad", + "DA": "Dahūk", + "DI": "Diyala", + "DQ": "Dhi Qar", + "KA": "Al Karbala", + "KI": "Kirkūk", + "MA": "Maysan", + "MU": "Al Muthanna", + "NA": "An Najaf", + "NI": "Ninawa", + "QA": "Al Qadisyah", + "SD": "Salah ad Din", + "SU": "As Sulaymānīyah", + "WA": "Wasit" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/IR.json b/vendor/workerman/validation/data/iso_3166-2/IR.json new file mode 100644 index 0000000..59ec5ff --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/IR.json @@ -0,0 +1,37 @@ +{ + "source": "http://www.geonames.org/IR/administrative-division-iran.html", + "country": "Iran", + "subdivisions": { + "01": "East Azarbaijan", + "02": "West Azarbaijan", + "03": "Ardabil", + "04": "Esfahan", + "05": "Ilam", + "06": "Bushehr", + "07": "Tehran", + "08": "Chahar Mahaal and Bakhtiari", + "10": "Khuzestan", + "11": "Zanjan", + "12": "Semnan", + "13": "Sistan and Baluchistan", + "14": "Fars", + "15": "Kerman", + "16": "Kurdistan", + "17": "Kermanshah", + "18": "Kohkiluyeh and Buyer Ahmad", + "19": "Gilan", + "20": "Lorestan", + "21": "Mazandaran", + "22": "Markazi", + "23": "Hormozgan", + "24": "Hamadan", + "25": "Yazd", + "26": "Qom", + "27": "Golestan", + "28": "Qazvin", + "29": "South Khorasan", + "30": "Razavi Khorasan", + "31": "North Khorasan", + "32": "Alborz" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/IS.json b/vendor/workerman/validation/data/iso_3166-2/IS.json new file mode 100644 index 0000000..769ef5c --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/IS.json @@ -0,0 +1,14 @@ +{ + "source": "http://www.geonames.org/IS/administrative-division-iceland.html", + "country": "Iceland", + "subdivisions": { + "1": "Höfuðborgarsvæði", + "2": "Suðurnes", + "3": "Vesturland", + "4": "Vestfirðir", + "5": "Norðurland Vestra", + "6": "Norðurland Eystra", + "7": "Austurland", + "8": "Suðurland" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/IT.json b/vendor/workerman/validation/data/iso_3166-2/IT.json new file mode 100644 index 0000000..d5ae0ec --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/IT.json @@ -0,0 +1,132 @@ +{ + "source": "http://www.geonames.org/IT/administrative-division-italy.html", + "country": "Italy", + "subdivisions": { + "21": "Piedmont", + "23": "Regione Autonoma Valle d'Aosta", + "25": "Lombardy", + "32": "Regione Autonoma Trentino-Alto Adige", + "34": "Regione del Veneto", + "36": "Regione Autonoma Friuli-Venezia Giulia", + "42": "Regione Liguria", + "45": "Regione Emilia-Romagna", + "52": "Tuscany", + "55": "Regione Umbria", + "57": "Regione Marche", + "62": "Regione Lazio", + "65": "Regione Abruzzo", + "67": "Regione Molise", + "72": "Regione Campania", + "75": "Regione Puglia", + "77": "Regione Basilicata", + "78": "Regione Calabria", + "82": "Regione Autonoma Siciliana", + "88": "Regione Autonoma della Sardegna", + "AG": "Agrigento", + "AL": "Alessandria", + "AN": "Ancona", + "AO": "Aosta", + "AP": "Ascoli Piceno", + "AQ": "L'Aquila", + "AR": "Arezzo", + "AT": "Asti", + "AV": "Avellino", + "BA": "Bari", + "BG": "Bergamo", + "BI": "Biella", + "BL": "Belluno", + "BN": "Benevento", + "BO": "Bologna", + "BR": "Brindisi", + "BS": "Brescia", + "BT": "Barletta-Andria-Trani", + "BZ": "Bolzano", + "CA": "Cagliari", + "CB": "Campobasso", + "CE": "Caserta", + "CH": "Chieti", + "CL": "Caltanissetta", + "CN": "Cuneo", + "CO": "Como", + "CR": "Cremona", + "CS": "Cosenza", + "CT": "Catania", + "CZ": "Catanzaro", + "EN": "Enna", + "FC": "Forlì-Cesena", + "FE": "Ferrara", + "FG": "Foggia", + "FI": "Firenze", + "FM": "Fermo", + "FR": "Frosinone", + "GE": "Genova", + "GO": "Gorizia", + "GR": "Grosseto", + "IM": "Imperia", + "IS": "Isernia", + "KR": "Crotone", + "LC": "Lecco", + "LE": "Lecce", + "LI": "Livorno", + "LO": "Lodi", + "LT": "Latina", + "LU": "Lucca", + "MB": "Monza e Brianza", + "MC": "Macerata", + "ME": "Messina", + "MI": "Milano", + "MN": "Mantova", + "MO": "Modena", + "MS": "Massa-Carrara", + "MT": "Matera", + "NA": "Napoli", + "NO": "Novara", + "NU": "Nuoro", + "OR": "Oristano", + "PA": "Palermo", + "PC": "Piacenza", + "PD": "Padova", + "PE": "Pescara", + "PG": "Perugia", + "PI": "Pisa", + "PN": "Pordenone", + "PO": "Prato", + "PR": "Parma", + "PT": "Pistoia", + "PU": "Pesaro e Urbino", + "PV": "Pavia", + "PZ": "Potenza", + "RA": "Ravenna", + "RC": "Reggio Calabria", + "RE": "Reggio Emilia", + "RG": "Ragusa", + "RI": "Rieti", + "RM": "Roma", + "RN": "Rimini", + "RO": "Rovigo", + "SA": "Salerno", + "SI": "Siena", + "SO": "Sondrio", + "SP": "La Spezia", + "SR": "Siracusa", + "SS": "Sassari", + "SV": "Savona", + "TA": "Taranto", + "TE": "Teramo", + "TN": "Trento", + "TO": "Torino", + "TP": "Trapani", + "TR": "Terni", + "TS": "Trieste", + "TV": "Treviso", + "UD": "Udine", + "VA": "Varese", + "VB": "Verbano-Cusio-Ossola", + "VC": "Vercelli", + "VE": "Venezia", + "VI": "Vicenza", + "VR": "Verona", + "VT": "Viterbo", + "VV": "Vibo Valentia" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/JE.json b/vendor/workerman/validation/data/iso_3166-2/JE.json new file mode 100644 index 0000000..f78e603 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/JE.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/JE/administrative-division-jersey.html", + "country": "Jersey", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/JM.json b/vendor/workerman/validation/data/iso_3166-2/JM.json new file mode 100644 index 0000000..3d113a0 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/JM.json @@ -0,0 +1,20 @@ +{ + "source": "http://www.geonames.org/JM/administrative-division-jamaica.html", + "country": "Jamaica", + "subdivisions": { + "01": "Kingston Parish", + "02": "Saint Andrew Parish", + "03": "Saint Thomas Parish", + "04": "Portland Parish", + "05": "Saint Mary Parish", + "06": "Saint Ann Parish", + "07": "Trelawny Parish", + "08": "Saint James Parish", + "09": "Hanover Parish", + "10": "Westmoreland Parish", + "11": "Saint Elizabeth Parish", + "12": "Manchester Parish", + "13": "Clarendon Parish", + "14": "Saint Catherine Parish" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/JO.json b/vendor/workerman/validation/data/iso_3166-2/JO.json new file mode 100644 index 0000000..5dcaf17 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/JO.json @@ -0,0 +1,18 @@ +{ + "source": "http://www.geonames.org/JO/administrative-division-jordan.html", + "country": "Jordan", + "subdivisions": { + "AJ": "Ajlun", + "AM": "'Amman", + "AQ": "Al 'Aqabah", + "AT": "At Tafilah", + "AZ": "Az Zarqa'", + "BA": "Al Balqa'", + "IR": "Irbid", + "JA": "Jarash", + "KA": "Al Karak", + "MA": "Al Mafraq", + "MD": "Madaba", + "MN": "Ma'an" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/JP.json b/vendor/workerman/validation/data/iso_3166-2/JP.json new file mode 100644 index 0000000..00e9ea6 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/JP.json @@ -0,0 +1,53 @@ +{ + "source": "http://www.geonames.org/JP/administrative-division-japan.html", + "country": "Japan", + "subdivisions": { + "01": "Hokkaidō", + "02": "Aomori", + "03": "Iwate", + "04": "Miyagi", + "05": "Akita", + "06": "Yamagata", + "07": "Hukusima (Fukushima)", + "08": "Ibaraki", + "09": "Totigi (Tochigi)", + "10": "Gunma", + "11": "Saitama", + "12": "Tiba (Chiba)", + "13": "Tokyo", + "14": "Kanagawa", + "15": "Niigata", + "16": "Toyama", + "17": "Isikawa (Ishikawa)", + "18": "Hukui (Fukui)", + "19": "Yamanasi (Yamanashi)", + "20": "Nagano", + "21": "Gihu (Gifu)", + "22": "Sizuoka (Shizuoka)", + "23": "Aiti (Aichi)", + "24": "Mie", + "25": "Siga (Shiga)", + "26": "Kyoto", + "27": "Osaka", + "28": "Hyogo", + "29": "Nara", + "30": "Wakayama", + "31": "Tottori", + "32": "Simane (Shimane)", + "33": "Okayama", + "34": "Hirosima (Hiroshima)", + "35": "Yamaguti (Yamaguchi)", + "36": "Tokusima (Tokushima)", + "37": "Kagawa", + "38": "Ehime", + "39": "Koti (Kochi)", + "40": "Hukuoka (Fukuoka)", + "41": "Saga", + "42": "Nagasaki", + "43": "Kumamoto", + "44": "Oita", + "45": "Miyazaki", + "46": "Kagosima (Kagoshima)", + "47": "Okinawa" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/KE.json b/vendor/workerman/validation/data/iso_3166-2/KE.json new file mode 100644 index 0000000..5e9cc96 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/KE.json @@ -0,0 +1,53 @@ +{ + "source": "http://www.geonames.org/KE/administrative-division-kenya.html", + "country": "Kenya", + "subdivisions": { + "01": "Baringo", + "02": "Bomet", + "03": "Bungoma", + "04": "Busia", + "05": "Elgeyo/Marakwet", + "06": "Embu", + "07": "Garissa", + "08": "Homa Bay", + "09": "Isiolo", + "10": "Kajiado", + "11": "Kakamega", + "12": "Kericho", + "13": "Kiambu", + "14": "Kilifi", + "15": "Kirinyaga", + "16": "Kisii", + "17": "Kisumu", + "18": "Kitui", + "19": "Kwale", + "20": "Laikipia", + "21": "Lamu", + "22": "Machakos", + "23": "Makueni", + "24": "Mandera", + "25": "Marsabit", + "26": "Meru", + "27": "Migori", + "28": "Mombasa", + "29": "Murang’a", + "30": "Nairobi", + "31": "Nakuru", + "32": "Nandi", + "33": "Narok", + "34": "Nyamira", + "35": "Nyandarua", + "36": "Nyeri", + "37": "Samburu", + "38": "Siaya", + "39": "Taita/Taveta", + "40": "Tana River", + "41": "Tharak-Nithi", + "42": "Trans Nzoia", + "43": "Turkana", + "44": "Uasin Gishu", + "45": "Vihiga", + "46": "Wajir", + "47": "West Pokot" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/KG.json b/vendor/workerman/validation/data/iso_3166-2/KG.json new file mode 100644 index 0000000..8b4aec0 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/KG.json @@ -0,0 +1,15 @@ +{ + "source": "http://www.geonames.org/KG/administrative-division-kyrgyzstan.html", + "country": "Kyrgyzstan", + "subdivisions": { + "B": "Batken", + "C": "Chu", + "GB": "Bishkek", + "GO": "Osh City", + "J": "Jalal-Abad", + "N": "Naryn", + "O": "Osh", + "T": "Talas", + "Y": "Ysyk-Kol" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/KH.json b/vendor/workerman/validation/data/iso_3166-2/KH.json new file mode 100644 index 0000000..1ed6622 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/KH.json @@ -0,0 +1,31 @@ +{ + "source": "http://www.geonames.org/KH/administrative-division-cambodia.html", + "country": "Cambodia", + "subdivisions": { + "1": "Banteay Mean Choay", + "10": "Kratie", + "11": "Mondul Kiri", + "12": "Phnom Penh", + "13": "Preah Vihear", + "14": "Prey Veng", + "15": "Pursat", + "16": "Rôtânôkiri", + "17": "Siemreap", + "18": "Preah Seihanu (Kompong Som or Sihanoukville)", + "19": "Stung Treng", + "2": "Battambang", + "20": "Svay Rieng", + "21": "Takeo", + "22": "Otdar Mean Choay", + "23": "Keb", + "24": "Pailin", + "25": "Tboung Khmum", + "3": "Kampong Cham", + "4": "Kampong Chhnang", + "5": "Kampong Speu", + "6": "Kampong Thom", + "7": "Kampot", + "8": "Kandal", + "9": "Kaoh Kong" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/KI.json b/vendor/workerman/validation/data/iso_3166-2/KI.json new file mode 100644 index 0000000..bb2d8df --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/KI.json @@ -0,0 +1,9 @@ +{ + "source": "http://www.geonames.org/KI/administrative-division-kiribati.html", + "country": "Kiribati", + "subdivisions": { + "G": "Gilbert Islands", + "L": "Line Islands", + "P": "Phoenix Islands" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/KM.json b/vendor/workerman/validation/data/iso_3166-2/KM.json new file mode 100644 index 0000000..197ec2b --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/KM.json @@ -0,0 +1,9 @@ +{ + "source": "http://www.geonames.org/KM/administrative-division-comoros.html", + "country": "Comoros", + "subdivisions": { + "A": "Anjouan", + "G": "Grande Comore", + "M": "Moheli" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/KN.json b/vendor/workerman/validation/data/iso_3166-2/KN.json new file mode 100644 index 0000000..4446e6e --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/KN.json @@ -0,0 +1,22 @@ +{ + "source": "http://www.geonames.org/KN/administrative-division-saint-kitts-and-nevis.html", + "country": "Saint Kitts and Nevis", + "subdivisions": { + "01": "Christ Church Nichola Town", + "02": "Saint Anne Sandy Point", + "03": "Saint George Basseterre", + "04": "Saint George Gingerland", + "05": "Saint James Windward", + "06": "Saint John Capesterre", + "07": "Saint John Figtree", + "08": "Saint Mary Cayon", + "09": "Saint Paul Capesterre", + "10": "Saint Paul Charlestown", + "11": "Saint Peter Basseterre", + "12": "Saint Thomas Lowland", + "13": "Saint Thomas Middle Island", + "15": "Trinity Palmetto Point", + "K": "Saint Kitts", + "N": "Nevis" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/KP.json b/vendor/workerman/validation/data/iso_3166-2/KP.json new file mode 100644 index 0000000..c1743bd --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/KP.json @@ -0,0 +1,17 @@ +{ + "source": "http://www.geonames.org/KP/administrative-division-north-korea.html", + "country": "North Korea", + "subdivisions": { + "01": "P'yongyang Special City", + "02": "P'yongan-namdo", + "03": "P'yongan-bukto", + "04": "Chagang-do", + "05": "Hwanghae-namdo", + "06": "Hwanghae-bukto", + "07": "Kangwon-do", + "08": "Hamgyong-namdo", + "09": "Hamgyong-bukto", + "10": "Ryanggang-do (Yanggang-do)", + "13": "Nasŏn (Najin-Sŏnbong)" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/KR.json b/vendor/workerman/validation/data/iso_3166-2/KR.json new file mode 100644 index 0000000..c4128fe --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/KR.json @@ -0,0 +1,23 @@ +{ + "source": "http://www.geonames.org/KR/administrative-division-south-korea.html", + "country": "South Korea", + "subdivisions": { + "11": "Seoul Special City", + "26": "Busan Metropolitan City", + "27": "Daegu Metropolitan City", + "28": "Incheon Metropolitan City", + "29": "Gwangju Metropolitan City", + "30": "Daejeon Metropolitan City", + "31": "Ulsan Metropolitan City", + "41": "Gyeonggi-do", + "42": "Gangwon-do", + "43": "Chungcheongbuk-do", + "44": "Chungcheongnam-do", + "45": "Jeollabuk-do", + "46": "Jeollanam-do", + "47": "Gyeongsangbuk-do", + "48": "Gyeongsangnam-do", + "49": "Jeju-do", + "50": "Sejong" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/KW.json b/vendor/workerman/validation/data/iso_3166-2/KW.json new file mode 100644 index 0000000..2526538 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/KW.json @@ -0,0 +1,12 @@ +{ + "source": "http://www.geonames.org/KW/administrative-division-kuwait.html", + "country": "Kuwait", + "subdivisions": { + "AH": "Al Ahmadi", + "FA": "Al Farwaniyah", + "HA": "Hawalli", + "JA": "Al Jahra", + "KU": "Al Asimah", + "MU": "Mubārak al Kabīr" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/KY.json b/vendor/workerman/validation/data/iso_3166-2/KY.json new file mode 100644 index 0000000..a5b4540 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/KY.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/KY/administrative-division-cayman-islands.html", + "country": "Cayman Islands", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/KZ.json b/vendor/workerman/validation/data/iso_3166-2/KZ.json new file mode 100644 index 0000000..13ad766 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/KZ.json @@ -0,0 +1,24 @@ +{ + "source": "http://www.geonames.org/KZ/administrative-division-kazakhstan.html", + "country": "Kazakhstan", + "subdivisions": { + "AKM": "Aqmola", + "AKT": "Aqtobe", + "ALA": "Almaty", + "ALM": "Almaty", + "AST": "Astana", + "ATY": "Atyrau", + "BAY": "Baykonyr", + "KAR": "Qaraghandy", + "KUS": "Qustanay", + "KZY": "Qyzylorda", + "MAN": "Mangghystau", + "PAV": "Paylodar", + "SEV": "Soltustik Qazaqstan", + "SHY": "Shymkent", + "VOS": "Shyghys Qazaqstan", + "YUZ": "Ongtustik Qazaqstan", + "ZAP": "Baty Qazaqstan", + "ZHA": "Zhambyl" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/LA.json b/vendor/workerman/validation/data/iso_3166-2/LA.json new file mode 100644 index 0000000..be3b28c --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/LA.json @@ -0,0 +1,24 @@ +{ + "source": "http://www.geonames.org/LA/administrative-division-laos.html", + "country": "Laos", + "subdivisions": { + "AT": "Attapu", + "BK": "Bokeo", + "BL": "Bolikhamxai", + "CH": "Champasak", + "HO": "Houaphan", + "KH": "Khammouan", + "LM": "Louang Namtha", + "LP": "Louangphabang", + "OU": "Oudomxai", + "PH": "Phongsali", + "SL": "Salavan", + "SV": "Savannakhet", + "VI": "Vientiane", + "VT": "Vientiane", + "XA": "Xaignabouli", + "XE": "Xekong", + "XI": "Xiangkhoang", + "XS": "Xaisômboun" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/LB.json b/vendor/workerman/validation/data/iso_3166-2/LB.json new file mode 100644 index 0000000..fe71044 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/LB.json @@ -0,0 +1,14 @@ +{ + "source": "http://www.geonames.org/LB/administrative-division-lebanon.html", + "country": "Lebanon", + "subdivisions": { + "AK": "Aakkâr", + "AS": "Liban-Nord", + "BA": "Beyrouth", + "BH": "Baalbek-Hermel", + "BI": "Béqaa", + "JA": "Liban-Sud", + "JL": "Mont-Liban", + "NA": "Nabatîyé" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/LC.json b/vendor/workerman/validation/data/iso_3166-2/LC.json new file mode 100644 index 0000000..4465286 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/LC.json @@ -0,0 +1,16 @@ +{ + "source": "http://www.geonames.org/LC/administrative-division-saint-lucia.html", + "country": "Saint Lucia", + "subdivisions": { + "01": "Anse-la-Raye", + "02": "Castries", + "03": "Choiseul", + "05": "Dennery", + "06": "Gros-Islet", + "07": "Laborie", + "08": "Micoud", + "10": "Soufriere", + "11": "Vieux-Fort", + "12": "Canaries" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/LI.json b/vendor/workerman/validation/data/iso_3166-2/LI.json new file mode 100644 index 0000000..a46f948 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/LI.json @@ -0,0 +1,17 @@ +{ + "source": "http://www.geonames.org/LI/administrative-division-liechtenstein.html", + "country": "Liechtenstein", + "subdivisions": { + "01": "Balzers", + "02": "Eschen", + "03": "Gamprin", + "04": "Mauren", + "05": "Planken", + "06": "Ruggell", + "07": "Schaan", + "08": "Schellenberg", + "09": "Triesen", + "10": "Triesenberg", + "11": "Vaduz" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/LK.json b/vendor/workerman/validation/data/iso_3166-2/LK.json new file mode 100644 index 0000000..88c18c3 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/LK.json @@ -0,0 +1,40 @@ +{ + "source": "http://www.geonames.org/LK/administrative-division-sri-lanka.html", + "country": "Sri Lanka", + "subdivisions": { + "1": "Western", + "11": "Kŏḷamba", + "12": "Gampaha", + "13": "Kaḷutara", + "2": "Central", + "21": "Mahanuvara", + "22": "Mātale", + "23": "Nuvara Ĕliya", + "3": "Southern", + "31": "Gālla", + "32": "Mātara", + "33": "Hambantŏṭa", + "4": "Northern", + "41": "Yāpanaya", + "42": "Kilinŏchchi", + "43": "Mannārama", + "44": "Vavuniyāva", + "45": "Mulativ", + "5": "Eastern", + "51": "Maḍakalapuva", + "52": "Ampāra", + "53": "Trikuṇāmalaya", + "6": "North Western", + "61": "Kuruṇægala", + "62": "Puttalama", + "7": "North Central", + "71": "Anurādhapura", + "72": "Pŏḷŏnnaruva", + "8": "Uva", + "81": "Badulla", + "82": "Mŏṇarāgala", + "9": "Sabaragamuwa", + "91": "Ratnapura", + "92": "Kægalla" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/LR.json b/vendor/workerman/validation/data/iso_3166-2/LR.json new file mode 100644 index 0000000..2f204a1 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/LR.json @@ -0,0 +1,21 @@ +{ + "source": "http://www.geonames.org/LR/administrative-division-liberia.html", + "country": "Liberia", + "subdivisions": { + "BG": "Bong", + "BM": "Bomi", + "CM": "Grand Cape Mount", + "GB": "Grand Bassa", + "GG": "Grand Gedeh", + "GK": "Grand Kru", + "GP": "Gbarpolu", + "LO": "Lofa", + "MG": "Margibi", + "MO": "Montserrado", + "MY": "Maryland", + "NI": "Nimba", + "RG": "River Gee", + "RI": "River Cess", + "SI": "Sinoe" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/LS.json b/vendor/workerman/validation/data/iso_3166-2/LS.json new file mode 100644 index 0000000..2ae10f2 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/LS.json @@ -0,0 +1,16 @@ +{ + "source": "http://www.geonames.org/LS/administrative-division-lesotho.html", + "country": "Lesotho", + "subdivisions": { + "A": "Maseru", + "B": "Butha-Buthe", + "C": "Leribe", + "D": "Berea", + "E": "Mafeteng", + "F": "Mohale's Hoek", + "G": "Quthing", + "H": "Qacha's Nek", + "J": "Mokhotlong", + "K": "Thaba-Tseka" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/LT.json b/vendor/workerman/validation/data/iso_3166-2/LT.json new file mode 100644 index 0000000..3e4aab3 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/LT.json @@ -0,0 +1,76 @@ +{ + "source": "http://www.geonames.org/LT/administrative-division-lithuania.html", + "country": "Lithuania", + "subdivisions": { + "01": "Akmenė", + "02": "Alytaus miestas", + "03": "Alytus", + "04": "Anykščiai", + "05": "Birštono", + "06": "Biržai", + "07": "Druskininkai", + "08": "Elektrėnai", + "09": "Ignalina", + "10": "Jonava", + "11": "Joniškis", + "12": "Jurbarkas", + "13": "Kaišiadorys", + "14": "Kalvarijos", + "15": "Kauno miestas", + "16": "Kaunas", + "17": "Kazlų Rūdos", + "18": "Kėdainiai", + "19": "Kelmė", + "20": "Klaipėdos miestas", + "21": "Klaipėda", + "22": "Kretinga", + "23": "Kupiškis", + "24": "Lazdijai", + "25": "Marijampolė", + "26": "Mažeikiai", + "27": "Molėtai", + "28": "Neringa", + "29": "Pagėgiai", + "30": "Pakruojis", + "31": "Palangos miestas", + "32": "Panevėžio miestas", + "33": "Panevėžys", + "34": "Pasvalys", + "35": "Plungė", + "36": "Prienai", + "37": "Radviliškis", + "38": "Raseiniai", + "39": "Rietavo", + "40": "Rokiškis", + "41": "Šakiai", + "42": "Šalčininkai", + "43": "Šiaulių miestas", + "44": "Šiauliai", + "45": "Šilalė", + "46": "Šilutė", + "47": "Širvintos", + "48": "Skuodas", + "49": "Švenčionys", + "50": "Tauragė", + "51": "Telšiai", + "52": "Trakai", + "53": "Ukmergė", + "54": "Utena", + "55": "Varėna", + "56": "Vilkaviškis", + "57": "Vilniaus miestas", + "58": "Vilnius", + "59": "Visaginas", + "60": "Zarasai", + "AL": "Alytus", + "KL": "Klaipeda", + "KU": "Kaunas", + "MR": "Marijampole", + "PN": "Panevezys", + "SA": "Siauliai", + "TA": "Taurage", + "TE": "Telsiai", + "UT": "Utena", + "VL": "Vilnius" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/LU.json b/vendor/workerman/validation/data/iso_3166-2/LU.json new file mode 100644 index 0000000..a0a3276 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/LU.json @@ -0,0 +1,18 @@ +{ + "source": "http://www.geonames.org/LU/administrative-division-luxembourg.html", + "country": "Luxembourg", + "subdivisions": { + "CA": "Canton de Capellen", + "CL": "Canton de Clervaux", + "DI": "Canton de Diekirch", + "EC": "Canton d'Echternach", + "ES": "Canton d'Esch-sur-Alzette", + "GR": "Canton de Grevenmacher", + "LU": "Canton de Luxembourg", + "ME": "Canton de Mersch", + "RD": "Canton de Redange", + "RM": "Canton de Remich", + "VD": "Canton de Vianden", + "WI": "Canton de Wiltz" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/LV.json b/vendor/workerman/validation/data/iso_3166-2/LV.json new file mode 100644 index 0000000..084c45a --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/LV.json @@ -0,0 +1,125 @@ +{ + "source": "http://www.geonames.org/LV/administrative-division-latvia.html", + "country": "Latvia", + "subdivisions": { + "001": "Aglonas Novads", + "002": "Aizkraukles Novads", + "003": "Aizputes Novads", + "004": "Aknīstes Novads", + "005": "Alojas Novads", + "006": "Alsungas Novads", + "007": "Alūksnes Novads", + "008": "Amatas Novads", + "009": "Apes Novads", + "010": "Auces Novads", + "011": "Ādažu Novads", + "012": "Babītes Novads", + "013": "Baldones Novads", + "014": "Baltinavas Novads", + "015": "Balvu Novads", + "016": "Bauskas Novads", + "017": "Beverīnas Novads", + "018": "Brocēnu Novads", + "019": "Burtnieku Novads", + "020": "Carnikavas Novads", + "021": "Cesvaines Novads", + "022": "Cēsu Novads", + "023": "Ciblas Novads", + "024": "Dagdas Novads", + "025": "Daugavpils Novads", + "026": "Dobeles Novads", + "027": "Dundagas Novads", + "028": "Durbes Novads", + "029": "Engures Novads", + "030": "Ērgļu Novads", + "031": "Garkalnes Novads", + "032": "Grobiņas Novads", + "033": "Gulbenes Novads", + "034": "Iecavas Novads", + "035": "Ikšķiles Novads", + "036": "Ilūkstes Novads", + "037": "Inčukalna Novads", + "038": "Jaunjelgavas Novads", + "039": "Jaunpiebalgas Novads", + "040": "Jaunpils Novads", + "041": "Jelgavas Novads", + "042": "Jēkabpils Novads", + "043": "Kandavas Novads", + "044": "Kārsavas Novads", + "045": "Kocēnu Novads", + "046": "Kokneses Novads", + "047": "Krāslavas Novads", + "048": "Krimuldas Novads", + "049": "Krustpils Novads", + "050": "Kuldīgas Novads", + "051": "Ķeguma Novads", + "052": "Ķekavas Novads", + "053": "Lielvārdes Novads", + "054": "Limbažu Novads", + "055": "Līgatnes Novads", + "056": "Līvānu Novads", + "057": "Lubānas Novads", + "058": "Ludzas Novads", + "059": "Madonas Novads", + "060": "Mazsalacas Novads", + "061": "Mālpils Novads", + "062": "Mārupes Novads", + "063": "Mērsraga novads", + "064": "Naukšēnu Novads", + "065": "Neretas Novads", + "066": "Nīcas Novads", + "067": "Ogres Novads", + "068": "Olaines Novads", + "069": "Ozolnieku Novads", + "070": "Pārgaujas Novads", + "071": "Pāvilostas Novads", + "072": "Pļaviņu Novads", + "073": "Preiļu Novads", + "074": "Priekules Novads", + "075": "Priekuļu Novads", + "076": "Raunas Novads", + "077": "Rēzeknes Novads", + "078": "Riebiņu Novads", + "079": "Rojas Novads", + "080": "Ropažu Novads", + "081": "Rucavas Novads", + "082": "Rugāju Novads", + "083": "Rundāles Novads", + "084": "Rūjienas Novads", + "085": "Salas Novads", + "086": "Salacgrīvas Novads", + "087": "Salaspils Novads", + "088": "Saldus Novads", + "089": "Saulkrastu Novads", + "090": "Sējas Novads", + "091": "Siguldas Novads", + "092": "Skrīveru Novads", + "093": "Skrundas Novads", + "094": "Smiltenes Novads", + "095": "Stopiņu Novads", + "096": "Strenču Novads", + "097": "Talsu Novads", + "098": "Tērvetes Novads", + "099": "Tukuma Novads", + "100": "Vaiņodes Novads", + "101": "Valkas Novads", + "102": "Varakļānu Novads", + "103": "Vārkavas Novads", + "104": "Vecpiebalgas Novads", + "105": "Vecumnieku Novads", + "106": "Ventspils Novads", + "107": "Viesītes Novads", + "108": "Viļakas Novads", + "109": "Viļānu Novads", + "110": "Zilupes Novads", + "DGV": "Daugavpils", + "JEL": "Jelgava", + "JKB": "Jēkabpils", + "JUR": "Jurmala", + "LPX": "Liepaja", + "REZ": "Rezekne", + "RIX": "Riga", + "VEN": "Ventspils", + "VMR": "Valmiera" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/LY.json b/vendor/workerman/validation/data/iso_3166-2/LY.json new file mode 100644 index 0000000..bc63f58 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/LY.json @@ -0,0 +1,28 @@ +{ + "source": "http://www.geonames.org/LY/administrative-division-libya.html", + "country": "Libya", + "subdivisions": { + "BA": "Banghazi", + "BU": "Al Buţnān", + "DR": "Darnah", + "GT": "Ghāt", + "JA": "Al Jabal al Akhdar", + "JG": "Al Jabal al Gharbī", + "JI": "Al Jifārah", + "JU": "Al Jufrah", + "KF": "Al Kufrah", + "MB": "Al Marqab", + "MI": "Misratah", + "MJ": "Al Maraj", + "MQ": "Murzuq", + "NL": "Nālūt", + "NQ": "An Nuqat al Khams", + "SB": "Sabha", + "SR": "Surt", + "TB": "Ţarābulus", + "WA": "Al Wāḩāt", + "WD": "Wādī al Ḩayāt", + "WS": "Wādī ash Shāţi´", + "ZA": "Az Zawiyah" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MA.json b/vendor/workerman/validation/data/iso_3166-2/MA.json new file mode 100644 index 0000000..ed5b819 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MA.json @@ -0,0 +1,93 @@ +{ + "source": "http://www.geonames.org/MA/administrative-division-morocco.html", + "country": "Morocco", + "subdivisions": { + "01": "Tanger-Tetouan-Al Hoceima", + "02": "Oriental", + "03": "Fès-Meknès", + "04": "Rabat-Salé-Kénitra", + "05": "Béni Mellal-Khénifra", + "06": "Casablanca-Settat", + "07": "Marrakesh-Safi", + "08": "Drâa-Tafilalet", + "09": "Souss-Massa", + "10": "Guelmim-Oued Noun", + "11": "Laâyoune-Sakia El Hamra", + "12": "Dakhla-Oued Ed-Dahab", + "AGD": "Agadir-Ida-Outanane", + "AOU": "Aousserd (EH)", + "ASZ": "Assa-Zag", + "AZI": "Azilal", + "BEM": "Beni Mellal", + "BER": "Berkane", + "BES": "Ben Slimane", + "BOD": "Boujdour (EH)", + "BOM": "Boulemane", + "BRR": "Berrechid", + "CAS": "Casablanca [Dar el Beïda]", + "CHE": "Chefchaouen", + "CHI": "Chichaoua", + "CHT": "Chtouka-Ait Baha", + "DRI": "Driouch", + "ERR": "Errachidia", + "ESI": "Essaouira", + "ESM": "Es Smara (EH)", + "FAH": "Fahs-Anjra", + "FES": "Fès-Dar-Dbibegh", + "FIG": "Figuig", + "FQH": "Fquih Ben Salah", + "GUE": "Guelmim", + "GUF": "Guercif", + "HAJ": "El Hajeb", + "HAO": "Al Haouz", + "HOC": "Al Hoceïma", + "IFR": "Ifrane", + "INE": "Inezgane-Ait Melloul", + "JDI": "El Jadida", + "JRA": "Jrada", + "KEN": "Kénitra", + "KES": "Kelaat es Sraghna", + "KHE": "Khémisset", + "KHN": "Khénifra", + "KHO": "Khouribga", + "LAA": "Laâyoune", + "LAR": "Larache", + "MAR": "Marrakech", + "MDF": "M'Diq-Fnideq", + "MED": "Médiouna", + "MEK": "Meknès", + "MID": "Midelt", + "MOH": "Mohammadia", + "MOU": "Moulay Yacoub", + "NAD": "Nador", + "NOU": "Nouaceur", + "OUA": "Ouarzazate", + "OUD": "Oued ed Dahab (EH)", + "OUJ": "Oujda-Angad", + "OUZ": "Ouezzane", + "RAB": "Rabat", + "REH": "Rehamna", + "SAF": "Safi", + "SAL": "Salé", + "SEF": "Sefrou", + "SET": "Settat", + "SIB": "Sidi Bennour", + "SIF": "Sidi Ifni", + "SIK": "Sidi Kacem", + "SIL": "Sidi Slimane", + "SKH": "Skhirate-Témara", + "TAF": "Tarfaya", + "TAI": "Taourirt", + "TAO": "Taounate", + "TAR": "Taroudant", + "TAT": "Tata", + "TAZ": "Taza", + "TET": "Tétouan", + "TIN": "Tinghir", + "TIZ": "Tiznit", + "TNG": "Tanger-Assilah", + "TNT": "Tan-Tan", + "YUS": "Youssoufia", + "ZAG": "Zagora" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MC.json b/vendor/workerman/validation/data/iso_3166-2/MC.json new file mode 100644 index 0000000..e1ea17e --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MC.json @@ -0,0 +1,23 @@ +{ + "source": "http://www.geonames.org/MC/administrative-division-monaco.html", + "country": "Monaco", + "subdivisions": { + "CL": "La Colle", + "CO": "La Condamine", + "FO": "Fontvieille", + "GA": "La Gare", + "JE": "Jardin Exotique", + "LA": "Larvotto", + "MA": "Malbousquet", + "MC": "Monte-Carlo", + "MG": "Moneghetti", + "MO": "Monaco-Ville", + "MU": "Moulins", + "PH": "Port-Hercule", + "SD": "Sainte-Dévote", + "SO": "La Source", + "SP": "Spélugues", + "SR": "Saint-Roman", + "VR": "Vallon de la Rousse" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MD.json b/vendor/workerman/validation/data/iso_3166-2/MD.json new file mode 100644 index 0000000..a3d891b --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MD.json @@ -0,0 +1,43 @@ +{ + "source": "http://www.geonames.org/MD/administrative-division-moldova.html", + "country": "Moldova", + "subdivisions": { + "AN": "Raionul Anenii Noi", + "BA": "Municipiul Bălţi", + "BD": "Tighina", + "BR": "Raionul Briceni", + "BS": "Raionul Basarabeasca", + "CA": "Cahul", + "CL": "Raionul Călăraşi", + "CM": "Raionul Cimişlia", + "CR": "Raionul Criuleni", + "CS": "Raionul Căuşeni", + "CT": "Raionul Cantemir", + "CU": "Municipiul Chişinău", + "DO": "Donduşeni", + "DR": "Raionul Drochia", + "DU": "Dubăsari", + "ED": "Raionul Edineţ", + "FA": "Făleşti", + "FL": "Floreşti", + "GA": "U.T.A. Găgăuzia", + "GL": "Raionul Glodeni", + "HI": "Hînceşti", + "IA": "Ialoveni", + "LE": "Leova", + "NI": "Nisporeni", + "OC": "Raionul Ocniţa", + "OR": "Raionul Orhei", + "RE": "Rezina", + "RI": "Rîşcani", + "SD": "Raionul Şoldăneşti", + "SI": "Sîngerei", + "SN": "Stînga Nistrului", + "SO": "Soroca", + "ST": "Raionul Străşeni", + "SV": "Raionul Ştefan Vodă", + "TA": "Raionul Taraclia", + "TE": "Teleneşti", + "UN": "Raionul Ungheni" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/ME.json b/vendor/workerman/validation/data/iso_3166-2/ME.json new file mode 100644 index 0000000..a27fe58 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/ME.json @@ -0,0 +1,29 @@ +{ + "source": "http://www.geonames.org/ME/administrative-division-montenegro.html", + "country": "Montenegro", + "subdivisions": { + "01": "Opština Andrijevica", + "02": "Opština Bar", + "03": "Opština Berane", + "04": "Opština Bijelo Polje", + "05": "Opština Budva", + "06": "Opština Cetinje", + "07": "Opština Danilovgrad", + "08": "Opština Herceg-Novi", + "09": "Opština Kolašin", + "10": "Opština Kotor", + "11": "Opština Mojkovac", + "12": "Opština Nikšić", + "13": "Opština Plav", + "14": "Opština Pljevlja", + "15": "Opština Plužine", + "16": "Opština Podgorica", + "17": "Opština Rožaje", + "18": "Opština Šavnik", + "19": "Opština Tivat", + "20": "Opština Ulcinj", + "21": "Opština Žabljak", + "22": "Gusinje", + "23": "Petnjica" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MF.json b/vendor/workerman/validation/data/iso_3166-2/MF.json new file mode 100644 index 0000000..0e62361 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MF.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/MF/administrative-division-saint-martin.html", + "country": "Saint Martin", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MG.json b/vendor/workerman/validation/data/iso_3166-2/MG.json new file mode 100644 index 0000000..7eb9056 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MG.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/MG/administrative-division-madagascar.html", + "country": "Madagascar", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MH.json b/vendor/workerman/validation/data/iso_3166-2/MH.json new file mode 100644 index 0000000..7255c9d --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MH.json @@ -0,0 +1,32 @@ +{ + "source": "http://www.geonames.org/MH/administrative-division-marshall-islands.html", + "country": "Marshall Islands", + "subdivisions": { + "ALK": "Ailuk", + "ALL": "Ailinglaplap", + "ARN": "Arno", + "AUR": "Aur", + "EBO": "Ebon", + "ENI": "Enewetak", + "JAB": "Jabat", + "JAL": "Jaluit", + "KIL": "Kili", + "KWA": "Kwajalein", + "L": "Ralik chain", + "LAE": "Lae", + "LIB": "Lib", + "LIK": "Likiep", + "MAJ": "Majuro", + "MAL": "Maloelap", + "MEJ": "Mejit", + "MIL": "Mili", + "NMK": "Namorik", + "NMU": "Namu", + "RON": "Rongelap", + "T": "Ratak chain", + "UJA": "Ujae", + "UTI": "Utirik", + "WTH": "Wotho", + "WTJ": "Wotje" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MK.json b/vendor/workerman/validation/data/iso_3166-2/MK.json new file mode 100644 index 0000000..8548863 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MK.json @@ -0,0 +1,91 @@ +{ + "source": "http://www.geonames.org/MK/administrative-division-macedonia.html", + "country": "Macedonia", + "subdivisions": { + "01": "Aerodrom †", + "02": "Aračinovo", + "03": "Berovo", + "04": "Bitola", + "05": "Bogdanci", + "06": "Bogovinje", + "07": "Bosilovo", + "08": "Brvenica", + "09": "Butel †", + "10": "Valandovo", + "11": "Vasilevo", + "12": "Vevčani", + "13": "Veles", + "14": "Vinica", + "15": "Vraneštica", + "16": "Vrapčište", + "17": "Gazi Baba †", + "18": "Gevgelija", + "19": "Gostivar", + "20": "Gradsko", + "21": "Debar", + "22": "Debarca", + "23": "Delčevo", + "24": "Demir Kapija", + "25": "Demir Hisar", + "26": "Dojran", + "27": "Dolneni", + "28": "Drugovo", + "29": "Gjorče Petrov †", + "30": "Želino", + "31": "Zajas", + "32": "Zelenikovo", + "33": "Zrnovci", + "34": "Ilinden", + "35": "Jegunovce", + "36": "Kavadarci", + "37": "Karbinci", + "38": "Karpoš †", + "39": "Kisela Voda †", + "40": "Kičevo", + "41": "Konče", + "42": "Kočani", + "43": "Kratovo", + "44": "Kriva Palanka", + "45": "Krivogaštani", + "46": "Kruševo", + "47": "Kumanovo", + "48": "Lipkovo", + "49": "Lozovo", + "50": "Mavrovo-i-Rostuša", + "51": "Makedonska Kamenica", + "52": "Makedonski Brod", + "53": "Mogila", + "54": "Negotino", + "55": "Novaci", + "56": "Novo Selo", + "57": "Oslomej", + "58": "Ohrid", + "59": "Petrovec", + "60": "Pehčevo", + "61": "Plasnica", + "62": "Prilep", + "63": "Probištip", + "64": "Radoviš", + "65": "Rankovce", + "66": "Resen", + "67": "Rosoman", + "68": "Saraj †", + "69": "Sveti Nikole", + "70": "Štip", + "71": "Struga", + "72": "Strumica", + "73": "Studeničani", + "74": "Šuto Orizari †", + "75": "Tearce", + "76": "Tetovo", + "77": "Centar †", + "78": "Centar Župa", + "79": "Čair †", + "80": "Čaška", + "81": "Češinovo-Obleševo", + "82": "Čučer Sandevo", + "83": "Sopište", + "84": "Staro Nagoričane", + "85": "Skopje" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/ML.json b/vendor/workerman/validation/data/iso_3166-2/ML.json new file mode 100644 index 0000000..a8cdb56 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/ML.json @@ -0,0 +1,15 @@ +{ + "source": "http://www.geonames.org/ML/administrative-division-mali.html", + "country": "Mali", + "subdivisions": { + "1": "Kayes", + "2": "Koulikoro", + "3": "Sikasso", + "4": "Segou", + "5": "Mopti", + "6": "Tombouctou", + "7": "Gao", + "8": "Kidal", + "BKO": "Bamako Capital District" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MM.json b/vendor/workerman/validation/data/iso_3166-2/MM.json new file mode 100644 index 0000000..01da8a5 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MM.json @@ -0,0 +1,21 @@ +{ + "source": "http://www.geonames.org/MM/administrative-division-myanmar.html", + "country": "Myanmar [Burma]", + "subdivisions": { + "01": "Sagaing", + "02": "Bago", + "03": "Magway", + "04": "Mandalay", + "05": "Tanintharyi", + "06": "Yangon", + "07": "Ayeyarwady", + "11": "Kachin State", + "12": "Kayah State", + "13": "Kayin State", + "14": "Chin State", + "15": "Mon State", + "16": "Rakhine State", + "17": "Shan State", + "18": "Nay Pyi Taw" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MN.json b/vendor/workerman/validation/data/iso_3166-2/MN.json new file mode 100644 index 0000000..a149752 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MN.json @@ -0,0 +1,28 @@ +{ + "source": "http://www.geonames.org/MN/administrative-division-mongolia.html", + "country": "Mongolia", + "subdivisions": { + "035": "Orhon", + "037": "Darhan uul", + "039": "Hentiy", + "041": "Hovsgol", + "043": "Hovd", + "046": "Uvs", + "047": "Tov", + "049": "Selenge", + "051": "Suhbaatar", + "053": "Omnogovi", + "055": "Ovorhangay", + "057": "Dzavhan", + "059": "DundgovL", + "061": "Dornod", + "063": "Dornogov", + "064": "Govi-Sumber", + "065": "Govi-Altay", + "067": "Bulgan", + "069": "Bayanhongor", + "071": "Bayan-Olgiy", + "073": "Arhangay", + "1": "Ulanbaatar" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MO.json b/vendor/workerman/validation/data/iso_3166-2/MO.json new file mode 100644 index 0000000..f56c278 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MO.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/MO/administrative-division-macao.html", + "country": "Macao", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MP.json b/vendor/workerman/validation/data/iso_3166-2/MP.json new file mode 100644 index 0000000..e95f126 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MP.json @@ -0,0 +1,10 @@ +{ + "source": "http://www.geonames.org/MP/administrative-division-northern-mariana-islands.html", + "country": "Northern Mariana Islands", + "subdivisions": { + "N": "Northern Islands", + "R": "Rota", + "S": "Saipan", + "T": "Tinian" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MQ.json b/vendor/workerman/validation/data/iso_3166-2/MQ.json new file mode 100644 index 0000000..ded0d72 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MQ.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/MQ/administrative-division-martinique.html", + "country": "Martinique", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MR.json b/vendor/workerman/validation/data/iso_3166-2/MR.json new file mode 100644 index 0000000..1f94b32 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MR.json @@ -0,0 +1,21 @@ +{ + "source": "http://www.geonames.org/MR/administrative-division-mauritania.html", + "country": "Mauritania", + "subdivisions": { + "01": "Hodh Ech Chargui", + "02": "Hodh El Gharbi", + "03": "Assaba", + "04": "Gorgol", + "05": "Brakna", + "06": "Trarza", + "07": "Adrar", + "08": "Dakhlet Nouadhibou", + "09": "Tagant", + "10": "Guidimaka", + "11": "Tiris Zemmour", + "12": "Inchiri", + "13": "Nouakchott-Ouest", + "14": "Nouakchott-Nord", + "15": "Nouakchott-Sud" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MS.json b/vendor/workerman/validation/data/iso_3166-2/MS.json new file mode 100644 index 0000000..f1b0456 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MS.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/MS/administrative-division-montserrat.html", + "country": "Montserrat", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MT.json b/vendor/workerman/validation/data/iso_3166-2/MT.json new file mode 100644 index 0000000..9b0d425 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MT.json @@ -0,0 +1,74 @@ +{ + "source": "http://www.geonames.org/MT/administrative-division-malta.html", + "country": "Malta", + "subdivisions": { + "01": "Attard", + "02": "Balzan", + "03": "Birgu", + "04": "Birkirkara", + "05": "Birzebbuga", + "06": "Bormla", + "07": "Dingli", + "08": "Fgura", + "09": "Floriana", + "10": "Fontana", + "11": "Gudja", + "12": "Gzira", + "13": "Ghajnsielem", + "14": "Gharb", + "15": "Gargur", + "16": "Ghasri", + "17": "Gaxaq", + "18": "Hamrun", + "19": "Iklin", + "20": "Isla", + "21": "Kalkara", + "22": "Kercem", + "23": "Kirkop", + "24": "Lija", + "25": "Luqa", + "26": "Marsa", + "27": "Marsaskala", + "28": "Marsaxlokk", + "29": "Mdina", + "30": "Melliea", + "31": "Mgarr", + "32": "Mosta", + "33": "Mqabba", + "34": "Msida", + "35": "Mtarfa", + "36": "Munxar", + "37": "Nadur", + "38": "Naxxar", + "39": "Paola", + "40": "Pembroke", + "41": "Pieta", + "42": "Qala", + "43": "Qormi", + "44": "Qrendi", + "45": "Rabat Għawdex", + "46": "Rabat Malta", + "47": "Safi", + "48": "San Giljan", + "49": "San Gwann", + "50": "San Lawrenz", + "51": "San Pawl il-Bahar", + "52": "Sannat", + "53": "Santa Lucija", + "54": "Santa Venera", + "55": "Siggiewi", + "56": "Sliema", + "57": "Swieqi", + "58": "Tarxien", + "59": "Ta Xbiex", + "60": "Valletta", + "61": "Xagra", + "62": "Xewkija", + "63": "Xgajra", + "64": "Zabbar", + "65": "Żebbuġ Għawdex", + "66": "Żebbuġ Malta", + "67": "Zejtun", + "68": "Zurrieq" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MU.json b/vendor/workerman/validation/data/iso_3166-2/MU.json new file mode 100644 index 0000000..5833e9d --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MU.json @@ -0,0 +1,23 @@ +{ + "source": "http://www.geonames.org/MU/administrative-division-mauritius.html", + "country": "Mauritius", + "subdivisions": { + "AG": "Agalega Islands", + "BL": "Black River", + "BR": "Beau Bassin-Rose Hill", + "CC": "Cargados Carajos Shoals (Saint Brandon Islands)", + "CU": "Curepipe", + "FL": "Flacq", + "GP": "Grand Port", + "MO": "Moka", + "PA": "Pamplemousses", + "PL": "Port Louis", + "PU": "Port Louis", + "PW": "Plaines Wilhems", + "QB": "Quatre Bornes", + "RO": "Rodrigues", + "RR": "Riviere du Rempart", + "SA": "Savanne", + "VP": "Vacoas-Phoenix" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MV.json b/vendor/workerman/validation/data/iso_3166-2/MV.json new file mode 100644 index 0000000..216c063 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MV.json @@ -0,0 +1,26 @@ +{ + "source": "http://www.geonames.org/MV/administrative-division-maldives.html", + "country": "Maldives", + "subdivisions": { + "00": "Alifu Dhaalu / Ari Atholhu Dhekunuburi", + "01": "Seenu / Addu Atholhu", + "02": "Alifu Alifu / Ari Atholhu Uthuruburi", + "03": "Lhaviyani / Faadhippolhu", + "04": "Vaavu / Felidhu Atholhu", + "05": "Laamu / Haddhdhunmathi", + "07": "Haa Alifu / Thiladhunmathee Uthuruburi", + "08": "Thaa / Kolhumadulu", + "12": "Meemu / Mulakatholhu", + "13": "Raa / Maalhosmadulu Uthuruburi", + "14": "Faafu / Nilandhe Atholhu Uthuruburi", + "17": "Dhaalu / Nilandhe Atholhu Dhekunuburi", + "20": "Baa / Maalhosmadulu Dhekunuburi", + "23": "Haa Dhaalu / Thiladhunmathee Dhekunuburi", + "24": "Shaviyani / Miladhunmadulu Uthuruburi", + "25": "Noonu / Miladhunmadulu Dhekunuburi", + "26": "Kaafu / Maale Atholhu", + "27": "Gaafu Alifu / Huvadhu Atholhu Uthuruburi", + "28": "Gaafu Dhaalu / Huvadhu Atholhu Dhekunuburi", + "29": "Gnaviyani / Fuvammulah" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MW.json b/vendor/workerman/validation/data/iso_3166-2/MW.json new file mode 100644 index 0000000..02769ab --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MW.json @@ -0,0 +1,37 @@ +{ + "source": "http://www.geonames.org/MW/administrative-division-malawi.html", + "country": "Malawi", + "subdivisions": { + "BA": "Balaka", + "BL": "Blantyre", + "C": "Central", + "CK": "Chikwawa", + "CR": "Chiradzulu", + "CT": "Chitipa", + "DE": "Dedza", + "DO": "Dowa", + "KR": "Karonga", + "KS": "Kasungu", + "LI": "Lilongwe", + "LK": "Likoma", + "MC": "Mchinji", + "MG": "Mangochi", + "MH": "Machinga", + "MU": "Mulanje", + "MW": "Mwanza", + "MZ": "Mzimba", + "N": "Northern", + "NB": "Nkhata Bay", + "NE": "Neno", + "NI": "Ntchisi", + "NK": "Nkhotakota", + "NS": "Nsanje", + "NU": "Ntcheu", + "PH": "Phalombe", + "RU": "Rumphi", + "S": "Southern", + "SA": "Salima", + "TH": "Thyolo", + "ZO": "Zomba" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MX.json b/vendor/workerman/validation/data/iso_3166-2/MX.json new file mode 100644 index 0000000..1ce374b --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MX.json @@ -0,0 +1,38 @@ +{ + "source": "http://www.geonames.org/MX/administrative-division-mexico.html", + "country": "Mexico", + "subdivisions": { + "AGU": "Aguascalientes", + "BCN": "Baja California", + "BCS": "Baja California Sur", + "CAM": "Campeche", + "CHH": "Chihuahua", + "CHP": "Chiapas", + "CMX": "Ciudad de Mexico", + "COA": "Coahuila", + "COL": "Colima", + "DUR": "Durango", + "GRO": "Guerrero", + "GUA": "Guanajuato", + "HID": "Hidalgo", + "JAL": "Jalisco", + "MEX": "Mexico", + "MIC": "Michoacan", + "MOR": "Morelos", + "NAY": "Nayarit", + "NLE": "Nuevo Leon", + "OAX": "Oaxaca", + "PUE": "Puebla", + "QUE": "Queretaro", + "ROO": "Quintana Roo", + "SIN": "Sinaloa", + "SLP": "San Luis Potosi", + "SON": "Sonora", + "TAB": "Tabasco", + "TAM": "Tamaulipas", + "TLA": "Tlaxcala", + "VER": "Veracruz", + "YUC": "Yucatan", + "ZAC": "Zacatecas" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MY.json b/vendor/workerman/validation/data/iso_3166-2/MY.json new file mode 100644 index 0000000..789c4a0 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MY.json @@ -0,0 +1,22 @@ +{ + "source": "http://www.geonames.org/MY/administrative-division-malaysia.html", + "country": "Malaysia", + "subdivisions": { + "01": "Johor", + "02": "Kedah", + "03": "Kelantan", + "04": "Melaka", + "05": "Negeri Sembilan", + "06": "Pahang", + "07": "Pinang", + "08": "Perak", + "09": "Perlis", + "10": "Selangor", + "11": "Terengganu", + "12": "Sabah", + "13": "Sarawak", + "14": "Kuala Lumpur", + "15": "Labuan", + "16": "Putrajaya" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/MZ.json b/vendor/workerman/validation/data/iso_3166-2/MZ.json new file mode 100644 index 0000000..285310f --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/MZ.json @@ -0,0 +1,17 @@ +{ + "source": "http://www.geonames.org/MZ/administrative-division-mozambique.html", + "country": "Mozambique", + "subdivisions": { + "A": "Niassa", + "B": "Manica", + "G": "Gaza", + "I": "Inhambane", + "L": "Maputo", + "MPM": "Maputo (city)", + "N": "Nampula", + "P": "Cabo Delgado", + "Q": "Zambezia", + "S": "Sofala", + "T": "Tete" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/NA.json b/vendor/workerman/validation/data/iso_3166-2/NA.json new file mode 100644 index 0000000..9e7b594 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/NA.json @@ -0,0 +1,20 @@ +{ + "source": "http://www.geonames.org/NA/administrative-division-namibia.html", + "country": "Namibia", + "subdivisions": { + "CA": "Caprivi", + "ER": "Erongo", + "HA": "Hardap", + "KA": "Karas", + "KE": "Kavango East", + "KH": "Khomas", + "KU": "Kunene", + "KW": "Kavango West", + "OD": "Otjozondjupa", + "OH": "Omaheke", + "ON": "Oshana", + "OS": "Omusati", + "OT": "Oshikoto", + "OW": "Ohangwena" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/NC.json b/vendor/workerman/validation/data/iso_3166-2/NC.json new file mode 100644 index 0000000..883c130 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/NC.json @@ -0,0 +1,9 @@ +{ + "source": "http://www.geonames.org/NC/administrative-division-new-caledonia.html", + "country": "New Caledonia", + "subdivisions": { + "L": "Iles Loyaute", + "N": "Nord", + "S": "Sud" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/NE.json b/vendor/workerman/validation/data/iso_3166-2/NE.json new file mode 100644 index 0000000..1591d38 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/NE.json @@ -0,0 +1,14 @@ +{ + "source": "http://www.geonames.org/NE/administrative-division-niger.html", + "country": "Niger", + "subdivisions": { + "1": "Agadez", + "2": "Diffa", + "3": "Dosso", + "4": "Maradi", + "5": "Tahoua", + "6": "Tillabéri", + "7": "Zinder", + "8": "Niamey" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/NF.json b/vendor/workerman/validation/data/iso_3166-2/NF.json new file mode 100644 index 0000000..b9b8375 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/NF.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/NF/administrative-division-norfolk-island.html", + "country": "Norfolk Island", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/NG.json b/vendor/workerman/validation/data/iso_3166-2/NG.json new file mode 100644 index 0000000..e9328ae --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/NG.json @@ -0,0 +1,43 @@ +{ + "source": "http://www.geonames.org/NG/administrative-division-nigeria.html", + "country": "Nigeria", + "subdivisions": { + "AB": "Abia", + "AD": "Adamawa", + "AK": "Akwa Ibom", + "AN": "Anambra", + "BA": "Bauchi", + "BE": "Benue", + "BO": "Borno", + "BY": "Bayelsa", + "CR": "Cross River", + "DE": "Delta", + "EB": "Ebonyi", + "ED": "Edo", + "EK": "Ekiti", + "EN": "Enugu", + "FC": "Federal Capital Territory", + "GO": "Gombe", + "IM": "Imo", + "JI": "Jigawa", + "KD": "Kaduna", + "KE": "Kebbi", + "KN": "Kano", + "KO": "Kogi", + "KT": "Katsina", + "KW": "Kwara", + "LA": "Lagos", + "NA": "Nassarawa", + "NI": "Niger", + "OG": "Ogun", + "ON": "Ondo", + "OS": "Osun", + "OY": "Oyo", + "PL": "Plateau", + "RI": "Rivers", + "SO": "Sokoto", + "TA": "Taraba", + "YO": "Yobe", + "ZA": "Zamfara" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/NI.json b/vendor/workerman/validation/data/iso_3166-2/NI.json new file mode 100644 index 0000000..284b1b9 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/NI.json @@ -0,0 +1,23 @@ +{ + "source": "http://www.geonames.org/NI/administrative-division-nicaragua.html", + "country": "Nicaragua", + "subdivisions": { + "AN": "Region Autonoma del Atlantico Norte", + "AS": "Region Autonoma del Atlantico Sur", + "BO": "Boaco", + "CA": "Carazo", + "CI": "Chinandega", + "CO": "Chontales", + "ES": "Esteli", + "GR": "Granada", + "JI": "Jinotega", + "LE": "Leon", + "MD": "Madriz", + "MN": "Managua", + "MS": "Masaya", + "MT": "Matagalpa", + "NS": "Nueva Segovia", + "RI": "Rivas", + "SJ": "Rio San Juan" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/NL.json b/vendor/workerman/validation/data/iso_3166-2/NL.json new file mode 100644 index 0000000..1632dbc --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/NL.json @@ -0,0 +1,18 @@ +{ + "source": "http://www.geonames.org/NL/administrative-division-netherlands.html", + "country": "Netherlands", + "subdivisions": { + "DR": "Drenthe", + "FL": "Flevoland", + "FR": "Friesland", + "GE": "Gelderland", + "GR": "Groningen", + "LI": "Limburg", + "NB": "Noord Brabant", + "NH": "Noord Holland", + "OV": "Overijssel", + "UT": "Utrecht", + "ZE": "Zeeland", + "ZH": "Zuid Holland" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/NO.json b/vendor/workerman/validation/data/iso_3166-2/NO.json new file mode 100644 index 0000000..e495400 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/NO.json @@ -0,0 +1,26 @@ +{ + "source": "http://www.geonames.org/NO/administrative-division-norway.html", + "country": "Norway", + "subdivisions": { + "01": "Ostfold", + "02": "Akershus", + "03": "Oslo", + "04": "Hedmark", + "05": "Oppland", + "06": "Buskerud", + "07": "Vestfold", + "08": "Telemark", + "09": "Aust-Agder", + "10": "Vest-Agder", + "11": "Rogaland", + "12": "Hordaland", + "14": "Sogn og Fjordane", + "15": "More og Romdal", + "18": "Nordland", + "19": "Troms", + "20": "Finnmark", + "21": "Svalbard", + "22": "Jan Mayen", + "23": "Trøndelag" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/NP.json b/vendor/workerman/validation/data/iso_3166-2/NP.json new file mode 100644 index 0000000..d4a56d0 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/NP.json @@ -0,0 +1,25 @@ +{ + "source": "http://www.geonames.org/NP/administrative-division-nepal.html", + "country": "Nepal", + "subdivisions": { + "1": "Madhyamanchal", + "2": "Madhya Pashchimanchal", + "3": "Pashchimanchal", + "4": "Purwanchal", + "5": "Sudur Pashchimanchal", + "BA": "Bagmati", + "BH": "Bheri", + "DH": "Dhawalagiri", + "GA": "Gandaki", + "JA": "Janakpur", + "KA": "Karnali", + "KO": "Kosi", + "LU": "Lumbini", + "MA": "Mahakali", + "ME": "Mechi", + "NA": "Narayani", + "RA": "Rapti", + "SA": "Sagarmatha", + "SE": "Seti" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/NR.json b/vendor/workerman/validation/data/iso_3166-2/NR.json new file mode 100644 index 0000000..8db04d0 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/NR.json @@ -0,0 +1,20 @@ +{ + "source": "http://www.geonames.org/NR/administrative-division-nauru.html", + "country": "Nauru", + "subdivisions": { + "01": "Aiwo", + "02": "Anabar", + "03": "Anetan", + "04": "Anibare", + "05": "Baiti", + "06": "Boe", + "07": "Buada", + "08": "Denigomodu", + "09": "Ewa", + "10": "Ijuw", + "11": "Meneng", + "12": "Nibok", + "13": "Uaboe", + "14": "Yaren" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/NU.json b/vendor/workerman/validation/data/iso_3166-2/NU.json new file mode 100644 index 0000000..d3f4282 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/NU.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/NU/administrative-division-niue.html", + "country": "Niue", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/NZ.json b/vendor/workerman/validation/data/iso_3166-2/NZ.json new file mode 100644 index 0000000..9b26c54 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/NZ.json @@ -0,0 +1,23 @@ +{ + "source": "http://www.geonames.org/NZ/administrative-division-new-zealand.html", + "country": "New Zealand", + "subdivisions": { + "AUK": "Auckland", + "BOP": "Bay of Plenty", + "CAN": "Canterbury", + "CIT": "Chatham Islands", + "GIS": "Gisborne", + "HKB": "Hawke's Bay", + "MBH": "Marlborough", + "MWT": "Manawatu-Wanganui", + "NSN": "Nelson", + "NTL": "Northland", + "OTA": "Otago", + "STL": "Southland", + "TAS": "Tasman", + "TKI": "Taranaki", + "WGN": "Wellington", + "WKO": "Waikato", + "WTC": "West Coast" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/OM.json b/vendor/workerman/validation/data/iso_3166-2/OM.json new file mode 100644 index 0000000..afc86c6 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/OM.json @@ -0,0 +1,17 @@ +{ + "source": "http://www.geonames.org/OM/administrative-division-oman.html", + "country": "Oman", + "subdivisions": { + "BJ": "Al Batinah South", + "BS": "Shamāl al Bāţinah", + "BU": "Al Buraymī", + "DA": "Ad Dakhiliyah", + "MA": "Masqat", + "MU": "Musandam", + "SJ": "Ash Sharqiyah South", + "SS": "Shamāl ash Sharqīyah", + "WU": "Al Wusta", + "ZA": "Az Zahirah", + "ZU": "Zufar" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/PA.json b/vendor/workerman/validation/data/iso_3166-2/PA.json new file mode 100644 index 0000000..d27d00b --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/PA.json @@ -0,0 +1,19 @@ +{ + "source": "http://www.geonames.org/PA/administrative-division-panama.html", + "country": "Panama", + "subdivisions": { + "1": "Bocas del Toro", + "10": "Panamá Oeste Province", + "2": "Cocle", + "3": "Colon", + "4": "Chiriqui", + "5": "Darien", + "6": "Herrera", + "7": "Los Santos", + "8": "Panama", + "9": "Veraguas", + "EM": "Comarca Emberá-Wounaan", + "KY": "Comarca de Kuna Yala", + "NB": "Ngöbe-Buglé" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/PE.json b/vendor/workerman/validation/data/iso_3166-2/PE.json new file mode 100644 index 0000000..980a0b7 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/PE.json @@ -0,0 +1,32 @@ +{ + "source": "http://www.geonames.org/PE/administrative-division-peru.html", + "country": "Peru", + "subdivisions": { + "AMA": "Amazonas", + "ANC": "Ancash", + "APU": "Apurimac", + "ARE": "Arequipa", + "AYA": "Ayacucho", + "CAJ": "Cajamarca", + "CAL": "Callao", + "CUS": "Cusco", + "HUC": "Huanuco", + "HUV": "Huancavelica", + "ICA": "Ica", + "JUN": "Junin", + "LAL": "La Libertad", + "LAM": "Lambayeque", + "LIM": "Lima", + "LMA": "Municipalidad Metropolitana de Lima", + "LOR": "Loreto", + "MDD": "Madre de Dios", + "MOQ": "Moquegua", + "PAS": "Pasco", + "PIU": "Piura", + "PUN": "Puno", + "SAM": "San Martin", + "TAC": "Tacna", + "TUM": "Tumbes", + "UCA": "Ucayali" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/PF.json b/vendor/workerman/validation/data/iso_3166-2/PF.json new file mode 100644 index 0000000..4893342 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/PF.json @@ -0,0 +1,11 @@ +{ + "source": "http://www.geonames.org/PF/administrative-division-french-polynesia.html", + "country": "French Polynesia", + "subdivisions": { + "I": "Austral Islands", + "M": "Marquesas Islands", + "S": "Iles Sous-le-Vent", + "T": "Tuamotu-Gambier", + "V": "Iles du Vent" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/PG.json b/vendor/workerman/validation/data/iso_3166-2/PG.json new file mode 100644 index 0000000..193ae9b --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/PG.json @@ -0,0 +1,28 @@ +{ + "source": "http://www.geonames.org/PG/administrative-division-papua-new-guinea.html", + "country": "Papua New Guinea", + "subdivisions": { + "CPK": "Chimbu", + "CPM": "Central", + "EBR": "East New Britain", + "EHG": "Eastern Highlands", + "EPW": "Enga", + "ESW": "East Sepik", + "GPK": "Gulf", + "HLA": "Hela", + "JWK": "Jiwaka", + "MBA": "Milne Bay", + "MPL": "Morobe", + "MPM": "Madang", + "MRL": "Manus", + "NCD": "National Capital", + "NIK": "New Ireland", + "NPP": "Northern", + "NSB": "Bougainville", + "SAN": "Sandaun", + "SHM": "Southern Highlands", + "WBK": "West New Britain", + "WHM": "Western Highlands", + "WPD": "Western" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/PH.json b/vendor/workerman/validation/data/iso_3166-2/PH.json new file mode 100644 index 0000000..ab98eb5 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/PH.json @@ -0,0 +1,104 @@ +{ + "source": "http://www.geonames.org/PH/administrative-division-philippines.html", + "country": "Philippines", + "subdivisions": { + "00": "National Capital Region", + "01": "Ilocos", + "02": "Cagayan Valley", + "03": "Central Luzon", + "05": "Bicol", + "06": "Western Visayas", + "07": "Central Visayas", + "08": "Eastern Visayas", + "09": "Zamboanga Peninsula", + "10": "Northern Mindanao", + "11": "Davao", + "12": "Soccsksargen", + "13": "Caraga", + "14": "Autonomous Region in Muslim Mindanao,", + "15": "Cordillera Administrative Region", + "40": "Calabarzon", + "41": "Mimaropa", + "ABR": "Abra", + "AGN": "Agusan del Norte", + "AGS": "Agusan del Sur", + "AKL": "Aklan", + "ALB": "Albay", + "ANT": "Antique", + "APA": "Apayao", + "AUR": "Aurora", + "BAN": "Bataan", + "BAS": "Basilan", + "BEN": "Benguet", + "BIL": "Biliran", + "BOH": "Bohol", + "BTG": "Batangas", + "BTN": "Batanes", + "BUK": "Bukidnon", + "BUL": "Bulacan", + "CAG": "Cagayan", + "CAM": "Camiguin", + "CAN": "Camarines Norte", + "CAP": "Capiz", + "CAS": "Camarines Sur", + "CAT": "Catanduanes", + "CAV": "Cavite", + "CEB": "Cebu", + "COM": "Compostela Valley", + "DAO": "Davao Oriental", + "DAS": "Davao del Sur", + "DAV": "Davao del Norte", + "DIN": "Dinagat Islands", + "DVO": "Davao Occidental", + "EAS": "Eastern Samar", + "GUI": "Guimaras", + "IFU": "Ifugao", + "ILI": "Iloilo", + "ILN": "Ilocos Norte", + "ILS": "Ilocos Sur", + "ISA": "Isabela", + "KAL": "Kalinga", + "LAG": "Laguna", + "LAN": "Lanao del Norte", + "LAS": "Lanao del Sur", + "LEY": "Leyte", + "LUN": "La Union", + "MAD": "Marinduque", + "MAG": "Maguindanao", + "MAS": "Masbate", + "MDC": "Mindoro Occidental", + "MDR": "Mindoro Oriental", + "MOU": "Mountain Province", + "MSC": "Misamis Occidental", + "MSR": "Misamis Oriental", + "NCO": "North Cotabato", + "NEC": "Negros Occidental", + "NER": "Negros Oriental", + "NSA": "Northern Samar", + "NUE": "Nueva Ecija", + "NUV": "Nueva Vizcaya", + "PAM": "Pampanga", + "PAN": "Pangasinan", + "PLW": "Palawan", + "QUE": "Quezon", + "QUI": "Quirino", + "RIZ": "Rizal", + "ROM": "Romblon", + "SAR": "Sarangani", + "SCO": "South Cotabato", + "SIG": "Siquijor", + "SLE": "Southern Leyte", + "SLU": "Sulu", + "SOR": "Sorsogon", + "SUK": "Sultan Kudarat", + "SUN": "Surigao del Norte", + "SUR": "Surigao del Sur", + "TAR": "Tarlac", + "TAW": "Tawi-Tawi", + "WSA": "Western Samar", + "ZAN": "Zamboanga del Norte", + "ZAS": "Zamboanga del Sur", + "ZMB": "Zambales", + "ZSI": "Zamboanga Sibugay" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/PK.json b/vendor/workerman/validation/data/iso_3166-2/PK.json new file mode 100644 index 0000000..afdba83 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/PK.json @@ -0,0 +1,14 @@ +{ + "source": "http://www.geonames.org/PK/administrative-division-pakistan.html", + "country": "Pakistan", + "subdivisions": { + "BA": "Balochistan", + "GB": "Gilgit-Baltistan", + "IS": "Islamabad Capital Territory", + "JK": "Azad Kashmir", + "KP": "Khyber Pakhtunkhwa", + "PB": "Punjab", + "SD": "Sindh", + "TA": "Federally Administered Tribal Areas" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/PL.json b/vendor/workerman/validation/data/iso_3166-2/PL.json new file mode 100644 index 0000000..8a350b1 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/PL.json @@ -0,0 +1,22 @@ +{ + "source": "http://www.geonames.org/PL/administrative-division-poland.html", + "country": "Poland", + "subdivisions": { + "DS": "Dolnoslaskie", + "KP": "Kujawsko-Pomorskie", + "LB": "Lubuskie", + "LD": "Lodzkie", + "LU": "Lubelskie", + "MA": "Malopolskie", + "MZ": "Mazowieckie", + "OP": "Opolskie", + "PD": "Podlaskie", + "PK": "Podkarpackie", + "PM": "Pomorskie", + "SK": "Swietokrzyskie", + "SL": "Slaskie", + "WN": "Warminsko-Mazurskie", + "WP": "Wielkopolskie", + "ZP": "Zachodniopomorskie" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/PM.json b/vendor/workerman/validation/data/iso_3166-2/PM.json new file mode 100644 index 0000000..39ecd4b --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/PM.json @@ -0,0 +1,8 @@ +{ + "source": "http://www.geonames.org/PM/administrative-division-saint-pierre-and-miquelon.html", + "country": "Saint Pierre and Miquelon", + "subdivisions": { + "M": "Miquelon", + "P": "Saint Pierre" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/PN.json b/vendor/workerman/validation/data/iso_3166-2/PN.json new file mode 100644 index 0000000..2abd0b9 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/PN.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/PN/administrative-division-pitcairn-islands.html", + "country": "Pitcairn Islands", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/PR.json b/vendor/workerman/validation/data/iso_3166-2/PR.json new file mode 100644 index 0000000..57cb44d --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/PR.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/PR/administrative-division-puerto-rico.html", + "country": "Puerto Rico", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/PS.json b/vendor/workerman/validation/data/iso_3166-2/PS.json new file mode 100644 index 0000000..7d451e5 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/PS.json @@ -0,0 +1,22 @@ +{ + "source": "http://www.geonames.org/PS/administrative-division-palestine.html", + "country": "Palestine", + "subdivisions": { + "BTH": "Bethlehem [conventional] / Bayt Laḩm [Arabic]", + "DEB": "Deir El Balah [conventional] /Dayr al Balaḩ[Arabic]", + "GZA": "Gaza [conventional] / Ghazzah[Arabic]", + "HBN": "Hebron [conventional] / Al Khalīl [Arabic]", + "JEM": "Jerusalem [conventional] / Al Quds [Arabic]", + "JEN": "Jenin [conventional] / Janīn [Arabic]", + "JRH": "Jericho [conventional] / Arīḩā wal Aghwār [Arabic]", + "KYS": "Khan Yunis [conventional] / Khān Yūnis[Arabic]", + "NBS": "Nablus [conventional] / Nāblus [Arabic]", + "NGZ": "North Gaza [conventional] / Shamāl Ghazzah[Arabic]", + "QQA": "Qalqiyah [conventional] / Qalqīlyah [Arabic]", + "RBH": "Ramallah and Al Birah [conventional] / Rām Allāh wal Bīrah [Arabic]", + "RFH": "Rafah [conventional] / Rafaḩ[Arabic]", + "SLT": "Salfit [conventional] / Salfīt [Arabic]", + "TBS": "Tubas [conventional] / Ţūbās [Arabic]", + "TKM": "Tulkarm [conventional] /Ţūlkarm [Arabic]" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/PT.json b/vendor/workerman/validation/data/iso_3166-2/PT.json new file mode 100644 index 0000000..8d67658 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/PT.json @@ -0,0 +1,26 @@ +{ + "source": "http://www.geonames.org/PT/administrative-division-portugal.html", + "country": "Portugal", + "subdivisions": { + "01": "Aveiro", + "02": "Beja", + "03": "Braga", + "04": "Braganca", + "05": "Castelo Branco", + "06": "Coimbra", + "07": "Evora", + "08": "Faro", + "09": "Guarda", + "10": "Leiria", + "11": "Lisboa", + "12": "Portalegre", + "13": "Porto", + "14": "Santarem", + "15": "Setubal", + "16": "Viana do Castelo", + "17": "Vila Real", + "18": "Viseu", + "20": "Acores (Azores)", + "30": "Madeira" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/PW.json b/vendor/workerman/validation/data/iso_3166-2/PW.json new file mode 100644 index 0000000..fcdf07f --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/PW.json @@ -0,0 +1,22 @@ +{ + "source": "http://www.geonames.org/PW/administrative-division-palau.html", + "country": "Palau", + "subdivisions": { + "002": "Aimeliik", + "004": "Airai", + "010": "Angaur", + "050": "Hatohobei", + "100": "Kayangel", + "150": "Koror", + "212": "Melekeok", + "214": "Ngaraard", + "218": "Ngarchelong", + "222": "Ngardmau", + "224": "Ngatpang", + "226": "Ngchesar", + "227": "Ngeremlengui", + "228": "Ngiwal", + "350": "Peleliu", + "370": "Sonsorol" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/PY.json b/vendor/workerman/validation/data/iso_3166-2/PY.json new file mode 100644 index 0000000..73becf5 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/PY.json @@ -0,0 +1,24 @@ +{ + "source": "http://www.geonames.org/PY/administrative-division-paraguay.html", + "country": "Paraguay", + "subdivisions": { + "1": "Concepcion", + "10": "Alto Parana", + "11": "Central", + "12": "Neembucu", + "13": "Amambay", + "14": "Canindeyu", + "15": "Presidente Hayes", + "16": "Alto Paraguay", + "19": "Boqueron", + "2": "San Pedro", + "3": "Cordillera", + "4": "Guaira", + "5": "Caaguazu", + "6": "Caazapa", + "7": "Itapua", + "8": "Misiones", + "9": "Paraguari", + "ASU": "Asuncion" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/QA.json b/vendor/workerman/validation/data/iso_3166-2/QA.json new file mode 100644 index 0000000..b1d7792 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/QA.json @@ -0,0 +1,14 @@ +{ + "source": "http://www.geonames.org/QA/administrative-division-qatar.html", + "country": "Qatar", + "subdivisions": { + "DA": "Ad Dawhah", + "KH": "Al Khawr wa adh Dhakhīrah", + "MS": "Ash Shamāl", + "RA": "Ar Rayyan", + "SH": "Al-Shahaniya", + "US": "Umm Salal", + "WA": "Al Wakrah", + "ZA": "Az Z a‘āyin" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/RE.json b/vendor/workerman/validation/data/iso_3166-2/RE.json new file mode 100644 index 0000000..dc726fc --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/RE.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/RE/administrative-division-reunion.html", + "country": "Réunion", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/RO.json b/vendor/workerman/validation/data/iso_3166-2/RO.json new file mode 100644 index 0000000..2b97d44 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/RO.json @@ -0,0 +1,48 @@ +{ + "source": "http://www.geonames.org/RO/administrative-division-romania.html", + "country": "Romania", + "subdivisions": { + "AB": "Alba", + "AG": "Arges", + "AR": "Arad", + "B": "Bucuresti", + "BC": "Bacau", + "BH": "Bihor", + "BN": "Bistrita-Nasaud", + "BR": "Braila", + "BT": "Botosani", + "BV": "Brasov", + "BZ": "Buzau", + "CJ": "Cluj", + "CL": "Calarasi", + "CS": "Caras-Severin", + "CT": "Constanta", + "CV": "Covasna", + "DB": "Dimbovita", + "DJ": "Dolj", + "GJ": "Gorj", + "GL": "Galati", + "GR": "Giurgiu", + "HD": "Hunedoara", + "HR": "Harghita", + "IF": "Ilfov", + "IL": "Ialomita", + "IS": "Iasi", + "MH": "Mehedinti", + "MM": "Maramures", + "MS": "Mures", + "NT": "Neamt", + "OT": "Olt", + "PH": "Prahova", + "SB": "Sibiu", + "SJ": "Salaj", + "SM": "Satu Mare", + "SV": "Suceava", + "TL": "Tulcea", + "TM": "Timis", + "TR": "Teleorman", + "VL": "Vilcea", + "VN": "Vrancea", + "VS": "Vaslui" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/RS.json b/vendor/workerman/validation/data/iso_3166-2/RS.json new file mode 100644 index 0000000..4853b68 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/RS.json @@ -0,0 +1,38 @@ +{ + "source": "http://www.geonames.org/RS/administrative-division-serbia.html", + "country": "Serbia", + "subdivisions": { + "00": "Beograd", + "01": "Severnobački okrug", + "02": "Srednjebanatski okrug", + "03": "Severnobanatski okrug", + "04": "Južnobanatski okrug", + "05": "Zapadno-Bački Okrug", + "06": "Južnobački okrug", + "07": "Srem", + "08": "Mačvanski okrug", + "09": "Kolubarski okrug", + "10": "Podunavski okrug", + "11": "Braničevski okrug", + "12": "Šumadija", + "13": "Pomoravski okrug", + "14": "Borski okrug", + "15": "Zaječarski okrug", + "16": "Zlatibor", + "17": "Moravički okrug", + "18": "Raški okrug", + "19": "Rasinski okrug", + "20": "Nišavski okrug", + "21": "Toplica", + "22": "Pirotski okrug", + "23": "Jablanički okrug", + "24": "Pčinjski okrug", + "25": "Kosovski okrug", + "26": "Pećki okrug", + "27": "Prizrenski okrug", + "28": "Kosovsko-Mitrovački okrug", + "29": "Kosovsko-Pomoravski okrug", + "KM": "Kosovo", + "VO": "Vojvodina" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/RU.json b/vendor/workerman/validation/data/iso_3166-2/RU.json new file mode 100644 index 0000000..ffa4de7 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/RU.json @@ -0,0 +1,89 @@ +{ + "source": "http://www.geonames.org/RU/administrative-division-russia.html", + "country": "Russia", + "subdivisions": { + "AD": "Adygeya", + "AL": "Altai Republic", + "ALT": "Altai Krai", + "AMU": "Amur", + "ARK": "Arkhangelsk", + "AST": "Astrakhan", + "BA": "Bashkortostan", + "BEL": "Belgorod", + "BRY": "Bryansk", + "BU": "Buryatia", + "CE": "Chechnya", + "CHE": "Chelyabinsk", + "CHU": "Chukotka", + "CU": "Chuvashia", + "DA": "Dagestan", + "IN": "Ingushetia", + "IRK": "Irkutsk", + "IVA": "Ivanovo", + "KAM": "Kamchatka", + "KB": "Kabardino-Balkaria", + "KC": "Karachay-Cherkessia", + "KDA": "Krasnodar", + "KEM": "Kemerovo", + "KGD": "Kaliningrad", + "KGN": "Kurgan", + "KHA": "Khabarovsk", + "KHM": "Khantia-Mansia", + "KIR": "Kirov", + "KK": "Khakassia", + "KL": "Kalmykia", + "KLU": "Kaluga", + "KO": "Komi", + "KOS": "Kostroma", + "KR": "Karelia", + "KRS": "Kursk", + "KYA": "Krasnoyarsk", + "LEN": "Leningrad", + "LIP": "Lipetsk", + "MAG": "Magadan", + "ME": "Mari El", + "MO": "Mordovia", + "MOS": "Moscow (Province)", + "MOW": "Moscow (City)", + "MUR": "Murmansk", + "NEN": "Nenetsia", + "NGR": "Novgorod", + "NIZ": "Nizhny Novgorod", + "NVS": "Novosibirsk", + "OMS": "Omsk", + "ORE": "Orenburg", + "ORL": "Oryol", + "PER": "Perm", + "PNZ": "Penza", + "PRI": "Primorsky", + "PSK": "Pskov", + "ROS": "Rostov", + "RYA": "Ryazan", + "SA": "Sakha", + "SAK": "Sakhalin", + "SAM": "Samara", + "SAR": "Saratov", + "SE": "North Ossetia", + "SMO": "Smolensk", + "SPE": "St. Petersburg", + "STA": "Stavropol", + "SVE": "Sverdlovsk", + "TA": "Tatarstan", + "TAM": "Tambov", + "TOM": "Tomsk", + "TUL": "Tula", + "TVE": "Tver", + "TY": "Tuva", + "TYU": "Tyumen", + "UD": "Udmurtia", + "ULY": "Ulynovsk", + "VGG": "Volgograd", + "VLA": "Vladimir", + "VLG": "Vologda", + "VOR": "Voronezh", + "YAN": "Yamalia", + "YAR": "Yaroslavl", + "YEV": "Jewish Oblast", + "ZAB": "Zabaykal'skiy kray" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/RW.json b/vendor/workerman/validation/data/iso_3166-2/RW.json new file mode 100644 index 0000000..6ae36af --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/RW.json @@ -0,0 +1,11 @@ +{ + "source": "http://www.geonames.org/RW/administrative-division-rwanda.html", + "country": "Rwanda", + "subdivisions": { + "01": "Kigali", + "02": "Est", + "03": "Nord", + "04": "Ouest", + "05": "Sud" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SA.json b/vendor/workerman/validation/data/iso_3166-2/SA.json new file mode 100644 index 0000000..9780f11 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SA.json @@ -0,0 +1,19 @@ +{ + "source": "http://www.geonames.org/SA/administrative-division-saudi-arabia.html", + "country": "Saudi Arabia", + "subdivisions": { + "01": "Ar Riyad", + "02": "Makkah", + "03": "Al Madinah", + "04": "Ash Sharqiyah (Eastern Province)", + "05": "Al Qasim", + "06": "Ha'il", + "07": "Tabuk", + "08": "Al Hudud ash Shamaliyah", + "09": "Jizan", + "10": "Najran", + "11": "Al Bahah", + "12": "Al Jawf", + "14": "'Asir" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SB.json b/vendor/workerman/validation/data/iso_3166-2/SB.json new file mode 100644 index 0000000..b90fc4c --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SB.json @@ -0,0 +1,16 @@ +{ + "source": "http://www.geonames.org/SB/administrative-division-solomon-islands.html", + "country": "Solomon Islands", + "subdivisions": { + "CE": "Central", + "CH": "Choiseul", + "CT": "Capital Territory", + "GU": "Guadalcanal", + "IS": "Isabel", + "MK": "Makira", + "ML": "Malaita", + "RB": "Rennell and Bellona", + "TE": "Temotu", + "WE": "Western" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SC.json b/vendor/workerman/validation/data/iso_3166-2/SC.json new file mode 100644 index 0000000..fa48f09 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SC.json @@ -0,0 +1,31 @@ +{ + "source": "http://www.geonames.org/SC/administrative-division-seychelles.html", + "country": "Seychelles", + "subdivisions": { + "01": "Anse aux Pins", + "02": "Anse Boileau", + "03": "Anse Etoile", + "04": "Anse Louis", + "05": "Anse Royale", + "06": "Baie Lazare", + "07": "Baie Sainte Anne", + "08": "Beau Vallon", + "09": "Bel Air", + "10": "Bel Ombre", + "11": "Cascade", + "12": "Glacis", + "13": "Grand' Anse (on Mahe)", + "14": "Grand' Anse (on Praslin)", + "15": "La Digue", + "16": "La Riviere Anglaise", + "17": "Mont Buxton", + "18": "Mont Fleuri", + "19": "Plaisance", + "20": "Pointe La Rue", + "21": "Port Glaud", + "22": "Saint Louis", + "23": "Takamaka", + "24": "Les Mamelles", + "25": "Roche Caïman" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SD.json b/vendor/workerman/validation/data/iso_3166-2/SD.json new file mode 100644 index 0000000..00ad896 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SD.json @@ -0,0 +1,24 @@ +{ + "source": "http://www.geonames.org/SD/administrative-division-sudan.html", + "country": "Sudan", + "subdivisions": { + "DC": "Wasaţ Dārfūr", + "DE": "Sharq Dārfūr", + "DN": "Shamāl Dārfūr", + "DS": "Janūb Dārfūr", + "DW": "Gharb Dārfūr", + "GD": "Al Qaḑārif", + "GK": "West Kurdufan", + "GZ": "Al Jazīrah", + "KA": "Kassalā", + "KH": "Al Kharţūm", + "KN": "Shamāl Kurdufān", + "KS": "Janūb Kurdufān", + "NB": "An Nīl al Azraq", + "NO": "Ash Shamālīyah", + "NR": "An Nīl", + "NW": "An Nīl al Abyaḑ", + "RS": "Al Baḩr al Aḩmar", + "SI": "Sinnār" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SE.json b/vendor/workerman/validation/data/iso_3166-2/SE.json new file mode 100644 index 0000000..5211a38 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SE.json @@ -0,0 +1,27 @@ +{ + "source": "http://www.geonames.org/SE/administrative-division-sweden.html", + "country": "Sweden", + "subdivisions": { + "AB": "Stockholms", + "AC": "Vasterbottens", + "BD": "Norrbottens", + "C": "Uppsala", + "D": "Sodermanlands", + "E": "Ostergotlands", + "F": "Jonkopings", + "G": "Kronobergs", + "H": "Kalmar", + "I": "Gotlands", + "K": "Blekinge", + "M": "Skåne", + "N": "Hallands", + "O": "Västra Götaland", + "S": "Varmlands", + "T": "Orebro", + "U": "Vastmanlands", + "W": "Dalarna", + "X": "Gavleborgs", + "Y": "Vasternorrlands", + "Z": "Jamtlands" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SG.json b/vendor/workerman/validation/data/iso_3166-2/SG.json new file mode 100644 index 0000000..20b9cca --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SG.json @@ -0,0 +1,11 @@ +{ + "source": "http://www.geonames.org/SG/administrative-division-singapore.html", + "country": "Singapore", + "subdivisions": { + "01": "Central Singapore", + "02": "North East", + "03": "North West", + "04": "South East", + "05": "South West" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SH.json b/vendor/workerman/validation/data/iso_3166-2/SH.json new file mode 100644 index 0000000..78aa21b --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SH.json @@ -0,0 +1,9 @@ +{ + "source": "http://www.geonames.org/SH/administrative-division-saint-helena.html", + "country": "Saint Helena", + "subdivisions": { + "AC": "Ascension", + "HL": "Saint Helena", + "TA": "Tristan da Cunha" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SI.json b/vendor/workerman/validation/data/iso_3166-2/SI.json new file mode 100644 index 0000000..fbbc5a5 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SI.json @@ -0,0 +1,218 @@ +{ + "source": "http://www.geonames.org/SI/administrative-division-slovenia.html", + "country": "Slovenia", + "subdivisions": { + "001": "Ajdovščina", + "002": "Beltinci", + "003": "Bled", + "004": "Bohinj", + "005": "Borovnica", + "006": "Bovec", + "007": "Brda", + "008": "Brezovica", + "009": "Brežice", + "010": "Tišina", + "011": "Celje", + "012": "Cerklje na Gorenjskem", + "013": "Cerknica", + "014": "Cerkno", + "015": "Črenšovci", + "016": "Črna na Koroškem", + "017": "Črnomelj", + "018": "Destrnik", + "019": "Divača", + "020": "Dobrepolje", + "021": "Dobrova-Polhov Gradec", + "022": "Dol pri Ljubljani", + "023": "Domžale", + "024": "Dornava", + "025": "Dravograd", + "026": "Duplek", + "027": "Gorenja Vas-Poljane", + "028": "Gorišnica", + "029": "Gornja Radgona", + "030": "Gornji Grad", + "031": "Gornji Petrovci", + "032": "Grosuplje", + "033": "Šalovci", + "034": "Hrastnik", + "035": "Hrpelje-Kozina", + "036": "Idrija", + "037": "Ig", + "038": "Ilirska Bistrica", + "039": "Ivančna Gorica", + "040": "Izola/Isola", + "041": "Jesenice", + "042": "Juršinci", + "043": "Kamnik", + "044": "Kanal", + "045": "Kidričevo", + "046": "Kobarid", + "047": "Kobilje", + "048": "Kočevje", + "049": "Komen", + "050": "Koper/Capodistria", + "051": "Kozje", + "052": "Kranj", + "053": "Kranjska Gora", + "054": "Krško", + "055": "Kungota", + "056": "Kuzma", + "057": "Laško", + "058": "Lenart", + "059": "Lendava/Lendva", + "060": "Litija", + "061": "Ljubljana", + "062": "Ljubno", + "063": "Ljutomer", + "064": "Logatec", + "065": "Loška Dolina", + "066": "Loški Potok", + "067": "Luče", + "068": "Lukovica", + "069": "Majšperk", + "070": "Maribor", + "071": "Medvode", + "072": "Mengeš", + "073": "Metlika", + "074": "Mežica", + "075": "Miren-Kostanjevica", + "076": "Mislinja", + "077": "Moravče", + "078": "Moravske Toplice", + "079": "Mozirje", + "080": "Murska Sobota", + "081": "Muta", + "082": "Naklo", + "083": "Nazarje", + "084": "Nova Gorica", + "085": "Novo Mesto", + "086": "Odranci", + "087": "Ormož", + "088": "Osilnica", + "089": "Pesnica", + "090": "Piran/Pirano", + "091": "Pivka", + "092": "Podčetrtek", + "093": "Podvelka", + "094": "Postojna", + "095": "Preddvor", + "096": "Ptuj", + "097": "Puconci", + "098": "Rače-Fram", + "099": "Radeče", + "100": "Radenci", + "101": "Radlje ob Dravi", + "102": "Radovljica", + "103": "Ravne na Koroškem", + "104": "Ribnica", + "105": "Rogašovci", + "106": "Rogaška Slatina", + "107": "Rogatec", + "108": "Ruše", + "109": "Semič", + "110": "Sevnica", + "111": "Sežana", + "112": "Slovenj Gradec", + "113": "Slovenska Bistrica", + "114": "Slovenske Konjice", + "115": "Starše", + "116": "Sveti Jurij", + "117": "Šenčur", + "118": "Šentilj", + "119": "Šentjernej", + "120": "Šentjur", + "121": "Škocjan", + "122": "Škofja Loka", + "123": "Škofljica", + "124": "Šmarje pri Jelšah", + "125": "Šmartno ob Paki", + "126": "Šoštanj", + "127": "Štore", + "128": "Tolmin", + "129": "Trbovlje", + "130": "Trebnje", + "131": "Tržič", + "132": "Turnišče", + "133": "Velenje", + "134": "Velike Lašče", + "135": "Videm", + "136": "Vipava", + "137": "Vitanje", + "138": "Vodice", + "139": "Vojnik", + "140": "Vrhnika", + "141": "Vuzenica", + "142": "Zagorje ob Savi", + "143": "Zavrč", + "144": "Zreče", + "146": "Železniki", + "147": "Žiri", + "148": "Benedikt", + "149": "Bistrica ob Sotli", + "150": "Bloke", + "151": "Braslovče", + "152": "Cankova", + "153": "Cerkvenjak", + "154": "Dobje", + "155": "Dobrna", + "156": "Dobrovnik-Dobronak", + "157": "Dolenjske Toplice", + "158": "Grad", + "159": "Hajdina", + "160": "Hoče-Slivnica", + "161": "Hodoš/Hodos", + "162": "Horjul", + "163": "Jezersko", + "164": "Komenda", + "165": "Kostel", + "166": "Križevci", + "167": "Lovrenc na Pohorju", + "168": "Markovci", + "169": "Miklavž na Dravskem polju", + "170": "Mirna Peč", + "171": "Oplotnica", + "172": "Podlehnik", + "173": "Polzela", + "174": "Prebold", + "175": "Prevalje", + "176": "Razkrižje", + "177": "Ribnica na Pohorju", + "178": "Selnica ob Dravi", + "179": "Sodražica", + "180": "Solčava", + "181": "Sveta Ana", + "182": "Sveti Andraž v Slovenskih goricah", + "183": "Šempeter-Vrtojba", + "184": "Tabor", + "185": "Trnovska vas", + "186": "Trzin", + "187": "Velika Polana", + "188": "Veržej", + "189": "Vransko", + "190": "Žalec", + "191": "Žetale", + "192": "Žirovnica", + "193": "Žužemberk", + "194": "Šmartno pri Litiji", + "195": "Apače", + "196": "Cirkulane", + "197": "Kosanjevica na Krki", + "198": "Makole", + "199": "Mokronog-Trebelno", + "200": "Poljčane", + "201": "Renče-Vogrsko", + "202": "Središče ob Dravi", + "203": "Straža", + "204": "Sveta Trojica v Slovenskih Goricah", + "205": "Sveti Tomaž", + "206": "Šmarješke Toplice", + "207": "Gorje", + "208": "Log-Dragomer", + "209": "Rečica ob Savinji", + "210": "Sveti Jurij v Slovenskih Goricah", + "211": "Šentrupert", + "212": "Mirna", + "213": "Ankaran" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SJ.json b/vendor/workerman/validation/data/iso_3166-2/SJ.json new file mode 100644 index 0000000..73a4697 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SJ.json @@ -0,0 +1,8 @@ +{ + "source": "http://www.geonames.org/SJ/administrative-division-svalbard-and-jan-mayen.html", + "country": "Svalbard and Jan Mayen", + "subdivisions": { + "21": "Svalbard", + "22": "Jan Mayen" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SK.json b/vendor/workerman/validation/data/iso_3166-2/SK.json new file mode 100644 index 0000000..5086b18 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SK.json @@ -0,0 +1,14 @@ +{ + "source": "http://www.geonames.org/SK/administrative-division-slovakia.html", + "country": "Slovakia", + "subdivisions": { + "BC": "Banskobystricky", + "BL": "Bratislavsky", + "KI": "Kosicky", + "NI": "Nitriansky", + "PV": "Presovsky", + "TA": "Trnavsky", + "TC": "Trenciansky", + "ZI": "Zilinsky" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SL.json b/vendor/workerman/validation/data/iso_3166-2/SL.json new file mode 100644 index 0000000..9aa119a --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SL.json @@ -0,0 +1,11 @@ +{ + "source": "http://www.geonames.org/SL/administrative-division-sierra-leone.html", + "country": "Sierra Leone", + "subdivisions": { + "E": "Eastern", + "N": "Northern", + "NW": "North West Province", + "S": "Southern", + "W": "Western" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SM.json b/vendor/workerman/validation/data/iso_3166-2/SM.json new file mode 100644 index 0000000..932e2f8 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SM.json @@ -0,0 +1,15 @@ +{ + "source": "http://www.geonames.org/SM/administrative-division-san-marino.html", + "country": "San Marino", + "subdivisions": { + "01": "Acquaviva", + "02": "Chiesanuova", + "03": "Domagnano", + "04": "Faetano", + "05": "Fiorentino", + "06": "Borgo Maggiore", + "07": "Citta di San Marino", + "08": "Montegiardino", + "09": "Serravalle" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SN.json b/vendor/workerman/validation/data/iso_3166-2/SN.json new file mode 100644 index 0000000..8410134 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SN.json @@ -0,0 +1,20 @@ +{ + "source": "http://www.geonames.org/SN/administrative-division-senegal.html", + "country": "Senegal", + "subdivisions": { + "DB": "Diourbel", + "DK": "Dakar", + "FK": "Fatick", + "KA": "Kaffrine", + "KD": "Kolda", + "KE": "Kédougou", + "KL": "Kaolack", + "LG": "Louga", + "MT": "Matam", + "SE": "Sédhiou", + "SL": "Saint-Louis", + "TC": "Tambacounda", + "TH": "Thies", + "ZG": "Ziguinchor" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SO.json b/vendor/workerman/validation/data/iso_3166-2/SO.json new file mode 100644 index 0000000..3dfb0cb --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SO.json @@ -0,0 +1,24 @@ +{ + "source": "http://www.geonames.org/SO/administrative-division-somalia.html", + "country": "Somalia", + "subdivisions": { + "AW": "Awdal", + "BK": "Bakool", + "BN": "Banaadir", + "BR": "Bari", + "BY": "Bay", + "GA": "Galguduud", + "GE": "Gedo", + "HI": "Hiiraan", + "JD": "Jubbada Dhexe", + "JH": "Jubbada Hoose", + "MU": "Mudug", + "NU": "Nugaal", + "SA": "Sanaag", + "SD": "Shabeellaha Dhexe", + "SH": "Shabeellaha Hoose", + "SO": "Sool", + "TO": "Togdheer", + "WO": "Woqooyi Galbeed" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SR.json b/vendor/workerman/validation/data/iso_3166-2/SR.json new file mode 100644 index 0000000..c1ba7de --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SR.json @@ -0,0 +1,16 @@ +{ + "source": "http://www.geonames.org/SR/administrative-division-suriname.html", + "country": "Suriname", + "subdivisions": { + "BR": "Brokopondo", + "CM": "Commewijne", + "CR": "Coronie", + "MA": "Marowijne", + "NI": "Nickerie", + "PM": "Paramaribo", + "PR": "Para", + "SA": "Saramacca", + "SI": "Sipaliwini", + "WA": "Wanica" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SS.json b/vendor/workerman/validation/data/iso_3166-2/SS.json new file mode 100644 index 0000000..c945968 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SS.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/SS/administrative-division-south-sudan.html", + "country": "South Sudan", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/ST.json b/vendor/workerman/validation/data/iso_3166-2/ST.json new file mode 100644 index 0000000..50fe858 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/ST.json @@ -0,0 +1,8 @@ +{ + "source": "http://www.geonames.org/ST/administrative-division-sao-tome-and-principe.html", + "country": "São Tomé and Príncipe", + "subdivisions": { + "P": "Principe", + "S": "Sao Tome" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SV.json b/vendor/workerman/validation/data/iso_3166-2/SV.json new file mode 100644 index 0000000..ca4f7e5 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SV.json @@ -0,0 +1,20 @@ +{ + "source": "http://www.geonames.org/SV/administrative-division-el-salvador.html", + "country": "El Salvador", + "subdivisions": { + "AH": "Ahuachapan", + "CA": "Cabanas", + "CH": "Chalatenango", + "CU": "Cuscatlan", + "LI": "La Libertad", + "MO": "Morazan", + "PA": "La Paz", + "SA": "Santa Ana", + "SM": "San Miguel", + "SO": "Sonsonate", + "SS": "San Salvador", + "SV": "San Vicente", + "UN": "La Union", + "US": "Usulutan" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SX.json b/vendor/workerman/validation/data/iso_3166-2/SX.json new file mode 100644 index 0000000..f32f232 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SX.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/SX/administrative-division-sint-maarten.html", + "country": "Sint Maarten", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SY.json b/vendor/workerman/validation/data/iso_3166-2/SY.json new file mode 100644 index 0000000..8fba8fe --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SY.json @@ -0,0 +1,20 @@ +{ + "source": "http://www.geonames.org/SY/administrative-division-syria.html", + "country": "Syria", + "subdivisions": { + "DI": "Dimashq", + "DR": "Dara", + "DY": "Dayr az Zawr", + "HA": "Al Hasakah", + "HI": "Hims", + "HL": "Halab", + "HM": "Hamah", + "ID": "Idlib", + "LA": "Al Ladhiqiyah", + "QU": "Al Qunaytirah", + "RA": "Ar Raqqah", + "RD": "Rif Dimashq", + "SU": "As Suwayda", + "TA": "Tartus" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/SZ.json b/vendor/workerman/validation/data/iso_3166-2/SZ.json new file mode 100644 index 0000000..122b18e --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/SZ.json @@ -0,0 +1,10 @@ +{ + "source": "http://www.geonames.org/SZ/administrative-division-swaziland.html", + "country": "Swaziland", + "subdivisions": { + "HH": "Hhohho", + "LU": "Lubombo", + "MA": "Manzini", + "SH": "Shishelweni" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/TC.json b/vendor/workerman/validation/data/iso_3166-2/TC.json new file mode 100644 index 0000000..60732cb --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/TC.json @@ -0,0 +1,20 @@ +{ + "source": "http://www.geonames.org/TC/administrative-division-turks-and-caicos-islands.html", + "country": "Turks and Caicos Islands", + "subdivisions": { + "AC": "Ambergris Cays", + "DC": "Dellis Cay", + "EC": "East Caicos", + "FC": "French Cay", + "GT": "Grand Turk", + "LW": "Little Water Cay", + "MC": "Middle Caicos", + "NC": "North Caicos", + "PN": "Pine Cay", + "PR": "Providenciales", + "RC": "Parrot Cay", + "SC": "South Caicos", + "SL": "Salt Cay", + "WC": "West Caicos" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/TD.json b/vendor/workerman/validation/data/iso_3166-2/TD.json new file mode 100644 index 0000000..626d925 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/TD.json @@ -0,0 +1,29 @@ +{ + "source": "http://www.geonames.org/TD/administrative-division-chad.html", + "country": "Chad", + "subdivisions": { + "BA": "Batha", + "BG": "Barh el Ghazel", + "BO": "Borkou", + "CB": "Chari-Baguirmi", + "EE": "Ennedi Est", + "EO": "Ennedi Quest", + "GR": "Guéra", + "HL": "Hadjer-Lamis", + "KA": "Kanem", + "LC": "Lac", + "LO": "Logone Occidental", + "LR": "Logone Oriental", + "MA": "Mandoul", + "MC": "Moyen-Chari", + "ME": "Mayo-Kebbi Est", + "MO": "Mayo-Kebbi Ouest", + "ND": "Ville de N'Djamena", + "OD": "Ouaddaï", + "SA": "Salamat", + "SI": "Sila", + "TA": "Tandjile", + "TI": "Tibesti", + "WF": "Wadi Fira" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/TF.json b/vendor/workerman/validation/data/iso_3166-2/TF.json new file mode 100644 index 0000000..f0571ed --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/TF.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/TF/administrative-division-french-southern-territories.html", + "country": "French Southern Territories", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/TG.json b/vendor/workerman/validation/data/iso_3166-2/TG.json new file mode 100644 index 0000000..14d9a9e --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/TG.json @@ -0,0 +1,11 @@ +{ + "source": "http://www.geonames.org/TG/administrative-division-togo.html", + "country": "Togo", + "subdivisions": { + "C": "Centrale", + "K": "Kara", + "M": "Maritime", + "P": "Plateaux", + "S": "Savanes" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/TH.json b/vendor/workerman/validation/data/iso_3166-2/TH.json new file mode 100644 index 0000000..8a0f914 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/TH.json @@ -0,0 +1,84 @@ +{ + "source": "http://www.geonames.org/TH/administrative-division-thailand.html", + "country": "Thailand", + "subdivisions": { + "10": "Bangkok", + "11": "Samut Prakan", + "12": "Nonthaburi", + "13": "Pathum Thani", + "14": "Phra Nakhon Si Ayutthaya", + "15": "Ang Thong", + "16": "Lop Buri", + "17": "Sing Buri", + "18": "Chai Nat", + "19": "Saraburi", + "20": "Chon Buri", + "21": "Rayong", + "22": "Chanthaburi", + "23": "Trat", + "24": "Chachoengsao", + "25": "Prachin Buri", + "26": "Nakhon Nayok", + "27": "Sa Kaeo", + "30": "Nakhon Ratchasima", + "31": "Buri Ram", + "32": "Surin", + "33": "Si Sa Ket", + "34": "Ubon Ratchathani", + "35": "Yasothon", + "36": "Chaiyaphum", + "37": "Amnat Charoen", + "38": "Bueng Kan", + "39": "Nong Bua Lam Phu", + "40": "Khon Kaen", + "41": "Udon Thani", + "42": "Loei", + "43": "Nong Khai", + "44": "Maha Sarakham", + "45": "Roi Et", + "46": "Kalasin", + "47": "Sakon Nakhon", + "48": "Nakhon Phanom", + "49": "Mukdahan", + "50": "Chiang Mai", + "51": "Lamphun", + "52": "Lampang", + "53": "Uttaradit", + "54": "Phrae", + "55": "Nan", + "56": "Phayao", + "57": "Chiang Rai", + "58": "Mae Hong Son", + "60": "Nakhon Sawan", + "61": "Uthai Thani", + "62": "Kamphaeng Phet", + "63": "Tak", + "64": "Sukhothai", + "65": "Phitsanulok", + "66": "Phichit", + "67": "Phetchabun", + "70": "Ratchaburi", + "71": "Kanchanaburi", + "72": "Suphanburi", + "73": "Nakhon Pathom", + "74": "Samut Sakhon", + "75": "Samut Songkhram", + "76": "Phetchaburi", + "77": "Prachuap Khiri Khan", + "80": "Nakhon Si Thammarat", + "81": "Krabi", + "82": "Phang Nga", + "83": "Phuket", + "84": "Surat Thani", + "85": "Ranong", + "86": "Chumpon", + "90": "Songkhla", + "91": "Satun", + "92": "Trang", + "93": "Phattalung", + "94": "Pattani", + "95": "Yala", + "96": "Narathiwat", + "S": "Pattaya" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/TJ.json b/vendor/workerman/validation/data/iso_3166-2/TJ.json new file mode 100644 index 0000000..fb5ba94 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/TJ.json @@ -0,0 +1,11 @@ +{ + "source": "http://www.geonames.org/TJ/administrative-division-tajikistan.html", + "country": "Tajikistan", + "subdivisions": { + "DU": "Dushanbe", + "GB": "Gorno-Badakhstan", + "KT": "Khatlon", + "RA": "Nohiyahoi Tobei Jumhurí", + "SU": "Sughd" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/TK.json b/vendor/workerman/validation/data/iso_3166-2/TK.json new file mode 100644 index 0000000..06d7353 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/TK.json @@ -0,0 +1,9 @@ +{ + "source": "http://www.geonames.org/TK/administrative-division-tokelau.html", + "country": "Tokelau", + "subdivisions": { + "A": "Atafu", + "F": "Fakaofo", + "N": "Nukunonu" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/TL.json b/vendor/workerman/validation/data/iso_3166-2/TL.json new file mode 100644 index 0000000..ca845d5 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/TL.json @@ -0,0 +1,19 @@ +{ + "source": "http://www.geonames.org/TL/administrative-division-east-timor.html", + "country": "East Timor", + "subdivisions": { + "AL": "Aileu", + "AN": "Ainaro", + "BA": "Baucau", + "BO": "Bobonaro", + "CO": "Cova Lima", + "DI": "Dili", + "ER": "Ermera", + "LA": "Lautem", + "LI": "Liquica", + "MF": "Manufahi", + "MT": "Manatuto", + "OE": "Oecussi", + "VI": "Viqueque" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/TM.json b/vendor/workerman/validation/data/iso_3166-2/TM.json new file mode 100644 index 0000000..c9f03cb --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/TM.json @@ -0,0 +1,12 @@ +{ + "source": "http://www.geonames.org/TM/administrative-division-turkmenistan.html", + "country": "Turkmenistan", + "subdivisions": { + "A": "Ahal Welayaty", + "B": "Balkan Welayaty", + "D": "Dashhowuz Welayaty", + "L": "Lebap Welayaty", + "M": "Mary Welayaty", + "S": "Aşgabat" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/TN.json b/vendor/workerman/validation/data/iso_3166-2/TN.json new file mode 100644 index 0000000..71dec4c --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/TN.json @@ -0,0 +1,30 @@ +{ + "source": "http://www.geonames.org/TN/administrative-division-tunisia.html", + "country": "Tunisia", + "subdivisions": { + "11": "Tunis", + "12": "L'Ariana", + "13": "Ben Arous", + "14": "La Manouba", + "21": "Nabeul", + "22": "Zaghouan", + "23": "Bizerte", + "31": "Béja", + "32": "Jendouba", + "33": "Le Kef", + "34": "Siliana", + "41": "Kairouan", + "42": "Kasserine", + "43": "Sidi Bouzid", + "51": "Sousse", + "52": "Monastir", + "53": "Mahdia", + "61": "Sfax", + "71": "Gafsa", + "72": "Tozeur", + "73": "Kebili", + "81": "Gabès", + "82": "Medenine", + "83": "Tataouine" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/TO.json b/vendor/workerman/validation/data/iso_3166-2/TO.json new file mode 100644 index 0000000..e1e7962 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/TO.json @@ -0,0 +1,11 @@ +{ + "source": "http://www.geonames.org/TO/administrative-division-tonga.html", + "country": "Tonga", + "subdivisions": { + "01": "Eua", + "02": "Ha'apai", + "03": "Niuas", + "04": "Tongatapu", + "05": "Vava'u" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/TR.json b/vendor/workerman/validation/data/iso_3166-2/TR.json new file mode 100644 index 0000000..b0d05b5 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/TR.json @@ -0,0 +1,87 @@ +{ + "source": "http://www.geonames.org/TR/administrative-division-turkey.html", + "country": "Turkey", + "subdivisions": { + "01": "Adana", + "02": "Adiyaman", + "03": "Afyonkarahisar", + "04": "Agri", + "05": "Amasya", + "06": "Ankara", + "07": "Antalya", + "08": "Artvin", + "09": "Aydin", + "10": "Balikesir", + "11": "Bilecik", + "12": "Bingol", + "13": "Bitlis", + "14": "Bolu", + "15": "Burdur", + "16": "Bursa", + "17": "Canakkale", + "18": "Cankiri", + "19": "Corum", + "20": "Denizli", + "21": "Diyarbakir", + "22": "Edirne", + "23": "Elazig", + "24": "Erzincan", + "25": "Erzurum", + "26": "Eskisehir", + "27": "Gaziantep", + "28": "Giresun", + "29": "Gumushane", + "30": "Hakkari", + "31": "Hatay", + "32": "Isparta", + "33": "Mersin", + "34": "Istanbul", + "35": "Izmir", + "36": "Kars", + "37": "Kastamonu", + "38": "Kayseri", + "39": "Kirklareli", + "40": "Kirsehir", + "41": "Kocaeli", + "42": "Konya", + "43": "Kutahya", + "44": "Malatya", + "45": "Manisa", + "46": "Kahramanmaras", + "47": "Mardin", + "48": "Mugla", + "49": "Mus", + "50": "Nevsehir", + "51": "Nigde", + "52": "Ordu", + "53": "Rize", + "54": "Sakarya", + "55": "Samsun", + "56": "Siirt", + "57": "Sinop", + "58": "Sivas", + "59": "Tekirdag", + "60": "Tokat", + "61": "Trabzon", + "62": "Tunceli", + "63": "Sanliurfa", + "64": "Usak", + "65": "Van", + "66": "Yozgat", + "67": "Zonguldak", + "68": "Aksaray", + "69": "Bayburt", + "70": "Karaman", + "71": "Kirikkale", + "72": "Batman", + "73": "Sirnak", + "74": "Bartin", + "75": "Ardahan", + "76": "Igdir", + "77": "Yalova", + "78": "Karabuk", + "79": "Kilis", + "80": "Osmaniye", + "81": "Duzce" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/TT.json b/vendor/workerman/validation/data/iso_3166-2/TT.json new file mode 100644 index 0000000..e1916a5 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/TT.json @@ -0,0 +1,21 @@ +{ + "source": "http://www.geonames.org/TT/administrative-division-trinidad-and-tobago.html", + "country": "Trinidad and Tobago", + "subdivisions": { + "ARI": "Arima", + "CHA": "Chaguanas", + "CTT": "Couva/Tabaquite/Talparo", + "DMN": "Diego Martin", + "MRC": "Mayaro/Rio Claro", + "PED": "Penal/Debe", + "POS": "Port of Spain", + "PRT": "Princes Town", + "PTF": "Point Fortin", + "SFO": "San Fernando", + "SGE": "Sangre Grande", + "SIP": "Siparia", + "SJL": "San Juan/Laventille", + "TOB": "Tobago", + "TUP": "Tunapuna/Piarco" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/TV.json b/vendor/workerman/validation/data/iso_3166-2/TV.json new file mode 100644 index 0000000..ce04808 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/TV.json @@ -0,0 +1,14 @@ +{ + "source": "http://www.geonames.org/TV/administrative-division-tuvalu.html", + "country": "Tuvalu", + "subdivisions": { + "FUN": "Funafuti", + "NIT": "Niutao", + "NKF": "Nukufetau", + "NKL": "Nukulaelae", + "NMA": "Nanumea", + "NMG": "Nanumanga", + "NUI": "Nui", + "VAI": "Vaitupu" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/TW.json b/vendor/workerman/validation/data/iso_3166-2/TW.json new file mode 100644 index 0000000..360bc9a --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/TW.json @@ -0,0 +1,28 @@ +{ + "source": "http://www.geonames.org/TW/administrative-division-taiwan.html", + "country": "Taiwan", + "subdivisions": { + "CHA": "Changhua", + "CYI": "Chiayi", + "CYQ": "Chiayi", + "HSQ": "Hsinchu", + "HSZ": "Hsinchu", + "HUA": "Hualien", + "ILA": "Ilan", + "KEE": "Keelung", + "KHH": "Kaohsiung", + "KIN": "Kinmen", + "LIE": "Lienchiang", + "MIA": "Miaoli", + "NAN": "Nantou", + "NWT": "New Taipei", + "PEN": "Penghu", + "PIF": "Pingtung", + "TAO": "Taoyuan", + "TNN": "Tainan", + "TPE": "Taipei", + "TTT": "Taitung", + "TXG": "Taichung", + "YUN": "Yunlin" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/TZ.json b/vendor/workerman/validation/data/iso_3166-2/TZ.json new file mode 100644 index 0000000..223ec5d --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/TZ.json @@ -0,0 +1,36 @@ +{ + "source": "http://www.geonames.org/TZ/administrative-division-tanzania.html", + "country": "Tanzania", + "subdivisions": { + "01": "Arusha", + "02": "Dar es Salaam", + "03": "Dodoma", + "04": "Iringa", + "05": "Kagera", + "06": "Pemba North", + "07": "Zanzibar North", + "08": "Kigoma", + "09": "Kilimanjaro", + "10": "Pemba South", + "11": "Zanzibar Central/South", + "12": "Lindi", + "13": "Mara", + "14": "Mbeya", + "15": "Zanzibar Urban/West", + "16": "Morogoro", + "17": "Mtwara", + "18": "Mwanza", + "19": "Pwani", + "20": "Rukwa", + "21": "Ruvuma", + "22": "Shinyanga", + "23": "Singida", + "24": "Tabora", + "25": "Tanga", + "26": "Manyara", + "27": "Geita", + "28": "Katavi", + "29": "Njombe", + "30": "Simiyu" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/UA.json b/vendor/workerman/validation/data/iso_3166-2/UA.json new file mode 100644 index 0000000..f6b250c --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/UA.json @@ -0,0 +1,33 @@ +{ + "source": "http://www.geonames.org/UA/administrative-division-ukraine.html", + "country": "Ukraine", + "subdivisions": { + "05": "Vinnytsya", + "07": "Volyn'", + "09": "Luhans'k", + "12": "Dnipropetrovs'k", + "14": "Donets'k", + "18": "Zhytomyr", + "21": "Zakarpattya", + "23": "Zaporizhzhya", + "26": "Ivano-Frankivs'k", + "30": "Kyyiv", + "32": "Kiev", + "35": "Kirovohrad", + "40": "Sevastopol", + "43": "Crimea", + "46": "L'viv", + "48": "Mykolayiv", + "51": "Odesa", + "53": "Poltava", + "56": "Rivne", + "59": "Sumy", + "61": "Ternopil'", + "63": "Kharkiv", + "65": "Kherson", + "68": "Khmel'nyts'kyy", + "71": "Cherkasy", + "74": "Chernihiv", + "77": "Chernivtsi" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/UG.json b/vendor/workerman/validation/data/iso_3166-2/UG.json new file mode 100644 index 0000000..6cd11cb --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/UG.json @@ -0,0 +1,132 @@ +{ + "source": "http://www.geonames.org/UG/administrative-division-uganda.html", + "country": "Uganda", + "subdivisions": { + "101": "Kalangala", + "102": "Kampala", + "103": "Kiboga", + "104": "Luwero", + "105": "Masaka", + "106": "Mpigi", + "107": "Mubende", + "108": "Mukono", + "109": "Nakasongola", + "110": "Rakai", + "111": "Sembabule", + "112": "Kayunga", + "113": "Wakiso", + "114": "Lyantonde", + "115": "Mityana", + "116": "Nakaseke", + "117": "Buikwe", + "118": "Bukomansimbi", + "119": "Butambala", + "120": "Buvuma", + "121": "Gomba", + "122": "Kalungu", + "123": "Kyankwanzi", + "124": "Lwengo", + "125": "Kyotera", + "201": "Bugiri", + "202": "Busia", + "203": "Iganga", + "204": "Jinja", + "205": "Kamuli", + "206": "Kapchorwa", + "207": "Katakwi", + "208": "Kumi", + "209": "Mbale", + "210": "Pallisa", + "211": "Soroti", + "212": "Tororo", + "213": "Kaberamaido", + "214": "Mayuge", + "215": "Sironko", + "216": "Amuria", + "217": "Budaka", + "218": "Bududa", + "219": "Bukedea", + "220": "Bukwa", + "221": "Butaleja", + "222": "Kaliro", + "223": "Manafwa", + "224": "Namutumba", + "225": "Bulambuli", + "226": "Buyende", + "227": "Kibuku", + "228": "Kween", + "229": "Luuka", + "230": "Namayingo", + "231": "Ngora", + "232": "Serere", + "233": "Butebo", + "234": "Namisindwa", + "301": "Adjumani", + "302": "Apac", + "303": "Arua", + "304": "Gulu", + "305": "Kitgum", + "306": "Kotido", + "307": "Lira", + "308": "Moroto", + "309": "Moyo", + "310": "Nebbi", + "311": "Nakapiripirit", + "312": "Pader", + "313": "Yumbe", + "314": "Abim", + "315": "Amolatar", + "316": "Amuru", + "317": "Dokolo", + "318": "Kaabong", + "319": "Koboko", + "320": "Maracha", + "321": "Oyam", + "322": "Agago", + "323": "Alebtong", + "324": "Amudat", + "325": "Kole", + "326": "Lamwo", + "327": "Napak", + "328": "Nwoya", + "329": "Otuke", + "330": "Zombo", + "331": "Omoro", + "332": "Pakwach", + "401": "Bundibugyo", + "402": "Bushenyi", + "403": "Hoima", + "404": "Kabale", + "405": "Kabarole", + "406": "Kasese", + "407": "Kibaale", + "408": "Kisoro", + "409": "Masindi", + "410": "Mbarara", + "411": "Ntungamo", + "412": "Rukungiri", + "413": "Kamwenge", + "414": "Kanungu", + "415": "Kyenjojo", + "416": "Buliisa", + "417": "Ibanda", + "418": "Isingiro", + "419": "Kiruhura", + "420": "Buhweju", + "421": "Kiryandongo", + "422": "Kyegegwa", + "423": "Mitoma", + "424": "Ntoroko", + "425": "Rubirizi", + "426": "Sheema", + "427": "Kagadi", + "428": "Kakumiro", + "429": "Rubanda", + "430": "Bunyangabu", + "431": "Rukiga", + "C": "Central", + "E": "Eastern", + "N": "Northern", + "W": "Western" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/UM.json b/vendor/workerman/validation/data/iso_3166-2/UM.json new file mode 100644 index 0000000..864a7a6 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/UM.json @@ -0,0 +1,15 @@ +{ + "source": "http://www.geonames.org/UM/administrative-division-united-states-minor-outlying-islands.html", + "country": "U.S. Minor Outlying Islands", + "subdivisions": { + "67": "Johnston Atoll", + "71": "Midway Atoll", + "76": "Navassa Island", + "79": "Wake Island", + "81": "Baker Island", + "84": "Howland Island", + "86": "Jarvis Island", + "89": "Kingman Reef", + "95": "Palmyra Atoll" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/US.json b/vendor/workerman/validation/data/iso_3166-2/US.json new file mode 100644 index 0000000..d6f544d --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/US.json @@ -0,0 +1,63 @@ +{ + "source": "http://www.geonames.org/US/administrative-division-united-states.html", + "country": "United States", + "subdivisions": { + "AK": "Alaska", + "AL": "Alabama", + "AR": "Arkansas", + "AS": "American Samoa", + "AZ": "Arizona", + "CA": "California", + "CO": "Colorado", + "CT": "Connecticut", + "DC": "District of Columbia", + "DE": "Delaware", + "FL": "Florida", + "GA": "Georgia", + "GU": "Guam", + "HI": "Hawaii", + "IA": "Iowa", + "ID": "Idaho", + "IL": "Illinois", + "IN": "Indiana", + "KS": "Kansas", + "KY": "Kentucky", + "LA": "Louisiana", + "MA": "Massachusetts", + "MD": "Maryland", + "ME": "Maine", + "MI": "Michigan", + "MN": "Minnesota", + "MO": "Missouri", + "MP": "Northern Mariana Islands", + "MS": "Mississippi", + "MT": "Montana", + "NC": "North Carolina", + "ND": "North Dakota", + "NE": "Nebraska", + "NH": "New Hampshire", + "NJ": "New Jersey", + "NM": "New Mexico", + "NV": "Nevada", + "NY": "New York", + "OH": "Ohio", + "OK": "Oklahoma", + "OR": "Oregon", + "PA": "Pennsylvania", + "PR": "Puerto Rico", + "RI": "Rhode Island", + "SC": "South Carolina", + "SD": "South Dakota", + "TN": "Tennessee", + "TX": "Texas", + "UM": "U.S. Minor Outlying Islands", + "UT": "Utah", + "VA": "Virginia", + "VI": "Virgin Islands of the U.S.", + "VT": "Vermont", + "WA": "Washington", + "WI": "Wisconsin", + "WV": "West Virginia", + "WY": "Wyoming" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/UY.json b/vendor/workerman/validation/data/iso_3166-2/UY.json new file mode 100644 index 0000000..f35a206 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/UY.json @@ -0,0 +1,25 @@ +{ + "source": "http://www.geonames.org/UY/administrative-division-uruguay.html", + "country": "Uruguay", + "subdivisions": { + "AR": "Artigas", + "CA": "Canelones", + "CL": "Cerro Largo", + "CO": "Colonia", + "DU": "Durazno", + "FD": "Florida", + "FS": "Flores", + "LA": "Lavalleja", + "MA": "Maldonado", + "MO": "Montevideo", + "PA": "Paysandu", + "RN": "Rio Negro", + "RO": "Rocha", + "RV": "Rivera", + "SA": "Salto", + "SJ": "San Jose", + "SO": "Soriano", + "TA": "Tacuarembó", + "TT": "Treinta y Tres" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/UZ.json b/vendor/workerman/validation/data/iso_3166-2/UZ.json new file mode 100644 index 0000000..19cbe0e --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/UZ.json @@ -0,0 +1,20 @@ +{ + "source": "http://www.geonames.org/UZ/administrative-division-uzbekistan.html", + "country": "Uzbekistan", + "subdivisions": { + "AN": "Andijon", + "BU": "Buxoro", + "FA": "Farg'ona", + "JI": "Jizzax", + "NG": "Namangan", + "NW": "Navoiy", + "QA": "Qashqadaryo", + "QR": "Qoraqalpog'iston Republikasi", + "SA": "Samarqand", + "SI": "Sirdaryo", + "SU": "Surxondaryo", + "TK": "Toshkent city", + "TO": "Toshkent region", + "XO": "Xorazm" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/VA.json b/vendor/workerman/validation/data/iso_3166-2/VA.json new file mode 100644 index 0000000..4d6a3d5 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/VA.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/VA/administrative-division-vatican-city.html", + "country": "Vatican City", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/VC.json b/vendor/workerman/validation/data/iso_3166-2/VC.json new file mode 100644 index 0000000..5c346ea --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/VC.json @@ -0,0 +1,12 @@ +{ + "source": "http://www.geonames.org/VC/administrative-division-saint-vincent-and-the-grenadines.html", + "country": "Saint Vincent and the Grenadines", + "subdivisions": { + "01": "Charlotte", + "02": "Saint Andrew", + "03": "Saint David", + "04": "Saint George", + "05": "Saint Patrick", + "06": "Grenadines" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/VE.json b/vendor/workerman/validation/data/iso_3166-2/VE.json new file mode 100644 index 0000000..395b821 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/VE.json @@ -0,0 +1,31 @@ +{ + "source": "http://www.geonames.org/VE/administrative-division-venezuela.html", + "country": "Venezuela", + "subdivisions": { + "A": "Federal Capital", + "B": "Anzoategui", + "C": "Apure", + "D": "Aragua", + "E": "Barinas", + "F": "Bolivar", + "G": "Carabobo", + "H": "Cojedes", + "I": "Falcon", + "J": "Guarico", + "K": "Lara", + "L": "Merida", + "M": "Miranda", + "N": "Monagas", + "O": "Nueva Esparta", + "P": "Portuguesa", + "R": "Sucre", + "S": "Tachira", + "T": "Trujillo", + "U": "Yaracuy", + "V": "Zulia", + "W": "Federal Dependency", + "X": "Vargas", + "Y": "Delta Amacuro", + "Z": "Amazonas" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/VG.json b/vendor/workerman/validation/data/iso_3166-2/VG.json new file mode 100644 index 0000000..f804a96 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/VG.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/VG/administrative-division-british-virgin-islands.html", + "country": "British Virgin Islands", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/VI.json b/vendor/workerman/validation/data/iso_3166-2/VI.json new file mode 100644 index 0000000..522d719 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/VI.json @@ -0,0 +1,9 @@ +{ + "source": "http://www.geonames.org/VI/administrative-division-u-s-virgin-islands.html", + "country": "U.S. Virgin Islands", + "subdivisions": { + "C": "Saint Croix", + "J": "Saint John", + "T": "Saint Thomas" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/VN.json b/vendor/workerman/validation/data/iso_3166-2/VN.json new file mode 100644 index 0000000..6a15974 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/VN.json @@ -0,0 +1,69 @@ +{ + "source": "http://www.geonames.org/VN/administrative-division-vietnam.html", + "country": "Vietnam", + "subdivisions": { + "01": "Lai Chau", + "02": "Lao Cai", + "03": "Ha Giang", + "04": "Cao Bang", + "05": "Son La", + "06": "Yen Bai", + "07": "Tuyen Quang", + "09": "Lang Son", + "13": "Quang Ninh", + "14": "Hoa Binh", + "18": "Ninh Binh", + "20": "Thai Binh", + "21": "Thanh Hoa", + "22": "Nghe An", + "23": "Ha Tinh", + "24": "Quang Binh", + "25": "Quang Tri", + "26": "Thua Thien-Hue", + "27": "Quang Nam", + "28": "Kon Tum", + "29": "Quang Ngai", + "30": "Gia Lai", + "31": "Binh Dinh", + "32": "Phu Yen", + "33": "Dak Lak", + "34": "Khanh Hoa", + "35": "Lam Dong", + "36": "Ninh Thuan", + "37": "Tay Ninh", + "39": "Dong Nai", + "40": "Binh Thuan", + "41": "Long An", + "43": "Ba Ria-Vung Tau", + "44": "An Giang", + "45": "Dong Thap", + "46": "Tien Giang", + "47": "Kien Giang", + "49": "Vinh Long", + "50": "Ben Tre", + "51": "Tra Vinh", + "52": "Soc Trang", + "53": "Bac Can", + "54": "Bac Giang", + "55": "Bac Lieu", + "56": "Bac Ninh", + "57": "Binh Duong", + "58": "Binh Phuoc", + "59": "Ca Mau", + "61": "Hai Duong", + "63": "Ha Nam", + "66": "Hung Yen", + "67": "Nam Dinh", + "68": "Phu Tho", + "69": "Thai Nguyen", + "70": "Vinh Phuc", + "71": "Dien Bien", + "72": "Dak Nong", + "73": "Hau Giang", + "CT": "Can Tho", + "DN": "Da Nang", + "HN": "Ha Noi", + "HP": "Hai Phong", + "SG": "Ho Chi Minh" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/VU.json b/vendor/workerman/validation/data/iso_3166-2/VU.json new file mode 100644 index 0000000..dcf24fd --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/VU.json @@ -0,0 +1,12 @@ +{ + "source": "http://www.geonames.org/VU/administrative-division-vanuatu.html", + "country": "Vanuatu", + "subdivisions": { + "MAP": "Malampa", + "PAM": "Penama", + "SAM": "Sanma", + "SEE": "Shefa", + "TAE": "Tafea", + "TOB": "Torba" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/WF.json b/vendor/workerman/validation/data/iso_3166-2/WF.json new file mode 100644 index 0000000..148115a --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/WF.json @@ -0,0 +1,9 @@ +{ + "source": "http://www.geonames.org/WF/administrative-division-wallis-and-futuna.html", + "country": "Wallis and Futuna", + "subdivisions": { + "AL": "Alo", + "SG": "Sigave", + "UV": "ʻUvea" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/WS.json b/vendor/workerman/validation/data/iso_3166-2/WS.json new file mode 100644 index 0000000..88d476d --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/WS.json @@ -0,0 +1,17 @@ +{ + "source": "http://www.geonames.org/WS/administrative-division-samoa.html", + "country": "Samoa", + "subdivisions": { + "AA": "A'ana", + "AL": "Aiga-i-le-Tai", + "AT": "Atua", + "FA": "Fa'asaleleaga", + "GE": "Gaga'emauga", + "GI": "Gagaifomauga", + "PA": "Palauli", + "SA": "Satupa'itea", + "TU": "Tuamasaga", + "VF": "Va'a-o-Fonoti", + "VS": "Vaisigano" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/XK.json b/vendor/workerman/validation/data/iso_3166-2/XK.json new file mode 100644 index 0000000..306c263 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/XK.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/XK/administrative-division-kosovo.html", + "country": "Kosovo", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/YE.json b/vendor/workerman/validation/data/iso_3166-2/YE.json new file mode 100644 index 0000000..53237a4 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/YE.json @@ -0,0 +1,28 @@ +{ + "source": "http://www.geonames.org/YE/administrative-division-yemen.html", + "country": "Yemen", + "subdivisions": { + "AB": "Abyan", + "AD": "Adan", + "AM": "Amran", + "BA": "Al Bayda", + "DA": "Ad Dali", + "DH": "Dhamar", + "HD": "Hadramawt", + "HJ": "Hajjah", + "HU": "Al Hudaydah", + "IB": "Ibb", + "JA": "Al Jawf", + "LA": "Lahij", + "MA": "Ma'rib", + "MR": "Al Mahrah", + "MW": "Al Mahwit", + "RA": "Raymah", + "SA": "Amanat Al Asimah", + "SD": "Sa'dah", + "SH": "Shabwah", + "SN": "San'a", + "SU": "Socotra", + "TA": "Ta'izz" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/YT.json b/vendor/workerman/validation/data/iso_3166-2/YT.json new file mode 100644 index 0000000..01aae42 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/YT.json @@ -0,0 +1,5 @@ +{ + "source": "http://www.geonames.org/YT/administrative-division-mayotte.html", + "country": "Mayotte", + "subdivisions": [] +} diff --git a/vendor/workerman/validation/data/iso_3166-2/ZA.json b/vendor/workerman/validation/data/iso_3166-2/ZA.json new file mode 100644 index 0000000..0d9d786 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/ZA.json @@ -0,0 +1,15 @@ +{ + "source": "http://www.geonames.org/ZA/administrative-division-south-africa.html", + "country": "South Africa", + "subdivisions": { + "EC": "Eastern Cape", + "FS": "Free State", + "GT": "Gauteng", + "LP": "Limpopo", + "MP": "Mpumalanga", + "NC": "Northern Cape", + "NL": "KwaZulu-Natal", + "NW": "North West", + "WC": "Western Cape" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/ZM.json b/vendor/workerman/validation/data/iso_3166-2/ZM.json new file mode 100644 index 0000000..6cf8a69 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/ZM.json @@ -0,0 +1,16 @@ +{ + "source": "http://www.geonames.org/ZM/administrative-division-zambia.html", + "country": "Zambia", + "subdivisions": { + "01": "Western Province", + "02": "Central Province", + "03": "Eastern Province", + "04": "Luapula Province", + "05": "Northern Province", + "06": "North-Western Province", + "07": "Southern Province", + "08": "Copperbelt Province", + "09": "Lusaka Province", + "10": "Muchinga" + } +} diff --git a/vendor/workerman/validation/data/iso_3166-2/ZW.json b/vendor/workerman/validation/data/iso_3166-2/ZW.json new file mode 100644 index 0000000..6cb2312 --- /dev/null +++ b/vendor/workerman/validation/data/iso_3166-2/ZW.json @@ -0,0 +1,16 @@ +{ + "source": "http://www.geonames.org/ZW/administrative-division-zimbabwe.html", + "country": "Zimbabwe", + "subdivisions": { + "BU": "Bulawayo (city)", + "HA": "Harare (city)", + "MA": "Manicaland", + "MC": "Mashonaland Central", + "ME": "Mashonaland East", + "MI": "Midlands", + "MN": "Matabeleland North", + "MS": "Matabeleland South", + "MV": "Masvingo", + "MW": "Mashonaland West" + } +} diff --git a/vendor/workerman/validation/library/Exceptions/AllOfException.php b/vendor/workerman/validation/library/Exceptions/AllOfException.php new file mode 100644 index 0000000..4d9be11 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/AllOfException.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +class AllOfException extends GroupedValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::NONE => '{{name}} 必需符合以下规则', + self::SOME => '{{name}} 必需符合以下规则', + ], + self::MODE_NEGATIVE => [ + self::NONE => '{{name}} 不能符合以下规则', + self::SOME => '{{name}} 不能符合以下规则', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/AlnumException.php b/vendor/workerman/validation/library/Exceptions/AlnumException.php new file mode 100644 index 0000000..211fbce --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/AlnumException.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class AlnumException extends FilteredValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 只能包含字母(a-z)和数字(0-9)', + self::EXTRA => '{{name}} 只能包含字母(a-z)、数字(0-9)和 {{additionalChars}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能包含字母(a-z)或数字(0-9)', + self::EXTRA => '{{name}} 不能包含字母(a-z)、数字(0-9)或 {{additionalChars}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/AlphaException.php b/vendor/workerman/validation/library/Exceptions/AlphaException.php new file mode 100644 index 0000000..661f75e --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/AlphaException.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class AlphaException extends FilteredValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 只能包含字母(a-z)', + self::EXTRA => '{{name}} 只能包含字母(a-z)和 {{additionalChars}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能包含字母(a-z)', + self::EXTRA => '{{name}} 不能包含字母(a-z)或 {{additionalChars}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/AlwaysInvalidException.php b/vendor/workerman/validation/library/Exceptions/AlwaysInvalidException.php new file mode 100644 index 0000000..b212252 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/AlwaysInvalidException.php @@ -0,0 +1,38 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class AlwaysInvalidException extends ValidationException +{ + public const SIMPLE = 'simple'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 始终无效', + self::SIMPLE => '{{name}} 无效', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 始终有效', + self::SIMPLE => '{{name}} 有效', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/AlwaysValidException.php b/vendor/workerman/validation/library/Exceptions/AlwaysValidException.php new file mode 100644 index 0000000..136db7a --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/AlwaysValidException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class AlwaysValidException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 始终有效', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 始终无效', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/AnyOfException.php b/vendor/workerman/validation/library/Exceptions/AnyOfException.php new file mode 100644 index 0000000..d05cd95 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/AnyOfException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class AnyOfException extends NestedValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '这些规则中至少有一个必须传递给 {{name}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '这些规则中至少有一个不能传递给 {{name}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/ArrayTypeException.php b/vendor/workerman/validation/library/Exceptions/ArrayTypeException.php new file mode 100644 index 0000000..5e6855e --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ArrayTypeException.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author João Torquato <joao.otl@gmail.com> + */ +final class ArrayTypeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是array类型', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是array类型', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/ArrayValException.php b/vendor/workerman/validation/library/Exceptions/ArrayValException.php new file mode 100644 index 0000000..afe5a34 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ArrayValException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ArrayValException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是数组', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是数组', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/AttributeException.php b/vendor/workerman/validation/library/Exceptions/AttributeException.php new file mode 100644 index 0000000..cf39b9c --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/AttributeException.php @@ -0,0 +1,49 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exceptions to be thrown by the Attribute Rule. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class AttributeException extends NestedValidationException implements NonOmissibleException +{ + public const NOT_PRESENT = 'not_present'; + public const INVALID = 'invalid'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::NOT_PRESENT => '属性 {{name}} 必须存在', + self::INVALID => '属性 {{name}} 必须有效', + ], + self::MODE_NEGATIVE => [ + self::NOT_PRESENT => '属性 {{name}} 不能存在', + self::INVALID => '属性 {{name}} 必须无效', + ], + ]; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + return $this->getParam('hasReference') ? self::INVALID : self::NOT_PRESENT; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/Base64Exception.php b/vendor/workerman/validation/library/Exceptions/Base64Exception.php new file mode 100644 index 0000000..55416cf --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/Base64Exception.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jens Segers <segers.jens@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class Base64Exception extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须采用Base64编码', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是Base64编码', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/BaseException.php b/vendor/workerman/validation/library/Exceptions/BaseException.php new file mode 100644 index 0000000..4f9791f --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/BaseException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Carlos André Ferrari <caferrari@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class BaseException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是基于 {{base}} 中的数字', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是基于 {{base}} 中的数字', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/BetweenException.php b/vendor/workerman/validation/library/Exceptions/BetweenException.php new file mode 100644 index 0000000..4df5176 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/BetweenException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class BetweenException extends NestedValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须介于 {{minValue}} 和 {{maxValue}} 之间', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能介于 {{minValue}} 和 {{maxValue}} 之间', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/BoolTypeException.php b/vendor/workerman/validation/library/Exceptions/BoolTypeException.php new file mode 100644 index 0000000..9bbe402 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/BoolTypeException.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exception class for BoolType rule. + * + * @author Devin Torres <devin@devintorres.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class BoolTypeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是boolean类型', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是boolean类型', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/BoolValException.php b/vendor/workerman/validation/library/Exceptions/BoolValException.php new file mode 100644 index 0000000..ee48241 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/BoolValException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class BoolValException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是布尔值', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是布尔值', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/BsnException.php b/vendor/workerman/validation/library/Exceptions/BsnException.php new file mode 100644 index 0000000..d9e7e01 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/BsnException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Ronald Drenth <ronalddrenth@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class BsnException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是BSN', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是BSN', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/CallException.php b/vendor/workerman/validation/library/Exceptions/CallException.php new file mode 100644 index 0000000..95a2787 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/CallException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class CallException extends NestedValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '当使用 {{callable}} 时 {{input}} 必须有效', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '当使用 {{callable}} 时 {{input}} 必须无效', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/CallableTypeException.php b/vendor/workerman/validation/library/Exceptions/CallableTypeException.php new file mode 100644 index 0000000..897df19 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/CallableTypeException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exception class for CallableType rule. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class CallableTypeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是可调用的', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是可调用的', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/CallbackException.php b/vendor/workerman/validation/library/Exceptions/CallbackException.php new file mode 100644 index 0000000..66f26d4 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/CallbackException.php @@ -0,0 +1,23 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class CallbackException extends NestedValidationException +{ +} diff --git a/vendor/workerman/validation/library/Exceptions/CharsetException.php b/vendor/workerman/validation/library/Exceptions/CharsetException.php new file mode 100644 index 0000000..57634ef --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/CharsetException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class CharsetException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须在 {{charset}} 字符集中', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能在 {{charset}} 字符集中', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/CnhException.php b/vendor/workerman/validation/library/Exceptions/CnhException.php new file mode 100644 index 0000000..2dacf06 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/CnhException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Kinn Coelho Julião <kinncj@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class CnhException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的CNH号码', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的CNH号码', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/CnpjException.php b/vendor/workerman/validation/library/Exceptions/CnpjException.php new file mode 100644 index 0000000..69d08dd --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/CnpjException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Leonn Leite <leonnleite@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class CnpjException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的CNPJ编号', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的CNPJ编号', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/ComponentException.php b/vendor/workerman/validation/library/Exceptions/ComponentException.php new file mode 100644 index 0000000..0f43032 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ComponentException.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +use Exception; +use Throwable; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +class ComponentException extends Exception implements Throwable +{ +} diff --git a/vendor/workerman/validation/library/Exceptions/ConsonantException.php b/vendor/workerman/validation/library/Exceptions/ConsonantException.php new file mode 100644 index 0000000..aa3a901 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ConsonantException.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Kleber Hamada Sato <kleberhs007@yahoo.com> + */ +final class ConsonantException extends FilteredValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 只能包含辅音', + self::EXTRA => '{{name}} 只能包含辅音和 {{additionalChars}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能包含辅音', + self::EXTRA => '{{name}} 不能包含辅音或 {{additionalChars}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/ContainsAnyException.php b/vendor/workerman/validation/library/Exceptions/ContainsAnyException.php new file mode 100644 index 0000000..2b2c9b4 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ContainsAnyException.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Kirill Dlussky <kirill@dlussky.ru> + */ +final class ContainsAnyException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须包含至少一个值 {{needles}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能包含任何值 {{needles}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/ContainsException.php b/vendor/workerman/validation/library/Exceptions/ContainsException.php new file mode 100644 index 0000000..65d8054 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ContainsException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class ContainsException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须包含值 {{containsValue}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能包含值 {{containsValue}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/ControlException.php b/vendor/workerman/validation/library/Exceptions/ControlException.php new file mode 100644 index 0000000..d61c051 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ControlException.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Andre Ramaciotti <andre@ramaciotti.com> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ControlException extends FilteredValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 只能包含控制字符', + self::EXTRA => '{{name}} 只能包含控制字符和 {{additionalChars}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能包含控制字符', + self::EXTRA => '{{name}} 不能包含控制字符或 {{additionalChars}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/CountableException.php b/vendor/workerman/validation/library/Exceptions/CountableException.php new file mode 100644 index 0000000..3d7e8d7 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/CountableException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author João Torquato <joao.otl@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class CountableException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是可数的', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是可数的', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/CountryCodeException.php b/vendor/workerman/validation/library/Exceptions/CountryCodeException.php new file mode 100644 index 0000000..1b8bf82 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/CountryCodeException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class CountryCodeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的国家/地区', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的国家/地区', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/CpfException.php b/vendor/workerman/validation/library/Exceptions/CpfException.php new file mode 100644 index 0000000..5553e9a --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/CpfException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jair Henrique <jair.henrique@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class CpfException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的CPF编号', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的CPF编号', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/CreditCardException.php b/vendor/workerman/validation/library/Exceptions/CreditCardException.php new file mode 100644 index 0000000..3cf7515 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/CreditCardException.php @@ -0,0 +1,52 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +use Respect\Validation\Rules\CreditCard; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jean Pimentel <jeanfap@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class CreditCardException extends ValidationException +{ + public const BRANDED = 'branded'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的信用卡号', + self::BRANDED => '{{name}} 必须是有效的 {{brand}} 信用卡号', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的信用卡号', + self::BRANDED => '{{name}} 不能是有效的 {{brand}} 信用卡号', + ], + ]; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + if ($this->getParam('brand') === CreditCard::ANY) { + return self::STANDARD; + } + + return self::BRANDED; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/CurrencyCodeException.php b/vendor/workerman/validation/library/Exceptions/CurrencyCodeException.php new file mode 100644 index 0000000..e769c99 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/CurrencyCodeException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Justin Hook <justinhook88@yahoo.co.uk> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class CurrencyCodeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的货币', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的货币', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/DateException.php b/vendor/workerman/validation/library/Exceptions/DateException.php new file mode 100644 index 0000000..f9520a0 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/DateException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Bruno Luiz da Silva <contato@brunoluiz.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class DateException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是格式为 {{sample}} 的有效日期', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是格式为 {{sample}} 的日期', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/DateTimeException.php b/vendor/workerman/validation/library/Exceptions/DateTimeException.php new file mode 100644 index 0000000..1e64eec --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/DateTimeException.php @@ -0,0 +1,45 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class DateTimeException extends ValidationException +{ + public const FORMAT = 'format'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的日期/时间', + self::FORMAT => '{{name}} 必须是格式为 {{sample}} 的有效日期/时间', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的日期/时间', + self::FORMAT => '{{name}} 不能是格式为 {{sample}} 的有效日期/时间', + ], + ]; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + return $this->getParam('format') ? self::FORMAT : self::STANDARD; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/DigitException.php b/vendor/workerman/validation/library/Exceptions/DigitException.php new file mode 100644 index 0000000..1ce1bc8 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/DigitException.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class DigitException extends FilteredValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 只能包含数字(0-9)', + self::EXTRA => '{{name}} 只能包含数字(0-9)和 {{additionalChars}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能包含数字(0-9)', + self::EXTRA => '{{name}} 只能包含数字(0-9)和 {{additionalChars}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/DirectoryException.php b/vendor/workerman/validation/library/Exceptions/DirectoryException.php new file mode 100644 index 0000000..f428e49 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/DirectoryException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class DirectoryException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是目录', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是目录', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/DomainException.php b/vendor/workerman/validation/library/Exceptions/DomainException.php new file mode 100644 index 0000000..523b7ca --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/DomainException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class DomainException extends NestedValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效域名', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效域名', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/EachException.php b/vendor/workerman/validation/library/Exceptions/EachException.php new file mode 100644 index 0000000..a8abca1 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/EachException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class EachException extends NestedValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 中的每个项都必须有效', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 中的每个项都必须无效', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/EmailException.php b/vendor/workerman/validation/library/Exceptions/EmailException.php new file mode 100644 index 0000000..19c8563 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/EmailException.php @@ -0,0 +1,38 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exceptions thrown by email rule. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Andrey Kolyshkin <a.kolyshkin@semrush.com> + * @author Eduardo Gulias Davis <me@egulias.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Paul Karikari <paulkarikari1@gmail.com> + */ +final class EmailException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的电子邮件', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是电子邮件', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/EndsWithException.php b/vendor/workerman/validation/library/Exceptions/EndsWithException.php new file mode 100644 index 0000000..ecafd98 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/EndsWithException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class EndsWithException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须以 {{endValue}} 结尾', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能以 {{endValue}} 结尾', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/EqualsException.php b/vendor/workerman/validation/library/Exceptions/EqualsException.php new file mode 100644 index 0000000..4b0a73b --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/EqualsException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Ian Nisbet <ian@glutenite.co.uk> + */ +final class EqualsException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须等于 {{compareTo}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能等于 {{compareTo}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/EquivalentException.php b/vendor/workerman/validation/library/Exceptions/EquivalentException.php new file mode 100644 index 0000000..5595a0f --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/EquivalentException.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class EquivalentException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须与 {{compareTo}} 相等', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能与 {{compareTo}} 相等', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/EvenException.php b/vendor/workerman/validation/library/Exceptions/EvenException.php new file mode 100644 index 0000000..6d50a0a --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/EvenException.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exceptions to be thrown by the Even Rule. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jean Pimentel <jeanfap@gmail.com> + * @author Paul Karikari <paulkarikari1@gmail.com> + */ +final class EvenException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是偶数', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是偶数', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/Exception.php b/vendor/workerman/validation/library/Exceptions/Exception.php new file mode 100644 index 0000000..14c0930 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/Exception.php @@ -0,0 +1,24 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +use Throwable; + +/** + * @author Andy Wendt <andy@awendt.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +interface Exception extends Throwable +{ +} diff --git a/vendor/workerman/validation/library/Exceptions/ExecutableException.php b/vendor/workerman/validation/library/Exceptions/ExecutableException.php new file mode 100644 index 0000000..8ac96c3 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ExecutableException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class ExecutableException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是可执行文件', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是可执行文件', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/ExistsException.php b/vendor/workerman/validation/library/Exceptions/ExistsException.php new file mode 100644 index 0000000..50ceb9a --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ExistsException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class ExistsException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须存在', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能存在', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/ExtensionException.php b/vendor/workerman/validation/library/Exceptions/ExtensionException.php new file mode 100644 index 0000000..9374e84 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ExtensionException.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exception class for Extension rule. + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ExtensionException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是 {{extension}} 后缀', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是 {{extension}} 后缀', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/FactorException.php b/vendor/workerman/validation/library/Exceptions/FactorException.php new file mode 100644 index 0000000..40de6b0 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/FactorException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Correa <danilosilva87@gmail.com> + * @author David Meister <thedavidmeister@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class FactorException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是 {{dividend}} 的因子', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是 {{dividend}} 的因子', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/FalseValException.php b/vendor/workerman/validation/library/Exceptions/FalseValException.php new file mode 100644 index 0000000..bbcc128 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/FalseValException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class FalseValException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 不被视为 "False"', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 可视为 "False"', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/FibonacciException.php b/vendor/workerman/validation/library/Exceptions/FibonacciException.php new file mode 100644 index 0000000..bcbbf29 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/FibonacciException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Samuel Heinzmann <samuel.heinzmann@swisscom.com> + */ +final class FibonacciException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的斐波纳契数', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的斐波纳契数', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/FileException.php b/vendor/workerman/validation/library/Exceptions/FileException.php new file mode 100644 index 0000000..70cf81b --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/FileException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class FileException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是文件', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是文件', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/FilterVarException.php b/vendor/workerman/validation/library/Exceptions/FilterVarException.php new file mode 100644 index 0000000..07d52ee --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/FilterVarException.php @@ -0,0 +1,21 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class FilterVarException extends ValidationException +{ +} diff --git a/vendor/workerman/validation/library/Exceptions/FilteredValidationException.php b/vendor/workerman/validation/library/Exceptions/FilteredValidationException.php new file mode 100644 index 0000000..e11cea8 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/FilteredValidationException.php @@ -0,0 +1,30 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +class FilteredValidationException extends ValidationException +{ + public const EXTRA = 'extra'; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + return $this->getParam('additionalChars') ? self::EXTRA : self::STANDARD; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/FiniteException.php b/vendor/workerman/validation/library/Exceptions/FiniteException.php new file mode 100644 index 0000000..f07afc7 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/FiniteException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class FiniteException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有限数', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有限数', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/FloatTypeException.php b/vendor/workerman/validation/library/Exceptions/FloatTypeException.php new file mode 100644 index 0000000..5989937 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/FloatTypeException.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exception class for FloatType rule. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Reginaldo Junior <76regi@gmail.com> + */ +final class FloatTypeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是float类型', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是float类型', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/FloatValException.php b/vendor/workerman/validation/library/Exceptions/FloatValException.php new file mode 100644 index 0000000..5070177 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/FloatValException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class FloatValException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是浮点数', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是浮点数', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/GraphException.php b/vendor/workerman/validation/library/Exceptions/GraphException.php new file mode 100644 index 0000000..a99e023 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/GraphException.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Andre Ramaciotti <andre@ramaciotti.com> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class GraphException extends FilteredValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 只能包含图形字符', + self::EXTRA => '{{name}} 只能包含图形字符和 {{additionalChars}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能包含图形字符', + self::EXTRA => '{{name}} 不能包含图形字符或 {{additionalChars}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/GreaterThanException.php b/vendor/workerman/validation/library/Exceptions/GreaterThanException.php new file mode 100644 index 0000000..079a7bd --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/GreaterThanException.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class GreaterThanException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须大于 {{compareTo}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能大于 {{compareTo}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/GroupedValidationException.php b/vendor/workerman/validation/library/Exceptions/GroupedValidationException.php new file mode 100644 index 0000000..142ea30 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/GroupedValidationException.php @@ -0,0 +1,51 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +use function count; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +class GroupedValidationException extends NestedValidationException +{ + public const NONE = 'none'; + public const SOME = 'some'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::NONE => '所有必需的规则都必须传递给 {{name}}', + self::SOME => '这些规则必须传递给 {{name}}', + ], + self::MODE_NEGATIVE => [ + self::NONE => '所有规则都不能传递给 {{name}}', + self::SOME => '这些规则不能传递给 {{name}}', + ], + ]; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + $numRules = $this->getParam('passed'); + $numFailed = count($this->getChildren()); + + return $numRules === $numFailed ? self::NONE : self::SOME; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/HexRgbColorException.php b/vendor/workerman/validation/library/Exceptions/HexRgbColorException.php new file mode 100644 index 0000000..b201f4a --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/HexRgbColorException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Davide Pastore <pasdavide@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class HexRgbColorException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是十六进制RGB颜色', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是十六进制RGB颜色', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/IbanException.php b/vendor/workerman/validation/library/Exceptions/IbanException.php new file mode 100644 index 0000000..fc49904 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/IbanException.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Mazen Touati <mazen_touati@hotmail.com> + */ +final class IbanException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的IBAN', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的IBAN', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/IdenticalException.php b/vendor/workerman/validation/library/Exceptions/IdenticalException.php new file mode 100644 index 0000000..63d6e65 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/IdenticalException.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class IdenticalException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须与 {{compareTo}} 相同', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能与 {{compareTo}} 相同', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/ImageException.php b/vendor/workerman/validation/library/Exceptions/ImageException.php new file mode 100644 index 0000000..ebc38f5 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ImageException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Guilherme Siani <guilherme@siani.com.br> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ImageException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的图像', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的图像', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/ImeiException.php b/vendor/workerman/validation/library/Exceptions/ImeiException.php new file mode 100644 index 0000000..355594d --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ImeiException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Diego Oliveira <contato@diegoholiveira.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ImeiException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的IMEI', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的IMEI', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/InException.php b/vendor/workerman/validation/library/Exceptions/InException.php new file mode 100644 index 0000000..fa2ddc4 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/InException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class InException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须在 {{haystack}} 中', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能在 {{haystack}} 中', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/InfiniteException.php b/vendor/workerman/validation/library/Exceptions/InfiniteException.php new file mode 100644 index 0000000..0c380e3 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/InfiniteException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class InfiniteException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是无穷大的数字', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是无穷大的数字', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/InstanceException.php b/vendor/workerman/validation/library/Exceptions/InstanceException.php new file mode 100644 index 0000000..507c481 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/InstanceException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class InstanceException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是 {{instanceName}} 的实例', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是 {{instanceName}} 的实例', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/IntTypeException.php b/vendor/workerman/validation/library/Exceptions/IntTypeException.php new file mode 100644 index 0000000..696180f --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/IntTypeException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exception class for IntType rule. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class IntTypeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是integer类型', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是integer类型', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/IntValException.php b/vendor/workerman/validation/library/Exceptions/IntValException.php new file mode 100644 index 0000000..d75a777 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/IntValException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class IntValException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是整数', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是整数', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/InvalidClassException.php b/vendor/workerman/validation/library/Exceptions/InvalidClassException.php new file mode 100644 index 0000000..015c8ea --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/InvalidClassException.php @@ -0,0 +1,25 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exception for invalid classes. + * + * @since 2.0.0 + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class InvalidClassException extends ComponentException +{ +} diff --git a/vendor/workerman/validation/library/Exceptions/IpException.php b/vendor/workerman/validation/library/Exceptions/IpException.php new file mode 100644 index 0000000..8be5fd5 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/IpException.php @@ -0,0 +1,51 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Luís Otávio Cobucci Oblonczyk <lcobucci@gmail.com> + */ +final class IpException extends ValidationException +{ + public const NETWORK_RANGE = 'network_range'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是IP地址', + self::NETWORK_RANGE => '{{name}} 必须是 {{range}} 范围内的IP地址', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是IP地址', + self::NETWORK_RANGE => '{{name}} 不能是 {{range}} 范围内的IP地址', + ], + ]; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + if (!$this->getParam('range')) { + return self::STANDARD; + } + + return self::NETWORK_RANGE; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/IsbnException.php b/vendor/workerman/validation/library/Exceptions/IsbnException.php new file mode 100644 index 0000000..8385c69 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/IsbnException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Moritz Fromm <moritzgitfromm@gmail.com> + */ +final class IsbnException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是ISBN', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是ISBN', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/IterableTypeException.php b/vendor/workerman/validation/library/Exceptions/IterableTypeException.php new file mode 100644 index 0000000..be3a345 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/IterableTypeException.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class IterableTypeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是可迭代的', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是可迭代的', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/JsonException.php b/vendor/workerman/validation/library/Exceptions/JsonException.php new file mode 100644 index 0000000..505e480 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/JsonException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class JsonException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的JSON字符串', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的JSON字符串', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/KeyException.php b/vendor/workerman/validation/library/Exceptions/KeyException.php new file mode 100644 index 0000000..236d406 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/KeyException.php @@ -0,0 +1,49 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exceptions to be thrown by the Attribute Rule. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class KeyException extends NestedValidationException implements NonOmissibleException +{ + public const NOT_PRESENT = 'not_present'; + public const INVALID = 'invalid'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::NOT_PRESENT => '键 {{name}} 必须存在', + self::INVALID => '键 {{name}} 必须有效', + ], + self::MODE_NEGATIVE => [ + self::NOT_PRESENT => '键 {{name}} 不能存在', + self::INVALID => '键 {{name}} 必须无效', + ], + ]; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + return $this->getParam('hasReference') ? self::INVALID : self::NOT_PRESENT; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/KeyNestedException.php b/vendor/workerman/validation/library/Exceptions/KeyNestedException.php new file mode 100644 index 0000000..f4ec557 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/KeyNestedException.php @@ -0,0 +1,49 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exceptions to be thrown by the Attribute Rule. + * + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Ivan Zinovyev <vanyazin@gmail.com> + */ +final class KeyNestedException extends NestedValidationException implements NonOmissibleException +{ + public const NOT_PRESENT = 'not_present'; + public const INVALID = 'invalid'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::NOT_PRESENT => '找不到密钥链 {{name}} 的项', + self::INVALID => '密钥链 {{name}} 无效', + ], + self::MODE_NEGATIVE => [ + self::NOT_PRESENT => '密钥链 {{name}} 的项不存在', + self::INVALID => '密钥链 {{name}} 必须无效', + ], + ]; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + return $this->getParam('hasReference') ? self::INVALID : self::NOT_PRESENT; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/KeySetException.php b/vendor/workerman/validation/library/Exceptions/KeySetException.php new file mode 100644 index 0000000..f71ceb3 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/KeySetException.php @@ -0,0 +1,52 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +use function count; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class KeySetException extends GroupedValidationException implements NonOmissibleException +{ + public const STRUCTURE = 'structure'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::NONE => '所有必需的规则都必须传递给 {{name}}', + self::SOME => '这些规则必须传递给 {{name}}', + self::STRUCTURE => '必须有键 {{keys}}', + ], + self::MODE_NEGATIVE => [ + self::NONE => '这些规则都不能传递给 {{name}}', + self::SOME => '这些规则不能传递给 {{name}}', + self::STRUCTURE => '不能有键 {{keys}}', + ], + ]; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + if (count($this->getChildren()) === 0) { + return self::STRUCTURE; + } + + return parent::chooseTemplate(); + } +} diff --git a/vendor/workerman/validation/library/Exceptions/KeyValueException.php b/vendor/workerman/validation/library/Exceptions/KeyValueException.php new file mode 100644 index 0000000..e11a2b4 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/KeyValueException.php @@ -0,0 +1,41 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class KeyValueException extends ValidationException +{ + public const COMPONENT = 'component'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '键 {{name}} 必须存在', + self::COMPONENT => '{{baseKey}} 必须有效才能验证 {{comparedKey}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '键 {{name}} 不能存在', + self::COMPONENT => '{{baseKey}} 必须无效才能验证 {{comparedKey}}', + ], + ]; + + protected function chooseTemplate(): string + { + return $this->getParam('component') ? self::COMPONENT : self::STANDARD; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/LanguageCodeException.php b/vendor/workerman/validation/library/Exceptions/LanguageCodeException.php new file mode 100644 index 0000000..71d3e76 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/LanguageCodeException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class LanguageCodeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的 ISO 639 {{set}} 语言编码', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的 ISO 639 {{set}} 语言编码', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/LeapDateException.php b/vendor/workerman/validation/library/Exceptions/LeapDateException.php new file mode 100644 index 0000000..e313a16 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/LeapDateException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class LeapDateException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是闰日', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是闰日', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/LeapYearException.php b/vendor/workerman/validation/library/Exceptions/LeapYearException.php new file mode 100644 index 0000000..dd86d6b --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/LeapYearException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class LeapYearException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是闰年', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是闰年', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/LengthException.php b/vendor/workerman/validation/library/Exceptions/LengthException.php new file mode 100644 index 0000000..248000d --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/LengthException.php @@ -0,0 +1,74 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Mazen Touati <mazen_touati@hotmail.com> + */ +final class LengthException extends ValidationException +{ + public const BOTH = 'both'; + public const LOWER = 'lower'; + public const LOWER_INCLUSIVE = 'lower_inclusive'; + public const GREATER = 'greater'; + public const GREATER_INCLUSIVE = 'greater_inclusive'; + public const EXACT = 'exact'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::BOTH => '{{name}} 长度必须在 {{minValue}} 与 {{maxValue}} 之间', + self::LOWER => '{{name}} 长度必须大于 {{minValue}}', + self::LOWER_INCLUSIVE => '{{name}} 的长度必须大于或等于 {{minValue}}', + self::GREATER => '{{name}} 长度必须小于 {{maxValue}}', + self::GREATER_INCLUSIVE => '{{name}} 长度必须小于或等于 {{maxValue}}', + self::EXACT => '{{name}} 长度必须是 {{maxValue}}', + ], + self::MODE_NEGATIVE => [ + self::BOTH => '{{name}} 的长度不能介于 {{minValue}} 和 {{maxValue}} 之间', + self::LOWER => '{{name}} 长度不能大于 {{minValue}}', + self::LOWER_INCLUSIVE => '{{name}} 长度不能大于或等于 {{minValue}}', + self::GREATER => '{{name}} 长度不得小于 {{maxValue}}', + self::GREATER_INCLUSIVE => '{{name}} 长度不能小于或等于 {{maxValue}}', + self::EXACT => '{{name}} 长度不能是 {{maxValue}}', + ], + ]; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + $isInclusive = $this->getParam('inclusive'); + + if (!$this->getParam('minValue')) { + return $isInclusive === true ? self::GREATER_INCLUSIVE : self::GREATER; + } + + if (!$this->getParam('maxValue')) { + return $isInclusive === true ? self::LOWER_INCLUSIVE : self::LOWER; + } + + if ($this->getParam('minValue') == $this->getParam('maxValue')) { + return self::EXACT; + } + + return self::BOTH; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/LessThanException.php b/vendor/workerman/validation/library/Exceptions/LessThanException.php new file mode 100644 index 0000000..daa77fd --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/LessThanException.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class LessThanException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须小于 {{compareTo}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能小于 {{compareTo}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/LowercaseException.php b/vendor/workerman/validation/library/Exceptions/LowercaseException.php new file mode 100644 index 0000000..3cb0295 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/LowercaseException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jean Pimentel <jeanfap@gmail.com> + */ +final class LowercaseException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是小写', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是小写', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/LuhnException.php b/vendor/workerman/validation/library/Exceptions/LuhnException.php new file mode 100644 index 0000000..fce455c --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/LuhnException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexander Gorshkov <mazanax@yandex.ru> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class LuhnException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的Luhn编号', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的Luhn编号', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/MacAddressException.php b/vendor/workerman/validation/library/Exceptions/MacAddressException.php new file mode 100644 index 0000000..79797b8 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/MacAddressException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Fábio da Silva Ribeiro <fabiorphp@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class MacAddressException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的MAC地址', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的MAC地址', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/MaxAgeException.php b/vendor/workerman/validation/library/Exceptions/MaxAgeException.php new file mode 100644 index 0000000..d0e574b --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/MaxAgeException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class MaxAgeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是 {{age}} 年或者更少', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是 {{age}} 年或者更少', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/MaxException.php b/vendor/workerman/validation/library/Exceptions/MaxException.php new file mode 100644 index 0000000..ad2d6e3 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/MaxException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Andrew Peters <amp343@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class MaxException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须小于或等于 {{compareTo}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能小于或等于 {{compareTo}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/MimetypeException.php b/vendor/workerman/validation/library/Exceptions/MimetypeException.php new file mode 100644 index 0000000..366ba89 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/MimetypeException.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exception class for Mimetype rule. + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class MimetypeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须具有 {{mimetype}} MIME类型', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能有 {{mimetype}} MIME类型', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/MinAgeException.php b/vendor/workerman/validation/library/Exceptions/MinAgeException.php new file mode 100644 index 0000000..fcf61e3 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/MinAgeException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jean Pimentel <jeanfap@gmail.com> + */ +final class MinAgeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是 {{age}} 必须是年或以上', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是 {{age}} 年或更长', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/MinException.php b/vendor/workerman/validation/library/Exceptions/MinException.php new file mode 100644 index 0000000..7cfb856 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/MinException.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class MinException extends ValidationException +{ + public const INCLUSIVE = 'inclusive'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须大于或等于 {{compareTo}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能大于或等于 {{compareTo}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/MultipleException.php b/vendor/workerman/validation/library/Exceptions/MultipleException.php new file mode 100644 index 0000000..9254f82 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/MultipleException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jean Pimentel <jeanfap@gmail.com> + */ +final class MultipleException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是 {{multipleOf}} 的倍数', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是 {{multipleOf}} 的倍数', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/NegativeException.php b/vendor/workerman/validation/library/Exceptions/NegativeException.php new file mode 100644 index 0000000..aaead87 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NegativeException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Ismael Elias <ismael.esq@hotmail.com> + */ +final class NegativeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须为负数', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能为负数', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/NestedValidationException.php b/vendor/workerman/validation/library/Exceptions/NestedValidationException.php new file mode 100644 index 0000000..25ab54f --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NestedValidationException.php @@ -0,0 +1,252 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +use IteratorAggregate; +use RecursiveIteratorIterator; +use SplObjectStorage; + +use function array_shift; +use function count; +use function current; +use function implode; +use function is_array; +use function spl_object_hash; +use function sprintf; +use function str_repeat; + +use const PHP_EOL; + +/** + * Exception for nested validations. + * + * This exception allows to have exceptions inside itself and providers methods + * to handle them and to retrieve nested messages based on itself and its + * children. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jonathan Stewmon <jstewmon@rmn.com> + * @author Wojciech Frącz <fraczwojciech@gmail.com> + */ +class NestedValidationException extends ValidationException implements IteratorAggregate +{ + /** + * @var ValidationException[] + */ + private $exceptions = []; + + /** + * Returns the exceptions that are children of the exception. + * + * @return ValidationException[] + */ + public function getChildren(): array + { + return $this->exceptions; + } + + /** + * Adds a child to the exception. + */ + public function addChild(ValidationException $exception): self + { + $this->exceptions[spl_object_hash($exception)] = $exception; + + return $this; + } + + /** + * Adds children to the exception. + * + * @param ValidationException[] $exceptions + */ + public function addChildren(array $exceptions): self + { + foreach ($exceptions as $exception) { + $this->addChild($exception); + } + + return $this; + } + + public function getIterator(): SplObjectStorage + { + $childrenExceptions = new SplObjectStorage(); + $recursiveIteratorIterator = $this->getRecursiveIterator(); + + $lastDepth = 0; + $lastDepthOriginal = 0; + $knownDepths = []; + foreach ($recursiveIteratorIterator as $childException) { + if ($this->isOmissible($childException)) { + continue; + } + + $currentDepth = $lastDepth; + $currentDepthOriginal = $recursiveIteratorIterator->getDepth() + 1; + + if (isset($knownDepths[$currentDepthOriginal])) { + $currentDepth = $knownDepths[$currentDepthOriginal]; + } elseif ($currentDepthOriginal > $lastDepthOriginal) { + ++$currentDepth; + } + + if (!isset($knownDepths[$currentDepthOriginal])) { + $knownDepths[$currentDepthOriginal] = $currentDepth; + } + + $lastDepth = $currentDepth; + $lastDepthOriginal = $currentDepthOriginal; + + $childrenExceptions->attach($childException, $currentDepth); + } + + return $childrenExceptions; + } + + /** + * Returns a key->value array with all the messages of the exception. + * + * In this array the "keys" are the ids of the exceptions (defined name or + * name of the rule) and the values are the message. + * + * Once templates are passed it overwrites the templates of the given + * messages. + * + * @param string[]|string[][] $templates + * + * @return string[] + */ + public function getMessages(array $templates = []): array + { + $messages = [$this->getId() => $this->renderMessage($this, $templates)]; + foreach ($this->getChildren() as $exception) { + $id = $exception->getId(); + if (!$exception instanceof self) { + $messages[$id] = $this->renderMessage( + $exception, + $this->findTemplates($templates, $this->getId()) + ); + continue; + } + + $messages[$id] = $exception->getMessages($this->findTemplates($templates, $id, $this->getId())); + if (count($messages[$id]) > 1) { + continue; + } + + $messages[$id] = current($messages[$exception->getId()]); + } + + if (count($messages) > 1) { + unset($messages[$this->getId()]); + } + + return $messages; + } + + /** + * Returns a string with all the messages of the exception. + */ + public function getFullMessage(): string + { + $messages = []; + $leveler = 1; + + if (!$this->isOmissible($this)) { + $leveler = 0; + $messages[] = sprintf('- %s', $this->getMessage()); + } + + $exceptions = $this->getIterator(); + /** @var ValidationException $exception */ + foreach ($exceptions as $exception) { + $messages[] = sprintf( + '%s- %s', + str_repeat(' ', (int) ($exceptions[$exception] - $leveler) * 2), + $exception->getMessage() + ); + } + + return implode(PHP_EOL, $messages); + } + + private function getRecursiveIterator(): RecursiveIteratorIterator + { + return new RecursiveIteratorIterator( + new RecursiveExceptionIterator($this), + RecursiveIteratorIterator::SELF_FIRST + ); + } + + private function isOmissible(Exception $exception): bool + { + if (!$exception instanceof self) { + return false; + } + + if (count($exception->getChildren()) !== 1) { + return false; + } + + /** @var ValidationException $childException */ + $childException = current($exception->getChildren()); + if ($childException->getMessage() === $exception->getMessage()) { + return true; + } + + if ($exception->hasCustomTemplate()) { + return $childException->hasCustomTemplate(); + } + + return !$childException instanceof NonOmissibleException; + } + + /** + * @param string[] $templates + */ + private function renderMessage(ValidationException $exception, array $templates): string + { + if (isset($templates[$exception->getId()])) { + $exception->updateTemplate($templates[$exception->getId()]); + } + + return $exception->getMessage(); + } + + /** + * @param string[] $templates + * @param mixed ...$ids + * + * @return string[] + */ + private function findTemplates(array $templates, ...$ids): array + { + while (count($ids) > 0) { + $id = array_shift($ids); + if (!isset($templates[$id])) { + continue; + } + + if (!is_array($templates[$id])) { + continue; + } + + $templates = $templates[$id]; + } + + return $templates; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/NfeAccessKeyException.php b/vendor/workerman/validation/library/Exceptions/NfeAccessKeyException.php new file mode 100644 index 0000000..9cd9ab1 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NfeAccessKeyException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Andrey Knupp Vital <andreykvital@gmail.com> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NfeAccessKeyException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的NFe访问密钥', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的NFe访问密钥', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/NifException.php b/vendor/workerman/validation/library/Exceptions/NifException.php new file mode 100644 index 0000000..26148e3 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NifException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Julián Gutiérrez <juliangut@gmail.com> + */ +final class NifException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是NIF', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是NIF', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/NipException.php b/vendor/workerman/validation/library/Exceptions/NipException.php new file mode 100644 index 0000000..8fe7f52 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NipException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Tomasz Regdos <tomek@regdos.com> + */ +final class NipException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的波兰增值税标识号', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的波兰增值税标识号', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/NoException.php b/vendor/workerman/validation/library/Exceptions/NoException.php new file mode 100644 index 0000000..c874693 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NoException.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NoException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 不被视为 "否"', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 被认为是 "否"', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/NoWhitespaceException.php b/vendor/workerman/validation/library/Exceptions/NoWhitespaceException.php new file mode 100644 index 0000000..766a76d --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NoWhitespaceException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NoWhitespaceException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 不能包含空格', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 必须包含空格', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/NonOmissibleException.php b/vendor/workerman/validation/library/Exceptions/NonOmissibleException.php new file mode 100644 index 0000000..ca32efc --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NonOmissibleException.php @@ -0,0 +1,22 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Andy Wendt <andy@awendt.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +interface NonOmissibleException extends Exception +{ +} diff --git a/vendor/workerman/validation/library/Exceptions/NoneOfException.php b/vendor/workerman/validation/library/Exceptions/NoneOfException.php new file mode 100644 index 0000000..ae45ea6 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NoneOfException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NoneOfException extends NestedValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '这些规则都不能传递给 {{name}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '所有这些规则都必须传递给 {{name}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/NotBlankException.php b/vendor/workerman/validation/library/Exceptions/NotBlankException.php new file mode 100644 index 0000000..69905ea --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NotBlankException.php @@ -0,0 +1,49 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NotBlankException extends ValidationException +{ + public const NAMED = 'named'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '值不能为空', + self::NAMED => '{{name}} 不能为空', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '值必须为空', + self::NAMED => '{{name}} 必须为空', + ], + ]; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + if ($this->getParam('input') || $this->getParam('name')) { + return self::NAMED; + } + + return self::STANDARD; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/NotEmojiException.php b/vendor/workerman/validation/library/Exceptions/NotEmojiException.php new file mode 100644 index 0000000..65a0f16 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NotEmojiException.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Mazen Touati <mazen_touati@hotmail.com> + */ +final class NotEmojiException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 不能包含表情符号', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 必须包含表情符号', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/NotEmptyException.php b/vendor/workerman/validation/library/Exceptions/NotEmptyException.php new file mode 100644 index 0000000..ddfe99a --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NotEmptyException.php @@ -0,0 +1,50 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Bram Van der Sype <bram.vandersype@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NotEmptyException extends ValidationException +{ + public const NAMED = 'named'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '值不能为空', + self::NAMED => '{{name}} 不能为空', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '值必须为空', + self::NAMED => '{{name}} 必须为空', + ], + ]; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + if ($this->getParam('input') || $this->getParam('name')) { + return self::NAMED; + } + + return self::STANDARD; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/NotException.php b/vendor/workerman/validation/library/Exceptions/NotException.php new file mode 100644 index 0000000..a9f4cb6 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NotException.php @@ -0,0 +1,22 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NotException extends GroupedValidationException +{ +} diff --git a/vendor/workerman/validation/library/Exceptions/NotOptionalException.php b/vendor/workerman/validation/library/Exceptions/NotOptionalException.php new file mode 100644 index 0000000..069d5f6 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NotOptionalException.php @@ -0,0 +1,49 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NotOptionalException extends ValidationException +{ + public const NAMED = 'named'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '该值不能是可选的', + self::NAMED => '{{name}} 不能是可选的', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '该值必须是可选的', + self::NAMED => '{{name}} 必须是可选的', + ], + ]; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + if ($this->getParam('input') || $this->getParam('name')) { + return self::NAMED; + } + + return self::STANDARD; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/NullTypeException.php b/vendor/workerman/validation/library/Exceptions/NullTypeException.php new file mode 100644 index 0000000..0daf24a --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NullTypeException.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exception class for NullType. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NullTypeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须为 null', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能为 null', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/NullableException.php b/vendor/workerman/validation/library/Exceptions/NullableException.php new file mode 100644 index 0000000..883fab3 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NullableException.php @@ -0,0 +1,49 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jens Segers <segers.jens@gmail.com> + */ +final class NullableException extends ValidationException +{ + public const NAMED = 'named'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '值必须为nullable', + self::NAMED => '{{name}} 必须为nullable', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '值不能为null', + self::NAMED => '{{name}} 不能为null', + ], + ]; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + if ($this->getParam('input') || $this->getParam('name')) { + return self::NAMED; + } + + return self::STANDARD; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/NumberException.php b/vendor/workerman/validation/library/Exceptions/NumberException.php new file mode 100644 index 0000000..bb8a273 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NumberException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Ismael Elias <ismael.esq@hotmail.com> + * @author Vitaliy <reboot.m@gmail.com> + */ +final class NumberException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是数字', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能为数字', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/NumericValException.php b/vendor/workerman/validation/library/Exceptions/NumericValException.php new file mode 100644 index 0000000..543d8ea --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/NumericValException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NumericValException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是数字', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是数字', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/ObjectTypeException.php b/vendor/workerman/validation/library/Exceptions/ObjectTypeException.php new file mode 100644 index 0000000..c7dc4b4 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ObjectTypeException.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exception class for ObjectType rule. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ObjectTypeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是object类型', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是object类型', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/OddException.php b/vendor/workerman/validation/library/Exceptions/OddException.php new file mode 100644 index 0000000..29a3d53 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/OddException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jean Pimentel <jeanfap@gmail.com> + */ +final class OddException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是奇数', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是奇数', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/OneOfException.php b/vendor/workerman/validation/library/Exceptions/OneOfException.php new file mode 100644 index 0000000..4fe001b --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/OneOfException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Bradyn Poulsen <bradyn@bradynpoulsen.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class OneOfException extends NestedValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '这些规则中只有一个必须传递给 {{name}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '这些规则中只有一个不能传递给 {{name}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/OptionalException.php b/vendor/workerman/validation/library/Exceptions/OptionalException.php new file mode 100644 index 0000000..b20625a --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/OptionalException.php @@ -0,0 +1,41 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class OptionalException extends ValidationException +{ + public const NAMED = 'named'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '该值必须是可选的', + self::NAMED => '{{name}} 必须是可选的', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '该值不能是可选的', + self::NAMED => '{{name}} 不能是可选的', + ], + ]; + + protected function chooseTemplate(): string + { + return $this->getParam('name') ? self::NAMED : self::STANDARD; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/PerfectSquareException.php b/vendor/workerman/validation/library/Exceptions/PerfectSquareException.php new file mode 100644 index 0000000..7f29919 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/PerfectSquareException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Kleber Hamada Sato <kleberhs007@yahoo.com> + */ +final class PerfectSquareException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的完全正方形', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的完全正方形', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/PeselException.php b/vendor/workerman/validation/library/Exceptions/PeselException.php new file mode 100644 index 0000000..a2b74c7 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/PeselException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Tomasz Regdos <tomek@regdos.com> + */ +final class PeselException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的比索', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的比索', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/PhoneException.php b/vendor/workerman/validation/library/Exceptions/PhoneException.php new file mode 100644 index 0000000..0859b45 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/PhoneException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Michael Firsikov <michael.firsikov@gmail.com> + */ +final class PhoneException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的电话号码', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的电话号码', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/PhpLabelException.php b/vendor/workerman/validation/library/Exceptions/PhpLabelException.php new file mode 100644 index 0000000..2a0144b --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/PhpLabelException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class PhpLabelException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的PHP标签', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的PHP标签', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/PisException.php b/vendor/workerman/validation/library/Exceptions/PisException.php new file mode 100644 index 0000000..4812d8d --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/PisException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Bruno Koga <brunokoga187@gmail.com> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class PisException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的PIS编号', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的PIS编号', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/PolishIdCardException.php b/vendor/workerman/validation/library/Exceptions/PolishIdCardException.php new file mode 100644 index 0000000..acd22a2 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/PolishIdCardException.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class PolishIdCardException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的波兰身份证号码', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的波兰身份证号码r', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/PositiveException.php b/vendor/workerman/validation/library/Exceptions/PositiveException.php new file mode 100644 index 0000000..3d063aa --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/PositiveException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Ismael Elias <ismael.esq@hotmail.com> + */ +final class PositiveException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须为正', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能为正', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/PostalCodeException.php b/vendor/workerman/validation/library/Exceptions/PostalCodeException.php new file mode 100644 index 0000000..11f317a --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/PostalCodeException.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class PostalCodeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是 {{countryCode}} 上的有效邮政编码', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是 {{countryCode}} 上的有效邮政编码', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/PrimeNumberException.php b/vendor/workerman/validation/library/Exceptions/PrimeNumberException.php new file mode 100644 index 0000000..d7672ec --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/PrimeNumberException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Ismael Elias <ismael.esq@hotmail.com> + * @author Kleber Hamada Sato <kleberhs007@yahoo.com> + */ +final class PrimeNumberException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的质数', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的质数', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/PrintableException.php b/vendor/workerman/validation/library/Exceptions/PrintableException.php new file mode 100644 index 0000000..d992cad --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/PrintableException.php @@ -0,0 +1,39 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exceptions to be thrown by the Printable Rule. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Andre Ramaciotti <andre@ramaciotti.com> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class PrintableException extends FilteredValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 只能包含可打印字符', + self::EXTRA => '{{name}} 只能包含可打印字符和 "{{additionalChars}}"', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能包含可打印字符', + self::EXTRA => '{{name}} 不能包含可打印字符或 "{{additionalChars}}"', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/PunctException.php b/vendor/workerman/validation/library/Exceptions/PunctException.php new file mode 100644 index 0000000..55e7e1e --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/PunctException.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Andre Ramaciotti <andre@ramaciotti.com> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class PunctException extends FilteredValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 只能包含标点符号', + self::EXTRA => '{{name}} 只能包含标点符号和 {{additionalChars}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能包含标点符号', + self::EXTRA => '{{name}} 不能包含标点符号或 {{additionalChars}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/ReadableException.php b/vendor/workerman/validation/library/Exceptions/ReadableException.php new file mode 100644 index 0000000..cadf952 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ReadableException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ReadableException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须可读', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能可读', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/RecursiveExceptionIterator.php b/vendor/workerman/validation/library/Exceptions/RecursiveExceptionIterator.php new file mode 100644 index 0000000..bd4d84c --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/RecursiveExceptionIterator.php @@ -0,0 +1,87 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +use ArrayIterator; +use Countable; +use RecursiveIterator; +use UnexpectedValueException; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class RecursiveExceptionIterator implements RecursiveIterator, Countable +{ + /** + * @var ArrayIterator|ValidationException[] + */ + private $exceptions; + + public function __construct(NestedValidationException $parent) + { + $this->exceptions = new ArrayIterator($parent->getChildren()); + } + + public function count(): int + { + return $this->exceptions->count(); + } + + public function hasChildren(): bool + { + if (!$this->valid()) { + return false; + } + + return $this->current() instanceof NestedValidationException; + } + + public function getChildren(): self + { + $exception = $this->current(); + if (!$exception instanceof NestedValidationException) { + throw new UnexpectedValueException(); + } + + return new static($exception); + } + + /** + * @return ValidationException|NestedValidationException + */ + public function current(): ValidationException + { + return $this->exceptions->current(); + } + + public function key(): int + { + return $this->exceptions->key(); + } + + public function next(): void + { + $this->exceptions->next(); + } + + public function rewind(): void + { + $this->exceptions->rewind(); + } + + public function valid(): bool + { + return $this->exceptions->valid(); + } +} diff --git a/vendor/workerman/validation/library/Exceptions/RegexException.php b/vendor/workerman/validation/library/Exceptions/RegexException.php new file mode 100644 index 0000000..78ae986 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/RegexException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class RegexException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 对照 {{regex}} 进行验证', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能针对 {{regex}} 进行验证', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/ResourceTypeException.php b/vendor/workerman/validation/library/Exceptions/ResourceTypeException.php new file mode 100644 index 0000000..4864118 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ResourceTypeException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exception class for ResourceType. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ResourceTypeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是资源', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是资源', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/RomanException.php b/vendor/workerman/validation/library/Exceptions/RomanException.php new file mode 100644 index 0000000..201417c --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/RomanException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jean Pimentel <jeanfap@gmail.com> + */ +final class RomanException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的罗马数字', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的罗马数字', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/ScalarValException.php b/vendor/workerman/validation/library/Exceptions/ScalarValException.php new file mode 100644 index 0000000..5f4ad8d --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ScalarValException.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ScalarValException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是标量值', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是标量值', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/SfException.php b/vendor/workerman/validation/library/Exceptions/SfException.php new file mode 100644 index 0000000..d512265 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/SfException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class SfException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须对 {{constraint}} 有效', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能对 {{constraint}} 有效', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/SizeException.php b/vendor/workerman/validation/library/Exceptions/SizeException.php new file mode 100644 index 0000000..71af60f --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/SizeException.php @@ -0,0 +1,58 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exception class for Size rule. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class SizeException extends NestedValidationException +{ + public const BOTH = 'both'; + public const LOWER = 'lower'; + public const GREATER = 'greater'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::BOTH => '{{name}} 必须介于 {{minSize}} 和 {{maxSize}} 之间', + self::LOWER => '{{name}} 必须大于 {{minSize}}', + self::GREATER => '{{name}} 必须小于 {{maxSize}}', + ], + self::MODE_NEGATIVE => [ + self::BOTH => '{{name}} 不能介于 {{minSize}} 和 {{maxSize}} 之间', + self::LOWER => '{{name}} 不能大于 {{minSize}}', + self::GREATER => '{{name}} 不能小于 {{maxSize}}', + ], + ]; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + if (!$this->getParam('minValue')) { + return self::GREATER; + } + + if (!$this->getParam('maxValue')) { + return self::LOWER; + } + + return self::BOTH; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/SlugException.php b/vendor/workerman/validation/library/Exceptions/SlugException.php new file mode 100644 index 0000000..930def7 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/SlugException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Carlos André Ferrari <caferrari@gmail.com> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class SlugException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的 slug', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的 slug', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/SortedException.php b/vendor/workerman/validation/library/Exceptions/SortedException.php new file mode 100644 index 0000000..875af3e --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/SortedException.php @@ -0,0 +1,48 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +use Respect\Validation\Rules\Sorted; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Mikhail Vyrtsev <reeywhaar@gmail.com> + */ +final class SortedException extends ValidationException +{ + public const ASCENDING = 'ascending'; + public const DESCENDING = 'descending'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::ASCENDING => '{{name}} 必须按升序排序', + self::DESCENDING => '{{name}} 必须按降序排序', + ], + self::MODE_NEGATIVE => [ + self::ASCENDING => '{{name}} 不能按升序排序', + self::DESCENDING => '{{name}} 不能按降序排序', + ], + ]; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + return $this->getParam('direction') === Sorted::ASCENDING ? self::ASCENDING : self::DESCENDING; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/SpaceException.php b/vendor/workerman/validation/library/Exceptions/SpaceException.php new file mode 100644 index 0000000..691f18f --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/SpaceException.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Andre Ramaciotti <andre@ramaciotti.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class SpaceException extends FilteredValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 只能包含空格字符', + self::EXTRA => '{{name}} 只能包含空格字符和 {{additionalChars}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能包含空格字符', + self::EXTRA => '{{name}} 不能包含空格字符或 {{additionalChars}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/StartsWithException.php b/vendor/workerman/validation/library/Exceptions/StartsWithException.php new file mode 100644 index 0000000..498be2a --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/StartsWithException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class StartsWithException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须以 {{startValue}} 开头', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能以 {{startValue}} 开头', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/StringTypeException.php b/vendor/workerman/validation/library/Exceptions/StringTypeException.php new file mode 100644 index 0000000..b866c9a --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/StringTypeException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class StringTypeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是string类型', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是string类型', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/StringValException.php b/vendor/workerman/validation/library/Exceptions/StringValException.php new file mode 100644 index 0000000..99185a4 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/StringValException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class StringValException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是字符串', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是字符串', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/SubdivisionCodeException.php b/vendor/workerman/validation/library/Exceptions/SubdivisionCodeException.php new file mode 100644 index 0000000..6281467 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/SubdivisionCodeException.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +class SubdivisionCodeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是 {{countryName}} 的细分代码', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是 {{countryName}} 的细分代码', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/SubsetException.php b/vendor/workerman/validation/library/Exceptions/SubsetException.php new file mode 100644 index 0000000..8d9cd2e --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/SubsetException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Singwai Chan <singwai.chan@live.com> + */ +final class SubsetException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是 {{superset}} 的子集', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是 {{superset}} 的子集', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/SymbolicLinkException.php b/vendor/workerman/validation/library/Exceptions/SymbolicLinkException.php new file mode 100644 index 0000000..1e0a663 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/SymbolicLinkException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Gus Antoniassi <gus.antoniassi@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class SymbolicLinkException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是符号链接', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是符号链接', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/TimeException.php b/vendor/workerman/validation/library/Exceptions/TimeException.php new file mode 100644 index 0000000..8d20a3d --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/TimeException.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class TimeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是格式为 {{sample}} 的有效时间', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是格式为 {{sample}} 的有效时间', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/TldException.php b/vendor/workerman/validation/library/Exceptions/TldException.php new file mode 100644 index 0000000..e94d6ac --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/TldException.php @@ -0,0 +1,37 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exceptions thrown by Tld Rule. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + * @author Paul Karikari <paulkarikari1@gmail.com> + */ +final class TldException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的顶级域名', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的顶级域名', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/TrueValException.php b/vendor/workerman/validation/library/Exceptions/TrueValException.php new file mode 100644 index 0000000..68e2907 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/TrueValException.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exceptions thrown by TrueVal rule. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Paul Karikari <paulkarikari1@gmail.com> + */ +final class TrueValException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 不被视为 "True"', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 被视为 "True"', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/TypeException.php b/vendor/workerman/validation/library/Exceptions/TypeException.php new file mode 100644 index 0000000..1c0f0bd --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/TypeException.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exceptions thrown by Type rule. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Paul Karikari <paulkarikari1@gmail.com> + */ +final class TypeException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是 {{type}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是 {{type}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/UniqueException.php b/vendor/workerman/validation/library/Exceptions/UniqueException.php new file mode 100644 index 0000000..5631d8d --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/UniqueException.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exceptions thrown by Unique rule. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Krzysztof Śmiałek <admin@avensome.net> + * @author Paul Karikari <paulkarikari1@gmail.com> + */ +final class UniqueException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 不能包含重复项', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 必须包含重复项', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/UploadedException.php b/vendor/workerman/validation/library/Exceptions/UploadedException.php new file mode 100644 index 0000000..f728e96 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/UploadedException.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * Exceptions thrown by Uploaded rule. + * + * @author Fajar Khairil <fajar.khairil@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Paul Karikari <paulkarikari1@gmail.com> + */ +final class UploadedException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是上传的文件', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是上传的文件', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/UppercaseException.php b/vendor/workerman/validation/library/Exceptions/UppercaseException.php new file mode 100644 index 0000000..a0dc2e5 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/UppercaseException.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jean Pimentel <jeanfap@gmail.com> + */ +final class UppercaseException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须大写', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能大写', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/UrlException.php b/vendor/workerman/validation/library/Exceptions/UrlException.php new file mode 100644 index 0000000..b09e7e5 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/UrlException.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class UrlException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是URL', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是URL', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/UuidException.php b/vendor/workerman/validation/library/Exceptions/UuidException.php new file mode 100644 index 0000000..e324048 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/UuidException.php @@ -0,0 +1,50 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Dick van der Heiden <d.vanderheiden@inthere.nl> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Michael Weimann <mail@michael-weimann.eu> + */ +final class UuidException extends ValidationException +{ + public const VERSION = 'version'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的UUID', + self::VERSION => '{{name}} 必须是有效的UUID版本 {{version}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的UUID', + self::VERSION => '{{name}} 不能是有效的UUID版本 {{version}}', + ], + ]; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + if ($this->getParam('version')) { + return self::VERSION; + } + + return self::STANDARD; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/ValidationException.php b/vendor/workerman/validation/library/Exceptions/ValidationException.php new file mode 100644 index 0000000..acfbbf0 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ValidationException.php @@ -0,0 +1,157 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +use InvalidArgumentException; +use Respect\Validation\Message\Formatter; + +use function key; + +/** + * Default exception class for rule validations. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +class ValidationException extends InvalidArgumentException implements Exception +{ + public const MODE_DEFAULT = 'default'; + public const MODE_NEGATIVE = 'negative'; + public const STANDARD = 'standard'; + + /** + * Contains the default templates for exception message. + * + * @var string[][] + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须有效', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能有效', + ], + ]; + + /** + * @var mixed + */ + private $input; + + /** + * @var string + */ + private $id; + + /** + * @var string + */ + private $mode = self::MODE_DEFAULT; + + /** + * @var mixed[] + */ + private $params = []; + + /** + * @var Formatter + */ + private $formatter; + + /** + * @var string + */ + private $template; + + /** + * @param mixed $input + * @param mixed[] $params + */ + public function __construct($input, string $id, array $params, Formatter $formatter) + { + $this->input = $input; + $this->id = $id; + $this->params = $params; + $this->formatter = $formatter; + $this->template = $this->chooseTemplate(); + + parent::__construct($this->createMessage()); + } + + public function getId(): string + { + return $this->id; + } + + /** + * @return mixed[] + */ + public function getParams(): array + { + return $this->params; + } + + /** + * @return mixed|null + */ + public function getParam(string $name) + { + return $this->params[$name] ?? null; + } + + public function updateMode(string $mode): void + { + $this->mode = $mode; + $this->message = $this->createMessage(); + } + + public function updateTemplate(string $template): void + { + $this->template = $template; + $this->message = $this->createMessage(); + } + + /** + * @param mixed[] $params + */ + public function updateParams(array $params): void + { + $this->params = $params; + $this->message = $this->createMessage(); + } + + public function hasCustomTemplate(): bool + { + return isset($this->defaultTemplates[$this->mode][$this->template]) === false; + } + + public function __toString(): string + { + return $this->getMessage(); + } + + protected function chooseTemplate(): string + { + return (string) key($this->defaultTemplates[$this->mode]); + } + + private function createMessage(): string + { + return $this->formatter->format( + $this->defaultTemplates[$this->mode][$this->template] ?? $this->template, + $this->input, + $this->params + ); + } +} diff --git a/vendor/workerman/validation/library/Exceptions/ValidatorException.php b/vendor/workerman/validation/library/Exceptions/ValidatorException.php new file mode 100644 index 0000000..49903e6 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ValidatorException.php @@ -0,0 +1,21 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ValidatorException extends AllOfException +{ +} diff --git a/vendor/workerman/validation/library/Exceptions/VersionException.php b/vendor/workerman/validation/library/Exceptions/VersionException.php new file mode 100644 index 0000000..dd48315 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/VersionException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class VersionException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是版本', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是版本', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/VideoUrlException.php b/vendor/workerman/validation/library/Exceptions/VideoUrlException.php new file mode 100644 index 0000000..4732ff2 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/VideoUrlException.php @@ -0,0 +1,50 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Ricardo Gobbo <ricardo@clicknow.com.br> + */ +final class VideoUrlException extends ValidationException +{ + public const SERVICE = 'service'; + + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是有效的视频URL', + self::SERVICE => '{{name}} 必须是有效的 {{service}} 视频URL', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是有效的视频URL', + self::SERVICE => '{{name}} 不能是有效的 {{service}} 视频URL', + ], + ]; + + /** + * {@inheritDoc} + */ + protected function chooseTemplate(): string + { + if ($this->getParam('service')) { + return self::SERVICE; + } + + return self::STANDARD; + } +} diff --git a/vendor/workerman/validation/library/Exceptions/VowelException.php b/vendor/workerman/validation/library/Exceptions/VowelException.php new file mode 100644 index 0000000..70e7ecb --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/VowelException.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Kleber Hamada Sato <kleberhs007@yahoo.com> + */ +final class VowelException extends FilteredValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 只能包含元音', + self::EXTRA => '{{name}} 只能包含元音和 {{additionalChars}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能包含元音', + self::EXTRA => '{{name}} 不能包含元音或 {{additionalChars}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/WhenException.php b/vendor/workerman/validation/library/Exceptions/WhenException.php new file mode 100644 index 0000000..d75fdd9 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/WhenException.php @@ -0,0 +1,23 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Antonio Spinelli <tonicospinelli85@gmail.com> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class WhenException extends ValidationException +{ +} diff --git a/vendor/workerman/validation/library/Exceptions/WritableException.php b/vendor/workerman/validation/library/Exceptions/WritableException.php new file mode 100644 index 0000000..58a9a9e --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/WritableException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class WritableException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 必须是可写的', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能是可写的', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/XdigitException.php b/vendor/workerman/validation/library/Exceptions/XdigitException.php new file mode 100644 index 0000000..ed01ae9 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/XdigitException.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Andre Ramaciotti <andre@ramaciotti.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class XdigitException extends FilteredValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 只能包含十六进制数字', + self::EXTRA => '{{name}} 只能包含十六进制数字和 {{additionalChars}}', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 不能包含十六进制数字', + self::EXTRA => '{{name}} 不能包含十六进制数字或 {{additionalChars}}', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/YesException.php b/vendor/workerman/validation/library/Exceptions/YesException.php new file mode 100644 index 0000000..96b856a --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/YesException.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Cameron Hall <me@chall.id.au> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class YesException extends ValidationException +{ + /** + * {@inheritDoc} + */ + protected $defaultTemplates = [ + self::MODE_DEFAULT => [ + self::STANDARD => '{{name}} 不被认为是 "Yes"', + ], + self::MODE_NEGATIVE => [ + self::STANDARD => '{{name}} 被认为是 "Yes"', + ], + ]; +} diff --git a/vendor/workerman/validation/library/Exceptions/ZendException.php b/vendor/workerman/validation/library/Exceptions/ZendException.php new file mode 100644 index 0000000..7ed9ef2 --- /dev/null +++ b/vendor/workerman/validation/library/Exceptions/ZendException.php @@ -0,0 +1,23 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Exceptions; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ZendException extends NestedValidationException +{ +} diff --git a/vendor/workerman/validation/library/Factory.php b/vendor/workerman/validation/library/Factory.php new file mode 100644 index 0000000..8046249 --- /dev/null +++ b/vendor/workerman/validation/library/Factory.php @@ -0,0 +1,264 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation; + +use ReflectionClass; +use ReflectionException; +use ReflectionObject; +use Respect\Validation\Exceptions\ComponentException; +use Respect\Validation\Exceptions\InvalidClassException; +use Respect\Validation\Exceptions\ValidationException; +use Respect\Validation\Message\Formatter; +use Respect\Validation\Message\ParameterStringifier; +use Respect\Validation\Message\Stringifier\KeepOriginalStringName; + +use function lcfirst; +use function sprintf; +use function trim; +use function ucfirst; + +/** + * Factory of objects. + * + * @author Augusto Pascutti <augusto@phpsp.org.br> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Factory +{ + /** + * Default instance of the Factory. + * + * @var Factory + */ + private static $defaultInstance; + + /** + * @var string[] + */ + private $rulesNamespaces = ['Respect\\Validation\\Rules']; + + /** + * @var string[] + */ + private $exceptionsNamespaces = ['Respect\\Validation\\Exceptions']; + + /** + * @var callable + */ + private $translator = 'strval'; + + /** + * @var ParameterStringifier + */ + private $parameterStringifier; + + public function __construct() + { + $this->parameterStringifier = new KeepOriginalStringName(); + } + + public function withRuleNamespace(string $rulesNamespace): self + { + $clone = clone $this; + $clone->rulesNamespaces[] = trim($rulesNamespace, '\\'); + + return $clone; + } + + public function withExceptionNamespace(string $exceptionsNamespace): self + { + $clone = clone $this; + $clone->exceptionsNamespaces[] = trim($exceptionsNamespace, '\\'); + + return $clone; + } + + public function withTranslator(callable $translator): self + { + $clone = clone $this; + $clone->translator = $translator; + + return $clone; + } + + public function withParameterStringifier(ParameterStringifier $parameterStringifier): self + { + $clone = clone $this; + $clone->parameterStringifier = $parameterStringifier; + + return $clone; + } + + /** + * Define the default instance of the Factory. + */ + public static function setDefaultInstance(self $defaultInstance): void + { + self::$defaultInstance = $defaultInstance; + } + + /** + * Returns the default instance of the Factory. + */ + public static function getDefaultInstance(): self + { + if (self::$defaultInstance === null) { + self::$defaultInstance = new self(); + } + + return self::$defaultInstance; + } + + /** + * Creates a rule. + * + * @param mixed[] $arguments + * + * @throws ComponentException + */ + public function rule(string $ruleName, array $arguments = []): Validatable + { + foreach ($this->rulesNamespaces as $namespace) { + try { + /** @var class-string<Validatable> $name */ + $name = $namespace . '\\' . ucfirst($ruleName); + /** @var Validatable $rule */ + $rule = $this + ->createReflectionClass($name, Validatable::class) + ->newInstanceArgs($arguments); + + return $rule; + } catch (ReflectionException $exception) { + continue; + } + } + + throw new ComponentException(sprintf('"%s" is not a valid rule name', $ruleName)); + } + + /** + * Creates an exception. + * + * @param mixed $input + * @param mixed[] $extraParams + * + * @throws ComponentException + */ + public function exception(Validatable $validatable, $input, array $extraParams = []): ValidationException + { + $formatter = new Formatter($this->translator, $this->parameterStringifier); + $reflection = new ReflectionObject($validatable); + $ruleName = $reflection->getShortName(); + $params = ['input' => $input] + $extraParams + $this->extractPropertiesValues($validatable, $reflection); + $id = lcfirst($ruleName); + if ($validatable->getName() !== null) { + /*$id = */$params['name'] = $validatable->getName(); + } + foreach ($this->exceptionsNamespaces as $namespace) { + try { + /** @var class-string<ValidationException> $exceptionName */ + $exceptionName = $namespace . '\\' . $ruleName . 'Exception'; + + return $this->createValidationException( + $exceptionName, + $id, + $input, + $params, + $formatter + ); + } catch (ReflectionException $exception) { + continue; + } + } + + return new ValidationException($input, $id, $params, $formatter); + } + + /** + * Creates a reflection based on class name. + * + * @param class-string $name + * @param class-string $parentName + * + * @throws InvalidClassException + * @throws ReflectionException + */ + private function createReflectionClass(string $name, string $parentName): ReflectionClass + { + $reflection = new ReflectionClass($name); + if (!$reflection->isSubclassOf($parentName) && $parentName !== $name) { + throw new InvalidClassException(sprintf('"%s" must be an instance of "%s"', $name, $parentName)); + } + + if (!$reflection->isInstantiable()) { + throw new InvalidClassException(sprintf('"%s" must be instantiable', $name)); + } + + return $reflection; + } + + /** + * Creates a Validation exception. + * + * @param class-string<ValidationException> $exceptionName + * + * @param mixed $input + * @param mixed[] $params + * + * @throws InvalidClassException + * @throws ReflectionException + */ + private function createValidationException( + string $exceptionName, + string $id, + $input, + array $params, + Formatter $formatter + ): ValidationException { + /** @var ValidationException $exception */ + $exception = $this + ->createReflectionClass($exceptionName, ValidationException::class) + ->newInstance($input, $id, $params, $formatter); + if (isset($params['template'])) { + $exception->updateTemplate($params['template']); + } + + return $exception; + } + + /** + * @return mixed[] + */ + private function extractPropertiesValues(Validatable $validatable, ReflectionClass $reflection): array + { + $values = []; + foreach ($reflection->getProperties() as $property) { + $property->setAccessible(true); + + $propertyValue = $property->getValue($validatable); + if ($propertyValue === null) { + continue; + } + + $values[$property->getName()] = $propertyValue; + } + + $parentReflection = $reflection->getParentClass(); + if ($parentReflection !== false) { + return $values + $this->extractPropertiesValues($validatable, $parentReflection); + } + + return $values; + } +} diff --git a/vendor/workerman/validation/library/Helpers/CanCompareValues.php b/vendor/workerman/validation/library/Helpers/CanCompareValues.php new file mode 100644 index 0000000..ba24efc --- /dev/null +++ b/vendor/workerman/validation/library/Helpers/CanCompareValues.php @@ -0,0 +1,72 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Helpers; + +use Countable; +use DateTimeImmutable; +use DateTimeInterface; +use Throwable; + +use function is_numeric; +use function is_scalar; +use function is_string; +use function mb_strlen; + +/** + * Helps to deal with comparable values. + * + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +trait CanCompareValues +{ + /** + * Tries to convert a value into something that can be compared with PHP operators. + * + * @param mixed $value + * + * @return mixed + */ + private function toComparable($value) + { + if ($value instanceof Countable) { + return $value->count(); + } + + if ($value instanceof DateTimeInterface || !is_string($value) || is_numeric($value) || empty($value)) { + return $value; + } + + if (mb_strlen($value) === 1) { + return $value; + } + + try { + return new DateTimeImmutable($value); + } catch (Throwable $e) { + return $value; + } + } + + /** + * Returns whether the values can be compared or not. + * + * @param mixed $left + * @param mixed $right + */ + private function isAbleToCompareValues($left, $right): bool + { + return is_scalar($left) === is_scalar($right); + } +} diff --git a/vendor/workerman/validation/library/Helpers/CanValidateDateTime.php b/vendor/workerman/validation/library/Helpers/CanValidateDateTime.php new file mode 100644 index 0000000..054a4ad --- /dev/null +++ b/vendor/workerman/validation/library/Helpers/CanValidateDateTime.php @@ -0,0 +1,74 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Helpers; + +use function checkdate; +use function date_parse_from_format; +use function preg_match; + +/** + * Helper to handle date/time. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +trait CanValidateDateTime +{ + /** + * Finds whether a value is a valid date/time in a specific format. + */ + private function isDateTime(string $format, string $value): bool + { + $exceptionalFormats = [ + 'c' => 'Y-m-d\TH:i:sP', + 'r' => 'D, d M Y H:i:s O', + ]; + + $info = date_parse_from_format($exceptionalFormats[$format] ?? $format, $value); + + if (!$this->isDateTimeParsable($info)) { + return false; + } + + if ($this->isDateFormat($format)) { + return $this->isDateInformation($info); + } + + return true; + } + + /** + * @param int[] $info + */ + private function isDateTimeParsable(array $info): bool + { + return $info['error_count'] === 0 && $info['warning_count'] === 0; + } + + private function isDateFormat(string $format): bool + { + return preg_match('/[djSFmMnYy]/', $format) > 0; + } + + /** + * @param mixed[] $info + */ + private function isDateInformation(array $info): bool + { + if ($info['day']) { + return checkdate((int) $info['month'], $info['day'], (int) $info['year']); + } + + return checkdate($info['month'] ?: 1, $info['day'] ?: 1, $info['year'] ?: 1); + } +} diff --git a/vendor/workerman/validation/library/Helpers/CanValidateIterable.php b/vendor/workerman/validation/library/Helpers/CanValidateIterable.php new file mode 100644 index 0000000..3730b65 --- /dev/null +++ b/vendor/workerman/validation/library/Helpers/CanValidateIterable.php @@ -0,0 +1,37 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Helpers; + +use stdClass; +use Traversable; + +use function is_array; + +/** + * Helper to handle iterable values. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +trait CanValidateIterable +{ + /** + * Returns whether the value is iterable or not. + * + * @param mixed $value + */ + public function isIterable($value): bool + { + return is_array($value) || $value instanceof stdClass || $value instanceof Traversable; + } +} diff --git a/vendor/workerman/validation/library/Helpers/CanValidateUndefined.php b/vendor/workerman/validation/library/Helpers/CanValidateUndefined.php new file mode 100644 index 0000000..f85922c --- /dev/null +++ b/vendor/workerman/validation/library/Helpers/CanValidateUndefined.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Helpers; + +use function in_array; + +/** + * Helper to identify values that Validation consider as "undefined". + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +trait CanValidateUndefined +{ + /** + * Finds whether the value is undefined or not. + * + * @param mixed $value + */ + private function isUndefined($value): bool + { + return in_array($value, [null, ''], true); + } +} diff --git a/vendor/workerman/validation/library/Helpers/Subdivisions.php b/vendor/workerman/validation/library/Helpers/Subdivisions.php new file mode 100644 index 0000000..95fc8bb --- /dev/null +++ b/vendor/workerman/validation/library/Helpers/Subdivisions.php @@ -0,0 +1,52 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Helpers; + +use Respect\Validation\Exceptions\ComponentException; + +use function file_exists; +use function file_get_contents; +use function json_decode; +use function sprintf; + +final class Subdivisions +{ + /** + * @var mixed[] + */ + private $data; + + public function __construct(string $countryCode) + { + $filename = __DIR__ . '/../../data/iso_3166-2/' . $countryCode . '.json'; + if (!file_exists($filename)) { + throw new ComponentException(sprintf('"%s" is not a supported country code', $countryCode)); + } + + $this->data = (array) json_decode((string) file_get_contents($filename), true); + } + + public function getCountry(): string + { + return $this->data['country']; + } + + /** + * @return string[] + */ + public function getSubdivisions(): array + { + return $this->data['subdivisions']; + } +} diff --git a/vendor/workerman/validation/library/Message/Formatter.php b/vendor/workerman/validation/library/Message/Formatter.php new file mode 100644 index 0000000..640dcc0 --- /dev/null +++ b/vendor/workerman/validation/library/Message/Formatter.php @@ -0,0 +1,58 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Message; + +use function call_user_func; +use function preg_replace_callback; +use function Respect\Stringifier\stringify; + +final class Formatter +{ + /** + * @var callable + */ + private $translator; + + /** + * @var ParameterStringifier + */ + private $parameterStringifier; + + public function __construct(callable $translator, ParameterStringifier $parameterStringifier) + { + $this->translator = $translator; + $this->parameterStringifier = $parameterStringifier; + } + + /** + * @param mixed $input + * @param mixed[] $parameters + */ + public function format(string $template, $input, array $parameters): string + { + $parameters['name'] = $parameters['name'] ?? stringify($input); + + return preg_replace_callback( + '/{{(\w+)}}/', + function ($match) use ($parameters) { + if (!isset($parameters[$match[1]])) { + return $match[0]; + } + + return $this->parameterStringifier->stringify($match[1], $parameters[$match[1]]); + }, + call_user_func($this->translator, $template) + ); + } +} diff --git a/vendor/workerman/validation/library/Message/ParameterStringifier.php b/vendor/workerman/validation/library/Message/ParameterStringifier.php new file mode 100644 index 0000000..0255905 --- /dev/null +++ b/vendor/workerman/validation/library/Message/ParameterStringifier.php @@ -0,0 +1,22 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Message; + +interface ParameterStringifier +{ + /** + * @param mixed $value + */ + public function stringify(string $name, $value): string; +} diff --git a/vendor/workerman/validation/library/Message/Stringifier/KeepOriginalStringName.php b/vendor/workerman/validation/library/Message/Stringifier/KeepOriginalStringName.php new file mode 100644 index 0000000..44c835c --- /dev/null +++ b/vendor/workerman/validation/library/Message/Stringifier/KeepOriginalStringName.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Message\Stringifier; + +use Respect\Validation\Message\ParameterStringifier; + +use function is_string; +use function Respect\Stringifier\stringify; + +final class KeepOriginalStringName implements ParameterStringifier +{ + /** + * {@inheritDoc} + */ + public function stringify(string $name, $value): string + { + if ($name === 'name' && is_string($value)) { + return $value; + } + + return stringify($value); + } +} diff --git a/vendor/workerman/validation/library/Rules/AbstractAge.php b/vendor/workerman/validation/library/Rules/AbstractAge.php new file mode 100644 index 0000000..a53d7f2 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/AbstractAge.php @@ -0,0 +1,102 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Helpers\CanValidateDateTime; + +use function date; +use function date_parse_from_format; +use function is_scalar; +use function strtotime; +use function vsprintf; + +/** + * Abstract class to validate ages. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +abstract class AbstractAge extends AbstractRule +{ + use CanValidateDateTime; + + /** + * @var int + */ + private $age; + + /** + * @var string|null + */ + private $format; + + /** + * @var int + */ + private $baseDate; + + /** + * Initializes the rule. + */ + public function __construct(int $age, ?string $format = null) + { + $this->age = $age; + $this->format = $format; + $this->baseDate = (int) date('Ymd') - $this->age * 10000; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_scalar($input)) { + return false; + } + + if ($this->format === null) { + return $this->isValidWithoutFormat((string) $input); + } + + return $this->isValidWithFormat($this->format, (string) $input); + } + + /** + * Should compare the current base date with the given one. + * + * The dates are represented as integers in the format "Ymd". + */ + abstract protected function compare(int $baseDate, int $givenDate): bool; + + private function isValidWithoutFormat(string $dateTime): bool + { + $timestamp = strtotime($dateTime); + if ($timestamp === false) { + return false; + } + + return $this->compare($this->baseDate, (int) date('Ymd', $timestamp)); + } + + private function isValidWithFormat(string $format, string $dateTime): bool + { + if (!$this->isDateTime($format, $dateTime)) { + return false; + } + + return $this->compare( + $this->baseDate, + (int) vsprintf('%d%02d%02d', date_parse_from_format($format, $dateTime)) + ); + } +} diff --git a/vendor/workerman/validation/library/Rules/AbstractComparison.php b/vendor/workerman/validation/library/Rules/AbstractComparison.php new file mode 100644 index 0000000..eb6f8ce --- /dev/null +++ b/vendor/workerman/validation/library/Rules/AbstractComparison.php @@ -0,0 +1,64 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Helpers\CanCompareValues; + +/** + * Abstract class to help on creating rules that compare value. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +abstract class AbstractComparison extends AbstractRule +{ + use CanCompareValues; + + /** + * @var mixed + */ + private $compareTo; + + /** + * Initializes the rule by setting the value to be compared to the input. + * + * @param mixed $maxValue + */ + public function __construct($maxValue) + { + $this->compareTo = $maxValue; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + $left = $this->toComparable($input); + $right = $this->toComparable($this->compareTo); + + if (!$this->isAbleToCompareValues($left, $right)) { + return false; + } + + return $this->compare($left, $right); + } + + /** + * Compare both values and return whether the comparison is valid or not. + * + * @param mixed $left + * @param mixed $right + */ + abstract protected function compare($left, $right): bool; +} diff --git a/vendor/workerman/validation/library/Rules/AbstractComposite.php b/vendor/workerman/validation/library/Rules/AbstractComposite.php new file mode 100644 index 0000000..5ea9c0c --- /dev/null +++ b/vendor/workerman/validation/library/Rules/AbstractComposite.php @@ -0,0 +1,142 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\NestedValidationException; +use Respect\Validation\Exceptions\ValidationException; +use Respect\Validation\Validatable; + +use function array_filter; +use function array_map; + +/** + * Abstract class for rules that are composed by other rules. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Wojciech Frącz <fraczwojciech@gmail.com> + */ +abstract class AbstractComposite extends AbstractRule +{ + /** + * @var Validatable[] + */ + private $rules = []; + + /** + * Initializes the rule adding other rules to the stack. + */ + public function __construct(Validatable ...$rules) + { + $this->rules = $rules; + } + + /** + * {@inheritDoc} + */ + public function setName(string $name): Validatable + { + $parentName = $this->getName(); + foreach ($this->rules as $rule) { + $ruleName = $rule->getName(); + if ($ruleName && $parentName !== $ruleName) { + continue; + } + + $rule->setName($name); + } + + return parent::setName($name); + } + + /** + * Append a rule into the stack of rules. + * + * @return AbstractComposite + */ + public function addRule(Validatable $rule): self + { + if ($this->shouldHaveNameOverwritten($rule) && $this->getName() !== null) { + $rule->setName($this->getName()); + } + + $this->rules[] = $rule; + + return $this; + } + + /** + * Returns all the rules in the stack. + * + * @return Validatable[] + */ + public function getRules(): array + { + return $this->rules; + } + + /** + * Returns all the exceptions throw when asserting all rules. + * + * @param mixed $input + * + * @return ValidationException[] + */ + protected function getAllThrownExceptions($input): array + { + return array_filter( + array_map( + function (Validatable $rule) use ($input): ?ValidationException { + try { + $rule->assert($input); + } catch (ValidationException $exception) { + $this->updateExceptionTemplate($exception); + + return $exception; + } + + return null; + }, + $this->getRules() + ) + ); + } + + private function shouldHaveNameOverwritten(Validatable $rule): bool + { + return $this->hasName($this) && !$this->hasName($rule); + } + + private function hasName(Validatable $rule): bool + { + return $rule->getName() !== null; + } + + private function updateExceptionTemplate(ValidationException $exception): void + { + if ($this->template === null || $exception->hasCustomTemplate()) { + return; + } + + $exception->updateTemplate($this->template); + + if (!$exception instanceof NestedValidationException) { + return; + } + + foreach ($exception->getChildren() as $childException) { + $this->updateExceptionTemplate($childException); + } + } +} diff --git a/vendor/workerman/validation/library/Rules/AbstractEnvelope.php b/vendor/workerman/validation/library/Rules/AbstractEnvelope.php new file mode 100644 index 0000000..bc2c877 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/AbstractEnvelope.php @@ -0,0 +1,65 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ValidationException; +use Respect\Validation\Validatable; + +/** + * Abstract class that creates an envelope around another rule. + * + * This class is usefull when you want to create rules that use other rules, but + * having an custom message. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +abstract class AbstractEnvelope extends AbstractRule +{ + /** + * @var Validatable + */ + private $validatable; + + /** + * @var mixed[] + */ + private $parameters; + + /** + * Initializes the rule. + * + * @param mixed[] $parameters + */ + public function __construct(Validatable $validatable, array $parameters = []) + { + $this->validatable = $validatable; + $this->parameters = $parameters; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return $this->validatable->validate($input); + } + + /** + * {@inheritDoc} + */ + public function reportError($input, array $extraParameters = []): ValidationException + { + return parent::reportError($input, $extraParameters + $this->parameters); + } +} diff --git a/vendor/workerman/validation/library/Rules/AbstractFilterRule.php b/vendor/workerman/validation/library/Rules/AbstractFilterRule.php new file mode 100644 index 0000000..6d2452b --- /dev/null +++ b/vendor/workerman/validation/library/Rules/AbstractFilterRule.php @@ -0,0 +1,65 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function implode; +use function is_scalar; +use function str_replace; +use function str_split; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + */ +abstract class AbstractFilterRule extends AbstractRule +{ + /** + * @var string + */ + private $additionalChars; + + /** + * Initializes the rule with a list of characters to be ignored by the validation. + */ + public function __construct(string ...$additionalChars) + { + $this->additionalChars = implode($additionalChars); + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_scalar($input)) { + return false; + } + + $stringInput = (string) $input; + if ($stringInput === '') { + return false; + } + + $filteredInput = $this->filter($stringInput); + + return $filteredInput === '' || $this->validateFilteredInput($filteredInput); + } + + abstract protected function validateFilteredInput(string $input): bool; + + private function filter(string $input): string + { + return str_replace(str_split($this->additionalChars), '', $input); + } +} diff --git a/vendor/workerman/validation/library/Rules/AbstractRelated.php b/vendor/workerman/validation/library/Rules/AbstractRelated.php new file mode 100644 index 0000000..e8046ff --- /dev/null +++ b/vendor/workerman/validation/library/Rules/AbstractRelated.php @@ -0,0 +1,158 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\NestedValidationException; +use Respect\Validation\Exceptions\ValidationException; +use Respect\Validation\Validatable; + +use function is_scalar; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + */ +abstract class AbstractRelated extends AbstractRule +{ + /** + * @var bool + */ + private $mandatory = true; + + /** + * @var mixed + */ + private $reference; + + /** + * @var Validatable|null + */ + private $rule; + + /** + * @param mixed $input + */ + abstract public function hasReference($input): bool; + + /** + * @param mixed $input + * + * @return mixed + */ + abstract public function getReferenceValue($input); + + /** + * @param mixed $reference + */ + public function __construct($reference, ?Validatable $rule = null, bool $mandatory = true) + { + $this->reference = $reference; + $this->rule = $rule; + $this->mandatory = $mandatory; + + if ($rule && $rule->getName() !== null) { + $this->setName($rule->getName()); + } elseif (is_scalar($reference)) { + $this->setName((string) $reference); + } + } + + /** + * @return mixed + */ + public function getReference() + { + return $this->reference; + } + + public function isMandatory(): bool + { + return $this->mandatory; + } + + /** + * {@inheritDoc} + */ + public function setName(string $name): Validatable + { + parent::setName($name); + + if ($this->rule instanceof Validatable) { + $this->rule->setName($name); + } + + return $this; + } + + /** + * {@inheritDoc} + */ + public function assert($input): void + { + $hasReference = $this->hasReference($input); + if ($this->mandatory && !$hasReference) { + throw $this->reportError($input, ['hasReference' => false]); + } + + if ($this->rule === null || !$hasReference) { + return; + } + + try { + $this->rule->assert($this->getReferenceValue($input)); + } catch (ValidationException $validationException) { + /** @var NestedValidationException $nestedValidationException */ + $nestedValidationException = $this->reportError($this->reference, ['hasReference' => true]); + $nestedValidationException->addChild($validationException); + + throw $nestedValidationException; + } + } + + /** + * {@inheritDoc} + */ + public function check($input): void + { + $hasReference = $this->hasReference($input); + if ($this->mandatory && !$hasReference) { + throw $this->reportError($input, ['hasReference' => false]); + } + + if ($this->rule === null || !$hasReference) { + return; + } + + $this->rule->check($this->getReferenceValue($input)); + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + $hasReference = $this->hasReference($input); + if ($this->mandatory && !$hasReference) { + return false; + } + + if ($this->rule === null || !$hasReference) { + return true; + } + + return $this->rule->validate($this->getReferenceValue($input)); + } +} diff --git a/vendor/workerman/validation/library/Rules/AbstractRule.php b/vendor/workerman/validation/library/Rules/AbstractRule.php new file mode 100644 index 0000000..e88d371 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/AbstractRule.php @@ -0,0 +1,101 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ValidationException; +use Respect\Validation\Factory; +use Respect\Validation\Validatable; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + * @author Vicente Mendoza <vicentemmor@yahoo.com.mx> + */ +abstract class AbstractRule implements Validatable +{ + /** + * @var string|null + */ + protected $name; + + /** + * @var string|null + */ + protected $template; + + /** + * @param mixed$input + */ + public function __invoke($input): bool + { + return $this->validate($input); + } + + /** + * {@inheritDoc} + */ + public function assert($input): void + { + if ($this->validate($input)) { + return; + } + + throw $this->reportError($input); + } + + /** + * {@inheritDoc} + */ + public function check($input): void + { + $this->assert($input); + } + + /** + * {@inheritDoc} + */ + public function getName(): ?string + { + return $this->name; + } + + /** + * {@inheritDoc} + */ + public function reportError($input, array $extraParams = []): ValidationException + { + return Factory::getDefaultInstance()->exception($this, $input, $extraParams); + } + + /** + * {@inheritDoc} + */ + public function setName(string $name): Validatable + { + $this->name = $name; + + return $this; + } + + /** + * {@inheritDoc} + */ + public function setTemplate(string $template): Validatable + { + $this->template = $template; + + return $this; + } +} diff --git a/vendor/workerman/validation/library/Rules/AbstractSearcher.php b/vendor/workerman/validation/library/Rules/AbstractSearcher.php new file mode 100644 index 0000000..e97902c --- /dev/null +++ b/vendor/workerman/validation/library/Rules/AbstractSearcher.php @@ -0,0 +1,46 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Helpers\CanValidateUndefined; + +use function in_array; + +/** + * Abstract class for searches into arrays. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +abstract class AbstractSearcher extends AbstractRule +{ + use CanValidateUndefined; + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + $dataSource = $this->getDataSource(); + if ($this->isUndefined($input) && empty($dataSource)) { + return true; + } + + return in_array($input, $dataSource, true); + } + + /** + * @return mixed[] + */ + abstract protected function getDataSource(): array; +} diff --git a/vendor/workerman/validation/library/Rules/AbstractWrapper.php b/vendor/workerman/validation/library/Rules/AbstractWrapper.php new file mode 100644 index 0000000..6267ba4 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/AbstractWrapper.php @@ -0,0 +1,72 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Validatable; + +/** + * Abstract class to help on creating rules that wrap rules. + * + * @author Alasdair North <alasdair@runway.io> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +abstract class AbstractWrapper extends AbstractRule +{ + /** + * @var Validatable + */ + private $validatable; + + /** + * Initializes the rule. + */ + public function __construct(Validatable $validatable) + { + $this->validatable = $validatable; + } + + /** + * {@inheritDoc} + */ + public function assert($input): void + { + $this->validatable->assert($input); + } + + /** + * {@inheritDoc} + */ + public function check($input): void + { + $this->validatable->check($input); + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return $this->validatable->validate($input); + } + + /** + * {@inheritDoc} + */ + public function setName(string $name): Validatable + { + $this->validatable->setName($name); + + return parent::setName($name); + } +} diff --git a/vendor/workerman/validation/library/Rules/AllOf.php b/vendor/workerman/validation/library/Rules/AllOf.php new file mode 100644 index 0000000..dd9038d --- /dev/null +++ b/vendor/workerman/validation/library/Rules/AllOf.php @@ -0,0 +1,71 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\AllOfException; + +use function count; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +class AllOf extends AbstractComposite +{ + /** + * {@inheritDoc} + */ + public function assert($input): void + { + $exceptions = $this->getAllThrownExceptions($input); + $numRules = count($this->getRules()); + $numExceptions = count($exceptions); + $summary = [ + 'total' => $numRules, + 'failed' => $numExceptions, + 'passed' => $numRules - $numExceptions, + ]; + if (!empty($exceptions)) { + /** @var AllOfException $allOfException */ + $allOfException = $this->reportError($input, $summary); + $allOfException->addChildren($exceptions); + + throw $allOfException; + } + } + + /** + * {@inheritDoc} + */ + public function check($input): void + { + foreach ($this->getRules() as $rule) { + $rule->check($input); + } + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + foreach ($this->getRules() as $rule) { + if (!$rule->validate($input)) { + return false; + } + } + + return true; + } +} diff --git a/vendor/workerman/validation/library/Rules/Alnum.php b/vendor/workerman/validation/library/Rules/Alnum.php new file mode 100644 index 0000000..792c4ba --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Alnum.php @@ -0,0 +1,37 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function ctype_alnum; + +/** + * Validates whether the input is alphanumeric or not. + * + * Alphanumeric is a combination of alphabetic (a-z and A-Z) and numeric (0-9) + * characters. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + */ +final class Alnum extends AbstractFilterRule +{ + /** + * {@inheritDoc} + */ + protected function validateFilteredInput(string $input): bool + { + return ctype_alnum($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Alpha.php b/vendor/workerman/validation/library/Rules/Alpha.php new file mode 100644 index 0000000..cd4d23d --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Alpha.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function ctype_alpha; + +/** + * Validates whether the input contains only alphabetic characters. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + */ +final class Alpha extends AbstractFilterRule +{ + /** + * {@inheritDoc} + */ + protected function validateFilteredInput(string $input): bool + { + return ctype_alpha($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/AlwaysInvalid.php b/vendor/workerman/validation/library/Rules/AlwaysInvalid.php new file mode 100644 index 0000000..f241d07 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/AlwaysInvalid.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +/** + * Validates any input as invalid. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class AlwaysInvalid extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return false; + } +} diff --git a/vendor/workerman/validation/library/Rules/AlwaysValid.php b/vendor/workerman/validation/library/Rules/AlwaysValid.php new file mode 100644 index 0000000..7935935 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/AlwaysValid.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +/** + * Validates any input as valid. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class AlwaysValid extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return true; + } +} diff --git a/vendor/workerman/validation/library/Rules/AnyOf.php b/vendor/workerman/validation/library/Rules/AnyOf.php new file mode 100644 index 0000000..47941a4 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/AnyOf.php @@ -0,0 +1,82 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\AnyOfException; +use Respect\Validation\Exceptions\ValidationException; + +use function count; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class AnyOf extends AbstractComposite +{ + /** + * {@inheritDoc} + */ + public function assert($input): void + { + $validators = $this->getRules(); + $exceptions = $this->getAllThrownExceptions($input); + $numRules = count($validators); + $numExceptions = count($exceptions); + if ($numExceptions === $numRules) { + /** @var AnyOfException $anyOfException */ + $anyOfException = $this->reportError($input); + $anyOfException->addChildren($exceptions); + + throw $anyOfException; + } + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + foreach ($this->getRules() as $v) { + if ($v->validate($input)) { + return true; + } + } + + return false; + } + + /** + * {@inheritDoc} + */ + public function check($input): void + { + foreach ($this->getRules() as $v) { + try { + $v->check($input); + + return; + } catch (ValidationException $e) { + if (!isset($firstException)) { + $firstException = $e; + } + } + } + + if (isset($firstException)) { + throw $firstException; + } + + throw $this->reportError($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/ArrayType.php b/vendor/workerman/validation/library/Rules/ArrayType.php new file mode 100644 index 0000000..b349221 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/ArrayType.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_array; + +/** + * Validates whether the type of an input is array. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author João Torquato <joao.otl@gmail.com> + */ +final class ArrayType extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_array($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/ArrayVal.php b/vendor/workerman/validation/library/Rules/ArrayVal.php new file mode 100644 index 0000000..c06c200 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/ArrayVal.php @@ -0,0 +1,39 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use ArrayAccess; +use SimpleXMLElement; + +use function is_array; + +/** + * Validates if the input is an array or if the input can be used as an array. + * + * Instance of `ArrayAccess` or `SimpleXMLElement` are also considered as valid. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ArrayVal extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_array($input) || $input instanceof ArrayAccess || $input instanceof SimpleXMLElement; + } +} diff --git a/vendor/workerman/validation/library/Rules/Attribute.php b/vendor/workerman/validation/library/Rules/Attribute.php new file mode 100644 index 0000000..2d74df1 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Attribute.php @@ -0,0 +1,57 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use ReflectionException; +use ReflectionProperty; +use Respect\Validation\Validatable; + +use function is_object; +use function property_exists; + +/** + * Validates an object attribute, event private ones. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Attribute extends AbstractRelated +{ + public function __construct(string $reference, ?Validatable $rule = null, bool $mandatory = true) + { + parent::__construct($reference, $rule, $mandatory); + } + + /** + * {@inheritDoc} + * + * @throws ReflectionException + */ + public function getReferenceValue($input) + { + $propertyMirror = new ReflectionProperty($input, (string) $this->getReference()); + $propertyMirror->setAccessible(true); + + return $propertyMirror->getValue($input); + } + + /** + * {@inheritDoc} + */ + public function hasReference($input): bool + { + return is_object($input) && property_exists($input, (string) $this->getReference()); + } +} diff --git a/vendor/workerman/validation/library/Rules/Base.php b/vendor/workerman/validation/library/Rules/Base.php new file mode 100644 index 0000000..cc8c606 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Base.php @@ -0,0 +1,68 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; + +use function is_null; +use function mb_strlen; +use function mb_substr; +use function preg_match; +use function sprintf; + +/** + * Validate numbers in any base, even with non regular bases. + * + * @author Carlos André Ferrari <caferrari@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class Base extends AbstractRule +{ + /** + * @var string + */ + private $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + + /** + * @var int + */ + private $base; + + /** + * Initializes the Base rule. + */ + public function __construct(int $base, ?string $chars = null) + { + if (!is_null($chars)) { + $this->chars = $chars; + } + + $max = mb_strlen($this->chars); + if ($base > $max) { + throw new ComponentException(sprintf('a base between 1 and %s is required', $max)); + } + $this->base = $base; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + $valid = mb_substr($this->chars, 0, $this->base); + + return (bool) preg_match('@^[' . $valid . ']+$@', (string) $input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Base64.php b/vendor/workerman/validation/library/Rules/Base64.php new file mode 100644 index 0000000..36c5cf9 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Base64.php @@ -0,0 +1,44 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_string; +use function mb_strlen; +use function preg_match; + +/** + * Validate if a string is Base64-encoded. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jens Segers <segers.jens@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class Base64 extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_string($input)) { + return false; + } + + if (!preg_match('#^[A-Za-z0-9+/\n\r]+={0,2}$#', $input)) { + return false; + } + + return mb_strlen($input) % 4 === 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/Between.php b/vendor/workerman/validation/library/Rules/Between.php new file mode 100644 index 0000000..a35faa4 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Between.php @@ -0,0 +1,54 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; +use Respect\Validation\Helpers\CanCompareValues; + +/** + * Validates whether the input is between two other values. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Between extends AbstractEnvelope +{ + use CanCompareValues; + + /** + * Initializes the rule. + * + * @param mixed $minValue + * @param mixed $maxValue + * + * @throws ComponentException + */ + public function __construct($minValue, $maxValue) + { + if ($this->toComparable($minValue) >= $this->toComparable($maxValue)) { + throw new ComponentException('Minimum cannot be less than or equals to maximum'); + } + + parent::__construct( + new AllOf( + new Min($minValue), + new Max($maxValue) + ), + [ + 'minValue' => $minValue, + 'maxValue' => $maxValue, + ] + ); + } +} diff --git a/vendor/workerman/validation/library/Rules/BoolType.php b/vendor/workerman/validation/library/Rules/BoolType.php new file mode 100644 index 0000000..8c0111d --- /dev/null +++ b/vendor/workerman/validation/library/Rules/BoolType.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_bool; + +/** + * Validates whether the type of the input is boolean. + * + * @author Devin Torres <devin@devintorres.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class BoolType extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_bool($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/BoolVal.php b/vendor/workerman/validation/library/Rules/BoolVal.php new file mode 100644 index 0000000..cda1fcf --- /dev/null +++ b/vendor/workerman/validation/library/Rules/BoolVal.php @@ -0,0 +1,38 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function filter_var; +use function is_bool; + +use const FILTER_NULL_ON_FAILURE; +use const FILTER_VALIDATE_BOOLEAN; + +/** + * Validates if the input results in a boolean value. + * + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class BoolVal extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_bool(filter_var($input, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); + } +} diff --git a/vendor/workerman/validation/library/Rules/Bsn.php b/vendor/workerman/validation/library/Rules/Bsn.php new file mode 100644 index 0000000..b6c2916 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Bsn.php @@ -0,0 +1,50 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function ctype_digit; +use function mb_strlen; + +/** + * Validates a Dutch citizen service number (BSN). + * + * @see https://nl.wikipedia.org/wiki/Burgerservicenummer + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Ronald Drenth <ronalddrenth@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class Bsn extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!ctype_digit($input)) { + return false; + } + + if (mb_strlen($input) !== 9) { + return false; + } + + $sum = -1 * $input[8]; + for ($i = 9; $i > 1; --$i) { + $sum += $i * $input[9 - $i]; + } + + return $sum !== 0 && $sum % 11 === 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/Call.php b/vendor/workerman/validation/library/Rules/Call.php new file mode 100644 index 0000000..4396744 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Call.php @@ -0,0 +1,111 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ValidationException; +use Respect\Validation\Validatable; +use Throwable; + +use function call_user_func; +use function restore_error_handler; +use function set_error_handler; + +/** + * Validates the return of a callable for a given input. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Call extends AbstractRule +{ + /** + * @var callable + */ + private $callable; + + /** + * @var Validatable + */ + private $rule; + + /** + * Initializes the rule with the callable to be executed after the input is passed. + */ + public function __construct(callable $callable, Validatable $rule) + { + $this->callable = $callable; + $this->rule = $rule; + } + + /** + * {@inheritDoc} + */ + public function assert($input): void + { + $this->setErrorHandler($input); + + try { + $this->rule->assert(call_user_func($this->callable, $input)); + } catch (ValidationException $exception) { + throw $exception; + } catch (Throwable $throwable) { + throw $this->reportError($input); + } finally { + restore_error_handler(); + } + } + + /** + * {@inheritDoc} + */ + public function check($input): void + { + $this->setErrorHandler($input); + + try { + $this->rule->check(call_user_func($this->callable, $input)); + } catch (ValidationException $exception) { + throw $exception; + } catch (Throwable $throwable) { + throw $this->reportError($input); + } finally { + restore_error_handler(); + } + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + try { + $this->check($input); + } catch (ValidationException $exception) { + return false; + } + + return true; + } + + /** + * @param mixed $input + */ + private function setErrorHandler($input): void + { + set_error_handler(function () use ($input): void { + throw $this->reportError($input); + }); + } +} diff --git a/vendor/workerman/validation/library/Rules/CallableType.php b/vendor/workerman/validation/library/Rules/CallableType.php new file mode 100644 index 0000000..1eb3771 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/CallableType.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_callable; + +/** + * Validates whether the pseudo-type of the input is callable. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class CallableType extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_callable($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Callback.php b/vendor/workerman/validation/library/Rules/Callback.php new file mode 100644 index 0000000..066a113 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Callback.php @@ -0,0 +1,71 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function array_merge; +use function call_user_func_array; +use function count; + +/** + * Validates the input using the return of a given callable. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class Callback extends AbstractRule +{ + /** + * @var callable + */ + private $callback; + + /** + * @var mixed[] + */ + private $arguments; + + /** + * Initializes the rule. + * + * @param mixed ...$arguments + */ + public function __construct(callable $callback, ...$arguments) + { + $this->callback = $callback; + $this->arguments = $arguments; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return (bool) call_user_func_array($this->callback, $this->getArguments($input)); + } + + /** + * @param mixed $input + * @return mixed[] + */ + private function getArguments($input): array + { + $arguments = [$input]; + if (count($this->arguments) === 0) { + return $arguments; + } + + return array_merge($arguments, $this->arguments); + } +} diff --git a/vendor/workerman/validation/library/Rules/Charset.php b/vendor/workerman/validation/library/Rules/Charset.php new file mode 100644 index 0000000..d8529b9 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Charset.php @@ -0,0 +1,61 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; + +use function array_diff; +use function in_array; +use function mb_detect_encoding; +use function mb_list_encodings; + +/** + * Validates if a string is in a specific charset. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class Charset extends AbstractRule +{ + /** + * @var string[] + */ + private $charset; + + /** + * Initializes the rule. + * + * @throws ComponentException + */ + public function __construct(string ...$charset) + { + $available = mb_list_encodings(); + if (!empty(array_diff($charset, $available))) { + throw new ComponentException('Invalid charset'); + } + + $this->charset = $charset; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + $detectedEncoding = mb_detect_encoding($input, $this->charset, true); + + return in_array($detectedEncoding, $this->charset, true); + } +} diff --git a/vendor/workerman/validation/library/Rules/Cnh.php b/vendor/workerman/validation/library/Rules/Cnh.php new file mode 100644 index 0000000..faa86cf --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Cnh.php @@ -0,0 +1,63 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_scalar; +use function mb_strlen; +use function preg_replace; + +/** + * Validates a Brazilian driver's license. + * + * @author Gabriel Pedro <gpedro@users.noreply.github.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Kinn Coelho Julião <kinncj@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class Cnh extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_scalar($input)) { + return false; + } + + // Canonicalize input + $input = (string) preg_replace('{\D}', '', (string) $input); + + // Validate length and invalid numbers + if (mb_strlen($input) != 11 || ((int) $input === 0)) { + return false; + } + + // Validate check digits using a modulus 11 algorithm + for ($c = $s1 = $s2 = 0, $p = 9; $c < 9; $c++, $p--) { + $s1 += (int) $input[$c] * $p; + $s2 += (int) $input[$c] * (10 - $p); + } + + $dv1 = $s1 % 11; + if ($input[9] != ($dv1 > 9) ? 0 : $dv1) { + return false; + } + + $dv2 = $s2 % 11 - ($dv1 > 9 ? 2 : 0); + $check = $dv2 < 0 ? $dv2 + 11 : ($dv2 > 9 ? 0 : $dv2); + + return $input[10] == $check; + } +} diff --git a/vendor/workerman/validation/library/Rules/Cnpj.php b/vendor/workerman/validation/library/Rules/Cnpj.php new file mode 100644 index 0000000..56ea48c --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Cnpj.php @@ -0,0 +1,87 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function array_map; +use function array_sum; +use function count; +use function is_scalar; +use function preg_replace; +use function str_split; + +/** + * Validates if the input is a Brazilian National Registry of Legal Entities (CNPJ) number. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jayson Reis <santosdosreis@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + * @author Renato Moura <renato@naturalweb.com.br> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class Cnpj extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_scalar($input)) { + return false; + } + + // Code ported from jsfromhell.com + $bases = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; + $digits = $this->getDigits((string) $input); + + if (array_sum($digits) < 1) { + return false; + } + + if (count($digits) !== 14) { + return false; + } + + $n = 0; + for ($i = 0; $i < 12; ++$i) { + $n += $digits[$i] * $bases[$i + 1]; + } + + if ($digits[12] != (($n %= 11) < 2 ? 0 : 11 - $n)) { + return false; + } + + $n = 0; + for ($i = 0; $i <= 12; ++$i) { + $n += $digits[$i] * $bases[$i]; + } + + $check = ($n %= 11) < 2 ? 0 : 11 - $n; + + return $digits[13] == $check; + } + + /** + * @return int[] + */ + private function getDigits(string $input): array + { + return array_map( + 'intval', + str_split( + (string) preg_replace('/\D/', '', $input) + ) + ); + } +} diff --git a/vendor/workerman/validation/library/Rules/Consonant.php b/vendor/workerman/validation/library/Rules/Consonant.php new file mode 100644 index 0000000..43b57af --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Consonant.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function preg_match; + +/** + * Validates if the input contains only consonants. + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + */ +final class Consonant extends AbstractFilterRule +{ + /** + * {@inheritDoc} + */ + protected function validateFilteredInput(string $input): bool + { + return preg_match('/^(\s|[b-df-hj-np-tv-zB-DF-HJ-NP-TV-Z])*$/', $input) > 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/Contains.php b/vendor/workerman/validation/library/Rules/Contains.php new file mode 100644 index 0000000..0e1ec73 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Contains.php @@ -0,0 +1,84 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function in_array; +use function is_array; +use function is_scalar; +use function mb_detect_encoding; +use function mb_stripos; +use function mb_strpos; + +/** + * Validates if the input contains some value. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Marcelo Araujo <msaraujo@php.net> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class Contains extends AbstractRule +{ + /** + * @var mixed + */ + private $containsValue; + + /** + * @var bool + */ + private $identical; + + /** + * Initializes the Contains rule. + * + * @param mixed $containsValue Value that will be sought + * @param bool $identical Defines whether the value is identical, default is false + */ + public function __construct($containsValue, bool $identical = false) + { + $this->containsValue = $containsValue; + $this->identical = $identical; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (is_array($input)) { + return in_array($this->containsValue, $input, $this->identical); + } + + if (!is_scalar($input) || !is_scalar($this->containsValue)) { + return false; + } + + return $this->validateString((string) $input, (string) $this->containsValue); + } + + private function validateString(string $haystack, string $needle): bool + { + if ($needle === '') { + return false; + } + + $encoding = (string) mb_detect_encoding($haystack); + if ($this->identical) { + return mb_strpos($haystack, $needle, 0, $encoding) !== false; + } + + return mb_stripos($haystack, $needle, 0, $encoding) !== false; + } +} diff --git a/vendor/workerman/validation/library/Rules/ContainsAny.php b/vendor/workerman/validation/library/Rules/ContainsAny.php new file mode 100644 index 0000000..5f2d115 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/ContainsAny.php @@ -0,0 +1,54 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function array_map; + +/** + * Validates if the input contains at least one of defined values + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Kirill Dlussky <kirill@dlussky.ru> + */ +final class ContainsAny extends AbstractEnvelope +{ + /** + * Initializes the rule. + * + * @param mixed[] $needles At least one of the values provided must be found in input string or array + * @param bool $identical Defines whether the value should be compared strictly, when validating array + */ + public function __construct(array $needles, bool $identical = false) + { + parent::__construct( + new AnyOf(...$this->getRules($needles, $identical)), + ['needles' => $needles] + ); + } + + /** + * @param mixed[] $needles + * + * @return Contains[] + */ + private function getRules(array $needles, bool $identical): array + { + return array_map( + static function ($needle) use ($identical): Contains { + return new Contains($needle, $identical); + }, + $needles + ); + } +} diff --git a/vendor/workerman/validation/library/Rules/Control.php b/vendor/workerman/validation/library/Rules/Control.php new file mode 100644 index 0000000..f588d71 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Control.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function ctype_cntrl; + +/** + * Validates if all of the characters in the provided string, are control characters. + * + * @author Andre Ramaciotti <andre@ramaciotti.com> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + */ +final class Control extends AbstractFilterRule +{ + /** + * {@inheritDoc} + */ + protected function validateFilteredInput(string $input): bool + { + return ctype_cntrl($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Countable.php b/vendor/workerman/validation/library/Rules/Countable.php new file mode 100644 index 0000000..94f4cb1 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Countable.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Countable as CountableInterface; + +use function is_array; + +/** + * Validates if the input is countable. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author João Torquato <joao.otl@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class Countable extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_array($input) || $input instanceof CountableInterface; + } +} diff --git a/vendor/workerman/validation/library/Rules/CountryCode.php b/vendor/workerman/validation/library/Rules/CountryCode.php new file mode 100644 index 0000000..7b3bfa6 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/CountryCode.php @@ -0,0 +1,377 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; + +use function array_column; +use function array_keys; +use function implode; +use function sprintf; + +/** + * Validates whether the input is a country code in ISO 3166-1 standard. + * + * This rule supports the three sets of country codes (alpha-2, alpha-3, and numeric). + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Felipe Martins <me@fefas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class CountryCode extends AbstractSearcher +{ + /** + * The ISO representation of a country code. + */ + public const ALPHA2 = 'alpha-2'; + + /** + * The ISO3 representation of a country code. + */ + public const ALPHA3 = 'alpha-3'; + + /** + * The ISO-number representation of a country code. + */ + public const NUMERIC = 'numeric'; + + /** + * Position of the indexes of each set in the list of country codes. + */ + private const SET_INDEXES = [ + self::ALPHA2 => 0, + self::ALPHA3 => 1, + self::NUMERIC => 2, + ]; + + /** + * @see https://salsa.debian.org/iso-codes-team/iso-codes + */ + private const COUNTRY_CODES = [ + ['AD', 'AND', '020'], // Andorra + ['AE', 'ARE', '784'], // United Arab Emirates + ['AF', 'AFG', '004'], // Afghanistan + ['AG', 'ATG', '028'], // Antigua and Barbuda + ['AI', 'AFI', '262'], // French Afars and Issas + ['AI', 'AIA', '660'], // Anguilla + ['AL', 'ALB', '008'], // Albania + ['AM', 'ARM', '051'], // Armenia + ['AN', 'ANT', '530'], // Netherlands Antilles + ['AO', 'AGO', '024'], // Angola + ['AQ', 'ATA', '010'], // Antarctica + ['AR', 'ARG', '032'], // Argentina + ['AS', 'ASM', '016'], // American Samoa + ['AT', 'AUT', '040'], // Austria + ['AU', 'AUS', '036'], // Australia + ['AW', 'ABW', '533'], // Aruba + ['AX', 'ALA', '248'], // Åland Islands + ['AZ', 'AZE', '031'], // Azerbaijan + ['BA', 'BIH', '070'], // Bosnia and Herzegovina + ['BB', 'BRB', '052'], // Barbados + ['BD', 'BGD', '050'], // Bangladesh + ['BE', 'BEL', '056'], // Belgium + ['BF', 'BFA', '854'], // Burkina Faso + ['BG', 'BGR', '100'], // Bulgaria + ['BH', 'BHR', '048'], // Bahrain + ['BI', 'BDI', '108'], // Burundi + ['BJ', 'BEN', '204'], // Benin + ['BL', 'BLM', '652'], // Saint Barthélemy + ['BM', 'BMU', '060'], // Bermuda + ['BN', 'BRN', '096'], // Brunei Darussalam + ['BO', 'BOL', '068'], // Bolivia, Plurinational State of + ['BQ', 'ATB', null], // British Antarctic Territory + ['BQ', 'BES', '535'], // Bonaire, Sint Eustatius and Saba + ['BR', 'BRA', '076'], // Brazil + ['BS', 'BHS', '044'], // Bahamas + ['BT', 'BTN', '064'], // Bhutan + ['BU', 'BUR', '104'], // Burma, Socialist Republic of the Union of + ['BV', 'BVT', '074'], // Bouvet Island + ['BW', 'BWA', '072'], // Botswana + ['BY', 'BLR', '112'], // Belarus + ['BY', 'BYS', '112'], // Byelorussian SSR Soviet Socialist Republic + ['BZ', 'BLZ', '084'], // Belize + ['CA', 'CAN', '124'], // Canada + ['CC', 'CCK', '166'], // Cocos (Keeling) Islands + ['CD', 'COD', '180'], // Congo, The Democratic Republic of the + ['CF', 'CAF', '140'], // Central African Republic + ['CG', 'COG', '178'], // Congo + ['CH', 'CHE', '756'], // Switzerland + ['CI', 'CIV', '384'], // Côte d'Ivoire + ['CK', 'COK', '184'], // Cook Islands + ['CL', 'CHL', '152'], // Chile + ['CM', 'CMR', '120'], // Cameroon + ['CN', 'CHN', '156'], // China + ['CO', 'COL', '170'], // Colombia + ['CR', 'CRI', '188'], // Costa Rica + ['CS', 'CSK', '200'], // Czechoslovakia, Czechoslovak Socialist Republic + ['CS', 'SCG', '891'], // Serbia and Montenegro + ['CT', 'CTE', '128'], // Canton and Enderbury Islands + ['CU', 'CUB', '192'], // Cuba + ['CV', 'CPV', '132'], // Cabo Verde + ['CW', 'CUW', '531'], // Curaçao + ['CX', 'CXR', '162'], // Christmas Island + ['CY', 'CYP', '196'], // Cyprus + ['CZ', 'CZE', '203'], // Czechia + ['DD', 'DDR', '278'], // German Democratic Republic + ['DE', 'DEU', '276'], // Germany + ['DJ', 'DJI', '262'], // Djibouti + ['DK', 'DNK', '208'], // Denmark + ['DM', 'DMA', '212'], // Dominica + ['DO', 'DOM', '214'], // Dominican Republic + ['DY', 'DHY', '204'], // Dahomey + ['DZ', 'DZA', '012'], // Algeria + ['EC', 'ECU', '218'], // Ecuador + ['EE', 'EST', '233'], // Estonia + ['EG', 'EGY', '818'], // Egypt + ['EH', 'ESH', '732'], // Western Sahara + ['ER', 'ERI', '232'], // Eritrea + ['ES', 'ESP', '724'], // Spain + ['ET', 'ETH', '231'], // Ethiopia + ['FI', 'FIN', '246'], // Finland + ['FJ', 'FJI', '242'], // Fiji + ['FK', 'FLK', '238'], // Falkland Islands (Malvinas) + ['FM', 'FSM', '583'], // Micronesia, Federated States of + ['FO', 'FRO', '234'], // Faroe Islands + ['FQ', 'ATF', null], // French Southern and Antarctic Territories + ['FR', 'FRA', '250'], // France + ['FX', 'FXX', '249'], // France, Metropolitan + ['GA', 'GAB', '266'], // Gabon + ['GB', 'GBR', '826'], // United Kingdom + ['GD', 'GRD', '308'], // Grenada + ['GE', 'GEL', '296'], // Gilbert and Ellice Islands + ['GE', 'GEO', '268'], // Georgia + ['GF', 'GUF', '254'], // French Guiana + ['GG', 'GGY', '831'], // Guernsey + ['GH', 'GHA', '288'], // Ghana + ['GI', 'GIB', '292'], // Gibraltar + ['GL', 'GRL', '304'], // Greenland + ['GM', 'GMB', '270'], // Gambia + ['GN', 'GIN', '324'], // Guinea + ['GP', 'GLP', '312'], // Guadeloupe + ['GQ', 'GNQ', '226'], // Equatorial Guinea + ['GR', 'GRC', '300'], // Greece + ['GS', 'SGS', '239'], // South Georgia and the South Sandwich Islands + ['GT', 'GTM', '320'], // Guatemala + ['GU', 'GUM', '316'], // Guam + ['GW', 'GNB', '624'], // Guinea-Bissau + ['GY', 'GUY', '328'], // Guyana + ['HK', 'HKG', '344'], // Hong Kong + ['HM', 'HMD', '334'], // Heard Island and McDonald Islands + ['HN', 'HND', '340'], // Honduras + ['HR', 'HRV', '191'], // Croatia + ['HT', 'HTI', '332'], // Haiti + ['HU', 'HUN', '348'], // Hungary + ['HV', 'HVO', '854'], // Upper Volta, Republic of + ['ID', 'IDN', '360'], // Indonesia + ['IE', 'IRL', '372'], // Ireland + ['IL', 'ISR', '376'], // Israel + ['IM', 'IMN', '833'], // Isle of Man + ['IN', 'IND', '356'], // India + ['IO', 'IOT', '086'], // British Indian Ocean Territory + ['IQ', 'IRQ', '368'], // Iraq + ['IR', 'IRN', '364'], // Iran, Islamic Republic of + ['IS', 'ISL', '352'], // Iceland + ['IT', 'ITA', '380'], // Italy + ['JE', 'JEY', '832'], // Jersey + ['JM', 'JAM', '388'], // Jamaica + ['JO', 'JOR', '400'], // Jordan + ['JP', 'JPN', '392'], // Japan + ['JT', 'JTN', '396'], // Johnston Island + ['KE', 'KEN', '404'], // Kenya + ['KG', 'KGZ', '417'], // Kyrgyzstan + ['KH', 'KHM', '116'], // Cambodia + ['KI', 'KIR', '296'], // Kiribati + ['KM', 'COM', '174'], // Comoros + ['KN', 'KNA', '659'], // Saint Kitts and Nevis + ['KP', 'PRK', '408'], // Korea, Democratic People's Republic of + ['KR', 'KOR', '410'], // Korea, Republic of + ['KW', 'KWT', '414'], // Kuwait + ['KY', 'CYM', '136'], // Cayman Islands + ['KZ', 'KAZ', '398'], // Kazakhstan + ['LA', 'LAO', '418'], // Lao People's Democratic Republic + ['LB', 'LBN', '422'], // Lebanon + ['LC', 'LCA', '662'], // Saint Lucia + ['LI', 'LIE', '438'], // Liechtenstein + ['LK', 'LKA', '144'], // Sri Lanka + ['LR', 'LBR', '430'], // Liberia + ['LS', 'LSO', '426'], // Lesotho + ['LT', 'LTU', '440'], // Lithuania + ['LU', 'LUX', '442'], // Luxembourg + ['LV', 'LVA', '428'], // Latvia + ['LY', 'LBY', '434'], // Libya + ['MA', 'MAR', '504'], // Morocco + ['MC', 'MCO', '492'], // Monaco + ['MD', 'MDA', '498'], // Moldova, Republic of + ['ME', 'MNE', '499'], // Montenegro + ['MF', 'MAF', '663'], // Saint Martin (French part) + ['MG', 'MDG', '450'], // Madagascar + ['MH', 'MHL', '584'], // Marshall Islands + ['MI', 'MID', '488'], // Midway Islands + ['MK', 'MKD', '807'], // North Macedonia + ['ML', 'MLI', '466'], // Mali + ['MM', 'MMR', '104'], // Myanmar + ['MN', 'MNG', '496'], // Mongolia + ['MO', 'MAC', '446'], // Macao + ['MP', 'MNP', '580'], // Northern Mariana Islands + ['MQ', 'MTQ', '474'], // Martinique + ['MR', 'MRT', '478'], // Mauritania + ['MS', 'MSR', '500'], // Montserrat + ['MT', 'MLT', '470'], // Malta + ['MU', 'MUS', '480'], // Mauritius + ['MV', 'MDV', '462'], // Maldives + ['MW', 'MWI', '454'], // Malawi + ['MX', 'MEX', '484'], // Mexico + ['MY', 'MYS', '458'], // Malaysia + ['MZ', 'MOZ', '508'], // Mozambique + ['NA', 'NAM', '516'], // Namibia + ['NC', 'NCL', '540'], // New Caledonia + ['NE', 'NER', '562'], // Niger + ['NF', 'NFK', '574'], // Norfolk Island + ['NG', 'NGA', '566'], // Nigeria + ['NH', 'NHB', '548'], // New Hebrides + ['NI', 'NIC', '558'], // Nicaragua + ['NL', 'NLD', '528'], // Netherlands + ['NO', 'NOR', '578'], // Norway + ['NP', 'NPL', '524'], // Nepal + ['NQ', 'ATN', '216'], // Dronning Maud Land + ['NR', 'NRU', '520'], // Nauru + ['NT', 'NTZ', '536'], // Neutral Zone + ['NU', 'NIU', '570'], // Niue + ['NZ', 'NZL', '554'], // New Zealand + ['OM', 'OMN', '512'], // Oman + ['PA', 'PAN', '591'], // Panama + ['PC', 'PCI', '582'], // Pacific Islands (trust territory) + ['PE', 'PER', '604'], // Peru + ['PF', 'PYF', '258'], // French Polynesia + ['PG', 'PNG', '598'], // Papua New Guinea + ['PH', 'PHL', '608'], // Philippines + ['PK', 'PAK', '586'], // Pakistan + ['PL', 'POL', '616'], // Poland + ['PM', 'SPM', '666'], // Saint Pierre and Miquelon + ['PN', 'PCN', '612'], // Pitcairn + ['PR', 'PRI', '630'], // Puerto Rico + ['PS', 'PSE', '275'], // Palestine, State of + ['PT', 'PRT', '620'], // Portugal + ['PU', 'PUS', '849'], // US Miscellaneous Pacific Islands + ['PW', 'PLW', '585'], // Palau + ['PY', 'PRY', '600'], // Paraguay + ['PZ', 'PCZ', null], // Panama Canal Zone + ['QA', 'QAT', '634'], // Qatar + ['RE', 'REU', '638'], // Réunion + ['RH', 'RHO', '716'], // Southern Rhodesia + ['RO', 'ROU', '642'], // Romania + ['RS', 'SRB', '688'], // Serbia + ['RU', 'RUS', '643'], // Russian Federation + ['RW', 'RWA', '646'], // Rwanda + ['SA', 'SAU', '682'], // Saudi Arabia + ['SB', 'SLB', '090'], // Solomon Islands + ['SC', 'SYC', '690'], // Seychelles + ['SD', 'SDN', '729'], // Sudan + ['SE', 'SWE', '752'], // Sweden + ['SG', 'SGP', '702'], // Singapore + ['SH', 'SHN', '654'], // Saint Helena, Ascension and Tristan da Cunha + ['SI', 'SVN', '705'], // Slovenia + ['SJ', 'SJM', '744'], // Svalbard and Jan Mayen + ['SK', 'SKM', null], // Sikkim + ['SK', 'SVK', '703'], // Slovakia + ['SL', 'SLE', '694'], // Sierra Leone + ['SM', 'SMR', '674'], // San Marino + ['SN', 'SEN', '686'], // Senegal + ['SO', 'SOM', '706'], // Somalia + ['SR', 'SUR', '740'], // Suriname + ['SS', 'SSD', '728'], // South Sudan + ['ST', 'STP', '678'], // Sao Tome and Principe + ['SU', 'SUN', '810'], // USSR, Union of Soviet Socialist Republics + ['SV', 'SLV', '222'], // El Salvador + ['SX', 'SXM', '534'], // Sint Maarten (Dutch part) + ['SY', 'SYR', '760'], // Syrian Arab Republic + ['SZ', 'SWZ', '748'], // Eswatini + ['TC', 'TCA', '796'], // Turks and Caicos Islands + ['TD', 'TCD', '148'], // Chad + ['TF', 'ATF', '260'], // French Southern Territories + ['TG', 'TGO', '768'], // Togo + ['TH', 'THA', '764'], // Thailand + ['TJ', 'TJK', '762'], // Tajikistan + ['TK', 'TKL', '772'], // Tokelau + ['TL', 'TLS', '626'], // Timor-Leste + ['TM', 'TKM', '795'], // Turkmenistan + ['TN', 'TUN', '788'], // Tunisia + ['TO', 'TON', '776'], // Tonga + ['TP', 'TMP', '626'], // East Timor + ['TR', 'TUR', '792'], // Turkey + ['TT', 'TTO', '780'], // Trinidad and Tobago + ['TV', 'TUV', '798'], // Tuvalu + ['TW', 'TWN', '158'], // Taiwan, Province of China + ['TZ', 'TZA', '834'], // Tanzania, United Republic of + ['UA', 'UKR', '804'], // Ukraine + ['UG', 'UGA', '800'], // Uganda + ['UM', 'UMI', '581'], // United States Minor Outlying Islands + ['US', 'USA', '840'], // United States + ['UY', 'URY', '858'], // Uruguay + ['UZ', 'UZB', '860'], // Uzbekistan + ['VA', 'VAT', '336'], // Holy See (Vatican City State) + ['VC', 'VCT', '670'], // Saint Vincent and the Grenadines + ['VD', 'VDR', null], // Viet-Nam, Democratic Republic of + ['VE', 'VEN', '862'], // Venezuela, Bolivarian Republic of + ['VG', 'VGB', '092'], // Virgin Islands, British + ['VI', 'VIR', '850'], // Virgin Islands, U.S. + ['VN', 'VNM', '704'], // Viet Nam + ['VU', 'VUT', '548'], // Vanuatu + ['WF', 'WLF', '876'], // Wallis and Futuna + ['WK', 'WAK', '872'], // Wake Island + ['WS', 'WSM', '882'], // Samoa + ['YD', 'YMD', '720'], // Yemen, Democratic, People's Democratic Republic of + ['YE', 'YEM', '887'], // Yemen + ['YT', 'MYT', '175'], // Mayotte + ['YU', 'YUG', '891'], // Yugoslavia, Socialist Federal Republic of + ['ZA', 'ZAF', '710'], // South Africa + ['ZM', 'ZMB', '894'], // Zambia + ['ZR', 'ZAR', '180'], // Zaire, Republic of + ['ZW', 'ZWE', '716'], // Zimbabwe + ]; + + /** + * @var string + */ + private $set; + + /** + * Initializes the rule. + * + * @throws ComponentException If $set is not a valid set + */ + public function __construct(string $set = self::ALPHA2) + { + if (!isset(self::SET_INDEXES[$set])) { + throw new ComponentException( + sprintf( + '"%s" is not a valid set for ISO 3166-1 (Available: %s)', + $set, + implode(', ', array_keys(self::SET_INDEXES)) + ) + ); + } + + $this->set = $set; + } + + /** + * {@inheritDoc} + */ + protected function getDataSource(): array + { + return array_column(self::COUNTRY_CODES, self::SET_INDEXES[$this->set]); + } +} diff --git a/vendor/workerman/validation/library/Rules/Cpf.php b/vendor/workerman/validation/library/Rules/Cpf.php new file mode 100644 index 0000000..22f0d07 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Cpf.php @@ -0,0 +1,62 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function mb_strlen; +use function preg_match; +use function preg_replace; + +/** + * Validates whether the input is a CPF (Brazilian Natural Persons Register) number. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jair Henrique <jair.henrique@gmail.com> + * @author Jayson Reis <santosdosreis@gmail.com> + * @author Jean Pimentel <jeanfap@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class Cpf extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + // Code ported from jsfromhell.com + $c = preg_replace('/\D/', '', $input); + + if (mb_strlen($c) != 11 || preg_match('/^' . $c[0] . '{11}$/', $c) || $c === '01234567890') { + return false; + } + + $n = 0; + for ($s = 10, $i = 0; $s >= 2; ++$i, --$s) { + $n += $c[$i] * $s; + } + + if ($c[9] != (($n %= 11) < 2 ? 0 : 11 - $n)) { + return false; + } + + $n = 0; + for ($s = 11, $i = 0; $s >= 2; ++$i, --$s) { + $n += $c[$i] * $s; + } + + $check = ($n %= 11) < 2 ? 0 : 11 - $n; + + return $c[10] == $check; + } +} diff --git a/vendor/workerman/validation/library/Rules/CreditCard.php b/vendor/workerman/validation/library/Rules/CreditCard.php new file mode 100644 index 0000000..8a3d763 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/CreditCard.php @@ -0,0 +1,102 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; + +use function array_keys; +use function implode; +use function is_scalar; +use function preg_match; +use function preg_replace; +use function sprintf; + +/** + * Validates whether the input is a credit card number. + * + * @author Alexander Gorshkov <mazanax@yandex.ru> + * @author Andy Snell <andysnell@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jean Pimentel <jeanfap@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class CreditCard extends AbstractRule +{ + public const ANY = 'Any'; + + public const AMERICAN_EXPRESS = 'American Express'; + + public const DINERS_CLUB = 'Diners Club'; + + public const DISCOVER = 'Discover'; + + public const JCB = 'JCB'; + + public const MASTERCARD = 'MasterCard'; + + public const VISA = 'Visa'; + + private const BRAND_REGEX_LIST = [ + self::ANY => '/^[0-9]+$/', + self::AMERICAN_EXPRESS => '/^3[47]\d{13}$/', + self::DINERS_CLUB => '/^3(?:0[0-5]|[68]\d)\d{11}$/', + self::DISCOVER => '/^6(?:011|5\d{2})\d{12}$/', + self::JCB => '/^(?:2131|1800|35\d{3})\d{11}$/', + self::MASTERCARD => '/(5[1-5]|2[2-7])\d{14}$/', + self::VISA => '/^4\d{12}(?:\d{3})?$/', + ]; + + /** + * @var string + */ + private $brand; + + /** + * Initializes the rule. + * + * @throws ComponentException + */ + public function __construct(string $brand = self::ANY) + { + if (!isset(self::BRAND_REGEX_LIST[$brand])) { + throw new ComponentException( + sprintf( + '"%s" is not a valid credit card brand (Available: %s)', + $brand, + implode(', ', array_keys(self::BRAND_REGEX_LIST)) + ) + ); + } + + $this->brand = $brand; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_scalar($input)) { + return false; + } + + $input = (string) preg_replace('/[ .-]/', '', (string) $input); + if (!(new Luhn())->validate($input)) { + return false; + } + + return preg_match(self::BRAND_REGEX_LIST[$this->brand], $input) > 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/CurrencyCode.php b/vendor/workerman/validation/library/Rules/CurrencyCode.php new file mode 100644 index 0000000..db3fcd4 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/CurrencyCode.php @@ -0,0 +1,215 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +/** + * Validates currency codes in ISO 4217. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Justin Hook <justinhook88@yahoo.co.uk> + * @author Tim Strijdhorst <tstrijdhorst@users.noreply.github.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class CurrencyCode extends AbstractSearcher +{ + /** + * @see http://www.currency-iso.org/en/home/tables/table-a1.html + * + * {@inheritDoc} + */ + protected function getDataSource(): array + { + return [ + 'AED', // UAE Dirham + 'AFN', // Afghani + 'ALL', // Lek + 'AMD', // Armenian Dram + 'ANG', // Netherlands Antillean Guilder + 'AOA', // Kwanza + 'ARS', // Argentine Peso + 'AUD', // Australian Dollar + 'AWG', // Aruban Florin + 'AZN', // Azerbaijan Manat + 'BAM', // Convertible Mark + 'BBD', // Barbados Dollar + 'BDT', // Taka + 'BGN', // Bulgarian Lev + 'BHD', // Bahraini Dinar + 'BIF', // Burundi Franc + 'BMD', // Bermudian Dollar + 'BND', // Brunei Dollar + 'BOB', // Boliviano + 'BOV', // Mvdol + 'BRL', // Brazilian Real + 'BSD', // Bahamian Dollar + 'BTN', // Ngultrum + 'BWP', // Pula + 'BYN', // Belarusian Ruble + 'BZD', // Belize Dollar + 'CAD', // Canadian Dollar + 'CDF', // Congolese Franc + 'CHE', // WIR Euro + 'CHF', // Swiss Franc + 'CHW', // WIR Franc + 'CLF', // Unidad de Fomento + 'CLP', // Chilean Peso + 'CNY', // Yuan Renminbi + 'COP', // Colombian Peso + 'COU', // Unidad de Valor Real + 'CRC', // Costa Rican Colon + 'CUC', // Peso Convertible + 'CUP', // Cuban Peso + 'CVE', // Cabo Verde Escudo + 'CZK', // Czech Koruna + 'DJF', // Djibouti Franc + 'DKK', // Danish Krone + 'DOP', // Dominican Peso + 'DZD', // Algerian Dinar + 'EGP', // Egyptian Pound + 'ERN', // Nakfa + 'ETB', // Ethiopian Birr + 'EUR', // Euro + 'FJD', // Fiji Dollar + 'FKP', // Falkland Islands Pound + 'GBP', // Pound Sterling + 'GEL', // Lari + 'GHS', // Ghana Cedi + 'GIP', // Gibraltar Pound + 'GMD', // Dalasi + 'GNF', // Guinean Franc + 'GTQ', // Quetzal + 'GYD', // Guyana Dollar + 'HKD', // Hong Kong Dollar + 'HNL', // Lempira + 'HRK', // Kuna + 'HTG', // Gourde + 'HUF', // Forint + 'IDR', // Rupiah + 'ILS', // New Israeli Sheqel + 'INR', // Indian Rupee + 'IQD', // Iraqi Dinar + 'IRR', // Iranian Rial + 'ISK', // Iceland Krona + 'JMD', // Jamaican Dollar + 'JOD', // Jordanian Dinar + 'JPY', // Yen + 'KES', // Kenyan Shilling + 'KGS', // Som + 'KHR', // Riel + 'KMF', // Comorian Franc + 'KPW', // North Korean Won + 'KRW', // Won + 'KWD', // Kuwaiti Dinar + 'KYD', // Cayman Islands Dollar + 'KZT', // Tenge + 'LAK', // Lao Kip + 'LBP', // Lebanese Pound + 'LKR', // Sri Lanka Rupee + 'LRD', // Liberian Dollar + 'LSL', // Loti + 'LYD', // Libyan Dinar + 'MAD', // Moroccan Dirham + 'MDL', // Moldovan Leu + 'MGA', // Malagasy Ariary + 'MKD', // Denar + 'MMK', // Kyat + 'MNT', // Tugrik + 'MOP', // Pataca + 'MRU', // Ouguiya + 'MUR', // Mauritius Rupee + 'MVR', // Rufiyaa + 'MWK', // Malawi Kwacha + 'MXN', // Mexican Peso + 'MXV', // Mexican Unidad de Inversion (UDI) + 'MYR', // Malaysian Ringgit + 'MZN', // Mozambique Metical + 'NAD', // Namibia Dollar + 'NGN', // Naira + 'NIO', // Cordoba Oro + 'NOK', // Norwegian Krone + 'NPR', // Nepalese Rupee + 'NZD', // New Zealand Dollar + 'OMR', // Rial Omani + 'PAB', // Balboa + 'PEN', // Sol + 'PGK', // Kina + 'PHP', // Philippine Peso + 'PKR', // Pakistan Rupee + 'PLN', // Zloty + 'PYG', // Guarani + 'QAR', // Qatari Rial + 'RON', // Romanian Leu + 'RSD', // Serbian Dinar + 'RUB', // Russian Ruble + 'RWF', // Rwanda Franc + 'SAR', // Saudi Riyal + 'SBD', // Solomon Islands Dollar + 'SCR', // Seychelles Rupee + 'SDG', // Sudanese Pound + 'SEK', // Swedish Krona + 'SGD', // Singapore Dollar + 'SHP', // Saint Helena Pound + 'SLL', // Leone + 'SOS', // Somali Shilling + 'SRD', // Surinam Dollar + 'SSP', // South Sudanese Pound + 'STN', // Dobra + 'SVC', // El Salvador Colon + 'SYP', // Syrian Pound + 'SZL', // Lilangeni + 'THB', // Baht + 'TJS', // Somoni + 'TMT', // Turkmenistan New Manat + 'TND', // Tunisian Dinar + 'TOP', // Pa’anga + 'TRY', // Turkish Lira + 'TTD', // Trinidad and Tobago Dollar + 'TWD', // New Taiwan Dollar + 'TZS', // Tanzanian Shilling + 'UAH', // Hryvnia + 'UGX', // Uganda Shilling + 'USD', // US Dollar + 'USN', // US Dollar (Next day) + 'UYI', // Uruguay Peso en Unidades Indexadas (UI) + 'UYU', // Peso Uruguayo + 'UYW', // Unidad Previsional + 'UZS', // Uzbekistan Sum + 'VES', // Bolívar Soberano + 'VND', // Dong + 'VUV', // Vatu + 'WST', // Tala + 'XAF', // CFA Franc BEAC + 'XAG', // Silver + 'XAU', // Gold + 'XBA', // Bond Markets Unit European Composite Unit (EURCO) + 'XBB', // Bond Markets Unit European Monetary Unit (E.M.U.-6) + 'XBC', // Bond Markets Unit European Unit of Account 9 (E.U.A.-9) + 'XBD', // Bond Markets Unit European Unit of Account 17 (E.U.A.-17) + 'XCD', // East Caribbean Dollar + 'XDR', // SDR (Special Drawing Right) + 'XOF', // CFA Franc BCEAO + 'XPD', // Palladium + 'XPF', // CFP Franc + 'XPT', // Platinum + 'XSU', // Sucre + 'XTS', // Codes specifically reserved for testing purposes + 'XUA', // ADB Unit of Account + 'XXX', // The codes assigned for transactions where no currency is involved + 'YER', // Yemeni Rial + 'ZAR', // Rand + 'ZMW', // Zambian Kwacha + 'ZWL', // Zimbabwe Dollar + ]; + } +} diff --git a/vendor/workerman/validation/library/Rules/Date.php b/vendor/workerman/validation/library/Rules/Date.php new file mode 100644 index 0000000..7bad2b4 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Date.php @@ -0,0 +1,71 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; +use Respect\Validation\Helpers\CanValidateDateTime; + +use function date; +use function is_scalar; +use function preg_match; +use function sprintf; +use function strtotime; + +/** + * Validates if input is a date. + * + * @author Bruno Luiz da Silva <contato@brunoluiz.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Date extends AbstractRule +{ + use CanValidateDateTime; + + /** + * @var string + */ + private $format; + + /** + * @var string + */ + private $sample; + + /** + * Initializes the rule. + * + * @throws ComponentException + */ + public function __construct(string $format = 'Y-m-d') + { + if (!preg_match('/^[djSFmMnYy\W]+$/', $format)) { + throw new ComponentException(sprintf('"%s" is not a valid date format', $format)); + } + + $this->format = $format; + $this->sample = date($format, strtotime('2005-12-30')); + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_scalar($input)) { + return false; + } + + return $this->isDateTime($this->format, (string) $input); + } +} diff --git a/vendor/workerman/validation/library/Rules/DateTime.php b/vendor/workerman/validation/library/Rules/DateTime.php new file mode 100644 index 0000000..b0a8ee6 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/DateTime.php @@ -0,0 +1,70 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use DateTimeInterface; +use Respect\Validation\Helpers\CanValidateDateTime; + +use function date; +use function is_scalar; +use function strtotime; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class DateTime extends AbstractRule +{ + use CanValidateDateTime; + + /** + * @var string|null + */ + private $format; + + /** + * @var string + */ + private $sample; + + /** + * Initializes the rule. + */ + public function __construct(?string $format = null) + { + $this->format = $format; + $this->sample = date($format ?: 'c', strtotime('2005-12-30 01:02:03')); + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($input instanceof DateTimeInterface) { + return $this->format === null; + } + + if (!is_scalar($input)) { + return false; + } + + if ($this->format === null) { + return strtotime((string) $input) !== false; + } + + return $this->isDateTime($this->format, (string) $input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Digit.php b/vendor/workerman/validation/library/Rules/Digit.php new file mode 100644 index 0000000..b189d7a --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Digit.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function ctype_digit; + +/** + * Validates whether the input contains only digits. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + */ +final class Digit extends AbstractFilterRule +{ + /** + * {@inheritDoc} + */ + protected function validateFilteredInput(string $input): bool + { + return ctype_digit($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Directory.php b/vendor/workerman/validation/library/Rules/Directory.php new file mode 100644 index 0000000..52a6098 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Directory.php @@ -0,0 +1,49 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Directory as NativeDirectory; +use SplFileInfo; + +use function is_dir; +use function is_scalar; + +/** + * Validates if the given path is a directory. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class Directory extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($input instanceof SplFileInfo) { + return $input->isDir(); + } + + if ($input instanceof NativeDirectory) { + return true; + } + + if (!is_scalar($input)) { + return false; + } + + return is_dir((string) $input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Domain.php b/vendor/workerman/validation/library/Rules/Domain.php new file mode 100644 index 0000000..6100ac0 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Domain.php @@ -0,0 +1,184 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\DomainException; +use Respect\Validation\Exceptions\NestedValidationException; +use Respect\Validation\Exceptions\ValidationException; +use Respect\Validation\Validatable; + +use function array_merge; +use function array_pop; +use function count; +use function explode; +use function iterator_to_array; +use function mb_substr_count; + +/** + * Validates whether the input is a valid domain name or not. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Mehmet Tolga Avcioglu <mehmet@activecom.net> + * @author Nick Lombard <github@jigsoft.co.za> + * @author Róbert Nagy <vrnagy@gmail.com> + */ +final class Domain extends AbstractRule +{ + /** + * @var Validatable + */ + private $genericRule; + + /** + * @var Validatable + */ + private $tldRule; + + /** + * @var Validatable + */ + private $partsRule; + + public function __construct(bool $tldCheck = true) + { + $this->genericRule = $this->createGenericRule(); + $this->tldRule = $this->createTldRule($tldCheck); + $this->partsRule = $this->createPartsRule(); + } + + /** + * {@inheritDoc} + */ + public function assert($input): void + { + $exceptions = []; + + $this->collectAssertException($exceptions, $this->genericRule, $input); + $this->throwExceptions($exceptions, $input); + + $parts = explode('.', (string) $input); + if (count($parts) >= 2) { + $this->collectAssertException($exceptions, $this->tldRule, array_pop($parts)); + } + + foreach ($parts as $part) { + $this->collectAssertException($exceptions, $this->partsRule, $part); + } + + $this->throwExceptions($exceptions, $input); + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + try { + $this->assert($input); + } catch (ValidationException $exception) { + return false; + } + + return true; + } + + /** + * {@inheritDoc} + */ + public function check($input): void + { + try { + $this->assert($input); + } catch (NestedValidationException $exception) { + /** @var ValidationException $childException */ + foreach ($exception as $childException) { + throw $childException; + } + + throw $exception; + } + } + + /** + * @param ValidationException[] $exceptions + * @param mixed $input + */ + private function collectAssertException(array &$exceptions, Validatable $validator, $input): void + { + try { + $validator->assert($input); + } catch (NestedValidationException $nestedValidationException) { + $exceptions = array_merge( + $exceptions, + iterator_to_array($nestedValidationException) + ); + } catch (ValidationException $validationException) { + $exceptions[] = $validationException; + } + } + + private function createGenericRule(): Validatable + { + return new AllOf( + new StringType(), + new NoWhitespace(), + new Contains('.'), + new Length(3) + ); + } + + private function createTldRule(bool $realTldCheck): Validatable + { + if ($realTldCheck) { + return new Tld(); + } + + return new AllOf( + new Not(new StartsWith('-')), + new NoWhitespace(), + new Length(2) + ); + } + + private function createPartsRule(): Validatable + { + return new AllOf( + new Alnum('-'), + new Not(new StartsWith('-')), + new AnyOf( + new Not(new Contains('--')), + new Callback(static function ($str) { + return mb_substr_count($str, '--') == 1; + }) + ), + new Not(new EndsWith('-')) + ); + } + + /** + * @param ValidationException[] $exceptions + * @param mixed $input + */ + private function throwExceptions(array $exceptions, $input): void + { + if (count($exceptions)) { + /** @var DomainException $domainException */ + $domainException = $this->reportError($input); + $domainException->addChildren($exceptions); + + throw $domainException; + } + } +} diff --git a/vendor/workerman/validation/library/Rules/Each.php b/vendor/workerman/validation/library/Rules/Each.php new file mode 100644 index 0000000..a469955 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Each.php @@ -0,0 +1,100 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\EachException; +use Respect\Validation\Exceptions\ValidationException; +use Respect\Validation\Helpers\CanValidateIterable; +use Respect\Validation\Validatable; + +/** + * Validates whether each value in the input is valid according to another rule. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class Each extends AbstractRule +{ + use CanValidateIterable; + + /** + * @var Validatable + */ + private $rule; + + /** + * Initializes the constructor. + */ + public function __construct(Validatable $rule) + { + $this->rule = $rule; + } + + /** + * {@inheritDoc} + */ + public function assert($input): void + { + if (!$this->isIterable($input)) { + throw $this->reportError($input); + } + + $exceptions = []; + foreach ($input as $value) { + try { + $this->rule->assert($value); + } catch (ValidationException $exception) { + $exceptions[] = $exception; + } + } + + if (!empty($exceptions)) { + /** @var EachException $eachException */ + $eachException = $this->reportError($input); + $eachException->addChildren($exceptions); + + throw $eachException; + } + } + + /** + * {@inheritDoc} + */ + public function check($input): void + { + if (!$this->isIterable($input)) { + throw $this->reportError($input); + } + + foreach ($input as $value) { + $this->rule->check($value); + } + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + try { + $this->check($input); + } catch (ValidationException $exception) { + return false; + } + + return true; + } +} diff --git a/vendor/workerman/validation/library/Rules/Email.php b/vendor/workerman/validation/library/Rules/Email.php new file mode 100644 index 0000000..8ef7d70 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Email.php @@ -0,0 +1,74 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Egulias\EmailValidator\EmailValidator; +use Egulias\EmailValidator\Validation\RFCValidation; + +use function class_exists; +use function filter_var; +use function is_string; + +use const FILTER_VALIDATE_EMAIL; + +/** + * Validates an email address. + * + * @author Andrey Kolyshkin <a.kolyshkin@semrush.com> + * @author Eduardo Gulias Davis <me@egulias.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Paul Karikari <paulkarikari1@gmail.com> + */ +final class Email extends AbstractRule +{ + /** + * @var EmailValidator|null + */ + private $validator; + + /** + * Initializes the rule assigning the EmailValidator instance. + * + * If the EmailValidator instance is not defined, tries to create one. + */ + public function __construct(?EmailValidator $validator = null) + { + $this->validator = $validator ?: $this->createEmailValidator(); + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_string($input)) { + return false; + } + + if ($this->validator !== null) { + return $this->validator->isValid($input, new RFCValidation()); + } + + return (bool) filter_var($input, FILTER_VALIDATE_EMAIL); + } + + private function createEmailValidator(): ?EmailValidator + { + if (class_exists(EmailValidator::class)) { + return new EmailValidator(); + } + + return null; + } +} diff --git a/vendor/workerman/validation/library/Rules/EndsWith.php b/vendor/workerman/validation/library/Rules/EndsWith.php new file mode 100644 index 0000000..81775bf --- /dev/null +++ b/vendor/workerman/validation/library/Rules/EndsWith.php @@ -0,0 +1,93 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function end; +use function is_array; +use function mb_detect_encoding; +use function mb_strlen; +use function mb_strripos; +use function mb_strrpos; + +/** + * Validates only if the value is at the end of the input. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Hugo Hamon <hugo.hamon@sensiolabs.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class EndsWith extends AbstractRule +{ + /** + * @var mixed + */ + private $endValue; + + /** + * @var bool + */ + private $identical; + + /** + * @param mixed $endValue + */ + public function __construct($endValue, bool $identical = false) + { + $this->endValue = $endValue; + $this->identical = $identical; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($this->identical) { + return $this->validateIdentical($input); + } + + return $this->validateEquals($input); + } + + /** + * @param mixed $input + */ + private function validateEquals($input): bool + { + if (is_array($input)) { + return end($input) == $this->endValue; + } + + $encoding = (string) mb_detect_encoding($input); + $endPosition = mb_strlen($input, $encoding) - mb_strlen($this->endValue, $encoding); + + return mb_strripos($input, $this->endValue, -1, $encoding) === $endPosition; + } + + /** + * @param mixed $input + */ + private function validateIdentical($input): bool + { + if (is_array($input)) { + return end($input) === $this->endValue; + } + + $encoding = (string) mb_detect_encoding($input); + $endPosition = mb_strlen($input, $encoding) - mb_strlen($this->endValue, $encoding); + + return mb_strrpos($input, $this->endValue, 0, $encoding) === $endPosition; + } +} diff --git a/vendor/workerman/validation/library/Rules/Equals.php b/vendor/workerman/validation/library/Rules/Equals.php new file mode 100644 index 0000000..6bac4a1 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Equals.php @@ -0,0 +1,47 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +/** + * Validates if the input is equal to some value. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Hugo Hamon <hugo.hamon@sensiolabs.com> + */ +final class Equals extends AbstractRule +{ + /** + * @var mixed + */ + private $compareTo; + + /** + * Initializes the rule. + * + * @param mixed $compareTo + */ + public function __construct($compareTo) + { + $this->compareTo = $compareTo; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return $input == $this->compareTo; + } +} diff --git a/vendor/workerman/validation/library/Rules/Equivalent.php b/vendor/workerman/validation/library/Rules/Equivalent.php new file mode 100644 index 0000000..2ca060d --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Equivalent.php @@ -0,0 +1,61 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_scalar; +use function mb_strtoupper; + +/** + * Validates if the input is equivalent to some value. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Equivalent extends AbstractRule +{ + /** + * @var mixed + */ + private $compareTo; + + /** + * Initializes the rule. + * + * @param mixed $compareTo + */ + public function __construct($compareTo) + { + $this->compareTo = $compareTo; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (is_scalar($input)) { + return $this->isStringEquivalent((string) $input); + } + + return $input == $this->compareTo; + } + + private function isStringEquivalent(string $input): bool + { + if (!is_scalar($this->compareTo)) { + return false; + } + + return mb_strtoupper((string) $input) === mb_strtoupper((string) $this->compareTo); + } +} diff --git a/vendor/workerman/validation/library/Rules/Even.php b/vendor/workerman/validation/library/Rules/Even.php new file mode 100644 index 0000000..b1deaf3 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Even.php @@ -0,0 +1,40 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function filter_var; + +use const FILTER_VALIDATE_INT; + +/** + * Validates whether the input is an even number or not. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jean Pimentel <jeanfap@gmail.com> + * @author Paul Karikari <paulkarikari1@gmail.com> + */ +final class Even extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (filter_var($input, FILTER_VALIDATE_INT) === false) { + return false; + } + + return (int) $input % 2 === 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/Executable.php b/vendor/workerman/validation/library/Rules/Executable.php new file mode 100644 index 0000000..c52476b --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Executable.php @@ -0,0 +1,44 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use SplFileInfo; + +use function is_executable; +use function is_scalar; + +/** + * Validates if a file is an executable. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class Executable extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($input instanceof SplFileInfo) { + return $input->isExecutable(); + } + + if (!is_scalar($input)) { + return false; + } + + return is_executable((string) $input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Exists.php b/vendor/workerman/validation/library/Rules/Exists.php new file mode 100644 index 0000000..dcb5879 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Exists.php @@ -0,0 +1,38 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use SplFileInfo; + +use function file_exists; +use function is_string; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + * @author William Espindola <oi@williamespindola.com.br> + */ +final class Exists extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($input instanceof SplFileInfo) { + $input = $input->getPathname(); + } + + return is_string($input) && file_exists($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Extension.php b/vendor/workerman/validation/library/Rules/Extension.php new file mode 100644 index 0000000..31631e8 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Extension.php @@ -0,0 +1,59 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use SplFileInfo; + +use function is_string; +use function pathinfo; + +use const PATHINFO_EXTENSION; + +/** + * Validate file extensions. + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Extension extends AbstractRule +{ + /** + * @var string + */ + private $extension; + + /** + * Initializes the rule. + */ + public function __construct(string $extension) + { + $this->extension = $extension; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($input instanceof SplFileInfo) { + return $this->extension === $input->getExtension(); + } + + if (!is_string($input)) { + return false; + } + + return $this->extension === pathinfo($input, PATHINFO_EXTENSION); + } +} diff --git a/vendor/workerman/validation/library/Rules/Factor.php b/vendor/workerman/validation/library/Rules/Factor.php new file mode 100644 index 0000000..64ec48a --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Factor.php @@ -0,0 +1,65 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function abs; +use function is_integer; +use function is_numeric; + +/** + * Validates if the input is a factor of the defined dividend. + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author David Meister <thedavidmeister@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Factor extends AbstractRule +{ + /** + * @var int + */ + private $dividend; + + /** + * Initializes the rule. + */ + public function __construct(int $dividend) + { + $this->dividend = $dividend; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + // Every integer is a factor of zero, and zero is the only integer that + // has zero for a factor. + if ($this->dividend === 0) { + return true; + } + + // Factors must be integers that are not zero. + if (!is_numeric($input) || (int) $input != $input || $input == 0) { + return false; + } + + $input = (int) abs((int) $input); + $dividend = (int) abs($this->dividend); + + // The dividend divided by the input must be an integer if input is a + // factor of the dividend. + return is_integer($dividend / $input); + } +} diff --git a/vendor/workerman/validation/library/Rules/FalseVal.php b/vendor/workerman/validation/library/Rules/FalseVal.php new file mode 100644 index 0000000..c935c57 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/FalseVal.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function filter_var; + +use const FILTER_NULL_ON_FAILURE; +use const FILTER_VALIDATE_BOOLEAN; + +/** + * Validates if a value is considered as false. + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class FalseVal extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return filter_var($input, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) === false; + } +} diff --git a/vendor/workerman/validation/library/Rules/Fibonacci.php b/vendor/workerman/validation/library/Rules/Fibonacci.php new file mode 100644 index 0000000..a63bdf3 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Fibonacci.php @@ -0,0 +1,45 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_numeric; + +/** + * Validates whether the input follows the Fibonacci integer sequence. + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Samuel Heinzmann <samuel.heinzmann@swisscom.com> + */ +final class Fibonacci extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_numeric($input)) { + return false; + } + + $sequence = [0, 1]; + $position = 1; + while ($input > $sequence[$position]) { + ++$position; + $sequence[$position] = $sequence[$position - 1] + $sequence[$position - 2]; + } + + return $sequence[$position] === (int) $input; + } +} diff --git a/vendor/workerman/validation/library/Rules/File.php b/vendor/workerman/validation/library/Rules/File.php new file mode 100644 index 0000000..cd11df0 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/File.php @@ -0,0 +1,40 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use SplFileInfo; + +use function is_file; +use function is_string; + +/** + * Validates whether file input is as a regular filename. + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class File extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($input instanceof SplFileInfo) { + return $input->isFile(); + } + + return is_string($input) && is_file($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/FilterVar.php b/vendor/workerman/validation/library/Rules/FilterVar.php new file mode 100644 index 0000000..0f08729 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/FilterVar.php @@ -0,0 +1,62 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; + +use function in_array; + +use const FILTER_VALIDATE_BOOLEAN; +use const FILTER_VALIDATE_DOMAIN; +use const FILTER_VALIDATE_EMAIL; +use const FILTER_VALIDATE_FLOAT; +use const FILTER_VALIDATE_INT; +use const FILTER_VALIDATE_IP; +use const FILTER_VALIDATE_REGEXP; +use const FILTER_VALIDATE_URL; + +/** + * Validates the input with the PHP's filter_var() function. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class FilterVar extends AbstractEnvelope +{ + private const ALLOWED_FILTERS = [ + FILTER_VALIDATE_BOOLEAN, + FILTER_VALIDATE_DOMAIN, + FILTER_VALIDATE_EMAIL, + FILTER_VALIDATE_FLOAT, + FILTER_VALIDATE_INT, + FILTER_VALIDATE_IP, + FILTER_VALIDATE_REGEXP, + FILTER_VALIDATE_URL, + ]; + + /** + * Initializes the rule. + * + * @param mixed $options + * + * @throws ComponentException + */ + public function __construct(int $filter, $options = []) + { + if (!in_array($filter, self::ALLOWED_FILTERS)) { + throw new ComponentException('Cannot accept the given filter'); + } + + parent::__construct(new Callback('filter_var', $filter, $options)); + } +} diff --git a/vendor/workerman/validation/library/Rules/Finite.php b/vendor/workerman/validation/library/Rules/Finite.php new file mode 100644 index 0000000..1ae4408 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Finite.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_finite; +use function is_numeric; + +/** + * Validates if the input is a finite number. + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Finite extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_numeric($input) && is_finite((float) $input); + } +} diff --git a/vendor/workerman/validation/library/Rules/FloatType.php b/vendor/workerman/validation/library/Rules/FloatType.php new file mode 100644 index 0000000..7a40757 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/FloatType.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_float; + +/** + * Validates whether the type of the input is float. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Reginaldo Junior <76regi@gmail.com> + */ +final class FloatType extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_float($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/FloatVal.php b/vendor/workerman/validation/library/Rules/FloatVal.php new file mode 100644 index 0000000..8551499 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/FloatVal.php @@ -0,0 +1,38 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function filter_var; +use function is_float; + +use const FILTER_VALIDATE_FLOAT; + +/** + * Validate whether the input value is float. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jayson Reis <santosdosreis@gmail.com> + */ +final class FloatVal extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_float(filter_var($input, FILTER_VALIDATE_FLOAT)); + } +} diff --git a/vendor/workerman/validation/library/Rules/Graph.php b/vendor/workerman/validation/library/Rules/Graph.php new file mode 100644 index 0000000..00e7857 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Graph.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function ctype_graph; + +/** + * Validates if all characters in the input are printable and actually creates visible output (no white space). + * + * @author Andre Ramaciotti <andre@ramaciotti.com> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + */ +final class Graph extends AbstractFilterRule +{ + /** + * {@inheritDoc} + */ + protected function validateFilteredInput(string $input): bool + { + return ctype_graph($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/GreaterThan.php b/vendor/workerman/validation/library/Rules/GreaterThan.php new file mode 100644 index 0000000..cb820c4 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/GreaterThan.php @@ -0,0 +1,30 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +/** + * Validates whether the input is less than a value. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class GreaterThan extends AbstractComparison +{ + /** + * {@inheritDoc} + */ + protected function compare($left, $right): bool + { + return $left > $right; + } +} diff --git a/vendor/workerman/validation/library/Rules/HexRgbColor.php b/vendor/workerman/validation/library/Rules/HexRgbColor.php new file mode 100644 index 0000000..a5f9899 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/HexRgbColor.php @@ -0,0 +1,28 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +/** + * Validates weather the input is a hex RGB color or not. + * + * @author Davide Pastore <pasdavide@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class HexRgbColor extends AbstractEnvelope +{ + public function __construct() + { + parent::__construct(new Regex('/^#?([0-9A-F]{3}|[0-9A-F]{6})$/')); + } +} diff --git a/vendor/workerman/validation/library/Rules/Iban.php b/vendor/workerman/validation/library/Rules/Iban.php new file mode 100644 index 0000000..b71e651 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Iban.php @@ -0,0 +1,152 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function bcmod; +use function is_string; +use function ord; +use function preg_match; +use function preg_replace_callback; +use function str_replace; +use function strlen; +use function substr; + +/** + * Validates whether the input is a valid IBAN (International Bank Account Number) or not. + * + * @author Mazen Touati <mazen_touati@hotmail.com> + */ +final class Iban extends AbstractRule +{ + private const COUNTRIES_LENGTHS = [ + 'AL' => 28, + 'AD' => 24, + 'AT' => 20, + 'AZ' => 28, + 'BH' => 22, + 'BE' => 16, + 'BA' => 20, + 'BR' => 29, + 'BG' => 22, + 'CR' => 21, + 'HR' => 21, + 'CY' => 28, + 'CZ' => 24, + 'DK' => 18, + 'DO' => 28, + 'EE' => 20, + 'FO' => 18, + 'FI' => 18, + 'FR' => 27, + 'GE' => 22, + 'DE' => 22, + 'GI' => 23, + 'GR' => 27, + 'GL' => 18, + 'GT' => 28, + 'HU' => 28, + 'IS' => 26, + 'IE' => 22, + 'IL' => 23, + 'IT' => 27, + 'JO' => 30, + 'KZ' => 20, + 'KW' => 30, + 'LV' => 21, + 'LB' => 28, + 'LI' => 21, + 'LT' => 20, + 'LU' => 20, + 'MK' => 19, + 'MT' => 31, + 'MR' => 27, + 'MU' => 30, + 'MD' => 24, + 'MC' => 27, + 'ME' => 22, + 'NL' => 18, + 'NO' => 15, + 'PK' => 24, + 'PL' => 28, + 'PS' => 29, + 'PT' => 25, + 'QA' => 29, + 'XK' => 20, + 'RO' => 24, + 'LC' => 32, + 'SM' => 27, + 'ST' => 25, + 'SA' => 24, + 'RS' => 22, + 'SC' => 31, + 'SK' => 24, + 'SI' => 19, + 'ES' => 24, + 'SE' => 24, + 'CH' => 21, + 'TL' => 23, + 'TN' => 24, + 'TR' => 26, + 'UA' => 29, + 'AE' => 23, + 'GB' => 22, + 'VG' => 24, + ]; + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_string($input)) { + return false; + } + + $iban = str_replace(' ', '', $input); + if (!preg_match('/[A-Z0-9]{15,34}/', $iban)) { + return false; + } + + $countryCode = substr($iban, 0, 2); + if (!$this->hasValidCountryLength($iban, $countryCode)) { + return false; + } + + $checkDigits = substr($iban, 2, 2); + $bban = substr($iban, 4); + $rearranged = $bban . $countryCode . $checkDigits; + + return bcmod($this->convertToInteger($rearranged), '97') === '1'; + } + + private function hasValidCountryLength(string $iban, string $countryCode): bool + { + if (!isset(self::COUNTRIES_LENGTHS[$countryCode])) { + return false; + } + + return strlen($iban) === self::COUNTRIES_LENGTHS[$countryCode]; + } + + private function convertToInteger(string $reArrangedIban): string + { + return (string) preg_replace_callback( + '/[A-Z]/', + static function (array $match): int { + return ord($match[0]) - 55; + }, + $reArrangedIban + ); + } +} diff --git a/vendor/workerman/validation/library/Rules/Identical.php b/vendor/workerman/validation/library/Rules/Identical.php new file mode 100644 index 0000000..1ef22a3 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Identical.php @@ -0,0 +1,45 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +/** + * Validates if the input is identical to some value. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Identical extends AbstractRule +{ + /** + * @var mixed + */ + private $compareTo; + + /** + * Initializes the rule. + * + * @param mixed $compareTo + */ + public function __construct($compareTo) + { + $this->compareTo = $compareTo; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return $input === $this->compareTo; + } +} diff --git a/vendor/workerman/validation/library/Rules/Image.php b/vendor/workerman/validation/library/Rules/Image.php new file mode 100644 index 0000000..ecdbd2c --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Image.php @@ -0,0 +1,66 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use finfo; +use SplFileInfo; + +use function is_file; +use function is_string; +use function mb_strpos; + +use const FILEINFO_MIME_TYPE; + +/** + * Validates if the file is a valid image by checking its MIME type. + * + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Guilherme Siani <guilherme@siani.com.br> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Image extends AbstractRule +{ + /** + * @var finfo + */ + private $fileInfo; + + /** + * Initializes the rule. + */ + public function __construct(?finfo $fileInfo = null) + { + $this->fileInfo = $fileInfo ?: new finfo(FILEINFO_MIME_TYPE); + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($input instanceof SplFileInfo) { + return $this->validate($input->getPathname()); + } + + if (!is_string($input)) { + return false; + } + + if (!is_file($input)) { + return false; + } + + return mb_strpos((string) $this->fileInfo->file($input), 'image/') === 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/Imei.php b/vendor/workerman/validation/library/Rules/Imei.php new file mode 100644 index 0000000..b40cd30 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Imei.php @@ -0,0 +1,50 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_scalar; +use function mb_strlen; +use function preg_replace; + +/** + * Validates is the input is a valid IMEI. + * + * @author Alexander Gorshkov <mazanax@yandex.ru> + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Diego Oliveira <contato@diegoholiveira.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Imei extends AbstractRule +{ + private const IMEI_SIZE = 15; + + /** + * @see https://en.wikipedia.org/wiki/International_Mobile_Station_Equipment_Identity + * + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_scalar($input)) { + return false; + } + + $numbers = (string) preg_replace('/\D/', '', (string) $input); + if (mb_strlen($numbers) != self::IMEI_SIZE) { + return false; + } + + return (new Luhn())->validate($numbers); + } +} diff --git a/vendor/workerman/validation/library/Rules/In.php b/vendor/workerman/validation/library/Rules/In.php new file mode 100644 index 0000000..448ee8a --- /dev/null +++ b/vendor/workerman/validation/library/Rules/In.php @@ -0,0 +1,99 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function in_array; +use function is_array; +use function mb_detect_encoding; +use function mb_stripos; +use function mb_strpos; + +/** + * Validates if the input can be found in a defined array or string. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class In extends AbstractRule +{ + /** + * @var mixed[]|mixed + */ + private $haystack; + + /** + * @var bool + */ + private $compareIdentical; + + /** + * Initializes the rule with the haystack and optionally compareIdentical flag. + * + * @param mixed[]|mixed $haystack + */ + public function __construct($haystack, bool $compareIdentical = false) + { + $this->haystack = $haystack; + $this->compareIdentical = $compareIdentical; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($this->compareIdentical) { + return $this->validateIdentical($input); + } + + return $this->validateEquals($input); + } + + /** + * @param mixed $input + */ + private function validateEquals($input): bool + { + if (is_array($this->haystack)) { + return in_array($input, $this->haystack); + } + + if ($input === null || $input === '') { + return $input == $this->haystack; + } + + $inputString = (string) $input; + + return mb_stripos($this->haystack, $inputString, 0, (string) mb_detect_encoding($inputString)) !== false; + } + + /** + * @param mixed $input + */ + private function validateIdentical($input): bool + { + if (is_array($this->haystack)) { + return in_array($input, $this->haystack, true); + } + + if ($input === null || $input === '') { + return $input === $this->haystack; + } + + $inputString = (string) $input; + + return mb_strpos($this->haystack, $inputString, 0, (string) mb_detect_encoding($inputString)) !== false; + } +} diff --git a/vendor/workerman/validation/library/Rules/Infinite.php b/vendor/workerman/validation/library/Rules/Infinite.php new file mode 100644 index 0000000..ad2063e --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Infinite.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_infinite; +use function is_numeric; + +/** + * Validates if the input is an infinite number + * + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Infinite extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_numeric($input) && is_infinite((float) $input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Instance.php b/vendor/workerman/validation/library/Rules/Instance.php new file mode 100644 index 0000000..b4d1992 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Instance.php @@ -0,0 +1,45 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +/** + * Validates if the input is an instance of the given class or interface. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Instance extends AbstractRule +{ + /** + * @var string + */ + private $instanceName; + + /** + * Initializes the rule with the expected instance name. + */ + public function __construct(string $instanceName) + { + $this->instanceName = $instanceName; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return $input instanceof $this->instanceName; + } +} diff --git a/vendor/workerman/validation/library/Rules/IntType.php b/vendor/workerman/validation/library/Rules/IntType.php new file mode 100644 index 0000000..ae528bb --- /dev/null +++ b/vendor/workerman/validation/library/Rules/IntType.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_int; + +/** + * Validates whether the type of the input is integer. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class IntType extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_int($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/IntVal.php b/vendor/workerman/validation/library/Rules/IntVal.php new file mode 100644 index 0000000..4b9979d --- /dev/null +++ b/vendor/workerman/validation/library/Rules/IntVal.php @@ -0,0 +1,41 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function ctype_digit; +use function is_int; + +/** + * Validates if the input is an integer. + * + * @author Adam Benson <adam.benson@bigcommerce.com> + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Andrei Drulchenko <andrdru@gmail.com> + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class IntVal extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (is_int($input)) { + return true; + } + + return ctype_digit($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Ip.php b/vendor/workerman/validation/library/Rules/Ip.php new file mode 100644 index 0000000..ccebc76 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Ip.php @@ -0,0 +1,213 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; + +use function bccomp; +use function explode; +use function filter_var; +use function ip2long; +use function is_string; +use function long2ip; +use function mb_strpos; +use function mb_substr_count; +use function sprintf; +use function str_repeat; +use function str_replace; +use function strtr; + +use const FILTER_VALIDATE_IP; + +/** + * Validates whether the input is a valid IP address. + * + * This validator uses the native filter_var() PHP function. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Luís Otávio Cobucci Oblonczyk <lcobucci@gmail.com> + */ +final class Ip extends AbstractRule +{ + /** + * @var string|null + */ + private $range; + + /** + * @var int|null + */ + private $options; + + /** + * @var string|null + */ + private $startAddress; + + /** + * @var string|null + */ + private $endAddress; + + /** + * @var string|null + */ + private $mask; + + /** + * Initializes the rule defining the range and some options for filter_var(). + * + * @throws ComponentException In case the range is invalid + */ + public function __construct(string $range = '*', ?int $options = null) + { + $this->parseRange($range); + $this->range = $this->createRange(); + $this->options = $options; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_string($input)) { + return false; + } + + if (!$this->verifyAddress($input)) { + return false; + } + + if ($this->mask) { + return $this->belongsToSubnet($input); + } + + if ($this->startAddress && $this->endAddress) { + return $this->verifyNetwork($input); + } + + return true; + } + + private function createRange(): ?string + { + if ($this->endAddress && $this->endAddress) { + return $this->startAddress . '-' . $this->endAddress; + } + + if ($this->startAddress && $this->mask) { + return $this->startAddress . '/' . long2ip((int) $this->mask); + } + + return null; + } + + private function parseRange(string $input): void + { + if ($input == '*' || $input == '*.*.*.*' || $input == '0.0.0.0-255.255.255.255') { + return; + } + + if (mb_strpos($input, '-') !== false) { + [$this->startAddress, $this->endAddress] = explode('-', $input); + + if ($this->startAddress !== null && !$this->verifyAddress($this->startAddress)) { + throw new ComponentException('Invalid network range'); + } + + if ($this->endAddress !== null && !$this->verifyAddress($this->endAddress)) { + throw new ComponentException('Invalid network range'); + } + + return; + } + + if (mb_strpos($input, '*') !== false) { + $this->parseRangeUsingWildcards($input); + + return; + } + + if (mb_strpos($input, '/') !== false) { + $this->parseRangeUsingCidr($input); + + return; + } + + throw new ComponentException('Invalid network range'); + } + + private function fillAddress(string $address, string $fill = '*'): string + { + return $address . str_repeat('.' . $fill, 3 - mb_substr_count($address, '.')); + } + + private function parseRangeUsingWildcards(string $input): void + { + $address = $this->fillAddress($input); + + $this->startAddress = strtr($address, '*', '0'); + $this->endAddress = str_replace('*', '255', $address); + } + + private function parseRangeUsingCidr(string $input): void + { + $parts = explode('/', $input); + + $this->startAddress = $this->fillAddress($parts[0], '0'); + $isAddressMask = mb_strpos($parts[1], '.') !== false; + + if ($isAddressMask && $this->verifyAddress($parts[1])) { + $this->mask = sprintf('%032b', ip2long($parts[1])); + + return; + } + + if ($isAddressMask || $parts[1] < 8 || $parts[1] > 30) { + throw new ComponentException('Invalid network mask'); + } + + $this->mask = sprintf('%032b', ip2long(long2ip(~(2 ** (32 - (int) $parts[1]) - 1)))); + } + + private function verifyAddress(string $address): bool + { + return filter_var($address, FILTER_VALIDATE_IP, ['flags' => $this->options]) !== false; + } + + private function verifyNetwork(string $input): bool + { + $input = sprintf('%u', ip2long($input)); + + return $this->startAddress !== null + && $this->endAddress !== null + && bccomp($input, sprintf('%u', ip2long($this->startAddress))) >= 0 + && bccomp($input, sprintf('%u', ip2long($this->endAddress))) <= 0; + } + + private function belongsToSubnet(string $input): bool + { + if ($this->mask === null || $this->startAddress === null) { + return false; + } + + $min = sprintf('%032b', ip2long($this->startAddress)); + $input = sprintf('%032b', ip2long($input)); + + return ($input & $this->mask) === ($min & $this->mask); + } +} diff --git a/vendor/workerman/validation/library/Rules/Isbn.php b/vendor/workerman/validation/library/Rules/Isbn.php new file mode 100644 index 0000000..4ad7cb3 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Isbn.php @@ -0,0 +1,49 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function implode; +use function is_scalar; +use function preg_match; +use function sprintf; + +/** + * Validates whether the input is a valid ISBN (International Standard Book Number) or not. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Moritz Fromm <moritzgitfromm@gmail.com> + */ +final class Isbn extends AbstractRule +{ + /** + * @see https://howtodoinjava.com/regex/java-regex-validate-international-standard-book-number-isbns + */ + private const PIECES = [ + '^(?:ISBN(?:-1[03])?:? )?(?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})', + '[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)', + '(?:97[89][- ]?)?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]$', + ]; + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_scalar($input)) { + return false; + } + + return preg_match(sprintf('/%s/', implode(self::PIECES)), (string) $input) > 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/IterableType.php b/vendor/workerman/validation/library/Rules/IterableType.php new file mode 100644 index 0000000..ea717d9 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/IterableType.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Helpers\CanValidateIterable; + +/** + * Validates whether the pseudo-type of the input is iterable or not. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class IterableType extends AbstractRule +{ + use CanValidateIterable; + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return $this->isIterable($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Json.php b/vendor/workerman/validation/library/Rules/Json.php new file mode 100644 index 0000000..1dc5a9e --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Json.php @@ -0,0 +1,43 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_string; +use function json_decode; +use function json_last_error; + +use const JSON_ERROR_NONE; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Json extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_string($input) || $input === '') { + return false; + } + + json_decode($input); + + return json_last_error() === JSON_ERROR_NONE; + } +} diff --git a/vendor/workerman/validation/library/Rules/Key.php b/vendor/workerman/validation/library/Rules/Key.php new file mode 100644 index 0000000..59d6714 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Key.php @@ -0,0 +1,57 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; +use Respect\Validation\Validatable; + +use function array_key_exists; +use function is_array; +use function is_scalar; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Key extends AbstractRelated +{ + /** + * @param mixed $reference + */ + public function __construct($reference, ?Validatable $rule = null, bool $mandatory = true) + { + if (!is_scalar($reference) || $reference === '') { + throw new ComponentException('Invalid array key name'); + } + + parent::__construct($reference, $rule, $mandatory); + } + + /** + * {@inheritDoc} + */ + public function getReferenceValue($input) + { + return $input[$this->getReference()]; + } + + /** + * {@inheritDoc} + */ + public function hasReference($input): bool + { + return is_array($input) && array_key_exists($this->getReference(), $input); + } +} diff --git a/vendor/workerman/validation/library/Rules/KeyNested.php b/vendor/workerman/validation/library/Rules/KeyNested.php new file mode 100644 index 0000000..c670b0d --- /dev/null +++ b/vendor/workerman/validation/library/Rules/KeyNested.php @@ -0,0 +1,150 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use ArrayAccess; +use Respect\Validation\Exceptions\ComponentException; + +use function array_key_exists; +use function array_shift; +use function explode; +use function is_array; +use function is_null; +use function is_object; +use function is_scalar; +use function property_exists; +use function rtrim; +use function sprintf; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Ivan Zinovyev <vanyazin@gmail.com> + */ +final class KeyNested extends AbstractRelated +{ + /** + * {@inheritDoc} + */ + public function hasReference($input): bool + { + try { + $this->getReferenceValue($input); + } catch (ComponentException $cex) { + return false; + } + + return true; + } + + /** + * {@inheritDoc} + */ + public function getReferenceValue($input) + { + if (is_scalar($input)) { + $message = sprintf('Cannot select the %s in the given data', $this->getReference()); + throw new ComponentException($message); + } + + $keys = $this->getReferencePieces(); + $value = $input; + while (!is_null($key = array_shift($keys))) { + $value = $this->getValue($value, $key); + } + + return $value; + } + + /** + * @return string[] + */ + private function getReferencePieces(): array + { + return explode('.', rtrim((string) $this->getReference(), '.')); + } + + /** + * @param mixed[] $array + * @param mixed $key + * + * @return mixed + */ + private function getValueFromArray(array $array, $key) + { + if (!array_key_exists($key, $array)) { + $message = sprintf('Cannot select the key %s from the given array', $this->getReference()); + throw new ComponentException($message); + } + + return $array[$key]; + } + + /** + * @param mixed $key + * + * @return mixed + */ + private function getValueFromArrayAccess(ArrayAccess $array, $key) + { + if (!$array->offsetExists($key)) { + $message = sprintf('Cannot select the key %s from the given array', $this->getReference()); + throw new ComponentException($message); + } + + return $array->offsetGet($key); + } + + /** + * @phpcsSuppress SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingParameterTypeHint + * + * @param object $object + * + * @return mixed + */ + private function getValueFromObject($object, string $property) + { + if (empty($property) || !property_exists($object, $property)) { + $message = sprintf('Cannot select the property %s from the given object', $this->getReference()); + throw new ComponentException($message); + } + + return $object->{$property}; + } + + /** + * @param mixed $value + * @param mixed $key + * + * @return mixed + */ + private function getValue($value, $key) + { + if (is_array($value)) { + return $this->getValueFromArray($value, $key); + } + + if ($value instanceof ArrayAccess) { + return $this->getValueFromArrayAccess($value, $key); + } + + if (is_object($value)) { + return $this->getValueFromObject($value, $key); + } + + $message = sprintf('Cannot select the property %s from the given data', $this->getReference()); + throw new ComponentException($message); + } +} diff --git a/vendor/workerman/validation/library/Rules/KeySet.php b/vendor/workerman/validation/library/Rules/KeySet.php new file mode 100644 index 0000000..e50fd4d --- /dev/null +++ b/vendor/workerman/validation/library/Rules/KeySet.php @@ -0,0 +1,135 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; +use Respect\Validation\Validatable; + +use function array_key_exists; +use function array_map; +use function count; +use function current; +use function is_array; + +/** + * Validates a keys in a defined structure. + * + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class KeySet extends AbstractWrapper +{ + /** + * @var mixed[] + */ + private $keys; + + /** + * @var Key[] + */ + private $keyRules; + + /** + * Initializes the rule. + * + * @param Validatable[] ...$validatables + */ + public function __construct(Validatable ...$validatables) + { + $this->keyRules = array_map([$this, 'getKeyRule'], $validatables); + $this->keys = array_map([$this, 'getKeyReference'], $this->keyRules); + + parent::__construct(new AllOf(...$this->keyRules)); + } + + /** + * {@inheritDoc} + */ + public function assert($input): void + { + if (!$this->hasValidStructure($input)) { + throw $this->reportError($input); + } + + parent::assert($input); + } + + /** + * {@inheritDoc} + */ + public function check($input): void + { + if (!$this->hasValidStructure($input)) { + throw $this->reportError($input); + } + + parent::check($input); + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!$this->hasValidStructure($input)) { + return false; + } + + return parent::validate($input); + } + + /** + * @throws ComponentException + */ + private function getKeyRule(Validatable $validatable): Key + { + if ($validatable instanceof Key) { + return $validatable; + } + + if (!$validatable instanceof AllOf || count($validatable->getRules()) !== 1) { + throw new ComponentException('KeySet rule accepts only Key rules'); + } + + return $this->getKeyRule(current($validatable->getRules())); + } + + /** + * @return mixed + */ + private function getKeyReference(Key $rule) + { + return $rule->getReference(); + } + + /** + * @param mixed $input + */ + private function hasValidStructure($input): bool + { + if (!is_array($input)) { + return false; + } + + foreach ($this->keyRules as $keyRule) { + if (!array_key_exists($keyRule->getReference(), $input) && $keyRule->isMandatory()) { + return false; + } + + unset($input[$keyRule->getReference()]); + } + + return count($input) == 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/KeyValue.php b/vendor/workerman/validation/library/Rules/KeyValue.php new file mode 100644 index 0000000..740c6bd --- /dev/null +++ b/vendor/workerman/validation/library/Rules/KeyValue.php @@ -0,0 +1,148 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; +use Respect\Validation\Exceptions\ValidationException; +use Respect\Validation\Factory; +use Respect\Validation\Validatable; + +use function array_keys; +use function in_array; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class KeyValue extends AbstractRule +{ + /** + * @var int|string + */ + private $comparedKey; + + /** + * @var string + */ + private $ruleName; + + /** + * @var int|string + */ + private $baseKey; + + /** + * @param int|string $comparedKey + * @param int|string $baseKey + */ + public function __construct($comparedKey, string $ruleName, $baseKey) + { + $this->comparedKey = $comparedKey; + $this->ruleName = $ruleName; + $this->baseKey = $baseKey; + } + + /** + * {@inheritDoc} + */ + public function assert($input): void + { + $rule = $this->getRule($input); + + try { + $rule->assert($input[$this->comparedKey]); + } catch (ValidationException $exception) { + throw $this->overwriteExceptionParams($exception); + } + } + + /** + * {@inheritDoc} + */ + public function check($input): void + { + $rule = $this->getRule($input); + + try { + $rule->check($input[$this->comparedKey]); + } catch (ValidationException $exception) { + throw $this->overwriteExceptionParams($exception); + } + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + try { + $rule = $this->getRule($input); + } catch (ValidationException $e) { + return false; + } + + return $rule->validate($input[$this->comparedKey]); + } + + /** + * {@inheritDoc} + */ + public function reportError($input, array $extraParams = []): ValidationException + { + try { + return $this->overwriteExceptionParams($this->getRule($input)->reportError($input)); + } catch (ValidationException $exception) { + return $this->overwriteExceptionParams($exception); + } + } + + /** + * @param mixed $input + */ + private function getRule($input): Validatable + { + if (!isset($input[$this->comparedKey])) { + throw parent::reportError($this->comparedKey); + } + + if (!isset($input[$this->baseKey])) { + throw parent::reportError($this->baseKey); + } + + try { + $rule = Factory::getDefaultInstance()->rule($this->ruleName, [$input[$this->baseKey]]); + $rule->setName((string) $this->comparedKey); + } catch (ComponentException $exception) { + throw parent::reportError($input, ['component' => true]); + } + + return $rule; + } + + private function overwriteExceptionParams(ValidationException $exception): ValidationException + { + $params = []; + foreach (array_keys($exception->getParams()) as $key) { + if (in_array($key, ['template', 'translator'])) { + continue; + } + + $params[$key] = $this->baseKey; + } + $params['name'] = $this->comparedKey; + + $exception->updateParams($params); + + return $exception; + } +} diff --git a/vendor/workerman/validation/library/Rules/LanguageCode.php b/vendor/workerman/validation/library/Rules/LanguageCode.php new file mode 100644 index 0000000..31f8880 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/LanguageCode.php @@ -0,0 +1,553 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; + +use function array_column; +use function array_filter; +use function array_search; +use function sprintf; + +/** + * Validates whether the input is language code based on ISO 639. + * + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class LanguageCode extends AbstractEnvelope +{ + public const ALPHA2 = 'alpha-2'; + public const ALPHA3 = 'alpha-3'; + + public const AVAILABLE_SETS = [self::ALPHA2, self::ALPHA3]; + + /** + * @see http://www.loc.gov/standards/iso639-2/ISO-639-2_utf-8.txt + */ + public const LANGUAGE_CODES = [ + // phpcs:disable Squiz.PHP.CommentedOutCode.Found + ['aa', 'aar'], // Afar + ['ab', 'abk'], // Abkhazian + ['', 'ace'], // Achinese + ['', 'ach'], // Acoli + ['', 'ada'], // Adangme + ['', 'ady'], // Adyghe; Adygei + ['', 'afa'], // Afro-Asiatic languages + ['', 'afh'], // Afrihili + ['af', 'afr'], // Afrikaans + ['', 'ain'], // Ainu + ['ak', 'aka'], // Akan + ['', 'akk'], // Akkadian + ['sq', 'alb'], // Albanian + ['', 'ale'], // Aleut + ['', 'alg'], // Algonquian languages + ['', 'alt'], // Southern Altai + ['am', 'amh'], // Amharic + ['', 'ang'], // English, Old (ca.450-1100) + ['', 'anp'], // Angika + ['', 'apa'], // Apache languages + ['ar', 'ara'], // Arabic + ['', 'arc'], // Official Aramaic (700-300 BCE); Imperial Aramaic (700-300 BCE) + ['an', 'arg'], // Aragonese + ['hy', 'arm'], // Armenian + ['', 'arn'], // Mapudungun; Mapuche + ['', 'arp'], // Arapaho + ['', 'art'], // Artificial languages + ['', 'arw'], // Arawak + ['as', 'asm'], // Assamese + ['', 'ast'], // Asturian; Bable; Leonese; Asturleonese + ['', 'ath'], // Athapascan languages + ['', 'aus'], // Australian languages + ['av', 'ava'], // Avaric + ['ae', 'ave'], // Avestan + ['', 'awa'], // Awadhi + ['ay', 'aym'], // Aymara + ['az', 'aze'], // Azerbaijani + ['', 'bad'], // Banda languages + ['', 'bai'], // Bamileke languages + ['ba', 'bak'], // Bashkir + ['', 'bal'], // Baluchi + ['bm', 'bam'], // Bambara + ['', 'ban'], // Balinese + ['eu', 'baq'], // Basque + ['', 'bas'], // Basa + ['', 'bat'], // Baltic languages + ['', 'bej'], // Beja; Bedawiyet + ['be', 'bel'], // Belarusian + ['', 'bem'], // Bemba + ['bn', 'ben'], // Bengali + ['', 'ber'], // Berber languages + ['', 'bho'], // Bhojpuri + ['bh', 'bih'], // Bihari languages + ['', 'bik'], // Bikol + ['', 'bin'], // Bini; Edo + ['bi', 'bis'], // Bislama + ['', 'bla'], // Siksika + ['', 'bnt'], // Bantu languages + ['bs', 'bos'], // Bosnian + ['', 'bra'], // Braj + ['br', 'bre'], // Breton + ['', 'btk'], // Batak languages + ['', 'bua'], // Buriat + ['', 'bug'], // Buginese + ['bg', 'bul'], // Bulgarian + ['my', 'bur'], // Burmese + ['', 'byn'], // Blin; Bilin + ['', 'cad'], // Caddo + ['', 'cai'], // Central American Indian languages + ['', 'car'], // Galibi Carib + ['ca', 'cat'], // Catalan; Valencian + ['', 'cau'], // Caucasian languages + ['', 'ceb'], // Cebuano + ['', 'cel'], // Celtic languages + ['ch', 'cha'], // Chamorro + ['', 'chb'], // Chibcha + ['ce', 'che'], // Chechen + ['', 'chg'], // Chagatai + ['zh', 'chi'], // Chinese + ['', 'chk'], // Chuukese + ['', 'chm'], // Mari + ['', 'chn'], // Chinook jargon + ['', 'cho'], // Choctaw + ['', 'chp'], // Chipewyan; Dene Suline + ['', 'chr'], // Cherokee + ['cu', 'chu'], // Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic + ['cv', 'chv'], // Chuvash + ['', 'chy'], // Cheyenne + ['', 'cmc'], // Chamic languages + ['', 'cnr'], // Montenegrin + ['', 'cop'], // Coptic + ['kw', 'cor'], // Cornish + ['co', 'cos'], // Corsican + ['', 'cpe'], // Creoles and pidgins, English based + ['', 'cpf'], // Creoles and pidgins, French-based + ['', 'cpp'], // Creoles and pidgins, Portuguese-based + ['cr', 'cre'], // Cree + ['', 'crh'], // Crimean Tatar; Crimean Turkish + ['', 'crp'], // Creoles and pidgins + ['', 'csb'], // Kashubian + ['', 'cus'], // Cushitic languages + ['cs', 'cze'], // Czech + ['', 'dak'], // Dakota + ['da', 'dan'], // Danish + ['', 'dar'], // Dargwa + ['', 'day'], // Land Dayak languages + ['', 'del'], // Delaware + ['', 'den'], // Slave (Athapascan) + ['', 'dgr'], // Dogrib + ['', 'din'], // Dinka + ['dv', 'div'], // Divehi; Dhivehi; Maldivian + ['', 'doi'], // Dogri + ['', 'dra'], // Dravidian languages + ['', 'dsb'], // Lower Sorbian + ['', 'dua'], // Duala + ['', 'dum'], // Dutch, Middle (ca.1050-1350) + ['nl', 'dut'], // Dutch; Flemish + ['', 'dyu'], // Dyula + ['dz', 'dzo'], // Dzongkha + ['', 'efi'], // Efik + ['', 'egy'], // Egyptian (Ancient) + ['', 'eka'], // Ekajuk + ['', 'elx'], // Elamite + ['en', 'eng'], // English + ['', 'enm'], // English, Middle (1100-1500) + ['eo', 'epo'], // Esperanto + ['et', 'est'], // Estonian + ['ee', 'ewe'], // Ewe + ['', 'ewo'], // Ewondo + ['', 'fan'], // Fang + ['fo', 'fao'], // Faroese + ['', 'fat'], // Fanti + ['fj', 'fij'], // Fijian + ['', 'fil'], // Filipino; Pilipino + ['fi', 'fin'], // Finnish + ['', 'fiu'], // Finno-Ugrian languages + ['', 'fon'], // Fon + ['fr', 'fre'], // French + ['', 'frm'], // French, Middle (ca.1400-1600) + ['', 'fro'], // French, Old (842-ca.1400) + ['', 'frr'], // Northern Frisian + ['', 'frs'], // Eastern Frisian + ['fy', 'fry'], // Western Frisian + ['ff', 'ful'], // Fulah + ['', 'fur'], // Friulian + ['', 'gaa'], // Ga + ['', 'gay'], // Gayo + ['', 'gba'], // Gbaya + ['', 'gem'], // Germanic languages + ['ka', 'geo'], // Georgian + ['de', 'ger'], // German + ['', 'gez'], // Geez + ['', 'gil'], // Gilbertese + ['gd', 'gla'], // Gaelic; Scottish Gaelic + ['ga', 'gle'], // Irish + ['gl', 'glg'], // Galician + ['gv', 'glv'], // Manx + ['', 'gmh'], // German, Middle High (ca.1050-1500) + ['', 'goh'], // German, Old High (ca.750-1050) + ['', 'gon'], // Gondi + ['', 'gor'], // Gorontalo + ['', 'got'], // Gothic + ['', 'grb'], // Grebo + ['', 'grc'], // Greek, Ancient (to 1453) + ['el', 'gre'], // Greek, Modern (1453-) + ['gn', 'grn'], // Guarani + ['', 'gsw'], // Swiss German; Alemannic; Alsatian + ['gu', 'guj'], // Gujarati + ['', 'gwi'], // Gwich'in + ['', 'hai'], // Haida + ['ht', 'hat'], // Haitian; Haitian Creole + ['ha', 'hau'], // Hausa + ['', 'haw'], // Hawaiian + ['he', 'heb'], // Hebrew + ['hz', 'her'], // Herero + ['', 'hil'], // Hiligaynon + ['', 'him'], // Himachali languages; Western Pahari languages + ['hi', 'hin'], // Hindi + ['', 'hit'], // Hittite + ['', 'hmn'], // Hmong; Mong + ['ho', 'hmo'], // Hiri Motu + ['hr', 'hrv'], // Croatian + ['', 'hsb'], // Upper Sorbian + ['hu', 'hun'], // Hungarian + ['', 'hup'], // Hupa + ['', 'iba'], // Iban + ['ig', 'ibo'], // Igbo + ['is', 'ice'], // Icelandic + ['io', 'ido'], // Ido + ['ii', 'iii'], // Sichuan Yi; Nuosu + ['', 'ijo'], // Ijo languages + ['iu', 'iku'], // Inuktitut + ['ie', 'ile'], // Interlingue; Occidental + ['', 'ilo'], // Iloko + ['ia', 'ina'], // Interlingua (International Auxiliary Language Association) + ['', 'inc'], // Indic languages + ['id', 'ind'], // Indonesian + ['', 'ine'], // Indo-European languages + ['', 'inh'], // Ingush + ['ik', 'ipk'], // Inupiaq + ['', 'ira'], // Iranian languages + ['', 'iro'], // Iroquoian languages + ['it', 'ita'], // Italian + ['jv', 'jav'], // Javanese + ['', 'jbo'], // Lojban + ['ja', 'jpn'], // Japanese + ['', 'jpr'], // Judeo-Persian + ['', 'jrb'], // Judeo-Arabic + ['', 'kaa'], // Kara-Kalpak + ['', 'kab'], // Kabyle + ['', 'kac'], // Kachin; Jingpho + ['kl', 'kal'], // Kalaallisut; Greenlandic + ['', 'kam'], // Kamba + ['kn', 'kan'], // Kannada + ['', 'kar'], // Karen languages + ['ks', 'kas'], // Kashmiri + ['kr', 'kau'], // Kanuri + ['', 'kaw'], // Kawi + ['kk', 'kaz'], // Kazakh + ['', 'kbd'], // Kabardian + ['', 'kha'], // Khasi + ['', 'khi'], // Khoisan languages + ['km', 'khm'], // Central Khmer + ['', 'kho'], // Khotanese; Sakan + ['ki', 'kik'], // Kikuyu; Gikuyu + ['rw', 'kin'], // Kinyarwanda + ['ky', 'kir'], // Kirghiz; Kyrgyz + ['', 'kmb'], // Kimbundu + ['', 'kok'], // Konkani + ['kv', 'kom'], // Komi + ['kg', 'kon'], // Kongo + ['ko', 'kor'], // Korean + ['', 'kos'], // Kosraean + ['', 'kpe'], // Kpelle + ['', 'krc'], // Karachay-Balkar + ['', 'krl'], // Karelian + ['', 'kro'], // Kru languages + ['', 'kru'], // Kurukh + ['kj', 'kua'], // Kuanyama; Kwanyama + ['', 'kum'], // Kumyk + ['ku', 'kur'], // Kurdish + ['', 'kut'], // Kutenai + ['', 'lad'], // Ladino + ['', 'lah'], // Lahnda + ['', 'lam'], // Lamba + ['lo', 'lao'], // Lao + ['la', 'lat'], // Latin + ['lv', 'lav'], // Latvian + ['', 'lez'], // Lezghian + ['li', 'lim'], // Limburgan; Limburger; Limburgish + ['ln', 'lin'], // Lingala + ['lt', 'lit'], // Lithuanian + ['', 'lol'], // Mongo + ['', 'loz'], // Lozi + ['lb', 'ltz'], // Luxembourgish; Letzeburgesch + ['', 'lua'], // Luba-Lulua + ['lu', 'lub'], // Luba-Katanga + ['lg', 'lug'], // Ganda + ['', 'lui'], // Luiseno + ['', 'lun'], // Lunda + ['', 'luo'], // Luo (Kenya and Tanzania) + ['', 'lus'], // Lushai + ['mk', 'mac'], // Macedonian + ['', 'mad'], // Madurese + ['', 'mag'], // Magahi + ['mh', 'mah'], // Marshallese + ['', 'mai'], // Maithili + ['', 'mak'], // Makasar + ['ml', 'mal'], // Malayalam + ['', 'man'], // Mandingo + ['mi', 'mao'], // Maori + ['', 'map'], // Austronesian languages + ['mr', 'mar'], // Marathi + ['', 'mas'], // Masai + ['ms', 'may'], // Malay + ['', 'mdf'], // Moksha + ['', 'mdr'], // Mandar + ['', 'men'], // Mende + ['', 'mga'], // Irish, Middle (900-1200) + ['', 'mic'], // Mi'kmaq; Micmac + ['', 'min'], // Minangkabau + ['', 'mis'], // Uncoded languages + ['', 'mkh'], // Mon-Khmer languages + ['mg', 'mlg'], // Malagasy + ['mt', 'mlt'], // Maltese + ['', 'mnc'], // Manchu + ['', 'mni'], // Manipuri + ['', 'mno'], // Manobo languages + ['', 'moh'], // Mohawk + ['mn', 'mon'], // Mongolian + ['', 'mos'], // Mossi + ['', 'mul'], // Multiple languages + ['', 'mun'], // Munda languages + ['', 'mus'], // Creek + ['', 'mwl'], // Mirandese + ['', 'mwr'], // Marwari + ['', 'myn'], // Mayan languages + ['', 'myv'], // Erzya + ['', 'nah'], // Nahuatl languages + ['', 'nai'], // North American Indian languages + ['', 'nap'], // Neapolitan + ['na', 'nau'], // Nauru + ['nv', 'nav'], // Navajo; Navaho + ['nr', 'nbl'], // Ndebele, South; South Ndebele + ['nd', 'nde'], // Ndebele, North; North Ndebele + ['ng', 'ndo'], // Ndonga + ['', 'nds'], // Low German; Low Saxon; German, Low; Saxon, Low + ['ne', 'nep'], // Nepali + ['', 'new'], // Nepal Bhasa; Newari + ['', 'nia'], // Nias + ['', 'nic'], // Niger-Kordofanian languages + ['', 'niu'], // Niuean + ['nn', 'nno'], // Norwegian Nynorsk; Nynorsk, Norwegian + ['nb', 'nob'], // Bokmål, Norwegian; Norwegian Bokmål + ['', 'nog'], // Nogai + ['', 'non'], // Norse, Old + ['no', 'nor'], // Norwegian + ['', 'nqo'], // N'Ko + ['', 'nso'], // Pedi; Sepedi; Northern Sotho + ['', 'nub'], // Nubian languages + ['', 'nwc'], // Classical Newari; Old Newari; Classical Nepal Bhasa + ['ny', 'nya'], // Chichewa; Chewa; Nyanja + ['', 'nym'], // Nyamwezi + ['', 'nyn'], // Nyankole + ['', 'nyo'], // Nyoro + ['', 'nzi'], // Nzima + ['oc', 'oci'], // Occitan (post 1500) + ['oj', 'oji'], // Ojibwa + ['or', 'ori'], // Oriya + ['om', 'orm'], // Oromo + ['', 'osa'], // Osage + ['os', 'oss'], // Ossetian; Ossetic + ['', 'ota'], // Turkish, Ottoman (1500-1928) + ['', 'oto'], // Otomian languages + ['', 'paa'], // Papuan languages + ['', 'pag'], // Pangasinan + ['', 'pal'], // Pahlavi + ['', 'pam'], // Pampanga; Kapampangan + ['pa', 'pan'], // Panjabi; Punjabi + ['', 'pap'], // Papiamento + ['', 'pau'], // Palauan + ['', 'peo'], // Persian, Old (ca.600-400 B.C.) + ['fa', 'per'], // Persian + ['', 'phi'], // Philippine languages + ['', 'phn'], // Phoenician + ['pi', 'pli'], // Pali + ['pl', 'pol'], // Polish + ['', 'pon'], // Pohnpeian + ['pt', 'por'], // Portuguese + ['', 'pra'], // Prakrit languages + ['', 'pro'], // Provençal, Old (to 1500); Occitan, Old (to 1500) + ['ps', 'pus'], // Pushto; Pashto + ['', 'qaaqtz'], // Reserved for local use + ['qu', 'que'], // Quechua + ['', 'raj'], // Rajasthani + ['', 'rap'], // Rapanui + ['', 'rar'], // Rarotongan; Cook Islands Maori + ['', 'roa'], // Romance languages + ['rm', 'roh'], // Romansh + ['', 'rom'], // Romany + ['ro', 'rum'], // Romanian; Moldavian; Moldovan + ['rn', 'run'], // Rundi + ['', 'rup'], // Aromanian; Arumanian; Macedo-Romanian + ['ru', 'rus'], // Russian + ['', 'sad'], // Sandawe + ['sg', 'sag'], // Sango + ['', 'sah'], // Yakut + ['', 'sai'], // South American Indian languages + ['', 'sal'], // Salishan languages + ['', 'sam'], // Samaritan Aramaic + ['sa', 'san'], // Sanskrit + ['', 'sas'], // Sasak + ['', 'sat'], // Santali + ['', 'scn'], // Sicilian + ['', 'sco'], // Scots + ['', 'sel'], // Selkup + ['', 'sem'], // Semitic languages + ['', 'sga'], // Irish, Old (to 900) + ['', 'sgn'], // Sign Languages + ['', 'shn'], // Shan + ['', 'sid'], // Sidamo + ['si', 'sin'], // Sinhala; Sinhalese + ['', 'sio'], // Siouan languages + ['', 'sit'], // Sino-Tibetan languages + ['', 'sla'], // Slavic languages + ['sk', 'slo'], // Slovak + ['sl', 'slv'], // Slovenian + ['', 'sma'], // Southern Sami + ['se', 'sme'], // Northern Sami + ['', 'smi'], // Sami languages + ['', 'smj'], // Lule Sami + ['', 'smn'], // Inari Sami + ['sm', 'smo'], // Samoan + ['', 'sms'], // Skolt Sami + ['sn', 'sna'], // Shona + ['sd', 'snd'], // Sindhi + ['', 'snk'], // Soninke + ['', 'sog'], // Sogdian + ['so', 'som'], // Somali + ['', 'son'], // Songhai languages + ['st', 'sot'], // Sotho, Southern + ['es', 'spa'], // Spanish; Castilian + ['sc', 'srd'], // Sardinian + ['', 'srn'], // Sranan Tongo + ['sr', 'srp'], // Serbian + ['', 'srr'], // Serer + ['', 'ssa'], // Nilo-Saharan languages + ['ss', 'ssw'], // Swati + ['', 'suk'], // Sukuma + ['su', 'sun'], // Sundanese + ['', 'sus'], // Susu + ['', 'sux'], // Sumerian + ['sw', 'swa'], // Swahili + ['sv', 'swe'], // Swedish + ['', 'syc'], // Classical Syriac + ['', 'syr'], // Syriac + ['ty', 'tah'], // Tahitian + ['', 'tai'], // Tai languages + ['ta', 'tam'], // Tamil + ['tt', 'tat'], // Tatar + ['te', 'tel'], // Telugu + ['', 'tem'], // Timne + ['', 'ter'], // Tereno + ['', 'tet'], // Tetum + ['tg', 'tgk'], // Tajik + ['tl', 'tgl'], // Tagalog + ['th', 'tha'], // Thai + ['bo', 'tib'], // Tibetan + ['', 'tig'], // Tigre + ['ti', 'tir'], // Tigrinya + ['', 'tiv'], // Tiv + ['', 'tkl'], // Tokelau + ['', 'tlh'], // Klingon; tlhIngan-Hol + ['', 'tli'], // Tlingit + ['', 'tmh'], // Tamashek + ['', 'tog'], // Tonga (Nyasa) + ['to', 'ton'], // Tonga (Tonga Islands) + ['', 'tpi'], // Tok Pisin + ['', 'tsi'], // Tsimshian + ['tn', 'tsn'], // Tswana + ['ts', 'tso'], // Tsonga + ['tk', 'tuk'], // Turkmen + ['', 'tum'], // Tumbuka + ['', 'tup'], // Tupi languages + ['tr', 'tur'], // Turkish + ['', 'tut'], // Altaic languages + ['', 'tvl'], // Tuvalu + ['tw', 'twi'], // Twi + ['', 'tyv'], // Tuvinian + ['', 'udm'], // Udmurt + ['', 'uga'], // Ugaritic + ['ug', 'uig'], // Uighur; Uyghur + ['uk', 'ukr'], // Ukrainian + ['', 'umb'], // Umbundu + ['', 'und'], // Undetermined + ['ur', 'urd'], // Urdu + ['uz', 'uzb'], // Uzbek + ['', 'vai'], // Vai + ['ve', 'ven'], // Venda + ['vi', 'vie'], // Vietnamese + ['vo', 'vol'], // Volapük + ['', 'vot'], // Votic + ['', 'wak'], // Wakashan languages + ['', 'wal'], // Wolaitta; Wolaytta + ['', 'war'], // Waray + ['', 'was'], // Washo + ['cy', 'wel'], // Welsh + ['', 'wen'], // Sorbian languages + ['wa', 'wln'], // Walloon + ['wo', 'wol'], // Wolof + ['', 'xal'], // Kalmyk; Oirat + ['xh', 'xho'], // Xhosa + ['', 'yao'], // Yao + ['', 'yap'], // Yapese + ['yi', 'yid'], // Yiddish + ['yo', 'yor'], // Yoruba + ['', 'ypk'], // Yupik languages + ['', 'zap'], // Zapotec + ['', 'zbl'], // Blissymbols; Blissymbolics; Bliss + ['', 'zen'], // Zenaga + ['', 'zgh'], // Standard Moroccan Tamazight + ['za', 'zha'], // Zhuang; Chuang + ['', 'znd'], // Zande languages + ['zu', 'zul'], // Zulu + ['', 'zun'], // Zuni + ['', 'zxx'], // No linguistic content; Not applicable + // phpcs:enable Squiz.PHP.CommentedOutCode.Found + ]; + + /** + * Initializes the rule defining the ISO 639 set. + * + * @throws ComponentException + */ + public function __construct(string $set = self::ALPHA2) + { + $index = array_search($set, self::AVAILABLE_SETS, true); + if ($index === false) { + throw new ComponentException(sprintf('"%s" is not a valid language set for ISO 639', $set)); + } + + parent::__construct(new In($this->getHaystack($index), true), ['set' => $set]); + } + + /** + * @return string[] + */ + private function getHaystack(int $index): array + { + return array_filter(array_column(self::LANGUAGE_CODES, $index)); + } +} diff --git a/vendor/workerman/validation/library/Rules/LeapDate.php b/vendor/workerman/validation/library/Rules/LeapDate.php new file mode 100644 index 0000000..cf47097 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/LeapDate.php @@ -0,0 +1,58 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use DateTimeImmutable; +use DateTimeInterface; + +use function is_scalar; + +/** + * Validates if a date is leap. + * + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jayson Reis <santosdosreis@gmail.com> + */ +final class LeapDate extends AbstractRule +{ + /** + * @var string + */ + private $format; + + /** + * Initializes the rule with the expected format. + */ + public function __construct(string $format) + { + $this->format = $format; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($input instanceof DateTimeInterface) { + return $input->format('m-d') === '02-29'; + } + + if (is_scalar($input)) { + return $this->validate(DateTimeImmutable::createFromFormat($this->format, (string) $input)); + } + + return false; + } +} diff --git a/vendor/workerman/validation/library/Rules/LeapYear.php b/vendor/workerman/validation/library/Rules/LeapYear.php new file mode 100644 index 0000000..b40fa55 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/LeapYear.php @@ -0,0 +1,54 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use DateTimeInterface; + +use function date; +use function is_numeric; +use function is_scalar; +use function sprintf; +use function strtotime; + +/** + * Validates if a year is leap. + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jayson Reis <santosdosreis@gmail.com> + */ +final class LeapYear extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (is_numeric($input)) { + $date = strtotime(sprintf('%d-02-29', (int) $input)); + + return (bool) date('L', (int) $date); + } + + if (is_scalar($input)) { + return $this->validate((int) date('Y', (int) strtotime((string) $input))); + } + + if ($input instanceof DateTimeInterface) { + return $this->validate($input->format('Y')); + } + + return false; + } +} diff --git a/vendor/workerman/validation/library/Rules/Length.php b/vendor/workerman/validation/library/Rules/Length.php new file mode 100644 index 0000000..df0b8fc --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Length.php @@ -0,0 +1,135 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Countable as CountableInterface; +use Respect\Validation\Exceptions\ComponentException; + +use function count; +use function get_object_vars; +use function is_array; +use function is_int; +use function is_object; +use function is_string; +use function mb_detect_encoding; +use function mb_strlen; +use function sprintf; + +/** + * Validates the length of the given input. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Blake Hair <blake.hair@gmail.com> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Hugo Hamon <hugo.hamon@sensiolabs.com> + * @author João Torquato <joao.otl@gmail.com> + * @author Marcelo Araujo <msaraujo@php.net> + */ +final class Length extends AbstractRule +{ + /** + * @var int|null + */ + private $minValue; + + /** + * @var int|null + */ + private $maxValue; + + /** + * @var bool + */ + private $inclusive; + + /** + * Creates the rule with a minimum and maximum value. + * + * @throws ComponentException + */ + public function __construct(?int $min = null, ?int $max = null, bool $inclusive = true) + { + $this->minValue = $min; + $this->maxValue = $max; + $this->inclusive = $inclusive; + + if ($max !== null && $min > $max) { + throw new ComponentException(sprintf('%d cannot be less than %d for validation', $min, $max)); + } + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + $length = $this->extractLength($input); + if ($length === null) { + return false; + } + + return $this->validateMin($length) && $this->validateMax($length); + } + + /** + * @param mixed $input + */ + private function extractLength($input): ?int + { + if (is_string($input)) { + return (int) mb_strlen($input, (string) mb_detect_encoding($input)); + } + + if (is_array($input) || $input instanceof CountableInterface) { + return count($input); + } + + if (is_object($input)) { + return $this->extractLength(get_object_vars($input)); + } + + if (is_int($input)) { + return $this->extractLength((string) $input); + } + + return null; + } + + private function validateMin(int $length): bool + { + if ($this->minValue === null) { + return true; + } + + if ($this->inclusive) { + return $length >= $this->minValue; + } + + return $length > $this->minValue; + } + + private function validateMax(int $length): bool + { + if ($this->maxValue === null) { + return true; + } + + if ($this->inclusive) { + return $length <= $this->maxValue; + } + + return $length < $this->maxValue; + } +} diff --git a/vendor/workerman/validation/library/Rules/LessThan.php b/vendor/workerman/validation/library/Rules/LessThan.php new file mode 100644 index 0000000..e3948b0 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/LessThan.php @@ -0,0 +1,30 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +/** + * Validates whether the input is less than a value. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class LessThan extends AbstractComparison +{ + /** + * {@inheritDoc} + */ + protected function compare($left, $right): bool + { + return $left < $right; + } +} diff --git a/vendor/workerman/validation/library/Rules/Lowercase.php b/vendor/workerman/validation/library/Rules/Lowercase.php new file mode 100644 index 0000000..a73231d --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Lowercase.php @@ -0,0 +1,41 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_string; +use function mb_detect_encoding; +use function mb_strtolower; + +/** + * Validates whether the characters in the input are lowercase. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jean Pimentel <jeanfap@gmail.com> + */ +final class Lowercase extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_string($input)) { + return false; + } + + return $input === mb_strtolower($input, (string) mb_detect_encoding($input)); + } +} diff --git a/vendor/workerman/validation/library/Rules/Luhn.php b/vendor/workerman/validation/library/Rules/Luhn.php new file mode 100644 index 0000000..017570a --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Luhn.php @@ -0,0 +1,62 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function array_map; +use function count; +use function str_split; + +/** + * Validate whether a given input is a Luhn number. + * + * @see https://en.wikipedia.org/wiki/Luhn_algorithm + * + * @author Alexander Gorshkov <mazanax@yandex.ru> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Luhn extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!(new Digit())->validate($input)) { + return false; + } + + return $this->isValid((string) $input); + } + + private function isValid(string $input): bool + { + $sum = 0; + $digits = array_map('intval', str_split($input)); + $numDigits = count($digits); + $parity = $numDigits % 2; + for ($i = 0; $i < $numDigits; ++$i) { + $digit = $digits[$i]; + if ($parity == ($i % 2)) { + $digit <<= 1; + if (9 < $digit) { + $digit = $digit - 9; + } + } + $sum += $digit; + } + + return ($sum % 10) == 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/MacAddress.php b/vendor/workerman/validation/library/Rules/MacAddress.php new file mode 100644 index 0000000..57baad6 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/MacAddress.php @@ -0,0 +1,40 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_string; +use function preg_match; + +/** + * Validates whether the input is a valid MAC address. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Fábio da Silva Ribeiro <fabiorphp@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class MacAddress extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_string($input)) { + return false; + } + + return preg_match('/^(([0-9a-fA-F]{2}-){5}|([0-9a-fA-F]{2}:){5})[0-9a-fA-F]{2}$/', $input) > 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/Max.php b/vendor/workerman/validation/library/Rules/Max.php new file mode 100644 index 0000000..6905790 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Max.php @@ -0,0 +1,31 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +/** + * Validates whether the input is less than or equal to a value. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Max extends AbstractComparison +{ + /** + * {@inheritDoc} + */ + protected function compare($left, $right): bool + { + return $left <= $right; + } +} diff --git a/vendor/workerman/validation/library/Rules/MaxAge.php b/vendor/workerman/validation/library/Rules/MaxAge.php new file mode 100644 index 0000000..8a93221 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/MaxAge.php @@ -0,0 +1,31 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +/** + * Validates a maximum age for a given date. + * + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class MaxAge extends AbstractAge +{ + /** + * {@inheritDoc} + */ + protected function compare(int $baseDate, int $givenDate): bool + { + return $baseDate <= $givenDate; + } +} diff --git a/vendor/workerman/validation/library/Rules/Mimetype.php b/vendor/workerman/validation/library/Rules/Mimetype.php new file mode 100644 index 0000000..62d40a4 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Mimetype.php @@ -0,0 +1,70 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use finfo; +use SplFileInfo; + +use function is_file; +use function is_string; + +use const FILEINFO_MIME_TYPE; + +/** + * Validates if the input is a file and if its MIME type matches the expected one. + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Mimetype extends AbstractRule +{ + /** + * @var string + */ + private $mimetype; + + /** + * @var finfo + */ + private $fileInfo; + + /** + * Initializes the rule by defining the expected mimetype from the input. + */ + public function __construct(string $mimetype, ?finfo $fileInfo = null) + { + $this->mimetype = $mimetype; + $this->fileInfo = $fileInfo ?: new finfo(); + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($input instanceof SplFileInfo) { + return $this->validate($input->getPathname()); + } + + if (!is_string($input)) { + return false; + } + + if (!is_file($input)) { + return false; + } + + return $this->mimetype === $this->fileInfo->file($input, FILEINFO_MIME_TYPE); + } +} diff --git a/vendor/workerman/validation/library/Rules/Min.php b/vendor/workerman/validation/library/Rules/Min.php new file mode 100644 index 0000000..fdeb47e --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Min.php @@ -0,0 +1,31 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +/** + * Validates whether the input is greater than or equal to a value. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Min extends AbstractComparison +{ + /** + * {@inheritDoc} + */ + protected function compare($left, $right): bool + { + return $left >= $right; + } +} diff --git a/vendor/workerman/validation/library/Rules/MinAge.php b/vendor/workerman/validation/library/Rules/MinAge.php new file mode 100644 index 0000000..3815cd7 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/MinAge.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +/** + * Validates a minimum age for a given date. + * + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jean Pimentel <jeanfap@gmail.com> + * @author Kennedy Tedesco <kennedyt.tw@gmail.com> + */ +final class MinAge extends AbstractAge +{ + /** + * {@inheritDoc} + */ + protected function compare(int $baseDate, int $givenDate): bool + { + return $baseDate >= $givenDate; + } +} diff --git a/vendor/workerman/validation/library/Rules/Multiple.php b/vendor/workerman/validation/library/Rules/Multiple.php new file mode 100644 index 0000000..69adb42 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Multiple.php @@ -0,0 +1,44 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +/** + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jean Pimentel <jeanfap@gmail.com> + */ +final class Multiple extends AbstractRule +{ + /** + * @var int + */ + private $multipleOf; + + public function __construct(int $multipleOf) + { + $this->multipleOf = $multipleOf; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($this->multipleOf == 0) { + return $input == 0; + } + + return $input % $this->multipleOf == 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/Negative.php b/vendor/workerman/validation/library/Rules/Negative.php new file mode 100644 index 0000000..9fd2220 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Negative.php @@ -0,0 +1,38 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_numeric; + +/** + * Validates whether the input is a negative number. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Ismael Elias <ismael.esq@hotmail.com> + */ +final class Negative extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_numeric($input)) { + return false; + } + + return $input < 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/NfeAccessKey.php b/vendor/workerman/validation/library/Rules/NfeAccessKey.php new file mode 100644 index 0000000..91806a6 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/NfeAccessKey.php @@ -0,0 +1,60 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function array_map; +use function floor; +use function mb_strlen; +use function str_split; + +/** + * Validates the access key of the Brazilian electronic invoice (NFe). + * + * + * (pt-br) Valida chave de acesso de NFe, mais especificamente, relacionada ao DANFE. + * + * @see (pt-br) Manual de Integração do Contribuinte v4.0.1 em http://www.nfe.fazenda.gov.br + * + * @author Andrey Knupp Vital <andreykvital@gmail.com> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NfeAccessKey extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (mb_strlen($input) !== 44) { + return false; + } + + $digits = array_map('intval', str_split($input)); + $w = []; + for ($i = 0, $z = 5, $m = 43; $i <= $m; ++$i) { + $z = $i < $m ? ($z - 1) == 1 ? 9 : ($z - 1) : 0; + $w[] = $z; + } + + for ($i = 0, $s = 0, $k = 44; $i < $k; ++$i) { + $s += $digits[$i] * $w[$i]; + } + + $s -= 11 * floor($s / 11); + $v = $s == 0 || $s == 1 ? 0 : (11 - $s); + + return $v == $digits[43]; + } +} diff --git a/vendor/workerman/validation/library/Rules/Nif.php b/vendor/workerman/validation/library/Rules/Nif.php new file mode 100644 index 0000000..62b1f68 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Nif.php @@ -0,0 +1,103 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function array_pop; +use function array_sum; +use function is_numeric; +use function is_string; +use function mb_substr; +use function preg_match; +use function str_split; + +/** + * Validates Spain's fiscal identification number (NIF). + * + * + * @see https://es.wikipedia.org/wiki/N%C3%BAmero_de_identificaci%C3%B3n_fiscal + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Julián Gutiérrez <juliangut@gmail.com> + * @author Senén <senen@instasent.com> + */ +final class Nif extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_string($input)) { + return false; + } + + if (preg_match('/^(\d{8})([A-Z])$/', $input, $matches)) { + return $this->validateDni((int) $matches[1], $matches[2]); + } + + if (preg_match('/^([KLMXYZ])(\d{7})([A-Z])$/', $input, $matches)) { + return $this->validateNie($matches[1], $matches[2], $matches[3]); + } + + if (preg_match('/^([A-HJNP-SUVW])(\d{7})([0-9A-Z])$/', $input, $matches)) { + return $this->validateCif($matches[2], $matches[3]); + } + + return false; + } + + private function validateDni(int $number, string $control): bool + { + return mb_substr('TRWAGMYFPDXBNJZSQVHLCKE', ($number % 23), 1) === $control; + } + + private function validateNie(string $prefix, string $number, string $control): bool + { + if ($prefix === 'Y') { + return $this->validateDni((int) ('1' . $number), $control); + } + + if ($prefix === 'Z') { + return $this->validateDni((int) ('2' . $number), $control); + } + + return $this->validateDni((int) $number, $control); + } + + private function validateCif(string $number, string $control): bool + { + $code = 0; + $position = 1; + /** @var int $digit */ + foreach (str_split($number) as $digit) { + $increaser = $digit; + if ($position % 2 !== 0) { + $increaser = array_sum(str_split((string) ($digit * 2))); + } + + $code += $increaser; + ++$position; + } + + $digits = str_split((string) $code); + $lastDigit = (int) array_pop($digits); + $key = $lastDigit === 0 ? 0 : (10 - $lastDigit); + + if (is_numeric($control)) { + return (int) $key === (int) $control; + } + + return mb_substr('JABCDEFGHI', ($key % 10), 1) === $control; + } +} diff --git a/vendor/workerman/validation/library/Rules/Nip.php b/vendor/workerman/validation/library/Rules/Nip.php new file mode 100644 index 0000000..9a9463f --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Nip.php @@ -0,0 +1,58 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function array_map; +use function is_scalar; +use function preg_match; +use function str_split; + +/** + * Validates whether the input is a Polish VAT identification number (NIP). + * + * @see https://en.wikipedia.org/wiki/VAT_identification_number + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Tomasz Regdos <tomek@regdos.com> + */ +final class Nip extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_scalar($input)) { + return false; + } + + if (!preg_match('/^\d{10}$/', (string) $input)) { + return false; + } + + $weights = [6, 5, 7, 2, 3, 4, 5, 6, 7]; + $digits = array_map('intval', str_split((string) $input)); + + $targetControlNumber = $digits[9]; + $calculateControlNumber = 0; + + for ($i = 0; $i < 9; ++$i) { + $calculateControlNumber += $digits[$i] * $weights[$i]; + } + + $calculateControlNumber = $calculateControlNumber % 11; + + return $targetControlNumber == $calculateControlNumber; + } +} diff --git a/vendor/workerman/validation/library/Rules/No.php b/vendor/workerman/validation/library/Rules/No.php new file mode 100644 index 0000000..d7fca93 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/No.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function nl_langinfo; + +use const NOEXPR; + +/** + * Validates if value is considered as "No". + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class No extends AbstractEnvelope +{ + public function __construct(bool $useLocale = false) + { + $pattern = '^n(o(t|pe)?|ix|ay)?$'; + if ($useLocale) { + $pattern = nl_langinfo(NOEXPR); + } + + parent::__construct(new Regex('/' . $pattern . '/i')); + } +} diff --git a/vendor/workerman/validation/library/Rules/NoWhitespace.php b/vendor/workerman/validation/library/Rules/NoWhitespace.php new file mode 100644 index 0000000..ccd3230 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/NoWhitespace.php @@ -0,0 +1,45 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_null; +use function is_scalar; +use function preg_match; + +/** + * Validates whether a string contains no whitespace (spaces, tabs and line breaks). + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Augusto Pascutti <augusto@phpsp.org.br> + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NoWhitespace extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (is_null($input)) { + return true; + } + + if (is_scalar($input) === false) { + return false; + } + + return !preg_match('#\s#', (string) $input); + } +} diff --git a/vendor/workerman/validation/library/Rules/NoneOf.php b/vendor/workerman/validation/library/Rules/NoneOf.php new file mode 100644 index 0000000..e18b33d --- /dev/null +++ b/vendor/workerman/validation/library/Rules/NoneOf.php @@ -0,0 +1,56 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\NoneOfException; + +use function count; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NoneOf extends AbstractComposite +{ + /** + * {@inheritDoc} + */ + public function assert($input): void + { + $exceptions = $this->getAllThrownExceptions($input); + $numRules = count($this->getRules()); + $numExceptions = count($exceptions); + if ($numRules !== $numExceptions) { + /** @var NoneOfException $noneOfException */ + $noneOfException = $this->reportError($input); + $noneOfException->addChildren($exceptions); + + throw $noneOfException; + } + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + foreach ($this->getRules() as $rule) { + if ($rule->validate($input)) { + return false; + } + } + + return true; + } +} diff --git a/vendor/workerman/validation/library/Rules/Not.php b/vendor/workerman/validation/library/Rules/Not.php new file mode 100644 index 0000000..08ecd18 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Not.php @@ -0,0 +1,119 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ValidationException; +use Respect\Validation\Validatable; + +use function array_shift; +use function count; +use function current; + +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Caio César Tavares <caiotava@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Not extends AbstractRule +{ + /** + * @var Validatable + */ + private $rule; + + public function __construct(Validatable $rule) + { + $this->rule = $this->extractNegatedRule($rule); + } + + public function getNegatedRule(): Validatable + { + return $this->rule; + } + + public function setName(string $name): Validatable + { + $this->rule->setName($name); + + return parent::setName($name); + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return $this->rule->validate($input) === false; + } + + /** + * {@inheritDoc} + */ + public function assert($input): void + { + if ($this->validate($input)) { + return; + } + + $rule = $this->rule; + if ($rule instanceof AllOf) { + $rule = $this->absorbAllOf($rule, $input); + } + + $exception = $rule->reportError($input); + $exception->updateMode(ValidationException::MODE_NEGATIVE); + + throw $exception; + } + + /** + * @param mixed $input + */ + private function absorbAllOf(AllOf $rule, $input): Validatable + { + $rules = $rule->getRules(); + while (($current = array_shift($rules))) { + $rule = $current; + if (!$rule instanceof AllOf) { + continue; + } + + if (!$rule->validate($input)) { + continue; + } + + $rules = $rule->getRules(); + } + + return $rule; + } + + private function extractNegatedRule(Validatable $rule): Validatable + { + if ($rule instanceof self && $rule->getNegatedRule() instanceof self) { + return $this->extractNegatedRule($rule->getNegatedRule()->getNegatedRule()); + } + + if (!$rule instanceof AllOf) { + return $rule; + } + + $rules = $rule->getRules(); + if (count($rules) === 1) { + return $this->extractNegatedRule(current($rules)); + } + + return $rule; + } +} diff --git a/vendor/workerman/validation/library/Rules/NotBlank.php b/vendor/workerman/validation/library/Rules/NotBlank.php new file mode 100644 index 0000000..6f48d58 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/NotBlank.php @@ -0,0 +1,55 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use stdClass; + +use function array_filter; +use function is_array; +use function is_numeric; +use function is_string; +use function trim; + +/** + * Validates if the given input is not a blank value (null, zeros, empty strings or empty arrays, recursively). + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NotBlank extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (is_numeric($input)) { + return $input != 0; + } + + if (is_string($input)) { + $input = trim($input); + } + + if ($input instanceof stdClass) { + $input = (array) $input; + } + + if (is_array($input)) { + $input = array_filter($input, __METHOD__); + } + + return !empty($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/NotEmoji.php b/vendor/workerman/validation/library/Rules/NotEmoji.php new file mode 100644 index 0000000..036720f --- /dev/null +++ b/vendor/workerman/validation/library/Rules/NotEmoji.php @@ -0,0 +1,210 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function implode; +use function is_string; +use function preg_match; + +/** + * Validates if the input does not contain an emoji. + * + * @author Mazen Touati <mazen_touati@hotmail.com> + */ +final class NotEmoji extends AbstractRule +{ + private const RANGES = [ + '\x{0023}\x{FE0F}\x{20E3}', + '\x{0023}\x{20E3}', + '\x{002A}\x{FE0F}\x{20E3}', + '\x{002A}\x{20E3}', + '\x{0030}\x{FE0F}\x{20E3}', + '\x{0030}\x{20E3}', + '\x{0031}\x{FE0F}\x{20E3}', + '\x{0031}\x{20E3}', + '\x{0032}\x{FE0F}\x{20E3}', + '\x{0032}\x{20E3}', + '\x{0033}\x{FE0F}\x{20E3}', + '\x{0033}\x{20E3}', + '\x{0034}\x{FE0F}\x{20E3}', + '\x{0034}\x{20E3}', + '\x{0035}\x{FE0F}\x{20E3}', + '\x{0035}\x{20E3}', + '\x{0036}\x{FE0F}\x{20E3}', + '\x{0036}\x{20E3}', + '\x{0037}\x{FE0F}\x{20E3}', + '\x{0037}\x{20E3}', + '\x{0038}\x{FE0F}\x{20E3}', + '\x{0038}\x{20E3}', + '\x{0039}\x{FE0F}\x{20E3}', + '\x{0039}\x{20E3}', + '\x{1F004}', + '\x{1F0CF}', + '[\x{1F170}-\x{1F171}]', + '[\x{1F17E}-\x{1F17F}]', + '\x{1F18E}', + '[\x{1F191}-\x{1F19A}]', + '[\x{1F1E6}-\x{1F1FF}]', + '[\x{1F201}-\x{1F202}]', + '\x{1F21A}', + '\x{1F22F}', + '[\x{1F232}-\x{1F23A}]', + '[\x{1F250}-\x{1F251}]', + '[\x{1F300}-\x{1F321}]', + '[\x{1F324}-\x{1F393}]', + '[\x{1F396}-\x{1F397}]', + '[\x{1F399}-\x{1F39B}]', + '[\x{1F39E}-\x{1F3F0}]', + '[\x{1F3F3}-\x{1F3F5}]', + '[\x{1F3F7}-\x{1F4FD}]', + '[\x{1F4FF}-\x{1F53D}]', + '[\x{1F549}-\x{1F54E}]', + '[\x{1F550}-\x{1F567}]', + '[\x{1F56F}-\x{1F570}]', + '[\x{1F573}-\x{1F57A}]', + '\x{1F587}', + '[\x{1F58A}-\x{1F58D}]', + '\x{1F590}', + '[\x{1F595}-\x{1F596}]', + '[\x{1F5A4}-\x{1F5A5}]', + '\x{1F5A8}', + '[\x{1F5B1}-\x{1F5B2}]', + '\x{1F5BC}', + '[\x{1F5C2}-\x{1F5C4}]', + '[\x{1F5D1}-\x{1F5D3}]', + '[\x{1F5DC}-\x{1F5DE}]', + '\x{1F5E1}', + '\x{1F5E3}', + '\x{1F5E8}', + '\x{1F5EF}', + '\x{1F5F3}', + '[\x{1F5FA}-\x{1F64F}]', + '[\x{1F680}-\x{1F6C5}]', + '[\x{1F6CB}-\x{1F6D2}]', + '[\x{1F6E0}-\x{1F6E5}]', + '\x{1F6E9}', + '[\x{1F6EB}-\x{1F6EC}]', + '\x{1F6F0}', + '[\x{1F6F3}-\x{1F6F9}]', + '[\x{1F910}-\x{1F93A}]', + '[\x{1F93C}-\x{1F93E}]', + '[\x{1F940}-\x{1F945}]', + '[\x{1F947}-\x{1F970}]', + '[\x{1F973}-\x{1F976}]', + '\x{1F97A}', + '[\x{1F97C}-\x{1F9A2}]', + '[\x{1F9B0}-\x{1F9B9}]', + '[\x{1F9C0}-\x{1F9C2}]', + '[\x{1F9D0}-\x{1F9FF}]', + '\x{00A9}', + '\x{00AE}', + '\x{203C}', + '\x{2049}', + '\x{2122}', + '\x{2139}', + '[\x{2194}-\x{2199}]', + '[\x{21A9}-\x{21AA}]', + '[\x{231A}-\x{231B}]', + '\x{2328}', + '\x{23CF}', + '[\x{23E9}-\x{23F3}]', + '[\x{23F8}-\x{23FA}]', + '\x{24C2}', + '[\x{25AA}-\x{25AB}]', + '\x{25B6}', + '\x{25C0}', + '[\x{25FB}-\x{25FE}]', + '[\x{2600}-\x{2604}]', + '\x{260E}', + '\x{2611}', + '[\x{2614}-\x{2615}]', + '\x{2618}', + '\x{261D}', + '\x{2620}', + '[\x{2622}-\x{2623}]', + '\x{2626}', + '\x{262A}', + '[\x{262E}-\x{262F}]', + '[\x{2638}-\x{263A}]', + '\x{2640}', + '\x{2642}', + '[\x{2648}-\x{2653}]', + '[\x{265F}-\x{2660}]', + '\x{2663}', + '[\x{2665}-\x{2666}]', + '\x{2668}', + '\x{267B}', + '[\x{267E}-\x{267F}]', + '[\x{2692}-\x{2697}]', + '\x{2699}', + '[\x{269B}-\x{269C}]', + '[\x{26A0}-\x{26A1}]', + '[\x{26AA}-\x{26AB}]', + '[\x{26B0}-\x{26B1}]', + '[\x{26BD}-\x{26BE}]', + '[\x{26C4}-\x{26C5}]', + '\x{26C8}', + '[\x{26CE}-\x{26CF}]', + '\x{26D1}', + '[\x{26D3}-\x{26D4}]', + '\x{26EA}', + '[\x{26F0}-\x{26F5}]', + '[\x{26F7}-\x{26FA}]', + '\x{26FD}', + '\x{2702}', + '\x{2705}', + '[\x{2708}-\x{270D}]', + '\x{270F}', + '\x{2712}', + '\x{2714}', + '\x{2716}', + '\x{271D}', + '\x{2721}', + '\x{2728}', + '[\x{2733}-\x{2734}]', + '\x{2744}', + '\x{2747}', + '\x{26E9}', + '\x{274C}', + '\x{274E}', + '[\x{2753}-\x{2755}]', + '\x{2757}', + '[\x{2763}-\x{2764}]', + '[\x{2795}-\x{2797}]', + '\x{27A1}', + '\x{27B0}', + '\x{27BF}', + '[\x{2934}-\x{2935}]', + '[\x{2B05}-\x{2B07}]', + '[\x{2B1B}-\x{2B1C}]', + '\x{2B50}', + '\x{2B55}', + '\x{3030}', + '\x{303D}', + '\x{3297}', + '\x{3299}', + ]; + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_string($input)) { + return false; + } + + return preg_match('/' . implode('|', self::RANGES) . '/mu', $input) === 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/NotEmpty.php b/vendor/workerman/validation/library/Rules/NotEmpty.php new file mode 100644 index 0000000..578deb1 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/NotEmpty.php @@ -0,0 +1,39 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_string; +use function trim; + +/** + * Validates whether the input is not empty + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Bram Van der Sype <bram.vandersype@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NotEmpty extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (is_string($input)) { + $input = trim($input); + } + + return !empty($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/NotOptional.php b/vendor/workerman/validation/library/Rules/NotOptional.php new file mode 100644 index 0000000..22b8130 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/NotOptional.php @@ -0,0 +1,37 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Helpers\CanValidateUndefined; + +/** + * Validates if the given input is not optional. + * + * By optional we consider null or an empty string (''). + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NotOptional extends AbstractRule +{ + use CanValidateUndefined; + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return $this->isUndefined($input) === false; + } +} diff --git a/vendor/workerman/validation/library/Rules/NullType.php b/vendor/workerman/validation/library/Rules/NullType.php new file mode 100644 index 0000000..f3c658e --- /dev/null +++ b/vendor/workerman/validation/library/Rules/NullType.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_null; + +/** + * Validates whether the input is null. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NullType extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_null($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Nullable.php b/vendor/workerman/validation/library/Rules/Nullable.php new file mode 100644 index 0000000..d845b97 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Nullable.php @@ -0,0 +1,58 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +/** + * Validates the given input with a defined rule when input is not NULL. + * + * @author Jens Segers <segers.jens@gmail.com> + */ +final class Nullable extends AbstractWrapper +{ + /** + * {@inheritDoc} + */ + public function assert($input): void + { + if ($input === null) { + return; + } + + parent::assert($input); + } + + /** + * {@inheritDoc} + */ + public function check($input): void + { + if ($input === null) { + return; + } + + parent::check($input); + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($input === null) { + return true; + } + + return parent::validate($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Number.php b/vendor/workerman/validation/library/Rules/Number.php new file mode 100644 index 0000000..8f9d12e --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Number.php @@ -0,0 +1,39 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_nan; +use function is_numeric; + +/** + * Validates if the input is a number. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Ismael Elias <ismael.esq@hotmail.com> + * @author Vitaliy <reboot.m@gmail.com> + */ +final class Number extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_numeric($input)) { + return false; + } + + return !is_nan((float) $input); + } +} diff --git a/vendor/workerman/validation/library/Rules/NumericVal.php b/vendor/workerman/validation/library/Rules/NumericVal.php new file mode 100644 index 0000000..8fe9161 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/NumericVal.php @@ -0,0 +1,34 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_numeric; + +/** + * Validates whether the input is numeric. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class NumericVal extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_numeric($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/ObjectType.php b/vendor/workerman/validation/library/Rules/ObjectType.php new file mode 100644 index 0000000..b7414ab --- /dev/null +++ b/vendor/workerman/validation/library/Rules/ObjectType.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_object; + +/** + * Validates whether the input is an object. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ObjectType extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_object($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Odd.php b/vendor/workerman/validation/library/Rules/Odd.php new file mode 100644 index 0000000..8983727 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Odd.php @@ -0,0 +1,45 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function filter_var; +use function is_numeric; + +use const FILTER_VALIDATE_INT; + +/** + * Validates whether the input is an odd number or not. + * + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jean Pimentel <jeanfap@gmail.com> + */ +final class Odd extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_numeric($input)) { + return false; + } + + if (!filter_var($input, FILTER_VALIDATE_INT)) { + return false; + } + + return (int) $input % 2 !== 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/OneOf.php b/vendor/workerman/validation/library/Rules/OneOf.php new file mode 100644 index 0000000..e31c66a --- /dev/null +++ b/vendor/workerman/validation/library/Rules/OneOf.php @@ -0,0 +1,86 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\OneOfException; +use Respect\Validation\Exceptions\ValidationException; + +use function array_shift; +use function count; + +/** + * @author Bradyn Poulsen <bradyn@bradynpoulsen.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class OneOf extends AbstractComposite +{ + /** + * {@inheritDoc} + */ + public function assert($input): void + { + $validators = $this->getRules(); + $exceptions = $this->getAllThrownExceptions($input); + $numRules = count($validators); + $numExceptions = count($exceptions); + if ($numExceptions !== $numRules - 1) { + /** @var OneOfException $oneOfException */ + $oneOfException = $this->reportError($input); + $oneOfException->addChildren($exceptions); + + throw $oneOfException; + } + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + $rulesPassedCount = 0; + foreach ($this->getRules() as $rule) { + if (!$rule->validate($input)) { + continue; + } + + ++$rulesPassedCount; + } + + return $rulesPassedCount === 1; + } + + /** + * {@inheritDoc} + */ + public function check($input): void + { + $exceptions = []; + $rulesPassedCount = 0; + foreach ($this->getRules() as $rule) { + try { + $rule->check($input); + + ++$rulesPassedCount; + } catch (ValidationException $exception) { + $exceptions[] = $exception; + } + } + + if ($rulesPassedCount === 1) { + return; + } + + throw array_shift($exceptions) ?: $this->reportError($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Optional.php b/vendor/workerman/validation/library/Rules/Optional.php new file mode 100644 index 0000000..6197ca6 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Optional.php @@ -0,0 +1,60 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Helpers\CanValidateUndefined; + +/** + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Optional extends AbstractWrapper +{ + use CanValidateUndefined; + + /** + * {@inheritDoc} + */ + public function assert($input): void + { + if ($this->isUndefined($input)) { + return; + } + + parent::assert($input); + } + + /** + * {@inheritDoc} + */ + public function check($input): void + { + if ($this->isUndefined($input)) { + return; + } + + parent::check($input); + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($this->isUndefined($input)) { + return true; + } + + return parent::validate($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/PerfectSquare.php b/vendor/workerman/validation/library/Rules/PerfectSquare.php new file mode 100644 index 0000000..0374ce7 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/PerfectSquare.php @@ -0,0 +1,37 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function floor; +use function is_numeric; +use function sqrt; + +/** + * Validates whether the input is a perfect square. + * + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Kleber Hamada Sato <kleberhs007@yahoo.com> + * @author Nick Lombard <github@jigsoft.co.za> + */ +final class PerfectSquare extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_numeric($input) && floor(sqrt((float) $input)) == sqrt((float) $input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Pesel.php b/vendor/workerman/validation/library/Rules/Pesel.php new file mode 100644 index 0000000..9295c2a --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Pesel.php @@ -0,0 +1,55 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_scalar; +use function preg_match; + +/** + * Validates PESEL (Polish human identification number). + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Tomasz Regdos <tomek@regdos.com> + */ +final class Pesel extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_scalar($input)) { + return false; + } + + $stringInput = (string) $input; + if (!preg_match('/^\d{11}$/', (string) $stringInput)) { + return false; + } + + $weights = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3]; + + $targetControlNumber = $stringInput[10]; + $calculateControlNumber = 0; + + for ($i = 0; $i < 10; ++$i) { + $calculateControlNumber += (int) $stringInput[$i] * $weights[$i]; + } + + $calculateControlNumber = (10 - $calculateControlNumber % 10) % 10; + + return $targetControlNumber == $calculateControlNumber; + } +} diff --git a/vendor/workerman/validation/library/Rules/Phone.php b/vendor/workerman/validation/library/Rules/Phone.php new file mode 100644 index 0000000..ada2954 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Phone.php @@ -0,0 +1,54 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_scalar; +use function preg_match; +use function sprintf; + +/** + * Validates whether the input is a valid phone number. + * + * Validates a valid 7, 10, 11 digit phone number (North America, Europe and + * most Asian and Middle East countries), supporting country and area codes (in + * dot,space or dashed notations) + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Graham Campbell <graham@mineuk.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Phone extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_scalar($input)) { + return false; + } + + return preg_match($this->getPregFormat(), (string) $input) > 0; + } + + private function getPregFormat(): string + { + return sprintf( + '/^\+?(%1$s)? ?(?(?=\()(\(%2$s\) ?%3$s)|([. -]?(%2$s[. -]*)?%3$s))$/', + '\d{0,3}', + '\d{1,3}', + '((\d{3,5})[. -]?(\d{4})|(\d{2}[. -]?){4})' + ); + } +} diff --git a/vendor/workerman/validation/library/Rules/PhpLabel.php b/vendor/workerman/validation/library/Rules/PhpLabel.php new file mode 100644 index 0000000..1c48a22 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/PhpLabel.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_string; +use function preg_match; + +/** + * Validates if a value is considered a valid PHP Label, so that it can be used as a variable, function or class name. + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class PhpLabel extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_string($input) && preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Pis.php b/vendor/workerman/validation/library/Rules/Pis.php new file mode 100644 index 0000000..65df8fa --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Pis.php @@ -0,0 +1,57 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_scalar; +use function mb_strlen; +use function preg_match; +use function preg_replace; + +/** + * Validates a Brazilian PIS/NIS number. + * + * @author Bruno Koga <brunokoga187@gmail.com> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Pis extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_scalar($input)) { + return false; + } + + $digits = (string) preg_replace('/\D/', '', (string) $input); + if (mb_strlen($digits) != 11 || preg_match('/^' . $digits[0] . '{11}$/', $digits)) { + return false; + } + + $multipliers = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2]; + + $summation = 0; + for ($position = 0; $position < 10; ++$position) { + $summation += (int) $digits[$position] * $multipliers[$position]; + } + + $checkDigit = (int) $digits[10]; + + $modulo = $summation % 11; + + return $checkDigit === ($modulo < 2 ? 0 : 11 - $modulo); + } +} diff --git a/vendor/workerman/validation/library/Rules/PolishIdCard.php b/vendor/workerman/validation/library/Rules/PolishIdCard.php new file mode 100644 index 0000000..87cc9f7 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/PolishIdCard.php @@ -0,0 +1,60 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function ord; +use function preg_match; + +/** + * Validates whether the input is a Polish identity card (Dowód Osobisty). + * + * @see https://en.wikipedia.org/wiki/Polish_identity_card + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class PolishIdCard extends AbstractRule +{ + private const ASCII_CODE_0 = 48; + private const ASCII_CODE_7 = 55; + private const ASCII_CODE_9 = 57; + private const ASCII_CODE_A = 65; + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!preg_match('/^[A-Z0-9]{9}$/', $input)) { + return false; + } + + $weights = [7, 3, 1, 0, 7, 3, 1, 7, 3]; + $weightedSum = 0; + for ($i = 0; $i < 9; ++$i) { + $code = ord($input[$i]); + if ($i < 3 && $code <= self::ASCII_CODE_9) { + return false; + } + + if ($i > 2 && $code >= self::ASCII_CODE_A) { + return false; + } + + $difference = $code <= self::ASCII_CODE_9 ? self::ASCII_CODE_0 : self::ASCII_CODE_7; + $weightedSum += ($code - $difference) * $weights[$i]; + } + + return $weightedSum % 10 == $input[3]; + } +} diff --git a/vendor/workerman/validation/library/Rules/Positive.php b/vendor/workerman/validation/library/Rules/Positive.php new file mode 100644 index 0000000..583a477 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Positive.php @@ -0,0 +1,38 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_numeric; + +/** + * Validates whether the input is a positive number. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Ismael Elias <ismael.esq@hotmail.com> + */ +final class Positive extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_numeric($input)) { + return false; + } + + return $input > 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/PostalCode.php b/vendor/workerman/validation/library/Rules/PostalCode.php new file mode 100644 index 0000000..9db9d8e --- /dev/null +++ b/vendor/workerman/validation/library/Rules/PostalCode.php @@ -0,0 +1,209 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; + +use function sprintf; + +/** + * Validates whether the input is a valid postal code or not. + * + * @see http://download.geonames.org/export/dump/countryInfo.txt + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class PostalCode extends AbstractEnvelope +{ + private const DEFAULT_PATTERN = '/^$/'; + private const POSTAL_CODES = [ + // phpcs:disable Generic.Files.LineLength.TooLong + 'AD' => '/^(?:AD)*(\d{3})$/', + 'AL' => '/^(\d{4})$/', + 'AM' => '/^(\d{4})$/', + 'AR' => '/^[A-Z]?\d{4}[A-Z]{0,3}$/', + 'AS' => '/96799/', + 'AT' => '/^(\d{4})$/', + 'AU' => '/^(\d{4})$/', + 'AX' => '/^(?:FI)*(\d{5})$/', + 'AZ' => '/^(?:AZ)*(\d{4})$/', + 'BA' => '/^(\d{5})$/', + 'BB' => '/^(?:BB)*(\d{5})$/', + 'BD' => '/^(\d{4})$/', + 'BE' => '/^(\d{4})$/', + 'BG' => '/^(\d{4})$/', + 'BH' => '/^(\d{3}\d?)$/', + 'BL' => '/^(\d{5})$/', + 'BM' => '/^([A-Z]{2}\d{2})$/', + 'BN' => '/^([A-Z]{2}\d{4})$/', + 'BR' => '/^\d{5}-?\d{3}$/', + 'BY' => '/^(\d{6})$/', + 'CA' => '/^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ]) ?(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$/', + 'CH' => '/^(\d{4})$/', + 'CL' => '/^(\d{7})$/', + 'CN' => '/^(\d{6})$/', + 'CO' => '/^(\d{6})$/', + 'CR' => '/^(\d{5})$/', + 'CS' => '/^(\d{5})$/', + 'CU' => '/^(?:CP)*(\d{5})$/', + 'CV' => '/^(\d{4})$/', + 'CX' => '/^(\d{4})$/', + 'CY' => '/^(\d{4})$/', + 'CZ' => '/^\d{3}\s?\d{2}$/', + 'DE' => '/^(\d{5})$/', + 'DK' => '/^(\d{4})$/', + 'DO' => '/^(\d{5})$/', + 'DZ' => '/^(\d{5})$/', + 'EC' => '/^(\d{6})$/', + 'EE' => '/^(\d{5})$/', + 'EG' => '/^(\d{5})$/', + 'ES' => '/^(\d{5})$/', + 'ET' => '/^(\d{4})$/', + 'FI' => '/^(?:FI)*(\d{5})$/', + 'FM' => '/^(\d{5})$/', + 'FO' => '/^(?:FO)*(\d{3})$/', + 'FR' => '/^(\d{5})$/', + 'GB' => '/^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z])))) [0-9][A-Za-z]{2})$/', + 'GE' => '/^(\d{4})$/', + 'GF' => '/^((97|98)3\d{2})$/', + 'GG' => '/^((?:(?:[A-PR-UWYZ][A-HK-Y]\d[ABEHMNPRV-Y0-9]|[A-PR-UWYZ]\d[A-HJKPS-UW0-9])\s\d[ABD-HJLNP-UW-Z]{2})|GIR\s?0AA)$/', + 'GL' => '/^(\d{4})$/', + 'GP' => '/^((97|98)\d{3})$/', + 'GR' => '/^(\d{5})$/', + 'GT' => '/^(\d{5})$/', + 'GU' => '/^(969\d{2})$/', + 'GW' => '/^(\d{4})$/', + 'HN' => '/^([A-Z]{2}\d{4})$/', + 'HR' => '/^(?:HR)*(\d{5})$/', + 'HT' => '/^(?:HT)*(\d{4})$/', + 'HU' => '/^(\d{4})$/', + 'ID' => '/^(\d{5})$/', + 'IE' => '/^(D6W|[AC-FHKNPRTV-Y][0-9]{2})\s?([AC-FHKNPRTV-Y0-9]{4})/', + 'IL' => '/^(\d{7}|\d{5})$/', + 'IM' => '/^((?:(?:[A-PR-UWYZ][A-HK-Y]\d[ABEHMNPRV-Y0-9]|[A-PR-UWYZ]\d[A-HJKPS-UW0-9])\s\d[ABD-HJLNP-UW-Z]{2})|GIR\s?0AA)$/', + 'IN' => '/^(\d{6})$/', + 'IQ' => '/^(\d{5})$/', + 'IR' => '/^(\d{10})$/', + 'IS' => '/^(\d{3})$/', + 'IT' => '/^(\d{5})$/', + 'JE' => '/^((?:(?:[A-PR-UWYZ][A-HK-Y]\d[ABEHMNPRV-Y0-9]|[A-PR-UWYZ]\d[A-HJKPS-UW0-9])\s\d[ABD-HJLNP-UW-Z]{2})|GIR\s?0AA)$/', + 'JO' => '/^(\d{5})$/', + 'JP' => '/^\d{3}-\d{4}$/', + 'KE' => '/^(\d{5})$/', + 'KG' => '/^(\d{6})$/', + 'KH' => '/^(\d{5})$/', + 'KP' => '/^(\d{6})$/', + 'KR' => '/^(\d{5})$/', + 'KW' => '/^(\d{5})$/', + 'KY' => '/^KY[1-3]-\d{4}$/', + 'KZ' => '/^(\d{6})$/', + 'LA' => '/^(\d{5})$/', + 'LB' => '/^(\d{4}(\d{4})?)$/', + 'LI' => '/^(\d{4})$/', + 'LK' => '/^(\d{5})$/', + 'LR' => '/^(\d{4})$/', + 'LS' => '/^(\d{3})$/', + 'LT' => '/^(?:LT)*(\d{5})$/', + 'LU' => '/^(?:L-)?\d{4}$/', + 'LV' => '/^(?:LV)*(\d{4})$/', + 'MA' => '/^(\d{5})$/', + 'MC' => '/^(\d{5})$/', + 'MD' => '/^MD-\d{4}$/', + 'ME' => '/^(\d{5})$/', + 'MF' => '/^(\d{5})$/', + 'MG' => '/^(\d{3})$/', + 'MH' => '/^969\d{2}(-\d{4})$/', + 'MK' => '/^(\d{4})$/', + 'MM' => '/^(\d{5})$/', + 'MN' => '/^(\d{6})$/', + 'MP' => '/^9695\d{1}$/', + 'MQ' => '/^(\d{5})$/', + 'MT' => '/^[A-Z]{3}\s?\d{4}$/', + 'MV' => '/^(\d{5})$/', + 'MW' => '/^(\d{6})$/', + 'MX' => '/^(\d{5})$/', + 'MY' => '/^(\d{5})$/', + 'MZ' => '/^(\d{4})$/', + 'NC' => '/^(\d{5})$/', + 'NE' => '/^(\d{4})$/', + 'NF' => '/^(\d{4})$/', + 'NG' => '/^(\d{6})$/', + 'NI' => '/^(\d{7})$/', + 'NL' => '/^(\d{4} ?[A-Z]{2})$/', + 'NO' => '/^(\d{4})$/', + 'NP' => '/^(\d{5})$/', + 'NZ' => '/^(\d{4})$/', + 'OM' => '/^(\d{3})$/', + 'PF' => '/^((97|98)7\d{2})$/', + 'PG' => '/^(\d{3})$/', + 'PH' => '/^(\d{4})$/', + 'PK' => '/^(\d{5})$/', + 'PL' => '/^\d{2}-\d{3}$/', + 'PM' => '/^(97500)$/', + 'PR' => '/^00[679]\d{2}(?:-\d{4})?$/', + 'PT' => '/^\d{4}-?\d{3}$/', + 'PW' => '/^(96940)$/', + 'PY' => '/^(\d{4})$/', + 'RE' => '/^((97|98)(4|7|8)\d{2})$/', + 'RO' => '/^(\d{6})$/', + 'RS' => '/^(\d{5})$/', + 'RU' => '/^(\d{6})$/', + 'SA' => '/^(\d{5})$/', + 'SD' => '/^(\d{5})$/', + 'SE' => '/^(?:SE)?\d{3}\s\d{2}$/', + 'SG' => '/^(\d{6})$/', + 'SH' => '/^(STHL1ZZ)$/', + 'SI' => '/^(?:SI)*(\d{4})$/', + 'SJ' => '/^(\d{4})$/', + 'SK' => '/^\d{3}\s?\d{2}$/', + 'SM' => '/^(4789\d)$/', + 'SN' => '/^(\d{5})$/', + 'SO' => '/^([A-Z]{2}\d{5})$/', + 'SV' => '/^(?:CP)*(\d{4})$/', + 'SZ' => '/^([A-Z]\d{3})$/', + 'TC' => '/^(TKCA 1ZZ)$/', + 'TH' => '/^(\d{5})$/', + 'TJ' => '/^(\d{6})$/', + 'TM' => '/^(\d{6})$/', + 'TN' => '/^(\d{4})$/', + 'TR' => '/^(\d{5})$/', + 'TW' => '/^(\d{5})$/', + 'UA' => '/^(\d{5})$/', + 'US' => '/^\d{5}(-\d{4})?$/', + 'UY' => '/^(\d{5})$/', + 'UZ' => '/^(\d{6})$/', + 'VA' => '/^(\d{5})$/', + 'VE' => '/^(\d{4})$/', + 'VI' => '/^008\d{2}(?:-\d{4})?$/', + 'VN' => '/^(\d{6})$/', + 'WF' => '/^(986\d{2})$/', + 'YT' => '/^(\d{5})$/', + 'ZA' => '/^(\d{4})$/', + 'ZM' => '/^(\d{5})$/', + // phpcs:enable Generic.Files.LineLength.TooLong + ]; + + public function __construct(string $countryCode) + { + $countryCodeRule = new CountryCode(); + if (!$countryCodeRule->validate($countryCode)) { + throw new ComponentException(sprintf('Cannot validate postal code from "%s" country', $countryCode)); + } + + parent::__construct( + new Regex(self::POSTAL_CODES[$countryCode] ?? self::DEFAULT_PATTERN), + ['countryCode' => $countryCode] + ); + } +} diff --git a/vendor/workerman/validation/library/Rules/PrimeNumber.php b/vendor/workerman/validation/library/Rules/PrimeNumber.php new file mode 100644 index 0000000..6c5e8bb --- /dev/null +++ b/vendor/workerman/validation/library/Rules/PrimeNumber.php @@ -0,0 +1,52 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function ceil; +use function is_numeric; +use function sqrt; + +/** + * Validates whether the input is a prime number. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Camilo Teixeira de Melo <kmilotxm@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Ismael Elias <ismael.esq@hotmail.com> + * @author Kleber Hamada Sato <kleberhs007@yahoo.com> + */ +final class PrimeNumber extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_numeric($input) || $input <= 1) { + return false; + } + + if ($input != 2 && ($input % 2) == 0) { + return false; + } + + for ($i = 3; $i <= ceil(sqrt((float) $input)); $i += 2) { + if (($input % $i) == 0) { + return false; + } + } + + return true; + } +} diff --git a/vendor/workerman/validation/library/Rules/Printable.php b/vendor/workerman/validation/library/Rules/Printable.php new file mode 100644 index 0000000..5bf3301 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Printable.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function ctype_print; + +/** + * Validates whether an input is printable character(s). + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Andre Ramaciotti <andre@ramaciotti.com> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + */ +final class Printable extends AbstractFilterRule +{ + /** + * {@inheritDoc} + */ + protected function validateFilteredInput(string $input): bool + { + return ctype_print($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Punct.php b/vendor/workerman/validation/library/Rules/Punct.php new file mode 100644 index 0000000..d5b9788 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Punct.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function ctype_punct; + +/** + * Validates whether the input composed by only punctuation characters. + * + * @author Andre Ramaciotti <andre@ramaciotti.com> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + */ +final class Punct extends AbstractFilterRule +{ + /** + * {@inheritDoc} + */ + protected function validateFilteredInput(string $input): bool + { + return ctype_punct($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Readable.php b/vendor/workerman/validation/library/Rules/Readable.php new file mode 100644 index 0000000..f9d4868 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Readable.php @@ -0,0 +1,40 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use SplFileInfo; + +use function is_readable; +use function is_string; + +/** + * Validates if the given data is a file exists and is readable. + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Readable extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($input instanceof SplFileInfo) { + return $input->isReadable(); + } + + return is_string($input) && is_readable($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Regex.php b/vendor/workerman/validation/library/Rules/Regex.php new file mode 100644 index 0000000..3496cd2 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Regex.php @@ -0,0 +1,52 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_scalar; +use function preg_match; + +/** + * Validates whether the input matches a defined regular expression. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Regex extends AbstractRule +{ + /** + * @var string + */ + private $regex; + + /** + * Initializes the rule. + */ + public function __construct(string $regex) + { + $this->regex = $regex; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_scalar($input)) { + return false; + } + + return preg_match($this->regex, (string) $input) > 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/ResourceType.php b/vendor/workerman/validation/library/Rules/ResourceType.php new file mode 100644 index 0000000..d40869d --- /dev/null +++ b/vendor/workerman/validation/library/Rules/ResourceType.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_resource; + +/** + * Validates whether the input is a resource. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ResourceType extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_resource($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Roman.php b/vendor/workerman/validation/library/Rules/Roman.php new file mode 100644 index 0000000..fc9a91b --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Roman.php @@ -0,0 +1,29 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +/** + * Validates if the input is a Roman numeral. + * + * @author Alexander Wühr <wuehr@sc-networks.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jean Pimentel <jeanfap@gmail.com> + */ +final class Roman extends AbstractEnvelope +{ + public function __construct() + { + parent::__construct(new Regex('/^(?=[MDCLXVI])M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$/')); + } +} diff --git a/vendor/workerman/validation/library/Rules/ScalarVal.php b/vendor/workerman/validation/library/Rules/ScalarVal.php new file mode 100644 index 0000000..d6c1142 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/ScalarVal.php @@ -0,0 +1,32 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_scalar; + +/** + * Validates whether the input is a scalar value or not. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class ScalarVal extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_scalar($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Sf.php b/vendor/workerman/validation/library/Rules/Sf.php new file mode 100644 index 0000000..15b406d --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Sf.php @@ -0,0 +1,100 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\SfException; +use Respect\Validation\Exceptions\ValidationException; +use Symfony\Component\Validator\Constraint; +use Symfony\Component\Validator\ConstraintViolationList; +use Symfony\Component\Validator\Validation; +use Symfony\Component\Validator\Validator\ValidatorInterface; + +use function trim; + +/** + * Validate the input with a Symfony Validator (>=4.0 or >=3.0) Constraint. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Augusto Pascutti <augusto@phpsp.org.br> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Hugo Hamon <hugo.hamon@sensiolabs.com> + */ +final class Sf extends AbstractRule +{ + /** + * @var Constraint + */ + private $constraint; + + /** + * @var ValidatorInterface + */ + private $validator; + + /** + * Initializes the rule with the Constraint and the Validator. + * + * In the the Validator is not defined, tries to create one. + */ + public function __construct(Constraint $constraint, ?ValidatorInterface $validator = null) + { + $this->constraint = $constraint; + $this->validator = $validator ?: Validation::createValidator(); + } + + /** + * {@inheritDoc} + */ + public function assert($input): void + { + /** @var ConstraintViolationList $violations */ + $violations = $this->validator->validate($input, $this->constraint); + if ($violations->count() === 0) { + return; + } + + if ($violations->count() === 1) { + throw $this->reportError($input, ['violations' => $violations[0]->getMessage()]); + } + + throw $this->reportError($input, ['violations' => trim($violations->__toString())]); + } + + /** + * {@inheritDoc} + */ + public function reportError($input, array $extraParams = []): ValidationException + { + $exception = parent::reportError($input, $extraParams); + if (isset($extraParams['violations'])) { + $exception->updateTemplate($extraParams['violations']); + } + + return $exception; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + try { + $this->assert($input); + } catch (SfException $exception) { + return false; + } + + return true; + } +} diff --git a/vendor/workerman/validation/library/Rules/Size.php b/vendor/workerman/validation/library/Rules/Size.php new file mode 100644 index 0000000..20f07e0 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Size.php @@ -0,0 +1,117 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; +use SplFileInfo; + +use function filesize; +use function is_numeric; +use function is_string; +use function preg_match; +use function sprintf; + +/** + * Validates whether the input is a file that is of a certain size or not. + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Size extends AbstractRule +{ + /** + * @var string|int|null + */ + private $minSize; + + /** + * @var float|null + */ + private $minValue; + + /** + * @var string|int|null + */ + private $maxSize; + + /** + * @var float|null + */ + private $maxValue; + + /** + * @param string|int|null $minSize + * @param string|int|null $maxSize + */ + public function __construct($minSize = null, $maxSize = null) + { + $this->minSize = $minSize; + $this->minValue = $minSize ? $this->toBytes($minSize) : null; + $this->maxSize = $maxSize; + $this->maxValue = $maxSize ? $this->toBytes($maxSize) : null; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($input instanceof SplFileInfo) { + return $this->isValidSize($input->getSize()); + } + + if (is_string($input)) { + return $this->isValidSize((int) filesize($input)); + } + + return false; + } + + /** + * @todo Move it to a trait + * + * @param mixed $size + */ + private function toBytes($size): float + { + $value = $size; + $units = ['b', 'kb', 'mb', 'gb', 'tb', 'pb', 'eb', 'zb', 'yb']; + foreach ($units as $exponent => $unit) { + if (!preg_match('/^(\d+(.\d+)?)' . $unit . '$/i', (string) $size, $matches)) { + continue; + } + $value = $matches[1] * 1024 ** $exponent; + break; + } + + if (!is_numeric($value)) { + throw new ComponentException(sprintf('"%s" is not a recognized file size.', (string) $size)); + } + + return (float) $value; + } + + private function isValidSize(float $size): bool + { + if ($this->minValue !== null && $this->maxValue !== null) { + return $size >= $this->minValue && $size <= $this->maxValue; + } + + if ($this->minValue !== null) { + return $size >= $this->minValue; + } + + return $size <= $this->maxValue; + } +} diff --git a/vendor/workerman/validation/library/Rules/Slug.php b/vendor/workerman/validation/library/Rules/Slug.php new file mode 100644 index 0000000..ab24a4b --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Slug.php @@ -0,0 +1,45 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_string; +use function mb_strstr; +use function preg_match; + +/** + * Validates whether the input is a valid slug. + * + * @author Carlos André Ferrari <caferrari@gmail.com> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + */ +final class Slug extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_string($input) || mb_strstr($input, '--')) { + return false; + } + + if (!preg_match('@^[0-9a-z\-]+$@', $input)) { + return false; + } + + return preg_match('@^-|-$@', $input) === 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/Sorted.php b/vendor/workerman/validation/library/Rules/Sorted.php new file mode 100644 index 0000000..354629a --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Sorted.php @@ -0,0 +1,98 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; + +use function array_values; +use function count; +use function is_array; +use function is_string; +use function sprintf; +use function str_split; + +/** + * Validates whether the input is sorted in a certain order or not. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Mikhail Vyrtsev <reeywhaar@gmail.com> + */ +final class Sorted extends AbstractRule +{ + public const ASCENDING = 'ASC'; + public const DESCENDING = 'DESC'; + + /** + * @var string + */ + private $direction; + + public function __construct(string $direction) + { + if ($direction !== self::ASCENDING && $direction !== self::DESCENDING) { + throw new ComponentException( + sprintf('Direction should be either "%s" or "%s"', self::ASCENDING, self::DESCENDING) + ); + } + + $this->direction = $direction; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_array($input) && !is_string($input)) { + return false; + } + + $values = $this->getValues($input); + $count = count($values); + for ($position = 1; $position < $count; ++$position) { + if (!$this->isSorted($values[$position], $values[$position - 1])) { + return false; + } + } + + return true; + } + + /** + * @param mixed $current + * @param mixed $last + */ + private function isSorted($current, $last): bool + { + if ($this->direction === self::ASCENDING) { + return $current > $last; + } + + return $current < $last; + } + + /** + * @param string|mixed[] $input + * + * @return mixed[] + */ + private function getValues($input): array + { + if (is_array($input)) { + return array_values($input); + } + + return str_split($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Space.php b/vendor/workerman/validation/library/Rules/Space.php new file mode 100644 index 0000000..1f81283 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Space.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function ctype_space; + +/** + * Validates whether the input contains only whitespaces characters. + * + * @author Andre Ramaciotti <andre@ramaciotti.com> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + */ +final class Space extends AbstractFilterRule +{ + /** + * {@inheritDoc} + */ + protected function validateFilteredInput(string $input): bool + { + return ctype_space($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/StartsWith.php b/vendor/workerman/validation/library/Rules/StartsWith.php new file mode 100644 index 0000000..2ca46c9 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/StartsWith.php @@ -0,0 +1,85 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_array; +use function mb_detect_encoding; +use function mb_stripos; +use function mb_strpos; +use function reset; + +/** + * Validates whether the input starts with a given value. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Marcelo Araujo <msaraujo@php.net> + */ +final class StartsWith extends AbstractRule +{ + /** + * @var mixed + */ + private $startValue; + + /** + * @var bool + */ + private $identical; + + /** + * @param mixed $startValue + */ + public function __construct($startValue, bool $identical = false) + { + $this->startValue = $startValue; + $this->identical = $identical; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($this->identical) { + return $this->validateIdentical($input); + } + + return $this->validateEquals($input); + } + + /** + * @param mixed $input + */ + protected function validateEquals($input): bool + { + if (is_array($input)) { + return reset($input) == $this->startValue; + } + + return mb_stripos($input, $this->startValue, 0, (string) mb_detect_encoding($input)) === 0; + } + + /** + * @param mixed $input + */ + protected function validateIdentical($input): bool + { + if (is_array($input)) { + return reset($input) === $this->startValue; + } + + return mb_strpos($input, $this->startValue, 0, (string) mb_detect_encoding($input)) === 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/StringType.php b/vendor/workerman/validation/library/Rules/StringType.php new file mode 100644 index 0000000..271f71a --- /dev/null +++ b/vendor/workerman/validation/library/Rules/StringType.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_string; + +/** + * Validates whether the type of an input is string or not. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class StringType extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_string($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/StringVal.php b/vendor/workerman/validation/library/Rules/StringVal.php new file mode 100644 index 0000000..515b445 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/StringVal.php @@ -0,0 +1,35 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_object; +use function is_scalar; +use function method_exists; + +/** + * Validates whether the input can be used as a string. + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class StringVal extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return is_scalar($input) || (is_object($input) && method_exists($input, '__toString')); + } +} diff --git a/vendor/workerman/validation/library/Rules/SubdivisionCode.php b/vendor/workerman/validation/library/Rules/SubdivisionCode.php new file mode 100644 index 0000000..ad6e36c --- /dev/null +++ b/vendor/workerman/validation/library/Rules/SubdivisionCode.php @@ -0,0 +1,56 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Helpers\Subdivisions; + +use function array_keys; + +/** + * Validates country subdivision codes according to ISO 3166-2. + * + * @see http://en.wikipedia.org/wiki/ISO_3166-2 + * @see http://www.geonames.org/countries/ + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Mazen Touati <mazen_touati@hotmail.com> + */ +final class SubdivisionCode extends AbstractSearcher +{ + /** + * @var string + */ + private $countryName; + + /** + * @var string[] + */ + private $subdivisions; + + public function __construct(string $countryCode) + { + $subdivisions = new Subdivisions($countryCode); + + $this->countryName = $subdivisions->getCountry(); + $this->subdivisions = array_keys($subdivisions->getSubdivisions()); + } + + /** + * {@inheritDoc} + */ + protected function getDataSource(): array + { + return $this->subdivisions; + } +} diff --git a/vendor/workerman/validation/library/Rules/Subset.php b/vendor/workerman/validation/library/Rules/Subset.php new file mode 100644 index 0000000..7804cde --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Subset.php @@ -0,0 +1,53 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function array_diff; +use function is_array; + +/** + * Validates whether the input is a subset of a given value. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Singwai Chan <singwai.chan@live.com> + */ +final class Subset extends AbstractRule +{ + /** + * @var mixed[] + */ + private $superset; + + /** + * Initializes the rule. + * + * @param mixed[] $superset + */ + public function __construct(array $superset) + { + $this->superset = $superset; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_array($input)) { + return false; + } + + return array_diff($input, $this->superset) === []; + } +} diff --git a/vendor/workerman/validation/library/Rules/SymbolicLink.php b/vendor/workerman/validation/library/Rules/SymbolicLink.php new file mode 100644 index 0000000..d565615 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/SymbolicLink.php @@ -0,0 +1,40 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use SplFileInfo; + +use function is_link; +use function is_string; + +/** + * Validates if the given input is a symbolic link. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Gus Antoniassi <gus.antoniassi@gmail.com> + */ +final class SymbolicLink extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($input instanceof SplFileInfo) { + return $input->isLink(); + } + + return is_string($input) && is_link($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Time.php b/vendor/workerman/validation/library/Rules/Time.php new file mode 100644 index 0000000..854c38d --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Time.php @@ -0,0 +1,70 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; +use Respect\Validation\Helpers\CanValidateDateTime; + +use function date; +use function is_scalar; +use function preg_match; +use function sprintf; +use function strtotime; + +/** + * Validates whether an input is a time or not + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Time extends AbstractRule +{ + use CanValidateDateTime; + + /** + * @var string + */ + private $format; + + /** + * @var string + */ + private $sample; + + /** + * Initializes the rule. + * + * @throws ComponentException + */ + public function __construct(string $format = 'H:i:s') + { + if (!preg_match('/^[gGhHisuvaA\W]+$/', $format)) { + throw new ComponentException(sprintf('"%s" is not a valid date format', $format)); + } + + $this->format = $format; + $this->sample = date($format, strtotime('23:59:59')); + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_scalar($input)) { + return false; + } + + return $this->isDateTime($this->format, (string) $input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Tld.php b/vendor/workerman/validation/library/Rules/Tld.php new file mode 100644 index 0000000..f571f84 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Tld.php @@ -0,0 +1,267 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function in_array; +use function is_scalar; +use function mb_strtoupper; + +/** + * Validates whether the input is a top-level domain. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Bogus <g.predl@edis.at> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Paul Karikari <paulkarikari1@gmail.com> + */ +final class Tld extends AbstractRule +{ + /** + * List extracted from https://data.iana.org/TLD/tlds-alpha-by-domain.txt + * Version 2020071800, Last Updated Sat Jul 18 07:07:01 2020 UTC + */ + private const TLD_LIST = [ + 'AAA', 'AARP', 'ABARTH', 'ABB', 'ABBOTT', 'ABBVIE', 'ABC', 'ABLE', + 'ABOGADO', 'ABUDHABI', 'AC', 'ACADEMY', 'ACCENTURE', 'ACCOUNTANT', + 'ACCOUNTANTS', 'ACO', 'ACTOR', 'AD', 'ADAC', 'ADS', 'ADULT', 'AE', + 'AEG', 'AERO', 'AETNA', 'AF', 'AFAMILYCOMPANY', 'AFL', 'AFRICA', 'AG', + 'AGAKHAN', 'AGENCY', 'AI', 'AIG', 'AIRBUS', 'AIRFORCE', 'AIRTEL', + 'AKDN', 'AL', 'ALFAROMEO', 'ALIBABA', 'ALIPAY', 'ALLFINANZ', + 'ALLSTATE', 'ALLY', 'ALSACE', 'ALSTOM', 'AM', 'AMAZON', + 'AMERICANEXPRESS', 'AMERICANFAMILY', 'AMEX', 'AMFAM', 'AMICA', + 'AMSTERDAM', 'ANALYTICS', 'ANDROID', 'ANQUAN', 'ANZ', 'AO', 'AOL', + 'APARTMENTS', 'APP', 'APPLE', 'AQ', 'AQUARELLE', 'AR', 'ARAB', + 'ARAMCO', 'ARCHI', 'ARMY', 'ARPA', 'ART', 'ARTE', 'AS', 'ASDA', 'ASIA', + 'ASSOCIATES', 'AT', 'ATHLETA', 'ATTORNEY', 'AU', 'AUCTION', 'AUDI', + 'AUDIBLE', 'AUDIO', 'AUSPOST', 'AUTHOR', 'AUTO', 'AUTOS', 'AVIANCA', + 'AW', 'AWS', 'AX', 'AXA', 'AZ', 'AZURE', 'BA', 'BABY', 'BAIDU', + 'BANAMEX', 'BANANAREPUBLIC', 'BAND', 'BANK', 'BAR', 'BARCELONA', + 'BARCLAYCARD', 'BARCLAYS', 'BAREFOOT', 'BARGAINS', 'BASEBALL', + 'BASKETBALL', 'BAUHAUS', 'BAYERN', 'BB', 'BBC', 'BBT', 'BBVA', 'BCG', + 'BCN', 'BD', 'BE', 'BEATS', 'BEAUTY', 'BEER', 'BENTLEY', 'BERLIN', + 'BEST', 'BESTBUY', 'BET', 'BF', 'BG', 'BH', 'BHARTI', 'BI', 'BIBLE', + 'BID', 'BIKE', 'BING', 'BINGO', 'BIO', 'BIZ', 'BJ', 'BLACK', + 'BLACKFRIDAY', 'BLOCKBUSTER', 'BLOG', 'BLOOMBERG', 'BLUE', 'BM', 'BMS', + 'BMW', 'BN', 'BNPPARIBAS', 'BO', 'BOATS', 'BOEHRINGER', 'BOFA', 'BOM', + 'BOND', 'BOO', 'BOOK', 'BOOKING', 'BOSCH', 'BOSTIK', 'BOSTON', 'BOT', + 'BOUTIQUE', 'BOX', 'BR', 'BRADESCO', 'BRIDGESTONE', 'BROADWAY', + 'BROKER', 'BROTHER', 'BRUSSELS', 'BS', 'BT', 'BUDAPEST', 'BUGATTI', + 'BUILD', 'BUILDERS', 'BUSINESS', 'BUY', 'BUZZ', 'BV', 'BW', 'BY', 'BZ', + 'BZH', 'CA', 'CAB', 'CAFE', 'CAL', 'CALL', 'CALVINKLEIN', 'CAM', + 'CAMERA', 'CAMP', 'CANCERRESEARCH', 'CANON', 'CAPETOWN', 'CAPITAL', + 'CAPITALONE', 'CAR', 'CARAVAN', 'CARDS', 'CARE', 'CAREER', 'CAREERS', + 'CARS', 'CASA', 'CASE', 'CASEIH', 'CASH', 'CASINO', 'CAT', 'CATERING', + 'CATHOLIC', 'CBA', 'CBN', 'CBRE', 'CBS', 'CC', 'CD', 'CEB', 'CENTER', + 'CEO', 'CERN', 'CF', 'CFA', 'CFD', 'CG', 'CH', 'CHANEL', 'CHANNEL', + 'CHARITY', 'CHASE', 'CHAT', 'CHEAP', 'CHINTAI', 'CHRISTMAS', 'CHROME', + 'CHURCH', 'CI', 'CIPRIANI', 'CIRCLE', 'CISCO', 'CITADEL', 'CITI', + 'CITIC', 'CITY', 'CITYEATS', 'CK', 'CL', 'CLAIMS', 'CLEANING', 'CLICK', + 'CLINIC', 'CLINIQUE', 'CLOTHING', 'CLOUD', 'CLUB', 'CLUBMED', 'CM', + 'CN', 'CO', 'COACH', 'CODES', 'COFFEE', 'COLLEGE', 'COLOGNE', 'COM', + 'COMCAST', 'COMMBANK', 'COMMUNITY', 'COMPANY', 'COMPARE', 'COMPUTER', + 'COMSEC', 'CONDOS', 'CONSTRUCTION', 'CONSULTING', 'CONTACT', + 'CONTRACTORS', 'COOKING', 'COOKINGCHANNEL', 'COOL', 'COOP', 'CORSICA', + 'COUNTRY', 'COUPON', 'COUPONS', 'COURSES', 'CPA', 'CR', 'CREDIT', + 'CREDITCARD', 'CREDITUNION', 'CRICKET', 'CROWN', 'CRS', 'CRUISE', + 'CRUISES', 'CSC', 'CU', 'CUISINELLA', 'CV', 'CW', 'CX', 'CY', 'CYMRU', + 'CYOU', 'CZ', 'DABUR', 'DAD', 'DANCE', 'DATA', 'DATE', 'DATING', + 'DATSUN', 'DAY', 'DCLK', 'DDS', 'DE', 'DEAL', 'DEALER', 'DEALS', + 'DEGREE', 'DELIVERY', 'DELL', 'DELOITTE', 'DELTA', 'DEMOCRAT', + 'DENTAL', 'DENTIST', 'DESI', 'DESIGN', 'DEV', 'DHL', 'DIAMONDS', + 'DIET', 'DIGITAL', 'DIRECT', 'DIRECTORY', 'DISCOUNT', 'DISCOVER', + 'DISH', 'DIY', 'DJ', 'DK', 'DM', 'DNP', 'DO', 'DOCS', 'DOCTOR', 'DOG', + 'DOMAINS', 'DOT', 'DOWNLOAD', 'DRIVE', 'DTV', 'DUBAI', 'DUCK', + 'DUNLOP', 'DUPONT', 'DURBAN', 'DVAG', 'DVR', 'DZ', 'EARTH', 'EAT', + 'EC', 'ECO', 'EDEKA', 'EDU', 'EDUCATION', 'EE', 'EG', 'EMAIL', + 'EMERCK', 'ENERGY', 'ENGINEER', 'ENGINEERING', 'ENTERPRISES', 'EPSON', + 'EQUIPMENT', 'ER', 'ERICSSON', 'ERNI', 'ES', 'ESQ', 'ESTATE', 'ET', + 'ETISALAT', 'EU', 'EUROVISION', 'EUS', 'EVENTS', 'EXCHANGE', 'EXPERT', + 'EXPOSED', 'EXPRESS', 'EXTRASPACE', 'FAGE', 'FAIL', 'FAIRWINDS', + 'FAITH', 'FAMILY', 'FAN', 'FANS', 'FARM', 'FARMERS', 'FASHION', 'FAST', + 'FEDEX', 'FEEDBACK', 'FERRARI', 'FERRERO', 'FI', 'FIAT', 'FIDELITY', + 'FIDO', 'FILM', 'FINAL', 'FINANCE', 'FINANCIAL', 'FIRE', 'FIRESTONE', + 'FIRMDALE', 'FISH', 'FISHING', 'FIT', 'FITNESS', 'FJ', 'FK', 'FLICKR', + 'FLIGHTS', 'FLIR', 'FLORIST', 'FLOWERS', 'FLY', 'FM', 'FO', 'FOO', + 'FOOD', 'FOODNETWORK', 'FOOTBALL', 'FORD', 'FOREX', 'FORSALE', 'FORUM', + 'FOUNDATION', 'FOX', 'FR', 'FREE', 'FRESENIUS', 'FRL', 'FROGANS', + 'FRONTDOOR', 'FRONTIER', 'FTR', 'FUJITSU', 'FUJIXEROX', 'FUN', 'FUND', + 'FURNITURE', 'FUTBOL', 'FYI', 'GA', 'GAL', 'GALLERY', 'GALLO', + 'GALLUP', 'GAME', 'GAMES', 'GAP', 'GARDEN', 'GAY', 'GB', 'GBIZ', 'GD', + 'GDN', 'GE', 'GEA', 'GENT', 'GENTING', 'GEORGE', 'GF', 'GG', 'GGEE', + 'GH', 'GI', 'GIFT', 'GIFTS', 'GIVES', 'GIVING', 'GL', 'GLADE', 'GLASS', + 'GLE', 'GLOBAL', 'GLOBO', 'GM', 'GMAIL', 'GMBH', 'GMO', 'GMX', 'GN', + 'GODADDY', 'GOLD', 'GOLDPOINT', 'GOLF', 'GOO', 'GOODYEAR', 'GOOG', + 'GOOGLE', 'GOP', 'GOT', 'GOV', 'GP', 'GQ', 'GR', 'GRAINGER', + 'GRAPHICS', 'GRATIS', 'GREEN', 'GRIPE', 'GROCERY', 'GROUP', 'GS', 'GT', + 'GU', 'GUARDIAN', 'GUCCI', 'GUGE', 'GUIDE', 'GUITARS', 'GURU', 'GW', + 'GY', 'HAIR', 'HAMBURG', 'HANGOUT', 'HAUS', 'HBO', 'HDFC', 'HDFCBANK', + 'HEALTH', 'HEALTHCARE', 'HELP', 'HELSINKI', 'HERE', 'HERMES', 'HGTV', + 'HIPHOP', 'HISAMITSU', 'HITACHI', 'HIV', 'HK', 'HKT', 'HM', 'HN', + 'HOCKEY', 'HOLDINGS', 'HOLIDAY', 'HOMEDEPOT', 'HOMEGOODS', 'HOMES', + 'HOMESENSE', 'HONDA', 'HORSE', 'HOSPITAL', 'HOST', 'HOSTING', 'HOT', + 'HOTELES', 'HOTELS', 'HOTMAIL', 'HOUSE', 'HOW', 'HR', 'HSBC', 'HT', + 'HU', 'HUGHES', 'HYATT', 'HYUNDAI', 'IBM', 'ICBC', 'ICE', 'ICU', 'ID', + 'IE', 'IEEE', 'IFM', 'IKANO', 'IL', 'IM', 'IMAMAT', 'IMDB', 'IMMO', + 'IMMOBILIEN', 'IN', 'INC', 'INDUSTRIES', 'INFINITI', 'INFO', 'ING', + 'INK', 'INSTITUTE', 'INSURANCE', 'INSURE', 'INT', 'INTEL', + 'INTERNATIONAL', 'INTUIT', 'INVESTMENTS', 'IO', 'IPIRANGA', 'IQ', 'IR', + 'IRISH', 'IS', 'ISMAILI', 'IST', 'ISTANBUL', 'IT', 'ITAU', 'ITV', + 'IVECO', 'JAGUAR', 'JAVA', 'JCB', 'JCP', 'JE', 'JEEP', 'JETZT', + 'JEWELRY', 'JIO', 'JLL', 'JM', 'JMP', 'JNJ', 'JO', 'JOBS', 'JOBURG', + 'JOT', 'JOY', 'JP', 'JPMORGAN', 'JPRS', 'JUEGOS', 'JUNIPER', 'KAUFEN', + 'KDDI', 'KE', 'KERRYHOTELS', 'KERRYLOGISTICS', 'KERRYPROPERTIES', + 'KFH', 'KG', 'KH', 'KI', 'KIA', 'KIM', 'KINDER', 'KINDLE', 'KITCHEN', + 'KIWI', 'KM', 'KN', 'KOELN', 'KOMATSU', 'KOSHER', 'KP', 'KPMG', 'KPN', + 'KR', 'KRD', 'KRED', 'KUOKGROUP', 'KW', 'KY', 'KYOTO', 'KZ', 'LA', + 'LACAIXA', 'LAMBORGHINI', 'LAMER', 'LANCASTER', 'LANCIA', 'LAND', + 'LANDROVER', 'LANXESS', 'LASALLE', 'LAT', 'LATINO', 'LATROBE', 'LAW', + 'LAWYER', 'LB', 'LC', 'LDS', 'LEASE', 'LECLERC', 'LEFRAK', 'LEGAL', + 'LEGO', 'LEXUS', 'LGBT', 'LI', 'LIDL', 'LIFE', 'LIFEINSURANCE', + 'LIFESTYLE', 'LIGHTING', 'LIKE', 'LILLY', 'LIMITED', 'LIMO', 'LINCOLN', + 'LINDE', 'LINK', 'LIPSY', 'LIVE', 'LIVING', 'LIXIL', 'LK', 'LLC', + 'LLP', 'LOAN', 'LOANS', 'LOCKER', 'LOCUS', 'LOFT', 'LOL', 'LONDON', + 'LOTTE', 'LOTTO', 'LOVE', 'LPL', 'LPLFINANCIAL', 'LR', 'LS', 'LT', + 'LTD', 'LTDA', 'LU', 'LUNDBECK', 'LUPIN', 'LUXE', 'LUXURY', 'LV', 'LY', + 'MA', 'MACYS', 'MADRID', 'MAIF', 'MAISON', 'MAKEUP', 'MAN', + 'MANAGEMENT', 'MANGO', 'MAP', 'MARKET', 'MARKETING', 'MARKETS', + 'MARRIOTT', 'MARSHALLS', 'MASERATI', 'MATTEL', 'MBA', 'MC', 'MCKINSEY', + 'MD', 'ME', 'MED', 'MEDIA', 'MEET', 'MELBOURNE', 'MEME', 'MEMORIAL', + 'MEN', 'MENU', 'MERCKMSD', 'METLIFE', 'MG', 'MH', 'MIAMI', 'MICROSOFT', + 'MIL', 'MINI', 'MINT', 'MIT', 'MITSUBISHI', 'MK', 'ML', 'MLB', 'MLS', + 'MM', 'MMA', 'MN', 'MO', 'MOBI', 'MOBILE', 'MODA', 'MOE', 'MOI', 'MOM', + 'MONASH', 'MONEY', 'MONSTER', 'MORMON', 'MORTGAGE', 'MOSCOW', 'MOTO', + 'MOTORCYCLES', 'MOV', 'MOVIE', 'MP', 'MQ', 'MR', 'MS', 'MSD', 'MT', + 'MTN', 'MTR', 'MU', 'MUSEUM', 'MUTUAL', 'MV', 'MW', 'MX', 'MY', 'MZ', + 'NA', 'NAB', 'NAGOYA', 'NAME', 'NATIONWIDE', 'NATURA', 'NAVY', 'NBA', + 'NC', 'NE', 'NEC', 'NET', 'NETBANK', 'NETFLIX', 'NETWORK', 'NEUSTAR', + 'NEW', 'NEWHOLLAND', 'NEWS', 'NEXT', 'NEXTDIRECT', 'NEXUS', 'NF', + 'NFL', 'NG', 'NGO', 'NHK', 'NI', 'NICO', 'NIKE', 'NIKON', 'NINJA', + 'NISSAN', 'NISSAY', 'NL', 'NO', 'NOKIA', 'NORTHWESTERNMUTUAL', + 'NORTON', 'NOW', 'NOWRUZ', 'NOWTV', 'NP', 'NR', 'NRA', 'NRW', 'NTT', + 'NU', 'NYC', 'NZ', 'OBI', 'OBSERVER', 'OFF', 'OFFICE', 'OKINAWA', + 'OLAYAN', 'OLAYANGROUP', 'OLDNAVY', 'OLLO', 'OM', 'OMEGA', 'ONE', + 'ONG', 'ONL', 'ONLINE', 'ONYOURSIDE', 'OOO', 'OPEN', 'ORACLE', + 'ORANGE', 'ORG', 'ORGANIC', 'ORIGINS', 'OSAKA', 'OTSUKA', 'OTT', 'OVH', + 'PA', 'PAGE', 'PANASONIC', 'PARIS', 'PARS', 'PARTNERS', 'PARTS', + 'PARTY', 'PASSAGENS', 'PAY', 'PCCW', 'PE', 'PET', 'PF', 'PFIZER', 'PG', + 'PH', 'PHARMACY', 'PHD', 'PHILIPS', 'PHONE', 'PHOTO', 'PHOTOGRAPHY', + 'PHOTOS', 'PHYSIO', 'PICS', 'PICTET', 'PICTURES', 'PID', 'PIN', 'PING', + 'PINK', 'PIONEER', 'PIZZA', 'PK', 'PL', 'PLACE', 'PLAY', 'PLAYSTATION', + 'PLUMBING', 'PLUS', 'PM', 'PN', 'PNC', 'POHL', 'POKER', 'POLITIE', + 'PORN', 'POST', 'PR', 'PRAMERICA', 'PRAXI', 'PRESS', 'PRIME', 'PRO', + 'PROD', 'PRODUCTIONS', 'PROF', 'PROGRESSIVE', 'PROMO', 'PROPERTIES', + 'PROPERTY', 'PROTECTION', 'PRU', 'PRUDENTIAL', 'PS', 'PT', 'PUB', 'PW', + 'PWC', 'PY', 'QA', 'QPON', 'QUEBEC', 'QUEST', 'QVC', 'RACING', 'RADIO', + 'RAID', 'RE', 'READ', 'REALESTATE', 'REALTOR', 'REALTY', 'RECIPES', + 'RED', 'REDSTONE', 'REDUMBRELLA', 'REHAB', 'REISE', 'REISEN', 'REIT', + 'RELIANCE', 'REN', 'RENT', 'RENTALS', 'REPAIR', 'REPORT', 'REPUBLICAN', + 'REST', 'RESTAURANT', 'REVIEW', 'REVIEWS', 'REXROTH', 'RICH', + 'RICHARDLI', 'RICOH', 'RIGHTATHOME', 'RIL', 'RIO', 'RIP', 'RMIT', 'RO', + 'ROCHER', 'ROCKS', 'RODEO', 'ROGERS', 'ROOM', 'RS', 'RSVP', 'RU', + 'RUGBY', 'RUHR', 'RUN', 'RW', 'RWE', 'RYUKYU', 'SA', 'SAARLAND', + 'SAFE', 'SAFETY', 'SAKURA', 'SALE', 'SALON', 'SAMSCLUB', 'SAMSUNG', + 'SANDVIK', 'SANDVIKCOROMANT', 'SANOFI', 'SAP', 'SARL', 'SAS', 'SAVE', + 'SAXO', 'SB', 'SBI', 'SBS', 'SC', 'SCA', 'SCB', 'SCHAEFFLER', + 'SCHMIDT', 'SCHOLARSHIPS', 'SCHOOL', 'SCHULE', 'SCHWARZ', 'SCIENCE', + 'SCJOHNSON', 'SCOT', 'SD', 'SE', 'SEARCH', 'SEAT', 'SECURE', + 'SECURITY', 'SEEK', 'SELECT', 'SENER', 'SERVICES', 'SES', 'SEVEN', + 'SEW', 'SEX', 'SEXY', 'SFR', 'SG', 'SH', 'SHANGRILA', 'SHARP', 'SHAW', + 'SHELL', 'SHIA', 'SHIKSHA', 'SHOES', 'SHOP', 'SHOPPING', 'SHOUJI', + 'SHOW', 'SHOWTIME', 'SHRIRAM', 'SI', 'SILK', 'SINA', 'SINGLES', 'SITE', + 'SJ', 'SK', 'SKI', 'SKIN', 'SKY', 'SKYPE', 'SL', 'SLING', 'SM', + 'SMART', 'SMILE', 'SN', 'SNCF', 'SO', 'SOCCER', 'SOCIAL', 'SOFTBANK', + 'SOFTWARE', 'SOHU', 'SOLAR', 'SOLUTIONS', 'SONG', 'SONY', 'SOY', + 'SPACE', 'SPORT', 'SPOT', 'SPREADBETTING', 'SR', 'SRL', 'SS', 'ST', + 'STADA', 'STAPLES', 'STAR', 'STATEBANK', 'STATEFARM', 'STC', + 'STCGROUP', 'STOCKHOLM', 'STORAGE', 'STORE', 'STREAM', 'STUDIO', + 'STUDY', 'STYLE', 'SU', 'SUCKS', 'SUPPLIES', 'SUPPLY', 'SUPPORT', + 'SURF', 'SURGERY', 'SUZUKI', 'SV', 'SWATCH', 'SWIFTCOVER', 'SWISS', + 'SX', 'SY', 'SYDNEY', 'SYSTEMS', 'SZ', 'TAB', 'TAIPEI', 'TALK', + 'TAOBAO', 'TARGET', 'TATAMOTORS', 'TATAR', 'TATTOO', 'TAX', 'TAXI', + 'TC', 'TCI', 'TD', 'TDK', 'TEAM', 'TECH', 'TECHNOLOGY', 'TEL', + 'TEMASEK', 'TENNIS', 'TEVA', 'TF', 'TG', 'TH', 'THD', 'THEATER', + 'THEATRE', 'TIAA', 'TICKETS', 'TIENDA', 'TIFFANY', 'TIPS', 'TIRES', + 'TIROL', 'TJ', 'TJMAXX', 'TJX', 'TK', 'TKMAXX', 'TL', 'TM', 'TMALL', + 'TN', 'TO', 'TODAY', 'TOKYO', 'TOOLS', 'TOP', 'TORAY', 'TOSHIBA', + 'TOTAL', 'TOURS', 'TOWN', 'TOYOTA', 'TOYS', 'TR', 'TRADE', 'TRADING', + 'TRAINING', 'TRAVEL', 'TRAVELCHANNEL', 'TRAVELERS', + 'TRAVELERSINSURANCE', 'TRUST', 'TRV', 'TT', 'TUBE', 'TUI', 'TUNES', + 'TUSHU', 'TV', 'TVS', 'TW', 'TZ', 'UA', 'UBANK', 'UBS', 'UG', 'UK', + 'UNICOM', 'UNIVERSITY', 'UNO', 'UOL', 'UPS', 'US', 'UY', 'UZ', 'VA', + 'VACATIONS', 'VANA', 'VANGUARD', 'VC', 'VE', 'VEGAS', 'VENTURES', + 'VERISIGN', 'VERSICHERUNG', 'VET', 'VG', 'VI', 'VIAJES', 'VIDEO', + 'VIG', 'VIKING', 'VILLAS', 'VIN', 'VIP', 'VIRGIN', 'VISA', 'VISION', + 'VIVA', 'VIVO', 'VLAANDEREN', 'VN', 'VODKA', 'VOLKSWAGEN', 'VOLVO', + 'VOTE', 'VOTING', 'VOTO', 'VOYAGE', 'VU', 'VUELOS', 'WALES', 'WALMART', + 'WALTER', 'WANG', 'WANGGOU', 'WATCH', 'WATCHES', 'WEATHER', + 'WEATHERCHANNEL', 'WEBCAM', 'WEBER', 'WEBSITE', 'WED', 'WEDDING', + 'WEIBO', 'WEIR', 'WF', 'WHOSWHO', 'WIEN', 'WIKI', 'WILLIAMHILL', 'WIN', + 'WINDOWS', 'WINE', 'WINNERS', 'WME', 'WOLTERSKLUWER', 'WOODSIDE', + 'WORK', 'WORKS', 'WORLD', 'WOW', 'WS', 'WTC', 'WTF', 'XBOX', 'XEROX', + 'XFINITY', 'XIHUAN', 'XIN', 'XN--11B4C3D', 'XN--1CK2E1B', + 'XN--1QQW23A', 'XN--2SCRJ9C', 'XN--30RR7Y', 'XN--3BST00M', + 'XN--3DS443G', 'XN--3E0B707E', 'XN--3HCRJ9C', 'XN--3OQ18VL8PN36A', + 'XN--3PXU8K', 'XN--42C2D9A', 'XN--45BR5CYL', 'XN--45BRJ9C', + 'XN--45Q11C', 'XN--4GBRIM', 'XN--54B7FTA0CC', 'XN--55QW42G', + 'XN--55QX5D', 'XN--5SU34J936BGSG', 'XN--5TZM5G', 'XN--6FRZ82G', + 'XN--6QQ986B3XL', 'XN--80ADXHKS', 'XN--80AO21A', 'XN--80AQECDR1A', + 'XN--80ASEHDB', 'XN--80ASWG', 'XN--8Y0A063A', 'XN--90A3AC', 'XN--90AE', + 'XN--90AIS', 'XN--9DBQ2A', 'XN--9ET52U', 'XN--9KRT00A', + 'XN--B4W605FERD', 'XN--BCK1B9A5DRE4C', 'XN--C1AVG', 'XN--C2BR7G', + 'XN--CCK2B3B', 'XN--CCKWCXETD', 'XN--CG4BKI', 'XN--CLCHC0EA0B2G2A9GCD', + 'XN--CZR694B', 'XN--CZRS0T', 'XN--CZRU2D', 'XN--D1ACJ3B', 'XN--D1ALF', + 'XN--E1A4C', 'XN--ECKVDTC9D', 'XN--EFVY88H', 'XN--FCT429K', + 'XN--FHBEI', 'XN--FIQ228C5HS', 'XN--FIQ64B', 'XN--FIQS8S', + 'XN--FIQZ9S', 'XN--FJQ720A', 'XN--FLW351E', 'XN--FPCRJ9C3D', + 'XN--FZC2C9E2C', 'XN--FZYS8D69UVGM', 'XN--G2XX48C', 'XN--GCKR3F0F', + 'XN--GECRJ9C', 'XN--GK3AT1E', 'XN--H2BREG3EVE', 'XN--H2BRJ9C', + 'XN--H2BRJ9C8C', 'XN--HXT814E', 'XN--I1B6B1A6A2E', 'XN--IMR513N', + 'XN--IO0A7I', 'XN--J1AEF', 'XN--J1AMH', 'XN--J6W193G', + 'XN--JLQ480N2RG', 'XN--JLQ61U9W7B', 'XN--JVR189M', 'XN--KCRX77D1X4A', + 'XN--KPRW13D', 'XN--KPRY57D', 'XN--KPUT3I', 'XN--L1ACC', + 'XN--LGBBAT1AD8J', 'XN--MGB9AWBF', 'XN--MGBA3A3EJT', 'XN--MGBA3A4F16A', + 'XN--MGBA7C0BBN0A', 'XN--MGBAAKC7DVF', 'XN--MGBAAM7A8H', + 'XN--MGBAB2BD', 'XN--MGBAH1A3HJKRD', 'XN--MGBAI9AZGQP6J', + 'XN--MGBAYH7GPA', 'XN--MGBBH1A', 'XN--MGBBH1A71E', 'XN--MGBC0A9AZCG', + 'XN--MGBCA7DZDO', 'XN--MGBCPQ6GPA1A', 'XN--MGBERP4A5D4AR', + 'XN--MGBGU82A', 'XN--MGBI4ECEXP', 'XN--MGBPL2FH', 'XN--MGBT3DHD', + 'XN--MGBTX2B', 'XN--MGBX4CD0AB', 'XN--MIX891F', 'XN--MK1BU44C', + 'XN--MXTQ1M', 'XN--NGBC5AZD', 'XN--NGBE9E0A', 'XN--NGBRX', 'XN--NODE', + 'XN--NQV7F', 'XN--NQV7FS00EMA', 'XN--NYQY26A', 'XN--O3CW4H', + 'XN--OGBPF8FL', 'XN--OTU796D', 'XN--P1ACF', 'XN--P1AI', 'XN--PGBS0DH', + 'XN--PSSY2U', 'XN--Q7CE6A', 'XN--Q9JYB4C', 'XN--QCKA1PMC', 'XN--QXA6A', + 'XN--QXAM', 'XN--RHQV96G', 'XN--ROVU88B', 'XN--RVC1E0AM3E', + 'XN--S9BRJ9C', 'XN--SES554G', 'XN--T60B56A', 'XN--TCKWE', + 'XN--TIQ49XQYJ', 'XN--UNUP4Y', 'XN--VERMGENSBERATER-CTB', + 'XN--VERMGENSBERATUNG-PWB', 'XN--VHQUV', 'XN--VUQ861B', + 'XN--W4R85EL8FHU5DNRA', 'XN--W4RS40L', 'XN--WGBH1C', 'XN--WGBL6A', + 'XN--XHQ521B', 'XN--XKC2AL3HYE2A', 'XN--XKC2DL3A5EE0H', 'XN--Y9A3AQ', + 'XN--YFRO4I67O', 'XN--YGBI2AMMX', 'XN--ZFR164B', 'XXX', 'XYZ', + 'YACHTS', 'YAHOO', 'YAMAXUN', 'YANDEX', 'YE', 'YODOBASHI', 'YOGA', + 'YOKOHAMA', 'YOU', 'YOUTUBE', 'YT', 'YUN', 'ZA', 'ZAPPOS', 'ZARA', + 'ZERO', 'ZIP', 'ZM', 'ZONE', 'ZUERICH', 'ZW', + ]; + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_scalar($input)) { + return false; + } + + return in_array(mb_strtoupper((string) $input), self::TLD_LIST); + } +} diff --git a/vendor/workerman/validation/library/Rules/TrueVal.php b/vendor/workerman/validation/library/Rules/TrueVal.php new file mode 100644 index 0000000..669dc0b --- /dev/null +++ b/vendor/workerman/validation/library/Rules/TrueVal.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function filter_var; + +use const FILTER_NULL_ON_FAILURE; +use const FILTER_VALIDATE_BOOLEAN; + +/** + * Validates if a value is considered as true. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Paul Karikari <paulkarikari1@gmail.com> + */ +final class TrueVal extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return filter_var($input, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) === true; + } +} diff --git a/vendor/workerman/validation/library/Rules/Type.php b/vendor/workerman/validation/library/Rules/Type.php new file mode 100644 index 0000000..e426d57 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Type.php @@ -0,0 +1,90 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; + +use function array_keys; +use function gettype; +use function implode; +use function is_callable; +use function sprintf; + +/** + * Validates the type of input. + * + * @author Gabriel Caruso <carusogabriel34@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Paul Karikari <paulkarikari1@gmail.com> + */ +final class Type extends AbstractRule +{ + /** + * Collection of available types for validation. + * + */ + private const AVAILABLE_TYPES = [ + 'array' => 'array', + 'bool' => 'boolean', + 'boolean' => 'boolean', + 'callable' => 'callable', + 'double' => 'double', + 'float' => 'double', + 'int' => 'integer', + 'integer' => 'integer', + 'null' => 'NULL', + 'object' => 'object', + 'resource' => 'resource', + 'string' => 'string', + ]; + + /** + * Type to validate input against. + * + * @var string + */ + private $type; + + /** + * Initializes the rule. + * + * @throws ComponentException When $type is not a valid one + */ + public function __construct(string $type) + { + if (!isset(self::AVAILABLE_TYPES[$type])) { + throw new ComponentException( + sprintf( + '"%s" is not a valid type (Available: %s)', + $type, + implode(', ', array_keys(self::AVAILABLE_TYPES)) + ) + ); + } + + $this->type = $type; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($this->type === 'callable') { + return is_callable($input); + } + + return self::AVAILABLE_TYPES[$this->type] === gettype($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Unique.php b/vendor/workerman/validation/library/Rules/Unique.php new file mode 100644 index 0000000..98f6ad3 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Unique.php @@ -0,0 +1,41 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function array_unique; +use function is_array; + +use const SORT_REGULAR; + +/** + * Validates whether the input array contains only unique values. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Krzysztof Śmiałek <admin@avensome.net> + * @author Paul Karikari <paulkarikari1@gmail.com> + */ +final class Unique extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_array($input)) { + return false; + } + + return $input == array_unique($input, SORT_REGULAR); + } +} diff --git a/vendor/workerman/validation/library/Rules/Uploaded.php b/vendor/workerman/validation/library/Rules/Uploaded.php new file mode 100644 index 0000000..a9b0fd0 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Uploaded.php @@ -0,0 +1,44 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use SplFileInfo; + +use function is_scalar; +use function is_uploaded_file; + +/** + * Validates if the given data is a file that was uploaded via HTTP POST. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Paul Karikari <paulkarikari1@gmail.com> + */ +final class Uploaded extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($input instanceof SplFileInfo) { + return $this->validate($input->getPathname()); + } + + if (!is_scalar($input)) { + return false; + } + + return is_uploaded_file((string) $input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Uppercase.php b/vendor/workerman/validation/library/Rules/Uppercase.php new file mode 100644 index 0000000..d749f1e --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Uppercase.php @@ -0,0 +1,41 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_string; +use function mb_detect_encoding; +use function mb_strtoupper; + +/** + * Validates whether the characters in the input are uppercase. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Benevides <danilobenevides01@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Jean Pimentel <jeanfap@gmail.com> + */ +final class Uppercase extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_string($input)) { + return false; + } + + return $input === mb_strtoupper($input, (string) mb_detect_encoding($input)); + } +} diff --git a/vendor/workerman/validation/library/Rules/Url.php b/vendor/workerman/validation/library/Rules/Url.php new file mode 100644 index 0000000..9601000 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Url.php @@ -0,0 +1,36 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; + +use const FILTER_VALIDATE_URL; + +/** + * Validates whether the input is a URL. + * + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Url extends AbstractEnvelope +{ + /** + * Initializes the rule. + * + * @throws ComponentException + */ + public function __construct() + { + parent::__construct(new FilterVar(FILTER_VALIDATE_URL)); + } +} diff --git a/vendor/workerman/validation/library/Rules/Uuid.php b/vendor/workerman/validation/library/Rules/Uuid.php new file mode 100644 index 0000000..5b90587 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Uuid.php @@ -0,0 +1,84 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; + +use function is_string; +use function preg_match; +use function sprintf; + +/** + * Validates whether the input is a valid UUID. + * + * It also supports validation of specific versions 1, 3, 4 and 5. + * + * @author Dick van der Heiden <d.vanderheiden@inthere.nl> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Michael Weimann <mail@michael-weimann.eu> + */ +final class Uuid extends AbstractRule +{ + /** + * Placeholder in "sprintf()" format used to create the REGEX that validates inputs. + */ + private const PATTERN_FORMAT = '/^[0-9a-f]{8}-[0-9a-f]{4}-%s[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i'; + + /** + * The UUID version to validate for. + * + * @var int|null + */ + private $version; + + /** + * Initializes the rule with the desired version. + * + * @throws ComponentException when the version is not valid + */ + public function __construct(?int $version = null) + { + if ($version !== null && !$this->isSupportedVersion($version)) { + throw new ComponentException(sprintf('Only versions 1, 3, 4, and 5 are supported: %d given', $version)); + } + + $this->version = $version; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_string($input)) { + return false; + } + + return preg_match($this->getPattern(), $input) > 0; + } + + private function isSupportedVersion(int $version): bool + { + return $version >= 1 && $version <= 5 && $version !== 2; + } + + private function getPattern(): string + { + if ($this->version !== null) { + return sprintf(self::PATTERN_FORMAT, $this->version); + } + + return sprintf(self::PATTERN_FORMAT, '[13-5]'); + } +} diff --git a/vendor/workerman/validation/library/Rules/Version.php b/vendor/workerman/validation/library/Rules/Version.php new file mode 100644 index 0000000..605fcfb --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Version.php @@ -0,0 +1,40 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_string; +use function preg_match; + +/** + * Validates version numbers using Semantic Versioning. + * + * @see http://semver.org/ + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Version extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_string($input)) { + return false; + } + + return preg_match('/^[0-9]+\.[0-9]+\.[0-9]+([+-][^+-][0-9A-Za-z-.]*)?$/', $input) > 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/VideoUrl.php b/vendor/workerman/validation/library/Rules/VideoUrl.php new file mode 100644 index 0000000..286c741 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/VideoUrl.php @@ -0,0 +1,94 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\ComponentException; + +use function array_keys; +use function is_string; +use function mb_strtolower; +use function preg_match; +use function sprintf; + +/** + * Validates if the input is a video URL value. + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Emmerson Siqueira <emmersonsiqueira@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Ricardo Gobbo <ricardo@clicknow.com.br> + */ +final class VideoUrl extends AbstractRule +{ + /** + * @var string|null + */ + private $service; + + // phpcs:disable Generic.Files.LineLength.TooLong + private const SERVICES = [ + 'youtube' => '@^https?://(www\.)?(?:youtube\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^\"&?/]{11})@i', + 'vimeo' => '@^https?://(www\.)?(player\.)?(vimeo\.com/)((channels/[A-z]+/)|(groups/[A-z]+/videos/)|(video/))?([0-9]+)@i', + 'twitch' => '@^https?://(((www\.)?twitch\.tv/videos/[0-9]+)|clips\.twitch\.tv/[a-zA-Z]+)$@i', + ]; + // phpcs:enable Generic.Files.LineLength.TooLong + + /** + * Create a new instance VideoUrl. + * + * @throws ComponentException when the given service is not supported + */ + public function __construct(?string $service = null) + { + if ($service !== null && !$this->isSupportedService($service)) { + throw new ComponentException(sprintf('"%s" is not a recognized video service.', $service)); + } + + $this->service = $service; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_string($input)) { + return false; + } + + if ($this->service !== null) { + return $this->isValid($this->service, $input); + } + + foreach (array_keys(self::SERVICES) as $service) { + if (!$this->isValid($service, $input)) { + continue; + } + + return true; + } + + return false; + } + + private function isSupportedService(string $service): bool + { + return isset(self::SERVICES[mb_strtolower($service)]); + } + + private function isValid(string $service, string $input): bool + { + return preg_match(self::SERVICES[mb_strtolower($service)], $input) > 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/Vowel.php b/vendor/workerman/validation/library/Rules/Vowel.php new file mode 100644 index 0000000..df2b220 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Vowel.php @@ -0,0 +1,33 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function preg_match; + +/** + * Validates whether the input contains only vowels. + * + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Nick Lombard <github@jigsoft.co.za> + */ +final class Vowel extends AbstractFilterRule +{ + /** + * {@inheritDoc} + */ + protected function validateFilteredInput(string $input): bool + { + return preg_match('/^[aeiouAEIOU]+$/', $input) > 0; + } +} diff --git a/vendor/workerman/validation/library/Rules/When.php b/vendor/workerman/validation/library/Rules/When.php new file mode 100644 index 0000000..932d721 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/When.php @@ -0,0 +1,95 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use Respect\Validation\Exceptions\AlwaysInvalidException; +use Respect\Validation\Validatable; + +/** + * A ternary validator that accepts three parameters. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Hugo Hamon <hugo.hamon@sensiolabs.com> + */ +final class When extends AbstractRule +{ + /** + * @var Validatable + */ + private $when; + + /** + * @var Validatable + */ + private $then; + + /** + * @var Validatable + */ + private $else; + + public function __construct(Validatable $when, Validatable $then, ?Validatable $else = null) + { + $this->when = $when; + $this->then = $then; + if ($else === null) { + $else = new AlwaysInvalid(); + $else->setTemplate(AlwaysInvalidException::SIMPLE); + } + + $this->else = $else; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($this->when->validate($input)) { + return $this->then->validate($input); + } + + return $this->else->validate($input); + } + + /** + * {@inheritDoc} + */ + public function assert($input): void + { + if ($this->when->validate($input)) { + $this->then->assert($input); + + return; + } + + $this->else->assert($input); + } + + /** + * {@inheritDoc} + */ + public function check($input): void + { + if ($this->when->validate($input)) { + $this->then->check($input); + + return; + } + + $this->else->check($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Writable.php b/vendor/workerman/validation/library/Rules/Writable.php new file mode 100644 index 0000000..ae84dea --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Writable.php @@ -0,0 +1,40 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use SplFileInfo; + +use function is_string; +use function is_writable; + +/** + * Validates if the given input is writable file. + * + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Writable extends AbstractRule +{ + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if ($input instanceof SplFileInfo) { + return $input->isWritable(); + } + + return is_string($input) && is_writable($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Xdigit.php b/vendor/workerman/validation/library/Rules/Xdigit.php new file mode 100644 index 0000000..897ddf4 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Xdigit.php @@ -0,0 +1,31 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function ctype_xdigit; + +/** + * @author Andre Ramaciotti <andre@ramaciotti.com> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Xdigit extends AbstractFilterRule +{ + /** + * {@inheritDoc} + */ + protected function validateFilteredInput(string $input): bool + { + return ctype_xdigit($input); + } +} diff --git a/vendor/workerman/validation/library/Rules/Yes.php b/vendor/workerman/validation/library/Rules/Yes.php new file mode 100644 index 0000000..3e207d7 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Yes.php @@ -0,0 +1,63 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use function is_string; +use function nl_langinfo; +use function preg_match; + +use const YESEXPR; + +/** + * Validates if the input considered as "Yes". + * + * @author Cameron Hall <me@chall.id.au> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Yes extends AbstractRule +{ + /** + * @var bool + */ + private $useLocale; + + /** + * Initializes the rule. + */ + public function __construct(bool $useLocale = false) + { + $this->useLocale = $useLocale; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + if (!is_string($input)) { + return false; + } + + return preg_match($this->getPattern(), $input) > 0; + } + + private function getPattern(): string + { + if ($this->useLocale) { + return '/' . nl_langinfo(YESEXPR) . '/'; + } + + return '/^y(eah?|ep|es)?$/i'; + } +} diff --git a/vendor/workerman/validation/library/Rules/Zend.php b/vendor/workerman/validation/library/Rules/Zend.php new file mode 100644 index 0000000..268ef88 --- /dev/null +++ b/vendor/workerman/validation/library/Rules/Zend.php @@ -0,0 +1,143 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation\Rules; + +use ReflectionClass; +use Respect\Validation\Exceptions\ComponentException; +use Respect\Validation\Exceptions\ValidationException; +use Respect\Validation\Exceptions\ZendException; +use Throwable; +use Zend\Validator\ValidatorInterface; + +use function array_map; +use function class_exists; +use function current; +use function is_string; +use function sprintf; +use function stripos; + +/** + * Use Zend validators inside Respect\Validation flow. + * + * Messages are preserved. + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Danilo Correa <danilosilva87@gmail.com> + * @author Henrique Moody <henriquemoody@gmail.com> + * @author Hugo Hamon <hugo.hamon@sensiolabs.com> + */ +final class Zend extends AbstractRule +{ + /** + * @var ValidatorInterface + */ + private $zendValidator; + + /** + * @param string|ValidatorInterface $validator + * @param mixed[] $params + * + * @throws ComponentException + */ + public function __construct($validator, array $params = []) + { + $this->zendValidator = $this->zendValidator($validator, $params); + } + + /** + * {@inheritDoc} + */ + public function assert($input): void + { + $validator = clone $this->zendValidator; + if ($validator->isValid($input)) { + return; + } + + /** @var ZendException $zendException */ + $zendException = $this->reportError($input); + $zendException->addChildren( + array_map( + function (string $message) use ($input): ValidationException { + $exception = $this->reportError($input); + $exception->updateTemplate($message); + + return $exception; + }, + $validator->getMessages() + ) + ); + + throw $zendException; + } + + /** + * {@inheritDoc} + */ + public function check($input): void + { + $validator = clone $this->zendValidator; + if ($validator->isValid($input)) { + return; + } + + /** @var ZendException $zendException */ + $zendException = $this->reportError($input); + $zendException->updateTemplate(current($validator->getMessages())); + + throw $zendException; + } + + /** + * {@inheritDoc} + */ + public function validate($input): bool + { + return (clone $this->zendValidator)->isValid($input); + } + + /** + * @param mixed $validator + * @param mixed[] $params + * + * @throws ComponentException + */ + private function zendValidator($validator, array $params = []): ValidatorInterface + { + if ($validator instanceof ValidatorInterface) { + return $validator; + } + + if (!is_string($validator)) { + throw new ComponentException('The given argument is not a valid Zend Validator'); + } + + $className = stripos($validator, 'Zend') === false ? 'Zend\\Validator\\' . $validator : '\\' . $validator; + + try { + if (!class_exists($className)) { + throw new ComponentException(sprintf('"%s" is not a valid class name', $className)); + } + + $reflection = new ReflectionClass($className); + if (!$reflection->isInstantiable()) { + throw new ComponentException(sprintf('"%s" is not instantiable', $className)); + } + + return $this->zendValidator($reflection->newInstanceArgs($params)); + } catch (Throwable $exception) { + throw new ComponentException(sprintf('Could not create "%s"', $validator), 0, $exception); + } + } +} diff --git a/vendor/workerman/validation/library/Validatable.php b/vendor/workerman/validation/library/Validatable.php new file mode 100644 index 0000000..6e860ac --- /dev/null +++ b/vendor/workerman/validation/library/Validatable.php @@ -0,0 +1,51 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation; + +use Respect\Validation\Exceptions\ValidationException; + +/** Interface for validation rules */ +/** + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +interface Validatable +{ + /** + * @param mixed $input + */ + public function assert($input): void; + + /** + * @param mixed $input + */ + public function check($input): void; + + public function getName(): ?string; + + /** + * @param mixed $input + * @param mixed[] $extraParameters + */ + public function reportError($input, array $extraParameters = []): ValidationException; + + public function setName(string $name): Validatable; + + public function setTemplate(string $template): Validatable; + + /** + * @param mixed $input + */ + public function validate($input): bool; +} diff --git a/vendor/workerman/validation/library/Validator.php b/vendor/workerman/validation/library/Validator.php new file mode 100644 index 0000000..e610a38 --- /dev/null +++ b/vendor/workerman/validation/library/Validator.php @@ -0,0 +1,251 @@ +<?php + +/* + * This file is part of Respect/Validation. + * + * (c) Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * + * For the full copyright and license information, please view the LICENSE file + * that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Respect\Validation; + +use finfo; +use Respect\Validation\Exceptions\ComponentException; +use Respect\Validation\Exceptions\ValidationException; +use Respect\Validation\Rules\AllOf; +use Respect\Validation\Rules\Key; +use Symfony\Component\Validator\Constraint; +use Symfony\Component\Validator\Validator\ValidatorInterface; + +use function count; + +/** + * @method static Validator allOf(Validatable ...$rule) + * @method static Validator alnum(string ...$additionalChars) + * @method static Validator alpha(string ...$additionalChars) + * @method static Validator alwaysInvalid() + * @method static Validator alwaysValid() + * @method static Validator anyOf(Validatable ...$rule) + * @method static Validator arrayType() + * @method static Validator arrayVal() + * @method static Validator attribute(string $reference, Validatable $validator = null, bool $mandatory = true) + * @method static Validator base(int $base, string $chars = null) + * @method static Validator base64() + * @method static Validator between($minimum, $maximum) + * @method static Validator bic(string $countryCode) + * @method static Validator boolType() + * @method static Validator boolVal() + * @method static Validator bsn() + * @method static Validator call(callable $callable, Validatable $rule) + * @method static Validator callableType() + * @method static Validator callback(callable $callback) + * @method static Validator charset(string ...$charset) + * @method static Validator cnh() + * @method static Validator cnpj() + * @method static Validator control(string ...$additionalChars) + * @method static Validator consonant(string ...$additionalChars) + * @method static Validator contains($containsValue, bool $identical = false) + * @method static Validator containsAny(array $needles, bool $strictCompareArray = false) + * @method static Validator countable() + * @method static Validator countryCode(string $set = null) + * @method static Validator currencyCode() + * @method static Validator cpf() + * @method static Validator creditCard(string $brand = null) + * @method static Validator date(string $format = 'Y-m-d') + * @method static Validator dateTime(string $format = null) + * @method static Validator digit(string ...$additionalChars) + * @method static Validator directory() + * @method static Validator domain(bool $tldCheck = true) + * @method static Validator each(Validatable $rule) + * @method static Validator email() + * @method static Validator endsWith($endValue, bool $identical = false) + * @method static Validator equals($compareTo) + * @method static Validator equivalent($compareTo) + * @method static Validator even() + * @method static Validator executable() + * @method static Validator exists() + * @method static Validator extension(string $extension) + * @method static Validator factor(int $dividend) + * @method static Validator falseVal() + * @method static Validator fibonacci() + * @method static Validator file() + * @method static Validator filterVar(int $filter, $options = null) + * @method static Validator finite() + * @method static Validator floatVal() + * @method static Validator floatType() + * @method static Validator graph(string ...$additionalChars) + * @method static Validator greaterThan($compareTo) + * @method static Validator hexRgbColor() + * @method static Validator iban() + * @method static Validator identical($value) + * @method static Validator image(finfo $fileInfo = null) + * @method static Validator imei() + * @method static Validator in($haystack, bool $compareIdentical = false) + * @method static Validator infinite() + * @method static Validator instance(string $instanceName) + * @method static Validator intVal() + * @method static Validator intType() + * @method static Validator ip(string $range = '*', int $options = null) + * @method static Validator isbn() + * @method static Validator iterableType() + * @method static Validator json() + * @method static Validator key(string $reference, Validatable $referenceValidator = null, bool $mandatory = true) + * @method static Validator keyNested(string $reference, Validatable $referenceValidator = null, bool $mandatory = true) + * @method static Validator keySet(Key ...$rule) + * @method static Validator keyValue(string $comparedKey, string $ruleName, string $baseKey) + * @method static Validator languageCode(string $set = null) + * @method static Validator leapDate(string $format) + * @method static Validator leapYear() + * @method static Validator length(int $min = null, int $max = null, bool $inclusive = true) + * @method static Validator lowercase() + * @method static Validator lessThan($compareTo) + * @method static Validator luhn() + * @method static Validator macAddress() + * @method static Validator max($compareTo) + * @method static Validator maxAge(int $age, string $format = null) + * @method static Validator mimetype(string $mimetype) + * @method static Validator min($compareTo) + * @method static Validator minAge(int $age, string $format = null) + * @method static Validator multiple(int $multipleOf) + * @method static Validator negative() + * @method static Validator nfeAccessKey() + * @method static Validator nif() + * @method static Validator nip() + * @method static Validator no($useLocale = false) + * @method static Validator noneOf(Validatable ...$rule) + * @method static Validator not(Validatable $rule) + * @method static Validator notBlank() + * @method static Validator notEmoji() + * @method static Validator notEmpty() + * @method static Validator notOptional() + * @method static Validator noWhitespace() + * @method static Validator nullable(Validatable $rule) + * @method static Validator nullType() + * @method static Validator number() + * @method static Validator numericVal() + * @method static Validator objectType() + * @method static Validator odd() + * @method static Validator oneOf(Validatable ...$rule) + * @method static Validator optional(Validatable $rule) + * @method static Validator perfectSquare() + * @method static Validator pesel() + * @method static Validator phone() + * @method static Validator phpLabel() + * @method static Validator pis() + * @method static Validator polishIdCard() + * @method static Validator positive() + * @method static Validator postalCode(string $countryCode) + * @method static Validator primeNumber() + * @method static Validator printable(string ...$additionalChars) + * @method static Validator punct(string ...$additionalChars) + * @method static Validator readable() + * @method static Validator regex(string $regex) + * @method static Validator resourceType() + * @method static Validator roman() + * @method static Validator scalarVal() + * @method static Validator sf(Constraint $constraint, ValidatorInterface $validator = null) + * @method static Validator size(string $minSize = null, string $maxSize = null) + * @method static Validator slug() + * @method static Validator sorted(string $direction) + * @method static Validator space(string ...$additionalChars) + * @method static Validator startsWith($startValue, bool $identical = false) + * @method static Validator stringType() + * @method static Validator stringVal() + * @method static Validator subdivisionCode(string $countryCode) + * @method static Validator subset(array $superset) + * @method static Validator symbolicLink() + * @method static Validator time(string $format = 'H:i:s') + * @method static Validator tld() + * @method static Validator trueVal() + * @method static Validator type(string $type) + * @method static Validator unique() + * @method static Validator uploaded() + * @method static Validator uppercase() + * @method static Validator url() + * @method static Validator uuid(int $version = null) + * @method static Validator version() + * @method static Validator videoUrl(string $service = null) + * @method static Validator vowel(string ...$additionalChars) + * @method static Validator when(Validatable $if, Validatable $then, Validatable $else = null) + * @method static Validator writable() + * @method static Validator xdigit(string ...$additionalChars) + * @method static Validator yes($useLocale = false) + * @method static Validator zend($validator, array $params = null) + * + * @author Alexandre Gomes Gaigalas <alexandre@gaigalas.net> + * @author Henrique Moody <henriquemoody@gmail.com> + */ +final class Validator extends AllOf +{ + /** + * {@inheritDoc} + */ + public function check($input): void + { + try { + parent::check($input); + } catch (ValidationException $exception) { + if (count($this->getRules()) == 1 && $this->template) { + $exception->updateTemplate($this->template); + } + + throw $exception; + } + } + + /** + * Creates a new Validator instance with a rule that was called on the static method. + * + * @param mixed[] $arguments + * + * @throws ComponentException + */ + public static function __callStatic(string $ruleName, array $arguments): self + { + return self::create()->__call($ruleName, $arguments); + } + + /** + * Create a new rule by the name of the method and adds the rule to the chain. + * + * @param mixed[] $arguments + * + * @throws ComponentException + */ + public function __call(string $ruleName, array $arguments): self + { + $this->addRule(Factory::getDefaultInstance()->rule($ruleName, $arguments)); + + return $this; + } + + /** + * Create instance validator. + */ + public static function create(): self + { + return new self(); + } + + /** + * 按照规则检查输入,如果不符合规则则抛出异常 + * + * @param array $input + * @param array $rules + * @return array + */ + public static function input(array $input, array $rules) + { + $values = []; + foreach ($rules as $field => $rule) { + $value = $input[$field] ?? null; + $rule->check($value); + $values[$field] = $value; + } + return $values; + } +} diff --git a/vendor/workerman/webman-framework/.gitignore b/vendor/workerman/webman-framework/.gitignore new file mode 100644 index 0000000..3f2c43a --- /dev/null +++ b/vendor/workerman/webman-framework/.gitignore @@ -0,0 +1,5 @@ +composer.lock +vendor +vendor/ +.idea +.idea/ \ No newline at end of file diff --git a/vendor/workerman/webman-framework/README.md b/vendor/workerman/webman-framework/README.md new file mode 100644 index 0000000..96a900a --- /dev/null +++ b/vendor/workerman/webman-framework/README.md @@ -0,0 +1,5 @@ +# webman-framework +Note: This repository is the core code of the webman framework. If you want to build an application using webman, visit the main [webman](https://github.com/walkor/webman) repository. + +## LICENSE +MIT diff --git a/vendor/workerman/webman-framework/composer.json b/vendor/workerman/webman-framework/composer.json new file mode 100644 index 0000000..9bbcc72 --- /dev/null +++ b/vendor/workerman/webman-framework/composer.json @@ -0,0 +1,46 @@ +{ + "name": "workerman/webman-framework", + "type": "library", + "keywords": [ + "high performance", + "http service" + ], + "homepage": "https://www.workerman.net", + "license": "MIT", + "description": "High performance HTTP Service Framework.", + "authors": [ + { + "name": "walkor", + "email": "walkor@workerman.net", + "homepage": "https://www.workerman.net", + "role": "Developer" + } + ], + "support": { + "email": "walkor@workerman.net", + "issues": "https://github.com/walkor/webman/issues", + "forum": "https://wenda.workerman.net/", + "wiki": "https://doc.workerman.net/", + "source": "https://github.com/walkor/webman-framework" + }, + "require": { + "php": ">=7.2", + "workerman/workerman": "^4.0.4", + "nikic/fast-route": "^1.3", + "psr/container": ">=1.0" + }, + "suggest": { + "ext-event": "For better performance. " + }, + "autoload": { + "psr-4": { + "Webman\\": "./src", + "support\\": "./src/support", + "Support\\": "./src/support", + "Support\\Bootstrap\\": "./src/support/bootstrap", + "Support\\Exception\\": "./src/support/exception", + "Support\\View\\": "./src/support/view" + } + }, + "minimum-stability": "dev" +} diff --git a/vendor/workerman/webman-framework/src/App.php b/vendor/workerman/webman-framework/src/App.php new file mode 100644 index 0000000..a83927d --- /dev/null +++ b/vendor/workerman/webman-framework/src/App.php @@ -0,0 +1,863 @@ +<?php + +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman; + +use Closure; +use FastRoute\Dispatcher; +use Monolog\Logger; +use Psr\Container\ContainerInterface; +use ReflectionFunction; +use ReflectionFunctionAbstract; +use ReflectionMethod; +use Throwable; +use Webman\Exception\ExceptionHandler; +use Webman\Exception\ExceptionHandlerInterface; +use Webman\Http\Request; +use Webman\Http\Response; +use Webman\Route\Route as RouteObject; +use Workerman\Connection\TcpConnection; +use Workerman\Protocols\Http; +use Workerman\Worker; + +/** + * Class App + * @package Webman + */ +class App +{ + + /** + * @var array + */ + protected static $_callbacks = []; + + /** + * @var Worker + */ + protected static $_worker = null; + + /** + * @var ContainerInterface + */ + protected static $_container = null; + + /** + * @var Logger + */ + protected static $_logger = null; + + /** + * @var string + */ + protected static $_appPath = ''; + + /** + * @var string + */ + protected static $_publicPath = ''; + + /** + * @var string + */ + protected static $_configPath = ''; + + /** + * @var TcpConnection + */ + protected static $_connection = null; + + /** + * @var Request + */ + protected static $_request = null; + + /** + * @var string + */ + protected static $_requestClass = ''; + + /** + * App constructor. + * + * @param string $request_class + * @param Logger $logger + * @param string $app_path + * @param string $public_path + */ + public function __construct(string $request_class, Logger $logger, string $app_path, string $public_path) + { + static::$_requestClass = $request_class; + static::$_logger = $logger; + static::$_publicPath = $public_path; + static::$_appPath = $app_path; + } + + /** + * @param TcpConnection $connection + * @param Request $request + * @return null + */ + public function onMessage($connection, $request) + { + try { + static::$_request = $request; + static::$_connection = $connection; + $path = $request->path(); + $key = $request->method() . $path; + if (isset(static::$_callbacks[$key])) { + [$callback, $request->plugin, $request->app, $request->controller, $request->action, $request->route] = static::$_callbacks[$key]; + static::send($connection, $callback($request), $request); + return null; + } + + if ( + static::unsafeUri($connection, $path, $request) || + static::findFile($connection, $path, $key, $request) || + static::findRoute($connection, $path, $key, $request) + ) { + return null; + } + + $controller_and_action = static::parseControllerAction($path); + $plugin = $controller_and_action['plugin'] ?? static::getPluginByPath($path); + if (!$controller_and_action || Route::hasDisableDefaultRoute($plugin)) { + $callback = static::getFallback($plugin); + $request->app = $request->controller = $request->action = ''; + static::send($connection, $callback($request), $request); + return null; + } + $app = $controller_and_action['app']; + $controller = $controller_and_action['controller']; + $action = $controller_and_action['action']; + $callback = static::getCallback($plugin, $app, [$controller, $action]); + static::collectCallbacks($key, [$callback, $plugin, $app, $controller, $action, null]); + [$callback, $request->plugin, $request->app, $request->controller, $request->action, $request->route] = static::$_callbacks[$key]; + static::send($connection, $callback($request), $request); + } catch (Throwable $e) { + static::send($connection, static::exceptionResponse($e, $request), $request); + } + return null; + } + + /** + * @param $worker + * @return void + */ + public function onWorkerStart($worker) + { + static::$_worker = $worker; + Http::requestClass(static::$_requestClass); + } + + /** + * @param string $key + * @param array $data + * @return void + */ + protected static function collectCallbacks(string $key, array $data) + { + static::$_callbacks[$key] = $data; + if (\count(static::$_callbacks) >= 1024) { + unset(static::$_callbacks[\key(static::$_callbacks)]); + } + } + + /** + * @param TcpConnection $connection + * @param string $path + * @param $request + * @return bool + */ + protected static function unsafeUri(TcpConnection $connection, string $path, $request): bool + { + if ( + !$path || + \strpos($path, '..') !== false || + \strpos($path, "\\") !== false || + \strpos($path, "\0") !== false + ) { + $callback = static::getFallback(); + $request->plugin = $request->app = $request->controller = $request->action = ''; + static::send($connection, $callback($request), $request); + return true; + } + return false; + } + + /** + * @param string $plugin + * @return Closure + */ + protected static function getFallback(string $plugin = ''): Closure + { + // when route, controller and action not found, try to use Route::fallback + return Route::getFallback($plugin) ?: function () { + try { + $notFoundContent = \file_get_contents(static::$_publicPath . '/404.html'); + } catch (Throwable $e) { + $notFoundContent = '404 Not Found'; + } + return new Response(404, [], $notFoundContent); + }; + } + + /** + * @param Throwable $e + * @param $request + * @return Response + */ + protected static function exceptionResponse(Throwable $e, $request) + { + try { + $app = $request->app ?: ''; + $plugin = $request->plugin ?: ''; + $exception_config = static::config($plugin, 'exception'); + $default_exception = $exception_config[''] ?? ExceptionHandler::class; + $exception_handler_class = $exception_config[$app] ?? $default_exception; + + /** @var ExceptionHandlerInterface $exception_handler */ + $exception_handler = static::container($plugin)->make($exception_handler_class, [ + 'logger' => static::$_logger, + 'debug' => static::config($plugin, 'app.debug') + ]); + $exception_handler->report($e); + $response = $exception_handler->render($request, $e); + $response->exception($e); + return $response; + } catch (Throwable $e) { + $response = new Response(500, [], static::config($plugin ?? '', 'app.debug') ? (string)$e : $e->getMessage()); + $response->exception($e); + return $response; + } + } + + /** + * @param $app + * @param $call + * @param array|null $args + * @param bool $with_global_middleware + * @param RouteObject $route + * @return callable + */ + protected static function getCallback(string $plugin, string $app, $call, array $args = null, bool $with_global_middleware = true, RouteObject $route = null) + { + $args = $args === null ? null : \array_values($args); + $middlewares = []; + if ($route) { + $route_middlewares = \array_reverse($route->getMiddleware()); + foreach ($route_middlewares as $class_name) { + $middlewares[] = [$class_name, 'process']; + } + } + $middlewares = \array_merge($middlewares, Middleware::getMiddleware($plugin, $app, $with_global_middleware)); + + foreach ($middlewares as $key => $item) { + $middleware = $item[0]; + if (is_string($middleware)) { + $middleware = static::container($plugin)->get($middleware); + } elseif ($middleware instanceof \Closure) { + $middleware = call_user_func($middleware, static::container($plugin)); + } + if (!$middleware instanceof MiddlewareInterface) { + throw new \InvalidArgumentException('Not support middleware type'); + } + $middlewares[$key][0] = $middleware; + } + + $need_inject = static::isNeedInject($call, $args); + if (\is_array($call) && \is_string($call[0])) { + $controller_reuse = static::config($plugin, 'app.controller_reuse', true); + if (!$controller_reuse) { + if ($need_inject) { + $call = function ($request, ...$args) use ($call, $plugin) { + $call[0] = static::container($plugin)->make($call[0]); + $reflector = static::getReflector($call); + $args = static::resolveMethodDependencies($plugin, $request, $args, $reflector); + return $call(...$args); + }; + $need_inject = false; + } else { + $call = function ($request, ...$args) use ($call, $plugin) { + $call[0] = static::container($plugin)->make($call[0]); + return $call($request, ...$args); + }; + } + } else { + $call[0] = static::container($plugin)->get($call[0]); + } + } + + if ($need_inject) { + $call = static::resolveInject($plugin, $call); + } + + if ($middlewares) { + $callback = \array_reduce($middlewares, function ($carry, $pipe) { + return function ($request) use ($carry, $pipe) { + try { + return $pipe($request, $carry); + } catch (Throwable $e) { + return static::exceptionResponse($e, $request); + } + }; + }, function ($request) use ($call, $args) { + try { + if ($args === null) { + $response = $call($request); + } else { + $response = $call($request, ...$args); + } + } catch (Throwable $e) { + return static::exceptionResponse($e, $request); + } + if (!$response instanceof Response) { + if (\is_array($response)) { + $response = 'Array'; + } + $response = new Response(200, [], $response); + } + return $response; + }); + } else { + if ($args === null) { + $callback = $call; + } else { + $callback = function ($request) use ($call, $args) { + return $call($request, ...$args); + }; + } + } + return $callback; + } + + /** + * @param string $plugin + * @param array|Closure $call + * @param null|array $args + * @return Closure + * @see Dependency injection through reflection information + */ + protected static function resolveInject(string $plugin, $call) + { + return function (Request $request, ...$args) use ($plugin, $call) { + $reflector = static::getReflector($call); + $args = static::resolveMethodDependencies($plugin, $request, $args, $reflector); + return $call(...$args); + }; + } + + /** + * Check whether inject is required + * + * @param $call + * @param $args + * @return bool + * @throws \ReflectionException + */ + protected static function isNeedInject($call, $args) + { + if (\is_array($call) && !\method_exists($call[0], $call[1])) { + return false; + } + $args = $args ?: []; + $reflector = static::getReflector($call); + $reflection_parameters = $reflector->getParameters(); + if (!$reflection_parameters) { + return false; + } + $first_parameter = \current($reflection_parameters); + unset($reflection_parameters[\key($reflection_parameters)]); + $adapters_list = ['int', 'string', 'bool', 'array', 'object', 'float', 'mixed', 'resource']; + foreach ($reflection_parameters as $parameter) { + if ($parameter->hasType() && !\in_array($parameter->getType()->getName(), $adapters_list)) { + return true; + } + } + if (!$first_parameter->hasType()) { + if (\count($args) <= count($reflection_parameters)) { + return false; + } + return true; + } elseif (!\is_a(static::$_request, $first_parameter->getType()->getName())) { + return true; + } + + return false; + } + + /** + * Get reflector. + * + * @param $call + * @return ReflectionFunction|ReflectionMethod + * @throws \ReflectionException + */ + protected static function getReflector($call) + { + if ($call instanceof Closure || \is_string($call)) { + return new ReflectionFunction($call); + } + return new ReflectionMethod($call[0], $call[1]); + } + + /** + * Return dependent parameters + * + * @param string $plugin + * @param Request $request + * @param array $args + * @param ReflectionFunctionAbstract $reflector + * @return array + */ + protected static function resolveMethodDependencies(string $plugin, Request $request, array $args, ReflectionFunctionAbstract $reflector) + { + // Specification parameter information + $args = \array_values($args); + $parameters = []; + // An array of reflection classes for loop parameters, with each $parameter representing a reflection object of parameters + foreach ($reflector->getParameters() as $parameter) { + // Parameter quota consumption + if ($parameter->hasType()) { + $name = $parameter->getType()->getName(); + switch ($name) { + case 'int': + case 'string': + case 'bool': + case 'array': + case 'object': + case 'float': + case 'mixed': + case 'resource': + goto _else; + default: + if (\is_a(static::$_request, $name)) { + //Inject Request + $parameters[] = $request; + } else { + $parameters[] = static::container($plugin)->make($name); + } + break; + } + } else { + _else: + // The variable parameter + if (null !== \key($args)) { + $parameters[] = \current($args); + } else { + // Indicates whether the current parameter has a default value. If yes, return true + $parameters[] = $parameter->isDefaultValueAvailable() ? $parameter->getDefaultValue() : null; + } + // Quota of consumption variables + \next($args); + } + } + + // Returns the result of parameters replacement + return $parameters; + } + + /** + * @param string $plugin + * @return ContainerInterface + */ + public static function container(string $plugin = '') + { + return static::config($plugin, 'container'); + } + + /** + * @return Request|\support\Request + */ + public static function request() + { + return static::$_request; + } + + /** + * @return TcpConnection + */ + public static function connection() + { + return static::$_connection; + } + + /** + * @return Worker + */ + public static function worker() + { + return static::$_worker; + } + + /** + * @param TcpConnection $connection + * @param string $path + * @param string $key + * @param Request $request + * @return bool + */ + protected static function findRoute(TcpConnection $connection, string $path, string $key, $request) + { + $ret = Route::dispatch($request->method(), $path); + if ($ret[0] === Dispatcher::FOUND) { + $ret[0] = 'route'; + $callback = $ret[1]['callback']; + $route = clone $ret[1]['route']; + $app = $controller = $action = ''; + $args = !empty($ret[2]) ? $ret[2] : null; + if ($args) { + $route->setParams($args); + } + if (\is_array($callback)) { + $controller = $callback[0]; + $plugin = static::getPluginByClass($controller); + $app = static::getAppByController($controller); + $action = static::getRealMethod($controller, $callback[1]) ?? ''; + } else { + $plugin = static::getPluginByPath($path); + } + $callback = static::getCallback($plugin, $app, $callback, $args, true, $route); + static::collectCallbacks($key, [$callback, $plugin, $app, $controller ?: '', $action, $route]); + [$callback, $request->plugin, $request->app, $request->controller, $request->action, $request->route] = static::$_callbacks[$key]; + static::send($connection, $callback($request), $request); + return true; + } + return false; + } + + /** + * @param TcpConnection $connection + * @param string $path + * @param string $key + * @param Request $request + * @return bool + */ + protected static function findFile(TcpConnection $connection, string $path, string $key, $request): bool + { + if (preg_match('/%[0-9a-f]{2}/i', $path)) { + $path = urldecode($path); + if (static::unsafeUri($connection, $path, $request)) { + return true; + } + } + + $path_explodes = \explode('/', trim($path, '/')); + $plugin = ''; + if (isset($path_explodes[1]) && $path_explodes[0] === 'app') { + $public_dir = BASE_PATH . "/plugin/{$path_explodes[1]}/public"; + $plugin = $path_explodes[1]; + $path = \substr($path, strlen("/app/{$path_explodes[1]}/")); + } else { + $public_dir = static::$_publicPath; + } + $file = "$public_dir/$path"; + if (!\is_file($file)) { + return false; + } + + if (\pathinfo($file, PATHINFO_EXTENSION) === 'php') { + if (!static::config($plugin, 'app.support_php_files', false)) { + return false; + } + static::collectCallbacks($key, [function () use ($file) { + return static::execPhpFile($file); + }, '', '', '', '', null]); + [, $request->plugin, $request->app, $request->controller, $request->action, $request->route] = static::$_callbacks[$key]; + static::send($connection, static::execPhpFile($file), $request); + return true; + } + + if (!static::config($plugin, 'static.enable', false)) { + return false; + } + + static::collectCallbacks($key, [static::getCallback($plugin, '__static__', function ($request) use ($file, $plugin) { + \clearstatcache(true, $file); + if (!\is_file($file)) { + $callback = static::getFallback($plugin); + return $callback($request); + } + return (new Response())->file($file); + }, null, false), '', '', '', '', null]); + [$callback, $request->plugin, $request->app, $request->controller, $request->action, $request->route] = static::$_callbacks[$key]; + static::send($connection, $callback($request), $request); + return true; + } + + /** + * @param TcpConnection $connection + * @param Response $response + * @param Request $request + * @return void + */ + protected static function send(TcpConnection $connection, $response, $request) + { + $keep_alive = $request->header('connection'); + static::$_request = static::$_connection = null; + if (($keep_alive === null && $request->protocolVersion() === '1.1') + || $keep_alive === 'keep-alive' || $keep_alive === 'Keep-Alive' + ) { + $connection->send($response); + return; + } + $connection->close($response); + } + + /** + * @param string $path + * @return array|false + * @throws \Psr\Container\ContainerExceptionInterface + * @throws \Psr\Container\NotFoundExceptionInterface + * @throws \ReflectionException + */ + protected static function parseControllerAction(string $path) + { + $path = \str_replace('-', '', $path); + $path_explode = \explode('/', trim($path, '/')); + $is_plugin = isset($path_explode[1]) && $path_explode[0] === 'app'; + $config_prefix = $is_plugin ? "plugin.{$path_explode[1]}." : ''; + $path_prefix = $is_plugin ? "/app/{$path_explode[1]}" : ''; + $class_prefix = $is_plugin ? "plugin\\{$path_explode[1]}" : ''; + $suffix = Config::get("{$config_prefix}app.controller_suffix", ''); + $relative_path = \trim(substr($path, strlen($path_prefix)), '/'); + $path_explode = $relative_path ? \explode('/', $relative_path) : []; + + $action = 'index'; + if ($controller_action = static::guessControllerAction($path_explode, $action, $suffix, $class_prefix)) { + return $controller_action; + } + $action = \end($path_explode); + unset($path_explode[count($path_explode) - 1]); + return static::guessControllerAction($path_explode, $action, $suffix, $class_prefix); + } + + /** + * @param $path_explode + * @param $action + * @param $suffix + * @param $class_prefix + * @return array|false + * @throws \ReflectionException + */ + protected static function guessControllerAction($path_explode, $action, $suffix, $class_prefix) + { + $map[] = trim("$class_prefix\\app\\controller\\" . \implode('\\', $path_explode), '\\'); + foreach ($path_explode as $index => $section) { + $tmp = $path_explode; + \array_splice($tmp, $index, 1, [$section, 'controller']); + $map[] = trim("$class_prefix\\" . \implode('\\', \array_merge(['app'], $tmp)), '\\'); + } + foreach ($map as $item) { + $map[] = $item . '\\index'; + } + + foreach ($map as $controller_class) { + $controller_class .= $suffix; + if ($controller_action = static::getControllerAction($controller_class, $action)) { + return $controller_action; + } + } + return false; + } + + /** + * @param string $controller_class + * @param string $action + * @return array|false + * @throws \ReflectionException + */ + protected static function getControllerAction(string $controller_class, string $action) + { + // Disable calling magic methods + if (\strpos($action, '__') === 0) { + return false; + } + if (($controller_class = static::getController($controller_class)) && ($action = static::getAction($controller_class, $action))) { + return [ + 'plugin' => static::getPluginByClass($controller_class), + 'app' => static::getAppByController($controller_class), + 'controller' => $controller_class, + 'action' => $action + ]; + } + return false; + } + + /** + * @param string $controller_class + * @return string|false + * @throws \ReflectionException + */ + protected static function getController(string $controller_class) + { + if (\class_exists($controller_class)) { + return (new \ReflectionClass($controller_class))->name; + } + $explodes = \explode('\\', strtolower(ltrim($controller_class, '\\'))); + $base_path = $explodes[0] === 'plugin' ? BASE_PATH . '/plugin' : static::$_appPath; + unset($explodes[0]); + $file_name = \array_pop($explodes) . '.php'; + $found = true; + foreach ($explodes as $path_section) { + if (!$found) { + break; + } + $dirs = Util::scanDir($base_path, false); + $found = false; + foreach ($dirs as $name) { + $path = "$base_path/$name"; + if (\is_dir($path) && \strtolower($name) === $path_section) { + $base_path = $path; + $found = true; + break; + } + } + } + if (!$found) { + return false; + } + foreach (\scandir($base_path) ?: [] as $name) { + if (\strtolower($name) === $file_name) { + require_once "$base_path/$name"; + if (\class_exists($controller_class, false)) { + return (new \ReflectionClass($controller_class))->name; + } + } + } + return false; + } + + /** + * @param string $controller_class + * @param string $action + * @return string|false + */ + protected static function getAction(string $controller_class, string $action) + { + $methods = \get_class_methods($controller_class); + $action = \strtolower($action); + $found = false; + foreach ($methods as $candidate) { + if (\strtolower($candidate) === $action) { + $action = $candidate; + $found = true; + break; + } + } + + if ($found) { + return $action; + } + + // Action is not public method + if (\method_exists($controller_class, $action)) { + return false; + } + + if (\method_exists($controller_class, '__call')) { + return $action; + } + + return false; + } + + /** + * @param string $controller_class + * @return mixed|string + */ + public static function getPluginByClass(string $controller_class) + { + $controller_class = \trim($controller_class, '\\'); + $tmp = \explode('\\', $controller_class, 3); + if ($tmp[0] !== 'plugin') { + return ''; + } + return $tmp[1] ?? ''; + } + + /** + * @param string $path + * @return mixed|string + */ + public static function getPluginByPath(string $path) + { + $path = \trim($path, '/'); + $tmp = \explode('/', $path, 3); + if ($tmp[0] !== 'app') { + return ''; + } + return $tmp[1] ?? ''; + } + + /** + * @param string $controller_class + * @return mixed|string + */ + protected static function getAppByController(string $controller_class) + { + $controller_class = \trim($controller_class, '\\'); + $tmp = \explode('\\', $controller_class, 5); + $pos = $tmp[0] === 'plugin' ? 3 : 1; + if (!isset($tmp[$pos])) { + return ''; + } + return \strtolower($tmp[$pos]) === 'controller' ? '' : $tmp[$pos]; + } + + /** + * @param string $file + * @return false|string + */ + public static function execPhpFile(string $file) + { + \ob_start(); + // Try to include php file. + try { + include $file; + } catch (\Exception $e) { + echo $e; + } + return \ob_get_clean(); + } + + /** + * @param string $class + * @param string $method + * @return string + */ + protected static function getRealMethod(string $class, string $method) + { + $method = \strtolower($method); + $methods = \get_class_methods($class); + foreach ($methods as $candidate) { + if (\strtolower($candidate) === $method) { + return $candidate; + } + } + return $method; + } + + /** + * @param string $plugin + * @param string $key + * @param $default + * @return array|mixed|null + */ + protected static function config(string $plugin, string $key, $default = null) + { + return Config::get($plugin ? "plugin.$plugin.$key" : $key, $default); + } +} diff --git a/vendor/workerman/webman-framework/src/Bootstrap.php b/vendor/workerman/webman-framework/src/Bootstrap.php new file mode 100644 index 0000000..4154ca3 --- /dev/null +++ b/vendor/workerman/webman-framework/src/Bootstrap.php @@ -0,0 +1,28 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman; + +use Workerman\Worker; + +interface Bootstrap +{ + /** + * onWorkerStart + * + * @param Worker $worker + * @return mixed + */ + public static function start($worker); +} diff --git a/vendor/workerman/webman-framework/src/Config.php b/vendor/workerman/webman-framework/src/Config.php new file mode 100644 index 0000000..892978b --- /dev/null +++ b/vendor/workerman/webman-framework/src/Config.php @@ -0,0 +1,276 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman; + +class Config +{ + + /** + * @var array + */ + protected static $_config = []; + + /** + * @var string + */ + protected static $_configPath = ''; + + /** + * @var bool + */ + protected static $_loaded = false; + + /** + * @param string $config_path + * @param array $exclude_file + * @param string|null $key + * @return void + */ + public static function load(string $config_path, array $exclude_file = [], string $key = null) + { + static::$_configPath = $config_path; + if (!$config_path) { + return; + } + static::$_loaded = false; + $config = static::loadFromDir($config_path, $exclude_file); + if (!$config) { + static::$_loaded = true; + return; + } + if ($key !== null) { + foreach (\array_reverse(\explode('.', $key)) as $k) { + $config = [$k => $config]; + } + } + static::$_config = \array_replace_recursive(static::$_config, $config); + static::formatConfig(); + static::$_loaded = true; + } + + /** + * This deprecated method will certainly be removed in the future + * + * @deprecated + * @param string $config_path + * @param array $exclude_file + * @return void + */ + public static function reload(string $config_path, array $exclude_file = []) + { + static::load($config_path, $exclude_file); + } + + /** + * @return void + */ + public static function clear() + { + static::$_config = []; + } + + /** + * @return void + */ + protected static function formatConfig() + { + $config = static::$_config; + // Merge log config + foreach ($config['plugin'] ?? [] as $firm => $projects) { + if (isset($projects['app'])) { + foreach ($projects['log'] ?? [] as $key => $item) { + $config['log']["plugin.$firm.$key"] = $item; + } + } + foreach ($projects as $name => $project) { + if (!\is_array($project)) { + continue; + } + foreach ($project['log'] ?? [] as $key => $item) { + $config['log']["plugin.$firm.$name.$key"] = $item; + } + } + } + // Merge database config + foreach ($config['plugin'] ?? [] as $firm => $projects) { + if (isset($projects['app'])) { + foreach ($projects['database']['connections'] ?? [] as $key => $connection) { + $config['database']['connections']["plugin.$firm.$key"] = $connection; + } + } + foreach ($projects as $name => $project) { + if (!\is_array($project)) { + continue; + } + foreach ($project['database']['connections'] ?? [] as $key => $connection) { + $config['database']['connections']["plugin.$firm.$name.$key"] = $connection; + } + } + } + if (!empty($config['database']['connections'])) { + $config['database']['default'] = $config['database']['default'] ?? key($config['database']['connections']); + } + // Merge thinkorm config + foreach ($config['plugin'] ?? [] as $firm => $projects) { + if (isset($projects['app'])) { + foreach ($projects['thinkorm']['connections'] ?? [] as $key => $connection) { + $config['thinkorm']['connections']["plugin.$firm.$key"] = $connection; + } + } + foreach ($projects as $name => $project) { + if (!\is_array($project)) { + continue; + } + foreach ($project['thinkorm']['connections'] ?? [] as $key => $connection) { + $config['thinkorm']['connections']["plugin.$firm.$name.$key"] = $connection; + } + } + } + if (!empty($config['thinkorm']['connections'])) { + $config['thinkorm']['default'] = $config['thinkorm']['default'] ?? \key($config['thinkorm']['connections']); + } + // Merge redis config + foreach ($config['plugin'] ?? [] as $firm => $projects) { + if (isset($projects['app'])) { + foreach ($projects['redis'] ?? [] as $key => $connection) { + $config['redis']["plugin.$firm.$key"] = $connection; + } + } + foreach ($projects as $name => $project) { + if (!\is_array($project)) { + continue; + } + foreach ($project['redis'] ?? [] as $key => $connection) { + $config['redis']["plugin.$firm.$name.$key"] = $connection; + } + } + } + static::$_config = $config; + } + + /** + * @param string $config_path + * @param array $exclude_file + * @return array + */ + public static function loadFromDir(string $config_path, array $exclude_file = []) + { + $all_config = []; + $dir_iterator = new \RecursiveDirectoryIterator($config_path, \FilesystemIterator::FOLLOW_SYMLINKS); + $iterator = new \RecursiveIteratorIterator($dir_iterator); + foreach ($iterator as $file) { + /** var SplFileInfo $file */ + if (\is_dir($file) || $file->getExtension() != 'php' || \in_array($file->getBaseName('.php'), $exclude_file)) { + continue; + } + $app_config_file = $file->getPath() . '/app.php'; + if (!\is_file($app_config_file)) { + continue; + } + $relative_path = \str_replace($config_path . DIRECTORY_SEPARATOR, '', substr($file, 0, -4)); + $explode = \array_reverse(\explode(DIRECTORY_SEPARATOR, $relative_path)); + if (\count($explode) >= 2) { + $app_config = include $app_config_file; + if (empty($app_config['enable'])) { + continue; + } + } + $config = include $file; + foreach ($explode as $section) { + $tmp = []; + $tmp[$section] = $config; + $config = $tmp; + } + $all_config = \array_replace_recursive($all_config, $config); + } + return $all_config; + } + + /** + * @param string|null $key + * @param mixed $default + * @return array|mixed|void|null + */ + public static function get(string $key = null, $default = null) + { + if ($key === null) { + return static::$_config; + } + $key_array = \explode('.', $key); + $value = static::$_config; + $found = true; + foreach ($key_array as $index) { + if (!isset($value[$index])) { + if (static::$_loaded) { + return $default; + } + $found = false; + break; + } + $value = $value[$index]; + } + if ($found) { + return $value; + } + return static::read($key, $default); + } + + /** + * @param string $key + * @param mixed $default + * @return array|mixed|null + */ + protected static function read(string $key, $default = null) + { + $path = static::$_configPath; + if ($path === '') { + return $default; + } + $keys = $key_array = \explode('.', $key); + foreach ($key_array as $index => $section) { + unset($keys[$index]); + if (\is_file($file = "$path/$section.php")) { + $config = include $file; + return static::find($keys, $config, $default); + } + if (!\is_dir($path = "$path/$section")) { + return $default; + } + } + return $default; + } + + /** + * @param array $key_array + * @param mixed $stack + * @param mixed $default + * @return array|mixed + */ + protected static function find(array $key_array, $stack, $default) + { + if (!\is_array($stack)) { + return $default; + } + $value = $stack; + foreach ($key_array as $index) { + if (!isset($value[$index])) { + return $default; + } + $value = $value[$index]; + } + return $value; + } + +} diff --git a/vendor/workerman/webman-framework/src/Container.php b/vendor/workerman/webman-framework/src/Container.php new file mode 100644 index 0000000..aa02384 --- /dev/null +++ b/vendor/workerman/webman-framework/src/Container.php @@ -0,0 +1,78 @@ +<?php + +namespace Webman; + +use Psr\Container\ContainerInterface; +use Webman\Exception\NotFoundException; + +/** + * Class Container + * @package Webman + */ +class Container implements ContainerInterface +{ + + /** + * @var array + */ + protected $_instances = []; + /** + * @var array + */ + protected $_definitions = []; + + /** + * @param string $name + * @return mixed + * @throws NotFoundException + */ + public function get(string $name) + { + if (!isset($this->_instances[$name])) { + if (isset($this->_definitions[$name])) { + $this->_instances[$name] = call_user_func($this->_definitions[$name], $this); + } else { + if (!\class_exists($name)) { + throw new NotFoundException("Class '$name' not found"); + } + $this->_instances[$name] = new $name(); + } + } + return $this->_instances[$name]; + } + + /** + * @param string $name + * @return bool + */ + public function has(string $name): bool + { + return \array_key_exists($name, $this->_instances) + || array_key_exists($name, $this->_definitions); + } + + /** + * @param string $name + * @param array $constructor + * @return mixed + * @throws NotFoundException + */ + public function make(string $name, array $constructor = []) + { + if (!\class_exists($name)) { + throw new NotFoundException("Class '$name' not found"); + } + return new $name(... array_values($constructor)); + } + + /** + * @param array $definitions + * @return $this + */ + public function addDefinitions(array $definitions) + { + $this->_definitions = array_merge($this->_definitions, $definitions); + return $this; + } + +} diff --git a/vendor/workerman/webman-framework/src/Exception/ExceptionHandler.php b/vendor/workerman/webman-framework/src/Exception/ExceptionHandler.php new file mode 100644 index 0000000..35a213e --- /dev/null +++ b/vendor/workerman/webman-framework/src/Exception/ExceptionHandler.php @@ -0,0 +1,101 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman\Exception; + +use Psr\Log\LoggerInterface; +use Throwable; +use Webman\Http\Request; +use Webman\Http\Response; + +/** + * Class Handler + * @package support\exception + */ +class ExceptionHandler implements ExceptionHandlerInterface +{ + /** + * @var LoggerInterface + */ + protected $_logger = null; + + /** + * @var bool + */ + protected $_debug = false; + + /** + * @var array + */ + public $dontReport = []; + + /** + * ExceptionHandler constructor. + * @param $logger + * @param $debug + */ + public function __construct($logger, $debug) + { + $this->_logger = $logger; + $this->_debug = $debug; + } + + /** + * @param Throwable $exception + * @return void + */ + public function report(Throwable $exception) + { + if ($this->shouldntReport($exception)) { + return; + } + $logs = ''; + if ($request = \request()) { + $logs = $request->getRealIp() . ' ' . $request->method() . ' ' . \trim($request->fullUrl(), '/'); + } + $this->_logger->error($logs . PHP_EOL . $exception); + } + + /** + * @param Request $request + * @param Throwable $exception + * @return Response + */ + public function render(Request $request, Throwable $exception): Response + { + $code = $exception->getCode(); + if ($request->expectsJson()) { + $json = ['code' => $code ? $code : 500, 'msg' => $this->_debug ? $exception->getMessage() : 'Server internal error']; + $this->_debug && $json['traces'] = (string)$exception; + return new Response(200, ['Content-Type' => 'application/json'], + \json_encode($json, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); + } + $error = $this->_debug ? \nl2br((string)$exception) : 'Server internal error'; + return new Response(500, [], $error); + } + + /** + * @param Throwable $e + * @return bool + */ + protected function shouldntReport(Throwable $e) + { + foreach ($this->dontReport as $type) { + if ($e instanceof $type) { + return true; + } + } + return false; + } +} diff --git a/vendor/workerman/webman-framework/src/Exception/ExceptionHandlerInterface.php b/vendor/workerman/webman-framework/src/Exception/ExceptionHandlerInterface.php new file mode 100644 index 0000000..1e64940 --- /dev/null +++ b/vendor/workerman/webman-framework/src/Exception/ExceptionHandlerInterface.php @@ -0,0 +1,35 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman\Exception; + +use Throwable; +use Webman\Http\Request; +use Webman\Http\Response; + +interface ExceptionHandlerInterface +{ + /** + * @param Throwable $e + * @return mixed + */ + public function report(Throwable $e); + + /** + * @param Request $request + * @param Throwable $e + * @return Response + */ + public function render(Request $request, Throwable $e): Response; +} \ No newline at end of file diff --git a/vendor/workerman/webman-framework/src/Exception/FileException.php b/vendor/workerman/webman-framework/src/Exception/FileException.php new file mode 100644 index 0000000..fa5dbe6 --- /dev/null +++ b/vendor/workerman/webman-framework/src/Exception/FileException.php @@ -0,0 +1,25 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman\Exception; + +use RuntimeException; + +/** + * Class FileException + * @package Webman\Exception + */ +class FileException extends RuntimeException +{ +} \ No newline at end of file diff --git a/vendor/workerman/webman-framework/src/Exception/NotFoundException.php b/vendor/workerman/webman-framework/src/Exception/NotFoundException.php new file mode 100644 index 0000000..735c1d4 --- /dev/null +++ b/vendor/workerman/webman-framework/src/Exception/NotFoundException.php @@ -0,0 +1,25 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman\Exception; + +use Psr\Container\NotFoundExceptionInterface; + +/** + * Class NotFoundException + * @package Webman\Exception + */ +class NotFoundException extends \Exception implements NotFoundExceptionInterface +{ +} diff --git a/vendor/workerman/webman-framework/src/File.php b/vendor/workerman/webman-framework/src/File.php new file mode 100644 index 0000000..410a8c5 --- /dev/null +++ b/vendor/workerman/webman-framework/src/File.php @@ -0,0 +1,45 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman; + +use Webman\Exception\FileException; + +class File extends \SplFileInfo +{ + + /** + * @param string $destination + * @return File + */ + public function move(string $destination) + { + \set_error_handler(function ($type, $msg) use (&$error) { + $error = $msg; + }); + $path = \pathinfo($destination, PATHINFO_DIRNAME); + if (!\is_dir($path) && !\mkdir($path, 0777, true)) { + \restore_error_handler(); + throw new FileException(\sprintf('Unable to create the "%s" directory (%s)', $path, \strip_tags($error))); + } + if (!rename($this->getPathname(), $destination)) { + \restore_error_handler(); + throw new FileException(\sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $destination, \strip_tags($error))); + } + \restore_error_handler(); + @\chmod($destination, 0666 & ~\umask()); + return new self($destination); + } + +} \ No newline at end of file diff --git a/vendor/workerman/webman-framework/src/FileSessionHandler.php b/vendor/workerman/webman-framework/src/FileSessionHandler.php new file mode 100644 index 0000000..ed0b3f2 --- /dev/null +++ b/vendor/workerman/webman-framework/src/FileSessionHandler.php @@ -0,0 +1,25 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Webman; + +/** + * This deprecated class will certainly be removed in the future. + * Please use Webman\Session\FileSessionHandler + * @deprecated + * @package Webman + */ +class FileSessionHandler extends Session\FileSessionHandler +{ + +} diff --git a/vendor/workerman/webman-framework/src/Http/Request.php b/vendor/workerman/webman-framework/src/Http/Request.php new file mode 100644 index 0000000..2491b5e --- /dev/null +++ b/vendor/workerman/webman-framework/src/Http/Request.php @@ -0,0 +1,291 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman\Http; + +use Webman\App; +use Webman\Route\Route; + +/** + * Class Request + * @package Webman\Http + */ +class Request extends \Workerman\Protocols\Http\Request +{ + /** + * @var string + */ + public $plugin = null; + + /** + * @var string + */ + public $app = null; + + /** + * @var string + */ + public $controller = null; + + /** + * @var string + */ + public $action = null; + + /** + * @var Route + */ + public $route = null; + + /** + * @return mixed|null + */ + public function all() + { + return $this->post() + $this->get(); + } + + /** + * @param string $name + * @param string|null $default + * @return mixed|null + */ + public function input($name, $default = null) + { + $post = $this->post(); + if (isset($post[$name])) { + return $post[$name]; + } + $get = $this->get(); + return isset($get[$name]) ? $get[$name] : $default; + } + + /** + * @param array $keys + * @return array + */ + public function only(array $keys) + { + $all = $this->all(); + $result = []; + foreach ($keys as $key) { + if (isset($all[$key])) { + $result[$key] = $all[$key]; + } + } + return $result; + } + + /** + * @param array $keys + * @return mixed|null + */ + public function except(array $keys) + { + $all = $this->all(); + foreach ($keys as $key) { + unset($all[$key]); + } + return $all; + } + + /** + * @param string|null $name + * @return null|UploadFile[]|UploadFile + */ + public function file($name = null) + { + $files = parent::file($name); + if (null === $files) { + return $name === null ? [] : null; + } + if ($name !== null) { + // Multi files + if (\is_array(\current($files))) { + return $this->parseFiles($files); + } + return $this->parseFile($files); + } + $upload_files = []; + foreach ($files as $name => $file) { + // Multi files + if (\is_array(\current($file))) { + $upload_files[$name] = $this->parseFiles($file); + } else { + $upload_files[$name] = $this->parseFile($file); + } + } + return $upload_files; + } + + /** + * @param array $file + * @return UploadFile + */ + protected function parseFile(array $file) + { + return new UploadFile($file['tmp_name'], $file['name'], $file['type'], $file['error']); + } + + /** + * @param array $files + * @return array + */ + protected function parseFiles(array $files) + { + $upload_files = []; + foreach ($files as $key => $file) { + if (\is_array(\current($file))) { + $upload_files[$key] = $this->parseFiles($file); + } else { + $upload_files[$key] = $this->parseFile($file); + } + } + return $upload_files; + } + + /** + * @return string + */ + public function getRemoteIp() + { + return App::connection()->getRemoteIp(); + } + + /** + * @return int + */ + public function getRemotePort() + { + return App::connection()->getRemotePort(); + } + + /** + * @return string + */ + public function getLocalIp() + { + return App::connection()->getLocalIp(); + } + + /** + * @return int + */ + public function getLocalPort() + { + return App::connection()->getLocalPort(); + } + + /** + * @param bool $safe_mode + * @return string + */ + public function getRealIp(bool $safe_mode = true) + { + $remote_ip = $this->getRemoteIp(); + if ($safe_mode && !static::isIntranetIp($remote_ip)) { + return $remote_ip; + } + return $this->header('x-real-ip', $this->header('x-forwarded-for', + $this->header('client-ip', $this->header('x-client-ip', + $this->header('via', $remote_ip))))); + } + + /** + * @return string + */ + public function url() + { + return '//' . $this->host() . $this->path(); + } + + /** + * @return string + */ + public function fullUrl() + { + return '//' . $this->host() . $this->uri(); + } + + /** + * @return bool + */ + public function isAjax() + { + return $this->header('X-Requested-With') === 'XMLHttpRequest'; + } + + /** + * @return bool + */ + public function isPjax() + { + return (bool)$this->header('X-PJAX'); + } + + /** + * @return bool + */ + public function expectsJson() + { + return ($this->isAjax() && !$this->isPjax()) || $this->acceptJson(); + } + + /** + * @return bool + */ + public function acceptJson() + { + return false !== \strpos($this->header('accept', ''), 'json'); + } + + /** + * @param string $ip + * @return bool + */ + public static function isIntranetIp(string $ip) + { + // Not validate ip . + if (!\filter_var($ip, \FILTER_VALIDATE_IP)) { + return false; + } + // Is intranet ip ? For IPv4, the result of false may not be accurate, so we need to check it manually later . + if (!\filter_var($ip, \FILTER_VALIDATE_IP, \FILTER_FLAG_NO_PRIV_RANGE | \FILTER_FLAG_NO_RES_RANGE)) { + return true; + } + // Manual check only for IPv4 . + if (!\filter_var($ip, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) { + return false; + } + // Manual check . + $reserved_ips = [ + 1681915904 => 1686110207, // 100.64.0.0 - 100.127.255.255 + 3221225472 => 3221225727, // 192.0.0.0 - 192.0.0.255 + 3221225984 => 3221226239, // 192.0.2.0 - 192.0.2.255 + 3227017984 => 3227018239, // 192.88.99.0 - 192.88.99.255 + 3323068416 => 3323199487, // 198.18.0.0 - 198.19.255.255 + 3325256704 => 3325256959, // 198.51.100.0 - 198.51.100.255 + 3405803776 => 3405804031, // 203.0.113.0 - 203.0.113.255 + 3758096384 => 4026531839, // 224.0.0.0 - 239.255.255.255 + ]; + $ip_long = \ip2long($ip); + foreach ($reserved_ips as $ip_start => $ip_end) { + if (($ip_long >= $ip_start) && ($ip_long <= $ip_end)) { + return true; + } + } + return false; + } + +} diff --git a/vendor/workerman/webman-framework/src/Http/Response.php b/vendor/workerman/webman-framework/src/Http/Response.php new file mode 100644 index 0000000..78efc18 --- /dev/null +++ b/vendor/workerman/webman-framework/src/Http/Response.php @@ -0,0 +1,81 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman\Http; + +use Webman\App; +use Throwable; + +/** + * Class Response + * @package Webman\Http + */ +class Response extends \Workerman\Protocols\Http\Response +{ + /** + * @var Throwable + */ + protected $_exception = null; + + /** + * @param string $file + * @return $this + */ + public function file(string $file) + { + if ($this->notModifiedSince($file)) { + return $this->withStatus(304); + } + return $this->withFile($file); + } + + /** + * @param string $file + * @param string $download_name + * @return $this + */ + public function download(string $file, string $download_name = '') + { + $this->withFile($file); + if ($download_name) { + $this->header('Content-Disposition', "attachment; filename=\"$download_name\""); + } + return $this; + } + + /** + * @param string $file + * @return bool + */ + protected function notModifiedSince(string $file) + { + $if_modified_since = App::request()->header('if-modified-since'); + if ($if_modified_since === null || !($mtime = \filemtime($file))) { + return false; + } + return $if_modified_since === \gmdate('D, d M Y H:i:s', $mtime) . ' GMT'; + } + + /** + * @param Throwable $exception + * @return Throwable + */ + public function exception($exception = null) + { + if ($exception) { + $this->_exception = $exception; + } + return $this->_exception; + } +} diff --git a/vendor/workerman/webman-framework/src/Http/UploadFile.php b/vendor/workerman/webman-framework/src/Http/UploadFile.php new file mode 100644 index 0000000..14097e7 --- /dev/null +++ b/vendor/workerman/webman-framework/src/Http/UploadFile.php @@ -0,0 +1,104 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman\Http; + +use Webman\File; + +/** + * Class UploadFile + * @package Webman\Http + */ +class UploadFile extends File +{ + /** + * @var string + */ + protected $_uploadName = null; + + /** + * @var string + */ + protected $_uploadMimeType = null; + + /** + * @var int + */ + protected $_uploadErrorCode = null; + + /** + * UploadFile constructor. + * + * @param string $file_name + * @param string $upload_name + * @param string $upload_mime_type + * @param int $upload_error_code + */ + public function __construct(string $file_name, string $upload_name, string $upload_mime_type, int $upload_error_code) + { + $this->_uploadName = $upload_name; + $this->_uploadMimeType = $upload_mime_type; + $this->_uploadErrorCode = $upload_error_code; + parent::__construct($file_name); + } + + /** + * @return string + */ + public function getUploadName() + { + return $this->_uploadName; + } + + /** + * @return string + */ + public function getUploadMimeType() + { + return $this->_uploadMimeType; + } + + /** + * @return mixed + */ + public function getUploadExtension() + { + return \pathinfo($this->_uploadName, PATHINFO_EXTENSION); + } + + /** + * @return int + */ + public function getUploadErrorCode() + { + return $this->_uploadErrorCode; + } + + /** + * @return bool + */ + public function isValid() + { + return $this->_uploadErrorCode === UPLOAD_ERR_OK; + } + + /** + * @deprecated + * @return string + */ + public function getUploadMineType() + { + return $this->_uploadMimeType; + } +} diff --git a/vendor/workerman/webman-framework/src/Install.php b/vendor/workerman/webman-framework/src/Install.php new file mode 100644 index 0000000..0ae9914 --- /dev/null +++ b/vendor/workerman/webman-framework/src/Install.php @@ -0,0 +1,59 @@ +<?php + +namespace Webman; + +class Install +{ + const WEBMAN_PLUGIN = true; + + /** + * @var array + */ + protected static $pathRelation = [ + 'start.php' => 'start.php', + 'windows.php' => 'windows.php', + 'support/bootstrap.php' => 'support/bootstrap.php', + 'support/helpers.php' => 'support/helpers.php', + ]; + + /** + * Install + * @return void + */ + public static function install() + { + static::installByRelation(); + } + + /** + * Uninstall + * @return void + */ + public static function uninstall() + { + + } + + /** + * installByRelation + * @return void + */ + public static function installByRelation() + { + foreach (static::$pathRelation as $source => $dest) { + if ($pos = strrpos($dest, '/')) { + $parent_dir = base_path() . '/' . substr($dest, 0, $pos); + if (!is_dir($parent_dir)) { + mkdir($parent_dir, 0777, true); + } + } + $source_file = __DIR__ . "/$source"; + copy_dir($source_file, base_path() . "/$dest", true); + echo "Create $dest\r\n"; + if (is_file($source_file)) { + @unlink($source_file); + } + } + } + +} diff --git a/vendor/workerman/webman-framework/src/Middleware.php b/vendor/workerman/webman-framework/src/Middleware.php new file mode 100644 index 0000000..55153ab --- /dev/null +++ b/vendor/workerman/webman-framework/src/Middleware.php @@ -0,0 +1,74 @@ +<?php + +namespace Webman; + +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +class Middleware +{ + + /** + * @var array + */ + protected static $_instances = []; + + /** + * @param array $all_middlewares + * @param string $plugin + * @return void + */ + public static function load($all_middlewares, string $plugin = '') + { + if (!\is_array($all_middlewares)) { + return; + } + foreach ($all_middlewares as $app_name => $middlewares) { + if (!\is_array($middlewares)) { + throw new \RuntimeException('Bad middleware config'); + } + foreach ($middlewares as $class_name) { + if (\method_exists($class_name, 'process')) { + static::$_instances[$plugin][$app_name][] = [$class_name, 'process']; + } else { + // @todo Log + echo "middleware $class_name::process not exsits\n"; + } + } + } + } + + /** + * @param string $plugin + * @param string $app_name + * @param bool $with_global_middleware + * @return array|mixed + */ + public static function getMiddleware(string $plugin, string $app_name, bool $with_global_middleware = true) + { + $global_middleware = $with_global_middleware && isset(static::$_instances[$plugin]['']) ? static::$_instances[$plugin][''] : []; + if ($app_name === '') { + return \array_reverse($global_middleware); + } + $app_middleware = static::$_instances[$plugin][$app_name] ?? []; + return \array_reverse(\array_merge($global_middleware, $app_middleware)); + } + + /** + * @deprecated + * @return void + */ + public static function container($_) + { + + } +} diff --git a/vendor/workerman/webman-framework/src/MiddlewareInterface.php b/vendor/workerman/webman-framework/src/MiddlewareInterface.php new file mode 100644 index 0000000..47c6d51 --- /dev/null +++ b/vendor/workerman/webman-framework/src/MiddlewareInterface.php @@ -0,0 +1,30 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman; + +use Webman\Http\Request; +use Webman\Http\Response; + +interface MiddlewareInterface +{ + /** + * Process an incoming server request. + * + * Processes an incoming server request in order to produce a response. + * If unable to produce the response itself, it may delegate to the provided + * request handler to do so. + */ + public function process(Request $request, callable $handler): Response; +} diff --git a/vendor/workerman/webman-framework/src/Route.php b/vendor/workerman/webman-framework/src/Route.php new file mode 100644 index 0000000..d130dc4 --- /dev/null +++ b/vendor/workerman/webman-framework/src/Route.php @@ -0,0 +1,419 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman; + +use FastRoute\Dispatcher\GroupCountBased; +use FastRoute\RouteCollector; +use Webman\Route\Route as RouteObject; +use function FastRoute\simpleDispatcher; + +/** + * Class Route + * @package Webman + */ +class Route +{ + /** + * @var Route + */ + protected static $_instance = null; + + /** + * @var GroupCountBased + */ + protected static $_dispatcher = null; + + /** + * @var RouteCollector + */ + protected static $_collector = null; + + /** + * @var null|callable + */ + protected static $_fallback = []; + + /** + * @var array + */ + protected static $_nameList = []; + + /** + * @var string + */ + protected static $_groupPrefix = ''; + + /** + * @var bool + */ + protected static $_disableDefaultRoute = []; + + /** + * @var RouteObject[] + */ + protected static $_allRoutes = []; + + /** + * @var RouteObject[] + */ + protected $_routes = []; + + /** + * @param string $path + * @param callable $callback + * @return RouteObject + */ + public static function get(string $path, $callback) + { + return static::addRoute('GET', $path, $callback); + } + + /** + * @param string $path + * @param callable $callback + * @return RouteObject + */ + public static function post(string $path, $callback) + { + return static::addRoute('POST', $path, $callback); + } + + /** + * @param string $path + * @param callable $callback + * @return RouteObject + */ + public static function put(string $path, $callback) + { + return static::addRoute('PUT', $path, $callback); + } + + /** + * @param string $path + * @param callable $callback + * @return RouteObject + */ + public static function patch(string $path, $callback) + { + return static::addRoute('PATCH', $path, $callback); + } + + /** + * @param string $path + * @param callable $callback + * @return RouteObject + */ + public static function delete(string $path, $callback) + { + return static::addRoute('DELETE', $path, $callback); + } + + /** + * @param string $path + * @param callable $callback + * @return RouteObject + */ + public static function head(string $path, $callback) + { + return static::addRoute('HEAD', $path, $callback); + } + + /** + * @param string $path + * @param callable $callback + * @return RouteObject + */ + public static function options(string $path, $callback) + { + return static::addRoute('OPTIONS', $path, $callback); + } + + /** + * @param string $path + * @param callable $callback + * @return RouteObject + */ + public static function any(string $path, $callback) + { + return static::addRoute(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'], $path, $callback); + } + + /** + * @param $method + * @param string $path + * @param callable $callback + * @return RouteObject + */ + public static function add($method, string $path, $callback) + { + return static::addRoute($method, $path, $callback); + } + + /** + * @param string|callable $path + * @param callable|null $callback + * @return static + */ + public static function group($path, callable $callback = null) + { + if ($callback === null) { + $callback = $path; + $path = ''; + } + $previous_group_prefix = static::$_groupPrefix; + static::$_groupPrefix = $previous_group_prefix . $path; + $instance = static::$_instance = new static; + static::$_collector->addGroup($path, $callback); + static::$_instance = null; + static::$_groupPrefix = $previous_group_prefix; + return $instance; + } + + /** + * @param string $name + * @param string $controller + * @param array $options + * @return void + */ + public static function resource(string $name, string $controller, array $options = []) + { + $name = trim($name, '/'); + if (\is_array($options) && !empty($options)) { + $diff_options = \array_diff($options, ['index', 'create', 'store', 'update', 'show', 'edit', 'destroy', 'recovery']); + if (!empty($diff_options)) { + foreach ($diff_options as $action) { + static::any("/{$name}/{$action}[/{id}]", [$controller, $action])->name("{$name}.{$action}"); + } + } + // 注册路由 由于顺序不同会导致路由无效 因此不适用循环注册 + if (\in_array('index', $options)) static::get("/{$name}", [$controller, 'index'])->name("{$name}.index"); + if (\in_array('create', $options)) static::get("/{$name}/create", [$controller, 'create'])->name("{$name}.create"); + if (\in_array('store', $options)) static::post("/{$name}", [$controller, 'store'])->name("{$name}.store"); + if (\in_array('update', $options)) static::put("/{$name}/{id}", [$controller, 'update'])->name("{$name}.update"); + if (\in_array('show', $options)) static::get("/{$name}/{id}", [$controller, 'show'])->name("{$name}.show"); + if (\in_array('edit', $options)) static::get("/{$name}/{id}/edit", [$controller, 'edit'])->name("{$name}.edit"); + if (\in_array('destroy', $options)) static::delete("/{$name}/{id}", [$controller, 'destroy'])->name("{$name}.destroy"); + if (\in_array('recovery', $options)) static::put("/{$name}/{id}/recovery", [$controller, 'recovery'])->name("{$name}.recovery"); + } else { + //为空时自动注册所有常用路由 + if (\method_exists($controller, 'index')) static::get("/{$name}", [$controller, 'index'])->name("{$name}.index"); + if (\method_exists($controller, 'create')) static::get("/{$name}/create", [$controller, 'create'])->name("{$name}.create"); + if (\method_exists($controller, 'store')) static::post("/{$name}", [$controller, 'store'])->name("{$name}.store"); + if (\method_exists($controller, 'update')) static::put("/{$name}/{id}", [$controller, 'update'])->name("{$name}.update"); + if (\method_exists($controller, 'show')) static::get("/{$name}/{id}", [$controller, 'show'])->name("{$name}.show"); + if (\method_exists($controller, 'edit')) static::get("/{$name}/{id}/edit", [$controller, 'edit'])->name("{$name}.edit"); + if (\method_exists($controller, 'destroy')) static::delete("/{$name}/{id}", [$controller, 'destroy'])->name("{$name}.destroy"); + if (\method_exists($controller, 'recovery')) static::put("/{$name}/{id}/recovery", [$controller, 'recovery'])->name("{$name}.recovery"); + } + } + + /** + * @return RouteObject[] + */ + public static function getRoutes() + { + return static::$_allRoutes; + } + + /** + * disableDefaultRoute. + * + * @return void + */ + public static function disableDefaultRoute($plugin = '') + { + static::$_disableDefaultRoute[$plugin] = true; + } + + /** + * @return bool + */ + public static function hasDisableDefaultRoute($plugin = '') + { + return static::$_disableDefaultRoute[$plugin] ?? false; + } + + /** + * @param $middleware + * @return $this + */ + public function middleware($middleware) + { + foreach ($this->_routes as $route) { + $route->middleware($middleware); + } + } + + /** + * @param RouteObject $route + */ + public function collect(RouteObject $route) + { + $this->_routes[] = $route; + } + + /** + * @param $name + * @param RouteObject $instance + */ + public static function setByName(string $name, RouteObject $instance) + { + static::$_nameList[$name] = $instance; + } + + /** + * @param $name + * @return null|RouteObject + */ + public static function getByName(string $name) + { + return static::$_nameList[$name] ?? null; + } + + + /** + * @param string $method + * @param string $path + * @return array + */ + public static function dispatch($method, string $path) + { + return static::$_dispatcher->dispatch($method, $path); + } + + /** + * @param string $path + * @param callable $callback + * @return callable|false|string[] + */ + public static function convertToCallable(string $path, $callback) + { + if (\is_string($callback) && \strpos($callback, '@')) { + $callback = \explode('@', $callback, 2); + } + + if (!\is_array($callback)) { + if (!\is_callable($callback)) { + $call_str = \is_scalar($callback) ? $callback : 'Closure'; + echo "Route $path $call_str is not callable\n"; + return false; + } + } else { + $callback = \array_values($callback); + if (!isset($callback[1]) || !\class_exists($callback[0]) || !\method_exists($callback[0], $callback[1])) { + echo "Route $path " . \json_encode($callback) . " is not callable\n"; + return false; + } + } + + return $callback; + } + + /** + * @param array $methods + * @param string $path + * @param callable $callback + * @return RouteObject + */ + protected static function addRoute($methods, string $path, $callback) + { + $route = new RouteObject($methods, static::$_groupPrefix . $path, $callback); + static::$_allRoutes[] = $route; + + if ($callback = static::convertToCallable($path, $callback)) { + static::$_collector->addRoute($methods, $path, ['callback' => $callback, 'route' => $route]); + } + if (static::$_instance) { + static::$_instance->collect($route); + } + return $route; + } + + /** + * @param array $paths + * @return void + */ + public static function load($paths) + { + if (!\is_array($paths)) { + return; + } + static::$_dispatcher = simpleDispatcher(function (RouteCollector $route) use ($paths) { + Route::setCollector($route); + foreach ($paths as $config_path) { + $route_config_file = $config_path . '/route.php'; + if (\is_file($route_config_file)) { + require_once $route_config_file; + } + if (!is_dir($plugin_config_path = $config_path . '/plugin')) { + continue; + } + $dir_iterator = new \RecursiveDirectoryIterator($plugin_config_path, \FilesystemIterator::FOLLOW_SYMLINKS); + $iterator = new \RecursiveIteratorIterator($dir_iterator); + foreach ($iterator as $file) { + if ($file->getBaseName('.php') !== 'route') { + continue; + } + $app_config_file = pathinfo($file, PATHINFO_DIRNAME) . '/app.php'; + if (!is_file($app_config_file)) { + continue; + } + $app_config = include $app_config_file; + if (empty($app_config['enable'])) { + continue; + } + require_once $file; + } + } + }); + } + + /** + * @param RouteCollector $route + * @return void + */ + public static function setCollector(RouteCollector $route) + { + static::$_collector = $route; + } + + /** + * @param callable $callback + * @param string $plugin + * @return void + */ + public static function fallback(callable $callback, string $plugin = '') + { + static::$_fallback[$plugin] = $callback; + } + + /** + * @return callable|null + */ + public static function getFallback(string $plugin = '') + { + return static::$_fallback[$plugin] ?? null; + } + + /** + * @deprecated + * @return void + */ + public static function container() + { + + } + +} diff --git a/vendor/workerman/webman-framework/src/Route/Route.php b/vendor/workerman/webman-framework/src/Route/Route.php new file mode 100644 index 0000000..83cdbbd --- /dev/null +++ b/vendor/workerman/webman-framework/src/Route/Route.php @@ -0,0 +1,188 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman\Route; + +use FastRoute\Dispatcher\GroupCountBased; +use FastRoute\RouteCollector; +use Webman\Route as Router; + +/** + * Class Route + * @package Webman + */ +class Route +{ + /** + * @var string|null + */ + protected $_name = null; + + /** + * @var array + */ + protected $_methods = []; + + /** + * @var string + */ + protected $_path = ''; + + /** + * @var callable + */ + protected $_callback = null; + + /** + * @var array + */ + protected $_middlewares = []; + + /** + * @var array + */ + protected $_params = []; + + /** + * Route constructor. + * + * @param array $methods + * @param string $path + * @param callable $callback + */ + public function __construct($methods, string $path, $callback) + { + $this->_methods = (array)$methods; + $this->_path = $path; + $this->_callback = $callback; + } + + /** + * @return mixed|null + */ + public function getName() + { + return $this->_name ?? null; + } + + /** + * @param string $name + * @return $this + */ + public function name(string $name) + { + $this->_name = $name; + Router::setByName($name, $this); + return $this; + } + + /** + * @param mixed $middleware + * @return $this|array + */ + public function middleware($middleware = null) + { + if ($middleware === null) { + return $this->_middlewares; + } + $this->_middlewares = \array_merge($this->_middlewares, is_array($middleware) ? $middleware : [$middleware]); + return $this; + } + + /** + * @return string + */ + public function getPath() + { + return $this->_path; + } + + /** + * @return array + */ + public function getMethods() + { + return $this->_methods; + } + + /** + * @return callable + */ + public function getCallback() + { + return $this->_callback; + } + + /** + * @return array + */ + public function getMiddleware() + { + return $this->_middlewares; + } + + /** + * @param string|null $name + * @param $default + * @return array|mixed|null + */ + public function param(string $name = null, $default = null) + { + if ($name === null) { + return $this->_params; + } + return $this->_params[$name] ?? $default; + } + + /** + * @param array $params + * @return $this + */ + public function setParams(array $params) + { + $this->_params = \array_merge($this->_params, $params); + return $this; + } + + /** + * @param $parameters + * @return string + */ + public function url($parameters = []) + { + if (empty($parameters)) { + return $this->_path; + } + $path = \str_replace(['[', ']'], '', $this->_path); + $path = \preg_replace_callback('/\{(.*?)(?:\:[^\}]*?)*?\}/', function ($matches) use (&$parameters) { + if (!$parameters) { + return $matches[0]; + } + if (isset($parameters[$matches[1]])) { + $value = $parameters[$matches[1]]; + unset($parameters[$matches[1]]); + return $value; + } + $key = key($parameters); + if (is_int($key)) { + $value = $parameters[$key]; + unset($parameters[$key]); + return $value; + } + return $matches[0]; + }, $path); + return \count($parameters) > 0 ? $path . '?' . http_build_query($parameters) : $path; + } + +} diff --git a/vendor/workerman/webman-framework/src/Session/FileSessionHandler.php b/vendor/workerman/webman-framework/src/Session/FileSessionHandler.php new file mode 100644 index 0000000..c6d7d7b --- /dev/null +++ b/vendor/workerman/webman-framework/src/Session/FileSessionHandler.php @@ -0,0 +1,28 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman\Session; + +use FastRoute\Dispatcher\GroupCountBased; +use FastRoute\RouteCollector; +use Workerman\Protocols\Http\Session\FileSessionHandler as FileHandler; + +/** + * Class FileSessionHandler + * @package Webman + */ +class FileSessionHandler extends FileHandler +{ + +} diff --git a/vendor/workerman/webman-framework/src/Session/RedisClusterSessionHandler.php b/vendor/workerman/webman-framework/src/Session/RedisClusterSessionHandler.php new file mode 100644 index 0000000..c00efae --- /dev/null +++ b/vendor/workerman/webman-framework/src/Session/RedisClusterSessionHandler.php @@ -0,0 +1,22 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman\Session; + +use Workerman\Protocols\Http\Session\RedisClusterSessionHandler as RedisClusterHandler; + +class RedisClusterSessionHandler extends RedisClusterHandler +{ + +} diff --git a/vendor/workerman/webman-framework/src/Session/RedisSessionHandler.php b/vendor/workerman/webman-framework/src/Session/RedisSessionHandler.php new file mode 100644 index 0000000..57d79a1 --- /dev/null +++ b/vendor/workerman/webman-framework/src/Session/RedisSessionHandler.php @@ -0,0 +1,28 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman\Session; + +use FastRoute\Dispatcher\GroupCountBased; +use FastRoute\RouteCollector; +use Workerman\Protocols\Http\Session\RedisSessionHandler as RedisHandler; + +/** + * Class FileSessionHandler + * @package Webman + */ +class RedisSessionHandler extends RedisHandler +{ + +} diff --git a/vendor/workerman/webman-framework/src/Util.php b/vendor/workerman/webman-framework/src/Util.php new file mode 100644 index 0000000..3d96445 --- /dev/null +++ b/vendor/workerman/webman-framework/src/Util.php @@ -0,0 +1,38 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman; + +/** + * Class Util + * @package Webman + */ +class Util +{ + /** + * @param string $path + * @return array + */ + public static function scanDir(string $base_path, $with_base_path = true): array + { + if (!is_dir($base_path)) { + return []; + } + $paths = \array_diff(\scandir($base_path), array('.', '..')) ?: []; + return $with_base_path ? \array_map(function($path) use ($base_path) { + return $base_path . DIRECTORY_SEPARATOR . $path; + }, $paths) : $paths; + } + +} diff --git a/vendor/workerman/webman-framework/src/View.php b/vendor/workerman/webman-framework/src/View.php new file mode 100644 index 0000000..a3a3c80 --- /dev/null +++ b/vendor/workerman/webman-framework/src/View.php @@ -0,0 +1,26 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Webman; + +interface View +{ + /** + * @param $template + * @param $vars + * @param null $app + * @return string + */ + static function render(string $template, array $vars, string $app = null); +} diff --git a/vendor/workerman/webman-framework/src/support/App.php b/vendor/workerman/webman-framework/src/support/App.php new file mode 100644 index 0000000..3320284 --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/App.php @@ -0,0 +1,143 @@ +<?php + +namespace support; + +use Dotenv\Dotenv; +use Webman\Config; +use Webman\Util; +use Workerman\Connection\TcpConnection; +use Workerman\Protocols\Http; +use Workerman\Worker; + +class App +{ + /** + * @return void + */ + public static function run() + { + ini_set('display_errors', 'on'); + error_reporting(E_ALL); + + if (class_exists(Dotenv::class) && file_exists(run_path('.env'))) { + if (method_exists(Dotenv::class, 'createUnsafeImmutable')) { + Dotenv::createUnsafeImmutable(run_path())->load(); + } else { + Dotenv::createMutable(run_path())->load(); + } + } + + static::loadAllConfig(['route', 'container']); + + $error_reporting = config('app.error_reporting'); + if (isset($error_reporting)) { + error_reporting($error_reporting); + } + if ($timezone = config('app.default_timezone')) { + date_default_timezone_set($timezone); + } + + $runtime_logs_path = runtime_path() . DIRECTORY_SEPARATOR . 'logs'; + if (!file_exists($runtime_logs_path) || !is_dir($runtime_logs_path)) { + if (!mkdir($runtime_logs_path, 0777, true)) { + throw new \RuntimeException("Failed to create runtime logs directory. Please check the permission."); + } + } + + $runtime_views_path = runtime_path() . DIRECTORY_SEPARATOR . 'views'; + if (!file_exists($runtime_views_path) || !is_dir($runtime_views_path)) { + if (!mkdir($runtime_views_path, 0777, true)) { + throw new \RuntimeException("Failed to create runtime views directory. Please check the permission."); + } + } + + Worker::$onMasterReload = function () { + if (function_exists('opcache_get_status')) { + if ($status = \opcache_get_status()) { + if (isset($status['scripts']) && $scripts = $status['scripts']) { + foreach (array_keys($scripts) as $file) { + \opcache_invalidate($file, true); + } + } + } + } + }; + + $config = config('server'); + Worker::$pidFile = $config['pid_file']; + Worker::$stdoutFile = $config['stdout_file']; + Worker::$logFile = $config['log_file']; + Worker::$eventLoopClass = $config['event_loop'] ?? ''; + TcpConnection::$defaultMaxPackageSize = $config['max_package_size'] ?? 10 * 1024 * 1024; + if (property_exists(Worker::class, 'statusFile')) { + Worker::$statusFile = $config['status_file'] ?? ''; + } + if (property_exists(Worker::class, 'stopTimeout')) { + Worker::$stopTimeout = $config['stop_timeout'] ?? 2; + } + + if ($config['listen']) { + $worker = new Worker($config['listen'], $config['context']); + $property_map = [ + 'name', + 'count', + 'user', + 'group', + 'reusePort', + 'transport', + 'protocol' + ]; + foreach ($property_map as $property) { + if (isset($config[$property])) { + $worker->$property = $config[$property]; + } + } + + $worker->onWorkerStart = function ($worker) { + require_once \base_path() . '/support/bootstrap.php'; + $app = new \Webman\App(config('app.request_class', Request::class), Log::channel('default'), app_path(), public_path()); + $worker->onMessage = [$app, 'onMessage']; + \call_user_func([$app, 'onWorkerStart'], $worker); + }; + } + + // Windows does not support custom processes. + if (\DIRECTORY_SEPARATOR === '/') { + foreach (config('process', []) as $process_name => $config) { + worker_start($process_name, $config); + } + foreach (config('plugin', []) as $firm => $projects) { + foreach ($projects as $name => $project) { + if (!is_array($project)) { + continue; + } + foreach ($project['process'] ?? [] as $process_name => $config) { + worker_start("plugin.$firm.$name.$process_name", $config); + } + } + foreach ($projects['process'] ?? [] as $process_name => $config) { + worker_start("plugin.$firm.$process_name", $config); + } + } + } + + Worker::runAll(); + } + + /** + * @param array $excludes + * @return void + */ + public static function loadAllConfig(array $excludes = []) + { + Config::load(config_path(), $excludes); + $directory = base_path() . '/plugin'; + foreach (Util::scanDir($directory, false) as $name) { + $dir = "$directory/$name/config"; + if (\is_dir($dir)) { + Config::load($dir, $excludes, "plugin.$name"); + } + } + } + +} diff --git a/vendor/workerman/webman-framework/src/support/Cache.php b/vendor/workerman/webman-framework/src/support/Cache.php new file mode 100644 index 0000000..c210cfd --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/Cache.php @@ -0,0 +1,50 @@ +<?php + +namespace support; + +use Symfony\Component\Cache\Adapter\RedisAdapter; +use Symfony\Component\Cache\Psr16Cache; + +/** + * Class Cache + * @package support\bootstrap + * + * Strings methods + * @method static mixed get($key, $default = null) + * @method static bool set($key, $value, $ttl = null) + * @method static bool delete($key) + * @method static bool clear() + * @method static iterable getMultiple($keys, $default = null) + * @method static bool setMultiple($values, $ttl = null) + * @method static bool deleteMultiple($keys) + * @method static bool has($key) + */ +class Cache +{ + /** + * @var Psr16Cache + */ + public static $_instance = null; + + /** + * @return Psr16Cache + */ + public static function instance() + { + if (!static::$_instance) { + $adapter = new RedisAdapter(Redis::connection()->client()); + self::$_instance = new Psr16Cache($adapter); + } + return static::$_instance; + } + + /** + * @param $name + * @param $arguments + * @return mixed + */ + public static function __callStatic($name, $arguments) + { + return static::instance()->{$name}(... $arguments); + } +} diff --git a/vendor/workerman/webman-framework/src/support/Container.php b/vendor/workerman/webman-framework/src/support/Container.php new file mode 100644 index 0000000..94a053b --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/Container.php @@ -0,0 +1,47 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support; + +use Psr\Container\ContainerInterface; +use Webman\Config; + +/** + * Class Container + * @package support + * @method static mixed get($name) + * @method static mixed make($name, array $parameters) + * @method static bool has($name) + */ +class Container +{ + /** + * @return ContainerInterface + */ + public static function instance(string $plugin = '') + { + return Config::get($plugin ? "plugin.$plugin.container" : 'container'); + } + + /** + * @param string $name + * @param array $arguments + * @return mixed + */ + public static function __callStatic(string $name, array $arguments) + { + $plugin = \Webman\App::getPluginByClass($name); + return static::instance($plugin)->{$name}(... $arguments); + } +} diff --git a/vendor/workerman/webman-framework/src/support/Db.php b/vendor/workerman/webman-framework/src/support/Db.php new file mode 100644 index 0000000..16e1ed1 --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/Db.php @@ -0,0 +1,35 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support; + +use Illuminate\Database\Capsule\Manager; + +/** + * Class Db + * @package support + * @method static array select(string $query, $bindings = [], $useReadPdo = true) + * @method static int insert(string $query, $bindings = []) + * @method static int update(string $query, $bindings = []) + * @method static int delete(string $query, $bindings = []) + * @method static bool statement(string $query, $bindings = []) + * @method static mixed transaction(\Closure $callback, $attempts = 1) + * @method static void beginTransaction() + * @method static void rollBack($toLevel = null) + * @method static void commit() + */ +class Db extends Manager +{ + +} \ No newline at end of file diff --git a/vendor/workerman/webman-framework/src/support/Log.php b/vendor/workerman/webman-framework/src/support/Log.php new file mode 100644 index 0000000..2ba090e --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/Log.php @@ -0,0 +1,132 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support; + +use Monolog\Formatter\FormatterInterface; +use Monolog\Handler\FormattableHandlerInterface; +use Monolog\Handler\HandlerInterface; +use Monolog\Logger; + +/** + * Class Log + * @package support + * + * @method static void log($level, $message, array $context = []) + * @method static void debug($message, array $context = []) + * @method static void info($message, array $context = []) + * @method static void notice($message, array $context = []) + * @method static void warning($message, array $context = []) + * @method static void error($message, array $context = []) + * @method static void critical($message, array $context = []) + * @method static void alert($message, array $context = []) + * @method static void emergency($message, array $context = []) + */ +class Log +{ + /** + * @var array + */ + protected static $_instance = []; + + /** + * @param string $name + * @return Logger + */ + public static function channel(string $name = 'default') + { + if (!isset(static::$_instance[$name])) { + $config = \config('log', [])[$name]; + $handlers = self::handlers($config); + $processors = self::processors($config); + static::$_instance[$name] = new Logger($name, $handlers, $processors); + } + return static::$_instance[$name]; + } + + /** + * @param array $config + * @return array + */ + protected static function handlers(array $config): array + { + $handlerConfigs = $config['handlers'] ?? [[]]; + $handlers = []; + foreach ($handlerConfigs as $value) { + $class = $value['class'] ?? []; + $constructor = $value['constructor'] ?? []; + + $formatterConfig = $value['formatter'] ?? []; + + $class && $handlers[] = self::handler($class, $constructor, $formatterConfig); + } + + return $handlers; + } + + /** + * @param string $class + * @param array $constructor + * @param array $formatterConfig + * @return HandlerInterface + */ + protected static function handler(string $class, array $constructor, array $formatterConfig): HandlerInterface + { + /** @var HandlerInterface $handler */ + $handler = new $class(... \array_values($constructor)); + + if ($handler instanceof FormattableHandlerInterface && $formatterConfig) { + $formatterClass = $formatterConfig['class']; + $formatterConstructor = $formatterConfig['constructor']; + + /** @var FormatterInterface $formatter */ + $formatter = new $formatterClass(... \array_values($formatterConstructor)); + + $handler->setFormatter($formatter); + } + + return $handler; + } + + /** + * @param array $config + * @return array + */ + protected static function processors(array $config): array + { + $result = []; + if (!isset($config['processors']) && isset($config['processor'])) { + $config['processors'] = [$config['processor']]; + } + + foreach ($config['processors'] ?? [] as $value) { + if (\is_array($value) && isset($value['class'])) { + $value = new $value['class'](... \array_values($value['constructor'] ?? []));; + } + $result[] = $value; + } + + return $result; + } + + /** + * @param string $name + * @param array $arguments + * @return mixed + */ + public static function __callStatic(string $name, array $arguments) + { + return static::channel('default')->{$name}(... $arguments); + } +} diff --git a/vendor/workerman/webman-framework/src/support/Model.php b/vendor/workerman/webman-framework/src/support/Model.php new file mode 100644 index 0000000..1485242 --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/Model.php @@ -0,0 +1,252 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support; + +use Illuminate\Database\Eloquent\Model as BaseModel; + +/** + * @method static \Illuminate\Database\Eloquent\Model make($attributes = []) + * @method static \Illuminate\Database\Eloquent\Builder withGlobalScope($identifier, $scope) + * @method static \Illuminate\Database\Eloquent\Builder withoutGlobalScope($scope) + * @method static \Illuminate\Database\Eloquent\Builder withoutGlobalScopes($scopes = null) + * @method static array removedScopes() + * @method static \Illuminate\Database\Eloquent\Builder whereKey($id) + * @method static \Illuminate\Database\Eloquent\Builder whereKeyNot($id) + * @method static \Illuminate\Database\Eloquent\Builder where($column, $operator = null, $value = null, $boolean = 'and') + * @method static \Illuminate\Database\Eloquent\Model|null firstWhere($column, $operator = null, $value = null, $boolean = 'and') + * @method static \Illuminate\Database\Eloquent\Builder orWhere($column, $operator = null, $value = null) + * @method static \Illuminate\Database\Eloquent\Builder latest($column = null) + * @method static \Illuminate\Database\Eloquent\Builder oldest($column = null) + * @method static \Illuminate\Database\Eloquent\Collection hydrate($items) + * @method static \Illuminate\Database\Eloquent\Collection fromQuery($query, $bindings = []) + * @method static \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|static[]|static|null find($id, $columns = []) + * @method static \Illuminate\Database\Eloquent\Collection findMany($ids, $columns = []) + * @method static \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|static|static[] findOrFail($id, $columns = []) + * @method static \Illuminate\Database\Eloquent\Model|static findOrNew($id, $columns = []) + * @method static \Illuminate\Database\Eloquent\Model|static firstOrNew($attributes = [], $values = []) + * @method static \Illuminate\Database\Eloquent\Model|static firstOrCreate($attributes = [], $values = []) + * @method static \Illuminate\Database\Eloquent\Model|static updateOrCreate($attributes, $values = []) + * @method static \Illuminate\Database\Eloquent\Model|static firstOrFail($columns = []) + * @method static \Illuminate\Database\Eloquent\Model|static|mixed firstOr($columns = [], $callback = null) + * @method static \Illuminate\Database\Eloquent\Model sole($columns = []) + * @method static mixed value($column) + * @method static \Illuminate\Database\Eloquent\Collection[]|static[] get($columns = []) + * @method static \Illuminate\Database\Eloquent\Model[]|static[] getModels($columns = []) + * @method static array eagerLoadRelations($models) + * @method static \Illuminate\Support\LazyCollection cursor() + * @method static \Illuminate\Support\Collection pluck($column, $key = null) + * @method static \Illuminate\Contracts\Pagination\LengthAwarePaginator paginate($perPage = null, $columns = [], $pageName = 'page', $page = null) + * @method static \Illuminate\Contracts\Pagination\Paginator simplePaginate($perPage = null, $columns = [], $pageName = 'page', $page = null) + * @method static \Illuminate\Contracts\Pagination\CursorPaginator cursorPaginate($perPage = null, $columns = [], $cursorName = 'cursor', $cursor = null) + * @method static \Illuminate\Database\Eloquent\Model|$this create($attributes = []) + * @method static \Illuminate\Database\Eloquent\Model|$this forceCreate($attributes) + * @method static int upsert($values, $uniqueBy, $update = null) + * @method static void onDelete($callback) + * @method static static|mixed scopes($scopes) + * @method static static applyScopes() + * @method static \Illuminate\Database\Eloquent\Builder without($relations) + * @method static \Illuminate\Database\Eloquent\Builder withOnly($relations) + * @method static \Illuminate\Database\Eloquent\Model newModelInstance($attributes = []) + * @method static \Illuminate\Database\Eloquent\Builder withCasts($casts) + * @method static \Illuminate\Database\Query\Builder getQuery() + * @method static \Illuminate\Database\Eloquent\Builder setQuery($query) + * @method static \Illuminate\Database\Query\Builder toBase() + * @method static array getEagerLoads() + * @method static \Illuminate\Database\Eloquent\Builder setEagerLoads($eagerLoad) + * @method static \Illuminate\Database\Eloquent\Model getModel() + * @method static \Illuminate\Database\Eloquent\Builder setModel($model) + * @method static \Closure getMacro($name) + * @method static bool hasMacro($name) + * @method static \Closure getGlobalMacro($name) + * @method static bool hasGlobalMacro($name) + * @method static static clone() + * @method static \Illuminate\Database\Eloquent\Builder has($relation, $operator = '>=', $count = 1, $boolean = 'and', $callback = null) + * @method static \Illuminate\Database\Eloquent\Builder orHas($relation, $operator = '>=', $count = 1) + * @method static \Illuminate\Database\Eloquent\Builder doesntHave($relation, $boolean = 'and', $callback = null) + * @method static \Illuminate\Database\Eloquent\Builder orDoesntHave($relation) + * @method static \Illuminate\Database\Eloquent\Builder whereHas($relation, $callback = null, $operator = '>=', $count = 1) + * @method static \Illuminate\Database\Eloquent\Builder orWhereHas($relation, $callback = null, $operator = '>=', $count = 1) + * @method static \Illuminate\Database\Eloquent\Builder whereDoesntHave($relation, $callback = null) + * @method static \Illuminate\Database\Eloquent\Builder orWhereDoesntHave($relation, $callback = null) + * @method static \Illuminate\Database\Eloquent\Builder hasMorph($relation, $types, $operator = '>=', $count = 1, $boolean = 'and', $callback = null) + * @method static \Illuminate\Database\Eloquent\Builder orHasMorph($relation, $types, $operator = '>=', $count = 1) + * @method static \Illuminate\Database\Eloquent\Builder doesntHaveMorph($relation, $types, $boolean = 'and', $callback = null) + * @method static \Illuminate\Database\Eloquent\Builder orDoesntHaveMorph($relation, $types) + * @method static \Illuminate\Database\Eloquent\Builder whereHasMorph($relation, $types, $callback = null, $operator = '>=', $count = 1) + * @method static \Illuminate\Database\Eloquent\Builder orWhereHasMorph($relation, $types, $callback = null, $operator = '>=', $count = 1) + * @method static \Illuminate\Database\Eloquent\Builder whereDoesntHaveMorph($relation, $types, $callback = null) + * @method static \Illuminate\Database\Eloquent\Builder orWhereDoesntHaveMorph($relation, $types, $callback = null) + * @method static \Illuminate\Database\Eloquent\Builder withAggregate($relations, $column, $function = null) + * @method static \Illuminate\Database\Eloquent\Builder withCount($relations) + * @method static \Illuminate\Database\Eloquent\Builder withMax($relation, $column) + * @method static \Illuminate\Database\Eloquent\Builder withMin($relation, $column) + * @method static \Illuminate\Database\Eloquent\Builder withSum($relation, $column) + * @method static \Illuminate\Database\Eloquent\Builder withAvg($relation, $column) + * @method static \Illuminate\Database\Eloquent\Builder withExists($relation) + * @method static \Illuminate\Database\Eloquent\Builder mergeConstraintsFrom($from) + * @method static \Illuminate\Support\Collection explain() + * @method static bool chunk($count, $callback) + * @method static \Illuminate\Support\Collection chunkMap($callback, $count = 1000) + * @method static bool each($callback, $count = 1000) + * @method static bool chunkById($count, $callback, $column = null, $alias = null) + * @method static bool eachById($callback, $count = 1000, $column = null, $alias = null) + * @method static \Illuminate\Support\LazyCollection lazy($chunkSize = 1000) + * @method static \Illuminate\Support\LazyCollection lazyById($chunkSize = 1000, $column = null, $alias = null) + * @method static \Illuminate\Database\Eloquent\Model|object|static|null first($columns = []) + * @method static \Illuminate\Database\Eloquent\Model|object|null baseSole($columns = []) + * @method static \Illuminate\Database\Eloquent\Builder tap($callback) + * @method static mixed when($value, $callback, $default = null) + * @method static mixed unless($value, $callback, $default = null) + * @method static \Illuminate\Database\Query\Builder select($columns = []) + * @method static \Illuminate\Database\Query\Builder selectSub($query, $as) + * @method static \Illuminate\Database\Query\Builder selectRaw($expression, $bindings = []) + * @method static \Illuminate\Database\Query\Builder fromSub($query, $as) + * @method static \Illuminate\Database\Query\Builder fromRaw($expression, $bindings = []) + * @method static \Illuminate\Database\Query\Builder addSelect($column) + * @method static \Illuminate\Database\Query\Builder distinct() + * @method static \Illuminate\Database\Query\Builder from($table, $as = null) + * @method static \Illuminate\Database\Query\Builder join($table, $first, $operator = null, $second = null, $type = 'inner', $where = false) + * @method static \Illuminate\Database\Query\Builder joinWhere($table, $first, $operator, $second, $type = 'inner') + * @method static \Illuminate\Database\Query\Builder joinSub($query, $as, $first, $operator = null, $second = null, $type = 'inner', $where = false) + * @method static \Illuminate\Database\Query\Builder leftJoin($table, $first, $operator = null, $second = null) + * @method static \Illuminate\Database\Query\Builder leftJoinWhere($table, $first, $operator, $second) + * @method static \Illuminate\Database\Query\Builder leftJoinSub($query, $as, $first, $operator = null, $second = null) + * @method static \Illuminate\Database\Query\Builder rightJoin($table, $first, $operator = null, $second = null) + * @method static \Illuminate\Database\Query\Builder rightJoinWhere($table, $first, $operator, $second) + * @method static \Illuminate\Database\Query\Builder rightJoinSub($query, $as, $first, $operator = null, $second = null) + * @method static \Illuminate\Database\Query\Builder crossJoin($table, $first = null, $operator = null, $second = null) + * @method static \Illuminate\Database\Query\Builder crossJoinSub($query, $as) + * @method static void mergeWheres($wheres, $bindings) + * @method static array prepareValueAndOperator($value, $operator, $useDefault = false) + * @method static \Illuminate\Database\Query\Builder whereColumn($first, $operator = null, $second = null, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder orWhereColumn($first, $operator = null, $second = null) + * @method static \Illuminate\Database\Query\Builder whereRaw($sql, $bindings = [], $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder orWhereRaw($sql, $bindings = []) + * @method static \Illuminate\Database\Query\Builder whereIn($column, $values, $boolean = 'and', $not = false) + * @method static \Illuminate\Database\Query\Builder orWhereIn($column, $values) + * @method static \Illuminate\Database\Query\Builder whereNotIn($column, $values, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder orWhereNotIn($column, $values) + * @method static \Illuminate\Database\Query\Builder whereIntegerInRaw($column, $values, $boolean = 'and', $not = false) + * @method static \Illuminate\Database\Query\Builder orWhereIntegerInRaw($column, $values) + * @method static \Illuminate\Database\Query\Builder whereIntegerNotInRaw($column, $values, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder orWhereIntegerNotInRaw($column, $values) + * @method static \Illuminate\Database\Query\Builder whereNull($columns, $boolean = 'and', $not = false) + * @method static \Illuminate\Database\Query\Builder orWhereNull($column) + * @method static \Illuminate\Database\Query\Builder whereNotNull($columns, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder whereBetween($column, $values, $boolean = 'and', $not = false) + * @method static \Illuminate\Database\Query\Builder whereBetweenColumns($column, $values, $boolean = 'and', $not = false) + * @method static \Illuminate\Database\Query\Builder orWhereBetween($column, $values) + * @method static \Illuminate\Database\Query\Builder orWhereBetweenColumns($column, $values) + * @method static \Illuminate\Database\Query\Builder whereNotBetween($column, $values, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder whereNotBetweenColumns($column, $values, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder orWhereNotBetween($column, $values) + * @method static \Illuminate\Database\Query\Builder orWhereNotBetweenColumns($column, $values) + * @method static \Illuminate\Database\Query\Builder orWhereNotNull($column) + * @method static \Illuminate\Database\Query\Builder whereDate($column, $operator, $value = null, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder orWhereDate($column, $operator, $value = null) + * @method static \Illuminate\Database\Query\Builder whereTime($column, $operator, $value = null, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder orWhereTime($column, $operator, $value = null) + * @method static \Illuminate\Database\Query\Builder whereDay($column, $operator, $value = null, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder orWhereDay($column, $operator, $value = null) + * @method static \Illuminate\Database\Query\Builder whereMonth($column, $operator, $value = null, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder orWhereMonth($column, $operator, $value = null) + * @method static \Illuminate\Database\Query\Builder whereYear($column, $operator, $value = null, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder orWhereYear($column, $operator, $value = null) + * @method static \Illuminate\Database\Query\Builder whereNested($callback, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder forNestedWhere() + * @method static \Illuminate\Database\Query\Builder addNestedWhereQuery($query, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder whereExists($callback, $boolean = 'and', $not = false) + * @method static \Illuminate\Database\Query\Builder orWhereExists($callback, $not = false) + * @method static \Illuminate\Database\Query\Builder whereNotExists($callback, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder orWhereNotExists($callback) + * @method static \Illuminate\Database\Query\Builder addWhereExistsQuery($query, $boolean = 'and', $not = false) + * @method static \Illuminate\Database\Query\Builder whereRowValues($columns, $operator, $values, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder orWhereRowValues($columns, $operator, $values) + * @method static \Illuminate\Database\Query\Builder whereJsonContains($column, $value, $boolean = 'and', $not = false) + * @method static \Illuminate\Database\Query\Builder orWhereJsonContains($column, $value) + * @method static \Illuminate\Database\Query\Builder whereJsonDoesntContain($column, $value, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder orWhereJsonDoesntContain($column, $value) + * @method static \Illuminate\Database\Query\Builder whereJsonLength($column, $operator, $value = null, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder orWhereJsonLength($column, $operator, $value = null) + * @method static \Illuminate\Database\Query\Builder dynamicWhere($method, $parameters) + * @method static \Illuminate\Database\Query\Builder groupBy(...$groups) + * @method static \Illuminate\Database\Query\Builder groupByRaw($sql, $bindings = []) + * @method static \Illuminate\Database\Query\Builder having($column, $operator = null, $value = null, $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder orHaving($column, $operator = null, $value = null) + * @method static \Illuminate\Database\Query\Builder havingBetween($column, $values, $boolean = 'and', $not = false) + * @method static \Illuminate\Database\Query\Builder havingRaw($sql, $bindings = [], $boolean = 'and') + * @method static \Illuminate\Database\Query\Builder orHavingRaw($sql, $bindings = []) + * @method static \Illuminate\Database\Query\Builder orderBy($column, $direction = 'asc') + * @method static \Illuminate\Database\Query\Builder orderByDesc($column) + * @method static \Illuminate\Database\Query\Builder inRandomOrder($seed = '') + * @method static \Illuminate\Database\Query\Builder orderByRaw($sql, $bindings = []) + * @method static \Illuminate\Database\Query\Builder skip($value) + * @method static \Illuminate\Database\Query\Builder offset($value) + * @method static \Illuminate\Database\Query\Builder take($value) + * @method static \Illuminate\Database\Query\Builder limit($value) + * @method static \Illuminate\Database\Query\Builder forPage($page, $perPage = 15) + * @method static \Illuminate\Database\Query\Builder forPageBeforeId($perPage = 15, $lastId = 0, $column = 'id') + * @method static \Illuminate\Database\Query\Builder forPageAfterId($perPage = 15, $lastId = 0, $column = 'id') + * @method static \Illuminate\Database\Query\Builder reorder($column = null, $direction = 'asc') + * @method static \Illuminate\Database\Query\Builder union($query, $all = false) + * @method static \Illuminate\Database\Query\Builder unionAll($query) + * @method static \Illuminate\Database\Query\Builder lock($value = true) + * @method static \Illuminate\Database\Query\Builder lockForUpdate() + * @method static \Illuminate\Database\Query\Builder sharedLock() + * @method static \Illuminate\Database\Query\Builder beforeQuery($callback) + * @method static void applyBeforeQueryCallbacks() + * @method static string toSql() + * @method static int getCountForPagination($columns = []) + * @method static string implode($column, $glue = '') + * @method static bool exists() + * @method static bool doesntExist() + * @method static mixed existsOr($callback) + * @method static mixed doesntExistOr($callback) + * @method static int count($columns = '*') + * @method static mixed min($column) + * @method static mixed max($column) + * @method static mixed sum($column) + * @method static mixed avg($column) + * @method static mixed average($column) + * @method static mixed aggregate($function, $columns = []) + * @method static float|int numericAggregate($function, $columns = []) + * @method static bool insert($values) + * @method static int insertOrIgnore($values) + * @method static int insertGetId($values, $sequence = null) + * @method static int insertUsing($columns, $query) + * @method static bool updateOrInsert($attributes, $values = []) + * @method static void truncate() + * @method static \Illuminate\Database\Query\Expression raw($value) + * @method static array getBindings() + * @method static array getRawBindings() + * @method static \Illuminate\Database\Query\Builder setBindings($bindings, $type = 'where') + * @method static \Illuminate\Database\Query\Builder addBinding($value, $type = 'where') + * @method static \Illuminate\Database\Query\Builder mergeBindings($query) + * @method static array cleanBindings($bindings) + * @method static \Illuminate\Database\Query\Processors\Processor getProcessor() + * @method static \Illuminate\Database\Query\Grammars\Grammar getGrammar() + * @method static \Illuminate\Database\Query\Builder useWritePdo() + * @method static static cloneWithout($properties) + * @method static static cloneWithoutBindings($except) + * @method static \Illuminate\Database\Query\Builder dump() + * @method static void dd() + * @method static void macro($name, $macro) + * @method static void mixin($mixin, $replace = true) + * @method static mixed macroCall($method, $parameters) + */ +class Model extends BaseModel +{ + +} diff --git a/vendor/workerman/webman-framework/src/support/Plugin.php b/vendor/workerman/webman-framework/src/support/Plugin.php new file mode 100644 index 0000000..19a289a --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/Plugin.php @@ -0,0 +1,72 @@ +<?php + +namespace support; + +class Plugin +{ + /** + * @param $event + * @return void + */ + public static function install($event) + { + static::findHepler(); + $operation = $event->getOperation(); + $autoload = \method_exists($operation, 'getPackage') ? $operation->getPackage()->getAutoload() : $operation->getTargetPackage()->getAutoload(); + if (!isset($autoload['psr-4'])) { + return; + } + foreach ($autoload['psr-4'] as $namespace => $path) { + $install_function = "\\{$namespace}Install::install"; + $plugin_const = "\\{$namespace}Install::WEBMAN_PLUGIN"; + if (\defined($plugin_const) && \is_callable($install_function)) { + $install_function(); + } + } + } + + /** + * @param $event + * @return void + */ + public static function update($event) + { + static::install($event); + } + + /** + * @param $event + * @return void + */ + public static function uninstall($event) + { + static::findHepler(); + $autoload = $event->getOperation()->getPackage()->getAutoload(); + if (!isset($autoload['psr-4'])) { + return; + } + foreach ($autoload['psr-4'] as $namespace => $path) { + $uninstall_function = "\\{$namespace}Install::uninstall"; + $plugin_const = "\\{$namespace}Install::WEBMAN_PLUGIN"; + if (defined($plugin_const) && is_callable($uninstall_function)) { + $uninstall_function(); + } + } + } + + /** + * @return void + */ + protected static function findHepler() + { + // Plugin.php in vendor + $file = __DIR__ . '/../../../../../support/helpers.php'; + if (\is_file($file)) { + require_once $file; + return; + } + // Plugin.php in webman + require_once __DIR__ . '/helpers.php'; + } + +} diff --git a/vendor/workerman/webman-framework/src/support/Redis.php b/vendor/workerman/webman-framework/src/support/Redis.php new file mode 100644 index 0000000..fecc9ed --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/Redis.php @@ -0,0 +1,279 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support; + +use Illuminate\Events\Dispatcher; +use Illuminate\Redis\Events\CommandExecuted; +use Illuminate\Redis\RedisManager; +use Workerman\Timer; +use Workerman\Worker; + + +/** + * Class Redis + * @package support + * + * Strings methods + * @method static int append($key, $value) + * @method static int bitCount($key) + * @method static int decr($key, $value = 1) + * @method static int decrBy($key, $value) + * @method static string|bool get($key) + * @method static int getBit($key, $offset) + * @method static string getRange($key, $start, $end) + * @method static string getSet($key, $value) + * @method static int incr($key, $value = 1) + * @method static int incrBy($key, $value) + * @method static float incrByFloat($key, $value) + * @method static array mGet(array $keys) + * @method static array getMultiple(array $keys) + * @method static bool mSet($pairs) + * @method static bool mSetNx($pairs) + * @method static bool set($key, $value, $expireResolution = null, $expireTTL = null, $flag = null) + * @method static bool setBit($key, $offset, $value) + * @method static bool setEx($key, $ttl, $value) + * @method static bool pSetEx($key, $ttl, $value) + * @method static bool setNx($key, $value) + * @method static string setRange($key, $offset, $value) + * @method static int strLen($key) + * Keys methods + * @method static int del(...$keys) + * @method static int unlink(...$keys) + * @method static false|string dump($key) + * @method static int exists(...$keys) + * @method static bool expire($key, $ttl) + * @method static bool pexpire($key, $ttl) + * @method static bool expireAt($key, $timestamp) + * @method static bool pexpireAt($key, $timestamp) + * @method static array keys($pattern) + * @method static bool|array scan($it) + * @method static void migrate($host, $port, $keys, $dbIndex, $timeout, $copy = false, $replace = false) + * @method static bool select($dbIndex) + * @method static bool move($key, $dbIndex) + * @method static string|int|bool object($information, $key) + * @method static bool persist($key) + * @method static string randomKey() + * @method static bool rename($srcKey, $dstKey) + * @method static bool renameNx($srcKey, $dstKey) + * @method static string type($key) + * @method static int|array sort($key, $options = []) + * @method static int ttl($key) + * @method static int pttl($key) + * @method static void restore($key, $ttl, $value) + * Hashes methods + * @method static false|int hSet($key, $hashKey, $value) + * @method static bool hSetNx($key, $hashKey, $value) + * @method static false|string hGet($key, $hashKey) + * @method static false|int hLen($key) + * @method static false|int hDel($key, ...$hashKeys) + * @method static array hKeys($key) + * @method static array hVals($key) + * @method static array hGetAll($key) + * @method static bool hExists($key, $hashKey) + * @method static int hIncrBy($key, $hashKey, $value) + * @method static float hIncrByFloat($key, $hashKey, $value) + * @method static bool hMSet($key, $members) + * @method static array hMGet($key, $memberKeys) + * @method static array hScan($key, $iterator, $pattern = '', $count = 0) + * @method static int hStrLen($key, $hashKey) + * Lists methods + * @method static array blPop($keys, $timeout) + * @method static array brPop($keys, $timeout) + * @method static false|string bRPopLPush($srcKey, $dstKey, $timeout) + * @method static false|string lIndex($key, $index) + * @method static int lInsert($key, $position, $pivot, $value) + * @method static false|string lPop($key) + * @method static false|int lPush($key, ...$entries) + * @method static false|int lPushx($key, $value) + * @method static array lRange($key, $start, $end) + * @method static false|int lRem($key, $count, $value) + * @method static bool lSet($key, $index, $value) + * @method static false|array lTrim($key, $start, $end) + * @method static false|string rPop($key) + * @method static false|string rPopLPush($srcKey, $dstKey) + * @method static false|int rPush($key, ...$entries) + * @method static false|int rPushX($key, $value) + * @method static false|int lLen($key) + * Sets methods + * @method static int sAdd($key, $value) + * @method static int sCard($key) + * @method static array sDiff($keys) + * @method static false|int sDiffStore($dst, $keys) + * @method static false|array sInter($keys) + * @method static false|int sInterStore($dst, $keys) + * @method static bool sIsMember($key, $member) + * @method static array sMembers($key) + * @method static bool sMove($src, $dst, $member) + * @method static false|string|array sPop($key, $count = 0) + * @method static false|string|array sRandMember($key, $count = 0) + * @method static int sRem($key, ...$members) + * @method static array sUnion(...$keys) + * @method static false|int sUnionStore($dst, ...$keys) + * @method static false|array sScan($key, $iterator, $pattern = '', $count = 0) + * Sorted sets methods + * @method static array bzPopMin($keys, $timeout) + * @method static array bzPopMax($keys, $timeout) + * @method static int zAdd($key, $score, $value) + * @method static int zCard($key) + * @method static int zCount($key, $start, $end) + * @method static double zIncrBy($key, $value, $member) + * @method static int zinterstore($keyOutput, $arrayZSetKeys, $arrayWeights = [], $aggregateFunction = '') + * @method static array zPopMin($key, $count) + * @method static array zPopMax($key, $count) + * @method static array zRange($key, $start, $end, $withScores = false) + * @method static array zRangeByScore($key, $start, $end, $options = []) + * @method static array zRevRangeByScore($key, $start, $end, $options = []) + * @method static array zRangeByLex($key, $min, $max, $offset = 0, $limit = 0) + * @method static int zRank($key, $member) + * @method static int zRevRank($key, $member) + * @method static int zRem($key, ...$members) + * @method static int zRemRangeByRank($key, $start, $end) + * @method static int zRemRangeByScore($key, $start, $end) + * @method static array zRevRange($key, $start, $end, $withScores = false) + * @method static double zScore($key, $member) + * @method static int zunionstore($keyOutput, $arrayZSetKeys, $arrayWeights = [], $aggregateFunction = '') + * @method static false|array zScan($key, $iterator, $pattern = '', $count = 0) + * HyperLogLogs methods + * @method static int pfAdd($key, $values) + * @method static int pfCount($keys) + * @method static bool pfMerge($dstKey, $srcKeys) + * Geocoding methods + * @method static int geoAdd($key, $longitude, $latitude, $member, ...$items) + * @method static array geoHash($key, ...$members) + * @method static array geoPos($key, ...$members) + * @method static double geoDist($key, $members, $unit = '') + * @method static int|array geoRadius($key, $longitude, $latitude, $radius, $unit, $options = []) + * @method static array geoRadiusByMember($key, $member, $radius, $units, $options = []) + * Streams methods + * @method static int xAck($stream, $group, $arrMessages) + * @method static string xAdd($strKey, $strId, $arrMessage, $iMaxLen = 0, $booApproximate = false) + * @method static array xClaim($strKey, $strGroup, $strConsumer, $minIdleTime, $arrIds, $arrOptions = []) + * @method static int xDel($strKey, $arrIds) + * @method static mixed xGroup($command, $strKey, $strGroup, $strMsgId, $booMKStream = null) + * @method static mixed xInfo($command, $strStream, $strGroup = null) + * @method static int xLen($stream) + * @method static array xPending($strStream, $strGroup, $strStart = 0, $strEnd = 0, $iCount = 0, $strConsumer = null) + * @method static array xRange($strStream, $strStart, $strEnd, $iCount = 0) + * @method static array xRead($arrStreams, $iCount = 0, $iBlock = null) + * @method static array xReadGroup($strGroup, $strConsumer, $arrStreams, $iCount = 0, $iBlock = null) + * @method static array xRevRange($strStream, $strEnd, $strStart, $iCount = 0) + * @method static int xTrim($strStream, $iMaxLen, $booApproximate = null) + * Pub/sub methods + * @method static mixed pSubscribe($patterns, $callback) + * @method static mixed publish($channel, $message) + * @method static mixed subscribe($channels, $callback) + * @method static mixed pubSub($keyword, $argument = null) + * Generic methods + * @method static mixed rawCommand(...$commandAndArgs) + * Transactions methods + * @method static \Redis multi() + * @method static mixed exec() + * @method static mixed discard() + * @method static mixed watch($keys) + * @method static mixed unwatch($keys) + * Scripting methods + * @method static mixed eval($script, $numkeys, $keyOrArg1 = null, $keyOrArgN = null) + * @method static mixed evalSha($scriptSha, $numkeys, ...$arguments) + * @method static mixed script($command, ...$scripts) + * @method static mixed client(...$args) + * @method static null|string getLastError() + * @method static bool clearLastError() + * @method static mixed _prefix($value) + * @method static mixed _serialize($value) + * @method static mixed _unserialize($value) + * Introspection methods + * @method static bool isConnected() + * @method static mixed getHost() + * @method static mixed getPort() + * @method static false|int getDbNum() + * @method static false|double getTimeout() + * @method static mixed getReadTimeout() + * @method static mixed getPersistentID() + * @method static mixed getAuth() + */ +class Redis +{ + + /** + * @var RedisManager + */ + protected static $_instance = null; + + /** + * need to install phpredis extension + */ + const PHPREDIS_CLIENT = 'phpredis'; + + /** + * need to install the 'predis/predis' packgage. + * cmd: composer install predis/predis + */ + const PREDIS_CLIENT = 'predis'; + + /** + * Support client collection + */ + static $_allowClient = [ + self::PHPREDIS_CLIENT, + self::PREDIS_CLIENT + ]; + + /** + * @return RedisManager + */ + public static function instance() + { + if (!static::$_instance) { + $config = \config('redis'); + $client = $config['client'] ?? self::PHPREDIS_CLIENT; + + if (!\in_array($client, static::$_allowClient)) { + $client = self::PHPREDIS_CLIENT; + } + + static::$_instance = new RedisManager('', $client, $config); + } + return static::$_instance; + } + + /** + * @param string $name + * @return \Illuminate\Redis\Connections\Connection + */ + public static function connection(string $name = 'default') + { + static $timers = []; + $connection = static::instance()->connection($name); + if (!isset($timers[$name])) { + $timers[$name] = Worker::getAllWorkers() ? Timer::add(55, function () use ($connection) { + $connection->get('ping'); + }) : 1; + if (\class_exists(Dispatcher::class)) { + $connection->setEventDispatcher(new Dispatcher()); + } + } + return $connection; + } + + /** + * @param string $name + * @param array $arguments + * @return mixed + */ + public static function __callStatic(string $name, array $arguments) + { + return static::connection('default')->{$name}(... $arguments); + } +} diff --git a/vendor/workerman/webman-framework/src/support/Request.php b/vendor/workerman/webman-framework/src/support/Request.php new file mode 100644 index 0000000..e3f6ac3 --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/Request.php @@ -0,0 +1,24 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support; + +/** + * Class Request + * @package support + */ +class Request extends \Webman\Http\Request +{ + +} \ No newline at end of file diff --git a/vendor/workerman/webman-framework/src/support/Response.php b/vendor/workerman/webman-framework/src/support/Response.php new file mode 100644 index 0000000..9bc4e1e --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/Response.php @@ -0,0 +1,24 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support; + +/** + * Class Response + * @package support + */ +class Response extends \Webman\Http\Response +{ + +} \ No newline at end of file diff --git a/vendor/workerman/webman-framework/src/support/Translation.php b/vendor/workerman/webman-framework/src/support/Translation.php new file mode 100644 index 0000000..3e35be2 --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/Translation.php @@ -0,0 +1,89 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support; + +use Symfony\Component\Translation\Translator; +use Webman\Exception\NotFoundException; + +/** + * Class Translation + * @package support + * @method static string trans(?string $id, array $parameters = [], string $domain = null, string $locale = null) + * @method static void setLocale(string $locale) + * @method static string getLocale() + */ +class Translation +{ + + /** + * @var Translator[] + */ + protected static $_instance = []; + + /** + * @return Translator + * @throws NotFoundException + */ + public static function instance(string $plugin = '') + { + if (!isset(static::$_instance[$plugin])) { + $config = \config($plugin ? "plugin.$plugin.translation" : 'translation', []); + // Phar support. Compatible with the 'realpath' function in the phar file. + if (!$translations_path = \get_realpath($config['path'])) { + throw new NotFoundException("File {$config['path']} not found"); + } + + static::$_instance[$plugin] = $translator = new Translator($config['locale']); + $translator->setFallbackLocales($config['fallback_locale']); + + $classes = [ + 'Symfony\Component\Translation\Loader\PhpFileLoader' => [ + 'extension' => '.php', + 'format' => 'phpfile' + ], + 'Symfony\Component\Translation\Loader\PoFileLoader' => [ + 'extension' => '.po', + 'format' => 'pofile' + ] + ]; + + foreach ($classes as $class => $opts) { + $translator->addLoader($opts['format'], new $class); + foreach (\glob($translations_path . DIRECTORY_SEPARATOR . '*' . DIRECTORY_SEPARATOR . '*' . $opts['extension']) as $file) { + $domain = \basename($file, $opts['extension']); + $dir_name = \pathinfo($file, PATHINFO_DIRNAME); + $locale = \substr(strrchr($dir_name, DIRECTORY_SEPARATOR), 1); + if ($domain && $locale) { + $translator->addResource($opts['format'], $file, $locale, $domain); + } + } + } + } + return static::$_instance[$plugin]; + } + + /** + * @param string $name + * @param array $arguments + * @return mixed + * @throws NotFoundException + */ + public static function __callStatic(string $name, array $arguments) + { + $request = \request(); + $plugin = $request->plugin ?? ''; + return static::instance($plugin)->{$name}(... $arguments); + } +} diff --git a/vendor/workerman/webman-framework/src/support/View.php b/vendor/workerman/webman-framework/src/support/View.php new file mode 100644 index 0000000..7d498ff --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/View.php @@ -0,0 +1,31 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support; + +class View +{ + /** + * @param mixed $name + * @param mixed $value + * @return void + */ + public static function assign($name, $value = null) + { + $request = \request(); + $plugin = $request->plugin ?? ''; + $handler = \config($plugin ? "plugin.$plugin.view.handler" : 'view.handler'); + $handler::assign($name, $value); + } +} \ No newline at end of file diff --git a/vendor/workerman/webman-framework/src/support/bootstrap/LaravelDb.php b/vendor/workerman/webman-framework/src/support/bootstrap/LaravelDb.php new file mode 100644 index 0000000..13e0df1 --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/bootstrap/LaravelDb.php @@ -0,0 +1,113 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support\bootstrap; + +use Illuminate\Container\Container; +use Illuminate\Database\Capsule\Manager as Capsule; +use Illuminate\Database\Connection; +use Illuminate\Events\Dispatcher; +use Illuminate\Pagination\Paginator; +use Jenssegers\Mongodb\Connection as MongodbConnection; +use support\Db; +use Throwable; +use Webman\Bootstrap; +use Workerman\Timer; +use Workerman\Worker; + +/** + * Class Laravel + * @package support\Bootstrap + */ +class LaravelDb implements Bootstrap +{ + /** + * @param Worker $worker + * + * @return void + */ + public static function start($worker) + { + if (!class_exists(Capsule::class)) { + return; + } + + $config = \config('database', []); + $connections = $config['connections'] ?? []; + if (!$connections) { + return; + } + + $capsule = new Capsule; + + $capsule->getDatabaseManager()->extend('mongodb', function ($config, $name) { + $config['name'] = $name; + return new MongodbConnection($config); + }); + + $default = $config['default'] ?? false; + if ($default) { + $default_config = $connections[$config['default']]; + $capsule->addConnection($default_config); + } + + foreach ($connections as $name => $config) { + $capsule->addConnection($config, $name); + } + + if (\class_exists(Dispatcher::class)) { + $capsule->setEventDispatcher(new Dispatcher(new Container)); + } + + $capsule->setAsGlobal(); + + $capsule->bootEloquent(); + + // Heartbeat + if ($worker) { + Timer::add(55, function () use ($default, $connections, $capsule) { + foreach ($capsule->getDatabaseManager()->getConnections() as $connection) { + /* @var \Illuminate\Database\MySqlConnection $connection **/ + if ($connection->getConfig('driver') == 'mysql') { + try { + $connection->select('select 1'); + } catch (Throwable $e) {} + } + } + }); + } + + // Paginator + if (class_exists(Paginator::class)) { + if (method_exists(Paginator::class, 'queryStringResolver')) { + Paginator::queryStringResolver(function () { + $request = request(); + return $request ? $request->queryString() : null; + }); + } + Paginator::currentPathResolver(function () { + $request = request(); + return $request ? $request->path(): '/'; + }); + Paginator::currentPageResolver(function ($page_name = 'page') { + $request = request(); + if (!$request) { + return 1; + } + $page = (int)($request->input($page_name, 1)); + return $page > 0 ? $page : 1; + }); + } + } +} diff --git a/vendor/workerman/webman-framework/src/support/bootstrap/Session.php b/vendor/workerman/webman-framework/src/support/bootstrap/Session.php new file mode 100644 index 0000000..f01ec04 --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/bootstrap/Session.php @@ -0,0 +1,59 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support\bootstrap; + +use Webman\Bootstrap; +use Workerman\Protocols\Http; +use Workerman\Protocols\Http\Session as SessionBase; +use Workerman\Worker; + +/** + * Class Session + * @package support + */ +class Session implements Bootstrap +{ + + /** + * @param Worker $worker + * @return void + */ + public static function start($worker) + { + $config = \config('session'); + if (\property_exists(SessionBase::class, 'name')) { + SessionBase::$name = $config['session_name']; + } else { + Http::sessionName($config['session_name']); + } + SessionBase::handlerClass($config['handler'], $config['config'][$config['type']]); + $map = [ + 'auto_update_timestamp' => 'autoUpdateTimestamp', + 'cookie_lifetime' => 'cookieLifetime', + 'gc_probability' => 'gcProbability', + 'cookie_path' => 'cookiePath', + 'http_only' => 'httpOnly', + 'same_site' => 'sameSite', + 'lifetime' => 'lifetime', + 'domain' => 'domain', + 'secure' => 'secure', + ]; + foreach ($map as $key => $name) { + if (isset($config[$key]) && \property_exists(SessionBase::class, $name)) { + SessionBase::${$name} = $config[$key]; + } + } + } +} diff --git a/vendor/workerman/webman-framework/src/support/exception/BusinessException.php b/vendor/workerman/webman-framework/src/support/exception/BusinessException.php new file mode 100644 index 0000000..37d1b60 --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/exception/BusinessException.php @@ -0,0 +1,37 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support\exception; + +use Exception; +use Webman\Http\Response; +use Webman\Http\Request; + +/** + * Class BusinessException + * @package support\exception + */ +class BusinessException extends Exception +{ + public function render(Request $request): ?Response + { + if ($request->expectsJson()) { + $code = $this->getCode(); + $json = ['code' => $code ? $code : 500, 'msg' => $this->getMessage()]; + return new Response(200, ['Content-Type' => 'application/json'], + \json_encode($json, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); + } + return new Response(200, [], $this->getMessage()); + } +} diff --git a/vendor/workerman/webman-framework/src/support/exception/Handler.php b/vendor/workerman/webman-framework/src/support/exception/Handler.php new file mode 100644 index 0000000..98dc618 --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/exception/Handler.php @@ -0,0 +1,47 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support\exception; + +use Throwable; +use Webman\Exception\ExceptionHandler; +use Webman\Http\Request; +use Webman\Http\Response; + +/** + * Class Handler + * @package support\exception + */ +class Handler extends ExceptionHandler +{ + public $dontReport = [ + BusinessException::class, + ]; + + public function report(Throwable $exception) + { + parent::report($exception); + } + + public function render(Request $request, Throwable $exception): Response + { + if(($exception instanceof BusinessException) && ($response = $exception->render($request))) + { + return $response; + } + + return parent::render($request, $exception); + } + +} \ No newline at end of file diff --git a/vendor/workerman/webman-framework/src/support/view/Blade.php b/vendor/workerman/webman-framework/src/support/view/Blade.php new file mode 100644 index 0000000..8e66eb6 --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/view/Blade.php @@ -0,0 +1,69 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support\view; + +use Jenssegers\Blade\Blade as BladeView; +use Webman\View; + +/** + * Class Blade + * composer require jenssegers/blade + * @package support\view + */ +class Blade implements View +{ + /** + * @var array + */ + protected static $_vars = []; + + /** + * @param string|array $name + * @param mixed $value + */ + public static function assign($name, $value = null) + { + static::$_vars = \array_merge(static::$_vars, \is_array($name) ? $name : [$name => $value]); + } + + /** + * @param string $template + * @param array $vars + * @param string|null $app + * @return string + */ + public static function render(string $template, array $vars, string $app = null) + { + static $views = []; + $request = \request(); + $plugin = $request->plugin ?? ''; + $app = $app === null ? $request->app : $app; + $config_prefix = $plugin ? "plugin.$plugin." : ''; + $base_view_path = $plugin ? \base_path() . "/plugin/$plugin/app" : \app_path(); + $key = "{$plugin}-{$request->app}"; + if (!isset($views[$key])) { + $view_path = $app === '' ? "$base_view_path/view" : "$base_view_path/$app/view"; + $views[$key] = new BladeView($view_path, \runtime_path() . '/views'); + $extension = \config("{$config_prefix}view.extension"); + if ($extension) { + $extension($views[$key]); + } + } + $vars = \array_merge(static::$_vars, $vars); + $content = $views[$key]->render($template, $vars); + static::$_vars = []; + return $content; + } +} diff --git a/vendor/workerman/webman-framework/src/support/view/Raw.php b/vendor/workerman/webman-framework/src/support/view/Raw.php new file mode 100644 index 0000000..b8944cd --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/view/Raw.php @@ -0,0 +1,71 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support\view; + +use Webman\View; +use Throwable; + +/** + * Class Raw + * @package support\view + */ +class Raw implements View +{ + /** + * @var array + */ + protected static $_vars = []; + + /** + * @param string|array $name + * @param mixed $value + */ + public static function assign($name, $value = null) + { + static::$_vars = \array_merge(static::$_vars, \is_array($name) ? $name : [$name => $value]); + } + + /** + * @param string $template + * @param array $vars + * @param string|null $app + * @return false|string + */ + public static function render(string $template, array $vars, string $app = null) + { + $request = \request(); + $plugin = $request->plugin ?? ''; + $config_prefix = $plugin ? "plugin.$plugin." : ''; + $view_suffix = \config("{$config_prefix}view.options.view_suffix", 'html'); + $app = $app === null ? $request->app : $app; + $base_view_path = $plugin ? \base_path() . "/plugin/$plugin/app" : \app_path(); + $__template_path__ = $app === '' ? "$base_view_path/view/$template.$view_suffix" : "$base_view_path/$app/view/$template.$view_suffix"; + + \extract(static::$_vars); + \extract($vars); + \ob_start(); + // Try to include php file. + try { + include $__template_path__; + } catch (Throwable $e) { + static::$_vars = []; + \ob_end_clean(); + throw $e; + } + static::$_vars = []; + return \ob_get_clean(); + } + +} diff --git a/vendor/workerman/webman-framework/src/support/view/ThinkPHP.php b/vendor/workerman/webman-framework/src/support/view/ThinkPHP.php new file mode 100644 index 0000000..dab139e --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/view/ThinkPHP.php @@ -0,0 +1,69 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support\view; + +use think\Template; +use Webman\View; + +/** + * Class Blade + * @package support\view + */ +class ThinkPHP implements View +{ + /** + * @var array + */ + protected static $_vars = []; + + /** + * @param string|array $name + * @param mixed $value + */ + public static function assign($name, $value = null) + { + static::$_vars = \array_merge(static::$_vars, \is_array($name) ? $name : [$name => $value]); + } + + /** + * @param string $template + * @param array $vars + * @param string|null $app + * @return false|string + */ + public static function render(string $template, array $vars, string $app = null) + { + $request = \request(); + $plugin = $request->plugin ?? ''; + $app = $app === null ? $request->app : $app; + $config_prefix = $plugin ? "plugin.$plugin." : ''; + $view_suffix = \config("{$config_prefix}view.options.view_suffix", 'html'); + $base_view_path = $plugin ? \base_path() . "/plugin/$plugin/app" : \app_path(); + $view_path = $app === '' ? "$base_view_path/view/" : "$base_view_path/$app/view/"; + $default_options = [ + 'view_path' => $view_path, + 'cache_path' => \runtime_path() . '/views/', + 'view_suffix' => $view_suffix + ]; + $options = $default_options + \config("{$config_prefix}view.options", []); + $views = new Template($options); + \ob_start(); + $vars = \array_merge(static::$_vars, $vars); + $views->fetch($template, $vars); + $content = \ob_get_clean(); + static::$_vars = []; + return $content; + } +} diff --git a/vendor/workerman/webman-framework/src/support/view/Twig.php b/vendor/workerman/webman-framework/src/support/view/Twig.php new file mode 100644 index 0000000..075bd12 --- /dev/null +++ b/vendor/workerman/webman-framework/src/support/view/Twig.php @@ -0,0 +1,70 @@ +<?php +/** + * This file is part of webman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace support\view; + +use Twig\Environment; +use Twig\Loader\FilesystemLoader; +use Webman\View; + +/** + * Class Blade + * @package support\view + */ +class Twig implements View +{ + /** + * @var array + */ + protected static $_vars = []; + + /** + * @param string|array $name + * @param mixed $value + */ + public static function assign($name, $value = null) + { + static::$_vars = \array_merge(static::$_vars, \is_array($name) ? $name : [$name => $value]); + } + + /** + * @param string $template + * @param array $vars + * @param string|null $app + * @return string + */ + public static function render(string $template, array $vars, string $app = null) + { + static $views = []; + $request = \request(); + $plugin = $request->plugin ?? ''; + $app = $app === null ? $request->app : $app; + $config_prefix = $plugin ? "plugin.$plugin." : ''; + $view_suffix = \config("{$config_prefix}view.options.view_suffix", 'html'); + $key = "{$plugin}-{$request->app}"; + if (!isset($views[$key])) { + $base_view_path = $plugin ? \base_path() . "/plugin/$plugin/app" : \app_path(); + $view_path = $app === '' ? "$base_view_path/view/" : "$base_view_path/$app/view/"; + $views[$key] = new Environment(new FilesystemLoader($view_path), \config("{$config_prefix}view.options", [])); + $extension = \config("{$config_prefix}view.extension"); + if ($extension) { + $extension($views[$key]); + } + } + $vars = \array_merge(static::$_vars, $vars); + $content = $views[$key]->render("$template.$view_suffix", $vars); + static::$_vars = []; + return $content; + } +} diff --git a/vendor/workerman/workerman/.github/FUNDING.yml b/vendor/workerman/workerman/.github/FUNDING.yml new file mode 100644 index 0000000..beae44f --- /dev/null +++ b/vendor/workerman/workerman/.github/FUNDING.yml @@ -0,0 +1,4 @@ +# These are supported funding model platforms + +open_collective: workerman +patreon: walkor diff --git a/vendor/workerman/workerman/.gitignore b/vendor/workerman/workerman/.gitignore new file mode 100644 index 0000000..f3f9e18 --- /dev/null +++ b/vendor/workerman/workerman/.gitignore @@ -0,0 +1,6 @@ +logs +.buildpath +.project +.settings +.idea +.DS_Store diff --git a/vendor/workerman/workerman/Autoloader.php b/vendor/workerman/workerman/Autoloader.php new file mode 100644 index 0000000..7d760e9 --- /dev/null +++ b/vendor/workerman/workerman/Autoloader.php @@ -0,0 +1,69 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman; + +/** + * Autoload. + */ +class Autoloader +{ + /** + * Autoload root path. + * + * @var string + */ + protected static $_autoloadRootPath = ''; + + /** + * Set autoload root path. + * + * @param string $root_path + * @return void + */ + public static function setRootPath($root_path) + { + self::$_autoloadRootPath = $root_path; + } + + /** + * Load files by namespace. + * + * @param string $name + * @return boolean + */ + public static function loadByNamespace($name) + { + $class_path = \str_replace('\\', \DIRECTORY_SEPARATOR, $name); + if (\strpos($name, 'Workerman\\') === 0) { + $class_file = __DIR__ . \substr($class_path, \strlen('Workerman')) . '.php'; + } else { + if (self::$_autoloadRootPath) { + $class_file = self::$_autoloadRootPath . \DIRECTORY_SEPARATOR . $class_path . '.php'; + } + if (empty($class_file) || !\is_file($class_file)) { + $class_file = __DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . "$class_path.php"; + } + } + + if (\is_file($class_file)) { + require_once($class_file); + if (\class_exists($name, false)) { + return true; + } + } + return false; + } +} + +\spl_autoload_register('\Workerman\Autoloader::loadByNamespace'); \ No newline at end of file diff --git a/vendor/workerman/workerman/Connection/AsyncTcpConnection.php b/vendor/workerman/workerman/Connection/AsyncTcpConnection.php new file mode 100644 index 0000000..600d700 --- /dev/null +++ b/vendor/workerman/workerman/Connection/AsyncTcpConnection.php @@ -0,0 +1,376 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Connection; + +use Workerman\Events\EventInterface; +use Workerman\Lib\Timer; +use Workerman\Worker; +use \Exception; + +/** + * AsyncTcpConnection. + */ +class AsyncTcpConnection extends TcpConnection +{ + /** + * Emitted when socket connection is successfully established. + * + * @var callable|null + */ + public $onConnect = null; + + /** + * Transport layer protocol. + * + * @var string + */ + public $transport = 'tcp'; + + /** + * Status. + * + * @var int + */ + protected $_status = self::STATUS_INITIAL; + + /** + * Remote host. + * + * @var string + */ + protected $_remoteHost = ''; + + /** + * Remote port. + * + * @var int + */ + protected $_remotePort = 80; + + /** + * Connect start time. + * + * @var float + */ + protected $_connectStartTime = 0; + + /** + * Remote URI. + * + * @var string + */ + protected $_remoteURI = ''; + + /** + * Context option. + * + * @var array + */ + protected $_contextOption = null; + + /** + * Reconnect timer. + * + * @var int + */ + protected $_reconnectTimer = null; + + + /** + * PHP built-in protocols. + * + * @var array + */ + protected static $_builtinTransports = array( + 'tcp' => 'tcp', + 'udp' => 'udp', + 'unix' => 'unix', + 'ssl' => 'ssl', + 'sslv2' => 'sslv2', + 'sslv3' => 'sslv3', + 'tls' => 'tls' + ); + + /** + * Construct. + * + * @param string $remote_address + * @param array $context_option + * @throws Exception + */ + public function __construct($remote_address, array $context_option = array()) + { + $address_info = \parse_url($remote_address); + if (!$address_info) { + list($scheme, $this->_remoteAddress) = \explode(':', $remote_address, 2); + if('unix' === strtolower($scheme)) { + $this->_remoteAddress = substr($remote_address, strpos($remote_address, '/') + 2); + } + if (!$this->_remoteAddress) { + Worker::safeEcho(new \Exception('bad remote_address')); + } + } else { + if (!isset($address_info['port'])) { + $address_info['port'] = 0; + } + if (!isset($address_info['path'])) { + $address_info['path'] = '/'; + } + if (!isset($address_info['query'])) { + $address_info['query'] = ''; + } else { + $address_info['query'] = '?' . $address_info['query']; + } + $this->_remoteHost = $address_info['host']; + $this->_remotePort = $address_info['port']; + $this->_remoteURI = "{$address_info['path']}{$address_info['query']}"; + $scheme = isset($address_info['scheme']) ? $address_info['scheme'] : 'tcp'; + $this->_remoteAddress = 'unix' === strtolower($scheme) + ? substr($remote_address, strpos($remote_address, '/') + 2) + : $this->_remoteHost . ':' . $this->_remotePort; + } + + $this->id = $this->_id = self::$_idRecorder++; + if(\PHP_INT_MAX === self::$_idRecorder){ + self::$_idRecorder = 0; + } + // Check application layer protocol class. + if (!isset(self::$_builtinTransports[$scheme])) { + $scheme = \ucfirst($scheme); + $this->protocol = '\\Protocols\\' . $scheme; + if (!\class_exists($this->protocol)) { + $this->protocol = "\\Workerman\\Protocols\\$scheme"; + if (!\class_exists($this->protocol)) { + throw new Exception("class \\Protocols\\$scheme not exist"); + } + } + } else { + $this->transport = self::$_builtinTransports[$scheme]; + } + + // For statistics. + ++self::$statistics['connection_count']; + $this->maxSendBufferSize = self::$defaultMaxSendBufferSize; + $this->maxPackageSize = self::$defaultMaxPackageSize; + $this->_contextOption = $context_option; + static::$connections[$this->_id] = $this; + } + + /** + * Do connect. + * + * @return void + */ + public function connect() + { + if ($this->_status !== self::STATUS_INITIAL && $this->_status !== self::STATUS_CLOSING && + $this->_status !== self::STATUS_CLOSED) { + return; + } + $this->_status = self::STATUS_CONNECTING; + $this->_connectStartTime = \microtime(true); + if ($this->transport !== 'unix') { + if (!$this->_remotePort) { + $this->_remotePort = $this->transport === 'ssl' ? 443 : 80; + $this->_remoteAddress = $this->_remoteHost.':'.$this->_remotePort; + } + // Open socket connection asynchronously. + if ($this->_contextOption) { + $context = \stream_context_create($this->_contextOption); + $this->_socket = \stream_socket_client("tcp://{$this->_remoteHost}:{$this->_remotePort}", + $errno, $errstr, 0, \STREAM_CLIENT_ASYNC_CONNECT, $context); + } else { + $this->_socket = \stream_socket_client("tcp://{$this->_remoteHost}:{$this->_remotePort}", + $errno, $errstr, 0, \STREAM_CLIENT_ASYNC_CONNECT); + } + } else { + $this->_socket = \stream_socket_client("{$this->transport}://{$this->_remoteAddress}", $errno, $errstr, 0, + \STREAM_CLIENT_ASYNC_CONNECT); + } + // If failed attempt to emit onError callback. + if (!$this->_socket || !\is_resource($this->_socket)) { + $this->emitError(\WORKERMAN_CONNECT_FAIL, $errstr); + if ($this->_status === self::STATUS_CLOSING) { + $this->destroy(); + } + if ($this->_status === self::STATUS_CLOSED) { + $this->onConnect = null; + } + return; + } + // Add socket to global event loop waiting connection is successfully established or faild. + Worker::$globalEvent->add($this->_socket, EventInterface::EV_WRITE, array($this, 'checkConnection')); + // For windows. + if(\DIRECTORY_SEPARATOR === '\\') { + Worker::$globalEvent->add($this->_socket, EventInterface::EV_EXCEPT, array($this, 'checkConnection')); + } + } + + /** + * Reconnect. + * + * @param int $after + * @return void + */ + public function reconnect($after = 0) + { + $this->_status = self::STATUS_INITIAL; + static::$connections[$this->_id] = $this; + if ($this->_reconnectTimer) { + Timer::del($this->_reconnectTimer); + } + if ($after > 0) { + $this->_reconnectTimer = Timer::add($after, array($this, 'connect'), null, false); + return; + } + $this->connect(); + } + + /** + * CancelReconnect. + */ + public function cancelReconnect() + { + if ($this->_reconnectTimer) { + Timer::del($this->_reconnectTimer); + } + } + + /** + * Get remote address. + * + * @return string + */ + public function getRemoteHost() + { + return $this->_remoteHost; + } + + /** + * Get remote URI. + * + * @return string + */ + public function getRemoteURI() + { + return $this->_remoteURI; + } + + /** + * Try to emit onError callback. + * + * @param int $code + * @param string $msg + * @return void + */ + protected function emitError($code, $msg) + { + $this->_status = self::STATUS_CLOSING; + if ($this->onError) { + try { + \call_user_func($this->onError, $this, $code, $msg); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + } + + /** + * Check connection is successfully established or faild. + * + * @param resource $socket + * @return void + */ + public function checkConnection() + { + // Remove EV_EXPECT for windows. + if(\DIRECTORY_SEPARATOR === '\\') { + Worker::$globalEvent->del($this->_socket, EventInterface::EV_EXCEPT); + } + + // Remove write listener. + Worker::$globalEvent->del($this->_socket, EventInterface::EV_WRITE); + + if ($this->_status !== self::STATUS_CONNECTING) { + return; + } + + // Check socket state. + if ($address = \stream_socket_get_name($this->_socket, true)) { + // Nonblocking. + \stream_set_blocking($this->_socket, false); + // Compatible with hhvm + if (\function_exists('stream_set_read_buffer')) { + \stream_set_read_buffer($this->_socket, 0); + } + // Try to open keepalive for tcp and disable Nagle algorithm. + if (\function_exists('socket_import_stream') && $this->transport === 'tcp') { + $raw_socket = \socket_import_stream($this->_socket); + \socket_set_option($raw_socket, \SOL_SOCKET, \SO_KEEPALIVE, 1); + \socket_set_option($raw_socket, \SOL_TCP, \TCP_NODELAY, 1); + } + + // SSL handshake. + if ($this->transport === 'ssl') { + $this->_sslHandshakeCompleted = $this->doSslHandshake($this->_socket); + if ($this->_sslHandshakeCompleted === false) { + return; + } + } else { + // There are some data waiting to send. + if ($this->_sendBuffer) { + Worker::$globalEvent->add($this->_socket, EventInterface::EV_WRITE, array($this, 'baseWrite')); + } + } + + // Register a listener waiting read event. + Worker::$globalEvent->add($this->_socket, EventInterface::EV_READ, array($this, 'baseRead')); + + $this->_status = self::STATUS_ESTABLISHED; + $this->_remoteAddress = $address; + + // Try to emit onConnect callback. + if ($this->onConnect) { + try { + \call_user_func($this->onConnect, $this); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + // Try to emit protocol::onConnect + if ($this->protocol && \method_exists($this->protocol, 'onConnect')) { + try { + \call_user_func(array($this->protocol, 'onConnect'), $this); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + } else { + // Connection failed. + $this->emitError(\WORKERMAN_CONNECT_FAIL, 'connect ' . $this->_remoteAddress . ' fail after ' . round(\microtime(true) - $this->_connectStartTime, 4) . ' seconds'); + if ($this->_status === self::STATUS_CLOSING) { + $this->destroy(); + } + if ($this->_status === self::STATUS_CLOSED) { + $this->onConnect = null; + } + } + } +} diff --git a/vendor/workerman/workerman/Connection/AsyncUdpConnection.php b/vendor/workerman/workerman/Connection/AsyncUdpConnection.php new file mode 100644 index 0000000..745f060 --- /dev/null +++ b/vendor/workerman/workerman/Connection/AsyncUdpConnection.php @@ -0,0 +1,203 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Connection; + +use Workerman\Events\EventInterface; +use Workerman\Worker; +use \Exception; + +/** + * AsyncUdpConnection. + */ +class AsyncUdpConnection extends UdpConnection +{ + /** + * Emitted when socket connection is successfully established. + * + * @var callable + */ + public $onConnect = null; + + /** + * Emitted when socket connection closed. + * + * @var callable + */ + public $onClose = null; + + /** + * Connected or not. + * + * @var bool + */ + protected $connected = false; + + /** + * Context option. + * + * @var array + */ + protected $_contextOption = null; + + /** + * Construct. + * + * @param string $remote_address + * @throws Exception + */ + public function __construct($remote_address, $context_option = null) + { + // Get the application layer communication protocol and listening address. + list($scheme, $address) = \explode(':', $remote_address, 2); + // Check application layer protocol class. + if ($scheme !== 'udp') { + $scheme = \ucfirst($scheme); + $this->protocol = '\\Protocols\\' . $scheme; + if (!\class_exists($this->protocol)) { + $this->protocol = "\\Workerman\\Protocols\\$scheme"; + if (!\class_exists($this->protocol)) { + throw new Exception("class \\Protocols\\$scheme not exist"); + } + } + } + + $this->_remoteAddress = \substr($address, 2); + $this->_contextOption = $context_option; + } + + /** + * For udp package. + * + * @param resource $socket + * @return bool + */ + public function baseRead($socket) + { + $recv_buffer = \stream_socket_recvfrom($socket, Worker::MAX_UDP_PACKAGE_SIZE, 0, $remote_address); + if (false === $recv_buffer || empty($remote_address)) { + return false; + } + + if ($this->onMessage) { + if ($this->protocol) { + $parser = $this->protocol; + $recv_buffer = $parser::decode($recv_buffer, $this); + } + ++ConnectionInterface::$statistics['total_request']; + try { + \call_user_func($this->onMessage, $this, $recv_buffer); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + return true; + } + + /** + * Sends data on the connection. + * + * @param string $send_buffer + * @param bool $raw + * @return void|boolean + */ + public function send($send_buffer, $raw = false) + { + if (false === $raw && $this->protocol) { + $parser = $this->protocol; + $send_buffer = $parser::encode($send_buffer, $this); + if ($send_buffer === '') { + return; + } + } + if ($this->connected === false) { + $this->connect(); + } + return \strlen($send_buffer) === \stream_socket_sendto($this->_socket, $send_buffer, 0); + } + + + /** + * Close connection. + * + * @param mixed $data + * @param bool $raw + * + * @return bool + */ + public function close($data = null, $raw = false) + { + if ($data !== null) { + $this->send($data, $raw); + } + Worker::$globalEvent->del($this->_socket, EventInterface::EV_READ); + \fclose($this->_socket); + $this->connected = false; + // Try to emit onClose callback. + if ($this->onClose) { + try { + \call_user_func($this->onClose, $this); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + $this->onConnect = $this->onMessage = $this->onClose = null; + return true; + } + + /** + * Connect. + * + * @return void + */ + public function connect() + { + if ($this->connected === true) { + return; + } + if ($this->_contextOption) { + $context = \stream_context_create($this->_contextOption); + $this->_socket = \stream_socket_client("udp://{$this->_remoteAddress}", $errno, $errmsg, + 30, \STREAM_CLIENT_CONNECT, $context); + } else { + $this->_socket = \stream_socket_client("udp://{$this->_remoteAddress}", $errno, $errmsg); + } + + if (!$this->_socket) { + Worker::safeEcho(new \Exception($errmsg)); + return; + } + + \stream_set_blocking($this->_socket, false); + + if ($this->onMessage) { + Worker::$globalEvent->add($this->_socket, EventInterface::EV_READ, array($this, 'baseRead')); + } + $this->connected = true; + // Try to emit onConnect callback. + if ($this->onConnect) { + try { + \call_user_func($this->onConnect, $this); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + } + +} diff --git a/vendor/workerman/workerman/Connection/ConnectionInterface.php b/vendor/workerman/workerman/Connection/ConnectionInterface.php new file mode 100644 index 0000000..5d815d8 --- /dev/null +++ b/vendor/workerman/workerman/Connection/ConnectionInterface.php @@ -0,0 +1,126 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Connection; + +/** + * ConnectionInterface. + */ +#[\AllowDynamicProperties] +abstract class ConnectionInterface +{ + /** + * Statistics for status command. + * + * @var array + */ + public static $statistics = array( + 'connection_count' => 0, + 'total_request' => 0, + 'throw_exception' => 0, + 'send_fail' => 0, + ); + + /** + * Emitted when data is received. + * + * @var callable + */ + public $onMessage = null; + + /** + * Emitted when the other end of the socket sends a FIN packet. + * + * @var callable + */ + public $onClose = null; + + /** + * Emitted when an error occurs with connection. + * + * @var callable + */ + public $onError = null; + + /** + * Sends data on the connection. + * + * @param mixed $send_buffer + * @return void|boolean + */ + abstract public function send($send_buffer); + + /** + * Get remote IP. + * + * @return string + */ + abstract public function getRemoteIp(); + + /** + * Get remote port. + * + * @return int + */ + abstract public function getRemotePort(); + + /** + * Get remote address. + * + * @return string + */ + abstract public function getRemoteAddress(); + + /** + * Get local IP. + * + * @return string + */ + abstract public function getLocalIp(); + + /** + * Get local port. + * + * @return int + */ + abstract public function getLocalPort(); + + /** + * Get local address. + * + * @return string + */ + abstract public function getLocalAddress(); + + /** + * Is ipv4. + * + * @return bool + */ + abstract public function isIPv4(); + + /** + * Is ipv6. + * + * @return bool + */ + abstract public function isIPv6(); + + /** + * Close connection. + * + * @param string|null $data + * @return void + */ + abstract public function close($data = null); +} diff --git a/vendor/workerman/workerman/Connection/TcpConnection.php b/vendor/workerman/workerman/Connection/TcpConnection.php new file mode 100644 index 0000000..41bc2fd --- /dev/null +++ b/vendor/workerman/workerman/Connection/TcpConnection.php @@ -0,0 +1,982 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Connection; + +use Workerman\Events\EventInterface; +use Workerman\Worker; +use \Exception; + +/** + * TcpConnection. + */ +class TcpConnection extends ConnectionInterface +{ + /** + * Read buffer size. + * + * @var int + */ + const READ_BUFFER_SIZE = 65535; + + /** + * Status initial. + * + * @var int + */ + const STATUS_INITIAL = 0; + + /** + * Status connecting. + * + * @var int + */ + const STATUS_CONNECTING = 1; + + /** + * Status connection established. + * + * @var int + */ + const STATUS_ESTABLISHED = 2; + + /** + * Status closing. + * + * @var int + */ + const STATUS_CLOSING = 4; + + /** + * Status closed. + * + * @var int + */ + const STATUS_CLOSED = 8; + + /** + * Emitted when data is received. + * + * @var callable + */ + public $onMessage = null; + + /** + * Emitted when the other end of the socket sends a FIN packet. + * + * @var callable + */ + public $onClose = null; + + /** + * Emitted when an error occurs with connection. + * + * @var callable + */ + public $onError = null; + + /** + * Emitted when the send buffer becomes full. + * + * @var callable + */ + public $onBufferFull = null; + + /** + * Emitted when the send buffer becomes empty. + * + * @var callable + */ + public $onBufferDrain = null; + + /** + * Application layer protocol. + * The format is like this Workerman\\Protocols\\Http. + * + * @var \Workerman\Protocols\ProtocolInterface + */ + public $protocol = null; + + /** + * Transport (tcp/udp/unix/ssl). + * + * @var string + */ + public $transport = 'tcp'; + + /** + * Which worker belong to. + * + * @var Worker + */ + public $worker = null; + + /** + * Bytes read. + * + * @var int + */ + public $bytesRead = 0; + + /** + * Bytes written. + * + * @var int + */ + public $bytesWritten = 0; + + /** + * Connection->id. + * + * @var int + */ + public $id = 0; + + /** + * A copy of $worker->id which used to clean up the connection in worker->connections + * + * @var int + */ + protected $_id = 0; + + /** + * Sets the maximum send buffer size for the current connection. + * OnBufferFull callback will be emited When the send buffer is full. + * + * @var int + */ + public $maxSendBufferSize = 1048576; + + /** + * Context. + * + * @var array + */ + public $context = null; + + /** + * Default send buffer size. + * + * @var int + */ + public static $defaultMaxSendBufferSize = 1048576; + + /** + * Sets the maximum acceptable packet size for the current connection. + * + * @var int + */ + public $maxPackageSize = 1048576; + + /** + * Default maximum acceptable packet size. + * + * @var int + */ + public static $defaultMaxPackageSize = 10485760; + + /** + * Id recorder. + * + * @var int + */ + protected static $_idRecorder = 1; + + /** + * Socket + * + * @var resource + */ + protected $_socket = null; + + /** + * Send buffer. + * + * @var string + */ + protected $_sendBuffer = ''; + + /** + * Receive buffer. + * + * @var string + */ + protected $_recvBuffer = ''; + + /** + * Current package length. + * + * @var int + */ + protected $_currentPackageLength = 0; + + /** + * Connection status. + * + * @var int + */ + protected $_status = self::STATUS_ESTABLISHED; + + /** + * Remote address. + * + * @var string + */ + protected $_remoteAddress = ''; + + /** + * Is paused. + * + * @var bool + */ + protected $_isPaused = false; + + /** + * SSL handshake completed or not. + * + * @var bool + */ + protected $_sslHandshakeCompleted = false; + + /** + * All connection instances. + * + * @var array + */ + public static $connections = array(); + + /** + * Status to string. + * + * @var array + */ + public static $_statusToString = array( + self::STATUS_INITIAL => 'INITIAL', + self::STATUS_CONNECTING => 'CONNECTING', + self::STATUS_ESTABLISHED => 'ESTABLISHED', + self::STATUS_CLOSING => 'CLOSING', + self::STATUS_CLOSED => 'CLOSED', + ); + + /** + * Construct. + * + * @param resource $socket + * @param string $remote_address + */ + public function __construct($socket, $remote_address = '') + { + ++self::$statistics['connection_count']; + $this->id = $this->_id = self::$_idRecorder++; + if(self::$_idRecorder === \PHP_INT_MAX){ + self::$_idRecorder = 0; + } + $this->_socket = $socket; + \stream_set_blocking($this->_socket, 0); + // Compatible with hhvm + if (\function_exists('stream_set_read_buffer')) { + \stream_set_read_buffer($this->_socket, 0); + } + Worker::$globalEvent->add($this->_socket, EventInterface::EV_READ, array($this, 'baseRead')); + $this->maxSendBufferSize = self::$defaultMaxSendBufferSize; + $this->maxPackageSize = self::$defaultMaxPackageSize; + $this->_remoteAddress = $remote_address; + static::$connections[$this->id] = $this; + $this->context = new \stdClass; + } + + /** + * Get status. + * + * @param bool $raw_output + * + * @return int|string + */ + public function getStatus($raw_output = true) + { + if ($raw_output) { + return $this->_status; + } + return self::$_statusToString[$this->_status]; + } + + /** + * Sends data on the connection. + * + * @param mixed $send_buffer + * @param bool $raw + * @return bool|null + */ + public function send($send_buffer, $raw = false) + { + if ($this->_status === self::STATUS_CLOSING || $this->_status === self::STATUS_CLOSED) { + return false; + } + + // Try to call protocol::encode($send_buffer) before sending. + if (false === $raw && $this->protocol !== null) { + $parser = $this->protocol; + $send_buffer = $parser::encode($send_buffer, $this); + if ($send_buffer === '') { + return; + } + } + + if ($this->_status !== self::STATUS_ESTABLISHED || + ($this->transport === 'ssl' && $this->_sslHandshakeCompleted !== true) + ) { + if ($this->_sendBuffer && $this->bufferIsFull()) { + ++self::$statistics['send_fail']; + return false; + } + $this->_sendBuffer .= $send_buffer; + $this->checkBufferWillFull(); + return; + } + + // Attempt to send data directly. + if ($this->_sendBuffer === '') { + if ($this->transport === 'ssl') { + Worker::$globalEvent->add($this->_socket, EventInterface::EV_WRITE, array($this, 'baseWrite')); + $this->_sendBuffer = $send_buffer; + $this->checkBufferWillFull(); + return; + } + $len = 0; + try { + $len = @\fwrite($this->_socket, $send_buffer); + } catch (\Exception $e) { + Worker::log($e); + } catch (\Error $e) { + Worker::log($e); + } + // send successful. + if ($len === \strlen($send_buffer)) { + $this->bytesWritten += $len; + return true; + } + // Send only part of the data. + if ($len > 0) { + $this->_sendBuffer = \substr($send_buffer, $len); + $this->bytesWritten += $len; + } else { + // Connection closed? + if (!\is_resource($this->_socket) || \feof($this->_socket)) { + ++self::$statistics['send_fail']; + if ($this->onError) { + try { + \call_user_func($this->onError, $this, \WORKERMAN_SEND_FAIL, 'client closed'); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + $this->destroy(); + return false; + } + $this->_sendBuffer = $send_buffer; + } + Worker::$globalEvent->add($this->_socket, EventInterface::EV_WRITE, array($this, 'baseWrite')); + // Check if the send buffer will be full. + $this->checkBufferWillFull(); + return; + } + + if ($this->bufferIsFull()) { + ++self::$statistics['send_fail']; + return false; + } + + $this->_sendBuffer .= $send_buffer; + // Check if the send buffer is full. + $this->checkBufferWillFull(); + } + + /** + * Get remote IP. + * + * @return string + */ + public function getRemoteIp() + { + $pos = \strrpos($this->_remoteAddress, ':'); + if ($pos) { + return (string) \substr($this->_remoteAddress, 0, $pos); + } + return ''; + } + + /** + * Get remote port. + * + * @return int + */ + public function getRemotePort() + { + if ($this->_remoteAddress) { + return (int) \substr(\strrchr($this->_remoteAddress, ':'), 1); + } + return 0; + } + + /** + * Get remote address. + * + * @return string + */ + public function getRemoteAddress() + { + return $this->_remoteAddress; + } + + /** + * Get local IP. + * + * @return string + */ + public function getLocalIp() + { + $address = $this->getLocalAddress(); + $pos = \strrpos($address, ':'); + if (!$pos) { + return ''; + } + return \substr($address, 0, $pos); + } + + /** + * Get local port. + * + * @return int + */ + public function getLocalPort() + { + $address = $this->getLocalAddress(); + $pos = \strrpos($address, ':'); + if (!$pos) { + return 0; + } + return (int)\substr(\strrchr($address, ':'), 1); + } + + /** + * Get local address. + * + * @return string + */ + public function getLocalAddress() + { + if (!\is_resource($this->_socket)) { + return ''; + } + return (string)@\stream_socket_get_name($this->_socket, false); + } + + /** + * Get send buffer queue size. + * + * @return integer + */ + public function getSendBufferQueueSize() + { + return \strlen($this->_sendBuffer); + } + + /** + * Get recv buffer queue size. + * + * @return integer + */ + public function getRecvBufferQueueSize() + { + return \strlen($this->_recvBuffer); + } + + /** + * Is ipv4. + * + * return bool. + */ + public function isIpV4() + { + if ($this->transport === 'unix') { + return false; + } + return \strpos($this->getRemoteIp(), ':') === false; + } + + /** + * Is ipv6. + * + * return bool. + */ + public function isIpV6() + { + if ($this->transport === 'unix') { + return false; + } + return \strpos($this->getRemoteIp(), ':') !== false; + } + + /** + * Pauses the reading of data. That is onMessage will not be emitted. Useful to throttle back an upload. + * + * @return void + */ + public function pauseRecv() + { + Worker::$globalEvent->del($this->_socket, EventInterface::EV_READ); + $this->_isPaused = true; + } + + /** + * Resumes reading after a call to pauseRecv. + * + * @return void + */ + public function resumeRecv() + { + if ($this->_isPaused === true) { + Worker::$globalEvent->add($this->_socket, EventInterface::EV_READ, array($this, 'baseRead')); + $this->_isPaused = false; + $this->baseRead($this->_socket, false); + } + } + + + + /** + * Base read handler. + * + * @param resource $socket + * @param bool $check_eof + * @return void + */ + public function baseRead($socket, $check_eof = true) + { + // SSL handshake. + if ($this->transport === 'ssl' && $this->_sslHandshakeCompleted !== true) { + if ($this->doSslHandshake($socket)) { + $this->_sslHandshakeCompleted = true; + if ($this->_sendBuffer) { + Worker::$globalEvent->add($socket, EventInterface::EV_WRITE, array($this, 'baseWrite')); + } + } else { + return; + } + } + + $buffer = ''; + try { + $buffer = @\fread($socket, self::READ_BUFFER_SIZE); + } catch (\Exception $e) {} catch (\Error $e) {} + + // Check connection closed. + if ($buffer === '' || $buffer === false) { + if ($check_eof && (\feof($socket) || !\is_resource($socket) || $buffer === false)) { + $this->destroy(); + return; + } + } else { + $this->bytesRead += \strlen($buffer); + $this->_recvBuffer .= $buffer; + } + + // If the application layer protocol has been set up. + if ($this->protocol !== null) { + $parser = $this->protocol; + while ($this->_recvBuffer !== '' && !$this->_isPaused) { + // The current packet length is known. + if ($this->_currentPackageLength) { + // Data is not enough for a package. + if ($this->_currentPackageLength > \strlen($this->_recvBuffer)) { + break; + } + } else { + // Get current package length. + try { + $this->_currentPackageLength = $parser::input($this->_recvBuffer, $this); + } catch (\Exception $e) {} catch (\Error $e) {} + // The packet length is unknown. + if ($this->_currentPackageLength === 0) { + break; + } elseif ($this->_currentPackageLength > 0 && $this->_currentPackageLength <= $this->maxPackageSize) { + // Data is not enough for a package. + if ($this->_currentPackageLength > \strlen($this->_recvBuffer)) { + break; + } + } // Wrong package. + else { + Worker::safeEcho('Error package. package_length=' . \var_export($this->_currentPackageLength, true)); + $this->destroy(); + return; + } + } + + // The data is enough for a packet. + ++self::$statistics['total_request']; + // The current packet length is equal to the length of the buffer. + if (\strlen($this->_recvBuffer) === $this->_currentPackageLength) { + $one_request_buffer = $this->_recvBuffer; + $this->_recvBuffer = ''; + } else { + // Get a full package from the buffer. + $one_request_buffer = \substr($this->_recvBuffer, 0, $this->_currentPackageLength); + // Remove the current package from the receive buffer. + $this->_recvBuffer = \substr($this->_recvBuffer, $this->_currentPackageLength); + } + // Reset the current packet length to 0. + $this->_currentPackageLength = 0; + if (!$this->onMessage) { + continue; + } + try { + // Decode request buffer before Emitting onMessage callback. + \call_user_func($this->onMessage, $this, $parser::decode($one_request_buffer, $this)); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + return; + } + + if ($this->_recvBuffer === '' || $this->_isPaused) { + return; + } + + // Applications protocol is not set. + ++self::$statistics['total_request']; + if (!$this->onMessage) { + $this->_recvBuffer = ''; + return; + } + try { + \call_user_func($this->onMessage, $this, $this->_recvBuffer); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + // Clean receive buffer. + $this->_recvBuffer = ''; + } + + /** + * Base write handler. + * + * @return void|bool + */ + public function baseWrite() + { + \set_error_handler(function(){}); + if ($this->transport === 'ssl') { + $len = @\fwrite($this->_socket, $this->_sendBuffer, 8192); + } else { + $len = @\fwrite($this->_socket, $this->_sendBuffer); + } + \restore_error_handler(); + if ($len === \strlen($this->_sendBuffer)) { + $this->bytesWritten += $len; + Worker::$globalEvent->del($this->_socket, EventInterface::EV_WRITE); + $this->_sendBuffer = ''; + // Try to emit onBufferDrain callback when the send buffer becomes empty. + if ($this->onBufferDrain) { + try { + \call_user_func($this->onBufferDrain, $this); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + if ($this->_status === self::STATUS_CLOSING) { + $this->destroy(); + } + return true; + } + if ($len > 0) { + $this->bytesWritten += $len; + $this->_sendBuffer = \substr($this->_sendBuffer, $len); + } else { + ++self::$statistics['send_fail']; + $this->destroy(); + } + } + + /** + * SSL handshake. + * + * @param resource $socket + * @return bool + */ + public function doSslHandshake($socket){ + if (\feof($socket)) { + $this->destroy(); + return false; + } + $async = $this instanceof AsyncTcpConnection; + + /** + * We disabled ssl3 because https://blog.qualys.com/ssllabs/2014/10/15/ssl-3-is-dead-killed-by-the-poodle-attack. + * You can enable ssl3 by the codes below. + */ + /*if($async){ + $type = STREAM_CRYPTO_METHOD_SSLv2_CLIENT | STREAM_CRYPTO_METHOD_SSLv23_CLIENT | STREAM_CRYPTO_METHOD_SSLv3_CLIENT; + }else{ + $type = STREAM_CRYPTO_METHOD_SSLv2_SERVER | STREAM_CRYPTO_METHOD_SSLv23_SERVER | STREAM_CRYPTO_METHOD_SSLv3_SERVER; + }*/ + + if($async){ + $type = \STREAM_CRYPTO_METHOD_SSLv2_CLIENT | \STREAM_CRYPTO_METHOD_SSLv23_CLIENT; + }else{ + $type = \STREAM_CRYPTO_METHOD_SSLv2_SERVER | \STREAM_CRYPTO_METHOD_SSLv23_SERVER; + } + + // Hidden error. + \set_error_handler(function($errno, $errstr, $file){ + if (!Worker::$daemonize) { + Worker::safeEcho("SSL handshake error: $errstr \n"); + } + }); + $ret = \stream_socket_enable_crypto($socket, true, $type); + \restore_error_handler(); + // Negotiation has failed. + if (false === $ret) { + $this->destroy(); + return false; + } elseif (0 === $ret) { + // There isn't enough data and should try again. + return 0; + } + if (isset($this->onSslHandshake)) { + try { + \call_user_func($this->onSslHandshake, $this); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + return true; + } + + /** + * This method pulls all the data out of a readable stream, and writes it to the supplied destination. + * + * @param self $dest + * @return void + */ + public function pipe(self $dest) + { + $source = $this; + $this->onMessage = function ($source, $data) use ($dest) { + $dest->send($data); + }; + $this->onClose = function ($source) use ($dest) { + $dest->close(); + }; + $dest->onBufferFull = function ($dest) use ($source) { + $source->pauseRecv(); + }; + $dest->onBufferDrain = function ($dest) use ($source) { + $source->resumeRecv(); + }; + } + + /** + * Remove $length of data from receive buffer. + * + * @param int $length + * @return void + */ + public function consumeRecvBuffer($length) + { + $this->_recvBuffer = \substr($this->_recvBuffer, $length); + } + + /** + * Close connection. + * + * @param mixed $data + * @param bool $raw + * @return void + */ + public function close($data = null, $raw = false) + { + if($this->_status === self::STATUS_CONNECTING){ + $this->destroy(); + return; + } + + if ($this->_status === self::STATUS_CLOSING || $this->_status === self::STATUS_CLOSED) { + return; + } + + if ($data !== null) { + $this->send($data, $raw); + } + + $this->_status = self::STATUS_CLOSING; + + if ($this->_sendBuffer === '') { + $this->destroy(); + } else { + $this->pauseRecv(); + } + } + + /** + * Get the real socket. + * + * @return resource + */ + public function getSocket() + { + return $this->_socket; + } + + /** + * Check whether the send buffer will be full. + * + * @return void + */ + protected function checkBufferWillFull() + { + if ($this->maxSendBufferSize <= \strlen($this->_sendBuffer)) { + if ($this->onBufferFull) { + try { + \call_user_func($this->onBufferFull, $this); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + } + } + + /** + * Whether send buffer is full. + * + * @return bool + */ + protected function bufferIsFull() + { + // Buffer has been marked as full but still has data to send then the packet is discarded. + if ($this->maxSendBufferSize <= \strlen($this->_sendBuffer)) { + if ($this->onError) { + try { + \call_user_func($this->onError, $this, \WORKERMAN_SEND_FAIL, 'send buffer full and drop package'); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + return true; + } + return false; + } + + /** + * Whether send buffer is Empty. + * + * @return bool + */ + public function bufferIsEmpty() + { + return empty($this->_sendBuffer); + } + + /** + * Destroy connection. + * + * @return void + */ + public function destroy() + { + // Avoid repeated calls. + if ($this->_status === self::STATUS_CLOSED) { + return; + } + // Remove event listener. + Worker::$globalEvent->del($this->_socket, EventInterface::EV_READ); + Worker::$globalEvent->del($this->_socket, EventInterface::EV_WRITE); + + // Close socket. + try { + @\fclose($this->_socket); + } catch (\Exception $e) {} catch (\Error $e) {} + + $this->_status = self::STATUS_CLOSED; + // Try to emit onClose callback. + if ($this->onClose) { + try { + \call_user_func($this->onClose, $this); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + // Try to emit protocol::onClose + if ($this->protocol && \method_exists($this->protocol, 'onClose')) { + try { + \call_user_func(array($this->protocol, 'onClose'), $this); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + $this->_sendBuffer = $this->_recvBuffer = ''; + $this->_currentPackageLength = 0; + $this->_isPaused = $this->_sslHandshakeCompleted = false; + if ($this->_status === self::STATUS_CLOSED) { + // Cleaning up the callback to avoid memory leaks. + $this->onMessage = $this->onClose = $this->onError = $this->onBufferFull = $this->onBufferDrain = null; + // Remove from worker->connections. + if ($this->worker) { + unset($this->worker->connections[$this->_id]); + } + unset(static::$connections[$this->_id]); + } + } + + /** + * Destruct. + * + * @return void + */ + public function __destruct() + { + static $mod; + self::$statistics['connection_count']--; + if (Worker::getGracefulStop()) { + if (!isset($mod)) { + $mod = \ceil((self::$statistics['connection_count'] + 1) / 3); + } + + if (0 === self::$statistics['connection_count'] % $mod) { + Worker::log('worker[' . \posix_getpid() . '] remains ' . self::$statistics['connection_count'] . ' connection(s)'); + } + + if(0 === self::$statistics['connection_count']) { + Worker::stopAll(); + } + } + } +} diff --git a/vendor/workerman/workerman/Connection/UdpConnection.php b/vendor/workerman/workerman/Connection/UdpConnection.php new file mode 100644 index 0000000..9cd95ba --- /dev/null +++ b/vendor/workerman/workerman/Connection/UdpConnection.php @@ -0,0 +1,208 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Connection; + +/** + * UdpConnection. + */ +class UdpConnection extends ConnectionInterface +{ + /** + * Application layer protocol. + * The format is like this Workerman\\Protocols\\Http. + * + * @var \Workerman\Protocols\ProtocolInterface + */ + public $protocol = null; + + /** + * Transport layer protocol. + * + * @var string + */ + public $transport = 'udp'; + + /** + * Udp socket. + * + * @var resource + */ + protected $_socket = null; + + /** + * Remote address. + * + * @var string + */ + protected $_remoteAddress = ''; + + /** + * Construct. + * + * @param resource $socket + * @param string $remote_address + */ + public function __construct($socket, $remote_address) + { + $this->_socket = $socket; + $this->_remoteAddress = $remote_address; + } + + /** + * Sends data on the connection. + * + * @param string $send_buffer + * @param bool $raw + * @return void|boolean + */ + public function send($send_buffer, $raw = false) + { + if (false === $raw && $this->protocol) { + $parser = $this->protocol; + $send_buffer = $parser::encode($send_buffer, $this); + if ($send_buffer === '') { + return; + } + } + return \strlen($send_buffer) === \stream_socket_sendto($this->_socket, $send_buffer, 0, $this->isIpV6() ? '[' . $this->getRemoteIp() . ']:' . $this->getRemotePort() : $this->_remoteAddress); + } + + /** + * Get remote IP. + * + * @return string + */ + public function getRemoteIp() + { + $pos = \strrpos($this->_remoteAddress, ':'); + if ($pos) { + return \trim(\substr($this->_remoteAddress, 0, $pos), '[]'); + } + return ''; + } + + /** + * Get remote port. + * + * @return int + */ + public function getRemotePort() + { + if ($this->_remoteAddress) { + return (int)\substr(\strrchr($this->_remoteAddress, ':'), 1); + } + return 0; + } + + /** + * Get remote address. + * + * @return string + */ + public function getRemoteAddress() + { + return $this->_remoteAddress; + } + + /** + * Get local IP. + * + * @return string + */ + public function getLocalIp() + { + $address = $this->getLocalAddress(); + $pos = \strrpos($address, ':'); + if (!$pos) { + return ''; + } + return \substr($address, 0, $pos); + } + + /** + * Get local port. + * + * @return int + */ + public function getLocalPort() + { + $address = $this->getLocalAddress(); + $pos = \strrpos($address, ':'); + if (!$pos) { + return 0; + } + return (int)\substr(\strrchr($address, ':'), 1); + } + + /** + * Get local address. + * + * @return string + */ + public function getLocalAddress() + { + return (string)@\stream_socket_get_name($this->_socket, false); + } + + /** + * Is ipv4. + * + * @return bool. + */ + public function isIpV4() + { + if ($this->transport === 'unix') { + return false; + } + return \strpos($this->getRemoteIp(), ':') === false; + } + + /** + * Is ipv6. + * + * @return bool. + */ + public function isIpV6() + { + if ($this->transport === 'unix') { + return false; + } + return \strpos($this->getRemoteIp(), ':') !== false; + } + + /** + * Close connection. + * + * @param mixed $data + * @param bool $raw + * @return bool + */ + public function close($data = null, $raw = false) + { + if ($data !== null) { + $this->send($data, $raw); + } + return true; + } + + /** + * Get the real socket. + * + * @return resource + */ + public function getSocket() + { + return $this->_socket; + } +} diff --git a/vendor/workerman/workerman/Events/Ev.php b/vendor/workerman/workerman/Events/Ev.php new file mode 100644 index 0000000..82c9bdf --- /dev/null +++ b/vendor/workerman/workerman/Events/Ev.php @@ -0,0 +1,191 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author 有个鬼<42765633@qq.com> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Events; + +use Workerman\Worker; +use \EvWatcher; + +/** + * ev eventloop + */ +class Ev implements EventInterface +{ + /** + * All listeners for read/write event. + * + * @var array + */ + protected $_allEvents = array(); + + /** + * Event listeners of signal. + * + * @var array + */ + protected $_eventSignal = array(); + + /** + * All timer event listeners. + * [func, args, event, flag, time_interval] + * + * @var array + */ + protected $_eventTimer = array(); + + /** + * Timer id. + * + * @var int + */ + protected static $_timerId = 1; + + /** + * Add a timer. + * {@inheritdoc} + */ + public function add($fd, $flag, $func, $args = null) + { + $callback = function ($event, $socket) use ($fd, $func) { + try { + \call_user_func($func, $fd); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + }; + switch ($flag) { + case self::EV_SIGNAL: + $event = new \EvSignal($fd, $callback); + $this->_eventSignal[$fd] = $event; + return true; + case self::EV_TIMER: + case self::EV_TIMER_ONCE: + $repeat = $flag === self::EV_TIMER_ONCE ? 0 : $fd; + $param = array($func, (array)$args, $flag, $fd, self::$_timerId); + $event = new \EvTimer($fd, $repeat, array($this, 'timerCallback'), $param); + $this->_eventTimer[self::$_timerId] = $event; + return self::$_timerId++; + default : + $fd_key = (int)$fd; + $real_flag = $flag === self::EV_READ ? \Ev::READ : \Ev::WRITE; + $event = new \EvIo($fd, $real_flag, $callback); + $this->_allEvents[$fd_key][$flag] = $event; + return true; + } + + } + + /** + * Remove a timer. + * {@inheritdoc} + */ + public function del($fd, $flag) + { + switch ($flag) { + case self::EV_READ: + case self::EV_WRITE: + $fd_key = (int)$fd; + if (isset($this->_allEvents[$fd_key][$flag])) { + $this->_allEvents[$fd_key][$flag]->stop(); + unset($this->_allEvents[$fd_key][$flag]); + } + if (empty($this->_allEvents[$fd_key])) { + unset($this->_allEvents[$fd_key]); + } + break; + case self::EV_SIGNAL: + $fd_key = (int)$fd; + if (isset($this->_eventSignal[$fd_key])) { + $this->_eventSignal[$fd_key]->stop(); + unset($this->_eventSignal[$fd_key]); + } + break; + case self::EV_TIMER: + case self::EV_TIMER_ONCE: + if (isset($this->_eventTimer[$fd])) { + $this->_eventTimer[$fd]->stop(); + unset($this->_eventTimer[$fd]); + } + break; + } + return true; + } + + /** + * Timer callback. + * + * @param EvWatcher $event + */ + public function timerCallback(EvWatcher $event) + { + $param = $event->data; + $timer_id = $param[4]; + if ($param[2] === self::EV_TIMER_ONCE) { + $this->_eventTimer[$timer_id]->stop(); + unset($this->_eventTimer[$timer_id]); + } + try { + \call_user_func_array($param[0], $param[1]); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + + /** + * Remove all timers. + * + * @return void + */ + public function clearAllTimer() + { + foreach ($this->_eventTimer as $event) { + $event->stop(); + } + $this->_eventTimer = array(); + } + + /** + * Main loop. + * + * @see EventInterface::loop() + */ + public function loop() + { + \Ev::run(); + } + + /** + * Destroy loop. + * + * @return void + */ + public function destroy() + { + foreach ($this->_allEvents as $event) { + $event->stop(); + } + } + + /** + * Get timer count. + * + * @return integer + */ + public function getTimerCount() + { + return \count($this->_eventTimer); + } +} diff --git a/vendor/workerman/workerman/Events/Event.php b/vendor/workerman/workerman/Events/Event.php new file mode 100644 index 0000000..9e25521 --- /dev/null +++ b/vendor/workerman/workerman/Events/Event.php @@ -0,0 +1,215 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author 有个鬼<42765633@qq.com> + * @copyright 有个鬼<42765633@qq.com> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Events; + +use Workerman\Worker; + +/** + * libevent eventloop + */ +class Event implements EventInterface +{ + /** + * Event base. + * @var object + */ + protected $_eventBase = null; + + /** + * All listeners for read/write event. + * @var array + */ + protected $_allEvents = array(); + + /** + * Event listeners of signal. + * @var array + */ + protected $_eventSignal = array(); + + /** + * All timer event listeners. + * [func, args, event, flag, time_interval] + * @var array + */ + protected $_eventTimer = array(); + + /** + * Timer id. + * @var int + */ + protected static $_timerId = 1; + + /** + * construct + * @return void + */ + public function __construct() + { + if (\class_exists('\\\\EventBase', false)) { + $class_name = '\\\\EventBase'; + } else { + $class_name = '\EventBase'; + } + $this->_eventBase = new $class_name(); + } + + /** + * @see EventInterface::add() + */ + public function add($fd, $flag, $func, $args=array()) + { + if (\class_exists('\\\\Event', false)) { + $class_name = '\\\\Event'; + } else { + $class_name = '\Event'; + } + switch ($flag) { + case self::EV_SIGNAL: + + $fd_key = (int)$fd; + $event = $class_name::signal($this->_eventBase, $fd, $func); + if (!$event||!$event->add()) { + return false; + } + $this->_eventSignal[$fd_key] = $event; + return true; + + case self::EV_TIMER: + case self::EV_TIMER_ONCE: + + $param = array($func, (array)$args, $flag, $fd, self::$_timerId); + $event = new $class_name($this->_eventBase, -1, $class_name::TIMEOUT|$class_name::PERSIST, array($this, "timerCallback"), $param); + if (!$event||!$event->addTimer($fd)) { + return false; + } + $this->_eventTimer[self::$_timerId] = $event; + return self::$_timerId++; + + default : + $fd_key = (int)$fd; + $real_flag = $flag === self::EV_READ ? $class_name::READ | $class_name::PERSIST : $class_name::WRITE | $class_name::PERSIST; + $event = new $class_name($this->_eventBase, $fd, $real_flag, $func, $fd); + if (!$event||!$event->add()) { + return false; + } + $this->_allEvents[$fd_key][$flag] = $event; + return true; + } + } + + /** + * @see Events\EventInterface::del() + */ + public function del($fd, $flag) + { + switch ($flag) { + + case self::EV_READ: + case self::EV_WRITE: + + $fd_key = (int)$fd; + if (isset($this->_allEvents[$fd_key][$flag])) { + $this->_allEvents[$fd_key][$flag]->del(); + unset($this->_allEvents[$fd_key][$flag]); + } + if (empty($this->_allEvents[$fd_key])) { + unset($this->_allEvents[$fd_key]); + } + break; + + case self::EV_SIGNAL: + $fd_key = (int)$fd; + if (isset($this->_eventSignal[$fd_key])) { + $this->_eventSignal[$fd_key]->del(); + unset($this->_eventSignal[$fd_key]); + } + break; + + case self::EV_TIMER: + case self::EV_TIMER_ONCE: + if (isset($this->_eventTimer[$fd])) { + $this->_eventTimer[$fd]->del(); + unset($this->_eventTimer[$fd]); + } + break; + } + return true; + } + + /** + * Timer callback. + * @param int|null $fd + * @param int $what + * @param int $timer_id + */ + public function timerCallback($fd, $what, $param) + { + $timer_id = $param[4]; + + if ($param[2] === self::EV_TIMER_ONCE) { + $this->_eventTimer[$timer_id]->del(); + unset($this->_eventTimer[$timer_id]); + } + + try { + \call_user_func_array($param[0], $param[1]); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + + /** + * @see Events\EventInterface::clearAllTimer() + * @return void + */ + public function clearAllTimer() + { + foreach ($this->_eventTimer as $event) { + $event->del(); + } + $this->_eventTimer = array(); + } + + + /** + * @see EventInterface::loop() + */ + public function loop() + { + $this->_eventBase->loop(); + } + + /** + * Destroy loop. + * + * @return void + */ + public function destroy() + { + $this->_eventBase->exit(); + } + + /** + * Get timer count. + * + * @return integer + */ + public function getTimerCount() + { + return \count($this->_eventTimer); + } +} diff --git a/vendor/workerman/workerman/Events/EventInterface.php b/vendor/workerman/workerman/Events/EventInterface.php new file mode 100644 index 0000000..e6f59c6 --- /dev/null +++ b/vendor/workerman/workerman/Events/EventInterface.php @@ -0,0 +1,107 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Events; + +interface EventInterface +{ + /** + * Read event. + * + * @var int + */ + const EV_READ = 1; + + /** + * Write event. + * + * @var int + */ + const EV_WRITE = 2; + + /** + * Except event + * + * @var int + */ + const EV_EXCEPT = 3; + + /** + * Signal event. + * + * @var int + */ + const EV_SIGNAL = 4; + + /** + * Timer event. + * + * @var int + */ + const EV_TIMER = 8; + + /** + * Timer once event. + * + * @var int + */ + const EV_TIMER_ONCE = 16; + + /** + * Add event listener to event loop. + * + * @param mixed $fd + * @param int $flag + * @param callable $func + * @param array $args + * @return bool + */ + public function add($fd, $flag, $func, $args = array()); + + /** + * Remove event listener from event loop. + * + * @param mixed $fd + * @param int $flag + * @return bool + */ + public function del($fd, $flag); + + /** + * Remove all timers. + * + * @return void + */ + public function clearAllTimer(); + + /** + * Main loop. + * + * @return void + */ + public function loop(); + + /** + * Destroy loop. + * + * @return mixed + */ + public function destroy(); + + /** + * Get Timer count. + * + * @return mixed + */ + public function getTimerCount(); +} diff --git a/vendor/workerman/workerman/Events/Libevent.php b/vendor/workerman/workerman/Events/Libevent.php new file mode 100644 index 0000000..5f61e9c --- /dev/null +++ b/vendor/workerman/workerman/Events/Libevent.php @@ -0,0 +1,225 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Events; + +use Workerman\Worker; + +/** + * libevent eventloop + */ +class Libevent implements EventInterface +{ + /** + * Event base. + * + * @var resource + */ + protected $_eventBase = null; + + /** + * All listeners for read/write event. + * + * @var array + */ + protected $_allEvents = array(); + + /** + * Event listeners of signal. + * + * @var array + */ + protected $_eventSignal = array(); + + /** + * All timer event listeners. + * [func, args, event, flag, time_interval] + * + * @var array + */ + protected $_eventTimer = array(); + + /** + * construct + */ + public function __construct() + { + $this->_eventBase = \event_base_new(); + } + + /** + * {@inheritdoc} + */ + public function add($fd, $flag, $func, $args = array()) + { + switch ($flag) { + case self::EV_SIGNAL: + $fd_key = (int)$fd; + $real_flag = \EV_SIGNAL | \EV_PERSIST; + $this->_eventSignal[$fd_key] = \event_new(); + if (!\event_set($this->_eventSignal[$fd_key], $fd, $real_flag, $func, null)) { + return false; + } + if (!\event_base_set($this->_eventSignal[$fd_key], $this->_eventBase)) { + return false; + } + if (!\event_add($this->_eventSignal[$fd_key])) { + return false; + } + return true; + case self::EV_TIMER: + case self::EV_TIMER_ONCE: + $event = \event_new(); + $timer_id = (int)$event; + if (!\event_set($event, 0, \EV_TIMEOUT, array($this, 'timerCallback'), $timer_id)) { + return false; + } + + if (!\event_base_set($event, $this->_eventBase)) { + return false; + } + + $time_interval = $fd * 1000000; + if (!\event_add($event, $time_interval)) { + return false; + } + $this->_eventTimer[$timer_id] = array($func, (array)$args, $event, $flag, $time_interval); + return $timer_id; + + default : + $fd_key = (int)$fd; + $real_flag = $flag === self::EV_READ ? \EV_READ | \EV_PERSIST : \EV_WRITE | \EV_PERSIST; + + $event = \event_new(); + + if (!\event_set($event, $fd, $real_flag, $func, null)) { + return false; + } + + if (!\event_base_set($event, $this->_eventBase)) { + return false; + } + + if (!\event_add($event)) { + return false; + } + + $this->_allEvents[$fd_key][$flag] = $event; + + return true; + } + + } + + /** + * {@inheritdoc} + */ + public function del($fd, $flag) + { + switch ($flag) { + case self::EV_READ: + case self::EV_WRITE: + $fd_key = (int)$fd; + if (isset($this->_allEvents[$fd_key][$flag])) { + \event_del($this->_allEvents[$fd_key][$flag]); + unset($this->_allEvents[$fd_key][$flag]); + } + if (empty($this->_allEvents[$fd_key])) { + unset($this->_allEvents[$fd_key]); + } + break; + case self::EV_SIGNAL: + $fd_key = (int)$fd; + if (isset($this->_eventSignal[$fd_key])) { + \event_del($this->_eventSignal[$fd_key]); + unset($this->_eventSignal[$fd_key]); + } + break; + case self::EV_TIMER: + case self::EV_TIMER_ONCE: + // 这里 fd 为timerid + if (isset($this->_eventTimer[$fd])) { + \event_del($this->_eventTimer[$fd][2]); + unset($this->_eventTimer[$fd]); + } + break; + } + return true; + } + + /** + * Timer callback. + * + * @param mixed $_null1 + * @param int $_null2 + * @param mixed $timer_id + */ + protected function timerCallback($_null1, $_null2, $timer_id) + { + if ($this->_eventTimer[$timer_id][3] === self::EV_TIMER) { + \event_add($this->_eventTimer[$timer_id][2], $this->_eventTimer[$timer_id][4]); + } + try { + \call_user_func_array($this->_eventTimer[$timer_id][0], $this->_eventTimer[$timer_id][1]); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + if (isset($this->_eventTimer[$timer_id]) && $this->_eventTimer[$timer_id][3] === self::EV_TIMER_ONCE) { + $this->del($timer_id, self::EV_TIMER_ONCE); + } + } + + /** + * {@inheritdoc} + */ + public function clearAllTimer() + { + foreach ($this->_eventTimer as $task_data) { + \event_del($task_data[2]); + } + $this->_eventTimer = array(); + } + + /** + * {@inheritdoc} + */ + public function loop() + { + \event_base_loop($this->_eventBase); + } + + /** + * Destroy loop. + * + * @return void + */ + public function destroy() + { + foreach ($this->_eventSignal as $event) { + \event_del($event); + } + } + + /** + * Get timer count. + * + * @return integer + */ + public function getTimerCount() + { + return \count($this->_eventTimer); + } +} + diff --git a/vendor/workerman/workerman/Events/React/Base.php b/vendor/workerman/workerman/Events/React/Base.php new file mode 100644 index 0000000..bce4f73 --- /dev/null +++ b/vendor/workerman/workerman/Events/React/Base.php @@ -0,0 +1,264 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Events\React; + +use Workerman\Events\EventInterface; +use React\EventLoop\TimerInterface; +use React\EventLoop\LoopInterface; + +/** + * Class StreamSelectLoop + * @package Workerman\Events\React + */ +class Base implements LoopInterface +{ + /** + * @var array + */ + protected $_timerIdMap = array(); + + /** + * @var int + */ + protected $_timerIdIndex = 0; + + /** + * @var array + */ + protected $_signalHandlerMap = array(); + + /** + * @var LoopInterface + */ + protected $_eventLoop = null; + + /** + * Base constructor. + */ + public function __construct() + { + $this->_eventLoop = new \React\EventLoop\StreamSelectLoop(); + } + + /** + * Add event listener to event loop. + * + * @param int $fd + * @param int $flag + * @param callable $func + * @param array $args + * @return bool + */ + public function add($fd, $flag, $func, array $args = array()) + { + $args = (array)$args; + switch ($flag) { + case EventInterface::EV_READ: + return $this->addReadStream($fd, $func); + case EventInterface::EV_WRITE: + return $this->addWriteStream($fd, $func); + case EventInterface::EV_SIGNAL: + if (isset($this->_signalHandlerMap[$fd])) { + $this->removeSignal($fd, $this->_signalHandlerMap[$fd]); + } + $this->_signalHandlerMap[$fd] = $func; + return $this->addSignal($fd, $func); + case EventInterface::EV_TIMER: + $timer_obj = $this->addPeriodicTimer($fd, function() use ($func, $args) { + \call_user_func_array($func, $args); + }); + $this->_timerIdMap[++$this->_timerIdIndex] = $timer_obj; + return $this->_timerIdIndex; + case EventInterface::EV_TIMER_ONCE: + $index = ++$this->_timerIdIndex; + $timer_obj = $this->addTimer($fd, function() use ($func, $args, $index) { + $this->del($index,EventInterface::EV_TIMER_ONCE); + \call_user_func_array($func, $args); + }); + $this->_timerIdMap[$index] = $timer_obj; + return $this->_timerIdIndex; + } + return false; + } + + /** + * Remove event listener from event loop. + * + * @param mixed $fd + * @param int $flag + * @return bool + */ + public function del($fd, $flag) + { + switch ($flag) { + case EventInterface::EV_READ: + return $this->removeReadStream($fd); + case EventInterface::EV_WRITE: + return $this->removeWriteStream($fd); + case EventInterface::EV_SIGNAL: + if (!isset($this->_eventLoop[$fd])) { + return false; + } + $func = $this->_eventLoop[$fd]; + unset($this->_eventLoop[$fd]); + return $this->removeSignal($fd, $func); + + case EventInterface::EV_TIMER: + case EventInterface::EV_TIMER_ONCE: + if (isset($this->_timerIdMap[$fd])){ + $timer_obj = $this->_timerIdMap[$fd]; + unset($this->_timerIdMap[$fd]); + $this->cancelTimer($timer_obj); + return true; + } + } + return false; + } + + + /** + * Main loop. + * + * @return void + */ + public function loop() + { + $this->run(); + } + + + /** + * Destroy loop. + * + * @return void + */ + public function destroy() + { + + } + + /** + * Get timer count. + * + * @return integer + */ + public function getTimerCount() + { + return \count($this->_timerIdMap); + } + + /** + * @param resource $stream + * @param callable $listener + */ + public function addReadStream($stream, $listener) + { + return $this->_eventLoop->addReadStream($stream, $listener); + } + + /** + * @param resource $stream + * @param callable $listener + */ + public function addWriteStream($stream, $listener) + { + return $this->_eventLoop->addWriteStream($stream, $listener); + } + + /** + * @param resource $stream + */ + public function removeReadStream($stream) + { + return $this->_eventLoop->removeReadStream($stream); + } + + /** + * @param resource $stream + */ + public function removeWriteStream($stream) + { + return $this->_eventLoop->removeWriteStream($stream); + } + + /** + * @param float|int $interval + * @param callable $callback + * @return \React\EventLoop\Timer\Timer|TimerInterface + */ + public function addTimer($interval, $callback) + { + return $this->_eventLoop->addTimer($interval, $callback); + } + + /** + * @param float|int $interval + * @param callable $callback + * @return \React\EventLoop\Timer\Timer|TimerInterface + */ + public function addPeriodicTimer($interval, $callback) + { + return $this->_eventLoop->addPeriodicTimer($interval, $callback); + } + + /** + * @param TimerInterface $timer + */ + public function cancelTimer(TimerInterface $timer) + { + return $this->_eventLoop->cancelTimer($timer); + } + + /** + * @param callable $listener + */ + public function futureTick($listener) + { + return $this->_eventLoop->futureTick($listener); + } + + /** + * @param int $signal + * @param callable $listener + */ + public function addSignal($signal, $listener) + { + return $this->_eventLoop->addSignal($signal, $listener); + } + + /** + * @param int $signal + * @param callable $listener + */ + public function removeSignal($signal, $listener) + { + return $this->_eventLoop->removeSignal($signal, $listener); + } + + /** + * Run. + */ + public function run() + { + return $this->_eventLoop->run(); + } + + /** + * Stop. + */ + public function stop() + { + return $this->_eventLoop->stop(); + } +} diff --git a/vendor/workerman/workerman/Events/React/ExtEventLoop.php b/vendor/workerman/workerman/Events/React/ExtEventLoop.php new file mode 100644 index 0000000..3dab25b --- /dev/null +++ b/vendor/workerman/workerman/Events/React/ExtEventLoop.php @@ -0,0 +1,27 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Events\React; + +/** + * Class ExtEventLoop + * @package Workerman\Events\React + */ +class ExtEventLoop extends Base +{ + + public function __construct() + { + $this->_eventLoop = new \React\EventLoop\ExtEventLoop(); + } +} diff --git a/vendor/workerman/workerman/Events/React/ExtLibEventLoop.php b/vendor/workerman/workerman/Events/React/ExtLibEventLoop.php new file mode 100644 index 0000000..eb02b35 --- /dev/null +++ b/vendor/workerman/workerman/Events/React/ExtLibEventLoop.php @@ -0,0 +1,27 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Events\React; +use Workerman\Events\EventInterface; + +/** + * Class ExtLibEventLoop + * @package Workerman\Events\React + */ +class ExtLibEventLoop extends Base +{ + public function __construct() + { + $this->_eventLoop = new \React\EventLoop\ExtLibeventLoop(); + } +} diff --git a/vendor/workerman/workerman/Events/React/StreamSelectLoop.php b/vendor/workerman/workerman/Events/React/StreamSelectLoop.php new file mode 100644 index 0000000..7f5f94b --- /dev/null +++ b/vendor/workerman/workerman/Events/React/StreamSelectLoop.php @@ -0,0 +1,26 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Events\React; + +/** + * Class StreamSelectLoop + * @package Workerman\Events\React + */ +class StreamSelectLoop extends Base +{ + public function __construct() + { + $this->_eventLoop = new \React\EventLoop\StreamSelectLoop(); + } +} diff --git a/vendor/workerman/workerman/Events/Select.php b/vendor/workerman/workerman/Events/Select.php new file mode 100644 index 0000000..ebc263e --- /dev/null +++ b/vendor/workerman/workerman/Events/Select.php @@ -0,0 +1,357 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Events; + +use Throwable; +use Workerman\Worker; + +/** + * select eventloop + */ +class Select implements EventInterface +{ + /** + * All listeners for read/write event. + * + * @var array + */ + public $_allEvents = array(); + + /** + * Event listeners of signal. + * + * @var array + */ + public $_signalEvents = array(); + + /** + * Fds waiting for read event. + * + * @var array + */ + protected $_readFds = array(); + + /** + * Fds waiting for write event. + * + * @var array + */ + protected $_writeFds = array(); + + /** + * Fds waiting for except event. + * + * @var array + */ + protected $_exceptFds = array(); + + /** + * Timer scheduler. + * {['data':timer_id, 'priority':run_timestamp], ..} + * + * @var \SplPriorityQueue + */ + protected $_scheduler = null; + + /** + * All timer event listeners. + * [[func, args, flag, timer_interval], ..] + * + * @var array + */ + protected $_eventTimer = array(); + + /** + * Timer id. + * + * @var int + */ + protected $_timerId = 1; + + /** + * Select timeout. + * + * @var int + */ + protected $_selectTimeout = 100000000; + + /** + * Paired socket channels + * + * @var array + */ + protected $channel = array(); + + /** + * Construct. + */ + public function __construct() + { + // Init SplPriorityQueue. + $this->_scheduler = new \SplPriorityQueue(); + $this->_scheduler->setExtractFlags(\SplPriorityQueue::EXTR_BOTH); + } + + /** + * {@inheritdoc} + */ + public function add($fd, $flag, $func, $args = array()) + { + switch ($flag) { + case self::EV_READ: + case self::EV_WRITE: + $count = $flag === self::EV_READ ? \count($this->_readFds) : \count($this->_writeFds); + if ($count >= 1024) { + echo "Warning: system call select exceeded the maximum number of connections 1024, please install event/libevent extension for more connections.\n"; + } else if (\DIRECTORY_SEPARATOR !== '/' && $count >= 256) { + echo "Warning: system call select exceeded the maximum number of connections 256.\n"; + } + $fd_key = (int)$fd; + $this->_allEvents[$fd_key][$flag] = array($func, $fd); + if ($flag === self::EV_READ) { + $this->_readFds[$fd_key] = $fd; + } else { + $this->_writeFds[$fd_key] = $fd; + } + break; + case self::EV_EXCEPT: + $fd_key = (int)$fd; + $this->_allEvents[$fd_key][$flag] = array($func, $fd); + $this->_exceptFds[$fd_key] = $fd; + break; + case self::EV_SIGNAL: + // Windows not support signal. + if(\DIRECTORY_SEPARATOR !== '/') { + return false; + } + $fd_key = (int)$fd; + $this->_signalEvents[$fd_key][$flag] = array($func, $fd); + \pcntl_signal($fd, array($this, 'signalHandler')); + break; + case self::EV_TIMER: + case self::EV_TIMER_ONCE: + $timer_id = $this->_timerId++; + $run_time = \microtime(true) + $fd; + $this->_scheduler->insert($timer_id, -$run_time); + $this->_eventTimer[$timer_id] = array($func, (array)$args, $flag, $fd); + $select_timeout = ($run_time - \microtime(true)) * 1000000; + $select_timeout = $select_timeout <= 0 ? 1 : $select_timeout; + if( $this->_selectTimeout > $select_timeout ){ + $this->_selectTimeout = (int) $select_timeout; + } + return $timer_id; + } + + return true; + } + + /** + * Signal handler. + * + * @param int $signal + */ + public function signalHandler($signal) + { + \call_user_func_array($this->_signalEvents[$signal][self::EV_SIGNAL][0], array($signal)); + } + + /** + * {@inheritdoc} + */ + public function del($fd, $flag) + { + $fd_key = (int)$fd; + switch ($flag) { + case self::EV_READ: + unset($this->_allEvents[$fd_key][$flag], $this->_readFds[$fd_key]); + if (empty($this->_allEvents[$fd_key])) { + unset($this->_allEvents[$fd_key]); + } + return true; + case self::EV_WRITE: + unset($this->_allEvents[$fd_key][$flag], $this->_writeFds[$fd_key]); + if (empty($this->_allEvents[$fd_key])) { + unset($this->_allEvents[$fd_key]); + } + return true; + case self::EV_EXCEPT: + unset($this->_allEvents[$fd_key][$flag], $this->_exceptFds[$fd_key]); + if(empty($this->_allEvents[$fd_key])) + { + unset($this->_allEvents[$fd_key]); + } + return true; + case self::EV_SIGNAL: + if(\DIRECTORY_SEPARATOR !== '/') { + return false; + } + unset($this->_signalEvents[$fd_key]); + \pcntl_signal($fd, SIG_IGN); + break; + case self::EV_TIMER: + case self::EV_TIMER_ONCE; + unset($this->_eventTimer[$fd_key]); + return true; + } + return false; + } + + /** + * Tick for timer. + * + * @return void + */ + protected function tick() + { + $tasks_to_insert = []; + while (!$this->_scheduler->isEmpty()) { + $scheduler_data = $this->_scheduler->top(); + $timer_id = $scheduler_data['data']; + $next_run_time = -$scheduler_data['priority']; + $time_now = \microtime(true); + $this->_selectTimeout = (int) (($next_run_time - $time_now) * 1000000); + if ($this->_selectTimeout <= 0) { + $this->_scheduler->extract(); + + if (!isset($this->_eventTimer[$timer_id])) { + continue; + } + + // [func, args, flag, timer_interval] + $task_data = $this->_eventTimer[$timer_id]; + if ($task_data[2] === self::EV_TIMER) { + $next_run_time = $time_now + $task_data[3]; + $tasks_to_insert[] = [$timer_id, -$next_run_time]; + } + try { + \call_user_func_array($task_data[0], $task_data[1]); + } catch (Throwable $e) { + Worker::stopAll(250, $e); + } + if (isset($this->_eventTimer[$timer_id]) && $task_data[2] === self::EV_TIMER_ONCE) { + $this->del($timer_id, self::EV_TIMER_ONCE); + } + } else { + break; + } + } + foreach ($tasks_to_insert as $item) { + $this->_scheduler->insert($item[0], $item[1]); + } + if (!$this->_scheduler->isEmpty()) { + $scheduler_data = $this->_scheduler->top(); + $next_run_time = -$scheduler_data['priority']; + $time_now = \microtime(true); + $this->_selectTimeout = \max((int) (($next_run_time - $time_now) * 1000000), 0); + return; + } + $this->_selectTimeout = 100000000; + } + + /** + * {@inheritdoc} + */ + public function clearAllTimer() + { + $this->_scheduler = new \SplPriorityQueue(); + $this->_scheduler->setExtractFlags(\SplPriorityQueue::EXTR_BOTH); + $this->_eventTimer = array(); + } + + /** + * {@inheritdoc} + */ + public function loop() + { + while (1) { + if(\DIRECTORY_SEPARATOR === '/') { + // Calls signal handlers for pending signals + \pcntl_signal_dispatch(); + } + + $read = $this->_readFds; + $write = $this->_writeFds; + $except = $this->_exceptFds; + $ret = false; + + if ($read || $write || $except) { + // Waiting read/write/signal/timeout events. + try { + $ret = @stream_select($read, $write, $except, 0, $this->_selectTimeout); + } catch (\Exception $e) {} catch (\Error $e) {} + + } else { + $this->_selectTimeout >= 1 && usleep($this->_selectTimeout); + } + + if (!$this->_scheduler->isEmpty()) { + $this->tick(); + } + + if (!$ret) { + continue; + } + + if ($read) { + foreach ($read as $fd) { + $fd_key = (int)$fd; + if (isset($this->_allEvents[$fd_key][self::EV_READ])) { + \call_user_func_array($this->_allEvents[$fd_key][self::EV_READ][0], + array($this->_allEvents[$fd_key][self::EV_READ][1])); + } + } + } + + if ($write) { + foreach ($write as $fd) { + $fd_key = (int)$fd; + if (isset($this->_allEvents[$fd_key][self::EV_WRITE])) { + \call_user_func_array($this->_allEvents[$fd_key][self::EV_WRITE][0], + array($this->_allEvents[$fd_key][self::EV_WRITE][1])); + } + } + } + + if($except) { + foreach($except as $fd) { + $fd_key = (int) $fd; + if(isset($this->_allEvents[$fd_key][self::EV_EXCEPT])) { + \call_user_func_array($this->_allEvents[$fd_key][self::EV_EXCEPT][0], + array($this->_allEvents[$fd_key][self::EV_EXCEPT][1])); + } + } + } + } + } + + /** + * Destroy loop. + * + * @return void + */ + public function destroy() + { + + } + + /** + * Get timer count. + * + * @return integer + */ + public function getTimerCount() + { + return \count($this->_eventTimer); + } +} diff --git a/vendor/workerman/workerman/Events/Swoole.php b/vendor/workerman/workerman/Events/Swoole.php new file mode 100644 index 0000000..fcd7472 --- /dev/null +++ b/vendor/workerman/workerman/Events/Swoole.php @@ -0,0 +1,230 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author Ares<aresrr#qq.com> + * @link http://www.workerman.net/ + * @link https://github.com/ares333/Workerman + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Events; + +use Workerman\Worker; +use Swoole\Event; +use Swoole\Timer; + +class Swoole implements EventInterface +{ + + protected $_timer = array(); + + protected $_timerOnceMap = array(); + + protected $mapId = 0; + + protected $_fd = array(); + + // milisecond + public static $signalDispatchInterval = 500; + + protected $_hasSignal = false; + + /** + * + * {@inheritdoc} + * + * @see \Workerman\Events\EventInterface::add() + */ + public function add($fd, $flag, $func, $args = array()) + { + switch ($flag) { + case self::EV_SIGNAL: + $res = \pcntl_signal($fd, $func, false); + if (! $this->_hasSignal && $res) { + Timer::tick(static::$signalDispatchInterval, + function () { + \pcntl_signal_dispatch(); + }); + $this->_hasSignal = true; + } + return $res; + case self::EV_TIMER: + case self::EV_TIMER_ONCE: + $method = self::EV_TIMER === $flag ? 'tick' : 'after'; + if ($this->mapId > \PHP_INT_MAX) { + $this->mapId = 0; + } + $mapId = $this->mapId++; + $t = (int)($fd * 1000); + if ($t < 1) { + $t = 1; + } + $timer_id = Timer::$method($t, + function ($timer_id = null) use ($func, $args, $mapId) { + try { + \call_user_func_array($func, (array)$args); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + // EV_TIMER_ONCE + if (! isset($timer_id)) { + // may be deleted in $func + if (\array_key_exists($mapId, $this->_timerOnceMap)) { + $timer_id = $this->_timerOnceMap[$mapId]; + unset($this->_timer[$timer_id], + $this->_timerOnceMap[$mapId]); + } + } + }); + if ($flag === self::EV_TIMER_ONCE) { + $this->_timerOnceMap[$mapId] = $timer_id; + $this->_timer[$timer_id] = $mapId; + } else { + $this->_timer[$timer_id] = null; + } + return $timer_id; + case self::EV_READ: + case self::EV_WRITE: + $fd_key = (int) $fd; + if (! isset($this->_fd[$fd_key])) { + if ($flag === self::EV_READ) { + $res = Event::add($fd, $func, null, SWOOLE_EVENT_READ); + $fd_type = SWOOLE_EVENT_READ; + } else { + $res = Event::add($fd, null, $func, SWOOLE_EVENT_WRITE); + $fd_type = SWOOLE_EVENT_WRITE; + } + if ($res) { + $this->_fd[$fd_key] = $fd_type; + } + } else { + $fd_val = $this->_fd[$fd_key]; + $res = true; + if ($flag === self::EV_READ) { + if (($fd_val & SWOOLE_EVENT_READ) !== SWOOLE_EVENT_READ) { + $res = Event::set($fd, $func, null, + SWOOLE_EVENT_READ | SWOOLE_EVENT_WRITE); + $this->_fd[$fd_key] |= SWOOLE_EVENT_READ; + } + } else { + if (($fd_val & SWOOLE_EVENT_WRITE) !== SWOOLE_EVENT_WRITE) { + $res = Event::set($fd, null, $func, + SWOOLE_EVENT_READ | SWOOLE_EVENT_WRITE); + $this->_fd[$fd_key] |= SWOOLE_EVENT_WRITE; + } + } + } + return $res; + } + } + + /** + * + * {@inheritdoc} + * + * @see \Workerman\Events\EventInterface::del() + */ + public function del($fd, $flag) + { + switch ($flag) { + case self::EV_SIGNAL: + return \pcntl_signal($fd, SIG_IGN, false); + case self::EV_TIMER: + case self::EV_TIMER_ONCE: + // already remove in EV_TIMER_ONCE callback. + if (! \array_key_exists($fd, $this->_timer)) { + return true; + } + $res = Timer::clear($fd); + if ($res) { + $mapId = $this->_timer[$fd]; + if (isset($mapId)) { + unset($this->_timerOnceMap[$mapId]); + } + unset($this->_timer[$fd]); + } + return $res; + case self::EV_READ: + case self::EV_WRITE: + $fd_key = (int) $fd; + if (isset($this->_fd[$fd_key])) { + $fd_val = $this->_fd[$fd_key]; + if ($flag === self::EV_READ) { + $flag_remove = ~ SWOOLE_EVENT_READ; + } else { + $flag_remove = ~ SWOOLE_EVENT_WRITE; + } + $fd_val &= $flag_remove; + if (0 === $fd_val) { + $res = Event::del($fd); + if ($res) { + unset($this->_fd[$fd_key]); + } + } else { + $res = Event::set($fd, null, null, $fd_val); + if ($res) { + $this->_fd[$fd_key] = $fd_val; + } + } + } else { + $res = true; + } + return $res; + } + } + + /** + * + * {@inheritdoc} + * + * @see \Workerman\Events\EventInterface::clearAllTimer() + */ + public function clearAllTimer() + { + foreach (array_keys($this->_timer) as $v) { + Timer::clear($v); + } + $this->_timer = array(); + $this->_timerOnceMap = array(); + } + + /** + * + * {@inheritdoc} + * + * @see \Workerman\Events\EventInterface::loop() + */ + public function loop() + { + Event::wait(); + } + + /** + * + * {@inheritdoc} + * + * @see \Workerman\Events\EventInterface::destroy() + */ + public function destroy() + { + Event::exit(); + posix_kill(posix_getpid(), SIGINT); + } + + /** + * + * {@inheritdoc} + * + * @see \Workerman\Events\EventInterface::getTimerCount() + */ + public function getTimerCount() + { + return \count($this->_timer); + } +} diff --git a/vendor/workerman/workerman/Events/Uv.php b/vendor/workerman/workerman/Events/Uv.php new file mode 100644 index 0000000..6efe16b --- /dev/null +++ b/vendor/workerman/workerman/Events/Uv.php @@ -0,0 +1,260 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author 爬山虎<blogdaren@163.com> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Events; + +use Workerman\Worker; + +/** + * libuv eventloop + */ +class Uv implements EventInterface +{ + /** + * Event Loop. + * @var object + */ + protected $_eventLoop = null; + + /** + * All listeners for read/write event. + * + * @var array + */ + protected $_allEvents = array(); + + /** + * Event listeners of signal. + * + * @var array + */ + protected $_eventSignal = array(); + + /** + * All timer event listeners. + * + * @var array + */ + protected $_eventTimer = array(); + + /** + * Timer id. + * + * @var int + */ + protected static $_timerId = 1; + + /** + * @brief Constructor + * + * @param object $loop + * + * @return void + */ + public function __construct(\UVLoop $loop = null) + { + if(!extension_loaded('uv')) + { + throw new \Exception(__CLASS__ . ' requires the UV extension, but detected it has NOT been installed yet.'); + } + + if(empty($loop) || !$loop instanceof \UVLoop) + { + $this->_eventLoop = \uv_default_loop(); + return; + } + + $this->_eventLoop = $loop; + } + + /** + * @brief Add a timer + * + * @param resource $fd + * @param int $flag + * @param callback $func + * @param mixed $args + * + * @return mixed + */ + public function add($fd, $flag, $func, $args = null) + { + switch ($flag) + { + case self::EV_SIGNAL: + $signalCallback = function($watcher, $socket)use($func, $fd){ + try { + \call_user_func($func, $fd); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + }; + $signalWatcher = \uv_signal_init(); + \uv_signal_start($signalWatcher, $signalCallback, $fd); + $this->_eventSignal[$fd] = $signalWatcher; + return true; + case self::EV_TIMER: + case self::EV_TIMER_ONCE: + $repeat = $flag === self::EV_TIMER_ONCE ? 0 : (int)($fd * 1000); + $param = array($func, (array)$args, $flag, $fd, self::$_timerId); + $timerWatcher = \uv_timer_init(); + \uv_timer_start($timerWatcher, 1, $repeat, function($watcher)use($param){ + call_user_func_array([$this, 'timerCallback'], [$param]); + }); + $this->_eventTimer[self::$_timerId] = $timerWatcher; + return self::$_timerId++; + case self::EV_READ: + case self::EV_WRITE: + $fd_key = (int)$fd; + $ioCallback = function($watcher, $status, $events, $fd)use($func){ + try { + \call_user_func($func, $fd); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + }; + $ioWatcher = \uv_poll_init($this->_eventLoop, $fd); + $real_flag = $flag === self::EV_READ ? \Uv::READABLE : \Uv::WRITABLE; + \uv_poll_start($ioWatcher, $real_flag, $ioCallback); + $this->_allEvents[$fd_key][$flag] = $ioWatcher; + return true; + default: + break; + } + } + + /** + * @brief Remove a timer + * + * @param resource $fd + * @param int $flag + * + * @return boolean + */ + public function del($fd, $flag) + { + switch ($flag) + { + case self::EV_READ: + case self::EV_WRITE: + $fd_key = (int)$fd; + if (isset($this->_allEvents[$fd_key][$flag])) { + $watcher = $this->_allEvents[$fd_key][$flag]; + \uv_is_active($watcher) && \uv_poll_stop($watcher); + unset($this->_allEvents[$fd_key][$flag]); + } + if (empty($this->_allEvents[$fd_key])) { + unset($this->_allEvents[$fd_key]); + } + break; + case self::EV_SIGNAL: + $fd_key = (int)$fd; + if (isset($this->_eventSignal[$fd_key])) { + $watcher = $this->_eventSignal[$fd_key]; + \uv_is_active($watcher) && \uv_signal_stop($watcher); + unset($this->_eventSignal[$fd_key]); + } + break; + case self::EV_TIMER: + case self::EV_TIMER_ONCE: + if (isset($this->_eventTimer[$fd])) { + $watcher = $this->_eventTimer[$fd]; + \uv_is_active($watcher) && \uv_timer_stop($watcher); + unset($this->_eventTimer[$fd]); + } + break; + } + + return true; + } + + /** + * @brief Timer callback + * + * @param array $input + * + * @return void + */ + public function timerCallback($input) + { + if(!is_array($input)) return; + + $timer_id = $input[4]; + + if ($input[2] === self::EV_TIMER_ONCE) + { + $watcher = $this->_eventTimer[$timer_id]; + \uv_is_active($watcher) && \uv_timer_stop($watcher); + unset($this->_eventTimer[$timer_id]); + } + + try { + \call_user_func_array($input[0], $input[1]); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + + /** + * @brief Remove all timers + * + * @return void + */ + public function clearAllTimer() + { + if(!is_array($this->_eventTimer)) return; + + foreach($this->_eventTimer as $watcher) + { + \uv_is_active($watcher) && \uv_timer_stop($watcher); + } + + $this->_eventTimer = array(); + } + + /** + * @brief Start loop + * + * @return void + */ + public function loop() + { + \Uv_run(); + } + + /** + * @brief Destroy loop + * + * @return void + */ + public function destroy() + { + !empty($this->_eventLoop) && \uv_loop_delete($this->_eventLoop); + $this->_allEvents = []; + } + + /** + * @brief Get timer count + * + * @return integer + */ + public function getTimerCount() + { + return \count($this->_eventTimer); + } +} diff --git a/vendor/workerman/workerman/Lib/Constants.php b/vendor/workerman/workerman/Lib/Constants.php new file mode 100644 index 0000000..f5e2424 --- /dev/null +++ b/vendor/workerman/workerman/Lib/Constants.php @@ -0,0 +1,44 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @license http://www.opensource.org/licenses/mit-license.php MIT License + * + * @link http://www.workerman.net/ + */ + +// Pcre.jit is not stable, temporarily disabled. +ini_set('pcre.jit', 0); + +// For onError callback. +const WORKERMAN_CONNECT_FAIL = 1; +// For onError callback. +const WORKERMAN_SEND_FAIL = 2; + +// Define OS Type +const OS_TYPE_LINUX = 'linux'; +const OS_TYPE_WINDOWS = 'windows'; + +// Compatible with php7 +if (!class_exists('Error')) { + class Error extends Exception + { + } +} + +if (!interface_exists('SessionHandlerInterface')) { + interface SessionHandlerInterface { + public function close(); + public function destroy($session_id); + public function gc($maxlifetime); + public function open($save_path ,$session_name); + public function read($session_id); + public function write($session_id , $session_data); + } +} diff --git a/vendor/workerman/workerman/Lib/Timer.php b/vendor/workerman/workerman/Lib/Timer.php new file mode 100644 index 0000000..b110051 --- /dev/null +++ b/vendor/workerman/workerman/Lib/Timer.php @@ -0,0 +1,22 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Lib; + +/** + * Do not use Workerman\Lib\Timer. + * Please use Workerman\Timer. + * This class is only used for compatibility with workerman 3.* + * @package Workerman\Lib + */ +class Timer extends \Workerman\Timer {} \ No newline at end of file diff --git a/vendor/workerman/workerman/MIT-LICENSE.txt b/vendor/workerman/workerman/MIT-LICENSE.txt new file mode 100644 index 0000000..fd6b1c8 --- /dev/null +++ b/vendor/workerman/workerman/MIT-LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2009-2015 walkor<walkor@workerman.net> and contributors (see https://github.com/walkor/workerman/contributors) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/workerman/workerman/Protocols/Frame.php b/vendor/workerman/workerman/Protocols/Frame.php new file mode 100644 index 0000000..26b04de --- /dev/null +++ b/vendor/workerman/workerman/Protocols/Frame.php @@ -0,0 +1,61 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Protocols; + +use Workerman\Connection\TcpConnection; + +/** + * Frame Protocol. + */ +class Frame +{ + /** + * Check the integrity of the package. + * + * @param string $buffer + * @param TcpConnection $connection + * @return int + */ + public static function input($buffer, TcpConnection $connection) + { + if (\strlen($buffer) < 4) { + return 0; + } + $unpack_data = \unpack('Ntotal_length', $buffer); + return $unpack_data['total_length']; + } + + /** + * Decode. + * + * @param string $buffer + * @return string + */ + public static function decode($buffer) + { + return \substr($buffer, 4); + } + + /** + * Encode. + * + * @param string $buffer + * @return string + */ + public static function encode($buffer) + { + $total_length = 4 + \strlen($buffer); + return \pack('N', $total_length) . $buffer; + } +} diff --git a/vendor/workerman/workerman/Protocols/Http.php b/vendor/workerman/workerman/Protocols/Http.php new file mode 100644 index 0000000..9e5d928 --- /dev/null +++ b/vendor/workerman/workerman/Protocols/Http.php @@ -0,0 +1,323 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Protocols; + +use Workerman\Connection\TcpConnection; +use Workerman\Protocols\Http\Request; +use Workerman\Protocols\Http\Response; +use Workerman\Protocols\Http\Session; +use Workerman\Protocols\Websocket; +use Workerman\Worker; + +/** + * Class Http. + * @package Workerman\Protocols + */ +class Http +{ + /** + * Request class name. + * + * @var string + */ + protected static $_requestClass = 'Workerman\Protocols\Http\Request'; + + /** + * Upload tmp dir. + * + * @var string + */ + protected static $_uploadTmpDir = ''; + + /** + * Open cache. + * + * @var bool. + */ + protected static $_enableCache = true; + + /** + * Get or set session name. + * + * @param string|null $name + * @return string + */ + public static function sessionName($name = null) + { + if ($name !== null && $name !== '') { + Session::$name = (string)$name; + } + return Session::$name; + } + + /** + * Get or set the request class name. + * + * @param string|null $class_name + * @return string + */ + public static function requestClass($class_name = null) + { + if ($class_name) { + static::$_requestClass = $class_name; + } + return static::$_requestClass; + } + + /** + * Enable or disable Cache. + * + * @param mixed $value + */ + public static function enableCache($value) + { + static::$_enableCache = (bool)$value; + } + + /** + * Check the integrity of the package. + * + * @param string $recv_buffer + * @param TcpConnection $connection + * @return int + */ + public static function input($recv_buffer, TcpConnection $connection) + { + static $input = []; + if (!isset($recv_buffer[512]) && isset($input[$recv_buffer])) { + return $input[$recv_buffer]; + } + $crlf_pos = \strpos($recv_buffer, "\r\n\r\n"); + if (false === $crlf_pos) { + // Judge whether the package length exceeds the limit. + if (\strlen($recv_buffer) >= 16384) { + $connection->close("HTTP/1.1 413 Request Entity Too Large\r\n\r\n", true); + return 0; + } + return 0; + } + + $length = $crlf_pos + 4; + $method = \strstr($recv_buffer, ' ', true); + + if (!\in_array($method, ['GET', 'POST', 'OPTIONS', 'HEAD', 'DELETE', 'PUT', 'PATCH'])) { + $connection->close("HTTP/1.1 400 Bad Request\r\n\r\n", true); + return 0; + } + + $header = \substr($recv_buffer, 0, $crlf_pos); + if ($pos = \strpos($header, "\r\nContent-Length: ")) { + $length = $length + (int)\substr($header, $pos + 18, 10); + $has_content_length = true; + } else if (\preg_match("/\r\ncontent-length: ?(\d+)/i", $header, $match)) { + $length = $length + $match[1]; + $has_content_length = true; + } else { + $has_content_length = false; + if (false !== stripos($header, "\r\nTransfer-Encoding:")) { + $connection->close("HTTP/1.1 400 Bad Request\r\n\r\n", true); + return 0; + } + } + + if ($has_content_length) { + if ($length > $connection->maxPackageSize) { + $connection->close("HTTP/1.1 413 Request Entity Too Large\r\n\r\n", true); + return 0; + } + } + + if (!isset($recv_buffer[512])) { + $input[$recv_buffer] = $length; + if (\count($input) > 512) { + unset($input[key($input)]); + } + } + + return $length; + } + + /** + * Http decode. + * + * @param string $recv_buffer + * @param TcpConnection $connection + * @return \Workerman\Protocols\Http\Request + */ + public static function decode($recv_buffer, TcpConnection $connection) + { + static $requests = array(); + $cacheable = static::$_enableCache && !isset($recv_buffer[512]); + if (true === $cacheable && isset($requests[$recv_buffer])) { + $request = $requests[$recv_buffer]; + $request->connection = $connection; + $connection->__request = $request; + $request->properties = array(); + return $request; + } + $request = new static::$_requestClass($recv_buffer); + $request->connection = $connection; + $connection->__request = $request; + if (true === $cacheable) { + $requests[$recv_buffer] = $request; + if (\count($requests) > 512) { + unset($requests[key($requests)]); + } + } + return $request; + } + + /** + * Http encode. + * + * @param string|Response $response + * @param TcpConnection $connection + * @return string + */ + public static function encode($response, TcpConnection $connection) + { + if (isset($connection->__request)) { + $connection->__request->session = null; + $connection->__request->connection = null; + $connection->__request = null; + } + if (!\is_object($response)) { + $ext_header = ''; + if (isset($connection->__header)) { + foreach ($connection->__header as $name => $value) { + if (\is_array($value)) { + foreach ($value as $item) { + $ext_header = "$name: $item\r\n"; + } + } else { + $ext_header = "$name: $value\r\n"; + } + } + unset($connection->__header); + } + $body_len = \strlen((string)$response); + return "HTTP/1.1 200 OK\r\nServer: workerman\r\n{$ext_header}Connection: keep-alive\r\nContent-Type: text/html;charset=utf-8\r\nContent-Length: $body_len\r\n\r\n$response"; + } + + if (isset($connection->__header)) { + $response->withHeaders($connection->__header); + unset($connection->__header); + } + + if (isset($response->file)) { + $file = $response->file['file']; + $offset = $response->file['offset']; + $length = $response->file['length']; + clearstatcache(); + $file_size = (int)\filesize($file); + $body_len = $length > 0 ? $length : $file_size - $offset; + $response->withHeaders(array( + 'Content-Length' => $body_len, + 'Accept-Ranges' => 'bytes', + )); + if ($offset || $length) { + $offset_end = $offset + $body_len - 1; + $response->header('Content-Range', "bytes $offset-$offset_end/$file_size"); + } + if ($body_len < 2 * 1024 * 1024) { + $connection->send((string)$response . file_get_contents($file, false, null, $offset, $body_len), true); + return ''; + } + $handler = \fopen($file, 'r'); + if (false === $handler) { + $connection->close(new Response(403, null, '403 Forbidden')); + return ''; + } + $connection->send((string)$response, true); + static::sendStream($connection, $handler, $offset, $length); + return ''; + } + + return (string)$response; + } + + /** + * Send remainder of a stream to client. + * + * @param TcpConnection $connection + * @param resource $handler + * @param int $offset + * @param int $length + */ + protected static function sendStream(TcpConnection $connection, $handler, $offset = 0, $length = 0) + { + $connection->bufferFull = false; + if ($offset !== 0) { + \fseek($handler, $offset); + } + $offset_end = $offset + $length; + // Read file content from disk piece by piece and send to client. + $do_write = function () use ($connection, $handler, $length, $offset_end) { + // Send buffer not full. + while ($connection->bufferFull === false) { + // Read from disk. + $size = 1024 * 1024; + if ($length !== 0) { + $tell = \ftell($handler); + $remain_size = $offset_end - $tell; + if ($remain_size <= 0) { + fclose($handler); + $connection->onBufferDrain = null; + return; + } + $size = $remain_size > $size ? $size : $remain_size; + } + + $buffer = \fread($handler, $size); + // Read eof. + if ($buffer === '' || $buffer === false) { + fclose($handler); + $connection->onBufferDrain = null; + return; + } + $connection->send($buffer, true); + } + }; + // Send buffer full. + $connection->onBufferFull = function ($connection) { + $connection->bufferFull = true; + }; + // Send buffer drain. + $connection->onBufferDrain = function ($connection) use ($do_write) { + $connection->bufferFull = false; + $do_write(); + }; + $do_write(); + } + + /** + * Set or get uploadTmpDir. + * + * @return bool|string + */ + public static function uploadTmpDir($dir = null) + { + if (null !== $dir) { + static::$_uploadTmpDir = $dir; + } + if (static::$_uploadTmpDir === '') { + if ($upload_tmp_dir = \ini_get('upload_tmp_dir')) { + static::$_uploadTmpDir = $upload_tmp_dir; + } else if ($upload_tmp_dir = \sys_get_temp_dir()) { + static::$_uploadTmpDir = $upload_tmp_dir; + } + } + return static::$_uploadTmpDir; + } +} diff --git a/vendor/workerman/workerman/Protocols/Http/Chunk.php b/vendor/workerman/workerman/Protocols/Http/Chunk.php new file mode 100644 index 0000000..ab06a9c --- /dev/null +++ b/vendor/workerman/workerman/Protocols/Http/Chunk.php @@ -0,0 +1,48 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Protocols\Http; + + +/** + * Class Chunk + * @package Workerman\Protocols\Http + */ +class Chunk +{ + /** + * Chunk buffer. + * + * @var string + */ + protected $_buffer = null; + + /** + * Chunk constructor. + * @param string $buffer + */ + public function __construct($buffer) + { + $this->_buffer = $buffer; + } + + /** + * __toString + * + * @return string + */ + public function __toString() + { + return \dechex(\strlen($this->_buffer))."\r\n$this->_buffer\r\n"; + } +} \ No newline at end of file diff --git a/vendor/workerman/workerman/Protocols/Http/Request.php b/vendor/workerman/workerman/Protocols/Http/Request.php new file mode 100644 index 0000000..92d30ee --- /dev/null +++ b/vendor/workerman/workerman/Protocols/Http/Request.php @@ -0,0 +1,676 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Protocols\Http; + +use Workerman\Connection\TcpConnection; +use Workerman\Protocols\Http\Session; +use Workerman\Protocols\Http; +use Workerman\Worker; + +/** + * Class Request + * @package Workerman\Protocols\Http + */ +class Request +{ + /** + * Connection. + * + * @var TcpConnection + */ + public $connection = null; + + /** + * Session instance. + * + * @var Session + */ + public $session = null; + + /** + * Properties. + * + * @var array + */ + public $properties = array(); + + /** + * @var int + */ + public static $maxFileUploads = 1024; + + /** + * Http buffer. + * + * @var string + */ + protected $_buffer = null; + + /** + * Request data. + * + * @var array + */ + protected $_data = null; + + /** + * Enable cache. + * + * @var bool + */ + protected static $_enableCache = true; + + + /** + * Request constructor. + * + * @param string $buffer + */ + public function __construct($buffer) + { + $this->_buffer = $buffer; + } + + /** + * $_GET. + * + * @param string|null $name + * @param mixed|null $default + * @return mixed|null + */ + public function get($name = null, $default = null) + { + if (!isset($this->_data['get'])) { + $this->parseGet(); + } + if (null === $name) { + return $this->_data['get']; + } + return isset($this->_data['get'][$name]) ? $this->_data['get'][$name] : $default; + } + + /** + * $_POST. + * + * @param string|null $name + * @param mixed|null $default + * @return mixed|null + */ + public function post($name = null, $default = null) + { + if (!isset($this->_data['post'])) { + $this->parsePost(); + } + if (null === $name) { + return $this->_data['post']; + } + return isset($this->_data['post'][$name]) ? $this->_data['post'][$name] : $default; + } + + /** + * Get header item by name. + * + * @param string|null $name + * @param mixed|null $default + * @return array|string|null + */ + public function header($name = null, $default = null) + { + if (!isset($this->_data['headers'])) { + $this->parseHeaders(); + } + if (null === $name) { + return $this->_data['headers']; + } + $name = \strtolower($name); + return isset($this->_data['headers'][$name]) ? $this->_data['headers'][$name] : $default; + } + + /** + * Get cookie item by name. + * + * @param string|null $name + * @param mixed|null $default + * @return array|string|null + */ + public function cookie($name = null, $default = null) + { + if (!isset($this->_data['cookie'])) { + $this->_data['cookie'] = array(); + \parse_str(\preg_replace('/; ?/', '&', $this->header('cookie', '')), $this->_data['cookie']); + } + if ($name === null) { + return $this->_data['cookie']; + } + return isset($this->_data['cookie'][$name]) ? $this->_data['cookie'][$name] : $default; + } + + /** + * Get upload files. + * + * @param string|null $name + * @return array|null + */ + public function file($name = null) + { + if (!isset($this->_data['files'])) { + $this->parsePost(); + } + if (null === $name) { + return $this->_data['files']; + } + return isset($this->_data['files'][$name]) ? $this->_data['files'][$name] : null; + } + + /** + * Get method. + * + * @return string + */ + public function method() + { + if (!isset($this->_data['method'])) { + $this->parseHeadFirstLine(); + } + return $this->_data['method']; + } + + /** + * Get http protocol version. + * + * @return string + */ + public function protocolVersion() + { + if (!isset($this->_data['protocolVersion'])) { + $this->parseProtocolVersion(); + } + return $this->_data['protocolVersion']; + } + + /** + * Get host. + * + * @param bool $without_port + * @return string + */ + public function host($without_port = false) + { + $host = $this->header('host'); + if ($host && $without_port && $pos = \strpos($host, ':')) { + return \substr($host, 0, $pos); + } + return $host; + } + + /** + * Get uri. + * + * @return mixed + */ + public function uri() + { + if (!isset($this->_data['uri'])) { + $this->parseHeadFirstLine(); + } + return $this->_data['uri']; + } + + /** + * Get path. + * + * @return mixed + */ + public function path() + { + if (!isset($this->_data['path'])) { + $this->_data['path'] = (string)\parse_url($this->uri(), PHP_URL_PATH); + } + return $this->_data['path']; + } + + /** + * Get query string. + * + * @return mixed + */ + public function queryString() + { + if (!isset($this->_data['query_string'])) { + $this->_data['query_string'] = (string)\parse_url($this->uri(), PHP_URL_QUERY); + } + return $this->_data['query_string']; + } + + /** + * Get session. + * + * @return bool|\Workerman\Protocols\Http\Session + */ + public function session() + { + if ($this->session === null) { + $session_id = $this->sessionId(); + if ($session_id === false) { + return false; + } + $this->session = new Session($session_id); + } + return $this->session; + } + + /** + * Get/Set session id. + * + * @param $session_id + * @return string + */ + public function sessionId($session_id = null) + { + if ($session_id) { + unset($this->sid); + } + if (!isset($this->sid)) { + $session_name = Session::$name; + $sid = $session_id ? '' : $this->cookie($session_name); + if ($sid === '' || $sid === null) { + if ($this->connection === null) { + Worker::safeEcho('Request->session() fail, header already send'); + return false; + } + $sid = $session_id ? $session_id : static::createSessionId(); + $cookie_params = Session::getCookieParams(); + $this->connection->__header['Set-Cookie'] = array($session_name . '=' . $sid + . (empty($cookie_params['domain']) ? '' : '; Domain=' . $cookie_params['domain']) + . (empty($cookie_params['lifetime']) ? '' : '; Max-Age=' . $cookie_params['lifetime']) + . (empty($cookie_params['path']) ? '' : '; Path=' . $cookie_params['path']) + . (empty($cookie_params['samesite']) ? '' : '; SameSite=' . $cookie_params['samesite']) + . (!$cookie_params['secure'] ? '' : '; Secure') + . (!$cookie_params['httponly'] ? '' : '; HttpOnly')); + } + $this->sid = $sid; + } + return $this->sid; + } + + /** + * Get http raw head. + * + * @return string + */ + public function rawHead() + { + if (!isset($this->_data['head'])) { + $this->_data['head'] = \strstr($this->_buffer, "\r\n\r\n", true); + } + return $this->_data['head']; + } + + /** + * Get http raw body. + * + * @return string + */ + public function rawBody() + { + return \substr($this->_buffer, \strpos($this->_buffer, "\r\n\r\n") + 4); + } + + /** + * Get raw buffer. + * + * @return string + */ + public function rawBuffer() + { + return $this->_buffer; + } + + /** + * Enable or disable cache. + * + * @param mixed $value + */ + public static function enableCache($value) + { + static::$_enableCache = (bool)$value; + } + + /** + * Parse first line of http header buffer. + * + * @return void + */ + protected function parseHeadFirstLine() + { + $first_line = \strstr($this->_buffer, "\r\n", true); + $tmp = \explode(' ', $first_line, 3); + $this->_data['method'] = $tmp[0]; + $this->_data['uri'] = isset($tmp[1]) ? $tmp[1] : '/'; + } + + /** + * Parse protocol version. + * + * @return void + */ + protected function parseProtocolVersion() + { + $first_line = \strstr($this->_buffer, "\r\n", true); + $protoco_version = substr(\strstr($first_line, 'HTTP/'), 5); + $this->_data['protocolVersion'] = $protoco_version ? $protoco_version : '1.0'; + } + + /** + * Parse headers. + * + * @return void + */ + protected function parseHeaders() + { + static $cache = []; + $this->_data['headers'] = array(); + $raw_head = $this->rawHead(); + $end_line_position = \strpos($raw_head, "\r\n"); + if ($end_line_position === false) { + return; + } + $head_buffer = \substr($raw_head, $end_line_position + 2); + $cacheable = static::$_enableCache && !isset($head_buffer[2048]); + if ($cacheable && isset($cache[$head_buffer])) { + $this->_data['headers'] = $cache[$head_buffer]; + return; + } + $head_data = \explode("\r\n", $head_buffer); + foreach ($head_data as $content) { + if (false !== \strpos($content, ':')) { + list($key, $value) = \explode(':', $content, 2); + $key = \strtolower($key); + $value = \ltrim($value); + } else { + $key = \strtolower($content); + $value = ''; + } + if (isset($this->_data['headers'][$key])) { + $this->_data['headers'][$key] = "{$this->_data['headers'][$key]},$value"; + } else { + $this->_data['headers'][$key] = $value; + } + } + if ($cacheable) { + $cache[$head_buffer] = $this->_data['headers']; + if (\count($cache) > 128) { + unset($cache[key($cache)]); + } + } + } + + /** + * Parse head. + * + * @return void + */ + protected function parseGet() + { + static $cache = []; + $query_string = $this->queryString(); + $this->_data['get'] = array(); + if ($query_string === '') { + return; + } + $cacheable = static::$_enableCache && !isset($query_string[1024]); + if ($cacheable && isset($cache[$query_string])) { + $this->_data['get'] = $cache[$query_string]; + return; + } + \parse_str($query_string, $this->_data['get']); + if ($cacheable) { + $cache[$query_string] = $this->_data['get']; + if (\count($cache) > 256) { + unset($cache[key($cache)]); + } + } + } + + /** + * Parse post. + * + * @return void + */ + protected function parsePost() + { + static $cache = []; + $this->_data['post'] = $this->_data['files'] = array(); + $content_type = $this->header('content-type', ''); + if (\preg_match('/boundary="?(\S+)"?/', $content_type, $match)) { + $http_post_boundary = '--' . $match[1]; + $this->parseUploadFiles($http_post_boundary); + return; + } + $body_buffer = $this->rawBody(); + if ($body_buffer === '') { + return; + } + $cacheable = static::$_enableCache && !isset($body_buffer[1024]); + if ($cacheable && isset($cache[$body_buffer])) { + $this->_data['post'] = $cache[$body_buffer]; + return; + } + if (\preg_match('/\bjson\b/i', $content_type)) { + $this->_data['post'] = (array) json_decode($body_buffer, true); + } else { + \parse_str($body_buffer, $this->_data['post']); + } + if ($cacheable) { + $cache[$body_buffer] = $this->_data['post']; + if (\count($cache) > 256) { + unset($cache[key($cache)]); + } + } + } + + /** + * Parse upload files. + * + * @param string $http_post_boundary + * @return void + */ + protected function parseUploadFiles($http_post_boundary) + { + $http_post_boundary = \trim($http_post_boundary, '"'); + $buffer = $this->_buffer; + $post_encode_string = ''; + $files_encode_string = ''; + $files = []; + $boday_position = strpos($buffer, "\r\n\r\n") + 4; + $offset = $boday_position + strlen($http_post_boundary) + 2; + $max_count = static::$maxFileUploads; + while ($max_count-- > 0 && $offset) { + $offset = $this->parseUploadFile($http_post_boundary, $offset, $post_encode_string, $files_encode_string, $files); + } + if ($post_encode_string) { + parse_str($post_encode_string, $this->_data['post']); + } + + if ($files_encode_string) { + parse_str($files_encode_string, $this->_data['files']); + \array_walk_recursive($this->_data['files'], function (&$value) use ($files) { + $value = $files[$value]; + }); + } + } + + /** + * @param $boundary + * @param $section_start_offset + * @return int + */ + protected function parseUploadFile($boundary, $section_start_offset, &$post_encode_string, &$files_encode_str, &$files) + { + $file = []; + $boundary = "\r\n$boundary"; + if (\strlen($this->_buffer) < $section_start_offset) { + return 0; + } + $section_end_offset = \strpos($this->_buffer, $boundary, $section_start_offset); + if (!$section_end_offset) { + return 0; + } + $content_lines_end_offset = \strpos($this->_buffer, "\r\n\r\n", $section_start_offset); + if (!$content_lines_end_offset || $content_lines_end_offset + 4 > $section_end_offset) { + return 0; + } + $content_lines_str = \substr($this->_buffer, $section_start_offset, $content_lines_end_offset - $section_start_offset); + $content_lines = \explode("\r\n", trim($content_lines_str . "\r\n")); + $boundary_value = \substr($this->_buffer, $content_lines_end_offset + 4, $section_end_offset - $content_lines_end_offset - 4); + $upload_key = false; + foreach ($content_lines as $content_line) { + if (!\strpos($content_line, ': ')) { + return 0; + } + list($key, $value) = \explode(': ', $content_line); + switch (strtolower($key)) { + case "content-disposition": + // Is file data. + if (\preg_match('/name="(.*?)"; filename="(.*?)"/i', $value, $match)) { + $error = 0; + $tmp_file = ''; + $size = \strlen($boundary_value); + $tmp_upload_dir = HTTP::uploadTmpDir(); + if (!$tmp_upload_dir) { + $error = UPLOAD_ERR_NO_TMP_DIR; + } else if ($boundary_value === '') { + $error = UPLOAD_ERR_NO_FILE; + } else { + $tmp_file = \tempnam($tmp_upload_dir, 'workerman.upload.'); + if ($tmp_file === false || false == \file_put_contents($tmp_file, $boundary_value)) { + $error = UPLOAD_ERR_CANT_WRITE; + } + } + $upload_key = $match[1]; + // Parse upload files. + $file = [ + 'name' => $match[2], + 'tmp_name' => $tmp_file, + 'size' => $size, + 'error' => $error, + 'type' => '', + ]; + break; + } // Is post field. + else { + // Parse $_POST. + if (\preg_match('/name="(.*?)"$/', $value, $match)) { + $k = $match[1]; + $post_encode_string .= \urlencode($k) . "=" . \urlencode($boundary_value) . '&'; + } + return $section_end_offset + \strlen($boundary) + 2; + } + break; + case "content-type": + $file['type'] = \trim($value); + break; + } + } + if ($upload_key === false) { + return 0; + } + $files_encode_str .= \urlencode($upload_key) . '=' . \count($files) . '&'; + $files[] = $file; + + return $section_end_offset + \strlen($boundary) + 2; + } + + /** + * Create session id. + * + * @return string + */ + protected static function createSessionId() + { + return \bin2hex(\pack('d', \microtime(true)) . random_bytes(8)); + } + + /** + * Setter. + * + * @param string $name + * @param mixed $value + * @return void + */ + public function __set($name, $value) + { + $this->properties[$name] = $value; + } + + /** + * Getter. + * + * @param string $name + * @return mixed|null + */ + public function __get($name) + { + return isset($this->properties[$name]) ? $this->properties[$name] : null; + } + + /** + * Isset. + * + * @param string $name + * @return bool + */ + public function __isset($name) + { + return isset($this->properties[$name]); + } + + /** + * Unset. + * + * @param string $name + * @return void + */ + public function __unset($name) + { + unset($this->properties[$name]); + } + + /** + * __toString. + */ + public function __toString() + { + return $this->_buffer; + } + + /** + * __destruct. + * + * @return void + */ + public function __destruct() + { + if (isset($this->_data['files'])) { + \clearstatcache(); + \array_walk_recursive($this->_data['files'], function($value, $key){ + if ($key === 'tmp_name') { + if (\is_file($value)) { + \unlink($value); + } + } + }); + } + } +} diff --git a/vendor/workerman/workerman/Protocols/Http/Response.php b/vendor/workerman/workerman/Protocols/Http/Response.php new file mode 100644 index 0000000..a71cefa --- /dev/null +++ b/vendor/workerman/workerman/Protocols/Http/Response.php @@ -0,0 +1,458 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Protocols\Http; + +/** + * Class Response + * @package Workerman\Protocols\Http + */ +class Response +{ + /** + * Header data. + * + * @var array + */ + protected $_header = null; + + /** + * Http status. + * + * @var int + */ + protected $_status = null; + + /** + * Http reason. + * + * @var string + */ + protected $_reason = null; + + /** + * Http version. + * + * @var string + */ + protected $_version = '1.1'; + + /** + * Http body. + * + * @var string + */ + protected $_body = null; + + /** + * Send file info + * + * @var array + */ + public $file = null; + + /** + * Mine type map. + * @var array + */ + protected static $_mimeTypeMap = null; + + /** + * Phrases. + * + * @var array + */ + protected static $_phrases = array( + 100 => 'Continue', + 101 => 'Switching Protocols', + 102 => 'Processing', + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + 207 => 'Multi-status', + 208 => 'Already Reported', + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 306 => 'Switch Proxy', + 307 => 'Temporary Redirect', + 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 Time-out', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Large', + 415 => 'Unsupported Media Type', + 416 => 'Requested range not satisfiable', + 417 => 'Expectation Failed', + 418 => 'I\'m a teapot', + 422 => 'Unprocessable Entity', + 423 => 'Locked', + 424 => 'Failed Dependency', + 425 => 'Unordered Collection', + 426 => 'Upgrade Required', + 428 => 'Precondition Required', + 429 => 'Too Many Requests', + 431 => 'Request Header Fields Too Large', + 451 => 'Unavailable For Legal Reasons', + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Time-out', + 505 => 'HTTP Version not supported', + 506 => 'Variant Also Negotiates', + 507 => 'Insufficient Storage', + 508 => 'Loop Detected', + 511 => 'Network Authentication Required', + ); + + /** + * Init. + * + * @return void + */ + public static function init() { + static::initMimeTypeMap(); + } + + /** + * Response constructor. + * + * @param int $status + * @param array $headers + * @param string $body + */ + public function __construct( + $status = 200, + $headers = array(), + $body = '' + ) { + $this->_status = $status; + $this->_header = $headers; + $this->_body = (string)$body; + } + + /** + * Set header. + * + * @param string $name + * @param string $value + * @return $this + */ + public function header($name, $value) { + $this->_header[$name] = $value; + return $this; + } + + /** + * Set header. + * + * @param string $name + * @param string $value + * @return Response + */ + public function withHeader($name, $value) { + return $this->header($name, $value); + } + + /** + * Set headers. + * + * @param array $headers + * @return $this + */ + public function withHeaders($headers) { + $this->_header = \array_merge_recursive($this->_header, $headers); + return $this; + } + + /** + * Remove header. + * + * @param string $name + * @return $this + */ + public function withoutHeader($name) { + unset($this->_header[$name]); + return $this; + } + + /** + * Get header. + * + * @param string $name + * @return null|array|string + */ + public function getHeader($name) { + if (!isset($this->_header[$name])) { + return null; + } + return $this->_header[$name]; + } + + /** + * Get headers. + * + * @return array + */ + public function getHeaders() { + return $this->_header; + } + + /** + * Set status. + * + * @param int $code + * @param string|null $reason_phrase + * @return $this + */ + public function withStatus($code, $reason_phrase = null) { + $this->_status = $code; + $this->_reason = $reason_phrase; + return $this; + } + + /** + * Get status code. + * + * @return int + */ + public function getStatusCode() { + return $this->_status; + } + + /** + * Get reason phrase. + * + * @return string + */ + public function getReasonPhrase() { + return $this->_reason; + } + + /** + * Set protocol version. + * + * @param int $version + * @return $this + */ + public function withProtocolVersion($version) { + $this->_version = $version; + return $this; + } + + /** + * Set http body. + * + * @param string $body + * @return $this + */ + public function withBody($body) { + $this->_body = $body; + return $this; + } + + /** + * Get http raw body. + * + * @return string + */ + public function rawBody() { + return $this->_body; + } + + /** + * Send file. + * + * @param string $file + * @param int $offset + * @param int $length + * @return $this + */ + public function withFile($file, $offset = 0, $length = 0) { + if (!\is_file($file)) { + return $this->withStatus(404)->withBody('<h3>404 Not Found</h3>'); + } + $this->file = array('file' => $file, 'offset' => $offset, 'length' => $length); + return $this; + } + + /** + * Set cookie. + * + * @param $name + * @param string $value + * @param int $max_age + * @param string $path + * @param string $domain + * @param bool $secure + * @param bool $http_only + * @param bool $same_site + * @return $this + */ + public function cookie($name, $value = '', $max_age = null, $path = '', $domain = '', $secure = false, $http_only = false, $same_site = false) + { + $this->_header['Set-Cookie'][] = $name . '=' . \rawurlencode($value) + . (empty($domain) ? '' : '; Domain=' . $domain) + . ($max_age === null ? '' : '; Max-Age=' . $max_age) + . (empty($path) ? '' : '; Path=' . $path) + . (!$secure ? '' : '; Secure') + . (!$http_only ? '' : '; HttpOnly') + . (empty($same_site) ? '' : '; SameSite=' . $same_site); + return $this; + } + + /** + * Create header for file. + * + * @param array $file_info + * @return string + */ + protected function createHeadForFile($file_info) + { + $file = $file_info['file']; + $reason = $this->_reason ? $this->_reason : static::$_phrases[$this->_status]; + $head = "HTTP/{$this->_version} {$this->_status} $reason\r\n"; + $headers = $this->_header; + if (!isset($headers['Server'])) { + $head .= "Server: workerman\r\n"; + } + foreach ($headers as $name => $value) { + if (\is_array($value)) { + foreach ($value as $item) { + $head .= "$name: $item\r\n"; + } + continue; + } + $head .= "$name: $value\r\n"; + } + + if (!isset($headers['Connection'])) { + $head .= "Connection: keep-alive\r\n"; + } + + $file_info = \pathinfo($file); + $extension = isset($file_info['extension']) ? $file_info['extension'] : ''; + $base_name = isset($file_info['basename']) ? $file_info['basename'] : 'unknown'; + if (!isset($headers['Content-Type'])) { + if (isset(self::$_mimeTypeMap[$extension])) { + $head .= "Content-Type: " . self::$_mimeTypeMap[$extension] . "\r\n"; + } else { + $head .= "Content-Type: application/octet-stream\r\n"; + } + } + + if (!isset($headers['Content-Disposition']) && !isset(self::$_mimeTypeMap[$extension])) { + $head .= "Content-Disposition: attachment; filename=\"$base_name\"\r\n"; + } + + if (!isset($headers['Last-Modified'])) { + if ($mtime = \filemtime($file)) { + $head .= 'Last-Modified: '. \gmdate('D, d M Y H:i:s', $mtime) . ' GMT' . "\r\n"; + } + } + + return "{$head}\r\n"; + } + + /** + * __toString. + * + * @return string + */ + public function __toString() + { + if (isset($this->file)) { + return $this->createHeadForFile($this->file); + } + + $reason = $this->_reason ? $this->_reason : static::$_phrases[$this->_status]; + $body_len = \strlen($this->_body); + if (empty($this->_header)) { + return "HTTP/{$this->_version} {$this->_status} $reason\r\nServer: workerman\r\nContent-Type: text/html;charset=utf-8\r\nContent-Length: $body_len\r\nConnection: keep-alive\r\n\r\n{$this->_body}"; + } + + $head = "HTTP/{$this->_version} {$this->_status} $reason\r\n"; + $headers = $this->_header; + if (!isset($headers['Server'])) { + $head .= "Server: workerman\r\n"; + } + foreach ($headers as $name => $value) { + if (\is_array($value)) { + foreach ($value as $item) { + $head .= "$name: $item\r\n"; + } + continue; + } + $head .= "$name: $value\r\n"; + } + + if (!isset($headers['Connection'])) { + $head .= "Connection: keep-alive\r\n"; + } + + if (!isset($headers['Content-Type'])) { + $head .= "Content-Type: text/html;charset=utf-8\r\n"; + } else if ($headers['Content-Type'] === 'text/event-stream') { + return $head . $this->_body; + } + + if (!isset($headers['Transfer-Encoding'])) { + $head .= "Content-Length: $body_len\r\n\r\n"; + } else { + return "$head\r\n".dechex($body_len)."\r\n{$this->_body}\r\n"; + } + + // The whole http package + return $head . $this->_body; + } + + /** + * Init mime map. + * + * @return void + */ + public static function initMimeTypeMap() + { + $mime_file = __DIR__ . '/mime.types'; + $items = \file($mime_file, \FILE_IGNORE_NEW_LINES | \FILE_SKIP_EMPTY_LINES); + foreach ($items as $content) { + if (\preg_match("/\s*(\S+)\s+(\S.+)/", $content, $match)) { + $mime_type = $match[1]; + $extension_var = $match[2]; + $extension_array = \explode(' ', \substr($extension_var, 0, -1)); + foreach ($extension_array as $file_extension) { + static::$_mimeTypeMap[$file_extension] = $mime_type; + } + } + } + } +} +Response::init(); diff --git a/vendor/workerman/workerman/Protocols/Http/ServerSentEvents.php b/vendor/workerman/workerman/Protocols/Http/ServerSentEvents.php new file mode 100644 index 0000000..7aeafc7 --- /dev/null +++ b/vendor/workerman/workerman/Protocols/Http/ServerSentEvents.php @@ -0,0 +1,64 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Protocols\Http; + +/** + * Class ServerSentEvents + * @package Workerman\Protocols\Http + */ +class ServerSentEvents +{ + /** + * Data. + * @var array + */ + protected $_data = null; + + /** + * ServerSentEvents constructor. + * $data for example ['event'=>'ping', 'data' => 'some thing', 'id' => 1000, 'retry' => 5000] + * @param array $data + */ + public function __construct(array $data) + { + $this->_data = $data; + } + + /** + * __toString. + * + * @return string + */ + public function __toString() + { + $buffer = ''; + $data = $this->_data; + if (isset($data[''])) { + $buffer = ": {$data['']}\n"; + } + if (isset($data['event'])) { + $buffer .= "event: {$data['event']}\n"; + } + if (isset($data['data'])) { + $buffer .= 'data: ' . \str_replace("\n", "\ndata: ", $data['data']) . "\n\n"; + } + if (isset($data['id'])) { + $buffer .= "id: {$data['id']}\n"; + } + if (isset($data['retry'])) { + $buffer .= "retry: {$data['retry']}\n"; + } + return $buffer; + } +} \ No newline at end of file diff --git a/vendor/workerman/workerman/Protocols/Http/Session.php b/vendor/workerman/workerman/Protocols/Http/Session.php new file mode 100644 index 0000000..45735ce --- /dev/null +++ b/vendor/workerman/workerman/Protocols/Http/Session.php @@ -0,0 +1,441 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Workerman\Protocols\Http; + +use Workerman\Protocols\Http\Session\SessionHandlerInterface; + +/** + * Class Session + * @package Workerman\Protocols\Http + */ +class Session +{ + /** + * Session andler class which implements SessionHandlerInterface. + * + * @var string + */ + protected static $_handlerClass = 'Workerman\Protocols\Http\Session\FileSessionHandler'; + + /** + * Parameters of __constructor for session handler class. + * + * @var null + */ + protected static $_handlerConfig = null; + + /** + * Session name. + * + * @var string + */ + public static $name = 'PHPSID'; + + /** + * Auto update timestamp. + * + * @var bool + */ + public static $autoUpdateTimestamp = false; + + /** + * Session lifetime. + * + * @var int + */ + public static $lifetime = 1440; + + /** + * Cookie lifetime. + * + * @var int + */ + public static $cookieLifetime = 1440; + + /** + * Session cookie path. + * + * @var string + */ + public static $cookiePath = '/'; + + /** + * Session cookie domain. + * + * @var string + */ + public static $domain = ''; + + /** + * HTTPS only cookies. + * + * @var bool + */ + public static $secure = false; + + /** + * HTTP access only. + * + * @var bool + */ + public static $httpOnly = true; + + /** + * Same-site cookies. + * + * @var string + */ + public static $sameSite = ''; + + /** + * Gc probability. + * + * @var int[] + */ + public static $gcProbability = [1, 1000]; + + /** + * Session handler instance. + * + * @var SessionHandlerInterface + */ + protected static $_handler = null; + + /** + * Session data. + * + * @var array + */ + protected $_data = []; + + /** + * Session changed and need to save. + * + * @var bool + */ + protected $_needSave = false; + + /** + * Session id. + * + * @var null + */ + protected $_sessionId = null; + + /** + * Session constructor. + * + * @param string $session_id + */ + public function __construct($session_id) + { + static::checkSessionId($session_id); + if (static::$_handler === null) { + static::initHandler(); + } + $this->_sessionId = $session_id; + if ($data = static::$_handler->read($session_id)) { + $this->_data = \unserialize($data); + } + } + + /** + * Get session id. + * + * @return string + */ + public function getId() + { + return $this->_sessionId; + } + + /** + * Get session. + * + * @param string $name + * @param mixed|null $default + * @return mixed|null + */ + public function get($name, $default = null) + { + return isset($this->_data[$name]) ? $this->_data[$name] : $default; + } + + /** + * Store data in the session. + * + * @param string $name + * @param mixed $value + */ + public function set($name, $value) + { + $this->_data[$name] = $value; + $this->_needSave = true; + } + + /** + * Delete an item from the session. + * + * @param string $name + */ + public function delete($name) + { + unset($this->_data[$name]); + $this->_needSave = true; + } + + /** + * Retrieve and delete an item from the session. + * + * @param string $name + * @param mixed|null $default + * @return mixed|null + */ + public function pull($name, $default = null) + { + $value = $this->get($name, $default); + $this->delete($name); + return $value; + } + + /** + * Store data in the session. + * + * @param string|array $key + * @param mixed|null $value + */ + public function put($key, $value = null) + { + if (!\is_array($key)) { + $this->set($key, $value); + return; + } + + foreach ($key as $k => $v) { + $this->_data[$k] = $v; + } + $this->_needSave = true; + } + + /** + * Remove a piece of data from the session. + * + * @param string $name + */ + public function forget($name) + { + if (\is_scalar($name)) { + $this->delete($name); + return; + } + if (\is_array($name)) { + foreach ($name as $key) { + unset($this->_data[$key]); + } + } + $this->_needSave = true; + } + + /** + * Retrieve all the data in the session. + * + * @return array + */ + public function all() + { + return $this->_data; + } + + /** + * Remove all data from the session. + * + * @return void + */ + public function flush() + { + $this->_needSave = true; + $this->_data = []; + } + + /** + * Determining If An Item Exists In The Session. + * + * @param string $name + * @return bool + */ + public function has($name) + { + return isset($this->_data[$name]); + } + + /** + * To determine if an item is present in the session, even if its value is null. + * + * @param string $name + * @return bool + */ + public function exists($name) + { + return \array_key_exists($name, $this->_data); + } + + /** + * Save session to store. + * + * @return void + */ + public function save() + { + if ($this->_needSave) { + if (empty($this->_data)) { + static::$_handler->destroy($this->_sessionId); + } else { + static::$_handler->write($this->_sessionId, \serialize($this->_data)); + } + } elseif (static::$autoUpdateTimestamp) { + static::refresh(); + } + $this->_needSave = false; + } + + /** + * Refresh session expire time. + * + * @return bool + */ + public function refresh() + { + static::$_handler->updateTimestamp($this->getId()); + } + + /** + * Init. + * + * @return void + */ + public static function init() + { + if (($gc_probability = (int)\ini_get('session.gc_probability')) && ($gc_divisor = (int)\ini_get('session.gc_divisor'))) { + static::$gcProbability = [$gc_probability, $gc_divisor]; + } + + if ($gc_max_life_time = \ini_get('session.gc_maxlifetime')) { + self::$lifetime = (int)$gc_max_life_time; + } + + $session_cookie_params = \session_get_cookie_params(); + static::$cookieLifetime = $session_cookie_params['lifetime']; + static::$cookiePath = $session_cookie_params['path']; + static::$domain = $session_cookie_params['domain']; + static::$secure = $session_cookie_params['secure']; + static::$httpOnly = $session_cookie_params['httponly']; + } + + /** + * Set session handler class. + * + * @param mixed|null $class_name + * @param mixed|null $config + * @return string + */ + public static function handlerClass($class_name = null, $config = null) + { + if ($class_name) { + static::$_handlerClass = $class_name; + } + if ($config) { + static::$_handlerConfig = $config; + } + return static::$_handlerClass; + } + + /** + * Get cookie params. + * + * @return array + */ + public static function getCookieParams() + { + return [ + 'lifetime' => static::$cookieLifetime, + 'path' => static::$cookiePath, + 'domain' => static::$domain, + 'secure' => static::$secure, + 'httponly' => static::$httpOnly, + 'samesite' => static::$sameSite, + ]; + } + + /** + * Init handler. + * + * @return void + */ + protected static function initHandler() + { + if (static::$_handlerConfig === null) { + static::$_handler = new static::$_handlerClass(); + } else { + static::$_handler = new static::$_handlerClass(static::$_handlerConfig); + } + } + + /** + * GC sessions. + * + * @return void + */ + public function gc() + { + static::$_handler->gc(static::$lifetime); + } + + /** + * __destruct. + * + * @return void + */ + public function __destruct() + { + $this->save(); + if (\random_int(1, static::$gcProbability[1]) <= static::$gcProbability[0]) { + $this->gc(); + } + } + + /** + * Check session id. + * + * @param string $session_id + */ + protected static function checkSessionId($session_id) + { + if (!\preg_match('/^[a-zA-Z0-9]+$/', $session_id)) { + throw new SessionException("session_id $session_id is invalid"); + } + } +} + +/** + * Class SessionException + * @package Workerman\Protocols\Http + */ +class SessionException extends \RuntimeException +{ + +} + +// Init session. +Session::init(); diff --git a/vendor/workerman/workerman/Protocols/Http/Session/FileSessionHandler.php b/vendor/workerman/workerman/Protocols/Http/Session/FileSessionHandler.php new file mode 100644 index 0000000..a7cefbd --- /dev/null +++ b/vendor/workerman/workerman/Protocols/Http/Session/FileSessionHandler.php @@ -0,0 +1,183 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Protocols\Http\Session; + +use Workerman\Protocols\Http\Session; + +/** + * Class FileSessionHandler + * @package Workerman\Protocols\Http\Session + */ +class FileSessionHandler implements SessionHandlerInterface +{ + /** + * Session save path. + * + * @var string + */ + protected static $_sessionSavePath = null; + + /** + * Session file prefix. + * + * @var string + */ + protected static $_sessionFilePrefix = 'session_'; + + /** + * Init. + */ + public static function init() { + $save_path = @\session_save_path(); + if (!$save_path || \strpos($save_path, 'tcp://') === 0) { + $save_path = \sys_get_temp_dir(); + } + static::sessionSavePath($save_path); + } + + /** + * FileSessionHandler constructor. + * @param array $config + */ + public function __construct($config = array()) { + if (isset($config['save_path'])) { + static::sessionSavePath($config['save_path']); + } + } + + /** + * {@inheritdoc} + */ + public function open($save_path, $name) + { + return true; + } + + /** + * {@inheritdoc} + */ + public function read($session_id) + { + $session_file = static::sessionFile($session_id); + \clearstatcache(); + if (\is_file($session_file)) { + if (\time() - \filemtime($session_file) > Session::$lifetime) { + \unlink($session_file); + return ''; + } + $data = \file_get_contents($session_file); + return $data ? $data : ''; + } + return ''; + } + + /** + * {@inheritdoc} + */ + public function write($session_id, $session_data) + { + $temp_file = static::$_sessionSavePath . uniqid(bin2hex(random_bytes(8)), true); + if (!\file_put_contents($temp_file, $session_data)) { + return false; + } + return \rename($temp_file, static::sessionFile($session_id)); + } + + /** + * Update sesstion modify time. + * + * @see https://www.php.net/manual/en/class.sessionupdatetimestamphandlerinterface.php + * @see https://www.php.net/manual/zh/function.touch.php + * + * @param string $id Session id. + * @param string $data Session Data. + * + * @return bool + */ + public function updateTimestamp($id, $data = "") + { + $session_file = static::sessionFile($id); + if (!file_exists($session_file)) { + return false; + } + // set file modify time to current time + $set_modify_time = \touch($session_file); + // clear file stat cache + \clearstatcache(); + return $set_modify_time; + } + + /** + * {@inheritdoc} + */ + public function close() + { + return true; + } + + /** + * {@inheritdoc} + */ + public function destroy($session_id) + { + $session_file = static::sessionFile($session_id); + if (\is_file($session_file)) { + \unlink($session_file); + } + return true; + } + + /** + * {@inheritdoc} + */ + public function gc($maxlifetime) { + $time_now = \time(); + foreach (\glob(static::$_sessionSavePath . static::$_sessionFilePrefix . '*') as $file) { + if(\is_file($file) && $time_now - \filemtime($file) > $maxlifetime) { + \unlink($file); + } + } + } + + /** + * Get session file path. + * + * @param string $session_id + * @return string + */ + protected static function sessionFile($session_id) { + return static::$_sessionSavePath.static::$_sessionFilePrefix.$session_id; + } + + /** + * Get or set session file path. + * + * @param string $path + * @return string + */ + public static function sessionSavePath($path) { + if ($path) { + if ($path[\strlen($path)-1] !== DIRECTORY_SEPARATOR) { + $path .= DIRECTORY_SEPARATOR; + } + static::$_sessionSavePath = $path; + if (!\is_dir($path)) { + \mkdir($path, 0777, true); + } + } + return $path; + } +} + +FileSessionHandler::init(); \ No newline at end of file diff --git a/vendor/workerman/workerman/Protocols/Http/Session/RedisClusterSessionHandler.php b/vendor/workerman/workerman/Protocols/Http/Session/RedisClusterSessionHandler.php new file mode 100644 index 0000000..281759a --- /dev/null +++ b/vendor/workerman/workerman/Protocols/Http/Session/RedisClusterSessionHandler.php @@ -0,0 +1,46 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Workerman\Protocols\Http\Session; + +use Workerman\Protocols\Http\Session; + +class RedisClusterSessionHandler extends RedisSessionHandler +{ + public function __construct($config) + { + $timeout = isset($config['timeout']) ? $config['timeout'] : 2; + $read_timeout = isset($config['read_timeout']) ? $config['read_timeout'] : $timeout; + $persistent = isset($config['persistent']) ? $config['persistent'] : false; + $auth = isset($config['auth']) ? $config['auth'] : ''; + if ($auth) { + $this->_redis = new \RedisCluster(null, $config['host'], $timeout, $read_timeout, $persistent, $auth); + } else { + $this->_redis = new \RedisCluster(null, $config['host'], $timeout, $read_timeout, $persistent); + } + if (empty($config['prefix'])) { + $config['prefix'] = 'redis_session_'; + } + $this->_redis->setOption(\Redis::OPT_PREFIX, $config['prefix']); + } + + /** + * {@inheritdoc} + */ + public function read($session_id) + { + return $this->_redis->get($session_id); + } + +} diff --git a/vendor/workerman/workerman/Protocols/Http/Session/RedisSessionHandler.php b/vendor/workerman/workerman/Protocols/Http/Session/RedisSessionHandler.php new file mode 100644 index 0000000..e1b5bd5 --- /dev/null +++ b/vendor/workerman/workerman/Protocols/Http/Session/RedisSessionHandler.php @@ -0,0 +1,154 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Protocols\Http\Session; + +use Workerman\Protocols\Http\Session; +use Workerman\Timer; +use RedisException; + +/** + * Class RedisSessionHandler + * @package Workerman\Protocols\Http\Session + */ +class RedisSessionHandler implements SessionHandlerInterface +{ + + /** + * @var \Redis + */ + protected $_redis; + + /** + * @var array + */ + protected $_config; + + /** + * RedisSessionHandler constructor. + * @param array $config = [ + * 'host' => '127.0.0.1', + * 'port' => 6379, + * 'timeout' => 2, + * 'auth' => '******', + * 'database' => 2, + * 'prefix' => 'redis_session_', + * 'ping' => 55, + * ] + */ + public function __construct($config) + { + if (false === extension_loaded('redis')) { + throw new \RuntimeException('Please install redis extension.'); + } + + if (!isset($config['timeout'])) { + $config['timeout'] = 2; + } + + $this->_config = $config; + + $this->connect(); + + Timer::add(!empty($config['ping']) ? $config['ping'] : 55, function () { + $this->_redis->get('ping'); + }); + } + + public function connect() + { + $config = $this->_config; + + $this->_redis = new \Redis(); + if (false === $this->_redis->connect($config['host'], $config['port'], $config['timeout'])) { + throw new \RuntimeException("Redis connect {$config['host']}:{$config['port']} fail."); + } + if (!empty($config['auth'])) { + $this->_redis->auth($config['auth']); + } + if (!empty($config['database'])) { + $this->_redis->select($config['database']); + } + if (empty($config['prefix'])) { + $config['prefix'] = 'redis_session_'; + } + $this->_redis->setOption(\Redis::OPT_PREFIX, $config['prefix']); + } + + /** + * {@inheritdoc} + */ + public function open($save_path, $name) + { + return true; + } + + /** + * {@inheritdoc} + */ + public function read($session_id) + { + try { + return $this->_redis->get($session_id); + } catch (RedisException $e) { + $msg = strtolower($e->getMessage()); + if ($msg === 'connection lost' || strpos($msg, 'went away')) { + $this->connect(); + return $this->_redis->get($session_id); + } + throw $e; + } + + } + + /** + * {@inheritdoc} + */ + public function write($session_id, $session_data) + { + return true === $this->_redis->setex($session_id, Session::$lifetime, $session_data); + } + + /** + * {@inheritdoc} + */ + public function updateTimestamp($id, $data = "") + { + return true === $this->_redis->expire($id, Session::$lifetime); + } + + /** + * {@inheritdoc} + */ + public function destroy($session_id) + { + $this->_redis->del($session_id); + return true; + } + + /** + * {@inheritdoc} + */ + public function close() + { + return true; + } + + /** + * {@inheritdoc} + */ + public function gc($maxlifetime) + { + return true; + } +} diff --git a/vendor/workerman/workerman/Protocols/Http/Session/SessionHandlerInterface.php b/vendor/workerman/workerman/Protocols/Http/Session/SessionHandlerInterface.php new file mode 100644 index 0000000..23a47f2 --- /dev/null +++ b/vendor/workerman/workerman/Protocols/Http/Session/SessionHandlerInterface.php @@ -0,0 +1,114 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Protocols\Http\Session; + +interface SessionHandlerInterface +{ + /** + * Close the session + * @link http://php.net/manual/en/sessionhandlerinterface.close.php + * @return bool <p> + * The return value (usually TRUE on success, FALSE on failure). + * Note this value is returned internally to PHP for processing. + * </p> + * @since 5.4.0 + */ + public function close(); + + /** + * Destroy a session + * @link http://php.net/manual/en/sessionhandlerinterface.destroy.php + * @param string $session_id The session ID being destroyed. + * @return bool <p> + * The return value (usually TRUE on success, FALSE on failure). + * Note this value is returned internally to PHP for processing. + * </p> + * @since 5.4.0 + */ + public function destroy($session_id); + + /** + * Cleanup old sessions + * @link http://php.net/manual/en/sessionhandlerinterface.gc.php + * @param int $maxlifetime <p> + * Sessions that have not updated for + * the last maxlifetime seconds will be removed. + * </p> + * @return bool <p> + * The return value (usually TRUE on success, FALSE on failure). + * Note this value is returned internally to PHP for processing. + * </p> + * @since 5.4.0 + */ + public function gc($maxlifetime); + + /** + * Initialize session + * @link http://php.net/manual/en/sessionhandlerinterface.open.php + * @param string $save_path The path where to store/retrieve the session. + * @param string $name The session name. + * @return bool <p> + * The return value (usually TRUE on success, FALSE on failure). + * Note this value is returned internally to PHP for processing. + * </p> + * @since 5.4.0 + */ + public function open($save_path, $name); + + + /** + * Read session data + * @link http://php.net/manual/en/sessionhandlerinterface.read.php + * @param string $session_id The session id to read data for. + * @return string <p> + * Returns an encoded string of the read data. + * If nothing was read, it must return an empty string. + * Note this value is returned internally to PHP for processing. + * </p> + * @since 5.4.0 + */ + public function read($session_id); + + /** + * Write session data + * @link http://php.net/manual/en/sessionhandlerinterface.write.php + * @param string $session_id The session id. + * @param string $session_data <p> + * The encoded session data. This data is the + * result of the PHP internally encoding + * the $_SESSION superglobal to a serialized + * string and passing it as this parameter. + * Please note sessions use an alternative serialization method. + * </p> + * @return bool <p> + * The return value (usually TRUE on success, FALSE on failure). + * Note this value is returned internally to PHP for processing. + * </p> + * @since 5.4.0 + */ + public function write($session_id, $session_data); + + /** + * Update sesstion modify time. + * + * @see https://www.php.net/manual/en/class.sessionupdatetimestamphandlerinterface.php + * + * @param string $id Session id. + * @param string $data Session Data. + * + * @return bool + */ + public function updateTimestamp($id, $data = ""); + +} diff --git a/vendor/workerman/workerman/Protocols/Http/mime.types b/vendor/workerman/workerman/Protocols/Http/mime.types new file mode 100644 index 0000000..e6ccf0a --- /dev/null +++ b/vendor/workerman/workerman/Protocols/Http/mime.types @@ -0,0 +1,90 @@ + +types { + text/html html htm shtml; + text/css css; + text/xml xml; + image/gif gif; + image/jpeg jpeg jpg; + application/javascript js; + application/atom+xml atom; + application/rss+xml rss; + + text/mathml mml; + text/plain txt; + text/vnd.sun.j2me.app-descriptor jad; + text/vnd.wap.wml wml; + text/x-component htc; + + image/png png; + image/tiff tif tiff; + image/vnd.wap.wbmp wbmp; + image/x-icon ico; + image/x-jng jng; + image/x-ms-bmp bmp; + image/svg+xml svg svgz; + image/webp webp; + + application/font-woff woff; + application/java-archive jar war ear; + application/json json; + application/mac-binhex40 hqx; + application/msword doc; + application/pdf pdf; + application/postscript ps eps ai; + application/rtf rtf; + application/vnd.apple.mpegurl m3u8; + application/vnd.ms-excel xls; + application/vnd.ms-fontobject eot; + application/vnd.ms-powerpoint ppt; + application/vnd.wap.wmlc wmlc; + application/vnd.google-earth.kml+xml kml; + application/vnd.google-earth.kmz kmz; + application/x-7z-compressed 7z; + application/x-cocoa cco; + application/x-java-archive-diff jardiff; + application/x-java-jnlp-file jnlp; + application/x-makeself run; + application/x-perl pl pm; + application/x-pilot prc pdb; + application/x-rar-compressed rar; + application/x-redhat-package-manager rpm; + application/x-sea sea; + application/x-shockwave-flash swf; + application/x-stuffit sit; + application/x-tcl tcl tk; + application/x-x509-ca-cert der pem crt; + application/x-xpinstall xpi; + application/xhtml+xml xhtml; + application/xspf+xml xspf; + application/zip zip; + + application/octet-stream bin exe dll; + application/octet-stream deb; + application/octet-stream dmg; + application/octet-stream iso img; + application/octet-stream msi msp msm; + + application/vnd.openxmlformats-officedocument.wordprocessingml.document docx; + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx; + application/vnd.openxmlformats-officedocument.presentationml.presentation pptx; + + audio/midi mid midi kar; + audio/mpeg mp3; + audio/ogg ogg; + audio/x-m4a m4a; + audio/x-realaudio ra; + + video/3gpp 3gpp 3gp; + video/mp2t ts; + video/mp4 mp4; + video/mpeg mpeg mpg; + video/quicktime mov; + video/webm webm; + video/x-flv flv; + video/x-m4v m4v; + video/x-mng mng; + video/x-ms-asf asx asf; + video/x-ms-wmv wmv; + video/x-msvideo avi; + font/ttf ttf; +} diff --git a/vendor/workerman/workerman/Protocols/ProtocolInterface.php b/vendor/workerman/workerman/Protocols/ProtocolInterface.php new file mode 100644 index 0000000..4fea87d --- /dev/null +++ b/vendor/workerman/workerman/Protocols/ProtocolInterface.php @@ -0,0 +1,52 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Protocols; + +use Workerman\Connection\ConnectionInterface; + +/** + * Protocol interface + */ +interface ProtocolInterface +{ + /** + * Check the integrity of the package. + * Please return the length of package. + * If length is unknow please return 0 that mean wating more data. + * If the package has something wrong please return false the connection will be closed. + * + * @param string $recv_buffer + * @param ConnectionInterface $connection + * @return int|false + */ + public static function input($recv_buffer, ConnectionInterface $connection); + + /** + * Decode package and emit onMessage($message) callback, $message is the result that decode returned. + * + * @param string $recv_buffer + * @param ConnectionInterface $connection + * @return mixed + */ + public static function decode($recv_buffer, ConnectionInterface $connection); + + /** + * Encode package brefore sending to client. + * + * @param mixed $data + * @param ConnectionInterface $connection + * @return string + */ + public static function encode($data, ConnectionInterface $connection); +} diff --git a/vendor/workerman/workerman/Protocols/Text.php b/vendor/workerman/workerman/Protocols/Text.php new file mode 100644 index 0000000..407ea2d --- /dev/null +++ b/vendor/workerman/workerman/Protocols/Text.php @@ -0,0 +1,70 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Protocols; + +use Workerman\Connection\ConnectionInterface; + +/** + * Text Protocol. + */ +class Text +{ + /** + * Check the integrity of the package. + * + * @param string $buffer + * @param ConnectionInterface $connection + * @return int + */ + public static function input($buffer, ConnectionInterface $connection) + { + // Judge whether the package length exceeds the limit. + if (isset($connection->maxPackageSize) && \strlen($buffer) >= $connection->maxPackageSize) { + $connection->close(); + return 0; + } + // Find the position of "\n". + $pos = \strpos($buffer, "\n"); + // No "\n", packet length is unknown, continue to wait for the data so return 0. + if ($pos === false) { + return 0; + } + // Return the current package length. + return $pos + 1; + } + + /** + * Encode. + * + * @param string $buffer + * @return string + */ + public static function encode($buffer) + { + // Add "\n" + return $buffer . "\n"; + } + + /** + * Decode. + * + * @param string $buffer + * @return string + */ + public static function decode($buffer) + { + // Remove "\n" + return \rtrim($buffer, "\r\n"); + } +} \ No newline at end of file diff --git a/vendor/workerman/workerman/Protocols/Websocket.php b/vendor/workerman/workerman/Protocols/Websocket.php new file mode 100644 index 0000000..4136e4c --- /dev/null +++ b/vendor/workerman/workerman/Protocols/Websocket.php @@ -0,0 +1,564 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace Workerman\Protocols; + +use Workerman\Connection\ConnectionInterface; +use Workerman\Connection\TcpConnection; +use Workerman\Protocols\Http\Request; +use Workerman\Worker; + +/** + * WebSocket protocol. + */ +class Websocket implements \Workerman\Protocols\ProtocolInterface +{ + /** + * Websocket blob type. + * + * @var string + */ + const BINARY_TYPE_BLOB = "\x81"; + + /** + * Websocket blob type. + * + * @var string + */ + const BINARY_TYPE_BLOB_DEFLATE = "\xc1"; + + /** + * Websocket arraybuffer type. + * + * @var string + */ + const BINARY_TYPE_ARRAYBUFFER = "\x82"; + + /** + * Websocket arraybuffer type. + * + * @var string + */ + const BINARY_TYPE_ARRAYBUFFER_DEFLATE = "\xc2"; + + /** + * Check the integrity of the package. + * + * @param string $buffer + * @param ConnectionInterface $connection + * @return int + */ + public static function input($buffer, ConnectionInterface $connection) + { + // Receive length. + $recv_len = \strlen($buffer); + // We need more data. + if ($recv_len < 6) { + return 0; + } + + // Has not yet completed the handshake. + if (empty($connection->context->websocketHandshake)) { + return static::dealHandshake($buffer, $connection); + } + + // Buffer websocket frame data. + if ($connection->context->websocketCurrentFrameLength) { + // We need more frame data. + if ($connection->context->websocketCurrentFrameLength > $recv_len) { + // Return 0, because it is not clear the full packet length, waiting for the frame of fin=1. + return 0; + } + } else { + $first_byte = \ord($buffer[0]); + $second_byte = \ord($buffer[1]); + $data_len = $second_byte & 127; + $is_fin_frame = $first_byte >> 7; + $masked = $second_byte >> 7; + + if (!$masked) { + Worker::safeEcho("frame not masked so close the connection\n"); + $connection->close(); + return 0; + } + + $opcode = $first_byte & 0xf; + switch ($opcode) { + case 0x0: + break; + // Blob type. + case 0x1: + break; + // Arraybuffer type. + case 0x2: + break; + // Close package. + case 0x8: + // Try to emit onWebSocketClose callback. + $close_cb = $connection->onWebSocketClose ?? $connection->worker->onWebSocketClose ?? false; + if ($close_cb) { + try { + $close_cb($connection); + } catch (\Throwable $e) { + Worker::stopAll(250, $e); + } + } // Close connection. + else { + $connection->close("\x88\x02\x03\xe8", true); + } + return 0; + // Ping package. + case 0x9: + break; + // Pong package. + case 0xa: + break; + // Wrong opcode. + default : + Worker::safeEcho("error opcode $opcode and close websocket connection. Buffer:" . bin2hex($buffer) . "\n"); + $connection->close(); + return 0; + } + + // Calculate packet length. + $head_len = 6; + if ($data_len === 126) { + $head_len = 8; + if ($head_len > $recv_len) { + return 0; + } + $pack = \unpack('nn/ntotal_len', $buffer); + $data_len = $pack['total_len']; + } else { + if ($data_len === 127) { + $head_len = 14; + if ($head_len > $recv_len) { + return 0; + } + $arr = \unpack('n/N2c', $buffer); + $data_len = $arr['c1'] * 4294967296 + $arr['c2']; + } + } + $current_frame_length = $head_len + $data_len; + + $total_package_size = \strlen($connection->context->websocketDataBuffer) + $current_frame_length; + if ($total_package_size > $connection->maxPackageSize) { + Worker::safeEcho("error package. package_length=$total_package_size\n"); + $connection->close(); + return 0; + } + + if ($is_fin_frame) { + if ($opcode === 0x9) { + if ($recv_len >= $current_frame_length) { + $ping_data = static::decode(\substr($buffer, 0, $current_frame_length), $connection); + $connection->consumeRecvBuffer($current_frame_length); + $tmp_connection_type = isset($connection->websocketType) ? $connection->websocketType : static::BINARY_TYPE_BLOB; + $connection->websocketType = "\x8a"; + $ping_cb = $connection->onWebSocketPing ?? $connection->worker->onWebSocketPing ?? false; + if ($ping_cb) { + try { + $ping_cb($connection, $ping_data); + } catch (\Throwable $e) { + Worker::stopAll(250, $e); + } + } else { + $connection->send($ping_data); + } + $connection->websocketType = $tmp_connection_type; + if ($recv_len > $current_frame_length) { + return static::input(\substr($buffer, $current_frame_length), $connection); + } + } + return 0; + } else if ($opcode === 0xa) { + if ($recv_len >= $current_frame_length) { + $pong_data = static::decode(\substr($buffer, 0, $current_frame_length), $connection); + $connection->consumeRecvBuffer($current_frame_length); + $tmp_connection_type = isset($connection->websocketType) ? $connection->websocketType : static::BINARY_TYPE_BLOB; + $connection->websocketType = "\x8a"; + // Try to emit onWebSocketPong callback. + $pong_cb = $connection->onWebSocketPong ?? $connection->worker->onWebSocketPong ?? false; + if ($pong_cb) { + try { + $pong_cb($connection, $pong_data); + } catch (\Throwable $e) { + Worker::stopAll(250, $e); + } + } + $connection->websocketType = $tmp_connection_type; + if ($recv_len > $current_frame_length) { + return static::input(\substr($buffer, $current_frame_length), $connection); + } + } + return 0; + } + return $current_frame_length; + } else { + $connection->context->websocketCurrentFrameLength = $current_frame_length; + } + } + + // Received just a frame length data. + if ($connection->context->websocketCurrentFrameLength === $recv_len) { + static::decode($buffer, $connection); + $connection->consumeRecvBuffer($connection->context->websocketCurrentFrameLength); + $connection->context->websocketCurrentFrameLength = 0; + return 0; + } // The length of the received data is greater than the length of a frame. + elseif ($connection->context->websocketCurrentFrameLength < $recv_len) { + static::decode(\substr($buffer, 0, $connection->context->websocketCurrentFrameLength), $connection); + $connection->consumeRecvBuffer($connection->context->websocketCurrentFrameLength); + $current_frame_length = $connection->context->websocketCurrentFrameLength; + $connection->context->websocketCurrentFrameLength = 0; + // Continue to read next frame. + return static::input(\substr($buffer, $current_frame_length), $connection); + } // The length of the received data is less than the length of a frame. + else { + return 0; + } + } + + /** + * Websocket encode. + * + * @param string $buffer + * @param ConnectionInterface $connection + * @return string + */ + public static function encode($buffer, ConnectionInterface $connection) + { + if (!is_scalar($buffer)) { + throw new \Exception("You can't send(" . \gettype($buffer) . ") to client, you need to convert it to a string. "); + } + + if (empty($connection->websocketType)) { + $connection->websocketType = static::BINARY_TYPE_BLOB; + } + + // permessage-deflate + if (\ord($connection->websocketType) & 64) { + $buffer = static::deflate($connection, $buffer); + } + + $first_byte = $connection->websocketType; + $len = \strlen($buffer); + + if ($len <= 125) { + $encode_buffer = $first_byte . \chr($len) . $buffer; + } else { + if ($len <= 65535) { + $encode_buffer = $first_byte . \chr(126) . \pack("n", $len) . $buffer; + } else { + $encode_buffer = $first_byte . \chr(127) . \pack("xxxxN", $len) . $buffer; + } + } + + // Handshake not completed so temporary buffer websocket data waiting for send. + if (empty($connection->context->websocketHandshake)) { + if (empty($connection->context->tmpWebsocketData)) { + $connection->context->tmpWebsocketData = ''; + } + // If buffer has already full then discard the current package. + if (\strlen($connection->context->tmpWebsocketData) > $connection->maxSendBufferSize) { + if ($connection->onError) { + try { + ($connection->onError)($connection, ConnectionInterface::SEND_FAIL, 'send buffer full and drop package'); + } catch (\Throwable $e) { + Worker::stopAll(250, $e); + } + } + return ''; + } + $connection->context->tmpWebsocketData .= $encode_buffer; + // Check buffer is full. + if ($connection->maxSendBufferSize <= \strlen($connection->context->tmpWebsocketData)) { + if ($connection->onBufferFull) { + try { + ($connection->onBufferFull)($connection); + } catch (\Throwable $e) { + Worker::stopAll(250, $e); + } + } + } + // Return empty string. + return ''; + } + + return $encode_buffer; + } + + /** + * Websocket decode. + * + * @param string $buffer + * @param ConnectionInterface $connection + * @return string + */ + public static function decode($buffer, ConnectionInterface $connection) + { + $first_byte = \ord($buffer[0]); + $second_byte = \ord($buffer[1]); + $len = $second_byte & 127; + $is_fin_frame = $first_byte >> 7; + $rsv1 = 64 === ($first_byte & 64); + + if ($len === 126) { + $masks = \substr($buffer, 4, 4); + $data = \substr($buffer, 8); + } else { + if ($len === 127) { + $masks = \substr($buffer, 10, 4); + $data = \substr($buffer, 14); + } else { + $masks = \substr($buffer, 2, 4); + $data = \substr($buffer, 6); + } + } + $dataLength = \strlen($data); + $masks = \str_repeat($masks, \floor($dataLength / 4)) . \substr($masks, 0, $dataLength % 4); + $decoded = $data ^ $masks; + if ($connection->context->websocketCurrentFrameLength) { + $connection->context->websocketDataBuffer .= $decoded; + if ($rsv1) { + return static::inflate($connection, $connection->context->websocketDataBuffer, $is_fin_frame); + } + return $connection->context->websocketDataBuffer; + } else { + if ($connection->context->websocketDataBuffer !== '') { + $decoded = $connection->context->websocketDataBuffer . $decoded; + $connection->context->websocketDataBuffer = ''; + } + if ($rsv1) { + return static::inflate($connection, $decoded, $is_fin_frame); + } + return $decoded; + } + } + + /** + * Inflate. + * + * @param $connection + * @param $buffer + * @param $is_fin_frame + * @return false|string + */ + protected static function inflate($connection, $buffer, $is_fin_frame) + { + if (!isset($connection->context->inflator)) { + $connection->context->inflator = \inflate_init( + \ZLIB_ENCODING_RAW, + [ + 'level' => -1, + 'memory' => 8, + 'window' => 9, + 'strategy' => \ZLIB_DEFAULT_STRATEGY + ] + ); + } + if ($is_fin_frame) { + $buffer .= "\x00\x00\xff\xff"; + } + return \inflate_add($connection->context->inflator, $buffer); + } + + /** + * Deflate. + * + * @param $connection + * @param $buffer + * @return false|string + */ + protected static function deflate($connection, $buffer) + { + if (!isset($connection->context->deflator)) { + $connection->context->deflator = \deflate_init( + \ZLIB_ENCODING_RAW, + [ + 'level' => -1, + 'memory' => 8, + 'window' => 9, + 'strategy' => \ZLIB_DEFAULT_STRATEGY + ] + ); + } + return \substr(\deflate_add($connection->context->deflator, $buffer), 0, -4); + } + + /** + * Websocket handshake. + * + * @param string $buffer + * @param TcpConnection $connection + * @return int + */ + public static function dealHandshake($buffer, $connection) + { + // HTTP protocol. + if (0 === \strpos($buffer, 'GET')) { + // Find \r\n\r\n. + $header_end_pos = \strpos($buffer, "\r\n\r\n"); + if (!$header_end_pos) { + return 0; + } + $header_length = $header_end_pos + 4; + + // Get Sec-WebSocket-Key. + $Sec_WebSocket_Key = ''; + if (\preg_match("/Sec-WebSocket-Key: *(.*?)\r\n/i", $buffer, $match)) { + $Sec_WebSocket_Key = $match[1]; + } else { + $connection->close("HTTP/1.1 200 WebSocket\r\nServer: workerman/" . Worker::VERSION . "\r\n\r\n<div style=\"text-align:center\"><h1>WebSocket</h1><hr>workerman/" . Worker::VERSION . "</div>", + true); + return 0; + } + // Calculation websocket key. + $new_key = \base64_encode(\sha1($Sec_WebSocket_Key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true)); + // Handshake response data. + $handshake_message = "HTTP/1.1 101 Switching Protocols\r\n" + . "Upgrade: websocket\r\n" + . "Sec-WebSocket-Version: 13\r\n" + . "Connection: Upgrade\r\n" + . "Sec-WebSocket-Accept: " . $new_key . "\r\n"; + + // Websocket data buffer. + $connection->context->websocketDataBuffer = ''; + // Current websocket frame length. + $connection->context->websocketCurrentFrameLength = 0; + // Current websocket frame data. + $connection->context->websocketCurrentFrameBuffer = ''; + // Consume handshake data. + $connection->consumeRecvBuffer($header_length); + + // Try to emit onWebSocketConnect callback. + $on_websocket_connect = $connection->onWebSocketConnect ?? $connection->worker->onWebSocketConnect ?? false; + if ($on_websocket_connect) { + static::parseHttpHeader($buffer); + try { + \call_user_func($on_websocket_connect, $connection, $buffer); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + if (!empty($_SESSION) && \class_exists('\GatewayWorker\Lib\Context')) { + $connection->session = \GatewayWorker\Lib\Context::sessionEncode($_SESSION); + } + $_GET = $_SERVER = $_SESSION = $_COOKIE = array(); + } + + // blob or arraybuffer + if (empty($connection->websocketType)) { + $connection->websocketType = static::BINARY_TYPE_BLOB; + } + + $has_server_header = false; + + if (isset($connection->headers)) { + if (\is_array($connection->headers)) { + foreach ($connection->headers as $header) { + if (\stripos($header, 'Server:') === 0) { + $has_server_header = true; + } + $handshake_message .= "$header\r\n"; + } + } else { + if (\stripos($connection->headers, 'Server:') !== false) { + $has_server_header = true; + } + $handshake_message .= "$connection->headers\r\n"; + } + } + if (!$has_server_header) { + $handshake_message .= "Server: workerman/" . Worker::VERSION . "\r\n"; + } + $handshake_message .= "\r\n"; + // Send handshake response. + $connection->send($handshake_message, true); + // Mark handshake complete.. + $connection->context->websocketHandshake = true; + + // There are data waiting to be sent. + if (!empty($connection->context->tmpWebsocketData)) { + $connection->send($connection->context->tmpWebsocketData, true); + $connection->context->tmpWebsocketData = ''; + } + if (\strlen($buffer) > $header_length) { + return static::input(\substr($buffer, $header_length), $connection); + } + return 0; + } + // Bad websocket handshake request. + $connection->close("HTTP/1.1 200 WebSocket\r\nServer: workerman/" . Worker::VERSION . "\r\n\r\n<div style=\"text-align:center\"><h1>WebSocket</h1><hr>workerman/" . Worker::VERSION . "</div>", + true); + return 0; + } + + /** + * Parse http header. + * + * @param string $buffer + * @return void + */ + protected static function parseHttpHeader($buffer) + { + // Parse headers. + list($http_header, ) = \explode("\r\n\r\n", $buffer, 2); + $header_data = \explode("\r\n", $http_header); + + if ($_SERVER) { + $_SERVER = array(); + } + + list($_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI'], $_SERVER['SERVER_PROTOCOL']) = \explode(' ', + $header_data[0]); + + unset($header_data[0]); + foreach ($header_data as $content) { + // \r\n\r\n + if (empty($content)) { + continue; + } + list($key, $value) = \explode(':', $content, 2); + $key = \str_replace('-', '_', \strtoupper($key)); + $value = \trim($value); + $_SERVER['HTTP_' . $key] = $value; + switch ($key) { + // HTTP_HOST + case 'HOST': + $tmp = \explode(':', $value); + $_SERVER['SERVER_NAME'] = $tmp[0]; + if (isset($tmp[1])) { + $_SERVER['SERVER_PORT'] = $tmp[1]; + } + break; + // cookie + case 'COOKIE': + \parse_str(\str_replace('; ', '&', $_SERVER['HTTP_COOKIE']), $_COOKIE); + break; + } + } + + // QUERY_STRING + $_SERVER['QUERY_STRING'] = \parse_url($_SERVER['REQUEST_URI'], \PHP_URL_QUERY); + if ($_SERVER['QUERY_STRING']) { + // $GET + \parse_str($_SERVER['QUERY_STRING'], $_GET); + } else { + $_SERVER['QUERY_STRING'] = ''; + } + } + +} diff --git a/vendor/workerman/workerman/Protocols/Ws.php b/vendor/workerman/workerman/Protocols/Ws.php new file mode 100644 index 0000000..3109821 --- /dev/null +++ b/vendor/workerman/workerman/Protocols/Ws.php @@ -0,0 +1,460 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman\Protocols; + +use Workerman\Worker; +use Workerman\Lib\Timer; +use Workerman\Connection\TcpConnection; +use Workerman\Connection\ConnectionInterface; + +/** + * Websocket protocol for client. + */ +class Ws +{ + /** + * Websocket blob type. + * + * @var string + */ + const BINARY_TYPE_BLOB = "\x81"; + + /** + * Websocket arraybuffer type. + * + * @var string + */ + const BINARY_TYPE_ARRAYBUFFER = "\x82"; + + /** + * Check the integrity of the package. + * + * @param string $buffer + * @param ConnectionInterface $connection + * @return int + */ + public static function input($buffer, ConnectionInterface $connection) + { + if (empty($connection->handshakeStep)) { + Worker::safeEcho("recv data before handshake. Buffer:" . \bin2hex($buffer) . "\n"); + return false; + } + // Recv handshake response + if ($connection->handshakeStep === 1) { + return self::dealHandshake($buffer, $connection); + } + $recv_len = \strlen($buffer); + if ($recv_len < 2) { + return 0; + } + // Buffer websocket frame data. + if ($connection->websocketCurrentFrameLength) { + // We need more frame data. + if ($connection->websocketCurrentFrameLength > $recv_len) { + // Return 0, because it is not clear the full packet length, waiting for the frame of fin=1. + return 0; + } + } else { + + $firstbyte = \ord($buffer[0]); + $secondbyte = \ord($buffer[1]); + $data_len = $secondbyte & 127; + $is_fin_frame = $firstbyte >> 7; + $masked = $secondbyte >> 7; + + if ($masked) { + Worker::safeEcho("frame masked so close the connection\n"); + $connection->close(); + return 0; + } + + $opcode = $firstbyte & 0xf; + + switch ($opcode) { + case 0x0: + break; + // Blob type. + case 0x1: + break; + // Arraybuffer type. + case 0x2: + break; + // Close package. + case 0x8: + // Try to emit onWebSocketClose callback. + if (isset($connection->onWebSocketClose)) { + try { + \call_user_func($connection->onWebSocketClose, $connection); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } // Close connection. + else { + $connection->close(); + } + return 0; + // Ping package. + case 0x9: + break; + // Pong package. + case 0xa: + break; + // Wrong opcode. + default : + Worker::safeEcho("error opcode $opcode and close websocket connection. Buffer:" . $buffer . "\n"); + $connection->close(); + return 0; + } + // Calculate packet length. + if ($data_len === 126) { + if (\strlen($buffer) < 4) { + return 0; + } + $pack = \unpack('nn/ntotal_len', $buffer); + $current_frame_length = $pack['total_len'] + 4; + } else if ($data_len === 127) { + if (\strlen($buffer) < 10) { + return 0; + } + $arr = \unpack('n/N2c', $buffer); + $current_frame_length = $arr['c1']*4294967296 + $arr['c2'] + 10; + } else { + $current_frame_length = $data_len + 2; + } + + $total_package_size = \strlen($connection->websocketDataBuffer) + $current_frame_length; + if ($total_package_size > $connection->maxPackageSize) { + Worker::safeEcho("error package. package_length=$total_package_size\n"); + $connection->close(); + return 0; + } + + if ($is_fin_frame) { + if ($opcode === 0x9) { + if ($recv_len >= $current_frame_length) { + $ping_data = static::decode(\substr($buffer, 0, $current_frame_length), $connection); + $connection->consumeRecvBuffer($current_frame_length); + $tmp_connection_type = isset($connection->websocketType) ? $connection->websocketType : static::BINARY_TYPE_BLOB; + $connection->websocketType = "\x8a"; + if (isset($connection->onWebSocketPing)) { + try { + \call_user_func($connection->onWebSocketPing, $connection, $ping_data); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } else { + $connection->send($ping_data); + } + $connection->websocketType = $tmp_connection_type; + if ($recv_len > $current_frame_length) { + return static::input(\substr($buffer, $current_frame_length), $connection); + } + } + return 0; + + } else if ($opcode === 0xa) { + if ($recv_len >= $current_frame_length) { + $pong_data = static::decode(\substr($buffer, 0, $current_frame_length), $connection); + $connection->consumeRecvBuffer($current_frame_length); + $tmp_connection_type = isset($connection->websocketType) ? $connection->websocketType : static::BINARY_TYPE_BLOB; + $connection->websocketType = "\x8a"; + // Try to emit onWebSocketPong callback. + if (isset($connection->onWebSocketPong)) { + try { + \call_user_func($connection->onWebSocketPong, $connection, $pong_data); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + $connection->websocketType = $tmp_connection_type; + if ($recv_len > $current_frame_length) { + return static::input(\substr($buffer, $current_frame_length), $connection); + } + } + return 0; + } + return $current_frame_length; + } else { + $connection->websocketCurrentFrameLength = $current_frame_length; + } + } + // Received just a frame length data. + if ($connection->websocketCurrentFrameLength === $recv_len) { + self::decode($buffer, $connection); + $connection->consumeRecvBuffer($connection->websocketCurrentFrameLength); + $connection->websocketCurrentFrameLength = 0; + return 0; + } // The length of the received data is greater than the length of a frame. + elseif ($connection->websocketCurrentFrameLength < $recv_len) { + self::decode(\substr($buffer, 0, $connection->websocketCurrentFrameLength), $connection); + $connection->consumeRecvBuffer($connection->websocketCurrentFrameLength); + $current_frame_length = $connection->websocketCurrentFrameLength; + $connection->websocketCurrentFrameLength = 0; + // Continue to read next frame. + return self::input(\substr($buffer, $current_frame_length), $connection); + } // The length of the received data is less than the length of a frame. + else { + return 0; + } + } + + /** + * Websocket encode. + * + * @param string $buffer + * @param ConnectionInterface $connection + * @return string + */ + public static function encode($payload, ConnectionInterface $connection) + { + if (empty($connection->websocketType)) { + $connection->websocketType = self::BINARY_TYPE_BLOB; + } + $payload = (string)$payload; + if (empty($connection->handshakeStep)) { + static::sendHandshake($connection); + } + $mask = 1; + $mask_key = "\x00\x00\x00\x00"; + + $pack = ''; + $length = $length_flag = \strlen($payload); + if (65535 < $length) { + $pack = \pack('NN', ($length & 0xFFFFFFFF00000000) >> 32, $length & 0x00000000FFFFFFFF); + $length_flag = 127; + } else if (125 < $length) { + $pack = \pack('n*', $length); + $length_flag = 126; + } + + $head = ($mask << 7) | $length_flag; + $head = $connection->websocketType . \chr($head) . $pack; + + $frame = $head . $mask_key; + // append payload to frame: + $mask_key = \str_repeat($mask_key, \floor($length / 4)) . \substr($mask_key, 0, $length % 4); + $frame .= $payload ^ $mask_key; + if ($connection->handshakeStep === 1) { + // If buffer has already full then discard the current package. + if (\strlen($connection->tmpWebsocketData) > $connection->maxSendBufferSize) { + if ($connection->onError) { + try { + \call_user_func($connection->onError, $connection, \WORKERMAN_SEND_FAIL, 'send buffer full and drop package'); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + return ''; + } + $connection->tmpWebsocketData = $connection->tmpWebsocketData . $frame; + // Check buffer is full. + if ($connection->maxSendBufferSize <= \strlen($connection->tmpWebsocketData)) { + if ($connection->onBufferFull) { + try { + \call_user_func($connection->onBufferFull, $connection); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + } + return ''; + } + return $frame; + } + + /** + * Websocket decode. + * + * @param string $buffer + * @param ConnectionInterface $connection + * @return string + */ + public static function decode($bytes, ConnectionInterface $connection) + { + $data_length = \ord($bytes[1]); + + if ($data_length === 126) { + $decoded_data = \substr($bytes, 4); + } else if ($data_length === 127) { + $decoded_data = \substr($bytes, 10); + } else { + $decoded_data = \substr($bytes, 2); + } + if ($connection->websocketCurrentFrameLength) { + $connection->websocketDataBuffer .= $decoded_data; + return $connection->websocketDataBuffer; + } else { + if ($connection->websocketDataBuffer !== '') { + $decoded_data = $connection->websocketDataBuffer . $decoded_data; + $connection->websocketDataBuffer = ''; + } + return $decoded_data; + } + } + + /** + * Send websocket handshake data. + * + * @return void + */ + public static function onConnect($connection) + { + static::sendHandshake($connection); + } + + /** + * Clean + * + * @param TcpConnection $connection + */ + public static function onClose($connection) + { + $connection->handshakeStep = null; + $connection->websocketCurrentFrameLength = 0; + $connection->tmpWebsocketData = ''; + $connection->websocketDataBuffer = ''; + if (!empty($connection->websocketPingTimer)) { + Timer::del($connection->websocketPingTimer); + $connection->websocketPingTimer = null; + } + } + + /** + * Send websocket handshake. + * + * @param TcpConnection $connection + * @return void + */ + public static function sendHandshake(TcpConnection $connection) + { + if (!empty($connection->handshakeStep)) { + return; + } + // Get Host. + $port = $connection->getRemotePort(); + $host = $port === 80 ? $connection->getRemoteHost() : $connection->getRemoteHost() . ':' . $port; + // Handshake header. + $connection->websocketSecKey = \base64_encode(random_bytes(16)); + $user_header = isset($connection->headers) ? $connection->headers : + (isset($connection->wsHttpHeader) ? $connection->wsHttpHeader : null); + $user_header_str = ''; + if (!empty($user_header)) { + if (\is_array($user_header)){ + foreach($user_header as $k=>$v){ + $user_header_str .= "$k: $v\r\n"; + } + } else { + $user_header_str .= $user_header; + } + $user_header_str = "\r\n".\trim($user_header_str); + } + $header = 'GET ' . $connection->getRemoteURI() . " HTTP/1.1\r\n". + (!\preg_match("/\nHost:/i", $user_header_str) ? "Host: $host\r\n" : ''). + "Connection: Upgrade\r\n". + "Upgrade: websocket\r\n". + (isset($connection->websocketOrigin) ? "Origin: ".$connection->websocketOrigin."\r\n":''). + (isset($connection->WSClientProtocol)?"Sec-WebSocket-Protocol: ".$connection->WSClientProtocol."\r\n":''). + "Sec-WebSocket-Version: 13\r\n". + "Sec-WebSocket-Key: " . $connection->websocketSecKey . $user_header_str . "\r\n\r\n"; + $connection->send($header, true); + $connection->handshakeStep = 1; + $connection->websocketCurrentFrameLength = 0; + $connection->websocketDataBuffer = ''; + $connection->tmpWebsocketData = ''; + } + + /** + * Websocket handshake. + * + * @param string $buffer + * @param TcpConnection $connection + * @return int + */ + public static function dealHandshake($buffer, TcpConnection $connection) + { + $pos = \strpos($buffer, "\r\n\r\n"); + if ($pos) { + //checking Sec-WebSocket-Accept + if (\preg_match("/Sec-WebSocket-Accept: *(.*?)\r\n/i", $buffer, $match)) { + if ($match[1] !== \base64_encode(\sha1($connection->websocketSecKey . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true))) { + Worker::safeEcho("Sec-WebSocket-Accept not match. Header:\n" . \substr($buffer, 0, $pos) . "\n"); + $connection->close(); + return 0; + } + } else { + Worker::safeEcho("Sec-WebSocket-Accept not found. Header:\n" . \substr($buffer, 0, $pos) . "\n"); + $connection->close(); + return 0; + } + + // handshake complete + + // Get WebSocket subprotocol (if specified by server) + if (\preg_match("/Sec-WebSocket-Protocol: *(.*?)\r\n/i", $buffer, $match)) { + $connection->WSServerProtocol = \trim($match[1]); + } + + $connection->handshakeStep = 2; + $handshake_response_length = $pos + 4; + // Try to emit onWebSocketConnect callback. + if (isset($connection->onWebSocketConnect)) { + try { + \call_user_func($connection->onWebSocketConnect, $connection, \substr($buffer, 0, $handshake_response_length)); + } catch (\Exception $e) { + Worker::stopAll(250, $e); + } catch (\Error $e) { + Worker::stopAll(250, $e); + } + } + // Headbeat. + if (!empty($connection->websocketPingInterval)) { + $connection->websocketPingTimer = Timer::add($connection->websocketPingInterval, function() use ($connection){ + if (false === $connection->send(\pack('H*', '898000000000'), true)) { + Timer::del($connection->websocketPingTimer); + $connection->websocketPingTimer = null; + } + }); + } + + $connection->consumeRecvBuffer($handshake_response_length); + if (!empty($connection->tmpWebsocketData)) { + $connection->send($connection->tmpWebsocketData, true); + $connection->tmpWebsocketData = ''; + } + if (\strlen($buffer) > $handshake_response_length) { + return self::input(\substr($buffer, $handshake_response_length), $connection); + } + } + return 0; + } + + public static function WSSetProtocol($connection, $params) { + $connection->WSClientProtocol = $params[0]; + } + + public static function WSGetServerProtocol($connection) { + return (\property_exists($connection, 'WSServerProtocol') ? $connection->WSServerProtocol : null); + } + +} diff --git a/vendor/workerman/workerman/README.md b/vendor/workerman/workerman/README.md new file mode 100644 index 0000000..704b7a1 --- /dev/null +++ b/vendor/workerman/workerman/README.md @@ -0,0 +1,342 @@ +# Workerman +[![Gitter](https://badges.gitter.im/walkor/Workerman.svg)](https://gitter.im/walkor/Workerman?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=body_badge) +[![Latest Stable Version](https://poser.pugx.org/workerman/workerman/v/stable)](https://packagist.org/packages/workerman/workerman) +[![Total Downloads](https://poser.pugx.org/workerman/workerman/downloads)](https://packagist.org/packages/workerman/workerman) +[![Monthly Downloads](https://poser.pugx.org/workerman/workerman/d/monthly)](https://packagist.org/packages/workerman/workerman) +[![Daily Downloads](https://poser.pugx.org/workerman/workerman/d/daily)](https://packagist.org/packages/workerman/workerman) +[![License](https://poser.pugx.org/workerman/workerman/license)](https://packagist.org/packages/workerman/workerman) + +## What is it +Workerman is an asynchronous event-driven PHP framework with high performance to build fast and scalable network applications. +Workerman supports HTTP, Websocket, SSL and other custom protocols. +Workerman supports event extension. + +## Requires +PHP 5.4 or Higher +A POSIX compatible operating system (Linux, OSX, BSD) +POSIX and PCNTL extensions required +Event extension recommended for better performance + +## Installation + +``` +composer require workerman/workerman +``` + +## Basic Usage + +### A websocket server +```php +<?php + +use Workerman\Worker; + +require_once __DIR__ . '/vendor/autoload.php'; + +// Create a Websocket server +$ws_worker = new Worker('websocket://0.0.0.0:2346'); + +// Emitted when new connection come +$ws_worker->onConnect = function ($connection) { + echo "New connection\n"; +}; + +// Emitted when data received +$ws_worker->onMessage = function ($connection, $data) { + // Send hello $data + $connection->send('Hello ' . $data); +}; + +// Emitted when connection closed +$ws_worker->onClose = function ($connection) { + echo "Connection closed\n"; +}; + +// Run worker +Worker::runAll(); +``` + +### An http server +```php +<?php + +use Workerman\Worker; + +require_once __DIR__ . '/vendor/autoload.php'; + +// #### http worker #### +$http_worker = new Worker('http://0.0.0.0:2345'); + +// 4 processes +$http_worker->count = 4; + +// Emitted when data received +$http_worker->onMessage = function ($connection, $request) { + //$request->get(); + //$request->post(); + //$request->header(); + //$request->cookie(); + //$request->session(); + //$request->uri(); + //$request->path(); + //$request->method(); + + // Send data to client + $connection->send("Hello World"); +}; + +// Run all workers +Worker::runAll(); +``` + +### A tcp server +```php +<?php + +use Workerman\Worker; + +require_once __DIR__ . '/vendor/autoload.php'; + +// #### create socket and listen 1234 port #### +$tcp_worker = new Worker('tcp://0.0.0.0:1234'); + +// 4 processes +$tcp_worker->count = 4; + +// Emitted when new connection come +$tcp_worker->onConnect = function ($connection) { + echo "New Connection\n"; +}; + +// Emitted when data received +$tcp_worker->onMessage = function ($connection, $data) { + // Send data to client + $connection->send("Hello $data \n"); +}; + +// Emitted when connection is closed +$tcp_worker->onClose = function ($connection) { + echo "Connection closed\n"; +}; + +Worker::runAll(); +``` + +### A udp server + +```php +<?php + +use Workerman\Worker; + +require_once __DIR__ . '/vendor/autoload.php'; + +$worker = new Worker('udp://0.0.0.0:1234'); + +// 4 processes +$tcp_worker->count = 4; + +// Emitted when data received +$worker->onMessage = function($connection, $data) +{ + $connection->send($data); +}; + +Worker::runAll(); +``` + +### Enable SSL +```php +<?php + +use Workerman\Worker; + +require_once __DIR__ . '/vendor/autoload.php'; + +// SSL context. +$context = array( + 'ssl' => array( + 'local_cert' => '/your/path/of/server.pem', + 'local_pk' => '/your/path/of/server.key', + 'verify_peer' => false, + ) +); + +// Create a Websocket server with ssl context. +$ws_worker = new Worker('websocket://0.0.0.0:2346', $context); + +// Enable SSL. WebSocket+SSL means that Secure WebSocket (wss://). +// The similar approaches for Https etc. +$ws_worker->transport = 'ssl'; + +$ws_worker->onMessage = function ($connection, $data) { + // Send hello $data + $connection->send('Hello ' . $data); +}; + +Worker::runAll(); +``` + +### Custom protocol +Protocols/MyTextProtocol.php +```php +<?php + +namespace Protocols; + +/** + * User defined protocol + * Format Text+"\n" + */ +class MyTextProtocol +{ + public static function input($recv_buffer) + { + // Find the position of the first occurrence of "\n" + $pos = strpos($recv_buffer, "\n"); + + // Not a complete package. Return 0 because the length of package can not be calculated + if ($pos === false) { + return 0; + } + + // Return length of the package + return $pos+1; + } + + public static function decode($recv_buffer) + { + return trim($recv_buffer); + } + + public static function encode($data) + { + return $data . "\n"; + } +} +``` + +```php +<?php + +use Workerman\Worker; + +require_once __DIR__ . '/vendor/autoload.php'; + +// #### MyTextProtocol worker #### +$text_worker = new Worker('MyTextProtocol://0.0.0.0:5678'); + +$text_worker->onConnect = function ($connection) { + echo "New connection\n"; +}; + +$text_worker->onMessage = function ($connection, $data) { + // Send data to client + $connection->send("Hello world\n"); +}; + +$text_worker->onClose = function ($connection) { + echo "Connection closed\n"; +}; + +// Run all workers +Worker::runAll(); +``` + +### Timer +```php +<?php + +use Workerman\Worker; +use Workerman\Timer; + +require_once __DIR__ . '/vendor/autoload.php'; + +$task = new Worker(); +$task->onWorkerStart = function ($task) { + // 2.5 seconds + $time_interval = 2.5; + $timer_id = Timer::add($time_interval, function () { + echo "Timer run\n"; + }); +}; + +// Run all workers +Worker::runAll(); +``` + +### AsyncTcpConnection (tcp/ws/text/frame etc...) +```php +<?php + +use Workerman\Worker; +use Workerman\Connection\AsyncTcpConnection; + +require_once __DIR__ . '/vendor/autoload.php'; + +$worker = new Worker(); +$worker->onWorkerStart = function () { + // Websocket protocol for client. + $ws_connection = new AsyncTcpConnection('ws://echo.websocket.org:80'); + $ws_connection->onConnect = function ($connection) { + $connection->send('Hello'); + }; + $ws_connection->onMessage = function ($connection, $data) { + echo "Recv: $data\n"; + }; + $ws_connection->onError = function ($connection, $code, $msg) { + echo "Error: $msg\n"; + }; + $ws_connection->onClose = function ($connection) { + echo "Connection closed\n"; + }; + $ws_connection->connect(); +}; + +Worker::runAll(); +``` + + + +## Available commands +```php start.php start ``` +```php start.php start -d ``` +![workerman start](http://www.workerman.net/img/workerman-start.png) +```php start.php status ``` +![workerman satus](http://www.workerman.net/img/workerman-status.png?a=123) +```php start.php connections``` +```php start.php stop ``` +```php start.php restart ``` +```php start.php reload ``` + +## Documentation + +中文主页:[http://www.workerman.net](https://www.workerman.net) + +中文文档: [https://www.workerman.net/doc/workerman](https://www.workerman.net/doc/workerman) + +Documentation:[https://github.com/walkor/workerman-manual](https://github.com/walkor/workerman-manual/blob/master/english/SUMMARY.md) + +# Benchmarks +https://www.techempower.com/benchmarks/#section=data-r20&hw=ph&test=db&l=yyku7z-e7&a=2 +![image](https://user-images.githubusercontent.com/6073368/146704320-1559fe97-aa67-4ee3-95d6-61e341b3c93b.png) + +## Sponsors +[opencollective.com/walkor](https://opencollective.com/walkor) + +[patreon.com/walkor](https://patreon.com/walkor) + +## Donate + +<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=UQGGS9UB35WWG"><img src="http://donate.workerman.net/img/donate.png"></a> + +## Other links with workerman + +[webman](https://github.com/walkor/webman) +[PHPSocket.IO](https://github.com/walkor/phpsocket.io) +[php-socks5](https://github.com/walkor/php-socks5) +[php-http-proxy](https://github.com/walkor/php-http-proxy) + +## LICENSE + +Workerman is released under the [MIT license](https://github.com/walkor/workerman/blob/master/MIT-LICENSE.txt). diff --git a/vendor/workerman/workerman/Timer.php b/vendor/workerman/workerman/Timer.php new file mode 100644 index 0000000..9f152f3 --- /dev/null +++ b/vendor/workerman/workerman/Timer.php @@ -0,0 +1,220 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman; + +use Workerman\Events\EventInterface; +use Workerman\Worker; +use \Exception; + +/** + * Timer. + * + * example: + * Workerman\Timer::add($time_interval, callback, array($arg1, $arg2..)); + */ +class Timer +{ + /** + * Tasks that based on ALARM signal. + * [ + * run_time => [[$func, $args, $persistent, time_interval],[$func, $args, $persistent, time_interval],..]], + * run_time => [[$func, $args, $persistent, time_interval],[$func, $args, $persistent, time_interval],..]], + * .. + * ] + * + * @var array + */ + protected static $_tasks = array(); + + /** + * event + * + * @var EventInterface + */ + protected static $_event = null; + + /** + * timer id + * + * @var int + */ + protected static $_timerId = 0; + + /** + * timer status + * [ + * timer_id1 => bool, + * timer_id2 => bool, + * ...................., + * ] + * + * @var array + */ + protected static $_status = array(); + + /** + * Init. + * + * @param EventInterface $event + * @return void + */ + public static function init($event = null) + { + if ($event) { + self::$_event = $event; + return; + } + if (\function_exists('pcntl_signal')) { + \pcntl_signal(\SIGALRM, array('\Workerman\Lib\Timer', 'signalHandle'), false); + } + } + + /** + * ALARM signal handler. + * + * @return void + */ + public static function signalHandle() + { + if (!self::$_event) { + \pcntl_alarm(1); + self::tick(); + } + } + + /** + * Add a timer. + * + * @param float $time_interval + * @param callable $func + * @param mixed $args + * @param bool $persistent + * @return int|bool + */ + public static function add($time_interval, $func, $args = array(), $persistent = true) + { + if ($time_interval <= 0) { + Worker::safeEcho(new Exception("bad time_interval")); + return false; + } + + if ($args === null) { + $args = array(); + } + + if (self::$_event) { + return self::$_event->add($time_interval, + $persistent ? EventInterface::EV_TIMER : EventInterface::EV_TIMER_ONCE, $func, $args); + } + + // If not workerman runtime just return. + if (!Worker::getAllWorkers()) { + return; + } + + if (!\is_callable($func)) { + Worker::safeEcho(new Exception("not callable")); + return false; + } + + if (empty(self::$_tasks)) { + \pcntl_alarm(1); + } + + $run_time = \time() + $time_interval; + if (!isset(self::$_tasks[$run_time])) { + self::$_tasks[$run_time] = array(); + } + + self::$_timerId = self::$_timerId == \PHP_INT_MAX ? 1 : ++self::$_timerId; + self::$_status[self::$_timerId] = true; + self::$_tasks[$run_time][self::$_timerId] = array($func, (array)$args, $persistent, $time_interval); + + return self::$_timerId; + } + + + /** + * Tick. + * + * @return void + */ + public static function tick() + { + if (empty(self::$_tasks)) { + \pcntl_alarm(0); + return; + } + $time_now = \time(); + foreach (self::$_tasks as $run_time => $task_data) { + if ($time_now >= $run_time) { + foreach ($task_data as $index => $one_task) { + $task_func = $one_task[0]; + $task_args = $one_task[1]; + $persistent = $one_task[2]; + $time_interval = $one_task[3]; + try { + \call_user_func_array($task_func, $task_args); + } catch (\Exception $e) { + Worker::safeEcho($e); + } + if($persistent && !empty(self::$_status[$index])) { + $new_run_time = \time() + $time_interval; + if(!isset(self::$_tasks[$new_run_time])) self::$_tasks[$new_run_time] = array(); + self::$_tasks[$new_run_time][$index] = array($task_func, (array)$task_args, $persistent, $time_interval); + } + } + unset(self::$_tasks[$run_time]); + } + } + } + + /** + * Remove a timer. + * + * @param mixed $timer_id + * @return bool + */ + public static function del($timer_id) + { + if (self::$_event) { + return self::$_event->del($timer_id, EventInterface::EV_TIMER); + } + + foreach(self::$_tasks as $run_time => $task_data) + { + if(array_key_exists($timer_id, $task_data)) unset(self::$_tasks[$run_time][$timer_id]); + } + + if(array_key_exists($timer_id, self::$_status)) unset(self::$_status[$timer_id]); + + return true; + } + + /** + * Remove all timers. + * + * @return void + */ + public static function delAll() + { + self::$_tasks = self::$_status = array(); + if (\function_exists('pcntl_alarm')) { + \pcntl_alarm(0); + } + if (self::$_event) { + self::$_event->clearAllTimer(); + } + } +} diff --git a/vendor/workerman/workerman/Worker.php b/vendor/workerman/workerman/Worker.php new file mode 100644 index 0000000..8e1896c --- /dev/null +++ b/vendor/workerman/workerman/Worker.php @@ -0,0 +1,2625 @@ +<?php +/** + * This file is part of workerman. + * + * Licensed under The MIT License + * For full copyright and license information, please see the MIT-LICENSE.txt + * Redistributions of files must retain the above copyright notice. + * + * @author walkor<walkor@workerman.net> + * @copyright walkor<walkor@workerman.net> + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ +namespace Workerman; +require_once __DIR__ . '/Lib/Constants.php'; + +use Workerman\Events\EventInterface; +use Workerman\Connection\ConnectionInterface; +use Workerman\Connection\TcpConnection; +use Workerman\Connection\UdpConnection; +use Workerman\Lib\Timer; +use Workerman\Events\Select; +use \Exception; + +/** + * Worker class + * A container for listening ports + */ +#[\AllowDynamicProperties] +class Worker +{ + /** + * Version. + * + * @var string + */ + const VERSION = '4.1.5'; + + /** + * Status starting. + * + * @var int + */ + const STATUS_STARTING = 1; + + /** + * Status running. + * + * @var int + */ + const STATUS_RUNNING = 2; + + /** + * Status shutdown. + * + * @var int + */ + const STATUS_SHUTDOWN = 4; + + /** + * Status reloading. + * + * @var int + */ + const STATUS_RELOADING = 8; + + /** + * Default backlog. Backlog is the maximum length of the queue of pending connections. + * + * @var int + */ + const DEFAULT_BACKLOG = 102400; + + /** + * Max udp package size. + * + * @var int + */ + const MAX_UDP_PACKAGE_SIZE = 65535; + + /** + * The safe distance for columns adjacent + * + * @var int + */ + const UI_SAFE_LENGTH = 4; + + /** + * Worker id. + * + * @var int + */ + public $id = 0; + + /** + * Name of the worker processes. + * + * @var string + */ + public $name = 'none'; + + /** + * Number of worker processes. + * + * @var int + */ + public $count = 1; + + /** + * Unix user of processes, needs appropriate privileges (usually root). + * + * @var string + */ + public $user = ''; + + /** + * Unix group of processes, needs appropriate privileges (usually root). + * + * @var string + */ + public $group = ''; + + /** + * reloadable. + * + * @var bool + */ + public $reloadable = true; + + /** + * reuse port. + * + * @var bool + */ + public $reusePort = false; + + /** + * Emitted when worker processes start. + * + * @var callable + */ + public $onWorkerStart = null; + + /** + * Emitted when a socket connection is successfully established. + * + * @var callable + */ + public $onConnect = null; + + /** + * Emitted when data is received. + * + * @var callable + */ + public $onMessage = null; + + /** + * Emitted when the other end of the socket sends a FIN packet. + * + * @var callable + */ + public $onClose = null; + + /** + * Emitted when an error occurs with connection. + * + * @var callable + */ + public $onError = null; + + /** + * Emitted when the send buffer becomes full. + * + * @var callable + */ + public $onBufferFull = null; + + /** + * Emitted when the send buffer becomes empty. + * + * @var callable + */ + public $onBufferDrain = null; + + /** + * Emitted when worker processes stopped. + * + * @var callable + */ + public $onWorkerStop = null; + + /** + * Emitted when worker processes get reload signal. + * + * @var callable + */ + public $onWorkerReload = null; + + /** + * Emitted when worker processes exited. + * + * @var callable + */ + public $onWorkerExit = null; + + /** + * Transport layer protocol. + * + * @var string + */ + public $transport = 'tcp'; + + /** + * Store all connections of clients. + * + * @var array + */ + public $connections = array(); + + /** + * Application layer protocol. + * + * @var string + */ + public $protocol = null; + + /** + * Root path for autoload. + * + * @var string + */ + protected $_autoloadRootPath = ''; + + /** + * Pause accept new connections or not. + * + * @var bool + */ + protected $_pauseAccept = true; + + /** + * Is worker stopping ? + * @var bool + */ + public $stopping = false; + + /** + * Daemonize. + * + * @var bool + */ + public static $daemonize = false; + + /** + * Stdout file. + * + * @var string + */ + public static $stdoutFile = '/dev/null'; + + /** + * The file to store master process PID. + * + * @var string + */ + public static $pidFile = ''; + + /** + * The file used to store the master process status file. + * + * @var string + */ + public static $statusFile = ''; + + /** + * Log file. + * + * @var mixed + */ + public static $logFile = ''; + + /** + * Global event loop. + * + * @var EventInterface + */ + public static $globalEvent = null; + + /** + * Emitted when the master process get reload signal. + * + * @var callable + */ + public static $onMasterReload = null; + + /** + * Emitted when the master process terminated. + * + * @var callable + */ + public static $onMasterStop = null; + + /** + * EventLoopClass + * + * @var string + */ + public static $eventLoopClass = ''; + + /** + * Process title + * + * @var string + */ + public static $processTitle = 'WorkerMan'; + + /** + * After sending the stop command to the child process stopTimeout seconds, + * if the process is still living then forced to kill. + * + * @var int + */ + public static $stopTimeout = 2; + + /** + * The PID of master process. + * + * @var int + */ + protected static $_masterPid = 0; + + /** + * Listening socket. + * + * @var resource + */ + protected $_mainSocket = null; + + /** + * Socket name. The format is like this http://0.0.0.0:80 . + * + * @var string + */ + protected $_socketName = ''; + + /** parse from _socketName avoid parse again in master or worker + * LocalSocket The format is like tcp://0.0.0.0:8080 + * @var string + */ + + protected $_localSocket=null; + + /** + * Context of socket. + * + * @var resource + */ + protected $_context = null; + + /** + * All worker instances. + * + * @var Worker[] + */ + protected static $_workers = array(); + + /** + * All worker processes pid. + * The format is like this [worker_id=>[pid=>pid, pid=>pid, ..], ..] + * + * @var array + */ + protected static $_pidMap = array(); + + /** + * All worker processes waiting for restart. + * The format is like this [pid=>pid, pid=>pid]. + * + * @var array + */ + protected static $_pidsToRestart = array(); + + /** + * Mapping from PID to worker process ID. + * The format is like this [worker_id=>[0=>$pid, 1=>$pid, ..], ..]. + * + * @var array + */ + protected static $_idMap = array(); + + /** + * Current status. + * + * @var int + */ + protected static $_status = self::STATUS_STARTING; + + /** + * Maximum length of the worker names. + * + * @var int + */ + protected static $_maxWorkerNameLength = 12; + + /** + * Maximum length of the socket names. + * + * @var int + */ + protected static $_maxSocketNameLength = 12; + + /** + * Maximum length of the process user names. + * + * @var int + */ + protected static $_maxUserNameLength = 12; + + /** + * Maximum length of the Proto names. + * + * @var int + */ + protected static $_maxProtoNameLength = 4; + + /** + * Maximum length of the Processes names. + * + * @var int + */ + protected static $_maxProcessesNameLength = 9; + + /** + * Maximum length of the Status names. + * + * @var int + */ + protected static $_maxStatusNameLength = 1; + + /** + * The file to store status info of current worker process. + * + * @var string + */ + protected static $_statisticsFile = ''; + + /** + * Start file. + * + * @var string + */ + protected static $_startFile = ''; + + /** + * OS. + * + * @var string + */ + protected static $_OS = \OS_TYPE_LINUX; + + /** + * Processes for windows. + * + * @var array + */ + protected static $_processForWindows = array(); + + /** + * Status info of current worker process. + * + * @var array + */ + protected static $_globalStatistics = array( + 'start_timestamp' => 0, + 'worker_exit_info' => array() + ); + + /** + * Available event loops. + * + * @var array + */ + protected static $_availableEventLoops = array( + 'event' => '\Workerman\Events\Event', + 'libevent' => '\Workerman\Events\Libevent' + ); + + /** + * PHP built-in protocols. + * + * @var array + */ + protected static $_builtinTransports = array( + 'tcp' => 'tcp', + 'udp' => 'udp', + 'unix' => 'unix', + 'ssl' => 'tcp' + ); + + /** + * PHP built-in error types. + * + * @var array + */ + protected static $_errorType = array( + \E_ERROR => 'E_ERROR', // 1 + \E_WARNING => 'E_WARNING', // 2 + \E_PARSE => 'E_PARSE', // 4 + \E_NOTICE => 'E_NOTICE', // 8 + \E_CORE_ERROR => 'E_CORE_ERROR', // 16 + \E_CORE_WARNING => 'E_CORE_WARNING', // 32 + \E_COMPILE_ERROR => 'E_COMPILE_ERROR', // 64 + \E_COMPILE_WARNING => 'E_COMPILE_WARNING', // 128 + \E_USER_ERROR => 'E_USER_ERROR', // 256 + \E_USER_WARNING => 'E_USER_WARNING', // 512 + \E_USER_NOTICE => 'E_USER_NOTICE', // 1024 + \E_STRICT => 'E_STRICT', // 2048 + \E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR', // 4096 + \E_DEPRECATED => 'E_DEPRECATED', // 8192 + \E_USER_DEPRECATED => 'E_USER_DEPRECATED' // 16384 + ); + + /** + * Graceful stop or not. + * + * @var bool + */ + protected static $_gracefulStop = false; + + /** + * Standard output stream + * @var resource + */ + protected static $_outputStream = null; + + /** + * If $outputStream support decorated + * @var bool + */ + protected static $_outputDecorated = null; + + /** + * Run all worker instances. + * + * @return void + */ + public static function runAll() + { + static::checkSapiEnv(); + static::init(); + static::lock(); + static::parseCommand(); + static::daemonize(); + static::initWorkers(); + static::installSignal(); + static::saveMasterPid(); + static::lock(\LOCK_UN); + static::displayUI(); + static::forkWorkers(); + static::resetStd(); + static::monitorWorkers(); + } + + /** + * Check sapi. + * + * @return void + */ + protected static function checkSapiEnv() + { + // Only for cli. + if (\PHP_SAPI !== 'cli') { + exit("Only run in command line mode \n"); + } + if (\DIRECTORY_SEPARATOR === '\\') { + self::$_OS = \OS_TYPE_WINDOWS; + } + } + + /** + * Init. + * + * @return void + */ + protected static function init() + { + \set_error_handler(function($code, $msg, $file, $line){ + Worker::safeEcho("$msg in file $file on line $line\n"); + }); + + // Start file. + $backtrace = \debug_backtrace(); + static::$_startFile = $backtrace[\count($backtrace) - 1]['file']; + + + $unique_prefix = \str_replace('/', '_', static::$_startFile); + + // Pid file. + if (empty(static::$pidFile)) { + static::$pidFile = __DIR__ . "/../$unique_prefix.pid"; + } + + // Log file. + if (empty(static::$logFile)) { + static::$logFile = __DIR__ . '/../workerman.log'; + } + $log_file = (string)static::$logFile; + if (!\is_file($log_file)) { + \touch($log_file); + \chmod($log_file, 0622); + } + + // State. + static::$_status = static::STATUS_STARTING; + + // For statistics. + static::$_globalStatistics['start_timestamp'] = \time(); + + // Process title. + static::setProcessTitle(static::$processTitle . ': master process start_file=' . static::$_startFile); + + // Init data for worker id. + static::initId(); + + // Timer init. + Timer::init(); + } + + /** + * Lock. + * + * @return void + */ + protected static function lock($flag = \LOCK_EX) + { + static $fd; + if (\DIRECTORY_SEPARATOR !== '/') { + return; + } + $lock_file = static::$pidFile . '.lock'; + $fd = $fd ?: \fopen($lock_file, 'a+'); + if ($fd) { + flock($fd, $flag); + if ($flag === \LOCK_UN) { + fclose($fd); + $fd = null; + clearstatcache(); + if (\is_file($lock_file)) { + unlink($lock_file); + } + } + } + } + + /** + * Init All worker instances. + * + * @return void + */ + protected static function initWorkers() + { + if (static::$_OS !== \OS_TYPE_LINUX) { + return; + } + + static::$_statisticsFile = static::$statusFile ? static::$statusFile : __DIR__ . '/../workerman-' .posix_getpid().'.status'; + + foreach (static::$_workers as $worker) { + // Worker name. + if (empty($worker->name)) { + $worker->name = 'none'; + } + + // Get unix user of the worker process. + if (empty($worker->user)) { + $worker->user = static::getCurrentUser(); + } else { + if (\posix_getuid() !== 0 && $worker->user !== static::getCurrentUser()) { + static::log('Warning: You must have the root privileges to change uid and gid.'); + } + } + + // Socket name. + $worker->socket = $worker->getSocketName(); + + // Status name. + $worker->status = '<g> [OK] </g>'; + + // Get column mapping for UI + foreach(static::getUiColumns() as $column_name => $prop){ + !isset($worker->{$prop}) && $worker->{$prop} = 'NNNN'; + $prop_length = \strlen((string) $worker->{$prop}); + $key = '_max' . \ucfirst(\strtolower($column_name)) . 'NameLength'; + static::$$key = \max(static::$$key, $prop_length); + } + + // Listen. + if (!$worker->reusePort) { + $worker->listen(); + } + } + } + + /** + * Reload all worker instances. + * + * @return void + */ + public static function reloadAllWorkers() + { + static::init(); + static::initWorkers(); + static::displayUI(); + static::$_status = static::STATUS_RELOADING; + } + + /** + * Get all worker instances. + * + * @return array + */ + public static function getAllWorkers() + { + return static::$_workers; + } + + /** + * Get global event-loop instance. + * + * @return EventInterface + */ + public static function getEventLoop() + { + return static::$globalEvent; + } + + /** + * Get main socket resource + * @return resource + */ + public function getMainSocket(){ + return $this->_mainSocket; + } + + /** + * Init idMap. + * return void + */ + protected static function initId() + { + foreach (static::$_workers as $worker_id => $worker) { + $new_id_map = array(); + $worker->count = $worker->count < 1 ? 1 : $worker->count; + for($key = 0; $key < $worker->count; $key++) { + $new_id_map[$key] = isset(static::$_idMap[$worker_id][$key]) ? static::$_idMap[$worker_id][$key] : 0; + } + static::$_idMap[$worker_id] = $new_id_map; + } + } + + /** + * Get unix user of current porcess. + * + * @return string + */ + protected static function getCurrentUser() + { + $user_info = \posix_getpwuid(\posix_getuid()); + return $user_info['name']; + } + + /** + * Display staring UI. + * + * @return void + */ + protected static function displayUI() + { + global $argv; + if (\in_array('-q', $argv)) { + return; + } + if (static::$_OS !== \OS_TYPE_LINUX) { + static::safeEcho("----------------------- WORKERMAN -----------------------------\r\n"); + static::safeEcho('Workerman version:'. static::VERSION. ' PHP version:'. \PHP_VERSION. "\r\n"); + static::safeEcho("------------------------ WORKERS -------------------------------\r\n"); + static::safeEcho("worker listen processes status\r\n"); + return; + } + + //show version + $line_version = 'Workerman version:' . static::VERSION . \str_pad('PHP version:', 22, ' ', \STR_PAD_LEFT) . \PHP_VERSION; + $line_version .= \str_pad('Event-Loop:', 22, ' ', \STR_PAD_LEFT) . static::getEventLoopName() . \PHP_EOL; + !\defined('LINE_VERSIOIN_LENGTH') && \define('LINE_VERSIOIN_LENGTH', \strlen($line_version)); + $total_length = static::getSingleLineTotalLength(); + $line_one = '<n>' . \str_pad('<w> WORKERMAN </w>', $total_length + \strlen('<w></w>'), '-', \STR_PAD_BOTH) . '</n>'. \PHP_EOL; + $line_two = \str_pad('<w> WORKERS </w>' , $total_length + \strlen('<w></w>'), '-', \STR_PAD_BOTH) . \PHP_EOL; + static::safeEcho($line_one . $line_version . $line_two); + + //Show title + $title = ''; + foreach(static::getUiColumns() as $column_name => $prop){ + $key = '_max' . \ucfirst(\strtolower($column_name)) . 'NameLength'; + //just keep compatible with listen name + $column_name === 'socket' && $column_name = 'listen'; + $title.= "<w>{$column_name}</w>" . \str_pad('', static::$$key + static::UI_SAFE_LENGTH - \strlen($column_name)); + } + $title && static::safeEcho($title . \PHP_EOL); + + //Show content + foreach (static::$_workers as $worker) { + $content = ''; + foreach(static::getUiColumns() as $column_name => $prop){ + $key = '_max' . \ucfirst(\strtolower($column_name)) . 'NameLength'; + \preg_match_all("/(<n>|<\/n>|<w>|<\/w>|<g>|<\/g>)/is", (string) $worker->{$prop}, $matches); + $place_holder_length = !empty($matches) ? \strlen(\implode('', $matches[0])) : 0; + $content .= \str_pad((string) $worker->{$prop}, static::$$key + static::UI_SAFE_LENGTH + $place_holder_length); + } + $content && static::safeEcho($content . \PHP_EOL); + } + + //Show last line + $line_last = \str_pad('', static::getSingleLineTotalLength(), '-') . \PHP_EOL; + !empty($content) && static::safeEcho($line_last); + + if (static::$daemonize) { + $tmpArgv = $argv; + foreach ($tmpArgv as $index => $value) { + if ($value == '-d') { + unset($tmpArgv[$index]); + } elseif ($value == 'start' || $value == 'restart') { + $tmpArgv[$index] = 'stop'; + } + } + static::safeEcho("Input \"php ".implode(' ', $tmpArgv)."\" to stop. Start success.\n\n"); + } else { + static::safeEcho("Press Ctrl+C to stop. Start success.\n"); + } + } + + /** + * Get UI columns to be shown in terminal + * + * 1. $column_map: array('ui_column_name' => 'clas_property_name') + * 2. Consider move into configuration in future + * + * @return array + */ + public static function getUiColumns() + { + return array( + 'proto' => 'transport', + 'user' => 'user', + 'worker' => 'name', + 'socket' => 'socket', + 'processes' => 'count', + 'status' => 'status', + ); + } + + /** + * Get single line total length for ui + * + * @return int + */ + public static function getSingleLineTotalLength() + { + $total_length = 0; + + foreach(static::getUiColumns() as $column_name => $prop){ + $key = '_max' . \ucfirst(\strtolower($column_name)) . 'NameLength'; + $total_length += static::$$key + static::UI_SAFE_LENGTH; + } + + //keep beauty when show less colums + !\defined('LINE_VERSIOIN_LENGTH') && \define('LINE_VERSIOIN_LENGTH', 0); + $total_length <= LINE_VERSIOIN_LENGTH && $total_length = LINE_VERSIOIN_LENGTH; + + return $total_length; + } + + /** + * Parse command. + * + * @return void + */ + protected static function parseCommand() + { + if (static::$_OS !== \OS_TYPE_LINUX) { + return; + } + global $argv; + // Check argv; + $start_file = $argv[0]; + $usage = "Usage: php yourfile <command> [mode]\nCommands: \nstart\t\tStart worker in DEBUG mode.\n\t\tUse mode -d to start in DAEMON mode.\nstop\t\tStop worker.\n\t\tUse mode -g to stop gracefully.\nrestart\t\tRestart workers.\n\t\tUse mode -d to start in DAEMON mode.\n\t\tUse mode -g to stop gracefully.\nreload\t\tReload codes.\n\t\tUse mode -g to reload gracefully.\nstatus\t\tGet worker status.\n\t\tUse mode -d to show live status.\nconnections\tGet worker connections.\n"; + $available_commands = array( + 'start', + 'stop', + 'restart', + 'reload', + 'status', + 'connections', + ); + $available_mode = array( + '-d', + '-g' + ); + $command = $mode = ''; + foreach ($argv as $value) { + if (\in_array($value, $available_commands)) { + $command = $value; + } elseif (\in_array($value, $available_mode)) { + $mode = $value; + } + } + + if (!$command) { + exit($usage); + } + + // Start command. + $mode_str = ''; + if ($command === 'start') { + if ($mode === '-d' || static::$daemonize) { + $mode_str = 'in DAEMON mode'; + } else { + $mode_str = 'in DEBUG mode'; + } + } + static::log("Workerman[$start_file] $command $mode_str"); + + // Get master process PID. + $master_pid = \is_file(static::$pidFile) ? (int)\file_get_contents(static::$pidFile) : 0; + // Master is still alive? + if (static::checkMasterIsAlive($master_pid)) { + if ($command === 'start') { + static::log("Workerman[$start_file] already running"); + exit; + } + } elseif ($command !== 'start' && $command !== 'restart') { + static::log("Workerman[$start_file] not run"); + exit; + } + + $statistics_file = static::$statusFile ? static::$statusFile : __DIR__ . "/../workerman-$master_pid.status"; + + // execute command. + switch ($command) { + case 'start': + if ($mode === '-d') { + static::$daemonize = true; + } + break; + case 'status': + while (1) { + if (\is_file($statistics_file)) { + @\unlink($statistics_file); + } + // Master process will send SIGIOT signal to all child processes. + \posix_kill($master_pid, SIGIOT); + // Sleep 1 second. + \sleep(1); + // Clear terminal. + if ($mode === '-d') { + static::safeEcho("\33[H\33[2J\33(B\33[m", true); + } + // Echo status data. + static::safeEcho(static::formatStatusData($statistics_file)); + if ($mode !== '-d') { + exit(0); + } + static::safeEcho("\nPress Ctrl+C to quit.\n\n"); + } + exit(0); + case 'connections': + if (\is_file($statistics_file) && \is_writable($statistics_file)) { + \unlink($statistics_file); + } + // Master process will send SIGIO signal to all child processes. + \posix_kill($master_pid, SIGIO); + // Waiting amoment. + \usleep(500000); + // Display statisitcs data from a disk file. + if(\is_readable($statistics_file)) { + \readfile($statistics_file); + } + exit(0); + case 'restart': + case 'stop': + if ($mode === '-g') { + static::$_gracefulStop = true; + $sig = \SIGQUIT; + static::log("Workerman[$start_file] is gracefully stopping ..."); + } else { + static::$_gracefulStop = false; + $sig = \SIGINT; + static::log("Workerman[$start_file] is stopping ..."); + } + // Send stop signal to master process. + $master_pid && \posix_kill($master_pid, $sig); + // Timeout. + $timeout = static::$stopTimeout + 3; + $start_time = \time(); + // Check master process is still alive? + while (1) { + $master_is_alive = $master_pid && \posix_kill((int) $master_pid, 0); + if ($master_is_alive) { + // Timeout? + if (!static::$_gracefulStop && \time() - $start_time >= $timeout) { + static::log("Workerman[$start_file] stop fail"); + exit; + } + // Waiting amoment. + \usleep(10000); + continue; + } + // Stop success. + static::log("Workerman[$start_file] stop success"); + if ($command === 'stop') { + exit(0); + } + if ($mode === '-d') { + static::$daemonize = true; + } + break; + } + break; + case 'reload': + if($mode === '-g'){ + $sig = \SIGUSR2; + }else{ + $sig = \SIGUSR1; + } + \posix_kill($master_pid, $sig); + exit; + default : + if (isset($command)) { + static::safeEcho('Unknown command: ' . $command . "\n"); + } + exit($usage); + } + } + + /** + * Format status data. + * + * @param $statistics_file + * @return string + */ + protected static function formatStatusData($statistics_file) + { + static $total_request_cache = array(); + if (!\is_readable($statistics_file)) { + return ''; + } + $info = \file($statistics_file, \FILE_IGNORE_NEW_LINES); + if (!$info) { + return ''; + } + $status_str = ''; + $current_total_request = array(); + $worker_info = \unserialize($info[0]); + \ksort($worker_info, SORT_NUMERIC); + unset($info[0]); + $data_waiting_sort = array(); + $read_process_status = false; + $total_requests = 0; + $total_qps = 0; + $total_connections = 0; + $total_fails = 0; + $total_memory = 0; + $total_timers = 0; + $maxLen1 = static::$_maxSocketNameLength; + $maxLen2 = static::$_maxWorkerNameLength; + foreach($info as $key => $value) { + if (!$read_process_status) { + $status_str .= $value . "\n"; + if (\preg_match('/^pid.*?memory.*?listening/', $value)) { + $read_process_status = true; + } + continue; + } + if(\preg_match('/^[0-9]+/', $value, $pid_math)) { + $pid = $pid_math[0]; + $data_waiting_sort[$pid] = $value; + if(\preg_match('/^\S+?\s+?(\S+?)\s+?(\S+?)\s+?(\S+?)\s+?(\S+?)\s+?(\S+?)\s+?(\S+?)\s+?(\S+?)\s+?/', $value, $match)) { + $total_memory += \intval(\str_ireplace('M','',$match[1])); + $maxLen1 = \max($maxLen1,\strlen($match[2])); + $maxLen2 = \max($maxLen2,\strlen($match[3])); + $total_connections += \intval($match[4]); + $total_fails += \intval($match[5]); + $total_timers += \intval($match[6]); + $current_total_request[$pid] = $match[7]; + $total_requests += \intval($match[7]); + } + } + } + foreach($worker_info as $pid => $info) { + if (!isset($data_waiting_sort[$pid])) { + $status_str .= "$pid\t" . \str_pad('N/A', 7) . " " + . \str_pad($info['listen'], static::$_maxSocketNameLength) . " " + . \str_pad($info['name'], static::$_maxWorkerNameLength) . " " + . \str_pad('N/A', 11) . " " . \str_pad('N/A', 9) . " " + . \str_pad('N/A', 7) . " " . \str_pad('N/A', 13) . " N/A [busy] \n"; + continue; + } + //$qps = isset($total_request_cache[$pid]) ? $current_total_request[$pid] + if (!isset($total_request_cache[$pid]) || !isset($current_total_request[$pid])) { + $qps = 0; + } else { + $qps = $current_total_request[$pid] - $total_request_cache[$pid]; + $total_qps += $qps; + } + $status_str .= $data_waiting_sort[$pid]. " " . \str_pad($qps, 6) ." [idle]\n"; + } + $total_request_cache = $current_total_request; + $status_str .= "----------------------------------------------PROCESS STATUS---------------------------------------------------\n"; + $status_str .= "Summary\t" . \str_pad($total_memory.'M', 7) . " " + . \str_pad('-', $maxLen1) . " " + . \str_pad('-', $maxLen2) . " " + . \str_pad($total_connections, 11) . " " . \str_pad($total_fails, 9) . " " + . \str_pad($total_timers, 7) . " " . \str_pad($total_requests, 13) . " " + . \str_pad($total_qps,6)." [Summary] \n"; + return $status_str; + } + + + /** + * Install signal handler. + * + * @return void + */ + protected static function installSignal() + { + if (static::$_OS !== \OS_TYPE_LINUX) { + return; + } + $signalHandler = '\Workerman\Worker::signalHandler'; + // stop + \pcntl_signal(\SIGINT, $signalHandler, false); + // stop + \pcntl_signal(\SIGTERM, $signalHandler, false); + // stop + \pcntl_signal(\SIGHUP, $signalHandler, false); + // stop + \pcntl_signal(\SIGTSTP, $signalHandler, false); + // graceful stop + \pcntl_signal(\SIGQUIT, $signalHandler, false); + // reload + \pcntl_signal(\SIGUSR1, $signalHandler, false); + // graceful reload + \pcntl_signal(\SIGUSR2, $signalHandler, false); + // status + \pcntl_signal(\SIGIOT, $signalHandler, false); + // connection status + \pcntl_signal(\SIGIO, $signalHandler, false); + // ignore + \pcntl_signal(\SIGPIPE, \SIG_IGN, false); + } + + /** + * Reinstall signal handler. + * + * @return void + */ + protected static function reinstallSignal() + { + if (static::$_OS !== \OS_TYPE_LINUX) { + return; + } + $signalHandler = '\Workerman\Worker::signalHandler'; + // uninstall stop signal handler + \pcntl_signal(\SIGINT, \SIG_IGN, false); + // uninstall stop signal handler + \pcntl_signal(\SIGTERM, \SIG_IGN, false); + // uninstall stop signal handler + \pcntl_signal(\SIGHUP, \SIG_IGN, false); + // uninstall stop signal handler + \pcntl_signal(\SIGTSTP, \SIG_IGN, false); + // uninstall graceful stop signal handler + \pcntl_signal(\SIGQUIT, \SIG_IGN, false); + // uninstall reload signal handler + \pcntl_signal(\SIGUSR1, \SIG_IGN, false); + // uninstall graceful reload signal handler + \pcntl_signal(\SIGUSR2, \SIG_IGN, false); + // uninstall status signal handler + \pcntl_signal(\SIGIOT, \SIG_IGN, false); + // uninstall connections status signal handler + \pcntl_signal(\SIGIO, \SIG_IGN, false); + // reinstall stop signal handler + static::$globalEvent->add(\SIGINT, EventInterface::EV_SIGNAL, $signalHandler); + // reinstall graceful stop signal handler + static::$globalEvent->add(\SIGQUIT, EventInterface::EV_SIGNAL, $signalHandler); + // reinstall graceful stop signal handler + static::$globalEvent->add(\SIGHUP, EventInterface::EV_SIGNAL, $signalHandler); + // reinstall graceful stop signal handler + static::$globalEvent->add(\SIGTSTP, EventInterface::EV_SIGNAL, $signalHandler); + // reinstall reload signal handler + static::$globalEvent->add(\SIGUSR1, EventInterface::EV_SIGNAL, $signalHandler); + // reinstall graceful reload signal handler + static::$globalEvent->add(\SIGUSR2, EventInterface::EV_SIGNAL, $signalHandler); + // reinstall status signal handler + static::$globalEvent->add(\SIGIOT, EventInterface::EV_SIGNAL, $signalHandler); + // reinstall connection status signal handler + static::$globalEvent->add(\SIGIO, EventInterface::EV_SIGNAL, $signalHandler); + } + + /** + * Signal handler. + * + * @param int $signal + */ + public static function signalHandler($signal) + { + switch ($signal) { + // Stop. + case \SIGINT: + case \SIGTERM: + case \SIGHUP: + case \SIGTSTP: + static::$_gracefulStop = false; + static::stopAll(); + break; + // Graceful stop. + case \SIGQUIT: + static::$_gracefulStop = true; + static::stopAll(); + break; + // Reload. + case \SIGUSR2: + case \SIGUSR1: + static::$_gracefulStop = $signal === \SIGUSR2; + static::$_pidsToRestart = static::getAllWorkerPids(); + static::reload(); + break; + // Show status. + case \SIGIOT: + static::writeStatisticsToStatusFile(); + break; + // Show connection status. + case \SIGIO: + static::writeConnectionsStatisticsToStatusFile(); + break; + } + } + + /** + * Run as daemon mode. + * + * @throws Exception + */ + protected static function daemonize() + { + if (!static::$daemonize || static::$_OS !== \OS_TYPE_LINUX) { + return; + } + \umask(0); + $pid = \pcntl_fork(); + if (-1 === $pid) { + throw new Exception('Fork fail'); + } elseif ($pid > 0) { + exit(0); + } + if (-1 === \posix_setsid()) { + throw new Exception("Setsid fail"); + } + // Fork again avoid SVR4 system regain the control of terminal. + $pid = \pcntl_fork(); + if (-1 === $pid) { + throw new Exception("Fork fail"); + } elseif (0 !== $pid) { + exit(0); + } + } + + /** + * Redirect standard input and output. + * + * @throws Exception + */ + public static function resetStd() + { + if (!static::$daemonize || \DIRECTORY_SEPARATOR !== '/') { + return; + } + global $STDOUT, $STDERR; + $handle = \fopen(static::$stdoutFile, "a"); + if ($handle) { + unset($handle); + \set_error_handler(function(){}); + if ($STDOUT) { + \fclose($STDOUT); + } + if ($STDERR) { + \fclose($STDERR); + } + if (\is_resource(\STDOUT)) { + \fclose(\STDOUT); + } + if (\is_resource(\STDERR)) { + \fclose(\STDERR); + } + $STDOUT = \fopen(static::$stdoutFile, "a"); + $STDERR = \fopen(static::$stdoutFile, "a"); + // Fix standard output cannot redirect of PHP 8.1.8's bug + if (\function_exists('posix_isatty') && \posix_isatty(2)) { + \ob_start(function ($string) { + \file_put_contents(static::$stdoutFile, $string, FILE_APPEND); + }, 1); + } + // change output stream + static::$_outputStream = null; + static::outputStream($STDOUT); + \restore_error_handler(); + return; + } + + throw new Exception('Can not open stdoutFile ' . static::$stdoutFile); + } + + /** + * Save pid. + * + * @throws Exception + */ + protected static function saveMasterPid() + { + if (static::$_OS !== \OS_TYPE_LINUX) { + return; + } + + static::$_masterPid = \posix_getpid(); + if (false === \file_put_contents(static::$pidFile, static::$_masterPid)) { + throw new Exception('can not save pid to ' . static::$pidFile); + } + } + + /** + * Get event loop name. + * + * @return string + */ + protected static function getEventLoopName() + { + if (static::$eventLoopClass) { + return static::$eventLoopClass; + } + + if (!\class_exists('\Swoole\Event', false)) { + unset(static::$_availableEventLoops['swoole']); + } + + $loop_name = ''; + foreach (static::$_availableEventLoops as $name=>$class) { + if (\extension_loaded($name)) { + $loop_name = $name; + break; + } + } + + if ($loop_name) { + static::$eventLoopClass = static::$_availableEventLoops[$loop_name]; + } else { + static::$eventLoopClass = '\Workerman\Events\Select'; + } + return static::$eventLoopClass; + } + + /** + * Get all pids of worker processes. + * + * @return array + */ + protected static function getAllWorkerPids() + { + $pid_array = array(); + foreach (static::$_pidMap as $worker_pid_array) { + foreach ($worker_pid_array as $worker_pid) { + $pid_array[$worker_pid] = $worker_pid; + } + } + return $pid_array; + } + + /** + * Fork some worker processes. + * + * @return void + */ + protected static function forkWorkers() + { + if (static::$_OS === \OS_TYPE_LINUX) { + static::forkWorkersForLinux(); + } else { + static::forkWorkersForWindows(); + } + } + + /** + * Fork some worker processes. + * + * @return void + */ + protected static function forkWorkersForLinux() + { + + foreach (static::$_workers as $worker) { + if (static::$_status === static::STATUS_STARTING) { + if (empty($worker->name)) { + $worker->name = $worker->getSocketName(); + } + $worker_name_length = \strlen($worker->name); + if (static::$_maxWorkerNameLength < $worker_name_length) { + static::$_maxWorkerNameLength = $worker_name_length; + } + } + + while (\count(static::$_pidMap[$worker->workerId]) < $worker->count) { + static::forkOneWorkerForLinux($worker); + } + } + } + + /** + * Fork some worker processes. + * + * @return void + */ + protected static function forkWorkersForWindows() + { + $files = static::getStartFilesForWindows(); + global $argv; + if(\in_array('-q', $argv) || \count($files) === 1) + { + if(\count(static::$_workers) > 1) + { + static::safeEcho("@@@ Error: multi workers init in one php file are not support @@@\r\n"); + static::safeEcho("@@@ See http://doc.workerman.net/faq/multi-woker-for-windows.html @@@\r\n"); + } + elseif(\count(static::$_workers) <= 0) + { + exit("@@@no worker inited@@@\r\n\r\n"); + } + + \reset(static::$_workers); + /** @var Worker $worker */ + $worker = current(static::$_workers); + + // Display UI. + static::safeEcho(\str_pad($worker->name, 30) . \str_pad($worker->getSocketName(), 36) . \str_pad($worker->count, 10) . "[ok]\n"); + $worker->listen(); + $worker->run(); + exit("@@@child exit@@@\r\n"); + } + else + { + static::$globalEvent = new \Workerman\Events\Select(); + Timer::init(static::$globalEvent); + foreach($files as $start_file) + { + static::forkOneWorkerForWindows($start_file); + } + } + } + + /** + * Get start files for windows. + * + * @return array + */ + public static function getStartFilesForWindows() { + global $argv; + $files = array(); + foreach($argv as $file) + { + if(\is_file($file)) + { + $files[$file] = $file; + } + } + return $files; + } + + /** + * Fork one worker process. + * + * @param string $start_file + */ + public static function forkOneWorkerForWindows($start_file) + { + $start_file = \realpath($start_file); + + $descriptorspec = array( + STDIN, STDOUT, STDOUT + ); + + $pipes = array(); + $process = \proc_open("php \"$start_file\" -q", $descriptorspec, $pipes); + + if (empty(static::$globalEvent)) { + static::$globalEvent = new Select(); + Timer::init(static::$globalEvent); + } + + // 保存子进程句柄 + static::$_processForWindows[$start_file] = array($process, $start_file); + } + + /** + * check worker status for windows. + * @return void + */ + public static function checkWorkerStatusForWindows() + { + foreach(static::$_processForWindows as $process_data) + { + $process = $process_data[0]; + $start_file = $process_data[1]; + $status = \proc_get_status($process); + if(isset($status['running'])) + { + if(!$status['running']) + { + static::safeEcho("process $start_file terminated and try to restart\n"); + \proc_close($process); + static::forkOneWorkerForWindows($start_file); + } + } + else + { + static::safeEcho("proc_get_status fail\n"); + } + } + } + + + /** + * Fork one worker process. + * + * @param self $worker + * @throws Exception + */ + protected static function forkOneWorkerForLinux(self $worker) + { + // Get available worker id. + $id = static::getId($worker->workerId, 0); + if ($id === false) { + return; + } + $pid = \pcntl_fork(); + // For master process. + if ($pid > 0) { + static::$_pidMap[$worker->workerId][$pid] = $pid; + static::$_idMap[$worker->workerId][$id] = $pid; + } // For child processes. + elseif (0 === $pid) { + \srand(); + \mt_srand(); + if ($worker->reusePort) { + $worker->listen(); + } + if (static::$_status === static::STATUS_STARTING) { + static::resetStd(); + } + static::$_pidMap = array(); + // Remove other listener. + foreach(static::$_workers as $key => $one_worker) { + if ($one_worker->workerId !== $worker->workerId) { + $one_worker->unlisten(); + unset(static::$_workers[$key]); + } + } + Timer::delAll(); + static::setProcessTitle(self::$processTitle . ': worker process ' . $worker->name . ' ' . $worker->getSocketName()); + $worker->setUserAndGroup(); + $worker->id = $id; + $worker->run(); + if (strpos(static::$eventLoopClass, 'Workerman\Events\Swoole') !== false) { + exit(0); + } + $err = new Exception('event-loop exited'); + static::log($err); + exit(250); + } else { + throw new Exception("forkOneWorker fail"); + } + } + + /** + * Get worker id. + * + * @param string $worker_id + * @param int $pid + * + * @return integer + */ + protected static function getId($worker_id, $pid) + { + return \array_search($pid, static::$_idMap[$worker_id]); + } + + /** + * Set unix user and group for current process. + * + * @return void + */ + public function setUserAndGroup() + { + // Get uid. + $user_info = \posix_getpwnam($this->user); + if (!$user_info) { + static::log("Warning: User {$this->user} not exists"); + return; + } + $uid = $user_info['uid']; + // Get gid. + if ($this->group) { + $group_info = \posix_getgrnam($this->group); + if (!$group_info) { + static::log("Warning: Group {$this->group} not exists"); + return; + } + $gid = $group_info['gid']; + } else { + $gid = $user_info['gid']; + } + + // Set uid and gid. + if ($uid !== \posix_getuid() || $gid !== \posix_getgid()) { + if (!\posix_setgid($gid) || !\posix_initgroups($user_info['name'], $gid) || !\posix_setuid($uid)) { + static::log("Warning: change gid or uid fail."); + } + } + } + + /** + * Set process name. + * + * @param string $title + * @return void + */ + protected static function setProcessTitle($title) + { + \set_error_handler(function(){}); + // >=php 5.5 + if (\function_exists('cli_set_process_title')) { + \cli_set_process_title($title); + } // Need proctitle when php<=5.5 . + elseif (\extension_loaded('proctitle') && \function_exists('setproctitle')) { + \setproctitle($title); + } + \restore_error_handler(); + } + + /** + * Monitor all child processes. + * + * @return void + */ + protected static function monitorWorkers() + { + if (static::$_OS === \OS_TYPE_LINUX) { + static::monitorWorkersForLinux(); + } else { + static::monitorWorkersForWindows(); + } + } + + /** + * Monitor all child processes. + * + * @return void + */ + protected static function monitorWorkersForLinux() + { + static::$_status = static::STATUS_RUNNING; + while (1) { + // Calls signal handlers for pending signals. + \pcntl_signal_dispatch(); + // Suspends execution of the current process until a child has exited, or until a signal is delivered + $status = 0; + $pid = \pcntl_wait($status, \WUNTRACED); + // Calls signal handlers for pending signals again. + \pcntl_signal_dispatch(); + // If a child has already exited. + if ($pid > 0) { + // Find out which worker process exited. + foreach (static::$_pidMap as $worker_id => $worker_pid_array) { + if (isset($worker_pid_array[$pid])) { + $worker = static::$_workers[$worker_id]; + // Exit status. + if ($status !== 0) { + static::log("worker[{$worker->name}:$pid] exit with status $status"); + } + + // onWorkerExit + if ($worker->onWorkerExit) { + try { + ($worker->onWorkerExit)($worker, $status, $pid); + } catch (\Throwable $exception) { + static::log("worker[{$worker->name}] onWorkerExit $exception"); + } + } + + // For Statistics. + if (!isset(static::$_globalStatistics['worker_exit_info'][$worker_id][$status])) { + static::$_globalStatistics['worker_exit_info'][$worker_id][$status] = 0; + } + ++static::$_globalStatistics['worker_exit_info'][$worker_id][$status]; + + // Clear process data. + unset(static::$_pidMap[$worker_id][$pid]); + + // Mark id is available. + $id = static::getId($worker_id, $pid); + static::$_idMap[$worker_id][$id] = 0; + + break; + } + } + // Is still running state then fork a new worker process. + if (static::$_status !== static::STATUS_SHUTDOWN) { + static::forkWorkers(); + // If reloading continue. + if (isset(static::$_pidsToRestart[$pid])) { + unset(static::$_pidsToRestart[$pid]); + static::reload(); + } + } + } + + // If shutdown state and all child processes exited then master process exit. + if (static::$_status === static::STATUS_SHUTDOWN && !static::getAllWorkerPids()) { + static::exitAndClearAll(); + } + } + } + + /** + * Monitor all child processes. + * + * @return void + */ + protected static function monitorWorkersForWindows() + { + Timer::add(1, "\\Workerman\\Worker::checkWorkerStatusForWindows"); + + static::$globalEvent->loop(); + } + + /** + * Exit current process. + * + * @return void + */ + protected static function exitAndClearAll() + { + foreach (static::$_workers as $worker) { + $socket_name = $worker->getSocketName(); + if ($worker->transport === 'unix' && $socket_name) { + list(, $address) = \explode(':', $socket_name, 2); + $address = substr($address, strpos($address, '/') + 2); + @\unlink($address); + } + } + @\unlink(static::$pidFile); + static::log("Workerman[" . \basename(static::$_startFile) . "] has been stopped"); + if (static::$onMasterStop) { + \call_user_func(static::$onMasterStop); + } + exit(0); + } + + /** + * Execute reload. + * + * @return void + */ + protected static function reload() + { + // For master process. + if (static::$_masterPid === \posix_getpid()) { + // Set reloading state. + if (static::$_status !== static::STATUS_RELOADING && static::$_status !== static::STATUS_SHUTDOWN) { + static::log("Workerman[" . \basename(static::$_startFile) . "] reloading"); + static::$_status = static::STATUS_RELOADING; + // Try to emit onMasterReload callback. + if (static::$onMasterReload) { + try { + \call_user_func(static::$onMasterReload); + } catch (\Exception $e) { + static::stopAll(250, $e); + } catch (\Error $e) { + static::stopAll(250, $e); + } + static::initId(); + } + } + + if (static::$_gracefulStop) { + $sig = \SIGUSR2; + } else { + $sig = \SIGUSR1; + } + + // Send reload signal to all child processes. + $reloadable_pid_array = array(); + foreach (static::$_pidMap as $worker_id => $worker_pid_array) { + $worker = static::$_workers[$worker_id]; + if ($worker->reloadable) { + foreach ($worker_pid_array as $pid) { + $reloadable_pid_array[$pid] = $pid; + } + } else { + foreach ($worker_pid_array as $pid) { + // Send reload signal to a worker process which reloadable is false. + \posix_kill($pid, $sig); + } + } + } + + // Get all pids that are waiting reload. + static::$_pidsToRestart = \array_intersect(static::$_pidsToRestart, $reloadable_pid_array); + + // Reload complete. + if (empty(static::$_pidsToRestart)) { + if (static::$_status !== static::STATUS_SHUTDOWN) { + static::$_status = static::STATUS_RUNNING; + } + return; + } + // Continue reload. + $one_worker_pid = \current(static::$_pidsToRestart); + // Send reload signal to a worker process. + \posix_kill($one_worker_pid, $sig); + // If the process does not exit after static::$stopTimeout seconds try to kill it. + if(!static::$_gracefulStop){ + Timer::add(static::$stopTimeout, '\posix_kill', array($one_worker_pid, \SIGKILL), false); + } + } // For child processes. + else { + \reset(static::$_workers); + $worker = \current(static::$_workers); + // Try to emit onWorkerReload callback. + if ($worker->onWorkerReload) { + try { + \call_user_func($worker->onWorkerReload, $worker); + } catch (\Exception $e) { + static::stopAll(250, $e); + } catch (\Error $e) { + static::stopAll(250, $e); + } + } + + if ($worker->reloadable) { + static::stopAll(); + } + } + } + + /** + * Stop all. + * + * @param int $code + * @param string $log + */ + public static function stopAll($code = 0, $log = '') + { + if ($log) { + static::log($log); + } + + static::$_status = static::STATUS_SHUTDOWN; + // For master process. + if (\DIRECTORY_SEPARATOR === '/' && static::$_masterPid === \posix_getpid()) { + static::log("Workerman[" . \basename(static::$_startFile) . "] stopping ..."); + $worker_pid_array = static::getAllWorkerPids(); + // Send stop signal to all child processes. + if (static::$_gracefulStop) { + $sig = \SIGQUIT; + } else { + $sig = \SIGINT; + } + foreach ($worker_pid_array as $worker_pid) { + \posix_kill($worker_pid, $sig); + if(!static::$_gracefulStop){ + Timer::add(static::$stopTimeout, '\posix_kill', array($worker_pid, \SIGKILL), false); + } + } + Timer::add(1, "\\Workerman\\Worker::checkIfChildRunning"); + // Remove statistics file. + if (\is_file(static::$_statisticsFile)) { + @\unlink(static::$_statisticsFile); + } + } // For child processes. + else { + // Execute exit. + foreach (static::$_workers as $worker) { + if(!$worker->stopping){ + $worker->stop(); + $worker->stopping = true; + } + } + if (!static::$_gracefulStop || ConnectionInterface::$statistics['connection_count'] <= 0) { + static::$_workers = array(); + if (static::$globalEvent) { + static::$globalEvent->destroy(); + } + + try { + exit($code); + } catch (Exception $e) { + + } + } + } + } + + /** + * check if child processes is really running + */ + public static function checkIfChildRunning() + { + foreach (static::$_pidMap as $worker_id => $worker_pid_array) { + foreach ($worker_pid_array as $pid => $worker_pid) { + if (!\posix_kill($pid, 0)) { + unset(static::$_pidMap[$worker_id][$pid]); + } + } + } + } + + /** + * Get process status. + * + * @return number + */ + public static function getStatus() + { + return static::$_status; + } + + /** + * If stop gracefully. + * + * @return bool + */ + public static function getGracefulStop() + { + return static::$_gracefulStop; + } + + /** + * Write statistics data to disk. + * + * @return void + */ + protected static function writeStatisticsToStatusFile() + { + // For master process. + if (static::$_masterPid === \posix_getpid()) { + $all_worker_info = array(); + foreach(static::$_pidMap as $worker_id => $pid_array) { + /** @var /Workerman/Worker $worker */ + $worker = static::$_workers[$worker_id]; + foreach($pid_array as $pid) { + $all_worker_info[$pid] = array('name' => $worker->name, 'listen' => $worker->getSocketName()); + } + } + + \file_put_contents(static::$_statisticsFile, \serialize($all_worker_info)."\n", \FILE_APPEND); + $loadavg = \function_exists('sys_getloadavg') ? \array_map('round', \sys_getloadavg(), array(2,2,2)) : array('-', '-', '-'); + \file_put_contents(static::$_statisticsFile, + "----------------------------------------------GLOBAL STATUS----------------------------------------------------\n", \FILE_APPEND); + \file_put_contents(static::$_statisticsFile, + 'Workerman version:' . static::VERSION . " PHP version:" . \PHP_VERSION . "\n", \FILE_APPEND); + \file_put_contents(static::$_statisticsFile, 'start time:' . \date('Y-m-d H:i:s', + static::$_globalStatistics['start_timestamp']) . ' run ' . \floor((\time() - static::$_globalStatistics['start_timestamp']) / (24 * 60 * 60)) . ' days ' . \floor(((\time() - static::$_globalStatistics['start_timestamp']) % (24 * 60 * 60)) / (60 * 60)) . " hours \n", + FILE_APPEND); + $load_str = 'load average: ' . \implode(", ", $loadavg); + \file_put_contents(static::$_statisticsFile, + \str_pad($load_str, 33) . 'event-loop:' . static::getEventLoopName() . "\n", \FILE_APPEND); + \file_put_contents(static::$_statisticsFile, + \count(static::$_pidMap) . ' workers ' . \count(static::getAllWorkerPids()) . " processes\n", + \FILE_APPEND); + \file_put_contents(static::$_statisticsFile, + \str_pad('worker_name', static::$_maxWorkerNameLength) . " exit_status exit_count\n", \FILE_APPEND); + foreach (static::$_pidMap as $worker_id => $worker_pid_array) { + $worker = static::$_workers[$worker_id]; + if (isset(static::$_globalStatistics['worker_exit_info'][$worker_id])) { + foreach (static::$_globalStatistics['worker_exit_info'][$worker_id] as $worker_exit_status => $worker_exit_count) { + \file_put_contents(static::$_statisticsFile, + \str_pad($worker->name, static::$_maxWorkerNameLength) . " " . \str_pad($worker_exit_status, + 16) . " $worker_exit_count\n", \FILE_APPEND); + } + } else { + \file_put_contents(static::$_statisticsFile, + \str_pad($worker->name, static::$_maxWorkerNameLength) . " " . \str_pad(0, 16) . " 0\n", + \FILE_APPEND); + } + } + \file_put_contents(static::$_statisticsFile, + "----------------------------------------------PROCESS STATUS---------------------------------------------------\n", + \FILE_APPEND); + \file_put_contents(static::$_statisticsFile, + "pid\tmemory " . \str_pad('listening', static::$_maxSocketNameLength) . " " . \str_pad('worker_name', + static::$_maxWorkerNameLength) . " connections " . \str_pad('send_fail', 9) . " " + . \str_pad('timers', 8) . \str_pad('total_request', 13) ." qps status\n", \FILE_APPEND); + + \chmod(static::$_statisticsFile, 0722); + + foreach (static::getAllWorkerPids() as $worker_pid) { + \posix_kill($worker_pid, \SIGIOT); + } + return; + } + + // For child processes. + \gc_collect_cycles(); + if (\function_exists('gc_mem_caches')) { + \gc_mem_caches(); + } + \reset(static::$_workers); + /** @var \Workerman\Worker $worker */ + $worker = current(static::$_workers); + $worker_status_str = \posix_getpid() . "\t" . \str_pad(round(memory_get_usage(false) / (1024 * 1024), 2) . "M", 7) + . " " . \str_pad($worker->getSocketName(), static::$_maxSocketNameLength) . " " + . \str_pad(($worker->name === $worker->getSocketName() ? 'none' : $worker->name), static::$_maxWorkerNameLength) + . " "; + $worker_status_str .= \str_pad(ConnectionInterface::$statistics['connection_count'], 11) + . " " . \str_pad(ConnectionInterface::$statistics['send_fail'], 9) + . " " . \str_pad(static::$globalEvent->getTimerCount(), 7) + . " " . \str_pad(ConnectionInterface::$statistics['total_request'], 13) . "\n"; + \file_put_contents(static::$_statisticsFile, $worker_status_str, \FILE_APPEND); + } + + /** + * Write statistics data to disk. + * + * @return void + */ + protected static function writeConnectionsStatisticsToStatusFile() + { + // For master process. + if (static::$_masterPid === \posix_getpid()) { + \file_put_contents(static::$_statisticsFile, "--------------------------------------------------------------------- WORKERMAN CONNECTION STATUS --------------------------------------------------------------------------------\n", \FILE_APPEND); + \file_put_contents(static::$_statisticsFile, "PID Worker CID Trans Protocol ipv4 ipv6 Recv-Q Send-Q Bytes-R Bytes-W Status Local Address Foreign Address\n", \FILE_APPEND); + \chmod(static::$_statisticsFile, 0722); + foreach (static::getAllWorkerPids() as $worker_pid) { + \posix_kill($worker_pid, \SIGIO); + } + return; + } + + // For child processes. + $bytes_format = function($bytes) + { + if($bytes > 1024*1024*1024*1024) { + return round($bytes/(1024*1024*1024*1024), 1)."TB"; + } + if($bytes > 1024*1024*1024) { + return round($bytes/(1024*1024*1024), 1)."GB"; + } + if($bytes > 1024*1024) { + return round($bytes/(1024*1024), 1)."MB"; + } + if($bytes > 1024) { + return round($bytes/(1024), 1)."KB"; + } + return $bytes."B"; + }; + + $pid = \posix_getpid(); + $str = ''; + \reset(static::$_workers); + $current_worker = current(static::$_workers); + $default_worker_name = $current_worker->name; + + /** @var \Workerman\Worker $worker */ + foreach(TcpConnection::$connections as $connection) { + /** @var \Workerman\Connection\TcpConnection $connection */ + $transport = $connection->transport; + $ipv4 = $connection->isIpV4() ? ' 1' : ' 0'; + $ipv6 = $connection->isIpV6() ? ' 1' : ' 0'; + $recv_q = $bytes_format($connection->getRecvBufferQueueSize()); + $send_q = $bytes_format($connection->getSendBufferQueueSize()); + $local_address = \trim($connection->getLocalAddress()); + $remote_address = \trim($connection->getRemoteAddress()); + $state = $connection->getStatus(false); + $bytes_read = $bytes_format($connection->bytesRead); + $bytes_written = $bytes_format($connection->bytesWritten); + $id = $connection->id; + $protocol = $connection->protocol ? $connection->protocol : $connection->transport; + $pos = \strrpos($protocol, '\\'); + if ($pos) { + $protocol = \substr($protocol, $pos+1); + } + if (\strlen($protocol) > 15) { + $protocol = \substr($protocol, 0, 13) . '..'; + } + $worker_name = isset($connection->worker) ? $connection->worker->name : $default_worker_name; + if (\strlen($worker_name) > 14) { + $worker_name = \substr($worker_name, 0, 12) . '..'; + } + $str .= \str_pad($pid, 9) . \str_pad($worker_name, 16) . \str_pad($id, 10) . \str_pad($transport, 8) + . \str_pad($protocol, 16) . \str_pad($ipv4, 7) . \str_pad($ipv6, 7) . \str_pad($recv_q, 13) + . \str_pad($send_q, 13) . \str_pad($bytes_read, 13) . \str_pad($bytes_written, 13) . ' ' + . \str_pad($state, 14) . ' ' . \str_pad($local_address, 22) . ' ' . \str_pad($remote_address, 22) ."\n"; + } + if ($str) { + \file_put_contents(static::$_statisticsFile, $str, \FILE_APPEND); + } + } + + /** + * Check errors when current process exited. + * + * @return void + */ + public static function checkErrors() + { + if (static::STATUS_SHUTDOWN !== static::$_status) { + $error_msg = static::$_OS === \OS_TYPE_LINUX ? 'Worker['. \posix_getpid() .'] process terminated' : 'Worker process terminated'; + $errors = error_get_last(); + if ($errors && ($errors['type'] === \E_ERROR || + $errors['type'] === \E_PARSE || + $errors['type'] === \E_CORE_ERROR || + $errors['type'] === \E_COMPILE_ERROR || + $errors['type'] === \E_RECOVERABLE_ERROR) + ) { + $error_msg .= ' with ERROR: ' . static::getErrorType($errors['type']) . " \"{$errors['message']} in {$errors['file']} on line {$errors['line']}\""; + } + static::log($error_msg); + } + } + + /** + * Get error message by error code. + * + * @param integer $type + * @return string + */ + protected static function getErrorType($type) + { + if(isset(self::$_errorType[$type])) { + return self::$_errorType[$type]; + } + + return ''; + } + + /** + * Log. + * + * @param string $msg + * @return void + */ + public static function log($msg) + { + $msg = $msg . "\n"; + if (!static::$daemonize) { + static::safeEcho($msg); + } + \file_put_contents((string)static::$logFile, \date('Y-m-d H:i:s') . ' ' . 'pid:' + . (static::$_OS === \OS_TYPE_LINUX ? \posix_getpid() : 1) . ' ' . $msg, \FILE_APPEND | \LOCK_EX); + } + + /** + * Safe Echo. + * @param string $msg + * @param bool $decorated + * @return bool + */ + public static function safeEcho($msg, $decorated = false) + { + $stream = static::outputStream(); + if (!$stream) { + return false; + } + if (!$decorated) { + $line = $white = $green = $end = ''; + if (static::$_outputDecorated) { + $line = "\033[1A\n\033[K"; + $white = "\033[47;30m"; + $green = "\033[32;40m"; + $end = "\033[0m"; + } + $msg = \str_replace(array('<n>', '<w>', '<g>'), array($line, $white, $green), $msg); + $msg = \str_replace(array('</n>', '</w>', '</g>'), $end, $msg); + } elseif (!static::$_outputDecorated) { + return false; + } + \fwrite($stream, $msg); + \fflush($stream); + return true; + } + + /** + * @param resource|null $stream + * @return bool|resource + */ + private static function outputStream($stream = null) + { + if (!$stream) { + $stream = static::$_outputStream ? static::$_outputStream : \STDOUT; + } + if (!$stream || !\is_resource($stream) || 'stream' !== \get_resource_type($stream)) { + return false; + } + $stat = \fstat($stream); + if (!$stat) { + return false; + } + if (($stat['mode'] & 0170000) === 0100000) { + // file + static::$_outputDecorated = false; + } else { + static::$_outputDecorated = + static::$_OS === \OS_TYPE_LINUX && + \function_exists('posix_isatty') && + \posix_isatty($stream); + } + return static::$_outputStream = $stream; + } + + /** + * Construct. + * + * @param string $socket_name + * @param array $context_option + */ + public function __construct($socket_name = '', array $context_option = array()) + { + // Save all worker instances. + $this->workerId = \spl_object_hash($this); + static::$_workers[$this->workerId] = $this; + static::$_pidMap[$this->workerId] = array(); + + // Get autoload root path. + $backtrace = \debug_backtrace(); + $this->_autoloadRootPath = \dirname($backtrace[0]['file']); + Autoloader::setRootPath($this->_autoloadRootPath); + + // Context for socket. + if ($socket_name) { + $this->_socketName = $socket_name; + if (!isset($context_option['socket']['backlog'])) { + $context_option['socket']['backlog'] = static::DEFAULT_BACKLOG; + } + $this->_context = \stream_context_create($context_option); + } + + // Turn reusePort on. + /*if (static::$_OS === \OS_TYPE_LINUX // if linux + && \version_compare(\PHP_VERSION,'7.0.0', 'ge') // if php >= 7.0.0 + && \version_compare(php_uname('r'), '3.9', 'ge') // if kernel >=3.9 + && \strtolower(\php_uname('s')) !== 'darwin' // if not Mac OS + && strpos($socket_name,'unix') !== 0) { // if not unix socket + + $this->reusePort = true; + }*/ + } + + + /** + * Listen. + * + * @throws Exception + */ + public function listen() + { + if (!$this->_socketName) { + return; + } + + // Autoload. + Autoloader::setRootPath($this->_autoloadRootPath); + + if (!$this->_mainSocket) { + + $local_socket = $this->parseSocketAddress(); + + // Flag. + $flags = $this->transport === 'udp' ? \STREAM_SERVER_BIND : \STREAM_SERVER_BIND | \STREAM_SERVER_LISTEN; + $errno = 0; + $errmsg = ''; + // SO_REUSEPORT. + if ($this->reusePort) { + \stream_context_set_option($this->_context, 'socket', 'so_reuseport', 1); + } + + // Create an Internet or Unix domain server socket. + $this->_mainSocket = \stream_socket_server($local_socket, $errno, $errmsg, $flags, $this->_context); + if (!$this->_mainSocket) { + throw new Exception($errmsg); + } + + if ($this->transport === 'ssl') { + \stream_socket_enable_crypto($this->_mainSocket, false); + } elseif ($this->transport === 'unix') { + $socket_file = \substr($local_socket, 7); + if ($this->user) { + \chown($socket_file, $this->user); + } + if ($this->group) { + \chgrp($socket_file, $this->group); + } + } + + // Try to open keepalive for tcp and disable Nagle algorithm. + if (\function_exists('socket_import_stream') && static::$_builtinTransports[$this->transport] === 'tcp') { + \set_error_handler(function(){}); + $socket = \socket_import_stream($this->_mainSocket); + \socket_set_option($socket, \SOL_SOCKET, \SO_KEEPALIVE, 1); + \socket_set_option($socket, \SOL_TCP, \TCP_NODELAY, 1); + \restore_error_handler(); + } + + // Non blocking. + \stream_set_blocking($this->_mainSocket, false); + } + + $this->resumeAccept(); + } + + /** + * Unlisten. + * + * @return void + */ + public function unlisten() { + $this->pauseAccept(); + if ($this->_mainSocket) { + \set_error_handler(function(){}); + \fclose($this->_mainSocket); + \restore_error_handler(); + $this->_mainSocket = null; + } + } + + /** + * Parse local socket address. + * + * @throws Exception + */ + protected function parseSocketAddress() { + if (!$this->_socketName) { + return; + } + // Get the application layer communication protocol and listening address. + list($scheme, $address) = \explode(':', $this->_socketName, 2); + // Check application layer protocol class. + if (!isset(static::$_builtinTransports[$scheme])) { + $scheme = \ucfirst($scheme); + $this->protocol = \substr($scheme,0,1)==='\\' ? $scheme : 'Protocols\\' . $scheme; + if (!\class_exists($this->protocol)) { + $this->protocol = "Workerman\\Protocols\\$scheme"; + if (!\class_exists($this->protocol)) { + throw new Exception("class \\Protocols\\$scheme not exist"); + } + } + + if (!isset(static::$_builtinTransports[$this->transport])) { + throw new Exception('Bad worker->transport ' . \var_export($this->transport, true)); + } + } else { + $this->transport = $scheme; + } + //local socket + return static::$_builtinTransports[$this->transport] . ":" . $address; + } + + /** + * Pause accept new connections. + * + * @return void + */ + public function pauseAccept() + { + if (static::$globalEvent && false === $this->_pauseAccept && $this->_mainSocket) { + static::$globalEvent->del($this->_mainSocket, EventInterface::EV_READ); + $this->_pauseAccept = true; + } + } + + /** + * Resume accept new connections. + * + * @return void + */ + public function resumeAccept() + { + // Register a listener to be notified when server socket is ready to read. + if (static::$globalEvent && true === $this->_pauseAccept && $this->_mainSocket) { + if ($this->transport !== 'udp') { + static::$globalEvent->add($this->_mainSocket, EventInterface::EV_READ, array($this, 'acceptConnection')); + } else { + static::$globalEvent->add($this->_mainSocket, EventInterface::EV_READ, array($this, 'acceptUdpConnection')); + } + $this->_pauseAccept = false; + } + } + + /** + * Get socket name. + * + * @return string + */ + public function getSocketName() + { + return $this->_socketName ? \lcfirst($this->_socketName) : 'none'; + } + + /** + * Run worker instance. + * + * @return void + */ + public function run() + { + //Update process state. + static::$_status = static::STATUS_RUNNING; + + // Register shutdown function for checking errors. + \register_shutdown_function(array("\\Workerman\\Worker", 'checkErrors')); + + // Set autoload root path. + Autoloader::setRootPath($this->_autoloadRootPath); + + // Create a global event loop. + if (!static::$globalEvent) { + $event_loop_class = static::getEventLoopName(); + static::$globalEvent = new $event_loop_class; + $this->resumeAccept(); + } + + // Reinstall signal. + static::reinstallSignal(); + + // Init Timer. + Timer::init(static::$globalEvent); + + // Set an empty onMessage callback. + if (empty($this->onMessage)) { + $this->onMessage = function () {}; + } + + \restore_error_handler(); + + // Try to emit onWorkerStart callback. + if ($this->onWorkerStart) { + try { + \call_user_func($this->onWorkerStart, $this); + } catch (\Exception $e) { + // Avoid rapid infinite loop exit. + sleep(1); + static::stopAll(250, $e); + } catch (\Error $e) { + // Avoid rapid infinite loop exit. + sleep(1); + static::stopAll(250, $e); + } + } + + // Main loop. + static::$globalEvent->loop(); + } + + /** + * Stop current worker instance. + * + * @return void + */ + public function stop() + { + // Try to emit onWorkerStop callback. + if ($this->onWorkerStop) { + try { + \call_user_func($this->onWorkerStop, $this); + } catch (\Exception $e) { + static::stopAll(250, $e); + } catch (\Error $e) { + static::stopAll(250, $e); + } + } + // Remove listener for server socket. + $this->unlisten(); + // Close all connections for the worker. + if (!static::$_gracefulStop) { + foreach ($this->connections as $connection) { + $connection->close(); + } + } + // Clear callback. + $this->onMessage = $this->onClose = $this->onError = $this->onBufferDrain = $this->onBufferFull = null; + } + + /** + * Accept a connection. + * + * @param resource $socket + * @return void + */ + public function acceptConnection($socket) + { + // Accept a connection on server socket. + \set_error_handler(function(){}); + $new_socket = \stream_socket_accept($socket, 0, $remote_address); + \restore_error_handler(); + + // Thundering herd. + if (!$new_socket) { + return; + } + + // TcpConnection. + $connection = new TcpConnection($new_socket, $remote_address); + $this->connections[$connection->id] = $connection; + $connection->worker = $this; + $connection->protocol = $this->protocol; + $connection->transport = $this->transport; + $connection->onMessage = $this->onMessage; + $connection->onClose = $this->onClose; + $connection->onError = $this->onError; + $connection->onBufferDrain = $this->onBufferDrain; + $connection->onBufferFull = $this->onBufferFull; + + // Try to emit onConnect callback. + if ($this->onConnect) { + try { + \call_user_func($this->onConnect, $connection); + } catch (\Exception $e) { + static::stopAll(250, $e); + } catch (\Error $e) { + static::stopAll(250, $e); + } + } + } + + /** + * For udp package. + * + * @param resource $socket + * @return bool + */ + public function acceptUdpConnection($socket) + { + \set_error_handler(function(){}); + $recv_buffer = \stream_socket_recvfrom($socket, static::MAX_UDP_PACKAGE_SIZE, 0, $remote_address); + \restore_error_handler(); + if (false === $recv_buffer || empty($remote_address)) { + return false; + } + // UdpConnection. + $connection = new UdpConnection($socket, $remote_address); + $connection->protocol = $this->protocol; + if ($this->onMessage) { + try { + if ($this->protocol !== null) { + /** @var \Workerman\Protocols\ProtocolInterface $parser */ + $parser = $this->protocol; + if ($parser && \method_exists($parser, 'input')) { + while ($recv_buffer !== '') { + $len = $parser::input($recv_buffer, $connection); + if ($len === 0) + return true; + $package = \substr($recv_buffer, 0, $len); + $recv_buffer = \substr($recv_buffer, $len); + $data = $parser::decode($package, $connection); + if ($data === false) + continue; + \call_user_func($this->onMessage, $connection, $data); + } + } else { + $data = $parser::decode($recv_buffer, $connection); + // Discard bad packets. + if ($data === false) + return true; + \call_user_func($this->onMessage, $connection, $data); + } + } else { + \call_user_func($this->onMessage, $connection, $recv_buffer); + } + ++ConnectionInterface::$statistics['total_request']; + } catch (\Exception $e) { + static::stopAll(250, $e); + } catch (\Error $e) { + static::stopAll(250, $e); + } + } + return true; + } + + /** + * Check master process is alive + * + * @param int $master_pid + * @return bool + */ + protected static function checkMasterIsAlive($master_pid) + { + if (empty($master_pid)) { + return false; + } + + $master_is_alive = $master_pid && \posix_kill((int) $master_pid, 0) && \posix_getpid() !== $master_pid; + if (!$master_is_alive) { + return false; + } + + $cmdline = "/proc/{$master_pid}/cmdline"; + if (!is_readable($cmdline) || empty(static::$processTitle)) { + return true; + } + + $content = file_get_contents($cmdline); + if (empty($content)) { + return true; + } + + return stripos($content, static::$processTitle) !== false || stripos($content, 'php') !== false; + } +} + diff --git a/vendor/workerman/workerman/composer.json b/vendor/workerman/workerman/composer.json new file mode 100644 index 0000000..19e2984 --- /dev/null +++ b/vendor/workerman/workerman/composer.json @@ -0,0 +1,38 @@ +{ + "name": "workerman/workerman", + "type": "library", + "keywords": [ + "event-loop", + "asynchronous" + ], + "homepage": "http://www.workerman.net", + "license": "MIT", + "description": "An asynchronous event driven PHP framework for easily building fast, scalable network applications.", + "authors": [ + { + "name": "walkor", + "email": "walkor@workerman.net", + "homepage": "http://www.workerman.net", + "role": "Developer" + } + ], + "support": { + "email": "walkor@workerman.net", + "issues": "https://github.com/walkor/workerman/issues", + "forum": "http://wenda.workerman.net/", + "wiki": "http://doc.workerman.net/", + "source": "https://github.com/walkor/workerman" + }, + "require": { + "php": ">=7.0" + }, + "suggest": { + "ext-event": "For better performance. " + }, + "autoload": { + "psr-4": { + "Workerman\\": "./" + } + }, + "minimum-stability": "dev" +} diff --git a/vendor/yzh52521/easyhttp/LICENSE b/vendor/yzh52521/easyhttp/LICENSE new file mode 100644 index 0000000..8cc32f9 --- /dev/null +++ b/vendor/yzh52521/easyhttp/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2014-present rap2hpoutre + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/vendor/yzh52521/easyhttp/README.md b/vendor/yzh52521/easyhttp/README.md new file mode 100644 index 0000000..ae0c7e1 --- /dev/null +++ b/vendor/yzh52521/easyhttp/README.md @@ -0,0 +1,341 @@ +EasyHttp 是一个轻量级、语义化、对IDE友好的HTTP客户端,支持常见的HTTP请求、异步请求和并发请求,让你可以快速地使用 HTTP 请求与其他 Web 应用进行通信。 + +> EasyHttp并不强制依赖于cURL,如果没有安装cURL,EasyHttp会自动选择使用PHP流处理,或者你也可以提供自己的发送HTTP请求的处理方式。 + +如果您觉得EasyHttp对您有用的话,别忘了给点个赞哦^_^ ! + +github:[github.com/yzh52521/easyhttp](https://github.com/yzh52521/easyhttp "github.com/yzh52521/easyhttp") + +gitee:[gitee.com/yzh52521/easyhttp](https://gitee.com/yzh52521/easyhttp "gitee.com/yzh52521/easyhttp") + +本包是基于 [ gouguoyin/easyhttp ](https://gitee.com/gouguoyin/easyhttp "gitee.com/gouguoyin/easyhttp") 进行扩展开发,主要实现了以下扩展: + +1. 增加 retry() 重试机制。 +2. 增加 debug 日志调试功能。 +3. 增加 withHost 指定服务端base_url + + +# 安装说明 + +#### 环境依赖 + +- PHP >= 7.2.5 +- 如果使用PHP流处理,allow_url_fopen 必须在php.ini中启用。 +- 如果使用cURL处理,cURL >= 7.19.4,并且编译了OpenSSL 与 zlib。 + +#### 一键安装 + + composer require yzh52521/easyhttp + +## 发起请求 + +#### 同步请求 + +###### 常规请求 + +```php +$response = Http::get('http://httpbin.org/get'); + +$response = Http::get('http://httpbin.org/get?name=yzh52521'); + +$response = Http::get('http://httpbin.org/get?name=yzh52521', ['age' => 18]); + +$response = Http::post('http://httpbin.org/post'); + +$response = Http::post('http://httpbin.org/post', ['name' => 'yzh52521']); + +$response = Http::patch(...); + +$response = Http::put(...); + +$response = Http::delete(...); + +$response = Http::head(...); + +$response = Http::options(...); +``` + +###### 指定服务端base_url的请求 + +```php +// 指定服务端base_url地址,最终请求地址为 https://serv.yzh52521.com/login +$response = Http::withHost('https://serv.yzh52521.com')->post('/login'); + +``` +###### 发送 Content-Type 编码请求 + +```php +// application/x-www-form-urlencoded(默认) +$response = Http::asForm()->post(...); + +// application/json +$response = Http::asJson()->post(...); +``` + +###### 发送 Multipart 表单请求 + +```php +$response = Http::asMultipart( + 'file_input_name', file_get_contents('photo1.jpg'), 'photo2.jpg' +)->post('http://test.com/attachments'); + +$response = Http::asMultipart( + 'file_input_name', fopen('photo1.jpg', 'r'), 'photo2.jpg' +)->post(...); + +$response = Http::attach( + 'file_input_name', file_get_contents('photo1.jpg'), 'photo2.jpg' +)->post(...); + +$response = Http::attach( + 'file_input_name', fopen('photo1.jpg', 'r'), 'photo2.jpg' +)->post(...); +``` +> 表单enctype属性需要设置成 multipart/form-data + +###### 携带请求头的请求 + +```php +$response = Http::withHeaders([ + 'x-powered-by' => 'yzh52521' +])->post(...); +``` + +###### 携带重定向的请求 + +```php +// 默认 +$response = Http::withRedirect(false)->post(...); + +$response = Http::withRedirect([ + 'max' => 5, + 'strict' => false, + 'referer' => true, + 'protocols' => ['http', 'https'], + 'track_redirects' => false +])->post(...); +``` + +###### 携带认证的请求 + +```php +// Basic认证 +$response = Http::withBasicAuth('username', 'password')->post(...); + +// Digest认证(需要被HTTP服务器支持) +$response = Http::withDigestAuth('username', 'password')->post(...); +``` + +###### 携带 User-Agent 的请求 +```php +$response = Http::withUA('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36')->post(...); +``` + +###### 携带Token令牌的请求 + +```php +$response = Http::withToken('token')->post(...); +``` + +###### 携带认证文件的请求 + +```php +$response = Http::withCert('/path/server.pem', 'password')->post(...); +``` + +###### 携带SSL证书的请求 + +```php +// 默认 +$response = Http::withVerify(false)->post(...); + +$response = Http::withVerify('/path/to/cert.pem')->post(...); +``` + +###### 携带COOKIE的请求 + +```php +$response = Http::withCookies(array $cookies, string $domain)->post(...); +``` + +###### 携带协议版本的请求 + +```php +$response = Http::withVersion(1.1)->post(...); +``` + +###### 携带代理的请求 + +```php +$response = Http::withProxy('tcp://localhost:8125')->post(...); + +$response = Http::withProxy([ + 'http' => 'tcp://localhost:8125', // Use this proxy with "http" + 'https' => 'tcp://localhost:9124', // Use this proxy with "https", + 'no' => ['.com.cn', 'yzh52521.cn'] // Don't use a proxy with these +])->post(...); +``` + +###### 设置超时时间(单位秒) + +```php +$response = Http::timeout(60)->post(...); +``` + +###### 设置延迟时间(单位秒) + +```php +$response = Http::delay(60)->post(...); +``` + +###### 设置并发次数 + +```php +$response = Http::concurrency(10)->promise(...); +``` + +###### 重发请求,设置retry方法。重试次数/两次重试之间的时间间隔(毫秒): + +```php +$response = Http::retry(3, 100)->post(...); +``` + +#### 异步请求 + +```php +use yzh52521\EasyHttp\Response; +use yzh52521\EasyHttp\RequestException; + +Http::getAsync('http://easyhttp.yzh52521.cn/api/sleep3.json', ['token' => TOKEN], function (Response $response) { + echo '异步请求成功,响应内容:' . $response->body() . PHP_EOL; +}, function (RequestException $e) { + echo '异步请求异常,错误码:' . $e->getCode() . ',错误信息:' . $e->getMessage() . PHP_EOL; +}); +echo json_encode(['code' => 200, 'msg' => '请求成功'], JSON_UNESCAPED_UNICODE) . PHP_EOL; + +//输出 +{"code":200,"msg":"请求成功"} +异步请求成功,响应内容:{"code":200,"msg":"success","second":3} + +Http::getAsync('http1://easyhttp.yzh52521.cn/api/sleep3.json', function (Response $response) { + echo '异步请求成功,响应内容:' . $response->body() . PHP_EOL; +}, function (RequestException $e) { + echo '异步请求异常,错误信息:' . $e->getMessage() . PHP_EOL; +}); +echo json_encode(['code' => 200, 'msg' => '请求成功'], JSON_UNESCAPED_UNICODE) . PHP_EOL; + +//输出 +{"code":200,"msg":"请求成功"} +异步请求异常,错误信息:cURL error 1: Protocol "http1" not supported or disabled in libcurl (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) + +Http::postAsync(...); + +Http::patchAsync(...); + +Http::putAsync(...); + +Http::deleteAsync(...); + +Http::headAsync(...); + +Http::optionsAsync(...); +``` + +#### 异步并发请求 + +```php +use yzh52521\EasyHttp\Response; +use yzh52521\EasyHttp\RequestException; + +$promises = [ + Http::getAsync('http://easyhttp.yzh52521.cn/api/sleep3.json'), + Http::getAsync('http1://easyhttp.yzh52521.cn/api/sleep1.json', ['name' => 'yzh52521']), + Http::postAsync('http://easyhttp.yzh52521.cn/api/sleep2.json', ['name' => 'yzh52521']), +]; + +Http::concurrency(10)->multiAsync($promises, function (Response $response, $index) { + echo "发起第 $index 个异步请求,请求时长:" . $response->json()->second . '秒' . PHP_EOL; +}, function (RequestException $e, $index) { + echo "发起第 $index 个请求失败,失败原因:" . $e->getMessage() . PHP_EOL; +}); + +//输出 +发起第 1 个请求失败,失败原因:cURL error 1: Protocol "http1" not supported or disabled in libcurl (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) +发起第 2 个异步请求,请求时长:2 秒 +发起第 0 个异步请求,请求时长:3 秒 +``` +> 如果未调用concurrency()方法,并发次数默认为$promises的元素个数,$promises数组里必须是异步请求 + +## 使用响应 + +发起请求后会返回一个 yzh52521\EasyHttp\Response $response的实例,该实例提供了以下方法来检查请求的响应: + +```php +$response->body() : string; +$response->json() : object; +$response->array() : array; +$response->status() : int; +$response->ok() : bool; +$response->successful() : bool; +$response->serverError() : bool; +$response->clientError() : bool; +$response->headers() : array; +$response->header($header) : string; +``` + +## 异常处理 + +请求在发生客户端或服务端错误时会抛出 yzh52521\EasyHttp\RequestException $e异常,该实例提供了以下方法来返回异常信息: + +```php +$e->getCode() : int; +$e->getMessage() : string; +$e->getFile() : string; +$e->getLine() : int; +$e->getTrace() : array; +$e->getTraceAsString() : string; +``` +## 调试日志 + +有时候难免要对 Http 的请求和响应包体进行记录以方便查找问题或做什么 + +```php +//传递一个日志类 thinkphp \think\facade\Log laravel Illuminate\Support\Facades\Log +Http::debug(Log::class)->post(...); +``` + + +## 更新日志 +### 2022-05-11 +* 新增removeBodyFormat() 用于withOptions 指定body时,清除原由的bodyFromat +### 2022-05-10 +* 新增发送原生请求的方法client() +* 新增发送原生异步请求的方法clientASync() +### 2021-09-03 +* 新增 debug() 调试日志 +* 新增 retry() 重试机制 +* 修复header重叠的bug +### 2020-03-30 +* 修复部分情况下IDE不能智能提示的BUG +* get()、getAsync()方法支持带参数的url +* 新增withUA()方法 +* 新增withStream()方法 +* 新增asMultipart()方法,attach()的别名 +* 新增multiAsync()异步并发请求方法 + +### 2020-03-20 +* 新增异步请求getAsync()方法 +* 新增异步请求postAsync()方法 +* 新增异步请求patchAsync()方法 +* 新增异步请求putAsync()方法 +* 新增异步请求deleteAsync()方法 +* 新增异步请求headAsync()方法 +* 新增异步请求optionsAsync()方法 + +## Todo List + - [x] 异步请求 + - [x] 并发请求 + - [x] 重试机制 + - [ ] 支持http2 + - [ ] 支持swoole +# easyhttp diff --git a/vendor/yzh52521/easyhttp/composer.json b/vendor/yzh52521/easyhttp/composer.json new file mode 100644 index 0000000..872bfdf --- /dev/null +++ b/vendor/yzh52521/easyhttp/composer.json @@ -0,0 +1,33 @@ +{ + "name": "yzh52521/easyhttp", + "description": "EasyHttp 是一个轻量级、语义化、对IDE友好的HTTP客户端,支持常见的HTTP请求、异步请求和并发请求,让你可以快速地使用 HTTP 请求与其他 Web 应用进行通信。", + "license": "MIT", + "keywords": [ + "easyhttp", + "EasyHttp", + "php-http", + "phphttp", + "easy-http", + "php", + "http", + "curl" + ], + "homepage": "https://github.com/yzh52521/easyhttp", + "authors": [ + { + "name": "yzh52521", + "email": "396751927@qq.com" + } + ], + "require": { + "php": "^7.2.5|^8.0", + "guzzlehttp/guzzle": "^6.0|^7.0", + "psr/log":"^1.0|^2.0|^3.0" + }, + "autoload": { + "psr-4": { + "yzh52521\\EasyHttp\\": "src/" + } + }, + "minimum-stability": "stable" +} diff --git a/vendor/yzh52521/easyhttp/src/ConnectionException.php b/vendor/yzh52521/easyhttp/src/ConnectionException.php new file mode 100644 index 0000000..cdbf363 --- /dev/null +++ b/vendor/yzh52521/easyhttp/src/ConnectionException.php @@ -0,0 +1,10 @@ +<?php + +namespace yzh52521\EasyHttp; + +use Exception; + +class ConnectionException extends Exception +{ + // +} diff --git a/vendor/yzh52521/easyhttp/src/Facade.php b/vendor/yzh52521/easyhttp/src/Facade.php new file mode 100755 index 0000000..e8e945b --- /dev/null +++ b/vendor/yzh52521/easyhttp/src/Facade.php @@ -0,0 +1,21 @@ +<?php + +namespace yzh52521\EasyHttp; + +class Facade +{ + protected $facade; + + public function __construct() + { + $this->facade = new $this->facade; + } + + public function __call($name, $params) { + return call_user_func_array([$this->facade, $name], $params); + } + + public static function __callStatic($name, $params) { + return call_user_func_array([new static(), $name], $params); + } +} diff --git a/vendor/yzh52521/easyhttp/src/Http.php b/vendor/yzh52521/easyhttp/src/Http.php new file mode 100644 index 0000000..fad314c --- /dev/null +++ b/vendor/yzh52521/easyhttp/src/Http.php @@ -0,0 +1,56 @@ +<?php + +namespace yzh52521\EasyHttp; + +/** + * @method static \yzh52521\EasyHttp\Request asJson() + * @method static \yzh52521\EasyHttp\Request asForm() + * @method static \yzh52521\EasyHttp\Request asMultipart(string $name, string $contents, string|null $filename = null, array $headers) + * @method static \yzh52521\EasyHttp\Request attach(string $name, string $contents, string|null $filename = null, array $headers) + * + * @method static \yzh52521\EasyHttp\Request withRedirect(bool|array $redirect) + * @method static \yzh52521\EasyHttp\Request withStream(bool $boolean) + * @method static \yzh52521\EasyHttp\Request withVerify(bool|string $verify) + * @method static \yzh52521\EasyHttp\Request withHost(string $host) + * @method static \yzh52521\EasyHttp\Request withHeaders(array $headers) + * @method static \yzh52521\EasyHttp\Request withBasicAuth(string $username, string $password) + * @method static \yzh52521\EasyHttp\Request withDigestAuth(string $username, string $password) + * @method static \yzh52521\EasyHttp\Request withUA(string $ua) + * @method static \yzh52521\EasyHttp\Request withToken(string $token, string $type = 'Bearer') + * @method static \yzh52521\EasyHttp\Request withCookies(array $cookies, string $domain) + * @method static \yzh52521\EasyHttp\Request withProxy(string|array $proxy) + * @method static \yzh52521\EasyHttp\Request withVersion(string $version) + * @method static \yzh52521\EasyHttp\Request withOptions(array $options) + * + * @method static \yzh52521\EasyHttp\Request debug($class) + * @method static \yzh52521\EasyHttp\Request retry(int $retries=1,int $sleep=0) + * @method static \yzh52521\EasyHttp\Request delay(int $seconds) + * @method static \yzh52521\EasyHttp\Request timeout(int $seconds) + * @method static \yzh52521\EasyHttp\Request concurrency(int $times) + * @method static \yzh52521\EasyHttp\Request client(string $method, string $url, array $options = []) + * @method static \yzh52521\EasyHttp\Request clientAsync(string $method, string $url, array $options = []) + * @method static \yzh52521\EasyHttp\Request removeBodyFormat() + * + * @method static \yzh52521\EasyHttp\Request get(string $url, array $query = []) + * @method static \yzh52521\EasyHttp\Request post(string $url, array $data = []) + * @method static \yzh52521\EasyHttp\Request patch(string $url, array $data = []) + * @method static \yzh52521\EasyHttp\Request put(string $url, array $data = []) + * @method static \yzh52521\EasyHttp\Request delete(string $url, array $data = []) + * @method static \yzh52521\EasyHttp\Request head(string $url, array $data = []) + * @method static \yzh52521\EasyHttp\Request options(string $url, array $data = []) + * + * @method static \yzh52521\EasyHttp\Request getAsync(string $url, array|null $query = null, callable $success = null, callable $fail = null) + * @method static \yzh52521\EasyHttp\Request postAsync(string $url, array|null $data = null, callable $success = null, callable $fail = null) + * @method static \yzh52521\EasyHttp\Request patchAsync(string $url, array|null $data = null, callable $success = null, callable $fail = null) + * @method static \yzh52521\EasyHttp\Request putAsync(string $url, array|null $data = null, callable $success = null, callable $fail = null) + * @method static \yzh52521\EasyHttp\Request deleteAsync(string $url, array|null $data = null, callable $success = null, callable $fail = null) + * @method static \yzh52521\EasyHttp\Request headAsync(string $url, array|null $data = null, callable $success = null, callable $fail = null) + * @method static \yzh52521\EasyHttp\Request optionsAsync(string $url, array|null $data = null, callable $success = null, callable $fail = null) + * @method static \yzh52521\EasyHttp\Request multiAsync(array $promises, callable $success = null, callable $fail = null) + * @method static \yzh52521\EasyHttp\Request wait() + */ + +class Http extends Facade +{ + protected $facade = Request::class; +} diff --git a/vendor/yzh52521/easyhttp/src/Logger.php b/vendor/yzh52521/easyhttp/src/Logger.php new file mode 100644 index 0000000..9db6be0 --- /dev/null +++ b/vendor/yzh52521/easyhttp/src/Logger.php @@ -0,0 +1,273 @@ +<?php + +namespace yzh52521\EasyHttp; + +use GuzzleHttp\Exception\RequestException; +use GuzzleHttp\MessageFormatter; +use GuzzleHttp\Promise; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; +use Psr\Log\LogLevel; +use Psr\Log\LoggerInterface; + +use InvalidArgumentException; + +/** + * Guzzle middleware which logs a request and its response. + */ +class Logger +{ + /** + * @var \Psr\Log\LoggerInterface|callable + */ + protected $logger; + + /** + * @var \GuzzleHttp\MessageFormatter|callable + */ + protected $formatter; + + /** + * @var string|callable Constant or callable that accepts a Response. + */ + protected $logLevel; + + /** + * @var boolean Whether or not to log requests as they are made. + */ + protected $logRequests; + + /** + * Creates a callable middleware for logging requests and responses. + * + * @param LoggerInterface|callable $logger + * @param string|callable Constant or callable that accepts a Response. + */ + public function __construct($logger, $formatter = null) + { + // Use the setters to take care of type validation + $this->setLogger($logger); + $this->setFormatter($formatter ?: $this->getDefaultFormatter()); + } + + /** + * Returns the default formatter; + * + * @return MessageFormatter + */ + protected function getDefaultFormatter() + { + return new MessageFormatter(); + } + + /** + * Sets whether requests should be logged before the response is received. + * + * @param boolean $logRequests + */ + public function setRequestLoggingEnabled($logRequests = true) + { + $this->logRequests = (bool) $logRequests; + } + + /** + * Sets the logger, which can be a PSR-3 logger or a callable that accepts + * a log level, message, and array context. + * + * @param LoggerInterface|callable $logger + * + * @throws InvalidArgumentException + */ + public function setLogger($logger) + { + if ($logger instanceof LoggerInterface || is_callable($logger)) { + $this->logger = $logger; + } else { + throw new InvalidArgumentException( + "Logger has to be a Psr\Log\LoggerInterface or callable" + ); + } + } + + /** + * Sets the formatter, which can be a MessageFormatter or callable that + * accepts a request, response, and a reason if an error has occurred. + * + * @param MessageFormatter|callable $formatter + * + * @throws InvalidArgumentException + */ + public function setFormatter($formatter) + { + if ($formatter instanceof MessageFormatter || is_callable($formatter)) { + $this->formatter = $formatter; + } else { + throw new InvalidArgumentException( + "Formatter has to be a \GuzzleHttp\MessageFormatter or callable" + ); + } + } + + /** + * Sets the log level to use, which can be either a string or a callable + * that accepts a response (which could be null). A log level could also + * be null, which indicates that the default log level should be used. + * + * @param string|callable|null + */ + public function setLogLevel($logLevel) + { + $this->logLevel = $logLevel; + } + + /** + * Logs a request and/or a response. + * + * @param RequestInterface $request + * @param ResponseInterface|null $response + * @param $reason + * @return mixed + */ + protected function log( + RequestInterface $request, + ResponseInterface $response = null, + $reason = null + ) { + if ($reason instanceof RequestException) { + $response = $reason->getResponse(); + } + + $level = $this->getLogLevel($response); + $message = $this->getLogMessage($request, $response, $reason); + $context = compact('request', 'response', 'reason'); + + // Make sure that the content of the body is available again. + if ($response) { + $response->getBody()->seek(0);; + } + + if (is_callable($this->logger)) { + return call_user_func($this->logger, $level, $message, $context); + } + + $this->logger->log($level, $message, $context); + } + + /** + * Formats a request and response as a log message. + * + * @param RequestInterface $request + * @param ResponseInterface|null $response + * @param mixed $reason + * + * @return string The formatted message. + */ + protected function getLogMessage( + RequestInterface $request, + ResponseInterface $response = null, + $reason = null + ) { + if ($this->formatter instanceof MessageFormatter) { + return $this->formatter->format( + $request, + $response, + $reason + ); + } + + return call_user_func($this->formatter, $request, $response, $reason); + } + + /** + * Returns a log level for a given response. + * + * @param ResponseInterface $response The response being logged. + * + * @return string LogLevel + */ + protected function getLogLevel(ResponseInterface $response = null) + { + if ( ! $this->logLevel) { + return $this->getDefaultLogLevel($response); + } + + if (is_callable($this->logLevel)) { + return call_user_func($this->logLevel, $response); + } + + return (string) $this->logLevel; + } + + /** + * Returns the default log level for a response. + * + * @param ResponseInterface $response + * + * @return string LogLevel + */ + protected function getDefaultLogLevel(ResponseInterface $response = null) { + if ($response && $response->getStatusCode() >= 300) { + return LogLevel::NOTICE; + } + + return LogLevel::INFO; + } + + /** + * Returns a function which is handled when a request was successful. + * + * @param RequestInterface $request + * + * @return \Closure + */ + protected function onSuccess(RequestInterface $request) + { + return function ($response) use ($request) { + $this->log($request, $response); + return $response; + }; + } + + /** + * Returns a function which is handled when a request was rejected. + * + * @param RequestInterface $request + * + * @return \Closure + */ + protected function onFailure(RequestInterface $request) + { + return function ($reason) use ($request) { + + // Only log a rejected request if it hasn't already been logged. + if ( ! $this->logRequests) { + $this->log($request, null, $reason); + } + + return Promise\rejection_for($reason); + }; + } + + /** + * Called when the middleware is handled by the client. + * + * @param callable $handler + * + * @return \Closure + */ + public function __invoke(callable $handler) + { + return function ($request, array $options) use ($handler) { + + // Only log requests if explicitly set to do so + if ($this->logRequests) { + $this->log($request); + } + + return $handler($request, $options)->then( + $this->onSuccess($request), + $this->onFailure($request) + ); + }; + } +} diff --git a/vendor/yzh52521/easyhttp/src/Request.php b/vendor/yzh52521/easyhttp/src/Request.php new file mode 100644 index 0000000..ab1b3d0 --- /dev/null +++ b/vendor/yzh52521/easyhttp/src/Request.php @@ -0,0 +1,615 @@ +<?php + +namespace yzh52521\EasyHttp; + +use GuzzleHttp\Handler\CurlHandler; +use GuzzleHttp\HandlerStack; + +use GuzzleHttp\Pool; +use GuzzleHttp\Client; +use GuzzleHttp\Promise; +use GuzzleHttp\Cookie\CookieJar; +use GuzzleHttp\Exception\ConnectException; + +/** + * @method \yzh52521\EasyHttp\Response body() + * @method \yzh52521\EasyHttp\Response array() + * @method \yzh52521\EasyHttp\Response json() + * @method \yzh52521\EasyHttp\Response headers() + * @method \yzh52521\EasyHttp\Response header( string $header ) + * @method \yzh52521\EasyHttp\Response status() + * @method \yzh52521\EasyHttp\Response successful() + * @method \yzh52521\EasyHttp\Response ok() + * @method \yzh52521\EasyHttp\Response redirect() + * @method \yzh52521\EasyHttp\Response clientError() + * @method \yzh52521\EasyHttp\Response serverError() + */ +class Request +{ + /** + * \GuzzleHttp\Client单例 + * @var array + */ + private static $instances = []; + + /** + * \GuzzleHttp\Client; + * @var Client + */ + protected $client; + + /** + * Body格式 + * @var string + */ + protected $bodyFormat; + + protected $isRemoveBodyFormat = false; + + /** + * @var array + */ + protected $options = []; + + /** + * @var array + */ + protected $promises = []; + + /** + * 并发次数 + * @var + */ + protected $concurrency; + + /** + * + * @var HandlerStack + */ + protected $handlerStack; + + + /** + * Request constructor. + */ + public function __construct() + { + $this->client = $this->getInstance(); + + $this->bodyFormat = 'form_params'; + $this->options = [ + 'http_errors' => false, + ]; + if (!$this->handlerStack instanceof HandlerStack) { + $this->handlerStack = HandlerStack::create( new CurlHandler() ); + } + $this->options['handler'] = $this->handlerStack; + } + + /** + * Request destructor. + */ + public function __destruct() + { + if (!empty( $this->promises )) { + Promise\settle( $this->promises )->wait(); + } + } + + /** + * 获取单例 + * @return mixed + */ + public function getInstance() + { + $name = get_called_class(); + + if (!isset( self::$instances[$name] )) { + self::$instances[$name] = new Client(); + } + + return self::$instances[$name]; + } + + public function asForm() + { + $this->bodyFormat = 'form_params'; + $this->withHeaders( ['Content-Type' => 'application/x-www-form-urlencoded'] ); + + return $this; + } + + public function asJson() + { + $this->bodyFormat = 'json'; + $this->withHeaders( ['Content-Type' => 'application/json'] ); + + return $this; + } + + public function asMultipart(string $name,string $contents,string $filename = null,array $headers = []) + { + $this->bodyFormat = 'multipart'; + + $this->options = array_filter( [ + 'name' => $name, + 'contents' => $contents, + 'headers' => $headers, + 'filename' => $filename, + ] ); + + return $this; + } + + public function withHost(string $host) + { + $this->options['base_uri'] = $host; + + return $this; + } + + public function withOptions(array $options) + { + unset( $this->options[$this->bodyFormat],$this->options['body'] ); + + $this->options = array_merge_recursive( $this->options,$options ); + + return $this; + } + + public function withCert(string $path,string $password) + { + $this->options['cert'] = [$path,$password]; + + return $this; + } + + public function withHeaders(array $headers) + { + $this->options = array_merge_recursive( $this->options,[ + 'headers' => $headers, + ] ); + + return $this; + } + + public function withBasicAuth(string $username,string $password) + { + $this->options['auth'] = [$username,$password]; + + return $this; + } + + public function withDigestAuth(string $username,string $password) + { + $this->options['auth'] = [$username,$password,'digest']; + + return $this; + } + + public function withUA(string $ua) + { + $this->options['headers']['User-Agent'] = trim( $ua ); + + return $this; + } + + public function withToken(string $token,string $type = 'Bearer') + { + $this->options['headers']['Authorization'] = trim( $type.' '.$token ); + + return $this; + } + + public function withCookies(array $cookies,string $domain) + { + $this->options = array_merge_recursive( $this->options,[ + 'cookies' => CookieJar::fromArray( $cookies,$domain ), + ] ); + + return $this; + } + + public function withProxy($proxy) + { + $this->options['proxy'] = $proxy; + + return $this; + } + + public function withVersion($version) + { + $this->options['version'] = $version; + + return $this; + } + + public function withRedirect($redirect = false) + { + $this->options['allow_redirects'] = $redirect; + + return $this; + } + + public function withVerify($verify = false) + { + $this->options['verify'] = $verify; + + return $this; + } + + public function withStream($boolean = false) + { + $this->options['stream'] = $boolean; + + return $this; + } + + public function concurrency(int $times) + { + $this->concurrency = $times; + + return $this; + } + + public function retry(int $retries = 1,int $sleep = 0) + { + $this->handlerStack->push( ( new Retry() )->handle( $retries,$sleep ) ); + $this->options['handler'] = $this->handlerStack; + + return $this; + } + + public function delay(int $seconds) + { + $this->options['delay'] = $seconds * 1000; + + return $this; + } + + public function timeout(int $seconds) + { + $this->options['timeout'] = $seconds * 1000; + + return $this; + } + + public function removeBodyFormat() + { + $this->isRemoveBodyFormat = true; + return $this; + } + + public function debug($class) + { + $logger = new Logger( function ($level,$message,array $context) use ($class) { + $class::log( $level,$message ); + },function ($request,$response,$reason) { + $requestBody = $request->getBody(); + $requestBody->rewind(); + + //请求头 + $requestHeaders = []; + + foreach ( (array)$request->getHeaders() as $k => $vs ) { + foreach ( $vs as $v ) { + $requestHeaders[] = "$k: $v"; + } + } + + //响应头 + $responseHeaders = []; + + foreach ( (array)$response->getHeaders() as $k => $vs ) { + foreach ( $vs as $v ) { + $responseHeaders[] = "$k: $v"; + } + } + + $uri = $request->getUri(); + $path = $uri->getPath(); + + if ($query = $uri->getQuery()) { + $path .= '?'.$query; + } + + return sprintf( + "Request %s\n%s %s HTTP/%s\r\n%s\r\n\r\n%s\r\n--------------------\r\nHTTP/%s %s %s\r\n%s\r\n\r\n%s", + $uri, + $request->getMethod(), + $path, + $request->getProtocolVersion(), + join( "\r\n",$requestHeaders ), + $requestBody->getContents(), + $response->getProtocolVersion(), + $response->getStatusCode(), + $response->getReasonPhrase(), + join( "\r\n",$responseHeaders ), + $response->getBody()->getContents() + ); + } ); + $this->handlerStack->push( $logger ); + $this->options['handler'] = $this->handlerStack; + + return $this; + } + + public function attach(string $name,string $contents,string $filename = null,array $headers = []) + { + $this->options['multipart'] = array_filter( [ + 'name' => $name, + 'contents' => $contents, + 'headers' => $headers, + 'filename' => $filename, + ] ); + + return $this; + } + + public function get(string $url,array $query = []) + { + $params= parse_url( $url,PHP_URL_QUERY ); + + parse_str( $params?:'',$result ); + + $this->options['query'] = array_merge( $result,$query ); + + return $this->request( 'GET',$url,$query ); + } + + public function post(string $url,array $data = []) + { + $this->options[$this->bodyFormat] = $data; + + return $this->request( 'POST',$url,$data ); + } + + public function patch(string $url,array $data = []) + { + $this->options[$this->bodyFormat] = $data; + + return $this->request( 'PATCH',$url,$data ); + } + + public function put(string $url,array $data = []) + { + $this->options[$this->bodyFormat] = $data; + + return $this->request( 'PUT',$url,$data ); + } + + public function delete(string $url,array $data = []) + { + $this->options[$this->bodyFormat] = $data; + + return $this->request( 'DELETE',$url,$data ); + } + + public function head(string $url,array $data = []) + { + $this->options[$this->bodyFormat] = $data; + + return $this->request( 'HEAD',$url,$data ); + } + + public function options(string $url,array $data = []) + { + $this->options[$this->bodyFormat] = $data; + + return $this->request( 'OPTIONS',$url,$data ); + } + + public function getAsync(string $url,$query = null,callable $success = null,callable $fail = null) + { + is_callable( $query ) || $this->options['query'] = $query; + + return $this->requestAsync( 'GET',$url,$query,$success,$fail ); + } + + public function postAsync(string $url,$data = null,callable $success = null,callable $fail = null) + { + is_callable( $data ) || $this->options[$this->bodyFormat] = $data; + + return $this->requestAsync( 'POST',$url,$data,$success,$fail ); + } + + public function patchAsync(string $url,$data = null,callable $success = null,callable $fail = null) + { + is_callable( $data ) || $this->options[$this->bodyFormat] = $data; + + return $this->requestAsync( 'PATCH',$url,$data,$success,$fail ); + } + + public function putAsync(string $url,$data = null,callable $success = null,callable $fail = null) + { + is_callable( $data ) || $this->options[$this->bodyFormat] = $data; + + return $this->requestAsync( 'PUT',$url,$data,$success,$fail ); + } + + public function deleteAsync(string $url,$data = null,callable $success = null,callable $fail = null) + { + is_callable( $data ) || $this->options[$this->bodyFormat] = $data; + + return $this->requestAsync( 'DELETE',$url,$data,$success,$fail ); + } + + public function headAsync(string $url,$data = null,callable $success = null,callable $fail = null) + { + is_callable( $data ) || $this->options[$this->bodyFormat] = $data; + + return $this->requestAsync( 'HEAD',$url,$data,$success,$fail ); + } + + public function optionsAsync(string $url,$data = null,callable $success = null,callable $fail = null) + { + is_callable( $data ) || $this->options[$this->bodyFormat] = $data; + + return $this->requestAsync( 'OPTIONS',$url,$data,$success,$fail ); + } + + public function multiAsync(array $promises,callable $success = null,callable $fail = null) + { + $count = count( $promises ); + + $this->concurrency = $this->concurrency ?: $count; + + $requests = function () use ($promises) { + foreach ( $promises as $promise ) { + yield function () use ($promise) { + return $promise; + }; + } + }; + + $fulfilled = function ($response,$index) use ($success) { + if (!is_null( $success )) { + $response = $this->response( $response ); + call_user_func_array( $success,[$response,$index] ); + } + }; + + $rejected = function ($exception,$index) use ($fail) { + if (!is_null( $fail )) { + $exception = $this->exception( $exception ); + call_user_func_array( $fail,[$exception,$index] ); + } + }; + + $pool = new Pool( $this->client,$requests(),[ + 'concurrency' => $this->concurrency, + 'fulfilled' => $fulfilled, + 'rejected' => $rejected, + ] ); + + $pool->promise(); + + return $pool; + } + + protected function request(string $method,string $url,array $options = []) + { + isset( $this->options[$this->bodyFormat] ) && $this->options[$this->bodyFormat] = $options; + if ($this->isRemoveBodyFormat) { + unset( $this->options[$this->bodyFormat] ); + } + try { + $response = $this->client->request( $method,$url,$this->options ); + return $this->response( $response ); + } catch ( ConnectException $e ) { + throw new ConnectionException( $e->getMessage(),0,$e ); + } + } + + /** + * 原生请求 + * @param string $method + * @param string $url + * @param array $options + * @return Response + * @throws ConnectionException + * @throws \GuzzleHttp\Exception\GuzzleException + */ + public function client(string $method,string $url,array $options = []) + { + try { + if (empty( $options )) { + $options = $this->options; + } + $response = $this->client->request( $method,$url,$options ); + return $this->response( $response ); + } catch ( ConnectException $e ) { + throw new ConnectionException( $e->getMessage(),0,$e ); + } + } + + /** + * 原生异常请求 + * @param string $method + * @param string $url + * @param array $options + * @return Response + * @throws ConnectionException + */ + public function clientAsync(string $method,string $url,array $options = []) + { + try { + if (empty( $options )) { + $options = $this->options; + } + $response = $this->client->requestAsync( $method,$url,$options ); + return $this->response( $response ); + } catch ( ConnectException $e ) { + throw new ConnectionException( $e->getMessage(),0,$e ); + } + } + + + protected function requestAsync( + string $method, + string $url, + $options = null, + callable $success = null, + callable $fail = null + ) + { + if (is_callable( $options )) { + $successCallback = $options; + $failCallback = $success; + } else { + $successCallback = $success; + $failCallback = $fail; + } + + isset( $this->options[$this->bodyFormat] ) && $this->options[$this->bodyFormat] = $options; + + if ($this->isRemoveBodyFormat) { + unset( $this->options[$this->bodyFormat] ); + } + + try { + $promise = $this->client->requestAsync( $method,$url,$this->options ); + + $fulfilled = function ($response) use ($successCallback) { + if (!is_null( $successCallback )) { + $response = $this->response( $response ); + call_user_func_array( $successCallback,[$response] ); + } + }; + + $rejected = function ($exception) use ($failCallback) { + if (!is_null( $failCallback )) { + $exception = $this->exception( $exception ); + call_user_func_array( $failCallback,[$exception] ); + } + }; + + $promise->then( $fulfilled,$rejected ); + + $this->promises[] = $promise; + + return $promise; + } catch ( ConnectException $e ) { + throw new ConnectionException( $e->getMessage(),0,$e ); + } + } + + public function wait() + { + if (!empty($this->promises)) { + Promise\settle($this->promises)->wait(); + } + $this->promises = []; + } + + protected function response($response) + { + return new Response( $response ); + } + + protected function exception($exception) + { + return new RequestException( $exception ); + } + +} diff --git a/vendor/yzh52521/easyhttp/src/RequestException.php b/vendor/yzh52521/easyhttp/src/RequestException.php new file mode 100644 index 0000000..29b1dca --- /dev/null +++ b/vendor/yzh52521/easyhttp/src/RequestException.php @@ -0,0 +1,43 @@ +<?php + +namespace yzh52521\EasyHttp; + +class RequestException +{ + public $exception; + + public function __construct($exception) + { + $this->exception = $exception; + } + + public function getCode() + { + return $this->exception->getCode(); + } + + public function getMessage() + { + return $this->exception->getMessage(); + } + + public function getFile() + { + return $this->exception->getFile(); + } + + public function getLine() + { + return $this->exception->getLine(); + } + + public function getTrace() + { + return $this->exception->getTrace(); + } + + public function getTraceAsString() + { + return $this->exception->getTraceAsString(); + } +} diff --git a/vendor/yzh52521/easyhttp/src/Response.php b/vendor/yzh52521/easyhttp/src/Response.php new file mode 100644 index 0000000..73d7f02 --- /dev/null +++ b/vendor/yzh52521/easyhttp/src/Response.php @@ -0,0 +1,212 @@ +<?php + +namespace yzh52521\EasyHttp; + +use ArrayAccess; +use LogicException; + +class Response implements ArrayAccess +{ + protected $response; + + /** + * The decoded JSON response. + * + * @var array + */ + protected $decoded; + + public function __construct($response) + { + $this->response = $response; + } + + /** + * Get the body of the response. + * @return string + */ + public function body() + { + return (string)$this->response->getBody(); + } + + /** + * Get the Array decoded body of the response. + * @return array|mixed + */ + public function array() + { + if (!$this->decoded) { + $this->decoded = json_decode( (string)$this->response->getBody(),true ); + } + + return $this->decoded; + } + + /** + * Get the JSON decoded body of the response. + * @return object|mixed + */ + public function json() + { + if (!$this->decoded) { + $this->decoded = json_decode( (string)$this->response->getBody() ); + } + + return $this->decoded; + } + + /** + * Get a header from the response. + * @param string $header + * @return mixed + */ + public function header(string $header) + { + return $this->response->getHeaderLine( $header ); + } + + /** + * Get the headers from the response. + * @return mixed + */ + public function headers() + { + return $this->mapWithKeys( $this->response->getHeaders(),function ($v,$k) { + return [$k => $v]; + } )->response; + } + + /** + * Get the status code of the response. + * @return int + */ + public function status() + { + return (int)$this->response->getStatusCode(); + } + + /** + * Determine if the request was successful. + * @return bool + */ + public function successful() + { + return $this->status() >= 200 && $this->status() < 300; + } + + /** + * Determine if the response code was "OK". + * @return bool + */ + public function ok() + { + return $this->status() === 200; + } + + /** + * Determine if the response was a redirect. + * @return bool + */ + public function redirect() + { + return $this->status() >= 300 && $this->status() < 400; + } + + /** + * Determine if the response indicates a client error occurred. + * @return bool + */ + public function clientError() + { + return $this->status() >= 400 && $this->status() < 500; + } + + /** + * Determine if the response indicates a server error occurred. + * @return bool + */ + public function serverError() + { + return $this->status() >= 500; + } + + /** + * Determine if the given offset exists. + * + * @param string $offset + * @return mixed + */ + #[\ReturnTypeWillChange] + public function offsetExists($offset) + { + return array_key_exists( $offset,$this->json() ); + } + + /** + * Get the value for a given offset. + * + * @param string $offset + * @return mixed + */ + #[\ReturnTypeWillChange] + public function offsetGet($offset) + { + return $this->json()[$offset]; + } + + /** + * Set the value at the given offset. + * + * @param string $offset + * @param mixed $value + * @return void + * + * @throws \LogicException + */ + #[\ReturnTypeWillChange] + public function offsetSet($offset,$value) + { + throw new LogicException( 'Response data may not be mutated using array access.' ); + } + + /** + * Unset the value at the given offset. + * + * @param string $offset + * @return void + * + * @throws \LogicException + */ + #[\ReturnTypeWillChange] + public function offsetUnset($offset) + { + throw new LogicException( 'Response data may not be mutated using array access.' ); + } + + /** + * Get the body of the response. + * + * @return string + */ + public function __toString() + { + return $this->body(); + } + + protected function mapWithKeys($items,callable $callback) + { + $result = []; + + foreach ( $items as $key => $value ) { + $assoc = $callback( $value,$key ); + + foreach ( $assoc as $mapKey => $mapValue ) { + $result[$mapKey] = $mapValue; + } + } + + return new static( $result ); + } + +} diff --git a/vendor/yzh52521/easyhttp/src/Retry.php b/vendor/yzh52521/easyhttp/src/Retry.php new file mode 100644 index 0000000..e9982a7 --- /dev/null +++ b/vendor/yzh52521/easyhttp/src/Retry.php @@ -0,0 +1,46 @@ +<?php + +namespace yzh52521\EasyHttp; + +use GuzzleHttp\Middleware; +use GuzzleHttp\Psr7\Request; +use GuzzleHttp\Psr7\Response; +use GuzzleHttp\Exception\ServerException; +use GuzzleHttp\Exception\ConnectException; + +class Retry +{ + + public function handle($retries,$sleep) + { + return Middleware::retry($this->decider($retries), $this->delay($sleep)); + } + + protected function decider(int $times) + { + return function ( + $retries, + Request $request, + Response $response = null, + RequestException $exception = null + ) use ($times) { + // 超过最大重试次数,不再重试 + if ($retries >= $times) { + return false; + } + return $exception instanceof ConnectException || $exception instanceof ServerException || ($response && $response->getStatusCode() >= 500); + }; + } + + /** + * 返回一个匿名函数,该匿名函数返回下次重试的时间(毫秒) + * @param int $retry_delay + * @return \Closure + */ + protected function delay(int $retry_delay) + { + return function ($retries) use ($retry_delay) { + return $retry_delay * $retries; + }; + } +} diff --git a/vendor/yzh52521/webman-throttle/.gitignore b/vendor/yzh52521/webman-throttle/.gitignore new file mode 100644 index 0000000..e349a7c --- /dev/null +++ b/vendor/yzh52521/webman-throttle/.gitignore @@ -0,0 +1,6 @@ +build +vendor +.vscode +.phpunit* +composer.lock +.idea diff --git a/vendor/yzh52521/webman-throttle/README.md b/vendor/yzh52521/webman-throttle/README.md new file mode 100644 index 0000000..53f256b --- /dev/null +++ b/vendor/yzh52521/webman-throttle/README.md @@ -0,0 +1,158 @@ +# webman-throttle + +## 作用 +通过本中间件可限定用户在一段时间内的访问次数,可用于保护接口防爬防爆破的目的。 + +## 安装 + +```composer require yzh52521/webman-throttle``` + + +安装后会自动为项目生成 config/plugin/yzh52521/throttle/app.php (***注意:任何时候你都不应该修改最后一行的 hash注释***)配置文件,安装后组件不会自动启用,需要手动设置。 + + +## 开启 + +插件以中间件的方式进行工作,因此它的开启与其他中间件一样,例如在全局中间件中使用: + + +``` +<?php +//cat config/middleware.php + +return [ + // 全局中间件 + '' => [ + // ... 这里省略其它中间件 + app\middleware\Throttle::class, + ] +]; + +``` + + +## 配置说明 +``` +<?php +// cat config/plugin/yzh52521/throttle/app.php +// 中间件配置 +return [ + + // 缓存键前缀,防止键值与其他应用冲突 + 'prefix' => 'throttle_', + + // 缓存的键,true 表示使用来源ip (request->getRealIp(true)) + 'key' => true, + + // 要被限制的请求类型, eg: GET POST PUT DELETE HEAD + 'visit_method' => ['GET'], + + // 设置访问频率,例如 '10/m' 指的是允许每分钟请求10次。值 null 表示不限制, + // eg: null 10/m 20/h 300/d 200/300 + 'visit_rate' => '100/m', + + // 响应体中设置速率限制的头部信息,含义见:https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting + 'visit_enable_show_rate_limit' => true, + + // 访问受限时返回的响应( type: null|callable ) + 'visit_fail_response' => function (Throttle $throttle, Request $request, int $wait_seconds): Response { + return response('Too many requests, try again after ' . $wait_seconds . ' seconds.', 429); + }, + + /* + * 设置节流算法,组件提供了四种算法: + * - CounterFixed :计数固定窗口 + * - CounterSlider: 滑动窗口 + * - TokenBucket : 令牌桶算法 + * - LeakyBucket : 漏桶限流算法 + */ + 'driver_name' => CounterFixed::class, + + // Psr-16通用缓存库规范: https://blog.csdn.net/maquealone/article/details/79651111 + // Cache驱动必须符合PSR-16缓存库规范,最低实现get/set俩个方法 (且需静态化实现) + // static get(string $key, mixed $default=null) + // static set(string $key, mixed $value, int $ttl=0); + + //webman默认使用 symfony/cache作为cache组件(https://www.workerman.net/doc/webman/db/cache.html) + 'cache_drive' => support\Cache::class, + + //使用ThinkCache + //'cache_drive' => think\facade\Cache::class, + +]; +``` + +当配置项满足以下条件任何一个时,不会限制访问频率: + + +```key === false || key === null || visit_rate === null``` + + + +其中 key 用来设置缓存键的, 而 visit_rate 用来设置访问频率,单位可以是秒,分,时,天。例如:1/s, 10/m, 98/h, 100/d , 也可以是 100/600 (600 秒内最多 100 次请求)。 + + +### 灵活定制 + +###### 示例一:针对用户个体做限制,key的值可以设为函数,该函数返回新的缓存键值(需要Session支持),例如: + +``` +'key' => function($throttle, $request) { + return $request->session()->get('user_id'); +}, +``` + +###### 实例二:在回调函数里针对不同控制器和方法定制生成key,中间件会进行转换: + +``` +'key' => function($throttle, $request) { + return implode('/', [ + $request->controller, + $request->action, + $request->getRealIp($safe_mode=true) + ]); +}, + +//'key' => 'controller/action/ip' //上述配置的快捷实现 + + +``` + + +###### 示例三:在闭包内修改本次访问频率或临时更换限流策略:(PS:此示例需要本中间件在路由中间件后启用,这样预设的替换功能才会生效。) + +``` +'key' => function($throttle, $request) { + $throttle->setRate('5/m'); // 设置频率 + $throttle->setDriverClass(CounterSlider::class);// 设置限流策略 + return true; +}, +``` + +###### 示例四:在路由中独立配置 + +``` + +Route::any('/api/driver-ocr', [ app\api\controller\Ocr::class, 'driver'])->middleware([ + app\middleware\Throttle::class +]); + + +//正确使用向中间件传参例子 (Webman-framework >= 1.3.16) +Route::group('/path', function() { +//路由注册 +... + +})->setParams(['visit_rate' => '20/m', +... +... +])->middleware(\app\middleware\Throttle::class); +``` + +## 注意: + 1、Webman-framework >= 1.3.16 支持路由向中间件传参 使用 $route->param() 方法 + 2、禁止访问时,throttle 默认是抛出 HttpResponseException, 当前插件场景下将正常响应一个httpResponse(即不会主动:Throw Exception),特殊需求请在 "visit_fail_response" 匿名函数中配置 + +## 申明 + +本库提取于[think-throttle v1.3.x](https://github.com/top-think/think-throttle) \ No newline at end of file diff --git a/vendor/yzh52521/webman-throttle/composer.json b/vendor/yzh52521/webman-throttle/composer.json new file mode 100644 index 0000000..9d657b9 --- /dev/null +++ b/vendor/yzh52521/webman-throttle/composer.json @@ -0,0 +1,23 @@ +{ + "name": "yzh52521/webman-throttle", + "description": "Webman框架限流中间件", + "type": "library", + "authors": [ + { + "name": "yzh52521", + "email": "396751927@qq.com" + } + ], + "keywords": [ "webman", "middleware", "throttle", "php"], + "license": "MIT", + "require": { + "php": ">=7.2", + "workerman/webman-framework": "^1.2.1" + }, + "minimum-stability": "dev", + "autoload": { + "psr-4": { + "yzh52521\\middleware\\": "src" + } + } +} diff --git a/vendor/yzh52521/webman-throttle/src/Install.php b/vendor/yzh52521/webman-throttle/src/Install.php new file mode 100644 index 0000000..df966bc --- /dev/null +++ b/vendor/yzh52521/webman-throttle/src/Install.php @@ -0,0 +1,74 @@ +<?php + +namespace yzh52521\middleware; + +class Install +{ + const WEBMAN_PLUGIN = true; + + /** + * @var array + */ + protected static $pathRelation = array( + 'config/plugin/yzh52521/throttle' => 'config/plugin/yzh52521/throttle', + ); + + /** + * Install + * @return void + */ + public static function install() + { + copy(__DIR__ . '/middleware.tpl', app_path() . '/middleware/Throttle.php'); + static::installByRelation(); + } + + /** + * Uninstall + * @return void + */ + public static function uninstall() + { + if (is_file(app_path() . "/middleware/Throttle.php")) { + unlink(app_path() . "/middleware/Throttle.php"); + } + self::uninstallByRelation(); + } + + /** + * installByRelation + * @return void + */ + public static function installByRelation() + { + foreach (static::$pathRelation as $source => $dest) { + if ($pos = strrpos($dest, '/')) { + $parent_dir = base_path() . '/' . substr($dest, 0, $pos); + if (!is_dir($parent_dir)) { + mkdir($parent_dir, 0777, true); + } + } + //symlink(__DIR__ . "/$source", base_path()."/$dest"); + copy_dir(__DIR__ . "/$source", base_path() . "/$dest"); + } + } + + /** + * uninstallByRelation + * @return void + */ + public static function uninstallByRelation() + { + foreach (static::$pathRelation as $source => $dest) { + $path = base_path() . "/$dest"; + if (!is_dir($path) && !is_file($path)) { + continue; + } + /*if (is_link($path) { + unlink($path); + }*/ + remove_dir($path); + } + } + +} diff --git a/vendor/yzh52521/webman-throttle/src/Throttle.php b/vendor/yzh52521/webman-throttle/src/Throttle.php new file mode 100644 index 0000000..7345145 --- /dev/null +++ b/vendor/yzh52521/webman-throttle/src/Throttle.php @@ -0,0 +1,267 @@ +<?php +/** + * + * 访问频率限制中间件 + * @link https://github.com/yzh52521/webman-throttle + * @license http://www.apache.org/licenses/LICENSE-2.0 + * @copyright The PHP - Tools + */ +declare(strict_types=1); + +namespace yzh52521\middleware; + +use Psr\SimpleCache\CacheInterface; +use yzh52521\middleware\throttle\{CounterFixed, ThrottleAbstract}; +use Webman\Config; +use support\{Container, Cache}; +use Webman\Http\{Request,Response}; +use function sprintf; + +/** + * 访问频率限制中间件 + * Class Throttle + * @package app\middleware\Throttle + */ +class Throttle +{ + /** + * 默认配置参数 + * @var array + */ + public static $default_config = [ + 'prefix' => 'throttle_', // 缓存键前缀,防止键与其他应用冲突 + 'key' => true, // 节流规则 true为自动规则 + 'visit_method' => ['GET', 'HEAD'], // 要被限制的请求类型 + 'visit_rate' => null, // 节流频率 null 表示不限制 eg: 10/m 20/h 300/d + 'visit_enable_show_rate_limit' => true, // 在响应体中设置速率限制的头部信息 + 'visit_fail_code' => 429, // 访问受限时返回的http状态码,当没有visit_fail_response时生效 + 'visit_fail_text' => 'Too Many Requests', // 访问受限时访问的文本信息,当没有visit_fail_response时生效 + 'visit_fail_response' => null, // 访问受限时的响应信息闭包回调 + 'driver_name' => CounterFixed::class, // 限流算法驱动 + 'cache_drive' => Cache::class // 缓存驱动 + ]; + + public static $duration = [ + 's' => 1, + 'm' => 60, + 'h' => 3600, + 'd' => 86400, + ]; + + /** + * 缓存对象 + * @var CacheInterface + */ + protected $cache; + + /** + * 配置参数 + * @var array + */ + protected $config = []; + + protected $key = null; // 解析后的标识 + protected $wait_seconds = 0; // 下次合法请求还有多少秒 + protected $now = 0; // 当前时间戳 + protected $max_requests = 0; // 规定时间内允许的最大请求次数 + protected $expire = 0; // 规定时间 + protected $remaining = 0; // 规定时间内还能请求的次数 + /** + * @var ThrottleAbstract|null + */ + protected $driver_class = null; + + /** + * Throttle constructor. + * @param Cache $cache + * @param Config $config + */ + public function __construct(array $params = []) + { + $this->config = array_merge(static::$default_config, Config::get('plugin.yzh52521.throttle.app',[]), $params); + $this->cache = Container::make($this->config['cache_drive'], []); + } + + /** + * 请求是否允许 + * @param Request $request + * @return bool + */ + protected function allowRequest(Request $request): bool + { + // 若请求类型不在限制内 + if (!in_array($request->method(), $this->config['visit_method'])) { + return true; + } + + $key = $this->getCacheKey($request); + if (null === $key) { + return true; + } + [$max_requests, $duration] = $this->parseRate($this->config['visit_rate']); + + $micronow = microtime(true); + $now = (int)$micronow; + + $this->driver_class = Container::make($this->config['driver_name'], []); + if (!$this->driver_class instanceof ThrottleAbstract) { + throw new \TypeError('The throttle driver must extends ' . ThrottleAbstract::class); + } + $allow = $this->driver_class->allowRequest($key, $micronow, $max_requests, $duration, $this->cache); + + if ($allow) { + // 允许访问 + $this->now = $now; + $this->expire = $duration; + $this->max_requests = $max_requests; + $this->remaining = $max_requests - $this->driver_class->getCurRequests(); + return true; + } + + $this->wait_seconds = $this->driver_class->getWaitSeconds(); + return false; + } + + /** + * 处理限制访问 + * @param Request $request + * @param array $params + * @return Response + * @exception + */ + public function handle(Request $request, callable $next, array $params = []): Response + { + + if ($params) { + $this->config = array_merge($this->config, $params); + } + + $allow = $this->allowRequest($request); + if (!$allow) { + // 访问受限 + return $this->buildLimitException($this->wait_seconds, $request); + } + + $response = $next($request); + + if ((200 <= $response->getStatusCode() || 300 > $response->getStatusCode()) && $this->config['visit_enable_show_rate_limit']) { + // 将速率限制 headers 添加到响应中 + $response->withHeaders($this->getRateLimitHeaders()); + } + + return $response; + } + + /** + * 生成缓存的 key + * @param Request $request + * @return null|string + */ + protected function getCacheKey(Request $request): ?string + { + $key = $this->config['key']; + + if ($key instanceof \Closure) { + $key = $key($this, $request); + } + + if ($key === null || $key === false || $this->config['visit_rate'] === null) { + // 关闭当前限制 + return null; + } + + if ($key === true) { + $key = $request->getRealIp($safe_mode = true); + } else { + $key = str_replace( + [' ', 'controller/action/ip'], + ['', $request->controller . '/' . $request->action . '/' . $request->getRealIp($safe_mode = true)], + strtolower(trim($key)) + ); + } + return md5($this->config['prefix'] . $key . $this->config['driver_name']); + } + + /** + * 解析频率配置项 + * @param string $rate + * @return int[] + */ + protected function parseRate($rate): array + { + [$num, $period] = explode("/", $rate); + $max_requests = (int)$num; + $duration = static::$duration[$period] ?? (int)$period; + return [$max_requests, $duration]; + } + + /** + * 设置速率 + * @param string $rate '10/m' '20/300' + * @return $this + */ + public function setRate(string $rate): self + { + $this->config['visit_rate'] = $rate; + return $this; + } + + /** + * 设置缓存驱动 + * @param CacheInterface $cache + * @return $this + */ + public function setCache(CacheInterface $cache): self + { + $this->cache = $cache; + return $this; + } + + /** + * 设置限流算法类 + * @param string $class_name + * @return $this + */ + public function setDriverClass(string $class_name): self + { + $this->config['driver_name'] = $class_name; + return $this; + } + + /** + * 获取速率限制头 + * @return array + */ + public function getRateLimitHeaders(): array + { + return [ + 'X-Rate-Limit-Limit' => $this->max_requests, + 'X-Rate-Limit-Remaining' => max($this->remaining, 0), + 'X-Rate-Limit-Reset' => $this->now + $this->expire, + ]; + } + + /** + * 构建 Response Exception + * @param int $wait_seconds + * @param Request $request + * @return Response + */ + public function buildLimitException(int $wait_seconds, Request $request): Response + { + $visitFail = $this->config['visit_fail_response'] ?? null; + if ($visitFail instanceof \Closure) { + $response = $visitFail($this, $request, $wait_seconds); + if (!$response instanceof Response) { + throw new \TypeError(sprintf('The closure must return %s instance', Response::class)); + } + } else { + $content = str_replace('__WAIT__', (string)$wait_seconds, $this->config['visit_fail_text']); + $response = new Response($this->config['visit_fail_code'], [], $content); + } + if ($this->config['visit_enable_show_rate_limit']) { + $response->withHeaders(['Retry-After' => $wait_seconds]); + } + return $response; + } +} \ No newline at end of file diff --git a/vendor/yzh52521/webman-throttle/src/config/plugin/yzh52521/throttle/app.php b/vendor/yzh52521/webman-throttle/src/config/plugin/yzh52521/throttle/app.php new file mode 100644 index 0000000..4c6b8a6 --- /dev/null +++ b/vendor/yzh52521/webman-throttle/src/config/plugin/yzh52521/throttle/app.php @@ -0,0 +1,54 @@ +<?php +// +---------------------------------------------------------------------- +// | 节流设置 +// +---------------------------------------------------------------------- +use yzh52521\middleware\Throttle; +use yzh52521\middleware\throttle\CounterFixed; +// use yzh52521\middleware\throttle\CounterSlider; +// use yzh52521\middleware\throttle\TokenBucket; +// use yzh52521\middleware\throttle\LeakyBucket; +use Webman\Http\{Request, Response}; + +return [ + 'enable' => true, + // 缓存键前缀,防止键值与其他应用冲突 + 'prefix' => 'throttle_', + + // 缓存的键,true 表示使用来源ip (request->getRealIp(true)) + 'key' => true, + + // 要被限制的请求类型, eg: GET POST PUT DELETE HEAD + 'visit_method' => ['GET'], + + // 设置访问频率,例如 '10/m' 指的是允许每分钟请求10次。值 null 表示不限制, + // eg: null 10/m 20/h 300/d 200/300 + 'visit_rate' => '100/m', + + // 响应体中设置速率限制的头部信息,含义见:https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting + 'visit_enable_show_rate_limit' => true, + + // 访问受限时返回的响应( type: null|callable ) + 'visit_fail_response' => function (Throttle $throttle, Request $request, int $wait_seconds): Response { + return response('Too many requests, try again after ' . $wait_seconds . ' seconds.'); + }, + + /* + * 设置节流算法,组件提供了四种算法: + * - CounterFixed :计数固定窗口 + * - CounterSlider: 滑动窗口 + * - TokenBucket : 令牌桶算法 + * - LeakyBucket : 漏桶限流算法 + */ + 'driver_name' => CounterFixed::class, + + // Psr-16通用缓存库规范: https://blog.csdn.net/maquealone/article/details/79651111 + // Cache驱动必须符合PSR-16缓存库规范,最低实现get/set俩个方法 (且需静态化实现) + // static get(string $key, mixed $default=null) + // static set(string $key, mixed $value, int $ttl=0); + + //webman默认使用 symfony/cache作为cache组件(https://www.workerman.net/doc/webman/db/cache.html) + 'cache_drive' => support\Cache::class, + + //使用ThinkCache + //'cache_drive' => think\facade\Cache::class, +]; \ No newline at end of file diff --git a/vendor/yzh52521/webman-throttle/src/middleware.tpl b/vendor/yzh52521/webman-throttle/src/middleware.tpl new file mode 100644 index 0000000..1a67b15 --- /dev/null +++ b/vendor/yzh52521/webman-throttle/src/middleware.tpl @@ -0,0 +1,26 @@ +<?php +/** + * 节流设置 + * @copyright The PHP-Tools +*/ + +namespace app\middleware; + +use Webman\MiddlewareInterface; +use Webman\Http\Response; +use Webman\Http\Request; + +/** +* Class StaticFile +* @package app\middleware +*/ +class Throttle implements MiddlewareInterface +{ + public function process(Request $request, callable $next):Response + { + if ( $route = $request->route ) { + $params = $route->param(); + } + return (new \yzh52521\middleware\Throttle())->handle($request, $next, $params??[]); + } +} \ No newline at end of file diff --git a/vendor/yzh52521/webman-throttle/src/throttle/CounterFixed.php b/vendor/yzh52521/webman-throttle/src/throttle/CounterFixed.php new file mode 100644 index 0000000..270376f --- /dev/null +++ b/vendor/yzh52521/webman-throttle/src/throttle/CounterFixed.php @@ -0,0 +1,28 @@ +<?php + +namespace yzh52521\middleware\throttle; + + +/** + * 计数器固定窗口算法 + * Class CounterFixed + * @package yzh52521\middleware\throttle + */ +class CounterFixed extends ThrottleAbstract +{ + + public function allowRequest(string $key, float $micronow, int $max_requests, int $duration, $cache): bool + { + $cur_requests = (int)$cache::get($key, 0); + $now = (int)$micronow; + $wait_reset_seconds = $duration - $now % $duration; // 距离下次重置还有n秒时间 + $this->wait_seconds = $wait_reset_seconds % $duration + 1; + $this->cur_requests = $cur_requests; + + if ($cur_requests < $max_requests) { // 允许访问 + $cache::set($key, $this->cur_requests + 1, $wait_reset_seconds); + return true; + } + return false; + } +} \ No newline at end of file diff --git a/vendor/yzh52521/webman-throttle/src/throttle/CounterSlider.php b/vendor/yzh52521/webman-throttle/src/throttle/CounterSlider.php new file mode 100644 index 0000000..cecc1dd --- /dev/null +++ b/vendor/yzh52521/webman-throttle/src/throttle/CounterSlider.php @@ -0,0 +1,38 @@ +<?php + +namespace yzh52521\middleware\throttle; + + +/** + * 计数器滑动窗口算法 + * Class CouterSlider + * @package yzh52521\middleware\throttle + */ +class CounterSlider extends ThrottleAbstract +{ + public function allowRequest(string $key, float $micronow, int $max_requests, int $duration, $cache): bool + { + $history = $cache::get($key, []); + $now = (int)$micronow; + // 移除过期的请求的记录 + $history = array_values(array_filter($history, function ($val) use ($now, $duration) { + return $val >= $now - $duration; + })); + + $this->cur_requests = count($history); + if ($this->cur_requests < $max_requests) { + // 允许访问 + $history[] = $now; + $cache::set($key, $history, $duration); + return true; + } + + if ($history) { + $wait_seconds = $duration - ($now - $history[0]) + 1; + $this->wait_seconds = max($wait_seconds, 0); + } + + return false; + } + +} \ No newline at end of file diff --git a/vendor/yzh52521/webman-throttle/src/throttle/LeakyBucket.php b/vendor/yzh52521/webman-throttle/src/throttle/LeakyBucket.php new file mode 100644 index 0000000..4256741 --- /dev/null +++ b/vendor/yzh52521/webman-throttle/src/throttle/LeakyBucket.php @@ -0,0 +1,29 @@ +<?php + +namespace yzh52521\middleware\throttle; + + +/** + * 漏桶算法 + * Class LeakyBucket + * @package yzh52521\middleware\throttle + */ +class LeakyBucket extends ThrottleAbstract +{ + + public function allowRequest(string $key, float $micronow, int $max_requests, int $duration, $cache): bool + { + if ($max_requests <= 0) return false; + + $last_time = (float)$cache::get($key, 0); // 最近一次请求 + $rate = (float)$duration / $max_requests; // 平均 n 秒一个请求 + if ($micronow - $last_time < $rate) { + $this->cur_requests = 1; + $this->wait_seconds = ceil($rate - ($micronow - $last_time)); + return false; + } + + $cache::set($key, $micronow, $duration); + return true; + } +} \ No newline at end of file diff --git a/vendor/yzh52521/webman-throttle/src/throttle/ThrottleAbstract.php b/vendor/yzh52521/webman-throttle/src/throttle/ThrottleAbstract.php new file mode 100644 index 0000000..2bc30c2 --- /dev/null +++ b/vendor/yzh52521/webman-throttle/src/throttle/ThrottleAbstract.php @@ -0,0 +1,43 @@ +<?php + +namespace yzh52521\middleware\throttle; + +use Psr\SimpleCache\CacheInterface; + +abstract class ThrottleAbstract +{ + /** @var int */ + protected int $cur_requests = 0; // 当前已有的请求数 + /** @var int */ + protected int $wait_seconds = 0; // 距离下次合法请求还有多少秒 + + /** + * 是否允许访问 + * @param string $key 缓存键 + * @param float $micronow 当前时间戳,可含毫秒 + * @param int $max_requests 允许最大请求数 + * @param int $duration 限流时长 + * @param CacheInterface $cache 缓存对象 + * @return bool + */ + abstract public function allowRequest(string $key, float $micronow, int $max_requests, int $duration, CacheInterface $cache): bool; + + /** + * 计算距离下次合法请求还有多少秒 + * @return int + */ + public function getWaitSeconds(): int + { + return $this->wait_seconds; + } + + /** + * 当前已有的请求数 + * @return int + */ + public function getCurRequests(): int + { + return $this->cur_requests; + } + +} \ No newline at end of file diff --git a/vendor/yzh52521/webman-throttle/src/throttle/TokenBucket.php b/vendor/yzh52521/webman-throttle/src/throttle/TokenBucket.php new file mode 100644 index 0000000..b970217 --- /dev/null +++ b/vendor/yzh52521/webman-throttle/src/throttle/TokenBucket.php @@ -0,0 +1,42 @@ +<?php + +namespace yzh52521\middleware\throttle; + + +/** + * 令牌桶算法 + * Class TokenBucket + * @package yzh52521\middleware\throttle + */ +class TokenBucket extends ThrottleAbstract +{ + public function allowRequest(string $key, float $micronow, int $max_requests, int $duration, $cache): bool + { + if ($max_requests <= 0 || $duration <= 0) return false; + + $assist_key = $key . 'store_num'; // 辅助缓存 + $rate = (float)$max_requests / $duration; // 平均一秒生成 n 个 token + + $last_time = $cache::get($key, null); + $store_num = $cache::get($assist_key, null); + + if ($last_time === null || $store_num === null) { // 首次访问 + $cache::set($key, $micronow, $duration); + $cache::set($assist_key, $max_requests - 1, $duration); + return true; + } + + $create_num = floor(($micronow - $last_time) * $rate); // 推算生成的 token 数 + $token_left = (int)min($max_requests, $store_num + $create_num); //当前剩余 tokens 数量 + + if ($token_left < 1) { + $tmp = (int)ceil($duration / $max_requests); + $this->wait_seconds = $tmp - ($micronow - $last_time) % $tmp; + return false; + } + $this->cur_requests = $max_requests - $token_left; + $cache::set($key, $micronow, $duration); + $cache::set($assist_key, $token_left - 1, $duration); + return true; + } +} \ No newline at end of file diff --git a/windows.bat b/windows.bat new file mode 100644 index 0000000..f07ce53 --- /dev/null +++ b/windows.bat @@ -0,0 +1,3 @@ +CHCP 65001 +php windows.php +pause \ No newline at end of file diff --git a/windows.php b/windows.php new file mode 100644 index 0000000..08cd4ec --- /dev/null +++ b/windows.php @@ -0,0 +1,116 @@ +<?php +/** + * Start file for windows + */ +require_once __DIR__ . '/vendor/autoload.php'; + +use process\Monitor; +use support\App; +use Dotenv\Dotenv; +use Workerman\Worker; + +ini_set('display_errors', 'on'); +error_reporting(E_ALL); + +if (class_exists('Dotenv\Dotenv') && file_exists(base_path() . '/.env')) { + if (method_exists('Dotenv\Dotenv', 'createUnsafeImmutable')) { + Dotenv::createUnsafeImmutable(base_path())->load(); + } else { + Dotenv::createMutable(base_path())->load(); + } +} + +App::loadAllConfig(['route']); + +$error_reporting = config('app.error_reporting'); +if (isset($error_reporting)) { + error_reporting($error_reporting); +} + +$runtime_process_path = runtime_path() . DIRECTORY_SEPARATOR . '/windows'; +if (!is_dir($runtime_process_path)) { + mkdir($runtime_process_path); +} +$process_files = [ + __DIR__ . DIRECTORY_SEPARATOR . 'start.php' +]; +foreach (config('process', []) as $process_name => $config) { + $process_files[] = write_process_file($runtime_process_path, $process_name, ''); +} + +foreach (config('plugin', []) as $firm => $projects) { + foreach ($projects as $name => $project) { + if (!is_array($project)) { + continue; + } + foreach ($project['process'] ?? [] as $process_name => $config) { + $process_files[] = write_process_file($runtime_process_path, $process_name, "$firm.$name"); + } + } + foreach ($projects['process'] ?? [] as $process_name => $config) { + $process_files[] = write_process_file($runtime_process_path, $process_name, $firm); + } +} + +function write_process_file($runtime_process_path, $process_name, $firm) +{ + $process_param = $firm ? "plugin.$firm.$process_name" : $process_name; + $config_param = $firm ? "config('plugin.$firm.process')['$process_name']" : "config('process')['$process_name']"; + $file_content = <<<EOF +<?php +require_once __DIR__ . '/../../vendor/autoload.php'; + +use Workerman\Worker; +use Webman\Config; +use support\App; + +ini_set('display_errors', 'on'); +error_reporting(E_ALL); + +if (is_callable('opcache_reset')) { + opcache_reset(); +} + +App::loadAllConfig(['route']); + +worker_start('$process_param', $config_param); + +if (DIRECTORY_SEPARATOR != "/") { + Worker::\$logFile = config('server')['log_file'] ?? Worker::\$logFile; +} + +Worker::runAll(); + +EOF; + $process_file = $runtime_process_path . DIRECTORY_SEPARATOR . "start_$process_param.php"; + file_put_contents($process_file, $file_content); + return $process_file; +} + +if ($monitor_config = config('process.monitor.constructor')) { + $monitor = new Monitor(...array_values($monitor_config)); +} + +function popen_processes($process_files) +{ + $cmd = "php " . implode(' ', $process_files); + $descriptorspec = [STDIN, STDOUT, STDOUT]; + $resource = proc_open($cmd, $descriptorspec, $pipes); + if (!$resource) { + exit("Can not execute $cmd\r\n"); + } + return $resource; +} + +$resource = popen_processes($process_files); +echo "\r\n"; +while (1) { + sleep(1); + if (!empty($monitor) && $monitor->checkAllFilesChange()) { + $status = proc_get_status($resource); + $pid = $status['pid']; + shell_exec("taskkill /F /T /PID $pid"); + proc_close($resource); + $resource = popen_processes($process_files); + } +}

    Sw3Z} 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.2", + "workerman/webman-framework": "^1.4.3", + "monolog/monolog": "^2.0", + "webman/captcha": "^1.0", + "vlucas/phpdotenv": "^5.4", + "psr/container": "^1.1.1", + "illuminate/redis": "^9.45", + "illuminate/events": "^9.45", + "symfony/cache": "^6.0", + "yzh52521/webman-throttle": "^1.0", + "nsp-team/webman-throttler": "^1.0", + "workerman/validation": "^3.0", + "yzh52521/easyhttp": "^1.0" + }, + "suggest": { + "ext-event": "For better performance. " + }, + "autoload": { + "psr-4": { + "": "./", + "app\\": "./app", + "App\\": "./app", + "app\\View\\Components\\": "./app/view/components" + }, + "files": [ + "./support/helpers.php" + ] + }, + "scripts": { + "post-package-install": [ + "support\\Plugin::install" + ], + "post-package-update": [ + "support\\Plugin::install" + ], + "pre-package-uninstall": [ + "support\\Plugin::uninstall" + ] + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..163379d --- /dev/null +++ b/composer.lock @@ -0,0 +1,3453 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "52d695876d3aab5f8bbb94127721553f", + "packages": [ + { + "name": "doctrine/inflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^4.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2021-10-22T20:16:43+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "0690bde05318336c7221785f2a932467f98b64ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/0690bde05318336c7221785f2a932467f98b64ca", + "reference": "0690bde05318336c7221785f2a932467f98b64ca", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.0 || ^8.0", + "phpoption/phpoption": "^1.8" + }, + "require-dev": { + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2021-11-21T21:41:47+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.5.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9 || ^2.4", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "7.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.5.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2022-08-28T15:39:27+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "b94b2807d85443f9719887892882d0329d1e2598" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", + "reference": "b94b2807d85443f9719887892882d0329d1e2598", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2022-08-28T14:55:35+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.4.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "67c26b443f348a51926030c83481b85718457d3d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/67c26b443f348a51926030c83481b85718457d3d", + "reference": "67c26b443f348a51926030c83481b85718457d3d", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.4.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2022-10-26T14:07:24+00:00" + }, + { + "name": "illuminate/bus", + "version": "v9.45.1", + "source": { + "type": "git", + "url": "https://github.com/illuminate/bus.git", + "reference": "c7f09872054f2b361f8ed9e9e988b3c9be06c596" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/bus/zipball/c7f09872054f2b361f8ed9e9e988b3c9be06c596", + "reference": "c7f09872054f2b361f8ed9e9e988b3c9be06c596", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "illuminate/collections": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/pipeline": "^9.0", + "illuminate/support": "^9.0", + "php": "^8.0.2" + }, + "suggest": { + "illuminate/queue": "Required to use closures when chaining jobs (^7.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Bus\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Bus package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2022-11-25T07:56:47+00:00" + }, + { + "name": "illuminate/collections", + "version": "v9.45.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "7a8afa0875d7de162f30865d9fae33c8fb235fa2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/7a8afa0875d7de162f30865d9fae33c8fb235fa2", + "reference": "7a8afa0875d7de162f30865d9fae33c8fb235fa2", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "illuminate/conditionable": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/macroable": "^9.0", + "php": "^8.0.2" + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump method (^6.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "files": [ + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2022-12-02T18:48:05+00:00" + }, + { + "name": "illuminate/conditionable", + "version": "v9.45.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/conditionable.git", + "reference": "5b40f51ccb07e0e7b1ec5559d8db9e0e2dc51883" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/conditionable/zipball/5b40f51ccb07e0e7b1ec5559d8db9e0e2dc51883", + "reference": "5b40f51ccb07e0e7b1ec5559d8db9e0e2dc51883", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Conditionable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2022-07-29T19:44:19+00:00" + }, + { + "name": "illuminate/container", + "version": "v9.45.1", + "source": { + "type": "git", + "url": "https://github.com/illuminate/container.git", + "reference": "8ca3036459e26dc7cdedaf0f882b625757cc341e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/container/zipball/8ca3036459e26dc7cdedaf0f882b625757cc341e", + "reference": "8ca3036459e26dc7cdedaf0f882b625757cc341e", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "illuminate/contracts": "^9.0", + "php": "^8.0.2", + "psr/container": "^1.1.1|^2.0.1" + }, + "provide": { + "psr/container-implementation": "1.1|2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Container\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Container package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2022-09-05T15:58:42+00:00" + }, + { + "name": "illuminate/contracts", + "version": "v9.45.1", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "c7cc6e6198cac6dfdead111f9758de25413188b7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/c7cc6e6198cac6dfdead111f9758de25413188b7", + "reference": "c7cc6e6198cac6dfdead111f9758de25413188b7", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^8.0.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/simple-cache": "^1.0|^2.0|^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2022-10-31T22:25:40+00:00" + }, + { + "name": "illuminate/events", + "version": "v9.45.1", + "source": { + "type": "git", + "url": "https://github.com/illuminate/events.git", + "reference": "8e534676bac23bc17925f5c74c128f9c09b98f69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/events/zipball/8e534676bac23bc17925f5c74c128f9c09b98f69", + "reference": "8e534676bac23bc17925f5c74c128f9c09b98f69", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "illuminate/bus": "^9.0", + "illuminate/collections": "^9.0", + "illuminate/container": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/macroable": "^9.0", + "illuminate/support": "^9.0", + "php": "^8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Illuminate\\Events\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Events package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2022-09-15T13:14:12+00:00" + }, + { + "name": "illuminate/macroable", + "version": "v9.45.1", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "e3bfaf6401742a9c6abca61b9b10e998e5b6449a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/e3bfaf6401742a9c6abca61b9b10e998e5b6449a", + "reference": "e3bfaf6401742a9c6abca61b9b10e998e5b6449a", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2022-08-09T13:29:29+00:00" + }, + { + "name": "illuminate/pipeline", + "version": "v9.45.1", + "source": { + "type": "git", + "url": "https://github.com/illuminate/pipeline.git", + "reference": "e0be3f3f79f8235ad7334919ca4094d5074e02f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/pipeline/zipball/e0be3f3f79f8235ad7334919ca4094d5074e02f6", + "reference": "e0be3f3f79f8235ad7334919ca4094d5074e02f6", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "illuminate/contracts": "^9.0", + "illuminate/support": "^9.0", + "php": "^8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Pipeline\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Pipeline package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2022-06-09T14:13:53+00:00" + }, + { + "name": "illuminate/redis", + "version": "v9.45.1", + "source": { + "type": "git", + "url": "https://github.com/illuminate/redis.git", + "reference": "0684a40c7f820b274acdc57e19dc691609de9097" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/redis/zipball/0684a40c7f820b274acdc57e19dc691609de9097", + "reference": "0684a40c7f820b274acdc57e19dc691609de9097", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "illuminate/collections": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/macroable": "^9.0", + "illuminate/support": "^9.0", + "php": "^8.0.2" + }, + "suggest": { + "ext-redis": "Required to use the phpredis connector (^4.0|^5.0).", + "predis/predis": "Required to use the predis connector (^1.1.9|^2.0.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Redis\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Redis package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2022-12-19T10:26:22+00:00" + }, + { + "name": "illuminate/support", + "version": "v9.45.1", + "source": { + "type": "git", + "url": "https://github.com/illuminate/support.git", + "reference": "d7f7c07e35a2c09cbeeddc0168826cf05a2eeb84" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/support/zipball/d7f7c07e35a2c09cbeeddc0168826cf05a2eeb84", + "reference": "d7f7c07e35a2c09cbeeddc0168826cf05a2eeb84", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "doctrine/inflector": "^2.0", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/collections": "^9.0", + "illuminate/conditionable": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/macroable": "^9.0", + "nesbot/carbon": "^2.62.1", + "php": "^8.0.2", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "suggest": { + "illuminate/filesystem": "Required to use the composer class (^9.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^2.0.2).", + "ramsey/uuid": "Required to use Str::uuid() (^4.7).", + "symfony/process": "Required to use the composer class (^6.0).", + "symfony/uid": "Required to use Str::ulid() (^6.0).", + "symfony/var-dumper": "Required to use the dd function (^6.0).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.4.1)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "files": [ + "helpers.php" + ], + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2022-12-20T14:03:34+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "720488632c590286b88b80e62aa3d3d551ad4a50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50", + "reference": "720488632c590286b88b80e62aa3d3d551ad4a50", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5.14", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.8.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2022-07-24T11:55:47+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.64.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "889546413c97de2d05063b8cb7b193c2531ea211" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/889546413c97de2d05063b8cb7b193c2531ea211", + "reference": "889546413c97de2d05063b8cb7b193c2531ea211", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2022-11-26T17:36:00+00:00" + }, + { + "name": "nikic/fast-route", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/FastRoute.git", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812", + "reference": "181d480e08d9476e61381e04a71b34dc0432e812", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35|~5.7" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "FastRoute\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov", + "email": "nikic@php.net" + } + ], + "description": "Fast request router for PHP", + "keywords": [ + "router", + "routing" + ], + "support": { + "issues": "https://github.com/nikic/FastRoute/issues", + "source": "https://github.com/nikic/FastRoute/tree/master" + }, + "time": "2018-02-13T20:26:39+00:00" + }, + { + "name": "nsp-team/webman-throttler", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/nsp-team/webman-throttler.git", + "reference": "5572496db0ea5b04bb313fb7479332126fde46a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nsp-team/webman-throttler/zipball/5572496db0ea5b04bb313fb7479332126fde46a7", + "reference": "5572496db0ea5b04bb313fb7479332126fde46a7", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2", + "workerman/webman-framework": "^1.2.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "NspTeam\\WebmanThrottler\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "maoxp", + "email": "maoxingpei8686@163.com" + } + ], + "description": "very Very easy to use a current limiting component, the code is very simple, based on the webman framework.", + "support": { + "issues": "https://github.com/nsp-team/webman-throttler/issues", + "source": "https://github.com/nsp-team/webman-throttler/tree/v1.0.1" + }, + "time": "2022-04-06T00:53:55+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.8.1", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", + "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.8.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2021-12-04T23:24:31+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "time": "2020-06-29T06:28:15+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "respect/stringifier", + "version": "0.2.0", + "source": { + "type": "git", + "url": "https://github.com/Respect/Stringifier.git", + "reference": "e55af3c8aeaeaa2abb5fa47a58a8e9688cc23b59" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Respect/Stringifier/zipball/e55af3c8aeaeaa2abb5fa47a58a8e9688cc23b59", + "reference": "e55af3c8aeaeaa2abb5fa47a58a8e9688cc23b59", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.8", + "malukenho/docheader": "^0.1.7", + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "autoload": { + "files": [ + "src/stringify.php" + ], + "psr-4": { + "Respect\\Stringifier\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Respect/Stringifier Contributors", + "homepage": "https://github.com/Respect/Stringifier/graphs/contributors" + } + ], + "description": "Converts any value to a string", + "homepage": "http://respect.github.io/Stringifier/", + "keywords": [ + "respect", + "stringifier", + "stringify" + ], + "support": { + "issues": "https://github.com/Respect/Stringifier/issues", + "source": "https://github.com/Respect/Stringifier/tree/0.2.0" + }, + "time": "2017-12-29T19:39:25+00:00" + }, + { + "name": "symfony/cache", + "version": "v6.0.18", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "079ec0afe323fdcd5ac1f16e3ffdb4991fb5d4c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/079ec0afe323fdcd5ac1f16e3ffdb4991fb5d4c9", + "reference": "079ec0afe323fdcd5ac1f16e3ffdb4991fb5d4c9", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.2", + "psr/cache": "^2.0|^3.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^1.1.7|^2|^3", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/var-exporter": "^5.4|^6.0" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/var-dumper": "<5.4" + }, + "provide": { + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/dbal": "^2.13.1|^3.0", + "predis/predis": "^1.1", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/messenger": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v6.0.18" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-12-29T16:27:58+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "1c0a181c9ee221afe4fa55b2d13fc63c5ae14348" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/1c0a181c9ee221afe4fa55b2d13fc63c5ae14348", + "reference": "1c0a181c9ee221afe4fa55b2d13fc63c5ae14348", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.2", + "psr/cache": "^3.0" + }, + "suggest": { + "symfony/cache-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:55:41+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", + "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:55:41+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-30T19:17:29+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.0.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "6f99eb179aee4652c0a7cd7c11f2a870d904330c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/6f99eb179aee4652c0a7cd7c11f2a870d904330c", + "reference": "6f99eb179aee4652c0a7cd7c11f2a870d904330c", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.3|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^5.4|^6.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.0.14" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-10-07T08:02:12+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "acbfbb274e730e5a0236f619b6168d9dedb3e282" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/acbfbb274e730e5a0236f619b6168d9dedb3e282", + "reference": "acbfbb274e730e5a0236f619b6168d9dedb3e282", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.2" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.0.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-06-27T17:10:44+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v6.0.17", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "d87c15d59421d38fe5eb4f6724eb75891479e3da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/d87c15d59421d38fe5eb4f6724eb75891479e3da", + "reference": "d87c15d59421d38fe5eb4f6724eb75891479e3da", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=8.0.2" + }, + "require-dev": { + "symfony/var-dumper": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v6.0.17" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-12-22T17:53:58+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.4.1", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/264dce589e7ce37a7ba99cb901eed8249fbec92f", + "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2021-12-12T23:22:04+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b56450eed252f6801410d810c8e1727224ae0743" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2022-03-08T17:03:00+00:00" + }, + { + "name": "webman/captcha", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/webman-php/captcha.git", + "reference": "7a78f861d40c326575112d6698c7d47c5f326be9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webman-php/captcha/zipball/7a78f861d40c326575112d6698c7d47c5f326be9", + "reference": "7a78f861d40c326575112d6698c7d47c5f326be9", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-gd": "*", + "ext-mbstring": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Webman\\Captcha\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "walkor", + "email": "walkor@workerman.net" + }, + { + "name": "Grégoire Passault", + "email": "g.passault@gmail.com", + "homepage": "http://www.gregwar.com/" + }, + { + "name": "Jeremy Livingston", + "email": "jeremy.j.livingston@gmail.com" + } + ], + "description": "Captcha generator", + "keywords": [ + "bot", + "captcha", + "spam" + ], + "support": { + "source": "https://github.com/webman-php/captcha/tree/v1.0.0" + }, + "time": "2022-09-28T11:55:22+00:00" + }, + { + "name": "workerman/validation", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/walkor/validation.git", + "reference": "49387fff74acb63277ea7ed9a476ffe339348772" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/walkor/validation/zipball/49387fff74acb63277ea7ed9a476ffe339348772", + "reference": "49387fff74acb63277ea7ed9a476ffe339348772", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2", + "respect/stringifier": "^0.2.0", + "symfony/polyfill-mbstring": "^1.2" + }, + "require-dev": { + "egulias/email-validator": "^2.1", + "malukenho/docheader": "^0.1", + "mikey179/vfsstream": "^1.6", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.5", + "respect/coding-standard": "^2.1", + "squizlabs/php_codesniffer": "^3.5", + "symfony/validator": "^3.0||^4.0", + "zendframework/zend-validator": "^2.1" + }, + "suggest": { + "egulias/email-validator": "Strict (RFC compliant) email validation", + "ext-bcmath": "Arbitrary Precision Mathematics", + "ext-fileinfo": "File Information", + "ext-mbstring": "Multibyte String Functions", + "symfony/validator": "Use Symfony validator through Respect\\Validation", + "zendframework/zend-validator": "Use Zend Framework validator through Respect\\Validation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Respect\\Validation\\": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Respect/Validation Contributors", + "homepage": "https://github.com/Respect/Validation/graphs/contributors" + } + ], + "description": "The most awesome validation engine ever created for PHP. Respect/Validation 汉化版本", + "homepage": "http://respect.github.io/Validation/", + "keywords": [ + "respect", + "validation", + "validator" + ], + "support": { + "source": "https://github.com/walkor/validation/tree/v3.0.2" + }, + "time": "2022-04-19T03:49:38+00:00" + }, + { + "name": "workerman/webman-framework", + "version": "v1.4.10", + "source": { + "type": "git", + "url": "https://github.com/walkor/webman-framework.git", + "reference": "d9d6a5317f1f11486e37bf5613aa0d1601b83edd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/walkor/webman-framework/zipball/d9d6a5317f1f11486e37bf5613aa0d1601b83edd", + "reference": "d9d6a5317f1f11486e37bf5613aa0d1601b83edd", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "nikic/fast-route": "^1.3", + "php": ">=7.2", + "psr/container": ">=1.0", + "workerman/workerman": "^4.0.4" + }, + "suggest": { + "ext-event": "For better performance. " + }, + "type": "library", + "autoload": { + "psr-4": { + "Webman\\": "./src", + "Support\\": "./src/support", + "support\\": "./src/support", + "Support\\View\\": "./src/support/view", + "Support\\Bootstrap\\": "./src/support/bootstrap", + "Support\\Exception\\": "./src/support/exception" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "walkor", + "email": "walkor@workerman.net", + "homepage": "https://www.workerman.net", + "role": "Developer" + } + ], + "description": "High performance HTTP Service Framework.", + "homepage": "https://www.workerman.net", + "keywords": [ + "High Performance", + "http service" + ], + "support": { + "email": "walkor@workerman.net", + "forum": "https://wenda.workerman.net/", + "issues": "https://github.com/walkor/webman/issues", + "source": "https://github.com/walkor/webman-framework", + "wiki": "https://doc.workerman.net/" + }, + "time": "2022-12-12T07:54:21+00:00" + }, + { + "name": "workerman/workerman", + "version": "v4.1.5", + "source": { + "type": "git", + "url": "https://github.com/walkor/workerman.git", + "reference": "16bcfc2c7574feea46cdadaaa8ae73f14d464b21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/walkor/workerman/zipball/16bcfc2c7574feea46cdadaaa8ae73f14d464b21", + "reference": "16bcfc2c7574feea46cdadaaa8ae73f14d464b21", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.0" + }, + "suggest": { + "ext-event": "For better performance. " + }, + "type": "library", + "autoload": { + "psr-4": { + "Workerman\\": "./" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "walkor", + "email": "walkor@workerman.net", + "homepage": "http://www.workerman.net", + "role": "Developer" + } + ], + "description": "An asynchronous event driven PHP framework for easily building fast, scalable network applications.", + "homepage": "http://www.workerman.net", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "email": "walkor@workerman.net", + "forum": "http://wenda.workerman.net/", + "issues": "https://github.com/walkor/workerman/issues", + "source": "https://github.com/walkor/workerman", + "wiki": "http://doc.workerman.net/" + }, + "funding": [ + { + "url": "https://opencollective.com/workerman", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/walkor", + "type": "patreon" + } + ], + "time": "2022-12-14T11:58:06+00:00" + }, + { + "name": "yzh52521/easyhttp", + "version": "v1.0.5", + "source": { + "type": "git", + "url": "https://github.com/yzh52521/easyhttp.git", + "reference": "a74fa5a1d4f701bd20e581b0731e885aac3daf9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yzh52521/easyhttp/zipball/a74fa5a1d4f701bd20e581b0731e885aac3daf9f", + "reference": "a74fa5a1d4f701bd20e581b0731e885aac3daf9f", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "guzzlehttp/guzzle": "^6.0|^7.0", + "php": "^7.2.5|^8.0", + "psr/log": "^1.0|^2.0|^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "yzh52521\\EasyHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "yzh52521", + "email": "396751927@qq.com" + } + ], + "description": "EasyHttp 是一个轻量级、语义化、对IDE友好的HTTP客户端,支持常见的HTTP请求、异步请求和并发请求,让你可以快速地使用 HTTP 请求与其他 Web 应用进行通信。", + "homepage": "https://github.com/yzh52521/easyhttp", + "keywords": [ + "EasyHttp", + "curl", + "easy-http", + "http", + "php", + "php-http", + "phphttp" + ], + "support": { + "issues": "https://github.com/yzh52521/easyhttp/issues", + "source": "https://github.com/yzh52521/easyhttp/tree/v1.0.5" + }, + "time": "2022-12-05T12:18:34+00:00" + }, + { + "name": "yzh52521/webman-throttle", + "version": "v1.0.10", + "source": { + "type": "git", + "url": "https://github.com/yzh52521/webman-throttle.git", + "reference": "66c69086bd98f3ccb5fc2bf9a59b9f02516384a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yzh52521/webman-throttle/zipball/66c69086bd98f3ccb5fc2bf9a59b9f02516384a5", + "reference": "66c69086bd98f3ccb5fc2bf9a59b9f02516384a5", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.2", + "workerman/webman-framework": "^1.2.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "yzh52521\\middleware\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "yzh52521", + "email": "396751927@qq.com" + } + ], + "description": "Webman框架限流中间件", + "keywords": [ + "middleware", + "php", + "throttle", + "webman" + ], + "support": { + "issues": "https://github.com/yzh52521/webman-throttle/issues", + "source": "https://github.com/yzh52521/webman-throttle/tree/v1.0.10" + }, + "time": "2022-09-13T07:37:11+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.2" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..f26e358 --- /dev/null +++ b/config/app.php @@ -0,0 +1,26 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use support\Request; + +return [ + 'debug' => true, + 'error_reporting' => E_ALL, + 'default_timezone' => 'Asia/Shanghai', + 'request_class' => Request::class, + 'public_path' => base_path() . DIRECTORY_SEPARATOR . 'public', + 'runtime_path' => base_path(false) . DIRECTORY_SEPARATOR . 'runtime', + 'controller_suffix' => 'Controller', + 'controller_reuse' => false, +]; diff --git a/config/autoload.php b/config/autoload.php new file mode 100644 index 0000000..69a8135 --- /dev/null +++ b/config/autoload.php @@ -0,0 +1,21 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + 'files' => [ + base_path() . '/app/functions.php', + base_path() . '/support/Request.php', + base_path() . '/support/Response.php', + ] +]; diff --git a/config/bootstrap.php b/config/bootstrap.php new file mode 100644 index 0000000..44054e0 --- /dev/null +++ b/config/bootstrap.php @@ -0,0 +1,18 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + support\bootstrap\Session::class, + support\bootstrap\LaravelDb::class, +]; diff --git a/config/container.php b/config/container.php new file mode 100644 index 0000000..106b7b4 --- /dev/null +++ b/config/container.php @@ -0,0 +1,15 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return new Webman\Container; \ No newline at end of file diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..7dc463a --- /dev/null +++ b/config/database.php @@ -0,0 +1,15 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return []; diff --git a/config/dependence.php b/config/dependence.php new file mode 100644 index 0000000..8e964ed --- /dev/null +++ b/config/dependence.php @@ -0,0 +1,15 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return []; \ No newline at end of file diff --git a/config/exception.php b/config/exception.php new file mode 100644 index 0000000..f2aede3 --- /dev/null +++ b/config/exception.php @@ -0,0 +1,17 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + '' => support\exception\Handler::class, +]; \ No newline at end of file diff --git a/config/log.php b/config/log.php new file mode 100644 index 0000000..7f05de5 --- /dev/null +++ b/config/log.php @@ -0,0 +1,32 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + 'default' => [ + 'handlers' => [ + [ + 'class' => Monolog\Handler\RotatingFileHandler::class, + 'constructor' => [ + runtime_path() . '/logs/webman.log', + 7, //$maxFiles + Monolog\Logger::DEBUG, + ], + 'formatter' => [ + 'class' => Monolog\Formatter\LineFormatter::class, + 'constructor' => [null, 'Y-m-d H:i:s', true], + ], + ] + ], + ], +]; diff --git a/config/middleware.php b/config/middleware.php new file mode 100644 index 0000000..8e964ed --- /dev/null +++ b/config/middleware.php @@ -0,0 +1,15 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return []; \ No newline at end of file diff --git a/config/plugin/nsp-team/webman-throttler/app.php b/config/plugin/nsp-team/webman-throttler/app.php new file mode 100644 index 0000000..6542291 --- /dev/null +++ b/config/plugin/nsp-team/webman-throttler/app.php @@ -0,0 +1,15 @@ + true, + 'capacity' => 60, // The number of requests the "bucket" can hold + 'seconds' => 60, // The time it takes the "bucket" to completely refill + 'cost' => 1, // The number of tokens this action uses. + 'customer_handle' => [ + 'class' => \support\Response::class, + 'constructor' => [ + 429, + array(), + json_encode(['success' => false, 'msg' => '请求次数太频繁'], 256), + ], + ], +]; \ No newline at end of file diff --git a/config/plugin/nsp-team/webman-throttler/middleware.php b/config/plugin/nsp-team/webman-throttler/middleware.php new file mode 100644 index 0000000..9e525b7 --- /dev/null +++ b/config/plugin/nsp-team/webman-throttler/middleware.php @@ -0,0 +1,19 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + '' => [ + \NspTeam\WebmanThrottler\Middleware\ThrottlerMiddleware::class, + ] +]; \ No newline at end of file diff --git a/config/plugin/yzh52521/throttle/app.php b/config/plugin/yzh52521/throttle/app.php new file mode 100644 index 0000000..4456325 --- /dev/null +++ b/config/plugin/yzh52521/throttle/app.php @@ -0,0 +1,54 @@ + true, + // 缓存键前缀,防止键值与其他应用冲突 + 'prefix' => 'throttle_', + + // 缓存的键,true 表示使用来源ip (request->getRealIp(true)) + 'key' => true, + + // 要被限制的请求类型, eg: GET POST PUT DELETE HEAD + 'visit_method' => ['GET'], + + // 设置访问频率,例如 '10/m' 指的是允许每分钟请求10次。值 null 表示不限制, + // eg: null 10/m 20/h 300/d 200/300 + 'visit_rate' => '10/m', + + // 响应体中设置速率限制的头部信息,含义见:https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting + 'visit_enable_show_rate_limit' => true, + + // 访问受限时返回的响应( type: null|callable ) + 'visit_fail_response' => function (Throttle $throttle, Request $request, int $wait_seconds): Response { + return json(['code'=>999,'msg'=>'请求频率过快,请稍后重试']); + }, + + /* + * 设置节流算法,组件提供了四种算法: + * - CounterFixed :计数固定窗口 + * - CounterSlider: 滑动窗口 + * - TokenBucket : 令牌桶算法 + * - LeakyBucket : 漏桶限流算法 + */ + 'driver_name' => TokenBucket::class, + + // Psr-16通用缓存库规范: https://blog.csdn.net/maquealone/article/details/79651111 + // Cache驱动必须符合PSR-16缓存库规范,最低实现get/set俩个方法 (且需静态化实现) + // static get(string $key, mixed $default=null) + // static set(string $key, mixed $value, int $ttl=0); + + //webman默认使用 symfony/cache作为cache组件(https://www.workerman.net/doc/webman/db/cache.html) + 'cache_drive' => support\Cache::class, + + //使用ThinkCache + //'cache_drive' => think\facade\Cache::class, +]; \ No newline at end of file diff --git a/config/process.php b/config/process.php new file mode 100644 index 0000000..f22f488 --- /dev/null +++ b/config/process.php @@ -0,0 +1,42 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Workerman\Worker; + +return [ + // File update detection and automatic reload + 'monitor' => [ + 'handler' => process\Monitor::class, + 'reloadable' => false, + 'constructor' => [ + // Monitor these directories + 'monitor_dir' => array_merge([ + app_path(), + config_path(), + base_path() . '/process', + base_path() . '/support', + base_path() . '/resource', + base_path() . '/.env', + ], glob(base_path() . '/plugin/*/app'), glob(base_path() . '/plugin/*/config'), glob(base_path() . '/plugin/*/api')), + // Files with these suffixes will be monitored + 'monitor_extensions' => [ + 'php', 'html', 'htm', 'env' + ], + 'options' => [ + 'enable_file_monitor' => !Worker::$daemonize && DIRECTORY_SEPARATOR === '/', + 'enable_memory_monitor' => DIRECTORY_SEPARATOR === '/', + ] + ] + ] +]; diff --git a/config/redis.php b/config/redis.php new file mode 100644 index 0000000..95ec184 --- /dev/null +++ b/config/redis.php @@ -0,0 +1,22 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + 'default' => [ + 'host' => getenv('RedisHost'), + 'password' => getenv('RedisPassword'), + 'port' => getenv('RedisPort'), + 'database' => getenv('RedisDatabase'), + ], +]; diff --git a/config/route.php b/config/route.php new file mode 100644 index 0000000..af29ba2 --- /dev/null +++ b/config/route.php @@ -0,0 +1,48 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Route; + +Route::disableDefaultRoute(); +Route::any('/login', [app\controller\IndexController::class, 'login']); +Route::any('/login/check', [app\controller\IndexController::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/login/code', [app\controller\IndexController::class, 'code'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/test', function ($request) { + return view('index'); +}); +Route::any('/login/logout', [app\controller\IndexController::class, 'logout']); +Route::any('/logout.php', [app\controller\IndexController::class, 'logout']); +Route::any('/dl/{id}/{way}', [app\controller\IndexController::class, 'download']); + +Route::any('/zlibproxy/check', [app\controller\File::class, 'check'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/zlibproxy/download', [app\controller\File::class, 'download'])->middleware([ + app\middleware\Throttle::class +]); +Route::any('/zlibproxy/get', [app\controller\File::class, 'get'])->middleware([ + app\middleware\Throttle::class +]); + +Route::fallback(function($request){ + return (new app\controller\IndexController)->index($request); +}); + + + + diff --git a/config/server.php b/config/server.php new file mode 100644 index 0000000..6e44a8a --- /dev/null +++ b/config/server.php @@ -0,0 +1,31 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + 'listen' => 'http://0.0.0.0:19500', + 'transport' => 'tcp', + 'context' => [], + 'name' => 'webman', + 'count' => cpu_count() * 4, + 'user' => '', + 'group' => '', + 'reusePort' => false, + 'event_loop' => '', + 'stop_timeout' => 2, + 'pid_file' => runtime_path() . '/webman.pid', + 'status_file' => runtime_path() . '/webman.status', + 'stdout_file' => runtime_path() . '/logs/stdout.log', + 'log_file' => runtime_path() . '/logs/workerman.log', + 'max_package_size' => 10 * 1024 * 1024 +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..043f8c4 --- /dev/null +++ b/config/session.php @@ -0,0 +1,65 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Session\FileSessionHandler; +use Webman\Session\RedisSessionHandler; +use Webman\Session\RedisClusterSessionHandler; + +return [ + + 'type' => 'file', // or redis or redis_cluster + + 'handler' => FileSessionHandler::class, + + 'config' => [ + 'file' => [ + 'save_path' => runtime_path() . '/sessions', + ], + 'redis' => [ + 'host' => '127.0.0.1', + 'port' => 6379, + 'auth' => '', + 'timeout' => 2, + 'database' => '', + 'prefix' => 'redis_session_', + ], + 'redis_cluster' => [ + 'host' => ['127.0.0.1:7000', '127.0.0.1:7001', '127.0.0.1:7001'], + 'timeout' => 2, + 'auth' => '', + 'prefix' => 'redis_session_', + ] + ], + + 'session_name' => 'PHPSID', + + 'auto_update_timestamp' => false, + + 'lifetime' => 7*24*60*60, + + 'cookie_lifetime' => 365*24*60*60, + + 'cookie_path' => '/', + + 'domain' => '', + + 'http_only' => true, + + 'secure' => false, + + 'same_site' => '', + + 'gc_probability' => [1, 1000], + +]; diff --git a/config/static.php b/config/static.php new file mode 100644 index 0000000..2f76cf3 --- /dev/null +++ b/config/static.php @@ -0,0 +1,23 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +/** + * Static file settings + */ +return [ + 'enable' => true, + 'middleware' => [ // Static file Middleware + //app\middleware\StaticFile::class, + ], +]; \ No newline at end of file diff --git a/config/translation.php b/config/translation.php new file mode 100644 index 0000000..96589b2 --- /dev/null +++ b/config/translation.php @@ -0,0 +1,25 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +/** + * Multilingual configuration + */ +return [ + // Default language + 'locale' => 'zh_CN', + // Fallback language + 'fallback_locale' => ['zh_CN', 'en'], + // Folder where language files are stored + 'path' => base_path() . '/resource/translations', +]; \ No newline at end of file diff --git a/config/view.php b/config/view.php new file mode 100644 index 0000000..e3a7b85 --- /dev/null +++ b/config/view.php @@ -0,0 +1,22 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use support\view\Raw; +use support\view\Twig; +use support\view\Blade; +use support\view\ThinkPHP; + +return [ + 'handler' => Raw::class +]; diff --git a/process/Monitor.php b/process/Monitor.php new file mode 100644 index 0000000..5649e71 --- /dev/null +++ b/process/Monitor.php @@ -0,0 +1,240 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace process; + +use Workerman\Timer; +use Workerman\Worker; + +/** + * Class FileMonitor + * @package process + */ +class Monitor +{ + /** + * @var array + */ + protected $_paths = []; + + /** + * @var array + */ + protected $_extensions = []; + + /** + * @var string + */ + public static $lockFile = __DIR__ . '/../runtime/monitor.lock'; + + /** + * Pause monitor + * @return void + */ + public static function pause() + { + file_put_contents(static::$lockFile, time()); + } + + /** + * Resume monitor + * @return void + */ + public static function resume() + { + clearstatcache(); + if (is_file(static::$lockFile)) { + unlink(static::$lockFile); + } + } + + /** + * Whether monitor is paused + * @return bool + */ + public static function isPaused(): bool + { + clearstatcache(); + return file_exists(static::$lockFile); + } + + /** + * FileMonitor constructor. + * @param $monitor_dir + * @param $monitor_extensions + * @param array $options + */ + public function __construct($monitor_dir, $monitor_extensions, array $options = []) + { + static::resume(); + $this->_paths = (array)$monitor_dir; + $this->_extensions = $monitor_extensions; + if (!Worker::getAllWorkers()) { + return; + } + $disable_functions = explode(',', ini_get('disable_functions')); + if (in_array('exec', $disable_functions, true)) { + echo "\nMonitor file change turned off because exec() has been disabled by disable_functions setting in " . PHP_CONFIG_FILE_PATH . "/php.ini\n"; + } else { + if ($options['enable_file_monitor'] ?? true) { + Timer::add(1, function () { + $this->checkAllFilesChange(); + }); + } + } + + $memory_limit = $this->getMemoryLimit($options['memory_limit'] ?? null); + if ($options['enable_memory_monitor'] ?? $memory_limit) { + Timer::add(60, [$this, 'checkMemory'], [$memory_limit]); + } + } + + /** + * @param $monitor_dir + * @return bool + */ + public function checkFilesChange($monitor_dir): bool + { + static $last_mtime, $too_many_files_check; + if (!$last_mtime) { + $last_mtime = time(); + } + clearstatcache(); + if (!is_dir($monitor_dir)) { + if (!is_file($monitor_dir)) { + return false; + } + $iterator = [new \SplFileInfo($monitor_dir)]; + } else { + // recursive traversal directory + $dir_iterator = new \RecursiveDirectoryIterator($monitor_dir, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS); + $iterator = new \RecursiveIteratorIterator($dir_iterator); + } + $count = 0; + foreach ($iterator as $file) { + $count ++; + /** var SplFileInfo $file */ + if (is_dir($file->getRealPath())) { + continue; + } + // check mtime + if ($last_mtime < $file->getMTime() && in_array($file->getExtension(), $this->_extensions, true)) { + $var = 0; + exec('"'.PHP_BINARY . '" -l ' . $file, $out, $var); + if ($var) { + $last_mtime = $file->getMTime(); + continue; + } + $last_mtime = $file->getMTime(); + echo $file . " update and reload\n"; + // send SIGUSR1 signal to master process for reload + if (DIRECTORY_SEPARATOR === '/') { + posix_kill(posix_getppid(), SIGUSR1); + } else { + return true; + } + break; + } + } + if (!$too_many_files_check && $count > 1000) { + echo "Monitor: There are too many files ($count files) in $monitor_dir which makes file monitoring very slow\n"; + $too_many_files_check = 1; + } + return false; + } + + /** + * @return bool + */ + public function checkAllFilesChange(): bool + { + if (static::isPaused()) { + return false; + } + foreach ($this->_paths as $path) { + if ($this->checkFilesChange($path)) { + return true; + } + } + return false; + } + + /** + * @param $memory_limit + * @return void + */ + public function checkMemory($memory_limit) + { + if (static::isPaused()) { + return; + } + $ppid = posix_getppid(); + $children_file = "/proc/$ppid/task/$ppid/children"; + if (!is_file($children_file) || !($children = file_get_contents($children_file))) { + return; + } + foreach (explode(' ', $children) as $pid) { + $pid = (int)$pid; + $status_file = "/proc/$pid/status"; + if (!is_file($status_file) || !($status = file_get_contents($status_file))) { + continue; + } + $mem = 0; + if (preg_match('/VmRSS\s*?:\s*?(\d+?)\s*?kB/', $status, $match)) { + $mem = $match[1]; + } + $mem = (int)($mem / 1024); + if ($mem >= $memory_limit) { + posix_kill($pid, SIGINT); + } + } + } + + /** + * Get memory limit + * @return float + */ + protected function getMemoryLimit($memory_limit) + { + if ($memory_limit === 0) { + return 0; + } + $use_php_ini = false; + if (!$memory_limit) { + $memory_limit = ini_get('memory_limit'); + $use_php_ini = true; + } + + if ($memory_limit == -1) { + return 0; + } + $unit = $memory_limit[strlen($memory_limit) - 1]; + if ($unit == 'G') { + $memory_limit = 1024 * (int)$memory_limit; + } else if ($unit == 'M') { + $memory_limit = (int)$memory_limit; + } else if ($unit == 'K') { + $memory_limit = (int)($memory_limit / 1024); + } else { + $memory_limit = (int)($memory_limit / (1024 * 1024)); + } + if ($memory_limit < 30) { + $memory_limit = 30; + } + if ($use_php_ini) { + $memory_limit = (int)(0.8 * $memory_limit); + } + return $memory_limit; + } +} diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..da9eace --- /dev/null +++ b/public/404.html @@ -0,0 +1,12 @@ + + + 404 Not Found - webman + + +

    Q3BbVTber`-7qY=v7P1j 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%0DfA31mO@04h`f`nm_~8E1g#V$J9DMIH%2hP(tiB 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